mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-24 12:37:26 +01:00
Merge remote-tracking branch 'refs/remotes/ParadiseSS13/master' into wizloadouts
This commit is contained in:
@@ -51,7 +51,7 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
|
||||
|
||||
#ifdef TESTING
|
||||
var/msg = "Permission Sets Built:\n"
|
||||
for(var/rank in admin_ranks)
|
||||
for(var/rank in GLOB.admin_ranks)
|
||||
msg += "\t[rank] - [GLOB.admin_ranks[rank]]\n"
|
||||
testing(msg)
|
||||
#endif
|
||||
@@ -142,12 +142,12 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons
|
||||
|
||||
|
||||
#ifdef TESTING
|
||||
/client/verb/changerank(newrank in admin_ranks)
|
||||
/client/verb/changerank(newrank in GLOB.admin_ranks)
|
||||
if(holder)
|
||||
holder.rank = newrank
|
||||
holder.rights = admin_ranks[newrank]
|
||||
holder.rights = GLOB.admin_ranks[newrank]
|
||||
else
|
||||
holder = new /datum/admins(newrank,admin_ranks[newrank],ckey)
|
||||
holder = new /datum/admins(newrank,GLOB.admin_ranks[newrank],ckey)
|
||||
remove_admin_verbs()
|
||||
holder.associate(src)
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var/obj/machinery/gateway/centerstation/the_gateway = null
|
||||
GLOBAL_DATUM_INIT(the_gateway, /obj/machinery/gateway/centerstation, null)
|
||||
/obj/machinery/gateway
|
||||
name = "gateway"
|
||||
desc = "A mysterious gateway built by unknown hands, it allows for faster than light travel to far-flung locations."
|
||||
@@ -41,8 +41,8 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
|
||||
|
||||
/obj/machinery/gateway/centerstation/New()
|
||||
..()
|
||||
if(!the_gateway)
|
||||
the_gateway = src
|
||||
if(!GLOB.the_gateway)
|
||||
GLOB.the_gateway = src
|
||||
|
||||
/obj/machinery/gateway/centerstation/Initialize()
|
||||
..()
|
||||
@@ -54,8 +54,8 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
|
||||
return
|
||||
|
||||
/obj/machinery/gateway/centerstation/Destroy()
|
||||
if(the_gateway == src)
|
||||
the_gateway = null
|
||||
if(GLOB.the_gateway == src)
|
||||
GLOB.the_gateway = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/gateway/centerstation/update_icon()
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
//local gps units to let the ruins be found easier.
|
||||
|
||||
/obj/item/gps/ruin
|
||||
name = "navigation console"
|
||||
desc = "A console for navigation in local space, gives off a weak signal that can be picked up if sufficiently close."
|
||||
icon = 'icons/obj/terminals.dmi'
|
||||
icon_state = "gps_console"
|
||||
anchored = TRUE
|
||||
local = TRUE
|
||||
gpstag = "Unknown Signal"
|
||||
|
||||
/obj/item/gps/ruin/attack_hand(mob/user)
|
||||
attack_self(user)
|
||||
@@ -28,13 +28,6 @@
|
||||
|
||||
var/adminhelped = 0
|
||||
|
||||
// var/gc_destroyed //Time when this object was destroyed. [Inherits from datum]
|
||||
|
||||
#ifdef TESTING
|
||||
var/running_find_references
|
||||
var/last_find_references = 0
|
||||
#endif
|
||||
|
||||
///////////////
|
||||
//SOUND STUFF//
|
||||
///////////////
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
/datum/gear/sechud
|
||||
display_name = "a classic security HUD"
|
||||
path = /obj/item/clothing/glasses/hud/security
|
||||
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent")
|
||||
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent","Magistrate")
|
||||
|
||||
/datum/gear/matches
|
||||
display_name = "a box of matches"
|
||||
@@ -42,7 +42,7 @@
|
||||
/datum/gear/doublecards
|
||||
display_name = "a double deck of standard cards"
|
||||
path = /obj/item/deck/doublecards
|
||||
|
||||
|
||||
/datum/gear/tarot
|
||||
display_name = "a deck of tarot cards"
|
||||
path = /obj/item/deck/tarot
|
||||
|
||||
@@ -489,7 +489,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
dat += "<b>You are banned from special roles.</b>"
|
||||
be_special = list()
|
||||
else
|
||||
for(var/i in special_roles)
|
||||
for(var/i in GLOB.special_roles)
|
||||
if(jobban_isbanned(user, i))
|
||||
dat += "<b>Be [capitalize(i)]:</b> <font color=red><b> \[BANNED]</b></font><br>"
|
||||
else if(!player_old_enough_antag(user.client, i))
|
||||
@@ -2023,7 +2023,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
|
||||
if("be_special")
|
||||
var/r = href_list["role"]
|
||||
if(r in special_roles)
|
||||
if(r in GLOB.special_roles)
|
||||
be_special ^= r
|
||||
|
||||
if("name")
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
|
||||
// Might as well scrub out any malformed be_special list entries while we're here
|
||||
for(var/role in be_special)
|
||||
if(!(role in special_roles))
|
||||
if(!(role in GLOB.special_roles))
|
||||
log_runtime(EXCEPTION("[C.key] had a malformed role entry: '[role]'. Removing!"), src)
|
||||
be_special -= role
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
|
||||
/obj/item/clothing/head/soft/sec
|
||||
name = "security cap"
|
||||
desc = "It's baseball hat in tasteful red colour."
|
||||
desc = "It's a baseball hat in tasteful red colour."
|
||||
icon_state = "secsoft"
|
||||
item_color = "sec"
|
||||
armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 50)
|
||||
@@ -113,7 +113,7 @@
|
||||
|
||||
/obj/item/clothing/head/soft/sec/corp
|
||||
name = "corporate security cap"
|
||||
desc = "It's baseball hat in corpotate colours."
|
||||
desc = "It's a baseball hat in corporate colours."
|
||||
icon_state = "corpsoft"
|
||||
item_color = "corp"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
desc = "A hazard vest used in the recovery of bodies."
|
||||
icon_state = "paramedic-vest"
|
||||
item_state = "paramedic-vest"
|
||||
allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \
|
||||
allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe,
|
||||
/obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10, fire = 50, acid = 50)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
desc = "A vest often worn by doctors caring for inmates."
|
||||
icon_state = "brigphysician-vest"
|
||||
item_state = "brigphysician-vest"
|
||||
allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \
|
||||
allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe,
|
||||
/obj/item/healthanalyzer, /obj/item/flashlight, \
|
||||
/obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50)
|
||||
@@ -341,7 +341,7 @@
|
||||
icon_state = "fr_jacket_open"
|
||||
item_state = "fr_jacket_open"
|
||||
blood_overlay_type = "armor"
|
||||
allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \
|
||||
allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/reagent_containers/syringe,
|
||||
/obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
|
||||
ignore_suitadjust = 0
|
||||
suit_adjusted = 1
|
||||
@@ -381,5 +381,5 @@
|
||||
desc = "A tweed mantle, worn by the Research Director. Smells like science."
|
||||
icon_state = "rdmantle"
|
||||
item_state = "rdmantle"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser)
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0, fire = 50, acid = 50)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
suit_adjusted = 1
|
||||
blood_overlay_type = "coat"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
|
||||
allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
species_exception = list(/datum/species/golem)
|
||||
sprite_sheets = list(
|
||||
|
||||
@@ -394,7 +394,7 @@
|
||||
name = "medical winter coat"
|
||||
icon_state = "wintercoat_med"
|
||||
item_state = "coatmedical"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
|
||||
allowed = list(/obj/item/analyzer, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/medical
|
||||
|
||||
@@ -405,7 +405,7 @@
|
||||
name = "science winter coat"
|
||||
icon_state = "wintercoat_sci"
|
||||
item_state = "coatscience"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 0, acid = 0)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/science
|
||||
|
||||
@@ -958,7 +958,8 @@
|
||||
if(linked_staff.faith >= 100) //if the linked staff is fully recharged, do nothing
|
||||
return
|
||||
|
||||
if(!(linked_staff in range(3, get_turf(src)))) //staff won't charge at range (to prevent it from being handed off / stolen and used)
|
||||
// Do not allow the staff to recharge if it's more than 3 tiles away from the robe. If get_dist returns 0, the robe and the staff in the same tile.
|
||||
if(!(get_dist(H, linked_staff) <= 3))
|
||||
if(prob(10)) //10% chance per process should avoid being too spammy, can tweak if it ends up still being too frequent.
|
||||
to_chat(H, "<span class='warning'>Your staff is unable to charge at this range. Get closer!</span>")
|
||||
return
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
return pockets.attackby(W, user, params)
|
||||
|
||||
/obj/item/clothing/suit/storage/emp_act(severity)
|
||||
pockets.emp_act(severity)
|
||||
..()
|
||||
pockets.emp_act(severity)
|
||||
|
||||
/obj/item/clothing/suit/storage/hear_talk(mob/M, list/message_pieces)
|
||||
pockets.hear_talk(M, message_pieces)
|
||||
|
||||
@@ -37,8 +37,8 @@
|
||||
return hold.attackby(W, user, params)
|
||||
|
||||
/obj/item/clothing/accessory/storage/emp_act(severity)
|
||||
hold.emp_act(severity)
|
||||
..()
|
||||
hold.emp_act(severity)
|
||||
|
||||
/obj/item/clothing/accessory/storage/hear_talk(mob/M, list/message_pieces, verb)
|
||||
hold.hear_talk(M, message_pieces, verb)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
filling_color = "#FF4500"
|
||||
bitesize = 100 // Always eat the apple in one bite
|
||||
tastes = list("apple" = 1)
|
||||
distill_reagent = "hcider"
|
||||
distill_reagent = "cider"
|
||||
|
||||
// Posioned Apple
|
||||
/obj/item/seeds/apple/poisoned
|
||||
|
||||
@@ -9,12 +9,18 @@
|
||||
qdel(item)
|
||||
QDEL_LIST(internal_organs)
|
||||
QDEL_LIST(stomach_contents)
|
||||
QDEL_LIST(processing_patches)
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
if(B)
|
||||
B.leave_host()
|
||||
qdel(B)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/handle_atom_del(atom/A)
|
||||
if(A in processing_patches)
|
||||
processing_patches -= A
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/blob_act(obj/structure/blob/B)
|
||||
if(stat == DEAD)
|
||||
return
|
||||
@@ -920,9 +926,10 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
|
||||
return initial(pixel_y)
|
||||
|
||||
/mob/living/carbon/emp_act(severity)
|
||||
for(var/obj/item/organ/internal/O in internal_organs)
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
for(var/X in internal_organs)
|
||||
var/obj/item/organ/internal/O = X
|
||||
O.emp_act(severity)
|
||||
|
||||
/mob/living/carbon/Stat()
|
||||
..()
|
||||
@@ -1073,8 +1080,9 @@ so that different stomachs can handle things in different ways VB*/
|
||||
if(can_taste_container)
|
||||
taste(toEat.reagents)
|
||||
var/fraction = min(this_bite/toEat.reagents.total_volume, 1)
|
||||
toEat.reagents.reaction(src, toEat.apply_type, fraction)
|
||||
toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency)
|
||||
if(fraction)
|
||||
toEat.reagents.reaction(src, toEat.apply_type, fraction)
|
||||
toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency)
|
||||
|
||||
/mob/living/carbon/get_access()
|
||||
. = ..()
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
gender = MALE
|
||||
pressure_resistance = 15
|
||||
var/list/stomach_contents = list()
|
||||
var/list/processing_patches = list()
|
||||
var/list/internal_organs = list()
|
||||
var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
|
||||
var/antibodies = 0
|
||||
|
||||
@@ -400,7 +400,9 @@
|
||||
var/turf/newloc = G.affecting.loc
|
||||
if(isturf(oldloc) && isturf(newloc))
|
||||
SpinAnimation(5,1)
|
||||
glide_for(6) // This and the glide_for below are purely arbitrary. Pick something that looks aesthetically pleasing.
|
||||
forceMove(newloc)
|
||||
G.glide_for(6)
|
||||
G.affecting.forceMove(oldloc)
|
||||
message = "<B>[src]</B> flips over [G.affecting]!"
|
||||
else
|
||||
|
||||
@@ -206,12 +206,6 @@ emp_act
|
||||
if(martial_art && prob(martial_art.block_chance) && martial_art.can_use(src) && in_throw_mode && !incapacitated(FALSE, TRUE))
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/emp_act(severity)
|
||||
for(var/obj/O in src)
|
||||
if(!O) continue
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) //todo: update this to utilize check_obscured_slots() //and make sure it's check_obscured_slots(TRUE) to stop aciding through visors etc
|
||||
var/list/damaged = list()
|
||||
var/list/inventory_items_to_kill = list()
|
||||
|
||||
@@ -84,6 +84,7 @@
|
||||
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
|
||||
var/remains_type = /obj/effect/decal/remains/human //What sort of remains is left behind when the species dusts
|
||||
var/base_color //Used when setting species.
|
||||
var/list/inherent_factions
|
||||
|
||||
//Used in icon caching.
|
||||
var/race_key = 0
|
||||
@@ -285,11 +286,19 @@
|
||||
H.hud_used.update_locked_slots()
|
||||
H.ventcrawler = ventcrawler
|
||||
|
||||
if(inherent_factions)
|
||||
for(var/i in inherent_factions)
|
||||
H.faction += i //Using +=/-= for this in case you also gain the faction from a different source.
|
||||
|
||||
/datum/species/proc/on_species_loss(mob/living/carbon/human/H)
|
||||
if(H.butcher_results) //clear it out so we don't butcher a actual human.
|
||||
H.butcher_results = null
|
||||
H.ventcrawler = initial(H.ventcrawler)
|
||||
|
||||
if(inherent_factions)
|
||||
for(var/i in inherent_factions)
|
||||
H.faction -= i
|
||||
|
||||
/datum/species/proc/updatespeciescolor(mob/living/carbon/human/H) //Handles changing icobase for species that have multiple skin colors.
|
||||
return
|
||||
|
||||
|
||||
@@ -108,13 +108,4 @@
|
||||
|
||||
/datum/species/diona/pod //Same name and everything; we want the same limitations on them; we just want their regeneration to kick in at all times and them to have special factions
|
||||
pod = TRUE
|
||||
|
||||
/datum/species/diona/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
. = ..()
|
||||
C.faction |= "plants"
|
||||
C.faction |= "vines"
|
||||
|
||||
/datum/species/diona/pod/on_species_loss(mob/living/carbon/C)
|
||||
. = ..()
|
||||
C.faction -= "plants"
|
||||
C.faction -= "vines"
|
||||
inherent_factions = list("plants", "vines")
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
icobase = 'icons/mob/human_races/r_shadow.dmi'
|
||||
deform = 'icons/mob/human_races/r_shadow.dmi'
|
||||
dangerous_existence = TRUE
|
||||
inherent_factions = list("faithless")
|
||||
|
||||
unarmed_type = /datum/unarmed_attack/claws
|
||||
|
||||
@@ -49,14 +50,12 @@
|
||||
if(grant_vision_toggle)
|
||||
vision_toggle = new
|
||||
vision_toggle.Grant(H)
|
||||
H.faction |= "faithless"
|
||||
|
||||
/datum/species/shadow/on_species_loss(mob/living/carbon/human/H)
|
||||
..()
|
||||
if(grant_vision_toggle && vision_toggle)
|
||||
H.vision_type = null
|
||||
vision_toggle.Remove(H)
|
||||
H.faction -= "faithless"
|
||||
|
||||
/datum/species/shadow/handle_life(mob/living/carbon/human/H)
|
||||
var/light_amount = 0
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
icobase = 'icons/mob/human_races/r_slime.dmi'
|
||||
deform = 'icons/mob/human_races/r_slime.dmi'
|
||||
remains_type = /obj/effect/decal/remains/slime
|
||||
inherent_factions = list("slime")
|
||||
|
||||
// More sensitive to the cold
|
||||
cold_level_1 = 280
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
for(var/obj/item/organ/internal/O in internal_organs)
|
||||
O.on_life()
|
||||
|
||||
handle_patches()
|
||||
handle_changeling()
|
||||
handle_wetness(times_fired)
|
||||
|
||||
@@ -438,3 +439,22 @@
|
||||
overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity)
|
||||
else
|
||||
clear_fullscreen("brute")
|
||||
|
||||
/mob/living/carbon/proc/handle_patches()
|
||||
if(LAZYLEN(processing_patches))
|
||||
var/multiple_patch_multiplier = processing_patches.len > 1 ? (processing_patches.len * 1.5) : 1
|
||||
var/applied_amount = 0.35 * multiple_patch_multiplier
|
||||
|
||||
for(var/patch in processing_patches)
|
||||
var/obj/item/reagent_containers/food/pill/patch/P = patch
|
||||
|
||||
if(P.reagents && P.reagents.total_volume)
|
||||
var/fractional_applied_amount = applied_amount / P.reagents.total_volume
|
||||
P.reagents.reaction(src, REAGENT_TOUCH, fractional_applied_amount, P.needs_to_apply_reagents)
|
||||
P.needs_to_apply_reagents = FALSE
|
||||
P.reagents.trans_to(src, applied_amount * 0.5)
|
||||
P.reagents.remove_any(applied_amount * 0.5)
|
||||
else
|
||||
if(!P.reagents || P.reagents.total_volume <= 0)
|
||||
processing_patches -= P
|
||||
qdel(P)
|
||||
|
||||
@@ -406,6 +406,8 @@
|
||||
QDEL_LIST(C.reagents.addiction_list)
|
||||
C.reagents.addiction_threshold_accumulated.Cut()
|
||||
|
||||
QDEL_LIST(C.processing_patches)
|
||||
|
||||
// rejuvenate: Called by `revive` to get the mob into a revivable state
|
||||
// the admin "rejuvenate" command calls `revive`, not this proc.
|
||||
/mob/living/proc/rejuvenate()
|
||||
@@ -511,7 +513,7 @@
|
||||
|
||||
return
|
||||
|
||||
/mob/living/Move(atom/newloc, direct)
|
||||
/mob/living/Move(atom/newloc, direct, movetime)
|
||||
if(buckled && buckled.loc != newloc) //not updating position
|
||||
if(!buckled.anchored)
|
||||
return buckled.Move(newloc, direct)
|
||||
@@ -544,7 +546,7 @@
|
||||
var/mob/living/M = pulling
|
||||
if(M.lying && !M.buckled && (prob(M.getBruteLoss() * 200 / M.maxHealth)))
|
||||
M.makeTrail(T)
|
||||
pulling.Move(T, get_dir(pulling, T)) // the pullee tries to reach our previous position
|
||||
pulling.Move(T, get_dir(pulling, T), movetime) // the pullee tries to reach our previous position
|
||||
if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up
|
||||
stop_pulling()
|
||||
|
||||
|
||||
@@ -73,10 +73,9 @@
|
||||
return shock_damage
|
||||
|
||||
/mob/living/emp_act(severity)
|
||||
var/list/L = src.get_contents()
|
||||
for(var/obj/O in L)
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
for(var/obj/O in contents)
|
||||
O.emp_act(severity)
|
||||
|
||||
/obj/item/proc/get_volume_by_throwforce_and_or_w_class()
|
||||
if(throwforce && w_class)
|
||||
|
||||
@@ -571,13 +571,13 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/ai/emp_act(severity)
|
||||
..()
|
||||
if(prob(30))
|
||||
switch(pick(1,2))
|
||||
if(1)
|
||||
view_core()
|
||||
if(2)
|
||||
ai_call_shuttle()
|
||||
..()
|
||||
|
||||
/mob/living/silicon/ai/ex_act(severity)
|
||||
..()
|
||||
|
||||
@@ -137,9 +137,9 @@
|
||||
..()
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/emp_act()
|
||||
..()
|
||||
if(cham_proj)
|
||||
cham_proj.disrupt(src)
|
||||
..()
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/bullet_act()
|
||||
if(cham_proj)
|
||||
|
||||
@@ -76,17 +76,17 @@
|
||||
return FALSE //So borgs they don't die trying to fix wiring
|
||||
|
||||
/mob/living/silicon/emp_act(severity)
|
||||
..()
|
||||
switch(severity)
|
||||
if(1)
|
||||
src.take_organ_damage(20)
|
||||
take_organ_damage(20)
|
||||
Stun(8)
|
||||
if(2)
|
||||
src.take_organ_damage(10)
|
||||
take_organ_damage(10)
|
||||
Stun(3)
|
||||
flash_eyes(affect_silicon = 1)
|
||||
to_chat(src, "<span class='danger'>*BZZZT*</span>")
|
||||
to_chat(src, "<span class='warning'>Warning: Electromagnetic pulse detected.</span>")
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0)
|
||||
|
||||
@@ -495,7 +495,7 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
if(!path)
|
||||
return 0
|
||||
if(path.len > 1)
|
||||
step_towards(src, path[1])
|
||||
Move(path[1], get_dir(src, path[1]), BOT_STEP_DELAY)
|
||||
if(get_turf(src) == path[1]) //Successful move
|
||||
increment_path()
|
||||
tries = 0
|
||||
|
||||
@@ -25,23 +25,23 @@
|
||||
var/list/human_overlays = list()
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/Life(seconds, times_fired)
|
||||
if(!is_zombie && isturf(src.loc) && stat != DEAD)
|
||||
for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile
|
||||
if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD))
|
||||
Zombify(H)
|
||||
break
|
||||
var/cycles = 4
|
||||
if(cycles >= 4)
|
||||
for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile
|
||||
if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD))
|
||||
visible_message("<span class='danger'>[src] consumes [target] whole!</span>")
|
||||
if(health < maxHealth)
|
||||
health += 10
|
||||
qdel(K)
|
||||
break
|
||||
cycles = 0
|
||||
cycles++
|
||||
..()
|
||||
if(..())
|
||||
if(!is_zombie && isturf(src.loc))
|
||||
for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile
|
||||
if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD))
|
||||
Zombify(H)
|
||||
break
|
||||
var/cycles = 4
|
||||
if(cycles >= 4)
|
||||
for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile
|
||||
if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD))
|
||||
visible_message("<span class='danger'>[src] consumes [target] whole!</span>")
|
||||
if(health < maxHealth)
|
||||
health += 10
|
||||
qdel(K)
|
||||
break
|
||||
cycles = 0
|
||||
cycles++
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A)
|
||||
if(check_friendly_fire)
|
||||
|
||||
@@ -314,7 +314,7 @@
|
||||
|
||||
for(var/mob/living/L in view(7,src))
|
||||
|
||||
if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs
|
||||
if(L.stat == DEAD) // Ignore dead mobs
|
||||
continue
|
||||
|
||||
if(L in Friends) // No eating friends!
|
||||
|
||||
@@ -964,8 +964,8 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
|
||||
for(var/obj/effect/proc_holder/spell/S in mind.spell_list)
|
||||
add_spell_to_statpanel(S)
|
||||
|
||||
|
||||
if(is_admin(src))
|
||||
// Allow admins + PR reviewers to VIEW the panel. Doesnt mean they can click things.
|
||||
if(is_admin(src) || check_rights(R_VIEWRUNTIMES, FALSE))
|
||||
if(statpanel("MC")) //looking at that panel
|
||||
var/turf/T = get_turf(client.eye)
|
||||
stat("Location:", COORD(T))
|
||||
|
||||
@@ -143,8 +143,10 @@
|
||||
move_delay = world.time
|
||||
mob.last_movement = world.time
|
||||
|
||||
delay = TICKS2DS(-round(-(DS2TICKS(delay)))) //Rounded to the next tick in equivalent ds
|
||||
|
||||
if(locate(/obj/item/grab, mob))
|
||||
move_delay = max(move_delay, world.time + 7)
|
||||
delay += 7
|
||||
var/list/L = mob.ret_grab()
|
||||
if(istype(L, /list))
|
||||
if(L.len == 2)
|
||||
@@ -153,14 +155,14 @@
|
||||
if(M)
|
||||
if((get_dist(mob, M) <= 1 || M.loc == mob.loc))
|
||||
var/turf/prev_loc = mob.loc
|
||||
. = ..()
|
||||
. = mob.SelfMove(n, direct, delay)
|
||||
if(M && isturf(M.loc)) // Mob may get deleted during parent call
|
||||
var/diag = get_dir(mob, M)
|
||||
if((diag - 1) & diag)
|
||||
else
|
||||
diag = null
|
||||
if((get_dist(mob, M) > 1 || diag))
|
||||
step(M, get_dir(M.loc, prev_loc))
|
||||
M.Move(prev_loc, get_dir(M.loc, prev_loc), delay)
|
||||
else
|
||||
for(var/mob/M in L)
|
||||
M.other_mobs = 1
|
||||
@@ -168,12 +170,10 @@
|
||||
M.animate_movement = 3
|
||||
for(var/mob/M in L)
|
||||
spawn(0)
|
||||
step(M, direct)
|
||||
return
|
||||
M.Move(get_step(M,direct), direct, delay)
|
||||
spawn(1)
|
||||
M.other_mobs = null
|
||||
M.animate_movement = 2
|
||||
return
|
||||
|
||||
else if(mob.confused)
|
||||
var/newdir = 0
|
||||
@@ -186,11 +186,8 @@
|
||||
if(newdir)
|
||||
direct = newdir
|
||||
n = get_step(mob, direct)
|
||||
|
||||
delay = TICKS2DS(-round(-(DS2TICKS(delay)))) //Rounded to the next tick in equivalent ds
|
||||
mob.glide_size = world.icon_size/max(DS2TICKS(delay),1) //Down to whatever decimal
|
||||
|
||||
. = ..()
|
||||
. = mob.SelfMove(n, direct, delay)
|
||||
mob.setDir(direct)
|
||||
|
||||
if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully
|
||||
@@ -214,8 +211,8 @@
|
||||
O.on_mob_move(direct, mob)
|
||||
|
||||
|
||||
|
||||
|
||||
/mob/proc/SelfMove(turf/n, direct, movetime)
|
||||
return Move(n, direct, movetime)
|
||||
|
||||
///Process_Grab()
|
||||
///Called by client/Move()
|
||||
|
||||
@@ -7,6 +7,12 @@
|
||||
pressure_resistance = 2
|
||||
resistance_flags = FLAMMABLE
|
||||
|
||||
/obj/item/folder/emp_act(severity)
|
||||
..()
|
||||
for(var/i in contents)
|
||||
var/atom/A = i
|
||||
A.emp_act(severity)
|
||||
|
||||
/obj/item/folder/blue
|
||||
desc = "A blue folder."
|
||||
icon_state = "folder_blue"
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
to_chat(user, "<span class='warning'>You know better than to violate the security of The Den, best wait until you leave to use [src].</span>")
|
||||
return
|
||||
else
|
||||
no_den_usage = 0
|
||||
no_den_usage = FALSE
|
||||
zap_self(user)
|
||||
else
|
||||
..()
|
||||
@@ -118,7 +118,7 @@
|
||||
ammo_type = /obj/item/ammo_casing/magic/teleport
|
||||
icon_state = "telewand"
|
||||
max_charges = 10 //10, 5, 5, 4
|
||||
no_den_usage = 1
|
||||
no_den_usage = TRUE
|
||||
fire_sound = 'sound/magic/wand_teleport.ogg'
|
||||
|
||||
/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user)
|
||||
@@ -140,6 +140,7 @@
|
||||
fire_sound = 'sound/magic/staff_door.ogg'
|
||||
icon_state = "doorwand"
|
||||
max_charges = 20 //20, 10, 10, 7
|
||||
no_den_usage = TRUE
|
||||
|
||||
/obj/item/gun/magic/wand/door/zap_self(mob/living/user)
|
||||
to_chat(user, "<span class='notice'>You feel vaguely more open with your feelings.</span>")
|
||||
|
||||
@@ -94,25 +94,29 @@
|
||||
user.visible_message("[usr] draws back the string of [src]!","[src] clunks as you draw the string to its maximum tension!!")
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/throw/crossbow/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/stock_parts/cell))
|
||||
if(!cell)
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
cell = W
|
||||
to_chat(user, "<span class='notice'>You jam [cell] into [src] and wire it to the firing coil.</span>")
|
||||
process_chamber()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] already has a cell installed.</span>")
|
||||
else if(istype(W, /obj/item/screwdriver))
|
||||
if(cell)
|
||||
cell.loc = get_turf(src)
|
||||
to_chat(user, "<span class='notice'>You jimmy [cell] out of [src] with [W].</span>")
|
||||
cell = null
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] doesn't have a cell installed.</span>")
|
||||
else
|
||||
..()
|
||||
/obj/item/gun/throw/crossbow/attackby(obj/item/I, mob/user, params)
|
||||
if(!istype(I, /obj/item/stock_parts/cell))
|
||||
return ..()
|
||||
|
||||
if(cell)
|
||||
to_chat(user, "<span class='notice'>[src] already has a cell installed.</span>")
|
||||
return
|
||||
|
||||
user.drop_item()
|
||||
I.forceMove(src)
|
||||
cell = I
|
||||
to_chat(user, "<span class='notice'>You jam [cell] into [src] and wire it to the firing coil.</span>")
|
||||
process_chamber()
|
||||
|
||||
/obj/item/gun/throw/crossbow/screwdriver_act(mob/user, obj/item/I)
|
||||
. = ..()
|
||||
if(!cell)
|
||||
to_chat(user, "<span class='notice'>[src] doesn't have a cell installed.</span>")
|
||||
return
|
||||
|
||||
cell.forceMove(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You jimmy [cell] out of [src] with [I].</span>")
|
||||
cell = null
|
||||
|
||||
/obj/item/gun/throw/crossbow/verb/set_tension()
|
||||
set name = "Adjust Tension"
|
||||
|
||||
@@ -8,13 +8,19 @@
|
||||
var/maximum_volume = 100
|
||||
var/atom/my_atom = null
|
||||
var/chem_temp = T20C
|
||||
var/temperature_min = 0
|
||||
var/temperature_max = 10000
|
||||
var/list/datum/reagent/addiction_list = new/list()
|
||||
var/list/addiction_threshold_accumulated = new/list()
|
||||
var/flags
|
||||
var/list/reagents_generated_per_cycle = new/list()
|
||||
|
||||
/datum/reagents/New(maximum = 100)
|
||||
/datum/reagents/New(maximum = 100, temperature_minimum, temperature_maximum)
|
||||
maximum_volume = maximum
|
||||
if(temperature_minimum)
|
||||
temperature_min = temperature_minimum
|
||||
if(temperature_maximum)
|
||||
temperature_max = temperature_maximum
|
||||
if(!(flags & REAGENT_NOREACT))
|
||||
START_PROCESSING(SSobj, src)
|
||||
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
|
||||
@@ -179,7 +185,7 @@
|
||||
return amount
|
||||
|
||||
/datum/reagents/proc/set_reagent_temp(new_temp = T0C, react = TRUE)
|
||||
chem_temp = new_temp
|
||||
chem_temp = Clamp(new_temp, temperature_min, temperature_max)
|
||||
if(react)
|
||||
temperature_react()
|
||||
handle_reactions()
|
||||
@@ -197,7 +203,7 @@
|
||||
else if(exposed_temperature < chem_temp)
|
||||
chem_temp -= change
|
||||
|
||||
chem_temp = max(min(chem_temp, 10000), 0) //Cap for the moment.
|
||||
chem_temp = max(min(chem_temp, temperature_max), temperature_min) //Cap for the moment.
|
||||
temperature_react()
|
||||
|
||||
handle_reactions()
|
||||
@@ -569,7 +575,7 @@
|
||||
can_process = 1
|
||||
return can_process
|
||||
|
||||
/datum/reagents/proc/reaction(atom/A, method = REAGENT_TOUCH, volume_modifier = 1)
|
||||
/datum/reagents/proc/reaction(atom/A, method = REAGENT_TOUCH, volume_modifier = 1, show_message = TRUE)
|
||||
var/react_type
|
||||
if(isliving(A))
|
||||
react_type = "LIVING"
|
||||
@@ -614,7 +620,7 @@
|
||||
var/check = reaction_check(A, R)
|
||||
if(!check)
|
||||
continue
|
||||
R.reaction_mob(A, method, R.volume * volume_modifier)
|
||||
R.reaction_mob(A, method, R.volume * volume_modifier, show_message)
|
||||
if("TURF")
|
||||
R.reaction_turf(A, R.volume * volume_modifier)
|
||||
if("OBJ")
|
||||
@@ -632,7 +638,7 @@
|
||||
if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
|
||||
if(amount <= 0)
|
||||
return 0
|
||||
chem_temp = (chem_temp * total_volume + reagtemp * amount) / (total_volume + amount) //equalize with new chems
|
||||
chem_temp = Clamp((chem_temp * total_volume + reagtemp * amount) / (total_volume + amount), temperature_min, temperature_max) //equalize with new chems
|
||||
|
||||
for(var/A in reagent_list)
|
||||
|
||||
@@ -870,8 +876,8 @@
|
||||
|
||||
// Convenience proc to create a reagents holder for an atom
|
||||
// Max vol is maximum volume of holder
|
||||
/atom/proc/create_reagents(max_vol)
|
||||
reagents = new/datum/reagents(max_vol)
|
||||
/atom/proc/create_reagents(max_vol, temperature_minimum, temperature_maximum)
|
||||
reagents = new /datum/reagents(max_vol, temperature_minimum, temperature_maximum)
|
||||
reagents.my_atom = src
|
||||
|
||||
/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents
|
||||
|
||||
@@ -347,8 +347,8 @@
|
||||
if(count > 20)
|
||||
count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines?
|
||||
var/amount_per_patch = reagents.total_volume/count
|
||||
if(amount_per_patch > 40)
|
||||
amount_per_patch = 40
|
||||
if(amount_per_patch > 30)
|
||||
amount_per_patch = 30
|
||||
var/name = clean_input("Name:", "Name your patch!", "[reagents.get_master_reagent_name()] ([amount_per_patch]u)")
|
||||
if(!name)
|
||||
return
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
/datum/reagent/proc/reaction_temperature(exposed_temperature, exposed_volume) //By default we do nothing.
|
||||
return
|
||||
|
||||
/datum/reagent/proc/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
|
||||
/datum/reagent/proc/reaction_mob(mob/living/M, method = REAGENT_TOUCH, volume, show_message = TRUE) //Some reagents transfer on touch, others don't; dependent on if they penetrate the skin or not.
|
||||
if(holder) //for catching rare runtimes
|
||||
if(method == REAGENT_TOUCH && penetrates_skin)
|
||||
var/block = M.get_permeability_protection()
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/total_depletion_rate = (metabolization_rate / M.metabolism_efficiency) * M.digestion_ratio // Cache it
|
||||
|
||||
handle_addiction(M, total_depletion_rate)
|
||||
|
||||
sate_addiction(M)
|
||||
holder.remove_reagent(id, total_depletion_rate) //medicine reagents stay longer if you have a better metabolism
|
||||
return STATUS_UPDATE_NONE
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
id = "silver_sulfadiazine"
|
||||
description = "This antibacterial compound is used to treat burn victims."
|
||||
reagent_state = LIQUID
|
||||
color = "#F0C814"
|
||||
color = "#F0DC00"
|
||||
metabolization_rate = 3
|
||||
harmless = FALSE //toxic if ingested, and I am NOT going to account for the difference
|
||||
taste_description = "burn cream"
|
||||
@@ -205,7 +205,7 @@
|
||||
id = "styptic_powder"
|
||||
description = "Styptic (aluminum sulfate) powder helps control bleeding and heal physical wounds."
|
||||
reagent_state = LIQUID
|
||||
color = "#C8A5DC"
|
||||
color = "#FF9696"
|
||||
metabolization_rate = 3
|
||||
harmless = FALSE
|
||||
taste_description = "wound cream"
|
||||
@@ -221,7 +221,7 @@
|
||||
M.adjustBruteLoss(-volume)
|
||||
if(show_message)
|
||||
to_chat(M, "<span class='notice'>The styptic powder stings like hell as it closes some of your wounds!</span>")
|
||||
M.emote("scream")
|
||||
M.emote("scream")
|
||||
if(method == REAGENT_INGEST)
|
||||
M.adjustToxLoss(0.5*volume)
|
||||
if(show_message)
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
var/spawned_disease = null
|
||||
var/disease_amount = 20
|
||||
var/has_lid = FALSE // Used for containers where we want to put lids on and off
|
||||
var/temperature_min = 0 // To limit the temperature of a reagent container can atain when exposed to heat/cold
|
||||
var/temperature_max = 10000
|
||||
|
||||
/obj/item/reagent_containers/verb/set_APTFT() //set amount_per_transfer_from_this
|
||||
set name = "Set transfer amount"
|
||||
@@ -30,7 +32,7 @@
|
||||
..()
|
||||
if(!possible_transfer_amounts)
|
||||
verbs -= /obj/item/reagent_containers/verb/set_APTFT
|
||||
create_reagents(volume)
|
||||
create_reagents(volume, temperature_min, temperature_max)
|
||||
if(spawned_disease)
|
||||
var/datum/disease/F = new spawned_disease(0)
|
||||
var/list/data = list("viruses" = list(F), "blood_color" = "#A10808")
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
/obj/item/reagent_containers/applicator
|
||||
name = "auto-mender"
|
||||
desc = "A small electronic device designed to topically apply healing chemicals."
|
||||
icon = 'icons/goonstation/objects/objects.dmi'
|
||||
icon_state = "mender"
|
||||
item_state = "mender"
|
||||
volume = 200
|
||||
resistance_flags = ACID_PROOF
|
||||
container_type = REFILLABLE | AMOUNT_VISIBLE
|
||||
temperature_min = 270
|
||||
temperature_max = 350
|
||||
var/ignore_flags = FALSE
|
||||
var/emagged = FALSE
|
||||
var/applied_amount = 8 // How much it applies
|
||||
var/applying = FALSE // So it can't be spammed.
|
||||
var/measured_health = 0 // Used for measuring health; we don't want this to stop applying once the person's health isn't changing.
|
||||
|
||||
/obj/item/reagent_containers/applicator/emag_act(mob/user)
|
||||
if(!emagged)
|
||||
emagged = TRUE
|
||||
ignore_flags = TRUE
|
||||
to_chat(user, "<span class='warning'>You short out the safeties on [src].</span>")
|
||||
|
||||
/obj/item/reagent_containers/applicator/on_reagent_change()
|
||||
if(!emagged)
|
||||
var/found_forbidden_reagent = FALSE
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
if(!GLOB.safe_chem_applicator_list.Find(R.id))
|
||||
reagents.del_reagent(R.id)
|
||||
found_forbidden_reagent = TRUE
|
||||
if(found_forbidden_reagent)
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='warning'>[src] identifies and removes a harmful substance.</span>")
|
||||
else
|
||||
visible_message("<span class='warning'>[src] identifies and removes a harmful substance.</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/reagent_containers/applicator/update_icon()
|
||||
cut_overlays()
|
||||
|
||||
if(reagents.total_volume)
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/goonstation/objects/objects.dmi', "mender-fluid")
|
||||
filling.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(filling)
|
||||
|
||||
/obj/item/reagent_containers/applicator/attack(mob/living/M, mob/user)
|
||||
if(!reagents.total_volume)
|
||||
to_chat(user, "<span class='warning'>[src] is empty!</span>")
|
||||
return
|
||||
if(applying)
|
||||
to_chat(user, "<span class='warning'>You're already applying [src].</span>")
|
||||
return
|
||||
if(!iscarbon(M))
|
||||
return
|
||||
|
||||
if(ignore_flags || M.can_inject(user, TRUE))
|
||||
if(M == user)
|
||||
M.visible_message("[user] begins mending [user.p_them()]self with [src].", "<span class='notice'>You begin mending yourself with [src].</span>")
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] begins mending [M] with [src].</span>", "<span class='notice'>You begin mending [M] with [src].</span>")
|
||||
if(M.reagents)
|
||||
applying = TRUE
|
||||
icon_state = "mender-active"
|
||||
apply_to(M, user, 0.2) // We apply a very weak application up front, then loop.
|
||||
while(do_after(user, 10, target = M))
|
||||
measured_health = M.health
|
||||
apply_to(M, user, 1, FALSE)
|
||||
if((measured_health == M.health) || !reagents.total_volume)
|
||||
to_chat(user, "<span class='notice'>[M] is finished healing and [src] powers down automatically.</span>")
|
||||
break
|
||||
applying = FALSE
|
||||
icon_state = "mender"
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
|
||||
|
||||
/obj/item/reagent_containers/applicator/proc/apply_to(mob/living/carbon/M, mob/user, multiplier = 1, show_message = TRUE)
|
||||
var/total_applied_amount = applied_amount * multiplier
|
||||
|
||||
if(reagents && reagents.total_volume)
|
||||
var/list/injected = list()
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
injected += R.name
|
||||
|
||||
var/contained = english_list(injected)
|
||||
// allow normal logging only if reagents are not harmless and automender is emagged
|
||||
add_attack_logs(user, M, "Automends with [src] containing ([contained])", (emagged && !(reagents.harmless_helper())) ? null : ATKLOG_ALMOSTALL)
|
||||
|
||||
var/fractional_applied_amount = total_applied_amount / reagents.total_volume
|
||||
|
||||
reagents.reaction(M, REAGENT_TOUCH, fractional_applied_amount, show_message)
|
||||
reagents.trans_to(M, total_applied_amount * 0.5)
|
||||
reagents.remove_any(total_applied_amount * 0.5)
|
||||
|
||||
playsound(get_turf(src), pick('sound/goonstation/items/mender.ogg', 'sound/goonstation/items/mender2.ogg'), 50, 1)
|
||||
|
||||
/obj/item/reagent_containers/applicator/brute
|
||||
name = "brute auto-mender"
|
||||
list_reagents = list("styptic_powder" = 200)
|
||||
|
||||
/obj/item/reagent_containers/applicator/burn
|
||||
name = "burn auto-mender"
|
||||
list_reagents = list("silver_sulfadiazine" = 200)
|
||||
|
||||
/obj/item/reagent_containers/applicator/dual
|
||||
name = "dual auto-mender"
|
||||
list_reagents = list("synthflesh" = 200)
|
||||
@@ -5,10 +5,24 @@
|
||||
icon_state = "bandaid"
|
||||
item_state = "bandaid"
|
||||
possible_transfer_amounts = null
|
||||
volume = 40
|
||||
volume = 30
|
||||
apply_type = REAGENT_TOUCH
|
||||
apply_method = "apply"
|
||||
transfer_efficiency = 0.5 //patches aren't as effective at getting chemicals into the bloodstream.
|
||||
temperature_min = 270
|
||||
temperature_max = 350
|
||||
var/needs_to_apply_reagents = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/pill/patch/attack(mob/living/carbon/M, mob/user, def_zone)
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
bitesize = 0
|
||||
if(M.eat(src, user))
|
||||
user.drop_item()
|
||||
forceMove(M)
|
||||
M.processing_patches += src
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/pill/patch/afterattack(obj/target, mob/user , proximity)
|
||||
return // thanks inheritance again
|
||||
@@ -18,29 +32,37 @@
|
||||
desc = "Helps with brute injuries."
|
||||
icon_state = "bandaid_brute"
|
||||
instant_application = 1
|
||||
list_reagents = list("styptic_powder" = 40)
|
||||
list_reagents = list("styptic_powder" = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/pill/patch/styptic/small
|
||||
name = "healing mini-patch"
|
||||
list_reagents = list("styptic_powder" = 15)
|
||||
|
||||
/obj/item/reagent_containers/food/pill/patch/silver_sulf
|
||||
name = "burn patch"
|
||||
desc = "Helps with burn injuries."
|
||||
icon_state = "bandaid_burn"
|
||||
instant_application = 1
|
||||
list_reagents = list("silver_sulfadiazine" = 40)
|
||||
list_reagents = list("silver_sulfadiazine" = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/pill/patch/silver_sulf/small
|
||||
name = "burn mini-patch"
|
||||
list_reagents = list("silver_sulfadiazine" = 15)
|
||||
|
||||
/obj/item/reagent_containers/food/pill/patch/synthflesh
|
||||
name = "synthflesh patch"
|
||||
desc = "Helps with brute and burn injuries."
|
||||
icon_state = "bandaid_med"
|
||||
instant_application = 1
|
||||
list_reagents = list("synthflesh" = 20)
|
||||
list_reagents = list("synthflesh" = 10)
|
||||
|
||||
/obj/item/reagent_containers/food/pill/patch/nicotine
|
||||
name = "nicotine patch"
|
||||
desc = "Helps temporarily curb the cravings of nicotine dependency."
|
||||
list_reagents = list("nicotine" = 20)
|
||||
list_reagents = list("nicotine" = 10)
|
||||
|
||||
/obj/item/reagent_containers/food/pill/patch/jestosterone
|
||||
name = "jestosterone patch"
|
||||
desc = "Helps with brute injuries if the affected person is a clown, otherwise inflicts various annoying effects."
|
||||
icon_state = "bandaid_clown"
|
||||
list_reagents = list("jestosterone" = 30)
|
||||
list_reagents = list("jestosterone" = 20)
|
||||
|
||||
@@ -95,6 +95,12 @@
|
||||
CHECK_TICK
|
||||
..()
|
||||
|
||||
/obj/item/smallDelivery/emp_act(severity)
|
||||
..()
|
||||
for(var/i in contents)
|
||||
var/atom/A = i
|
||||
A.emp_act(severity)
|
||||
|
||||
/obj/item/smallDelivery/attack_self(mob/user as mob)
|
||||
if(wrapped && wrapped.loc) //sometimes items can disappear. For example, bombs. --rastaf0
|
||||
wrapped.loc = user.loc
|
||||
|
||||
@@ -607,6 +607,14 @@
|
||||
build_path = /obj/item/reagent_containers/hypospray/safety
|
||||
category = list("initial", "Medical")
|
||||
|
||||
/datum/design/automender
|
||||
name = "Auto-mender"
|
||||
id = "automender"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 1000, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/reagent_containers/applicator
|
||||
category = list("initial", "Medical")
|
||||
|
||||
/datum/design/prox_sensor
|
||||
name = "Proximity Sensor"
|
||||
id = "prox_sensor"
|
||||
@@ -914,4 +922,3 @@
|
||||
materials = list(MAT_METAL = 40000)
|
||||
build_path = /obj/item/golem_shell
|
||||
category = list("Imported")
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
/obj/item/grenade/chem_grenade/cryo = 5,
|
||||
/obj/item/grenade/chem_grenade/adv_release = 5,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/holywater = 1)
|
||||
product_slogans = "It's not pyromania if you're getting paid!;You smell that? Plasma, son. Nothing else in the world smells like that.;I love the smell of Plasma in the morning."
|
||||
slogan_list = list("It's not pyromania if you're getting paid!","You smell that? Plasma, son. Nothing else in the world smells like that.","I love the smell of Plasma in the morning.")
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
// Spawners
|
||||
|
||||
@@ -6,6 +6,14 @@
|
||||
resistance_flags = INDESTRUCTIBLE
|
||||
flags = NODECONSTRUCT
|
||||
|
||||
/obj/machinery/computer/shuttle/ert/Topic(href, href_list)
|
||||
if(href_list["move"])
|
||||
var/authorized_roles = list(SPECIAL_ROLE_ERT, SPECIAL_ROLE_DEATHSQUAD)
|
||||
if(!((usr.mind.assigned_role in authorized_roles) || is_admin(usr)))
|
||||
message_admins("Potential ERT shuttle hijack, ERT shuttle moved by unauthorized user: [key_name_admin(usr)]")
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/ert
|
||||
name = "specops navigation computer"
|
||||
desc = "Used to designate a precise transit location for the specops shuttle."
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
GLOBAL_LIST_EMPTY(GPS_list)
|
||||
/obj/item/gps
|
||||
name = "global positioning system"
|
||||
name = "default gps"
|
||||
desc = "Helping lost spacemen find their way through the planets since 2016."
|
||||
icon = 'icons/obj/telescience.dmi'
|
||||
icon_state = "gps-c"
|
||||
@@ -16,7 +16,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
|
||||
/obj/item/gps/New()
|
||||
..()
|
||||
GLOB.GPS_list.Add(src)
|
||||
name = "global positioning system ([gpstag])"
|
||||
if(name == "default gps") //use default naming scheme
|
||||
name = "global positioning system ([gpstag])"
|
||||
overlays += "working"
|
||||
|
||||
/obj/item/gps/Destroy()
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
bed = null
|
||||
. = ..()
|
||||
if(bed && get_dist(oldloc, loc) <= 2)
|
||||
bed.Move(oldloc)
|
||||
bed.Move(oldloc, get_dir(bed, oldloc), (last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay))
|
||||
bed.dir = Dir
|
||||
if(bed.has_buckled_mobs())
|
||||
for(var/m in bed.buckled_mobs)
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
origin_tech = "materials=3;engineering=4"
|
||||
|
||||
/obj/vehicle/janicart/Move(atom/OldLoc, Dir)
|
||||
..()
|
||||
. = ..()
|
||||
if(floorbuffer)
|
||||
var/turf/tile = loc
|
||||
if(isturf(tile))
|
||||
|
||||
@@ -153,7 +153,8 @@
|
||||
unbuckle_mob(user)
|
||||
return
|
||||
|
||||
if(world.time < last_vehicle_move + ((last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay)))
|
||||
var/delay = (last_move_diagonal? 2 : 1) * (vehicle_move_delay + config.human_delay)
|
||||
if(world.time < last_vehicle_move + delay)
|
||||
return
|
||||
last_vehicle_move = world.time
|
||||
|
||||
@@ -161,7 +162,7 @@
|
||||
var/turf/next = get_step(src, direction)
|
||||
if(!Process_Spacemove(direction) || !isturf(loc))
|
||||
return
|
||||
step(src, direction)
|
||||
Move(get_step(src, direction), direction, delay)
|
||||
|
||||
if((direction & (direction - 1)) && (loc == next)) //moved diagonally
|
||||
last_move_diagonal = TRUE
|
||||
@@ -185,7 +186,7 @@
|
||||
to_chat(user, "<span class='warning'>You'll need the keys in one of your hands to drive [src].</span>")
|
||||
|
||||
|
||||
/obj/vehicle/Move(NewLoc, Dir = 0, step_x = 0, step_y = 0)
|
||||
/obj/vehicle/Move(NewLoc, Dir = 0, movetime)
|
||||
. = ..()
|
||||
handle_vehicle_layer()
|
||||
handle_vehicle_offsets()
|
||||
|
||||
Reference in New Issue
Block a user