From 246858847398e331b0b8695fc4f447de55ae33db Mon Sep 17 00:00:00 2001 From: PJB3005 Date: Sat, 7 Feb 2015 20:46:26 +0100 Subject: [PATCH 01/31] Customizable canister colours --- code/game/machinery/atmoalter/canister.dm | 128 +++++++++++++++++----- icons/obj/atmos.dmi | Bin 19401 -> 23469 bytes 2 files changed, 103 insertions(+), 25 deletions(-) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 7c7ea673335..968a166a153 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -9,7 +9,51 @@ var/valve_open = 0 var/release_pressure = ONE_ATMOSPHERE - var/_color = "yellow" + var/list/_color = list("yellow", null, null, null)//variable that stores colours + var/list/decals = list() // var that stores the decals, NOTE: Not the actual POSSIBLE decals, but the ones currently used + var/list/oldcolor = list()//lists for check_change() + var/list/olddecals = list() + var/list/possibledecals = list( //var that stores all possible decals, here for adminbus I guess? NOTE: LEAVE "done" IN HERE + "Low temperature canister" = "cold", + "High temperature canister" = "hot", + "Plasma containing canister" = "plasma", + "Done" = "DONE" + ) + var/list/possiblemaincolor = list( //these lists contain the possible colors of a canister, here for adminbus + "\[N2O\]" = "redws", + "\[N2\]" = "red", + "\[O2\]" = "blue", + "\[Toxin (Bio)\]" = "orange", + "\[CO2\]" = "black", + "\[Air\]" = "grey", + "\[CAUTION\]" = "yellow", + "\[SPECIAL\]" = "whiters" + ) + var/list/possibleseccolor = list( // no point in having the N2O and "whiters" ones in these lists + "\[N2\]" = "red-c", + "\[O2\]" = "blue-c", + "\[Toxin (Bio)\]" = "orange-c", + "\[CO2\]" = "black-c", + "\[Air\]" = "grey-c", + "\[CAUTION\]" = "yellow-c" + ) + var/list/possibletertcolor = list( + "\[N2\]" = "red-c-1", + "\[O2\]" = "blue-c-1", + "\[Toxin (Bio)\]" = "orange-c-1", + "\[CO2\]" = "black-c-1", + "\[Air\]" = "grey-c-1", + "\[CAUTION\]" = "yellow-c-1" + ) + var/list/possiblequartcolor = list( + "\[N2\]" = "red-c-2", + "\[O2\]" = "blue-c-2", + "\[Toxin (Bio)\]" = "orange-c-2", + "\[CO2\]" = "black-c-2", + "\[Air\]" = "grey-c-2", + "\[CAUTION\]" = "yellow-c-2" + ) + var/can_label = 1 var/filled = 0.5 pressure_resistance = 7*ONE_ATMOSPHERE @@ -23,37 +67,38 @@ /obj/machinery/portable_atmospherics/canister/sleeping_agent name = "Canister: \[N2O\]" icon_state = "redws" - _color = "redws" + _color = list("redsw", null, null, null) can_label = 0 /obj/machinery/portable_atmospherics/canister/nitrogen name = "Canister: \[N2\]" icon_state = "red" - _color = "red" + _color = list("red", null, null, null) + decals = list("plasma") can_label = 0 /obj/machinery/portable_atmospherics/canister/oxygen name = "Canister: \[O2\]" icon_state = "blue" - _color = "blue" + _color = list("blue", null, null, null) can_label = 0 /obj/machinery/portable_atmospherics/canister/toxins name = "Canister \[Toxin (Plasma)\]" icon_state = "orange" - _color = "orange" + _color = list("orange", null, null, null) can_label = 0 /obj/machinery/portable_atmospherics/canister/carbon_dioxide name = "Canister \[CO2\]" icon_state = "black" - _color = "black" + _color = list("black", null, null, null) can_label = 0 /obj/machinery/portable_atmospherics/canister/air name = "Canister \[Air\]" icon_state = "grey" - _color = "grey" + _color = list("grey", null, null, null) can_label = 0 /obj/machinery/portable_atmospherics/canister/custom_mix name = "Canister \[Custom\]" icon_state = "whiters" - _color = "whiters" + _color = list("whiters", null, null, null) can_label = 0 /obj/machinery/portable_atmospherics/canister/proc/check_change() @@ -74,6 +119,11 @@ else update_flag |= 32 + if(oldcolor != _color || olddecals != decals) + update_flag |= 64 + olddecals = decals + oldcolor = _color + if(update_flag == old_flag) return 1 else @@ -88,20 +138,33 @@ update_flag 8 = tank_pressure < ONE_ATMOS 16 = tank_pressure < 15*ONE_ATMOS 32 = tank_pressure go boom. +64 = decals/colors got changed */ if (src.destroyed) src.overlays = 0 - src.icon_state = text("[]-1", src._color) + src.icon_state = text("[]-1", src._color[1])//yes, I KNOW the colours don't reflect when the can's borked, whatever. - if(icon_state != "[_color]") - icon_state = "[_color]" + if(icon_state != src._color[1]) + icon_state = src._color[1] if(check_change()) //Returns 1 if no change needed to icons. return src.overlays = 0 + if (_color[2])//COLORS! + overlays.Add(_color[2]) + + if (_color[3]) + overlays.Add(_color[3]) + + if (_color[4]) + overlays.Add(_color[4]) + + for(var/D in decals) + overlays.Add("decal-" + D) + if(update_flag & 1) overlays += "can-open" if(update_flag & 2) @@ -333,21 +396,36 @@ update_flag if (href_list["relabel"]) if (can_label) - var/list/colors = list(\ - "\[N2O\]" = "redws", \ - "\[N2\]" = "red", \ - "\[O2\]" = "blue", \ - "\[Toxin (Plasma)\]" = "orange", \ - "\[CO2\]" = "black", \ - "\[Air\]" = "grey", \ - "\[CAUTION\]" = "yellow", \ - "\[Custom\]" = "whiters",\ + + var/label1 = input("Choose canister label", "Primary color") as null|anything in possiblemaincolor + + var/label2 = input("Choose canister label", "Secondary color") as null|anything in possibleseccolor + + var/label3 = input("Choose canister label", "Tertiary color") as null|anything in possibletertcolor + + var/label4 = input("Choose canister label", "Quaternary color") as null|anything in possiblequartcolor + + decals = list() + + _color = list( + (label1 ? possiblemaincolor[label1] : color[1]),//if the user didn't specify a primary colour, keep the current one. + possibleseccolor[label2], + possibletertcolor[label3], + possiblequartcolor[label4] ) - var/label = input("Choose canister label", "Gas canister") as null|anything in colors - if (label) - src._color = colors[label] - src.icon_state = colors[label] - src.name = "Canister: [label]" + + decals = list() + + var/list/tempposdecals = possibledecals + while (src && !src.gc_destroyed && usr)//allow the user to select (theoretically) INFINITE DECALS!!! + var/newdecal = input("Choose canister label", "Decal") as anything in tempposdecals + if (newdecal == "Done") + break + decals.Add(tempposdecals[newdecal]) + tempposdecals.Remove(newdecal) + + src.name = (input("Choose canister label", "Name") as text) + " canister" + src.add_fingerprint(usr) update_icon() diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index efe3ad114f40770c67a6f9077eeb1f0902d42b5d..dd1a1f00dbb496b73a13e94c166ed727810e94e5 100644 GIT binary patch literal 23469 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 H7M%89`d58S From af78338a99e2af34c51d649ecd7fafb146be2c06 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 8 Feb 2015 00:22:13 -0500 Subject: [PATCH 02/31] Nerfborgs --- code/game/machinery/rechargestation.dm | 26 +++---- .../objects/items/robot/robot_upgrades.dm | 12 ++-- .../mob/living/silicon/robot/robot_modules.dm | 4 +- .../projectiles/guns/energy/special.dm | 32 +++++++++ .../designs/mechfabricator_designs.dm | 68 +++++++++---------- 5 files changed, 87 insertions(+), 55 deletions(-) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 7b5ba784ef8..eea611886da 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -22,13 +22,13 @@ component_parts += new /obj/item/weapon/cell/high(src) RefreshParts() build_icon() - + /obj/machinery/recharge_station/upgraded/New() ..() component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src) component_parts += new /obj/item/weapon/stock_parts/capacitor/super(src) component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(src) - component_parts += new /obj/item/weapon/cell/hyper(src) + component_parts += new /obj/item/weapon/cell/hyper(src) RefreshParts() /obj/machinery/recharge_station/RefreshParts() @@ -39,8 +39,8 @@ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) repairs += M.rating - 1 for(var/obj/item/weapon/cell/C in component_parts) - recharge_speed *= C.maxcharge / 10000 - + recharge_speed *= C.maxcharge / 10000 + /obj/machinery/recharge_station/process() if(!(NOPOWER|BROKEN)) return @@ -65,8 +65,8 @@ if(occupant) occupant.emp_act(severity) go_out() - ..(severity) - + ..(severity) + /obj/machinery/recharge_station/proc/build_icon() if(NOPOWER|BROKEN) if(src.occupant) @@ -80,15 +80,15 @@ if (istype(P, /obj/item/weapon/screwdriver)) if(src.occupant) user << "The maintenance panel is locked." - return + return default_deconstruction_screwdriver(user, "borgdecon2", "borgcharger0", P) - return + return if(exchange_parts(user, P)) - return - - default_deconstruction_crowbar(P) - + return + + default_deconstruction_crowbar(P) + /obj/machinery/recharge_station/proc/process_occupant() if(src.occupant) if (istype(occupant, /mob/living/silicon/robot)) @@ -137,7 +137,7 @@ O:broken = 0 O:times_used = 0 O:icon_state = "flash" - if(istype(O,/obj/item/weapon/gun/energy/taser/cyborg)) + if(istype(O,/obj/item/weapon/gun/energy/disabler/cyborg)) if(O:power_supply.charge < O:power_supply.maxcharge) O:power_supply.give(O:charge_cost) O:update_icon() diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 66db8bfb189..23bed41262c 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -100,15 +100,15 @@ return 1 -/obj/item/borg/upgrade/tasercooler - name = "robotic Rapid Taser Cooling Module" - desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." +/obj/item/borg/upgrade/disablercooler + name = "robotic Rapid Disabler Cooling Module" + desc = "Used to cool a mounted disabler, increasing the potential current in it and thus its recharge rate." construction_cost = list("metal"=80000 , "glass"=6000 , "gold"= 2000, "diamond" = 500) icon_state = "cyborg_upgrade3" require_module = 1 -/obj/item/borg/upgrade/tasercooler/action(var/mob/living/silicon/robot/R) +/obj/item/borg/upgrade/disablercooler/action(var/mob/living/silicon/robot/R) if(..()) return 0 if(!istype(R.module, /obj/item/weapon/robot_module/security)) @@ -116,13 +116,13 @@ usr << "There's no mounting point for the module!" return 0 - var/obj/item/weapon/gun/energy/taser/cyborg/T = locate() in R.module + var/obj/item/weapon/gun/energy/disabler/cyborg/T = locate() in R.module if(!T) T = locate() in R.module.contents if(!T) T = locate() in R.module.modules if(!T) - usr << "This robot has had its taser removed!" + usr << "This robot has had its disabler removed!" return 0 if(T.recharge_time <= 2) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 294e5859bb8..92a8f1fd557 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -222,7 +222,7 @@ src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/weapon/handcuffs/cyborg(src) src.modules += new /obj/item/weapon/melee/baton/robot(src) - src.modules += new /obj/item/weapon/gun/energy/taser/cyborg(src) + src.modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src) src.modules += new /obj/item/taperoll/police(src) src.modules += new /obj/item/device/taperecorder(src) src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src) @@ -343,7 +343,7 @@ src.modules += new /obj/item/weapon/card/emag(src) src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src) src.modules += new /obj/item/weapon/crowbar(src) - src.modules += new /obj/item/weapon/pinpointer/operative(src) + src.modules += new /obj/item/weapon/pinpointer/operative(src) src.emag = null return diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d598d461895..04982e8e587 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -284,6 +284,38 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. cell_type = "/obj/item/weapon/cell" charge_cost = 500 +/obj/item/weapon/gun/energy/disabler/cyborg + name = "cyborg disabler" + desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating." + var/charge_tick = 0 + var/recharge_time = 2.5 + +/obj/item/weapon/gun/energy/disabler/cyborg/New() + ..() + processing_objects.Add(src) + + +/obj/item/weapon/gun/energy/disabler/cyborg/Destroy() + processing_objects.Remove(src) + ..() + +/obj/item/weapon/gun/energy/disabler/cyborg/process() //Every [recharge_time] ticks, recharge a shot for the cyborg + if(power_supply.charge == power_supply.maxcharge) + return 0 + charge_tick++ + if(charge_tick < recharge_time) + return 0 + charge_tick = 0 + + if(!power_supply) return 0 //sanity + if(isrobot(src.loc)) + var/mob/living/silicon/robot/R = src.loc + if(R && R.cell) + if(R.cell.use(charge_cost)) //Take power from the borg... + power_supply.give(charge_cost) //... to recharge the shot + + update_icon() + return 1 /* 3d printer 'pseudo guns' for borgs */ diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 78e522b21b1..3f784559213 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -65,7 +65,7 @@ construction_time = 200 category = list("Cyborg") -//Robot repair +//Robot repair /datum/design/borg_binary_communication name = "Cyborg Binary Communication Device" id = "borg_binary_communication" @@ -74,7 +74,7 @@ materials = list("$metal"=2500, "$glass"=1000) construction_time = 200 category = list("Cyborg Repair") - + /datum/design/borg_radio name = "Cyborg Radio" id = "borg_radio" @@ -83,7 +83,7 @@ materials = list("$metal"=2500, "$glass"=1000) construction_time = 200 category = list("Cyborg Repair") - + /datum/design/borg_actuator name = "Cyborg Actuator" id = "borg_actuator" @@ -92,7 +92,7 @@ materials = list("$metal"=3500) construction_time = 200 category = list("Cyborg Repair") - + /datum/design/borg_diagnosis_unit name = "Cyborg Diagnosis Unit" id = "borg_diagnosis_unit" @@ -101,7 +101,7 @@ materials = list("$metal"=3500) construction_time = 200 category = list("Cyborg Repair") - + /datum/design/borg_camera name = "Cyborg Camera" id = "borg_camera" @@ -110,7 +110,7 @@ materials = list("$metal"=2500, "$glass"=1000) construction_time = 200 category = list("Cyborg Repair") - + /datum/design/borg_armor name = "Cyborg Armor" id = "borg_armor" @@ -541,7 +541,7 @@ materials = list("$metal"=10000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_drill name = "Exosuit Engineering Equipment (Drill)" id = "mech_drill" @@ -559,7 +559,7 @@ materials = list("$metal"=10000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_hydraulic_clamp name = "Exosuit Engineering Equipment (Hydraulic Clamp)" id = "mech_hydraulic_clamp" @@ -622,7 +622,7 @@ materials = list("$metal"=20000,"$bananium"=5000) construction_time = 300 category = list("Exosuit Equipment") - + /datum/design/mech_honker name = "HoNkER BlAsT 5000" id = "mech_honker" @@ -631,7 +631,7 @@ materials = list("$metal"=20000,"$bananium"=10000) construction_time = 500 category = list("Exosuit Equipment") - + /datum/design/mech_mousetrap_mortar name = "H.O.N.K Mousetrap Mortar" id = "mech_mousetrap_mortar" @@ -640,7 +640,7 @@ materials = list("$metal"=20000,"$bananium"=5000) construction_time = 300 category = list("Exosuit Equipment") - + // Exosuit Modules /datum/design/mech_diamond_drill name = "Exosuit Module (Diamond Mining Drill)" @@ -652,7 +652,7 @@ materials = list("$metal"=10000,"$diamond"=6500) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_generator_nuclear name = "Exosuit Module (ExoNuclear Reactor)" desc = "Compact nuclear reactor module." @@ -663,7 +663,7 @@ materials = list("$metal"=10000,"$glass"=1000,"$silver"=500) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_gravcatapult name = "Exosuit Module (Gravitational Catapult Module)" desc = "An exosuit mounted Gravitational Catapult." @@ -685,7 +685,7 @@ materials = list("$metal"=10000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_rcd name = "Exosuit Module (RCD Module)" desc = "An exosuit-mounted Rapid Construction Device." @@ -696,7 +696,7 @@ materials = list("$metal"=30000,"$gold"=20000,"$plasma"=25000,"$silver"=20000) construction_time = 1200 category = list("Exosuit Equipment") - + /datum/design/mech_ccw_armor name = "Exosuit Module (Reactive Armor Booster Module)" desc = "Exosuit-mounted armor booster." @@ -707,7 +707,7 @@ materials = list("$metal"=20000,"$silver"=5000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_proj_armor name = "Exosuit Module (Reflective Armor Booster Module)" desc = "Exosuit-mounted armor booster." @@ -718,7 +718,7 @@ materials = list("$metal"=20000,"$gold"=5000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_repair_droid name = "Exosuit Module (Repair Droid Module)" desc = "Automated Repair Droid. BEEP BOOP" @@ -729,7 +729,7 @@ materials = list("$metal"=10000,"$glass"=5000,"$gold"=1000,"$silver"=2000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/clusterbang_launcher name = "Exosuit Module (SOB-3 Clusterbang Launcher)" desc = "A weapon that violates the Geneva Convention at 3 rounds per minute" @@ -740,7 +740,7 @@ materials = list("$metal"=20000,"$gold"=10000,"$uranium"=10000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_teleporter name = "Exosuit Module (Teleporter Module)" desc = "An exosuit module that allows exosuits to teleport to any position in view." @@ -751,7 +751,7 @@ materials = list("$metal"=10000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_energy_relay name = "Exosuit Module (Tesla Energy Relay)" desc = "Tesla Energy Relay" @@ -761,8 +761,8 @@ build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay materials = list("$metal"=10000,"$glass"=2000,"$gold"=2000,"$silver"=3000) construction_time = 100 - category = list("Exosuit Equipment") - + category = list("Exosuit Equipment") + // Exosuit Weapons /datum/design/mech_laser_heavy name = "Exosuit Weapon (CH-LC \"Solaris\" Laser Cannon)" @@ -774,7 +774,7 @@ materials = list("$metal"=10000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_laser name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)" desc = "Allows for the construction of CH-PS Laser." @@ -785,7 +785,7 @@ materials = list("$metal"=10000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_carbine name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)" desc = "Allows for the construction of FNX-99 \"Hades\" Carbine." @@ -796,7 +796,7 @@ materials = list("$metal"=10000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_scattershot name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")" desc = "Allows for the construction of LBX AC 10." @@ -807,7 +807,7 @@ materials = list("$metal"=10000) construction_time = 100 category = list("Exosuit Equipment") - + /datum/design/mech_ion name = "Exosuit Weapon (MKIV Ion Heavy Cannon)" desc = "Allows for the construction of MKIV Ion Heavy Cannon." @@ -850,7 +850,7 @@ req_tech = list("combat" = 4, "syndicate" = 3) build_path = /obj/item/borg/upgrade/syndicate category = "Cyborg Upgrade Modules" - category = list("Cyborg Upgrade Modules") + category = list("Cyborg Upgrade Modules") /datum/design/borg_upgrade_jetpack name = "Cyborg Upgrade Module (Mining Jetpack)" @@ -860,16 +860,16 @@ materials = list("$metal"=10000,"$plasma"=15000,"$uranium" = 20000) construction_time = 120 category = list("Cyborg Upgrade Modules") - -/datum/design/borg_upgrade_tasercooler - name = "Cyborg Upgrade Module (Rapid Taser Cooling Module)" - id = "borg_upgrade_tasercooler" + +/datum/design/borg_upgrade_disablercooler + name = "Cyborg Upgrade Module (Rapid Disabler Cooling Module)" + id = "borg_upgrade_disablercooler" build_type = MECHFAB - build_path = /obj/item/borg/upgrade/tasercooler + build_path = /obj/item/borg/upgrade/disablercooler materials = list("$metal"=80000 , "$glass"=6000 , "$gold"= 2000, "$diamond" = 500) construction_time = 120 category = list("Cyborg Upgrade Modules") - + /datum/design/borg_upgrade_rename name = "Cyborg Upgrade Module (Rename Module)" id = "borg_upgrade_rename" @@ -878,7 +878,7 @@ materials = list("$metal"=35000) construction_time = 120 category = list("Cyborg Upgrade Modules") - + /datum/design/borg_upgrade_reset name = "Cyborg Upgrade Module (Reset Module)" id = "borg_upgrade_reset" From 69f5776aee1ffd0ba2e357420096b79151984048 Mon Sep 17 00:00:00 2001 From: Artorp Date: Sun, 8 Feb 2015 14:20:57 +0100 Subject: [PATCH 03/31] Disability fixes - Disabilities properly updated when new player is made - Fixed epilepsy disability not linked to proper SE block --- code/game/dna/genes/disabilities.dm | 2 +- code/game/gamemodes/setupgame.dm | 1 - code/game/objects/items/weapons/dna_injector.dm | 4 ++-- code/global.dm | 1 - code/modules/mob/new_player/new_player.dm | 3 ++- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index 3fe9c14ae73..eaf4500359e 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -67,7 +67,7 @@ disability=EPILEPSY New() - block=HEADACHEBLOCK + block=EPILEPSYBLOCK /datum/dna/gene/disability/cough name="Coughing" diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 1a81fa9a704..96b1a3d7920 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -49,7 +49,6 @@ NERVOUSBLOCK = getAssignedBlock("NERVOUS", numsToAssign) // Bay muts - HEADACHEBLOCK = getAssignedBlock("HEADACHE", numsToAssign) NOBREATHBLOCK = getAssignedBlock("NOBREATH", numsToAssign, DNA_HARD_BOUNDS, good=1) REMOTEVIEWBLOCK = getAssignedBlock("REMOTEVIEW", numsToAssign, DNA_HARDER_BOUNDS, good=1) REGENERATEBLOCK = getAssignedBlock("REGENERATE", numsToAssign, DNA_HARDER_BOUNDS, good=1) diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index e2b19f317ad..3e4831f701e 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -476,7 +476,7 @@ value = 0xFFF //block = 3 New() - block = HEADACHEBLOCK + block = EPILEPSYBLOCK ..() /obj/item/weapon/dnainjector/antiepi @@ -486,7 +486,7 @@ value = 0x001 //block = 3 New() - block = HEADACHEBLOCK + block = EPILEPSYBLOCK ..() /obj/item/weapon/dnainjector/anticough diff --git a/code/global.dm b/code/global.dm index 28ed508a5f4..ef6a3959f2c 100644 --- a/code/global.dm +++ b/code/global.dm @@ -55,7 +55,6 @@ var/MONKEYBLOCK = 50 // Monkey block will always be the DNA_SE_LENGTH var/BLOCKADD = 0 var/DIFFMUT = 0 -var/HEADACHEBLOCK = 0 var/NOBREATHBLOCK = 0 var/REMOTEVIEWBLOCK = 0 var/REGENERATEBLOCK = 0 diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index c8403d5b671..6ecdfdc4e67 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -529,7 +529,8 @@ if(client.prefs.disabilities & DISABILITY_FLAG_DEAF) new_character.dna.SetSEState(DEAFBLOCK,1,1) new_character.sdisabilities |= DEAF - + + domutcheck(new_character) new_character.dna.UpdateSE() From 8fae0f029f6a649af2d8c98bfca25e1b3d8dc012 Mon Sep 17 00:00:00 2001 From: Markolie Date: Sun, 8 Feb 2015 14:29:10 +0100 Subject: [PATCH 04/31] Accessory overhaul --- code/_onclick/click.dm | 8 +- code/_onclick/hud/human.dm | 68 +-- code/_onclick/hud/screen_objects.dm | 3 - code/datums/supplypacks.dm | 12 + code/game/gamemodes/steal_items.dm | 2 +- code/game/jobs/job/supervisor.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/vending.dm | 20 +- code/game/objects/items.dm | 15 +- code/game/objects/items/weapons/cards_ids.dm | 2 +- code/game/objects/items/weapons/explosives.dm | 2 +- .../objects/items/weapons/gift_wrappaper.dm | 2 +- .../objects/items/weapons/storage/firstaid.dm | 4 +- .../objects/items/weapons/storage/internal.dm | 85 ++++ .../objects/items/weapons/storage/lockbox.dm | 18 +- .../objects/items/weapons/storage/storage.dm | 47 +- code/game/objects/storage/coat.dm | 224 --------- .../crates_lockers/closets/secure/security.dm | 12 +- code/game/objects/structures/safe.dm | 4 +- code/modules/clothing/clothing.dm | 82 +-- code/modules/clothing/suits/storage.dm | 29 ++ .../clothing/under/accessories/accessory.dm | 320 ++++++++++++ .../clothing/under/accessories/armband.dm | 42 ++ .../clothing/under/accessories/holster.dm | 126 +++++ .../clothing/under/accessories/storage.dm | 86 ++++ code/modules/clothing/under/ties.dm | 467 ------------------ code/modules/customitems/item_defines.dm | 14 +- code/modules/mining/abandonedcrates.dm | 2 +- .../mob/living/carbon/human/examine.dm | 4 +- code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/inventory.dm | 41 +- .../mob/living/carbon/human/update_icons.dm | 11 +- code/modules/mob/living/living.dm | 2 +- code/modules/mob/mob.dm | 1 + code/setup.dm | 2 + icons/obj/clothing/ties_overlay.dmi | Bin 0 -> 3091 bytes maps/cyberiad.dmm | 20 +- paradise.dme | 8 +- 38 files changed, 952 insertions(+), 839 deletions(-) create mode 100644 code/game/objects/items/weapons/storage/internal.dm delete mode 100644 code/game/objects/storage/coat.dm create mode 100644 code/modules/clothing/suits/storage.dm create mode 100644 code/modules/clothing/under/accessories/accessory.dm create mode 100644 code/modules/clothing/under/accessories/armband.dm create mode 100644 code/modules/clothing/under/accessories/holster.dm create mode 100644 code/modules/clothing/under/accessories/storage.dm delete mode 100644 code/modules/clothing/under/ties.dm create mode 100644 icons/obj/clothing/ties_overlay.dmi diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index bb288fc7d48..84b663e78d8 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -98,8 +98,9 @@ return - // operate two levels deep here (item in backpack in src; NOT item in box in backpack in src) - if(A == loc || (A in loc) || (A in contents) || (A.loc in contents)) + // operate two STORAGE levels deep here (item in backpack in src; NOT item in box in backpack in src) + var/sdepth = A.storage_depth(src) + if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) // faster access to objects already on you if(A in contents) @@ -123,7 +124,8 @@ return // Allows you to click on a box's contents, if that box is on the ground, but no deeper than that - if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc))) + sdepth = A.storage_depth_turf() + if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1)) next_move = world.time + 10 if(A.Adjacent(src)) // see adjacent.dm diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index e6839dcfbaf..950747a5d2c 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -507,6 +507,7 @@ /mob/living/carbon/human/update_action_buttons() var/num = 1 + var/to_update = list() if(!hud_used) return if(!client) return @@ -519,37 +520,42 @@ for(var/obj/item/I in src) if(istype(I,/obj/item/clothing/under)) var/obj/item/clothing/under/U = I - if(U.hastie) - I = U.hastie + if(U.accessories) + for(var/obj/item/clothing/accessory/A in U.accessories) + if(A.icon_action_button) + to_update |= A if(I.icon_action_button) - var/obj/screen/item_action/A = new(hud_used) - - //A.icon = 'icons/mob/screen1_action.dmi' - //A.icon_state = I.icon_action_button - A.icon = ui_style2icon(client.prefs.UI_style) - A.icon_state = "template" - var/image/img = image(I.icon, A, I.icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - A.overlays += img + to_update |= I + + for(var/obj/item/I in to_update) + var/obj/screen/item_action/A = new(hud_used) + + //A.icon = 'icons/mob/screen1_action.dmi' + //A.icon_state = I.icon_action_button + A.icon = ui_style2icon(client.prefs.UI_style) + A.icon_state = "template" + var/image/img = image(I.icon, A, I.icon_state) + img.pixel_x = 0 + img.pixel_y = 0 + A.overlays += img - if(I.action_button_name) - A.name = I.action_button_name - else - A.name = "Use [I.name]" - A.owner = I - hud_used.item_action_list += A - switch(num) - if(1) - A.screen_loc = ui_action_slot1 - if(2) - A.screen_loc = ui_action_slot2 - if(3) - A.screen_loc = ui_action_slot3 - if(4) - A.screen_loc = ui_action_slot4 - if(5) - A.screen_loc = ui_action_slot5 - break //5 slots available, so no more can be added. - num++ + if(I.action_button_name) + A.name = I.action_button_name + else + A.name = "Use [I.name]" + A.owner = I + hud_used.item_action_list += A + switch(num) + if(1) + A.screen_loc = ui_action_slot1 + if(2) + A.screen_loc = ui_action_slot2 + if(3) + A.screen_loc = ui_action_slot3 + if(4) + A.screen_loc = ui_action_slot4 + if(5) + A.screen_loc = ui_action_slot5 + break //5 slots available, so no more can be added. + num++ src.client.screen += src.hud_used.item_action_list \ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index efa433476d6..52b16ad6dcf 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -36,9 +36,6 @@ if(istype(master, /obj/item/weapon/storage)) var/obj/item/weapon/storage/S = master S.close(usr) - else if(istype(master,/obj/item/clothing/suit/storage)) - var/obj/item/clothing/suit/storage/S = master - S.close(usr) return 1 /obj/screen/power_action diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index de49b586def..2240b646949 100755 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -260,6 +260,18 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee containertype = /obj/structure/closet/crate containername = "Wizard costume crate" group = "Operations" + +/datum/supply_packs/randomised/webbing + name = "Webbing crate" + num_contained = 1 + contains = list(/obj/item/clothing/accessory/holster, + /obj/item/clothing/accessory/storage/brown_vest, + /obj/item/clothing/accessory/storage/webbing, + /obj/item/clothing/accessory/storage) + cost = 15 + containertype = /obj/structure/closet/crate + containername = "Webbing crate" + group = "Operations" /datum/supply_packs/mule name = "MULEbot Crate" diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm index ec2e467e7c4..47d181f9166 100644 --- a/code/game/gamemodes/steal_items.dm +++ b/code/game/gamemodes/steal_items.dm @@ -101,7 +101,7 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/device/aicard/C) /datum/theft_objective/capmedal name = "the medal of captaincy" - typepath = /obj/item/clothing/tie/medal/gold/captain + typepath = /obj/item/clothing/accessory/medal/gold/captain protected_jobs = list("Captain") /datum/theft_objective/nukedisc diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index d0dd51fb59f..87537e4a571 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -20,7 +20,7 @@ if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) var/obj/item/clothing/under/U = new /obj/item/clothing/under/rank/captain(H) - U.hastie = new /obj/item/clothing/tie/medal/gold/captain(U) + U.accessories += new /obj/item/clothing/accessory/medal/gold/captain(U) H.equip_or_collect(U, slot_w_uniform) H.equip_or_collect(new /obj/item/device/pda/captain(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/capcarapace(H), slot_wear_suit) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 91dbbae40b3..ccec232e120 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -200,7 +200,7 @@ /obj/item/clothing/shoes/magboots, /obj/item/blueprints, /obj/item/clothing/head/helmet/space, - /obj/item/weapon/tank + /obj/item/weapon/storage/internal ) /obj/machinery/cryopod/right diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 348456523eb..70ea53a19f8 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -649,7 +649,7 @@ /obj/machinery/vending/boozeomat name = "Booze-O-Mat" desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." - icon_state = "boozeomat" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles + icon_state = "boozeomat" //////////////18 drink entiaccessorys below, plus the glasses, in case someone wants to edit the number of bottles icon_deny = "boozeomat-deny" products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5, @@ -880,7 +880,7 @@ /obj/machinery/vending/hydroseeds name = "MegaSeed Servitor" desc = "When you need seeds fast!" - product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!" + product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieaccessorys available, more for experts! Get certified today!" product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" icon_state = "seeds" delay_product_spawn = 1 @@ -919,7 +919,7 @@ /obj/item/clothing/head/helmet/gladiator = 1,/obj/item/clothing/under/gimmick/rank/captain/suit = 1,/obj/item/clothing/head/flatcap = 1, /obj/item/clothing/suit/storage/labcoat/mad = 1,/obj/item/clothing/glasses/gglasses = 1,/obj/item/clothing/shoes/jackboots = 1, /obj/item/clothing/under/schoolgirl = 1,/obj/item/clothing/head/kitty = 1,/obj/item/clothing/under/blackskirt = 1,/obj/item/clothing/head/beret = 1, - /obj/item/clothing/tie/waistcoat = 1,/obj/item/clothing/under/suit_jacket = 1,/obj/item/clothing/head/that =1,/obj/item/clothing/under/kilt = 1,/obj/item/clothing/head/beret = 1,/obj/item/clothing/tie/waistcoat = 1, + /obj/item/clothing/accessory/waistcoat = 1,/obj/item/clothing/under/suit_jacket = 1,/obj/item/clothing/head/that =1,/obj/item/clothing/under/kilt = 1,/obj/item/clothing/head/beret = 1,/obj/item/clothing/accessory/waistcoat = 1, /obj/item/clothing/glasses/monocle =1,/obj/item/clothing/head/bowlerhat = 1,/obj/item/weapon/cane = 1,/obj/item/clothing/under/sl_suit = 1, /obj/item/clothing/mask/fakemoustache = 1,/obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1,/obj/item/clothing/head/plaguedoctorhat = 1,/obj/item/clothing/mask/gas/plaguedoctor = 1, /obj/item/clothing/under/owl = 1,/obj/item/clothing/mask/gas/owl_mask = 1,/obj/item/clothing/suit/apron = 1,/obj/item/clothing/under/waiter = 1, @@ -930,7 +930,7 @@ /obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1, /obj/item/clothing/under/sexyclown = 1,/obj/item/clothing/mask/gas/sexymime = 1,/obj/item/clothing/under/sexymime = 1,/obj/item/clothing/suit/apron/overalls = 1, /obj/item/clothing/head/rabbitears =1, /obj/item/clothing/head/sombrero = 1, /obj/item/clothing/suit/poncho = 1, - /obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1, /obj/item/clothing/tie/blue = 1, /obj/item/clothing/tie/red = 1, /obj/item/clothing/tie/black = 1, /obj/item/clothing/tie/horrible = 1, + /obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1, /obj/item/clothing/accessory/blue = 1, /obj/item/clothing/accessory/red = 1, /obj/item/clothing/accessory/black = 1, /obj/item/clothing/accessory/horrible = 1, /obj/item/clothing/under/maid = 1, /obj/item/clothing/under/janimaid = 1) contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1) premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1) @@ -998,7 +998,7 @@ /obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5) // There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty. // Another invalid entry, /obj/item/weapon/circuitry. I don't even know what that would translate to, removed it. - // The original products list wasn't finished. The ones without given quantities became quantity 5. -Sayu + // The original products list wasn't finished. The ones without given quantiaccessorys became quantity 5. -Sayu //This one's from bay12 /obj/machinery/vending/robotics @@ -1097,11 +1097,11 @@ /obj/item/clothing/under/pants/camo = 1,/obj/item/clothing/under/pants/blackjeans=2,/obj/item/clothing/under/pants/khaki=2, /obj/item/clothing/under/pants/white=2,/obj/item/clothing/under/pants/red=1,/obj/item/clothing/under/pants/black=2, /obj/item/clothing/under/pants/tan=2,/obj/item/clothing/under/pants/blue=1,/obj/item/clothing/under/pants/track=1, - /obj/item/clothing/tie/scarf/red=1,/obj/item/clothing/tie/scarf/green=1,/obj/item/clothing/tie/scarf/darkblue=1, - /obj/item/clothing/tie/scarf/purple=1,/obj/item/clothing/tie/scarf/yellow=1,/obj/item/clothing/tie/scarf/orange=1, - /obj/item/clothing/tie/scarf/lightblue=1,/obj/item/clothing/tie/scarf/white=1,/obj/item/clothing/tie/scarf/black=1, - /obj/item/clothing/tie/scarf/zebra=1,/obj/item/clothing/tie/scarf/christmas=1,/obj/item/clothing/tie/stripedredscarf=1, - /obj/item/clothing/tie/stripedbluescarf=1,/obj/item/clothing/tie/stripedgreenscarf=1,/obj/item/clothing/tie/waistcoat=1, + /obj/item/clothing/accessory/scarf/red=1,/obj/item/clothing/accessory/scarf/green=1,/obj/item/clothing/accessory/scarf/darkblue=1, + /obj/item/clothing/accessory/scarf/purple=1,/obj/item/clothing/accessory/scarf/yellow=1,/obj/item/clothing/accessory/scarf/orange=1, + /obj/item/clothing/accessory/scarf/lightblue=1,/obj/item/clothing/accessory/scarf/white=1,/obj/item/clothing/accessory/scarf/black=1, + /obj/item/clothing/accessory/scarf/zebra=1,/obj/item/clothing/accessory/scarf/christmas=1,/obj/item/clothing/accessory/stripedredscarf=1, + /obj/item/clothing/accessory/stripedbluescarf=1,/obj/item/clothing/accessory/stripedgreenscarf=1,/obj/item/clothing/accessory/waistcoat=1, /obj/item/clothing/under/sundress=2,/obj/item/clothing/under/stripeddress = 1, /obj/item/clothing/under/sailordress = 1, /obj/item/clothing/under/redeveninggown = 1, /obj/item/clothing/under/blacktango=1,/obj/item/clothing/suit/jacket=3, /obj/item/clothing/glasses/regular=2,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1, /obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/black=4, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index cedc2e47cd8..c3be9b715e0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -480,6 +480,19 @@ if(B.contents.len < B.storage_slots && w_class <= B.max_w_class) return 1 return 0 + if(slot_tie) + if(!H.w_uniform) + if(!disable_warning) + H << "You need a jumpsuit before you can attach this [name]." + return 0 + var/obj/item/clothing/under/uniform = H.w_uniform + if(uniform.accessories.len && uniform.can_attach_accessory(src)) + if (!disable_warning) + H << "You already have an accessory of this type attached to your [uniform]." + return 0 + if( !(slot_flags & SLOT_TIE) ) + return 0 + return 1 return 0 //Unsupported slot //END HUMAN @@ -551,7 +564,7 @@ if( src in usr ) attack_self(usr) return - else if(istype(src, /obj/item/clothing/tie)) + else if(istype(src, /obj/item/clothing/accessory)) if(istype(src.loc,/obj/item/clothing/under)) attack_self(usr) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 1c7850ffa13..395304cb310 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -79,7 +79,7 @@ /obj/item/device/lightreplacer, /obj/item/device/taperecorder, /obj/item/device/hailer, - /obj/item/clothing/tie/holobadge, + /obj/item/clothing/accessory/holobadge, /obj/structure/closet/crate/secure, /obj/structure/closet/secure_closet, /obj/machinery/librarycomp, diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 8176d23258d..84be7792502 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -66,7 +66,7 @@ /obj/item/weapon/plastique/afterattack(atom/target as obj|turf, mob/user as mob, flag) if (!flag) return - if (ismob(target) || istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage/) || istype(target, /obj/machinery/door/airlock/hatch/gamma)) + if (ismob(target) || istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/item/clothing/accessory/storage) || istype(target, /obj/item/clothing/under)) return user << "Planting explosives..." diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index a08ca995574..0af739fdccd 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -104,7 +104,7 @@ /obj/item/device/paicard, /obj/item/device/violin, /obj/item/weapon/storage/belt/utility/full, - /obj/item/clothing/tie/horrible) + /obj/item/clothing/accessory/horrible) if(!ispath(gift_type,/obj/item)) return diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index bf36677777a..9123cdb0155 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -121,7 +121,7 @@ /obj/item/weapon/storage/firstaid/tactical/New() ..() if (empty) return - new /obj/item/clothing/tie/stethoscope( src ) + new /obj/item/clothing/accessory/stethoscope( src ) new /obj/item/weapon/surgicaldrill(src) new /obj/item/weapon/reagent_containers/hypospray/combat(src) new /obj/item/weapon/reagent_containers/pill/bicaridine(src) @@ -198,7 +198,7 @@ /obj/item/weapon/storage/pill_bottle/inaprovaline name = "Pill bottle (inaprovaline)" - desc = "Contains pills used to stabilize patients." + desc = "Contains pills used to stabilize paaccessorynts." New() ..() diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm new file mode 100644 index 00000000000..082002a5b9a --- /dev/null +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -0,0 +1,85 @@ +//A storage item intended to be used by other items to provide storage functionality. +//Types that use this should consider overriding emp_act() and hear_talk(), unless they shield their contents somehow. +/obj/item/weapon/storage/internal + var/obj/item/master_item + +/obj/item/weapon/storage/internal/New(obj/item/MI) + master_item = MI + loc = master_item + name = master_item.name + verbs -= /obj/item/verb/verb_pickup //make sure this is never picked up. + ..() + +/obj/item/weapon/storage/internal/attack_hand() + return //make sure this is never picked up + +/obj/item/weapon/storage/internal/mob_can_equip() + return 0 //make sure this is never picked up + +//Helper procs to cleanly implement internal storages - storage items that provide inventory slots for other items. +//These procs are completely optional, it is up to the master item to decide when it's storage get's opened by calling open() +//However they are helpful for allowing the master item to pretend it is a storage item itself. +//If you are using these you will probably want to override attackby() as well. +//See /obj/item/clothing/suit/storage for an example. + +//items that use internal storage have the option of calling this to emulate default storage MouseDrop behaviour. +//returns 1 if the master item's parent's MouseDrop() should be called, 0 otherwise. It's strange, but no other way of +//doing it without the ability to call another proc's parent, really. +/obj/item/weapon/storage/internal/proc/handle_mousedrop(mob/user as mob, obj/over_object as obj) + if (ishuman(user) || ismonkey(user)) //so monkeys can take off their backpacks -- Urist + + if (istype(user.loc,/obj/mecha)) // stops inventory actions in a mech + return 0 + + if(over_object == user && Adjacent(user)) // this must come before the screen objects only block + src.open(user) + return 0 + + if (!( istype(over_object, /obj/screen) )) + return 1 + + //makes sure master_item is equipped before putting it in hand, so that we can't drag it into our hand from miles away. + //there's got to be a better way of doing this... + if (!(master_item.loc == user) || (master_item.loc && master_item.loc.loc == user)) + return 0 + + if (!( user.restrained() ) && !( user.stat )) + switch(over_object.name) + if("r_hand") + user.u_equip(master_item) + user.put_in_r_hand(master_item) + if("l_hand") + user.u_equip(master_item) + user.put_in_l_hand(master_item) + master_item.add_fingerprint(user) + return 0 + return 0 + +//items that use internal storage have the option of calling this to emulate default storage attack_hand behaviour. +//returns 1 if the master item's parent's attack_hand() should be called, 0 otherwise. +//It's strange, but no other way of doing it without the ability to call another proc's parent, really. +/obj/item/weapon/storage/internal/proc/handle_attack_hand(mob/user as mob) + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.l_store == master_item && !H.get_active_hand()) //Prevents opening if it's in a pocket. + H.put_in_hands(master_item) + H.l_store = null + return 0 + if(H.r_store == master_item && !H.get_active_hand()) + H.put_in_hands(master_item) + H.r_store = null + return 0 + + src.add_fingerprint(user) + if (master_item.loc == user) + src.open(user) + return 0 + + for(var/mob/M in range(1, master_item.loc)) + if (M.s_active == src) + src.close(M) + return 1 + +/obj/item/weapon/storage/internal/Adjacent(var/atom/neighbor) + return master_item.Adjacent(neighbor) diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index f42ea800745..7caa4e9b0dc 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -104,12 +104,12 @@ New() ..() - new /obj/item/clothing/tie/medal/gold/heroism(src) - new /obj/item/clothing/tie/medal/silver/security(src) - new /obj/item/clothing/tie/medal/silver/valor(src) - new /obj/item/clothing/tie/medal/nobel_science(src) - new /obj/item/clothing/tie/medal/bronze_heart(src) - new /obj/item/clothing/tie/medal/conduct(src) - new /obj/item/clothing/tie/medal/conduct(src) - new /obj/item/clothing/tie/medal/conduct(src) - new /obj/item/clothing/tie/medal/gold/captain(src) + new /obj/item/clothing/accessory/medal/gold/heroism(src) + new /obj/item/clothing/accessory/medal/silver/security(src) + new /obj/item/clothing/accessory/medal/silver/valor(src) + new /obj/item/clothing/accessory/medal/nobel_science(src) + new /obj/item/clothing/accessory/medal/bronze_heart(src) + new /obj/item/clothing/accessory/medal/conduct(src) + new /obj/item/clothing/accessory/medal/conduct(src) + new /obj/item/clothing/accessory/medal/conduct(src) + new /obj/item/clothing/accessory/medal/gold/captain(src) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index c49a79f07c6..96985689299 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -22,6 +22,7 @@ var/allow_quick_gather //Set this variable to allow the object to have the 'toggle mode' verb, which quickly collects all items from a tile. var/collection_mode = 1; //0 = pick one at a time, 1 = pick all on tile var/foldable = null // BubbleWrap - if set, can be folded (when empty) into a sheet of cardboard + var/use_sound = "rustle" //sound played when used. null for no sound. /obj/item/weapon/storage/MouseDrop(obj/over_object as obj) if (ishuman(usr) || ismonkey(usr)) //so monkeys can take off their backpacks -- Urist @@ -100,6 +101,15 @@ if(user.s_active == src) user.s_active = null return + +/obj/item/weapon/storage/proc/open(mob/user as mob) + if (src.use_sound) + playsound(src.loc, src.use_sound, 50, 1, -5) + + orient2hud(user) + if (user.s_active) + user.s_active.close(user) + show_to(user) /obj/item/weapon/storage/proc/close(mob/user as mob) @@ -450,6 +460,39 @@ del(src) //BubbleWrap END +//Returns the storage depth of an atom. This is the number of storage items the atom is contained in before reaching toplevel (the area). +//Returns -1 if the atom was not found on container. +/atom/proc/storage_depth(atom/container) + var/depth = 0 + var/atom/cur_atom = src + + while (cur_atom && !(cur_atom in container.contents)) + if (isarea(cur_atom)) + return -1 + if (istype(cur_atom.loc, /obj/item/weapon/storage)) + depth++ + cur_atom = cur_atom.loc + + if (!cur_atom) + return -1 //inside something with a null loc. + + return depth - - +//Like storage depth, but returns the depth to the nearest turf +//Returns -1 if no top level turf (a loc was null somewhere, or a non-turf atom's loc was an area somehow). +/atom/proc/storage_depth_turf() + var/depth = 0 + var/atom/cur_atom = src + + while (cur_atom && !isturf(cur_atom)) + if (isarea(cur_atom)) + return -1 + if (istype(cur_atom.loc, /obj/item/weapon/storage)) + depth++ + cur_atom = cur_atom.loc + + if (!cur_atom) + return -1 //inside something with a null loc. + + return depth + \ No newline at end of file diff --git a/code/game/objects/storage/coat.dm b/code/game/objects/storage/coat.dm deleted file mode 100644 index e5151ae5ded..00000000000 --- a/code/game/objects/storage/coat.dm +++ /dev/null @@ -1,224 +0,0 @@ -/obj/item/clothing/suit/storage - var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else) - var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set) - var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set) - var/max_combined_w_class = 4 //The sum of the w_classes of all the items in this storage item. - var/storage_slots = 2 //The number of storage slots in this container. - var/obj/screen/storage/boxes = null - var/obj/screen/close/closer = null - -/obj/item/clothing/suit/storage/proc/return_inv() - - var/list/L = list( ) - - L += src.contents - - for(var/obj/item/weapon/storage/S in src) - L += S.return_inv() - for(var/obj/item/weapon/gift/G in src) - L += G.gift - if (istype(G.gift, /obj/item/weapon/storage)) - L += G.gift:return_inv() - return L - -/obj/item/clothing/suit/storage/proc/show_to(mob/user as mob) - user.client.screen -= src.boxes - user.client.screen -= src.closer - user.client.screen -= src.contents - user.client.screen += src.boxes - user.client.screen += src.closer - user.client.screen += src.contents - user.s_active = src - return - -/obj/item/clothing/suit/storage/proc/hide_from(mob/user as mob) - - if(!user.client) - return - user.client.screen -= src.boxes - user.client.screen -= src.closer - user.client.screen -= src.contents - return - -/obj/item/clothing/suit/storage/proc/close(mob/user as mob) - - src.hide_from(user) - user.s_active = null - return - -//This proc draws out the inventory and places the items on it. tx and ty are the upper left tile and mx, my are the bottm right. -//The numbers are calculated from the bottom-left The bottom-left slot being 1,1. -/obj/item/clothing/suit/storage/proc/orient_objs(tx, ty, mx, my) - var/cx = tx - var/cy = ty - src.boxes.screen_loc = text("[tx]:,[ty] to [mx],[my]") - for(var/obj/O in src.contents) - O.screen_loc = text("[cx],[cy]") - O.layer = 20 - cx++ - if (cx > mx) - cx = tx - cy-- - src.closer.screen_loc = text("[mx+1],[my]") - return - -//This proc draws out the inventory and places the items on it. It uses the standard position. -/obj/item/clothing/suit/storage/proc/standard_orient_objs(var/rows,var/cols) - var/cx = 4 - var/cy = 2+rows - src.boxes.screen_loc = text("4:16,2:16 to [4+cols]:16,[2+rows]:16") - for(var/obj/O in src.contents) - O.screen_loc = text("[cx]:16,[cy]:16") - O.layer = 20 - cx++ - if (cx > (4+cols)) - cx = 4 - cy-- - src.closer.screen_loc = text("[4+cols+1]:16,2:16") - return - -//This proc determins the size of the inventory to be displayed. Please touch it only if you know what you're doing. -/obj/item/clothing/suit/storage/proc/orient2hud(mob/user as mob) - //var/mob/living/carbon/human/H = user - var/row_num = 0 - var/col_count = min(7,storage_slots) -1 - if (contents.len > 7) - row_num = round((contents.len-1) / 7) // 7 is the maximum allowed width. - src.standard_orient_objs(row_num,col_count) - return - -//This proc is called when you want to place an item into the storage item. -/obj/item/clothing/suit/storage/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/weapon/evidencebag) && src.loc != user) - return - - ..() - if(isrobot(user)) - user << "\blue You're a robot. No." - return //Robots can't interact with storage items. - - if(src.loc == W) - return //Means the item is already in the storage item - - if(contents.len >= storage_slots) - user << "\red \The [src] is full, make some space." - return //Storage item is full - - if(can_hold.len) - var/ok = 0 - for(var/A in can_hold) - if(istype(W, text2path(A) )) - ok = 1 - break - if(!ok) - user << "\red \The [src] cannot hold \the [W]." - return - - for(var/A in cant_hold) //Check for specific items which this container can't hold. - if(istype(W, text2path(A) )) - user << "\red \The [src] cannot hold \the [W]." - return - - if (W.w_class > max_w_class) - user << "\red \The [W] is too big for \the [src]" - return - - var/sum_w_class = W.w_class - for(var/obj/item/I in contents) - sum_w_class += I.w_class //Adds up the combined w_classes which will be in the storage item if the item is added to it. - - if(sum_w_class > max_combined_w_class) - user << "\red \The [src] is full, make some space." - return - - if(W.w_class >= src.w_class && (istype(W, /obj/item/weapon/storage))) - if(!istype(src, /obj/item/weapon/storage/backpack/holding)) //bohs should be able to hold backpacks again. The override for putting a boh in a boh is in backpack.dm. - user << "\red \The [src] cannot hold \the [W] as it's a storage item of the same size." - return //To prevent the stacking of the same sized items. - - user.u_equip(W) - playsound(src.loc, "rustle", 50, 1, -5) - W.loc = src - if ((user.client && user.s_active != src)) - user.client.screen -= W - src.orient2hud(user) - W.dropped(user) - add_fingerprint(user) - show_to(user) - - -/obj/item/weapon/storage/dropped(mob/user as mob) - return - -/obj/item/clothing/suit/storage/MouseDrop(atom/over_object) - if(ishuman(usr)) - var/mob/living/carbon/human/M = usr - if (!( istype(over_object, /obj/screen) )) - return ..() - playsound(src.loc, "rustle", 50, 1, -5) - if ((!( M.restrained() ) && !( M.stat ) && M.wear_suit == src)) - if (over_object.name == "r_hand") - M.u_equip(src) - M.put_in_r_hand(src) - // if (!( M.r_hand )) - // M.u_equip(src) - // M.r_hand = src - else if (over_object.name == "l_hand") - M.u_equip(src) - M.put_in_l_hand(src) - // if (!( M.l_hand )) - // M.u_equip(src) - // M.l_hand = src - M.update_inv_wear_suit() - src.add_fingerprint(usr) - return - if( (over_object == usr && in_range(src, usr) || usr.contents.Find(src)) && usr.s_active) - usr.s_active.close(usr) - src.show_to(usr) - return - -/obj/item/clothing/suit/storage/attack_paw(mob/user as mob) - //playsound(src.loc, "rustle", 50, 1, -5) // what - return src.attack_hand(user) - -/obj/item/clothing/suit/storage/attack_hand(mob/user as mob) - playsound(src.loc, "rustle", 50, 1, -5) - src.orient2hud(user) - if (src.loc == user) - if (user.s_active) - user.s_active.close(user) - src.show_to(user) - else - ..() - for(var/mob/M in range(1)) - if (M.s_active == src) - src.close(M) - src.add_fingerprint(user) - return - -/obj/item/clothing/suit/storage/New() - - src.boxes = new /obj/screen/storage( ) - src.boxes.name = "storage" - src.boxes.master = src - src.boxes.icon_state = "block" - src.boxes.screen_loc = "7,7 to 10,8" - src.boxes.layer = 19 - src.closer = new /obj/screen/close( ) - src.closer.master = src - src.closer.icon_state = "x" - src.closer.layer = 20 - orient2hud() - return - -/obj/item/clothing/suit/emp_act(severity) - if(!istype(src.loc, /mob/living)) - for(var/obj/O in contents) - O.emp_act(severity) - ..() - -/obj/item/clothing/suit/hear_talk(mob/M, var/msg) - for (var/atom/A in src) - if(istype(A,/obj/)) - var/obj/O = A - O.hear_talk(M, msg) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 7bc09593e5e..95e9b538a28 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -248,7 +248,7 @@ new /obj/item/clothing/under/rank/centcom_officer(src) new /obj/item/clothing/suit/armor/vest/fluff/deus_blueshield(src) new /obj/item/clothing/shoes/centcom(src) - new /obj/item/clothing/tie/blue(src) + new /obj/item/clothing/accessory/blue(src) return /obj/structure/closet/secure_closet/ntrep @@ -281,7 +281,7 @@ New() ..() - new /obj/item/clothing/tie/armband/cargo(src) + new /obj/item/clothing/accessory/armband/cargo(src) new /obj/item/device/encryptionkey/headset_cargo(src) return @@ -289,7 +289,7 @@ New() ..() - new /obj/item/clothing/tie/armband/engine(src) + new /obj/item/clothing/accessory/armband/engine(src) new /obj/item/device/encryptionkey/headset_eng(src) return @@ -297,7 +297,7 @@ New() ..() - new /obj/item/clothing/tie/armband/science(src) + new /obj/item/clothing/accessory/armband/science(src) new /obj/item/device/encryptionkey/headset_sci(src) return @@ -305,7 +305,7 @@ New() ..() - new /obj/item/clothing/tie/armband/medgreen(src) + new /obj/item/clothing/accessory/armband/medgreen(src) new /obj/item/device/encryptionkey/headset_med(src) return @@ -339,7 +339,7 @@ new /obj/item/ammo_box/c38(src) new /obj/item/weapon/gun/projectile/revolver/detective(src) new /obj/item/taperoll/police(src) - new /obj/item/clothing/tie/holster/armpit(src) + new /obj/item/clothing/accessory/holster/armpit(src) return /obj/structure/closet/secure_closet/detective/update_icon() diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 00946b8678c..7a7d16c2eb0 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -90,7 +90,7 @@ FLOOR SAFES var/mob/living/carbon/human/user = usr var/canhear = 0 - if(istype(user.l_hand, /obj/item/clothing/tie/stethoscope) || istype(user.r_hand, /obj/item/clothing/tie/stethoscope)) + if(istype(user.l_hand, /obj/item/clothing/accessory/stethoscope) || istype(user.r_hand, /obj/item/clothing/accessory/stethoscope)) canhear = 1 if(href_list["open"]) @@ -155,7 +155,7 @@ FLOOR SAFES user << "[I] won't fit in [src]." return else - if(istype(I, /obj/item/clothing/tie/stethoscope)) + if(istype(I, /obj/item/clothing/accessory/stethoscope)) user << "Hold [I] in one of your hands while you manipulate the dial." return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9f3e9474fab..e4fd5782590 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -331,31 +331,49 @@ BLIND // can't see anything 2 = Report detailed damages 3 = Report location */ - var/obj/item/clothing/tie/hastie = null + var/list/accessories = list() var/displays_id = 1 var/rolled_down = 0 var/basecolor +/obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A) + if(istype(A)) + .=1 + else + return 0 + if(accessories.len && (A.slot in list("utility","armband"))) + for(var/obj/item/clothing/accessory/AC in accessories) + if (AC.slot == A.slot) + return 0 /obj/item/clothing/under/attackby(obj/item/I, mob/user) - if(!hastie && istype(I, /obj/item/clothing/tie)) - user.drop_item() - hastie = I - I.loc = src - user << "You attach [I] to [src]." + if(istype(I, /obj/item/clothing/accessory)) + var/obj/item/clothing/accessory/A = I + if(can_attach_accessory(A)) + user.drop_item() + accessories += A + A.on_attached(src, user) - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_w_uniform() + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + H.update_inv_w_uniform() + return + else + user << "You cannot attach more accessories of this type to [src]." + + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + A.attackby(I, user) return ..() /obj/item/clothing/under/attack_hand(mob/user as mob) //only forward to the attached accessory if the clothing is equipped (not in a storage) - if(hastie && src.loc == user) - removetie() + if(accessories.len && src.loc == user) + for(var/obj/item/clothing/accessory/A in accessories) + A.attack_hand(user) return if ((ishuman(usr) || ismonkey(usr)) && src.loc == user) //make it harder to accidentally undress yourself @@ -393,8 +411,9 @@ BLIND // can't see anything usr << "Its vital tracker appears to be enabled." if(3) usr << "Its vital tracker and tracking beacon appear to be enabled." - if(hastie) - usr << "\A [hastie] is clipped to it." + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + usr << "\A [A] is attached to it." /obj/item/clothing/under/verb/toggle() set name = "Toggle Suit Sensors" @@ -439,30 +458,35 @@ BLIND // can't see anything else usr << "You cannot roll down the uniform!" -/obj/item/clothing/under/proc/removetie() +/obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) + if(!(A in accessories)) + return + + A.on_removed(user) + accessories -= A + usr.update_inv_w_uniform() + +/obj/item/clothing/under/verb/removetie() + set name = "Remove Accessory" + set category = "Object" set src in usr if(!istype(usr, /mob/living)) return if(usr.stat) return - - if(hastie) - usr.put_in_hands(hastie) - hastie = null - - if (istype(hastie,/obj/item/clothing/tie/storage)) - var/obj/item/clothing/tie/storage/W = hastie - if (W.hold) - W.hold.loc = hastie - - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_w_uniform() + if(!accessories.len) return + var/obj/item/clothing/accessory/A + if(accessories.len > 1) + A = input("Select an accessory to remove from [src]") as null|anything in accessories + else + A = accessories[1] + src.remove_accessory(usr,A) /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() /obj/item/clothing/under/emp_act(severity) - if (hastie) - hastie.emp_act(severity) + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + A.emp_act(severity) ..() diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm new file mode 100644 index 00000000000..cb03feb5997 --- /dev/null +++ b/code/modules/clothing/suits/storage.dm @@ -0,0 +1,29 @@ +/obj/item/clothing/suit/storage + var/obj/item/weapon/storage/internal/pockets + +/obj/item/clothing/suit/storage/New() + ..() + pockets = new/obj/item/weapon/storage/internal(src) + pockets.storage_slots = 2 //two slots + pockets.max_w_class = 2 //fit only pocket sized items + pockets.max_combined_w_class = 4 + +/obj/item/clothing/suit/storage/attack_hand(mob/user as mob) + if (pockets.handle_attack_hand(user)) + ..(user) + +/obj/item/clothing/suit/storage/MouseDrop(obj/over_object as obj) + if (pockets.handle_mousedrop(usr, over_object)) + ..(over_object) + +/obj/item/clothing/suit/storage/attackby(obj/item/W as obj, mob/user as mob) + ..() + pockets.attackby(W, user) + +/obj/item/clothing/suit/storage/emp_act(severity) + pockets.emp_act(severity) + ..() + +/obj/item/clothing/suit/storage/hear_talk(mob/M, var/msg) + pockets.hear_talk(M, msg) + ..() \ No newline at end of file diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm new file mode 100644 index 00000000000..3f1cd08a1dc --- /dev/null +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -0,0 +1,320 @@ +/obj/item/clothing/accessory + name = "tie" + desc = "A neosilk clip-on tie." + icon = 'icons/obj/clothing/ties.dmi' + icon_state = "bluetie" + item_state = "" //no inhands + _color = "bluetie" + slot_flags = SLOT_TIE + w_class = 2.0 + var/slot = "decor" + var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to + var/image/inv_overlay = null //overlay used when attached to clothing. + +/obj/item/clothing/accessory/New() + ..() + inv_overlay = image("icon" = 'icons/obj/clothing/ties_overlay.dmi', "icon_state" = "[_color? "[_color]" : "[icon_state]"]") + +//when user attached an accessory to S +/obj/item/clothing/accessory/proc/on_attached(obj/item/clothing/under/S, mob/user as mob) + if(!istype(S)) + return + has_suit = S + loc = has_suit + has_suit.overlays += inv_overlay + + user << "You attach [src] to [has_suit]." + src.add_fingerprint(user) + +/obj/item/clothing/accessory/proc/on_removed(mob/user as mob) + if(!has_suit) + return + has_suit.overlays -= inv_overlay + has_suit = null + usr.put_in_hands(src) + src.add_fingerprint(user) + +//default attackby behaviour +/obj/item/clothing/accessory/attackby(obj/item/I, mob/user) + ..() + +//default attack_hand behaviour +/obj/item/clothing/accessory/attack_hand(mob/user as mob) + if(has_suit) + return //we aren't an object on the ground so don't call parent + ..() + +/obj/item/clothing/accessory/blue + name = "blue tie" + icon_state = "bluetie" + _color = "bluetie" + +/obj/item/clothing/accessory/red + name = "red tie" + icon_state = "redtie" + _color = "redtie" + +/obj/item/clothing/accessory/black + name = "black tie" + icon_state = "blacktie" + _color = "blacktie" + +/obj/item/clothing/accessory/horrible + name = "horrible tie" + desc = "A neosilk clip-on tie. This one is disgusting." + icon_state = "horribletie" + _color = "horribletie" + +/obj/item/clothing/accessory/waistcoat + name = "waistcoat" + desc = "For some classy, murderous fun." + icon_state = "waistcoat" + item_state = "waistcoat" + _color = "waistcoat" + +/obj/item/clothing/accessory/stethoscope + name = "stethoscope" + desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing." + icon_state = "stethoscope" + _color = "stethoscope" + +/obj/item/clothing/accessory/stethoscope/attack(mob/living/carbon/human/M, mob/living/user) + if(ishuman(M) && isliving(user)) + if(user.a_intent == "help") + var/body_part = parse_zone(user.zone_sel.selecting) + if(body_part) + var/their = "their" + switch(M.gender) + if(MALE) their = "his" + if(FEMALE) their = "her" + + var/sound = "pulse" + var/sound_strength + + if(M.stat == DEAD || (M.status_flags&FAKEDEATH)) + sound_strength = "cannot hear" + sound = "anything" + else + sound_strength = "hear a weak" + switch(body_part) + if("chest") + if(M.oxyloss < 50) + sound_strength = "hear a healthy" + sound = "pulse and respiration" + if("eyes","mouth") + sound_strength = "cannot hear" + sound = "anything" + else + sound_strength = "hear a weak" + + user.visible_message("[user] places [src] against [M]'s [body_part] and listens attentively.", "You place [src] against [their] [body_part]. You [sound_strength] [sound].") + return + return ..(M,user) + + +//Medals +/obj/item/clothing/accessory/medal + name = "bronze medal" + desc = "A bronze medal." + icon_state = "bronze" + _color = "bronze" + +/obj/item/clothing/accessory/medal/conduct + name = "distinguished conduct medal" + desc = "A bronze medal awarded for distinguished conduct. Whilst a great honor, this is most basic award given by Nanotrasen. It is often awarded by a captain to a member of his crew." + +/obj/item/clothing/accessory/medal/bronze_heart + name = "bronze heart medal" + desc = "A bronze heart-shaped medal awarded for sacrifice. It is often awarded posthumously or for severe injury in the line of duty." + icon_state = "bronze_heart" + +/obj/item/clothing/accessory/medal/nobel_science + name = "nobel sciences award" + desc = "A bronze medal which represents significant contributions to the field of science or engineering." + +/obj/item/clothing/accessory/medal/silver + name = "silver medal" + desc = "A silver medal." + icon_state = "silver" + _color = "silver" + +/obj/item/clothing/accessory/medal/silver/valor + name = "medal of valor" + desc = "A silver medal awarded for acts of exceptional valor." + +/obj/item/clothing/accessory/medal/silver/security + name = "robust security award" + desc = "An award for distinguished combat and sacrifice in defence of Nanotrasen's commercial interests. Often awarded to security staff." + +/obj/item/clothing/accessory/medal/gold + name = "gold medal" + desc = "A prestigious golden medal." + icon_state = "gold" + _color = "gold" + +/obj/item/clothing/accessory/medal/gold/captain + name = "medal of captaincy" + desc = "A golden medal awarded exclusively to those promoted to the rank of captain. It signifies the codified responsibilities of a captain to Nanotrasen, and their undisputable authority over their crew." + +/obj/item/clothing/accessory/medal/gold/heroism + name = "medal of exceptional heroism" + desc = "An extremely rare golden medal awarded only by CentComm. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." + +/* + Holobadges are worn on the belt or neck, and can be used to show that the holder is an authorized + Security agent - the user details can be imprinted on the badge with a Security-access ID card, + or they can be emagged to accept any ID for use in disguises. +*/ + +/obj/item/clothing/accessory/holobadge + name = "holobadge" + desc = "This glowing blue badge marks the holder as THE LAW." + icon_state = "holobadge" + _color = "holobadge" + slot_flags = SLOT_BELT | SLOT_TIE + + var/emagged = 0 //Emagging removes Sec check. + var/stored_name = null + +/obj/item/clothing/accessory/holobadge/cord + icon_state = "holobadge-cord" + _color = "holobadge-cord" + slot_flags = SLOT_MASK | SLOT_TIE + +/obj/item/clothing/accessory/holobadge/attack_self(mob/user as mob) + if(!stored_name) + user << "Waving around a badge before swiping an ID would be pretty pointless." + return + if(isliving(user)) + user.visible_message("\red [user] displays their NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.","\red You display your NanoTrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.") + +/obj/item/clothing/accessory/holobadge/attackby(var/obj/item/O as obj, var/mob/user as mob) + + if (istype(O, /obj/item/weapon/card/emag)) + if (emagged) + user << "\red [src] is already cracked." + return + else + emagged = 1 + user << "\red You swipe [O] and crack the holobadge security checks." + return + + else if(istype(O, /obj/item/weapon/card/id) || istype(O, /obj/item/device/pda)) + + var/obj/item/weapon/card/id/id_card = null + + if(istype(O, /obj/item/weapon/card/id)) + id_card = O + else + var/obj/item/device/pda/pda = O + id_card = pda.id + + if(access_security in id_card.access || emagged) + user << "You imprint your ID details onto the badge." + stored_name = id_card.registered_name + name = "holobadge ([stored_name])" + desc = "This glowing blue badge marks [stored_name] as THE LAW." + else + user << "[src] rejects your insufficient access rights." + return + ..() + +/obj/item/clothing/accessory/holobadge/attack(mob/living/carbon/human/M, mob/living/user) + if(isliving(user)) + user.visible_message("\red [user] invades [M]'s personal space, thrusting [src] into their face insistently.","\red You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.") + +/obj/item/weapon/storage/box/holobadge + name = "holobadge box" + desc = "A box claiming to contain holobadges." + New() + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge/cord(src) + new /obj/item/clothing/accessory/holobadge/cord(src) + ..() + return + + +/////////// +//SCARVES// +/////////// + +/obj/item/clothing/accessory/scarf + name = "scarf" + desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks." + +/obj/item/clothing/accessory/scarf/red + name = "red scarf" + icon_state = "redscarf" + _color = "redscarf" + +/obj/item/clothing/accessory/scarf/green + name = "green scarf" + icon_state = "greenscarf" + _color = "greenscarf" + +/obj/item/clothing/accessory/scarf/darkblue + name = "dark blue scarf" + icon_state = "darkbluescarf" + _color = "darkbluescarf" + +/obj/item/clothing/accessory/scarf/purple + name = "purple scarf" + icon_state = "purplescarf" + _color = "purplescarf" + +/obj/item/clothing/accessory/scarf/yellow + name = "yellow scarf" + icon_state = "yellowscarf" + _color = "yellowscarf" + +/obj/item/clothing/accessory/scarf/orange + name = "orange scarf" + icon_state = "orangescarf" + _color = "orangescarf" + +/obj/item/clothing/accessory/scarf/lightblue + name = "light blue scarf" + icon_state = "lightbluescarf" + _color = "lightbluescarf" + +/obj/item/clothing/accessory/scarf/white + name = "white scarf" + icon_state = "whitescarf" + _color = "whitescarf" + +/obj/item/clothing/accessory/scarf/black + name = "black scarf" + icon_state = "blackscarf" + _color = "blackscarf" + +/obj/item/clothing/accessory/scarf/zebra + name = "zebra scarf" + icon_state = "zebrascarf" + _color = "zebrascarf" + +/obj/item/clothing/accessory/scarf/christmas + name = "christmas scarf" + icon_state = "christmasscarf" + _color = "christmasscarf" + +//The three following scarves don't have the scarf subtype +//This is because Ian can equip anything from that subtype +//However, these 3 don't have corgi versions of their sprites +/obj/item/clothing/accessory/stripedredscarf + name = "striped red scarf" + icon_state = "stripedredscarf" + _color = "stripedredscarf" + +/obj/item/clothing/accessory/stripedgreenscarf + name = "striped green scarf" + icon_state = "stripedgreenscarf" + _color = "stripedgreenscarf" + +/obj/item/clothing/accessory/stripedbluescarf + name = "striped blue scarf" + icon_state = "stripedbluescarf" + _color = "stripedbluescarf" + diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/under/accessories/armband.dm new file mode 100644 index 00000000000..8c4dd79ffe8 --- /dev/null +++ b/code/modules/clothing/under/accessories/armband.dm @@ -0,0 +1,42 @@ +/obj/item/clothing/accessory/armband + name = "red armband" + desc = "A fancy red armband!" + icon_state = "red" + _color = "red" + slot = "armband" + +/obj/item/clothing/accessory/armband/cargo + name = "cargo armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is brown." + icon_state = "cargo" + _color = "cargo" + +/obj/item/clothing/accessory/armband/engine + name = "engineering armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is orange with a reflective strip!" + icon_state = "engie" + _color = "engie" + +/obj/item/clothing/accessory/armband/science + name = "science armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is purple." + icon_state = "rnd" + _color = "rnd" + +/obj/item/clothing/accessory/armband/hydro + name = "hydroponics armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is green and blue." + icon_state = "hydro" + _color = "hydro" + +/obj/item/clothing/accessory/armband/med + name = "medical armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is white." + icon_state = "med" + _color = "med" + +/obj/item/clothing/accessory/armband/medgreen + name = "EMT armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is white and green." + icon_state = "medgreen" + _color = "medgreen" diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm new file mode 100644 index 00000000000..1469ca3e127 --- /dev/null +++ b/code/modules/clothing/under/accessories/holster.dm @@ -0,0 +1,126 @@ +/obj/item/clothing/accessory/holster + name = "shoulder holster" + desc = "A handgun holster." + icon_state = "holster" + _color = "holster" + slot = "utility" + var/holster_allow = /obj/item/weapon/gun + var/obj/item/weapon/gun/holstered = null + +//subtypes can override this to specify what can be holstered +/obj/item/clothing/accessory/holster/proc/can_holster(obj/item/weapon/gun/W) + if(!W.isHandgun()) + return 0 + else if(!istype(W,holster_allow)) + return 0 + else + return 1 + +/obj/item/clothing/accessory/holster/proc/holster(obj/item/I, mob/user as mob) + if(holstered) + user << "There is already a [holstered] holstered here!" + return + + if (!istype(I, /obj/item/weapon/gun)) + user << "Only guns can be holstered!" + return + + var/obj/item/weapon/gun/W = I + if (!can_holster(W)) + user << "This [W] won't fit in the [src]!" + return + + holstered = W + user.drop_from_inventory(holstered) + holstered.loc = src + holstered.add_fingerprint(user) + user.visible_message("[user] holsters the [holstered].", "You holster the [holstered].") + +/obj/item/clothing/accessory/holster/proc/unholster(mob/user as mob) + if(!holstered) + return + + if(istype(user.get_active_hand(),/obj) && istype(user.get_inactive_hand(),/obj)) + user << "You need an empty hand to draw the [holstered]!" + else + if(user.a_intent == "hurt") + usr.visible_message("\red [user] draws the [holstered], ready to shoot!", \ + "You draw the [holstered], ready to shoot!") + else + user.visible_message("[user] draws the [holstered], pointing it at the ground.", \ + "You draw the [holstered], pointing it at the ground.") + user.put_in_hands(holstered) + holstered.add_fingerprint(user) + holstered = null + +/obj/item/clothing/accessory/holster/attack_hand(mob/user as mob) + if (has_suit) //if we are part of a suit + if (holstered) + unholster(user) + return + + ..(user) + +/obj/item/clothing/accessory/holster/attackby(obj/item/W as obj, mob/user as mob) + holster(W, user) + +/obj/item/clothing/accessory/holster/emp_act(severity) + if (holstered) + holstered.emp_act(severity) + ..() + +/obj/item/clothing/accessory/holster/examine(mob/user) + ..(user) + if (holstered) + user << "A [holstered] is holstered here." + else + user << "It is empty." + +/obj/item/clothing/accessory/holster/on_attached(obj/item/clothing/under/S, mob/user as mob) + ..() + has_suit.verbs += /obj/item/clothing/accessory/holster/verb/holster_verb + +/obj/item/clothing/accessory/holster/on_removed(mob/user as mob) + has_suit.verbs -= /obj/item/clothing/accessory/holster/verb/holster_verb + ..() + +//For the holster hotkey +/obj/item/clothing/accessory/holster/verb/holster_verb() + set name = "Holster" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + var/obj/item/clothing/accessory/holster/H = null + if (istype(src, /obj/item/clothing/accessory/holster)) + H = src + else if (istype(src, /obj/item/clothing/under)) + var/obj/item/clothing/under/S = src + if (S.accessories.len) + H = locate() in S.accessories + + if (!H) + usr << "Something is very wrong." + + if(!H.holstered) + if(!istype(usr.get_active_hand(), /obj/item/weapon/gun)) + usr << "You need your gun equiped to holster it." + return + var/obj/item/weapon/gun/W = usr.get_active_hand() + H.holster(W, usr) + else + H.unholster(usr) + +/obj/item/clothing/accessory/holster/armpit + name = "shoulder holster" + desc = "A worn-out handgun holster. Perfect for concealed carry" + icon_state = "holster" + _color = "holster" + holster_allow = /obj/item/weapon/gun/projectile + +/obj/item/clothing/accessory/holster/waist + name = "shoulder holster" + desc = "A handgun holster. Made of expensive leather." + icon_state = "holster" + _color = "holster_low" \ No newline at end of file diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm new file mode 100644 index 00000000000..327bb985adf --- /dev/null +++ b/code/modules/clothing/under/accessories/storage.dm @@ -0,0 +1,86 @@ +/obj/item/clothing/accessory/storage + name = "load bearing equipment" + desc = "Used to hold things when you don't have enough hands." + icon_state = "webbing" + _color = "webbing" + slot = "utility" + var/slots = 3 + var/obj/item/weapon/storage/internal/hold + +/obj/item/clothing/accessory/storage/New() + ..() + hold = new/obj/item/weapon/storage/internal(src) + hold.storage_slots = slots + +/obj/item/clothing/accessory/storage/attack_hand(mob/user as mob) + if (has_suit) //if we are part of a suit + hold.open(user) + return + + if (hold.handle_attack_hand(user)) //otherwise interact as a regular storage item + ..(user) + +/obj/item/clothing/accessory/storage/MouseDrop(obj/over_object as obj) + if (has_suit) + return + + if (hold.handle_mousedrop(usr, over_object)) + ..(over_object) + +/obj/item/clothing/accessory/storage/attackby(obj/item/W as obj, mob/user as mob) + return hold.attackby(W, user) + +/obj/item/clothing/accessory/storage/emp_act(severity) + hold.emp_act(severity) + ..() + +/obj/item/clothing/accessory/storage/hear_talk(mob/M, var/msg, verb, datum/language/speaking) + hold.hear_talk(M, msg, verb, speaking) + ..() + +/obj/item/clothing/accessory/storage/attack_self(mob/user as mob) + user << "You empty [src]." + var/turf/T = get_turf(src) + hold.hide_from(usr) + for(var/obj/item/I in hold.contents) + hold.remove_from_storage(I, T) + src.add_fingerprint(user) + +/obj/item/clothing/accessory/storage/webbing + name = "webbing" + desc = "Strudy mess of synthcotton belts and buckles, ready to share your burden." + icon_state = "webbing" + _color = "webbing" + +/obj/item/clothing/accessory/storage/black_vest + name = "black webbing vest" + desc = "Robust black synthcotton vest with lots of pockets to hold whatever you need, but cannot hold in hands." + icon_state = "vest_black" + _color = "vest_black" + slots = 5 + +/obj/item/clothing/accessory/storage/brown_vest + name = "brown webbing vest" + desc = "Worn brownish synthcotton vest with lots of pockets to unload your hands." + icon_state = "vest_brown" + _color = "vest_brown" + slots = 5 + +/obj/item/clothing/accessory/storage/knifeharness + name = "decorated harness" + desc = "A heavily decorated harness of sinew and leather with two knife-loops." + icon_state = "unathiharness2" + _color = "unathiharness2" + slots = 2 + +/obj/item/clothing/accessory/storage/knifeharness/New() + ..() + hold.max_combined_w_class = 4 + hold.can_hold = list("/obj/item/weapon/hatchet/unathiknife",\ + "/obj/item/weapon/kitchen/utensil/knife",\ + "/obj/item/weapon/kitchen/utensil/pknife",\ + "/obj/item/weapon/kitchenknife",\ + "/obj/item/weapon/kitchenknife/ritual") + + new /obj/item/weapon/hatchet/unathiknife(hold) + new /obj/item/weapon/hatchet/unathiknife(hold) \ No newline at end of file diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm deleted file mode 100644 index 5bf9e1cb75f..00000000000 --- a/code/modules/clothing/under/ties.dm +++ /dev/null @@ -1,467 +0,0 @@ -/obj/item/clothing/tie - name = "tie" - desc = "A neosilk clip-on tie." - icon = 'icons/obj/clothing/ties.dmi' - icon_state = "bluetie" - item_state = "" //no inhands - _color = "bluetie" - flags = FPRINT | TABLEPASS - slot_flags = 0 - w_class = 2.0 - -/obj/item/clothing/tie/blue - name = "blue tie" - icon_state = "bluetie" - _color = "bluetie" - -/obj/item/clothing/tie/red - name = "red tie" - icon_state = "redtie" - _color = "redtie" - -/obj/item/clothing/tie/black - name = "black tie" - icon_state = "blacktie" - _color = "blacktie" - -/obj/item/clothing/tie/horrible - name = "horrible tie" - desc = "A neosilk clip-on tie. This one is disgusting." - icon_state = "horribletie" - _color = "horribletie" - -/obj/item/clothing/tie/waistcoat - name = "waistcoat" - desc = "For some classy, murderous fun." - icon_state = "waistcoat" - item_state = "waistcoat" - _color = "waistcoat" - -/obj/item/clothing/tie/stethoscope - name = "stethoscope" - desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing." - icon_state = "stethoscope" - _color = "stethoscope" - -/obj/item/clothing/tie/stethoscope/attack(mob/living/carbon/human/M, mob/living/user) - if(ishuman(M) && isliving(user)) - if(user.a_intent == "help") - var/body_part = parse_zone(user.zone_sel.selecting) - if(body_part) - var/their = "their" - switch(M.gender) - if(MALE) their = "his" - if(FEMALE) their = "her" - - var/sound = "pulse" - var/sound_strength - - if(M.stat == DEAD || (M.status_flags&FAKEDEATH)) - sound_strength = "cannot hear" - sound = "anything" - else - sound_strength = "hear a weak" - switch(body_part) - if("chest") - if(M.oxyloss < 50) - sound_strength = "hear a healthy" - sound = "pulse and respiration" - if("eyes","mouth") - sound_strength = "cannot hear" - sound = "anything" - else - sound_strength = "hear a weak" - - user.visible_message("[user] places [src] against [M]'s [body_part] and listens attentively.", "You place [src] against [their] [body_part]. You [sound_strength] [sound].") - return - return ..(M,user) - - -//Medals -/obj/item/clothing/tie/medal - name = "bronze medal" - desc = "A bronze medal." - icon_state = "bronze" - _color = "bronze" - -/obj/item/clothing/tie/medal/conduct - name = "distinguished conduct medal" - desc = "A bronze medal awarded for distinguished conduct. Whilst a great honor, this is most basic award given by Nanotrasen. It is often awarded by a captain to a member of his crew." - -/obj/item/clothing/tie/medal/bronze_heart - name = "bronze heart medal" - desc = "A bronze heart-shaped medal awarded for sacrifice. It is often awarded posthumously or for severe injury in the line of duty." - icon_state = "bronze_heart" - -/obj/item/clothing/tie/medal/nobel_science - name = "nobel sciences award" - desc = "A bronze medal which represents significant contributions to the field of science or engineering." - -/obj/item/clothing/tie/medal/silver - name = "silver medal" - desc = "A silver medal." - icon_state = "silver" - _color = "silver" - -/obj/item/clothing/tie/medal/silver/valor - name = "medal of valor" - desc = "A silver medal awarded for acts of exceptional valor." - -/obj/item/clothing/tie/medal/silver/security - name = "robust security award" - desc = "An award for distinguished combat and sacrifice in defence of Nanotrasen's commercial interests. Often awarded to security staff." - -/obj/item/clothing/tie/medal/gold - name = "gold medal" - desc = "A prestigious golden medal." - icon_state = "gold" - _color = "gold" - -/obj/item/clothing/tie/medal/gold/captain - name = "medal of captaincy" - desc = "A golden medal awarded exclusively to those promoted to the rank of captain. It signifies the codified responsibilities of a captain to Nanotrasen, and their undisputable authority over their crew." - -/obj/item/clothing/tie/medal/gold/heroism - name = "medal of exceptional heroism" - desc = "An extremely rare golden medal awarded only by CentComm. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." - -/obj/item/clothing/tie/medal/gold/ion - name = "Ion Chef Medal" - desc = "A medal awarded to the winner of the Ion Chef contest" - icon_state = "ion" - _color = "ion" - - -//Armbands -/obj/item/clothing/tie/armband - name = "red armband" - desc = "An fancy red armband!" - icon_state = "red" - _color = "red" - -/obj/item/clothing/tie/armband/cargo - name = "cargo bay guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is brown." - icon_state = "cargo" - _color = "cargo" - -/obj/item/clothing/tie/armband/engine - name = "engineering guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is orange with a reflective strip!" - icon_state = "engie" - _color = "engie" - -/obj/item/clothing/tie/armband/science - name = "science guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is purple." - icon_state = "rnd" - _color = "rnd" - -/obj/item/clothing/tie/armband/hydro - name = "hydroponics guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is green and blue." - icon_state = "hydro" - _color = "hydro" - -/obj/item/clothing/tie/armband/med - name = "medical guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white." - icon_state = "med" - _color = "med" - -/obj/item/clothing/tie/armband/medgreen - name = "medical guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and green." - icon_state = "medgreen" - _color = "medgreen" - -/obj/item/clothing/tie/holster - name = "large shoulder holster" - desc = "A handgun holster." - icon_state = "holster" - _color = "holster" - var/obj/item/weapon/gun/holstered = null - var/holster_allow = /obj/item/weapon/gun - icon_action_button = "action_holster" - -/obj/item/clothing/tie/holster/attack_self() - holster() - -/obj/item/clothing/tie/holster/proc/holster() - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - if(!holstered) - if(!istype(usr.get_active_hand(), holster_allow)) - usr << "You can't fit that in the holster." - return - var/obj/item/weapon/gun/W = usr.get_active_hand() - if (!W.isHandgun()) - usr << "This gun won't fit in \the [src]!" - return - holstered = usr.get_active_hand() - usr.drop_item() - holstered.loc = src - usr.visible_message("\The [usr] holsters \the [holstered].", "You holster \the [holstered].") - else - if(istype(usr.get_active_hand(),/obj) && istype(usr.get_inactive_hand(),/obj)) - usr << "You need an empty hand to draw the gun!" - else - if(usr.a_intent == "harm") - usr.visible_message("\The [usr] draws \the [holstered], ready to shoot!", \ - "You draw \the [holstered], ready to shoot!") - else - usr.visible_message("\The [usr] draws \the [holstered], pointing it at the ground.", \ - "You draw \the [holstered], pointing it at the ground.") - usr.put_in_hands(holstered) - holstered = null - -/obj/item/clothing/tie/holster/armpit - name = "shoulder holster" - desc = "A worn-out handgun holster. Perfect for concealed carry" - icon_state = "holster" - _color = "holster" - holster_allow = /obj/item/weapon/gun/projectile - -/obj/item/clothing/tie/storage - name = "load bearing equipment" - desc = "Used to hold things when you don't have enough hands for that." - icon_state = "webbing" - _color = "webbing" - var/slots = 3 - var/obj/item/weapon/storage/pockets/hold - icon_action_button = "action_storage" - -/obj/item/clothing/tie/storage/New() - hold = new /obj/item/weapon/storage/pockets(src) - hold.master_item = src - hold.storage_slots = slots - - -/obj/item/clothing/tie/storage/attack_self(mob/user as mob) - if (!istype(hold)) - return - - hold.loc = user - hold.attack_hand(user) - -/obj/item/clothing/tie/storage/attackby(obj/item/weapon/W as obj, mob/user as mob) - hold.attackby(W,user) - src.add_fingerprint(user) - -/obj/item/weapon/storage/pockets - name = "storage" - var/master_item //item it belongs to - -/obj/item/weapon/storage/pockets/close(mob/user as mob) - ..() - loc = master_item - -/obj/item/clothing/tie/storage/webbing - name = "webbing" - desc = "Strudy mess of synthcotton belts and buckles, ready to share your burden." - icon_state = "webbing" - _color = "webbing" - -/obj/item/clothing/tie/storage/black_vest - name = "black webbing vest" - desc = "Robust black synthcotton vest with lots of pockets to hold whatever you need, but cannot hold in hands." - icon_state = "vest_black" - _color = "vest_black" - slots = 5 - -/obj/item/clothing/tie/storage/brown_vest - name = "brown webbing vest" - desc = "Worn brownish synthcotton vest with lots of pockets to unload your hands." - icon_state = "vest_brown" - _color = "vest_brown" - slots = 5 -/* - Holobadges are worn on the belt or neck, and can be used to show that the holder is an authorized - Security agent - the user details can be imprinted on the badge with a Security-access ID card, - or they can be emagged to accept any ID for use in disguises. -*/ - -/obj/item/clothing/tie/holobadge - - name = "holobadge" - desc = "This glowing blue badge marks the holder as THE LAW." - icon_state = "holobadge" - _color = "holobadge" - slot_flags = SLOT_BELT - - var/emagged = 0 //Emagging removes Sec check. - var/stored_name = null - -/obj/item/clothing/tie/holobadge/cord - icon_state = "holobadge-cord" - _color = "holobadge-cord" - slot_flags = SLOT_MASK - -/obj/item/clothing/tie/holobadge/attack_self(mob/user as mob) - if(!stored_name) - user << "Waving around a badge before swiping an ID would be pretty pointless." - return - if(isliving(user)) - user.visible_message("\red [user] displays their Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.","\red You display your Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.") - -/obj/item/clothing/tie/holobadge/attackby(var/obj/item/O as obj, var/mob/user as mob) - - if (istype(O, /obj/item/weapon/card/emag)) - if (emagged) - user << "\red [src] is already cracked." - return - else - emagged = 1 - user << "\red You swipe [O] and crack the holobadge security checks." - return - - else if(istype(O, /obj/item/weapon/card/id) || istype(O, /obj/item/device/pda)) - - var/obj/item/weapon/card/id/id_card = null - - if(istype(O, /obj/item/weapon/card/id)) - id_card = O - else - var/obj/item/device/pda/pda = O - id_card = pda.id - - if(access_security in id_card.access || emagged) - user << "You imprint your ID details onto the badge." - stored_name = id_card.registered_name - name = "holobadge ([stored_name])" - desc = "This glowing blue badge marks [stored_name] as THE LAW." - else - user << "[src] rejects your insufficient access rights." - return - ..() - -/obj/item/clothing/tie/holobadge/attack(mob/living/carbon/human/M, mob/living/user) - if(isliving(user)) - user.visible_message("\red [user] invades [M]'s personal space, thrusting [src] into their face insistently.","\red You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.") - -/obj/item/weapon/storage/box/holobadge - name = "holobadge box" - desc = "A box claiming to contain holobadges." - New() - new /obj/item/clothing/tie/holobadge(src) - new /obj/item/clothing/tie/holobadge(src) - new /obj/item/clothing/tie/holobadge(src) - new /obj/item/clothing/tie/holobadge(src) - new /obj/item/clothing/tie/holobadge/cord(src) - new /obj/item/clothing/tie/holobadge/cord(src) - ..() - return - -/obj/item/clothing/tie/storage/knifeharness - name = "decorated harness" - desc = "A heavily decorated harness of sinew and leather with two knife-loops." - icon_state = "unathiharness2" - _color = "unathiharness2" - slots = 2 - -/obj/item/clothing/tie/storage/knifeharness/attackby(var/obj/item/O as obj, mob/user as mob) - ..() - update() - -/obj/item/clothing/tie/storage/knifeharness/proc/update() - var/count = 0 - for(var/obj/item/I in hold) - if(istype(I,/obj/item/weapon/hatchet/unathiknife)) - count++ - if(count>2) count = 2 - item_state = "unathiharness[count]" - icon_state = item_state - _color = item_state - - if(istype(loc, /obj/item/clothing)) - var/obj/item/clothing/U = loc - if(istype(U.loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = U.loc - H.update_inv_w_uniform() - -/obj/item/clothing/tie/storage/knifeharness/New() - ..() - new /obj/item/weapon/hatchet/unathiknife(hold) - new /obj/item/weapon/hatchet/unathiknife(hold) - -/////////// -//SCARVES// -/////////// - -/obj/item/clothing/tie/scarf - name = "scarf" - desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks." - -/obj/item/clothing/tie/scarf/red - name = "red scarf" - icon_state = "redscarf" - _color = "redscarf" - -/obj/item/clothing/tie/scarf/green - name = "green scarf" - icon_state = "greenscarf" - _color = "greenscarf" - -/obj/item/clothing/tie/scarf/darkblue - name = "dark blue scarf" - icon_state = "darkbluescarf" - _color = "darkbluescarf" - -/obj/item/clothing/tie/scarf/purple - name = "purple scarf" - icon_state = "purplescarf" - _color = "purplescarf" - -/obj/item/clothing/tie/scarf/yellow - name = "yellow scarf" - icon_state = "yellowscarf" - _color = "yellowscarf" - -/obj/item/clothing/tie/scarf/orange - name = "orange scarf" - icon_state = "orangescarf" - _color = "orangescarf" - -/obj/item/clothing/tie/scarf/lightblue - name = "light blue scarf" - icon_state = "lightbluescarf" - _color = "lightbluescarf" - -/obj/item/clothing/tie/scarf/white - name = "white scarf" - icon_state = "whitescarf" - _color = "whitescarf" - -/obj/item/clothing/tie/scarf/black - name = "black scarf" - icon_state = "blackscarf" - _color = "blackscarf" - -/obj/item/clothing/tie/scarf/zebra - name = "zebra scarf" - icon_state = "zebrascarf" - _color = "zebrascarf" - -/obj/item/clothing/tie/scarf/christmas - name = "christmas scarf" - icon_state = "christmasscarf" - _color = "christmasscarf" - -//The three following scarves don't have the scarf subtype -//This is because Ian can equip anything from that subtype -//However, these 3 don't have corgi versions of their sprites -/obj/item/clothing/tie/stripedredscarf - name = "striped red scarf" - icon_state = "stripedredscarf" - _color = "stripedredscarf" - -/obj/item/clothing/tie/stripedgreenscarf - name = "striped green scarf" - icon_state = "stripedgreenscarf" - _color = "stripedgreenscarf" - -/obj/item/clothing/tie/stripedbluescarf - name = "striped blue scarf" - icon_state = "stripedbluescarf" - _color = "stripedbluescarf" \ No newline at end of file diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 27736fe0858..07eb3da5f3f 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -738,7 +738,7 @@ /obj/item/clothing/under/rank/bartender/fluff/classy //searif: Ara Al-Jazari name = "classy bartender uniform" - desc = "A prim and proper uniform that looks very similar to a bartender's, the only differences being a red tie, waistcoat and a rag hanging out of the back pocket." + desc = "A prim and proper uniform that looks very similar to a bartender's, the only differences being a red accessory, waistcoat and a rag hanging out of the back pocket." icon = 'icons/obj/custom_items.dmi' icon_state = "ara_bar_uniform" item_state = "ara_bar_uniform" @@ -833,7 +833,7 @@ ////// Small locket - Altair An-Nasaqan - Serithi -/obj/item/clothing/tie/fluff/altair_locket +/obj/item/clothing/accessory/fluff/altair_locket name = "small locket" desc = "A small golden locket attached to an Ii'rka-reed string. Inside the locket is a holo-picture of a female Tajaran, and an inscription writtin in Siik'mas." icon = 'icons/obj/custom_items.dmi' @@ -847,7 +847,7 @@ ////// Silver locket - Konaa Hirano - Konaa_Hirano -/obj/item/clothing/tie/fluff/konaa_hirano +/obj/item/clothing/accessory/fluff/konaa_hirano name = "silver locket" desc = "This oval shaped, argentium sterling silver locket hangs on an incredibly fine, refractive string, almost thin as hair and microweaved from links to a deceptive strength, of similar material. The edges are engraved very delicately with an elegant curving design, but overall the main is unmarked and smooth to the touch, leaving room for either remaining as a stolid piece or future alterations. There is an obvious internal place for a picture or lock of some sort, but even behind that is a very thin compartment unhinged with the pinch of a thumb and forefinger." icon = 'icons/obj/custom_items.dmi' @@ -860,13 +860,13 @@ slot_flags = SLOT_MASK var/obj/item/held //Item inside locket. -/obj/item/clothing/tie/fluff/konaa_hirano/attack_self(mob/user as mob) +/obj/item/clothing/accessory/fluff/konaa_hirano/attack_self(mob/user as mob) if(held) user << "You open [src] and [held] falls out." held.loc = get_turf(user) src.held = null -/obj/item/clothing/tie/fluff/konaa_hirano/attackby(var/obj/item/O as obj, mob/user as mob) +/obj/item/clothing/accessory/fluff/konaa_hirano/attackby(var/obj/item/O as obj, mob/user as mob) if(istype(O,/obj/item/weapon/paper)) if(held) usr << "[src] already has something inside it." @@ -880,7 +880,7 @@ ////// Medallion - Nasir Khayyam - Jamini -/obj/item/clothing/tie/fluff/nasir_khayyam_1 +/obj/item/clothing/accessory/fluff/nasir_khayyam_1 name = "medallion" desc = "This silvered medallion bears the symbol of the Hadii Clan of the Tajaran." icon = 'icons/obj/custom_items.dmi' @@ -892,7 +892,7 @@ ////// Medallion - Lin Chang - Roland410 -/obj/item/clothing/tie/fluff/lin_chang_1 +/obj/item/clothing/accessory/fluff/lin_chang_1 name = "shining black medallion" desc = "A shiny black medallion made of something that looks like the Earth's obsidian, but it is harder than anything ever seen yet. On the front there seems to be a standing unathi chiseled in it, on the back the name of Lin Chang with the title of the Assassin Archmage." icon = 'icons/obj/custom_items.dmi' diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 504234d9886..c11f66cd196 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -50,7 +50,7 @@ if(15) new/obj/item/clothing/under/chameleon(src) for(var/i = 0, i < 7, i++) - new/obj/item/clothing/tie/horrible(src) + new/obj/item/clothing/accessory/horrible(src) if(16) new/obj/item/clothing/under/shorts(src) new/obj/item/clothing/under/shorts/red(src) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 3f8953c397a..f763179550e 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -67,8 +67,8 @@ var/tie_msg if(istype(w_uniform,/obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform - if(U.hastie) - tie_msg += " with \icon[U.hastie] \a [U.hastie]" + if(U.accessories.len) + tie_msg += " with [lowertext(english_list(U.accessories))]" if(w_uniform.blood_DNA) msg += "[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][tie_msg]!\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1c0feaaef05..ab92ae5d573 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -517,7 +517,7 @@
Empty Both Pockets

[(handcuffed ? text("Handcuffed") : text("Not Handcuffed"))]
[(legcuffed ? text("Legcuffed") : text(""))] - [(suit) ? ((suit.hastie) ? text("
Remove Accessory", src) : "") :] + [(suit) ? ((suit.accessories.len) ? text("
Remove Accessory", src) : "") :] [(internal ? text("
Remove Internal") : "")]
Remove Splints
Refresh diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 2520b2d1982..c76cb6d2a82 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -101,6 +101,8 @@ return has_organ("chest") if(slot_in_backpack) return 1 + if(slot_tie) + return 1 /mob/living/carbon/human/u_equip(obj/item/W as obj) if(!W) return 0 @@ -337,6 +339,9 @@ if(src.get_active_hand() == W) src.u_equip(W) W.loc = src.back + if(slot_tie) + var/obj/item/clothing/under/uniform = src.w_uniform + uniform.attackby(W,src) else src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!" return @@ -552,15 +557,17 @@ message = "\red [source] is trying to take off \a [target.w_uniform] from [target]'s body!" if("tie") var/obj/item/clothing/under/suit = target.w_uniform - target.attack_log += text("\[[time_stamp()]\] Has had their accessory ([suit.hastie]) removed by [source.name] ([source.ckey])") - source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) accessory ([suit.hastie])") - if(istype(suit.hastie, /obj/item/clothing/tie/holobadge) || istype(suit.hastie, /obj/item/clothing/tie/medal)) - for(var/mob/M in viewers(target, null)) - M.show_message("\red [source] tears off \the [suit.hastie] from [target]'s suit!" , 1) - done() - return - else - message = "\red [source] is trying to take off \a [suit.hastie] from [target]'s suit!" + if(suit.accessories.len) + var/obj/item/clothing/accessory/A = suit.accessories[1] + target.attack_log += "\[[time_stamp()]\] Has had their accessory ([A]) removed by [source.name] ([source.ckey])" + source.attack_log += "\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) accessory ([A])" + if(istype(A, /obj/item/clothing/accessory/holobadge) || istype(A, /obj/item/clothing/accessory/medal)) + for(var/mob/M in viewers(target, null)) + M.show_message("\red [source] tears off \the [A] from [target]'s [suit]!" , 1) + done() + return + else + message = "\red [source] is trying to take off \a [A] from [target]'s [suit]!" if("s_store") target.attack_log += text("\[[time_stamp()]\] Has had their suit storage item ([target.s_store]) removed by [source.name] ([source.ckey])") source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) suit storage item ([target.s_store])") @@ -701,15 +708,19 @@ It can still be worn/put on as normal. strip_item = target.wear_suit if("tie") var/obj/item/clothing/under/suit = target.w_uniform - var/obj/item/clothing/tie/tie = suit.hastie - if(tie) - if (istype(tie,/obj/item/clothing/tie/storage)) - var/obj/item/clothing/tie/storage/W = tie + //var/obj/item/clothing/accessory/tie = suit.hastie + /*if(tie) + if (istype(tie,/obj/item/clothing/accessory/storage)) + var/obj/item/clothing/accessory/storage/W = tie if (W.hold) W.hold.close(usr) usr.put_in_hands(tie) - suit.hastie = null - target.update_inv_w_uniform() + suit.hastie = null*/ + if(suit && suit.accessories.len) + var/obj/item/clothing/accessory/A = suit.accessories[1] + A.on_removed(usr) + suit.accessories -= A + target.update_inv_w_uniform() if("id") slot_to_process = slot_wear_id if (target.wear_id) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index c920db100a8..4b9f4f1e107 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -614,10 +614,11 @@ proc/get_damage_icon_part(damage_state, body_part) else standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood") - if(w_uniform:hastie) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. - var/tie_color = w_uniform:hastie._color - if(!tie_color) tie_color = w_uniform:hastie.icon_state - standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]") + if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. + for(var/obj/item/clothing/accessory/A in w_uniform:accessories) + var/tie_color = A._color + if(!tie_color) tie_color = A.icon_state + standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]") overlays_standing[UNIFORM_LAYER] = standing else @@ -867,7 +868,7 @@ proc/get_damage_icon_part(damage_state, body_part) if(update_icons) update_icons() /mob/living/carbon/human/update_inv_wear_mask(var/update_icons=1) - if( wear_mask && ( istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/tie) ) ) + if( wear_mask && ( istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory) ) ) wear_mask.screen_loc = ui_mask //TODO var/image/standing diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 791c1b64d88..737a44342b0 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -216,7 +216,7 @@ L += get_contents(S) for(var/obj/item/clothing/suit/storage/S in src.contents)//Check for labcoats and jackets L += get_contents(S) - for(var/obj/item/clothing/tie/storage/S in src.contents)//Check for holsters + for(var/obj/item/clothing/accessory/storage/S in src.contents)//Check for holsters L += get_contents(S) for(var/obj/item/weapon/gift/G in src.contents) //Check for gift-wrapped items L += G.gift diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 6abce2c37d7..84c4be074f3 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -193,6 +193,7 @@ var/list/slot_equipment_priority = list( \ slot_glasses,\ slot_belt,\ slot_s_store,\ + slot_tie,\ slot_l_store,\ slot_r_store\ ) diff --git a/code/setup.dm b/code/setup.dm index 008a92fbc06..157b5a47d04 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -186,6 +186,7 @@ var/MAX_EXPLOSION_RANGE = 14 #define SLOT_DENYPOCKET 4096 //this is to deny items with a w_class of 2 or 1 to fit in pockets. #define SLOT_TWOEARS 8192 #define SLOT_PDA 16384 +#define SLOT_TIE 32768 //FLAGS BITMASK @@ -271,6 +272,7 @@ var/MAX_EXPLOSION_RANGE = 14 #define slot_legcuffed 19 #define slot_r_ear 20 #define slot_wear_pda 21 +#define slot_tie 22 //Cant seem to find a mob bitflags area other than the powers one diff --git a/icons/obj/clothing/ties_overlay.dmi b/icons/obj/clothing/ties_overlay.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6c6a65afc12f6c01d739ab7a62190c4fb19ad272 GIT binary patch literal 3091 zcmb_ec{J2*8~$07A`yAXQrb*}Y(useg%MdNg(w-uHny>pY$+{-qR76FZH8h78T(e2 ziNP4tP_OL9KDIG@(|P~;&i8(QeCK?B+|Tu#`?=0_?(^Kwxt{xlg}D(QuNW@?0DLCK zhE^o+NFi4Fv`Gta{~&8|L8hT5 zW5cE?sI|m~Xs&7A3qokk%h<8v<-}5Z?UnP$6;|*E0wGEj4*{ln#r7l z9)075aN;jAja2&b*t+BJ=(tZ6)mc5HEL5h~c-k+S%e6!Ht|tDx9jR8^U%NkR_U3 z3wFo8V%|X{Rtxq4CSZ&Cq5Te3&s7?i1(%Ok`3(1|6AC?fzeiy=<)%>8-Gdt)buo)C zbzAogq0%1`*1rd2Z!Ki6 zhe{F&TeZuKo$w|?4IzIgOh>?Es56yhqLoGArJI;>QZ&nb(L03k)@g=tdQRL6N+8}N|` zrt=p4_{E2txci{MJvuj%6+K1HQF?k@>`?^^%7BUHP<~lme|K3LlBCo0=fY?(ke~(a zn=|JHSNH(&6Js;#1!gk}4X#Kt_*T?Kq$nU5Z!Ikt&n7+ad;9+c?^d>p^24_9k~$pE&Gr_WEu3^-S;8?p zJo`mj_@|Y=nDK~CswDn%TN%)7pO$b0s@{2qsW4lbcN`2y8psXi1()p9xgKUV2}!c? zOKrkqj};U6?jHmw#l(u-XsPPY>9)){;BrhU=P=KDy@wm7DN)epE(}q(|5&QCiV?wI zT4E5o(#sI^wNFDJmF4pBB6af*NCJw0tZ%vUb5v1facY!@)EBn9JWnO7cdBU^@4D^r^^KMCyc?jc0Gd@YV6WZV+wE=pX9Z62$IhvHe!wrwc#~>+R-Q)N?fS*e(VbR;+>f}O z{HyC&{pwz8ko|c1JPghKL|uD?y!&z2ex~Ugd3UW=Kie4bGOv2xi`bv#L0hC{Ct93b!SFaHs>|1v%z zj$9X9O_K;-`2&EA5+gJMiTpuYIp{;}=2ll=v^)N-;ma9T^Hta;ia%cICr~}>2pYJs zW(j+xs$Woc_|T6B{cs@iYoE#X&vwJPGv{zd2-dsvpKzcQWSd zqeu#GQTunbJ74gZ4X=i|7-WL#NUk2tLy{o?i}ZDJ6;)aaQjORTvtDp}Q^1~sSc4CI zYDBz6ZNU_Hl^c$X&m~57KGU=fBhW;7j^4NYBB!D@RC4XyCq)5K!&Plu z+blehv|t-B)8A2O`d(2>EAG-QwDbwy)1pW7P$-_B_X_H+Vnb-kvZb-Qa;|J5I(^rI z6KLL$x* zZ^rFRPlUTAK%45X&(-S?P`eXHIfWjo>f73;faK)b)0EwO513n%LnYR}bq=!&3kH6E zO1lh(rJdb#*PeHOe29i*-z?kOsfJ|l5S?U3LBMJeIJAzuvJ+M!E`?Z0a5?Dgo!e1z zidO-HdCZ83DJfiLL`4-9PQX_)(-(ZIyRYwQ$}#RL8H$!v4y)B`$s#Uo0hflKHuj`y z%|U-n!CZcPm1e(%`H78|wbP7Ho4-Xu={8hdnsO_Sx5vTb`H=HN4_BiiT)}7V`%%BO3wtEX%5V#vw(=~&M_%+sMw-Cuk zsIVEByndJyb6TK*+j%3cu`1X6n!+ow!ioyBG8D?fyjaN5(a{}ou&LoJnP4Pa_>D@9 z$6~Q@sp;t*(BRnD>UbrOT_IuZ&k3r1FOYGA?qUmD2s#-18IuroG-H#fImEfu@Or_G&n> zG^(3CvAm_5GzjhRGYT^Q`uH|0qGJnQhpr040DZ zRn(y%V@$S**CXMJn#(mF`88O2H(vXRKYZM3ZVfN_)Oc+ZVs`hQ zh>9yS7PrPn3iHvpVtb}|f^`^{x4By(EC~9@mi(GF*6)E4Tc|yLIU*@``u#gpVEM$} zpdfPRm6lA8+gXZP6pJ@3LDmoroth*H-z-sn@~5b_1Uwx6qMkmxm58Qes9U<_do-g- zk0%?li8OZSl>Pj^dFm#=ii$+#gZ^w|W`%foZWc