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
R6R
Date: Mon, 26 Nov 2018 00:19:49 +0000
Subject: [PATCH 003/172] Fixes issue with duct tape bypassing walls
---
code/datums/components/ducttape.dm | 27 +++++++++++++++++++++------
code/game/objects/items.dm | 3 ++-
2 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/code/datums/components/ducttape.dm b/code/datums/components/ducttape.dm
index c69e90efaf7..71e2be992ab 100644
--- a/code/datums/components/ducttape.dm
+++ b/code/datums/components/ducttape.dm
@@ -11,6 +11,7 @@
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/add_tape_text)
RegisterSignal(parent, COMSIG_OBJ_UPDATE_ICON, .proc/add_tape_overlay)
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/afterattack)
+ RegisterSignal(parent, COMSIG_ITEM_PICKUP, .proc/pick_up)
I.update_icon() //Do this first so the action button preoperly shows the icon
var/datum/action/item_action/remove_tape/RT = new(I)
if(I.loc == user)
@@ -38,18 +39,32 @@
user.transfer_fingerprints_to(I)
Destroy()
-/datum/component/ducttape/proc/afterattack(datum/source, atom/target, mob/user, proximity, params)
+/datum/component/ducttape/proc/afterattack(obj/item/I, atom/target, mob/user, proximity, params)
if(!proximity)
return
if(!isturf(target))
return
+ if(!user.unEquip(I))
+ return
+ var/turf/source_turf = get_turf(I)
+ var/turf/target_turf = target
var/list/clickparams = params2list(params)
var/x_offset = text2num(clickparams["icon-x"]) - 16
var/y_offset = text2num(clickparams["icon-y"]) - 16
- var/turf/T = target
- var/obj/item/I = source
- to_chat(user, "You stick [I] to [T].")
- user.unEquip(I)
- I.forceMove(T)
+ if(target_turf != get_turf(I)) //Trying to stick it on a wall, don't move it to the actual wall or you can move the item through it. Instead set the pixels as appropriate
+ var/target_direction = get_dir(source_turf, target_turf)//The direction we clicked
+ if(target_direction & EAST)
+ x_offset += 32
+ else if(target_direction & WEST)
+ x_offset -= 32
+ if(target_direction & NORTH)
+ y_offset += 32
+ else if(target_direction & SOUTH)
+ y_offset -= 32
+ to_chat(user, "You stick [I] to [target_turf].")
I.pixel_x = x_offset
I.pixel_y = y_offset
+
+/datum/component/ducttape/proc/pick_up(obj/item/I, mob/user)
+ I.pixel_x = initial(I.pixel_x)
+ I.pixel_y = initial(I.pixel_y)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 40b3ff692be..dda149b88e2 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -255,6 +255,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
return 0
pickup(user)
+
add_fingerprint(user)
user.put_in_active_hand(src)
return 1
@@ -332,7 +333,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
// called just as an item is picked up (loc is not yet changed)
/obj/item/proc/pickup(mob/user)
- return
+ SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user)
// called when this item is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called.
/obj/item/proc/on_exit_storage(obj/item/storage/S as obj)
From b5e506d40cfc00b6aa4223ec88a5172c75dac4c6 Mon Sep 17 00:00:00 2001
From: Birdtalon
Date: Tue, 27 Nov 2018 12:42:43 +0000
Subject: [PATCH 004/172] adds species starting boxes
---
code/game/jobs/job/job.dm | 7 +++++--
.../objects/items/weapons/storage/boxes.dm | 20 +++++++++++++++++++
.../mob/living/carbon/human/species/human.dm | 4 +++-
.../living/carbon/human/species/plasmaman.dm | 2 ++
.../mob/living/carbon/human/species/vox.dm | 2 ++
5 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index 92424dd2bcb..a6b05707fd4 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -168,8 +168,11 @@
back = backpack //Department backpack
if(box)
- backpack_contents.Insert(1, box) // Box always takes a first slot in backpack
- backpack_contents[box] = 1
+ var/spawnbox = box
+ if(H.dna.species.speciesbox)
+ spawnbox = H.dna.species.speciesbox
+ backpack_contents.Insert(1, spawnbox) // Box always takes a first slot in backpack
+ backpack_contents[spawnbox] = 1
if(allow_loadout && H.client && (H.client.prefs.gear && H.client.prefs.gear.len))
for(var/gear in H.client.prefs.gear)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 1d23049064f..307443eae57 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -74,6 +74,26 @@
new /obj/item/reagent_containers/hypospray/autoinjector( src )
return
+/obj/item/storage/box/survival_vox
+ icon_state = "box_civ"
+
+/obj/item/storage/box/survival_vox/New()
+ ..()
+ contents = list()
+ new /obj/item/clothing/mask/breath/vox(src)
+ new /obj/item/tank/emergency_oxygen/nitrogen(src)
+ new /obj/item/reagent_containers/hypospray/autoinjector(src)
+
+/obj/item/storage/box/survival_plasmaman
+ icon_state = "box_civ"
+
+/obj/item/storage/box/survival_plasmaman/New()
+ ..()
+ contents = list()
+ new /obj/item/clothing/mask/breath(src)
+ new /obj/item/tank/emergency_oxygen/plasma(src)
+ new /obj/item/reagent_containers/hypospray/autoinjector(src)
+
/obj/item/storage/box/engineer
icon_state = "box_eng"
New()
diff --git a/code/modules/mob/living/carbon/human/species/human.dm b/code/modules/mob/living/carbon/human/species/human.dm
index 2a161ab9318..cce24189bcd 100644
--- a/code/modules/mob/living/carbon/human/species/human.dm
+++ b/code/modules/mob/living/carbon/human/species/human.dm
@@ -17,4 +17,6 @@
worlds tumultous at best."
reagent_tag = PROCESS_ORG
- //Has standard darksight of 2.
\ No newline at end of file
+ //Has standard darksight of 2.
+
+ var/speciesbox // Specific species starting boxes
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 82c875444d2..3ac2eca49a3 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -39,6 +39,8 @@
"eyes" = /obj/item/organ/internal/eyes
)
+ speciesbox = /obj/item/storage/box/survival_plasmaman
+
/datum/species/plasmaman/say_filter(mob/M, message, datum/language/speaking)
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "s", stutter("ss"))
diff --git a/code/modules/mob/living/carbon/human/species/vox.dm b/code/modules/mob/living/carbon/human/species/vox.dm
index d01f1ccf6fe..5b498e700f9 100644
--- a/code/modules/mob/living/carbon/human/species/vox.dm
+++ b/code/modules/mob/living/carbon/human/species/vox.dm
@@ -78,6 +78,8 @@
"is holding their breath!",
"is deeply inhaling oxygen!")
+ speciesbox = /obj/item/storage/box/survival_vox
+
/datum/species/vox/handle_death(mob/living/carbon/human/H)
H.stop_tail_wagging(1)
From 88ff4eb49fa315f7bf5b2752e65b286275b80c42 Mon Sep 17 00:00:00 2001
From: Citinited
Date: Wed, 28 Nov 2018 22:21:59 +0000
Subject: [PATCH 005/172] Some fixes for taping, also bumps up max_amount for
tape rolls and adds a tape supply pack
---
code/datums/action.dm | 9 ++-
code/datums/components/ducttape.dm | 2 +-
code/datums/supplypacks.dm | 10 ++-
code/game/objects/items.dm | 21 +++++--
code/game/objects/items/weapons/tape.dm | 64 +++++++-------------
code/modules/clothing/masks/miscellaneous.dm | 13 ++--
code/modules/clothing/shoes/miscellaneous.dm | 2 +-
code/modules/paperwork/paper_bundle.dm | 2 -
8 files changed, 62 insertions(+), 61 deletions(-)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index dcdc4d1a9ba..2ae8e5f3eea 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -112,10 +112,10 @@
I.actions -= src
return ..()
-/datum/action/item_action/Trigger()
+/datum/action/item_action/Trigger(attack_self = TRUE) //Maybe we don't want to click the thing itself
if(!..())
return 0
- if(target)
+ if(target && attack_self)
var/obj/item/I = target
I.ui_action_click(owner, type)
return 1
@@ -316,6 +316,11 @@
/datum/action/item_action/remove_tape
name = "Remove Duct Tape"
+/datum/action/item_action/remove_tape/Trigger(attack_self = FALSE)
+ if(..())
+ GET_COMPONENT_FROM(DT, /datum/component/ducttape, target)
+ DT.remove_tape(target, usr)
+
/datum/action/item_action/toggle_jetpack
name = "Toggle Jetpack"
diff --git a/code/datums/components/ducttape.dm b/code/datums/components/ducttape.dm
index 71e2be992ab..5bbf99198fd 100644
--- a/code/datums/components/ducttape.dm
+++ b/code/datums/components/ducttape.dm
@@ -12,7 +12,7 @@
RegisterSignal(parent, COMSIG_OBJ_UPDATE_ICON, .proc/add_tape_overlay)
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/afterattack)
RegisterSignal(parent, COMSIG_ITEM_PICKUP, .proc/pick_up)
- I.update_icon() //Do this first so the action button preoperly shows the icon
+ I.update_icon() //Do this first so the action button properly shows the icon
var/datum/action/item_action/remove_tape/RT = new(I)
if(I.loc == user)
RT.Grant(user)
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 89108071b09..6d0d027c453 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -934,7 +934,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/science/oil
name = "Oil Tank Crate"
- contains = list(/obj/structure/reagent_dispensers/oil,
+ contains = list(/obj/structure/reagent_dispensers/oil,
/obj/item/reagent_containers/food/drinks/oilcan)
cost = 10
containertype = /obj/structure/largecrate
@@ -1341,6 +1341,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 15
containername = "bureaucracy crate"
+/datum/supply_packs/misc/tape
+ name = "Sticky Tape Crate"
+ contains = list(/obj/item/stack/tape_roll,
+ /obj/item/stack/tape_roll,
+ /obj/item/stack/tape_roll)
+ cost = 10
+ containername = "sticky tape crate"
+
/datum/supply_packs/misc/toner
name = "Toner Cartridges Crate"
contains = list(/obj/item/toner,
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index dda149b88e2..9f195470ebf 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -310,6 +310,21 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
else if(S.can_be_inserted(src))
S.handle_item_insertion(src)
+ else if(istype(I, /obj/item/stack/tape_roll))
+ var/obj/item/stack/tape_roll/TR = I
+ var/list/clickparams = params2list(params)
+ var/x_offset = text2num(clickparams["icon-x"])
+ var/y_offset = text2num(clickparams["icon-y"])
+ if(GetComponent(/datum/component/ducttape))
+ to_chat(user, "[src] already has some tape attached!")
+ return
+ if(TR.use(1))
+ to_chat(user, "You apply some tape to [src].")
+ AddComponent(/datum/component/ducttape, src, user, x_offset, y_offset)
+ anchored = TRUE
+ user.transfer_fingerprints_to(src)
+ else
+ to_chat(user, "You don't have enough tape to do that!")
else
return ..()
@@ -419,12 +434,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
//The default action is attack_self().
//Checks before we get to here are: mob is alive, mob is not restrained, paralyzed, asleep, resting, laying, item is on the mob.
/obj/item/proc/ui_action_click(mob/user, actiontype)
- if(actiontype == /datum/action/item_action/remove_tape)
- GET_COMPONENT(DT, /datum/component/ducttape)
- if(!DT)
- return
- DT.remove_tape(src, user)
- return
attack_self(user)
/obj/item/proc/IsReflect(var/def_zone) //This proc determines if and at what% an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit
diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm
index a19b2cecd22..838734fc778 100644
--- a/code/game/objects/items/weapons/tape.dm
+++ b/code/game/objects/items/weapons/tape.dm
@@ -5,8 +5,8 @@
icon_state = "taperoll"
singular_name = "tape roll"
w_class = WEIGHT_CLASS_TINY
- amount = 10
- max_amount = 10
+ amount = 25
+ max_amount = 25
/obj/item/stack/tape_roll/New(var/loc, var/amount=null)
..()
@@ -18,29 +18,29 @@
return
if(M.wear_mask)
to_chat(user, "Remove [M.p_their()] mask first!")
- else if(amount < 2)
+ return
+ if(amount < 2)
to_chat(user, "You'll need more tape for this!")
- else if(!M.check_has_mouth())
+ return
+ if(!M.check_has_mouth())
to_chat(user, "[M.p_they(TRUE)] [M.p_have()] no mouth to tape over!")
- else
- if(M == user)
- to_chat(user, "You try to tape your own mouth shut.")
- else
- to_chat(user, "You try to tape [M]'s mouth shut.")
- M.visible_message("[user] tries to tape [M]'s mouth closed!")
- if(do_after(user, 50, target = M))
- if(M == user)
- to_chat(user, "You cover your own mouth with a piece of duct tape.")
- else
- to_chat(user, "You cover [M]'s mouth with a piece of duct tape. That will shut [M.p_them()] up!")
- M.visible_message("[user] tapes [M]'s mouth shut!")
- var/obj/item/clothing/mask/muzzle/G = new /obj/item/clothing/mask/muzzle/tapegag
- M.equip_to_slot(G, slot_wear_mask)
- G.add_fingerprint(user)
- amount = amount - 2
- if(amount <= 0)
- user.unEquip(src, 1)
- qdel(src)
+ return
+ user.visible_message("[user] is taping [M]'s mouth closed!",
+ "You try to tape [M == user ? "your own" : "[M]'s"] mouth shut!",
+ "You hear tape ripping.")
+ if(!do_after(user, 50, target = M))
+ return
+ if(!use(2))
+ to_chat(user, "You don't have enough tape!")
+ return
+ if(M.wear_mask)
+ to_chat(user, "[M == user ? user : M]'s mouth is already covered!")
+ return
+ user.visible_message("[user] tapes [M]'s mouth shut!",
+ "You cover [M == user ? "your own" : "[M]'s"] mouth with a piece of duct tape.[M == user ? null : " That will shut them up."]")
+ var/obj/item/clothing/mask/muzzle/G = new /obj/item/clothing/mask/muzzle/tapegag
+ M.equip_to_slot(G, slot_wear_mask)
+ G.add_fingerprint(user)
/obj/item/stack/tape_roll/update_icon()
var/amount = get_amount()
@@ -54,21 +54,3 @@
icon_state = "taperoll-4"
else
icon_state = "taperoll-4"
-
-/obj/item/stack/tape_roll/afterattack(obj/item/I, mob/user, proximity, params)
- ..()
- if(!proximity || !istype(I))
- return
- var/list/clickparams = params2list(params)
- var/x_offset = text2num(clickparams["icon-x"])
- var/y_offset = text2num(clickparams["icon-y"])
- if(I.GetComponent(/datum/component/ducttape))
- to_chat(user, "[I] already has some tape attached!")
- return
- if(use(1))
- to_chat(user, "You apply some tape to [I].")
- I.AddComponent(/datum/component/ducttape, I, user, x_offset, y_offset)
- I.anchored = TRUE
- user.transfer_fingerprints_to(src)
- else
- to_chat(user, "You don't have enough tape to do that!")
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index c10ccf32f89..743d80599e0 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -104,14 +104,13 @@
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
-/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user)
- var/atom/movable/R = new /obj/item/trash/tapetrash
- var/turf/T = get_turf(src)
- R.loc = T
- transfer_fingerprints_to(R)
- playsound(src,'sound/items/poster_ripped.ogg',40,1)
+/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/user)
+ var/obj/item/trash/tapetrash/TT = new(drop_location(src))
+ transfer_fingerprints_to(TT)
+ user.transfer_fingerprints_to(TT)
+ playsound(src, 'sound/items/poster_ripped.ogg', 40, 1)
+ ..()
user.emote("scream")
- . = ..()
/obj/item/clothing/mask/muzzle/safety
name = "safety muzzle"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 304a7332bf6..f73c04b72f3 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -182,7 +182,7 @@
item_state = "noble_boot"
/obj/item/clothing/shoes/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/stack/tape_roll))
+ if(istype(I, /obj/item/stack/tape_roll) && !silence_steps)
var/obj/item/stack/tape_roll/TR = I
if((!silence_steps || shoe_sound) && TR.use(4))
silence_steps = 1
diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm
index a2cae0d32bb..da241a9c007 100644
--- a/code/modules/paperwork/paper_bundle.dm
+++ b/code/modules/paperwork/paper_bundle.dm
@@ -62,8 +62,6 @@
to_chat(user, "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name].")
qdel(W)
else
- if(istype(W, /obj/item/stack/tape_roll))
- return 0
if(istype(W, /obj/item/pen) || istype(W, /obj/item/toy/crayon))
usr << browse("", "window=[name]") //Closes the dialog
P = src[page]
From 53300b82ea9477a38ad0f168f893e1a52ba78a66 Mon Sep 17 00:00:00 2001
From: Citinited
Date: Thu, 29 Nov 2018 00:11:53 +0000
Subject: [PATCH 006/172] Sticky tape crates have a small chance of spawning a
rubber duck
---
code/datums/supplypacks.dm | 1 +
code/game/objects/structures/crates_lockers/crates.dm | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 6d0d027c453..a485e447f89 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -1348,6 +1348,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/stack/tape_roll)
cost = 10
containername = "sticky tape crate"
+ containertype = /obj/structure/closet/crate/tape
/datum/supply_packs/misc/toner
name = "Toner Cartridges Crate"
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 87cae2fb993..c98fe24aa57 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -637,3 +637,8 @@
icon_state = "electricalcrate"
icon_opened = "electricalcrateopen"
icon_closed = "electricalcrate"
+
+/obj/structure/closet/crate/tape/New()
+ if(prob(10))
+ new /obj/item/bikehorn/rubberducky(src)
+ ..()
From 8f2677115cb6144af111f39779fed87428462971 Mon Sep 17 00:00:00 2001
From: Birdtalon
Date: Fri, 30 Nov 2018 14:43:54 +0000
Subject: [PATCH 007/172] fixes invalid variable
---
code/modules/mob/living/carbon/human/species/_species.dm | 3 +++
code/modules/mob/living/carbon/human/species/human.dm | 3 +--
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index a728c2bbfd8..f9460bea3e1 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -156,6 +156,9 @@
// Mutant pieces
var/obj/item/organ/internal/ears/mutantears = /obj/item/organ/internal/ears
+ // Species specific boxes
+ var/speciesbox
+
/datum/species/New()
//If the species has eyes, they are the default vision organ
if(!vision_organ && has_organ["eyes"])
diff --git a/code/modules/mob/living/carbon/human/species/human.dm b/code/modules/mob/living/carbon/human/species/human.dm
index cce24189bcd..2570fb060e7 100644
--- a/code/modules/mob/living/carbon/human/species/human.dm
+++ b/code/modules/mob/living/carbon/human/species/human.dm
@@ -18,5 +18,4 @@
reagent_tag = PROCESS_ORG
//Has standard darksight of 2.
-
- var/speciesbox // Specific species starting boxes
\ No newline at end of file
+
\ No newline at end of file
From 15164c755b6d920a6ea5aa7041bcdc859d2de4c9 Mon Sep 17 00:00:00 2001
From: Ionward
Date: Fri, 30 Nov 2018 14:30:03 -0800
Subject: [PATCH 008/172] Grey sprites! Adds biosuit hoods, bombsuit hoods, the
radiation suit hood, three missing uniforms, the missing paramedic EVA suit,
adjusts the ushanka, hardhats and jackolantern, the griffin, snowman, and
chicken suit heads, the warden/HoS's mask, nudged science goggles and the lit
engie hardsuit helmet 1 pixel over, the cueball helmet, cardborg helmet, and
both smiling and plain paper sacks.
---
code/modules/clothing/head/hardhat.dm | 5 +++-
code/modules/clothing/head/misc.dm | 24 ++++++++++++++++++
code/modules/clothing/head/misc_special.dm | 13 ++++++++++
code/modules/clothing/masks/miscellaneous.dm | 6 +++--
.../clothing/spacesuits/miscellaneous.dm | 3 +--
code/modules/clothing/suits/bio.dm | 7 ++---
code/modules/clothing/suits/utility.dm | 6 +++--
icons/mob/species/grey/eyes.dmi | Bin 12903 -> 12900 bytes
icons/mob/species/grey/head.dmi | Bin 0 -> 26079 bytes
icons/mob/species/grey/helmet.dmi | Bin 66966 -> 66957 bytes
icons/mob/species/grey/mask.dmi | Bin 43368 -> 45107 bytes
icons/mob/species/grey/uniform.dmi | Bin 290120 -> 292603 bytes
12 files changed, 54 insertions(+), 10 deletions(-)
create mode 100644 icons/mob/species/grey/head.dmi
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index ae694f8edf2..4ca71d73969 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -11,12 +11,15 @@
flags_inv = 0
actions_types = list(/datum/action/item_action/toggle_helmet_light)
burn_state = FIRE_PROOF
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
/obj/item/clothing/head/hardhat/attack_self(mob/user)
on = !on
icon_state = "hardhat[on]_[item_color]"
item_state = "hardhat[on]_[item_color]"
-
if(on)
set_light(brightness_on)
else
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index dc8c4b59a4d..5335e8b2d38 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -79,6 +79,10 @@
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
/obj/item/clothing/head/snowman
name = "snowman head"
@@ -88,6 +92,10 @@
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
/obj/item/clothing/head/that
name = "sturdy top-hat"
@@ -246,6 +254,10 @@
icon_state = "chickenhead"
item_state = "chickensuit"
flags = BLOCKHAIR
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
/obj/item/clothing/head/corgi
name = "corgi suit head"
@@ -396,6 +408,10 @@
item_state = "griffinhat"
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
actions_types = list(/datum/action/item_action/caw)
/obj/item/clothing/head/griffin/attack_self()
@@ -425,6 +441,10 @@
icon_state = "papersack"
flags = BLOCKHAIR
flags_inv = HIDEFACE|HIDEEARS
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
/obj/item/clothing/head/papersack/smiley
name = "paper sack hat"
@@ -432,6 +452,10 @@
icon_state = "papersack_smile"
flags = BLOCKHAIR
flags_inv = HIDEFACE|HIDEEARS
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
/obj/item/clothing/head/crown
name = "crown"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index ab42d17e469..81d9ed04958 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -131,6 +131,10 @@
flags_inv = HIDEEARS
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
/obj/item/clothing/head/ushanka/attack_self(mob/user as mob)
if(src.icon_state == "ushankadown")
@@ -154,6 +158,10 @@
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
brightness_on = 2 //luminosity when on
@@ -221,6 +229,11 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
species_disguise = "High-tech robot"
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
+
/obj/item/clothing/head/cardborg/equipped(mob/living/user, slot)
..()
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index cfb5a39ef4c..cea34e4c7d9 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -301,8 +301,10 @@
var/voicechange = 0
var/temporaryname = " the Horse"
var/originalname = ""
-
-
+ species_fit = list("Grey")
+ sprite_sheets = list(
+ "Grey" = 'icons/mob/species/grey/mask.dmi'
+ )
/obj/item/clothing/mask/horsehead/equipped(mob/user, slot)
if(flags & NODROP) //cursed masks only
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 532522747ed..2e34835f82e 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -165,10 +165,9 @@
desc = "A brand new paramedic EVA suit. The nitrile seems a bit too thin to be space proof. Used for retrieving bodies in space."
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
species_restricted = list("exclude", "Diona", "Wryn")
- species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
+ species_fit = list("Vox", "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
- "Grey" = 'icons/mob/species/grey/suit.dmi',
"Skrell" = 'icons/mob/species/skrell/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Drask" = 'icons/mob/species/drask/suit.dmi',
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 7880dcc1dd3..0c85db3d533 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -9,10 +9,11 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
burn_state = FIRE_PROOF
- species_fit = list("Vox")
+ species_fit = list("Vox", "Grey")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/helmet.dmi'
- )
+ "Vox" = 'icons/mob/species/vox/helmet.dmi',
+ "Grey" = 'icons/mob/species/grey/head.dmi'
+ )
/obj/item/clothing/suit/bio_suit
name = "bio suit"
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index e0b444afcd0..7f1ebfc101a 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -77,7 +77,8 @@
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/helmet.dmi'
+ "Vox" = 'icons/mob/species/vox/helmet.dmi',
+ "Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/suit/bomb_suit
@@ -130,7 +131,8 @@
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/head.dmi'
+ "Vox" = 'icons/mob/species/vox/head.dmi',
+ "Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/suit/radiation
diff --git a/icons/mob/species/grey/eyes.dmi b/icons/mob/species/grey/eyes.dmi
index 2a1d7c1cd353f789a04eaa6e950d43a1509e7e53..8c732aa782dd5e487e6c33a51bde40cf9dc19f02 100644
GIT binary patch
literal 12900
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 |