Merge branch 'master' into upstream-merge-26129

This commit is contained in:
LetterJay
2017-04-29 11:45:37 -05:00
committed by GitHub
131 changed files with 1020 additions and 743 deletions
+3 -1
View File
@@ -166,8 +166,10 @@ GLOBAL_LIST_INIT(admin_verbs_debug, AVerbsDebug())
//citadel code
/client/proc/give_humans_genitals,
/client/proc/test_mammal_overlays,
/client/proc/pump_random_event
/client/proc/pump_random_event,
/client/proc/cmd_display_init_log
)
GLOBAL_PROTECT(admin_verbs_possess)
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess,/proc/release))
GLOBAL_PROTECT(admin_verbs_permissions)
+11
View File
@@ -0,0 +1,11 @@
diff a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm (rejected hunks)
@@ -153,7 +153,8 @@ var/list/admin_verbs_debug = list(
/client/proc/clear_dynamic_transit,
/client/proc/toggle_medal_disable,
/client/proc/view_runtimes,
- /client/proc/pump_random_event
+ /client/proc/pump_random_event,
+ /client/proc/cmd_display_init_log
)
var/list/admin_verbs_possess = list(
/proc/possess,
+1 -1
View File
@@ -477,7 +477,7 @@
var/list/new_args = list()
for(var/arg in arguments)
new_args += SDQL_expression(source, arg)
if(object == world) // Global proc.
if(object == GLOB) // Global proc.
procname = "/proc/[procname]"
return WrapAdminProcCall(GLOBAL_PROC, procname, new_args)
return WrapAdminProcCall(object, procname, new_args)
+1 -1
View File
@@ -591,7 +591,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]"
for(var/admin in admin_keys)
if(LAZYLEN(admin_keys) > 1)
if(LAZYLEN(message) > 1)
message += ", [admin]"
else
message += "[admin]"
+7
View File
@@ -721,6 +721,13 @@ GLOBAL_PROTECT(AdminProcCall)
usr << browse(dat, "window=dellog")
/client/proc/cmd_display_init_log()
set category = "Debug"
set name = "Display Initialzie() Log"
set desc = "Displays a list of things that didn't handle Initialize() properly"
usr << browse(replacetext(SSatoms.InitLog(), "\n", "<br>"), "window=initlog")
/client/proc/debug_huds(i as num)
set category = "Debug"
set name = "Debug HUDs"
+5 -1
View File
@@ -505,7 +505,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(src)] has changed Central Command's name to [input]")
log_admin("[key_name(src)] has changed the Central Command name to: [input]")
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in world)
/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world)
set category = "Admin"
set name = "Delete"
@@ -523,6 +523,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
else
qdel(O)
T.ChangeTurf(T.baseturf)
else
qdel(D)
/client/proc/cmd_admin_list_open_jobs()
set category = "Admin"
set name = "Manage Job Slots"
@@ -662,7 +662,7 @@
playsound(src.loc, W.usesound, 50, 1)
if (do_after(user, 20*W.toolspeed, target = src))
if (buildstage == 1)
user <<"<span class='notice'>You remove the air alarm electronics.</span>"
to_chat(user, "<span class='notice'>You remove the air alarm electronics.</span>")
new /obj/item/weapon/electronics/airalarm( src.loc )
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
buildstage = 0
+20 -8
View File
@@ -172,7 +172,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
//DEFINITIONS FOR ASSET DATUMS START HERE.
/datum/asset/simple/tgui
assets = list(
"tgui.css" = 'tgui/assets/tgui.css',
@@ -208,13 +207,6 @@ GLOBAL_LIST_EMPTY(asset_datums)
"sig_none.gif" = 'icons/program_icons/sig_none.gif',
)
/datum/asset/simple/pda
assets = list(
"pda_atmos.png" = 'icons/pda_icons/pda_atmos.png',
@@ -267,6 +259,26 @@ GLOBAL_LIST_EMPTY(asset_datums)
"jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js'
)
/datum/asset/simple/changelog
assets = list(
"88x31.png" = 'html/88x31.png',
"bug-minus.png" = 'html/bug-minus.png',
"cross-circle.png" = 'html/cross-circle.png',
"hard-hat-exclamation.png" = 'html/hard-hat-exclamation.png',
"image-minus.png" = 'html/image-minus.png',
"image-plus.png" = 'html/image-plus.png',
"music-minus.png" = 'html/music-minus.png',
"music-plus.png" = 'html/music-plus.png',
"tick-circle.png" = 'html/tick-circle.png',
"wrench-screwdriver.png" = 'html/wrench-screwdriver.png',
"spell-check.png" = 'html/spell-check.png',
"burn-exclamation.png" = 'html/burn-exclamation.png',
"chevron.png" = 'html/chevron.png',
"chevron-expand.png" = 'html/chevron-expand.png',
"scales.png" = 'html/scales.png',
"changelog.css" = 'html/changelog.css'
)
//Registers HTML Interface assets.
/datum/asset/HTML_interface/register()
for(var/path in typesof(/datum/html_interface))
+1 -2
View File
@@ -455,8 +455,7 @@
if(v in blacklisted_vars)
continue
vars[v] = initial(vars[v])
if(chambered.BB)
qdel(chambered.BB)
QDEL_NULL(chambered.BB)
chambered.newshot()
/obj/item/weapon/gun/energy/laser/chameleon/proc/set_chameleon_ammo(obj/item/ammo_casing/AC, passthrough = TRUE, reset = FALSE)
+1 -1
View File
@@ -224,5 +224,5 @@
to_chat(user, "<span class='warning'>The rune can only be used on battlemage armour!</span>")
return
W.current_charges += 8
user <<"<span class='notice'>You charge \the [W]. It can now absorb [W.current_charges] hits.</span>"
to_chat(user, "<span class='notice'>You charge \the [W]. It can now absorb [W.current_charges] hits.</span>")
qdel(src)
@@ -416,8 +416,8 @@
/datum/chemical_reaction/bananahonk
name = "Banana Honk"
id = "bananahonk"
results = list("bananahonk" = 3)
required_reagents = list("banana" = 1, "cream" = 1, "sugar" = 1)
results = list("bananahonk" = 2)
required_reagents = list("laughter" = 1, "cream" = 1)
/datum/chemical_reaction/silencer
name = "Silencer"
@@ -542,9 +542,9 @@
results = list("chocolate_milk" = 2)
required_reagents = list("milk" = 1, "cocoa" = 1)
mix_message = "The color changes as the mixture blends smoothly."
/datum/chemical_reaction/eggnog
name = "eggnog"
id = "eggnog"
results = list("eggnog" = 15)
required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5)
required_reagents = list("rum" = 5, "cream" = 5, "eggyolk" = 5)
+42 -42
View File
@@ -45,52 +45,52 @@
var/list/effects = list()
var/last_change = 0
/obj/machinery/computer/holodeck/Initialize(mapload)
. = mapload //late-initialize, area_copy need turfs to have air
if(!mapload)
..()
..()
return INITIALIZE_HINT_LATELOAD
if(ispath(holodeck_type,/area))
var/list/possible = get_areas(holodeck_type,subtypes = FALSE)
linked = pop(possible)
if(ispath(offline_program,/area))
var/list/possible = get_areas(offline_program,subtypes = FALSE)
offline_program = pop(possible)
// the following is necessary for power reasons
if(!linked || !offline_program)
log_world("No matching holodeck area found")
qdel(src)
return
var/area/AS = get_area(src)
if(istype(AS,/area/holodeck))
log_world("### MAPPING ERROR")
log_world("Holodeck computer cannot be in a holodeck.")
log_world("This would cause circular power dependency.")
qdel(src) // todo handle constructed computers
return //l-lewd...
else
linked.linked = src // todo detect multiple/constructed computers
/obj/machinery/computer/holodeck/LateInitialize()
if(ispath(holodeck_type,/area))
var/list/possible = get_areas(holodeck_type,subtypes = FALSE)
linked = pop(possible)
if(ispath(offline_program,/area))
var/list/possible = get_areas(offline_program,subtypes = FALSE)
offline_program = pop(possible)
// the following is necessary for power reasons
if(!linked || !offline_program)
log_world("No matching holodeck area found")
qdel(src)
return
var/area/AS = get_area(src)
if(istype(AS,/area/holodeck))
log_world("### MAPPING ERROR")
log_world("Holodeck computer cannot be in a holodeck.")
log_world("This would cause circular power dependency.")
qdel(src) // todo handle constructed computers
return //l-lewd...
else
linked.linked = src // todo detect multiple/constructed computers
program_cache = list()
emag_programs = list()
for(var/typekey in subtypesof(program_type))
var/area/holodeck/A = locate(typekey)
if(!A || A == offline_program)
continue
if(A.contents.len == 0)
continue // not loaded
if(A.restricted)
emag_programs += A
else
program_cache += A
if(typekey == init_program)
load_program(A,force=1)
if(random_program && program_cache.len && init_program == null)
load_program(pick(program_cache),force=1)
else if(!program)
load_program(offline_program)
program_cache = list()
emag_programs = list()
for(var/typekey in subtypesof(program_type))
var/area/holodeck/A = locate(typekey)
if(!A || A == offline_program)
continue
if(A.contents.len == 0)
continue // not loaded
if(A.restricted)
emag_programs += A
else
program_cache += A
if(typekey == init_program)
load_program(A,force=1)
if(random_program && program_cache.len && init_program == null)
load_program(pick(program_cache),force=1)
else if(!program)
load_program(offline_program)
/obj/machinery/computer/holodeck/power_change()
..()
+47
View File
@@ -0,0 +1,47 @@
diff a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm (rejected hunks)
@@ -64,25 +64,26 @@
..()
/obj/machinery/computer/holodeck/Initialize(mapload)
- . = mapload //late-initialize, area_copy need turfs to have air
- if(!mapload)
- ..()
- program_cache = list()
- emag_programs = list()
- for(var/typekey in subtypesof(program_type))
- var/area/holodeck/A = locate(typekey)
- if(!A || A == offline_program) continue
- if(A.contents.len == 0) continue // not loaded
- if(A.restricted)
- emag_programs += A
- else
- program_cache += A
- if(typekey == init_program)
- load_program(A,force=1)
- if(random_program && program_cache.len && init_program == null)
- load_program(pick(program_cache),force=1)
- else if(!program)
- load_program(offline_program)
+ ..()
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/machinery/computer/holodeck/LateInitialize()
+ program_cache = list()
+ emag_programs = list()
+ for(var/typekey in subtypesof(program_type))
+ var/area/holodeck/A = locate(typekey)
+ if(!A || A == offline_program) continue
+ if(A.contents.len == 0) continue // not loaded
+ if(A.restricted)
+ emag_programs += A
+ else
+ program_cache += A
+ if(typekey == init_program)
+ load_program(A,force=1)
+ if(random_program && program_cache.len && init_program == null)
+ load_program(pick(program_cache),force=1)
+ else if(!program)
+ load_program(offline_program)
/obj/machinery/computer/holodeck/power_change()
..()
+4 -1
View File
@@ -51,7 +51,7 @@
return FALSE
smooth_zlevel(world.maxz)
SortAreas()
repopulate_sorted_areas()
//initialize things that are normally initialized after map load
initTemplateBounds(bounds)
@@ -74,6 +74,9 @@
//initialize things that are normally initialized after map load
initTemplateBounds(bounds)
if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init
repopulate_sorted_areas()
log_game("[name] loaded at at [T.x],[T.y],[T.z]")
return TRUE
+2 -5
View File
@@ -1,9 +1,6 @@
//Dead mobs can exist whenever. This is needful
/mob/dead/New(loc)
..()
if(!initialized)
args[1] = FALSE
Initialize(arglist(args)) //EXIST DAMN YOU!!!
INITIALIZE_IMMEDIATE(/mob/dead)
/mob/dead/dust() //ghosts can't be vaporised.
return
@@ -30,6 +30,7 @@
loc = pick(GLOB.newplayer_start)
else
loc = locate(1,1,1)
return INITIALIZE_HINT_NORMAL
/mob/dead/new_player/proc/new_player_panel()
@@ -48,11 +49,11 @@
output += "<p><a href='byond://?src=\ref[src];observe=1'>Observe</A></p>"
if(!IsGuestKey(src.key))
if (SSdbcore.Connect())
if (SSdbcore.Connect())
var/isadmin = 0
if(src.client && src.client.holder)
isadmin = 1
var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[ckey]\")")
var/datum/DBQuery/query_get_new_polls = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[ckey]\")")
if(!query_get_new_polls.Execute())
return
var/newpoll = 0
@@ -302,7 +303,7 @@
if(!IsJobAvailable(rank))
alert(src, "[rank] is not available. Please try another.")
return 0
if(SSticker.late_join_disabled)
alert(src, "An administrator has disabled late join spawning.")
return FALSE
@@ -0,0 +1,9 @@
diff a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm (rejected hunks)
@@ -30,6 +30,7 @@
loc = pick(newplayer_start)
else
loc = locate(1,1,1)
+ return INITIALIZE_HINT_NORMAL
/mob/dead/new_player/proc/new_player_panel()
+7 -3
View File
@@ -355,9 +355,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!isobserver(usr))
to_chat(usr, "Not when you're not dead!")
return
var/A
A = input("Area to jump to", "BOOYEA", A) as null|anything in GLOB.sortedAreas
var/area/thearea = A
var/list/filtered = list()
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(!A.hidden)
filtered += A
var/area/thearea = input("Area to jump to", "BOOYEA") as null|anything in filtered
if(!thearea)
return
+70 -72
View File
@@ -67,7 +67,7 @@
//Eyes
var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes
//Ears
var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
@@ -497,6 +497,8 @@
var/g = (H.gender == FEMALE) ? "f" : "m"
var/image/I
for(var/layer in relevant_layers)
var/layertext = mutant_bodyparts_layertext(layer)
@@ -561,9 +563,9 @@
S = /datum/sprite_accessory/slimecoon_snout*/
if(!S || S.icon_state == "none")
continue
var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer)
//A little rename so we don't have to use tail_lizard or tail_human when naming the sprites.
if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail" || bodypart == "slimecoontail" || bodypart == "xenotail")
bodypart = "tail"
@@ -574,11 +576,15 @@
if(bodypart == "xenohead")
bodypart = "xhead"
var/icon_string
if(S.gender_specific)
accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]"
else
accessory_overlay.icon_state = "m_[bodypart]_[S.icon_state]_[layertext]"
I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
if(S.center)
accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y)
@@ -624,86 +630,78 @@
inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y)
standing += inner_accessory_overlay
if(S.extra) //apply the extra overlay, if there is one
var/mutable_appearance/extra_accessory_overlay = mutable_appearance(S.icon, layer = -layer)
if(S.gender_specific)
extra_accessory_overlay.icon_state = "[g]_[bodypart]_extra_[S.icon_state]_[layertext]"
icon_string = "[g]_[bodypart]_extra_[S.icon_state]_[layertext]"
else
extra_accessory_overlay.icon_state = "m_[bodypart]_extra_[S.icon_state]_[layertext]"
icon_string = "m_[bodypart]_extra_[S.icon_state]_[layertext]"
I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
if(S.center)
extra_accessory_overlay.icon_state = center_image(extra_accessory_overlay, S.dimension_x, S.dimension_y)
if(!forced_colour)
switch(S.extra_color_src) //change the color of the extra overlay
if(MUTCOLORS)
if(fixed_mut_color)
extra_accessory_overlay.color = "#[fixed_mut_color]"
else
extra_accessory_overlay.color = "#[H.dna.features["mcolor"]]"
if(MUTCOLORS2)
if(fixed_mut_color2)
extra_accessory_overlay.color = "#[fixed_mut_color2]"
else
extra_accessory_overlay.color = "#[H.dna.features["mcolor2"]]"
if(MUTCOLORS3)
if(fixed_mut_color3)
extra_accessory_overlay.color = "#[fixed_mut_color3]"
else
extra_accessory_overlay.color = "#[H.dna.features["mcolor3"]]"
if(HAIR)
if(hair_color == "mutcolor")
extra_accessory_overlay.color = "#[H.dna.features["mcolor"]]"
else
extra_accessory_overlay.color = "#[H.hair_color]"
if(FACEHAIR)
extra_accessory_overlay.color = "#[H.facial_hair_color]"
if(EYECOLOR)
extra_accessory_overlay.color = "#[H.eye_color]"
else
extra_accessory_overlay.color = forced_colour
standing += extra_accessory_overlay
I = center_image(I,S.dimension_x,S.dimension_y)
switch(S.extra_color_src) //change the color of the extra overlay
if(MUTCOLORS)
if(fixed_mut_color)
I.color = "#[fixed_mut_color]"
else
I.color = "#[H.dna.features["mcolor"]]"
if(MUTCOLORS2)
if(fixed_mut_color2)
I.color = "#[fixed_mut_color2]"
else
I.color = "#[H.dna.features["mcolor2"]]"
if(MUTCOLORS3)
if(fixed_mut_color3)
I.color = "#[fixed_mut_color3]"
else
I.color = "#[H.dna.features["mcolor3"]]"
if(HAIR)
if(hair_color == "mutcolor")
I.color = "#[H.dna.features["mcolor"]]"
else
I.color = "#[H.hair_color]"
if(FACEHAIR)
I.color = "#[H.facial_hair_color]"
if(EYECOLOR)
I.color = "#[H.eye_color]"
standing += I
if(S.extra2) //apply the extra overlay, if there is one
var/mutable_appearance/extra2_accessory_overlay = mutable_appearance(S.icon, layer = -layer)
if(S.gender_specific)
extra2_accessory_overlay.icon_state = "[g]_[bodypart]_extra2_[S.icon_state]_[layertext]"
icon_string = "[g]_[bodypart]_extra2_[S.icon_state]_[layertext]"
else
extra2_accessory_overlay.icon_state = "m_[bodypart]_extra2_[S.icon_state]_[layertext]"
icon_string = "m_[bodypart]_extra2_[S.icon_state]_[layertext]"
I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
if(S.center)
extra2_accessory_overlay.icon_state = center_image(extra2_accessory_overlay, S.dimension_x, S.dimension_y)
if(!forced_colour)
switch(S.extra_color_src) //change the color of the extra overlay
if(MUTCOLORS)
if(fixed_mut_color)
extra2_accessory_overlay.color = "#[fixed_mut_color]"
else
extra2_accessory_overlay.color = "#[H.dna.features["mcolor"]]"
if(MUTCOLORS2)
if(fixed_mut_color2)
extra2_accessory_overlay.color = "#[fixed_mut_color2]"
else
extra2_accessory_overlay.color = "#[H.dna.features["mcolor2"]]"
if(MUTCOLORS3)
if(fixed_mut_color3)
extra2_accessory_overlay.color = "#[fixed_mut_color3]"
else
extra2_accessory_overlay.color = "#[H.dna.features["mcolor3"]]"
if(HAIR)
if(hair_color == "mutcolor")
extra2_accessory_overlay.color = "#[H.dna.features["mcolor"]]"
else
extra2_accessory_overlay.color = "#[H.hair_color]"
if(FACEHAIR)
extra2_accessory_overlay.color = "#[H.facial_hair_color]"
if(EYECOLOR)
extra2_accessory_overlay.color = "#[H.eye_color]"
else
extra2_accessory_overlay.color = forced_colour
standing += extra2_accessory_overlay
I = center_image(I,S.dimension_x,S.dimension_y)
switch(S.extra2_color_src) //change the color of the extra overlay
if(MUTCOLORS)
if(fixed_mut_color)
I.color = "#[fixed_mut_color]"
else
I.color = "#[H.dna.features["mcolor"]]"
if(MUTCOLORS2)
if(fixed_mut_color2)
I.color = "#[fixed_mut_color2]"
else
I.color = "#[H.dna.features["mcolor2"]]"
if(MUTCOLORS3)
if(fixed_mut_color3)
I.color = "#[fixed_mut_color3]"
else
I.color = "#[H.dna.features["mcolor3"]]"
if(HAIR)
if(hair_color == "mutcolor")
I.color = "#[H.dna.features["mcolor"]]"
else
I.color = "#[H.hair_color]"
standing += I
H.overlays_standing[layer] = standing.Copy()
standing = list()
+2 -2
View File
@@ -238,7 +238,7 @@
else if(icontype == "Angel")
icon_state = "ai-angel"
//else
//usr <<"You can only change your display once!"
//to_chat(usr, "You can only change your display once!")
//return
/mob/living/silicon/ai/Stat()
@@ -351,7 +351,7 @@
if(isAI(usr))
var/mob/living/silicon/ai/AI = src
if(AI.control_disabled)
src << "Wireless control is disabled!"
to_chat(src, "Wireless control is disabled!")
return
SSshuttle.cancelEvac(src)
return
@@ -22,7 +22,7 @@
ventcrawler = VENTCRAWLER_ALWAYS
var/datum/mind/origin
var/egg_lain = 0
gold_core_spawnable = 1 //are you sure about this??
// gold_core_spawnable = 1 //are you sure about this??
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
var/obj/item/organ/body_egg/changeling_egg/egg = new(victim)
@@ -46,7 +46,7 @@ Difficulty: Very Hard
del_on_death = 1
medal_type = MEDAL_PREFIX
score_type = COLOSSUS_SCORE
loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/vocal_cords/colossus)
loot = list(/obj/effect/spawner/lootdrop/anomalous_crystal, /obj/item/organ/vocal_cords/colossus)
butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
deathmessage = "disintegrates, leaving a glowing core in its wake."
death_sound = 'sound/magic/demon_dies.ogg'
@@ -360,9 +360,20 @@ Difficulty: Very Hard
///Anomolous Crystal///
#define ACTIVATE_TOUCH "touch"
#define ACTIVATE_SPEECH "speech"
#define ACTIVATE_HEAT "heat"
#define ACTIVATE_BULLET "bullet"
#define ACTIVATE_ENERGY "energy"
#define ACTIVATE_BOMB "bomb"
#define ACTIVATE_MOB_BUMP "bumping"
#define ACTIVATE_WEAPON "weapon"
#define ACTIVATE_MAGIC "magic"
/obj/machinery/anomalous_crystal
name = "anomalous crystal"
desc = "A strange chunk of crystal, being in the presence of it fills you with equal parts excitement and dread."
var/observer_desc = "Anomalous crystals have descriptions that only observers can see. But this one hasn't been changed from the default."
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "anomaly_crystal"
light_range = 8
@@ -370,66 +381,78 @@ Difficulty: Very Hard
use_power = 0
density = 1
flags = HEAR
var/activation_method = "touch"
var/activation_method
var/list/possible_methods = list(ACTIVATE_TOUCH, ACTIVATE_SPEECH, ACTIVATE_HEAT, ACTIVATE_BULLET, ACTIVATE_ENERGY, ACTIVATE_BOMB, ACTIVATE_MOB_BUMP, ACTIVATE_WEAPON, ACTIVATE_MAGIC)
var/activation_damage_type = null
var/last_use_timer = 0
var/cooldown_add = 30
var/list/affected_targets = list()
var/activation_sound = 'sound/effects/break_stone.ogg'
/obj/machinery/anomalous_crystal/New()
activation_method = pick("touch","laser","bullet","energy","bomb","mob_bump","heat","weapon","speech")
..()
/obj/machinery/anomalous_crystal/Initialize(mapload)
. = ..()
if(!activation_method)
activation_method = pick(possible_methods)
/obj/machinery/anomalous_crystal/examine(mob/user)
. = ..()
if(isobserver(user))
to_chat(user, observer_desc)
to_chat(user, "It is activated by [activation_method].")
/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans)
..()
if(isliving(speaker))
ActivationReaction(speaker,"speech")
ActivationReaction(speaker, ACTIVATE_SPEECH)
/obj/machinery/anomalous_crystal/attack_hand(mob/user)
..()
ActivationReaction(user,"touch")
ActivationReaction(user, ACTIVATE_TOUCH)
/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params)
if(I.is_hot())
ActivationReaction(user,"heat")
ActivationReaction(user, ACTIVATE_HEAT)
else
ActivationReaction(user,"weapon")
ActivationReaction(user, ACTIVATE_WEAPON)
..()
/obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone)
..()
if(istype(P, /obj/item/projectile/magic))
ActivationReaction(P.firer, "magic", P.damage_type)
ActivationReaction(P.firer, ACTIVATE_MAGIC, P.damage_type)
return
ActivationReaction(P.firer, P.flag, P.damage_type)
/obj/machinery/anomalous_crystal/proc/ActivationReaction(mob/user, method, damtype)
if(world.time < last_use_timer)
return 0
return FALSE
if(activation_damage_type && activation_damage_type != damtype)
return 0
return FALSE
if(method != activation_method)
return 0
return FALSE
last_use_timer = (world.time + cooldown_add)
playsound(user, activation_sound, 100, 1)
return 1
return TRUE
/obj/machinery/anomalous_crystal/Bumped(atom/AM as mob|obj)
..()
if(ismob(AM))
ActivationReaction(AM,"mob_bump")
ActivationReaction(AM, ACTIVATE_MOB_BUMP)
/obj/machinery/anomalous_crystal/ex_act()
ActivationReaction(null,"bomb")
ActivationReaction(null, ACTIVATE_BOMB)
/obj/machinery/anomalous_crystal/random/New()//Just a random crysal spawner for loot
var/random_crystal = pick(typesof(/obj/machinery/anomalous_crystal) - /obj/machinery/anomalous_crystal/random - /obj/machinery/anomalous_crystal)
new random_crystal(loc)
qdel(src)
/obj/effect/spawner/lootdrop/anomalous_crystal
name = "anomalous crystal spawner"
/obj/effect/spawner/lootdrop/anomalous_crystal/Initialize()
loot = subtypesof(/obj/machinery/anomalous_crystal)
. = ..()
/obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing
activation_method = "mob_bump"
observer_desc = "This crystal strips and equips its targets as clowns."
possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH)
activation_sound = 'sound/items/bikehorn.ogg'
/obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user)
@@ -442,12 +465,9 @@ Difficulty: Very Hard
qdel(C)
affected_targets.Add(H)
/obj/machinery/anomalous_crystal/honk/New()
..()
activation_method = pick("mob_bump","speech")
/obj/machinery/anomalous_crystal/theme_warp //Warps the area you're in to look like a new one
activation_method = "touch"
observer_desc = "This crystal warps the area around it to a theme."
activation_method = ACTIVATE_TOUCH
cooldown_add = 200
var/terrain_theme = "winter"
var/NewTerrainFloors
@@ -457,9 +477,11 @@ Difficulty: Very Hard
var/list/NewFlora = list()
var/florachance = 8
/obj/machinery/anomalous_crystal/theme_warp/New()
..()
/obj/machinery/anomalous_crystal/theme_warp/Initialize()
. = ..()
terrain_theme = pick("lavaland","winter","jungle","ayy lmao")
observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme]\"."
switch(terrain_theme)
if("lavaland")//Depressurizes the place... and free cult metal, I guess.
NewTerrainFloors = /turf/open/floor/grass/snow/basalt
@@ -518,15 +540,19 @@ Difficulty: Very Hard
affected_targets += A
/obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with
activation_method = "touch"
observer_desc = "This crystal generates a projectile when activated."
activation_method = ACTIVATE_TOUCH
cooldown_add = 50
var/generated_projectile = /obj/item/projectile/beam/emitter
var/obj/item/projectile/generated_projectile = /obj/item/projectile/beam/emitter
/obj/machinery/anomalous_crystal/emitter/New()
..()
/obj/machinery/anomalous_crystal/emitter/Initialize()
. = ..()
generated_projectile = pick(/obj/item/projectile/magic/aoe/fireball/infernal,/obj/item/projectile/magic/aoe/lightning,/obj/item/projectile/magic/spellblade,
/obj/item/projectile/bullet/meteorshot, /obj/item/projectile/beam/xray, /obj/item/projectile/colossus)
var/proj_name = initial(generated_projectile.name)
observer_desc = "This crystal generates \a [proj_name] when activated."
/obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method)
if(..())
var/obj/item/projectile/P = new generated_projectile(get_turf(src))
@@ -547,7 +573,8 @@ Difficulty: Very Hard
P.fire()
/obj/machinery/anomalous_crystal/dark_reprise //Revives anyone nearby, but turns them into shadowpeople and renders them uncloneable, so the crystal is your only hope of getting up again if you go down.
activation_method = "touch"
observer_desc = "When activated, this crystal revives anyone nearby, but turns them into Shadowpeople and makes them unclonable, making the crystal their only hope of getting up again."
activation_method = ACTIVATE_TOUCH
activation_sound = 'sound/hallucinations/growl1.ogg'
/obj/machinery/anomalous_crystal/dark_reprise/ActivationReaction(mob/user, method)
@@ -565,13 +592,20 @@ Difficulty: Very Hard
H.grab_ghost(force = TRUE)
/obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans
activation_method = "touch"
var/ready_to_deploy = 0
observer_desc = "This crystal allows ghosts to turn into a fragile creature that can heal people."
activation_method = ACTIVATE_TOUCH
activation_sound = 'sound/effects/ghost2.ogg'
var/ready_to_deploy = FALSE
/obj/machinery/anomalous_crystal/helpers/Destroy()
GLOB.poi_list -= src
. = ..()
/obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method)
if(..() && !ready_to_deploy)
ready_to_deploy = 1
notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "<a href=?src=\ref[src];ghostjoin=1>(Click to enter)</a>", source = src, action = NOTIFY_ATTACK)
GLOB.poi_list |= src
ready_to_deploy = TRUE
notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "<a href=?src=\ref[src];ghostjoin=1>(Click to enter)</a>", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK)
/obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user)
..()
@@ -613,10 +647,12 @@ Difficulty: Very Hard
verb_ask = "floats inquisitively"
verb_exclaim = "zaps"
verb_yell = "bangs"
initial_languages = list(/datum/language/common, /datum/language/slime)
only_speaks_language = /datum/language/slime
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
light_range = 4
faction = list("neutral")
del_on_death = 1
del_on_death = TRUE
unsuitable_atmos_damage = 0
movement_type = FLYING
minbodytemp = 0
@@ -638,7 +674,7 @@ Difficulty: Very Hard
. = ..()
if(isliving(target) && target != src)
var/mob/living/L = target
if(L.stat < DEAD)
if(L.stat != DEAD)
L.heal_overall_damage(heal_power, heal_power)
new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF")
@@ -649,13 +685,14 @@ Difficulty: Very Hard
/obj/machinery/anomalous_crystal/refresher //Deletes and recreates a copy of the item, "refreshing" it.
activation_method = "touch"
observer_desc = "This crystal \"refreshes\" items that it affects, rendering them as new."
activation_method = ACTIVATE_TOUCH
cooldown_add = 50
activation_sound = 'sound/magic/TIMEPARADOX2.ogg'
var/list/banned_items_typecache = list(/obj/item/weapon/storage, /obj/item/weapon/implant, /obj/item/weapon/implanter, /obj/item/weapon/disk/nuclear, /obj/item/projectile, /obj/item/weapon/spellbook)
/obj/machinery/anomalous_crystal/refresher/New()
..()
/obj/machinery/anomalous_crystal/refresher/Initialize()
. = ..()
banned_items_typecache = typecacheof(banned_items_typecache)
@@ -675,7 +712,8 @@ Difficulty: Very Hard
qdel(CHOSEN)
/obj/machinery/anomalous_crystal/possessor //Allows you to bodyjack small animals, then exit them at your leisure, but you can only do this once per activation. Because they blow up. Also, if the bodyjacked animal dies, SO DO YOU.
activation_method = "touch"
observer_desc = "When activated, this crystal allows you to take over small animals, and then exit them at the possessors leisure. Exiting the animal kills it, and if you die while possessing the animal, you die as well."
activation_method = ACTIVATE_TOUCH
/obj/machinery/anomalous_crystal/possessor/ActivationReaction(mob/user, method)
if(..())
@@ -770,4 +808,14 @@ Difficulty: Very Hard
target_mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession)
#undef ACTIVATE_TOUCH
#undef ACTIVATE_SPEECH
#undef ACTIVATE_HEAT
#undef ACTIVATE_BULLET
#undef ACTIVATE_ENERGY
#undef ACTIVATE_BOMB
#undef ACTIVATE_MOB_BUMP
#undef ACTIVATE_WEAPON
#undef ACTIVATE_MAGIC
#undef MEDAL_PREFIX
@@ -127,9 +127,11 @@
stuttering = 0
/mob/living/simple_animal/proc/handle_automated_action()
set waitfor = FALSE
return
/mob/living/simple_animal/proc/handle_automated_movement()
set waitfor = FALSE
if(!stop_automated_movement && wander)
if((isturf(src.loc) || allow_movement_on_non_turfs) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
@@ -142,6 +144,7 @@
return 1
/mob/living/simple_animal/proc/handle_automated_speech(var/override)
set waitfor = FALSE
if(speak_chance)
if(prob(speak_chance) || override)
if(speak && speak.len)
+1 -1
View File
@@ -396,7 +396,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
A.action = action
A.target = source
if(!alert_overlay)
alert_overlay = new(src)
alert_overlay = new(source)
alert_overlay.layer = FLOAT_LAYER
alert_overlay.plane = FLOAT_PLANE
A.add_overlay(alert_overlay)
@@ -3,7 +3,7 @@
filedesc = "ID card modification program"
program_icon_state = "id"
extended_desc = "Program for programming employee ID cards to access parts of the station."
transfer_access = GLOB.access_change_ids
transfer_access = GLOB.access_heads
requires_ntnet = 0
size = 8
var/mod_mode = 1
@@ -452,7 +452,7 @@
var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2
if(auth_card)
region_access = list()
if(transfer_access in auth_card.GetAccess())
if(GLOB.access_change_ids in auth_card.GetAccess())
minor = 0
authenticated = 1
return 1
+1 -1
View File
@@ -39,7 +39,7 @@
narsie_spawn_animation()
sleep(70)
SSshuttle.emergency.request(null, 0.1) // Cannot recall
SSshuttle.emergency.request(null, set_coefficient = 0.1) // Cannot recall
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
@@ -135,27 +135,27 @@
/// SAW ROUNDS
/obj/item/ammo_casing/mm556x45
desc = "A 556x45mm bullet casing."
/obj/item/ammo_casing/mm195x129
desc = "A 1.95x129mm bullet casing."
icon_state = "762-casing"
caliber = "mm55645"
caliber = "mm195129"
projectile_type = /obj/item/projectile/bullet/saw
/obj/item/ammo_casing/mm556x45/bleeding
desc = "A 556x45mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding."
/obj/item/ammo_casing/mm195x129/bleeding
desc = "A 1.95x129mm bullet casing with specialized inner-casing, that when it makes contact with a target, release tiny shrapnel to induce internal bleeding."
icon_state = "762-casing"
projectile_type = /obj/item/projectile/bullet/saw/bleeding
/obj/item/ammo_casing/mm556x45/hollow
desc = "A 556x45mm bullet casing designed to cause more damage to unarmored targets."
/obj/item/ammo_casing/mm195x129/hollow
desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets."
projectile_type = /obj/item/projectile/bullet/saw/hollow
/obj/item/ammo_casing/mm556x45/ap
desc = "A 556x45mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
/obj/item/ammo_casing/mm195x129/ap
desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
projectile_type = /obj/item/projectile/bullet/saw/ap
/obj/item/ammo_casing/mm556x45/incen
desc = "A 556x45mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. "
/obj/item/ammo_casing/mm195x129/incen
desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. "
projectile_type = /obj/item/projectile/bullet/saw/incen
@@ -234,35 +234,35 @@
//// SAW MAGAZINES
/obj/item/ammo_box/magazine/mm556x45
name = "box magazine (5.56x45mm)"
/obj/item/ammo_box/magazine/mm195x129
name = "box magazine (1.95x129mm)"
icon_state = "a762-50"
origin_tech = "combat=2"
ammo_type = /obj/item/ammo_casing/mm556x45
caliber = "mm55645"
ammo_type = /obj/item/ammo_casing/mm195x129
caliber = "mm195129"
max_ammo = 50
/obj/item/ammo_box/magazine/mm556x45/bleeding
name = "box magazine (Bleeding 5.56x45mm)"
/obj/item/ammo_box/magazine/mm195x129/bleeding
name = "box magazine (Bleeding 1.95x129mm)"
origin_tech = "combat=3"
ammo_type = /obj/item/ammo_casing/mm556x45/bleeding
ammo_type = /obj/item/ammo_casing/mm195x129/bleeding
/obj/item/ammo_box/magazine/mm556x45/hollow
name = "box magazine (Hollow-Point 5.56x45mm)"
/obj/item/ammo_box/magazine/mm195x129/hollow
name = "box magazine (Hollow-Point 1.95x129mm)"
origin_tech = "combat=3"
ammo_type = /obj/item/ammo_casing/mm556x45/hollow
ammo_type = /obj/item/ammo_casing/mm195x129/hollow
/obj/item/ammo_box/magazine/mm556x45/ap
name = "box magazine (Armor Penetrating 5.56x45mm)"
/obj/item/ammo_box/magazine/mm195x129/ap
name = "box magazine (Armor Penetrating 1.95x129mm)"
origin_tech = "combat=4"
ammo_type = /obj/item/ammo_casing/mm556x45/ap
ammo_type = /obj/item/ammo_casing/mm195x129/ap
/obj/item/ammo_box/magazine/mm556x45/incen
name = "box magazine (Incendiary 5.56x45mm)"
/obj/item/ammo_box/magazine/mm195x129/incen
name = "box magazine (Incendiary 1.95x129mm)"
origin_tech = "combat=4"
ammo_type = /obj/item/ammo_casing/mm556x45/incen
ammo_type = /obj/item/ammo_casing/mm195x129/incen
/obj/item/ammo_box/magazine/mm556x45/update_icon()
/obj/item/ammo_box/magazine/mm195x129/update_icon()
..()
icon_state = "a762-[round(ammo_count(),10)]"
@@ -278,13 +278,13 @@
/obj/item/weapon/gun/ballistic/automatic/l6_saw
name = "\improper L6 SAW"
desc = "A heavily modified 5.56x45mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
desc = "A heavily modified 1.95x129mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
icon_state = "l6closed100"
item_state = "l6closedmag"
w_class = WEIGHT_CLASS_HUGE
slot_flags = 0
origin_tech = "combat=6;engineering=3;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/mm556x45
mag_type = /obj/item/ammo_box/magazine/mm195x129
weapon_weight = WEAPON_HEAVY
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
var/cover_open = 0
@@ -138,7 +138,7 @@
/obj/item/weapon/gun/energy/plasmacutter/examine(mob/user)
..()
if(power_supply)
user <<"<span class='notice'>[src] is [round(power_supply.percent())]% charged.</span>"
to_chat(user, "<span class='notice'>[src] is [round(power_supply.percent())]% charged.</span>")
/obj/item/weapon/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
if(istype(A, /obj/item/stack/sheet/mineral/plasma))
@@ -54,7 +54,9 @@
/obj/item/slime_extract = list(),
/obj/item/weapon/reagent_containers/pill = list(),
/obj/item/weapon/reagent_containers/food = list(),
/obj/item/weapon/reagent_containers/honeycomb = list()
/obj/item/weapon/reagent_containers/honeycomb = list(),
/obj/item/toy/crayon = list()
)
var/list/juice_items = list (
@@ -456,3 +458,13 @@
O.reagents.trans_to(beaker, amount)
if(!O.reagents.total_volume)
remove_object(O)
for (var/obj/item/toy/crayon/O in holdingitems)
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
for (var/r_id in O.reagent_contents)
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
if (space == 0)
break
beaker.reagents.add_reagent(r_id, min(O.reagent_contents[r_id], space))
remove_object(O)
@@ -1128,7 +1128,7 @@
//For colouring in /proc/mix_color_from_reagents
/datum/reagent/crayonpowder
/datum/reagent/colorful_reagent/crayonpowder
name = "Crayon Powder"
id = "crayon powder"
var/colorname = "none"
@@ -1137,50 +1137,72 @@
color = "#FFFFFF" // rgb: 207, 54, 0
taste_description = "the back of class"
/datum/reagent/crayonpowder/New()
/datum/reagent/colorful_reagent/crayonpowder/New()
description = "\an [colorname] powder made by grinding down crayons, good for colouring chemical reagents."
/datum/reagent/crayonpowder/red
/datum/reagent/colorful_reagent/crayonpowder/red
name = "Red Crayon Powder"
id = "redcrayonpowder"
colorname = "red"
color = "#DA0000" // red
random_color_list = list("#DA0000")
/datum/reagent/crayonpowder/orange
/datum/reagent/colorful_reagent/crayonpowder/orange
name = "Orange Crayon Powder"
id = "orangecrayonpowder"
colorname = "orange"
color = "#FF9300" // orange
random_color_list = list("#FF9300")
/datum/reagent/crayonpowder/yellow
/datum/reagent/colorful_reagent/crayonpowder/yellow
name = "Yellow Crayon Powder"
id = "yellowcrayonpowder"
colorname = "yellow"
color = "#FFF200" // yellow
random_color_list = list("#FFF200")
/datum/reagent/crayonpowder/green
/datum/reagent/colorful_reagent/crayonpowder/green
name = "Green Crayon Powder"
id = "greencrayonpowder"
colorname = "green"
color = "#A8E61D" // green
random_color_list = list("#A8E61D")
/datum/reagent/crayonpowder/blue
/datum/reagent/colorful_reagent/crayonpowder/blue
name = "Blue Crayon Powder"
id = "bluecrayonpowder"
colorname = "blue"
color = "#00B7EF" // blue
random_color_list = list("#00B7EF")
/datum/reagent/crayonpowder/purple
/datum/reagent/colorful_reagent/crayonpowder/purple
name = "Purple Crayon Powder"
id = "purplecrayonpowder"
colorname = "purple"
color = "#DA00FF" // purple
random_color_list = list("#DA00FF")
/datum/reagent/crayonpowder/invisible
/datum/reagent/colorful_reagent/crayonpowder/invisible
name = "Invisible Crayon Powder"
id = "invisiblecrayonpowder"
colorname = "invisible"
color = "#FFFFFF00" // white + no alpha
random_color_list = list(null) //because using the powder color turns things invisible
/datum/reagent/colorful_reagent/crayonpowder/black
name = "Black Crayon Powder"
id = "blackcrayonpowder"
colorname = "black"
color = "#1C1C1C" // not quite black
random_color_list = list("#404040")
/datum/reagent/colorful_reagent/crayonpowder/white
name = "White Crayon Powder"
id = "whitecrayonpowder"
colorname = "white"
color = "#FFFFFF" // white
random_color_list = list("#FFFFFF") //doesn't actually change appearance at all
@@ -25,13 +25,10 @@
/obj/item/weapon/reagent_containers/blood/proc/update_pack_name()
if(!labelled)
if(volume)
if(blood_type)
name = "blood pack [blood_type]"
else
name = "blood pack"
if(blood_type)
name = "blood pack - [blood_type]"
else
name = "empty blood pack"
name = "blood pack"
/obj/item/weapon/reagent_containers/blood/update_icon()
var/percent = round((reagents.total_volume / volume) * 100)
@@ -69,7 +66,7 @@
blood_type = "L"
/obj/item/weapon/reagent_containers/blood/empty
name = "empty blood pack"
name = "blood pack"
icon_state = "empty"
/obj/item/weapon/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
+4 -3
View File
@@ -212,13 +212,14 @@
/obj/machinery/conveyor_switch/Initialize(mapload, newid)
if(mapload)
return TRUE //need machines list
. = ..()
..()
if(!id)
id = newid
update()
return INITIALIZE_HINT_LATELOAD //for machines list
/obj/machinery/conveyor_switch/LateInitialize()
conveyors = list()
for(var/obj/machinery/conveyor/C in GLOB.machines)
if(C.id == id)
+10
View File
@@ -0,0 +1,10 @@
diff a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm (rejected hunks)
@@ -220,7 +220,7 @@
id = newid
update()
- return INITIALIZE_HINT_LATELOAD
+ return INITIALIZE_HINT_LATELOAD //for machines list
/obj/machinery/conveyor_switch/LateInitialize()
conveyors = list()
+11 -11
View File
@@ -64,17 +64,17 @@
deconstruct()
/obj/machinery/disposal/Initialize(mapload)
. = mapload //late-initialize, we need turfs to have air
if(initialized) //will only be run on late mapload initialization
//this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
var/atom/L = loc
var/datum/gas_mixture/env = new
env.copy_from(L.return_air())
var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1)
air_contents.merge(removed)
trunk_check()
else
..()
..()
return INITIALIZE_HINT_LATELOAD //we need turfs to have air
/obj/machinery/disposal/LateInitialize()
//this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
var/atom/L = loc
var/datum/gas_mixture/env = new
env.copy_from(L.return_air())
var/datum/gas_mixture/removed = env.remove(SEND_PRESSURE + 1)
air_contents.merge(removed)
trunk_check()
/obj/machinery/disposal/attackby(obj/item/I, mob/user, params)
add_fingerprint(user)
+1 -1
View File
@@ -1068,7 +1068,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
/obj/machinery/computer/rdconsole/robotics/New()
..()
if(circuit)
circuit.name = "RD Console - Robotics (Computer Board)"
circuit.name = "R&D Console - Robotics (Computer Board)"
circuit.build_path = /obj/machinery/computer/rdconsole/robotics
/obj/machinery/computer/rdconsole/core
@@ -20,7 +20,7 @@
if(Uses >= 5)
to_chat(user, "<span class='warning'>You cannot enhance this extract further!</span>")
return ..()
user <<"<span class='notice'>You apply the enhancer to the slime extract. It may now be reused one more time.</span>"
to_chat(user, "<span class='notice'>You apply the enhancer to the slime extract. It may now be reused one more time.</span>")
Uses++
qdel(O)
..()
@@ -146,8 +146,8 @@
M.docile = 1
M.nutrition = 700
M <<"<span class='warning'>You absorb the potion and feel your intense desire to feed melt away.</span>"
user <<"<span class='notice'>You feed the slime the potion, removing its hunger and calming it.</span>"
to_chat(M, "<span class='warning'>You absorb the potion and feel your intense desire to feed melt away.</span>")
to_chat(user, "<span class='notice'>You feed the slime the potion, removing its hunger and calming it.</span>")
var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN)
if (!newname)
@@ -261,10 +261,10 @@
to_chat(user, "<span class='warning'>The slime is dead!</span>")
return ..()
if(M.cores >= 5)
user <<"<span class='warning'>The slime already has the maximum amount of extract!</span>"
to_chat(user, "<span class='warning'>The slime already has the maximum amount of extract!</span>")
return ..()
user <<"<span class='notice'>You feed the slime the steroid. It will now produce one more extract.</span>"
to_chat(user, "<span class='notice'>You feed the slime the steroid. It will now produce one more extract.</span>")
M.cores++
qdel(src)
@@ -288,10 +288,10 @@
to_chat(user, "<span class='warning'>The slime is dead!</span>")
return ..()
if(M.mutation_chance == 0)
user <<"<span class='warning'>The slime already has no chance of mutating!</span>"
to_chat(user, "<span class='warning'>The slime already has no chance of mutating!</span>")
return ..()
user <<"<span class='notice'>You feed the slime the stabilizer. It is now less likely to mutate.</span>"
to_chat(user, "<span class='notice'>You feed the slime the stabilizer. It is now less likely to mutate.</span>")
M.mutation_chance = Clamp(M.mutation_chance-15,0,100)
qdel(src)
@@ -312,10 +312,10 @@
to_chat(user, "<span class='warning'>This slime has already consumed a mutator, any more would be far too unstable!</span>")
return ..()
if(M.mutation_chance == 100)
user <<"<span class='warning'>The slime is already guaranteed to mutate!</span>"
to_chat(user, "<span class='warning'>The slime is already guaranteed to mutate!</span>")
return ..()
user <<"<span class='notice'>You feed the slime the mutator. It is now more likely to mutate.</span>"
to_chat(user, "<span class='notice'>You feed the slime the mutator. It is now more likely to mutate.</span>")
M.mutation_chance = Clamp(M.mutation_chance+12,0,100)
M.mutator_used = TRUE
qdel(src)
@@ -348,7 +348,7 @@
return ..()
R.vehicle_move_delay = 0
user <<"<span class='notice'>You slather the red gunk over the [C], making it faster.</span>"
to_chat(user, "<span class='notice'>You slather the red gunk over the [C], making it faster.</span>")
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
C.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY)
qdel(src)
@@ -373,7 +373,7 @@
if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
to_chat(user, "<span class='warning'>The [C] is already fireproof!</span>")
return ..()
user <<"<span class='notice'>You slather the blue gunk over the [C], fireproofing it.</span>"
to_chat(user, "<span class='notice'>You slather the blue gunk over the [C], fireproofing it.</span>")
C.name = "fireproofed [C.name]"
C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY)
+9 -7
View File
@@ -22,20 +22,22 @@
var/perma_docked = FALSE //highlander with RESPAWN??? OH GOD!!!
/obj/docking_port/mobile/arrivals/Initialize(mapload)
if(mapload)
return TRUE //late initialize to make sure the latejoin list is populated
preferred_direction = dir
if(SSshuttle.arrivals)
WARNING("More than one arrivals docking_port placed on map!")
qdel(src)
return
return INITIALIZE_HINT_QDEL
SSshuttle.arrivals = src
. = ..()
. = ..()
preferred_direction = dir
return INITIALIZE_HINT_LATELOAD //for latejoin list
/obj/docking_port/mobile/arrivals/LateInitialize()
areas = list()
var/list/new_latejoin = list()
@@ -177,7 +179,7 @@
Launch(TRUE)
user << "<span class='notice'>Calling your shuttle. One moment...</span>"
to_chat(user, "<span class='notice'>Calling your shuttle. One moment...</span>")
while(mode != SHUTTLE_CALL && !damaged)
stoplag()
+11
View File
@@ -0,0 +1,11 @@
diff a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm (rejected hunks)
@@ -30,6 +30,9 @@
..()
preferred_direction = dir
+ return INITIALIZE_HINT_LATELOAD //for latejoin list
+
+/obj/docking_port/mobile/arrivals/LateInitialize()
areas = list()
var/list/new_latejoin = list()
+11 -2
View File
@@ -207,8 +207,17 @@
. = ..()
/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, coefficient=1, area/signalOrigin, reason, redAlert)
var/call_time = SSshuttle.emergencyCallTime * coefficient
/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, redAlert, set_coefficient=null)
if(!isnum(set_coefficient))
var/security_num = seclevel2num(get_security_level())
switch(security_num)
if(SEC_LEVEL_GREEN)
set_coefficient = 2
if(SEC_LEVEL_BLUE)
set_coefficient = 1
else
set_coefficient = 0.5
var/call_time = SSshuttle.emergencyCallTime * set_coefficient
switch(mode)
// The shuttle can not normally be called while "recalling", so
// if this proc is called, it's via admin fiat
@@ -47,7 +47,7 @@
L+=T
if(!L.len)
usr <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry."
to_chat(usr, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.")
return
if(target && target.buckled)
+2 -2
View File
@@ -26,9 +26,9 @@
if(M.mind)
for(var/obj/effect/proc_holder/spell/S in M.mind.spell_list)
S.charge_counter = S.charge_max
M <<"<span class='notice'>You feel raw magic flowing through you. It feels good!</span>"
to_chat(M, "<span class='notice'>You feel raw magic flowing through you. It feels good!</span>")
else
M <<"<span class='notice'>you feel very strange for a moment, but then it passes.</span>"
to_chat(M, "<span class='notice'>You feel very strange for a moment, but then it passes.</span>")
burnt_out = 1
charged_item = M
break
+1 -1
View File
@@ -234,7 +234,7 @@
else
var/list/funky_turfs = RANGE_TURFS(1, user)
for(var/turf/closed/solid in funky_turfs)
user << "<span class='warning'>You're too close to a wall.</span>"
to_chat(user, "<span class='warning'>You're too close to a wall.</span>")
return
dancefloor_exists = TRUE
var/i = 1
+1 -1
View File
@@ -22,7 +22,7 @@
if(C.disabilities & DEAF)
deaf = max(deaf, 1)
else
if(HAS_SECONDARY_FLAG(C.ears, HEALS_EARS))
if(C.ears && HAS_SECONDARY_FLAG(C.ears, HEALS_EARS))
deaf = max(deaf - 1, 1)
ear_damage = max(ear_damage - 0.10, 0)
// if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs.
+10
View File
@@ -0,0 +1,10 @@
diff a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm (rejected hunks)
@@ -54,7 +54,7 @@
return new step_type
/datum/surgery/proc/complete()
- feedback_add_details("surgeries_completed", type)
+ feedback_add_details("surgeries_completed", "[type]")
qdel(src)
+16 -16
View File
@@ -222,7 +222,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/dangerous/machinegun
name = "L6 Squad Automatic Weapon"
desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \
This deadly weapon has a massive 50-round magazine of devastating 5.56x45mm ammunition."
This deadly weapon has a massive 50-round magazine of devastating 1.95x129mm ammunition."
item = /obj/item/weapon/gun/ballistic/automatic/l6_saw
cost = 18
surplus = 0
@@ -469,34 +469,34 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/machinegun/basic
name = "5.56x45mm Box Magazine"
desc = "A 50-round magazine of 5.56x45mm ammunition for use with the L6 SAW. \
name = "1.95x129mm Box Magazine"
desc = "A 50-round magazine of 1.95x129mm ammunition for use with the L6 SAW. \
By the time you need to use this, you'll already be on a pile of corpses."
item = /obj/item/ammo_box/magazine/mm556x45
item = /obj/item/ammo_box/magazine/mm195x129
/datum/uplink_item/ammo/machinegun/bleeding
name = "5.56x45mm (Bleeding) Box Magazine"
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \
name = "1.95x129mm (Bleeding) Box Magazine"
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \
to induce internal bleeding on targets."
item = /obj/item/ammo_box/magazine/mm556x45/bleeding
item = /obj/item/ammo_box/magazine/mm195x129/bleeding
/datum/uplink_item/ammo/machinegun/hollow
name = "5.56x45mm (Hollow-Point) Box Magazine"
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \
name = "1.95x129mm (Hollow-Point) Box Magazine"
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \
with the unarmored masses of crew."
item = /obj/item/ammo_box/magazine/mm556x45/hollow
item = /obj/item/ammo_box/magazine/mm195x129/hollow
/datum/uplink_item/ammo/machinegun/ap
name = "5.56x45mm (Armor Penetrating) Box Magazine"
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \
name = "1.95x129mm (Armor Penetrating) Box Magazine"
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \
to puncture even the most durable armor."
item = /obj/item/ammo_box/magazine/mm556x45/ap
item = /obj/item/ammo_box/magazine/mm195x129/ap
/datum/uplink_item/ammo/machinegun/incen
name = "5.56x45mm (Incendiary) Box Magazine"
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW; tipped with a special flammable \
name = "1.95x129mm (Incendiary) Box Magazine"
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; tipped with a special flammable \
mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn."
item = /obj/item/ammo_box/magazine/mm556x45/incen
item = /obj/item/ammo_box/magazine/mm195x129/incen
/datum/uplink_item/ammo/sniper
cost = 4