Merge branch 'master' into tcomms-overhaul

This commit is contained in:
AffectedArc07
2020-05-22 18:51:44 +01:00
205 changed files with 16108 additions and 15035 deletions
+4 -4
View File
@@ -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
View File
@@ -68,7 +68,6 @@ GLOBAL_LIST_INIT(admin_verbs_admin, list(
/client/proc/empty_ai_core_toggle_latejoin,
/client/proc/aooc,
/client/proc/freeze,
/client/proc/freezemecha,
/client/proc/alt_check,
/client/proc/secrets,
/client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */
+67 -89
View File
@@ -5,121 +5,99 @@
//////Allows admin's to right click on any mob/mech and freeze them in place.///
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
GLOBAL_LIST_EMPTY(frozen_mob_list)
/client/proc/freeze(var/mob/living/M as mob in GLOB.mob_list)
GLOBAL_LIST_EMPTY(frozen_atom_list) // A list of admin-frozen atoms.
/client/proc/freeze(atom/movable/M)
set name = "Freeze"
set category = null
if(!check_rights(R_ADMIN))
return
if(!istype(M))
return
M.admin_Freeze(src)
if(M in GLOB.frozen_mob_list)
M.admin_unFreeze(src)
else
M.admin_Freeze(src)
/// Created here as a base proc. Override as needed for any type of object or mob you want able to be frozen.
/atom/movable/proc/admin_Freeze(client/admin)
to_chat(admin, "<span class='warning'>Freeze is not able to be called on this type of object.</span")
return
///mob freeze procs
/mob/living/var/frozen = null //used for preventing attacks on admin-frozen mobs
/mob/living/var/admin_prev_sleeping = 0 //used for keeping track of previous sleeping value with admin freeze
/mob/living
/// Used for preventing attacks on admin-frozen mobs.
var/frozen = null
/// Used for keeping track of previous sleeping value with admin freeze.
var/admin_prev_sleeping = 0
/mob/living/proc/admin_Freeze(client/admin, skip_overlays = FALSE)
if(istype(admin))
to_chat(src, "<b><font color= red>You have been frozen by [admin]</b></font>")
message_admins("<span class='notice'>[key_name_admin(admin)]</span> froze [key_name_admin(src)]")
log_admin("[key_name(admin)] froze [key_name(src)]")
/mob/living/admin_Freeze(client/admin, skip_overlays = FALSE, mech = null)
if(!istype(admin))
return
var/obj/effect/overlay/adminoverlay/AO = new
if(skip_overlays)
overlays += AO
if(!(src in GLOB.frozen_atom_list))
GLOB.frozen_atom_list += src
anchored = TRUE
canmove = FALSE
admin_prev_sleeping = sleeping
AdjustSleeping(20000)
frozen = AO
if(!(src in GLOB.frozen_mob_list))
GLOB.frozen_mob_list += src
var/obj/effect/overlay/adminoverlay/AO = new
if(skip_overlays)
overlays += AO
/mob/living/proc/admin_unFreeze(client/admin, skip_overlays = FALSE)
if(istype(admin))
to_chat(src, "<b><font color= red>You have been unfrozen by [admin]</b></font>")
message_admins("<span class='notice'>[key_name_admin(admin)] unfroze [key_name_admin(src)]</span>")
log_admin("[key_name(admin)] unfroze [key_name(src)]")
anchored = TRUE
canmove = FALSE
admin_prev_sleeping = sleeping
AdjustSleeping(20000)
frozen = AO
if(skip_overlays)
overlays -= frozen
else
GLOB.frozen_atom_list -= src
anchored = FALSE
canmove = TRUE
frozen = null
SetSleeping(admin_prev_sleeping)
admin_prev_sleeping = null
if(src in GLOB.frozen_mob_list)
GLOB.frozen_mob_list -= src
if(skip_overlays)
overlays -= frozen
anchored = FALSE
canmove = TRUE
frozen = null
SetSleeping(admin_prev_sleeping)
admin_prev_sleeping = null
to_chat(src, "<b><font color= red>You have been [frozen ? "frozen" : "unfrozen"] by [admin]</b></font>")
message_admins("<span class='notice'>[key_name_admin(admin)] [frozen ? "froze" : "unfroze"] [key_name_admin(src)] [mech ? "in a [mech]" : ""]</span>")
log_admin("[key_name(admin)] [frozen ? "froze" : "unfroze"] [key_name(src)] [mech ? "in a [mech]" : ""]")
update_icons()
return frozen
/mob/living/simple_animal/slime/admin_Freeze(admin)
..(admin)
adjustHealth(1000) //arbitrary large value
/mob/living/simple_animal/slime/admin_unFreeze(admin)
..(admin)
revive()
if(..()) // The result of the parent call here will be the value of the mob's `frozen` variable after they get (un)frozen.
adjustHealth(1000) //arbitrary large value
else
revive()
/mob/living/simple_animal/var/admin_prev_health = null
/mob/living/simple_animal/admin_Freeze(admin)
..(admin)
admin_prev_health = health
health = 0
/mob/living/simple_animal/admin_unFreeze(admin)
..(admin)
revive()
overlays.Cut()
if(..()) // The result of the parent call here will be the value of the mob's `frozen` variable after they get (un)frozen.
admin_prev_health = health
health = 0
else
revive()
overlays.Cut()
//////////////////////////Freeze Mech
/client/proc/freezemecha(var/obj/mecha/O as obj in GLOB.mechas_list)
set name = "Freeze Mech"
set category = null
if(!check_rights(R_ADMIN))
return
var/obj/mecha/M = O
if(!istype(M,/obj/mecha))
to_chat(src, "<span class='danger'>This can only be used on mechs!</span>")
return
/obj/mecha/admin_Freeze(client/admin)
var/obj/effect/overlay/adminoverlay/freeze_overlay = new
if(!frozen)
GLOB.frozen_atom_list += src
frozen = TRUE
overlays += freeze_overlay
else
if(usr)
if(usr.client)
if(usr.client.holder)
var/adminomaly = new/obj/effect/overlay/adminoverlay
if(M.can_move == 1)
M.can_move = 0
M.overlays += adminomaly
if(M.occupant)
to_chat(M.occupant, "<b><font color= red>You have been frozen by <a href='?priv_msg=[usr.client.UID()]'>[key]</a></b></font>")
message_admins("<span class='notice'>[key_name_admin(usr)] froze [key_name(M.occupant)] in a [M.name]</span>")
log_admin("[key_name(usr)] froze [key_name(M.occupant)] in a [M.name]")
else
message_admins("<span class='notice'>[key_name_admin(usr)] froze an empty [M.name]</span>")
log_admin("[key_name(usr)] froze an empty [M.name]")
else if(M.can_move == 0)
M.can_move = 1
M.overlays -= adminomaly
if(M.occupant)
to_chat(M.occupant, "<b><font color= red>You have been unfrozen by <a href='?priv_msg=[usr.client.UID()]'>[key]</a></b></font>")
message_admins("<span class='notice'>[key_name_admin(usr)] unfroze [key_name(M.occupant)] in a [M.name]</span>")
log_admin("[key_name(usr)] unfroze [key_name(M.occupant)] in a [M.name]")
else
message_admins("<span class='notice'>[key_name_admin(usr)] unfroze an empty [M.name]</span>")
log_admin("[key_name(usr)] unfroze an empty [M.name]")
GLOB.frozen_atom_list -= src
frozen = FALSE
overlays -= freeze_overlay
if(occupant)
occupant.admin_Freeze(admin, mech = name) // We also want to freeze the driver of the mech.
else
message_admins("<span class='notice'>[key_name_admin(admin)] [frozen ? "froze" : "unfroze"] an empty [name]</span>")
log_admin("[key_name(admin)] [frozen ? "froze" : "unfroze"] an empty [name]")
@@ -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)
-7
View File
@@ -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//
///////////////
+6 -24
View File
@@ -373,13 +373,11 @@
send_resources()
if(prefs.toggles & UI_DARKMODE) // activates dark mode if its flagged. -AA07
if(establish_db_connection())
activate_darkmode()
activate_darkmode()
else
// activate_darkmode() calls the CL update button proc, so we dont want it double called
SSchangelog.UpdatePlayerChangelogButton(src)
if(prefs.lastchangelog != GLOB.changelog_hash) //bolds the changelog button on the interface so we know there are updates. -CP
if(establish_db_connection())
to_chat(src, "<span class='info'>Changelog has changed since your last visit.</span>")
update_changelog_button()
if(prefs.toggles & DISABLE_KARMA) // activates if karma is disabled
if(establish_db_connection())
@@ -825,7 +823,7 @@
// IF YOU CHANGE ANYTHING IN ACTIVATE, MAKE SURE IT HAS A DEACTIVATE METHOD, -AA07
/client/proc/activate_darkmode()
///// BUTTONS /////
update_changelog_button()
SSchangelog.UpdatePlayerChangelogButton(src)
/* Rpane */
winset(src, "rpane.textb", "background-color=#40628a;text-color=#FFFFFF")
winset(src, "rpane.infob", "background-color=#40628a;text-color=#FFFFFF")
@@ -857,7 +855,7 @@
/client/proc/deactivate_darkmode()
///// BUTTONS /////
update_changelog_button()
SSchangelog.UpdatePlayerChangelogButton(src)
/* Rpane */
winset(src, "rpane.textb", "background-color=none;text-color=#000000")
winset(src, "rpane.infob", "background-color=none;text-color=#000000")
@@ -887,22 +885,6 @@
///// NOTIFY USER /////
to_chat(src, "<span class='notice'>Darkmode Disabled</span>") // what a sick fuck
// Better changelog button handling
/client/proc/update_changelog_button()
if(establish_db_connection())
if(prefs.lastchangelog != GLOB.changelog_hash)
winset(src, "rpane.changelog", "background-color=#bb7700;text-color=#FFFFFF;font-style=bold")
else
if(prefs.toggles & UI_DARKMODE)
winset(src, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF")
else
winset(src, "rpane.changelog", "background-color=none;text-color=#000000")
else
if(prefs.toggles & UI_DARKMODE)
winset(src, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF")
else
winset(src, "rpane.changelog", "background-color=none;text-color=#000000")
/client/proc/generate_clickcatcher()
if(!void)
void = new()
@@ -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
@@ -79,7 +79,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
var/last_id
//game-preferences
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
var/lastchangelog = "1" //Saved changlog timestamp (unix epoch) to detect if there was a change. Dont set this to 0 unless you want the last changelog date to be 4x longer than the expected lifespan of the universe.
var/exp
var/ooccolor = "#b82e00"
var/list/be_special = list() //Special role selection
@@ -491,18 +491,3 @@
load_character(C,pick(saves))
return 1
/datum/preferences/proc/SetChangelog(client/C,hash)
lastchangelog=hash
var/datum/preferences/P = GLOB.preferences_datums[C.ckey]
if(P.toggles & UI_DARKMODE)
winset(C, "rpane.changelog", "background-color=#40628a;font-color=#ffffff;font-style=none")
else
winset(C, "rpane.changelog", "background-color=none;font-style=none")
var/DBQuery/query = GLOB.dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastchangelog='[lastchangelog]' WHERE ckey='[C.ckey]'")
if(!query.Execute())
var/err = query.ErrorMsg()
log_game("SQL ERROR during lastchangelog updating. Error : \[[err]\]\n")
message_admins("SQL ERROR during lastchangelog updating. Error : \[[err]\]\n")
to_chat(C, "Couldn't update your last seen changelog, please try again later.")
return
return 1
+6
View File
@@ -152,6 +152,12 @@
item_state = "mime"
resistance_flags = FLAMMABLE
/obj/item/clothing/mask/gas/mime/wizard
name = "magical mime mask"
desc = "A mime mask glowing with power. Its eyes gaze deep into your soul."
flags_inv = HIDEEARS | HIDEEYES
magical = TRUE
/obj/item/clothing/mask/gas/mime/nodrop
flags = NODROP
@@ -259,3 +259,14 @@
desc = "A plasmaman envirohelm designed for the blueshield."
icon_state = "bs_envirohelm"
item_state = "bs_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/wizard
name = "wizard plasma envirosuit helmet"
desc = "A magical plasmaman containment helmet designed to spread chaos in safety and comfort."
icon_state = "wizard_envirohelm"
item_state = "wizard_envirohelm"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
magical = TRUE
+1 -1
View File
@@ -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)
+24 -2
View File
@@ -24,7 +24,6 @@
icon_state = "blackwizard"
dog_fashion = null
/obj/item/clothing/head/wizard/clown
name = "purple wizard hat"
desc = "Strange-looking purple hat-wear that most certainly belongs to a real magic user."
@@ -32,6 +31,18 @@
item_state = "wizhatclown" // cheating
dog_fashion = null
/obj/item/clothing/head/wizard/mime
name = "magical beret"
desc = "A magical red beret."
icon_state = "wizhatmime"
item_state = "wizhatmime"
dog_fashion = null
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Drask" = 'icons/mob/species/drask/head.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/head/wizard/fake
name = "wizard hat"
desc = "It has WIZZARD written across it in sequins. Comes with a cool beard."
@@ -91,11 +102,22 @@
item_state = "blackwizrobe"
/obj/item/clothing/suit/wizrobe/clown
name = "Clown Robe"
name = "clown robe"
desc = "A set of armoured robes that seem to radiate a dark power. That, and bad fashion decisions."
icon_state = "wizzclown"
item_state = "wizzclown"
/obj/item/clothing/suit/wizrobe/mime
name = "mime robe"
desc = "Red, black, and white robes. There is not much else to say about them."
icon_state = "wizzmime"
item_state = "wizzmime"
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Drask" = 'icons/mob/species/drask/suit.dmi',
"Grey" = 'icons/mob/species/grey/suit.dmi'
)
/obj/item/clothing/suit/wizrobe/marisa
name = "Witch Robe"
desc = "Magic is all about the spell power, ZE!"
@@ -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)
@@ -0,0 +1,6 @@
/obj/item/clothing/under/plasmaman/wizard
name = "wizard plasma envirosuit"
desc = "An envirosuit for plasmamen designed by the Wizard Federation. Still not spaceworthy..."
icon_state = "wizard_envirosuit"
item_state = "wizard_envirosuit"
item_color = "wizard_envirosuit"
+8
View File
@@ -182,3 +182,11 @@
user.put_in_hands(T)
to_chat(user, "<span class='notice'>You open [src]\'s shell, revealing \a [T].</span>")
qdel(src)
// Diona Nymphs can eat these as well as weeds to gain nutrition.
/obj/item/reagent_containers/food/snacks/grown/attack_animal(mob/living/simple_animal/M)
if(isnymph(M))
var/mob/living/simple_animal/diona/D = M
D.consume(src)
else
return ..()
+1 -1
View File
@@ -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
+7 -16
View File
@@ -43,12 +43,10 @@
light_range = source_atom.light_range
light_color = source_atom.light_color
parse_light_color()
PARSE_LIGHT_COLOR(src)
update()
return ..()
/datum/light_source/Destroy(force)
remove_lum()
if(source_atom)
@@ -94,17 +92,6 @@
/datum/light_source/proc/vis_update()
EFFECT_UPDATE(LIGHTING_VIS_UPDATE)
// Decompile the hexadecimal colour into lumcounts of each perspective.
/datum/light_source/proc/parse_light_color()
if(light_color)
lum_r = GetRedPart (light_color) / 255
lum_g = GetGreenPart (light_color) / 255
lum_b = GetBluePart (light_color) / 255
else
lum_r = 1
lum_g = 1
lum_b = 1
// Macro that applies light to a new corner.
// It is a macro in the interest of speed, yet not having to copy paste it.
// If you're wondering what's with the backslashes, the backslashes cause BYOND to not automatically end the line.
@@ -212,7 +199,7 @@
if(source_atom.light_color != light_color)
light_color = source_atom.light_color
parse_light_color()
PARSE_LIGHT_COLOR(src)
update = TRUE
else if(applied_lum_r != lum_r || applied_lum_g != lum_g || applied_lum_b != lum_b)
@@ -233,7 +220,11 @@
var/oldlum = source_turf.luminosity
source_turf.luminosity = CEILING(light_range, 1)
for(T in view(CEILING(light_range, 1), source_turf))
for (thing in T.get_corners(source_turf))
if((!IS_DYNAMIC_LIGHTING(T) && !T.light_sources) || T.has_opaque_atom)
continue
if(!T.lighting_corners_initialised)
T.generate_missing_corners()
for(thing in T.corners)
C = thing
corners[C] = 0
turfs += T
-11
View File
@@ -110,16 +110,6 @@
else
lighting_clear_overlay()
/turf/proc/get_corners()
if(!IS_DYNAMIC_LIGHTING(src) && !light_sources)
return null
if(!lighting_corners_initialised)
generate_missing_corners()
if(has_opaque_atom)
return null // Since this proc gets used in a for loop, null won't be looped though.
return corners
/turf/proc/generate_missing_corners()
if(!IS_DYNAMIC_LIGHTING(src) && !light_sources)
return
@@ -132,4 +122,3 @@
continue
corners[i] = new/datum/lighting_corner(src, GLOB.LIGHTING_CORNER_DIAGONAL[i])
+3 -2
View File
@@ -926,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()
..()
@@ -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()
+3 -1
View File
@@ -810,7 +810,9 @@
handle_organs()
if(getBrainLoss() >= 120 || (health + (getOxyLoss() / 2)) <= -500)
var/guaranteed_death_threshold = health + (getOxyLoss() * 0.5) - (getFireLoss() * 0.67) - (getBruteLoss() * 0.67)
if(getBrainLoss() >= 120 || (guaranteed_death_threshold) <= -500)
death()
return
@@ -273,8 +273,6 @@
if(H.status_flags & GOTTAGOFAST)
. -= 1
if(H.status_flags & GOTTAGOFAST_METH)
. -= 1
return .
/datum/species/proc/on_species_gain(mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment.
@@ -1290,15 +1290,12 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
apply_overlay(MISC_LAYER)
/mob/living/carbon/human/admin_Freeze(client/admin, skip_overlays = TRUE)
. = ..()
overlays_standing[FROZEN_LAYER] = mutable_appearance(frozen, layer = -FROZEN_LAYER)
apply_overlay(FROZEN_LAYER)
/mob/living/carbon/human/admin_unFreeze(client/admin, skip_overlays = TRUE)
. = ..()
remove_overlay(FROZEN_LAYER)
/mob/living/carbon/human/admin_Freeze(client/admin, skip_overlays = TRUE, mech = null)
if(..())
overlays_standing[FROZEN_LAYER] = mutable_appearance(frozen, layer = -FROZEN_LAYER)
apply_overlay(FROZEN_LAYER)
else
remove_overlay(FROZEN_LAYER)
/mob/living/carbon/human/proc/force_update_limbs()
for(var/obj/item/organ/external/O in bodyparts)
+2 -3
View File
@@ -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)
@@ -28,7 +28,6 @@
var/on_fire = 0 //The "Are we on fire?" var
var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20
var/implanting = 0 //Used for the mind-slave implant
var/floating = 0
var/mob_size = MOB_SIZE_HUMAN
var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
@@ -61,7 +60,6 @@
var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message"
var/list/emote_log = list() //like say_log but for emotes
var/list/recent_tastes = list()
var/blood_volume = 0 //how much blood the mob has
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
+1 -1
View File
@@ -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)
+3 -3
View File
@@ -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)
@@ -202,6 +202,20 @@
qdel(src)
return TRUE
// Consumes plant matter other than weeds to evolve
/mob/living/simple_animal/diona/proc/consume(obj/item/reagent_containers/food/snacks/grown/G)
if(nutrition >= nutrition_need) // Prevents griefing by overeating plant items without evolving.
to_chat(src, "<span class='warning'>You're too full to consume this! Perhaps it's time to grow bigger...</span>")
else
if(do_after_once(src, 20, target = G))
visible_message("[src] ravenously consumes [G].", "You ravenously devour [G].")
playsound(loc, 'sound/items/eatfood.ogg', 30, 0, frequency = 1.5)
if(G.reagents.get_reagent_amount("nutriment") + G.reagents.get_reagent_amount("plantmatter") < 1)
adjust_nutrition(2)
else
adjust_nutrition((G.reagents.get_reagent_amount("nutriment") + G.reagents.get_reagent_amount("plantmatter")) * 2)
qdel(G)
/mob/living/simple_animal/diona/proc/steal_blood()
if(stat != CONSCIOUS)
return FALSE
@@ -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)
-6
View File
@@ -44,7 +44,6 @@
var/memory = ""
var/next_move = null
var/notransform = null //Carbon
var/other = 0.0
var/hand = null
var/real_name = null
var/flavor_text = ""
@@ -63,12 +62,10 @@
var/name_archive //For admin things like possession
var/timeofdeath = 0.0//Living
var/cpr_time = 1.0//Carbon
var/bodytemperature = 310.055 //98.7 F
var/flying = 0
var/charges = 0.0
var/nutrition = NUTRITION_LEVEL_FED + 50 //Carbon
var/satiety = 0 //Carbon
var/hunger_drain = HUNGER_FACTOR // how quickly the mob gets hungry; largely utilized by species.
@@ -91,8 +88,6 @@
var/obj/item/storage/s_active = null//Carbon
var/obj/item/clothing/mask/wear_mask = null//Carbon
var/seer = 0 //for cult//Carbon, probably Human
var/datum/hud/hud_used = null
hud_possible = list(SPECIALROLE_HUD)
@@ -168,7 +163,6 @@
var/remote_view = 0 // Set to 1 to prevent view resets on Life
var/obj/control_object //Used by admins to possess objects. All mobs should have this var
var/datum/visibility_interface/visibility_interface = null // used by the visibility system to provide an interface for the visibility networks
//Whether or not mobs can understand other mobtypes. These stay in /mob so that ghosts can hear everything.
var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE
+6
View File
@@ -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"
+4 -7
View File
@@ -87,6 +87,7 @@
popup.set_content(data)
if(!stars)
popup.add_script("marked.js", 'html/browser/marked.js')
popup.add_script("marked-paradise.js", 'html/browser/marked-paradise.js')
popup.add_head_content("<title>[name]</title>")
popup.open()
return data
@@ -562,10 +563,6 @@
name = "paper- 'Holodeck Disclaimer'"
info = "Brusies sustained in the holodeck can be healed simply by sleeping."
/obj/item/paper/spells
name = "paper- 'List of Available Spells (READ)'"
info = "<p><b>LIST OF SPELLS AVAILABLE</b></p><p>Magic Missile:<br>This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.</p><p>Fireball:<br>This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you.</p><p>Disintegrate:</br>This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.</p><p>Disable Technology:<br>This spell disables all weapons, cameras and most other technology in range.</p><p>Smoke:<br>This spell spawns a cloud of choking smoke at your location and does not require wizard garb.</p><p>Blind:<br>This spell temporarly blinds a single person and does not require wizard garb.<p>Forcewall:<br>This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb.</p><p>Blink:<br>This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.</p><p>Teleport:<br>This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.</p><p>Mutate:<br>This spell causes you to turn into a hulk, and gain telekinesis for a short while.</p><p>Ethereal Jaunt:<br>This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.</p><p>Knock:<br>This spell opens nearby doors and does not require wizard garb.</p>"
/obj/item/paper/syndimemo
name = "paper- 'Memo'"
info = "GET DAT FUKKEN DISK"
@@ -589,17 +586,17 @@
/obj/item/paper/crumpled
name = "paper scrap"
icon_state = "scrap"
/obj/item/paper/syndicate
name = "paper"
header = "<p><img style='display: block; margin-left: auto; margin-right: auto;' src='syndielogo.png' width='220' height='135' /></p><hr />"
info = ""
/obj/item/paper/nanotrasen
name = "paper"
header = "<p><img style='display: block; margin-left: auto; margin-right: auto;' src='ntlogo.png' width='220' height='135' /></p><hr />"
info = ""
/obj/item/paper/central_command
name = "paper"
header ="<p><img style='display: block; margin-left: auto; margin-right: auto;' src='ntlogo.png' alt='' width='220' height='135' /></p><hr /><h3 style='text-align: center;font-family: Verdana;'><b> Nanotrasen Central Command</h3><p style='text-align: center;font-family:Verdana;'>Official Expedited Memorandum</p></b><hr />"
+3 -3
View File
@@ -15,12 +15,12 @@
var/flags
var/list/reagents_generated_per_cycle = new/list()
/datum/reagents/New(maximum = 100, temperature_minimum, temperature_maxixmum)
/datum/reagents/New(maximum = 100, temperature_minimum, temperature_maximum)
maximum_volume = maximum
if(temperature_minimum)
temperature_min = temperature_minimum
if(temperature_maxixmum)
temperature_max = temperature_maxixmum
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. >_>
@@ -322,13 +322,13 @@
update_flags |= M.AdjustWeakened(-2.5, FALSE)
update_flags |= M.adjustStaminaLoss(-2, FALSE)
update_flags |= M.SetSleeping(0, FALSE)
M.status_flags |= GOTTAGOFAST_METH
M.status_flags |= GOTTAGOFAST
if(prob(50))
update_flags |= M.adjustBrainLoss(1, FALSE)
return ..() | update_flags
/datum/reagent/methamphetamine/on_mob_delete(mob/living/M)
M.status_flags &= ~GOTTAGOFAST_METH
M.status_flags &= ~GOTTAGOFAST
..()
/datum/reagent/methamphetamine/overdose_process(mob/living/M, severity)
@@ -684,7 +684,7 @@
update_flags |= M.AdjustStunned(-2, FALSE)
update_flags |= M.AdjustWeakened(-2, FALSE)
update_flags |= M.adjustStaminaLoss(-2, FALSE)
M.status_flags |= GOTTAGOFAST_METH
M.status_flags |= GOTTAGOFAST
M.Jitter(3)
update_flags |= M.adjustBrainLoss(0.5, FALSE)
if(prob(5))
@@ -692,7 +692,7 @@
return ..() | update_flags
/datum/reagent/lube/ultra/on_mob_delete(mob/living/M)
M.status_flags &= ~GOTTAGOFAST_METH
M.status_flags &= ~GOTTAGOFAST
..()
/datum/reagent/lube/ultra/overdose_process(mob/living/M, severity)
@@ -1,3 +1,4 @@
#define BORGHYPO_REFILL_VALUE 5
/obj/item/reagent_containers/borghypo
name = "Cyborg Hypospray"
@@ -46,18 +47,21 @@
/obj/item/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg
charge_tick++
if(charge_tick < recharge_time) return 0
if(charge_tick < recharge_time)
return FALSE
charge_tick = 0
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc
if(R && R.cell)
var/datum/reagents/RG = reagent_list[mode]
if(RG.total_volume < RG.maximum_volume) //Don't recharge reagents and drain power if the storage is full.
R.cell.use(charge_cost) //Take power from borg...
RG.add_reagent(reagent_ids[mode], 5) //And fill hypo with reagent.
if(!refill_borghypo(RG, reagent_ids[mode], R)) //If the storage is not full recharge reagents and drain power.
for(var/i in 1 to reagent_list.len) //if active mode is full loop through the list and fill the first one that is not full
RG = reagent_list[i]
if(refill_borghypo(RG, reagent_ids[i], R))
break
//update_icon()
return 1
return TRUE
// Use this to add more chemicals for the borghypo to produce.
/obj/item/reagent_containers/borghypo/proc/add_reagent(reagent)
@@ -69,6 +73,13 @@
var/datum/reagents/R = reagent_list[reagent_list.len]
R.add_reagent(reagent, 30)
/obj/item/reagent_containers/borghypo/proc/refill_borghypo(datum/reagents/RG, reagent_id, mob/living/silicon/robot/R)
if(RG.total_volume < RG.maximum_volume)
RG.add_reagent(reagent_id, BORGHYPO_REFILL_VALUE)
R.cell.use(charge_cost)
return TRUE
return FALSE
/obj/item/reagent_containers/borghypo/attack(mob/living/carbon/human/M, mob/user)
var/datum/reagents/R = reagent_list[mode]
if(!R.total_volume)
@@ -114,3 +125,5 @@
if(empty)
. += "<span class='notice'>It is currently empty. Allow some time for the internal syntheszier to produce more.</span>"
#undef BORGHYPO_REFILL_VALUE
@@ -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
+8
View File
@@ -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
View File
@@ -215,6 +215,7 @@
playsound(src, 'sound/machines/bsa_fire.ogg', 100, 1)
message_admins("[key_name_admin(user)] has launched an artillery strike.")
log_admin("[key_name(user)] has launched an artillery strike.") // Line below handles logging the explosion to disk
explosion(bullseye,ex_power,ex_power*2,ex_power*4)
reload()
+2
View File
@@ -238,6 +238,8 @@
/obj/item/organ/internal/heart/cybernetic/upgraded/shock_organ(intensity)
if(!ishuman(owner))
return
if(emp_proof)
return
intensity = min(intensity, 100)
var/numHigh = round(intensity / 5)
var/numMid = round(intensity / 10)
+3 -2
View File
@@ -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()