Merge remote-tracking branch 'VOREStation/master' into nova-ert

This commit is contained in:
Unknown
2019-10-21 20:06:45 -04:00
12 changed files with 105 additions and 65 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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))

View File

@@ -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

View File

@@ -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)
..()

View File

@@ -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 = ""

View File

@@ -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

View File

@@ -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)