mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
Merge remote-tracking branch 'VOREStation/master' into nova-ert
This commit is contained in:
@@ -18,6 +18,8 @@
|
||||
var/mind=null
|
||||
var/languages=null
|
||||
var/list/flavor=null
|
||||
var/gender = null
|
||||
var/list/body_descriptors = null
|
||||
var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance.
|
||||
|
||||
/datum/dna2/record/proc/GetData()
|
||||
@@ -706,7 +708,10 @@
|
||||
databuf.types = DNA2_BUF_UE
|
||||
databuf.dna = src.connected.occupant.dna.Clone()
|
||||
if(ishuman(connected.occupant))
|
||||
databuf.dna.real_name=connected.occupant.dna.real_name
|
||||
var/mob/living/carbon/human/H = connected.occupant
|
||||
databuf.dna.real_name = H.dna.real_name
|
||||
databuf.gender = H.gender
|
||||
databuf.body_descriptors = H.descriptors
|
||||
databuf.name = "Unique Identifier"
|
||||
src.buffers[bufferId] = databuf
|
||||
return 1
|
||||
@@ -717,7 +722,10 @@
|
||||
databuf.types = DNA2_BUF_UI|DNA2_BUF_UE
|
||||
databuf.dna = src.connected.occupant.dna.Clone()
|
||||
if(ishuman(connected.occupant))
|
||||
databuf.dna.real_name=connected.occupant.dna.real_name
|
||||
var/mob/living/carbon/human/H = connected.occupant
|
||||
databuf.dna.real_name = H.dna.real_name
|
||||
databuf.gender = H.gender
|
||||
databuf.body_descriptors = H.descriptors
|
||||
databuf.name = "Unique Identifier + Unique Enzymes"
|
||||
src.buffers[bufferId] = databuf
|
||||
return 1
|
||||
@@ -728,7 +736,10 @@
|
||||
databuf.types = DNA2_BUF_SE
|
||||
databuf.dna = src.connected.occupant.dna.Clone()
|
||||
if(ishuman(connected.occupant))
|
||||
databuf.dna.real_name=connected.occupant.dna.real_name
|
||||
var/mob/living/carbon/human/H = connected.occupant
|
||||
databuf.dna.real_name = H.dna.real_name
|
||||
databuf.gender = H.gender
|
||||
databuf.body_descriptors = H.descriptors
|
||||
databuf.name = "Structural Enzymes"
|
||||
src.buffers[bufferId] = databuf
|
||||
return 1
|
||||
@@ -764,10 +775,18 @@
|
||||
if ((buf.types & DNA2_BUF_UE))
|
||||
src.connected.occupant.real_name = buf.dna.real_name
|
||||
src.connected.occupant.name = buf.dna.real_name
|
||||
if(ishuman(connected.occupant))
|
||||
var/mob/living/carbon/human/H = connected.occupant
|
||||
H.gender = buf.gender
|
||||
H.descriptors = buf.body_descriptors
|
||||
src.connected.occupant.UpdateAppearance(buf.dna.UI.Copy())
|
||||
else if (buf.types & DNA2_BUF_SE)
|
||||
src.connected.occupant.dna.SE = buf.dna.SE
|
||||
src.connected.occupant.dna.UpdateSE()
|
||||
if(ishuman(connected.occupant))
|
||||
var/mob/living/carbon/human/H = connected.occupant
|
||||
H.gender = buf.gender
|
||||
H.descriptors = buf.body_descriptors
|
||||
domutcheck(src.connected.occupant,src.connected)
|
||||
src.connected.occupant.apply_effect(rand(20,50), IRRADIATE, check_protection = 0)
|
||||
return 1
|
||||
|
||||
@@ -113,6 +113,8 @@
|
||||
if(!R.dna.real_name) //to prevent null names
|
||||
R.dna.real_name = "clone ([rand(0,999)])"
|
||||
H.real_name = R.dna.real_name
|
||||
H.gender = R.gender
|
||||
H.descriptors = R.body_descriptors
|
||||
|
||||
//Get the clone body ready
|
||||
H.adjustCloneLoss(150) // New damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite
|
||||
|
||||
@@ -105,7 +105,6 @@
|
||||
/datum/frame/frame_types/reagent_distillery
|
||||
name = "Distillery"
|
||||
frame_class = FRAME_CLASS_MACHINE
|
||||
circuit = /obj/item/weapon/circuitboard/distiller
|
||||
frame_size = 4
|
||||
|
||||
/datum/frame/frame_types/display
|
||||
@@ -192,13 +191,13 @@
|
||||
//////////////////////////////
|
||||
|
||||
/obj/structure/frame
|
||||
anchored = 0
|
||||
anchored = FALSE
|
||||
name = "frame"
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "machine_0"
|
||||
var/state = FRAME_PLACED
|
||||
var/obj/item/weapon/circuitboard/circuit = null
|
||||
var/need_circuit = 1
|
||||
var/need_circuit = TRUE
|
||||
var/datum/frame/frame_types/frame_type = new /datum/frame/frame_types/machine
|
||||
|
||||
var/list/components = null
|
||||
@@ -207,8 +206,8 @@
|
||||
|
||||
/obj/structure/frame/computer //used for maps
|
||||
frame_type = new /datum/frame/frame_types/computer
|
||||
anchored = 1
|
||||
density = 1
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/frame/examine(mob/user)
|
||||
..()
|
||||
@@ -260,14 +259,14 @@
|
||||
pixel_y = (dir & 3)? (dir == NORTH ? -frame_type.y_offset : frame_type.y_offset) : 0
|
||||
|
||||
if(frame_type.circuit)
|
||||
need_circuit = 0
|
||||
need_circuit = FALSE
|
||||
circuit = new frame_type.circuit(src)
|
||||
|
||||
if(frame_type.name == "Computer")
|
||||
density = 1
|
||||
density = TRUE
|
||||
|
||||
if(frame_type.frame_class == FRAME_CLASS_MACHINE)
|
||||
density = 1
|
||||
density = TRUE
|
||||
|
||||
update_icon()
|
||||
|
||||
@@ -277,7 +276,7 @@
|
||||
to_chat(user, "<span class='notice'>You start to wrench the frame into place.</span>")
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
if(do_after(user, 20 * P.toolspeed))
|
||||
anchored = 1
|
||||
anchored = TRUE
|
||||
if(!need_circuit && circuit)
|
||||
state = FRAME_FASTENED
|
||||
check_components()
|
||||
@@ -290,7 +289,7 @@
|
||||
playsound(src, P.usesound, 50, 1)
|
||||
if(do_after(user, 20 * P.toolspeed))
|
||||
to_chat(user, "<span class='notice'>You unfasten the frame.</span>")
|
||||
anchored = 0
|
||||
anchored = FALSE
|
||||
|
||||
else if(istype(P, /obj/item/weapon/weldingtool))
|
||||
if(state == FRAME_PLACED)
|
||||
@@ -587,11 +586,11 @@
|
||||
set src in oview(1)
|
||||
|
||||
if(usr.incapacitated())
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(anchored)
|
||||
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
src.set_dir(turn(src.dir, 90))
|
||||
|
||||
@@ -606,11 +605,11 @@
|
||||
set src in oview(1)
|
||||
|
||||
if(usr.incapacitated())
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(anchored)
|
||||
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
src.set_dir(turn(src.dir, 270))
|
||||
|
||||
|
||||
@@ -929,6 +929,12 @@
|
||||
icon_state = "nymphplushie"
|
||||
pokephrase = "Chirp!"
|
||||
|
||||
/obj/item/toy/plushie/teshari
|
||||
name = "teshari plush"
|
||||
desc = "This is a plush teshari. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like she is sleeping. Shhh!"
|
||||
icon_state = "teshariplushie"
|
||||
pokephrase = "Rya!"
|
||||
|
||||
/obj/item/toy/plushie/mouse
|
||||
name = "mouse plush"
|
||||
desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend."
|
||||
@@ -1357,4 +1363,4 @@
|
||||
icon_state = "tinyxmastree"
|
||||
w_class = ITEMSIZE_TINY
|
||||
force = 1
|
||||
throwforce = 1
|
||||
throwforce = 1
|
||||
|
||||
@@ -63,55 +63,48 @@
|
||||
|
||||
/obj/item/weapon/material/shard/afterattack(var/atom/target, mob/living/carbon/human/user as mob)
|
||||
var/active_hand //hand the shard is in
|
||||
var/will_break
|
||||
var/gloves_are_heavy = FALSE//this is a fucking mess
|
||||
var/will_break = FALSE
|
||||
var/protected_hands = FALSE //this is a fucking mess
|
||||
var/break_damage = 4
|
||||
var/light_glove_d = rand(2, 4)
|
||||
var/no_glove_d = rand(4, 6)
|
||||
var/list/h_gloves = list(/obj/item/clothing/gloves/captain, /obj/item/clothing/gloves/cyborg,
|
||||
/obj/item/clothing/gloves/swat, /obj/item/clothing/gloves/combat,
|
||||
/obj/item/clothing/gloves/botanic_leather, /obj/item/clothing/gloves/duty,
|
||||
/obj/item/clothing/gloves/tactical, /obj/item/clothing/gloves/vox,
|
||||
/obj/item/clothing/gloves/gauntlets)
|
||||
var/list/forbidden_gloves = list(
|
||||
/obj/item/clothing/gloves/sterile,
|
||||
/obj/item/clothing/gloves/knuckledusters
|
||||
)
|
||||
|
||||
if(istype(user.l_hand, src))
|
||||
if(src == user.l_hand)
|
||||
active_hand = BP_L_HAND
|
||||
else
|
||||
else if(src == user.r_hand)
|
||||
active_hand = BP_R_HAND
|
||||
else
|
||||
return // If it's not actually in our hands anymore, we were probably gentle with it
|
||||
|
||||
active_hand = (src == user.l_hand) ? BP_L_HAND : BP_R_HAND // May not actually be faster than an if-else block, but a little bit cleaner -Ater
|
||||
|
||||
if(prob(75))
|
||||
will_break = TRUE
|
||||
else
|
||||
will_break = FALSE
|
||||
|
||||
if(user.gloves && (user.gloves.body_parts_covered & HANDS))
|
||||
var/obj/item/clothing/gloves/UG = user.gloves.type
|
||||
for(var/I in h_gloves)
|
||||
if(UG == I)
|
||||
gloves_are_heavy = TRUE
|
||||
if(will_break)
|
||||
user.visible_message("<span class='danger'>[user] hit \the [target] with \the [src], shattering it!</span>", "<span class='warning'>You shatter \the [src] in your hand!</span>")
|
||||
playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
|
||||
qdel(src)
|
||||
if(user.gloves && (user.gloves.body_parts_covered & HANDS) && istype(user.gloves, /obj/item/clothing/gloves)) // Not-gloves aren't gloves, and therefore don't protect us
|
||||
protected_hands = TRUE // If we're wearing gloves we can probably handle it just fine
|
||||
for(var/I in forbidden_gloves)
|
||||
if(istype(user.gloves, I)) // forbidden_gloves is a blacklist, so if we match anything in there, our hands are not protected
|
||||
protected_hands = FALSE
|
||||
break
|
||||
|
||||
if(gloves_are_heavy == FALSE)
|
||||
to_chat(user, "<span class='warning'>\The [src] partially cuts into your hand through your gloves as you hit \the [target]!</span>")
|
||||
if(will_break)
|
||||
user.visible_message("<span class='danger'>[user] hit \the [target] with \the [src], shattering it!</span>", "<span class='warning'>You shatter \the [src] in your hand!</span>")
|
||||
user.apply_damage(light_glove_d + break_damage, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
|
||||
playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
|
||||
qdel(src)
|
||||
else
|
||||
user.apply_damage(light_glove_d, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
|
||||
else
|
||||
if(user.gloves && !protected_hands)
|
||||
to_chat(user, "<span class='warning'>\The [src] partially cuts into your hand through your gloves as you hit \the [target]!</span>")
|
||||
user.apply_damage(light_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge) // Ternary to include break damage
|
||||
|
||||
else if(!user.gloves)
|
||||
to_chat(user, "<span class='warning'>\The [src] cuts into your hand as you hit \the [target]!</span>")
|
||||
if(will_break)
|
||||
user.visible_message("<span class='danger'>[user] hit \the [target] with \the [src], shattering it!</span>", "<span class='warning'>You shatter \the [src] in your hand!</span>")
|
||||
user.apply_damage(no_glove_d + break_damage, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
|
||||
playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
|
||||
qdel(src)
|
||||
else
|
||||
user.apply_damage(no_glove_d, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
|
||||
user.apply_damage(no_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge)
|
||||
|
||||
if(will_break && src.loc == user) // If it's not in our hand anymore
|
||||
user.visible_message("<span class='danger'>[user] hit \the [target] with \the [src], shattering it!</span>", "<span class='warning'>You shatter \the [src] in your hand!</span>")
|
||||
playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/material/shard/Crossed(AM as mob|obj)
|
||||
..()
|
||||
|
||||
@@ -982,6 +982,16 @@
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/tail/sneptail
|
||||
name = "Snep/Furry Tail (vwag)"
|
||||
desc = ""
|
||||
icon_state = "sneptail"
|
||||
ani_state = "sneptail_w"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "sneptail_mark"
|
||||
extra_overlay_w = "sneptail_mark_w"
|
||||
|
||||
/datum/sprite_accessory/tail/tiger_new
|
||||
name = "tiger tail (vwag)"
|
||||
desc = ""
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#define VORE_SOUND_FALLOFF 0.1
|
||||
#define VORE_SOUND_RANGE 3
|
||||
|
||||
//
|
||||
// Belly system 2.0, now using objects instead of datums because EH at datums.
|
||||
@@ -57,6 +58,7 @@
|
||||
var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again.
|
||||
var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick #
|
||||
var/tmp/recent_sound = FALSE // Prevent audio spam
|
||||
var/tmp/list/hearing_mobs
|
||||
|
||||
// Don't forget to watch your commas at the end of each line if you change these.
|
||||
var/list/struggle_messages_outside = list(
|
||||
@@ -248,7 +250,7 @@
|
||||
|
||||
//Place them into our drop_location
|
||||
M.forceMove(drop_location())
|
||||
|
||||
|
||||
items_preserved -= M
|
||||
|
||||
//Special treatment for absorbed prey
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
if(M.is_preference_enabled(/datum/client_preference/digestion_noises)) //then we check if the mob has sounds enabled at all
|
||||
var/sound/preyloop = sound('sound/vore/sunesound/prey/loop.ogg')
|
||||
M.playsound_local(get_turf(src),preyloop, 80,0, channel = CHANNEL_PREYLOOP)
|
||||
M.next_preyloop = (world.time + 52 SECONDS)
|
||||
M.next_preyloop = (world.time + (52 SECONDS))
|
||||
|
||||
/////////////////////////// Sound Selections ///////////////////////////
|
||||
var/sound/prey_digest
|
||||
@@ -354,9 +354,18 @@
|
||||
|
||||
/////////////////////////// Make any noise ///////////////////////////
|
||||
if(play_sound)
|
||||
for(var/mob/M in hearers(4, owner)) //so we don't fill the whole room with the sound effect
|
||||
if(M && M.client && (isturf(M.loc) || (M.loc != src.contents)) && M.is_preference_enabled(/datum/client_preference/digestion_noises)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
|
||||
SEND_SOUND(M, play_sound) //these are all external sound triggers now, so it's ok.
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/M in hearers(VORE_SOUND_RANGE, owner))
|
||||
if(!M.client || !(M.is_preference_enabled(/datum/client_preference/digestion_noises)))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, M)
|
||||
for(var/mob/M in hearing_mobs) //so we don't fill the whole room with the sound effect
|
||||
if(M && M.client && (isturf(M.loc) || (M.loc != src.contents))) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
|
||||
if(fancy_vore)
|
||||
M.playsound_local(owner.loc, play_sound, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
else
|
||||
M.playsound_local(owner.loc, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
//these are all external sound triggers now, so it's ok.
|
||||
if(to_update)
|
||||
for(var/mob/living/M in contents)
|
||||
if(M.client)
|
||||
|
||||
Reference in New Issue
Block a user