mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-24 04:28:12 +01:00
Merge branch 'master' into superpod
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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!
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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++)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user