mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-29 15:06:39 +01:00
Merge branch 'master' into smvf
This commit is contained in:
@@ -201,13 +201,13 @@
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/ears/otie
|
||||
name = "otie, colorable"
|
||||
/datum/sprite_accessory/ears/antlers_e
|
||||
name = "antlers with ears"
|
||||
desc = ""
|
||||
icon_state = "otie"
|
||||
icon_state = "cow-nohorns"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "otie-inner"
|
||||
extra_overlay = "antlers_mark"
|
||||
|
||||
/datum/sprite_accessory/ears/cow
|
||||
name = "cow, horns"
|
||||
@@ -221,6 +221,21 @@
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/ears/cow_nohorns
|
||||
name = "cow, no horns"
|
||||
desc = ""
|
||||
icon_state = "cow-nohorns"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/ears/otie
|
||||
name = "otie, colorable"
|
||||
desc = ""
|
||||
icon_state = "otie"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "otie-inner"
|
||||
|
||||
/datum/sprite_accessory/ears/zears
|
||||
name = "jagged ears"
|
||||
desc = ""
|
||||
@@ -823,6 +838,14 @@
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/tail/newtailmaw
|
||||
name = "new tailmaw (vwag)"
|
||||
desc = ""
|
||||
icon_state = "newtailmaw"
|
||||
ani_state = "newtailmaw_w"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/tail/ztail
|
||||
name = "jagged flufftail"
|
||||
desc = ""
|
||||
@@ -845,6 +868,22 @@
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "sergal_mark"
|
||||
|
||||
/datum/sprite_accessory/tail/skunktail
|
||||
name = "skunk, dual-color"
|
||||
desc = ""
|
||||
icon_state = "skunktail"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "skunktail_mark"
|
||||
|
||||
/datum/sprite_accessory/tail/deertail
|
||||
name = "deer, dual-color"
|
||||
desc = ""
|
||||
icon_state = "deertail"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "deertail_mark"
|
||||
|
||||
//For all species tails. Includes haircolored tails.
|
||||
/datum/sprite_accessory/tail/special
|
||||
name = "Blank tail. Do not select."
|
||||
|
||||
@@ -172,45 +172,54 @@
|
||||
// Release all contents of this belly into the owning mob's location.
|
||||
// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
|
||||
// Returns the number of mobs so released.
|
||||
/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE)
|
||||
/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE, var/silent = FALSE)
|
||||
|
||||
//Don't bother if we don't have contents
|
||||
if(!contents.len)
|
||||
return 0
|
||||
var/atom/destination = drop_location()
|
||||
|
||||
//Find where we should drop things into (certainly not the owner)
|
||||
var/count = 0
|
||||
|
||||
//Iterate over contents and move them all
|
||||
for(var/thing in contents)
|
||||
var/atom/movable/AM = thing
|
||||
if(isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
if(L.absorbed && !include_absorbed)
|
||||
continue
|
||||
L.absorbed = FALSE
|
||||
|
||||
AM.forceMove(destination) // Move the belly contents into the same location as belly's owner.
|
||||
count++
|
||||
count += release_specific_contents(AM, silent = TRUE)
|
||||
|
||||
//Clean up our own business
|
||||
items_preserved.Cut()
|
||||
owner.visible_message("<font color='green'><b>[owner] expels everything from their [lowertext(name)]!</b></font>")
|
||||
owner.update_icons()
|
||||
if(release_sound)
|
||||
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
|
||||
if(isanimal(owner))
|
||||
owner.update_icons()
|
||||
|
||||
//Print notifications/sound if necessary
|
||||
if(!silent)
|
||||
owner.visible_message("<font color='green'><b>[owner] expels everything from their [lowertext(name)]!</b></font>")
|
||||
if(release_sound)
|
||||
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
|
||||
|
||||
return count
|
||||
|
||||
// Release a specific atom from the contents of this belly into the owning mob's location.
|
||||
// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in.
|
||||
// Returns the number of atoms so released.
|
||||
/obj/belly/proc/release_specific_contents(var/atom/movable/M)
|
||||
/obj/belly/proc/release_specific_contents(var/atom/movable/M, var/silent = FALSE)
|
||||
if (!(M in contents))
|
||||
return 0 // They weren't in this belly anyway
|
||||
|
||||
M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner.
|
||||
//Place them into our drop_location
|
||||
M.forceMove(drop_location())
|
||||
items_preserved -= M
|
||||
if(release_sound)
|
||||
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
|
||||
|
||||
|
||||
//Special treatment for absorbed prey
|
||||
if(istype(M,/mob/living))
|
||||
var/mob/living/ML = M
|
||||
var/mob/living/OW = owner
|
||||
if(ML.absorbed)
|
||||
ML.absorbed = 0
|
||||
ML.absorbed = FALSE
|
||||
if(ishuman(M) && ishuman(OW))
|
||||
var/mob/living/carbon/human/Prey = M
|
||||
var/mob/living/carbon/human/Pred = OW
|
||||
@@ -220,8 +229,16 @@
|
||||
absorbed_count++
|
||||
Pred.bloodstr.trans_to(Prey, Pred.reagents.total_volume / absorbed_count)
|
||||
|
||||
owner.visible_message("<font color='green'><b>[owner] expels [M] from their [lowertext(name)]!</b></font>")
|
||||
owner.update_icons()
|
||||
//Clean up our own business
|
||||
if(isanimal(owner))
|
||||
owner.update_icons()
|
||||
|
||||
//Print notifications/sound if necessary
|
||||
if(!silent)
|
||||
owner.visible_message("<font color='green'><b>[owner] expels [M] from their [lowertext(name)]!</b></font>")
|
||||
if(release_sound)
|
||||
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
|
||||
|
||||
return 1
|
||||
|
||||
// Actually perform the mechanics of devouring the tasty prey.
|
||||
@@ -329,13 +346,7 @@
|
||||
|
||||
// If digested prey is also a pred... anyone inside their bellies gets moved up.
|
||||
if(is_vore_predator(M))
|
||||
for(var/belly in M.vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
for(var/thing in B)
|
||||
var/atom/movable/AM = thing
|
||||
AM.forceMove(src)
|
||||
if(isliving(AM))
|
||||
to_chat(AM,"As [M] melts away around you, you find yourself in [owner]'s [lowertext(name)]")
|
||||
M.release_vore_contents(include_absorbed = TRUE, silent = TRUE)
|
||||
|
||||
//Drop all items into the belly.
|
||||
if(config.items_survive_digestion)
|
||||
@@ -350,7 +361,7 @@
|
||||
for(var/slot in slots)
|
||||
var/obj/item/thingy = M.get_equipped_item(slot = slot)
|
||||
if(thingy)
|
||||
M.remove_from_mob(thingy, M.drop_location())
|
||||
M.unEquip(thingy,force = TRUE)
|
||||
|
||||
//Reagent transfer
|
||||
if(ishuman(owner))
|
||||
@@ -419,13 +430,17 @@
|
||||
/obj/belly/drop_location()
|
||||
//Should be the case 99.99% of the time
|
||||
if(owner)
|
||||
return owner.loc
|
||||
return owner.drop_location()
|
||||
//Sketchy fallback for safety, put them somewhere safe.
|
||||
else
|
||||
log_debug("[src] (\ref[src]) doesn't have an owner, and dropped someone at a latespawn point!")
|
||||
var/fallback = pick(latejoin)
|
||||
return get_turf(fallback)
|
||||
|
||||
//Yes, it's ""safe"" to drop items here
|
||||
/obj/belly/AllowDrop()
|
||||
return TRUE
|
||||
|
||||
//Handle a mob struggling
|
||||
// Called from /mob/living/carbon/relaymove()
|
||||
/obj/belly/proc/relay_resist(var/mob/living/R)
|
||||
|
||||
@@ -120,18 +120,12 @@
|
||||
continue
|
||||
for(var/slot in slots)
|
||||
var/obj/item/thingy = M.get_equipped_item(slot = slot)
|
||||
if(thingy && M.canUnEquip(thingy))
|
||||
if(slot == slot_w_uniform)
|
||||
var/list/stash = list(slot_r_store,slot_l_store,slot_wear_id,slot_belt)
|
||||
for(var/stashslot in stash)
|
||||
var/obj/item/SL = M.get_equipped_item(stashslot)
|
||||
if(SL)
|
||||
M.remove_from_mob(SL, M.drop_location())
|
||||
M.remove_from_mob(thingy, M.drop_location())
|
||||
if(thingy)
|
||||
M.unEquip(thingy,force = TRUE)
|
||||
digest_item(thingy)
|
||||
break
|
||||
|
||||
M.updateVRPanel()
|
||||
|
||||
owner.updateVRPanel()
|
||||
|
||||
//////////////////////////// DM_ABSORB ////////////////////////////
|
||||
|
||||
@@ -222,10 +222,10 @@
|
||||
//
|
||||
// Release everything in every vore organ
|
||||
//
|
||||
/mob/living/proc/release_vore_contents(var/include_absorbed = TRUE)
|
||||
/mob/living/proc/release_vore_contents(var/include_absorbed = TRUE, var/silent = FALSE)
|
||||
for(var/belly in vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
B.release_all_contents(include_absorbed)
|
||||
B.release_all_contents(include_absorbed, silent)
|
||||
|
||||
//
|
||||
// Returns examine messages for bellies
|
||||
|
||||
Reference in New Issue
Block a user