mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-31 00:49:06 +01:00
Merge pull request #62 from Aurorastation/updates_the_nbt
Updates the nbt to the latest master
This commit is contained in:
+10
-1
@@ -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"))
|
||||
|
||||
@@ -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,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>")
|
||||
|
||||
@@ -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*******/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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()))
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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"])
|
||||
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -55,6 +55,8 @@
|
||||
#define RELIGION_PILOTDREAM "Pilot Dream"
|
||||
|
||||
#define RELIGION_ETERNAL "The Eternal"
|
||||
#define RELIGION_KSSHR "Ksshr"
|
||||
#define RELIGION_SHRKH "Shrkh"
|
||||
|
||||
//accent defines
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
. = ..()
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
////////////////
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user