Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into ninjasarecum
# Conflicts: # code/modules/ninja/suit/suit.dm
This commit is contained in:
@@ -553,7 +553,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
A.power_equip = power_equip
|
||||
A.power_environ = power_environ
|
||||
INVOKE_ASYNC(A, .proc/power_change)
|
||||
update_icon()
|
||||
update_appearance()
|
||||
|
||||
/area/proc/usage(chan)
|
||||
switch(chan)
|
||||
|
||||
+68
-13
@@ -103,6 +103,9 @@
|
||||
/// A luminescence-shifted value of the last color calculated for chatmessage overlays
|
||||
var/chat_color_darkened
|
||||
|
||||
///Used for changing icon states for different base sprites.
|
||||
var/base_icon_state
|
||||
|
||||
///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
|
||||
var/list/targeted_by
|
||||
|
||||
@@ -169,7 +172,7 @@
|
||||
* * [/turf/open/space/proc/Initialize]
|
||||
*/
|
||||
/atom/proc/Initialize(mapload, ...)
|
||||
// SHOULD_NOT_SLEEP(TRUE)
|
||||
SHOULD_NOT_SLEEP(TRUE)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
if(flags_1 & INITIALIZED_1)
|
||||
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
||||
@@ -378,12 +381,26 @@
|
||||
return FALSE
|
||||
|
||||
/atom/proc/assume_air(datum/gas_mixture/giver)
|
||||
qdel(giver)
|
||||
return null
|
||||
|
||||
/atom/proc/assume_air_moles(datum/gas_mixture/giver, moles)
|
||||
return null
|
||||
|
||||
/atom/proc/assume_air_ratio(datum/gas_mixture/giver, ratio)
|
||||
return null
|
||||
|
||||
/atom/proc/remove_air(amount)
|
||||
return null
|
||||
|
||||
/atom/proc/remove_air_ratio(ratio)
|
||||
return null
|
||||
|
||||
/atom/proc/transfer_air(datum/gas_mixture/taker, amount)
|
||||
return null
|
||||
|
||||
/atom/proc/transfer_air_ratio(datum/gas_mixture/taker, ratio)
|
||||
return null
|
||||
|
||||
/atom/proc/return_air()
|
||||
if(loc)
|
||||
return loc.return_air()
|
||||
@@ -517,37 +534,75 @@
|
||||
if(!LAZYLEN(.)) // lol ..length
|
||||
return list("<span class='notice'><i>You examine [src] closer, but find nothing of interest...</i></span>")
|
||||
|
||||
/**
|
||||
* Updates the appearence of the icon
|
||||
*
|
||||
* Mostly delegates to update_name, update_desc, and update_icon
|
||||
*
|
||||
* Arguments:
|
||||
* - updates: A set of bitflags dictating what should be updated. Defaults to [ALL]
|
||||
*/
|
||||
/atom/proc/update_appearance(updates=ALL)
|
||||
//SHOULD_NOT_SLEEP(TRUE)
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
|
||||
. = NONE
|
||||
updates &= ~SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_APPEARANCE, updates)
|
||||
if(updates & UPDATE_NAME)
|
||||
. |= update_name(updates)
|
||||
if(updates & UPDATE_DESC)
|
||||
. |= update_desc(updates)
|
||||
if(updates & UPDATE_ICON)
|
||||
. |= update_icon(updates)
|
||||
|
||||
/// Updates the name of the atom
|
||||
/atom/proc/update_name(updates=ALL)
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_NAME, updates)
|
||||
|
||||
/// Updates the description of the atom
|
||||
/atom/proc/update_desc(updates=ALL)
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_DESC, updates)
|
||||
|
||||
/// Updates the icon of the atom
|
||||
/atom/proc/update_icon()
|
||||
// I expect we're going to need more return flags and options in this proc
|
||||
var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON)
|
||||
. = FALSE
|
||||
/atom/proc/update_icon(updates=ALL)
|
||||
SIGNAL_HANDLER
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
|
||||
if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE))
|
||||
. = NONE
|
||||
updates &= ~SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON, updates)
|
||||
if(updates & UPDATE_ICON_STATE)
|
||||
update_icon_state()
|
||||
. = TRUE
|
||||
. |= UPDATE_ICON_STATE
|
||||
|
||||
if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS))
|
||||
var/list/new_overlays = update_overlays()
|
||||
if(updates & UPDATE_OVERLAYS)
|
||||
if(LAZYLEN(managed_vis_overlays))
|
||||
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
|
||||
|
||||
var/list/new_overlays = update_overlays(updates)
|
||||
if(managed_overlays)
|
||||
cut_overlay(managed_overlays)
|
||||
managed_overlays = null
|
||||
if(length(new_overlays))
|
||||
managed_overlays = new_overlays
|
||||
add_overlay(new_overlays)
|
||||
. = TRUE
|
||||
. |= UPDATE_OVERLAYS
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_UPDATED_ICON, signalOut, .)
|
||||
. |= SEND_SIGNAL(src, COMSIG_ATOM_UPDATED_ICON, updates, .)
|
||||
|
||||
/// Updates the icon state of the atom
|
||||
/atom/proc/update_icon_state()
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON_STATE)
|
||||
|
||||
/// Updates the overlays of the atom
|
||||
/atom/proc/update_overlays()
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
//SHOULD_CALL_PARENT(TRUE)
|
||||
. = list()
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .)
|
||||
|
||||
|
||||
/atom/proc/relaymove(mob/living/user)
|
||||
if(!istype(user))
|
||||
return //why are you buckling nonliving mobs to atoms?
|
||||
|
||||
@@ -57,13 +57,20 @@
|
||||
|
||||
/// Should we use tooltips, if the thing does not have the code implemented `get_tooltip_data()`, it will default to examine(src)
|
||||
var/tooltips = FALSE
|
||||
|
||||
/// How loudly we yell
|
||||
var/yell_power = 50
|
||||
/// last time we yelled
|
||||
var/last_yell = 0
|
||||
|
||||
/atom/movable/Initialize(mapload)
|
||||
. = ..()
|
||||
switch(blocks_emissive)
|
||||
if(EMISSIVE_BLOCK_GENERIC)
|
||||
update_emissive_block()
|
||||
var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha)
|
||||
gen_emissive_blocker.color = GLOB.em_block_color
|
||||
gen_emissive_blocker.dir = dir
|
||||
gen_emissive_blocker.appearance_flags |= appearance_flags
|
||||
add_overlay(list(gen_emissive_blocker))
|
||||
if(EMISSIVE_BLOCK_UNIQUE)
|
||||
render_target = ref(src)
|
||||
em_block = new(src, render_target)
|
||||
@@ -108,13 +115,23 @@
|
||||
/atom/movable/proc/update_emissive_block()
|
||||
if(blocks_emissive != EMISSIVE_BLOCK_GENERIC)
|
||||
return
|
||||
if(length(managed_vis_overlays))
|
||||
for(var/a in managed_vis_overlays)
|
||||
var/obj/effect/overlay/vis/vs
|
||||
if(vs.plane == EMISSIVE_BLOCKER_PLANE)
|
||||
SSvis_overlays.remove_vis_overlay(src, list(vs))
|
||||
break
|
||||
SSvis_overlays.add_vis_overlay(src, icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE, dir)
|
||||
else if (blocks_emissive == EMISSIVE_BLOCK_GENERIC)
|
||||
var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha)
|
||||
gen_emissive_blocker.color = GLOB.em_block_color
|
||||
gen_emissive_blocker.dir = dir
|
||||
gen_emissive_blocker.appearance_flags |= appearance_flags
|
||||
return gen_emissive_blocker
|
||||
else if(blocks_emissive == EMISSIVE_BLOCK_UNIQUE)
|
||||
if(!em_block)
|
||||
render_target = ref(src)
|
||||
em_block = new(src, render_target)
|
||||
return em_block
|
||||
|
||||
/atom/movable/update_overlays()
|
||||
. = ..()
|
||||
var/emissive_block = update_emissive_block()
|
||||
if(emissive_block)
|
||||
. += emissive_block
|
||||
|
||||
/atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction)
|
||||
if(!direction)
|
||||
|
||||
@@ -711,10 +711,15 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
|
||||
update_playercounts()
|
||||
if (storyteller.should_inject_antag())
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Attempted midround injections")
|
||||
var/list/drafted_rules = storyteller.midround_draft()
|
||||
if (drafted_rules.len > 0)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Successful midround injections")
|
||||
picking_midround_latejoin_rule(drafted_rules)
|
||||
do_midround_injection()
|
||||
|
||||
/datum/game_mode/dynamic/proc/do_midround_injection()
|
||||
set waitfor = FALSE
|
||||
var/list/drafted_rules = storyteller.midround_draft()
|
||||
if (drafted_rules.len > 0)
|
||||
SSblackbox.record_feedback("tally","dynamic",1,"Successful midround injections")
|
||||
picking_midround_latejoin_rule(drafted_rules)
|
||||
|
||||
|
||||
/// Updates current_players.
|
||||
/datum/game_mode/dynamic/proc/update_playercounts()
|
||||
|
||||
@@ -105,14 +105,18 @@
|
||||
if(tempgang != gang)
|
||||
tempgang.message_gangtools("WARNING: [gang.name] Gang takeover imminent. Their dominator at [domloc.map_name] must be destroyed!",1,1)
|
||||
else
|
||||
Cinematic(CINEMATIC_MALF,world) //Here is the gang victory trigger on the dominator ending.
|
||||
gang.winner = TRUE
|
||||
SSticker.news_report = GANG_VICTORY
|
||||
SSticker.force_ending = TRUE
|
||||
endgame()
|
||||
|
||||
if(!.)
|
||||
STOP_PROCESSING(SSmachines, src)
|
||||
|
||||
/obj/machinery/dominator/proc/endgame()
|
||||
set waitfor = FALSE
|
||||
Cinematic(CINEMATIC_MALF,world) //Here is the gang victory trigger on the dominator ending.
|
||||
gang.winner = TRUE
|
||||
SSticker.news_report = GANG_VICTORY
|
||||
SSticker.force_ending = TRUE
|
||||
|
||||
/obj/machinery/dominator/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
/datum/objective_item/steal/plasma/check_special_completion(obj/item/tank/T)
|
||||
var/target_amount = text2num(name)
|
||||
var/found_amount = 0
|
||||
found_amount += T.air_contents.get_moles(/datum/gas/plasma)
|
||||
found_amount += T.air_contents.get_moles(GAS_PLASMA)
|
||||
return found_amount>=target_amount
|
||||
|
||||
|
||||
|
||||
@@ -148,11 +148,15 @@ Class Procs:
|
||||
START_PROCESSING(SSmachines, src)
|
||||
else
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
power_change()
|
||||
RegisterSignal(src, COMSIG_ENTER_AREA, .proc/power_change)
|
||||
|
||||
if (occupant_typecache)
|
||||
occupant_typecache = typecacheof(occupant_typecache)
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/machinery/LateInitialize()
|
||||
. = ..()
|
||||
power_change()
|
||||
|
||||
/obj/machinery/Destroy()
|
||||
GLOB.machines.Remove(src)
|
||||
@@ -176,6 +180,17 @@ Class Procs:
|
||||
/obj/machinery/proc/process_atmos()//If you dont use process why are you here
|
||||
return PROCESS_KILL
|
||||
|
||||
///Called when we want to change the value of the stat variable. Holds bitflags.
|
||||
/obj/machinery/proc/set_machine_stat(new_value)
|
||||
if(new_value == stat)
|
||||
return
|
||||
. = stat
|
||||
stat = new_value
|
||||
on_machine_stat_update(stat)
|
||||
|
||||
/obj/machinery/proc/on_machine_stat_update(stat)
|
||||
return
|
||||
|
||||
/obj/machinery/emp_act(severity)
|
||||
. = ..()
|
||||
if(use_power && !stat && !(. & EMP_PROTECT_SELF))
|
||||
@@ -383,8 +398,11 @@ Class Procs:
|
||||
M.icon_state = "box_1"
|
||||
|
||||
/obj/machinery/obj_break(damage_flag)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
. = ..()
|
||||
if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
|
||||
stat |= BROKEN
|
||||
SEND_SIGNAL(src, COMSIG_MACHINERY_BROKEN, damage_flag)
|
||||
update_appearance()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/contents_explosion(severity, target)
|
||||
|
||||
@@ -407,7 +407,7 @@
|
||||
|
||||
/obj/machinery/camera/get_remote_view_fullscreens(mob/user)
|
||||
if(view_range == short_range) //unfocused
|
||||
user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2)
|
||||
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2)
|
||||
|
||||
/obj/machinery/camera/update_remote_sight(mob/living/user)
|
||||
user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras
|
||||
|
||||
@@ -173,10 +173,7 @@
|
||||
clonemind.transfer_to(H)
|
||||
|
||||
else if(get_clone_mind == CLONEPOD_POLL_MIND)
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone? (Don't ERP without permission from the original)", null, null, null, 100, H, POLL_IGNORE_CLONE)
|
||||
if(LAZYLEN(candidates))
|
||||
var/mob/C = pick(candidates)
|
||||
H.key = C.key
|
||||
poll_for_mind(H, clonename)
|
||||
|
||||
if(grab_ghost_when == CLONER_FRESH_CLONE)
|
||||
H.grab_ghost()
|
||||
@@ -206,6 +203,13 @@
|
||||
attempting = FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/clonepod/proc/poll_for_mind(mob/living/carbon/human/H, clonename)
|
||||
set waitfor = FALSE
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone? (Don't ERP without permission from the original)", null, null, null, 100, H, POLL_IGNORE_CLONE)
|
||||
if(LAZYLEN(candidates))
|
||||
var/mob/C = pick(candidates)
|
||||
H.key = C.key
|
||||
|
||||
//Grow clones to maturity then kick them out. FREELOADERS
|
||||
/obj/machinery/clonepod/process()
|
||||
var/mob/living/mob_occupant = occupant
|
||||
@@ -384,7 +388,7 @@
|
||||
to_chat(occupant, "<span class='notice'><b>There is a bright flash!</b><br><i>You feel like a new being.</i></span>")
|
||||
mob_occupant.flash_act()
|
||||
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/policy = policies[POLICYCONFIG_ON_CLONE]
|
||||
if(policy)
|
||||
to_chat(occupant, policy)
|
||||
|
||||
@@ -57,8 +57,8 @@
|
||||
var/overlay_state = icon_screen
|
||||
if(stat & BROKEN)
|
||||
overlay_state = "[icon_state]_broken"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir)
|
||||
SSvis_overlays.add_vis_overlay(src, icon, overlay_state, EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha=128)
|
||||
. += mutable_appearance(icon, overlay_state)
|
||||
. += emissive_appearance(icon, overlay_state)
|
||||
|
||||
/obj/machinery/computer/power_change()
|
||||
..()
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
var/total_moles = air_sample.total_moles()
|
||||
if(total_moles)
|
||||
for(var/gas_id in air_sample.get_gases())
|
||||
var/gas_name = GLOB.meta_gas_names[gas_id]
|
||||
var/gas_name = GLOB.gas_data.names[gas_id]
|
||||
signal.data["gases"][gas_name] = air_sample.get_moles(gas_id) / total_moles * 100
|
||||
|
||||
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
|
||||
@@ -73,11 +73,11 @@
|
||||
|
||||
/obj/machinery/air_sensor/Initialize()
|
||||
. = ..()
|
||||
SSair.atmos_machinery += src
|
||||
SSair.atmos_air_machinery += src
|
||||
set_frequency(frequency)
|
||||
|
||||
/obj/machinery/air_sensor/Destroy()
|
||||
SSair.atmos_machinery -= src
|
||||
SSair.atmos_air_machinery -= src
|
||||
SSradio.remove_object(src, frequency)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -16,10 +16,10 @@
|
||||
|
||||
// Stuff needed to render the map
|
||||
var/map_name
|
||||
var/obj/screen/map_view/cam_screen
|
||||
var/atom/movable/screen/map_view/cam_screen
|
||||
/// All the plane masters that need to be applied.
|
||||
var/list/cam_plane_masters
|
||||
var/obj/screen/background/cam_background
|
||||
var/atom/movable/screen/background/cam_background
|
||||
|
||||
interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_SET_MACHINE //| INTERACT_MACHINE_REQUIRES_SIGHT
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
cam_screen.del_on_map_removal = FALSE
|
||||
cam_screen.screen_loc = "[map_name]:1,1"
|
||||
cam_plane_masters = list()
|
||||
for(var/plane in subtypesof(/obj/screen/plane_master))
|
||||
var/obj/screen/instance = new plane()
|
||||
for(var/plane in subtypesof(/atom/movable/screen/plane_master))
|
||||
var/atom/movable/screen/instance = new plane()
|
||||
instance.assigned_map = map_name
|
||||
instance.del_on_map_removal = FALSE
|
||||
instance.screen_loc = "[map_name]:CENTER"
|
||||
|
||||
@@ -275,7 +275,7 @@
|
||||
if(final)
|
||||
playsound(origin, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0)
|
||||
remote_eye.setLoc(get_turf(final))
|
||||
C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static)
|
||||
C.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static)
|
||||
C.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console!
|
||||
else
|
||||
playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0)
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
var/list/this_pad = list()
|
||||
this_pad["name"] = pad.display_name
|
||||
this_pad["id"] = i
|
||||
if(pad.machine_stat & NOPOWER)
|
||||
if(pad.stat & NOPOWER)
|
||||
this_pad["inactive"] = TRUE
|
||||
pad_list += list(this_pad)
|
||||
else
|
||||
@@ -135,7 +135,7 @@
|
||||
var/obj/machinery/mechpad/current_pad = mechpads[selected_id]
|
||||
data["pad_name"] = current_pad.display_name
|
||||
data["selected_pad"] = current_pad
|
||||
if(QDELETED(current_pad) || (current_pad.machine_stat & NOPOWER))
|
||||
if(QDELETED(current_pad) || (current_pad.stat & NOPOWER))
|
||||
data["pad_active"] = FALSE
|
||||
return data
|
||||
data["pad_active"] = TRUE
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
* Initiates launching sequence by checking if all components are functional, opening poddoors, firing mass drivers and then closing poddoors
|
||||
*/
|
||||
/obj/machinery/computer/pod/proc/alarm()
|
||||
set waitfor = FALSE
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
|
||||
|
||||
@@ -254,7 +254,7 @@
|
||||
DA.update_name()
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/door/airlock/plasma/BlockSuperconductivity() //we don't stop the heat~
|
||||
/obj/machinery/door/airlock/plasma/BlockThermalConductivity() //we don't stop the heat~
|
||||
return 0
|
||||
|
||||
/obj/machinery/door/airlock/plasma/attackby(obj/item/C, mob/user, params)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
layer = OPEN_DOOR_LAYER
|
||||
power_channel = ENVIRON
|
||||
max_integrity = 350
|
||||
damage_deflection = 10
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70)
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
flags_1 = PREVENT_CLICK_UNDER_1|DEFAULT_RICOCHET_1
|
||||
@@ -38,7 +39,7 @@
|
||||
var/locked = FALSE //whether the door is bolted or not.
|
||||
var/assemblytype //the type of door frame to drop during deconstruction
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
var/damage_deflection = 10
|
||||
|
||||
var/real_explosion_block //ignore this, just use explosion_block
|
||||
var/red_alert_access = FALSE //if TRUE, this door will always open on red alert
|
||||
var/poddoor = FALSE
|
||||
@@ -223,11 +224,6 @@
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/machinery/door/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
|
||||
if(damage_flag == "melee" && damage_amount < damage_deflection)
|
||||
return 0
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
||||
. = ..()
|
||||
if(. && obj_integrity > 0)
|
||||
@@ -386,7 +382,7 @@
|
||||
if(!glass && GLOB.cameranet)
|
||||
GLOB.cameranet.updateVisibility(src, 0)
|
||||
|
||||
/obj/machinery/door/BlockSuperconductivity() // All non-glass airlocks block heat, this is intended.
|
||||
/obj/machinery/door/BlockThermalConductivity() // All non-glass airlocks block heat, this is intended.
|
||||
if(opacity || heat_proof)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -79,23 +79,33 @@
|
||||
|
||||
if(is_station_level(z))
|
||||
. += "fire_[GLOB.security_level]"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir)
|
||||
. += mutable_appearance(icon, "fire_[GLOB.security_level]")
|
||||
. += emissive_appearance(icon, "fire_[GLOB.security_level]")
|
||||
else
|
||||
. += "fire_[SEC_LEVEL_GREEN]"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir)
|
||||
. += mutable_appearance(icon, "fire_[SEC_LEVEL_GREEN]")
|
||||
. += emissive_appearance(icon, "fire_[SEC_LEVEL_GREEN]")
|
||||
|
||||
var/area/A = src.loc
|
||||
A = A.loc
|
||||
|
||||
if(!detecting || !A.fire)
|
||||
. += "fire_off"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "fire_off", EMISSIVE_LAYER, EMISSIVE_PLANE, dir)
|
||||
. += mutable_appearance(icon, "fire_off")
|
||||
. += emissive_appearance(icon, "fire_off")
|
||||
else if(obj_flags & EMAGGED)
|
||||
. += "fire_emagged"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", EMISSIVE_LAYER, EMISSIVE_PLANE, dir)
|
||||
. += mutable_appearance(icon, "fire_emagged")
|
||||
. += emissive_appearance(icon, "fire_emagged")
|
||||
else
|
||||
. += "fire_on"
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "fire_on", EMISSIVE_LAYER, EMISSIVE_PLANE, dir)
|
||||
. += mutable_appearance(icon, "fire_on")
|
||||
. += emissive_appearance(icon, "fire_on")
|
||||
|
||||
if(!panel_open && detecting) //It just looks horrible with the panel open
|
||||
. += "fire_detected"
|
||||
. += mutable_appearance(icon, "fire_detected")
|
||||
. += emissive_appearance(icon, "fire_detected") //Pain
|
||||
|
||||
/obj/machinery/firealarm/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -1,52 +1,70 @@
|
||||
// the light switch
|
||||
// can have multiple per area
|
||||
// can also operate on non-loc area through "otherarea" var
|
||||
/// The light switch. Can have multiple per area.
|
||||
/obj/machinery/light_switch
|
||||
name = "light switch"
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "light1"
|
||||
plane = ABOVE_WALL_PLANE
|
||||
base_icon_state = "light"
|
||||
desc = "Make dark."
|
||||
var/on = TRUE
|
||||
var/area/area = null
|
||||
var/otherarea = null
|
||||
|
||||
/obj/machinery/light_switch/directional/north
|
||||
dir = SOUTH
|
||||
pixel_y = 26
|
||||
|
||||
/obj/machinery/light_switch/directional/south
|
||||
dir = NORTH
|
||||
pixel_y = -26
|
||||
|
||||
/obj/machinery/light_switch/directional/east
|
||||
dir = WEST
|
||||
pixel_x = 26
|
||||
|
||||
/obj/machinery/light_switch/directional/west
|
||||
dir = EAST
|
||||
pixel_x = -26
|
||||
|
||||
/obj/machinery/light_switch/Initialize()
|
||||
. = ..()
|
||||
area = get_area(src)
|
||||
|
||||
if(istext(area))
|
||||
area = text2path(area)
|
||||
if(ispath(area))
|
||||
area = GLOB.areas_by_type[area]
|
||||
if(otherarea)
|
||||
area = locate(text2path("/area/[otherarea]"))
|
||||
if(!area)
|
||||
area = get_area(src)
|
||||
|
||||
if(!name)
|
||||
name = "light switch ([area.name])"
|
||||
|
||||
on = area.lightswitch
|
||||
update_icon()
|
||||
/obj/machinery/light_switch/update_appearance(updates=ALL)
|
||||
. = ..()
|
||||
luminosity = (stat & NOPOWER) ? 0 : 1
|
||||
|
||||
/obj/machinery/light_switch/update_icon_state()
|
||||
if(stat & NOPOWER)
|
||||
icon_state = "light-p"
|
||||
else
|
||||
if(on)
|
||||
icon_state = "light1"
|
||||
else
|
||||
icon_state = "light0"
|
||||
icon_state = "[base_icon_state]-p"
|
||||
return ..()
|
||||
icon_state = "[base_icon_state][area.lightswitch ? 1 : 0]"
|
||||
return ..()
|
||||
|
||||
/obj/machinery/light_switch/update_overlays()
|
||||
. = ..()
|
||||
if(!(stat & NOPOWER))
|
||||
. += emissive_appearance(icon, "[base_icon_state]-glow", alpha = src.alpha)
|
||||
|
||||
/obj/machinery/light_switch/examine(mob/user)
|
||||
. = ..()
|
||||
. += "It is [on? "on" : "off"]."
|
||||
|
||||
. += "It is [area.lightswitch ? "on" : "off"]."
|
||||
/obj/machinery/light_switch/interact(mob/user)
|
||||
. = ..()
|
||||
on = !on
|
||||
|
||||
area.lightswitch = on
|
||||
area.update_icon()
|
||||
area.lightswitch = !area.lightswitch
|
||||
area.update_appearance()
|
||||
|
||||
for(var/obj/machinery/light_switch/L in area)
|
||||
L.on = on
|
||||
L.update_icon()
|
||||
L.update_appearance()
|
||||
|
||||
area.power_change()
|
||||
|
||||
@@ -58,7 +76,7 @@
|
||||
else
|
||||
stat |= NOPOWER
|
||||
|
||||
update_icon()
|
||||
update_appearance()
|
||||
|
||||
/obj/machinery/light_switch/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
integrity_failure = 0.5
|
||||
armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
/// Base turret icon state
|
||||
var/base_icon_state = "standard"
|
||||
base_icon_state = "standard"
|
||||
/// Scan range of the turret for locating targets
|
||||
var/scan_range = 7
|
||||
/// For turrets inside other objects
|
||||
@@ -459,11 +459,11 @@
|
||||
|
||||
else if(iscarbon(A))
|
||||
var/mob/living/carbon/C = A
|
||||
//If not emagged, only target carbons that can use items
|
||||
if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || !(C.mobility_flags & MOBILITY_USE)))
|
||||
//If not on lethal, only target carbons that aren't cuffed nor stamcrit or just plain crit.
|
||||
if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || IS_STAMCRIT(C)))
|
||||
continue
|
||||
|
||||
//If emagged, target all but dead carbons
|
||||
//If on lethal, target all but dead carbons
|
||||
if(mode == TURRET_LETHAL && C.stat == DEAD)
|
||||
continue
|
||||
|
||||
@@ -503,6 +503,7 @@
|
||||
return 1
|
||||
|
||||
/obj/machinery/porta_turret/proc/popUp() //pops the turret up
|
||||
set waitfor = FALSE
|
||||
if(!anchored)
|
||||
return
|
||||
if(raising || raised)
|
||||
@@ -521,6 +522,7 @@
|
||||
layer = MOB_LAYER
|
||||
|
||||
/obj/machinery/porta_turret/proc/popDown() //pops the turret down
|
||||
set waitfor = FALSE
|
||||
if(raising || !raised)
|
||||
return
|
||||
if(stat & BROKEN)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "recharger"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "recharger0"
|
||||
base_icon_state = "recharger"
|
||||
desc = "A charging dock for energy based weaponry."
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 4
|
||||
@@ -187,16 +188,29 @@
|
||||
if(B.cell)
|
||||
B.cell.charge = 0
|
||||
|
||||
/obj/machinery/recharger/update_appearance(updates)
|
||||
. = ..()
|
||||
if((stat & (NOPOWER|BROKEN)) || panel_open || !anchored)
|
||||
luminosity = 0
|
||||
return
|
||||
luminosity = 1
|
||||
|
||||
/obj/machinery/recharger/update_icon_state()
|
||||
/obj/machinery/recharger/update_overlays()
|
||||
. = ..()
|
||||
if(stat & (NOPOWER|BROKEN) || !anchored)
|
||||
icon_state = "rechargeroff"
|
||||
else if(panel_open)
|
||||
icon_state = "rechargeropen"
|
||||
else if(charging)
|
||||
if(using_power)
|
||||
icon_state = "recharger1"
|
||||
else
|
||||
icon_state = "recharger2"
|
||||
else
|
||||
icon_state = "recharger0"
|
||||
return
|
||||
if(panel_open)
|
||||
. += mutable_appearance(icon, "[base_icon_state]-open", alpha = src.alpha)
|
||||
return
|
||||
|
||||
if(!charging)
|
||||
. += mutable_appearance(icon, "[base_icon_state]-empty", alpha = src.alpha)
|
||||
. += emissive_appearance(icon, "[base_icon_state]-empty", alpha = src.alpha)
|
||||
return
|
||||
if(using_power)
|
||||
. += mutable_appearance(icon, "[base_icon_state]-charging", alpha = src.alpha)
|
||||
. += emissive_appearance(icon, "[base_icon_state]-charging", alpha = src.alpha)
|
||||
return
|
||||
|
||||
. += mutable_appearance(icon, "[base_icon_state]-full", alpha = src.alpha)
|
||||
. += emissive_appearance(icon, "[base_icon_state]-full", alpha = src.alpha)
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY
|
||||
|
||||
var/gas_type = /datum/gas/plasma
|
||||
var/gas_type = GAS_PLASMA
|
||||
var/efficiency_multiplier = 1
|
||||
var/gas_capacity = 0
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
if(panel_open)
|
||||
. += "sheater-open"
|
||||
|
||||
/obj/machinery/space_heater/process()
|
||||
/obj/machinery/space_heater/process_atmos()
|
||||
if(!on || !is_operational())
|
||||
if (on) // If it's broken, turn it off too
|
||||
on = FALSE
|
||||
@@ -220,7 +220,7 @@
|
||||
usr.visible_message("<span class='notice'>[usr] switches [on ? "on" : "off"] \the [src].</span>", "<span class='notice'>You switch [on ? "on" : "off"] \the [src].</span>")
|
||||
update_icon()
|
||||
if (on)
|
||||
START_PROCESSING(SSmachines, src)
|
||||
SSair.atmos_air_machinery += src
|
||||
. = TRUE
|
||||
if("mode")
|
||||
setMode = params["mode"]
|
||||
|
||||
@@ -288,6 +288,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/bombcore/proc/defuse()
|
||||
set waitfor = FALSE
|
||||
//Note: Because of how var/defused is used you shouldn't override this UNLESS you intend to set the var to 0 or
|
||||
// otherwise remove the core/reset the wires before the end of defuse(). It will repeatedly be called otherwise.
|
||||
|
||||
|
||||
@@ -70,7 +70,6 @@
|
||||
cell.charge = INFINITY
|
||||
max_integrity = INFINITY
|
||||
obj_integrity = max_integrity
|
||||
CHECK_TICK //Just to be on the safe side lag wise
|
||||
else
|
||||
if(cell.charge < cell.maxcharge)
|
||||
for(var/obj/effect/clockwork/sigil/transmission/T in range(SIGIL_ACCESS_RANGE, src))
|
||||
@@ -80,7 +79,6 @@
|
||||
adjust_clockwork_power(-delta)
|
||||
if(obj_integrity < max_integrity && istype(loc, /turf/open/floor/clockwork))
|
||||
obj_integrity += min(max_integrity - obj_integrity, max_integrity / 200)
|
||||
CHECK_TICK
|
||||
|
||||
/obj/mecha/combat/neovgre/Initialize()
|
||||
.=..()
|
||||
|
||||
@@ -422,12 +422,12 @@
|
||||
return
|
||||
var/datum/gas_mixture/GM = new
|
||||
if(prob(10))
|
||||
GM.adjust_moles(/datum/gas/plasma,100)
|
||||
GM.adjust_moles(GAS_PLASMA,100)
|
||||
GM.set_temperature(1500+T0C) //should be enough to start a fire
|
||||
T.visible_message("[src] suddenly disgorges a cloud of heated plasma.")
|
||||
qdel(src)
|
||||
else
|
||||
GM.adjust_moles(/datum/gas/plasma,5)
|
||||
GM.adjust_moles(GAS_PLASMA,5)
|
||||
GM.set_temperature(istype(T) ? T.air.return_temperature() : T20C)
|
||||
T.visible_message("[src] suddenly disgorges a cloud of plasma.")
|
||||
T.assume_air(GM)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/load_audio = "sound/weapons/gun_magazine_insert_empty_1.ogg"
|
||||
var/ammo_type
|
||||
|
||||
/obj/item/mecha_ammo/proc/update_name()
|
||||
/obj/item/mecha_ammo/update_name()
|
||||
if(!rounds)
|
||||
name = "empty ammo box"
|
||||
desc = "An exosuit ammuniton box that has since been emptied. Please recycle."
|
||||
|
||||
+18
-28
@@ -203,11 +203,7 @@
|
||||
equipment.Cut()
|
||||
cell = null
|
||||
internal_tank = null
|
||||
if(loc)
|
||||
loc.assume_air(cabin_air)
|
||||
air_update_turf()
|
||||
else
|
||||
qdel(cabin_air)
|
||||
assume_air(cabin_air)
|
||||
cabin_air = null
|
||||
qdel(spark_system)
|
||||
spark_system = null
|
||||
@@ -257,8 +253,8 @@
|
||||
/obj/mecha/proc/add_cabin()
|
||||
cabin_air = new(200)
|
||||
cabin_air.set_temperature(T20C)
|
||||
cabin_air.set_moles(/datum/gas/oxygen,O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature()))
|
||||
cabin_air.set_moles(/datum/gas/nitrogen,N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature()))
|
||||
cabin_air.set_moles(GAS_O2,O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature()))
|
||||
cabin_air.set_moles(GAS_N2,N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature()))
|
||||
return cabin_air
|
||||
|
||||
/obj/mecha/proc/add_radio()
|
||||
@@ -321,13 +317,7 @@
|
||||
|
||||
if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank
|
||||
if(internal_tank)
|
||||
var/datum/gas_mixture/int_tank_air = internal_tank.return_air()
|
||||
var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.1)
|
||||
if(loc)
|
||||
loc.assume_air(leaked_gas)
|
||||
air_update_turf()
|
||||
else
|
||||
qdel(leaked_gas)
|
||||
assume_air_ratio(internal_tank.return_air(), 0.1)
|
||||
|
||||
if(internal_damage & MECHA_INT_SHORT_CIRCUIT)
|
||||
if(get_charge())
|
||||
@@ -350,8 +340,7 @@
|
||||
if(pressure_delta > 0) //cabin pressure lower than release pressure
|
||||
if(tank_air.return_temperature() > 0)
|
||||
transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION)
|
||||
var/datum/gas_mixture/removed = tank_air.remove(transfer_moles)
|
||||
cabin_air.merge(removed)
|
||||
tank_air.transfer_to(cabin_air,transfer_moles)
|
||||
else if(pressure_delta < 0) //cabin pressure higher than release pressure
|
||||
var/datum/gas_mixture/t_air = return_air()
|
||||
pressure_delta = cabin_pressure - release_pressure
|
||||
@@ -359,11 +348,7 @@
|
||||
pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta)
|
||||
if(pressure_delta > 0) //if location pressure is lower than cabin pressure
|
||||
transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION)
|
||||
var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles)
|
||||
if(t_air)
|
||||
t_air.merge(removed)
|
||||
else //just delete the cabin gas, we're in space or some shit
|
||||
qdel(removed)
|
||||
cabin_air.transfer_to(t_air, transfer_moles)
|
||||
|
||||
if(occupant)
|
||||
if(cell)
|
||||
@@ -372,22 +357,22 @@
|
||||
if(0.75 to INFINITY)
|
||||
occupant.clear_alert("charge")
|
||||
if(0.5 to 0.75)
|
||||
occupant.throw_alert("charge", /obj/screen/alert/lowcell, 1)
|
||||
occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 1)
|
||||
if(0.25 to 0.5)
|
||||
occupant.throw_alert("charge", /obj/screen/alert/lowcell, 2)
|
||||
occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 2)
|
||||
if(0.01 to 0.25)
|
||||
occupant.throw_alert("charge", /obj/screen/alert/lowcell, 3)
|
||||
occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 3)
|
||||
else
|
||||
occupant.throw_alert("charge", /obj/screen/alert/emptycell)
|
||||
occupant.throw_alert("charge", /atom/movable/screen/alert/emptycell)
|
||||
|
||||
var/integrity = obj_integrity/max_integrity*100
|
||||
switch(integrity)
|
||||
if(30 to 45)
|
||||
occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 1)
|
||||
occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 1)
|
||||
if(15 to 35)
|
||||
occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 2)
|
||||
occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 2)
|
||||
if(-INFINITY to 15)
|
||||
occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3)
|
||||
occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 3)
|
||||
else
|
||||
occupant.clear_alert("mech damage")
|
||||
var/atom/checking = occupant.loc
|
||||
@@ -809,6 +794,11 @@
|
||||
return cabin_air.remove(amount)
|
||||
return ..()
|
||||
|
||||
/obj/mecha/remove_air_ratio(ratio)
|
||||
if(use_internal_tank)
|
||||
return cabin_air.remove_ratio(ratio)
|
||||
return ..()
|
||||
|
||||
/obj/mecha/return_air()
|
||||
if(use_internal_tank)
|
||||
return cabin_air
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
M.setDir(dir)
|
||||
buckled_mobs |= M
|
||||
M.update_mobility()
|
||||
M.throw_alert("buckled", /obj/screen/alert/restrained/buckled)
|
||||
M.throw_alert("buckled", /atom/movable/screen/alert/restrained/buckled)
|
||||
post_buckle_mob(M)
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_BUCKLE, M, force)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
layer = ABOVE_NORMAL_TURF_LAYER
|
||||
var/turf/target
|
||||
var/acid_level = 0 // Removed from obj, so it goes here now
|
||||
|
||||
|
||||
/obj/effect/acid/Initialize(mapload, acid_pwr, acid_amt)
|
||||
@@ -42,7 +43,7 @@
|
||||
|
||||
for(var/obj/O in target)
|
||||
if(prob(20) && !(resistance_flags & UNACIDABLE))
|
||||
if(O.acid_level < acid_level*0.3)
|
||||
if(O.acid_level() < acid_level*0.3)
|
||||
var/acid_used = min(acid_level*0.05, 20)
|
||||
O.acid_act(10, acid_used)
|
||||
acid_level = max(0, acid_level - acid_used*10)
|
||||
|
||||
@@ -296,7 +296,7 @@
|
||||
var/mob/C = pick(candidates)
|
||||
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(S)])")
|
||||
C.transfer_ckey(S, FALSE)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/policy = policies[POLICYCONFIG_ON_PYROCLASTIC_SENTIENT]
|
||||
if(policy)
|
||||
to_chat(S,policy)
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
bloodiness = 0
|
||||
|
||||
/obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases)
|
||||
..()
|
||||
. = ..()
|
||||
icon_state += "-old"
|
||||
add_blood_DNA(list("Non-human DNA" = "A+"))
|
||||
|
||||
|
||||
@@ -19,10 +19,93 @@
|
||||
icon = 'icons/obj/chempuff.dmi'
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
layer = FLY_LAYER
|
||||
var/stream = FALSE
|
||||
var/speed = 1
|
||||
var/range = 3
|
||||
var/hits_left = 3
|
||||
var/range_left = 3
|
||||
var/firstmove = TRUE
|
||||
var/list/hit
|
||||
|
||||
/obj/effect/decal/chempuff/blob_act(obj/structure/blob/B)
|
||||
return
|
||||
|
||||
/obj/effect/decal/chempuff/Initialize(mapload, stream_mode, speed, range, hits_left, size)
|
||||
. = ..()
|
||||
create_reagents(size, NONE, NO_REAGENTS_VALUE)
|
||||
stream = stream_mode
|
||||
src.speed = speed
|
||||
src.range = src.range_left = range
|
||||
src.hits_left = hits_left
|
||||
hit = list()
|
||||
|
||||
/obj/effect/decal/chempuff/Destroy()
|
||||
hit = null
|
||||
return ..()
|
||||
|
||||
/// proc called to handle us hitting something
|
||||
/obj/effect/decal/chempuff/proc/hit_thing(atom/A, bump_hit)
|
||||
// if the thing is invisible it usually is abstract/underfloor. also, don't hit ourselves.
|
||||
if(A == src || A.invisibility)
|
||||
return
|
||||
// don't hit anything on the first move unless overridden (see: we're colliding a wall blocking our move out of the first tile)
|
||||
if(firstmove && !bump_hit)
|
||||
return
|
||||
// we're out of hits or we already hit it
|
||||
if(!hits_left || hit[A])
|
||||
return
|
||||
var/living = isliving(A)
|
||||
// if it's not dense and we're a stream instead of a mist, and we're not out of range
|
||||
if(!A.density && stream && range_left && !bump_hit)
|
||||
return
|
||||
// non living mobs are effectively abstract
|
||||
if(ismob(A) && !living)
|
||||
return
|
||||
hit[A] = TRUE
|
||||
reagents.reaction(A, VAPOR)
|
||||
// mobs absorb enough to decrement hits_left, as well as stuff blocking us.
|
||||
if(ismob(A) || bump_hit)
|
||||
hits_left--
|
||||
|
||||
/obj/effect/decal/chempuff/Crossed(atom/movable/AM, oldloc)
|
||||
. = ..()
|
||||
// bump things moving into us as long as we're not on our first move/moving out of origin tile
|
||||
hit_thing(AM)
|
||||
|
||||
/obj/effect/decal/chempuff/Bump(atom/A)
|
||||
. = ..()
|
||||
// if we hit something blocking our movement, collide it regardless even if we're still on our origin tile
|
||||
hit_thing(A, TRUE)
|
||||
|
||||
/obj/effect/decal/chempuff/proc/run_puff(atom/target)
|
||||
var/safety = 255
|
||||
while(range_left)
|
||||
if(!safety--)
|
||||
CRASH("Spray ran out of safety.")
|
||||
// move towards new turf
|
||||
step_towards(src, target)
|
||||
if(firstmove)
|
||||
// mark first movement so future Cross()es result in collisions
|
||||
firstmove = FALSE
|
||||
// decrement range
|
||||
range_left--
|
||||
// if we got nullspaced, exit
|
||||
if(!isturf(loc))
|
||||
break
|
||||
// hit everything in it
|
||||
for(var/atom/T in loc)
|
||||
hit_thing(T)
|
||||
// if we got deleted or ran out of hits, stop
|
||||
if(!hits_left || !isturf(loc))
|
||||
break
|
||||
if(!hits_left || !isturf(loc))
|
||||
// yeah yeah sue me it's copypasted code but I don't want to declare a var.
|
||||
break
|
||||
// hit the turf
|
||||
hit_thing(loc)
|
||||
sleep(speed)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/decal/fakelattice
|
||||
name = "lattice"
|
||||
desc = "A lightweight support lattice."
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
if(hotspot && istype(T) && T.air)
|
||||
qdel(hotspot)
|
||||
var/datum/gas_mixture/G = T.air
|
||||
var/plas_amt = min(30,G.get_moles(/datum/gas/plasma)) //Absorb some plasma
|
||||
G.adjust_moles(/datum/gas/plasma,-plas_amt)
|
||||
var/plas_amt = min(30,G.get_moles(GAS_PLASMA)) //Absorb some plasma
|
||||
G.adjust_moles(GAS_PLASMA,-plas_amt)
|
||||
absorbed_plasma += plas_amt
|
||||
if(G.return_temperature() > T20C)
|
||||
G.set_temperature(max(G.return_temperature()/2,T20C))
|
||||
@@ -322,7 +322,7 @@
|
||||
for(var/obj/effect/hotspot/H in O)
|
||||
qdel(H)
|
||||
for(var/I in G.get_gases())
|
||||
if(I == /datum/gas/oxygen || I == /datum/gas/nitrogen)
|
||||
if(I == GAS_O2 || I == GAS_N2)
|
||||
continue
|
||||
G.set_moles(I, 0)
|
||||
O.air_update_turf()
|
||||
@@ -341,7 +341,7 @@
|
||||
return TRUE
|
||||
. = ..()
|
||||
|
||||
/obj/structure/foamedmetal/resin/BlockSuperconductivity()
|
||||
/obj/structure/foamedmetal/resin/BlockThermalConductivity()
|
||||
return TRUE
|
||||
|
||||
#undef ALUMINUM_FOAM
|
||||
|
||||
@@ -170,9 +170,9 @@
|
||||
T.air_update_turf()
|
||||
for(var/obj/effect/hotspot/H in T)
|
||||
qdel(H)
|
||||
if(G.get_moles(/datum/gas/plasma))
|
||||
G.adjust_moles(/datum/gas/nitrogen, G.get_moles(/datum/gas/plasma))
|
||||
G.set_moles(/datum/gas/plasma, 0)
|
||||
if(G.get_moles(GAS_PLASMA))
|
||||
G.adjust_moles(GAS_N2, G.get_moles(GAS_PLASMA))
|
||||
G.set_moles(GAS_PLASMA, 0)
|
||||
if (weldvents)
|
||||
for(var/obj/machinery/atmospherics/components/unary/U in T)
|
||||
if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber.
|
||||
|
||||
@@ -73,6 +73,8 @@
|
||||
myseed.adjust_yield(rand(-3,2))
|
||||
myseed.adjust_production(rand(-3,3))
|
||||
myseed.endurance = clamp(myseed.endurance + rand(-3,2), 0, 100) // adjust_endurance has a min value of 10, need to edit directly
|
||||
// Scale health to endurance
|
||||
max_integrity = obj_integrity = 10 + myseed.endurance / 2
|
||||
delay_spread = delay_spread - myseed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
|
||||
var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow)
|
||||
if(ispath(G)) // Seeds were ported to initialize so their genes are still typepaths here, luckily their initializer is smart enough to handle us doing this
|
||||
@@ -193,8 +195,14 @@
|
||||
/obj/structure/glowshroom/proc/Decay(spread, amount)
|
||||
if (spread) // Decay due to spread
|
||||
myseed.endurance -= amount
|
||||
max_integrity = min(max_integrity, 10 + myseed.endurance / 2)
|
||||
if(obj_integrity > max_integrity)
|
||||
obj_integrity = max_integrity
|
||||
else // Timed decay
|
||||
myseed.endurance -= 1
|
||||
max_integrity = min(max_integrity, 10 + myseed.endurance / 2)
|
||||
if(obj_integrity > max_integrity)
|
||||
obj_integrity = max_integrity
|
||||
if (myseed.endurance > 0)
|
||||
addtimer(CALLBACK(src, .proc/Decay), delay_decay, FALSE) // Recall decay timer
|
||||
return
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#define CELSIUS_TO_KELVIN(T_K) ((T_K) + T0C)
|
||||
|
||||
#define OPTIMAL_TEMP_K_PLA_BURN_SCALE(PRESSURE_P,PRESSURE_O,TEMP_O) (((PRESSURE_P) * GLOB.meta_gas_specific_heats[/datum/gas/plasma]) / (((PRESSURE_P) * GLOB.meta_gas_specific_heats[/datum/gas/plasma] + (PRESSURE_O) * GLOB.meta_gas_specific_heats[/datum/gas/oxygen]) / PLASMA_UPPER_TEMPERATURE - (PRESSURE_O) * GLOB.meta_gas_specific_heats[/datum/gas/oxygen] / CELSIUS_TO_KELVIN(TEMP_O)))
|
||||
#define OPTIMAL_TEMP_K_PLA_BURN_SCALE(PRESSURE_P,PRESSURE_O,TEMP_O) (((PRESSURE_P) * GLOB.gas_data.specific_heats[GAS_PLASMA]) / (((PRESSURE_P) * GLOB.gas_data.specific_heats[GAS_PLASMA] + (PRESSURE_O) * GLOB.gas_data.specific_heats[GAS_O2]) / PLASMA_UPPER_TEMPERATURE - (PRESSURE_O) * GLOB.gas_data.specific_heats[GAS_O2] / CELSIUS_TO_KELVIN(TEMP_O)))
|
||||
#define OPTIMAL_TEMP_K_PLA_BURN_RATIO(PRESSURE_P,PRESSURE_O,TEMP_O) (CELSIUS_TO_KELVIN(TEMP_O) * PLASMA_OXYGEN_FULLBURN * (PRESSURE_P) / (PRESSURE_O))
|
||||
|
||||
/obj/effect/spawner/newbomb
|
||||
@@ -19,10 +19,10 @@
|
||||
var/obj/item/tank/internals/plasma/PT = new(V)
|
||||
var/obj/item/tank/internals/oxygen/OT = new(V)
|
||||
|
||||
PT.air_contents.set_moles(/datum/gas/plasma, pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p)))
|
||||
PT.air_contents.set_moles(GAS_PLASMA, pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p)))
|
||||
PT.air_contents.set_temperature(CELSIUS_TO_KELVIN(temp_p))
|
||||
|
||||
OT.air_contents.set_moles(/datum/gas/oxygen, pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o)))
|
||||
OT.air_contents.set_moles(GAS_O2, pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o)))
|
||||
OT.air_contents.set_temperature(CELSIUS_TO_KELVIN(temp_o))
|
||||
|
||||
V.tank_one = PT
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
line = null
|
||||
if(qdel_in)
|
||||
QDEL_IN(PB, qdel_in)
|
||||
d
|
||||
|
||||
/obj/effect/projectile/tracer
|
||||
name = "beam"
|
||||
icon = 'icons/obj/projectiles_tracer.dmi'
|
||||
|
||||
+21
-14
@@ -352,15 +352,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
C.update_damage_overlays()
|
||||
return
|
||||
|
||||
if(acid_level > 20 && ismob(loc))// so we can still remove the clothes on us that have acid.
|
||||
var/mob/living/carbon/C = user
|
||||
if(istype(C))
|
||||
if(!C.gloves || (!(C.gloves.resistance_flags & (UNACIDABLE|ACID_PROOF))))
|
||||
to_chat(user, "<span class='warning'>The acid on [src] burns your hand!</span>")
|
||||
var/obj/item/bodypart/affecting = C.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
|
||||
if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
|
||||
C.update_damage_overlays()
|
||||
|
||||
if(!(interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) //See if we're supposed to auto pickup.
|
||||
return
|
||||
|
||||
@@ -461,6 +452,21 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user)
|
||||
item_flags |= IN_INVENTORY
|
||||
if(item_flags & (ITEM_CAN_BLOCK | ITEM_CAN_PARRY) && user.client && !(type in user.client.block_parry_hinted))
|
||||
var/list/dat = list("<span class='boldnotice'>You have picked up an item that can be used to block and/or parry:</span>")
|
||||
// cit change - parry/block feedback
|
||||
var/datum/block_parry_data/data = return_block_parry_datum(block_parry_data)
|
||||
if(item_flags & ITEM_CAN_BLOCK)
|
||||
dat += "[src] can be used to block damage using directional block. Press your active block keybind to use it."
|
||||
if(data.block_automatic_enabled)
|
||||
dat += "[src] is also capable of automatically blocking damage, if you are facing the right direction (usually towards your attacker)!"
|
||||
if(item_flags & ITEM_CAN_PARRY)
|
||||
dat += "[src] can be used to parry damage using active parry. Pressed your active parry keybind to initiate a timed parry sequence."
|
||||
if(data.parry_automatic_enabled)
|
||||
dat += "[src] is also capable of automatically parrying an incoming attack, if your mouse is over your attacker at the time if you being hit in a direct, melee attack."
|
||||
dat += "Examine [src] to get a full readout of its block/parry stats."
|
||||
to_chat(user, dat.Join("<br>"))
|
||||
user.client.block_parry_hinted |= type
|
||||
|
||||
// called when "found" in pockets and storage items. Returns 1 if the search should end.
|
||||
/obj/item/proc/on_found(mob/finder)
|
||||
@@ -504,12 +510,13 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
|
||||
*/
|
||||
/obj/item/proc/equipped(mob/user, slot, initial = FALSE)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
|
||||
var/signal_flags = SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
|
||||
current_equipped_slot = slot
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot.
|
||||
A.Grant(user)
|
||||
if(!(signal_flags & COMPONENT_NO_GRANT_ACTIONS))
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot.
|
||||
A.Grant(user)
|
||||
item_flags |= IN_INVENTORY
|
||||
// if(!initial)
|
||||
// if(equip_sound && (slot_flags & slot))
|
||||
|
||||
@@ -242,12 +242,18 @@
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/obj/effect/chrono_field/assume_air()
|
||||
return 0
|
||||
return null
|
||||
|
||||
/obj/effect/chrono_field/assume_air_moles()
|
||||
return null
|
||||
|
||||
/obj/effect/chrono_field/assume_air_ratio()
|
||||
return null
|
||||
|
||||
/obj/effect/chrono_field/return_air() //we always have nominal air and temperature
|
||||
var/datum/gas_mixture/GM = new
|
||||
GM.set_moles(/datum/gas/oxygen, MOLES_O2STANDARD)
|
||||
GM.set_moles(/datum/gas/nitrogen, MOLES_N2STANDARD)
|
||||
GM.set_moles(GAS_O2, MOLES_O2STANDARD)
|
||||
GM.set_moles(GAS_N2, MOLES_N2STANDARD)
|
||||
GM.set_temperature(T20C)
|
||||
return GM
|
||||
|
||||
|
||||
@@ -387,6 +387,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
throwforce = 0
|
||||
grind_results = list(/datum/reagent/carbon = 2)
|
||||
|
||||
/obj/item/cigbutt/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/trash)
|
||||
|
||||
/obj/item/cigbutt/cigarbutt
|
||||
name = "cigar butt"
|
||||
desc = "A manky old cigar butt."
|
||||
|
||||
@@ -99,8 +99,8 @@
|
||||
. = ..()
|
||||
if(!. && ismob(loc) && loc == usr)
|
||||
var/mob/M = loc
|
||||
if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand))
|
||||
var/atom/movable/screen/inventory/hand/H = over_object
|
||||
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
|
||||
|
||||
/obj/item/defibrillator/attackby(obj/item/W, mob/user, params)
|
||||
@@ -283,7 +283,7 @@
|
||||
var/combat = FALSE //If it penetrates armor and gives additional functionality
|
||||
var/grab_ghost = FALSE
|
||||
var/tlimit = DEFIB_TIME_LIMIT * 10
|
||||
var/base_icon_state = "defibpaddles"
|
||||
base_icon_state = "defibpaddles"
|
||||
var/disarm_shock_time = 10
|
||||
var/wielded = FALSE // track wielded status on item
|
||||
|
||||
@@ -620,7 +620,7 @@
|
||||
if(req_defib)
|
||||
if(defib.healdisk)
|
||||
H.heal_overall_damage(25, 25)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
|
||||
var/late = timelimit && (tplus > timelimit)
|
||||
var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
|
||||
|
||||
@@ -447,7 +447,7 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
for(var/id in environment.get_gases())
|
||||
var/gas_level = environment.get_moles(id)/total_moles
|
||||
if(gas_level > 0)
|
||||
dat += "[GLOB.meta_gas_names[id]]: [round(gas_level*100, 0.01)]%<br>"
|
||||
dat += "[GLOB.gas_data.names[id]]: [round(gas_level*100, 0.01)]%<br>"
|
||||
|
||||
dat += "Temperature: [round(environment.return_temperature()-T0C)]°C<br>"
|
||||
dat += "<br>"
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
|
||||
/obj/item/multitool/ai_detect/proc/show_hud(mob/user)
|
||||
if(user && hud_type)
|
||||
var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"]
|
||||
var/atom/movable/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"]
|
||||
PM.alpha = 150
|
||||
var/datum/atom_hud/H = GLOB.huds[hud_type]
|
||||
if(!H.hudusers[user])
|
||||
@@ -194,7 +194,7 @@
|
||||
|
||||
/obj/item/multitool/ai_detect/proc/remove_hud(mob/user)
|
||||
if(user && hud_type)
|
||||
var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"]
|
||||
var/atom/movable/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"]
|
||||
PM.alpha = 255
|
||||
var/datum/atom_hud/H = GLOB.huds[hud_type]
|
||||
H.remove_hud_from(user)
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
/obj/item/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
|
||||
src.pai = personality
|
||||
src.add_overlay("pai-null")
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/policy = policies[POLICYCONFIG_PAI]
|
||||
if(policy)
|
||||
to_chat(personality, policy)
|
||||
|
||||
@@ -130,8 +130,8 @@
|
||||
. = ..()
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand))
|
||||
var/atom/movable/screen/inventory/hand/H = over_object
|
||||
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
|
||||
|
||||
/obj/item/storage/portable_chem_mixer/ui_interact(mob/user, datum/tgui/ui)
|
||||
|
||||
@@ -426,18 +426,21 @@ GENETICS SCANNER
|
||||
if(ishuman(C))
|
||||
if(H.is_bleeding())
|
||||
msg += "<span class='danger'>Subject is bleeding!</span>\n"
|
||||
var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)
|
||||
var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)
|
||||
var/integrated_blood_percent = round((C.integrating_blood / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100)
|
||||
var/blood_type = C.dna.blood_type
|
||||
if(!(blood_typepath in GLOB.blood_reagent_types))
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[blood_typepath]
|
||||
if(R)
|
||||
blood_type = R.name
|
||||
if(C.scan_blood_volume() <= (BLOOD_VOLUME_SAFE*C.blood_ratio) && C.scan_blood_volume() > (BLOOD_VOLUME_OKAY*C.blood_ratio))
|
||||
msg += "<span class='danger'>LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl,</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
else if(C.scan_blood_volume() <= (BLOOD_VOLUME_OKAY*C.blood_ratio))
|
||||
msg += "<span class='danger'>CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl,</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
|
||||
if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_SAFE * C.blood_ratio) && (C.scan_blood_volume() + C.integrating_blood) > (BLOOD_VOLUME_OKAY*C.blood_ratio))
|
||||
msg += "<span class='danger'>LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""].</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
else if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_OKAY * C.blood_ratio))
|
||||
msg += "<span class='danger'>CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""].</span> <span class='info'>type: [blood_type]</span>\n"
|
||||
else
|
||||
msg += "<span class='info'>Blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]</span>\n"
|
||||
msg += "<span class='info'>Blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]</span>\n"
|
||||
|
||||
|
||||
var/cyberimp_detect
|
||||
for(var/obj/item/organ/cyberimp/CI in C.internal_organs)
|
||||
@@ -708,7 +711,7 @@ GENETICS SCANNER
|
||||
for(var/id in air_contents.get_gases())
|
||||
if(air_contents.get_moles(id) >= 0.005)
|
||||
var/gas_concentration = air_contents.get_moles(id)/total_moles
|
||||
to_chat(user, "<span class='notice'>[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='notice'>[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='notice'>Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)</span>")
|
||||
|
||||
else
|
||||
@@ -721,7 +724,7 @@ GENETICS SCANNER
|
||||
var/instability = round(cached_scan_results["fusion"], 0.01)
|
||||
var/tier = instability2text(instability)
|
||||
to_chat(user, "<span class='boldnotice'>Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.</span>")
|
||||
to_chat(user, "<span class='notice'>Instability of the last fusion reaction: [instability]\n This indicates it was [tier].</span>")
|
||||
to_chat(user, "<span class='notice'>Instability of the last fusion reaction: [instability]\n This indicates it was [tier]</span>")
|
||||
return
|
||||
|
||||
/obj/item/analyzer/proc/scan_turf(mob/user, turf/location)
|
||||
@@ -739,36 +742,36 @@ GENETICS SCANNER
|
||||
to_chat(user, "<span class='alert'>Pressure: [round(pressure, 0.01)] kPa</span>")
|
||||
if(total_moles)
|
||||
|
||||
var/o2_concentration = environment.get_moles(/datum/gas/oxygen)/total_moles
|
||||
var/n2_concentration = environment.get_moles(/datum/gas/nitrogen)/total_moles
|
||||
var/co2_concentration = environment.get_moles(/datum/gas/carbon_dioxide)/total_moles
|
||||
var/plasma_concentration = environment.get_moles(/datum/gas/plasma)/total_moles
|
||||
var/o2_concentration = environment.get_moles(GAS_O2)/total_moles
|
||||
var/n2_concentration = environment.get_moles(GAS_N2)/total_moles
|
||||
var/co2_concentration = environment.get_moles(GAS_CO2)/total_moles
|
||||
var/plasma_concentration = environment.get_moles(GAS_PLASMA)/total_moles
|
||||
|
||||
if(abs(n2_concentration - N2STANDARD) < 20)
|
||||
to_chat(user, "<span class='info'>Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='info'>Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)</span>")
|
||||
else
|
||||
to_chat(user, "<span class='alert'>Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='alert'>Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)</span>")
|
||||
|
||||
if(abs(o2_concentration - O2STANDARD) < 2)
|
||||
to_chat(user, "<span class='info'>Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='info'>Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)</span>")
|
||||
else
|
||||
to_chat(user, "<span class='alert'>Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='alert'>Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)</span>")
|
||||
|
||||
if(co2_concentration > 0.01)
|
||||
to_chat(user, "<span class='alert'>CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='alert'>CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)</span>")
|
||||
else
|
||||
to_chat(user, "<span class='info'>CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='info'>CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)</span>")
|
||||
|
||||
if(plasma_concentration > 0.005)
|
||||
to_chat(user, "<span class='alert'>Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='alert'>Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)</span>")
|
||||
else
|
||||
to_chat(user, "<span class='info'>Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='info'>Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)</span>")
|
||||
|
||||
for(var/id in environment.get_gases())
|
||||
if(id in GLOB.hardcoded_gases)
|
||||
continue
|
||||
var/gas_concentration = environment.get_moles(id)/total_moles
|
||||
to_chat(user, "<span class='alert'>[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='alert'>[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)</span>")
|
||||
to_chat(user, "<span class='info'>Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)</span>")
|
||||
|
||||
if(cached_scan_results && cached_scan_results["fusion"]) //notify the user if a fusion reaction was detected
|
||||
|
||||
@@ -78,22 +78,29 @@ effective or pretty fucking useless.
|
||||
var/ui_x = 320
|
||||
var/ui_y = 335
|
||||
|
||||
/obj/item/healthanalyzer/rad_laser/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/identification/syndicate, ID_COMPONENT_DEL_ON_IDENTIFY, ID_COMPONENT_EFFECT_NO_ACTIONS, ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR)
|
||||
|
||||
/obj/item/healthanalyzer/rad_laser/attack(mob/living/M, mob/living/user)
|
||||
if(!stealth || !irradiate)
|
||||
..()
|
||||
return ..()
|
||||
var/knowledge = SEND_SIGNAL(src, COMSIG_IDENTIFICATION_KNOWLEDGE_CHECK, user) == ID_COMPONENT_KNOWLEDGE_FULL
|
||||
if(!irradiate)
|
||||
return
|
||||
if(!used)
|
||||
log_combat(user, M, "irradiated", src)
|
||||
log_combat(user, M, "[knowledge? "" : "unknowingly "]irradiated", src)
|
||||
var/cooldown = get_cooldown()
|
||||
used = TRUE
|
||||
icon_state = "health1"
|
||||
addtimer(VARSET_CALLBACK(src, used, FALSE), cooldown)
|
||||
addtimer(VARSET_CALLBACK(src, icon_state, "health"), cooldown)
|
||||
to_chat(user, "<span class='warning'>Successfully irradiated [M].</span>")
|
||||
if(knowledge)
|
||||
to_chat(user, "<span class='warning'>Successfully irradiated [M].</span>")
|
||||
addtimer(CALLBACK(src, .proc/radiation_aftereffect, M, intensity), (wavelength+(intensity*4))*5)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The radioactive microlaser is still recharging.</span>")
|
||||
if(knowledge)
|
||||
to_chat(user, "<span class='warning'>The radioactive microlaser is still recharging.</span>")
|
||||
|
||||
/obj/item/healthanalyzer/rad_laser/proc/radiation_aftereffect(mob/living/M, passed_intensity)
|
||||
if(QDELETED(M) || !ishuman(M) || HAS_TRAIT(M, TRAIT_RADIMMUNE))
|
||||
@@ -109,7 +116,9 @@ effective or pretty fucking useless.
|
||||
interact(user)
|
||||
|
||||
/obj/item/healthanalyzer/rad_laser/interact(mob/user)
|
||||
ui_interact(user)
|
||||
var/knowledge = SEND_SIGNAL(src, COMSIG_IDENTIFICATION_KNOWLEDGE_CHECK, user) == ID_COMPONENT_KNOWLEDGE_FULL
|
||||
if(knowledge)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/healthanalyzer/rad_laser/ui_state(mob/user)
|
||||
return GLOB.hands_state
|
||||
|
||||
@@ -172,20 +172,15 @@
|
||||
if(!target_self)
|
||||
target.set_volume(target.return_volume() + tank_two.volume)
|
||||
target.set_volume(target.return_volume() + tank_one.air_contents.return_volume())
|
||||
var/datum/gas_mixture/temp
|
||||
temp = tank_one.air_contents.remove_ratio(1)
|
||||
target.merge(temp)
|
||||
tank_one.air_contents.transfer_ratio_to(target, 1)
|
||||
if(!target_self)
|
||||
temp = tank_two.air_contents.remove_ratio(1)
|
||||
target.merge(temp)
|
||||
tank_two.air_contents.transfer_ratio_to(target, 1)
|
||||
|
||||
/obj/item/transfer_valve/proc/split_gases()
|
||||
if (!valve_open || !tank_one || !tank_two)
|
||||
return
|
||||
var/ratio1 = tank_one.air_contents.return_volume()/tank_two.air_contents.return_volume()
|
||||
var/datum/gas_mixture/temp
|
||||
temp = tank_two.air_contents.remove_ratio(ratio1)
|
||||
tank_one.air_contents.merge(temp)
|
||||
tank_two.air_contents.transfer_ratio_to(tank_one.air_contents, ratio1)
|
||||
tank_two.air_contents.set_volume(tank_two.air_contents.return_volume() - tank_one.air_contents.return_volume())
|
||||
|
||||
/*
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
/datum/block_parry_data/dual_esword // please run at the man going apeshit with his funny doublesword
|
||||
can_block_directions = BLOCK_DIR_NORTH | BLOCK_DIR_NORTHEAST | BLOCK_DIR_NORTHWEST | BLOCK_DIR_WEST | BLOCK_DIR_EAST
|
||||
block_damage_absorption = 2
|
||||
block_damage_absorption = 5
|
||||
block_damage_multiplier = 0.15
|
||||
block_damage_multiplier_override = list(
|
||||
ATTACK_TYPE_MELEE = 0.25
|
||||
@@ -59,7 +59,7 @@
|
||||
)
|
||||
|
||||
parry_time_windup = 0
|
||||
parry_time_active = 8
|
||||
parry_time_active = 12
|
||||
parry_time_spindown = 0
|
||||
// we want to signal to players the most dangerous phase, the time when automatic counterattack is a thing.
|
||||
parry_time_windup_visual_override = 1
|
||||
@@ -69,12 +69,10 @@
|
||||
parry_time_perfect = 2 // first ds isn't perfect
|
||||
parry_time_perfect_leeway = 1
|
||||
parry_imperfect_falloff_percent = 10
|
||||
parry_efficiency_to_counterattack = 100
|
||||
parry_efficiency_considered_successful = 25 // VERY generous
|
||||
parry_failed_stagger_duration = 3 SECONDS
|
||||
parry_failed_clickcd_duration = CLICK_CD_MELEE
|
||||
|
||||
/obj/item/dualsaber/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction)
|
||||
/obj/item/dualsaber/directional_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction)
|
||||
if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object))
|
||||
block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER
|
||||
return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT
|
||||
@@ -83,7 +81,7 @@
|
||||
/obj/item/dualsaber/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
|
||||
. = ..()
|
||||
if(parry_efficiency >= 90) // perfect parry
|
||||
block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER
|
||||
block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT
|
||||
. |= BLOCK_SHOULD_REDIRECT
|
||||
|
||||
/obj/item/dualsaber/Initialize()
|
||||
@@ -369,14 +367,12 @@
|
||||
parry_time_perfect = 1
|
||||
parry_time_perfect_leeway = 1
|
||||
parry_imperfect_falloff_percent = 7.5
|
||||
parry_efficiency_to_counterattack = 100
|
||||
parry_efficiency_considered_successful = 80
|
||||
parry_efficiency_perfect = 120
|
||||
parry_efficiency_perfect_override = list(
|
||||
TEXT_ATTACK_TYPE_PROJECTILE = 30,
|
||||
)
|
||||
parry_failed_stagger_duration = 3 SECONDS
|
||||
parry_failed_clickcd_duration = 2 SECONDS
|
||||
|
||||
/obj/item/dualsaber/hypereutactic/chaplain/ComponentInitialize()
|
||||
. = ..()
|
||||
|
||||
@@ -45,15 +45,15 @@
|
||||
// no attacking while blocking
|
||||
block_lock_attacking = TRUE
|
||||
|
||||
parry_time_windup = 1
|
||||
parry_time_active = 5
|
||||
parry_time_windup = 0
|
||||
parry_time_active = 7
|
||||
parry_time_spindown = 0
|
||||
parry_time_spindown_visual_override = 1
|
||||
parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING // no attacking while parrying
|
||||
parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK // no attacking while parrying
|
||||
parry_time_perfect = 0
|
||||
parry_time_perfect_leeway = 0.5
|
||||
parry_efficiency_perfect = 100
|
||||
parry_imperfect_falloff_percent = 1
|
||||
parry_efficiency_perfect = 85
|
||||
parry_imperfect_falloff_percent = 10
|
||||
parry_imperfect_falloff_percent_override = list(
|
||||
TEXT_ATTACK_TYPE_PROJECTILE = 45 // really crappy vs projectiles
|
||||
)
|
||||
@@ -61,9 +61,7 @@
|
||||
TEXT_ATTACK_TYPE_PROJECTILE = 1 // extremely harsh window for projectiles
|
||||
)
|
||||
// not extremely punishing to fail, but no spamming the parry.
|
||||
parry_cooldown = 2.5 SECONDS
|
||||
parry_failed_stagger_duration = 1.5 SECONDS
|
||||
parry_failed_clickcd_duration = 1 SECONDS
|
||||
|
||||
/obj/item/electrostaff/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -210,13 +210,11 @@
|
||||
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
|
||||
//Transfer 5% of current tank air contents to turf
|
||||
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount)
|
||||
air_transfer.set_moles(/datum/gas/plasma, air_transfer.get_moles(/datum/gas/plasma) * 5)
|
||||
air_transfer.set_moles(GAS_PLASMA, air_transfer.get_moles(GAS_PLASMA) * 5)
|
||||
target.assume_air(air_transfer)
|
||||
//Burn it based on transfered gas
|
||||
target.hotspot_expose((ptank.air_contents.return_temperature()*2) + 380,500)
|
||||
//location.hotspot_expose(1000,500,1)
|
||||
SSair.add_to_active(target, 0)
|
||||
|
||||
|
||||
/obj/item/flamethrower/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -14,7 +14,7 @@ GLOBAL_LIST_INIT(gift_item_blacklist, typecacheof(list(
|
||||
/obj/mafia_game_board,
|
||||
/obj/docking_port,
|
||||
/obj/shapeshift_holder,
|
||||
/obj/screen
|
||||
/atom/movable/screen
|
||||
)))
|
||||
|
||||
GLOBAL_LIST_EMPTY(possible_gifts)
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
/obj/item/restraints
|
||||
breakouttime = 600
|
||||
var/demoralize_criminals = TRUE // checked on carbon/carbon.dm to decide wheter to apply the handcuffed negative moodlet or not.
|
||||
/// allow movement at all during breakout
|
||||
var/allow_breakout_movement = FALSE
|
||||
|
||||
/obj/item/restraints/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
@@ -243,6 +245,7 @@
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
slowdown = 7
|
||||
allow_breakout_movement = TRUE
|
||||
breakouttime = 300 //Deciseconds = 30s = 0.5 minute
|
||||
|
||||
/obj/item/restraints/legcuffs/proc/on_removed()
|
||||
@@ -312,7 +315,7 @@
|
||||
trap_damage = 0
|
||||
item_flags = DROPDEL
|
||||
flags_1 = NONE
|
||||
breakouttime = 25
|
||||
breakouttime = 50
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/New()
|
||||
..()
|
||||
@@ -328,7 +331,7 @@
|
||||
. = ..()
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/cyborg
|
||||
breakouttime = 20 // Cyborgs shouldn't have a strong restraint
|
||||
breakouttime = 40 // Cyborgs shouldn't have a strong restraint
|
||||
|
||||
/obj/item/restraints/legcuffs/bola
|
||||
name = "bola"
|
||||
@@ -379,7 +382,7 @@
|
||||
icon_state = "ebola"
|
||||
hitsound = 'sound/weapons/taserhit.ogg'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
breakouttime = 25
|
||||
breakouttime = 50
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/energy/on_removed()
|
||||
do_sparks(1, TRUE, src)
|
||||
|
||||
@@ -337,7 +337,7 @@
|
||||
page_link = "Guide_to_chemistry"
|
||||
|
||||
/obj/item/book/manual/wiki/chemistry/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
new /obj/item/book/manual/wiki/cit/chemistry(loc)
|
||||
new /obj/item/book/manual/wiki/cit/chem_recipies(loc)
|
||||
|
||||
|
||||
@@ -121,11 +121,14 @@
|
||||
parry_time_perfect = 2.5 // first ds isn't perfect
|
||||
parry_time_perfect_leeway = 1.5
|
||||
parry_imperfect_falloff_percent = 5
|
||||
parry_efficiency_to_counterattack = 100
|
||||
parry_efficiency_to_counterattack = INFINITY
|
||||
parry_efficiency_considered_successful = 65 // VERY generous
|
||||
parry_efficiency_perfect = 100
|
||||
parry_failed_stagger_duration = 4 SECONDS
|
||||
parry_cooldown = 0.5 SECONDS
|
||||
parry_automatic_enabled = TRUE
|
||||
autoparry_single_efficiency = 65
|
||||
autoparry_cooldown_absolute = 3 SECONDS
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -149,8 +152,8 @@
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
|
||||
. = ..()
|
||||
if(parry_efficiency >= 80) // perfect parry
|
||||
block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER
|
||||
if(parry_efficiency >= 100) // perfect parry
|
||||
block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT
|
||||
. |= BLOCK_SHOULD_REDIRECT
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/cyborg
|
||||
|
||||
@@ -72,15 +72,17 @@
|
||||
block_parry_data = /datum/block_parry_data/captain_saber
|
||||
|
||||
/datum/block_parry_data/captain_saber
|
||||
parry_time_windup = 0.5
|
||||
parry_time_active = 4
|
||||
parry_time_spindown = 1
|
||||
parry_time_windup = 0
|
||||
parry_time_active = 10
|
||||
parry_time_spindown = 0
|
||||
parry_time_perfect = 0.75
|
||||
parry_time_perfect_leeway = 0.75
|
||||
parry_time_perfect_leeway = 1.5
|
||||
parry_imperfect_falloff_percent = 30
|
||||
parry_efficiency_perfect = 100
|
||||
parry_failed_stagger_duration = 3 SECONDS
|
||||
parry_failed_clickcd_duration = 2 SECONDS
|
||||
parry_failed_clickcd_duration = 0
|
||||
parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK
|
||||
parry_automatic_enabled = TRUE
|
||||
|
||||
/obj/item/melee/sabre/Initialize()
|
||||
. = ..()
|
||||
@@ -176,30 +178,28 @@
|
||||
|
||||
// Fast, efficient parry.
|
||||
/datum/block_parry_data/traitor_rapier
|
||||
parry_time_windup = 0.5
|
||||
parry_time_active = 5
|
||||
parry_time_windup = 0
|
||||
parry_time_active = 10
|
||||
parry_time_spindown = 0
|
||||
parry_time_active_visual_override = 3
|
||||
parry_time_spindown_visual_override = 2
|
||||
parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING
|
||||
parry_time_perfect = 0
|
||||
parry_time_perfect_leeway = 3
|
||||
parry_time_perfect = 2
|
||||
parry_time_perfect_leeway = 2
|
||||
parry_time_perfect_leeway_override = list(
|
||||
TEXT_ATTACK_TYPE_PROJECTILE = 1
|
||||
)
|
||||
parry_imperfect_falloff_percent_override = list(
|
||||
TEXT_ATTACK_TYPE_PROJECTILE = 50 // useless after 3rd decisecond
|
||||
)
|
||||
parry_imperfect_falloff_percent = 30
|
||||
parry_efficiency_to_counterattack = 100
|
||||
parry_efficiency_considered_successful = 1
|
||||
parry_efficiency_perfect = 100
|
||||
parry_data = list(
|
||||
PARRY_DISARM_ATTACKER = TRUE,
|
||||
PARRY_KNOCKDOWN_ATTACKER = 10
|
||||
PARRY_KNOCKDOWN_ATTACKER = 10,
|
||||
PARRY_DISARM_ATTACKER = TRUE
|
||||
)
|
||||
parry_efficiency_perfect = 100
|
||||
parry_stamina_cost = 5
|
||||
parry_failed_stagger_duration = 2 SECONDS
|
||||
parry_failed_clickcd_duration = CLICK_CD_RANGE
|
||||
parry_automatic_enabled = TRUE
|
||||
parry_cooldown = 0
|
||||
|
||||
/obj/item/melee/rapier/active_parry_reflex_counter(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list, parry_efficiency, list/effect_text)
|
||||
@@ -259,6 +259,8 @@
|
||||
var/stam_dmg = 30
|
||||
var/cooldown_check = 0 // Used internally, you don't want to modify
|
||||
var/cooldown = 13 // Default wait time until can stun again.
|
||||
/// block mitigation needed to prevent knockdown/disarms
|
||||
var/block_percent_to_counter = 50
|
||||
var/stun_time_silicon = 60 // How long it stuns silicons for - 6 seconds.
|
||||
var/affect_silicon = FALSE // Does it stun silicons.
|
||||
var/on_sound // "On" sound, played when switching between able to stun or not.
|
||||
@@ -356,7 +358,8 @@
|
||||
if(cooldown_check < world.time)
|
||||
if(!UseStaminaBufferStandard(user, STAM_COST_BATON_MOB_MULT, warn = TRUE))
|
||||
return DISCARD_LAST_ACTION
|
||||
if(target.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, null) & BLOCK_SUCCESS)
|
||||
var/list/block_return = list()
|
||||
if(target.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, block_return) & BLOCK_SUCCESS)
|
||||
playsound(target, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
return
|
||||
if(ishuman(target))
|
||||
@@ -367,7 +370,8 @@
|
||||
if(stun_animation)
|
||||
user.do_attack_animation(target)
|
||||
playsound(get_turf(src), on_stun_sound, 75, 1, -1)
|
||||
target.DefaultCombatKnockdown(softstun_ds, TRUE, FALSE, hardstun_ds, stam_dmg)
|
||||
var/countered = block_return[BLOCK_RETURN_MITIGATION_PERCENT] > block_percent_to_counter
|
||||
target.DefaultCombatKnockdown(softstun_ds, TRUE, FALSE, countered? 0 : hardstun_ds, stam_dmg, !countered)
|
||||
additional_effects_carbon(target, user)
|
||||
log_combat(user, target, "stunned", src)
|
||||
add_fingerprint(user)
|
||||
@@ -453,6 +457,18 @@
|
||||
playsound(src.loc, on_sound, 50, 1)
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/melee/classic_baton/telescopic/newspaper
|
||||
name = "The Daily Whiplash"
|
||||
desc = "A newspaper wrapped around a telescopic baton in such a way that it looks like you're beating people with a rolled up newspaper."
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "newspaper"
|
||||
lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi'
|
||||
on_sound = 'sound/weapons/batonextend.ogg'
|
||||
on_icon_state = "newspaper2"
|
||||
off_icon_state = "newspaper"
|
||||
on_item_state = "newspaper"
|
||||
|
||||
/obj/item/melee/classic_baton/telescopic/contractor_baton
|
||||
name = "contractor baton"
|
||||
desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets."
|
||||
@@ -695,11 +711,14 @@
|
||||
playsound(src, 'sound/weapons/batonextend.ogg', 50, 1)
|
||||
|
||||
/obj/item/melee/roastingstick/proc/finish_roasting(user, atom/target)
|
||||
if(!held_sausage || held_sausage.roasted)
|
||||
return // no
|
||||
to_chat(user, "You finish roasting [held_sausage]")
|
||||
playsound(src,'sound/items/welder2.ogg',50,1)
|
||||
held_sausage.add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY)
|
||||
held_sausage.name = "[target.name]-roasted [held_sausage.name]"
|
||||
held_sausage.desc = "[held_sausage.desc] It has been cooked to perfection on \a [target]."
|
||||
held_sausage.roasted = TRUE
|
||||
update_icon()
|
||||
|
||||
/obj/item/melee/cleric_mace
|
||||
|
||||
@@ -307,7 +307,7 @@
|
||||
|
||||
if(isanimal(occupant))
|
||||
var/mob/living/simple_animal/animal = occupant
|
||||
occupant_gas_supply[/datum/gas/oxygen] = 0.0064 //make sure it has some gas in so it isn't depressurized
|
||||
occupant_gas_supply[GAS_O2] = 0.0064 //make sure it has some gas in so it isn't depressurized
|
||||
occupant_gas_supply.set_temperature(animal.minbodytemp) //simple animals only care about temperature/pressure when their turf isnt a location
|
||||
|
||||
if(ishuman(occupant)) //humans require resistance to cold/heat and living in no air while inside, and lose this when outside
|
||||
|
||||
@@ -446,7 +446,7 @@
|
||||
mood_message = null
|
||||
cheer_up()
|
||||
|
||||
/obj/item/toy/plush/proc/update_desc()
|
||||
/obj/item/toy/plush/update_desc()
|
||||
desc = normal_desc
|
||||
if(mood_message)
|
||||
desc += mood_message
|
||||
@@ -466,7 +466,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/random/Initialize()
|
||||
SHOULD_CALL_PARENT(FALSE)
|
||||
..()
|
||||
var/newtype
|
||||
var/list/snowflake_list = CONFIG_GET(keyed_list/snowflake_plushies)
|
||||
|
||||
@@ -612,6 +612,12 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
icon_state = "kobold"
|
||||
item_state = "kobold"
|
||||
|
||||
/obj/item/toy/plush/lizardplushie/kobold
|
||||
name = "spacelizard plushie"
|
||||
desc = "An adorable stuffed toy that resembles a lizard in a suit."
|
||||
icon_state = "plushie_spacelizard"
|
||||
item_state = "plushie_spacelizard"
|
||||
|
||||
/obj/item/toy/plush/nukeplushie
|
||||
name = "operative plushie"
|
||||
desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious."
|
||||
@@ -643,17 +649,17 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
/obj/item/toy/plush/beeplushie
|
||||
name = "bee plushie"
|
||||
desc = "A cute toy that resembles an even cuter bee."
|
||||
icon_state = "plushie_h"
|
||||
item_state = "plushie_h"
|
||||
icon_state = "plushie_bee"
|
||||
item_state = "plushie_bee"
|
||||
attack_verb = list("stung")
|
||||
gender = FEMALE
|
||||
squeak_override = list('modular_citadel/sound/voice/scream_moth.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mothplushie
|
||||
name = "insect plushie"
|
||||
name = "moth plushie"
|
||||
desc = "An adorable stuffed toy that resembles some kind of insect."
|
||||
icon_state = "bumble"
|
||||
item_state = "bumble"
|
||||
icon_state = "moff"
|
||||
item_state = "moff"
|
||||
squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
@@ -665,6 +671,20 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
attack_verb = list("lit", "flickered", "flashed")
|
||||
squeak_override = list('sound/weapons/magout.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/drake
|
||||
name = "drake plushie"
|
||||
desc = "A large beast from lavaland turned into a marketable plushie!"
|
||||
icon_state = "drake"
|
||||
item_state = "drake"
|
||||
attack_verb = list("bit", "devoured", "burned")
|
||||
|
||||
/obj/item/toy/plush/deer
|
||||
name = "deer plushie"
|
||||
desc = "Oh deer, a plushie!"
|
||||
icon_state = "deer"
|
||||
item_state = "deer"
|
||||
attack_verb = list("bleated", "rammed", "kicked")
|
||||
|
||||
/obj/item/toy/plush/box
|
||||
name = "cardboard plushie"
|
||||
desc = "A toy box plushie, it holds cotten. Only a baddie would place a bomb through the postal system..."
|
||||
@@ -694,7 +714,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
attack_verb = list("scanned", "beeped", "stared")
|
||||
|
||||
/obj/item/toy/plush/borgplushie
|
||||
name = "robot plushie"
|
||||
name = "K9 plushie"
|
||||
desc = "An adorable stuffed toy of a robot."
|
||||
icon_state = "securityk9"
|
||||
item_state = "securityk9"
|
||||
@@ -702,25 +722,28 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
squeak_override = list('sound/machines/beep.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/borgplushie/medihound
|
||||
name = "medihound plushie"
|
||||
icon_state = "medihound"
|
||||
item_state = "medihound"
|
||||
|
||||
/obj/item/toy/plush/borgplushie/scrubpuppy
|
||||
name = "scrubpuppy plushie"
|
||||
icon_state = "scrubpuppy"
|
||||
item_state = "scrubpuppy"
|
||||
|
||||
/obj/item/toy/plush/borgplushie/pupdozer
|
||||
name = "pupdozer plushie"
|
||||
icon_state = "pupdozer"
|
||||
item_state = "pupdozer"
|
||||
|
||||
/obj/item/toy/plush/aiplush
|
||||
name = "AI plushie"
|
||||
desc = "A little stuffed toy AI core... it appears to be malfunctioning."
|
||||
icon_state = "exo"
|
||||
item_state = "exo"
|
||||
icon_state = "malfai"
|
||||
item_state = "malfai"
|
||||
attack_verb = list("hacked", "detonated", "overloaded")
|
||||
squeak_override = list('sound/machines/beep.ogg' = 9, 'sound/machines/buzz-two.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mammal/fox
|
||||
icon_state = "fox"
|
||||
item_state = "fox"
|
||||
|
||||
/obj/item/toy/plush/snakeplushie
|
||||
name = "snake plushie"
|
||||
desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing."
|
||||
@@ -732,6 +755,72 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
/obj/item/toy/plush/mammal
|
||||
name = "mammal plushie"
|
||||
desc = "An adorable stuffed toy resembling some sort of crew member."
|
||||
icon_state = "ych"
|
||||
item_state = "ych"
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/mammal/fox
|
||||
name = "fox plushie"
|
||||
desc = "An adorable stuffed toy resembling a fox."
|
||||
icon_state = "fox"
|
||||
item_state = "fox"
|
||||
attack_verb = list("yipped", "geckered", "yapped")
|
||||
|
||||
/obj/item/toy/plush/mammal/dog
|
||||
name = "dog plushie"
|
||||
icon_state = "corgi"
|
||||
item_state = "corgi"
|
||||
desc = "An adorable stuffed toy that resembles a dog."
|
||||
attack_verb = list("barked", "boofed", "borked")
|
||||
squeak_override = list(
|
||||
'modular_citadel/sound/voice/bark1.ogg' = 1,
|
||||
'modular_citadel/sound/voice/bark2.ogg' = 1
|
||||
)
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/fcorgi
|
||||
name = "corgi plushie"
|
||||
icon_state = "girlycorgi"
|
||||
item_state = "girlycorgi"
|
||||
desc = "An adorable stuffed toy that resembles a dog. This one dons a pink ribbon."
|
||||
|
||||
/obj/item/toy/plush/mammal/dog/borgi
|
||||
name = "borgi plushie"
|
||||
icon_state = "borgi"
|
||||
item_state = "borgi"
|
||||
desc = "An adorable stuffed toy that resembles a robot dog."
|
||||
|
||||
/obj/item/toy/plush/xeno
|
||||
name = "xenohybrid plushie"
|
||||
desc = "An adorable stuffed toy that resembles a xenomorphic crewmember."
|
||||
icon_state = "xeno"
|
||||
item_state = "xeno"
|
||||
squeak_override = list('sound/voice/hiss2.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/bird
|
||||
name = "bird plushie"
|
||||
desc = "An adorable stuffed plushie that resembles an avian."
|
||||
icon_state = "bird"
|
||||
item_state = "bird"
|
||||
attack_verb = list("peeped", "beeped", "poofed")
|
||||
squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/sergal
|
||||
name = "sergal plushie"
|
||||
desc = "An adorable stuffed plushie that resembles a sagaru."
|
||||
icon_state = "sergal"
|
||||
item_state = "sergal"
|
||||
squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/catgirl
|
||||
name = "feline plushie"
|
||||
desc = "An adorable stuffed toy that resembles a feline."
|
||||
icon_state = "cat"
|
||||
item_state = "cat"
|
||||
attack_verb = list("headbutt", "scritched", "bit")
|
||||
squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/catgirl/fermis
|
||||
@@ -742,40 +831,25 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
|
||||
attack_verb = list("cuddled", "petpatted", "wigglepurred")
|
||||
squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/xeno
|
||||
name = "xenohybrid plushie"
|
||||
desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember."
|
||||
squeak_override = list('sound/voice/hiss2.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
/obj/item/toy/plush/teddybear
|
||||
name = "teddy"
|
||||
desc = "It's a teddy bear!"
|
||||
icon_state = "teddy"
|
||||
item_state = "teddy"
|
||||
|
||||
/obj/item/toy/plush/bird
|
||||
name = "bird plushie"
|
||||
desc = "An adorable stuffed plushie that resembles an avian."
|
||||
attack_verb = list("peeped", "beeped", "poofed")
|
||||
squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/sergal
|
||||
name = "sergal plushie"
|
||||
desc = "An adorable stuffed plushie that resembles a sagaru."
|
||||
squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
|
||||
/obj/item/toy/plush/mammal/dog
|
||||
desc = "An adorable stuffed toy that resembles a canine."
|
||||
attack_verb = list("barked", "boofed", "borked")
|
||||
squeak_override = list(
|
||||
'modular_citadel/sound/voice/bark1.ogg' = 1,
|
||||
'modular_citadel/sound/voice/bark2.ogg' = 1
|
||||
)
|
||||
|
||||
/obj/item/toy/plush/catgirl
|
||||
name = "feline plushie"
|
||||
desc = "An adorable stuffed toy that resembles a feline."
|
||||
attack_verb = list("headbutt", "scritched", "bit")
|
||||
squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1)
|
||||
can_random_spawn = FALSE
|
||||
/obj/item/toy/plush/crab
|
||||
name = "crab plushie"
|
||||
desc = "Fewer pinches than a real one, but it still clicks."
|
||||
icon_state = "crab"
|
||||
item_state = "crab"
|
||||
attack_verb = list("clicked", "clacked", "pinched")
|
||||
|
||||
/obj/item/toy/plush/gondola
|
||||
name = "gondola plushie"
|
||||
desc = "Just looking at it seems to calm you down. Please do not eat it though."
|
||||
icon_state = "gondola"
|
||||
item_state = "gondola"
|
||||
attack_verb = list("calmed", "smiled", "peaced")
|
||||
|
||||
/obj/item/toy/plush/hairball
|
||||
name = "Hairball"
|
||||
|
||||
@@ -266,6 +266,7 @@
|
||||
. += tank.icon_state
|
||||
|
||||
/obj/item/pneumatic_cannon/proc/fill_with_type(type, amount)
|
||||
set waitfor = FALSE
|
||||
if(!ispath(type, /obj) && !ispath(type, /mob))
|
||||
return FALSE
|
||||
var/loaded = 0
|
||||
|
||||
@@ -79,27 +79,27 @@
|
||||
var/weight = getweight(user, STAM_COST_ATTACK_MOB_MULT)
|
||||
if(!user.UseStaminaBuffer(weight, warn = TRUE))
|
||||
return FALSE
|
||||
var/datum/gas_mixture/gasused = tank.air_contents.remove(gasperfist * fisto_setting)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
return FALSE
|
||||
var/totalitemdamage = target.pre_attacked_by(src, user)
|
||||
T.assume_air(gasused)
|
||||
T.air_update_turf()
|
||||
if(!gasused)
|
||||
var/moles_used = gasperfist * fisto_setting
|
||||
if(!moles_used)
|
||||
to_chat(user, "<span class='warning'>\The [src]'s tank is empty!</span>")
|
||||
target.apply_damage((totalitemdamage / 5), BRUTE)
|
||||
playsound(loc, 'sound/weapons/punch1.ogg', 50, 1)
|
||||
target.visible_message("<span class='danger'>[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!</span>", \
|
||||
"<span class='userdanger'>[user]'s punches you!</span>")
|
||||
return
|
||||
if(gasused.total_moles() < gasperfist * fisto_setting)
|
||||
if(tank.air_contents.total_moles() < moles_used)
|
||||
to_chat(user, "<span class='warning'>\The [src]'s piston-ram lets out a weak hiss, it needs more gas!</span>")
|
||||
playsound(loc, 'sound/weapons/punch4.ogg', 50, 1)
|
||||
target.apply_damage((totalitemdamage / 2), BRUTE)
|
||||
target.visible_message("<span class='danger'>[user]'s powerfist lets out a weak hiss as [user.p_they()] punch[user.p_es()] [target.name]!</span>", \
|
||||
"<span class='userdanger'>[user]'s punch strikes with force!</span>")
|
||||
return
|
||||
T.assume_air_moles(tank.air_contents, gasperfist * fisto_setting)
|
||||
T.air_update_turf()
|
||||
target.apply_damage(totalitemdamage * fisto_setting, BRUTE, wound_bonus = -25*fisto_setting**2)
|
||||
target.visible_message("<span class='danger'>[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!</span>", \
|
||||
"<span class='userdanger'>You cry out in pain as [user]'s punch flings you backwards!</span>")
|
||||
|
||||
@@ -90,7 +90,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst
|
||||
to_chat(user, "<span class='notice'>There's no room for another VTEC unit!</span>")
|
||||
return FALSE
|
||||
|
||||
//R.speed = -2 // Gotta go fast.
|
||||
//R.vtec = -2 // Gotta go fast.
|
||||
//Citadel change - makes vtecs give an ability rather than reducing the borg's speed instantly
|
||||
VC = new /obj/effect/proc_holder/silicon/cyborg/vtecControl
|
||||
R.AddAbility(VC)
|
||||
@@ -100,7 +100,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst
|
||||
. = ..()
|
||||
if (.)
|
||||
R.RemoveAbility(VC)
|
||||
R.speed = initial(R.speed)
|
||||
R.vtec = initial(R.vtec)
|
||||
R.cansprint = 1
|
||||
|
||||
/obj/item/borg/upgrade/disablercooler
|
||||
@@ -681,7 +681,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst
|
||||
action_icon_state = "Chevron_State_0"
|
||||
|
||||
var/currentState = 0
|
||||
var/maxReduction = 1
|
||||
var/maxReduction = 0.5
|
||||
|
||||
|
||||
/obj/effect/proc_holder/silicon/cyborg/vtecControl/Trigger(mob/living/silicon/robot/user)
|
||||
@@ -690,11 +690,11 @@ as performing this in action() will cause the upgrade to end up in the borg inst
|
||||
if(istype(user))
|
||||
switch(currentState)
|
||||
if (0)
|
||||
user.speed = initial(user.speed)
|
||||
user.vtec = initial(user.vtec)
|
||||
if (1)
|
||||
user.speed = initial(user.speed) - maxReduction * 0.5
|
||||
user.vtec = initial(user.vtec) - maxReduction * 0.5
|
||||
if (2)
|
||||
user.speed = initial(user.speed) - maxReduction * 1
|
||||
user.vtec = initial(user.vtec) - maxReduction * 1
|
||||
|
||||
action.button_icon_state = "Chevron_State_[currentState]"
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
@@ -34,6 +34,10 @@
|
||||
block_damage_absorption = 5
|
||||
block_resting_stamina_penalty_multiplier = 2
|
||||
block_projectile_mitigation = 75
|
||||
block_damage_absorption_override = list(
|
||||
TEXT_ATTACK_TYPE_TACKLE = INFINITY,
|
||||
TEXT_ATTACK_TYPE_THROWN = 10
|
||||
)
|
||||
|
||||
/obj/item/shield/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -120,8 +124,6 @@
|
||||
return TRUE
|
||||
|
||||
/obj/item/shield/proc/user_shieldbash(mob/living/user, atom/target, harmful)
|
||||
if(!SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) //Combat mode has to be enabled for shield bashing
|
||||
return FALSE
|
||||
if(!(shield_flags & SHIELD_CAN_BASH))
|
||||
to_chat(user, "<span class='warning'>[src] can't be used to shield bash!</span>")
|
||||
return FALSE
|
||||
@@ -376,11 +378,10 @@
|
||||
|
||||
/obj/item/shield/riot/flash/on_shield_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
|
||||
. = ..()
|
||||
if (. && !embedded_flash.crit_fail)
|
||||
if (. && damage && !embedded_flash.crit_fail)
|
||||
embedded_flash.activate()
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/shield/riot/flash/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/assembly/flash/handheld))
|
||||
var/obj/item/assembly/flash/handheld/flash = W
|
||||
@@ -547,7 +548,7 @@
|
||||
force = 3
|
||||
throwforce = 3
|
||||
throw_speed = 3
|
||||
var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted
|
||||
base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted
|
||||
var/on_force = 10
|
||||
var/on_throwforce = 8
|
||||
var/on_throw_speed = 2
|
||||
@@ -564,7 +565,7 @@
|
||||
return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT
|
||||
return ..()
|
||||
|
||||
/obj/item/shield/energy/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction)
|
||||
/obj/item/shield/energy/directional_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction)
|
||||
if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object))
|
||||
block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT
|
||||
return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
. = ..()
|
||||
update_desc()
|
||||
|
||||
/obj/item/stack/spacecash/proc/update_desc()
|
||||
/obj/item/stack/spacecash/update_desc()
|
||||
var/total_worth = get_item_credit_value()
|
||||
desc = "It's worth [total_worth] credit[( total_worth > 1 ) ? "s" : ""]"
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
GLOBAL_LIST_INIT(human_recipes, list( \
|
||||
new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5), \
|
||||
new/datum/stack_recipe("human skin hat", /obj/item/clothing/head/human_leather, 1), \
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/animalhide/human/get_main_recipes()
|
||||
|
||||
@@ -179,6 +179,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
|
||||
GLOBAL_LIST_INIT(plasteel_recipes, list ( \
|
||||
new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = TRUE), \
|
||||
new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 50), \
|
||||
new/datum/stack_recipe("plasteel keg", /obj/structure/custom_keg, 10, time = 50), \
|
||||
new/datum/stack_recipe("micro powered fan assembly", /obj/machinery/fan_assembly, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new /datum/stack_recipe_list("crates", list( \
|
||||
new /datum/stack_recipe("gray crate", /obj/structure/closet/crate, 5, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
amount -= max_amount
|
||||
new type(loc, max_amount, FALSE)
|
||||
if(!merge_type)
|
||||
merge_type = type
|
||||
merge_type = src.type
|
||||
|
||||
if(LAZYLEN(mats_per_unit))
|
||||
set_mats_per_unit(mats_per_unit, 1)
|
||||
|
||||
@@ -16,14 +16,16 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
|
||||
attack_speed = CLICK_CD_MELEE
|
||||
|
||||
var/stamina_loss_amount = 35
|
||||
var/stamina_loss_amount = 40
|
||||
var/turned_on = FALSE
|
||||
var/knockdown = TRUE
|
||||
/// block percent needed to prevent knockdown/disarm
|
||||
var/block_percent_to_counter = 50
|
||||
var/obj/item/stock_parts/cell/cell
|
||||
var/hitcost = 750
|
||||
var/throw_hit_chance = 35
|
||||
var/preload_cell_type //if not empty the baton starts with this type of cell
|
||||
var/cooldown_duration = 5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown
|
||||
var/cooldown_duration = 3.5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown
|
||||
var/status_duration = 5 SECONDS //how long our status effects last for otherwise
|
||||
COOLDOWN_DECLARE(shove_cooldown)
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
distribute_pressure = ONE_ATMOSPHERE * O2STANDARD
|
||||
actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
||||
var/gas_type = /datum/gas/oxygen
|
||||
var/gas_type = GAS_O2
|
||||
var/on = FALSE
|
||||
var/stabilizers = FALSE
|
||||
var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
|
||||
@@ -77,13 +77,7 @@
|
||||
turn_off(user)
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/removed = air_contents.remove(num)
|
||||
if(removed.total_moles() < 0.005)
|
||||
turn_off(user)
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(user)
|
||||
T.assume_air(removed)
|
||||
assume_air_moles(air_contents, num)
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -116,13 +110,7 @@
|
||||
turn_off(user)
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/removed = air_contents.remove(num)
|
||||
if(removed.total_moles() < 0.005)
|
||||
turn_off(user)
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(user)
|
||||
T.assume_air(removed)
|
||||
assume_air_moles(air_contents, num)
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -171,7 +159,7 @@
|
||||
icon_state = "jetpack-black"
|
||||
item_state = "jetpack-black"
|
||||
distribute_pressure = 0
|
||||
gas_type = /datum/gas/carbon_dioxide
|
||||
gas_type = GAS_CO2
|
||||
|
||||
/obj/item/tank/jetpack/carbondioxide/eva
|
||||
name = "surplus jetpack (carbon dioxide)"
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
/obj/item/tank/internals/oxygen/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
air_contents.set_moles(GAS_O2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
return
|
||||
|
||||
|
||||
@@ -48,8 +48,8 @@
|
||||
force = 10
|
||||
|
||||
/obj/item/tank/internals/anesthetic/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/oxygen, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD)
|
||||
air_contents.set_moles(/datum/gas/nitrous_oxide, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD)
|
||||
air_contents.set_moles(GAS_O2, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD)
|
||||
air_contents.set_moles(GAS_NITROUS, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD)
|
||||
return
|
||||
|
||||
/*
|
||||
@@ -63,8 +63,8 @@
|
||||
dog_fashion = /datum/dog_fashion/back
|
||||
|
||||
/obj/item/tank/internals/air/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD)
|
||||
air_contents.set_moles(/datum/gas/nitrogen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD)
|
||||
air_contents.set_moles(GAS_O2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD)
|
||||
air_contents.set_moles(GAS_N2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD)
|
||||
return
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
|
||||
/obj/item/tank/internals/plasma/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
air_contents.set_moles(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
return
|
||||
|
||||
/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params)
|
||||
@@ -98,14 +98,14 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/tank/internals/plasma/full/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
|
||||
//Makes empty oxygen tanks spawn without gas
|
||||
/obj/item/tank/internals/plasma/empty/populate_gas()
|
||||
return
|
||||
|
||||
/obj/item/tank/internals/plasma/full/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
|
||||
/*
|
||||
* Plasmaman Plasma Tank
|
||||
@@ -120,11 +120,11 @@
|
||||
distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
|
||||
|
||||
/obj/item/tank/internals/plasmaman/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
air_contents.set_moles(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
return
|
||||
|
||||
/obj/item/tank/internals/plasmaman/full/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
return
|
||||
|
||||
|
||||
@@ -137,7 +137,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
|
||||
|
||||
/obj/item/tank/internals/plasmaman/belt/full/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
return
|
||||
|
||||
//makes empty plasma tanks spawn without gas.
|
||||
@@ -160,7 +160,7 @@
|
||||
|
||||
|
||||
/obj/item/tank/internals/emergency_oxygen/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/oxygen, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
air_contents.set_moles(GAS_O2, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
return
|
||||
|
||||
/obj/item/tank/internals/emergency_oxygen/empty/populate_gas()
|
||||
@@ -196,5 +196,5 @@
|
||||
volume = 10
|
||||
|
||||
/obj/item/tank/internals/methyl_bromide/populate_gas()
|
||||
air_contents.set_moles(/datum/gas/methyl_bromide, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
air_contents.set_moles(GAS_METHYL_BROMIDE, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
|
||||
return
|
||||
|
||||
@@ -83,7 +83,6 @@
|
||||
if(istype(location))
|
||||
location.assume_air(air_contents)
|
||||
air_contents.clear()
|
||||
SSair.add_to_active(location)
|
||||
visible_message("<span class='warning'[src] leaks gas!")
|
||||
|
||||
/obj/item/tank/Destroy()
|
||||
@@ -235,6 +234,9 @@
|
||||
/obj/item/tank/remove_air(amount)
|
||||
return air_contents.remove(amount)
|
||||
|
||||
/obj/item/tank/remove_air_ratio(ratio)
|
||||
return air_contents.remove_ratio(ratio)
|
||||
|
||||
/obj/item/tank/return_air()
|
||||
return air_contents
|
||||
|
||||
@@ -247,6 +249,18 @@
|
||||
check_status()
|
||||
return 1
|
||||
|
||||
/obj/item/tank/assume_air_moles(datum/gas_mixture/giver, moles)
|
||||
giver.transfer_to(air_contents, moles)
|
||||
|
||||
check_status()
|
||||
return 1
|
||||
|
||||
/obj/item/tank/assume_air_ratio(datum/gas_mixture/giver, ratio)
|
||||
giver.transfer_ratio_to(air_contents, ratio)
|
||||
|
||||
check_status()
|
||||
return 1
|
||||
|
||||
/obj/item/tank/proc/remove_air_volume(volume_to_return)
|
||||
if(!air_contents)
|
||||
return null
|
||||
|
||||
@@ -80,8 +80,8 @@
|
||||
|
||||
/obj/item/watertank/MouseDrop(obj/over_object)
|
||||
var/mob/M = loc
|
||||
if(istype(M) && istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
if(istype(M) && istype(over_object, /atom/movable/screen/inventory/hand))
|
||||
var/atom/movable/screen/inventory/hand/H = over_object
|
||||
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -67,6 +67,12 @@
|
||||
item_state = "crowbar"
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/crowbar/large/heavy
|
||||
name = "heavy crowbar"
|
||||
desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big. It feels oddly heavy.."
|
||||
force = 20
|
||||
icon_state = "crowbar_powergame"
|
||||
|
||||
/obj/item/crowbar/cyborg
|
||||
name = "hydraulic crowbar"
|
||||
desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs."
|
||||
|
||||
@@ -23,13 +23,13 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
|
||||
var/random_color = TRUE
|
||||
var/static/list/wirecutter_colors = list(
|
||||
"blue" = "#1861d5",
|
||||
"red" = "#951710",
|
||||
"pink" = "#d5188d",
|
||||
"brown" = "#a05212",
|
||||
"green" = "#0e7f1b",
|
||||
"cyan" = "#18a2d5",
|
||||
"yellow" = "#d58c18"
|
||||
"blue" = rgb(24, 97, 213),
|
||||
"red" = rgb(255, 0, 0),
|
||||
"pink" = rgb(213, 24, 141),
|
||||
"brown" = rgb(160, 82, 18),
|
||||
"green" = rgb(14, 127, 27),
|
||||
"cyan" = rgb(24, 162, 213),
|
||||
"yellow" = rgb(255, 165, 0)
|
||||
)
|
||||
|
||||
|
||||
@@ -49,6 +49,23 @@
|
||||
base_overlay.appearance_flags = RESET_COLOR
|
||||
. += base_overlay
|
||||
|
||||
/obj/item/wirecutters/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
|
||||
. = ..()
|
||||
if(isinhands && random_color)
|
||||
var/mutable_appearance/M = mutable_appearance(icon_file, "cutters_cutty_thingy")
|
||||
M.appearance_flags = RESET_COLOR
|
||||
. += M
|
||||
|
||||
/obj/item/wirecutters/get_belt_overlay()
|
||||
if(random_color)
|
||||
var/mutable_appearance/body = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "cutters")
|
||||
var/mutable_appearance/head = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "cutters_cutty_thingy")
|
||||
body.color = color
|
||||
head.add_overlay(body)
|
||||
return head
|
||||
else
|
||||
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state)
|
||||
|
||||
/obj/item/wirecutters/attack(mob/living/carbon/C, mob/user)
|
||||
if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/restraints/handcuffs/cable))
|
||||
user.visible_message("<span class='notice'>[user] cuts [C]'s restraints with [src]!</span>")
|
||||
|
||||
@@ -889,8 +889,8 @@
|
||||
M.put_in_hands(src)
|
||||
to_chat(usr, "<span class='notice'>You pick up the deck.</span>")
|
||||
|
||||
else if(istype(over_object, /obj/screen/inventory/hand))
|
||||
var/obj/screen/inventory/hand/H = over_object
|
||||
else if(istype(over_object, /atom/movable/screen/inventory/hand))
|
||||
var/atom/movable/screen/inventory/hand/H = over_object
|
||||
if(M.putItemFromInventoryInHandIfPossible(src, H.held_index))
|
||||
to_chat(usr, "<span class='notice'>You pick up the deck.</span>")
|
||||
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
resistance_flags = FLAMMABLE
|
||||
|
||||
/obj/item/trash/Initialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/trash)
|
||||
|
||||
/obj/item/trash/raisins
|
||||
name = "\improper 4no raisins"
|
||||
icon_state= "4no_raisins"
|
||||
@@ -80,6 +84,3 @@
|
||||
name = "boritos bag"
|
||||
icon_state = "boritos"
|
||||
grind_results = list(/datum/reagent/aluminium = 1) //from the mylar bag
|
||||
|
||||
/obj/item/trash/attack(mob/M, mob/living/user)
|
||||
return
|
||||
|
||||
@@ -332,6 +332,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
bare_wound_bonus = 0
|
||||
wound_bonus = 0
|
||||
|
||||
/obj/item/melee/bokken/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
|
||||
. = ..()
|
||||
if(!istype(object, /obj/item/melee/bokken))
|
||||
// no counterattack.
|
||||
block_return[BLOCK_RETURN_FORCE_NO_PARRY_COUNTERATTACK] = TRUE
|
||||
|
||||
/datum/block_parry_data/bokken // fucked up parry data, emphasizing quicker, shorter parries
|
||||
parry_stamina_cost = 10 // be wise about when you parry, though, else you won't be able to fight enough to make it count
|
||||
parry_time_windup = 0
|
||||
@@ -358,7 +364,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
parry_time_perfect = 2.5 // however...
|
||||
parry_time_perfect_leeway = 2 // the entire time, the parry is perfect
|
||||
parry_failed_stagger_duration = 1 SECONDS
|
||||
parry_failed_clickcd_duration = 1 SECONDS // more forgiving punishments for missed parries
|
||||
// still, don't fucking miss your parries or you're down stamina and staggered to shit
|
||||
|
||||
/datum/block_parry_data/bokken/quick_parry/proj
|
||||
@@ -475,7 +480,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
parry_time_perfect = 1
|
||||
parry_time_perfect_leeway = 1
|
||||
parry_failed_stagger_duration = 1 SECONDS
|
||||
parry_failed_clickcd_duration = 1 SECONDS
|
||||
|
||||
/datum/block_parry_data/bokken/waki/quick_parry/proj
|
||||
parry_efficiency_perfect_override = list()
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
|
||||
//returns the damage value of the attack after processing the obj's various armor protections
|
||||
/obj/proc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0)
|
||||
if(damage_flag == MELEE && damage_amount < damage_deflection)
|
||||
return 0
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(BURN)
|
||||
@@ -204,32 +206,23 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
|
||||
//the obj's reaction when touched by acid
|
||||
/obj/acid_act(acidpwr, acid_volume)
|
||||
if(!(resistance_flags & UNACIDABLE) && acid_volume)
|
||||
|
||||
if(!acid_level)
|
||||
SSacid.processing[src] = src
|
||||
update_icon()
|
||||
var/acid_cap = acidpwr * 300 //so we cannot use huge amounts of weak acids to do as well as strong acids.
|
||||
if(acid_level < acid_cap)
|
||||
acid_level = min(acid_level + acidpwr * acid_volume, acid_cap)
|
||||
AddComponent(/datum/component/acid, acidpwr, acid_volume)
|
||||
return 1
|
||||
|
||||
//the proc called by the acid subsystem to process the acid that's on the obj
|
||||
/obj/proc/acid_processing()
|
||||
. = 1
|
||||
if(!(resistance_flags & ACID_PROOF))
|
||||
if(prob(33))
|
||||
playsound(loc, 'sound/items/welder.ogg', 150, 1)
|
||||
take_damage(min(1 + round(sqrt(acid_level)*0.3), 300), BURN, "acid", 0)
|
||||
|
||||
acid_level = max(acid_level - (5 + 3*round(sqrt(acid_level))), 0)
|
||||
if(!acid_level)
|
||||
return 0
|
||||
|
||||
//called when the obj is destroyed by acid.
|
||||
/obj/proc/acid_melt()
|
||||
SSacid.processing -= src
|
||||
var/datum/component/acid/acid = GetComponent(/datum/component/acid)
|
||||
if(acid)
|
||||
acid.RemoveComponent()
|
||||
deconstruct(FALSE)
|
||||
|
||||
/obj/proc/acid_level()
|
||||
var/datum/component/acid/acid = GetComponent(/datum/component/acid)
|
||||
if(acid)
|
||||
return acid.level
|
||||
else
|
||||
return 0
|
||||
|
||||
//// FIRE
|
||||
|
||||
/obj/fire_act(exposed_temperature, exposed_volume)
|
||||
|
||||
@@ -20,9 +20,10 @@
|
||||
var/max_integrity = 500
|
||||
var/integrity_failure = 0 //0 if we have no special broken behavior, otherwise is a percentage of at what point the obj breaks. 0.5 being 50%
|
||||
|
||||
var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
|
||||
///Damage under this value will be completely ignored
|
||||
var/damage_deflection = 0
|
||||
|
||||
var/acid_level = 0 //how much acid is on that obj
|
||||
var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
|
||||
|
||||
var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset.
|
||||
var/current_skin //the item reskin
|
||||
@@ -96,12 +97,43 @@
|
||||
else
|
||||
return null
|
||||
|
||||
/obj/assume_air_moles(datum/gas_mixture/giver, moles)
|
||||
if(loc)
|
||||
return loc.assume_air_moles(giver, moles)
|
||||
else
|
||||
return null
|
||||
|
||||
/obj/assume_air_ratio(datum/gas_mixture/giver, ratio)
|
||||
if(loc)
|
||||
return loc.assume_air_ratio(giver, ratio)
|
||||
else
|
||||
return null
|
||||
|
||||
/obj/transfer_air(datum/gas_mixture/taker, moles)
|
||||
if(loc)
|
||||
return loc.transfer_air(taker, moles)
|
||||
else
|
||||
return null
|
||||
|
||||
/obj/transfer_air_ratio(datum/gas_mixture/taker, ratio)
|
||||
if(loc)
|
||||
return loc.transfer_air_ratio(taker, ratio)
|
||||
else
|
||||
return null
|
||||
|
||||
|
||||
/obj/remove_air(amount)
|
||||
if(loc)
|
||||
return loc.remove_air(amount)
|
||||
else
|
||||
return null
|
||||
|
||||
/obj/remove_air_ratio(ratio)
|
||||
if(loc)
|
||||
return loc.remove_air_ratio(ratio)
|
||||
else
|
||||
return null
|
||||
|
||||
/obj/return_air()
|
||||
if(loc)
|
||||
return loc.return_air()
|
||||
@@ -116,8 +148,7 @@
|
||||
|
||||
if(breath_request>0)
|
||||
var/datum/gas_mixture/environment = return_air()
|
||||
var/breath_percentage = BREATH_VOLUME / environment.return_volume()
|
||||
return remove_air(environment.total_moles() * breath_percentage)
|
||||
return remove_air_ratio(BREATH_VOLUME / environment.return_volume())
|
||||
else
|
||||
return null
|
||||
|
||||
@@ -339,8 +370,6 @@
|
||||
|
||||
/obj/update_overlays()
|
||||
. = ..()
|
||||
if(acid_level)
|
||||
. += GLOB.acid_overlay
|
||||
if(resistance_flags & ON_FIRE)
|
||||
. += GLOB.fire_overlay
|
||||
|
||||
|
||||
@@ -81,8 +81,8 @@
|
||||
resintype = "wall"
|
||||
canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane)
|
||||
|
||||
/obj/structure/alien/resin/wall/BlockSuperconductivity()
|
||||
return 1
|
||||
/obj/structure/alien/resin/wall/BlockThermalConductivity()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/alien/resin/membrane
|
||||
name = "resin membrane"
|
||||
|
||||
@@ -348,7 +348,7 @@
|
||||
parry_time_perfect = 1.5
|
||||
parry_time_perfect_leeway = 1
|
||||
parry_imperfect_falloff_percent = 7.5
|
||||
parry_efficiency_to_counterattack = 100
|
||||
parry_efficiency_to_counterattack = INFINITY
|
||||
parry_efficiency_considered_successful = 50
|
||||
parry_efficiency_perfect = 120
|
||||
parry_efficiency_perfect_override = list(
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
. += "off"
|
||||
. += "sparking"
|
||||
//Overlay is similar enough for both that we can use the same mask for both
|
||||
SSvis_overlays.add_vis_overlay(src, icon, "locked", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha)
|
||||
. += emissive_appearance(icon, "locked", alpha = src.alpha)
|
||||
. += locked ? "locked" : "unlocked"
|
||||
|
||||
|
||||
@@ -356,7 +356,7 @@
|
||||
return
|
||||
|
||||
/obj/structure/closet/MouseDrop_T(atom/movable/O, mob/living/user)
|
||||
if(!istype(O) || O.anchored || istype(O, /obj/screen))
|
||||
if(!istype(O) || O.anchored || istype(O, /atom/movable/screen))
|
||||
return
|
||||
if(!istype(user) || user.incapacitated() || user.lying)
|
||||
return
|
||||
@@ -531,7 +531,7 @@
|
||||
|
||||
/obj/structure/closet/get_remote_view_fullscreens(mob/user)
|
||||
if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
|
||||
user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
|
||||
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1)
|
||||
|
||||
/obj/structure/closet/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -269,7 +269,7 @@
|
||||
. += get_airlock_overlay("glass_construction", overlays_file)
|
||||
. += get_airlock_overlay("panel_c[state+1]", overlays_file)
|
||||
|
||||
/obj/structure/door_assembly/proc/update_name()
|
||||
/obj/structure/door_assembly/update_name()
|
||||
name = ""
|
||||
switch(state)
|
||||
if(AIRLOCK_ASSEMBLY_NEEDS_WIRES)
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
alpha = 150
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/structure/holosign/barrier/firelock/BlockSuperconductivity()
|
||||
/obj/structure/holosign/barrier/firelock/BlockThermalConductivity()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/holosign/barrier/firelock/Initialize()
|
||||
@@ -115,7 +115,7 @@
|
||||
CanAtmosPass = ATMOS_PASS_NO
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/structure/holosign/barrier/combifan/BlockSuperconductivity()
|
||||
/obj/structure/holosign/barrier/combifan/BlockThermalConductivity()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/holosign/barrier/combifan/Initialize()
|
||||
|
||||
@@ -48,14 +48,34 @@
|
||||
return // no message spam
|
||||
..()
|
||||
|
||||
/obj/structure/mirror/attacked_by(obj/item/I, mob/living/user)
|
||||
if(broken || !istype(user) || !I.force)
|
||||
return ..()
|
||||
|
||||
. = ..()
|
||||
if(broken) // breaking a mirror truly gets you bad luck!
|
||||
to_chat(user, "<span class='warning'>A chill runs down your spine as [src] shatters...</span>")
|
||||
user.AddComponent(/datum/component/omen, silent=TRUE) // we have our own message
|
||||
|
||||
/obj/structure/mirror/bullet_act(obj/item/projectile/P)
|
||||
if(broken || !isliving(P.firer) || !P.damage)
|
||||
return ..()
|
||||
|
||||
. = ..()
|
||||
if(broken) // breaking a mirror truly gets you bad luck!
|
||||
var/mob/living/unlucky_dude = P.firer
|
||||
to_chat(unlucky_dude, "<span class='warning'>A chill runs down your spine as [src] shatters...</span>")
|
||||
unlucky_dude.AddComponent(/datum/component/omen, silent=TRUE) // we have our own message
|
||||
|
||||
/obj/structure/mirror/obj_break(damage_flag, mapload)
|
||||
if(!broken && !(flags_1 & NODECONSTRUCT_1))
|
||||
icon_state = "mirror_broke"
|
||||
if(!mapload)
|
||||
playsound(src, "shatter", 70, 1)
|
||||
if(desc == initial(desc))
|
||||
desc = "Oh no, seven years of bad luck!"
|
||||
broken = TRUE
|
||||
if(broken || (flags_1 & NODECONSTRUCT_1))
|
||||
return
|
||||
icon_state = "mirror_broke"
|
||||
if(!mapload)
|
||||
playsound(src, "shatter", 70, TRUE)
|
||||
if(desc == initial(desc))
|
||||
desc = "Oh no, seven years of bad luck!"
|
||||
broken = TRUE
|
||||
|
||||
/obj/structure/mirror/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
|
||||
@@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
|
||||
|
||||
/obj/structure/bodycontainer/get_remote_view_fullscreens(mob/user)
|
||||
if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
|
||||
user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2)
|
||||
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2)
|
||||
/*
|
||||
* Morgue
|
||||
*/
|
||||
|
||||
@@ -243,6 +243,32 @@
|
||||
new framestack(T, framestackamount)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/**
|
||||
* Gets all connected tables
|
||||
* Cardinals only
|
||||
*/
|
||||
/obj/structure/table/proc/connected_floodfill(max = 25)
|
||||
. = list()
|
||||
connected_floodfill_internal(., list())
|
||||
|
||||
/obj/structure/table/proc/connected_floodfill_internal(list/out = list(), list/processed = list())
|
||||
if(processed[src])
|
||||
return
|
||||
processed[src] = TRUE
|
||||
out += src
|
||||
var/obj/structure/table/other
|
||||
#define RUN_TABLE(dir) \
|
||||
other = locate(/obj/structure/table) in get_step(src, dir); \
|
||||
if(other) { \
|
||||
other.connected_floodfill_internal(out, processed); \
|
||||
}
|
||||
RUN_TABLE(NORTH)
|
||||
RUN_TABLE(SOUTH)
|
||||
RUN_TABLE(EAST)
|
||||
RUN_TABLE(WEST)
|
||||
#undef RUN_TABLE
|
||||
|
||||
/obj/structure/table/greyscale
|
||||
icon = 'icons/obj/smooth_structures/table_greyscale.dmi'
|
||||
icon_state = "table"
|
||||
|
||||
@@ -121,6 +121,7 @@
|
||||
|
||||
|
||||
/obj/structure/transit_tube/station/proc/launch_pod()
|
||||
set waitfor = FALSE
|
||||
if(launch_cooldown >= world.time)
|
||||
return
|
||||
for(var/obj/structure/transit_tube_pod/pod in loc)
|
||||
@@ -149,9 +150,7 @@
|
||||
pod_moving = 0
|
||||
if(!QDELETED(pod))
|
||||
var/datum/gas_mixture/floor_mixture = loc.return_air()
|
||||
floor_mixture.archive()
|
||||
pod.air_contents.archive()
|
||||
pod.air_contents.share(floor_mixture, 1) //mix the pod's gas mixture with the tile it's on
|
||||
equalize_all_gases_in_list(list(pod.air_contents,floor_mixture))
|
||||
air_update_turf()
|
||||
|
||||
/obj/structure/transit_tube/station/init_tube_dirs()
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
|
||||
/obj/structure/transit_tube_pod/Initialize()
|
||||
. = ..()
|
||||
air_contents.set_moles(/datum/gas/oxygen, MOLES_O2STANDARD)
|
||||
air_contents.set_moles(/datum/gas/nitrogen, MOLES_N2STANDARD)
|
||||
air_contents.set_moles(GAS_O2, MOLES_O2STANDARD)
|
||||
air_contents.set_moles(GAS_N2, MOLES_N2STANDARD)
|
||||
air_contents.set_temperature(T20C)
|
||||
|
||||
|
||||
@@ -153,9 +153,25 @@
|
||||
/obj/structure/transit_tube_pod/assume_air(datum/gas_mixture/giver)
|
||||
return air_contents.merge(giver)
|
||||
|
||||
/obj/structure/transit_tube_pod/assume_air_moles(datum/gas_mixture/giver, moles)
|
||||
return giver.transfer_to(air_contents, moles)
|
||||
|
||||
/obj/structure/transit_tube_pod/assume_air_ratio(datum/gas_mixture/giver, ratio)
|
||||
return giver.transfer_ratio_to(air_contents, ratio)
|
||||
|
||||
/obj/structure/transit_tube_pod/remove_air(amount)
|
||||
return air_contents.remove(amount)
|
||||
|
||||
/obj/structure/transit_tube_pod/remove_air_ratio(ratio)
|
||||
return air_contents.remove_ratio(ratio)
|
||||
|
||||
/obj/structure/transit_tube_pod/transfer_air(datum/gas_mixture/taker, moles)
|
||||
return air_contents.transfer_to(taker, moles)
|
||||
|
||||
/obj/structure/transit_tube_pod/transfer_air_ratio(datum/gas_mixture/taker, ratio)
|
||||
return air_contents.transfer_ratio_to(taker, ratio)
|
||||
|
||||
|
||||
/obj/structure/transit_tube_pod/relaymove(mob/mob, direction)
|
||||
if(istype(mob) && mob.client)
|
||||
if(!moving)
|
||||
|
||||
@@ -354,10 +354,10 @@
|
||||
. = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
. = O.clean_blood()
|
||||
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
|
||||
if(isitem(O))
|
||||
var/obj/item/I = O
|
||||
I.acid_level = 0
|
||||
I.extinguish()
|
||||
var/datum/component/acid/acid = O.GetComponent(/datum/component/acid)
|
||||
if(acid)
|
||||
acid.level = 0
|
||||
O.extinguish()
|
||||
|
||||
/obj/machinery/shower/proc/wash_turf()
|
||||
if(isturf(loc))
|
||||
@@ -601,7 +601,9 @@
|
||||
busy = FALSE
|
||||
SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
|
||||
O.clean_blood()
|
||||
O.acid_level = 0
|
||||
var/datum/component/acid/acid = O.GetComponent(/datum/component/acid)
|
||||
if(acid)
|
||||
acid.level = 0
|
||||
create_reagents(5)
|
||||
reagents.add_reagent(dispensedreagent, 5)
|
||||
reagents.reaction(O, TOUCH)
|
||||
|
||||
@@ -674,7 +674,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup)
|
||||
/obj/structure/window/plasma/reinforced/unanchored
|
||||
anchored = FALSE
|
||||
|
||||
/obj/structure/window/plasma/reinforced/BlockSuperconductivity()
|
||||
/obj/structure/window/plasma/reinforced/BlockThermalConductivity()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/window/reinforced/tinted
|
||||
|
||||
+6
-4
@@ -43,7 +43,8 @@ falloff_distance - Distance at which falloff begins. Sound is at peak volume (in
|
||||
|
||||
*/
|
||||
|
||||
/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff_exponent = SOUND_FALLOFF_EXPONENT, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, envwet = -10000, envdry = 0)
|
||||
/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff_exponent = SOUND_FALLOFF_EXPONENT, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE,
|
||||
falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, envwet = -10000, envdry = 0, distance_multiplier = SOUND_DEFAULT_DISTANCE_MULTIPLIER, distance_multiplier_min_range = SOUND_DEFAULT_MULTIPLIER_EFFECT_RANGE)
|
||||
if(isarea(source))
|
||||
CRASH("playsound(): source is an area")
|
||||
|
||||
@@ -83,11 +84,11 @@ falloff_distance - Distance at which falloff begins. Sound is at peak volume (in
|
||||
for(var/P in listeners)
|
||||
var/mob/M = P
|
||||
if(get_dist(M, turf_source) <= maxdistance)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, null, envwet, envdry)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, get_dist(M, turf_source) <= distance_multiplier_min_range? 1 : distance_multiplier, envwet, envdry)
|
||||
for(var/P in SSmobs.dead_players_by_zlevel[source_z])
|
||||
var/mob/M = P
|
||||
if(get_dist(M, turf_source) <= maxdistance)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, null, envwet, envdry)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, get_dist(M, turf_source) <= distance_multiplier_min_range? 1 : distance_multiplier, envwet, envdry)
|
||||
|
||||
/*! playsound
|
||||
|
||||
@@ -108,7 +109,8 @@ distance_multiplier - Can be used to multiply the distance at which the sound is
|
||||
|
||||
*/
|
||||
|
||||
/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/S, max_distance, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = 1, envwet = -10000, envdry = 0)
|
||||
/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/S, max_distance,
|
||||
falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = SOUND_DEFAULT_DISTANCE_MULTIPLIER, envwet = -10000, envdry = 0)
|
||||
if(!client || !can_hear())
|
||||
return
|
||||
|
||||
|
||||
@@ -15,9 +15,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
|
||||
|
||||
if(turf_type)
|
||||
var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags)
|
||||
SSair.remove_from_active(newT)
|
||||
CALCULATE_ADJACENT_TURFS(newT)
|
||||
SSair.add_to_active(newT,1)
|
||||
|
||||
/turf/proc/copyTurf(turf/T)
|
||||
if(T.type != type)
|
||||
@@ -54,6 +52,14 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
|
||||
/turf/proc/TerraformTurf(path, new_baseturf, flags)
|
||||
return ChangeTurf(path, new_baseturf, flags)
|
||||
|
||||
/turf/proc/get_z_base_turf()
|
||||
. = SSmapping.level_trait(z, ZTRAIT_BASETURF) || /turf/open/space
|
||||
if (!ispath(.))
|
||||
. = text2path(.)
|
||||
if (!ispath(.))
|
||||
warning("Z-level [z] has invalid baseturf '[SSmapping.level_trait(z, ZTRAIT_BASETURF)]'")
|
||||
. = /turf/open/space
|
||||
|
||||
// Creates a new turf
|
||||
// new_baseturfs can be either a single type or list of types, formated the same as baseturfs. see turf.dm
|
||||
/turf/proc/ChangeTurf(path, list/new_baseturfs, flags)
|
||||
@@ -61,17 +67,12 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
|
||||
if(null)
|
||||
return
|
||||
if(/turf/baseturf_bottom)
|
||||
path = SSmapping.level_trait(z, ZTRAIT_BASETURF) || /turf/open/space
|
||||
if (!ispath(path))
|
||||
path = text2path(path)
|
||||
if (!ispath(path))
|
||||
warning("Z-level [z] has invalid baseturf '[SSmapping.level_trait(z, ZTRAIT_BASETURF)]'")
|
||||
path = /turf/open/space
|
||||
path = get_z_base_turf()
|
||||
if(/turf/open/space/basic)
|
||||
// basic doesn't initialize and this will cause issues
|
||||
// no warning though because this can happen naturaly as a result of it being built on top of
|
||||
path = /turf/open/space
|
||||
if(!GLOB.use_preloader && path == type && !(flags & CHANGETURF_FORCEOP)) // Don't no-op if the map loader requires it to be reconstructed
|
||||
if(!GLOB.use_preloader && path == type && !(flags & CHANGETURF_FORCEOP) && (baseturfs == new_baseturfs)) // Don't no-op if the map loader requires it to be reconstructed, or if this is a new set of baseturfs
|
||||
return src
|
||||
if(flags & CHANGETURF_SKIP)
|
||||
return new path(src)
|
||||
@@ -142,22 +143,25 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
|
||||
|
||||
/turf/open/ChangeTurf(path, list/new_baseturfs, flags)
|
||||
if ((flags & CHANGETURF_INHERIT_AIR) && ispath(path, /turf/open))
|
||||
SSair.remove_from_active(src)
|
||||
var/datum/gas_mixture/stashed_air = new()
|
||||
stashed_air.copy_from(air)
|
||||
. = ..()
|
||||
if (!.) // changeturf failed or didn't do anything
|
||||
QDEL_NULL(stashed_air)
|
||||
update_air_ref()
|
||||
return
|
||||
var/turf/open/newTurf = .
|
||||
newTurf.air.copy_from(stashed_air)
|
||||
update_air_ref(planetary_atmos ? 1 : 2)
|
||||
QDEL_NULL(stashed_air)
|
||||
SSair.add_to_active(newTurf)
|
||||
else
|
||||
if(ispath(path,/turf/closed))
|
||||
flags |= CHANGETURF_RECALC_ADJACENT
|
||||
return ..()
|
||||
update_air_ref(-1)
|
||||
. = ..()
|
||||
else
|
||||
. = ..()
|
||||
if(!istype(air,/datum/gas_mixture))
|
||||
Initalize_Atmos(0)
|
||||
|
||||
// Take off the top layer turf and replace it with the next baseturf down
|
||||
/turf/proc/ScrapeAway(amount=1, flags)
|
||||
@@ -317,7 +321,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
|
||||
total.merge(S.air)
|
||||
|
||||
air.copy_from(total.remove_ratio(1/turf_count))
|
||||
SSair.add_to_active(src)
|
||||
|
||||
/turf/proc/ReplaceWithLattice()
|
||||
ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
|
||||
@@ -8,15 +8,17 @@
|
||||
rad_insulation = RAD_MEDIUM_INSULATION
|
||||
wave_explosion_block = 10
|
||||
wave_explosion_multiply = 0.75
|
||||
/// How much we block yelling
|
||||
var/yelling_resistance = 10
|
||||
/// how much of inbound yelling to dampen
|
||||
var/yelling_dampen = 0.5
|
||||
|
||||
/turf/closed/Initialize()
|
||||
. = ..()
|
||||
update_air_ref()
|
||||
|
||||
/turf/closed/AfterChange()
|
||||
. = ..()
|
||||
SSair.high_pressure_delta -= src
|
||||
update_air_ref()
|
||||
|
||||
/turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
|
||||
return FALSE
|
||||
@@ -201,16 +203,19 @@
|
||||
desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern."
|
||||
icon = 'icons/turf/walls/hierophant_wall.dmi'
|
||||
icon_state = "wall"
|
||||
|
||||
|
||||
/turf/closed/indestructible/rock/glacierrock
|
||||
name = "unaturally hard ice wall"
|
||||
desc = "Ice, hardened over thousands of years, you're not breaking through this."
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon_state = "snow_rock"
|
||||
|
||||
|
||||
/turf/closed/indestructible/rock/glacierrock/blue
|
||||
name = "blue ice wall"
|
||||
desc = "The incredible compressive forces that formed this sturdy ice wall gave it a blue color."
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon_state = "ice"
|
||||
canSmoothWith = list(/turf/closed/indestructible/rock/glacierrock/blue)
|
||||
|
||||
/turf/closed/get_yelling_resistance(power)
|
||||
return yelling_resistance + (power * yelling_dampen)
|
||||
|
||||
+11
-14
@@ -218,18 +218,15 @@
|
||||
flash_color(L, flash_color = "#C80000", flash_time = 10)
|
||||
|
||||
/turf/open/Initalize_Atmos(times_fired)
|
||||
set_excited(FALSE)
|
||||
if(!blocks_air)
|
||||
if(!istype(air,/datum/gas_mixture/turf))
|
||||
air = new(2500,src)
|
||||
air.copy_from_turf(src)
|
||||
update_air_ref(planetary_atmos ? 1 : 2)
|
||||
|
||||
update_visuals()
|
||||
|
||||
current_cycle = times_fired
|
||||
ImmediateCalculateAdjacentTurfs()
|
||||
for(var/i in atmos_adjacent_turfs)
|
||||
var/turf/open/enemy_tile = i
|
||||
var/datum/gas_mixture/enemy_air = enemy_tile.return_air()
|
||||
if(!get_excited() && air.compare(enemy_air))
|
||||
//testing("Active turf found. Return value of compare(): [is_active]")
|
||||
set_excited(TRUE)
|
||||
SSair.add_to_active_extools(src)
|
||||
|
||||
/turf/open/proc/GetHeatCapacity()
|
||||
. = air.heat_capacity()
|
||||
@@ -323,8 +320,8 @@
|
||||
|
||||
/turf/open/rad_act(pulse_strength)
|
||||
. = ..()
|
||||
if (air.get_moles(/datum/gas/carbon_dioxide) && air.get_moles(/datum/gas/oxygen))
|
||||
pulse_strength = min(pulse_strength,air.get_moles(/datum/gas/carbon_dioxide)*1000,air.get_moles(/datum/gas/oxygen)*2000) //Ensures matter is conserved properly
|
||||
air.set_moles(/datum/gas/carbon_dioxide, max(air.get_moles(/datum/gas/carbon_dioxide)-(pulse_strength/1000),0))
|
||||
air.set_moles(/datum/gas/oxygen, max(air.get_moles(/datum/gas/oxygen)-(pulse_strength/2000),0))
|
||||
air.adjust_moles(/datum/gas/pluoxium, pulse_strength/4000)
|
||||
if (air.get_moles(GAS_CO2) && air.get_moles(GAS_O2))
|
||||
pulse_strength = min(pulse_strength,air.get_moles(GAS_CO2)*1000,air.get_moles(GAS_O2)*2000) //Ensures matter is conserved properly
|
||||
air.set_moles(GAS_CO2, max(air.get_moles(GAS_CO2)-(pulse_strength/1000),0))
|
||||
air.set_moles(GAS_O2, max(air.get_moles(GAS_O2)-(pulse_strength/2000),0))
|
||||
air.adjust_moles(GAS_PLUOXIUM, pulse_strength/4000)
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
/turf/open/transparent
|
||||
baseturfs = /turf/open/transparent/openspace
|
||||
intact = FALSE //this means wires go on top
|
||||
|
||||
/turf/open/transparent/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker
|
||||
. = ..()
|
||||
plane = OPENSPACE_PLANE
|
||||
layer = OPENSPACE_LAYER
|
||||
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/turf/open/transparent/LateInitialize()
|
||||
update_multiz(TRUE, TRUE)
|
||||
|
||||
/turf/open/transparent/Destroy()
|
||||
vis_contents.len = 0
|
||||
return ..()
|
||||
|
||||
/turf/open/transparent/update_multiz(prune_on_fail = FALSE, init = FALSE)
|
||||
. = ..()
|
||||
var/turf/T = below()
|
||||
if(!T)
|
||||
vis_contents.len = 0
|
||||
if(!show_bottom_level() && prune_on_fail) //If we cant show whats below, and we prune on fail, change the turf to plating as a fallback
|
||||
ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
|
||||
return FALSE
|
||||
if(init)
|
||||
vis_contents += T
|
||||
return TRUE
|
||||
|
||||
/turf/open/transparent/multiz_turf_del(turf/T, dir)
|
||||
if(dir != DOWN)
|
||||
return
|
||||
update_multiz()
|
||||
|
||||
/turf/open/transparent/multiz_turf_new(turf/T, dir)
|
||||
if(dir != DOWN)
|
||||
return
|
||||
update_multiz()
|
||||
|
||||
///Called when there is no real turf below this turf
|
||||
/turf/open/transparent/proc/show_bottom_level()
|
||||
var/turf/path = get_z_base_turf()
|
||||
var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER, plane = PLANE_SPACE)
|
||||
underlays += underlay_appearance
|
||||
return TRUE
|
||||
|
||||
|
||||
/turf/open/transparent/glass
|
||||
name = "Glass floor"
|
||||
desc = "Dont jump on it, or do, I'm not your mom."
|
||||
icon = 'icons/turf/floors/glass.dmi'
|
||||
icon_state = "floor_glass"
|
||||
smooth = SMOOTH_MORE
|
||||
var/floor_tile = /obj/item/stack/sheet/glass
|
||||
canSmoothWith = list(/turf/open/transparent/glass, /turf/open/transparent/glass/reinforced)
|
||||
footstep = FOOTSTEP_PLATING
|
||||
barefootstep = FOOTSTEP_HARD_BAREFOOT
|
||||
clawfootstep = FOOTSTEP_HARD_CLAW
|
||||
heavyfootstep = FOOTSTEP_GENERIC_HEAVY
|
||||
|
||||
/turf/open/transparent/glass/Initialize()
|
||||
icon_state = "" //Prevent the normal icon from appearing behind the smooth overlays
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/turf/open/floor/glass/LateInitialize()
|
||||
. = ..()
|
||||
// AddElement(/datum/element/turf_z_transparency, TRUE)
|
||||
|
||||
/turf/open/transparent/glass/wrench_act(mob/living/user, obj/item/I)
|
||||
to_chat(user, "<span class='notice'>You begin removing glass...</span>")
|
||||
if(I.use_tool(src, user, 30, volume=80))
|
||||
if(!istype(src, /turf/open/transparent/glass))
|
||||
return TRUE
|
||||
if(floor_tile)
|
||||
new floor_tile(src, 2)
|
||||
ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
return TRUE
|
||||
|
||||
/turf/open/transparent/glass/reinforced
|
||||
name = "Reinforced glass floor"
|
||||
desc = "Do jump on it, it can take it."
|
||||
icon = 'icons/turf/floors/reinf_glass.dmi'
|
||||
floor_tile = /obj/item/stack/sheet/rglass
|
||||
|
||||
/turf/open/transparent/glass/reinforced/wrench_act(mob/living/user, obj/item/I)
|
||||
to_chat(user, "<span class='notice'>You begin removing reinforced glass...</span>")
|
||||
if(I.use_tool(src, user, 30, volume=80))
|
||||
if(!istype(src, /turf/open/transparent/glass/reinforced))
|
||||
return TRUE
|
||||
if(floor_tile)
|
||||
new floor_tile(src, 2)
|
||||
ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
return TRUE
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default
|
||||
var/icon_plating = "plating"
|
||||
thermal_conductivity = 0.004
|
||||
thermal_conductivity = 0.04
|
||||
heat_capacity = 10000
|
||||
intact = 1
|
||||
var/broken = 0
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
ChangeTurf(/turf/open/floor/plating/rust)
|
||||
|
||||
/turf/open/floor/wood/cold
|
||||
temperature = 255.37
|
||||
initial_temperature = 255.37
|
||||
|
||||
/turf/open/floor/wood/airless
|
||||
initial_gas_mix = AIRLESS_ATMOS
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
icon = 'icons/turf/floors/ice_turf.dmi'
|
||||
icon_state = "unsmooth"
|
||||
initial_gas_mix = FROZEN_ATMOS
|
||||
temperature = 180
|
||||
initial_temperature = 180
|
||||
planetary_atmos = TRUE
|
||||
baseturfs = /turf/open/floor/plating/ice
|
||||
slowdown = 1
|
||||
@@ -201,10 +201,10 @@
|
||||
canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice, /turf/open/floor/plating/ice/colder)
|
||||
|
||||
/turf/open/floor/plating/ice/colder
|
||||
temperature = 140
|
||||
initial_temperature = 140
|
||||
|
||||
/turf/open/floor/plating/ice/temperate
|
||||
temperature = 255.37
|
||||
initial_temperature = 255.37
|
||||
|
||||
/turf/open/floor/plating/ice/break_tile()
|
||||
return
|
||||
@@ -221,7 +221,7 @@
|
||||
icon = 'icons/turf/snow.dmi'
|
||||
icon_state = "snowplating"
|
||||
initial_gas_mix = FROZEN_ATMOS
|
||||
temperature = 180
|
||||
initial_temperature = 180
|
||||
attachment_holes = FALSE
|
||||
planetary_atmos = TRUE
|
||||
footstep = FOOTSTEP_SAND
|
||||
@@ -230,7 +230,7 @@
|
||||
heavyfootstep = FOOTSTEP_GENERIC_HEAVY
|
||||
|
||||
/turf/open/floor/plating/snowed/cavern
|
||||
initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"
|
||||
initial_gas_mix = "n2=82;plasma=24;TEMP=120"
|
||||
|
||||
/turf/open/floor/plating/snowed/smoothed
|
||||
smooth = SMOOTH_MORE | SMOOTH_BORDER
|
||||
@@ -240,10 +240,10 @@
|
||||
icon_state = "smooth"
|
||||
|
||||
/turf/open/floor/plating/snowed/colder
|
||||
temperature = 140
|
||||
initial_temperature = 140
|
||||
|
||||
/turf/open/floor/plating/snowed/temperatre
|
||||
temperature = 255.37
|
||||
initial_temperature = 255.37
|
||||
|
||||
/turf/open/floor/plating/snowed/smoothed/icemoon
|
||||
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "reinforced floor"
|
||||
desc = "Extremely sturdy."
|
||||
icon_state = "engine"
|
||||
thermal_conductivity = 0.0025
|
||||
thermal_conductivity = 0.025
|
||||
heat_capacity = INFINITY
|
||||
floor_tile = /obj/item/stack/rods
|
||||
footstep = FOOTSTEP_PLATING
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user