Merge pull request #62 from Aurorastation/updates_the_nbt

Updates the nbt to the latest master
This commit is contained in:
Alberyk
2022-02-19 10:55:02 -03:00
committed by GitHub
152 changed files with 2291 additions and 585 deletions
+10 -1
View File
@@ -222,6 +222,7 @@
#include "code\controllers\subsystems\law.dm"
#include "code\controllers\subsystems\lighting.dm"
#include "code\controllers\subsystems\machinery.dm"
#include "code\controllers\subsystems\mapping.dm"
#include "code\controllers\subsystems\materials.dm"
#include "code\controllers\subsystems\mob.dm"
#include "code\controllers\subsystems\mob_ai.dm"
@@ -1965,6 +1966,7 @@
#include "code\modules\lighting\lighting_corner.dm"
#include "code\modules\lighting\lighting_overlay.dm"
#include "code\modules\lighting\lighting_profiler.dm"
#include "code\modules\lighting\lighting_setup.dm"
#include "code\modules\lighting\lighting_source.dm"
#include "code\modules\lighting\lighting_source_sunlight.dm"
#include "code\modules\lighting\lighting_turf.dm"
@@ -1976,6 +1978,7 @@
#include "code\modules\lock\lock_construct.dm"
#include "code\modules\makeshift\makeshift_reagents.dm"
#include "code\modules\maps\dmm_suite.dm"
#include "code\modules\maps\helper_landmarks.dm"
#include "code\modules\maps\map_template.dm"
#include "code\modules\maps\reader.dm"
#include "code\modules\maps\ruins.dm"
@@ -2942,6 +2945,9 @@
#include "code\modules\spell_system\spells\spell_list\self\generic\rune_write.dm"
#include "code\modules\spell_system\spells\spell_list\self\generic\shadow_shroud.dm"
#include "code\modules\spell_system\spells\spell_list\self\generic\shift.dm"
#include "code\modules\submaps\_submap.dm"
#include "code\modules\submaps\submap_archetype.dm"
#include "code\modules\submaps\submap_landmark.dm"
#include "code\modules\supermatter\setup_supermatter.dm"
#include "code\modules\supermatter\supermatter.dm"
#include "code\modules\surgery\_defines.dm"
@@ -3060,6 +3066,7 @@
#include "maps\aurora\code\aurora_lifts.dm"
#include "maps\aurora\code\aurora_shuttles.dm"
#include "maps\aurora\code\aurora_unittest.dm"
#include "maps\away\away_sites.dm"
#include "maps\event\code\event.dm"
#include "maps\event\odin_departure\code\odin_departure_areas.dm"
#include "maps\event\odin_departure\code\odin_depature.dm"
@@ -3071,8 +3078,10 @@
#include "maps\exodus\code\exodus_holodeck.dm"
#include "maps\exodus\code\exodus_shuttles.dm"
#include "maps\exodus\code\exodus_unittest.dm"
#include "maps\random_ruins\exoplanet_ruins\asteroid\asteroid.dm"
#include "maps\random_ruins\exoplanets\exoplanet_ruins.dm"
#include "maps\random_ruins\exoplanets\asteroid\asteroid.dm"
#include "maps\random_ruins\exoplanets\crashed_pod\crashed_pod.dm"
#include "maps\random_ruins\space_ruins\space_ruins.dm"
#include "maps\runtime\runtime_overmap.dm"
#include "maps\runtime\code\runtime.dm"
#include "maps\runtime\code\runtime_lifts.dm"
@@ -60,8 +60,8 @@
var/turf/T = get_turf(src)
if(!istype(T))
return
add_underlay(T, node1, turn(dir, 180), node1?.icon_connect_type)
add_underlay(T, node2, dir, node2?.icon_connect_type)
add_underlay(T, node1, turn(dir, 180), icon_connect_type)
add_underlay(T, node2, dir, icon_connect_type)
/obj/machinery/atmospherics/binary/passive_gate/hide(var/i)
update_underlays()
@@ -129,6 +129,7 @@
..()
set_frequency(frequency)
broadcast_status()
/obj/machinery/atmospherics/unary/outlet_injector/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
+1
View File
@@ -2,6 +2,7 @@
#define PLANE_SPACE_PARALLAX (PLANE_SPACE_BACKGROUND + 1) // -97
#define PLANE_SPACE_DUST (PLANE_SPACE_PARALLAX + 1) // -96
#define PLANE_ABOVE_PARALLAX (PLANE_SPACE_BACKGROUND + 3) // -95
#define PLANE_DEFAULT 0
#define LOWER_ON_TURF_LAYER (TURF_LAYER + 0.05) // under the below
#define ON_TURF_LAYER (TURF_LAYER + 0.1) // sitting on the turf - should be preferred over direct use of TURF_LAYER
+1
View File
@@ -1,6 +1,7 @@
#define Clamp(x, low, high) max(low, min(high, x))
#define CLAMP01(x) (Clamp(x, 0, 1))
#define JOINTEXT(X) jointext(X, null)
#define list_find(L, needle, LIMITS...) L.Find(needle, LIMITS)
#define span(class, text) ("<span class='[class]'>" + text + "</span>")
#define SPAN_NOTICE(X) ("<span class='notice'>" + X + "</span>")
+8
View File
@@ -33,5 +33,13 @@
// /mob signals
// /obj signals
/// when a hood is unequipped
#define COMSIG_ITEM_REMOVE "item_remove"
/// checks an item's state
#define COMSIG_ITEM_STATE_CHECK "state_check"
/// updates an item between several states
#define COMSIG_ITEM_UPDATE_STATE "update_state"
/// updates sprites
#define COMSIG_ITEM_ICON_UPDATE "icon_update"
/*******Component Specific Signals*******/
+8 -1
View File
@@ -93,6 +93,13 @@
#define LIGHT_COLOR_HALOGEN "#C0C0CA" //Soft lighting for general-purpose light fixtures. rgb(192, 192, 202)
#define LIGHT_COLOR_EMERGENCY "#FF3232" //Red color used by emergency lighting. rgb(255, 50, 50)
#define LIGHT_COLOR_EMERGENCY_SOFT "#FA8282" //A softer emergency red, used for small bulbs. rgb(250, 130, 130)
#define LIGHT_COLOUR_WHITE "#FEFEFE" // Clinical white light bulbs
#define LIGHT_COLOUR_WARM "#FFFEE0" // Warm yellowish light bulbs
#define LIGHT_STANDARD_COLORS list(LIGHT_COLOUR_WHITE, LIGHT_COLOUR_WARM, LIGHT_COLOR_HALOGEN) // List of standard light colors used for randomized lighting and selectable printed lights.
#define LIGHT_MODE_RED "red"
#define LIGHT_MODE_DELTA "delta"
//Defines for lighting status, see power/lighting.dm
#define LIGHT_OK 0
@@ -109,7 +116,7 @@
#define LIGHT_NARROW 45
// Some brightness/range defines for objects.
#define L_WALLMOUNT_POWER 0.4
#define L_WALLMOUNT_POWER 1.3
#define L_WALLMOUNT_RANGE 2
#define L_WALLMOUNT_HI_POWER 1 // For red/delta alert on fire alarms.
#define L_WALLMOUNT_HI_RANGE 4
+5 -2
View File
@@ -491,7 +491,10 @@ Define for getting a bitfield of adjacent turfs that meet a condition.
#define TEMPLATE_FLAG_SPAWN_GUARANTEED 2 // Makes it ignore away site budget and just spawn (only for away sites)
#define TEMPLATE_FLAG_CLEAR_CONTENTS 4 // if it should destroy objects it spawns on top of
#define TEMPLATE_FLAG_NO_RUINS 8 // if it should forbid ruins from spawning on top of it
#define TEMPLATE_FLAG_NO_RADS 16// Removes all radiation from the template after spawning.
#define LANDING_ZONE_RADIUS 15 // Used for autoplacing landmarks on exoplanets
#define LANDING_ZONE_RADIUS 15 // Used for autoplacing landmarks on exoplanets
//Ruin map template flags
#define TEMPLATE_FLAG_RUIN_STARTS_DISALLOWED 32 // Ruin is not available during spawning unless another ruin permits it.
+2 -2
View File
@@ -640,7 +640,7 @@ proc/ColorTone(rgb, tone)
/// appearance system (overlays/underlays, etc.) is not available.
///
/// Only the first argument is required.
/proc/getFlatIcon(image/A, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE)
/proc/getFlatIcon(image/A, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE, ignore_parent_dir = FALSE)
//Define... defines.
var/static/icon/flat_template = icon('icons/effects/effects.dmi', "nothing")
@@ -701,7 +701,7 @@ proc/ColorTone(rgb, tone)
var/base_icon_dir //We'll use this to get the icon state to display if not null BUT NOT pass it to overlays as the dir we have
//These should use the parent's direction (most likely)
if(!A.dir || A.dir == SOUTH)
if(!A.dir || A.dir == SOUTH || ignore_parent_dir)
curdir = defdir
else
curdir = A.dir
+3
View File
@@ -85,3 +85,6 @@
/proc/cmp_clientcolor_priority(datum/client_color/A, datum/client_color/B)
return B.priority - A.priority
/proc/cmp_ruincost_priority(datum/map_template/ruin/A, datum/map_template/ruin/B)
return initial(A.spawn_cost) - initial(B.spawn_cost)
+8 -4
View File
@@ -50,6 +50,14 @@
while (left-- > 0)
. = "0[.]"
// Splits the text of a file at seperator and returns them in a list.
/proc/file2list(filename, seperator="\n")
return splittext(file2text(filename) || "", seperator)
//Splits the text of a file at seperator and returns them in a list.
/world/proc/file2list(filename, seperator="\n")
return splittext(file2text(filename), seperator)
// Slower then list2text (replaced with jointext), but correctly processes associative lists.
proc/tg_list2text(list/list, glue=",")
if (!istype(list) || !list.len)
@@ -97,10 +105,6 @@ proc/tg_list2text(list/list, glue=",")
num_list += text2num(x)
return num_list
// Splits the text of a file at seperator and returns them in a list.
/proc/file2list(filename, seperator="\n")
return text2list(return_file_text(filename),seperator)
// Turns a direction into text
/proc/num2dir(direction)
switch (direction)
+1 -1
View File
@@ -232,7 +232,7 @@
/obj/screen/ability/verb_based/activate()
if(object_used && verb_to_call)
call(object_used,verb_to_call)(arguments_to_use) //TODOMATT: WHY GOD WHY
call(object_used,verb_to_call)(arguments_to_use)
/obj/screen/movable/ability_master/proc/add_verb_ability(var/object_given, var/verb_given, var/name_given, var/ability_icon_given, var/arguments)
if(!object_given)
@@ -380,6 +380,7 @@
SearchVar(SSpipenet)
SearchVar(SSprocessing)
SearchVar(SSshuttle)
SearchVar(SSmapping)
SearchVar(base_law_type)
SearchVar(discord_bot)
SearchVar(diseases)
@@ -46,6 +46,8 @@
click_catchers = create_click_catcher()
current_map.build_away_sites()
current_map.build_exoplanets()
..(timeofday)
+14
View File
@@ -214,4 +214,18 @@
/datum/controller/subsystem/machinery/ExplosionEnd()
wake()
/datum/controller/subsystem/machinery/proc/setup_atmos_machinery(list/machines)
set background = TRUE
var/list/atmos_machines = list()
for (var/obj/machinery/atmospherics/machine in machines)
atmos_machines += machine
log_game("Initializing atmos machinery")
for (var/obj/machinery/atmospherics/machine as anything in atmos_machines)
machine.atmos_init()
CHECK_TICK
log_game("Initializing pipe networks")
for (var/obj/machinery/atmospherics/machine as anything in atmos_machines)
machine.build_network()
CHECK_TICK
#undef MACHINERY_GO_TO_NEXT
+94
View File
@@ -0,0 +1,94 @@
var/datum/controller/subsystem/mapping/SSmapping
/datum/controller/subsystem/mapping
name = "Mapping"
init_order = SS_INIT_MISC
flags = SS_NO_FIRE
var/list/map_templates = list()
var/list/space_ruins_templates = list()
var/list/exoplanet_ruins_templates = list()
var/list/away_sites_templates = list()
var/list/submaps = list()
var/list/submap_archetypes = list()
/datum/controller/subsystem/mapping/New()
NEW_SS_GLOBAL(SSmapping)
/datum/controller/subsystem/mapping/Initialize(timeofday)
// Load templates and build away sites.
preloadTemplates()
for(var/atype in subtypesof(/decl/submap_archetype))
submap_archetypes[atype] = new atype
. = ..()
/datum/controller/subsystem/mapping/Recover()
flags |= SS_NO_INIT
map_templates = SSmapping.map_templates
space_ruins_templates = SSmapping.space_ruins_templates
exoplanet_ruins_templates = SSmapping.exoplanet_ruins_templates
away_sites_templates = SSmapping.away_sites_templates
/datum/controller/subsystem/mapping/proc/preloadTemplates(path = "maps/templates/") //see master controller setup
var/list/filelist = flist(path)
for(var/map in filelist)
var/datum/map_template/T = new(path = "[path][map]", rename = "[map]")
map_templates[T.name] = T
preloadBlacklistableTemplates()
/datum/controller/subsystem/mapping/proc/preloadBlacklistableTemplates()
// Still supporting bans by filename
var/list/banned_exoplanet_dmms = generateMapList("config/exoplanet_ruin_blacklist.txt")
var/list/banned_space_dmms = generateMapList("config/space_ruin_blacklist.txt")
var/list/banned_away_site_dmms = generateMapList("config/away_site_blacklist.txt")
if (!banned_exoplanet_dmms || !banned_space_dmms || !banned_away_site_dmms)
log_admin("One or more map blacklist files are not present in the config directory!")
var/list/banned_maps = list() + banned_exoplanet_dmms + banned_space_dmms + banned_away_site_dmms
for(var/item in sortList(subtypesof(/datum/map_template), /proc/cmp_ruincost_priority))
var/datum/map_template/map_template_type = item
// screen out the abstract subtypes
if(!initial(map_template_type.id))
continue
var/datum/map_template/MT = new map_template_type()
if (banned_maps)
var/mappath = MT.mappath
if(list_find(banned_maps, mappath))
break
map_templates[MT.name] = MT
// This is nasty..
if(istype(MT, /datum/map_template/ruin/exoplanet))
exoplanet_ruins_templates[MT.name] = MT
else if(istype(MT, /datum/map_template/ruin/space))
space_ruins_templates[MT.name] = MT
else if(istype(MT, /datum/map_template/ruin/away_site))
away_sites_templates[MT.name] = MT
/proc/generateMapList(filename)
var/list/potentialMaps = list()
var/list/Lines = world.file2list(filename)
if(!Lines.len)
return
for (var/t in Lines)
if (!t)
continue
t = trim(t)
if (length(t) == 0)
continue
else if (copytext(t, 1, 2) == "#")
continue
var/pos = findtext(t, " ")
var/name = null
if (pos)
name = lowertext(copytext(t, 1, pos))
else
name = lowertext(t)
if (!name)
continue
potentialMaps.Add(t)
return potentialMaps
+1
View File
@@ -38,6 +38,7 @@ var/datum/observ/item_equipped/item_equipped_event = new()
. = ..()
mob_equipped_event.raise_event(user, src, slot)
item_equipped_event.raise_event(src, user, slot)
SEND_SIGNAL(src, COMSIG_ITEM_REMOVE, src)
/obj/item/proc/check_equipped(var/mob/user, var/slot, var/assisted_equip = FALSE)
return TRUE
+1 -1
View File
@@ -369,7 +369,7 @@
var/obj/item/I = new id(H)
imprint_idcard(H,I)
if(istype(P) && P.card_slot)
addtimer(CALLBACK(src, .proc/register_pda, P, I), 1 SECOND)
addtimer(CALLBACK(src, .proc/register_pda, P, I), 2 SECOND)
else
H.equip_or_collect(I, slot_wear_id)
+7 -1
View File
@@ -6,13 +6,19 @@
It is clearly a mystery."
var/spawn_weight = 1
var/cost = null
var/spawn_cost = 0
var/player_cost = 0
var/list/sectors = list() //This ruin can only spawn in the sectors in this list.
var/prefix = null
var/suffix = null
template_flags = 0 // No duplicates by default
// !! Currently only implemented for away sites
var/list/force_ruins // Listed ruins are always spawned unless disallowed by flags.
var/list/allow_ruins // Listed ruins are added to the set of available spawns.
var/list/ban_ruins // Listed ruins are removed from the set of available spawns. Beats allowed.
/datum/map_template/ruin/New()
if (suffix)
mappath += (prefix + suffix)
+8 -3
View File
@@ -46,18 +46,23 @@
random_record = new(user)
var/datum/record/general/record = random_record.Copy()
if(I)
record.age = I.age
record.rank = I.assignment
record.real_rank = I.assignment
record.name = I.registered_name
record.sex = I.sex
record.employer = I.employer_faction
var/datum/faction/id_faction = SSjobs.name_factions[I.employer_faction]
var/faction_abbreviation = id_faction.title_suffix
var/assignment = "[I.assignment][ faction_abbreviation ? " ([faction_abbreviation])" : ""]"
record.rank = assignment
record.real_rank = assignment
else
var/mob/living/carbon/human/H
if(istype(user,/mob/living/carbon/human))
H = user
record.age = H.age
record.employer = H.employer_faction
else
record.age = initial(H.age)
var/assignment = GetAssignment(user)
+1
View File
@@ -199,6 +199,7 @@
//Ensure that antags with ANTAG_OVERRIDE_JOB do not occupy job slots.
if(flags & ANTAG_OVERRIDE_JOB)
player.assigned_role = role_text
player.role_alt_title = role_text
//Ensure that a player cannot be drafted for multiple antag roles, taking up slots for antag roles that they will not fill.
player.special_role = role_text
+2 -1
View File
@@ -6,6 +6,7 @@
//do this again, just in case
if(flags & ANTAG_OVERRIDE_JOB)
player.assigned_role = role_text
player.role_alt_title = role_text
player.special_role = role_text
if(istype(player.current, /mob/abstract))
@@ -122,4 +123,4 @@
//Run the query to update the db entry with the removal time
var/DBQuery/update_query = dbcon.NewQuery("UPDATE ss13_antag_log SET special_role_removed = :special_role_removed: WHERE id = :id:")
update_query.Execute(list("id"=db_log_id,"special_role_removed"="[get_round_duration_formatted()]:00"))
update_query.Execute(list("id"=db_log_id,"special_role_removed"="[get_round_duration_formatted()]:00"))
+1
View File
@@ -47,6 +47,7 @@
var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf
var/no_light_control = 0 // if 1, lights in area cannot be toggled with light controller
var/allow_nightmode = 0 // if 1, lights in area will be darkened by the night mode controller
var/emergency_lights = FALSE
var/station_area = 0
var/centcomm_area = 0
var/has_weird_power = FALSE // If TRUE, SSmachinery will not use the inlined power checks and will call powered() and use_power() on this area.
+1 -1
View File
@@ -292,7 +292,7 @@
/atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
return NO_EMAG_ACT
/atom/proc/fire_act()
/atom/proc/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
/atom/proc/melt()
+2 -1
View File
@@ -1,5 +1,6 @@
/obj/item/paper/talisman
icon_state = "paper_talisman"
can_change_icon_state = FALSE
var/uses = 1
var/datum/rune/rune
info = "<center><img src='talisman.png'></center><br/><br/>"
@@ -33,4 +34,4 @@
/obj/item/paper/talisman/proc/use()
uses--
if(uses <= 0)
qdel(src)
qdel(src)
@@ -81,8 +81,6 @@
if(selected_sound == 'sound/items/AirHorn.ogg' && pay_energy(3800))
adjust_instability(49) // Pay for your sins.
for(var/mob/living/carbon/M in ohearers(6, T))
//if(M.get_ear_protection() >= 2) todomatt: ear protection
// continue
M.SetSleeping(0)
M.stuttering += 20
M.ear_deaf += 30
@@ -16,8 +16,5 @@
aspect = ASPECT_BIOMED
/obj/item/spell/dispel/on_ranged_cast(atom/hit_atom, mob/living/user)
//if(isliving(hit_atom) && within_range(hit_atom) && pay_energy(1000)) todomatt: fuck this thinjg
// var/mob/living/target = hit_atom
// target.remove_modifiers_of_type(/datum/modifier/technomancer)
user.adjust_instability(10)
qdel(src)
@@ -1,35 +0,0 @@
// Gambit only spell. Heals everything unconditionally.
/obj/item/spell/modifier/mend_all
name = "mend all"
desc = "One function to heal them all."
icon_state = "mend_all"
cast_methods = CAST_MELEE
aspect = ASPECT_BIOMED
light_color = "#FF5C5C"
modifier_type = /datum/modifier/technomancer/mend_life
modifier_duration = 1 MINUTE
/datum/modifier/technomancer/mend_all
name = "mend all"
desc = "You feel serene and well rested."
mob_overlay_state = "green_sparkles"
on_created_text = "<span class='warning'>Sparkles begin to appear around you, and all your ills seem to fade away.</span>"
on_expired_text = "<span class='notice'>The sparkles have faded, although you feel much healthier than before.</span>"
stacks = MODIFIER_STACK_EXTEND
/datum/modifier/technomancer/mend_all/tick()
if(!holder.getBruteLoss() && !holder.getFireLoss() && !holder.getToxLoss() && !holder.getOxyLoss() && !holder.getCloneLoss()) // No point existing if the spell can't heal.
stop()
return
holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 120 damage over 1 minute, as tick() is run every 2 seconds.
holder.adjustFireLoss(-4 * spell_power)
holder.adjustToxLoss(-4 * spell_power)
holder.adjustOxyLoss(-4 * spell_power)
holder.adjustCloneLoss(-2 * spell_power) // 60 cloneloss
holder.adjust_instability(1)
if(origin)
var/mob/living/L = origin.resolve()
if(istype(L))
L.adjust_instability(1) //TODOMATT: Tick this file and figure this out
@@ -39,4 +39,4 @@
if(source)
var/mob/living/L = source
if(istype(L))
L.adjust_instability(1) //TODOMATT: Tick this file and figure this out
L.adjust_instability(1)
+7 -2
View File
@@ -88,9 +88,12 @@
icon_state = H.pulse() ? "[modify_state]-active" : "[modify_state]-idle"
victim = H
if(victim && !victim.isSynthetic())
if(suppressing && victim.sleeping < 3)
victim.Sleeping(3 - victim.sleeping)
if(suppressing && victim.sleeping < 7)
victim.Sleeping(7 - victim.sleeping)
victim.willfully_sleeping = FALSE
icon_state = victim.pulse() ? "[modify_state]-active" : "[modify_state]-idle"
if(victim.stat == DEAD || victim.is_asystole() || victim.status_flags & FAKEDEATH)
icon_state = "[modify_state]-critical"
return TRUE
icon_state = "[modify_state]-idle"
return FALSE
@@ -113,6 +116,8 @@
var/mob/living/carbon/human/H = C
victim = H
icon_state = H.pulse() ? "[modify_state]-active" : "[modify_state]-idle"
if(H.stat == DEAD || H.is_asystole() || H.status_flags & FAKEDEATH)
icon_state = "[modify_state]-critical"
else
icon_state = "[modify_state]-idle"
+62 -49
View File
@@ -174,55 +174,7 @@
if(is_robot_module(O))
return FALSE
//Resources are being loaded.
var/obj/item/eating = O
if(!eating.matter || !eating.recyclable)
to_chat(user, SPAN_WARNING("\The [eating] cannot be recycled by \the [src]."))
return
var/filltype = 0 // Used to determine message.
var/total_used = 0 // Amount of material used.
var/mass_per_sheet = 0 // Amount of material constituting one sheet.
for(var/material in eating.matter)
if(isnull(stored_material[material]) || isnull(storage_capacity[material]))
continue
if(stored_material[material] >= storage_capacity[material])
continue
var/total_material = eating.matter[material]
//If it's a stack, we eat multiple sheets.
if(istype(eating, /obj/item/stack))
var/obj/item/stack/stack = eating
total_material *= stack.get_amount()
if(stored_material[material] + total_material > storage_capacity[material])
total_material = storage_capacity[material] - stored_material[material]
filltype = 1
else
filltype = 2
stored_material[material] += total_material
total_used += total_material
mass_per_sheet += eating.matter[material]
if(!filltype)
to_chat(user, SPAN_WARNING("\The [src] is full. Please remove some material in order to insert more."))
return
else if(filltype == 1)
to_chat(user, SPAN_NOTICE("You fill \the [src] to capacity with \the [eating]."))
else
to_chat(user, SPAN_NOTICE("You fill \the [src] with \the [eating]."))
flick("autolathe_o", src) // Plays metal insertion animation. Work out a good way to work out a fitting animation. ~Z
if(istype(eating, /obj/item/stack))
var/obj/item/stack/stack = eating
stack.use(max(1, round(total_used / mass_per_sheet))) // Always use at least 1 to prevent infinite materials.
else
user.remove_from_mob(O)
qdel(O)
load_lathe(O, user)
updateUsrDialog()
return
@@ -334,3 +286,64 @@
qdel(S)
..()
return TRUE
#define NO_SPACE "No Space"
#define FILL_COMPLETELY "Fill Completely"
#define FILL_INCOMPLETELY "Fill Incompletely"
/obj/machinery/autolathe/proc/load_lathe(obj/item/O, mob/user)
//Resources are being loaded.
var/obj/item/eating = O
if(!eating.matter || !eating.recyclable)
to_chat(user, SPAN_WARNING("\The [eating] cannot be recycled by \the [src]."))
return
var/list/fill_status = list() // Used to determine message in cases of multiple materials.
var/total_used = 0 // Amount of material used.
var/mass_per_sheet = 0 // Amount of material constituting one sheet.
for(var/material in eating.matter)
if(isnull(stored_material[material]) || isnull(storage_capacity[material]))
continue
if(stored_material[material] >= storage_capacity[material])
LAZYADD(fill_status[NO_SPACE], material)
continue
var/total_material = eating.matter[material]
//If it's a stack, we eat multiple sheets.
if(istype(eating, /obj/item/stack))
var/obj/item/stack/stack = eating
total_material *= stack.get_amount()
if(stored_material[material] + total_material > storage_capacity[material])
total_material = storage_capacity[material] - stored_material[material]
LAZYADD(fill_status[FILL_COMPLETELY], material)
else
LAZYADD(fill_status[FILL_INCOMPLETELY], material)
stored_material[material] += total_material
total_used += total_material
mass_per_sheet += eating.matter[material]
if(fill_status[NO_SPACE])
to_chat(user, SPAN_WARNING("\The [src] is full of [english_list(fill_status[NO_SPACE])]. Please remove some material in order to insert more."))
return
else if(fill_status[FILL_COMPLETELY])
to_chat(user, SPAN_NOTICE("You fill \the [src] to capacity with [english_list(fill_status[FILL_COMPLETELY])] with \the [eating]."))
else if(fill_status[FILL_INCOMPLETELY])
to_chat(user, SPAN_NOTICE("You fill \the [src] with [english_list(fill_status[FILL_INCOMPLETELY])] \the [eating]."))
flick("autolathe_o", src) // Plays metal insertion animation. Work out a good way to work out a fitting animation. ~Z
if(istype(eating, /obj/item/stack))
var/obj/item/stack/stack = eating
stack.use(min(stack.get_amount(), total_used / mass_per_sheet)) // Prevent maths imprecision from leading to infinite resources
else
user.remove_from_mob(O)
qdel(O)
#undef NO_SPACE
#undef FILL_COMPLETELY
#undef FILL_INCOMPLETELY
+1 -1
View File
@@ -330,7 +330,7 @@
// shouldn't be reachable if occupant is invalid
if(href_list["print"])
var/obj/item/paper/R = new(loc)
var/obj/item/paper/medscan/R = new(loc)
R.color = "#eeffe8"
R.set_content_unsafe("Scan ([connected.occupant])", format_occupant_data(connected.get_occupant_data()))
+9 -1
View File
@@ -1,3 +1,5 @@
#define SLOW_MODE_MAX_TEMP_CHANGE 2 //C
/obj/machinery/chem_heater
name = "chemical heater"
desc = "A simple device that can be used to heat the contents of a beaker to a precise temperature."
@@ -14,6 +16,7 @@
var/should_heat = TRUE
var/min_temperature = 100
var/max_temperature = 600
var/slow_mode = FALSE
component_types = list(
/obj/item/circuitboard/chem_heater,
@@ -56,6 +59,7 @@
var/dat = "<html>"
dat += "Power: <a href='?src=\ref[src];action=togglepower'>[use_power ? "On" : "Off"]</a>"
dat += "<p>Slow Heating Mode: <a href='?src=\ref[src];action=slowmode'>[slow_mode ? "On" : "Off"]</a>"
dat += "<p>Target Temp: [round(target_temperature)]K / [round(target_temperature - T0C,0.1)]C<br>"
@@ -102,6 +106,8 @@
target_temperature = max(min_temperature,min(target_temperature + text2num(href_list["power"]),max_temperature))
if(container)
should_heat = target_temperature >= container.get_temperature()
if("slowmode")
slow_mode = !slow_mode
updateUsrDialog()
@@ -115,6 +121,7 @@
if(container && container.reagents)
var/current_temperature = container.reagents.get_temperature()
var/target_temperature_limited = slow_mode ? current_temperature + SLOW_MODE_MAX_TEMP_CHANGE : target_temperature
if(should_heat && current_temperature >= target_temperature)
use_power = 0
@@ -128,7 +135,7 @@
var/joules_to_use = machine_strength * 1000
var/mod = should_heat ? 1 : -1
var/thermal_energy_change = 0
var/thermal_energy_limit = container.reagents.get_thermal_energy_change(current_temperature,target_temperature) //Don't go over the target temperature
var/thermal_energy_limit = container.reagents.get_thermal_energy_change(current_temperature,target_temperature_limited) //Don't go over the target temperature
var/thermal_energy_limit2 = container.reagents.get_thermal_energy_change(current_temperature,current_temperature + machine_strength*mod*5) //So small reagents don't go from 0 to 1000 in a few seconds.
if(mod > 0) //GOING UP
thermal_energy_change = min(joules_to_use,thermal_energy_limit,thermal_energy_limit2)
@@ -155,3 +162,4 @@
#undef SLOW_MODE_MAX_TEMP_CHANGE
+246 -10
View File
@@ -11,6 +11,11 @@
circuit = /obj/item/circuitboard/operating
var/mob/living/carbon/human/victim = null
var/obj/machinery/optable/table = null
var/last_ba // Brain Activity
var/last_bo // Blood Oxygenation
var/last_critical
var/obj/item/paper/medscan/input_scan = null
var/obj/machinery/body_scanconsole/internal_bodyscanner = null
/obj/machinery/computer/operating/Initialize()
. = ..()
@@ -19,6 +24,11 @@
if (table)
table.computer = src
break
if(!internal_bodyscanner) // So it can scan correctly
var/obj/machinery/body_scanconsole/S = new (src)
S.forceMove(src)
S.use_power = FALSE
internal_bodyscanner = S
/obj/machinery/computer/operating/attack_ai(mob/user)
if(!ai_can_interact(user))
@@ -35,6 +45,22 @@
return
interact(user)
/obj/machinery/computer/operating/attackby(obj/item/O as obj, mob/user)
if(istype(O, /obj/item/paper/medscan))
if(input_scan)
to_chat(usr, SPAN_NOTICE("There is already a [O] inside!"))
return
user.drop_from_inventory(O,src)
input_scan = O
input_scan.color = "#272727"
input_scan.set_content_unsafe("Scan ([victim])", operating_format(get_medical_data(victim)))
usr.visible_message("\The [src] pings, displaying \the [input_scan].")
to_chat(usr, SPAN_NOTICE("You insert \the [O] into [src]."))
playsound(src, 'sound/bureaucracy/scan.ogg', 50, 1)
else
to_chat(usr, SPAN_NOTICE("You try to insert \the [O], but \the [src] buzzes, unable to read it."))
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
return
/obj/machinery/computer/operating/interact(mob/user)
if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) )
@@ -48,12 +74,23 @@
if(src.table && (src.table.check_victim()))
src.victim = src.table.victim
dat += {"
<B>Patient Information:</B><BR>
Brain Activity: <b>[victim.isFBP() ? "<span class='danger'>N/A</span>" : victim.get_brain_status()]</b><br>
Pulse: <b>[victim.get_pulse(GETPULSE_TOOL)]</b><br>
BP: <b>[victim.get_blood_pressure()]</b><br>
Blood Oxygenation: <b>[victim.get_blood_oxygenation()]</b><br>
"}
<B>Patient Information:</B><BR>
Brain Activity: <b>[victim.isFBP() ? "<span class='danger'>N/A</span>" : victim.get_brain_status()]</b><br>
Pulse: <b>[victim.get_pulse(GETPULSE_TOOL)]</b><br>
BP: <b>[victim.get_blood_pressure()]</b><br>
Blood Oxygenation: <b>[victim.get_blood_oxygenation()]</b><br>
Blood Volume: <b>[victim.get_blood_volume()]%</b><br>
"}
if(!input_scan)
dat += "Patient Scan: <b>Scan not found. Please insert a Medical Scan.</b><br>"
else
dat += {"
Patient Scan: <b>[input_scan]</b><br>
<a href='?src=\ref[src];action=update'>Update scan</a>
<a href='?src=\ref[src];action=eject'>Remove and update scan</a>
<a href='?src=\ref[src];action=print_new'>Print new scan</a><br><hr>
"}
dat += "[input_scan.get_content()]"
else
src.victim = null
dat += {"
@@ -61,7 +98,7 @@ Blood Oxygenation: <b>[victim.get_blood_oxygenation()]</b><br>
<BR>
<B>No Patient Detected</B>
"}
var/datum/browser/op_win = new(user, "op", capitalize_first_letters(name), 200, 200)
var/datum/browser/op_win = new(user, "op", capitalize_first_letters(name), 450, 800)
op_win.set_content(dat)
op_win.open()
@@ -76,18 +113,217 @@ Blood Oxygenation: <b>[victim.get_blood_oxygenation()]</b><br>
to_chat(user, SPAN_NOTICE("Pulse: [victim.get_pulse(GETPULSE_TOOL)]"))
to_chat(user, SPAN_NOTICE("BP: [victim.get_blood_pressure()]"))
to_chat(user, SPAN_NOTICE("Blood Oxygenation: [victim.get_blood_oxygenation()]"))
to_chat(user, SPAN_NOTICE("Blood Volume: [victim.get_blood_volume()]%"))
if(!input_scan)
to_chat(user, SPAN_NOTICE("Patient Scan: Scan not found. Please insert the Medical Scan."))
else
to_chat(user, SPAN_NOTICE("Patient Scan: [input_scan]"))
else
src.victim = null
to_chat(user, SPAN_NOTICE("No Patient Detected"))
/obj/machinery/computer/operating/Topic(href, href_list)
if(..())
return 1
..()
if(href_list["action"])
switch(href_list["action"])
if("update")
input_scan.set_content_unsafe("Scan ([victim])", operating_format(get_medical_data(victim)))
usr.visible_message("\The [src] chimes, updating \the [input_scan].")
playsound(src, 'sound/machines/chime.ogg', 50, 1)
if("eject")
usr.visible_message("\The [src] beeps, ejecting \the [input_scan].")
input_scan.color = "#eeffe8"
input_scan.set_content_unsafe("Scan ([victim])", internal_bodyscanner.format_occupant_data(get_medical_data(victim))) // Re-formats it correctly
input_scan.forceMove(usr.loc)
usr.put_in_hands(input_scan)
input_scan = null
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
if("print_new")
print_new()
usr.visible_message("\The [src] beeps, printing a new [input_scan] after a moment.")
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
return
/obj/machinery/computer/operating/machinery_process()
if(operable())
src.updateDialog()
if(src.table && (src.table.check_victim())) // Specific warning alarms for specific conditions. Times to be tweaked according to feedback
src.victim = src.table.victim
if(src.victim.stat != DEAD && !src.victim.is_diona())
if(victim.get_blood_oxygenation() < 30 && victim.get_brain_result() < 20)
if(world.time > last_critical + 25 SECONDS)
last_critical = world.time
src.visible_message(SPAN_WARNING("Warning! <b>[victim]'s Blood Oxygenation AND Brain Activity</b> are in critical condition!"))
playsound(src, 'sound/effects/3.wav', 75)
else
if(victim.get_blood_oxygenation() < 30 && victim.get_brain_result() > 20)
blood_oxygenation_alarm()
if(victim.get_brain_result() < 20 && victim.get_blood_oxygenation() > 30)
brain_activity_alarm()
/obj/machinery/computer/operating/proc/blood_oxygenation_alarm()
if(world.time > last_bo + 25 SECONDS)
last_bo = world.time
src.visible_message(SPAN_WARNING("Warning! <b>[victim]'s Blood Oxygenation</b> is in critical condition!"))
playsound(src, 'sound/machines/ringer.ogg', 50)
/obj/machinery/computer/operating/proc/brain_activity_alarm()
if(world.time > last_ba + 20 SECONDS)
last_ba = world.time
src.visible_message(SPAN_WARNING("Warning! <b>[victim]'s Brain Activity</b> is in critical condition!"))
playsound(src, 'sound/effects/alert.ogg', 50)
// PRINTING SHENANIGANRY
/obj/machinery/computer/operating/proc/print_new()
var/obj/item/paper/medscan/S = new()
usr.put_in_hands(S)
S.color = "#eeffe8"
S.set_content_unsafe("Scan ([victim])", internal_bodyscanner.format_occupant_data(get_medical_data(victim)))
playsound(src, 'sound/bureaucracy/print.ogg', 50, 1)
/obj/machinery/computer/operating/proc/get_medical_data(var/mob/living/carbon/human/H)
if (!ishuman(H))
return
var/list/medical_data = list(
"stationtime" = worldtime2text(),
"brain_activity" = H.get_brain_status(),
"blood_volume" = H.get_blood_volume(),
"blood_oxygenation" = H.get_blood_oxygenation(),
"blood_pressure" = H.get_blood_pressure(),
"bruteloss" = get_severity(H.getBruteLoss(), TRUE),
"fireloss" = get_severity(H.getFireLoss(), TRUE),
"oxyloss" = get_severity(H.getOxyLoss(), TRUE),
"toxloss" = get_severity(H.getToxLoss(), TRUE),
"cloneloss" = get_severity(H.getCloneLoss(), TRUE),
"rads" = H.total_radiation,
"paralysis" = H.paralysis,
"bodytemp" = H.bodytemperature,
"borer_present" = H.has_brain_worms(),
"inaprovaline_amount" = REAGENT_VOLUME(H.reagents, /decl/reagent/inaprovaline),
"dexalin_amount" = REAGENT_VOLUME(H.reagents, /decl/reagent/dexalin),
"stoxin_amount" = REAGENT_VOLUME(H.reagents, /decl/reagent/soporific),
"bicaridine_amount" = REAGENT_VOLUME(H.reagents, /decl/reagent/bicaridine),
"dermaline_amount" = REAGENT_VOLUME(H.reagents, /decl/reagent/dermaline),
"thetamycin_amount" = REAGENT_VOLUME(H.reagents, /decl/reagent/thetamycin),
"blood_amount" = REAGENT_VOLUME(H.vessel, /decl/reagent/blood),
"disabilities" = H.sdisabilities,
"lung_ruptured" = H.is_lung_ruptured(),
"external_organs" = H.organs.Copy(),
"internal_organs" = H.internal_organs.Copy(),
"species_organs" = H.species.has_organ
)
return medical_data
/obj/machinery/computer/operating/proc/operating_format(var/list/occ) // Format to cut out redundant information
var/dat = "<center><b>Scan last updated at [occ["stationtime"]]</b></center>"
if(occ["borer_present"])
dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.<br>"
dat += "<center><div style='background-color: #E8FAFF; color: black'><table border='1'>"
dat += "<tr>"
dat += "<th>Organ</th>"
dat += "<th>Burn Severity</th>"
dat += "<th>Physical Trauma</th>"
dat += "<th>Other Wounds</th>"
dat += "</tr>"
for(var/obj/item/organ/external/e in occ["external_organs"])
var/AN = ""
var/open = ""
var/infected = ""
var/imp = ""
var/bled = ""
var/robot = ""
var/splint = ""
var/internal_bleeding = ""
var/severed_tendon = ""
var/lung_ruptured = ""
var/dislocated = ""
dat += "<tr>"
if(e.status & ORGAN_ARTERY_CUT)
internal_bleeding = "Arterial bleeding."
if(e.tendon_status() & TENDON_CUT)
severed_tendon = "Severed tendon."
if(istype(e, /obj/item/organ/external/chest) && occ["lung_ruptured"])
lung_ruptured = "Lung ruptured."
if(e.status & ORGAN_SPLINTED)
splint = "Splinted."
if(e.is_dislocated())
dislocated = "Dislocated."
if(e.status & ORGAN_BLEEDING)
bled = "Bleeding."
if(e.status & ORGAN_BROKEN)
AN = "[e.broken_description]."
if(e.status & ORGAN_ROBOT)
robot = "Prosthetic."
if(e.open)
open = "Open."
var/infection = internal_bodyscanner.get_infection_level(e.germ_level)
if (infection != "")
infected = "[infection] infection"
if(e.rejecting)
infected += " (being rejected)"
if (e.implants.len)
var/unknown_body = 0
for(var/I in e.implants)
if(is_type_in_list(I,internal_bodyscanner.known_implants))
imp += "[I] implanted:"
else
unknown_body++
if(unknown_body)
imp += "Unknown body present:"
if(!AN && !open && !infected & !imp)
AN = "None:"
if(!e.is_stump())
dat += "<td>[e.name]</td><td>[e.burn_dam]</td><td>[get_severity(e.brute_dam, TRUE)]</td><td>[robot][bled][AN][splint][open][infected][imp][dislocated][internal_bleeding][severed_tendon][lung_ruptured]</td>"
else
dat += "<td>[e.name]</td><td>-</td><td>-</td><td>Not [e.is_stump() ? "Found" : "Attached Completely"]</td>"
dat += "</tr>"
for(var/obj/item/organ/internal/i in occ["internal_organs"])
var/mech = ""
if(i.robotic == ROBOTIC_ASSISTED)
mech = "Assisted:"
if(i.robotic == ROBOTIC_MECHANICAL)
mech = "Mechanical:"
var/infection = internal_bodyscanner.get_infection_level(i.germ_level)
if(infection == "")
infection = "No Infection"
else
infection = "[infection] infection"
if(i.rejecting)
infection += "(being rejected)"
var/necrotic = ""
if(i.get_scarring_level() > 0.01)
necrotic += ", [i.get_scarring_results()]"
if(i.status & ORGAN_DEAD)
necrotic = ", <span class='warning'>necrotic and decaying</span>"
dat += "<tr>"
dat += "<td>[i.name]</td><td>N/A</td><td>[internal_bodyscanner.get_internal_damage(i)]</td><td>[infection], [mech][necrotic]</td><td></td>"
dat += "</tr>"
dat += "</table></div></center>"
var/list/species_organs = occ["species_organs"]
for(var/organ_name in species_organs)
if(!locate(species_organs[organ_name]) in occ["internal_organs"])
dat += text("<span class='warning'>No [organ_name] detected.</span><BR>")
if(occ["sdisabilities"] & BLIND)
dat += text("<span class='warning'>Cataracts detected.</span><BR>")
if(occ["sdisabilities"] & NEARSIGHTED)
dat += text("<font color='red'>Retinal misalignment detected.</font><BR>")
return dat
+3 -3
View File
@@ -15,7 +15,7 @@
var/icon_screen = "generic"
var/icon_scanline
var/light_range_on = 2
var/light_power_on = 1
var/light_power_on = 1.3
var/overlay_layer
var/is_holographic = TRUE
var/icon_broken = "broken"
@@ -63,7 +63,7 @@
set_light(0)
return
else
set_light(light_range_on, light_power_on)
set_light(light_range_on, light_power_on, COLOR_CYAN)
icon_state = initial(icon_state)
@@ -89,7 +89,7 @@
if(stat & NOPOWER)
set_light(0)
else
set_light(light_range_on, light_power_on)
set_light(light_range_on, light_power_on, COLOR_CYAN)
/obj/machinery/computer/proc/set_broken()
+3 -3
View File
@@ -236,9 +236,9 @@
update_icon()
return
/obj/machinery/firealarm/proc/set_security_level(var/newlevel)
if(seclevel != newlevel)
seclevel = newlevel
/obj/machinery/firealarm/set_emergency_state(var/new_security_level)
if(seclevel != new_security_level)
seclevel = new_security_level
update_icon()
/obj/machinery/firealarm/Initialize(mapload, ndir = 0, building)
+5
View File
@@ -530,5 +530,10 @@ Class Procs:
if((. = .(candidate)))
return
/obj/machinery/proc/on_user_login(mob/M)
return
/obj/machinery/proc/set_emergency_state(var/new_security_level)
return
+1 -1
View File
@@ -93,7 +93,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
cut_overlays() //reset overlays
add_overlay(screen_overlays["newscaster-screen"])
set_light(1.4, 1, COLOR_CYAN)
set_light(1.4, 1.3, COLOR_CYAN)
if(!alert || !SSnews.wanted_issue) // since we're transparent I don't want overlay nonsense
add_overlay(screen_overlays["newscaster-title"])
+2
View File
@@ -135,8 +135,10 @@ Buildable meters
else if(istype(make_from, /obj/machinery/atmospherics/unary/vent_scrubber))
src.pipe_type = PIPE_SCRUBBER
else if(istype(make_from, /obj/machinery/atmospherics/binary/passive_gate/scrubbers))
connect_types = CONNECT_TYPE_SCRUBBER
src.pipe_type = PIPE_PASSIVE_GATE_SCRUBBER
else if(istype(make_from, /obj/machinery/atmospherics/binary/passive_gate/supply))
connect_types = CONNECT_TYPE_SUPPLY
src.pipe_type = PIPE_PASSIVE_GATE_SUPPLY
else if(istype(make_from, /obj/machinery/atmospherics/binary/passive_gate))
src.pipe_type = PIPE_PASSIVE_GATE
+38 -1
View File
@@ -154,6 +154,14 @@
else if(default_part_replacement(user, O))
return
if(istype(O, /obj/item/grab))
var/obj/item/grab/grab = O
var/mob/living/L = grab.affecting
if(!L.isSynthetic())
return
move_ipc(grab.affecting)
qdel(O)
..()
/obj/machinery/recharge_station/RefreshParts()
@@ -256,6 +264,19 @@
occupant = null
update_icon()
/obj/machinery/recharge_station/proc/move_ipc(var/mob/M) // For the grab/drag and drop
var/mob/living/R = M
usr.visible_message(SPAN_NOTICE("[usr] starts putting [R] into [src]."), SPAN_NOTICE("You start putting [R] into [src]."), range = 3)
if(do_mob(usr, R, 5 SECONDS))
if(go_in(R))
usr.visible_message(SPAN_NOTICE("After some effort, [usr] manages to get [R] into the recharging unit!"))
return 1
else
to_chat(usr, SPAN_DANGER("Failed loading [R] into charger. Please ensure that [R]'s limbs are safely within the charger and has a power cell, and that the charger is functioning."))
else
to_chat(usr, SPAN_DANGER("Cancelled loading [R] into the charger. You and [R] must stay still!"))
return
/obj/machinery/recharge_station/verb/move_eject()
set category = "Object"
set name = "Eject Recharger"
@@ -277,7 +298,6 @@
return
go_in(usr)
/obj/machinery/recharge_station/MouseDrop_T(var/atom/movable/C, mob/user)
if (istype(C, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = C
@@ -295,4 +315,21 @@
else
to_chat(user, SPAN_DANGER("Cancelled loading [C] into the charger. You and [C] must stay still!"))
return
else if(isipc(C)) // IPCs don't take as long
var/mob/living/carbon/human/machine/R = C
if(!user.Adjacent(R) || !Adjacent(user))
to_chat(user, SPAN_DANGER("You need to get closer if you want to put [C] into that charger!"))
return
var/bucklestatus = R.bucklecheck(user)
if(!bucklestatus)
return
if(bucklestatus == 2)
var/obj/structure/LB = R.buckled_to
LB.user_unbuckle(user)
return
user.face_atom(src)
move_ipc(R)
return ..()
+4 -4
View File
@@ -90,16 +90,16 @@ var/list/obj/machinery/requests_console/allConsoles = list()
switch(newmessagepriority)
if(0)
add_overlay(screen_overlays["req_comp-idle"])
set_light(1.4, 1, COLOR_CYAN)
set_light(1.4, 1.3, COLOR_CYAN)
if(1)
add_overlay(screen_overlays["req_comp-alert"])
set_light(1.4, 1, COLOR_CYAN)
set_light(1.4, 1.3, COLOR_CYAN)
if(2)
add_overlay(screen_overlays["req_comp-redalert"])
set_light(1.4, 1, COLOR_ORANGE)
set_light(1.4, 1.3, COLOR_ORANGE)
if(3)
add_overlay(screen_overlays["req_comp-yellowalert"])
set_light(1.4, 1, COLOR_ORANGE)
set_light(1.4, 1.3, COLOR_ORANGE)
add_overlay(screen_overlays["req_comp-scanline"])
+3 -5
View File
@@ -63,7 +63,7 @@
A.turret_controls += src
else
control_area = null
updateTurrets()
if (!mapload)
power_change() //Checks power and initial settings
turretModes()
@@ -201,7 +201,6 @@
else if(href_list["command"] == "check_wildlife")
check_wildlife = value
updateTurrets()
update_icon()
SSvueui.check_uis_for_change(src)
else if(href_list["turret_ref"])
var/obj/machinery/porta_turret/aTurret = locate(href_list["turret_ref"]) in (control_area.turrets)
@@ -209,7 +208,6 @@
return
. = aTurret.Topic(href, href_list)
SSvueui.check_uis_for_change(src)
update_icon()
/obj/machinery/turretid/proc/updateTurrets()
var/datum/turret_checks/TC = getState()
@@ -222,6 +220,8 @@
TC.enabled = 0
aTurret.setState(TC)
queue_icon_update()
/obj/machinery/turretid/proc/getState()
var/datum/turret_checks/TC = new
TC.enabled = enabled
@@ -256,12 +256,10 @@
var/obj/machinery/porta_turret/aTurret = control_area.turrets[1]
lethal = aTurret.lethal
updateTurrets()
update_icon()
/obj/machinery/turretid/power_change()
..()
updateTurrets()
update_icon()
/obj/machinery/turretid/update_icon()
..()
+1 -1
View File
@@ -127,7 +127,7 @@
var/datum/asset/spritesheet/vending/v_asset
light_range = 2
light_power = 1
light_power = 1.3
/obj/machinery/vending/Initialize(mapload)
. = ..()
@@ -104,7 +104,7 @@
var/list/viruses = list()
/obj/effect/decal/cleanable/vomit/Initialize()
..()
. = ..()
create_reagents(20, src)
/obj/effect/decal/cleanable/tomato_smudge
+2
View File
@@ -336,6 +336,7 @@
/obj/item/proc/dropped(var/mob/user)
if(zoom)
zoom(user) //binoculars, scope, etc
SEND_SIGNAL(src, COMSIG_ITEM_REMOVE, src)
// Called whenever an object is moved around inside the mob's contents.
// Linker proc: mob/proc/prepare_for_slotmove, which is referenced in proc/handle_item_insertion and obj/item/attack_hand.
@@ -343,6 +344,7 @@
/obj/item/proc/on_slotmove(var/mob/user, slot)
if(zoom)
zoom(user)
SEND_SIGNAL(src, COMSIG_ITEM_REMOVE, src)
// called just as an item is picked up (loc is not yet changed)
/obj/item/proc/pickup(mob/user)
@@ -153,7 +153,7 @@
else
add_overlay(screen_overlays["intercom_screen"])
add_overlay(screen_overlays["intercom_scanline"])
set_light(1.4, 1, COLOR_CYAN)
set_light(1.4, 1.3, COLOR_CYAN)
if(broadcasting)
add_overlay(screen_overlays["intercom_b"])
if(listening)
+1 -1
View File
@@ -667,7 +667,7 @@ BREATH ANALYZER
add_fingerprint(user)
/obj/item/device/advanced_healthanalyzer/proc/print_scan(var/mob/M, var/mob/living/user)
var/obj/item/paper/R = new(user.loc)
var/obj/item/paper/medscan/R = new(user.loc)
R.color = "#eeffe8"
R.set_content_unsafe("Scan ([M.name])", internal_bodyscanner.format_occupant_data(get_medical_data(M)))
+5 -8
View File
@@ -214,11 +214,15 @@
/obj/item/glass_jar/gumball
contains = JAR_GUMBALL
var/gumball_path = /obj/item/clothing/mask/chewable/candy/gum/gumball
/obj/item/glass_jar/gumball/medical
gumball_path = /obj/item/clothing/mask/chewable/candy/gum/gumball/medical
/obj/item/glass_jar/gumball/Initialize()
..()
for(var/i = 1 to GUMBALL_MAX)
var/obj/item/clothing/mask/chewable/candy/gum/gumball/G = new(src)
var/obj/item/clothing/mask/chewable/candy/gum/gumball/G = new gumball_path(src)
contained += G
return INITIALIZE_HINT_LATELOAD
@@ -226,13 +230,6 @@
/obj/item/glass_jar/gumball/LateInitialize()
update_icon()
/obj/item/glass_jar/gumball/medical/Initialize()
for(var/i = 1 to GUMBALL_MAX)
var/obj/item/clothing/mask/chewable/candy/gum/gumball/medical/G = new(src)
contained += G
return INITIALIZE_HINT_LATELOAD
#undef JAR_NOTHING
#undef JAR_MONEY
#undef JAR_ANIMAL
+32 -1
View File
@@ -11,6 +11,29 @@
var/static/list/knitables = list(/obj/item/clothing/accessory/sweater, /obj/item/clothing/suit/storage/toggle/cardigan, /obj/item/clothing/suit/storage/toggle/cardigan/sweater, /obj/item/clothing/suit/storage/toggle/cardigan/argyle, /obj/item/clothing/accessory/sweatervest, /obj/item/clothing/accessory/sweaterturtleneck, /obj/item/clothing/gloves/fingerless/colour/knitted, /obj/item/clothing/gloves/knitted, /obj/item/clothing/accessory/bandanna/colorable/knitted, /obj/item/clothing/accessory/scarf)
var/static/list/name2knit
/obj/item/knittingneedles/verb/remove_yarn()
set name = "Remove Yarn"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
if(!ball)
to_chat(usr, SPAN_WARNING("There is no yarn on \the [src]!"))
return
if(working)
to_chat(usr, SPAN_WARNING("You can't remove \the [ball] while using \the [src]!"))
return
var/mob/living/carbon/human/H = usr
H.put_in_hands(ball)
ball = null
to_chat(usr, SPAN_NOTICE("You remove \the [ball] from \the [src]."))
update_icon()
/obj/item/knittingneedles/Destroy()
if(ball)
QDEL_NULL(ball)
@@ -30,9 +53,15 @@
item_state = initial(item_state)
if(ball)
add_overlay("[ball.icon_state]")
var/mutable_appearance/yarn_overlay = mutable_appearance(icon, "[ball.icon_state]")
if(ball.color)
yarn_overlay.color = ball.color
else
yarn_overlay.appearance_flags = RESET_COLOR
add_overlay(yarn_overlay)
else
cut_overlays()
update_held_icon()
/obj/item/knittingneedles/attackby(obj/item/O, mob/user)
if(istype(O, /obj/item/yarn))
@@ -62,6 +91,8 @@
var/image/radial_button = image(icon = initial(i.icon), icon_state = initial(i.icon_state))
options[initial(i.name)] = radial_button
var/knit_name = show_radial_menu(user, user, options, radius = 42, tooltips = TRUE)
if(!knit_name)
return
var/type_path = name2knit[knit_name]
user.visible_message("<b>[user]</b> begins knitting something soft and cozy.")
-2
View File
@@ -213,8 +213,6 @@
update_icon()
return 1
else
if(get_amount() < used)
return 0
for(var/i = 1 to charge_costs.len)
var/datum/matter_synth/S = synths[i]
if(!S.use_charge(charge_costs[i] * used)) // Doesn't need to be deleted
+6
View File
@@ -232,6 +232,12 @@
add_fingerprint(user)
/obj/item/flame/lighter/adhomai/AltClick(mob/user)
if(Adjacent(user) && !lit)
protection = !protection
playsound(src.loc, 'sound/weapons/blade_open.ogg', 50, 1)
update_icon()
/obj/item/stack/dice/tajara
name = "adhomian dice"
desc = "An adhomian dice made out of wood. Commonly used to play Suns and Moon."
+4 -2
View File
@@ -118,6 +118,7 @@ var/const/NO_EMAG_ACT = -50
//alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system
var/assignment = null //can be alt title or the actual job
var/rank = null //actual job
var/employer_faction = null
var/dorm = 0 // determines if this ID has claimed a dorm already
var/datum/ntnet_user/chat_user
@@ -150,9 +151,9 @@ var/const/NO_EMAG_ACT = -50
chat_user.username = chat_user.generateUsernameIdCard(src)
/obj/item/card/id/proc/set_id_photo(var/mob/M)
front = getFlatIcon(M, SOUTH)
front = getFlatIcon(M, SOUTH, ignore_parent_dir = TRUE)
front.Scale(128, 128)
side = getFlatIcon(M, WEST)
side = getFlatIcon(M, WEST, ignore_parent_dir = TRUE)
side.Scale(128, 128)
/mob/proc/set_id_info(var/obj/item/card/id/id_card)
@@ -173,6 +174,7 @@ var/const/NO_EMAG_ACT = -50
id_card.citizenship = citizenship
id_card.religion = SSrecords.get_religion_record_name(religion)
id_card.mob = src
id_card.employer_faction = employer_faction
/obj/item/card/id/proc/dat()
var/dat = ("<table><tr><td>")
@@ -67,6 +67,7 @@
entries[++entries.len] = list("name" = "Sex", "value" = sex)
entries[++entries.len] = list("name" = "Citizenship", "value" = citizenship)
entries[++entries.len] = list("name" = "Religion", "value" = religion)
entries[++entries.len] = list("name" = "Faction", "value" = employer_faction)
entries[++entries.len] = list("name" = "Factory Reset", "value" = "Use With Care")
data["electronic_warfare"] = electronic_warfare
data["entries"] = entries
@@ -229,6 +230,12 @@
src.religion = new_religion
to_chat(user, SPAN_NOTICE("Religion changed to '[new_religion]'."))
. = 1
if("Faction")
var/new_faction = sanitize(input(user,"Which faction would you like to put on this card?","Agent Card Faction", employer_faction) as null|text)
if(!isnull(new_faction) && CanUseTopic(user,state))
src.employer_faction = new_faction
to_chat(user, SPAN_NOTICE("Faction changed to '[new_faction]'."))
. = 1
if("Factory Reset")
if(alert("This will factory reset the card, including access and owner. Continue?", "Factory Reset", "No", "Yes") == "Yes" && CanUseTopic(user, state))
age = initial(age)
@@ -245,6 +252,7 @@
unset_registered_user()
religion = initial(religion)
sex = initial(sex)
employer_faction = initial(employer_faction)
to_chat(user, "<span class='notice'>All information has been deleted from \the [src].</span>")
. = 1
@@ -15,8 +15,10 @@
/obj/item/device/flashlight/pen,
/obj/item/seeds,
/obj/item/coin,
/obj/item/stack/dice,
/obj/item/disk,
/obj/item/implanter,
/obj/item/flame/lighter,
/obj/item/flame/match,
/obj/item/lipstick,
/obj/item/haircomb,
@@ -30,7 +32,8 @@
/obj/item/device/encryptionkey,
/obj/item/fluff,
/obj/item/storage/business_card_holder,
/obj/item/sample
/obj/item/sample,
/obj/item/key
)
slot_flags = SLOT_ID
+1 -1
View File
@@ -25,7 +25,7 @@
var/mob/living/pulling
/obj/structure/janitorialcart/full/Initialize()
..()
. = ..()
mybag = new /obj/item/storage/bag/trash(src)
mymop = new /obj/item/mop(src)
myspray = new /obj/item/reagent_containers/spray/cleaner(src)
+2
View File
@@ -187,6 +187,8 @@
update_icon()
/obj/structure/railing/CheckExit(var/atom/movable/O, var/turf/target)
if(istype(O) && CanPass(O, target))
return TRUE
if(get_dir(O.loc, target) == dir)
if(!density)
return TRUE
@@ -358,7 +358,7 @@
slowdown = 0
/obj/structure/bed/roller/Initialize()
..()
. = ..()
LAZYADD(can_buckle, /obj/structure/closet/body_bag)
/obj/structure/bed/roller/Destroy()
+6
View File
@@ -104,6 +104,7 @@
changing_turf = FALSE
turfs -= src
remove_cleanables()
cleanup_roof()
if (ao_queued)
@@ -524,3 +525,8 @@ var/const/enterloopsanity = 100
/turf/proc/is_floor()
return FALSE
/turf/proc/remove_cleanables()
for(var/obj/effect/O in src)
if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable))
qdel(O)
+4
View File
@@ -178,6 +178,10 @@
listening_objects += src
/obj/item/device/assembly_holder/Destroy()
if(a_left)
a_left.holder = null
if(a_right)
a_right.holder = null
listening_objects -= src
return ..()
+2
View File
@@ -55,6 +55,8 @@
#define RELIGION_PILOTDREAM "Pilot Dream"
#define RELIGION_ETERNAL "The Eternal"
#define RELIGION_KSSHR "Ksshr"
#define RELIGION_SHRKH "Shrkh"
//accent defines
+23
View File
@@ -8,3 +8,26 @@
eventually going supernova and expelling matter or essence across the cosmos."
book_name = "book of the eternal"
book_sprite = "eternal"
/datum/religion/ksshr
name = RELIGION_KSSHR
description = "The Ksshr, also known as the Enlightened, is a religious sect on Xrim known for their complete rejection of The First Consciousness, instead of being an agnostic \
sect that centers around working together to create a better future, as well as the advancement of technology and understanding how the universe works. The Ksshr faith is the \
primary religion of Xrim, with most of its inhabitants considering themselves a part of the religion. The Jargon Federation does encourage practicing the faith amongst the \
population so long as they continue to reject The First Consciousness, as well as stay away from the teachings of the Shrkh."
book_name = "ksshr codex"
book_sprite = "holybook"
/datum/religion/shrkh
name = RELIGION_SHRKH
description = "The Shrkh, or 'Scorned' as they call themselves, continue to follow the age-old tradition of worshipping Glorsh-Omega. They believe that Glorsh-Omega planted them \
on the planet intentionally, granting them a blissful haven via the use of technology. Once the prominent and only religion on the planet, Shrkh-ism was quickly displaced when \
Skrell explorers crashlanded and their memories, thoughts, emotions, everything was consumed, and doubt was first seeded in the minds of all Dionae on Xrim. The premise \
behind the religion itself is simple; revere, help sustain and maintain synthetic life. As synthetic life brought dionae into this haven, so too shall it be preserved. In the \
minds of the Shrkh worshippers, the Skrell that brought Ksshr to the planet were misguided. To the Shrkh, the genophage was something that never happened, a myth made up by \
the Federation to indoctrinate its population into its anti-synthetic and authoritarian beliefs. \
\
Note that due to their beliefs, those that are openly members of the faith are barred from command, machinist, and chaplain positions. They are also completely barred from \
working for Zeng-Hu due to the megacorporations ties with the Federation."
book_name = "shrkh codex"
book_sprite = "holybook"
@@ -2,7 +2,7 @@
var/name
var/description
var/list/possible_erts = list()
var/list/possible_exoplanets = list()
var/list/possible_exoplanets = list(/obj/effect/overmap/visitable/sector/exoplanet/snow, /obj/effect/overmap/visitable/sector/exoplanet/desert)
var/list/cargo_price_coef = list("nt" = 1, "hpi" = 1, "zhu" = 1, "een" = 1, "get" = 1, "arz" = 1, "blm" = 1,
"iac" = 1, "zsc" = 1, "vfc" = 1, "bis" = 1, "xmg" = 1, "npi" = 1) //how much the space sector afffects how expensive is ordering from that cargo supplier
@@ -262,7 +262,7 @@
faction = "Hephaestus Industries"
/datum/gear/faction/heph_passcard
display_name = "hephaestus burszia passcard"
path = /obj/item/clothing/accessory/badge/passcard/burszia
display_name = "hephaestus burzsia passcard"
path = /obj/item/clothing/accessory/badge/passcard/burzsia
slot = slot_tie
faction = "Hephaestus Industries"
@@ -202,6 +202,7 @@
colorpants["striped pants"] = /obj/item/clothing/under/pants/striped
colorpants["tailored jeans"] = /obj/item/clothing/under/pants/tailoredjeans
colorpants["mustang jeans"] = /obj/item/clothing/under/pants/musthangcolour
colorpants["shorts"] = /obj/item/clothing/under/shorts/color
gear_tweaks += new /datum/gear_tweak/path(colorpants)
/datum/gear/uniform/turtleneck
+19 -7
View File
@@ -31,7 +31,6 @@
var/move_trail = /obj/effect/decal/cleanable/blood/tracks/footprints
/obj/item/clothing/Initialize(var/mapload, var/material_key)
. = ..(mapload)
if(!material_key)
@@ -292,6 +291,15 @@
siemens_coefficient = between(0, material.conductivity / 10, 10)
slowdown = between(0, round(material.weight / 10, 0.1), 6)
/obj/item/clothing/proc/get_accessory(var/typepath)
if(istype(src, typepath))
return src
if(LAZYLEN(accessories))
var/accessory = locate(typepath) in accessories
if(accessory)
return accessory
return null
///////////////////////////////////////////////////////////////////////
// Ears: headsets, earmuffs and tiny objects
/obj/item/clothing/ears
@@ -388,7 +396,7 @@
/obj/item/clothing/gloves/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot)
var/image/I = ..()
if(blood_DNA)
if(blood_DNA && slot != slot_l_hand_str && slot != slot_r_hand_str)
var/image/bloodsies = image(H.species.blood_mask, "bloodyhands")
bloodsies.color = blood_color
I.add_overlay(bloodsies)
@@ -614,7 +622,7 @@
/obj/item/clothing/head/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot)
var/image/I = ..()
if(blood_DNA)
if(blood_DNA && slot != slot_l_hand_str && slot != slot_r_hand_str)
var/image/bloodsies = image(H.species.blood_mask, icon_state = "helmetblood")
bloodsies.color = blood_color
bloodsies.appearance_flags = RESET_ALPHA
@@ -690,7 +698,7 @@
/obj/item/clothing/mask/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot)
var/image/I = ..()
if(blood_DNA && has_blood_overlay)
if(blood_DNA && has_blood_overlay && slot != slot_l_hand_str && slot != slot_r_hand_str)
var/image/bloodsies = image(H.species.blood_mask, "maskblood")
bloodsies.color = blood_color
bloodsies.appearance_flags = RESET_ALPHA
@@ -851,7 +859,7 @@
/obj/item/clothing/shoes/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot)
var/image/I = ..()
if(blood_DNA)
if(blood_DNA && slot != slot_l_hand_str && slot != slot_r_hand_str)
for(var/limb_tag in list(BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/E = H.get_organ(limb_tag)
if(E && !E.is_stump())
@@ -888,6 +896,10 @@
/obj/item/clothing/shoes/clothing_class()
return "shoes"
/obj/item/clothing/shoes/clean_blood()
. = ..()
track_footprint = 0
///////////////////////////////////////////////////////////////////////
//Suit
/obj/item/clothing/suit
@@ -937,7 +949,7 @@
var/image/accessory_image = A.get_accessory_mob_overlay(H)
I.add_overlay(accessory_image)
if(blood_DNA)
if(blood_DNA && slot != slot_l_hand_str && slot != slot_r_hand_str)
var/image/bloodsies = image(icon = H.species.blood_mask, icon_state = "[blood_overlay_type]blood")
bloodsies.color = blood_color
I.add_overlay(bloodsies)
@@ -1021,7 +1033,7 @@
var/image/accessory_image = A.get_accessory_mob_overlay(H)
I.add_overlay(accessory_image)
if(blood_DNA)
if(blood_DNA && slot != slot_l_hand_str && slot != slot_r_hand_str)
var/image/bloodsies = image(icon = H.species.blood_mask, icon_state = "uniformblood")
bloodsies.color = blood_color
I.add_overlay(bloodsies)
+78 -64
View File
@@ -1,51 +1,23 @@
//Hoods for winter coats and chaplain hoodie etc
/obj/item/clothing/suit/storage/hooded
var/obj/item/clothing/head/winterhood/hood
var/hoodtype = null
var/suittoggled = FALSE
var/opened = FALSE
sprite_sheets = list(
BODYTYPE_VAURCA_BULWARK = 'icons/mob/species/bulwark/hoodie.dmi'
)
var/hoodtype = /obj/item/clothing/head/winterhood
/obj/item/clothing/suit/storage/hooded/Initialize()
. = ..()
MakeHood()
new hoodtype(src)
/obj/item/clothing/suit/storage/hooded/Destroy()
QDEL_NULL(hood)
return ..()
/obj/item/clothing/suit/storage/hooded/proc/MakeHood()
if(!hood)
hood = new hoodtype(src)
/obj/item/clothing/suit/storage/hooded/equipped(mob/user, slot)
if(slot != slot_wear_suit)
RemoveHood()
..()
/obj/item/clothing/suit/storage/hooded/proc/RemoveHood()
suittoggled = FALSE
icon_state = "[initial(icon_state)][opened ? "_open" : ""][suittoggled ? "_t" : ""]"
/obj/item/clothing/suit/storage/hooded/update_icon(var/hooded = FALSE)
SEND_SIGNAL(src, COMSIG_ITEM_STATE_CHECK, args)
icon_state = "[initial(icon_state)][hooded ? "_t" : ""]"
item_state = icon_state
// Hood got nuked. Probably because of RIGs or the like.
if(!hood)
MakeHood()
return
if(ishuman(hood.loc))
var/mob/living/carbon/H = hood.loc
H.unEquip(hood, 1)
H.update_inv_wear_suit()
hood.forceMove(src)
/obj/item/clothing/suit/storage/hooded/dropped()
RemoveHood()
/obj/item/clothing/suit/storage/hooded/on_slotmove()
RemoveHood()
. = ..()
if(usr)
usr.update_inv_wear_suit()
/obj/item/clothing/suit/storage/hooded/verb/ToggleHood()
set name = "Toggle Coat Hood"
@@ -55,31 +27,7 @@
if(use_check_and_message(usr))
return 0
if(!suittoggled)
if(ishuman(loc))
var/mob/living/carbon/human/H = src.loc
if(H.wear_suit != src)
to_chat(H, "<span class='warning'>You must be wearing [src] to put up the hood!</span>")
return
if(H.head)
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
return
else
suittoggled = TRUE
icon_state = "[initial(icon_state)][opened ? "_open" : ""]"
//spawn appropriate hood.
CreateHood()
H.equip_to_slot_if_possible(hood,slot_head,0,0,1)
H.update_inv_wear_suit()
else
RemoveHood()
/obj/item/clothing/suit/storage/hooded/proc/CreateHood()
hood.color = src.color
hood.icon_state = "[icon_state]_hood"
hood.item_state = "[icon_state]_hood"
icon_state = "[icon_state][suittoggled ? "_t" : ""]"
item_state = icon_state
SEND_SIGNAL(src, COMSIG_ITEM_UPDATE_STATE)
update_icon()
//hoodies and the like
@@ -98,7 +46,6 @@
bio = ARMOR_BIO_MINOR
)
siemens_coefficient = 0.75
hoodtype = /obj/item/clothing/head/winterhood
/obj/item/clothing/head/winterhood
name = "winter hood"
@@ -112,6 +59,75 @@
flags_inv = HIDEEARS | BLOCKHAIR | HIDEEARS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
canremove = 0
var/hooded = FALSE
/obj/item/clothing/head/winterhood/Initialize(mapload, material_key)
. = ..()
if(isclothing(loc))
RegisterSignal(loc, COMSIG_ITEM_REMOVE, .proc/RemoveHood)
RegisterSignal(loc, COMSIG_PARENT_QDELETING, /datum/.proc/Destroy)
RegisterSignal(loc, COMSIG_ITEM_STATE_CHECK, .proc/hooded)
RegisterSignal(loc, COMSIG_ITEM_UPDATE_STATE, .proc/change_hood)
RegisterSignal(loc, COMSIG_ITEM_ICON_UPDATE, /atom/.proc/update_icon)
color = loc.color
icon_state = "[loc.icon_state]_hood"
item_state = "[loc.icon_state]_hood"
/obj/item/clothing/head/winterhood/update_icon(mob/user)
. = ..()
if(isclothing(loc))
color = loc.color
icon_state = "[loc.icon_state]_hood"
item_state = "[loc.icon_state]_hood"
/obj/item/clothing/head/winterhood/proc/hooded(var/hood, list/arguments)
arguments[1] = hooded
/obj/item/clothing/head/winterhood/proc/change_hood(var/parent)
if(!hooded)
if(CheckSlot(parent))
var/mob/living/carbon/human/H = get_human(parent)
hooded = TRUE
update_icon(H)
H.equip_to_slot_if_possible(src,slot_head,0,0,1)
usr.visible_message(SPAN_NOTICE("[usr] pulls up the hood on \the [src]."))
else
RemoveHood(parent)
usr.visible_message(SPAN_NOTICE("[usr] pulls down the hood on \the [src]."))
/obj/item/clothing/head/winterhood/proc/RemoveHood(var/parent)
if(ishuman(loc))
var/mob/living/carbon/H = loc
H.unEquip(src, 1)
forceMove(parent)
update_icon(H)
hooded = FALSE
/obj/item/clothing/head/winterhood/proc/get_human(var/obj/parent)
var/mob/living/carbon/human/H
if(isclothing(parent.loc))
if(ishuman(parent.loc.loc))
H = parent.loc.loc
else if(ishuman(parent.loc))
H = parent.loc
return H
/obj/item/clothing/head/winterhood/proc/CheckSlot(var/parent)
var/mob/living/carbon/human/H = get_human(parent)
var/obj/base_item = loc
if(isclothing(loc.loc))
base_item = loc.loc
if(H)
if(H.wear_suit != base_item && H.w_uniform != base_item)
to_chat(H, SPAN_WARNING("You must be wearing [base_item] to put up the hood!"))
return FALSE
else if(H.head)
to_chat(H, SPAN_WARNING("You're already wearing something on your head!"))
return FALSE
else
return TRUE
return FALSE
/obj/item/clothing/suit/storage/hooded/wintercoat/red
name = "red winter coat"
@@ -210,8 +226,6 @@
playsound(src, 'sound/items/zip.ogg', EQUIP_SOUND_VOLUME, TRUE)
icon_state = "[initial(icon_state)][opened ? "_open" : ""]"
item_state = icon_state
if(suittoggled)
CreateHood() //rebuild the hood with open/closed version
update_icon()
update_clothing_icon()
usr.update_inv_head()
+1 -1
View File
@@ -337,7 +337,7 @@ obj/item/clothing/suit/apron/overalls/blue
item_state = "firstresponderjacket"
/obj/item/clothing/suit/storage/toggle/fr_jacket/zeng
desc = "A dark green first responder jacket."
desc = "A first responder jacket in the classic white and purple of Zeng-Hu Pharmaceuticals."
icon = 'icons/clothing/suits/coats/zeng_responder.dmi'
contained_sprite = TRUE
icon_state = "zengresponderjacket"
@@ -108,7 +108,6 @@
contained_sprite = TRUE
flags_inv = HIDETAIL
no_overheat = TRUE
hoodtype = /obj/item/clothing/head/winterhood
desc_fluff = "Today the fashion that dominates Adhomai shares few similarities to the clothing of old Furs, linen, hemp, silk and other such fabrics were traded for \
synthetic versions, creating a massive boom in the nylon industry and textile industry in the cities. Jeans, overcoats, army uniforms, parade uniforms, flags, pants, shirts, ties, \
suspenders, overalls are now the fashion of every Tajara from Nal'Tor to Kaltir. The protests of \"Old fashion\" supporters can't stand against how undeniably effective and cheap \
@@ -451,9 +451,9 @@
icon_state = "passcard_techno"
item_state = "passcard_techno"
/obj/item/clothing/accessory/badge/passcard/burszia
name = "burszian passcard"
desc = "A passcard issued to Burszian Hephaestus employees and- owned IPCs- working abroad."
/obj/item/clothing/accessory/badge/passcard/burzsia
name = "burzsian passcard"
desc = "A passcard issued to Burzsian Hephaestus employees and- owned IPCs- working abroad."
desc_fluff = "Despite protest from the Himean representatives in government, Hephaestus Industries- citing their 'Home is where the Hephaestus is' initiative- is permitted to issue up to five thousand \
sponsored passcards to participating employees on a yearly basis, both to remind them of their home and to save on imported labor costs."
icon_state = "passcard_burs"
@@ -116,14 +116,8 @@
if(usr.stat) return
//can't we just use src here?
var/obj/item/clothing/accessory/holster/H = null
if(istype(src, /obj/item/clothing/accessory/holster))
H = src
if(!H && istype(src, /obj/item/clothing))
var/obj/item/clothing/S = src
if(LAZYLEN(S.accessories))
H = locate() in S.accessories
if(!H && istype(src, /obj/item/clothing/suit/armor/tactical)) // This armor is a snowflake and has an integrated holster.
var/obj/item/clothing/accessory/holster/H = get_accessory(/obj/item/clothing/accessory/holster)
if(!H && istype(src, /obj/item/clothing/suit/armor/tactical)) // This armor is a snowflake and has an integrated holster.
var/obj/item/clothing/suit/armor/tactical/tacticool = src
H = tacticool.holster
+4
View File
@@ -29,6 +29,10 @@
icon_state = "greyshorts"
item_state = "greyshorts"
/obj/item/clothing/under/shorts/color
icon_state = "colshorts"
item_state = "colshorts"
/obj/item/clothing/under/shorts/scc
name = "Stellar Corporate Conglomerate shorts"
desc = "Shorts displaying the wearer's pride in their assigned corporate entity."
+123 -29
View File
@@ -1354,11 +1354,14 @@ All custom items with worn sprites must follow the contained sprite system: http
/obj/item/clothing/suit/storage/toggle/labcoat/fluff/mekesatis_labcoat //Biochemist Holocoat - Neith Mekesatis - vrow
name = "biochemist holocoat"
desc = "An Eridani Corporate Federation holocoat modelled after a standard biochemist labcoat. It is extremely well cared for."
desc = "An extremely cared for and high quality labcoat that protects against minor chemical spills. The material feels like it could shimmer. There is a pharmaceutical logo displayed on the front."
icon = 'icons/obj/custom_items/mekesatis_holocoat.dmi'
icon_override = 'icons/obj/custom_items/mekesatis_holocoat.dmi'
icon_state = "mekesatis_labcoat"
item_state = "mekesatis_labcoat"
var/holo_name = "eridanian holocoat"
var/holo_desc = "An impeccably designed and cared for dark Eridani Corporate Federation holocoat modelled after a high quality labcoat. It has a prominent animated logo of the ECF on the back, \
as well as a minor one across the front."
var/changed = FALSE
var/changing = FALSE
@@ -1369,14 +1372,17 @@ All custom items with worn sprites must follow the contained sprite system: http
return
if(!(all_languages[LANGUAGE_TRADEBAND] in user.languages))
to_chat(user, SPAN_NOTICE("On the inside of the coat there are various sentences in Tradeband printed in an elegant blue font."))
to_chat(user, SPAN_NOTICE("On the inside of the coat there is a sentence in Tradeband printed in [changed ? "an elegant blue" : "a stylish red"] font."))
return
else if(!changed)
to_chat(user, SPAN_NOTICE("On the inside of the coat, the following words are printed in a stylish red font:<br><span style='font-family: Fixedsys; color: red'>Exclusive Time Limited Holocoat Deal from July 30, 2459. \
Now with graced with an animated Eridani Corporate Federation logo. For the Prosperity of all Eridanians - <i>Delta HoloTextiles. Sector Alpha's best wears.</i></span>"))
return
else
to_chat(user, SPAN_NOTICE("On the inside of the coat, the following words are printed in an elegant blue font:<br>Exclusive Time Limited Holocoat Deal from July 30, 2459. \
Now with graced with an animated Eridani Corporate Federation logo. For the Prosperity of all Eridanians - <i>Delta HoloTextiles. Sector Alpha's best \
wears.</i><br><small><i><font face='Courier New'>Every cloud has a silver lining, and you should be happy for yours. Congratulations on your \
graduation.</font> - <font face='Times New Roman'>Teremun A. M.</font></i></small>"))
to_chat(user, SPAN_NOTICE("On the inside of the coat, the following words are printed in an elegant blue font:<br><i><font face='Courier New'>Every cloud has a silver lining, \
and you should be grateful for yours. Congratulations on your graduation.</font> - <font face='Times New Roman'>Taiwo O. M.</font></i>"))
return
/obj/item/clothing/suit/storage/toggle/labcoat/fluff/mekesatis_labcoat/toggle_open()
@@ -1399,15 +1405,17 @@ All custom items with worn sprites must follow the contained sprite system: http
if(changing)
return
usr.visible_message("<span class='notice'>With a subtle gesture, [changed ? "the holocoat fades to a normal labcoat." : "the labcoat flickers in activity!"]</span>")
usr.visible_message("<span class='notice'>With a subtle gesture, [changed ? "the holocoat fades to a normal labcoat." : "the labcoat shimmers in activity!"]</span>")
icon_state = "mekesatis_[changed ? "labcoat_r" : "holocoat_t"][opened ? "_open" : ""]"
item_state = icon_state
name = "[changed ? initial(name) : holo_name]"
desc = "[changed ? initial(desc) : holo_desc]"
flick("mekesatis_[changed ? "labcoat_r" : "holocoat_t"][opened ? "_open" : ""]", src)
update_icon()
usr.update_inv_wear_suit()
changing = TRUE
addtimer(CALLBACK(src, .proc/finish_toggle, usr), 10 SECONDS)
addtimer(CALLBACK(src, .proc/finish_toggle, usr), 6 SECONDS)
/obj/item/clothing/suit/storage/toggle/labcoat/fluff/mekesatis_labcoat/proc/finish_toggle(mob/user)
changed = !changed
@@ -2094,6 +2102,35 @@ All custom items with worn sprites must follow the contained sprite system: http
var/desc2 = "A blue cloak with the symbol of the New Kingdom of Adhomai proudly displayed on the back.\nUpon closer examination it appears to be a patchwork of older textile and newer fabrics, with the inside of the cloak appearing to be colored differently."
var/changed = FALSE
var/hoodtype = /obj/item/clothing/head/winterhood/fluff/kathira_hood
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/Initialize()
. = ..()
new hoodtype(src)
/obj/item/clothing/head/winterhood/fluff/kathira_hood
name = "handsewn hood"
desc = "A hood attached to a cloak."
icon = 'icons/obj/custom_items/kathira_cloak.dmi'
icon_override = 'icons/obj/custom_items/kathira_cloak.dmi'
icon_state = "idris_cloak_hood"
contained_sprite = TRUE
flags_inv = HIDEEARS | BLOCKHAIR | HIDEEARS
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/update_icon(var/hooded = FALSE)
var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = get_accessory(/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak)
K.icon_state = "[K.changed ? K.style : initial(K.icon_state)]"
SEND_SIGNAL(K, COMSIG_ITEM_STATE_CHECK, args)
K.item_state = "[K.icon_state][hooded ? "_up" : ""]"
K.name = "[K.changed ? K.name2 : initial(K.name)]"
K.desc = "[K.changed ? K.desc2 : initial(K.desc)]"
K.accessory_mob_overlay = null
. = ..()
SEND_SIGNAL(K, COMSIG_ITEM_ICON_UPDATE)
if(usr)
usr.update_inv_w_uniform()
usr.update_inv_wear_suit()
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_cloak()
set name = "Change Cloak"
set category = "Object"
@@ -2102,38 +2139,40 @@ All custom items with worn sprites must follow the contained sprite system: http
if(use_check_and_message(usr))
return
var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = null
if(istype(src, /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak))
K = src
if(!K && isclothing(src))
var/obj/item/clothing/S = src
if(LAZYLEN(S.accessories))
K = locate() in S.accessories
var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = get_accessory(/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak)
if(!K)
return
usr.visible_message(SPAN_NOTICE("[usr] swiftly pulls \the [K] inside out, changing its appearance."))
K.icon_state = "[K.changed ? initial(K.icon_state) : K.style]"
K.item_state = K.icon_state
K.name = "[K.changed ? initial(K.name) : K.name2]"
K.desc = "[K.changed ? initial(K.desc) : K.desc2]"
K.accessory_mob_overlay = null
K.changed = !K.changed
K.update_icon()
usr.update_icon()
usr.update_inv_w_uniform()
usr.update_inv_wear_suit()
SEND_SIGNAL(K, COMSIG_ITEM_REMOVE, K)
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/on_attached(obj/item/clothing/S, mob/user as mob)
..()
has_suit.verbs += /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_cloak
has_suit.verbs += /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_hood
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/on_removed(mob/user as mob)
if(has_suit)
has_suit.verbs -= /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_cloak
has_suit.verbs -= /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_hood
..()
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_hood()
set name = "Toggle Hood"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = get_accessory(/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak)
if(!K)
return
SEND_SIGNAL(K, COMSIG_ITEM_UPDATE_STATE, K)
K.update_icon()
/obj/item/clothing/suit/storage/toggle/fluff/leonid_chokha //Old Rebel's Chokha - Leonid Myagmar - lucaken
name = "old rebel's chokha"
@@ -2146,7 +2185,6 @@ All custom items with worn sprites must follow the contained sprite system: http
item_state = "leonid_chokha"
contained_sprite = TRUE
/obj/item/clothing/suit/storage/toggle/fluff/sezrak_coat //red Domelkoan Coat - Sezrak Han'san - captaingecko
name = "red Domelkoan Coat"
desc = "A warm coat made in Domelkos. This red coat is stuffed with yupmi fur and made out of reinforced cloth-like synthetic materials, both to keep the wearer warm in the cold winters of \
@@ -2178,11 +2216,68 @@ All custom items with worn sprites must follow the contained sprite system: http
icon_state = "mrakiizar_book"
item_state = "mrakiizar_book"
contained_sprite = TRUE
var/open_state = "mrakiizar_book1"
var/list/open_states = list("mrakiizar_book1", "mrakiizar_book2", "mrakiizar_book3", "mrakiizar_book4")
/obj/item/journal/fluff/mrakiizar_book/update_icon()
..()
if(open)
icon_state = pick("mrakiizar_book1","mrakiizar_book2","mrakiizar_book3","mrakiizar_book4")
if(!open)
icon_state = "mrakiizar_book_closed"
else
icon_state = open_state
if(closed_desc)
desc = open ? initial(desc) + closed_desc : initial(desc)
/obj/item/journal/fluff/mrakiizar_book/attack_hand(mob/user)
if(open && user.a_intent == I_HURT)
if(!LAZYLEN(indices))
to_chat(user, SPAN_WARNING("There aren't any indices to rip a paper out of!"))
return
var/list/viable_indices = list()
for(var/index in indices)
var/obj/item/folder/embedded/E = indices[index]
if(!(locate(/obj/item/paper) in E))
continue
viable_indices += index
if(!length(viable_indices))
to_chat(user, SPAN_WARNING("None of the indices in \the [src] contain a paper!"))
return
var/selected_folder = input(user, "Select an index to rip a paper out of.", "Rip Index Select") as null|anything in viable_indices
if(isnull(selected_folder))
return
var/obj/item/folder/embedded/E = indices[selected_folder]
var/list/papers = list()
for(var/obj/item/paper/P in E)
papers += P
var/obj/item/paper/selected_paper = input(user, "Select a paper to rip out.", "Rip Paper Select") as null|anything in papers
if(isnull(selected_paper))
return
user.visible_message(SPAN_WARNING("<b>[user]</b> rips \the [selected_paper] out of \the [src]."), SPAN_NOTICE("You rip \the [selected_paper] out of \the [src]."), range = 5)
if(selected_paper.can_change_icon_state)
selected_paper.icon = icon
selected_paper.base_state = "torn"
selected_paper.update_icon()
user.put_in_hands(selected_paper)
E.handle_post_remove()
playsound(loc, 'sound/items/poster_ripped.ogg', 50, FALSE)
return
return ..()
/obj/item/journal/fluff/mrakiizar_book/CtrlClick(mob/user)
if(open && Adjacent(user))
open_state = next_in_list(icon_state, open_states)
user.visible_message("<b>[user]</b> flips a page in \the [src].", SPAN_NOTICE("You flip a page in \the [src]."), range = 3)
playsound(loc, 'sound/items/pickup/paper.ogg', 50, FALSE)
update_icon()
return
return ..()
/obj/item/clothing/accessory/fluff/jaquelyn_necklace //Shrapnel Necklace - Jaquelyn Roberts - roostercat12
name = "shrapnel necklace"
@@ -2195,7 +2290,6 @@ All custom items with worn sprites must follow the contained sprite system: http
contained_sprite = TRUE
slot_flags = SLOT_EARS | SLOT_TIE
/obj/item/clothing/under/fluff/quoro_robes //Black Robes - Quoro Wurri'Til - witchbells
name = "black robes"
desc = "Some simple black robes, made to wear under something more elaborate. The fabric has a distinct texture to it, giving you the impression of activewear or swimsuits."
@@ -7,14 +7,14 @@
var/label_text = ""
/obj/item/sample/Initialize(var/newloc, var/atom/supplied)
..(newloc)
. = ..(newloc)
if(supplied)
copy_evidence(supplied)
name = "[initial(name)] ([supplied.get_swab_name()])"
LAZYADD(source, supplied.get_swab_name())
/obj/item/sample/print/Initialize(var/newloc, var/atom/supplied)
..(newloc, supplied)
. = ..(newloc, supplied)
if(LAZYLEN(evidence))
icon_state = "fingerprint1"
@@ -68,12 +68,6 @@
else
name = "[initial(name)] ([label_text])"
/obj/item/sample/Initialize(var/newloc, var/atom/supplied)
..(newloc)
if(supplied)
copy_evidence(supplied)
name = "[initial(name)] ([supplied.get_swab_name()])"
LAZYADD(source, supplied.get_swab_name())
/atom/proc/get_swab_name()
return "\the [initial(name)]"
@@ -222,7 +222,7 @@
..()
/mob/living/heavy_vehicle/premade/random/boring/Initialize(mapload, var/obj/structure/heavy_vehicle_frame/source_frame)
..(mapload, source_frame, using_boring_colours = TRUE)
. = ..(mapload, source_frame, using_boring_colours = TRUE)
/mob/living/heavy_vehicle/premade/random/extra/Initialize(mapload, var/obj/structure/heavy_vehicle_frame/source_frame)
..(mapload, source_frame, super_random = TRUE)
. = ..(mapload, source_frame, super_random = TRUE)
+10
View File
@@ -0,0 +1,10 @@
/proc/create_all_lighting_overlays()
for(var/zlevel = 1 to world.maxz)
create_lighting_overlays_zlevel(zlevel)
/proc/create_lighting_overlays_zlevel(var/zlevel)
ASSERT(zlevel)
for(var/turf/T in block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel)))
if(T.dynamic_lighting)
T.lighting_build_overlay()
+32
View File
@@ -0,0 +1,32 @@
/obj/effect/landmark/map_load_mark
name = "map loader landmark"
var/list/templates //list of template types to pick from
//Clears walls
/obj/effect/landmark/clear
name = "clear turf"
icon = 'icons/effects/landmarks.dmi'
icon_state = "clear"
delete_me = TRUE
/obj/effect/landmark/clear/Initialize()
var/turf/simulated/wall/W = get_turf(src)
if(istype(W))
W.dismantle_wall(TRUE, TRUE)
var/turf/simulated/mineral/M = W
if(istype(M))
M.GetDrilled()
. = ..()
//Applies fire act to the turf
/obj/effect/landmark/scorcher
name = "fire"
icon = 'icons/effects/landmarks.dmi'
icon_state = "fire"
var/temp = T0C + 3000
/obj/effect/landmark/scorcher/Initialize()
var/turf/simulated/T = get_turf(src)
if(istype(T))
T.fire_act(temp)
. = ..()
+123 -38
View File
@@ -21,52 +21,113 @@
name = rename
/datum/map_template/proc/preload_size(path)
var/bounds = maploader.load_map(file(path), 1, 1, 1, cropMap=FALSE, measureOnly=TRUE)
if(bounds)
width = bounds[MAP_MAXX] // Assumes all templates are rectangular, have a single Z level, and begin at 1,1,1
height = bounds[MAP_MAXY]
var/list/bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
var/z_offset = 1 // needed to calculate z-bounds correctly
var/datum/map_load_metadata/M = maploader.load_map(file(path), 1, 1, z_offset, cropMap=FALSE, measureOnly=TRUE)
if(M)
bounds = extend_bounds_if_needed(bounds, M.bounds)
z_offset++
else
return FALSE
width = bounds[MAP_MAXX] - bounds[MAP_MINX] + 1
height = bounds[MAP_MAXY] - bounds[MAP_MINX] + 1
return bounds
/datum/map_template/proc/initTemplateBounds(var/list/bounds)
var/list/obj/structure/cable/cables = list()
var/list/atom/atoms = list()
/datum/map_template/proc/load_new_z(var/no_changeturf = TRUE)
var/x = round((world.maxx - width)/2)
var/y = round((world.maxy - height)/2)
var/initial_z = world.maxz + 1
for(var/L in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]),
locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
if (x < 1) x = 1
if (y < 1) y = 1
var/list/bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
var/list/atoms_to_initialise = list()
var/shuttle_state = pre_init_shuttles()
var/turf/B = L
if (!B.initialized)
atoms += B
if (TURF_IS_DYNAMICALLY_LIT_UNSAFE(B) && !B.lighting_overlay)
new /atom/movable/lighting_overlay(B)
for(var/thing in B)
if(istype(thing, /obj/structure/cable))
cables += thing
var/atom/movable/AM = thing
if (!AM.initialized)
atoms += AM
SSatoms.InitializeAtoms(atoms)
SSmachinery.setup_template_powernets(cables)
/datum/map_template/proc/load_new_z()
var/x = round(world.maxx / 2)
var/y = round(world.maxy / 2)
var/list/bounds = maploader.load_map(file(mappath), x, y, no_changeturf = TRUE)
if(!bounds)
var/datum/map_load_metadata/M = maploader.load_map(file(mappath), x, y, no_changeturf = no_changeturf)
if (M)
bounds = extend_bounds_if_needed(bounds, M.bounds)
atoms_to_initialise += M.atoms_to_initialise
else
return FALSE
for (var/z_index = bounds[MAP_MINZ]; z_index <= bounds[MAP_MAXZ]; z_index++)
if (accessibility_weight)
current_map.accessible_z_levels[num2text(z_index)] = accessibility_weight
if (base_turf_for_zs)
current_map.base_turf_by_z[num2text(z_index)] = base_turf_for_zs
current_map.player_levels |= z_index
smooth_zlevel(world.maxz)
resort_all_areas()
//initialize things that are normally initialized after map load
initTemplateBounds(bounds)
init_atoms(atoms_to_initialise)
init_shuttles(shuttle_state)
after_load(initial_z)
for(var/light_z = initial_z to world.maxz)
create_lighting_overlays_zlevel(light_z)
log_game("Z-level [name] loaded at [x], [y], [world.maxz]")
loaded++
return locate(world.maxx/2, world.maxy/2, world.maxz)
/datum/map_template/proc/pre_init_shuttles()
. = SSshuttle.block_queue
SSshuttle.block_queue = TRUE
/datum/map_template/proc/init_shuttles(var/pre_init_state)
for (var/shuttle_type in shuttles_to_initialise)
LAZYADD(SSshuttle.shuttles_to_initialize, shuttle_type) // queue up for init.
SSshuttle.block_queue = pre_init_state
SSshuttle.clear_init_queue() // We will flush the queue unless there were other blockers, in which case they will do it.
/datum/map_template/proc/init_atoms(var/list/atoms)
if (SSatoms.initialized == INITIALIZATION_INSSATOMS)
return // let proper initialisation handle it later
var/list/turf/turfs = list()
var/list/obj/machinery/atmospherics/atmos_machines = list()
var/list/obj/machinery/machines = list()
var/list/obj/structure/cable/cables = list()
for(var/atom/A in atoms)
if(istype(A, /turf))
turfs += A
if(istype(A, /obj/structure/cable))
cables += A
if(istype(A, /obj/machinery/atmospherics))
atmos_machines += A
if(istype(A, /obj/machinery))
machines += A
if(istype(A,/obj/effect/landmark/map_load_mark))
LAZYADD(subtemplates_to_spawn, A)
var/notsuspended
if(!SSmachinery.suspended)
SSmachinery.suspend()
notsuspended = TRUE
SSatoms.InitializeAtoms() // The atoms should have been getting queued there. This flushes the queue.
SSmachinery.setup_template_powernets(cables)
SSmachinery.setup_atmos_machinery(atmos_machines)
if(notsuspended)
SSmachinery.wake()
for (var/i in machines)
var/obj/machinery/machine = i
machine.power_change()
for (var/i in turfs)
var/turf/T = i
T.post_change()
if(template_flags & TEMPLATE_FLAG_NO_RUINS)
T.flags |= TURF_NORUINS
if(istype(T,/turf/simulated))
var/turf/simulated/sim = T
sim.update_air_properties()
/datum/map_template/proc/load(turf/T, centered = FALSE)
if(centered)
@@ -78,12 +139,18 @@
if(T.y + height > world.maxy)
return
var/list/bounds = maploader.load_map(file(mappath), T.x, T.y, T.z, cropMap=TRUE, no_changeturf = FALSE)
if(!bounds)
return
var/list/atoms_to_initialise = list()
var/shuttle_state = pre_init_shuttles()
var/datum/map_load_metadata/M = maploader.load_map(file(mappath), T.x, T.y, T.z, cropMap=TRUE, no_changeturf = FALSE)
if (M)
atoms_to_initialise += M.atoms_to_initialise
else
return FALSE
//initialize things that are normally initialized after map load
initTemplateBounds(bounds)
init_atoms(atoms_to_initialise)
init_shuttles(shuttle_state)
log_game("[name] loaded at [T.x], [T.y], [T.z]")
return TRUE
@@ -95,3 +162,21 @@
if(corner)
placement = corner
return block(placement, locate(placement.x + width-1, placement.y + height-1, placement.z))
/datum/map_template/proc/extend_bounds_if_needed(var/list/existing_bounds, var/list/new_bounds)
var/list/bounds_to_combine = existing_bounds.Copy()
for (var/min_bound in list(MAP_MINX, MAP_MINY, MAP_MINZ))
bounds_to_combine[min_bound] = min(existing_bounds[min_bound], new_bounds[min_bound])
for (var/max_bound in list(MAP_MAXX, MAP_MAXY, MAP_MAXZ))
bounds_to_combine[max_bound] = max(existing_bounds[max_bound], new_bounds[max_bound])
return bounds_to_combine
/datum/map_template/proc/after_load(z)
for(var/obj/effect/landmark/map_load_mark/mark in subtemplates_to_spawn)
subtemplates_to_spawn -= mark
if(LAZYLEN(mark.templates))
var/template = pick(mark.templates)
var/datum/map_template/M = new template()
M.load(get_turf(mark), TRUE)
qdel(mark)
LAZYCLEARLIST(subtemplates_to_spawn)
+1 -3
View File
@@ -42,8 +42,7 @@
smoothing_iterations = 4
land_type = /turf/simulated/floor/exoplanet/desert
flora_prob = 5
flora_diversity = 4
flora_prob = 0
fauna_types = list(/mob/living/simple_animal/thinbug, /mob/living/simple_animal/tindalos)
/datum/random_map/noise/exoplanet/desert/get_additional_spawns(var/value, var/turf/T)
@@ -52,7 +51,6 @@
return
var/v = noise2value(value)
if(v > 6)
T.icon_state = "desert[v-1]"
if(prob(10))
new/obj/structure/quicksand(T)
+31 -4
View File
@@ -6,6 +6,10 @@
var/global/use_preloader = FALSE
var/global/dmm_suite/preloader/_preloader = new
/datum/map_load_metadata
var/bounds
var/list/atoms_to_initialise
/dmm_suite
// /"([a-zA-Z]+)" = \(((?:.|\n)*?)\)\n(?!\t)|\((\d+),(\d+),(\d+)\) = \{"([a-zA-Z\n]*)"\}/g
var/static/regex/dmmRegex = new/regex({""(\[a-zA-Z]+)" = \\(((?:.|\n)*?)\\)\n(?!\t)|\\((\\d+),(\\d+),(\\d+)\\) = \\{"(\[a-zA-Z\n]*)"\\}"}, "g")
@@ -60,6 +64,7 @@ var/global/dmm_suite/preloader/_preloader = new
var/key_len = 0
var/stored_index = 1
var/list/atoms_to_initialise = list()
while(dmmRegex.Find(tfile, stored_index))
stored_index = dmmRegex.next
@@ -156,7 +161,9 @@ var/global/dmm_suite/preloader/_preloader = new
if(!no_afterchange || (model_key != space_key))
if(!grid_models[model_key])
throw EXCEPTION("Undefined model key in DMM.")
parse_grid(grid_models[model_key], model_key, xcrd, ycrd, zcrd, no_changeturf || zexpansion)
var/datum/grid_load_metadata/M = parse_grid(grid_models[model_key], model_key, xcrd, ycrd, zcrd, no_changeturf || zexpansion)
if (M)
atoms_to_initialise += M.atoms_to_initialise
#ifdef TESTING
else
++turfsSkipped
@@ -179,7 +186,15 @@ var/global/dmm_suite/preloader/_preloader = new
var/turf/T = t
//we do this after we load everything in. if we don't; we'll have weird atmos bugs regarding atmos adjacent turfs
T.post_change(TRUE)
return bounds
var/datum/map_load_metadata/M = new
M.bounds = bounds
M.atoms_to_initialise = atoms_to_initialise
return M
/datum/grid_load_metadata
var/list/atoms_to_initialise
var/list/atoms_to_delete
/**
* Fill a given tile with its area/turf/objects/mobs
@@ -308,23 +323,35 @@ var/global/dmm_suite/preloader/_preloader = new
//turn off base new Initialization until the whole thing is loaded
SSatoms.map_loader_begin()
//since we've switched off autoinitialisation, record atoms to initialise later
var/list/atoms_to_initialise = list()
//instanciate the first /turf
var/turf/T
if(members[first_turf_index] != /turf/template_noop)
T = instance_atom(members[first_turf_index],members_attributes[first_turf_index],crds,no_changeturf)
atoms_to_initialise += T
if(T)
//if others /turf are presents, simulates the underlays piling effect
index = first_turf_index + 1
while(index <= members.len - 1) // Last item is an /area
crash_with("Tried to load additional turf at [model_key].")
var/underlay = T.appearance
T = instance_atom(members[index],members_attributes[index],crds,no_changeturf)//instance new turf
T.underlays += underlay
index++
atoms_to_initialise += T
//finally instance all remainings objects/mobs
for(index in 1 to first_turf_index-1)
instance_atom(members[index],members_attributes[index],crds,no_changeturf)
atoms_to_initialise += instance_atom(members[index],members_attributes[index],crds,no_changeturf)
//Restore initialization to the previous value
SSatoms.map_loader_stop()
var/datum/grid_load_metadata/M = new
M.atoms_to_initialise = atoms_to_initialise
return M
////////////////
//Helpers procs
////////////////
+6 -6
View File
@@ -18,7 +18,7 @@ var/list/banned_ruin_ids = list()
for(var/datum/map_template/ruin/ruin in potentialRuins)
if (ruin.id in banned_ruin_ids)
continue
if(!(SSatlas.current_sector.name in ruin.sectors) && !length(ruin.sectors))
if(!(SSatlas.current_sector.name in ruin.sectors))
continue
available[ruin] = ruin.spawn_weight
@@ -27,7 +27,7 @@ var/list/banned_ruin_ids = list()
while (remaining > 0 && length(available))
var/datum/map_template/ruin/ruin = pickweight(available)
if (ruin.cost > budget)
if (ruin.spawn_cost > budget)
available -= ruin
continue
@@ -52,12 +52,12 @@ var/list/banned_ruin_ids = list()
if (!valid)
continue
log_admin("Ruin \"[ruin.name]\" placed at ([choice.x], [choice.y], [choice.z])")
log_admin("Ruin \"[ruin.name]\" placed at ([choice.x], [choice.y], [choice.z])!")
load_ruin(choice, ruin)
selected += ruin
if (ruin.cost > 0)
remaining -= ruin.cost
if (ruin.spawn_cost > 0)
remaining -= ruin.spawn_cost
if (!(ruin.template_flags & TEMPLATE_FLAG_ALLOW_DUPLICATES))
banned_ruin_ids += ruin.id
available -= ruin
@@ -78,7 +78,7 @@ var/list/banned_ruin_ids = list()
var/turf/T = i
for(var/mob/living/simple_animal/monster in T)
qdel(monster)
template.load(central_turf,centered = TRUE)
template.load(central_turf, TRUE)
var/datum/map_template/ruin = template
if(istype(ruin))
new /obj/effect/landmark/ruin(central_turf, ruin)
+1 -1
View File
@@ -446,7 +446,7 @@
anchored = TRUE
/obj/item/stack/flag/red/planted/Initialize()
..()
. = ..()
base_state = "redflag"
set_light(2)
@@ -24,6 +24,7 @@
if(!obfuscation)
obfuscation = image(icon, T, icon_state)
obfuscation.layer = OBFUSCATION_LAYER
obfuscation.plane = PLANE_DEFAULT
if(!obfuscation_underlay)
// Creating a new icon of a fairly common icon state, adding some random color to prevent address searching, and hoping being static kills memory locality
var/turf/floor = /turf/simulated/floor/tiled
+1 -1
View File
@@ -271,7 +271,7 @@
announce_ghost_joinleave(src)
var/mob/living/carbon/human/dummy/mannequin/mannequin = new
client.prefs.dress_preview_mob(mannequin)
observer.appearance = mannequin
observer.appearance = mannequin.appearance
observer.appearance_flags = KEEP_TOGETHER
observer.alpha = 127
observer.layer = initial(observer.layer)
+1 -1
View File
@@ -12,7 +12,7 @@
var/list/ask_verb = list("asks") // Used when sentence ends in a ?
var/list/exclaim_verb = list("exclaims") // Used when sentence ends in a !
var/list/shout_verb = list("shouts", "yells", "screams") //Used when a sentence ends in !!
var/list/whisper_verb = list("says quietly", "says softly", "whispers") // Optional. When not specified speech_verb + quietly/softly is used instead.
var/list/whisper_verb = null // Optional. When not specified speech_verb + quietly/softly is used instead.
var/list/signlang_verb = list("signs") // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags
var/list/sing_verb = list("sings")
var/list/sign_adv_length = list(" briefly", " a short message", " a message", " a lengthy message", " a very lengthy message") // 5 messages changing depending on the length of the signed language. A space should be added before the sentence as shown
@@ -1,5 +1,5 @@
/mob/living/carbon/alien/diona/confirm_evolution()
var/response = alert(src, "A worker gestalt is a large, slow, and durable humanoid form. You will lose the ability to ventcrawl and devour animals, but you will gain hand-like tendrils and the ability to wear things. You have enough biomass, are you certain you're ready to form a new gestalt?", "Confirm Gestalt", "Growth!", "Patience...")
var/response = alert(src, "Are you sure you wish to grow into a gestalt? Instead of being an individual nymph you'll become a group of them, for formed together to work as a more humanoid entity. As a gestalt you'll have hands and the ability to do most actions humans can such as opening doors and using tools, but you'll be unable to ventcrawl. If you've not already done so it's highly suggested you read over some of the dionae wiki to get a better understanding of the species before advancing further.", "Confirm Gestalt", "Growth!", "Patience...")
if(response != "Growth!")
return
@@ -89,4 +89,4 @@
to_chat(src, SPAN_WARNING("You didn't have enough biomass to grow your [O.name]!"))
O.droplimb(1, DROPLIMB_EDGE)
qdel(O)
limbs_to_remove -= 1
limbs_to_remove -= 1
@@ -1295,6 +1295,7 @@
if(clean_feet && !shoes)
footprint_color = null
feet_blood_DNA = null
track_footprint = 0
update_inv_shoes(1)
if(blood_color)
+3 -3
View File
@@ -161,7 +161,7 @@
return headsets[headsets[1]]
return null
/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper)
/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper, var/is_singing = FALSE)
if(!whisper && (paralysis || InStasis()))
whisper(message, speaking)
return TRUE
@@ -218,12 +218,12 @@
if(R.talk_into(src,message,null,verb,speaking))
successful_radio += R
if("whisper")
whisper(message, speaking)
whisper(message, speaking, is_singing)
return TRUE
else if(message_mode)
var/obj/item/device/radio/R = get_radio()
if(R)
used_radios += l_ear
used_radios += R
if(R.talk_into(src, message, message_mode, verb, speaking))
successful_radio += R
@@ -111,7 +111,7 @@
max_hydration_factor = -1
allowed_citizenships = list(CITIZENSHIP_BIESEL, CITIZENSHIP_JARGON, CITIZENSHIP_SOL, CITIZENSHIP_COALITION, CITIZENSHIP_DOMINIA, CITIZENSHIP_IZWESKI, CITIZENSHIP_EUM, CITIZENSHIP_NONE)
allowed_religions = list(RELIGION_QEBLAK, RELIGION_WEISHII, RELIGION_MOROZ, RELIGION_THAKH, RELIGION_SKAKH, RELIGION_ETERNAL, RELIGION_NONE, RELIGION_OTHER)
allowed_religions = list(RELIGION_QEBLAK, RELIGION_WEISHII, RELIGION_MOROZ, RELIGION_THAKH, RELIGION_SKAKH, RELIGION_ETERNAL, RELIGION_KSSHR, RELIGION_SHRKH, RELIGION_NONE, RELIGION_OTHER)
allowed_accents = list(ACCENT_ROOTSONG, ACCENT_VOIDSONG)
default_accent = ACCENT_ROOTSONG
@@ -21,7 +21,12 @@
hazard_low_pressure = 10
examine_color = "#C2AE95"
allowed_accents = list(ACCENT_SCARAB, ACCENT_CETI, ACCENT_GIBSON, ACCENT_SOL, ACCENT_MARTIAN, ACCENT_JUPITER, ACCENT_COC, ACCENT_ELYRA, ACCENT_PERSEPOLIS, ACCENT_MEDINA, ACCENT_AEMAQ, ACCENT_NEWSUEZ, ACCENT_DAMASCUS, ACCENT_ERIDANI, ACCENT_ERIDANIREINSTATED, ACCENT_HIMEO, ACCENT_ERIDANIDREG, ACCENT_DOMINIA_HIGH, ACCENT_DOMINIA_VULGAR, ACCENT_NCF, ACCENT_ASSUNZIONE, ACCENT_VALKYRIE)
/datum/species/human/offworlder/New()
var/list/offworlder_accents = list(ACCENT_SCARAB)
var/list/disallowed_accents = list(ACCENT_SILVERSUN_EXPATRIATE, ACCENT_SILVERSUN_ORIGINAL, ACCENT_PLUTO, ACCENT_EUROPA, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_GADPATHUR, ACCENT_PHONG, ACCENT_VYSOKA, ACCENT_FISANDUH, ACCENT_MICTLAN, ACCENT_KONYAN, ACCENT_VISEGRAD)
allowed_accents = offworlder_accents + allowed_accents - disallowed_accents
..()
/datum/species/human/offworlder/equip_later_gear(var/mob/living/carbon/human/H)
if(istype(H.get_equipped_item(slot_back), /obj/item/storage/backpack) && H.equip_to_slot_or_del(new /obj/item/storage/pill_bottle/rmt(H.back), slot_in_backpack))
@@ -211,7 +211,7 @@
eyes_icons = 'icons/mob/human_face/eyes48x48.dmi'
eyes = "bulwark_eyes"
slowdown = 6
slowdown = 2
unarmed_types = list(/datum/unarmed_attack/claws/vaurca_bulwark)
@@ -240,6 +240,7 @@ Bulwarks are much larger and have significantly thicker carapaces than most Vaur
heat_level_3 = 800 //Default 1000
sprint_speed_factor = 1.4
stamina = 50
/datum/species/bug/type_e/New()
..()
+5 -18
View File
@@ -10,29 +10,16 @@
//mob verbs are faster than object verbs. See above.
var/mob/living/next_point_time = 0
/mob/living/pointed(atom/movable/A as mob|obj|turf in view())
if(!isturf(src.loc) || !(A in range(world.view, get_turf(src))))
return FALSE
/mob/living/pointed(atom/A as mob|obj|turf in view())
if(src.stat || !src.canmove || src.restrained())
return FALSE
if(src.status_flags & FAKEDEATH)
return FALSE
if(next_point_time >= world.time)
return FALSE
. = ..()
next_point_time = world.time + 25
face_atom(A)
if(isturf(A))
if(pointing_effect)
QDEL_NULL(pointing_effect)
pointing_effect = new /obj/effect/decal/point(A)
pointing_effect.invisibility = invisibility
addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, pointing_effect), 2 SECONDS)
else
A.add_filter("pointglow", 1, list(type = "drop_shadow", x = 0, y = -1, offset = 1, size = 1, color = "#F00"))
addtimer(CALLBACK(A, /atom/movable.proc/remove_filter, "pointglow"), 2 SECONDS)
visible_message("<b>\The [src]</b> points to \the [A].")
return TRUE
if(.)
visible_message("<b>\The [src]</b> points to \the [A].")
/*one proc, four uses
swapping: if it's 1, the mobs are trying to switch, if 0, non-passive is pushing passive
+5 -4
View File
@@ -156,7 +156,7 @@ proc/get_radio_key_from_channel(var/channel)
return FONT_SIZE_LARGE
return null
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb, var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE)
if(stat)
if(stat == DEAD)
return say_dead(message)
@@ -209,8 +209,9 @@ proc/get_radio_key_from_channel(var/channel)
return
speaking.broadcast(src,trim(message))
return 1
verb = say_quote(message, speaking, is_singing, whisper)
if(!verb)
verb = say_quote(message, speaking, is_singing, whisper)
if(is_muzzled())
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
@@ -245,7 +246,7 @@ proc/get_radio_key_from_channel(var/channel)
var/list/obj/item/used_radios = new
var/list/successful_radio = new // passes a list because standard vars don't work when passed
if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper))
if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name, successful_radio, whisper, is_singing))
return 1
var/list/handle_v = handle_speech_sound()
@@ -76,18 +76,6 @@
if (!movement_target)
walk_to(src,0)
if(prob(2)) //spooky
var/mob/abstract/observer/spook = locate() in range(src,5)
if(spook)
var/turf/T = spook.loc
var/list/visible = list()
for(var/obj/O in T.contents)
if(!O.invisibility && O.name)
visible += O
if(visible.len)
var/atom/A = pick(visible)
visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].",0)
/mob/living/simple_animal/cat/proc/attack_mice()
if((src.loc) && isturf(src.loc))
if(!stat && !resting && !buckled_to)
@@ -276,14 +276,12 @@
. =..()
if(!.)
return
if(!stat && prob(3) && eggsleft > 0)
if(!stat && prob(3) && eggsleft > 0 && chicken_count < MAX_CHICKENS)
visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]")
eggsleft--
var/obj/item/reagent_containers/food/snacks/egg/E = new(get_turf(src))
E.pixel_x = rand(-6,6)
E.pixel_y = rand(-6,6)
if(chicken_count < MAX_CHICKENS && prob(10))
START_PROCESSING(SSprocessing, E)
// Penguins
+17 -3
View File
@@ -16,13 +16,24 @@
whisper(message)
/mob/living/proc/whisper(var/message, var/datum/language/speaking)
/mob/living/proc/whisper(var/message, var/datum/language/speaking, var/is_singing = FALSE)
if(is_muzzled())
to_chat(src, SPAN_DANGER("You're muzzled and cannot speak!"))
return
var/had_speaking = !!speaking
speaking = speaking ? speaking : parse_language(message)
if(!had_speaking)
if(speaking)
message = copytext(message,2+length(speaking.key))
else
speaking = get_default_language()
if(length(message) >= 1 && copytext(message, 1, 2) == "%")
if(speaking?.sing_verb)
is_singing = TRUE
var/message_range = 1
var/eavesdropping_range = 2
var/watching_range = 5
@@ -35,8 +46,11 @@
not_heard = "[whisper_text] something"
else
var/adverb = pick("quietly", "softly")
whisper_text = "[speaking.speech_verb] [adverb]"
not_heard = "[speaking.speech_verb] something [adverb]"
var/speak_text = pick(speaking.speech_verb)
if(is_singing && speaking?.sing_verb)
speak_text = pick(speaking.sing_verb)
whisper_text = "[speak_text] [adverb]"
not_heard = "[speak_text] something [adverb]"
var/list/listening = list(src)
+19 -13
View File
@@ -333,21 +333,27 @@
set name = "Point To"
set category = "Object"
if(!src || !isturf(src.loc) || !(A in range(world.view, get_turf(src))))
return 0
if(istype(A, /obj/effect/decal/point) || pointing_effect)
return 0
var/tile = get_turf(A)
if (!tile)
return 0
pointing_effect = new /obj/effect/decal/point(tile)
pointing_effect.invisibility = invisibility
addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, pointing_effect), 2 SECONDS)
if(!isturf(src.loc) || !(A in range(world.view, get_turf(src))))
return FALSE
if(next_point_time >= world.time)
return FALSE
next_point_time = world.time + 25
face_atom(A)
return 1
if(isturf(A))
if(pointing_effect)
end_pointing_effect()
pointing_effect = new /obj/effect/decal/point(A)
pointing_effect.invisibility = invisibility
addtimer(CALLBACK(src, .proc/end_pointing_effect, pointing_effect), 2 SECONDS)
else
var/atom/movable/M = A
M.add_filter("pointglow", 1, list(type = "drop_shadow", x = 0, y = -1, offset = 1, size = 1, color = "#F00"))
addtimer(CALLBACK(M, /atom/movable.proc/remove_filter, "pointglow"), 2 SECONDS)
return TRUE
/mob/proc/end_pointing_effect()
QDEL_NULL(pointing_effect)
/mob/verb/mode()
set name = "Activate Held Object"
+2 -1
View File
@@ -26,7 +26,8 @@
if (!bound_overlay)
return
if (TURF_IS_MIMICING(loc))
var/turf/T = loc
if (TURF_IS_MIMICING(T.above))
if (!bound_overlay.queued)
SSzcopy.queued_overlays += bound_overlay
bound_overlay.queued = TRUE
+4 -4
View File
@@ -117,7 +117,7 @@
damage = max(damage-1, 0)
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
if(prob(1))
to_chat(owner, "<span class='warning'>You feel [pick("dizzy","woozy","faint")]...</span>")
to_chat(owner, SPAN_WARNING("You feel a bit [pick("lightheaded","dizzy","pale")]..."))
damprob = owner.chem_effects[CE_STABLE] ? 30 : 60
if(!past_damage_threshold(2) && prob(damprob))
take_internal_damage(1)
@@ -128,7 +128,7 @@
take_internal_damage(1)
if(!owner.paralysis && prob(10))
owner.Paralyse(rand(1,3))
to_chat(owner, "<span class='warning'>You feel extremely [pick("dizzy","woozy","faint")]...</span>")
to_chat(owner, SPAN_WARNING("You feel [pick("weak","disoriented","faint","cold")]."))
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
owner.eye_blurry = max(owner.eye_blurry,6)
damprob = owner.chem_effects[CE_STABLE] ? 60 : 100
@@ -136,7 +136,7 @@
take_internal_damage(1)
if(!owner.paralysis && prob(15))
owner.Paralyse(rand(3, 5))
to_chat(owner, "<span class='warning'>You feel extremely [pick("dizzy","woozy","faint")]...</span>")
to_chat(owner, SPAN_WARNING("You feel <b>extremely</b> [pick("cold","woozy","faint","weak","confused","tired","lethargic")]."))
if(-(INFINITY) to BLOOD_VOLUME_SURVIVE) // Also see heart.dm, being below this point puts you into cardiac arrest.
owner.eye_blurry = max(owner.eye_blurry,6)
damprob = owner.chem_effects[CE_STABLE] ? 80 : 100
@@ -240,4 +240,4 @@
else
to_chat(user, SPAN_WARNING("The brain has already been prepared!"))
return
return ..()
return ..()
-4
View File
@@ -570,10 +570,6 @@
cooldown = 30
activable = TRUE
/obj/item/organ/internal/augment/enhanced_vision/Initialize()
. = ..()
set_light(3, 2, LIGHT_COLOR_TUNGSTEN, uv = 0, angle = LIGHT_WIDE)
/obj/item/organ/internal/augment/enhanced_vision/attack_self(var/mob/user)
. = ..()
+6
View File
@@ -66,6 +66,7 @@
parent_organ = BP_CHEST
max_damage = 80
relative_size = 80
robotic_sprite = FALSE
var/open = FALSE
var/obj/item/cell/cell = /obj/item/cell/super
var/move_charge_factor = 1
@@ -164,6 +165,7 @@
organ_tag = "surge"
parent_organ = BP_CHEST
vital = FALSE
robotic_sprite = FALSE
var/surge_left = 0
var/broken = 0
@@ -202,6 +204,7 @@
icon = 'icons/obj/robot_component.dmi'
icon_state = "camera"
dead_icon = "camera_broken"
robotic_sprite = FALSE
/obj/item/organ/internal/eyes/optical_sensor/Initialize()
robotize()
@@ -216,6 +219,7 @@
item_state = "ipc_tag"
dead_icon = "ipc_tag_dead"
contained_sprite = TRUE
robotic_sprite = FALSE
var/auto_generate = TRUE
var/serial_number = ""
var/ownership_info = IPC_OWNERSHIP_COMPANY
@@ -285,6 +289,7 @@
organ_tag = BP_BRAIN
parent_organ = BP_HEAD
vital = TRUE
robotic_sprite = FALSE
var/obj/item/device/mmi/stored_mmi
/obj/item/organ/internal/mmi_holder/proc/update_from_mmi()
@@ -360,6 +365,7 @@
icon_state = "harddisk"
vital = FALSE
emp_coeff = 0.1
robotic_sprite = FALSE
/obj/item/organ/internal/data/Initialize()
robotize()

Some files were not shown because too many files have changed in this diff Show More