Merge branch 'master' into smvf

This commit is contained in:
Verkister
2018-03-09 22:17:57 +02:00
committed by GitHub
31 changed files with 1091 additions and 198 deletions
@@ -29,7 +29,7 @@
return
if (ishuman(user) && src.loc == user)
var/mob/living/carbon/human/H = user
if(src != H.l_store && src != H.r_store && src != H.s_store)
if(src == H.w_uniform) // VOREStation Edit - Un-equip on single click, but not on uniform.
return
return ..()
+1 -1
View File
@@ -209,7 +209,7 @@ var/list/slot_equipment_priority = list( \
if(target)
I.forceMove(target)
else
I.dropInto(loc)
I.dropInto(drop_location())
I.dropped(src)
return 1
@@ -173,7 +173,7 @@
for(var/obj/item/organ/external/EO in organs)
if(EO.brute_dam || EO.burn_dam)
output += "[EO.name] - <span class='warning'>[EO.burn_dam + EO.brute_dam > ROBOLIMB_REPAIR_CAP ? "Heavy Damage" : "Light Damage"]</span>\n"
output += "[EO.name] - <span class='warning'>[EO.burn_dam + EO.brute_dam > EO.min_broken_damage ? "Heavy Damage" : "Light Damage"]</span>\n" //VOREStation Edit - Makes robotic limb damage scalable
else
output += "[EO.name] - <span style='color:green;'>OK</span>\n"
@@ -96,6 +96,17 @@
cost = -1
var_changes = list("flash_mod" = 2.0)
/datum/trait/hollow
name = "Hollow Bones/Aluminum Alloy"
desc = "Your bones and robot limbs are much easier to break."
cost = -2 //I feel like this should be higher, but let's see where it goes
/datum/trait/hollow/apply(var/datum/species/S,var/mob/living/carbon/human/H)
..(S,H)
for(var/obj/item/organ/external/O in H.organs)
O.min_broken_damage *= 0.5
O.min_bruised_damage *= 0.5
/datum/trait/lightweight
name = "Lightweight"
desc = "Your light weight and poor balance make you very susceptible to unhelpful bumping. Think of it like a bowling ball versus a pin."
@@ -456,9 +456,10 @@
/hook/death/proc/nif_soulcatcher(var/mob/living/carbon/human/H)
if(!istype(H) || !H.mind) return TRUE //Hooks must return TRUE
if(ishuman(H.loc)) //Died in someone
var/mob/living/carbon/human/HP = H.loc
if(HP.nif && HP.nif.flag_check(NIF_O_SCOTHERS,NIF_FLAGS_OTHER))
if(isbelly(H.loc)) //Died in someone
var/obj/belly/B = H.loc
var/mob/living/carbon/human/HP = B.owner
if(istype(HP) && HP.nif && HP.nif.flag_check(NIF_O_SCOTHERS,NIF_FLAGS_OTHER))
var/datum/nifsoft/soulcatcher/SC = HP.nif.imp_check(NIF_SOULCATCHER)
SC.catch_mob(H)
else if(H.nif && H.nif.flag_check(NIF_O_SCMYSELF,NIF_FLAGS_OTHER)) //They are caught in their own NIF
+11 -11
View File
@@ -148,25 +148,25 @@ var/list/organ_cache = list()
germ_level = 0
return 0
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC] || 0
var/infection_damage = 0
if((status & ORGAN_DEAD) && antibiotics < 30) //Sepsis from 'dead' organs
if((status & ORGAN_DEAD) && antibiotics < ANTIBIO_OD) //Sepsis from 'dead' organs
infection_damage = min(1, 1 + round((germ_level - INFECTION_LEVEL_THREE)/200,0.25)) //1 Tox plus a little based on germ level
else if(germ_level > INFECTION_LEVEL_TWO && antibiotics < 30)
else if(germ_level > INFECTION_LEVEL_TWO && antibiotics < ANTIBIO_OD)
infection_damage = min(0.25, 0.25 + round((germ_level - INFECTION_LEVEL_TWO)/200,0.25))
if(infection_damage)
owner.adjustToxLoss(infection_damage)
if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
adjust_germ_level(-1)
adjust_germ_level(-antibiotics)
if (germ_level >= INFECTION_LEVEL_ONE/2)
//aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
if(antibiotics < 5 && prob(round(germ_level/6)))
if(!antibiotics && prob(round(germ_level/6)))
adjust_germ_level(1)
if(germ_level >= INFECTION_LEVEL_ONE)
@@ -181,7 +181,7 @@ var/list/organ_cache = list()
. = 2 //Organ qualifies for effect-specific processing
//No particular effect on the general 'organ' at 3
if (germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30)
if (germ_level >= INFECTION_LEVEL_THREE && antibiotics < ANTIBIO_OD)
. = 3 //Organ qualifies for effect-specific processing
adjust_germ_level(rand(5,10)) //Germ_level increases without overdose of antibiotics
@@ -234,19 +234,19 @@ var/list/organ_cache = list()
//Germs
/obj/item/organ/proc/handle_antibiotics()
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC] || 0
if (!germ_level || antibiotics < 5)
if (!germ_level || antibiotics < ANTIBIO_NORM)
return
if (germ_level < INFECTION_LEVEL_ONE)
germ_level = 0 //cure instantly
else if (germ_level < INFECTION_LEVEL_TWO)
adjust_germ_level(-6) //at germ_level < 500, this should cure the infection in a minute
adjust_germ_level(-antibiotics*4) //at germ_level < 500, this should cure the infection in a minute
else if (germ_level < INFECTION_LEVEL_THREE)
adjust_germ_level(-2) //at germ_level < 1000, this will cure the infection in 5 minutes
adjust_germ_level(-antibiotics*2) //at germ_level < 1000, this will cure the infection in 5 minutes
else
adjust_germ_level(-1) // You waited this long to get treated, you don't really deserve this organ
adjust_germ_level(-antibiotics) // You waited this long to get treated, you don't really deserve this organ
//Adds autopsy data for used_weapon.
/obj/item/organ/proc/add_autopsy_data(var/used_weapon, var/damage)
+3 -2
View File
@@ -400,7 +400,7 @@
user << "<span class='notice'>Nothing to fix!</span>"
return 0
if(damage_amount >= ROBOLIMB_REPAIR_CAP)
if(damage_amount >= min_broken_damage) //VOREStation Edit - Makes robotic limb damage scalable
user << "<span class='danger'>The damage is far too severe to patch over externally.</span>"
return 0
@@ -1085,6 +1085,7 @@ Note that amputating the affected organ does in fact remove the infection from t
dislocated = -1
cannot_break = 1
min_broken_damage = ROBOLIMB_REPAIR_CAP //VOREStation Addition - Makes robotic limb damage scalable
remove_splint()
get_icon()
unmutate()
@@ -1133,7 +1134,7 @@ Note that amputating the affected organ does in fact remove the infection from t
return !(status & (ORGAN_MUTATED|ORGAN_DEAD))
/obj/item/organ/external/proc/is_malfunctioning()
return ((robotic >= ORGAN_ROBOT) && (brute_dam + burn_dam) >= 25 && prob(brute_dam + burn_dam))
return ((robotic >= ORGAN_ROBOT) && (brute_dam + burn_dam) >= min_broken_damage*0.83 && prob(brute_dam + burn_dam)) //VOREStation Edit - Makes robotic limb damage scalable
/obj/item/organ/external/proc/embed(var/obj/item/weapon/W, var/silent = 0)
if(!owner || loc != owner)
+1 -1
View File
@@ -101,7 +101,7 @@
/datum/reagent/proc/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
return
/datum/reagent/proc/overdose(var/mob/living/carbon/M, var/alien, var/removed) // Overdose effect. Doesn't happen instantly.
/datum/reagent/proc/overdose(var/mob/living/carbon/M, var/alien, var/removed) // Overdose effect.
if(alien == IS_DIONA)
return
if(ishuman(M))
@@ -509,11 +509,46 @@
taste_description = "bitterness"
reagent_state = LIQUID
color = "#C1C1C1"
metabolism = REM * 0.05
metabolism = REM * 0.25
mrate_static = TRUE
overdose = REAGENTS_OVERDOSE
scannable = 1
/datum/reagent/spaceacillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.add_chemical_effect(CE_ANTIBIOTIC, dose >= overdose ? ANTIBIO_OD : ANTIBIO_NORM)
/datum/reagent/corophizine
name = "Corophizine"
id = "corophizine"
description = "A wide-spectrum antibiotic drug. Powerful and uncomfortable in equal doses."
taste_description = "burnt toast"
reagent_state = LIQUID
color = "#FFB0B0"
mrate_static = TRUE
overdose = 10
scannable = 1
/datum/reagent/corophizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.add_chemical_effect(CE_ANTIBIOTIC, ANTIBIO_SUPER)
//Based roughly on Levofloxacin's rather severe side-effects
if(prob(20))
M.Confuse(5)
if(prob(20))
M.Weaken(5)
if(prob(20))
M.make_dizzy(5)
if(prob(20))
M.hallucination = max(M.hallucination, 10)
//One of the levofloxacin side effects is 'spontaneous tendon rupture', which I'll immitate here. 1:1000 chance, so, pretty darn rare.
if(ishuman(M) && rand(1,1000) == 1)
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/eo = pick(H.organs) //Misleading variable name, 'organs' is only external organs
eo.fracture()
/datum/reagent/sterilizine
name = "Sterilizine"
id = "sterilizine"
@@ -417,6 +417,14 @@
required_reagents = list("cryptobiolin" = 1, "inaprovaline" = 1)
result_amount = 2
/datum/chemical_reaction/corophizine
name = "Corophizine"
id = "corophizine"
result = "corophizine"
required_reagents = list("spaceacillin" = 1, "carbon" = 1, "phoron" = 0.1)
catalysts = list("phoron" = 5)
result_amount = 2
/datum/chemical_reaction/imidazoline
name = "imidazoline"
id = "imidazoline"
@@ -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."
+42 -27
View File
@@ -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)
+3 -9
View File
@@ -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 ////////////////////////////
+2 -2
View File
@@ -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