Merge branch 'master' into superpod

This commit is contained in:
Heroman3003
2020-02-10 23:08:57 +10:00
committed by GitHub
95 changed files with 1917 additions and 1017 deletions
+8
View File
@@ -133,6 +133,14 @@ obj/machinery/gateway/centerstation/process()
M.set_dir(SOUTH)
return
else
//VOREStation Addition Start: Prevent taurriding abuse
if(istype(M, /mob/living))
var/mob/living/L = M
if(LAZYLEN(L.buckled_mobs))
var/datum/riding/R = L.riding_datum
for(var/rider in L.buckled_mobs)
R.force_dismount(rider)
//VOREStation Addition End: Prevent taurriding abuse
var/obj/effect/landmark/dest = pick(awaydestinations)
if(dest)
M.forceMove(dest.loc)
+100
View File
@@ -0,0 +1,100 @@
//Uses a couple different services
/client/update_ip_reputation()
var/scores[] = list("GII" = ipr_getipintel(), "IPQS" = ipr_ipqualityscore())
var/log_output = "IP Reputation [key] from [address]"
var/worst = 0
for(var/service in scores)
var/score = scores[service]
if(score > worst)
worst = score
log_output += " - [service] ([num2text(score)])"
log_admin(log_output)
ip_reputation = worst
return TRUE
//Service returns a single float in html body
/client/proc/ipr_getipintel()
if(!config.ipr_email)
return -1
var/request = "http://check.getipintel.net/check.php?ip=[address]&contact=[config.ipr_email]"
var/http[] = world.Export(request)
if(!http || !islist(http)) //If we couldn't check, the service might be down, fail-safe.
log_admin("Couldn't connect to getipintel.net to check [address] for [key]")
return -1
//429 is rate limit exceeded
if(text2num(http["STATUS"]) == 429)
log_and_message_admins("getipintel.net reports HTTP status 429. IP reputation checking is now disabled. If you see this, let a developer know.")
config.ip_reputation = FALSE
return -1
var/content = file2text(http["CONTENT"]) //world.Export actually returns a file object in CONTENT
var/score = text2num(content)
if(isnull(score))
return -1
//Error handling
if(score < 0)
var/fatal = TRUE
var/ipr_error = "getipintel.net IP reputation check error while checking [address] for [key]: "
switch(score)
if(-1)
ipr_error += "No input provided"
if(-2)
fatal = FALSE
ipr_error += "Invalid IP provided"
if(-3)
fatal = FALSE
ipr_error += "Unroutable/private IP (spoofing?)"
if(-4)
fatal = FALSE
ipr_error += "Unable to reach database"
if(-5)
ipr_error += "Our IP is banned or otherwise forbidden"
if(-6)
ipr_error += "Missing contact info"
log_and_message_admins(ipr_error)
if(fatal)
config.ip_reputation = FALSE
log_and_message_admins("With this error, IP reputation checking is disabled for this shift. Let a developer know.")
return -1
//Went fine
else
return score
//Service returns JSON in html body
/client/proc/ipr_ipqualityscore()
if(!config.ipqualityscore_apikey)
return -1
var/request = "http://www.ipqualityscore.com/api/json/ip/[config.ipqualityscore_apikey]/[address]?strictness=1&fast=true&byond_key=[key]"
var/http[] = world.Export(request)
if(!http || !islist(http)) //If we couldn't check, the service might be down, fail-safe.
log_admin("Couldn't connect to ipqualityscore.com to check [address] for [key]")
return -1
var/content = file2text(http["CONTENT"]) //world.Export actually returns a file object in CONTENT
var/response = json_decode(content)
if(isnull(response))
return -1
//Error handling
if(!response["success"])
log_admin("IPQualityscore.com returned an error while processing [key] from [address]: " + response["message"])
return -1
var/score = 0
if(response["proxy"])
score = 100
else
score = response["fraud_score"]
return score/100 //To normalize with the 0.0 to 1.0 scores.
@@ -50,6 +50,36 @@
plushies[initial(plushie_type.name)] = plushie_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(plushies))
/datum/gear/figure
display_name = "action figure selection"
description = "A \"Space Life\" brand action figure."
path = /obj/item/toy/figure/
/datum/gear/figure/New()
..()
var/list/figures = list()
for(var/figure in typesof(/obj/item/toy/figure/) - /obj/item/toy/figure)
var/obj/item/toy/figure/figure_type = figure
figures[initial(figure_type.name)] = figure_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(figures))
/datum/gear/toy
display_name = "toy selection"
description = "Choose from a number of toys."
path = /obj/item/toy/
/datum/gear/toy/New()
..()
var/toytype = list()
toytype["Blink toy"] = /obj/item/toy/blink
toytype["Gravitational singularity"] = /obj/item/toy/spinningtoy
toytype["Water flower"] = /obj/item/toy/waterflower
toytype["Bosun's whistle"] = /obj/item/toy/bosunwhistle
toytype["Magic 8 Ball"] = /obj/item/toy/eight_ball
toytype["Magic Conch shell"] = /obj/item/toy/eight_ball/conch
gear_tweaks += new/datum/gear_tweak/path(toytype)
/datum/gear/flask
display_name = "flask"
path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask
+47 -5
View File
@@ -24,8 +24,11 @@
var/ear_protection = 0
var/blood_sprite_state
var/index //null by default, if set, will change which dmi it uses
var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing
//Updates the icons of the mob wearing the clothing item, if any.
/obj/item/clothing/proc/update_clothing_icon()
return
@@ -35,12 +38,14 @@
..()
gunshot_residue = null
/obj/item/clothing/New()
..()
if(starting_accessories)
for(var/T in starting_accessories)
var/obj/item/clothing/accessory/tie = new T(src)
src.attach_accessory(null, tie)
set_clothing_index()
/obj/item/clothing/equipped(var/mob/user,var/slot)
..()
@@ -224,6 +229,9 @@
SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi'
)
/obj/item/clothing/proc/set_clothing_index()
return
/obj/item/clothing/gloves/update_clothing_icon()
if (ismob(src.loc))
var/mob/M = src.loc
@@ -602,6 +610,7 @@
var/mob/M = src.loc
M.update_inv_shoes()
///////////////////////////////////////////////////////////////////////
//Suit
/obj/item/clothing/suit
@@ -630,11 +639,27 @@
valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND)
restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND)
/obj/item/clothing/suit/set_clothing_index()
..()
if(index && !icon_override)
icon = new /icon("icons/obj/clothing/suits_[index].dmi")
item_icons = list(
slot_l_hand_str = new /icon("icons/mob/items/lefthand_suits_[index].dmi"),
slot_r_hand_str = new /icon("icons/mob/items/righthand_suits_[index].dmi"),
)
return 1
return 0
/obj/item/clothing/suit/update_clothing_icon()
if (ismob(src.loc))
var/mob/M = src.loc
M.update_inv_wear_suit()
set_clothing_index()
///////////////////////////////////////////////////////////////////////
//Under clothing
/obj/item/clothing/under
@@ -707,7 +732,7 @@
//autodetect rollability
if(rolled_down < 0)
if(("[worn_state]_d_s" in icon_states(INV_W_UNIFORM_DEF_ICON)) || ("[worn_state]_s" in icon_states(rolled_down_icon)) || ("[worn_state]_d_s" in icon_states(icon_override)))
if(("[worn_state]_d_s" in icon_states(icon)) || ("[worn_state]_s" in icon_states(rolled_down_icon)) || ("[worn_state]_d_s" in icon_states(icon_override)))
rolled_down = 0
if(rolled_down == -1)
@@ -715,6 +740,23 @@
if(rolled_sleeves == -1)
verbs -= /obj/item/clothing/under/verb/rollsleeves
/obj/item/clothing/under/set_clothing_index()
..()
if(index && !icon_override)
icon = new /icon("icons/obj/clothing/uniforms_[index].dmi")
item_icons = list(
slot_l_hand_str = new /icon("icons/mob/items/lefthand_uniforms_[index].dmi"),
slot_r_hand_str = new /icon("icons/mob/items/righthand_uniforms_[index].dmi"),
)
rolled_down_icon = new /icon("icons/mob/uniform_rolled_down_[index].dmi")
rolled_down_sleeves_icon = new /icon("icons/mob/uniform_sleeves_rolled_[index].dmi")
return 1
return 0
/obj/item/clothing/under/proc/update_rolldown_status()
var/mob/living/carbon/human/H
if(istype(src.loc, /mob/living/carbon/human))
@@ -729,8 +771,6 @@
under_icon = item_icons[slot_w_uniform_str]
else if ("[worn_state]_s" in icon_states(rolled_down_icon))
under_icon = rolled_down_icon
else
under_icon = INV_W_UNIFORM_DEF_ICON
// The _s is because the icon update procs append it.
if((under_icon == rolled_down_icon && "[worn_state]_s" in icon_states(under_icon)) || ("[worn_state]_d_s" in icon_states(under_icon)))
@@ -754,8 +794,8 @@
under_icon = item_icons[slot_w_uniform_str]
else if ("[worn_state]_s" in icon_states(rolled_down_sleeves_icon))
under_icon = rolled_down_sleeves_icon
else
under_icon = INV_W_UNIFORM_DEF_ICON
else if(index)
under_icon = new /icon("[INV_W_UNIFORM_DEF_ICON]_[index].dmi")
// The _s is because the icon update procs append it.
if((under_icon == rolled_down_sleeves_icon && "[worn_state]_s" in icon_states(under_icon)) || ("[worn_state]_r_s" in icon_states(under_icon)))
@@ -770,6 +810,8 @@
var/mob/M = src.loc
M.update_inv_w_uniform()
set_clothing_index()
/obj/item/clothing/under/examine(mob/user)
..(user)
@@ -8,7 +8,7 @@
SPECIES_SERGAL = 'icons/mob/species/sergal/helmet_vr.dmi',
SPECIES_ZORREN_FLAT = 'icons/mob/species/fennec/helmet_vr.dmi',
SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/helmet_vr.dmi',
SPECIES_VULPKANI = 'icons/mob/species/vulpkanin/helmet.dmi',
SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet.dmi',
SPECIES_PROMETHEAN = 'icons/mob/species/skrell/helmet.dmi',
SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet.dmi',
SPECIES_VOX = 'icons/mob/species/vox/head.dmi',
+1
View File
@@ -8,6 +8,7 @@
flags_inv = HIDEHOLSTER
allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
index = 1
/obj/item/clothing/suit/storage/toggle/labcoat/red
name = "red labcoat"
@@ -62,6 +62,19 @@
"Teshari" = 'icons/mob/species/seromi/suit.dmi'
)
/obj/item/clothing/accessory/poncho/equipped() //Solution for race-specific sprites for an accessory which is also a suit. Suit icons break if you don't use icon override which then also overrides race-specific sprites.
..()
var/mob/living/carbon/human/H = loc
if(istype(H) && H.wear_suit == src)
if(H.species.name == "Teshari")
icon_override = 'icons/mob/species/seromi/suit.dmi'
else
icon_override = 'icons/mob/ties.dmi'
update_clothing_icon()
/obj/item/clothing/accessory/poncho/dropped() //Resets the override to prevent the wrong .dmi from being used because equipped only triggers when wearing ponchos as suits.
icon_override = null
/obj/item/clothing/accessory/poncho/green
name = "green poncho"
desc = "A simple, comfortable cloak without sleeves. This one is green."
@@ -357,6 +357,7 @@
name = "maid costume"
desc = "Maid in China."
icon_state = "maid"
index = 1
/obj/item/clothing/under/dress/maid/janitor
name = "maid uniform"
+1
View File
@@ -5,6 +5,7 @@
icon_state = "jeans"
gender = PLURAL
body_parts_covered = LOWER_TORSO|LEGS
index = 1
/obj/item/clothing/under/pants/ripped
name = "ripped jeans"
+19 -1
View File
@@ -2,8 +2,10 @@
/obj/item/clothing/under/shorts
name = "athletic shorts"
desc = "95% Polyester, 5% Spandex!"
icon_state = "redshorts" // Hackyfix for icon states until someone wants to come do a recolor later.
gender = PLURAL
body_parts_covered = LOWER_TORSO
index = 1
/obj/item/clothing/under/shorts/red
name = "red athletic shorts"
@@ -99,6 +101,7 @@
icon_state = "skirt_short_black"
body_parts_covered = LOWER_TORSO
rolled_sleeves = -1
index = 1
/obj/item/clothing/under/skirt/khaki
name = "khaki skirt"
@@ -165,12 +168,14 @@
desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
icon_state = "qmf"
item_state_slots = list(slot_r_hand_str = "qm", slot_l_hand_str = "qm")
index = 1
/obj/item/clothing/under/rank/cargotech/skirt
name = "cargo technician's jumpskirt"
desc = "Skirrrrrts! They're comfy and easy to wear!"
icon_state = "cargof"
item_state_slots = list(slot_r_hand_str = "cargo", slot_l_hand_str = "cargo")
index = 1
/obj/item/clothing/under/rank/engineer/skirt
desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding."
@@ -178,51 +183,61 @@
icon_state = "enginef"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
item_state_slots = list(slot_r_hand_str = "engine", slot_l_hand_str = "engine")
index = 1
/obj/item/clothing/under/rank/chief_engineer/skirt
desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding."
name = "chief engineer's jumpskirt"
icon_state = "chieff"
item_state_slots = list(slot_r_hand_str = "chiefengineer", slot_l_hand_str = "chiefengineer")
index = 1
/obj/item/clothing/under/rank/atmospheric_technician/skirt
desc = "It's a jumpskirt worn by atmospheric technicians."
name = "atmospheric technician's jumpskirt"
icon_state = "atmosf"
item_state_slots = list(slot_r_hand_str = "atmos", slot_l_hand_str = "atmos")
index = 1
/obj/item/clothing/under/rank/roboticist/skirt
desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work."
name = "roboticist's jumpskirt"
icon_state = "roboticsf"
item_state_slots = list(slot_r_hand_str = "robotics", slot_l_hand_str = "robotics")
index = 1
/obj/item/clothing/under/rank/scientist/skirt
name = "scientist's jumpskirt"
icon_state = "sciencef"
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
index = 1
/obj/item/clothing/under/rank/medical/skirt
name = "medical doctor's jumpskirt"
icon_state = "medicalf"
index = 1
/obj/item/clothing/under/rank/chemist/skirt
name = "chemist's jumpskirt"
icon_state = "chemistryf"
index = 1
/obj/item/clothing/under/rank/chief_medical_officer/skirt
desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
name = "chief medical officer's jumpskirt"
icon_state = "cmof"
index = 1
/obj/item/clothing/under/rank/geneticist/skirt
name = "geneticist's jumpskirt"
icon_state = "geneticsf"
index = 1
/obj/item/clothing/under/rank/virologist/skirt
name = "virologist's jumpskirt"
icon_state = "virologyf"
index = 1
/obj/item/clothing/under/rank/security/skirt
name = "security officer's jumpskirt"
@@ -230,13 +245,16 @@
icon_state = "securityf"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
index = 1
/obj/item/clothing/under/rank/warden/skirt
desc = "Standard feminine fashion for a Warden. It is made of sturdier material than standard jumpskirts. It has the word \"Warden\" written on the shoulders."
name = "warden's jumpskirt"
icon_state = "wardenf"
index = 1
/obj/item/clothing/under/rank/head_of_security/skirt
desc = "It's a fashionable jumpskirt worn by those few with the dedication to achieve the position of \"Head of Security\". It has additional armor to protect the wearer."
name = "head of security's jumpskirt"
icon_state = "hosf"
icon_state = "hosf"
index = 1
+1 -1
View File
@@ -64,7 +64,7 @@ log transactions
break
/obj/machinery/atm/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
if(emagged)
return
//short out the machine, shoot sparks, spew money!
+2 -1
View File
@@ -81,7 +81,8 @@
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 30, list(ASSIGNMENT_SECURITY = 30), 1),
//Evil grubs that drain station power slightly
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 0, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 10, list(ASSIGNMENT_SCIENTIST = 40), 1)
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 10, list(ASSIGNMENT_SCIENTIST = 40), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/morph_spawn, 75, list(ASSIGNMENT_SECURITY = 35), 1)
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1),
+47
View File
@@ -0,0 +1,47 @@
/datum/event/morph_spawn
startWhen = 1
announceWhen = 20
endWhen = 30
var/announceProb = 50
/datum/event/morph_spawn/start()
var/obj/effect/landmark/spawnspot = null
var/list/possibleSpawnspots = list()
for(var/obj/effect/landmark/newSpawnspot in landmarks_list)
if(newSpawnspot.name == "morphspawn")
possibleSpawnspots += newSpawnspot
if(possibleSpawnspots.len)
spawnspot = pick(possibleSpawnspots)
else
kill() // To prevent fake announcements
return
if(!spawnspot)
kill() // To prevent fake announcements
return
var/datum/ghost_query/Q = new /datum/ghost_query/morph()
var/list/winner = Q.query()
if(winner.len)
var/mob/living/simple_mob/vore/hostile/morph/newMorph = new /mob/living/simple_mob/vore/hostile/morph(get_turf(spawnspot))
var/mob/observer/dead/D = winner[1]
if(D.mind)
D.mind.transfer_to(newMorph)
to_chat(D, "<span class='notice'>You are a <b>Morph</b>, somehow having gotten aboard the station in your wandering. \
You are wary of environment around you, but your primal hunger still calls for you to find prey. Seek a convincing disguise, \
using your amorphous form to traverse vents to find and consume weak prey.</span>")
to_chat(D, "<span class='notice'>You can use shift + click on objects to disguise yourself as them, but your strikes are nearly useless when you are disguised. \
You can undisguise yourself by shift + clicking yourself, but disguise being switched, or turned on and off has a short cooldown. You can also ventcrawl, \
by using alt + click on the vent or scrubber.</span>")
newMorph.ckey = D.ckey
newMorph.visible_message("<span class='warning'>A morph appears to crawl out of somewhere.</span>")
else
kill() // To prevent fake announcements
return
/datum/event/morph_spawn/announce()
if(announceProb)
command_announcement.Announce("Unknown entitity detected boarding [station_name()]. Exercise extra caution.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
@@ -78,3 +78,11 @@
/obj/item/weapon/storage/box/glass_extras/sticks
name = "box of drink sticks"
extra_type = /obj/item/weapon/glass_extra/stick
/obj/item/weapon/storage/box/glasses/coffeecup
name = "box of coffee cups"
glass_type = /obj/item/weapon/reagent_containers/food/drinks/cup
/obj/item/weapon/storage/box/glasses/coffeemug
name = "box of coffee mugs"
glass_type = /obj/item/weapon/reagent_containers/food/drinks/britcup
+2 -12
View File
@@ -490,6 +490,7 @@
name = "wolpin cube"
monkey_type = "Wolpin"
/*
/obj/item/weapon/reagent_containers/food/snacks/pizza/margfrozen
name = "frozen margherita pizza"
desc = "It's frozen rock solid, better thaw it in a microwave."
@@ -669,18 +670,7 @@
/obj/item/weapon/reagent_containers/food/snacks/slice/vegcargo/filled
filled = TRUE
/obj/item/pizzabox/margherita/Initialize()
pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margcargo(src)
/obj/item/pizzabox/vegetable/Initialize()
pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegcargo(src)
/obj/item/pizzabox/mushroom/Initialize()
pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushcargo(src)
/obj/item/pizzabox/meat/Initialize()
pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatcargo(src)
*/
// food cubes
/obj/item/weapon/reagent_containers/food/snacks/cube
+3 -1
View File
@@ -196,6 +196,7 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/sharkmeatcubes
/*
/datum/recipe/microwave/margheritapizzacargo
reagents = list()
items = list(
@@ -223,10 +224,11 @@
/obj/item/weapon/reagent_containers/food/snacks/pizza/vegfrozen
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegcargo
*/
//// food cubes
/datum/recipe/microwave/foodcubes
reagents = list("enzyme" = 20,"virusfood" = 5, "nutriment" = 15, "protein" = 15) // labor intensive
reagents = list("enzyme" = 20, "virusfood" = 5, "nutriment" = 15, "protein" = 15) // labor intensive
items = list()
result = /obj/item/weapon/storage/box/wings/tray
+4 -3
View File
@@ -452,15 +452,16 @@
var/additional_chems = rand(0,5)
if(additional_chems)
//VOREStation Edit Start TFF 24/1/20 - More chems to the blacklist for prefs reasoning.
// VOREStation Edit Start: Modified exclusion list
var/list/banned_chems = list(
"adminordrazine",
"nutriment",
"macrocillin",
"microcillin",
"normalcillin"
"normalcillin",
"magicdust"
)
//VOREStation Edit End
// VOREStation Edit End: Modified exclusion list
for(var/x=1;x<=additional_chems;x++)
+2 -2
View File
@@ -168,7 +168,7 @@
name = "bloodtomato"
seed_name = "blood tomato"
display_name = "blood tomato plant"
mutants = list("killer")
mutants = list("killertomato")
chems = list("nutriment" = list(1,10), "blood" = list(1,5))
splat_type = /obj/effect/decal/cleanable/blood/splatter
@@ -1520,4 +1520,4 @@
set_trait(TRAIT_SPREAD,1)
set_trait(TRAIT_POTENCY,10)
set_trait(TRAIT_REQUIRES_NUTRIENTS,0)
set_trait(TRAIT_REQUIRES_WATER,0)
set_trait(TRAIT_REQUIRES_WATER,0)
+1 -1
View File
@@ -229,7 +229,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
dat += "<h3>External Archive</h3>" //VOREStation Edit
establish_old_db_connection()
dat += "<h3><font color=red>Warning: System Administrator has slated this archive for removal. Personal uploads should be taken to the NT board of internal literature.</font></h3>"
// dat += "<h3><font color=red>Warning: System Administrator has slated this archive for removal. Personal uploads should be taken to the NT board of internal literature.</font></h3>" //VOREStation Removal TFF 29/1/20 - Redundant warning, we're not removing our library entries.
if(!dbcon_old.IsConnected())
dat += "<font color=red><b>ERROR</b>: Unable to contact External Archive. Please contact your system administrator for assistance.</font>"
+3 -2
View File
@@ -130,7 +130,8 @@
S.amount = stack_amt
stack_storage[sheet] -= stack_amt
S.update_icon()
console.updateUsrDialog()
if(console)
console.updateUsrDialog()
return
@@ -580,6 +580,15 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space/rig))
return //Wearing a suit that prevents uniform rendering
var/obj/item/clothing/under/under = w_uniform
var/uniform_sprite
if(under.index)
uniform_sprite = "[INV_W_UNIFORM_DEF_ICON]_[under.index].dmi"
else
uniform_sprite = "[INV_W_UNIFORM_DEF_ICON].dmi"
//Build a uniform sprite
//VOREStation Edit start.
var/icon/c_mask = null
@@ -587,9 +596,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/obj/item/clothing/suit/S = wear_suit
if(!(wear_suit && ((wear_suit.flags_inv & HIDETAIL) || (istype(S) && S.taurized)))) //Clip the lower half of the uniform off using the tail's clip mask.
c_mask = new /icon(tail_style.clip_mask_icon, tail_style.clip_mask_state)
overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = INV_W_UNIFORM_DEF_ICON, default_layer = UNIFORM_LAYER, clip_mask = c_mask)
overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = uniform_sprite, default_layer = UNIFORM_LAYER, clip_mask = c_mask)
//VOREStation Edit end.
apply_layer(UNIFORM_LAYER)
/mob/living/carbon/human/update_inv_wear_id()
@@ -758,22 +766,24 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(!wear_suit)
return //No point, no suit.
// Part of splitting the suit sprites up
var/iconFile = INV_SUIT_DEF_ICON
var/obj/item/clothing/suit/S //VOREStation edit - break this var out a level for use below.
if(istype(wear_suit, /obj/item/clothing/suit))
S = wear_suit
if(S.update_icon_define)
iconFile = S.update_icon_define
var/obj/item/clothing/suit/suit = wear_suit
var/suit_sprite
if(suit.index)
suit_sprite = "[INV_SUIT_DEF_ICON]_[suit.index].dmi"
else if(istype(suit, /obj/item/clothing) && !isnull(suit.update_icon_define))
suit_sprite = suit.update_icon_define
else
suit_sprite = "[INV_SUIT_DEF_ICON].dmi"
//VOREStation Edit start.
var/icon/c_mask = null
var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT])
var/valid_clip_mask = (tail_style && tail_style.clip_mask_icon && tail_style.clip_mask_state)
if(tail_is_rendered && valid_clip_mask && !(S && S.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden.
if(tail_is_rendered && valid_clip_mask && !(suit && suit.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden.
c_mask = new /icon(tail_style.clip_mask_icon, tail_style.clip_mask_state)
overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = iconFile, default_layer = SUIT_LAYER, clip_mask = c_mask)
overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = suit_sprite, default_layer = SUIT_LAYER, clip_mask = c_mask)
//VOREStation Edit end.
apply_layer(SUIT_LAYER)
@@ -69,6 +69,7 @@
icon_dead = "measelshark-dead"
meat_amount = 6 //Big fish, tons of meat. Great for feasts.
meat_type = /obj/item/weapon/reagent_containers/food/snacks/sliceable/sharkchunk
vore_active = 1
vore_bump_chance = 100
vore_default_mode = DM_HOLD //docile shark
vore_capacity = 5
@@ -1,5 +1,7 @@
/datum/preferences/update_preview_icon() // Lines up and un-overlaps character edit previews. Also un-splits taurs.
var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey)
if(!mannequin.dna) // Special handling for preview icons before SSAtoms has initailized.
mannequin.dna = new /datum/dna(null)
mannequin.delete_inventory(TRUE)
dress_preview_mob(mannequin)
COMPILE_OVERLAYS(mannequin)
+5 -5
View File
@@ -36,15 +36,15 @@
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
E += M.rating
power_efficiency = E
E = 0
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
E += C.rating
teleport_speed = initial(teleport_speed)
teleport_speed -= (E*10)
teleport_speed = max(15, (teleport_speed - (E * 10)))
teleport_cooldown = initial(teleport_cooldown)
teleport_cooldown -= (E * 100)
teleport_cooldown = max(50, (teleport_cooldown - (E * 100)))
/obj/machinery/power/quantumpad/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, I))
@@ -86,7 +86,7 @@
if(panel_open)
to_chat(user, "<span class='warning'>The panel must be closed before operating this machine!</span>")
return
if(istype(get_area(src), /area/shuttle))
to_chat(user, "<span class='warning'>This is too unstable a platform for \the [src] to operate on!</span>")
return
+1
View File
@@ -172,6 +172,7 @@
disease.stageprob = stageprob
disease.antigen = antigen
disease.uniqueID = uniqueID
disease.resistance = resistance
disease.affected_species = affected_species.Copy()
for(var/datum/disease2/effectholder/holder in effects)
var/datum/disease2/effectholder/newholder = new /datum/disease2/effectholder
+1 -1
View File
@@ -425,7 +425,7 @@
/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, var/delay)
//Sanity
if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs))
log_debug("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
log_debug("[user] attempted to feed [prey] to [pred], via [belly ? lowertext(belly.name) : "*null*"] but it went wrong.")
return
// The belly selected at the time of noms
+11 -3
View File
@@ -62,22 +62,30 @@
var/turf/FromTurf = mode ? get_turf(user) : get_turf(A)
var/turf/ToTurf = mode ? get_turf(A) : get_turf(user)
var/recievefailchance = 5
var/sendfailchance = 5
if(istype(user, /mob/living))
var/mob/living/L = user
if(LAZYLEN(L.buckled_mobs))
for(var/rider in L.buckled_mobs)
sendfailchance += 15
if(mode)
if(user in FromTurf)
if(prob(5))
if(prob(sendfailchance))
user.forceMove(pick(trange(24,user)))
else
user.forceMove(ToTurf)
else
for(var/obj/O in FromTurf)
if(O.anchored) continue
if(prob(5))
if(prob(recievefailchance))
O.forceMove(pick(trange(24,user)))
else
O.forceMove(ToTurf)
for(var/mob/living/M in FromTurf)
if(prob(5))
if(prob(recievefailchance))
M.forceMove(pick(trange(24,user)))
else
M.forceMove(ToTurf)