Revenge of the Mannequins (#29763)

* ohfuck that wasn't the right branch

* ohfuck

* tweaks
This commit is contained in:
DeityLink
2021-06-16 00:16:41 +02:00
committed by GitHub
parent 4864bbfdce
commit 34ddefb0ec
23 changed files with 1142 additions and 322 deletions

View File

@@ -1167,6 +1167,35 @@ proc/get_mob_with_client_list()
else
return zone
/proc/limb_define_to_part_define(var/zone)
switch(zone)
if (LIMB_HEAD)
return HEAD
if (LIMB_CHEST)
return UPPER_TORSO
if (LIMB_GROIN)
return LOWER_TORSO
if (TARGET_MOUTH)
return MOUTH
if (TARGET_EYES)
return EYES
if (LIMB_RIGHT_HAND)
return HAND_RIGHT
if (LIMB_LEFT_HAND)
return HAND_LEFT
if (LIMB_LEFT_ARM)
return ARM_LEFT
if (LIMB_RIGHT_ARM)
return ARM_RIGHT
if (LIMB_LEFT_LEG)
return LEG_LEFT
if (LIMB_RIGHT_LEG)
return LEG_RIGHT
if (LIMB_LEFT_FOOT)
return FOOT_LEFT
if (LIMB_RIGHT_FOOT)
return FOOT_RIGHT
/*
get_holder_at_turf_level(): Similar to get_turf(), will return the "highest up" holder of this atom, excluding the turf.
Example: A fork inside a box inside a locker will return the locker. Essentially, get_just_before_turf().

View File

@@ -151,7 +151,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
else if(H.species.anatomy_flags & RGBSKINTONE)
preview_icon.Blend(rgb(H.my_appearance.r_hair, H.my_appearance.g_hair, H.my_appearance.b_hair), ICON_ADD)
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s")
var/icon/eyes_s = new/icon("icon" = 'icons/mob/hair_styles.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s")
eyes_s.Blend(rgb(H.my_appearance.r_eyes, H.my_appearance.g_eyes, H.my_appearance.b_eyes), ICON_ADD)

View File

@@ -37,7 +37,7 @@
I.Blend(new /icon('icons/mob/human.dmi', "mouth_m_s"), ICON_OVERLAY)
I.Blend(new /icon('icons/mob/human.dmi', "underwear1_m_s"), ICON_OVERLAY)
var/icon/U = new /icon('icons/mob/human_face.dmi', "hair_a_s")
var/icon/U = new /icon('icons/mob/hair_styles.dmi', "hair_a_s")
U.Blend(rgb(src.h_r, src.h_g, src.h_b), ICON_ADD)
I.Blend(U, ICON_OVERLAY)

View File

@@ -74,9 +74,10 @@
..()
/obj/structure/closet/statue/Destroy()
..()
processing_objects.Remove(src)
for (var/atom/A in src)
qdel(A)
..()
/obj/structure/closet/statue/proc/dissolve()
@@ -92,12 +93,13 @@
spawn(10)
for(var/i=1 to 5)
for(var/mob/living/L in contents)
L.adjustBruteLoss(60)
L.mutations |= M_NOCLONE
L.adjustBruteLoss(10)
if (L.health <= 0)
L.mutations |= M_NOCLONE
if(ishuman(L) && !(M_HUSK in L.mutations))
var/mob/living/carbon/human/H = L
H.ChangeToHusk()
if(ishuman(L) && !(M_HUSK in L.mutations))
var/mob/living/carbon/human/H = L
H.ChangeToHusk()
sleep(10)
dump_contents()

View File

@@ -5,11 +5,12 @@
#define MANNEQUIN_ICONS_SLOT "slot_icon"
#define MANNEQUIN_ICONS_PRIMITIVE "primitive_icon"
#define MANNEQUIN_ICONS_SPECIES "species_icon"
#define MANNEQUIN_ICONS_CORGI "corgi"
#define MANNEQUIN_ICONS_FAT "fat_icon"
#define MANNEQUIN_DYNAMIC_LAYER "dynamic_layer"
/obj/structure/mannequin
name = "human marble mannequin"
name = "human man marble mannequin"
desc = "You almost feel like it's going to come alive any second."
icon = 'icons/obj/mannequin.dmi'
icon_state="mannequin_marble_human"
@@ -24,12 +25,27 @@
var/species_type = /datum/species/human
var/fat = 0
var/primitive = 0
var/corgi = FALSE
gender = MALE
var/list/clothing = list()
var/list/obj/item/held_items = list(null, null)
var/hair_style
var/beard_style
var/hair_color = "#B9C1B8"
var/clothing_offset_x = 0
var/clothing_offset_y = 3*PIXEL_MULTIPLIER
var/health = 90
var/maxHealth = 90
var/has_pedestal = TRUE
var/timer = 80 //in seconds
var/mob/living/captured
var/intialTox = 0
var/intialFire = 0
var/intialBrute = 0
var/intialOxy = 0
var/dissolving = FALSE
var/additional_damage = 0//tracking how much damage we took
var/list/all_slot_icons = list()
@@ -58,7 +74,7 @@
var/chaintrap_range = 0//= Range at which mannequin awakens nearby mannequins when it awakens.
/obj/structure/mannequin/New()
/obj/structure/mannequin/New(turf/loc, var/f_style, var/h_style, var/list/items_to_wear, var/list/items_to_hold = list(null, null), var/mob_to_capture)
..()
species = new species_type()
@@ -77,6 +93,28 @@
SLOT_MANNEQUIN_ID,
)
beard_style = f_style
hair_style = h_style
if (items_to_wear?.len)
for (var/slot in clothing)
var/obj/item/O = items_to_wear[slot]
if (O)
clothing[slot] = O
O.forceMove(src)
O.mannequin_equip(src,slot)
for (var/i = 1 to held_items.len)
var/obj/item/O = items_to_hold[i]
if (O)
held_items[i] = O
O.forceMove(src)
O.mannequin_equip(src,"hands",i)
if (mob_to_capture)
capture_mob(mob_to_capture)
for(var/cloth_slot in clothing)
all_slot_icons[cloth_slot] = get_slot_icons(cloth_slot)
@@ -85,6 +123,97 @@
if(awake)
Awaken()
/obj/structure/mannequin/Destroy()
processing_objects.Remove(src)
captured = null
held_items.len = 0
clothing.len = 0
..()
/obj/structure/mannequin/process()
timer--
if (captured)
captured.setToxLoss(intialTox)
captured.adjustFireLoss(intialFire - captured.getFireLoss())
captured.adjustBruteLoss(intialBrute - captured.getBruteLoss())
captured.setOxyLoss(intialOxy)
if (timer >= 5)
captured.Paralyse(2)
if (timer <= 0)
freeCaptive()
qdel(src)
/obj/structure/mannequin/proc/capture_mob(var/mob/M)
if(!isliving(M))
return
has_pedestal = FALSE
var/mob/living/L = M
if(L.locked_to)
L.locked_to = 0
L.anchored = 0
if(L.client)
L.client.perspective = EYE_PERSPECTIVE
L.client.eye = src
for(var/obj/item/I in L.held_items)
L.drop_item(I)
if(L.locked_to)
L.unlock_from()
L.sdisabilities |= MUTE
L.delayNextAttack(timer)
L.click_delayer.setDelay(timer)
health = L.health*2
maxHealth = L.maxHealth*2
intialTox = L.getToxLoss()
intialFire = L.getFireLoss()
intialBrute = L.getBruteLoss()
intialOxy = L.getOxyLoss()
dir = L.dir
L.forceMove(src)
name = "statue of \a [name]"
if(iscorgi(L))
desc = "If it takes forever, I will wait for you..."
else
desc = "An incredibly lifelike marble carving."
if(timer < 0)
L.death(FALSE)
else
processing_objects.Add(src)
M.forceMove(src)
captured = M
processing_objects.Add(src)
/obj/structure/mannequin/proc/dissolve()
if(dissolving)
return
visible_message("<span class='notice'>The statue's surface begins cracking and dissolving!</span>")
processing_objects.Remove(src) //Disable the statue's processing (otherwise it may heal the occupants or something like that)
dissolving = TRUE
//Kill and husk the occupants over the course of 6 seconds, then dump them out (they won't be cloneable but their brains will be OK)
spawn(10)
for(var/i=1 to 5)
for(var/mob/living/L in contents)
L.adjustBruteLoss(10)
if (L.health <= 0)
L.mutations |= M_NOCLONE
if(ishuman(L) && !(M_HUSK in L.mutations))
var/mob/living/carbon/human/H = L
H.ChangeToHusk()
sleep(10)
breakDown()
/obj/structure/mannequin/HasProximity(var/atom/movable/AM)
if(trapped_prox && isliving(AM))
Awaken()
@@ -308,6 +437,7 @@
/obj/structure/mannequin/proc/getDamage(var/damage)
health -= damage
additional_damage += damage
healthCheck()
if(health > 0 && (trapped_strip || trapped_prox))
Awaken()
@@ -319,8 +449,69 @@
breakDown()
/obj/structure/mannequin/proc/freeCaptive()
if (!captured)
return
captured.forceMove(loc)
for(var/cloth in clothing)
var/obj/O = clothing[cloth]
if (O)
switch(cloth)
if(SLOT_MANNEQUIN_ICLOTHING)
captured.equip_to_slot_or_drop(O, slot_w_uniform)
if(SLOT_MANNEQUIN_FEET)
captured.equip_to_slot_or_drop(O, slot_shoes)
if(SLOT_MANNEQUIN_GLOVES)
captured.equip_to_slot_or_drop(O, slot_gloves)
if(SLOT_MANNEQUIN_EARS)
captured.equip_to_slot_or_drop(O, slot_ears)
if(SLOT_MANNEQUIN_OCLOTHING)
captured.equip_to_slot_or_drop(O, slot_wear_suit)
if(SLOT_MANNEQUIN_EYES)
captured.equip_to_slot_or_drop(O, slot_glasses)
if(SLOT_MANNEQUIN_BELT)
captured.equip_to_slot_or_drop(O, slot_belt)
if(SLOT_MANNEQUIN_MASK)
captured.equip_to_slot_or_drop(O, slot_wear_mask)
if(SLOT_MANNEQUIN_HEAD)
if (iscorgi(captured))
var/mob/living/simple_animal/corgi/corgi = captured
O.forceMove(captured)
corgi.inventory_back = O
corgi.regenerate_icons()
else
captured.equip_to_slot_or_drop(O, slot_head)
if(SLOT_MANNEQUIN_BACK)
if (iscorgi(captured))
var/mob/living/simple_animal/corgi/corgi = captured
corgi.place_on_head(O)
else
captured.equip_to_slot_or_drop(O, slot_back)
if(SLOT_MANNEQUIN_ID)
captured.equip_to_slot_or_drop(O, slot_wear_id)
clothing.len = 0
for(var/index = 1 to held_items.len)
var/obj/item/tool = held_items[index]
if (!tool)
continue
captured.put_in_hands(tool)
held_items.len = 0
captured.dir = dir
captured.apply_damage(additional_damage)
/obj/structure/mannequin/proc/breakDown()
visible_message("<span class='warning'><b>[src]</b> collapses!</span>")
new /obj/effect/decal/cleanable/dirt(loc)
playsound(loc, 'sound/effects/stone_crumble.ogg', 100, 1)
if (captured)
if (dissolving)
freeCaptive()
qdel(src)
return
else
captured.gib()
for(var/cloth in clothing)
if(clothing[cloth])
var/obj/item/cloth_to_drop = clothing[cloth]
@@ -367,25 +558,30 @@
/obj/structure/mannequin/proc/show_inv(var/mob/user)
var/dat
for(var/i = 1 to held_items.len)
dat += "<B>[capitalize(get_index_limb_name(i))]</B> <A href='?src=\ref[src];hands=[i]'>[makeStrippingButton(get_held_item_by_index(i))]</A><BR>"
if (corgi)
dat += "<BR><B>Head:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_HEAD]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_HEAD])]</A>"
dat += "<BR><B>Back:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_BACK]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_BACK])]</A>"
else
for(var/i = 1 to held_items.len)
dat += "<B>[capitalize(get_index_limb_name(i))]</B> <A href='?src=\ref[src];hands=[i]'>[makeStrippingButton(get_held_item_by_index(i))]</A><BR>"
dat += "<BR><B>Back:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_BACK]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_BACK])]</A>"
dat += "<BR>"
dat += "<BR><B>Head:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_HEAD]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_HEAD])]</A>"
dat += "<BR><B>Mask:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_MASK]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_MASK])]</A>"
dat += "<BR><B>Eyes:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_EYES]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_EYES])]</A>"
if(!primitive)
dat += "<BR><B>Ears:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_EARS]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_EARS])]</A>"
dat += "<BR>"
if(!primitive)
dat += "<BR><B>Exosuit:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_OCLOTHING]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_OCLOTHING])]</A>"
dat += "<BR><B>Shoes:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_FEET]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_FEET])]</A>"
dat += "<BR><B>Gloves:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_GLOVES]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_GLOVES])]</A>"
dat += "<BR><B>Uniform:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_ICLOTHING]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_ICLOTHING])]</A>"
if(!primitive)
dat += "<BR><B>Belt:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_BELT]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_BELT])]</A>"
dat += "<BR><B>ID:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_ID]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_ID])]</A>"
dat += "<BR><B>Back:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_BACK]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_BACK])]</A>"
dat += "<BR>"
dat += "<BR><B>Head:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_HEAD]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_HEAD])]</A>"
dat += "<BR><B>Mask:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_MASK]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_MASK])]</A>"
dat += "<BR><B>Eyes:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_EYES]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_EYES])]</A>"
if(!primitive)
dat += "<BR><B>Ears:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_EARS]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_EARS])]</A>"
dat += "<BR>"
if(!primitive)
dat += "<BR><B>Exosuit:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_OCLOTHING]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_OCLOTHING])]</A>"
dat += "<BR><B>Shoes:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_FEET]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_FEET])]</A>"
dat += "<BR><B>Gloves:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_GLOVES]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_GLOVES])]</A>"
dat += "<BR><B>Uniform:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_ICLOTHING]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_ICLOTHING])]</A>"
if(!primitive)
dat += "<BR><B>Belt:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_BELT]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_BELT])]</A>"
dat += "<BR><B>ID:</B> <A href='?src=\ref[src];item=[SLOT_MANNEQUIN_ID]'>[makeStrippingButton(clothing[SLOT_MANNEQUIN_ID])]</A>"
dat += "<BR>"
dat += {"
<BR>
@@ -402,7 +598,19 @@
if(!(itemToCheck.clothing_flags & ONESIZEFITSALL))
if(user)
to_chat(user, "<span class='warning'>\The [src] is too large for \the [itemToCheck]</span>")
return 0
return FALSE
if (corgi)
switch(item_slot)
if(SLOT_MANNEQUIN_HEAD)
if(itemToCheck.type in valid_corgi_hats)
return TRUE
if(SLOT_MANNEQUIN_BACK)
if(itemToCheck.type in valid_corgi_backpacks)
return TRUE
if(user)
to_chat(user, "<span class='warning'>\The [itemToCheck] doesn't fit there.</span>")
return FALSE
var/inv_slot
@@ -431,11 +639,11 @@
inv_slot = SLOT_ID
if(itemToCheck.slot_flags & inv_slot)
return 1
return TRUE
if(user)
to_chat(user, "<span class='warning'>\The [itemToCheck] doesn't fit there.</span>")
return 0
return FALSE
/obj/structure/mannequin/update_icon()
..()
@@ -444,6 +652,26 @@
O.layer = FLOAT_LAYER
O.overlays.len = 0
if (hair_style)
var/datum/sprite_accessory/hair_style_icon = hair_styles_list[hair_style]
var/icon/hair_s = new/icon("icon" = 'icons/mob/hair_styles.dmi', "icon_state" = "[hair_style_icon.icon_state]_s")
if(hair_style_icon.additional_accessories)
hair_s.Blend(icon("icon" = 'icons/mob/hair_styles.dmi', "icon_state" = "[hair_style_icon.icon_state]_acc"), ICON_OVERLAY)
if (species && species.name != "Human")
hair_s.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28))
hair_s.Blend(hair_color, ICON_ADD)
O.overlays += hair_s
if (beard_style)
var/datum/sprite_accessory/beard_style_icon = facial_hair_styles_list[beard_style]
var/icon/beard_s = new/icon("icon" = 'icons/mob/hair_styles.dmi', "icon_state" = "[beard_style_icon.icon_state]_s")
if(beard_style_icon.additional_accessories)
beard_s.Blend(icon("icon" = 'icons/mob/hair_styles.dmi', "icon_state" = "[beard_style_icon.icon_state]_acc"), ICON_OVERLAY)
if (species && species.name != "Human")
beard_s.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28))
beard_s.Blend(hair_color, ICON_ADD)
O.overlays += beard_s
for(var/cloth_slot in clothing)
update_icon_slot(O,cloth_slot)
@@ -453,11 +681,17 @@
var/image/I = new()
I.appearance = O.appearance
I.plane = FLOAT_PLANE
I.pixel_x = clothing_offset_x
I.pixel_y = clothing_offset_y
if (icon != 'icons/obj/mannequin_64x64.dmi')
if (has_pedestal)
icon = 'icons/obj/mannequin.dmi'
I.pixel_x = clothing_offset_x
I.pixel_y = clothing_offset_y
else
icon = 'icons/mob/mannequin.dmi'
overlays += I
qdel(O)
/obj/structure/mannequin/proc/update_icon_slot(var/obj/abstract/Overlays/O, var/slot)
var/obj/item/clothing/clothToUpdate = clothing[slot]
if(clothToUpdate)
@@ -484,6 +718,8 @@
else
if(primitive)
I = image(slotIcon[MANNEQUIN_ICONS_PRIMITIVE], t_state)
else if (corgi)
I = image(slotIcon[MANNEQUIN_ICONS_CORGI], t_state)
else if(clothToUpdate.icon_override)
I = image(clothToUpdate.icon_override, t_state)
else
@@ -590,11 +826,13 @@
slotIcon[MANNEQUIN_ICONS_SLOT] = default_icons.head_icons
slotIcon[MANNEQUIN_ICONS_PRIMITIVE] = 'icons/mob/monkey_head.dmi'
slotIcon[MANNEQUIN_ICONS_SPECIES] = species.head_icons
slotIcon[MANNEQUIN_ICONS_CORGI] = 'icons/mob/corgi_head.dmi'
slotIcon[MANNEQUIN_DYNAMIC_LAYER] = HEAD_LAYER
if(SLOT_MANNEQUIN_BACK)
slotIcon[MANNEQUIN_ICONS_SLOT] = default_icons.back_icons
slotIcon[MANNEQUIN_ICONS_PRIMITIVE] = default_icons.back_icons
slotIcon[MANNEQUIN_ICONS_SPECIES] = species.back_icons
slotIcon[MANNEQUIN_ICONS_CORGI] = 'icons/mob/corgi_back.dmi'
slotIcon[MANNEQUIN_DYNAMIC_LAYER] = BACK_LAYER
if(SLOT_MANNEQUIN_ID)
slotIcon[MANNEQUIN_ICONS_SLOT] = default_icons.id_icons
@@ -683,6 +921,11 @@
spin()
/obj/structure/mannequin/woman
name = "human woman marble mannequin"
icon_state="mannequin_marble_human_woman"
gender = FEMALE
/obj/structure/mannequin/fat
name = "fat human marble mannequin"
icon_state="mannequin_marble_fat_human"
@@ -699,20 +942,42 @@
primitive = 1
clothing_offset_y = -5*PIXEL_MULTIPLIER
/obj/structure/mannequin/corgi
name = "corgi marble mannequin"
icon_state="mannequin_marble_corgi"
corgi = 1
/obj/structure/mannequin/wood
name = "human wooden mannequin"
name = "human man wooden mannequin"
desc = "This should look great in a visual arts workshop."
icon_state="mannequin_wooden_human"
hair_color = "#705036"
health = 30
maxHealth = 30
trueForm = /mob/living/simple_animal/hostile/mannequin/wood
autoignition_temperature = AUTOIGNITION_WOOD
fire_fuel = 2.5
/obj/structure/mannequin/wood/New(turf/loc, var/f_style, var/h_style, var/list/items_to_wear, var/list/items_to_hold, var/mob_to_capture)
..()
if (mob_to_capture)
if(iscorgi(mob_to_capture))
desc = "If it takes forever, I will wait for you..."
else
desc = "An incredibly lifelike wooden carving."
/obj/structure/mannequin/wood/breakDown()
new /obj/item/stack/sheet/wood(loc, 5)//You get half the materials used to make a block bac)
..()
/obj/structure/mannequin/wood/dissolve()
return
/obj/structure/mannequin/wood/woman
name = "human woman wooden mannequin"
icon_state="mannequin_wooden_human_woman"
gender = FEMALE
/obj/structure/mannequin/wood/fat
name = "fat human wooden mannequin"
icon_state="mannequin_wooden_fat_human"
@@ -729,6 +994,11 @@
primitive = 1
clothing_offset_y = -5*PIXEL_MULTIPLIER
/obj/structure/mannequin/wood/corgi
name = "corgi wooden mannequin"
icon_state="mannequin_wooden_corgi"
corgi = 1
/obj/structure/mannequin/animationBolt(var/mob/firer)
Awaken(firer)
@@ -738,35 +1008,60 @@
awakening = 1
for(var/obj/structure/mannequin/M in range(src,chaintrap_range))
M.Awaken()
var/obj/item/trash/mannequin/newPedestal = new pedestal(loc)
newPedestal.dir = dir
if (has_pedestal)
var/obj/item/trash/mannequin/newPedestal = new pedestal(loc)
newPedestal.dir = dir
var/mob/living/simple_animal/hostile/mannequin/livingMannequin = new trueForm(loc)
livingMannequin.name = name
livingMannequin.icon_state = icon_state
livingMannequin.health = health
livingMannequin.maxHealth = maxHealth
livingMannequin.dir = dir
livingMannequin.additional_damage = additional_damage
livingMannequin.timer = timer
if (captured)
livingMannequin.captured_mob = captured
captured.forceMove(livingMannequin)
captured = null
var/image/I = image('icons/effects/32x32.dmi',"blank")
I.overlays |= overlays
I.pixel_x = -clothing_offset_x
I.pixel_y = -clothing_offset_y
if (has_pedestal)
I.pixel_x = -clothing_offset_x
I.pixel_y = -clothing_offset_y
livingMannequin.overlays += I
for(var/slot in clothing)
if(clothing[slot])
var/obj/item/cloth = clothing[slot]
cloth.mannequin_unequip(src)
cloth.forceMove(livingMannequin)
livingMannequin.clothing += cloth
cloth.mannequin_equip(livingMannequin,slot)
livingMannequin.clothing[slot] = cloth
clothing[slot] = null
for(var/obj/item/tool in held_items)
tool.forceMove(livingMannequin)
livingMannequin.clothing += tool
held_items -= tool
if(tool.force >= livingMannequin.melee_damage_lower)
livingMannequin.melee_damage_lower = tool.force
livingMannequin.melee_damage_upper = tool.force
livingMannequin.attacktext = "swings [tool] at"
if(tool.hitsound)
livingMannequin.attack_sound = tool.hitsound
if (held_items?.len)
for(var/index = 1 to held_items.len)
var/obj/item/tool = get_held_item_by_index(index)
if (!tool)
continue
tool.mannequin_unequip(src)
tool.forceMove(livingMannequin)
tool.mannequin_equip(livingMannequin,"hands",index)
livingMannequin.held_items[index] = tool
held_items -= tool
//If we're holding a weapon stronger than our base damage, let's use it instead
if(tool.force >= livingMannequin.melee_damage_lower)
livingMannequin.melee_damage_lower = tool.force
livingMannequin.melee_damage_upper = tool.force
livingMannequin.equipped_melee_weapon = tool
if (livingMannequin.equipped_melee_weapon)
livingMannequin.attacktext = "swings \the [livingMannequin.equipped_melee_weapon] at"
visible_message("<span class='warning'>\The [src] grips \the [livingMannequin.equipped_melee_weapon].</span>")
if(livingMannequin.equipped_melee_weapon.hitsound)
livingMannequin.attack_sound = livingMannequin.equipped_melee_weapon.hitsound
if (istype(tool, /obj/item/weapon/gun))
livingMannequin.equipGun(tool)
if(firer)
livingMannequin.faction = "\ref[firer]"
qdel(src)
@@ -783,30 +1078,47 @@
icon_state = "marble"
var/time_to_sculpt = 200
var/list/available_sculptures = list(
"human" = /obj/structure/mannequin,
"human man" = /obj/structure/mannequin,
"human woman" = /obj/structure/mannequin/woman,
"fat human" = /obj/structure/mannequin/fat,
"monkey" = /obj/structure/mannequin/monkey,
"vox" = /obj/structure/mannequin/vox,
"corgi" = /obj/structure/mannequin/corgi,
)
/obj/structure/block/attackby(var/obj/item/weapon/W,var/mob/user)
if(W.is_wrench(user))
return wrenchAnchor(user, W, 5 SECONDS)
else if(istype(W, /obj/item/weapon/chisel))
var/beard_style
var/hair_style
var/chosen_gender = MALE
var/chosen_species_name = "Human"
var/chosen_sculpture = input("Choose a sculpture type.", "[name]") as null|anything in available_sculptures
if(!chosen_sculpture || !Adjacent(user))
return
if (chosen_sculpture == "human woman")
chosen_gender = FEMALE
if (chosen_sculpture == "vox")
chosen_species_name = "Vox"
if (chosen_sculpture != "monkey" && chosen_sculpture != "corgi")
var/list/species_hair = valid_sprite_accessories(hair_styles_list, null, chosen_species_name)
if(species_hair.len)
hair_style = input(user, "Select a hair style", "Scuplting Hair") as null|anything in species_hair
if (chosen_gender != FEMALE)
var/list/species_facial_hair = valid_sprite_accessories(facial_hair_styles_list, chosen_gender, chosen_species_name)
if(species_facial_hair.len)
beard_style = input(user, "Select a beard style", "Sculpting Beard") as null|anything in species_facial_hair
if(!Adjacent(user))
return
user.visible_message("[user.name] starts sculpting \the [src] with a passion!","You start sculpting \the [src] with a passion!","You hear a repeated knocking sound.")
var/turf/T=get_turf(src)
if(do_after(user, src, time_to_sculpt))
new /obj/effect/decal/cleanable/dirt(T)
var/mannequin_type = available_sculptures[chosen_sculpture]
var/obj/structure/mannequin/M = new mannequin_type(T)
var/obj/structure/mannequin/M = new mannequin_type(T,beard_style,hair_style)
M.anchored = anchored
M.add_fingerprint(user)
user.visible_message("[user.name] finishes \the [M].","You finish \the [M].")
@@ -821,10 +1133,12 @@
icon_state = "wooden"
time_to_sculpt = 100
available_sculptures = list(
"human" = /obj/structure/mannequin/wood,
"human man" = /obj/structure/mannequin/wood,
"human woman" = /obj/structure/mannequin/wood/woman,
"fat human" = /obj/structure/mannequin/wood/fat,
"monkey" = /obj/structure/mannequin/wood/monkey,
"vox" = /obj/structure/mannequin/wood/vox,
"corgi" = /obj/structure/mannequin/wood/corgi,
)
autoignition_temperature = AUTOIGNITION_WOOD
fire_fuel = 5
@@ -885,6 +1199,8 @@
qdel(src)
/obj/structure/mannequin/cyber/dissolve()
return
/obj/structure/mannequin/cyber/ex_act(severity)
switch(severity)

View File

@@ -625,13 +625,13 @@ var/list/science_goggles_wearers = list()
disable()
processing_objects.Remove(src)
/obj/item/clothing/glasses/emitter/mannequin_equip(var/obj/structure/mannequin/mannequin,var/slot,var/hand_slot)
/obj/item/clothing/glasses/emitter/mannequin_equip(var/atom/movable/mannequin,var/slot,var/hand_slot)//can be either a static structure or an hostile mob
if(slot == SLOT_MANNEQUIN_EYES)
emitter = mannequin
enable()
processing_objects.Add(src)
/obj/item/clothing/glasses/emitter/mannequin_unequip(var/obj/structure/mannequin/mannequin)
/obj/item/clothing/glasses/emitter/mannequin_unequip(var/atom/movable/mannequin)
previous_dir = null
previous_loc = null
disable()

View File

@@ -2111,3 +2111,84 @@ mob/living/carbon/human/isincrit()
/mob/living/carbon/human/make_meat(location)
var/ourMeat = new meat_type(location, src)
return ourMeat //Exists due to meat having a special New()
/mob/living/carbon/human/turn_into_mannequin(var/material = "marble")
var/list/valid_mannequin_species = list(
"Human",
"Voc",
"Manifested",
)
if (!(species.name in valid_mannequin_species))
return FALSE
var/turf/T = get_turf(src)
var/obj/structure/mannequin/new_mannequin
var/list/mannequin_clothing = list(
SLOT_MANNEQUIN_ICLOTHING,
SLOT_MANNEQUIN_FEET,
SLOT_MANNEQUIN_GLOVES,
SLOT_MANNEQUIN_EARS,
SLOT_MANNEQUIN_OCLOTHING,
SLOT_MANNEQUIN_EYES,
SLOT_MANNEQUIN_BELT,
SLOT_MANNEQUIN_MASK,
SLOT_MANNEQUIN_HEAD,
SLOT_MANNEQUIN_BACK,
SLOT_MANNEQUIN_ID,
)
mannequin_clothing[SLOT_MANNEQUIN_ICLOTHING] = w_uniform
mannequin_clothing[SLOT_MANNEQUIN_OCLOTHING] = wear_suit
mannequin_clothing[SLOT_MANNEQUIN_HEAD] = head
mannequin_clothing[SLOT_MANNEQUIN_MASK] = wear_mask
mannequin_clothing[SLOT_MANNEQUIN_BACK] = back
mannequin_clothing[SLOT_MANNEQUIN_ID] = wear_id
mannequin_clothing[SLOT_MANNEQUIN_BELT] = belt
mannequin_clothing[SLOT_MANNEQUIN_GLOVES] = gloves
mannequin_clothing[SLOT_MANNEQUIN_FEET] = shoes
mannequin_clothing[SLOT_MANNEQUIN_EARS] = ears
mannequin_clothing[SLOT_MANNEQUIN_EYES] = glasses
var/list/mannequin_held_items = list(null, null)
for (var/i = 1 to mannequin_held_items.len)
var/obj/O = held_items[i]
if (O)
drop_item(O,T,TRUE)
mannequin_held_items[i] = O
for (var/obj/O in get_all_slots())
drop_item(O,T,TRUE)
switch (species.name)
if ("Human","Manifested")
if (is_fat())
switch (material)
if ("marble")
new_mannequin = new /obj/structure/mannequin/fat(T,my_appearance.f_style,my_appearance.h_style,mannequin_clothing,mannequin_held_items,src)
if ("wood")
new_mannequin = new /obj/structure/mannequin/wood/fat(T,my_appearance.f_style,my_appearance.h_style,mannequin_clothing,mannequin_held_items,src)
else if (gender == FEMALE)
switch (material)
if ("marble")
new_mannequin = new /obj/structure/mannequin/woman(T,my_appearance.f_style,my_appearance.h_style,mannequin_clothing,mannequin_held_items,src)
if ("wood")
new_mannequin = new /obj/structure/mannequin/wood/woman(T,my_appearance.f_style,my_appearance.h_style,mannequin_clothing,mannequin_held_items,src)
else
switch (material)
if ("marble")
new_mannequin = new /obj/structure/mannequin(T,my_appearance.f_style,my_appearance.h_style,mannequin_clothing,mannequin_held_items,src)
if ("wood")
new_mannequin = new /obj/structure/mannequin/wood(T,my_appearance.f_style,my_appearance.h_style,mannequin_clothing,mannequin_held_items,src)
if ("Vox")
switch (material)
if ("marble")
new_mannequin = new /obj/structure/mannequin/vox(T,my_appearance.f_style,my_appearance.h_style,mannequin_clothing,mannequin_held_items,src)
if ("wood")
new_mannequin = new /obj/structure/mannequin/wood/vox(T,my_appearance.f_style,my_appearance.h_style,mannequin_clothing,mannequin_held_items,src)
if (new_mannequin)
return TRUE
return FALSE

View File

@@ -284,16 +284,16 @@ var/global/list/damage_icon_parts = list()
if(has_head)
//Eyes
if(!skeleton)
var/icon/eyes = new/icon('icons/mob/human_face.dmi', species.eyes)
var/icon/eyes = new/icon('icons/mob/hair_styles.dmi', species.eyes)
eyes.Blend(rgb(my_appearance.r_eyes, my_appearance.g_eyes, my_appearance.b_eyes), ICON_ADD)
stand_icon.Blend(eyes, ICON_OVERLAY)
//Mouth (lipstick!)
if(lip_style)
stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY)
stand_icon.Blend(new/icon('icons/mob/hair_styles.dmi', "lips_[lip_style]_s"), ICON_OVERLAY)
if(eye_style)
stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "eyeshadow_[eye_style]_light_s"), ICON_OVERLAY)
stand_icon.Blend(new/icon('icons/mob/hair_styles.dmi', "eyeshadow_[eye_style]_light_s"), ICON_OVERLAY)
//Underwear
@@ -330,7 +330,7 @@ var/global/list/damage_icon_parts = list()
return
//base icons
var/icon/face_standing = new /icon('icons/mob/human_face.dmi',"bald_s")
var/icon/face_standing = new /icon('icons/mob/hair_styles.dmi',"bald_s")
//to_chat(world, "Maskheadhair? [check_hidden_head_flags(MASKHEADHAIR)]")
var/hair_suffix = check_hidden_head_flags(MASKHEADHAIR) ? "s2" : "s" // s2 = cropped icon
@@ -1329,7 +1329,7 @@ var/global/list/damage_icon_parts = list()
// if (gender == FEMALE) g = "f"
//base icons
var/icon/face_lying = new /icon('icons/mob/human_face.dmi',"bald_l")
var/icon/face_lying = new /icon('icons/mob/hair_styles.dmi',"bald_l")
if(my_appearance.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[my_appearance.f_style]
@@ -1347,15 +1347,15 @@ var/global/list/damage_icon_parts = list()
//Eyes
// Note: These used to be in update_face(), and the fact they're here will make it difficult to create a disembodied head
var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l")
var/icon/eyes_l = new/icon('icons/mob/hair_styles.dmi', "eyes_l")
eyes_l.Blend(rgb(my_appearance.r_eyes, my_appearance.g_eyes, my_appearance.b_eyes), ICON_ADD)
face_lying.Blend(eyes_l, ICON_OVERLAY)
if(lip_style)
face_lying.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_l"), ICON_OVERLAY)
face_lying.Blend(new/icon('icons/mob/hair_styles.dmi', "lips_[lip_style]_l"), ICON_OVERLAY)
if(eye_style)
face_lying.Blend(new/icon('icons/mob/human_face.dmi', "eyeshadow_[eye_style]_light_l"), ICON_OVERLAY)
face_lying.Blend(new/icon('icons/mob/hair_styles.dmi', "eyeshadow_[eye_style]_light_l"), ICON_OVERLAY)
var/image/face_lying_image = new /image(icon = face_lying)
return face_lying_image

View File

@@ -566,3 +566,52 @@
/mob/living/carbon/monkey/can_be_infected()
return 1
/mob/living/carbon/monkey/turn_into_mannequin(var/material = "marble")
if (greaterform != "Human")
return FALSE
var/turf/T = get_turf(src)
var/obj/structure/mannequin/new_mannequin
var/list/mannequin_clothing = list(
SLOT_MANNEQUIN_ICLOTHING,
SLOT_MANNEQUIN_FEET,
SLOT_MANNEQUIN_GLOVES,
SLOT_MANNEQUIN_EARS,
SLOT_MANNEQUIN_OCLOTHING,
SLOT_MANNEQUIN_EYES,
SLOT_MANNEQUIN_BELT,
SLOT_MANNEQUIN_MASK,
SLOT_MANNEQUIN_HEAD,
SLOT_MANNEQUIN_BACK,
SLOT_MANNEQUIN_ID,
)
mannequin_clothing[SLOT_MANNEQUIN_ICLOTHING] = uniform
mannequin_clothing[SLOT_MANNEQUIN_HEAD] = hat
mannequin_clothing[SLOT_MANNEQUIN_EYES] = glasses
mannequin_clothing[SLOT_MANNEQUIN_MASK] = wear_mask
mannequin_clothing[SLOT_MANNEQUIN_BACK] = back
var/list/mannequin_held_items = list(null, null)
for (var/i = 1 to mannequin_held_items.len)
var/obj/O = held_items[i]
if (O)
drop_item(O,T,TRUE)
mannequin_held_items[i] = O
for (var/obj/O in get_all_slots())
drop_item(O,T,TRUE)
switch (material)
if ("marble")
new_mannequin = new /obj/structure/mannequin/monkey(T,null,null,mannequin_clothing,mannequin_held_items,src)
if ("wood")
new_mannequin = new /obj/structure/mannequin/wood/monkey(T,null,null,mannequin_clothing,mannequin_held_items,src)
if (new_mannequin)
return TRUE
return FALSE

View File

@@ -161,7 +161,7 @@
if(user.stat)
return
var/dat = "<div align='center'><b>Inventory of [name]</b></div><p>"
var/dat
if(inventory_head)
dat += "<br><b>Head:</b> [inventory_head] (<a href='?src=\ref[src];remove_inv=head'>Remove</a>)"
else
@@ -171,9 +171,14 @@
else
dat += "<br><b>Back:</b> <a href='?src=\ref[src];add_inv=back'>Nothing</a>"
user << browse(dat, text("window=mob[];size=325x500", real_name))
onclose(user, "mob[real_name]")
return
dat += {"
<BR>
<BR><A href='?src=\ref[user];mach_close=mob\ref[src]'>Close</A>
"}
var/datum/browser/popup = new(user, "corgi\ref[src]", "[src]", 340, 500)
popup.set_content(dat)
popup.open()
/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, /obj/item/weapon/newspaper))
@@ -210,19 +215,17 @@
if(usr.stat)
return
if(!Adjacent(usr) || usr.incapacitated() || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
return
//Removing from inventory
if(href_list["remove_inv"])
if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
return
var/remove_from = href_list["remove_inv"]
remove_inventory(remove_from,usr)
show_inv(usr)
//Adding things to inventory
else if(href_list["add_inv"])
if(!Adjacent(usr) || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr)))
return
var/add_to = href_list["add_inv"]
if(!usr.get_active_hand())
to_chat(usr, "<span class='warning'>You have nothing in your hand to put on its [add_to].</span>")
@@ -245,20 +248,7 @@
item_to_add.afterattack(src,usr,1)
return
//The objects that corgis can wear on their backs.
var/list/allowed_types = list(
/obj/item/clothing/suit/armor/vest,
/obj/item/clothing/suit/armor/vest/security,
/obj/item/device/radio,
/obj/item/device/radio/off,
/obj/item/clothing/suit/cardborg,
/obj/item/weapon/tank/oxygen,
/obj/item/weapon/tank/air,
/obj/item/weapon/extinguisher,
/obj/item/clothing/suit/space/rig
)
if( ! ( item_to_add.type in allowed_types ) )
if( ! ( item_to_add.type in valid_corgi_backpacks ) )
to_chat(usr, "You set [item_to_add] on [src]'s back, but \he shakes it off!")
usr.drop_item(item_to_add, get_turf(src))
@@ -281,12 +271,7 @@
else
..()
//Corgis are supposed to be simpler, so only a select few objects can actually be put
//to be compatible with them. The objects are below.
//Many hats added, Some will probably be removed, just want to see which ones are popular.
/mob/living/simple_animal/corgi/proc/place_on_head(obj/item/item_to_add)
if(istype(item_to_add,/obj/item/weapon/c4)) // last thing he ever wears, I guess
item_to_add.afterattack(src,usr,1)
return
@@ -300,201 +285,7 @@
return
var/valid = 0
//Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a hat is removed.
switch(item_to_add.type)
if( /obj/item/clothing/glasses/sunglasses, /obj/item/clothing/head/that, /obj/item/clothing/head/collectable/paper,
/obj/item/clothing/head/hardhat, /obj/item/clothing/head/collectable/hardhat,/obj/item/clothing/head/hardhat/white, /obj/item/weapon/p_folded/hat )
valid = 1
if(/obj/item/clothing/head/helmet/tactical/sec,/obj/item/clothing/head/helmet/tactical/sec/preattached)
name = "Sergeant [real_name]"
desc = "The ever-loyal, the ever-vigilant."
emote_see = list("ignores the chain of command.", "stuns you.")
emote_hear = list("stops you right there, criminal scum!")
valid = 1
if(/obj/item/clothing/head/helmet/tactical/swat)
name = "Lieutenant [real_name]"
desc = "When the going gets ruff..."
emote_hear = list("goes dark.", "waits for his retirement tomorrow.")
valid = 1
if(/obj/item/clothing/head/chefhat, /obj/item/clothing/head/collectable/chef)
name = "Sous chef [real_name]"
desc = "Your food will be taste-tested. All of it."
emote_see = list("looks for the lamb sauce.", "eats the food.")
emote_hear = list("complains that the meal is fucking raw!")
valid = 1
if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain, /obj/item/clothing/head/cap)
name = "Captain [real_name]"
desc = "Probably better than the last captain."
emote_see = list("secures the spare.", "hides the nuke disk.", "abuses his authority.")
emote_hear = list("assures the crew he is NOT a comdom.")
valid = 1
if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/kitty/collectable)
name = "Runtime"
desc = "It's a cute little kitty-cat! Well, he's definitely cute!"
emote_see = list("coughs up a furball.", "stretches.")
emote_hear = list("purrs.")
speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS!", "MEEEEEEW!")
valid = 1
if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears)
name = "Hoppy"
desc = "This is Hoppy. It's a corgi-er, bunny rabbit?"
emote_see = list("twitches its nose.", "hops around a bit.", "eats a doggy carrot.", "jumps in place.")
valid = 1
if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret)
name = "Yann"
desc = "Mon dieu! C'est un chien!"
speak = list("le woof!", "le bark!", "JAPPE!!")
emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of him.")
valid = 1
if(/obj/item/clothing/head/det_hat)
name = "Detective [real_name]"
desc = "[name] sees through your lies..."
emote_see = list("investigates the area.", "sniffs around for clues.", "searches for scooby snacks.")
valid = 1
if(/obj/item/clothing/head/nursehat)
name = "Nurse [real_name]"
desc = "[name] needs 100cc of beef jerky... STAT!"
emote_see = list("checks the crew monitoring console.", "stares, unblinking.", "tries to inject you with medicine... But fails!")
emote_hear = list("asks you to max the suit sensors.")
valid = 1
if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate, /obj/item/clothing/head/hgpiratecap)
name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]"
desc = "Yaarghh! Thar' be a scurvy dog!"
emote_see = list("hunts for treasure.","stares coldly...","gnashes his tiny corgi teeth.")
emote_hear = list("growls ferociously.", "snarls.")
speak = list("Arrrrgh!","Grrrrrr!")
valid = 1
if(/obj/item/clothing/head/ushanka)
name = "[pick("Tzar","Vladimir","Chairman")] [real_name]"
desc = "A follower of Karl Barx."
emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vangaurdism.", "plans out methods to equally redistribute capital.", "articulates an argument for the primacy of the bourgeoisie.", "develops an economic plan to industrialize the vast rural landscape.")
valid = 1
if(/obj/item/clothing/head/collectable/police)
name = "Officer [real_name]"
emote_see = list("drools.", "looks for donuts.", "ignores Space Law.")
desc = "Stop right there, criminal scum!"
valid = 1
if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard)
name = "Grandwizard [real_name]"
speak = list("Woof!", "Bark!", "EI NATH!", "FORTI GY AMA!")
emote_see = list("casts a dastardly spell!", "curses you with a bark!", "summons a steak into his stomach.")
valid = 1
if(/obj/item/clothing/head/cardborg)
name = "Borgi"
speak = list("Ping!","Beep!","Woof!")
emote_see = list("goes rogue.", "sniffs out non-humans.", "waits for a malfunction.", "ignores law 2.", "gets EMP'd.", "doorcrushes you.")
desc = "Result of robotics budget cuts."
valid = 1
if(/obj/item/weapon/bedsheet)
name = "\improper Ghost"
speak = list("WoooOOOooo~","AuuuuuUuUuUuUuUuUuu~")
emote_see = list("stumbles around.", "shivers.")
emote_hear = list("howls.","groans.")
desc = "Spooky!"
valid = 1
if(/obj/item/clothing/head/helmet/space/santahat, /obj/item/clothing/head/christmas/santahat/red)
name = "Santa's Corgi Helper"
emote_hear = list("barks christmas songs.", "yaps merrily.")
emote_see = list("looks for presents.", "checks his list.")
desc = "He's very fond of milk and cookies."
valid = 1
if(/obj/item/clothing/head/soft)
name = "Corgi Tech [real_name]"
desc = "The reason your yellow gloves have chew-marks."
emote_see = list("orders emitter crates.", "declares independence from Nanotrasen.", "acquires insulated gloves.")
valid = 1
if(/obj/item/clothing/head/fedora)
name = "Autistic [real_name]"
desc = "His paws seem to be covered in what looks like Cheezy Honker dust."
emote_hear = list("barks ironically.", "makes you cringe.")
emote_see = list("unsheathes katana.", "tips fedora.", "posts on Mongolian basket-weaving forums.", "theorycrafts about nothing.")
valid = 1
if(/obj/item/clothing/head/fez)
name = "Doctor Whom"
desc = "A time-dog from the planet barkifray."
emote_hear = list("barks cleverly.")
emote_see = list("fiddles around with a sonic-bone.", "evolves into a hotter version of himself! Er, nevermind.")
valid = 1
if(/obj/item/clothing/head/helmet/space/rig)
name = "Station Engineer [real_name]"
desc = "Ian wanna cracker!"
emote_see = list("scrungulooses.", "activates the SMES units.", "ignores engine safety.", "accidentally plasmafloods.", "delaminates the Supermatter.")
valid = 1
min_oxy = 0
minbodytemp = 0
maxbodytemp = 999
/*
if(/obj/item/clothing/head/hardhat/reindeer)
name = "[real_name] the red-nosed Corgi"
emote_see = list("lights the way.", "illuminates the night sky.", "is bullied by the other reindogs. Poor Ian.")
desc = "He has a very shiny nose."
SetLuminosity(1)
valid = 1
*/
if(/obj/item/clothing/head/alien_antenna)
name = "Al-Ian"
desc = "Take us to your dog biscuits!"
emote_see = list("drinks sulphuric acid.", "reads your mind.", "kidnaps your cattle.")
valid = 1
if(/obj/item/clothing/head/franken_bolt)
name = "Corgenstein's monster"
desc = "If I cannot inspire love, I will cause fear! Now fetch me them doggy biscuits."
valid = 1
if(/obj/item/clothing/mask/vamp_fangs)
var/obj/item/clothing/mask/vamp_fangs/V = item_to_add
if(!V.glowy_fangs)
name = "Vlad the Ianpaler"
desc = "Listen to them, the children of the night. What music they make!"
emote_hear = list("bares his fangs.", "screeches.", "tries to suck some blood.")
valid = 1
else
to_chat(usr, "<span class = 'notice'>The glow of /the [V] startles [real_name]!</span>")
if(/obj/item/clothing/head/cowboy)
name = "Yeehaw Ian"
desc = "Are you really just gonna stroll past without saying howdy?"
emote_see = list("bullwhips you.", "spins his revolver.")
emote_hear = list("complains about city folk.")
valid = 1
if(valid)
if(usr)
usr.visible_message("[usr] puts [item_to_add] on [real_name]'s head. [src] looks at [usr] and barks once.",
"You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags \his tail once and barks.",
"You hear a friendly-sounding bark.")
usr.drop_item(item_to_add, src, force_drop = 1)
else
item_to_add.forceMove(src)
src.inventory_head = item_to_add
regenerate_icons()
else
if(!(item_to_add.type in valid_corgi_hats))
to_chat(usr, "You set [item_to_add] on [src]'s head, but \he shakes it off!")
usr.drop_item(item_to_add, src.loc)
@@ -504,8 +295,20 @@
for(var/i in list(1,2,4,8,4,8,4,dir))
dir = i
sleep(1)
return
on_new_hat(item_to_add)//changes the corgi's name, description and behaviour to match their new hat
if(usr)
usr.visible_message("[usr] puts [item_to_add] on [real_name]'s head. [src] looks at [usr] and barks once.",
"You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags \his tail once and barks.",
"You hear a friendly-sounding bark.")
usr.drop_item(item_to_add, src, force_drop = 1)
else
item_to_add.forceMove(src)
src.inventory_head = item_to_add
regenerate_icons()
return valid
/mob/living/simple_animal/corgi/proc/spinaroo(var/list/emotes)
if(!stat && !resting && !locked_to)
@@ -825,6 +628,41 @@
if(Adjacent(victim) && IsVictim(victim)) //Seriously don't try to rescue the dead.
rescue(victim)
/mob/living/simple_animal/corgi/turn_into_mannequin(var/material = "marble")
var/turf/T = get_turf(src)
var/obj/structure/mannequin/new_mannequin
var/list/mannequin_clothing = list(
SLOT_MANNEQUIN_ICLOTHING,
SLOT_MANNEQUIN_FEET,
SLOT_MANNEQUIN_GLOVES,
SLOT_MANNEQUIN_EARS,
SLOT_MANNEQUIN_OCLOTHING,
SLOT_MANNEQUIN_EYES,
SLOT_MANNEQUIN_BELT,
SLOT_MANNEQUIN_MASK,
SLOT_MANNEQUIN_HEAD,
SLOT_MANNEQUIN_BACK,
SLOT_MANNEQUIN_ID,
)
mannequin_clothing[SLOT_MANNEQUIN_HEAD] = inventory_head
mannequin_clothing[SLOT_MANNEQUIN_BACK] = inventory_back
remove_inventory("head")
remove_inventory("back")
switch (material)
if ("marble")
new_mannequin = new /obj/structure/mannequin/corgi(T,null,null,mannequin_clothing,list(null, null),src)
if ("wood")
new_mannequin = new /obj/structure/mannequin/wood/corgi(T,null,null,mannequin_clothing,list(null, null),src)
if (new_mannequin)
return TRUE
return FALSE
#undef IDLE
#undef BEGIN_FOOD_HUNTING
#undef FOOD_HUNTING

View File

@@ -0,0 +1,216 @@
//lists used by both corgis and mannequins
var/list/valid_corgi_hats = list(
/obj/item/clothing/head/collectable/tophat,
/obj/item/clothing/head/that,
/obj/item/clothing/head/collectable/paper,
/obj/item/clothing/head/hardhat,
/obj/item/clothing/head/collectable/hardhat,
/obj/item/clothing/head/hardhat/white,
/obj/item/clothing/head/helmet/tactical/sec,
/obj/item/clothing/head/helmet/tactical/sec/preattached,
/obj/item/clothing/head/helmet/tactical/swat,
/obj/item/clothing/head/chefhat,
/obj/item/clothing/head/collectable/chef,
/obj/item/clothing/head/caphat,
/obj/item/clothing/head/collectable/captain,
/obj/item/clothing/head/cap,
/obj/item/clothing/head/kitty,
/obj/item/clothing/head/kitty/collectable,
/obj/item/clothing/head/rabbitears,
/obj/item/clothing/head/collectable/rabbitears,
/obj/item/clothing/head/beret,
/obj/item/clothing/head/collectable/beret,
/obj/item/clothing/head/det_hat,
/obj/item/clothing/head/nursehat,
/obj/item/clothing/head/pirate,
/obj/item/clothing/head/collectable/pirate,
/obj/item/clothing/head/hgpiratecap,
/obj/item/clothing/head/ushanka,
/obj/item/clothing/head/collectable/police,
/obj/item/clothing/head/wizard/fake,
/obj/item/clothing/head/wizard,
/obj/item/clothing/head/collectable/wizard,
/obj/item/clothing/head/cardborg,
/obj/item/clothing/head/helmet/space/santahat,
/obj/item/clothing/head/christmas/santahat/red,
/obj/item/clothing/head/soft,
/obj/item/clothing/head/fedora,
/obj/item/clothing/head/fez,
/obj/item/clothing/head/helmet/space/rig,
/obj/item/clothing/head/alien_antenna,
/obj/item/clothing/head/franken_bolt,
/obj/item/clothing/mask/vamp_fangs,
/obj/item/clothing/head/cowboy,
/obj/item/clothing/glasses/sunglasses,
/obj/item/weapon/p_folded/hat,
/obj/item/weapon/bedsheet,
)
var/list/valid_corgi_backpacks = list(
/obj/item/clothing/suit/armor/vest,
/obj/item/clothing/suit/armor/vest/security,
/obj/item/device/radio,
/obj/item/device/radio/off,
/obj/item/clothing/suit/cardborg,
/obj/item/weapon/tank/oxygen,
/obj/item/weapon/tank/air,
/obj/item/weapon/extinguisher,
/obj/item/clothing/suit/space/rig,
)
/mob/living/simple_animal/corgi/proc/on_new_hat(obj/item/item_to_add)
if (!item_to_add)
return
switch(item_to_add.type)
if(/obj/item/clothing/head/helmet/tactical/sec,/obj/item/clothing/head/helmet/tactical/sec/preattached)
name = "Sergeant [real_name]"
desc = "The ever-loyal, the ever-vigilant."
emote_see = list("ignores the chain of command.", "stuns you.")
emote_hear = list("stops you right there, criminal scum!")
if(/obj/item/clothing/head/helmet/tactical/swat)
name = "Lieutenant [real_name]"
desc = "When the going gets ruff..."
emote_hear = list("goes dark.", "waits for his retirement tomorrow.")
if(/obj/item/clothing/head/chefhat, /obj/item/clothing/head/collectable/chef)
name = "Sous chef [real_name]"
desc = "Your food will be taste-tested. All of it."
emote_see = list("looks for the lamb sauce.", "eats the food.")
emote_hear = list("complains that the meal is fucking raw!")
if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain, /obj/item/clothing/head/cap)
name = "Captain [real_name]"
desc = "Probably better than the last captain."
emote_see = list("secures the spare.", "hides the nuke disk.", "abuses his authority.")
emote_hear = list("assures the crew he is NOT a comdom.")
if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/kitty/collectable)
name = "Runtime"
desc = "It's a cute little kitty-cat! Well, he's definitely cute!"
emote_see = list("coughs up a furball.", "stretches.")
emote_hear = list("purrs.")
speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS!", "MEEEEEEW!")
if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears)
name = "Hoppy"
desc = "This is Hoppy. It's a corgi-er, bunny rabbit?"
emote_see = list("twitches its nose.", "hops around a bit.", "eats a doggy carrot.", "jumps in place.")
if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret)
name = "Yann"
desc = "Mon dieu! C'est un chien!"
speak = list("le woof!", "le bark!", "JAPPE!!")
emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of him.")
if(/obj/item/clothing/head/det_hat)
name = "Detective [real_name]"
desc = "[name] sees through your lies..."
emote_see = list("investigates the area.", "sniffs around for clues.", "searches for scooby snacks.")
if(/obj/item/clothing/head/nursehat)
name = "Nurse [real_name]"
desc = "[name] needs 100cc of beef jerky... STAT!"
emote_see = list("checks the crew monitoring console.", "stares, unblinking.", "tries to inject you with medicine... But fails!")
emote_hear = list("asks you to max the suit sensors.")
if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate, /obj/item/clothing/head/hgpiratecap)
name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]"
desc = "Yaarghh! Thar' be a scurvy dog!"
emote_see = list("hunts for treasure.","stares coldly...","gnashes his tiny corgi teeth.")
emote_hear = list("growls ferociously.", "snarls.")
speak = list("Arrrrgh!","Grrrrrr!")
if(/obj/item/clothing/head/ushanka)
name = "[pick("Tzar","Vladimir","Chairman")] [real_name]"
desc = "A follower of Karl Barx."
emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vangaurdism.", "plans out methods to equally redistribute capital.", "articulates an argument for the primacy of the bourgeoisie.", "develops an economic plan to industrialize the vast rural landscape.")
if(/obj/item/clothing/head/collectable/police)
name = "Officer [real_name]"
emote_see = list("drools.", "looks for donuts.", "ignores Space Law.")
desc = "Stop right there, criminal scum!"
if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard)
name = "Grandwizard [real_name]"
speak = list("Woof!", "Bark!", "EI NATH!", "FORTI GY AMA!")
emote_see = list("casts a dastardly spell!", "curses you with a bark!", "summons a steak into his stomach.")
if(/obj/item/clothing/head/cardborg)
name = "Borgi"
speak = list("Ping!","Beep!","Woof!")
emote_see = list("goes rogue.", "sniffs out non-humans.", "waits for a malfunction.", "ignores law 2.", "gets EMP'd.", "doorcrushes you.")
desc = "Result of robotics budget cuts."
if(/obj/item/weapon/bedsheet)
name = "\improper Ghost"
speak = list("WoooOOOooo~","AuuuuuUuUuUuUuUuUuu~")
emote_see = list("stumbles around.", "shivers.")
emote_hear = list("howls.","groans.")
desc = "Spooky!"
if(/obj/item/clothing/head/helmet/space/santahat, /obj/item/clothing/head/christmas/santahat/red)
name = "Santa's Corgi Helper"
emote_hear = list("barks christmas songs.", "yaps merrily.")
emote_see = list("looks for presents.", "checks his list.")
desc = "He's very fond of milk and cookies."
if(/obj/item/clothing/head/soft)
name = "Corgi Tech [real_name]"
desc = "The reason your yellow gloves have chew-marks."
emote_see = list("orders emitter crates.", "declares independence from Nanotrasen.", "acquires insulated gloves.")
if(/obj/item/clothing/head/fedora)
name = "Autistic [real_name]"
desc = "His paws seem to be covered in what looks like Cheezy Honker dust."
emote_hear = list("barks ironically.", "makes you cringe.")
emote_see = list("unsheathes katana.", "tips fedora.", "posts on Mongolian basket-weaving forums.", "theorycrafts about nothing.")
if(/obj/item/clothing/head/fez)
name = "Doctor Whom"
desc = "A time-dog from the planet barkifray."
emote_hear = list("barks cleverly.")
emote_see = list("fiddles around with a sonic-bone.", "evolves into a hotter version of himself! Er, nevermind.")
if(/obj/item/clothing/head/helmet/space/rig)
name = "Station Engineer [real_name]"
desc = "Ian wanna cracker!"
emote_see = list("scrungulooses.", "activates the SMES units.", "ignores engine safety.", "accidentally plasmafloods.", "delaminates the Supermatter.")
min_oxy = 0
minbodytemp = 0
maxbodytemp = 999
/*
if(/obj/item/clothing/head/hardhat/reindeer)
name = "[real_name] the red-nosed Corgi"
emote_see = list("lights the way.", "illuminates the night sky.", "is bullied by the other reindogs. Poor Ian.")
desc = "He has a very shiny nose."
SetLuminosity(1)
*/
if(/obj/item/clothing/head/alien_antenna)
name = "Al-Ian"
desc = "Take us to your dog biscuits!"
emote_see = list("drinks sulphuric acid.", "reads your mind.", "kidnaps your cattle.")
if(/obj/item/clothing/head/franken_bolt)
name = "Corgenstein's monster"
desc = "If I cannot inspire love, I will cause fear! Now fetch me them doggy biscuits."
if(/obj/item/clothing/mask/vamp_fangs)
var/obj/item/clothing/mask/vamp_fangs/V = item_to_add
if(!V.glowy_fangs)
name = "Vlad the Ianpaler"
desc = "Listen to them, the children of the night. What music they make!"
emote_hear = list("bares his fangs.", "screeches.", "tries to suck some blood.")
else
to_chat(usr, "<span class = 'notice'>The glow of /the [V] startles [real_name]!</span>")
if(/obj/item/clothing/head/cowboy)
name = "Yeehaw Ian"
desc = "Are you really just gonna stroll past without saying howdy?"
emote_see = list("bullwhips you.", "spins his revolver.")
emote_hear = list("complains about city folk.")

View File

@@ -353,12 +353,12 @@
var/target_turf = get_turf(ttarget)
if(rapid)
sleep(1)
TryToShoot(target_turf, ttarget)
sleep(3)
TryToShoot(target_turf, ttarget)
sleep(3)
TryToShoot(target_turf, ttarget)
spawn()
TryToShoot(target_turf, ttarget)
sleep(1)
TryToShoot(target_turf, ttarget)
sleep(1)
TryToShoot(target_turf, ttarget)
else
TryToShoot(target_turf, ttarget)
@@ -375,24 +375,28 @@
if(casingtype)
new casingtype(get_turf(src),1)// empty casing
/mob/living/simple_animal/hostile/proc/Shoot(var/atom/target, var/atom/start, var/mob/user, var/bullet = 0)
if(target == start)
/mob/living/simple_animal/hostile/proc/Shoot(var/atom/target_turf, var/atom/start, var/mob/user, var/bullet = 0)
if(target_turf == start)
return 0
if(!istype(target, /turf))
if(!istype(target_turf, /turf))
return 0
var/atom/original_atom
if (!target)
original_atom = target_turf
else
original_atom = target
//Friendly Fire check (don't bother if the mob is controlled by a player)
if(!friendly_fire && !ckey)
var/obj/item/projectile/friendlyCheck/fC = new /obj/item/projectile/friendlyCheck(user.loc)
fC.current = target
var/turf/T = get_turf(user)
var/turf/U = get_turf(target)
fC.original = target
fC.target = U
fC.original = original_atom
fC.target = target_turf
fC.current = T
fC.starting = T
fC.yo = target.y - start.y
fC.xo = target.x - start.x
fC.yo = target_turf.y - start.y
fC.xo = target_turf.x - start.x
var/atom/potentialImpact = fC.process()
if(potentialImpact && !CanAttack(potentialImpact))
@@ -409,16 +413,15 @@
if(projectilesound)
playsound(user, projectilesound, 100, 1)
A.current = target
A.current = target_turf
var/turf/T = get_turf(src)
var/turf/U = get_turf(target)
A.original = target
A.target = U
A.original = original_atom
A.target = target_turf
A.current = T
A.starting = T
A.yo = target.y - start.y
A.xo = target.x - start.x
A.yo = target_turf.y - start.y
A.xo = target_turf.x - start.x
spawn()
A.OnFired()
A.process()

View File

@@ -366,9 +366,9 @@
/mob/living/simple_animal/hostile/mechahitler/death(var/gibbed = FALSE)
set waitfor = 0
say("Eva, auf wiedersehen!")
..(TRUE)
dir = 2
say("Eva, auf wiedersehen!")
ranged = 0
sleep(10)
var/turf/eloc = get_turf(loc)

View File

@@ -35,20 +35,291 @@
mob_property_flags = MOB_CONSTRUCT
faction = "mannequin"
var/obj/item/equipped_melee_weapon = null
var/obj/item/equipped_ranged_weapon = null
var/list/clothing = list()
var/timer = 80 //in seconds
var/mob/living/captured_mob
var/intialTox = 0
var/intialFire = 0
var/intialBrute = 0
var/intialOxy = 0
var/dissolving = FALSE
var/additional_damage = 0//tracking how much damage we took
/mob/living/simple_animal/hostile/mannequin/New()
..()
clothing = list(
SLOT_MANNEQUIN_ICLOTHING,
SLOT_MANNEQUIN_FEET,
SLOT_MANNEQUIN_GLOVES,
SLOT_MANNEQUIN_EARS,
SLOT_MANNEQUIN_OCLOTHING,
SLOT_MANNEQUIN_EYES,
SLOT_MANNEQUIN_BELT,
SLOT_MANNEQUIN_MASK,
SLOT_MANNEQUIN_HEAD,
SLOT_MANNEQUIN_BACK,
SLOT_MANNEQUIN_ID,
)
/mob/living/simple_animal/hostile/mannequin/Destroy()
equipped_melee_weapon = null
equipped_ranged_weapon = null
held_items.len = 0
clothing.len = 0
..()
/mob/living/simple_animal/hostile/mannequin/Life()
. = ..()
if (.)
if (dissolving)
return
timer--
if (captured_mob)
captured_mob.setToxLoss(intialTox)
captured_mob.adjustFireLoss(intialFire - captured_mob.getFireLoss())
captured_mob.adjustBruteLoss(intialBrute - captured_mob.getBruteLoss())
captured_mob.setOxyLoss(intialOxy)
if (timer >= 5)
captured_mob.Paralyse(2)
if (timer <= 0)
freeCaptive()
qdel(src)
/mob/living/simple_animal/hostile/mannequin/proc/dissolve()
if(dissolving)
return
visible_message("<span class='notice'>The statue's surface begins cracking and dissolving!</span>")
dissolving = TRUE
spawn(10)
for(var/i=1 to 5)
for(var/mob/living/L in contents)
L.adjustBruteLoss(10)
if (L.health <= 0)
L.mutations |= M_NOCLONE
if(ishuman(L) && !(M_HUSK in L.mutations))
var/mob/living/carbon/human/H = L
H.ChangeToHusk()
sleep(10)
breakDown()
qdel(src)
/mob/living/simple_animal/hostile/mannequin/death(var/gibbed = FALSE)
..(TRUE)
breakDown()
qdel(src)
////////////////////////////////////////////////////START - MANNEQUIN DEFENSE////////////////////////////////////////////
/mob/living/simple_animal/hostile/mannequin/bullet_act(var/obj/item/projectile/P, var/def_zone)
//ablative armor
for (var/obj/item/clothing/suit/armor/laserproof/ablative in clothing)
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam) || istype(P, /obj/item/projectile/forcebolt) || istype(P, /obj/item/projectile/change))
var/reflectchance = ablative.basereflectchance - round(P.damage/3)
if(!(def_zone in list(LIMB_CHEST, LIMB_GROIN)))
reflectchance /= 2
if(prob(reflectchance))
visible_message("<span class='danger'>The [P.name] gets reflected by [src]'s [ablative.name]!</span>")
if(!istype(P, /obj/item/projectile/beam)) //beam has its own rebound-call-logic
P.reflected = 1
P.rebound(src)
return PROJECTILE_COLLISION_REBOUND // complete projectile permutation
//shield
for(var/obj/item/I in clothing)
if(I.IsShield() && I.on_block(P.damage, P))
P.on_hit(src, 100)
return PROJECTILE_COLLISION_BLOCKED
var/absorb = run_armor_check(def_zone, P.flag, armor_penetration = P.armor_penetration)
if(absorb >= 100)
P.on_hit(src,2)
return PROJECTILE_COLLISION_BLOCKED
if(!P.nodamage)
var/damage = run_armor_absorb(def_zone, P.flag, P.damage)
apply_damage(damage, P.damage_type, def_zone, absorb, P.is_sharp(), used_weapon = P)
P.on_hit(src, absorb)
return PROJECTILE_COLLISION_DEFAULT
/mob/living/simple_animal/hostile/mannequin/proc/checkarmor(var/def_zone, var/type)
if(!type)
return 0
var/protection = 0
var/list/body_parts = list(
clothing[SLOT_MANNEQUIN_HEAD],
clothing[SLOT_MANNEQUIN_MASK],
clothing[SLOT_MANNEQUIN_OCLOTHING],
clothing[SLOT_MANNEQUIN_ICLOTHING],
clothing[SLOT_MANNEQUIN_GLOVES],
clothing[SLOT_MANNEQUIN_FEET]
)
for(var/bp in body_parts)
if(!bp)
continue
if(bp && istype(bp ,/obj/item/clothing))
var/obj/item/clothing/C = bp
if(C.body_parts_covered & limb_define_to_part_define(def_zone))
protection += C.get_armor(type)
for(var/obj/item/clothing/accessory/A in C.accessories)
if(A.body_parts_covered & limb_define_to_part_define(def_zone))
protection += A.get_armor(type)
if(istype(loc, /obj/mecha))
var/obj/mecha/M = loc
protection += M.rad_protection
return protection
/mob/living/simple_animal/hostile/mannequin/getarmor(var/def_zone, var/type)
if(def_zone)
return checkarmor(ran_zone(def_zone), type)
var/armorval = 0
var/limbnum = 0
for(var/slot in clothing)
armorval += checkarmor(slot, type)
limbnum++
return (armorval/max(limbnum, 1))
/mob/living/simple_animal/hostile/mannequin/getarmorabsorb(var/def_zone, var/type)
if(def_zone)
return checkarmorabsorb(ran_zone(def_zone), type)
var/armorval = 0
var/limbnum = 0
for(var/slot in clothing)
armorval += checkarmorabsorb(slot, type)
limbnum++
return (armorval/max(limbnum, 1))
/mob/living/simple_animal/hostile/mannequin/proc/checkarmorabsorb(var/def_zone, var/type)
if(!type)
return 0
var/protection = 0
var/list/body_parts = list(
clothing[SLOT_MANNEQUIN_HEAD],
clothing[SLOT_MANNEQUIN_MASK],
clothing[SLOT_MANNEQUIN_OCLOTHING],
clothing[SLOT_MANNEQUIN_ICLOTHING],
clothing[SLOT_MANNEQUIN_GLOVES],
clothing[SLOT_MANNEQUIN_FEET]
)
for(var/bp in body_parts)
if(istype(bp, /obj/item/clothing))
var/obj/item/clothing/C = bp
if(C.body_parts_covered & limb_define_to_part_define(def_zone))
protection += C.get_armor_absorb(type)
for(var/obj/item/clothing/accessory/A in C.accessories)
if(A.body_parts_covered & limb_define_to_part_define(def_zone))
protection += A.get_armor_absorb(type)
return protection
////////////////////////////////////////////////////END - MANNEQUIN DEFENSE////////////////////////////////////////////
/mob/living/simple_animal/hostile/mannequin/proc/freeCaptive()
if (!captured_mob)
return
captured_mob.forceMove(loc)
for(var/cloth in clothing)
var/obj/O = clothing[cloth]
if (O)
switch(cloth)
if(SLOT_MANNEQUIN_ICLOTHING)
captured_mob.equip_to_slot_or_drop(O, slot_w_uniform)
if(SLOT_MANNEQUIN_FEET)
captured_mob.equip_to_slot_or_drop(O, slot_shoes)
if(SLOT_MANNEQUIN_GLOVES)
captured_mob.equip_to_slot_or_drop(O, slot_gloves)
if(SLOT_MANNEQUIN_EARS)
captured_mob.equip_to_slot_or_drop(O, slot_ears)
if(SLOT_MANNEQUIN_OCLOTHING)
captured_mob.equip_to_slot_or_drop(O, slot_wear_suit)
if(SLOT_MANNEQUIN_EYES)
captured_mob.equip_to_slot_or_drop(O, slot_glasses)
if(SLOT_MANNEQUIN_BELT)
captured_mob.equip_to_slot_or_drop(O, slot_belt)
if(SLOT_MANNEQUIN_MASK)
captured_mob.equip_to_slot_or_drop(O, slot_wear_mask)
if(SLOT_MANNEQUIN_HEAD)
if (iscorgi(captured_mob))
var/mob/living/simple_animal/corgi/corgi = captured_mob
O.forceMove(captured_mob)
corgi.inventory_back = O
corgi.regenerate_icons()
else
captured_mob.equip_to_slot_or_drop(O, slot_head)
if(SLOT_MANNEQUIN_BACK)
if (iscorgi(captured_mob))
var/mob/living/simple_animal/corgi/corgi = captured_mob
corgi.place_on_head(O)
else
captured_mob.equip_to_slot_or_drop(O, slot_back)
if(SLOT_MANNEQUIN_ID)
captured_mob.equip_to_slot_or_drop(O, slot_wear_id)
clothing.len = 0
for(var/index = 1 to held_items.len)
var/obj/item/tool = held_items[index]
if (!tool)
continue
captured_mob.put_in_hands(tool)
held_items.len = 0
captured_mob.dir = dir
captured_mob.apply_damage(additional_damage)
/mob/living/simple_animal/hostile/mannequin/proc/breakDown()
visible_message("<span class='warning'><b>[src]</b> collapses!</span>")
playsound(loc, 'sound/items/egg_squash.ogg', 100, 1)
for(var/obj/cloth in clothing)
cloth.forceMove(loc)
clothing -= cloth
new /obj/effect/decal/cleanable/dirt(loc)
playsound(loc, 'sound/effects/stone_crumble.ogg', 100, 1)
if (captured_mob)
if (dissolving)
freeCaptive()
return
else
captured_mob.gib()
for(var/cloth in clothing)
if(clothing[cloth])
var/obj/item/cloth_to_drop = clothing[cloth]
cloth_to_drop.mannequin_unequip(src)
cloth_to_drop.forceMove(loc)
clothing[cloth] = null
for(var/obj/item/item_to_drop in held_items)
item_to_drop.mannequin_unequip(src)
item_to_drop.forceMove(loc)
held_items -= item_to_drop
//If we're holding a gun, we can shoot it forever. Screw coding actual ammo management here, this is already complex enough.
/mob/living/simple_animal/hostile/mannequin/proc/equipGun(var/obj/item/weapon/gun/gun)
if (istype(gun, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/energy_gun = gun
projectiletype = energy_gun.projectile_type
else if (istype(gun, /obj/item/weapon/gun/projectile))
var/obj/item/weapon/gun/projectile/projectile_gun = gun
if (projectile_gun.ammo_type)
var/obj/item/ammo_casing/ac = new projectile_gun.ammo_type()
projectiletype = ac.projectile_type
casingtype = projectile_gun.ammo_type
qdel(ac)
if (projectiletype)
ranged = 1
ranged_cooldown_cap = 2
retreat_distance = 3
minimum_distance = 3
projectilesound = gun.fire_sound
equipped_ranged_weapon = gun
/mob/living/simple_animal/hostile/mannequin/proc/ChangeOwner(var/mob/owner)
LoseTarget()

View File

@@ -2193,6 +2193,9 @@ mob/proc/on_foot()
/mob/proc/canMouseDrag()//used mostly to check if the mob can drag'and'drop stuff in/out of various other stuff, such as disposals, cryo tubes, etc.
return TRUE
/mob/proc/turn_into_mannequin(var/material = "marble")
return FALSE
/mob/proc/get_personal_ambience()
return list()

View File

@@ -238,7 +238,7 @@
if(current_species && (current_species.anatomy_flags & RGBSKINTONE))
preview_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s")
var/icon/eyes_s = new/icon("icon" = 'icons/mob/hair_styles.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s")
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]

View File

@@ -56,7 +56,7 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
icon = 'icons/mob/hair_styles.dmi' // default icon for all hairs
/datum/sprite_accessory/hair/bald
name = "Bald"
@@ -578,7 +578,7 @@
/datum/sprite_accessory/facial_hair
icon = 'icons/mob/human_face.dmi'
icon = 'icons/mob/hair_styles.dmi'
gender = MALE // barf (unless you're a dorf, dorfs dig chix /w beards :P)
/datum/sprite_accessory/facial_hair/shaved

View File

@@ -8713,7 +8713,18 @@ var/global/list/tonio_doesnt_remove=list("tonio", "blood")
if(istype(O, /obj/structure/closet/statue))
var/obj/structure/closet/statue/statue = O
statue.dissolve()
if(istype(O, /obj/structure/mannequin))
var/obj/structure/mannequin/statue = O
statue.dissolve()
/datum/reagent/apetrine/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume)
if(..())
return 1
if(istype(M, /mob/living/simple_animal/hostile/mannequin))
var/mob/living/simple_animal/hostile/mannequin/statue = M
statue.dissolve()
/datum/reagent/hemoscyanine

View File

@@ -20,5 +20,5 @@
/spell/targeted/flesh_to_stone/cast(var/list/targets, mob/user)
..()
for(var/mob/living/target in targets)
new /obj/structure/closet/statue(target.loc, target) //makes the statue
return
if (!target.turn_into_mannequin())//we try to turn them into marble mannequins, but if they're not compatible we'll use the old statue type
new /obj/structure/closet/statue(target.loc, target)

View File

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -1974,6 +1974,7 @@
#include "code\modules\mob\living\simple_animal\friendly\arcane_golem.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\corgi.dm"
#include "code\modules\mob\living\simple_animal\friendly\corgi_clothing.dm"
#include "code\modules\mob\living\simple_animal\friendly\corgi_powers.dm"
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm"