Merge branch 'master' into final_away_maps_additions

# Conflicts:
#	code/__defines/misc.dm
#	code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm
#	icons/mob/head.dmi
#	maps/exodus/code/exodus.dm
This commit is contained in:
alberyk
2022-04-04 19:47:58 -03:00
100 changed files with 1824 additions and 447407 deletions
-31
View File
@@ -143,37 +143,6 @@ steps:
- (! grep "runtime error:" log.txt)
- echo "Unit Tests Completed"
---
kind: pipeline
type: docker
name: dm-exodus
node:
k: y
clone:
depth: 50
environment:
USE_MAP: exodus
trigger:
branch:
- master #avoid double builds on PRs
steps:
- name: "Exodus - Compile and Run Unit Tests"
image: aurorastation/dm-buildimage:latest
commands:
- export LD_LIBRARY_PATH=./:$PWD:$HOME/.byond/bin:/usr/local/lib:$LD_LIBRARY_PATH
- cp config/example/* config/ && cp config/ut/config-nodb.txt config/config.txt
- scripts/dm.sh -DUNIT_TEST -M$USE_MAP aurorastation.dme
- grep "0 warnings" build_log.txt
- DreamDaemon aurorastation.dmb -invisible -trusted -core 2>&1 | tee log.txt
- grep "All Unit Tests Passed" log.txt
- (! grep "runtime error:" log.txt)
- echo "Unit Tests Completed"
---
kind: signature
hmac: aa5f81d300bb1f01656d04254a788970d593b10792ac97b91161ec95ce622b1a
+1 -1
View File
@@ -38,7 +38,7 @@ jobs:
if: "!contains(github.event.head_commit.message, '[ci skip]')"
strategy:
matrix:
map: [runtime, aurora, exodus]
map: [runtime, aurora]
runs-on: ubuntu-20.04
needs: lint
services:
-1
View File
@@ -17,7 +17,6 @@ env:
matrix:
- USE_MAP=aurora
- USE_MAP=runtime
- USE_MAP=exodus
cache:
directories:
-1
View File
@@ -1 +0,0 @@
#define DEFAULT_MAP "exodus"
-5
View File
@@ -3079,11 +3079,6 @@
#include "maps\event\rooftop\code\rooftop.dm"
#include "maps\event\rooftop\code\rooftop_areas.dm"
#include "maps\event\rooftop\code\rooftop_shuttles.dm"
#include "maps\exodus\code\exodus.dm"
#include "maps\exodus\code\exodus_areas.dm"
#include "maps\exodus\code\exodus_holodeck.dm"
#include "maps\exodus\code\exodus_shuttles.dm"
#include "maps\exodus\code\exodus_unittest.dm"
#include "maps\random_ruins\exoplanets\exoplanet_ruins.dm"
#include "maps\random_ruins\exoplanets\asteroid\asteroid.dm"
#include "maps\random_ruins\exoplanets\crashed_pod\crashed_pod.dm"
@@ -1,4 +1,4 @@
obj/machinery/atmospherics/binary
/obj/machinery/atmospherics/binary
dir = SOUTH
initialize_directions = SOUTH|NORTH
use_power = 1
@@ -9,126 +9,132 @@ obj/machinery/atmospherics/binary
var/datum/pipe_network/network1
var/datum/pipe_network/network2
Initialize()
switch(dir)
if(NORTH)
initialize_directions = NORTH|SOUTH
if(SOUTH)
initialize_directions = NORTH|SOUTH
if(EAST)
initialize_directions = EAST|WEST
if(WEST)
initialize_directions = EAST|WEST
air1 = new
air2 = new
/obj/machinery/atmospherics/binary/Initialize()
switch(dir)
if(NORTH)
initialize_directions = NORTH|SOUTH
if(SOUTH)
initialize_directions = NORTH|SOUTH
if(EAST)
initialize_directions = EAST|WEST
if(WEST)
initialize_directions = EAST|WEST
air1 = new
air2 = new
air1.volume = 200
air2.volume = 200
. = ..()
air1.volume = 200
air2.volume = 200
. = ..()
// Housekeeping and pipe network stuff below
network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
if(reference == node1)
network1 = new_network
/obj/machinery/atmospherics/binary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
if(reference == node1)
network1 = new_network
else if(reference == node2)
network2 = new_network
else if(reference == node2)
network2 = new_network
if(new_network.normal_members.Find(src))
return 0
if(new_network.normal_members.Find(src))
return 0
new_network.normal_members += src
new_network.normal_members += src
return null
return null
Destroy()
QDEL_NULL(air1)
QDEL_NULL(air2)
/obj/machinery/atmospherics/binary/Destroy()
QDEL_NULL(air1)
QDEL_NULL(air2)
if(node1)
node1.disconnect(src)
QDEL_NULL(network1)
if(node2)
node2.disconnect(src)
QDEL_NULL(network2)
if(node1)
node1.disconnect(src)
QDEL_NULL(network1)
if(node2)
node2.disconnect(src)
QDEL_NULL(network2)
node1 = null
node2 = null
return ..()
/obj/machinery/atmospherics/binary/atmos_init()
if(node1 && node2) return
var/node2_connect = dir
var/node1_connect = turn(dir, 180)
for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
if(target.initialize_directions & get_dir(target,src))
if (check_connect_types(target,src))
node1 = target
break
for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
if(target.initialize_directions & get_dir(target,src))
if (check_connect_types(target,src))
node2 = target
break
update_icon()
update_underlays()
/obj/machinery/atmospherics/binary/build_network()
if(!network1 && node1)
network1 = new /datum/pipe_network()
network1.normal_members += src
network1.build_network(node1, src)
if(!network2 && node2)
network2 = new /datum/pipe_network()
network2.normal_members += src
network2.build_network(node2, src)
/obj/machinery/atmospherics/binary/return_network(obj/machinery/atmospherics/reference)
build_network()
if(reference==node1)
return network1
if(reference==node2)
return network2
return null
/obj/machinery/atmospherics/binary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
if(network1 == old_network)
network1 = new_network
if(network2 == old_network)
network2 = new_network
return 1
/obj/machinery/atmospherics/binary/return_network_air(datum/pipe_network/reference)
var/list/results = list()
if(network1 == reference)
results += air1
if(network2 == reference)
results += air2
return results
/obj/machinery/atmospherics/binary/disconnect(obj/machinery/atmospherics/reference)
if(reference==node1)
qdel(network1)
node1 = null
else if(reference==node2)
qdel(network2)
node2 = null
return ..()
update_icon()
update_underlays()
atmos_init()
if(node1 && node2) return
return null
var/node2_connect = dir
var/node1_connect = turn(dir, 180)
for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
if(target.initialize_directions & get_dir(target,src))
if (check_connect_types(target,src))
node1 = target
break
for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
if(target.initialize_directions & get_dir(target,src))
if (check_connect_types(target,src))
node2 = target
break
update_icon()
update_underlays()
build_network()
if(!network1 && node1)
network1 = new /datum/pipe_network()
network1.normal_members += src
network1.build_network(node1, src)
if(!network2 && node2)
network2 = new /datum/pipe_network()
network2.normal_members += src
network2.build_network(node2, src)
return_network(obj/machinery/atmospherics/reference)
build_network()
if(reference==node1)
return network1
if(reference==node2)
return network2
return null
reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
if(network1 == old_network)
network1 = new_network
if(network2 == old_network)
network2 = new_network
return 1
return_network_air(datum/pipe_network/reference)
var/list/results = list()
if(network1 == reference)
results += air1
if(network2 == reference)
results += air2
return results
disconnect(obj/machinery/atmospherics/reference)
if(reference==node1)
qdel(network1)
node1 = null
else if(reference==node2)
qdel(network2)
node2 = null
update_icon()
update_underlays()
return null
/obj/machinery/atmospherics/binary/AltClick(var/mob/user)
if(!allowed(user))
to_chat(user, SPAN_WARNING("Access denied."))
return
Topic(src, list("power" = "1"))
@@ -278,3 +278,9 @@
update_ports()
return null
/obj/machinery/atmospherics/omni/AltClick(var/mob/user)
if(!allowed(user))
to_chat(user, SPAN_WARNING("Access denied."))
return
Topic(src, list("power" = "1"))
@@ -1,4 +1,4 @@
obj/machinery/atmospherics/trinary
/obj/machinery/atmospherics/trinary
dir = SOUTH
initialize_directions = SOUTH|NORTH|WEST
use_power = 0
@@ -13,157 +13,163 @@ obj/machinery/atmospherics/trinary
var/datum/pipe_network/network2
var/datum/pipe_network/network3
Initialize()
switch(dir)
if(NORTH)
initialize_directions = EAST|NORTH|SOUTH
if(SOUTH)
initialize_directions = SOUTH|WEST|NORTH
if(EAST)
initialize_directions = EAST|WEST|SOUTH
if(WEST)
initialize_directions = WEST|NORTH|EAST
air1 = new
air2 = new
air3 = new
/obj/machinery/atmospherics/trinary/Initialize()
switch(dir)
if(NORTH)
initialize_directions = EAST|NORTH|SOUTH
if(SOUTH)
initialize_directions = SOUTH|WEST|NORTH
if(EAST)
initialize_directions = EAST|WEST|SOUTH
if(WEST)
initialize_directions = WEST|NORTH|EAST
air1 = new
air2 = new
air3 = new
air1.volume = 200
air2.volume = 200
air3.volume = 200
. = ..()
air1.volume = 200
air2.volume = 200
air3.volume = 200
. = ..()
// Housekeeping and pipe network stuff below
network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
if(reference == node1)
network1 = new_network
/obj/machinery/atmospherics/trinary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
if(reference == node1)
network1 = new_network
else if(reference == node2)
network2 = new_network
else if(reference == node2)
network2 = new_network
else if (reference == node3)
network3 = new_network
else if (reference == node3)
network3 = new_network
if(new_network.normal_members.Find(src))
return 0
if(new_network.normal_members.Find(src))
return 0
new_network.normal_members += src
new_network.normal_members += src
return null
return null
Destroy()
QDEL_NULL(air1)
QDEL_NULL(air2)
QDEL_NULL(air3)
/obj/machinery/atmospherics/trinary/Destroy()
QDEL_NULL(air1)
QDEL_NULL(air2)
QDEL_NULL(air3)
if(node1)
node1.disconnect(src)
QDEL_NULL(network1)
if(node2)
node2.disconnect(src)
QDEL_NULL(network2)
if(node3)
node3.disconnect(src)
QDEL_NULL(network3)
if(node1)
node1.disconnect(src)
QDEL_NULL(network1)
if(node2)
node2.disconnect(src)
QDEL_NULL(network2)
if(node3)
node3.disconnect(src)
QDEL_NULL(network3)
node1 = null
node2 = null
node3 = null
return ..()
/obj/machinery/atmospherics/trinary/atmos_init()
if(node1 && node2 && node3) return
var/node1_connect = turn(dir, -180)
var/node2_connect = turn(dir, -90)
var/node3_connect = dir
for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
if(target.initialize_directions & get_dir(target,src))
if (check_connect_types(target,src))
node1 = target
break
for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
if(target.initialize_directions & get_dir(target,src))
if (check_connect_types(target,src))
node2 = target
break
for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect))
if(target.initialize_directions & get_dir(target,src))
if (check_connect_types(target,src))
node3 = target
break
update_icon()
update_underlays()
/obj/machinery/atmospherics/trinary/build_network()
if(!network1 && node1)
network1 = new /datum/pipe_network()
network1.normal_members += src
network1.build_network(node1, src)
if(!network2 && node2)
network2 = new /datum/pipe_network()
network2.normal_members += src
network2.build_network(node2, src)
if(!network3 && node3)
network3 = new /datum/pipe_network()
network3.normal_members += src
network3.build_network(node3, src)
/obj/machinery/atmospherics/trinary/return_network(obj/machinery/atmospherics/reference)
build_network()
if(reference==node1)
return network1
if(reference==node2)
return network2
if(reference==node3)
return network3
return null
/obj/machinery/atmospherics/trinary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
if(network1 == old_network)
network1 = new_network
if(network2 == old_network)
network2 = new_network
if(network3 == old_network)
network3 = new_network
return 1
/obj/machinery/atmospherics/trinary/return_network_air(datum/pipe_network/reference)
var/list/results = list()
if(network1 == reference)
results += air1
if(network2 == reference)
results += air2
if(network3 == reference)
results += air3
return results
/obj/machinery/atmospherics/trinary/disconnect(obj/machinery/atmospherics/reference)
if(reference==node1)
qdel(network1)
node1 = null
else if(reference==node2)
qdel(network2)
node2 = null
else if(reference==node3)
qdel(network3)
node3 = null
return ..()
update_underlays()
atmos_init()
if(node1 && node2 && node3) return
return null
var/node1_connect = turn(dir, -180)
var/node2_connect = turn(dir, -90)
var/node3_connect = dir
for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
if(target.initialize_directions & get_dir(target,src))
if (check_connect_types(target,src))
node1 = target
break
for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
if(target.initialize_directions & get_dir(target,src))
if (check_connect_types(target,src))
node2 = target
break
for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect))
if(target.initialize_directions & get_dir(target,src))
if (check_connect_types(target,src))
node3 = target
break
update_icon()
update_underlays()
build_network()
if(!network1 && node1)
network1 = new /datum/pipe_network()
network1.normal_members += src
network1.build_network(node1, src)
if(!network2 && node2)
network2 = new /datum/pipe_network()
network2.normal_members += src
network2.build_network(node2, src)
if(!network3 && node3)
network3 = new /datum/pipe_network()
network3.normal_members += src
network3.build_network(node3, src)
return_network(obj/machinery/atmospherics/reference)
build_network()
if(reference==node1)
return network1
if(reference==node2)
return network2
if(reference==node3)
return network3
return null
reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
if(network1 == old_network)
network1 = new_network
if(network2 == old_network)
network2 = new_network
if(network3 == old_network)
network3 = new_network
return 1
return_network_air(datum/pipe_network/reference)
var/list/results = list()
if(network1 == reference)
results += air1
if(network2 == reference)
results += air2
if(network3 == reference)
results += air3
return results
disconnect(obj/machinery/atmospherics/reference)
if(reference==node1)
qdel(network1)
node1 = null
else if(reference==node2)
qdel(network2)
node2 = null
else if(reference==node3)
qdel(network3)
node3 = null
update_underlays()
return null
/obj/machinery/atmospherics/trinary/AltClick(var/mob/user)
if(!allowed(user))
to_chat(user, SPAN_WARNING("Access denied."))
return
Topic(src, list("power" = "1"))
+7 -4
View File
@@ -480,6 +480,13 @@ Define for getting a bitfield of adjacent turfs that meet a condition.
#define COOK_CHECK_EXTRA 0
#define COOK_CHECK_EXACT 1
// Moved from tanks/tanks.dm
#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE)
#define TANK_DEFAULT_RELEASE_PRESSURE 24 // kPa
#define TANK_IDEAL_PRESSURE 1015 //Arbitrary.
#define STATION_TAG "Aurora"
//Planet habitability class
#define HABITABILITY_IDEAL 1
#define HABITABILITY_OKAY 2
@@ -491,9 +498,5 @@ Define for getting a bitfield of adjacent turfs that meet a condition.
#define TEMPLATE_FLAG_CLEAR_CONTENTS 4 // if it should destroy objects it spawns on top of
#define TEMPLATE_FLAG_NO_RUINS 8 // if it should forbid ruins from spawning on top of it
#define LANDING_ZONE_RADIUS 15 // Used for autoplacing landmarks on exoplanets
//Ruin map template flags
#define TEMPLATE_FLAG_RUIN_STARTS_DISALLOWED 32 // Ruin is not available during spawning unless another ruin permits it.
+5 -67
View File
@@ -45,16 +45,9 @@
if(is_component_functioning("camera"))
ai_camera.captureimage(A, usr)
else
to_chat(src, "<span class='danger'>Your camera isn't functional.</span>")
to_chat(src, SPAN_DANGER("Your camera isn't functional."))
return
/*
cyborg restrained() currently does nothing
if(restrained())
RestrainedClickOn(A)
return
*/
var/obj/item/W = get_active_hand()
// Cyborgs have no range-checking unless there is item use
@@ -71,21 +64,12 @@
W.attack_self(src)
return
//Handling using grippers
if(istype(W, /obj/item/gripper))
var/obj/item/gripper/G = W
//If the gripper contains something, then we will use its contents to attack
if (G.wrapped && (G.wrapped.loc == G))
GripperClickOn(A, params, G)
G.update_icon() //We may need to update our gripper based on a change in the wrapped item
return
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
// No adjacency checks
var/resolved = A.attackby(W,src)
if(!resolved && A && W)
if(!resolved)
W.afterattack(A,src,1,params)
return
@@ -95,57 +79,11 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm
if(W)
var/resolved = W.resolve_attackby(A, src, params)
if(!resolved && A && W)
W.afterattack(A, src, 1, params)
return
var/resolved = W.resolve_attackby(A, src, params)
if(!resolved)
W.afterattack(A, src, 1, params)
else
W.afterattack(A, src, 0, params)
return
return
/*
Gripper Handling
This is used when a gripper is used on anything. It does all the handling for it
*/
/mob/living/silicon/robot/proc/GripperClickOn(var/atom/A, var/params, var/obj/item/gripper/G)
var/obj/item/W = G.wrapped
if (!grippersafety(G))return
G.force_holder = W.force
W.force = 0
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
// No adjacency checks
var/resolved = A.attackby(W,src)
if (!grippersafety(G))return
if(!resolved && A && W)
W.afterattack(A,src,1,params)
if (!grippersafety(G))return
W.force = G.force_holder
return
if(!isturf(loc))
W.force = G.force_holder
return
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm
var/resolved = A.attackby(W, src)
if (!grippersafety(G))return
if(!resolved && A && W)
W.afterattack(A, src, 1, params)
if (!grippersafety(G))return
W.force = G.force_holder
return
//No non-adjacent clicks. Can't fire guns
W.force = G.force_holder
return
//Middle click cycles through selected modules.
-1
View File
@@ -85,7 +85,6 @@
)
possible_trading_items = list(
/obj/item/modular_computer/handheld/pda/civilian/clown = TRADER_THIS_TYPE,
/obj/item/stamp/clown = TRADER_THIS_TYPE,
/obj/item/bananapeel = TRADER_THIS_TYPE,
/obj/item/reagent_containers/food/snacks/pie = TRADER_THIS_TYPE,
+37 -1
View File
@@ -32,6 +32,8 @@
var/never_remove = FALSE // whether it can ever be removed
var/global/list/chameleon_options
/obj/item/technomancer_core/Initialize()
. = ..()
START_PROCESSING(SSprocessing, src)
@@ -39,6 +41,10 @@
verbs += /obj/item/technomancer_core/proc/toggle_lock
else
canremove = FALSE
if(!chameleon_options)
var/list/blocked = list(/obj/item/storage/backpack/satchel/withwallet) + typesof(/obj/item/technomancer_core)
chameleon_options = list("Reset")
chameleon_options += generate_chameleon_choices(/obj/item/storage/backpack, blocked)
/obj/item/technomancer_core/Destroy()
dismiss_all_summons()
@@ -138,6 +144,36 @@
wards_in_use -= ward
qdel(ward)
/obj/item/technomancer_core/verb/change_appearance(picked in chameleon_options)
set name = "Change Core Appearance"
set category = "Chameleon Items"
set src in usr
if(picked != "Reset" && !ispath(chameleon_options[picked]))
return
if(!usr.mind || !technomancers.is_technomancer(usr.mind))
to_chat(usr, SPAN_WARNING("You have no idea how to do this!"))
return
var/chameleon_type
if(picked == "Reset")
chameleon_type = type
else
chameleon_type = chameleon_options[picked]
set_appearance_to(chameleon_type)
/obj/item/technomancer_core/proc/set_appearance_to(var/path)
disguise(path)
if(ismob(loc))
var/mob/M = loc
M.update_inv_back()
update_held_icon()
/obj/item/technomancer_core/emp_act()
set_appearance_to(type)
// This is what is clicked on to place a spell in the user's hands.
/obj/spellbutton
name = "generic spellbutton"
@@ -357,4 +393,4 @@
set desc = "Toggles the locking mechanism on your manipulation core."
canremove = !canremove
to_chat(usr, "<span class='notice'>You [canremove ? "de" : ""]activate the locking mechanism on \the [src].</span>")
to_chat(usr, "<span class='notice'>You [canremove ? "de" : ""]activate the locking mechanism on \the [src].</span>")
+11 -6
View File
@@ -660,6 +660,7 @@
"blood_amount" = REAGENT_VOLUME(H.vessel, /decl/reagent/blood),
"disabilities" = H.sdisabilities,
"lung_ruptured" = H.is_lung_ruptured(),
"lung_rescued" = H.is_lung_rescued(),
"external_organs" = H.organs.Copy(),
"internal_organs" = H.internal_organs.Copy(),
"species_organs" = H.species.has_organ //Just pass a reference for this, it shouldn't ever be modified outside of the datum.
@@ -770,20 +771,24 @@
var/infection = get_infection_level(i.germ_level)
if(infection == "")
infection = "No Infection"
infection = "No Infection."
else
infection = "[infection] infection"
infection = "[infection] infection."
if(i.rejecting)
infection += "(being rejected)"
infection += "(being rejected)."
var/necrotic = ""
if(i.get_scarring_level() > 0.01)
necrotic += ", [i.get_scarring_results()]"
necrotic += " [i.get_scarring_results()]."
if(i.status & ORGAN_DEAD)
necrotic = ", <span class='warning'>necrotic and decaying</span>"
necrotic = " <span class='warning'>Necrotic and decaying</span>."
var/rescued = ""
if(istype(i, /obj/item/organ/internal/lungs) && occ["lung_rescued"])
rescued = " Has a small puncture wound."
dat += "<tr>"
dat += "<td>[i.name]</td><td>N/A</td><td>[get_internal_damage(i)]</td><td>[infection], [mech][necrotic]</td><td></td>"
dat += "<td>[i.name]</td><td>N/A</td><td>[get_internal_damage(i)]</td><td>[infection][mech][necrotic][rescued]</td><td></td>"
dat += "</tr>"
dat += "</table>"
+1 -1
View File
@@ -50,7 +50,7 @@ var/global/list/engineering_networks = list(
/obj/machinery/camera/network/tcfl
network = list(NETWORK_TCFL)
/obj/machinery/camera/network/exodus
/obj/machinery/camera/network/station
network = list(NETWORK_STATION)
/obj/machinery/camera/network/mining
+14 -9
View File
@@ -18,9 +18,9 @@
var/backup_victim = null // Backup data
var/backup_data = null
var/last_critical // Spam checks for the alarms
var/last_ba // Brain Activity
var/last_bo // Blood Oxygenation
var/last_critical // Spam checks for the alarms
var/last_ba // Brain Activity
var/last_bo // Blood Oxygenation
/obj/machinery/computer/operating/Initialize()
. = ..()
@@ -243,6 +243,7 @@
"blood_amount" = REAGENT_VOLUME(H.vessel, /decl/reagent/blood),
"disabilities" = H.sdisabilities,
"lung_ruptured" = H.is_lung_ruptured(),
"lung_rescued" = H.is_lung_rescued(),
"external_organs" = H.organs.Copy(),
"internal_organs" = H.internal_organs.Copy(),
"species_organs" = H.species.has_organ
@@ -332,20 +333,24 @@
var/infection = internal_bodyscanner.get_infection_level(i.germ_level)
if(infection == "")
infection = "No Infection"
infection = "No Infection."
else
infection = "[infection] infection"
infection = "[infection] infection."
if(i.rejecting)
infection += "(being rejected)"
infection += "(being rejected)."
var/necrotic = ""
if(i.get_scarring_level() > 0.01)
necrotic += ", [i.get_scarring_results()]"
necrotic += " [i.get_scarring_results()]."
if(i.status & ORGAN_DEAD)
necrotic = ", <span class='warning'>necrotic and decaying</span>"
necrotic = " <span class='warning'>Necrotic and decaying</span>."
var/rescued = ""
if(istype(i, /obj/item/organ/internal/lungs) && occ["lung_rescued"])
rescued = " Has a small puncture wound."
dat += "<tr>"
dat += "<td>[i.name]</td><td>N/A</td><td>[internal_bodyscanner.get_internal_damage(i)]</td><td>[infection], [mech][necrotic]</td><td></td>"
dat += "<td>[i.name]</td><td>N/A</td><td>[internal_bodyscanner.get_internal_damage(i)]</td><td>[infection][mech][necrotic][rescued]</td><td></td>"
dat += "</tr>"
dat += "</table></div></center>"
+2 -2
View File
@@ -35,7 +35,7 @@
var/_wifi_id
var/datum/wifi/receiver/button/door/wifi_receiver
var/securitylock = FALSE
var/securitylock = TRUE
var/is_critical = FALSE
/obj/machinery/door/blast/Initialize()
@@ -187,8 +187,8 @@
if(src.operating || (stat & BROKEN) || is_critical)
return
if(stat & NOPOWER)
INVOKE_ASYNC(src, /obj/machinery/door/blast/.proc/force_close)
securitylock = !density // blast doors will only re-open when power is restored if they were open originally
INVOKE_ASYNC(src, /obj/machinery/door/blast/.proc/force_close)
else if(securitylock)
INVOKE_ASYNC(src, /obj/machinery/door/blast/.proc/force_open)
securitylock = FALSE
+707 -201
View File
@@ -1,224 +1,730 @@
/obj/machinery/iv_drip
name = "\improper IV drip"
desc = "A professional standard intravenous stand with supplemental gas support for medical use."
desc_info = "IV drips can be supplied beakers/bloodpacks for reagent transfusions, as well as one breath mask and gas tank for supplemental gas therapy. \
<br>Click and Drag to attach/detach the IV or secure/remove the breath mask on your target. <br>Click the stand with an empty hand to toggle between \
various modes. Using a wrench when it has a tank installed will secure it. It can be upgraded.<br>Alt Click the stand to remove items contained in the stand."
icon = 'icons/obj/iv_drip.dmi'
icon_state = "iv_stand"
anchored = 0
density = FALSE
var/tipped = FALSE
var/last_creak // Spam check
var/last_full
var/last_warning
// Blood Stuff
var/mob/living/carbon/human/attached = null
var/mode = 1 // 1 is injecting, 0 is taking blood.
var/toggle_stop = 1
var/transfer_amount = REM
var/obj/item/organ/external/vein = null
var/obj/item/reagent_containers/beaker = null
var/transfer_amount = REM
var/transfer_limit = 4
var/mode = TRUE // TRUE is injecting, FALSE is taking blood.
var/toggle_stop = TRUE
var/blood_message_sent = FALSE
var/attach_delay = 5
var/armor_check = TRUE
var/adv_scan = FALSE
/obj/machinery/iv_drip/update_icon()
if(src.attached)
icon_state = "hooked"
else
icon_state = ""
// Supplemental Gas Stuff
var/mob/living/carbon/human/breather = null
var/obj/item/clothing/mask/breath/breath_mask = null
var/obj/item/tank/tank = null
var/tank_type = null
var/is_loose = TRUE
var/list/tank_blacklist = list(/obj/item/tank/emergency_oxygen, /obj/item/tank/jetpack)
var/valve_open = FALSE
var/tank_active = FALSE
var/epp = TRUE // Emergency Positive Pressure system. Can be toggled if you want to turn it off
var/epp_active = FALSE
cut_overlays()
var/list/mask_blacklist = list(
/obj/item/clothing/mask/breath/vaurca,
/obj/item/clothing/mask/breath/skrell,
/obj/item/clothing/mask/breath/lyodsuit,
/obj/item/clothing/mask/breath/infiltrator)
if(beaker)
var/datum/reagents/reagents = beaker.reagents
if(reagents?.total_volume)
var/image/filling = image('icons/obj/iv_drip.dmi', src, "reagent")
var/percent = round((reagents.total_volume / beaker.volume) * 100)
switch(percent)
if(0 to 9) filling.icon_state = "reagent0"
if(10 to 24) filling.icon_state = "reagent10"
if(25 to 49) filling.icon_state = "reagent25"
if(50 to 74) filling.icon_state = "reagent50"
if(75 to 79) filling.icon_state = "reagent75"
if(80 to 90) filling.icon_state = "reagent80"
if(91 to INFINITY) filling.icon_state = "reagent100"
var/reagent_color = reagents.get_color()
filling.icon += reagent_color
add_overlay(filling)
/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location)
..()
component_types = list(
/obj/item/circuitboard/iv_drip,
/obj/item/reagent_containers/syringe,
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/manipulator,
/obj/item/stock_parts/scanning_module)
/obj/machinery/iv_drip/Destroy()
STOP_PROCESSING(SSprocessing, src)
if(attached)
visible_message("[src.attached] is detached from \the [src].")
src.attached = null
src.update_icon()
blood_message_sent = FALSE
return
if(in_range(src, usr) && ishuman(over_object) && get_dist(over_object, src) <= 1)
visible_message("[usr] attaches \the [src] to \the [over_object].")
src.attached = over_object
src.update_icon()
/obj/machinery/iv_drip/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/reagent_containers/blood/ripped))
to_chat(user, "You can't use a ripped bloodpack.")
return
if (istype(W, /obj/item/reagent_containers))
if(!isnull(src.beaker))
to_chat(user, "There is already a reagent container loaded!")
return
user.drop_from_inventory(W,src)
src.beaker = W
to_chat(user, "You attach \the [W] to \the [src].")
src.update_icon()
return
else
return ..()
/obj/machinery/iv_drip/machinery_process()
set background = 1
if(!beaker)
return
if(!istype(attached))
return
if(!(get_dist(src, attached) <= 1 && isturf(attached.loc)))
var/obj/item/organ/external/affecting = attached.get_organ(pick(BP_R_ARM, BP_L_ARM))
attached.visible_message("<span class='warning'>The needle is ripped out of [attached]'s [affecting.limb_name == BP_R_ARM ? "right arm" : "left arm"].</span>", "<span class='danger'>The needle <B>painfully</B> rips out of your [affecting.limb_name == BP_R_ARM ? "right arm" : "left arm"].</span>")
affecting.take_damage(brute = 5, damage_flags = DAM_SHARP)
attached = null
update_icon()
return
if(!attached.dna)
return
if(NOCLONE in attached.mutations)
return
if(attached.species.flags & NO_BLOOD)
return
// Give blood
if(mode)
if(beaker.reagents.total_volume > 0)
beaker.reagents.trans_to_mob(attached, transfer_amount, CHEM_BLOOD)
update_icon()
if(toggle_stop) // Automatically detaches if the blood volume is at 100%
if(beaker.reagents.has_reagent(/decl/reagent/blood) && attached.get_blood_volume() >= 100)
visible_message("[icon2html(src, viewers(get_turf(src)))] \The <b>[src]</b> flashes a warning light, disengaging from [attached] automatically!")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
src.attached = null
src.update_icon()
blood_message_sent = FALSE
update_icon()
return
// Take blood
else
var/amount = REAGENTS_FREE_SPACE(beaker.reagents)
amount = min(amount, transfer_amount)
// If the beaker is full, ping
if(amount == 0)
if(prob(5))
visible_message("[src] pings.")
return
if(attached.get_blood_volume() < 90 && !blood_message_sent)
visible_message("[icon2html(src, viewers(get_turf(src)))] \The <b>[src]</b> flashes a warning light!")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
blood_message_sent = TRUE
if(attached.take_blood(beaker,amount))
update_icon()
/obj/machinery/iv_drip/attack_hand(mob/user as mob)
if (isAI(user))
return
if(src.beaker)
src.beaker.forceMove(get_turf(src))
src.beaker = null
update_icon()
else
return ..()
/obj/machinery/iv_drip/verb/toggle_mode()
set category = "Object"
set name = "Toggle Mode"
set src in view(1)
if(!istype(usr, /mob/living))
to_chat(usr, "<span class='warning'>You can't do that.</span>")
return
if(usr.stat)
return
mode = !mode
to_chat(usr, "[src] is now [mode ? "injecting" : "taking blood"].")
/obj/machinery/iv_drip/verb/toggle_stop()
set category = "Object"
set name = "Toggle Stop"
set src in view(1)
if(!isliving(usr))
to_chat(usr, SPAN_WARNING("You can't do that."))
return
if(usr.incapacitated())
return
toggle_stop = !toggle_stop
usr.visible_message("<b>[usr]</b> toggles \the [src]'s automatic stop mode [toggle_stop ? "on" : "off"]", SPAN_NOTICE("You toggle \the [src]'s automatic stop mode [toggle_stop ? "on" : "off"]."))
playsound(usr, 'sound/machines/click.ogg', 50)
/obj/machinery/iv_drip/examine(mob/user)
..(user)
if (!(user in view(2)) && user!=src.loc) return
to_chat(user, "[src] is [mode ? "injecting" : "taking blood"].")
to_chat(user, "<span class='notice'>The transfer rate is set to [src.transfer_amount] u/sec</span>")
if(beaker)
if(LAZYLEN(beaker.reagents.reagent_volumes))
to_chat(usr, "<span class='notice'>Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.</span>")
else
to_chat(usr, "<span class='notice'>Attached is [beaker]. It is empty.</span>")
else
to_chat(usr, "<span class='notice'>No chemicals are attached.</span>")
to_chat(usr, "<span class='notice'>[attached ? attached : "No one"] is attached.</span>")
// Let's doctors set the rate of transfer. Useful if you want to set the rate at the rate of metabolisation.
// No longer have to take someone to dialysis because they have leftover sleeptox after surgery.
/obj/machinery/iv_drip/verb/transfer_rate()
set category = "Object"
set name = "Set Transfer Rate"
set src in view(1)
if (!ishuman(usr) && !issilicon(usr))
return
if (usr.stat || usr.restrained() || !Adjacent(usr))
return
set_rate:
var/amount = input("Set transfer rate as u/sec (between 4 and 0.001)") as num
if ((0.001 > amount || amount > 4) && amount != 0)
to_chat(usr, "<span class='warning'>Entered value must be between 0.001 and 4.</span>")
goto set_rate
if (transfer_amount == 0)
transfer_amount = REM
return
transfer_amount = amount
to_chat(usr, "<span class='notice'>Transfer rate set to [src.transfer_amount] u/sec</span>")
vein = null
QDEL_NULL(beaker)
if(breather)
if(valve_open)
tank_off()
breather.remove_from_mob(breath_mask)
breath_mask.forceMove(src)
breather = null
QDEL_NULL(breath_mask)
QDEL_NULL(tank)
return ..()
/obj/machinery/iv_drip/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(height && istype(mover) && mover.checkpass(PASSTABLE)) //allow bullets, beams, thrown objects, rats, drones, and the like through.
return 1
return ..()
/obj/machinery/iv_drip/Crossed(var/mob/H)
if(ishuman(H))
var/mob/living/carbon/human/M = H
if(M.shoes?.item_flags & LIGHTSTEP)
return
if(tipped)
if(M.m_intent == M_RUN && M.a_intent == I_HURT)
if(breath_mask)
if(prob(60))
if(breather)
src.visible_message(
SPAN_WARNING("[M] trips on \the [src]'s [breath_mask] cable, pulling \the [breather] down as well!"),
SPAN_WARNING("You trip on \the [src]'s [breath_mask] cable, pulling \the [breather] down as well!"))
shake_animation(4)
M.Weaken(3)
breather.forceMove(src.loc)
breather.Weaken(4)
return
src.visible_message(SPAN_WARNING("[M] trips on \the [src]'s [breath_mask] cable!"), SPAN_WARNING("You trip on \the [src]'s [breath_mask] cable!"))
breath_mask.forceMove(src.loc)
breath_mask = null
shake_animation(4)
M.Weaken(4)
update_icon()
return
src.visible_message(SPAN_WARNING("[M] barely avoids tripping on \the [src]'s [breath_mask] cable."), SPAN_WARNING("You barely avoid tripping on \the [src]'s [breath_mask] cable."))
shake_animation(2)
return
if(prob(25))
src.visible_message(SPAN_WARNING("[M] trips on \the [src]!"), SPAN_WARNING("You trip on \the [src]!"))
shake_animation(4)
M.Weaken(3)
return
src.visible_message(SPAN_WARNING("[M] almost trips on \the [src]!"), SPAN_WARNING("You almost trip on \the [src]!"))
shake_animation(2)
return
if(M.m_intent == M_RUN && M.a_intent == I_HURT)
src.visible_message(SPAN_WARNING("[M] bumps into \the [src], knocking it over!"), SPAN_WARNING("You bump into \the [src], knocking it over!"))
do_crash()
return ..()
/obj/machinery/iv_drip/update_icon()
cut_overlays()
if(beaker)
add_overlay("beaker[tipped ? "_tipped" : ""]")
var/datum/reagents/reagents = beaker.reagents
if(reagents?.total_volume)
var/image/filling = image('icons/obj/iv_drip.dmi', src, "[tipped ? "tipped_" : ""]reagent")
var/percent = round((reagents.total_volume / beaker.volume) * 100)
switch(percent)
if(0 to 9) filling.icon_state = "[tipped ? "tipped_" : ""]reagent0"
if(10 to 24) filling.icon_state = "[tipped ? "tipped_" : ""]reagent10"
if(25 to 49) filling.icon_state = "[tipped ? "tipped_" : ""]reagent25"
if(50 to 74) filling.icon_state = "[tipped ? "tipped_" : ""]reagent50"
if(75 to 79) filling.icon_state = "[tipped ? "tipped_" : ""]reagent75"
if(80 to 90) filling.icon_state = "[tipped ? "tipped_" : ""]reagent80"
if(91 to INFINITY) filling.icon_state = "[tipped ? "tipped_" : ""]reagent100"
var/reagent_color = reagents.get_color()
filling.icon += reagent_color
add_overlay(filling)
if(attached)
add_overlay("iv_in[tipped ? "_tipped" : ""]")
if(mode)
add_overlay("light_green[tipped ? "_tipped" : ""]")
else
add_overlay("light_red[tipped ? "_tipped" : ""]")
if(blood_message_sent)
add_overlay("light_yellow[tipped ? "_tipped" : ""]")
else
add_overlay("iv_out[tipped ? "_tipped" : ""]")
if(tank)
if(istype(tank, /obj/item/tank/oxygen))
tank_type = "oxy"
else if(istype(tank, /obj/item/tank/anesthetic))
tank_type = "anest"
else if(istype(tank, /obj/item/tank/phoron))
tank_type = "phoron"
else
tank_type = "other"
add_overlay("tank_[tank_type][tipped ? "_tipped" : ""]")
update_gauge()
if(breath_mask)
if(breather)
add_overlay("mask_on[tipped ? "_tipped" : ""]")
else
add_overlay("mask_off[tipped ? "_tipped" : ""]")
if(epp_active)
add_overlay("light_blue[tipped ? "_tipped" : ""]")
if(panel_open)
add_overlay("panel_open[tipped ? "_tipped" : ""]")
/obj/machinery/iv_drip/proc/update_gauge()
var/gauge_pressure = 0
var/last_gauge_pressure
if(tank.air_contents)
gauge_pressure = tank.air_contents.return_pressure()
if(gauge_pressure > TANK_IDEAL_PRESSURE)
gauge_pressure = -1
else
gauge_pressure = round((gauge_pressure/TANK_IDEAL_PRESSURE)*tank.gauge_cap)
if(gauge_pressure == last_gauge_pressure)
return
last_gauge_pressure = gauge_pressure
add_overlay("[tank.gauge_icon][(gauge_pressure == -1) ? "overload" : gauge_pressure][tipped ? "_tipped" : ""]")
/obj/machinery/iv_drip/machinery_process()
breather_process()
attached_process()
/obj/machinery/iv_drip/proc/breather_process()
if(breather)
if(!tank)
return
if(breather.species.flags & NO_BREATHE)
return
if(!breather.Adjacent(src))
step_to(src, get_turf(breather), 1)
if(world.time > last_creak + 10 SECONDS)
last_creak = world.time
src.visible_message("\The [src]'s wheels creak as it slowly gets tugged towards [breather] by \the [breath_mask]'s cable.")
playsound(src, 'sound/effects/roll.ogg', 50, 1)
shake_animation(2)
if(get_dist(src, breather) >= 2)
src.visible_message("\The [src] jerks as \the [breath_mask]'s cable is pulled taut!", SPAN_WARNING("You feel \the [src] jerk as your [breath_mask]'s cable is pulled taut."))
shake_animation(4)
if(prob(40))
do_crash()
if(valve_open)
var/obj/item/organ/internal/lungs/L = breather.internal_organs_by_name[BP_LUNGS]
if(!L)
src.visible_message(SPAN_NOTICE("\The [src] buzzes, automatically deactivating \the [tank]."))
playsound(src, 'sound/machines/buzz-two.ogg', 50)
tank_off()
update_icon()
return
var/safe_pressure_min = breather.species.breath_pressure + 5
safe_pressure_min *= 1 + rand(1,4) * L.damage/L.max_damage
if(!tank_active) // Activates and sets the kPa to a safe pressure. This keeps from it constantly resetting itself
tank.distribute_pressure = safe_pressure_min
src.visible_message(SPAN_NOTICE("\The [src] chimes and adjusts \the [tank]'s release pressure"))
playsound(src, 'sound/machines/chime.ogg', 50)
tank_active = TRUE
if(L.checking_rupture == FALSE) // Safely retracts in case the lungs are about to rupture
src.visible_message(SPAN_WARNING("\The [src]'s flashes a warning light, automatically deactivating \the [tank] and retracting \the [breath_mask]."))
playsound(src, 'sound/machines/twobeep.ogg', 50)
breather.remove_from_mob(breath_mask)
breather.update_inv_wear_mask()
breath_mask.forceMove(src)
breath_mask.canremove = TRUE
breath_mask.adjustable = TRUE
tank_off()
update_icon()
return
if(tank.air_contents.return_pressure() == 0)
src.visible_message(SPAN_WARNING("\The [src] buzzes and automatically closes the valve."))
playsound(src, 'sound/machines/buzz-two.ogg', 50)
tank_off()
update_icon()
return
if(epp) // Emergency Positive Pressure system forces respiration
if(breather.losebreath > 0)
if(!epp_active)
src.visible_message(SPAN_WARNING("\The [src] flashes a blue light, activating it's Emergency Positive Pressure system!"))
playsound(breather, 'sound/machines/windowdoor.ogg', 50)
epp_active = TRUE
update_icon()
tank.distribute_pressure = safe_pressure_min // Constantly adjusts the pressure to keep up with the damage
breather.losebreath = 0
to_chat(breather, SPAN_NOTICE("You feel fresh air being pushed into your lungs."))
update_icon()
/obj/machinery/iv_drip/proc/attached_process()
if(attached)
if(!beaker)
return
if(!attached.dna)
return
if(NOCLONE in attached.mutations)
return
if(attached.species.flags & NO_BLOOD)
return
if(!attached.Adjacent(src))
iv_rip()
update_icon()
return
if(mode) // Injecting
if(beaker.reagents.total_volume > 0)
beaker.reagents.trans_to_mob(attached, transfer_amount, CHEM_BLOOD)
update_icon()
if(toggle_stop) // Automatically detaches if the blood volume is at 100%
if((beaker.reagents.has_reagent(/decl/reagent/blood) || beaker.reagents.has_reagent(/decl/reagent/saline)) && attached.get_blood_volume() >= 100)
visible_message("\The <b>[src]</b> flashes a warning light, disengaging from [attached] automatically!")
playsound(src, 'sound/machines/buzz-two.ogg', 100)
attached = null
blood_message_sent = FALSE
update_icon()
return
else // Taking
var/amount = REAGENTS_FREE_SPACE(beaker.reagents)
amount = min(amount, transfer_amount)
if(amount == 0)
if(world.time > last_full + 10 SECONDS)
last_full = world.time
visible_message("\The <b>[src]</b> pings.")
playsound(src, 'sound/machines/ping.ogg', 100)
return
if(attached.get_blood_volume() < 90 && !blood_message_sent)
visible_message(SPAN_WARNING("\The <b>[src]</b> flashes a warning light!"))
playsound(src, 'sound/machines/buzz-two.ogg', 100)
blood_message_sent = TRUE
if(blood_message_sent)
if(world.time > last_warning + 5 SECONDS)
last_warning = world.time
visible_message(SPAN_WARNING("\The <b>[src]</b> flashes a warning light!"))
playsound(src, 'sound/machines/buzz-two.ogg', 100)
if(attached.take_blood(beaker, amount))
update_icon()
/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location)
..()
if(in_range(src, usr) && ishuman(over_object) && in_range(over_object, src))
var/list/options = list(
"IV drip" = image('icons/mob/screen/radial.dmi', "iv_drip"),
"Breath mask" = image('icons/mob/screen/radial.dmi', "iv_mask"))
var/chosen_action = show_radial_menu(usr, src, options, require_near = TRUE, radius = 42, tooltips = TRUE)
if(!chosen_action)
return
switch(chosen_action)
if("IV drip")
if(attached)
visible_message("[usr] detaches \the [src] from [attached]'s [vein.name].")
vein = null
attached = null
blood_message_sent = FALSE
update_icon()
return
attached = over_object
vein = attached.get_organ(usr.zone_sel.selecting)
var/checking = attached.can_inject(usr, TRUE, usr.zone_sel.selecting, armor_check)
if(!checking)
attached = null
vein = null
return
if(armor_check)
var/attach_time = attach_delay
attach_time *= checking
if(!do_mob(usr, attached, attach_time))
to_chat(usr, SPAN_DANGER("Failed to insert \the [src]. You and [attached] must stay still!"))
attached = null
vein = null
return
visible_message("[usr][armor_check ? "" : "swiftly "] inserts \the [src] in \the [attached]'s [vein.name].")
update_icon()
return
if("Breath mask")
if(!breath_mask)
to_chat(usr, SPAN_NOTICE("There is no breath mask installed into \the [src]!"))
return
if(breather)
visible_message("[usr] removes [breather]'s mask.[valve_open ? " \The [tank]'s valve automatically closes." : ""]")
breather.remove_from_mob(breath_mask)
breather.update_inv_wear_mask()
breath_mask.forceMove(src)
breath_mask.canremove = TRUE
breath_mask.adjustable = TRUE
breath_mask.slowdown = 0
breather = null
if(valve_open)
tank_off()
update_icon()
return
breather = over_object
if(!breather.organs_by_name[BP_HEAD])
to_chat(usr, SPAN_WARNING("\The [breather] doesn't have a head!"))
breather = null
return
if(!breather.check_has_mouth())
to_chat(usr, SPAN_WARNING("\The [breather] doesn't have a mouth!"))
breather = null
return
if(breather.head && (breather.head.body_parts_covered & FACE))
to_chat(usr, SPAN_WARNING("You must remove \the [breather]'s [breather.head] first!"))
breather = null
return
if(breather.wear_mask)
to_chat(usr, SPAN_WARNING("You must remove \the [breather]'s [breather.wear_mask] first!"))
breather = null
return
visible_message("<b>[usr]</b> secures the mask over \the <b>[breather]'s</b> face.")
playsound(breather, 'sound/effects/buckle.ogg', 50)
breath_mask.forceMove(breather.loc)
breather.equip_to_slot(breath_mask, slot_wear_mask)
breather.update_inv_wear_mask()
breath_mask.canremove = FALSE
breath_mask.adjustable = FALSE
breath_mask.slowdown = 2
update_icon()
return
/obj/machinery/iv_drip/AltClick(mob/user)
. = ..()
transfer_rate()
var/list/options = list(
"Transfer Rate" = image('icons/mob/screen/radial.dmi', "radial_transrate"),
"Remove Container" = image('icons/mob/screen/radial.dmi', "iv_beaker"),
"Remove Tank" = image('icons/mob/screen/radial.dmi', "iv_tank"),
"Remove Breath Mask" = image('icons/mob/screen/radial.dmi', "iv_mask"))
var/chosen_action = show_radial_menu(usr, src, options, require_near = TRUE, radius = 42, tooltips = TRUE)
if(!chosen_action)
return
switch(chosen_action)
if("Transfer Rate")
transfer_rate()
if("Remove Container")
if(!beaker)
to_chat(usr, SPAN_NOTICE("There is no reagent container to remove."))
return
usr.visible_message(SPAN_NOTICE("[usr] removes \the [beaker] from \the [src]."), SPAN_NOTICE("You remove \the [beaker] from \the [src]."))
beaker.forceMove(usr.loc)
usr.put_in_hands(beaker)
beaker = null
update_icon()
if("Remove Tank")
if(!tank)
to_chat(usr, SPAN_NOTICE("There is no installed tank to remove."))
return
if(breather)
to_chat(usr, SPAN_NOTICE("You cannot remove \the [tank] if someone's wearing the mask!"))
return
if(!is_loose)
to_chat(usr, SPAN_NOTICE("You must loosen the nuts securing \the [tank] into place to remove it!"))
return
usr.visible_message(SPAN_NOTICE("[usr] removes \the [tank] from \the [src]."), SPAN_NOTICE("You remove \the [tank] from \the [src]."))
tank.forceMove(usr.loc)
usr.put_in_hands(tank)
tank = null
update_icon()
if("Remove Breath Mask")
if(!breath_mask)
to_chat(usr, SPAN_NOTICE("There is no installed mask to remove."))
return
if(breather)
to_chat(usr, SPAN_NOTICE("You cannot remove \the [breath_mask] if someone's wearing it!"))
return
usr.visible_message(SPAN_NOTICE("[usr] removes \the [breath_mask] from \the [src]."), SPAN_NOTICE("You remove \the [breath_mask] from the \the [src]."))
breath_mask.forceMove(usr.loc)
usr.put_in_hands(breath_mask)
breath_mask = null
update_icon()
/obj/machinery/iv_drip/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/reagent_containers/blood/ripped))
to_chat(user, "You can't use a ripped bloodpack.")
return
if(istype(W, /obj/item/reagent_containers))
if(beaker)
to_chat(user, "There is already a reagent container loaded!")
return
usr.drop_from_inventory(W, src)
beaker = W
usr.visible_message(SPAN_NOTICE("[usr] attaches \the [W] to \the [src]."), SPAN_NOTICE("You attach \the [W] to \the [src]."))
update_icon()
return
if(istype(W, /obj/item/clothing/mask/breath))
if(is_type_in_list(W, mask_blacklist))
to_chat(usr, "\The [W] is incompatible with \the [src].")
return
if(breath_mask)
to_chat(usr, "There is already a mask installed.")
return
usr.drop_from_inventory(W, src)
breath_mask = W
usr.visible_message(SPAN_NOTICE("[usr] places \the [W] in \the [src]."), SPAN_NOTICE("You place \the [W] in \the [src]."))
update_icon()
return
if(istype(W, /obj/item/tank))
if(is_type_in_list(W, tank_blacklist))
to_chat(usr, "\The [W] is incompatible with \the [src].")
return
if(tank)
to_chat(usr, "There is already a tank installed!")
return
if(istype(W, /obj/item/tank/phoron))
if(tipped)
to_chat(usr, "You're not sure how to place \the [W] in the fallen [src].")
return
usr.drop_from_inventory(W, src)
tank = W
usr.visible_message(SPAN_NOTICE("[usr] places \the [W] in \the [src]."), SPAN_NOTICE("You place \the [W] in \the [src]."))
update_icon()
return
if(W.iswrench())
if(!tank)
to_chat(usr, "There isn't a tank installed for you to secure!")
return
if(tank_type == "phoron")
to_chat(usr, "You can't properly secure this type of tank to \the [src]!")
return
usr.visible_message(
SPAN_NOTICE("[usr] [is_loose ? "tightens" : "loosens"] the nuts on [src]."),
SPAN_NOTICE("You [is_loose ? "tighten" : "loosen"] the nuts on [src], [is_loose ? "securing \the [tank]" : "allowing \the [tank] to be removed"]."))
playsound(src.loc, "sound/items/wrench.ogg", 50, 1)
is_loose = !is_loose
return
if(default_deconstruction_screwdriver(user, W))
return
if(default_part_replacement(user, W))
return
return ..()
/obj/machinery/iv_drip/attack_ai(mob/user as mob)
if(!ai_can_interact(user))
return
return attack_hand(user)
/obj/machinery/iv_drip/attack_hand(mob/user as mob)
if(tipped)
usr.visible_message("<b>[usr]</b> pulls \the [src] upright.", "You pull \the [src] upright.")
icon_state = "iv_stand"
tipped = FALSE
update_icon()
return
if(user.a_intent == I_HURT)
usr.visible_message("<b>[usr]</b> knocks \the [src] down!", "You knock \the [src] down!")
do_crash()
return
var/list/options = list(
"Transfer Rate" = image('icons/mob/screen/radial.dmi', "radial_transrate"),
"Toggle Mode" = image('icons/mob/screen/radial.dmi', "iv_mode"),
"Toggle Stop" = image('icons/mob/screen/radial.dmi', "iv_stop"),
"Toggle Valve" = image('icons/mob/screen/radial.dmi', "iv_valve"),
"Toggle EPP" = image('icons/mob/screen/radial.dmi', "iv_epp"))
var/chosen_action = show_radial_menu(usr, src, options, require_near = TRUE, radius = 42, tooltips = TRUE)
if(!chosen_action)
return
switch(chosen_action)
if("Transfer Rate")
transfer_rate()
if("Toggle Mode")
toggle_mode()
if("Toggle Stop")
toggle_stop()
if("Toggle Valve")
toggle_valve()
if("Toggle EPP")
toggle_epp()
/obj/machinery/iv_drip/proc/do_crash()
cut_overlays()
visible_message(SPAN_WARNING("\The [src] falls over with a buzz, spilling out it's contents!"))
flick("iv_crash[is_loose ? "" : "_tank_[tank_type]"]", src)
playsound(src, 'sound/items/drop/prosthetic.ogg', 50)
spill()
tipped = TRUE
icon_state = "iv_stand_tipped"
update_icon()
/obj/machinery/iv_drip/proc/spill()
var/turf/dropspot = get_turf(src)
if(breath_mask)
if(!breather)
breath_mask.forceMove(dropspot)
breath_mask.tumble(rand(1,3))
breath_mask.SpinAnimation(4, 2)
breath_mask = null
else
src.visible_message(SPAN_WARNING("\The [breath_mask] pulls \the [breather] down with \the [src]!"), SPAN_WARNING("\The [breath_mask] pulls you down with \the [src]!"))
breather.forceMove(dropspot)
breather.Weaken(4)
if(beaker)
beaker.forceMove(dropspot)
beaker.tumble(rand(1,3))
beaker.SpinAnimation(4, 2)
beaker = null
if(attached)
iv_rip()
if(tank)
if(is_loose)
tank.forceMove(dropspot)
tank.tumble(rand(1,2))
tank.SpinAnimation(4, 2)
tank = null
tank_type = null
if(breather)
if(breather.internals)
breather.internals.icon_state = "internal0"
breather.internal = null
valve_open = FALSE
tank_active = FALSE
epp_active = FALSE
src.visible_message("\The [tank] rattles, but remains firmly secured to \the [src].")
/obj/machinery/iv_drip/proc/iv_rip()
attached.visible_message(SPAN_WARNING("The needle is ripped out of [attached]'s [vein.name]."), SPAN_DANGER("The needle <B>painfully</B> rips out of your [vein.name]."))
vein.take_damage(brute = 5, damage_flags = DAM_SHARP)
vein = null
attached = null
/obj/machinery/iv_drip/proc/tank_off()
tank.forceMove(src)
if(breather.internals)
breather.internals.icon_state = "internal0"
breather.internal = null
tank_active = FALSE
valve_open = FALSE
epp_active = FALSE
/obj/machinery/iv_drip/proc/toggle_check()
if(!ishuman(usr) && !issilicon(usr))
to_chat(usr, SPAN_WARNING("This mob cannot operate the controls!"))
return
if(usr.stat || usr.incapacitated())
to_chat(usr, SPAN_WARNING("You are in no shape to do this."))
return
if(!usr.Adjacent(src))
to_chat(usr, SPAN_WARNING("You must get closer to \the [src] to do that!"))
return
return TRUE
/obj/machinery/iv_drip/verb/toggle_mode()
set category = "Object"
set name = "Toggle Mode"
set src in view(1)
if(!toggle_check())
return
mode = !mode
usr.visible_message("<b>[usr]</b> toggles \the [src] to [mode ? "inject" : "take blood"].", SPAN_NOTICE("You set \the [src] to [mode ? "injecting" : "taking blood"]."))
playsound(usr, 'sound/machines/buttonbeep.ogg', 50)
update_icon()
/obj/machinery/iv_drip/verb/toggle_stop()
set category = "Object"
set name = "Toggle Stop"
set src in view(1)
if(!toggle_check())
return
toggle_stop = !toggle_stop
usr.visible_message("<b>[usr]</b> toggles \the [src]'s automatic stop mode [toggle_stop ? "on" : "off"].", SPAN_NOTICE("You toggle \the [src]'s automatic stop mode [toggle_stop ? "on" : "off"]."))
playsound(usr, 'sound/machines/click.ogg', 50)
/obj/machinery/iv_drip/verb/toggle_valve()
set category = "Object"
set name = "Toggle Valve"
set src in view(1)
if(!toggle_check())
return
if(!tank)
to_chat(usr, SPAN_NOTICE("There is no tank for you to open the valve of!"))
return
if(!breather)
to_chat(usr, SPAN_NOTICE("There is no one with \the [src]'s mask for you to open the valve!"))
return
if(!valve_open)
usr.visible_message("<b>[usr]</b> opens \the [tank]'s valve.", SPAN_NOTICE("You open \the [tank]'s valve."))
playsound(src, 'sound/effects/internals.ogg', 100)
tank.forceMove(breather)
breather.internal = tank
if(breather.internals)
breather.internals.icon_state = "internal1"
valve_open = TRUE
update_icon()
return
if(epp_active)
var/response = alert(usr, "Are you sure you want to close \the [tank]'s valve? The Emergency Positive Pressure system is currently active!", "Toggle Valve", "Yes", "No")
if(response == "No")
return
epp_active = FALSE
usr.visible_message("<b>[usr]</b> closes \the [tank]'s valve.", SPAN_NOTICE("You close \the [tank]'s valve."))
playsound(src, 'sound/effects/internals.ogg', 100)
tank_off()
update_icon()
/obj/machinery/iv_drip/verb/toggle_epp()
set category = "Object"
set name = "Toggle EPP"
set src in view(1)
if(!toggle_check())
return
if(epp_active)
var/response = alert(usr, "Are you sure you want to turn off the Emergency Positive Pressure system? It is currently active!", "Toggle EPP", "Yes", "No")
if(response == "No")
return
epp_active = FALSE
epp = !epp
usr.visible_message("<b>[usr]</b> toggles \the [src]'s Emergency Positive Pressure system [epp ? "on" : "off"].", SPAN_NOTICE("You toggle \the [src]'s Emergency Positive Pressure system [epp ? "on" : "off"]."))
playsound(usr, 'sound/machines/click.ogg', 50)
/obj/machinery/iv_drip/verb/transfer_rate()
set category = "Object"
set name = "Set Transfer Rate"
set src in view(1)
if(!toggle_check())
return
set_rate:
var/amount = input("Set transfer rate as u/sec (between [transfer_limit] and 0.001)") as num
if ((0.001 > amount || amount > transfer_limit) && amount != 0)
to_chat(usr, SPAN_WARNING("Entered value must be between 0.001 and [transfer_limit]."))
goto set_rate
if (transfer_amount == 0)
transfer_amount = REM
return
transfer_amount = amount
to_chat(usr, SPAN_NOTICE("Transfer rate set to [src.transfer_amount] u/sec"))
/obj/machinery/iv_drip/examine(mob/user)
..(user)
if (!(user in viewers(2, src)))
return
to_chat(user, SPAN_NOTICE("[src] is [mode ? "injecting" : "taking blood"] at a rate of [src.transfer_amount] u/sec, and the automatic injection stop mode is [toggle_stop ? "on" : "off"]."))
to_chat(user, SPAN_NOTICE("\The [src] [attached ? "is attached to [attached]'s [vein.name]" : "has no one attached"]."))
if(beaker)
if(LAZYLEN(beaker.reagents.reagent_volumes))
to_chat(user, SPAN_NOTICE("Attached is [icon2html(beaker, usr)] \a [beaker] with [adv_scan ? "[beaker.reagents.total_volume] units of primarily [beaker.reagents.get_primary_reagent_name()]" : "some liquid"]."))
else
to_chat(user, SPAN_NOTICE("Attached is [icon2html(beaker, usr)] \a [beaker]. It is empty."))
else
to_chat(user, SPAN_NOTICE("No chemicals are attached."))
if(tank)
to_chat(user, SPAN_NOTICE("Installed is [icon2html(tank, usr)] [is_loose ? "\a [tank] sitting loose" : "\a [tank] secured"] on the stand. The meter shows [round(tank.air_contents.return_pressure())]kPa, \
with the pressure set to [tank.distribute_pressure]kPa. The valve is [valve_open ? "open" : "closed"]."))
else
to_chat(user, SPAN_NOTICE("No gas tank installed."))
if(breath_mask)
to_chat(user, SPAN_NOTICE("\The [src] has [icon2html(breath_mask, usr)] \a [breath_mask] installed. [breather ? breather : "No one"] is wearing it."))
else
to_chat(user, SPAN_NOTICE("No breath mask installed."))
/obj/machinery/iv_drip/RefreshParts()
..()
var/manip = 0
var/scanner = 0
adv_scan = FALSE
armor_check = TRUE
transfer_limit = 4
for(var/obj/item/stock_parts/P in component_parts)
if(ismanipulator(P))
manip += P.rating
transfer_limit += P.rating
if(isscanner(P))
scanner += P.rating
if(manip >= 2)
armor_check = FALSE
if(scanner >= 2)
adv_scan = TRUE
@@ -19,6 +19,7 @@
var/amount = 5
var/drytime
var/dries = TRUE
var/bleed_time
/obj/effect/decal/cleanable/blood/no_dry
dries = FALSE
@@ -53,10 +54,15 @@
blood_DNA |= B.blood_DNA.Copy()
qdel(B)
drytime = DRYING_TIME * (amount+1)
if (dries && !mapload)
addtimer(CALLBACK(src, /obj/effect/decal/cleanable/blood/.proc/dry), drytime)
else if (dries)
dry()
bleed_time = world.time
if (dries)
animate(src, color = "#000000", time = drytime, loop = 0, flags = ANIMATION_RELATIVE)
/obj/effect/decal/cleanable/blood/examine()
if(dries && world.time > (bleed_time + drytime))
name = dryname
desc = drydesc
. = ..()
/obj/effect/decal/cleanable/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/gun/energy/rifle/cult))
@@ -70,6 +76,8 @@
/obj/effect/decal/cleanable/blood/Crossed(mob/living/carbon/human/perp)
if (!istype(perp))
return
if(dries && world.time > (bleed_time + drytime))
amount = 0
if(amount < 1)
return
@@ -115,14 +123,10 @@
if(amount > 2 && prob(perp.slip_chance(perp.m_intent == M_RUN ? 20 : 5)))
perp.slip(src, 4)
/obj/effect/decal/cleanable/blood/proc/dry()
name = dryname
desc = drydesc
color = adjust_brightness(color, -50)
amount = 0
/obj/effect/decal/cleanable/blood/attack_hand(mob/living/carbon/human/user)
..()
if(dries && world.time > (bleed_time + drytime))
amount = 0
if (amount && istype(user))
add_fingerprint(user)
if (user.gloves)
@@ -254,11 +258,7 @@
random_icon_states = null
var/list/datum/disease2/disease/virus2 = list()
var/dry = 0 // Keeps the lag down
/obj/effect/decal/cleanable/mucus/Initialize()
. = ..()
addtimer(CALLBACK(src, .proc/dry), DRYING_TIME * 2)
/obj/effect/decal/cleanable/mucus/proc/dry()
dry = TRUE
animate(src, color = "#000000", time = DRYING_TIME * 2, loop = 0, flags = ANIMATION_RELATIVE)
@@ -5,14 +5,11 @@
icon_state = "gib1"
basecolor="#030303"
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7")
dries = FALSE // So we can avoid setting the timer if it's not going to do anything.
dries = FALSE
/obj/effect/decal/cleanable/blood/gibs/robot/update_icon()
color = "#FFFFFF"
/obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like
return
/obj/effect/decal/cleanable/blood/gibs/robot/streak(var/list/directions)
set waitfor = FALSE
var/direction = pick(directions)
@@ -42,13 +39,10 @@
basecolor="#030303"
dries = FALSE
/obj/effect/decal/cleanable/blood/oil/dry()
return
/obj/effect/decal/cleanable/blood/oil/streak
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
amount = 2
/obj/effect/decal/cleanable/blood/drip/oil
name = "drips of motor oil"
desc = "It's black and greasy."
desc = "It's black and greasy."
@@ -157,8 +157,9 @@
desc = "They look like still wet tracks left by bare feet."
drydesc = "They look like dried tracks left by bare feet."
/obj/effect/decal/cleanable/blood/tracks/footprints/barefoot/del_dry/dry()
qdel(src)
/obj/effect/decal/cleanable/blood/tracks/footprints/barefoot/del_dry/Initialize()
. = ..()
QDEL_IN(src, TRACKS_CRUSTIFY_TIME)
/obj/effect/decal/cleanable/blood/tracks/wheels
name = "wet tracks"
@@ -614,6 +614,18 @@ var/global/list/default_medbay_channels = list(
channels[ch_name] = 0
..()
/obj/item/device/radio/med
icon_state = "walkietalkie-med"
/obj/item/device/radio/sec
icon_state = "walkietalkie-sec"
/obj/item/device/radio/eng
icon_state = "walkietalkie-eng"
/obj/item/device/radio/sci
icon_state = "walkietalkie-sci"
///////////////////////////////
//////////Borg Radios//////////
///////////////////////////////
@@ -705,6 +705,7 @@ BREATH ANALYZER
"blood_amount" = REAGENT_VOLUME(H.vessel, /decl/reagent/blood),
"disabilities" = H.sdisabilities,
"lung_ruptured" = H.is_lung_ruptured(),
"lung_rescued" = H.is_lung_rescued(),
"external_organs" = H.organs.Copy(),
"internal_organs" = H.internal_organs.Copy(),
"species_organs" = H.species.has_organ
@@ -201,4 +201,16 @@
req_components = list(
"/obj/item/stock_parts/scanning_module" = 2,
"/obj/item/stock_parts/capacitor" = 1,
"/obj/item/stock_parts/console_screen" = 1)
"/obj/item/stock_parts/console_screen" = 1)
/obj/item/circuitboard/iv_drip
name = T_BOARD("IV drip")
desc = "The circuitboard for an IV drip."
build_path = /obj/machinery/iv_drip
origin_tech = list(TECH_DATA = 1, TECH_BIO = 2)
board_type = "machine"
req_components = list(
"/obj/item/reagent_containers/syringe" = 1,
"/obj/item/stock_parts/matter_bin" = 1,
"/obj/item/stock_parts/manipulator" = 1,
"/obj/item/stock_parts/scanning_module" = 1)
-1
View File
@@ -35,7 +35,6 @@
var/list/results = list()
for(var/i = 1 to amount)
if(weight_roll && prob(weight_roll))
message_admins("hit weight roll")
results += favored_number
else
results += rand(1, sides)
@@ -26,7 +26,7 @@
*/
/obj/item/surgery/retractor
name = "retractor"
desc = "Retracts stuff."
desc = "A surgical instrument which allows careful opening of incisions to reach inside someone."
icon_state = "retractor"
item_state = "retractor"
matter = list(DEFAULT_WALL_MATERIAL = 10000, MATERIAL_GLASS = 5000)
@@ -38,7 +38,7 @@
*/
/obj/item/surgery/hemostat
name = "hemostat"
desc = "You think you have seen this before."
desc = "Primarily utilized to control initial incision bleeding, this instrument allows for careful removal of objects inside someone."
icon_state = "hemostat"
item_state = "hemostat"
matter = list(DEFAULT_WALL_MATERIAL = 5000, MATERIAL_GLASS = 2500)
@@ -51,7 +51,7 @@
*/
/obj/item/surgery/cautery
name = "cautery"
desc = "This stops bleeding."
desc = "A specialized surgical tool which applies just enough heat to safely close surgical incisions, when used correctly at least."
icon_state = "cautery"
item_state = "cautery"
matter = list(DEFAULT_WALL_MATERIAL = 5000, MATERIAL_GLASS = 2500)
@@ -64,7 +64,7 @@
*/
/obj/item/surgery/surgicaldrill
name = "surgical drill"
desc = "You can drill using this item. You dig?"
desc = "A drill specialized for surgical use, capable of creating surgical cavities and safely breaching through Vaurcae carapace for initial incisions."
icon_state = "drill"
item_state = "drill"
hitsound = /decl/sound_category/drillhit_sound
@@ -82,7 +82,7 @@
*/
/obj/item/surgery/scalpel
name = "scalpel"
desc = "Cut, cut, and once more cut."
desc = "A metallic scalpel with long-lasting edge. Used in a variety of surgical situations from incisions, to transplants, and to debridements."
icon_state = "scalpel"
item_state = "scalpel"
flags = CONDUCT
@@ -105,20 +105,20 @@
*/
/obj/item/surgery/scalpel/laser1
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved."
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved."
icon_state = "scalpel_laser1"
damtype = "fire"
/obj/item/surgery/scalpel/laser2
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced."
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced."
icon_state = "scalpel_laser2"
damtype = "fire"
force = 12.0
/obj/item/surgery/scalpel/laser3
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!"
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!"
icon_state = "scalpel_laser3"
damtype = "fire"
force = 15.0
@@ -134,7 +134,7 @@
*/
/obj/item/surgery/circular_saw
name = "circular saw"
desc = "For heavy duty cutting."
desc = "A circular bone saw specialized for cutting through bones, amputations, and even hardsuits if required."
icon_state = "saw"
item_state = "saw"
hitsound = 'sound/weapons/saw/circsawhit.ogg'
@@ -155,6 +155,7 @@
//misc, formerly from code/defines/weapons.dm
/obj/item/surgery/bonegel
name = "bone gel"
desc = "A highly specialized gel which promotes fast bone healing."
icon_state = "bone-gel"
item_state = "bone-gel"
force = 0
@@ -164,6 +165,7 @@
/obj/item/surgery/FixOVein
name = "FixOVein"
desc = "A specialized surgical instrument capable of quickly and safely healing torn veins and arteries, being capable of repairing torn ligaments as well."
icon_state = "fixovein"
item_state = "fixovein"
force = 0
@@ -175,6 +177,7 @@
/obj/item/surgery/bonesetter
name = "bone setter"
desc = "A surgical tool designed to firmly set damaged bones back together for proper healing."
icon_state = "bonesetter"
item_state = "bonesetter"
force = 8.0
@@ -1,7 +1,3 @@
#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE)
#define TANK_DEFAULT_RELEASE_PRESSURE 24
#define TANK_IDEAL_PRESSURE 1015 //Arbitrary.
/obj/item/tank
name = "tank"
icon = 'icons/obj/tank.dmi'
@@ -8,6 +8,7 @@
icon_state = "m_garment"
item_state = "m_garment"
contained_sprite = 1
autodrobe_no_remove = TRUE
/obj/item/clothing/mask/breath/vaurca/adjust_mask(mob/user)
to_chat(user, "This mask is too tight to adjust.")
@@ -119,7 +119,7 @@
new /obj/item/device/gps(src)
new /obj/item/reagent_containers/hypospray(src)
new /obj/item/taperoll/medical(src)
new /obj/item/device/radio(src)
new /obj/item/device/radio/med(src)
new /obj/item/roller(src)
new /obj/item/crowbar/red(src)
new /obj/item/clothing/mask/gas/alt(src)
+4 -3
View File
@@ -290,11 +290,12 @@
send_link(usr, selected_report.public_topic)
//Ask them if there was antag involvement
var/a = input(user, "Were your actions influenced by antagonists?", "Antagonist involvement") in list("yes","no")
var/a = input(user, "Were your actions influenced by antagonists or OOC issues/concerns ?", "Antagonist involvement / OOC Issue") in list("yes","no")
if(a == "yes")
antag_involvement = TRUE
antag_involvement_text = sanitizeSafe(input("Describe how your actions were influenced by the antagonists.", "Antag involvement") as message|null)
message_cciaa("CCIA Interview: [user] claimed their actions were influenced by antagonists.", R_CCIAA)
antag_involvement_text = sanitizeSafe(input("Describe how your actions were influenced by the antagonists or OOC issues/concerns.", "Antag involvement / OOC Issue") as message|null)
message_cciaa("CCIA Interview: [user] claimed their actions were influenced by antagonists or OOC issues.", R_CCIAA)
message_cciaa("CCIA Interview: [antag_involvement_text]")
else
antag_involvement = FALSE
+1
View File
@@ -26,6 +26,7 @@
var/adminobs = null
var/area = null
var/time_died_as_rat = 0
var/list/autofire_aiming_at[2]
var/adminhelped = NOT_ADMINHELPED
+29 -6
View File
@@ -771,6 +771,9 @@ var/list/localhost_addresses = list(
. = ..()
if(over_object)
if(autofire_aiming_at[1])
autofire_aiming_at[1] = over_object
autofire_aiming_at[2] = params
var/mob/living/M = mob
if(istype(get_turf(over_object), /atom))
var/atom/A = get_turf(over_object)
@@ -780,15 +783,35 @@ var/list/localhost_addresses = list(
if(istype(M) && !M.incapacitated())
var/obj/item/I = M.get_active_hand()
if(istype(I, /obj/item/gun))
var/obj/item/gun/gun = I
if(gun.can_autofire())
M.set_dir(get_dir(M, over_object))
gun.Fire(get_turf(over_object), M, params, (get_dist(over_object, M) <= 1), FALSE)
if(istype(I, /obj/item/rfd/mining) && isturf(over_object))
var/proximity = M.Adjacent(over_object)
var/obj/item/rfd/mining/RFDM = I
RFDM.afterattack(over_object, M, proximity, params, FALSE)
CHECK_TICK
/client/MouseDown(object, location, control, params)
var/obj/item/I = mob.get_active_hand()
var/obj/O = object
if(istype(I, /obj/item/gun))
var/obj/item/gun/G = I
if(G.can_autofire(object, location, params) && O.is_auto_clickable())
autofire_aiming_at[1] = object
autofire_aiming_at[2] = params
while(autofire_aiming_at[1])
G.Fire(autofire_aiming_at[1], mob, autofire_aiming_at[2], (get_dist(mob, location) <= 1), FALSE)
mob.set_dir(get_dir(mob, autofire_aiming_at[1]))
sleep(G.fire_delay)
CHECK_TICK
/client/MouseUp(object, location, control, params)
autofire_aiming_at[1] = null
/atom/proc/is_auto_clickable()
return TRUE
/obj/screen/is_auto_clickable()
return FALSE
/obj/screen/click_catcher/is_auto_clickable()
return TRUE
@@ -32,6 +32,7 @@
display_name = "synthetic vocal cords"
description = "Vocal cords of synthetic nature packed into an augment kit. This allows users who are mute due to structural damage of the throat to speak."
path = /obj/item/organ/internal/augment/synthetic_cords
whitelisted = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_BREEDER, SPECIES_UNATHI)
cost = 1
/datum/gear/augment/combitool
@@ -64,6 +65,7 @@
display_name = "cochlear implant"
description = "A synthetic replacement for the structures within the ear, allowing the user to hear without requiring external tools."
path = /obj/item/organ/internal/augment/cochlear
whitelisted = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_BREEDER, SPECIES_UNATHI)
cost = 3
/datum/gear/augment/health_scanner
@@ -82,6 +84,7 @@
display_name = "taste booster selection"
description = "A selection of augments that modify the user's taste sensitivity."
path = /obj/item/organ/internal/augment/taste_booster
whitelisted = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_BREEDER, SPECIES_UNATHI)
/datum/gear/augment/taste_boosters/New()
..()
@@ -156,21 +159,25 @@
description = "A fluff based augmentation that can be renamed/redescribed to appear as something else for RP purposes."
path = /obj/item/organ/internal/augment/head_fluff
flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION
whitelisted = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_BREEDER, SPECIES_UNATHI)
/datum/gear/augment/chest_fluff
display_name = "Custom chest augmentation"
description = "A fluff based augmentation that can be renamed/redescribed to appear as something else for RP purposes."
path = /obj/item/organ/internal/augment/head_fluff/chest_fluff
flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION
whitelisted = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_BREEDER, SPECIES_UNATHI)
/datum/gear/augment/rhand_fluff
display_name = "Custom right hand augmentation"
description = "A fluff based augmentation that can be renamed/redescribed to appear as something else for RP purposes."
path = /obj/item/organ/internal/augment/head_fluff/rhand_fluff
flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION
whitelisted = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_BREEDER, SPECIES_UNATHI)
/datum/gear/augment/lhand_fluff
display_name = "Custom left hand augmentation"
description = "A fluff based augmentation that can be renamed/redescribed to appear as something else for RP purposes."
path = /obj/item/organ/internal/augment/head_fluff/lhand_fluff
flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION
whitelisted = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_BREEDER, SPECIES_UNATHI)
@@ -54,7 +54,7 @@
coat["tajaran naval coat"] = /obj/item/clothing/suit/storage/toggle/tajaran
coat["gruff cloak"] = /obj/item/clothing/suit/storage/hooded/tajaran
coat["adhomian wool coat"] = /obj/item/clothing/suit/storage/toggle/tajaran/wool
coat["Raakti Shariim coat"] = /obj/item/clothing/suit/storage/toggle/tajaran/raakti_shariim
coat["raakti shariim coat"] = /obj/item/clothing/suit/storage/toggle/tajaran/raakti_shariim
gear_tweaks += new /datum/gear_tweak/path(coat)
/datum/gear/suit/tajara_cloak
@@ -86,7 +86,7 @@
robes["sun priest robe"] = /obj/item/clothing/suit/storage/hooded/tajaran/priest
robes["sun sister robe"] = /obj/item/clothing/suit/storage/tajaran/messa
robes["matake priest mantle"] = /obj/item/clothing/suit/storage/tajaran/matake
robes["Azubarre priest robes"] = /obj/item/clothing/suit/storage/tajaran/azubarre
robes["azubarre priest robes"] = /obj/item/clothing/suit/storage/tajaran/azubarre
gear_tweaks += new /datum/gear_tweak/path(robes)
/datum/gear/suit/tajaran_labcoat
@@ -100,7 +100,7 @@
display_name = "adhomian surgeon garb"
path = /obj/item/clothing/suit/storage/hooded/tajaran/surgery
whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI)
allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Xenobiologist")
allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Xenobiologist", "Roboticist")
sort_category = "Xenowear - Tajara"
/datum/gear/uniform/tajara
@@ -115,12 +115,12 @@
var/list/uniform = list()
uniform["laborers clothes"] = /obj/item/clothing/under/tajaran
uniform["fancy uniform"] = /obj/item/clothing/under/tajaran/fancy
uniform["NanoTrasen overalls"] = /obj/item/clothing/under/tajaran/nt
uniform["nanotrasen overalls"] = /obj/item/clothing/under/tajaran/nt
uniform["matake priest garments"] = /obj/item/clothing/under/tajaran/matake
uniform["adhomian summerwear"] = /obj/item/clothing/under/tajaran/summer
uniform["adhomian summer pants"] = /obj/item/clothing/under/pants/tajaran
uniform["machinist uniform"] = /obj/item/clothing/under/tajaran/mechanic
uniform["Raakti Shariim uniform"] = /obj/item/clothing/under/tajaran/raakti_shariim
uniform["raakti shariim uniform"] = /obj/item/clothing/under/tajaran/raakti_shariim
gear_tweaks += new /datum/gear_tweak/path(uniform)
/datum/gear/uniform/tajara_dress
@@ -197,6 +197,11 @@
circlet["fur hat"] = /obj/item/clothing/head/tajaran/fur
circlet["matake priest hat"] = /obj/item/clothing/head/tajaran/matake
circlet["raakti shariim beret"] = /obj/item/clothing/head/beret/tajaran/raakti_shariim
circlet["hadiist army beret"] = /obj/item/clothing/head/beret/tajaran/pra
circlet["liberation army beret"] = /obj/item/clothing/head/beret/tajaran/dpra
circlet["liberation army beret, alternative"] = /obj/item/clothing/head/beret/tajaran/dpra/alt
circlet["new kingdom naval beret"] = /obj/item/clothing/head/beret/tajaran/nka
circlet["new kingdom naval officer beret"] = /obj/item/clothing/head/beret/tajaran/nka/officer
gear_tweaks += new /datum/gear_tweak/path(circlet)
/datum/gear/accessory/tajara_wrap
@@ -252,7 +257,7 @@
sort_category = "Xenowear - Tajara"
/datum/gear/accessory/tajaran_card
display_name = "tajaran cards, badges and pins selection"
display_name = "tajaran faction cards, badges and pins selection"
description = "A selection of Tajaran related cards, badges and pins."
path = /obj/item/clothing/accessory/badge/hadii_card
sort_category = "Xenowear - Tajara"
@@ -329,7 +334,7 @@
path = /obj/item/voidsuit_modkit/himeo/tajara
sort_category = "Xenowear - Tajara"
whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI)
allowed_roles = list("Shaft Miner", "Operations Manager", "Engineer", "Atmospheric Technician", "Chief Engineer", "Engineering Apprentice")
allowed_roles = list("Cargo Technician", "Shaft Miner", "Quartermaster", "Head of Personnel", "Station Engineer", "Atmospheric Technician", "Chief Engineer", "Engineering Apprentice")
/datum/gear/tajaran_tarot
display_name = "adhomian divination cards deck"
@@ -358,3 +363,36 @@
charm["tajani charm"] = /obj/item/clothing/accessory/tajaran/charm/tajani
charm["holy sun rosette"] = /obj/item/clothing/accessory/tajaran/srendarr
gear_tweaks += new /datum/gear_tweak/path(charm)
/datum/gear/accessory/dpra_party_pin
display_name = "democratic peoples republic party pins selection"
description = "A selection of DPRA party pins."
path = /obj/item/clothing/accessory/tajaran/nawparty_pin
sort_category = "Xenowear - Tajara"
whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI)
flags = GEAR_HAS_DESC_SELECTION
/datum/gear/accessory/dpra_party_pin/New()
..()
var/list/card = list()
card["national adhomai workers party pin"] = /obj/item/clothing/accessory/tajaran/nawparty_pin
card["free tajaran people party pin"] = /obj/item/clothing/accessory/tajaran/ftpparty_pin
card["followers of Nated party pin"] = /obj/item/clothing/accessory/tajaran/fonparty_pin
card["adhomian blue party pin"] = /obj/item/clothing/accessory/tajaran/abparty_pin
card["amohdan free lodge party pin"] = /obj/item/clothing/accessory/tajaran/aflparty_pin
gear_tweaks += new /datum/gear_tweak/path(card)
/datum/gear/accessory/tajaran_gen_accessorry
display_name = "tajaran accessories selection"
description = "A selection of tajaran related accessories."
path = /obj/item/clothing/accessory/tajaran/zbrojny_badge
sort_category = "Xenowear - Tajara"
whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI)
flags = GEAR_HAS_DESC_SELECTION
/datum/gear/accessory/tajaran_gen_accessorry/New()
..()
var/list/card = list()
card["zbrojny badge"] = /obj/item/clothing/accessory/tajaran/zbrojny_badge
card["golden sun pin"] = /obj/item/clothing/accessory/tajaran/tanker_pin
gear_tweaks += new /datum/gear_tweak/path(card)
+2 -2
View File
@@ -31,11 +31,11 @@
return copy //for inheritance
/proc/generate_chameleon_choices(var/basetype, var/blacklist=list())
/proc/generate_chameleon_choices(var/basetype, var/blacklist=list(), var/list/whitelist=list())
. = list()
var/i = 1 //in case there is a collision with both name AND icon_state
for(var/typepath in typesof(basetype) - blacklist)
for(var/typepath in (whitelist + typesof(basetype) - blacklist))
var/obj/O = typepath
if(initial(O.icon) && initial(O.icon_state))
var/name = initial(O.name)
+14
View File
@@ -802,6 +802,8 @@
var/silent = 0
var/last_trip = 0
var/footstep_sound_override
/obj/item/clothing/shoes/proc/draw_knife()
set name = "Draw Boot Knife"
set desc = "Pull out your boot knife."
@@ -910,6 +912,18 @@
. = ..()
track_footprint = 0
/obj/item/clothing/shoes/proc/do_special_footsteps(var/running)
if(!footstep_sound_override)
return FALSE
if(ishuman(loc))
var/mob/living/carbon/human/wearer = loc
if(running)
playsound(wearer, footstep_sound_override, 70, 1, required_asfx_toggles = ASFX_FOOTSTEPS)
else
footstep++
if (footstep % 2)
playsound(wearer, footstep_sound_override, 40, 1, required_asfx_toggles = ASFX_FOOTSTEPS)
return TRUE
///////////////////////////////////////////////////////////////////////
//Suit
/obj/item/clothing/suit
+18 -8
View File
@@ -53,31 +53,41 @@
icon_state = "raskara_mask"
item_state = "raskara_mask"
/obj/item/clothing/head/beret/tajaran/pra
name = "republican army beret"
desc = "A green beret issued to republican soldiers."
/obj/item/clothing/head/beret/tajaran
icon = 'icons/obj/tajara_items.dmi'
contained_sprite = TRUE
/obj/item/clothing/head/beret/tajaran/pra
name = "hadiist army beret"
desc = "A green beret issued to hadiist soldiers."
icon_state = "praberet"
item_state = "praberet"
contained_sprite = TRUE
/obj/item/clothing/head/beret/tajaran/dpra
name = "liberation army beret"
desc = "A beret issued to liberation army soldiers."
icon = 'icons/obj/tajara_items.dmi'
icon_state = "alaberet"
item_state = "alaberet"
contained_sprite = TRUE
/obj/item/clothing/head/beret/tajaran/dpra/alt
icon_state = "alaberetalt"
item_state = "alaberetalt"
/obj/item/clothing/head/beret/tajaran/nka
name = "new kingdom naval beret"
desc = "A formal black beret with a blue band. This is worn by NKA naval servicemen and crewmen such as the Imperial Marines."
icon_state = "navalberetblue"
item_state = "navalberetblue"
/obj/item/clothing/head/beret/tajaran/nka/officer
name = "new kingdom naval officer beret"
desc = "A formal black beret with a golden band. This is worn by members of the NKA naval officer corps. These are prized in the New Kingdom thanks to the Navy's popularity."
icon_state = "navalberetofficer"
item_state = "navalberetofficer"
/obj/item/clothing/head/beret/tajaran/raakti_shariim
name = "\improper Raakti Shariim beret"
desc = "A blue beret with a pale-gold twin-suns insignia, signifying a Constable of the NKA's Raakti Shariim."
icon = 'icons/obj/tajara_items.dmi'
contained_sprite = TRUE
icon_state = "raakti_shariim_beret"
item_state = "raakti_shariim_beret"
desc_fluff = "The Raakti Shariim (Royal Peacekeepers in Ceti Basic) are the New Kingdom of Adhomai's policing and \
@@ -30,6 +30,7 @@
species_restricted = null
gender = PLURAL
icon_base = null
footstep_sound_override = 'sound/machines/rig/rigstep.ogg'
/obj/item/clothing/suit/space/rig
name = "chestpiece"
@@ -339,3 +339,104 @@
desc = "A hand carved charm of one of the mythical tajani."
desc_fluff = "Tajani, also known as 'short people' in basic, are good-willed tiny elder Tajara who serve as guardians of nature and homes. \
Hand carved charms of them is considered a symbol of luck and as such many superstitious tajara keeps one around."
/obj/item/clothing/accessory/tajaran/tanker_pin
name = "golden sun pin"
desc = "Given to all members of the Hro'rammad tank corps is this sun pin. It is considered a symbol of how the tanker corps is the wrath of the God S'rendarr. Its rays are sharp not \
just so it can be easily pinned but also to represent how the tankers are the blades of S'rendarr himself. "
icon_state = "tanker_pin"
item_state = "tanker_pin"
overlay_state = "tanker_pin"
desc_fluff = "Lead by the famously merciful Commander Kahan Hro'rammhad, the Hro'rammhad Tank Corps has the distinction of being the most powerful and accomplished armored unit in the history \
of Adhomai. These elite Armored Kazarrhaldiye Tajara are used primarily in offensive operations to break through opposing lines and encircle their positions. Their tanks have exceptionally \
wide tracks which allow them to more easily tread across snowy terrains. Veterans of the Hro'rammhad Tank Corps are known for their golden pins depicting the sun-god S'rendarr which they wear on their uniforms."
flippable = TRUE
drop_sound = 'sound/items/drop/ring.ogg'
pickup_sound = 'sound/items/pickup/ring.ogg'
/obj/item/clothing/accessory/tajaran/zbrojny_badge
name = "zbrojny badge"
desc = "A small badge given to people who enter the Intelligence Service's Zbrojny program. The siik'mas \"Z\" character has 3 studs underneath it to designate this person as having fully completed the program."
icon_state = "zbrojny_badge"
item_state = "zbrojny_badge"
overlay_state = "zbrojny_badge"
desc_fluff = "Seeking to replicate the success of the Liberation Army guerrillas, the Zbrojny is a partisan force created after the Armistice. The Zbrojny is made up of loyal Hadiist \
volunteers from the civilian population. Trained by the People's Strategic Intelligence Service in guerilla tactics, they are meant to act behind enemy lines in occupied territory. \
Unlike all branches of the Grand People's Army, the Partisans are under the direct control of the secret service."
flippable = TRUE
drop_sound = 'sound/items/drop/ring.ogg'
pickup_sound = 'sound/items/pickup/ring.ogg'
//dpra party badges
/obj/item/clothing/accessory/tajaran/abparty_pin
name = "adhomian blue party pin"
desc = "A pin of the Adhomian Blue Party. This symbol is a white hoe on a blue background representing the party's dedication to environmentalism and ruralism."
icon_state = "abparty_pin"
item_state = "abparty_pin"
overlay_state = "abparty_pin"
desc_fluff = "The Adhomian Blue party is formed by farmers and students. Instead of worrying about the Armistice or the composition of the government, their main goal is to preserve the environment of \
Adhomai. Industrialization and armed conflict are considered a major threat to the nature and beauty of the planet. Members of this organization are also vehemently opposed to the presence \
of NanoTrasen. The organization is currently divided between environmentalists and Al'mariist ruralists."
flippable = TRUE
drop_sound = 'sound/items/drop/ring.ogg'
pickup_sound = 'sound/items/pickup/ring.ogg'
/obj/item/clothing/accessory/tajaran/fonparty_pin
name = "followers of Nated party pin"
desc = "A pin of the Followers of Nated. The pin is split down the middle with the golden yellow reflecting S'rendarr and the pale blue reflecting Messa. A black Spear of Mata'ke is laid overtop."
icon_state = "fonparty_pin"
item_state = "fonparty_pin"
overlay_state = "fonparty_pin"
desc_fluff = "The Followers of Nated is an organization formed by fanatical supporters of Nated who claim he is a divine avatar of the Suns or Mata'ke. They support a dictatorship under the guidance of Halkiikijr \
Nated'Hakhan, stripping away any semblance of democracy from the Democratic People's Republic. Members of this party oppose any form of peace or negotiation with the other Tajaran factions, \
or diplomacy with alien powers. They are known for hosting the most radical elements of DPRA's political scenario."
flippable = TRUE
drop_sound = 'sound/items/drop/ring.ogg'
pickup_sound = 'sound/items/pickup/ring.ogg'
/obj/item/clothing/accessory/tajaran/ftpparty_pin
name = "free tajaran people party pin"
desc = "A pin of the Free Tajaran's People Party. The two white rifles represent the party's fervor in crushing the two ideological enemies of the Tajara: Royalism and Hadiism."
icon_state = "ftpparty_pin"
item_state = "ftpparty_pin"
overlay_state = "ftpparty_pin"
desc_fluff = "The Free Tajaran People's Party encompasses most of the military and authoritarian elements. They seek to weaken the autonomy of governors in favor of a strong central government, overseen by \
the supreme commander. Members of this organization hold the most nationalist and xenophobic views; defending the return of the war against other Adhomian nations and isolation before the \
galactic community."
flippable = TRUE
drop_sound = 'sound/items/drop/ring.ogg'
pickup_sound = 'sound/items/pickup/ring.ogg'
/obj/item/clothing/accessory/tajaran/nawparty_pin
name = "national adhomai workers party pin"
desc = "A pin of the National Adhomai Workers Party. The hammer and wrench are tools of the common Tajaran worker and the red represents the blood spilled by Tajaran during the Revolutions."
icon_state = "nawparty_pin"
item_state = "nawparty_pin"
overlay_state = "nawparty_pin"
desc_fluff = "The National Adhomai Worker's Party is composed of urban workers and intellectuals. They aim to increase the autonomy of the states, placing less importance on the decisions made by the national \
assemblies. Members of its organization hold far more moderate views; seeking to honor the Armistice of Shastar while recognizing that maintaining a healthy and independent relationship \
with other foreign powers is needed."
flippable = TRUE
drop_sound = 'sound/items/drop/ring.ogg'
pickup_sound = 'sound/items/pickup/ring.ogg'
/obj/item/clothing/accessory/tajaran/aflparty_pin
name = "amohdan free lodge party pin"
desc = "A pin of the banned Amohdan Free Lodge. The golden sword represents divine right to independence and willingness to fight for it. Carrying this pin in Amohda is a death sentence."
icon_state = "aflparty_pin"
item_state = "aflparty_pin"
overlay_state = "aflparty_pin"
desc_fluff = "The Amohdan Free Lodge was represented by Amohdan nationals. They pushed for the independence of Amohda as its own state, usually siding with other parties that may help them in reaching their \
goals. However, they were divided between two different sides; one that saw democracy as the best option for the island, while others believed that restoring the monarchy would have been \
better. This organization was the main supporter of the ceasefire with the New Kingdom of Adhomai. This Party was banned after the Amohdan uprising of 2462."
flippable = TRUE
drop_sound = 'sound/items/drop/ring.ogg'
pickup_sound = 'sound/items/pickup/ring.ogg'
+49 -130
View File
@@ -1849,42 +1849,6 @@ All custom items with worn sprites must follow the contained sprite system: http
item_state = "godard_cape"
contained_sprite = TRUE
/obj/item/organ/internal/augment/fluff/kath_legbrace // Leg Support Augment - Kathira El-Hashem - thegreywolf
name = "leg support augment"
desc = "A leg augment to aid in the mobility of an otherwise disabled leg."
icon = 'icons/obj/custom_items/kathira_legbrace.dmi'
icon_override = 'icons/obj/custom_items/kathira_legbrace.dmi'
on_mob_icon = 'icons/obj/custom_items/kathira_legbrace.dmi'
icon_state = "kathira_legbrace"
item_state = "kathira_legbrace_onmob"
parent_organ = BP_R_LEG
supports_limb = TRUE
min_broken_damage = 15
min_bruised_damage = 5
var/last_drop = 0
/obj/item/organ/internal/augment/fluff/kath_legbrace/process()
if(QDELETED(src) || !owner)
return
if(last_drop + 6 SECONDS > world.time)
return
if(owner.lying || owner.buckled_to || length(owner.grabbed_by))
return
if(is_bruised())
if(is_broken())
collapse(40, 3, 110)
else
collapse()
/obj/item/organ/internal/augment/fluff/kath_legbrace/proc/collapse(var/prob_chance = 20, var/weaken_strength = 2, var/pain_strength = 40)
if(prob(prob_chance))
var/obj/item/organ/external/E = owner.organs_by_name[parent_organ]
owner.Weaken(weaken_strength)
last_drop = world.time
owner.custom_pain("Something inside your [E.name] hurts too much to stand!", pain_strength, TRUE, E, TRUE)
owner.visible_message("<b>[owner]</b> collapses!")
/obj/item/flame/lighter/zippo/fluff/sezrak_zippo //Imperial 16th Zippo - Sezrak Han'san - captaingecko
name = "imperial 16th zippo"
desc = "A zippo lighter given by the Empire of Dominia to the men of the 16th Regiment of the Imperial Army, also known as the \"Suicide Regiments\", that would manage to survive more \
@@ -2029,15 +1993,6 @@ All custom items with worn sprites must follow the contained sprite system: http
item_state = "pax_bag"
contained_sprite = TRUE
/obj/item/journal/fluff/kathira // Blue Leather-Bound Journal - Kathira El-Hashem - TheGreyWolf
name = "blue leather-bound journal"
desc = "A blue journal emblazoned with the New Kingdom of Adhomai's flag across the cover."
closed_desc = " The pages within are a mix of clearly indexed case files, and study notes alongside less clearly indexed pages that appears to be fragmented thoughts, not unlike a diary. The very first page of the journal reads 'dedicated to Qirandri Mrorirhaldarr' and is signed 'Mrradar Sanufar' underneath."
icon = 'icons/obj/custom_items/kathira_journal.dmi'
icon_override = 'icons/obj/custom_items/kathira_journal.dmi'
icon_state = "kath_journal"
item_state = "kath_journal"
/obj/item/storage/pill_bottle/dice/fluff/suraya_dicebag //Crevan Dice Bag - Suraya Al-Zahrani - Omicega
name = "velvet dice bag"
desc = "A deep purple dice bag fashioned from Adhomian velvet, with two little drawstrings to tighten the neck closed."
@@ -2062,7 +2017,10 @@ All custom items with worn sprites must follow the contained sprite system: http
weight_roll = 22
/obj/item/stack/dice/fluff/suraya_dice/AltClick(mob/user)
if(!weight_roll)
if(user.get_active_hand() != src)
return ..()
if(weight_roll)
user.visible_message("<b>\The [user]</b> jiggles \the [src] around in their hand for a second.", SPAN_NOTICE("You jiggle the die rapidly in your hand, resetting the internal weighting."))
weight_roll = 0
else
@@ -2090,90 +2048,6 @@ All custom items with worn sprites must follow the contained sprite system: http
name = "old synthetic vocal cords"
desc = "A set of Old Age Synthetic Vocal Cords. They look barely functional."
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak // Handsewn Idris Cloak - Kathira El-Hashem - TheGreyWolf
name = "handsewn Idris cloak"
desc = "A carefully handsewn cloak proudly emblazoned with the symbol of Idris Banking in silver treading and the words Astronomical Figures. Unlimited Power. Embroidered beneath it.\nOn close examination, the inside of the cloak appears to be colored differently."
icon = 'icons/obj/custom_items/kathira_cloak.dmi'
icon_override = 'icons/obj/custom_items/kathira_cloak.dmi'
icon_state = "idris_cloak"
item_state = "idris_cloak"
var/style = "nka_cloak"
var/name2 = "handmade royalist cloak"
var/desc2 = "A blue cloak with the symbol of the New Kingdom of Adhomai proudly displayed on the back.\nUpon closer examination it appears to be a patchwork of older textile and newer fabrics, with the inside of the cloak appearing to be colored differently."
var/changed = FALSE
var/hoodtype = /obj/item/clothing/head/winterhood/fluff/kathira_hood
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/Initialize()
. = ..()
new hoodtype(src)
/obj/item/clothing/head/winterhood/fluff/kathira_hood
name = "handsewn hood"
desc = "A hood attached to a cloak."
icon = 'icons/obj/custom_items/kathira_cloak.dmi'
icon_override = 'icons/obj/custom_items/kathira_cloak.dmi'
icon_state = "idris_cloak_hood"
contained_sprite = TRUE
flags_inv = HIDEEARS | BLOCKHAIR | HIDEEARS
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/update_icon(var/hooded = FALSE)
var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = get_accessory(/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak)
K.icon_state = "[K.changed ? K.style : initial(K.icon_state)]"
SEND_SIGNAL(K, COMSIG_ITEM_STATE_CHECK, args)
K.item_state = "[K.icon_state][hooded ? "_up" : ""]"
K.name = "[K.changed ? K.name2 : initial(K.name)]"
K.desc = "[K.changed ? K.desc2 : initial(K.desc)]"
K.accessory_mob_overlay = null
. = ..()
SEND_SIGNAL(K, COMSIG_ITEM_ICON_UPDATE)
if(usr)
usr.update_inv_w_uniform()
usr.update_inv_wear_suit()
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_cloak()
set name = "Change Cloak"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = get_accessory(/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak)
if(!K)
return
usr.visible_message(SPAN_NOTICE("[usr] swiftly pulls \the [K] inside out, changing its appearance."))
K.changed = !K.changed
K.update_icon()
SEND_SIGNAL(K, COMSIG_ITEM_REMOVE, K)
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/on_attached(obj/item/clothing/S, mob/user as mob)
..()
has_suit.verbs += /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_cloak
has_suit.verbs += /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_hood
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/on_removed(mob/user as mob)
if(has_suit)
has_suit.verbs -= /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_cloak
has_suit.verbs -= /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_hood
..()
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_hood()
set name = "Toggle Hood"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = get_accessory(/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak)
if(!K)
return
SEND_SIGNAL(K, COMSIG_ITEM_UPDATE_STATE, K)
K.update_icon()
/obj/item/clothing/suit/storage/toggle/fluff/leonid_chokha //Old Rebel's Chokha - Leonid Myagmar - lucaken
name = "old rebel's chokha"
desc = "A not-so traditional Vysokan Chokha made out of beat-up gurmori leathers, worn-out to the point of seeming ancient. Though it might have been a Host-boy's garment once, it is now \
@@ -2349,3 +2223,48 @@ All custom items with worn sprites must follow the contained sprite system: http
icon_state = "iliasz_jacket"
item_state = "iliasz_jacket"
contained_sprite = TRUE
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/dekel_smock // corporate smock - Dekel Mrrhazrughan - veterangary
name = "corporate smock"
desc = "A dark colored surplus winter smock repurposed for interstellar use. It still has a hood and a snow mask, shaded into corporate colors. A traditional Stellar Corporate Conglomerate star is embroidered on the back."
icon = 'icons/obj/custom_items/dekel_smock.dmi'
icon_override = 'icons/obj/custom_items/dekel_smock.dmi'
icon_state = "seccloak"
item_state = "seccloak"
var/hoodtype = /obj/item/clothing/head/winterhood/fluff/dekel_hood
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/dekel_smock/Initialize()
. = ..()
new hoodtype(src)
/obj/item/clothing/head/winterhood/fluff/dekel_hood
name = "corporate hood"
desc = "A hood attached to a corporate smock."
icon = 'icons/obj/custom_items/dekel_smock.dmi'
icon_override = 'icons/obj/custom_items/dekel_smock.dmi'
icon_state = "seccloak_hood"
contained_sprite = TRUE
flags_inv = HIDEEARS | BLOCKHAIR
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/dekel_smock/on_attached(obj/item/clothing/S, mob/user as mob)
..()
has_suit.verbs += /obj/item/clothing/accessory/poncho/tajarancloak/fluff/dekel_smock/verb/change_hood
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/dekel_smock/on_removed(mob/user as mob)
if(has_suit)
has_suit.verbs -= /obj/item/clothing/accessory/poncho/tajarancloak/fluff/dekel_smock/verb/change_hood
..()
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/dekel_smock/verb/change_hood()
set name = "Toggle Hood"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/dekel_smock/D = get_accessory(/obj/item/clothing/accessory/poncho/tajarancloak/fluff/dekel_smock)
if(!D)
return
SEND_SIGNAL(D, COMSIG_ITEM_UPDATE_STATE, D)
+1 -1
View File
@@ -377,6 +377,6 @@
to_chat(user, "<span class='warning'>Access denied.</span>")
return TRUE
/obj/machinery/computer/HolodeckControl/Exodus
/obj/machinery/computer/HolodeckControl/Aurora
density = 0
linkedholodeck_area = /area/holodeck/alphadeck
-1
View File
@@ -125,7 +125,6 @@
if(95)
new /obj/item/clothing/under/mime(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/modular_computer/handheld/pda/civilian/mime(src)
new /obj/item/clothing/gloves/white(src)
new /obj/item/clothing/mask/gas/mime(src)
new /obj/item/clothing/head/beret/red(src)
@@ -1734,7 +1734,7 @@ Follow by example and make good judgement based on length which list to include
icon = 'icons/mob/hair_gradients.dmi'
species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,
/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,
/datum/species/skrell, /datum/species/skrell/axiori, /datum/species/zombie/skrell, /datum/species/bug, /datum/species/bug/type_b)
/datum/species/skrell, /datum/species/skrell/axiori, /datum/species/zombie/skrell, /datum/species/bug, /datum/species/bug/type_b, /datum/species/unathi,/datum/species/zombie/unathi)
none
name = "None"
@@ -2267,6 +2267,18 @@ Follow by example and make good judgement based on length which list to include
length = 0
chatname = "lump"
una_droopy
name = "Unathi Droopy Dorsal Frill"
icon_state = "unathi_droopydorsal"
length = 0
chatname = "droopy frill"
una_regal
name = "Unathi Regal Frills"
icon_state = "unathi_regalfrills"
length = 6
chatname = "massive frills"
//skrell tentacles
@@ -3305,6 +3317,14 @@ Follow by example and make good judgement based on length which list to include
name = "Unathi Pachy Boss"
icon_state = "pachylump"
una_droopy
name = "Unathi Droopy Dorsal Frill"
icon_state = "unathi_droopydorsal"
una_regal
name = "Unathi Regal Frills"
icon_state = "unathi_regalfrills"
//ipc screens
ipc_screen_blank
+2
View File
@@ -294,6 +294,8 @@
src.show_message(message)
/mob/proc/hear_sleep(var/message)
if (isdeaf(src))
return
var/heard = ""
if(prob(15))
var/list/punctuation = list(",", "!", ".", ";", "?")
@@ -1257,6 +1257,11 @@
custom_pain("You feel a stabbing pain in your chest!", 50)
L.bruise()
/mob/living/carbon/human/proc/is_lung_rescued()
var/species_organ = species.breathing_organ
var/obj/item/organ/internal/lungs/L = internal_organs_by_name[species_organ]
return L && L.rescued
//returns 1 if made bloody, returns 0 otherwise
/mob/living/carbon/human/add_blood(mob/living/carbon/C as mob)
if (!..())
@@ -146,6 +146,10 @@
return
last_x = x
last_y = y
if(shoes)
var/obj/item/clothing/shoes/S = shoes
if(S.do_special_footsteps(m_intent))
return
if (m_intent == M_RUN)
playsound(src, is_noisy ? footsound : species.footsound, 70, 1, required_asfx_toggles = ASFX_FOOTSTEPS)
else
@@ -287,6 +287,10 @@
/mob/living/silicon/robot/drone/updatename()
return
/mob/living/silicon/robot/drone/setup_icon_cache()
setup_eye_cache()
setup_panel_cache()
/mob/living/silicon/robot/drone/setup_eye_cache()
cached_eye_overlays = list(
I_HELP = image(icon, "[icon_state]-eyes_help"),
@@ -3,10 +3,6 @@
//Returns the thing in our active hand (whatever is in our active module-slot, in this case)
/mob/living/silicon/robot/get_active_hand()
if(istype(module_active, /obj/item/gripper))
var/obj/item/gripper/G = module_active
if(G.wrapped)
return G.wrapped
return module_active
/mob/living/silicon/robot/proc/return_wirecutter()
@@ -54,7 +54,7 @@
return FALSE
return TRUE
/obj/item/gripper/proc/grip_item(var/obj/item/I, var/mob/user, var/feedback = 1)
/obj/item/gripper/proc/grip_item(var/obj/item/I, var/mob/user, var/feedback = TRUE)
//This function returns 1 if we successfully took the item, or 0 if it was invalid. This information is useful to the caller
if(!wrapped)
if((can_hold && is_type_in_list(I, can_hold)) || (cant_hold && !is_type_in_list(I, cant_hold)))
@@ -125,14 +125,14 @@
update_icon()
return TRUE
/obj/item/gripper/attack(mob/living/carbon/M, mob/living/carbon/user)
/obj/item/gripper/attack(mob/M, mob/user)
if(wrapped) //The force of the wrapped obj gets set to zero during the attack() and afterattack().
force_holder = wrapped.force
wrapped.force = 0
wrapped.attack(M,user)
var/resolved = wrapped.attack(M,user)
if(QDELETED(wrapped))
wrapped = null
return TRUE
drop(get_turf(src), user, FALSE)
return resolved
else // mob interactions
switch(user.a_intent)
if(I_HELP)
@@ -148,26 +148,23 @@
/obj/item/gripper/attackby(obj/item/O, mob/user)
if(wrapped)
if(O == wrapped)
attack_self(user) //Allows gripper to be clicked to use item.
attack_self(user) //Allows gripper to be clicked to use item.
return
var/resolved = wrapped.attackby(O,user)
if(!resolved && wrapped && O)
O.afterattack(wrapped, user ,1)//We pass along things targeting the gripper, to objects inside the gripper. So that we can draw chemicals from held beakers for instance
if(!resolved)
O.afterattack(wrapped, user, TRUE)//We pass along things targeting the gripper, to objects inside the gripper. So that we can draw chemicals from held beakers for instance
return
/obj/item/gripper/afterattack(var/atom/target, var/mob/living/user, proximity, params)
if(!proximity)
return // This will prevent them using guns at range but adminbuse can add them directly to modules, so eh.
//There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z
if(!wrapped)
for(var/obj/item/thing in src.contents)
wrapped = thing
break
return
if(wrapped) //Already have an item.
return //This is handled in /mob/living/silicon/robot/GripperClickOn
wrapped.afterattack(target, user, TRUE, params)
if(QDELETED(wrapped))
drop(get_turf(src), user, FALSE)
else if(istype(target, /obj/item/storage) && !istype(target, /obj/item/storage/pill_bottle) && !istype(target, /obj/item/storage/secure))
for(var/obj/item/C in target.contents)
if(grip_item(C, user, 0))
for(var/obj/item/C in target)
if(grip_item(C, user, FALSE))
to_chat(user, SPAN_NOTICE("You grab \the [C] from inside \the [target.name]."))
return
to_chat(user, SPAN_NOTICE("There is nothing inside the box that your gripper can collect."))
@@ -183,6 +180,12 @@
target.attack_ai(user)
just_dropped = FALSE
/obj/item/gripper/resolve_attackby(atom/A, mob/user, var/click_parameters)
if(wrapped)
return wrapped.resolve_attackby(A, user, click_parameters)
else
. = ..()
/*
//Definitions of gripper subtypes
*/
@@ -334,4 +337,4 @@
/obj/item/storage,
/obj/item/modular_computer,
/obj/item/card/id
)
)
@@ -842,6 +842,7 @@ var/global/list/robot_modules = list(
modules += new /obj/item/device/flash(src) // Non-lethal tool that prevents any 'borg from going lethal on Crew so long as it's an option according to laws.
modules += new /obj/item/crowbar/robotic(src) // Base crowbar that all 'borgs should have access to.
modules += new /obj/item/storage/part_replacer(src)
modules += new /obj/item/device/multitool/robotic(src) // To enable them to connect machines that require multitools e.g. tech-processors
emag = new /obj/item/hand_tele(src)
var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000)
@@ -27,9 +27,9 @@
var/image/blood_overlay
var/bleeding = FALSE
var/blood_amount = 50 // set a limit to the amount of blood it can bleed, otherwise it will keep bleeding forever and crunk the server
var/blood_amount = 20 // set a limit to the amount of blood it can bleed, otherwise it will keep bleeding forever and crunk the server
var/previous_bleed_timer = 0 // they only bleed for as many seconds as force damage was applied to them
var/blood_timer_mod = 1 // tweak to change the amount of seconds a mob will bleed
var/blood_timer_mod = 0.25 // tweak to change the amount of seconds a mob will bleed
var/list/speak = list()
var/speak_chance = 0
+7 -2
View File
@@ -818,6 +818,9 @@
stat("Game ID", game_id)
stat("Map", current_map.full_name)
stat("Current Space Sector", SSatlas.current_sector.name)
var/current_month = text2num(time2text(world.realtime, "MM"))
var/current_day = text2num(time2text(world.realtime, "DD"))
stat("Current Date", "[current_day]/[current_month]/[game_year]")
stat("Station Time", worldtime2text())
stat("Round Duration", get_round_duration_formatted())
stat("Last Transfer Vote", SSvote.last_transfer_vote ? time2text(SSvote.last_transfer_vote, "hh:mm") : "Never")
@@ -953,13 +956,15 @@
/mob/proc/facedir(var/ndir)
if(!canface() || (client && client.moving) || (client && world.time < client.move_delay))
if(!canface() || (client && client.moving))
return 0
if(facing_dir != ndir)
facing_dir = null
set_dir(ndir)
if(buckled_to && buckled_to.buckle_movable)
buckled_to.set_dir(ndir)
if (client)//Fixing a ton of runtime errors that came from checking client vars on an NPC
client.move_delay += movement_delay()
setMoveCooldown(movement_delay())
return 1
@@ -44,18 +44,6 @@
. = ..()
card_slot.stored_item = new /obj/item/pen/fountain
/obj/item/modular_computer/handheld/pda/civilian/clown
_app_preset_type = /datum/modular_computer_app_presets/civilian/clown
icon_add = "clown"
/obj/item/modular_computer/handheld/pda/civilian/clown/Initialize()
. = ..()
card_slot.stored_item = new /obj/item/pen/crayon
/obj/item/modular_computer/handheld/pda/civilian/mime
_app_preset_type = /datum/modular_computer_app_presets/civilian/mime
icon_add = "mime"
// Engineering
/obj/item/modular_computer/handheld/pda/engineering
@@ -457,18 +457,6 @@
)
return _prg_list
/datum/modular_computer_app_presets/civilian/clown
name = "clown"
display_name = "Clown"
description = "Contains programs for HONK!!!"
available = TRUE
/datum/modular_computer_app_presets/civilian/mime
name = "mime"
display_name = "Mime"
description = "Contains programs for janitorial service."
available = TRUE
/datum/modular_computer_app_presets/supply
name = "supply"
display_name = "Supply"
+8
View File
@@ -69,6 +69,14 @@
if(SMES)
var/outputset = input(usr, "Enter new output level (0-[SMES.output_level_max])", "SMES Input Power Control") as num
SMES.set_output(outputset)
if(href_list["smes_in_max"])
var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_in_max"])
if(SMES)
SMES.set_input(SMES.input_level_max)
if(href_list["smes_out_max"])
var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_out_max"])
if(SMES)
SMES.set_output(SMES.output_level_max)
if(href_list["toggle_breaker"])
var/obj/machinery/power/breakerbox/toggle = SSpower.rcon_breaker_units_by_tag[href_list["toggle_breaker"]]
+1 -1
View File
@@ -846,7 +846,7 @@ Note that amputating the affected organ does in fact remove the infection from t
number_wounds += W.amount
//things tend to bleed if they are CUT OPEN
if (open && !clamped && (H && !(H.species.flags & NO_BLOOD)))
if (open && !clamped && (H && !(H.species.flags & NO_BLOOD) && !(status & ORGAN_ROBOT)))
status |= ORGAN_BLEEDING
if (istype(tendon))
+2 -2
View File
@@ -37,7 +37,7 @@ If this zlevel (or any of connected ones for multiz) doesn't have this object, y
2. Put it anywhere on the ship/sector map. It will do the rest on its own during init.
If your thing is multiz, only one is needed per multiz sector/ship.
If it's player's main base (e.g Exodus), set 'base' var to 1, so it adds itself to station_levels list.
If it's player's main base (e.g Aurora), set 'base' var to 1, so it adds itself to station_levels list.
If this place cannot be reached or left with EVA, set 'in_space' var to 0
If you want exploration shuttles (look below) to be able to dock here, set up waypoints lists.
generic_waypoints is list of landmark_tags of waypoints any shttle should be able to visit.
@@ -84,4 +84,4 @@ Lets you control shuttles that can change destinations and visit other sectors/s
2. Define a /datum/shuttle/autodock/overmap for your shuttle. Same as normal shuttle, aside from 'range' var - how many squares on overmap it can travel on its own.
3. Place console anywhere on the ship/sector. Set shuttle_tag to shuttle's name.
4. Use. You can select destinations if you're in range (on same tile by defualt) on the map and sector has waypoints lists defined
*/
*/
+1 -1
View File
@@ -18,7 +18,7 @@
/obj/machinery/power/fractal_reactor/New()
..()
if(!mapped_in)
to_world("<b><span class='alert'>WARNING:</span> Map testing power source activated at: X:[src.loc.x] Y:[src.loc.y] Z:[src.loc.z]</b>")
log_and_message_admins("<b><span class='alert'>WARNING:</span> Map testing power source activated at: X:[src.loc.x] Y:[src.loc.y] Z:[src.loc.z]</b>")
/obj/machinery/power/fractal_reactor/machinery_process()
if(!powernet && !powernet_connection_failed)
+2 -24
View File
@@ -458,7 +458,6 @@
// attack with hand - remove tube/bulb
// if hands aren't protected and the light is on, burn the player
/obj/machinery/light/attack_hand(mob/user)
add_fingerprint(user)
if(status == LIGHT_EMPTY)
@@ -477,29 +476,6 @@
shatter()
return
// make it burn hands if not wearing fire-insulated gloves
if(!stat)
var/prot = 0
var/mob/living/carbon/human/H = user
if(istype(H))
if(H.species.heat_level_1 > LIGHT_BULB_TEMPERATURE)
prot = 1
else if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.max_heat_protection_temperature && G.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE)
prot = 1
else
prot = 1
if(prot || (COLD_RESISTANCE in user.mutations))
to_chat(user, SPAN_NOTICE("You remove the light [fitting]."))
else
to_chat(user, SPAN_WARNING("You try to remove the light [fitting], but it's too hot and you don't want to burn your hand."))
return // if burned, don't remove the light
else
to_chat(user, SPAN_NOTICE("You remove the light [fitting]."))
// create a light tube/bulb item and put it in the user's hand
if(inserted_light)
var/obj/item/light/L = new inserted_light()
@@ -518,6 +494,8 @@
user.put_in_active_hand(L) //puts it in our active hand
to_chat(user, SPAN_NOTICE("You remove the light [fitting]."))
inserted_light = null
status = LIGHT_EMPTY
+1 -1
View File
@@ -945,7 +945,7 @@
return 0
//Autofire
/obj/item/gun/proc/can_autofire()
/obj/item/gun/proc/can_autofire(object, location, params)
return (can_autofire && world.time >= next_fire_time)
/obj/item/gun/proc/update_maptext()
@@ -413,10 +413,10 @@
is_wieldable = TRUE
firemodes = list(
list(mode_name="2 second burst", burst=10, burst_delay = 1, fire_delay = 20),
list(mode_name="4 second burst", burst=20, burst_delay = 1, fire_delay = 40),
list(mode_name="6 second burst", burst=30, burst_delay = 1, fire_delay = 60),
list(mode_name="point-burst auto", can_autofire = TRUE, burst = 1, fire_delay = 1, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(1.0, 1.0, 1.0, 1.0, 1.2))
list(mode_name="2 second burst", burst=10, burst_delay = 1, fire_delay = 20, fire_delay_wielded = 20),
list(mode_name="4 second burst", burst=20, burst_delay = 1, fire_delay = 40, fire_delay_wielded = 40),
list(mode_name="6 second burst", burst=30, burst_delay = 1, fire_delay = 60, fire_delay_wielded = 60),
list(mode_name="point-burst auto", can_autofire = TRUE, burst = 1, fire_delay = 1, fire_delay_wielded = 1, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(1.0, 1.0, 1.0, 1.0, 1.2))
)
needspin = FALSE
@@ -20,7 +20,7 @@
list(mode_name="semiauto", can_autofire=0, burst=1),
list(mode_name="3-round bursts", can_autofire=0, burst=3, burst_accuracy=list(1,0,0), dispersion=list(0, 10, 15)),
list(mode_name="short bursts", can_autofire=0, burst=5, burst_accuracy=list(1,0,,-1,-1), dispersion=list(5, 10, 15, 20)),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, one_hand_fa_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(5, 10, 15, 20, 25))
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, fire_delay_wielded=1, one_hand_fa_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(5, 10, 15, 20, 25))
)
//Submachine guns and personal defence weapons, go.
@@ -121,7 +121,7 @@
list(mode_name="semiauto", burst=1, fire_delay=10),
list(mode_name="3-round bursts", burst=3, burst_accuracy=list(1,0,0), dispersion=list(0, 5, 10)),
list(mode_name="short bursts", burst=5, burst_accuracy=list(1,0,0,-1,-1), dispersion=list(5, 5, 15)),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, one_hand_fa_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(5, 10, 15, 20, 25)),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, fire_delay_wielded=1, one_hand_fa_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(5, 10, 15, 20, 25)),
)
//slower to regain aim, more inaccurate if not wielding
@@ -166,7 +166,7 @@
knife_y_offset = 13
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=8),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, one_hand_fa_penalty=22, burst_accuracy = list(0,-1,-1,-1,-2,-2,-2,-3), dispersion = list(5, 5, 10, 15, 20)),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, fire_delay_wielded=1, one_hand_fa_penalty=22, burst_accuracy = list(0,-1,-1,-1,-2,-2,-2,-3), dispersion = list(5, 5, 10, 15, 20)),
)
fire_delay = 8
@@ -194,7 +194,7 @@
knife_x_offset = 23
knife_y_offset = 13
firemodes = list(mode_name="semiauto", burst=1, fire_delay=12)
firemodes = list(mode_name="semiauto", burst=1, fire_delay=12, fire_delay_wielded=12)
/obj/item/gun/projectile/automatic/rifle/carbine/update_icon()
..()
@@ -315,7 +315,7 @@
firemodes = list(
list(mode_name="short bursts", burst=5, burst_accuracy = list(1,0,0,-1,-1), dispersion = list(3, 6, 9)),
list(mode_name="long bursts", burst=8, burst_accuracy = list(1,0,0,-1,-1,-1,-2,-2), dispersion = list(8)),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, one_hand_fa_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(5, 10, 15, 20, 25))
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, fire_delay_wielded=1, one_hand_fa_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(5, 10, 15, 20, 25))
)
var/cover_open = 0
@@ -510,7 +510,7 @@
accuracy_wielded = 0
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay= 10),
list(mode_name="semiauto", burst=1, fire_delay= 10, fire_delay_wielded=10),
list(mode_name="3-round bursts", burst=3, burst_accuracy=list(0,-1,-1), dispersion=list(0, 10, 15))
)
@@ -127,9 +127,9 @@
origin_tech = null
firemodes = list(
list(mode_name="short bursts", can_autofire=0, burst=6, move_delay=8, burst_accuracy = list(0,-1,-1,-2,-2), dispersion = list(3, 6, 9)),
list(mode_name="short bursts", can_autofire=0, burst=6, move_delay=8, burst_accuracy = list(0,-1,-1,-2,-2), dispersion = list(3, 6, 9)),
list(mode_name="long bursts", can_autofire=0, burst=12, move_delay=9, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(8)),
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, one_hand_fa_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(5, 10, 15, 20, 25))
list(mode_name="full auto", can_autofire=1, burst=1, fire_delay=1, fire_delay_wielded=1, one_hand_fa_penalty=12, burst_accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(5, 10, 15, 20, 25))
)
@@ -180,7 +180,7 @@
sel_mode = 1
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0),
list(mode_name="semiauto", burst=1, fire_delay=0, fire_delay_wielded=0),
list(mode_name="3-round bursts", burst=3, burst_accuracy=list(1,0,0), dispersion=list(0, 10))
)
@@ -253,7 +253,7 @@
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
firemodes = list(
list(mode_name="semiauto", burst=1, fire_delay=0),
list(mode_name="semiauto", burst=1, fire_delay=0, fire_delay_wielded=0),
list(mode_name="2-round bursts", burst=2, burst_accuracy=list(0,-1,-1), dispersion=list(0, 8))
)
@@ -134,6 +134,9 @@
var/SM = (user == target) ? "your" : (target.name + "\'s")
if(!L)
return
if(isvaurca(target))
to_chat(usr, SPAN_WARNING("\The [src] won't pierce through [P] carapace!"))
return
if(L.rescued == TRUE)
to_chat(usr, SPAN_NOTICE("[H]'s ribs are already punctured!"))
return
@@ -240,4 +240,9 @@
/datum/design/circuit/machine/slime_extractor
name = "Slime Extractor"
req_tech = list(TECH_BIO = 2, TECH_ENGINEERING = 1, TECH_BLUESPACE = 1)
build_path = /obj/item/circuitboard/slime_extractor
build_path = /obj/item/circuitboard/slime_extractor
/datum/design/circuit/machine/iv_drip
name = "IV drip"
req_tech = list(TECH_DATA = 1, TECH_BIO = 2)
build_path = /obj/item/circuitboard/iv_drip
+1 -1
View File
@@ -99,7 +99,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("<b>[user]</b> has closed the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
SPAN_NOTICE("You have closed the maintenance hatch on [target]'s [affected.name] with \the [tool]."),)
affected.open = ORGAN_OPEN_INCISION
affected.open = ORGAN_CLOSED
/decl/surgery_step/robotics/screw_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+15 -15
View File
@@ -292,30 +292,30 @@
/datum/unit_test/map_test/all_station_areas_shall_be_on_station_zlevels
name = "MAP: Station areas shall be on station z-levels"
var/exclude = list(
var/list/exclude = list(
/area/holodeck // These are necessarily mapped on a non-station z-level so they can be copied over to the holodeck on the station z-levels
)
/datum/unit_test/map_test/all_station_areas_shall_be_on_station_zlevels/start_test()
var/checks = 0
var/failed_checks = 0
var/list/exclude_types = list()
for(var/excluded in typesof(exclude))
exclude_types += excluded
for(var/area/A as anything in the_station_areas - exclude_types)
for(var/excluded in exclude)
exclude_types += typesof(excluded)
for(var/area/A as anything in list_keys(the_station_areas))
if(A.type in exclude_types)
continue
checks++
if(!isarea(A))
log_unit_test("List 'the_station_areas' contained a non-area [A].")
var/list/turf/invalid_turfs = get_area_turfs(A, list(/proc/is_station_turf)) ^ get_area_turfs(A)
if(invalid_turfs.len)
failed_checks++
else
var/list/turf/invalid_turfs = get_area_turfs(A, list(/proc/is_station_turf)) ^ get_area_turfs(A)
if(invalid_turfs.len)
failed_checks++
var/list/failed_area_zlevels = list()
for(var/turf/T as anything in invalid_turfs)
failed_area_zlevels |= T.z
log_unit_test("Station area [A]: [invalid_turfs.len] turfs are not entirely mapped on station z-levels. Found turfs on non-station levels: [english_list(failed_area_zlevels)]")
var/list/failed_area_zlevels = list()
for(var/turf/T as anything in invalid_turfs)
failed_area_zlevels |= T.z
log_unit_test("Station area [A]: [invalid_turfs.len] turfs are not entirely mapped on station z-levels. Found turfs on non-station levels: [english_list(failed_area_zlevels)]")
if(failed_checks)
fail("\[[failed_checks] / [checks]\] Some station areas had turfs mapped outside station z-levels.")
+150
View File
@@ -35,6 +35,156 @@
-->
<div class="commit sansserif">
<h2 class="date">04 April 2022</h2>
<h3 class="author">MattAtlas updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Autofire now continues spraying even if you hold your mouse down on one tile.</li>
<li class="bugfix">Fixed a bug where unwielding and rewielding a gun may result in a slower fire delay.</li>
<li class="rscadd">Added a current date field to the Stats menu.</li>
</ul>
<h3 class="author">TheGreyWolf, mikomyazaki updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added shield diffusers. They prevent shielding on adjacent turfs, allowing e.g. the supermatter to be ejected while shielding is online.</li>
<li class="rscadd">The bubble shield generator now has the option for multi-z shields.</li>
<li class="tweak">Changed what kind of turfs hull shields make shields on. They should no longer make shields within the station/ship.</li>
</ul>
<h2 class="date">30 March 2022</h2>
<h3 class="author">Aticius updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Unathi now have two new hairstyles; A droopy dorsal frill for the edgelords and a pair of regal frills for the ostentatious.</li>
<li class="rscadd">Unathi can now select hair gradients. But only for their hair, not their facial hair.</li>
</ul>
<h3 class="author">MattAtlas updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Clicking a turf no longer has a face direction cooldown, meaning that you&#x27;ll always face the turf you click.</li>
<li class="tweak">Direction lock no longer prevents facing a different direction if your direction is changed, as an example by clicking or using control and arrow keys.</li>
<li class="rscadd">RIGs now have a special footstep sound ported from Hestia.</li>
</ul>
<h3 class="author">Vrow updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Needles aren&#x27;t able to lung rescue Vaurca.</li>
<li class="bugfix">Fixed Robotic Limbs not properly screwing the hatch closed</li>
<li class="bugfix">Fixed Robotic Limbs saying they&#x27;re bleeding if they get damaged when the hatch is unscrewed.</li>
</ul>
<h3 class="author">mikomyazaki updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Research module borgs now have a multitool to enable them to connect machines together.</li>
</ul>
<h2 class="date">21 March 2022</h2>
<h3 class="author">Forester40 updated:</h3>
<ul class="changes bgimages16">
<li class="imageadd">The right-facing worn sprite for the boatsman hat has been moved one pixel to the right.</li>
</ul>
<h3 class="author">Vrow updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes the IV drip overwriting Vaurca breath mask types.</li>
<li class="tweak">Made the mask you place over patients with the IV mask non-adjustable to prevent strange behavior</li>
</ul>
<h2 class="date">19 March 2022</h2>
<h3 class="author">SleepyGem updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">You no longer require gloves to remove light bulbs- and tubes. LED is finally here. Rejoice!</li>
</ul>
<h3 class="author">Vrow updated:</h3>
<ul class="changes bgimages16">
<li class="imagedel">Deleted old IV sprites.</li>
<li class="imageadd">Ported Eris&#x27;s medical stand sprites and intensively edited them to fit Aurora, with additional tank gauge, screen displays, and a unique tipping over animation.</li>
<li class="rscadd">IV drips are now buildable and upgradable! Science can print their circuitboards and be pestered for that sweet, sweet upgrade.</li>
<li class="rscadd">Ported Eris&#x27;s medical stand gas tank functionality and hammered it until it fit Aurora, with a unique Emergency Positive Pressure system in case the patient can&#x27;t breathe.</li>
<li class="rscadd">You can knock IV stands over, and you can also trip on them! Plus it&#x27;ll bring down whoever is wearing the IV&#x27;s mask!</li>
<li class="rscadd">You can choose which part of a body the IV needle will go into, which is subjected to attaching delays and armor checks unless the IV is upgraded.</li>
<li class="rscadd">Organized toggables into Normal Click, removables into Alt Click, and injecting IV/securing mask into Drag and Drop Radial Menus.</li>
<li class="tweak">Organized the iv_drip.dm code.</li>
<li class="tweak">Moved defines in the .../tanks/tanks.dm to .../__defines/misc.dm</li>
</ul>
<h3 class="author">mikomyazaki updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Large amounts of blood splatters should impact server performance significantly less.</li>
<li class="tweak">Simple mobs now produce fewer blood splatters each time they are hit.</li>
</ul>
<h2 class="date">18 March 2022</h2>
<h3 class="author">Arrow768 updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Changed the prompt during ccia interviews to ask if there were antag or ooc issues.</li>
</ul>
<h2 class="date">17 March 2022</h2>
<h3 class="author">Alberyk updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed being unable to select DPRA party pins.</li>
</ul>
<h2 class="date">16 March 2022</h2>
<h3 class="author">mikomyazaki updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Can now toggle atmospherics pumps &amp; filters with AltClick.</li>
<li class="tweak">RCON SMES control now includes a button to max SMES input/output without having to type in the number.</li>
<li class="tweak">Removes the Clown and Mime PDA presets from the PDA preset types list.</li>
</ul>
<h2 class="date">15 March 2022</h2>
<h3 class="author">Vrow updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Changed the Fractal Reactor message to an admin log instead a to_world message.</li>
</ul>
<h3 class="author">mikomyazaki updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed another issue with grippers not inserting their items into objects e.g. chem dispensers.</li>
<li class="bugfix">Grippers will now properly remove items they are holding if that item should have been dropped / used up / otherwise deleted.</li>
</ul>
<h2 class="date">13 March 2022</h2>
<h3 class="author">Geeves updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Technomancer Cores can now be disguised like other chameleon gear. Getting EMPd will reset it to default.</li>
</ul>
<h3 class="author">SierraKomodo updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Deaf mobs no longer see &#x27;You hear something about&#x27; messages while asleep.</li>
</ul>
<h3 class="author">mikomyazaki updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Autodrobe no longer tries to poison Vaurca by putting their mandible garments into their bag when the rest of their gear spawns, instead the mandible garment stays on their face.</li>
<li class="bugfix">Maintenance drones and subtypes will properly generate their eye icon when spawning.</li>
</ul>
<h2 class="date">12 March 2022</h2>
<h3 class="author">Aticius updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Unathi may now select most augments from the loadout.</li>
</ul>
<h3 class="author">Sparky_hotdog updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added new station bounced radio sprites, as well as some department specific ones.</li>
<li class="maptweak">Added three station bounced radios to telescience.</li>
<li class="maptweak">Removed the virology uplink phone from medical reception.</li>
</ul>
<h3 class="author">Vrow updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed Medical Scan paper not having the small puncture wound to the lungs if they&#x27;ve been rescued.</li>
<li class="bugfix">Fixed missing descriptions for the bone gel, FixOVein, and bone setter.</li>
<li class="tweak">Adjusted descriptions for the bone saw, scalpel, surgical drill, cautery, hemostat, and retractor to be less non-sensical.</li>
</ul>
<h3 class="author">mikomyazaki updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Blast doors will reopen when power is restored, if they were open before losing power.</li>
<li class="rscdel">Removed the Exodus map.</li>
</ul>
<h2 class="date">06 March 2022</h2>
<h3 class="author">Alberyk, Canon35 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added new Tajaran related accessory and beret options to the custom loadout.</li>
</ul>
<h3 class="author">Vrow updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed Invisible Blood Bags and Blood Bags not displaying their internal contents right.</li>
</ul>
<h2 class="date">05 March 2022</h2>
<h3 class="author">mikomyazaki updated:</h3>
<ul class="changes bgimages16">
+126
View File
@@ -22892,3 +22892,129 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
mikomyazaki:
- bugfix: Robots that go to cryo will now properly have their cameras removed from
the camera network list.
2022-03-06:
Alberyk, Canon35:
- rscadd: Added new Tajaran related accessory and beret options to the custom loadout.
Vrow:
- bugfix: Fixed Invisible Blood Bags and Blood Bags not displaying their internal
contents right.
2022-03-12:
Aticius:
- rscadd: Unathi may now select most augments from the loadout.
Sparky_hotdog:
- rscadd: Added new station bounced radio sprites, as well as some department specific
ones.
- maptweak: Added three station bounced radios to telescience.
- maptweak: Removed the virology uplink phone from medical reception.
Vrow:
- bugfix: Fixed Medical Scan paper not having the small puncture wound to the lungs
if they&#x27;ve been rescued.
- bugfix: Fixed missing descriptions for the bone gel, FixOVein, and bone setter.
- tweak: Adjusted descriptions for the bone saw, scalpel, surgical drill, cautery,
hemostat, and retractor to be less non-sensical.
mikomyazaki:
- bugfix: Blast doors will reopen when power is restored, if they were open before
losing power.
- rscdel: Removed the Exodus map.
2022-03-13:
Geeves:
- rscadd: Technomancer Cores can now be disguised like other chameleon gear. Getting
EMPd will reset it to default.
SierraKomodo:
- bugfix: Deaf mobs no longer see &#x27;You hear something about&#x27; messages
while asleep.
mikomyazaki:
- bugfix: Autodrobe no longer tries to poison Vaurca by putting their mandible garments
into their bag when the rest of their gear spawns, instead the mandible garment
stays on their face.
- bugfix: Maintenance drones and subtypes will properly generate their eye icon
when spawning.
2022-03-15:
Vrow:
- tweak: Changed the Fractal Reactor message to an admin log instead a to_world
message.
mikomyazaki:
- bugfix: Fixed another issue with grippers not inserting their items into objects
e.g. chem dispensers.
- bugfix: Grippers will now properly remove items they are holding if that item
should have been dropped / used up / otherwise deleted.
2022-03-16:
mikomyazaki:
- tweak: Can now toggle atmospherics pumps &amp; filters with AltClick.
- tweak: RCON SMES control now includes a button to max SMES input/output without
having to type in the number.
- tweak: Removes the Clown and Mime PDA presets from the PDA preset types list.
2022-03-17:
Alberyk:
- bugfix: Fixed being unable to select DPRA party pins.
2022-03-18:
Arrow768:
- tweak: Changed the prompt during ccia interviews to ask if there were antag or
ooc issues.
2022-03-19:
SleepyGem:
- tweak: You no longer require gloves to remove light bulbs- and tubes. LED is finally
here. Rejoice!
Vrow:
- imagedel: Deleted old IV sprites.
- imageadd: Ported Eris&#x27;s medical stand sprites and intensively edited them
to fit Aurora, with additional tank gauge, screen displays, and a unique tipping
over animation.
- rscadd: IV drips are now buildable and upgradable! Science can print their circuitboards
and be pestered for that sweet, sweet upgrade.
- rscadd: Ported Eris&#x27;s medical stand gas tank functionality and hammered it
until it fit Aurora, with a unique Emergency Positive Pressure system in case
the patient can&#x27;t breathe.
- rscadd: You can knock IV stands over, and you can also trip on them! Plus it&#x27;ll
bring down whoever is wearing the IV&#x27;s mask!
- rscadd: You can choose which part of a body the IV needle will go into, which
is subjected to attaching delays and armor checks unless the IV is upgraded.
- rscadd: Organized toggables into Normal Click, removables into Alt Click, and
injecting IV/securing mask into Drag and Drop Radial Menus.
- tweak: Organized the iv_drip.dm code.
- tweak: Moved defines in the .../tanks/tanks.dm to .../__defines/misc.dm
mikomyazaki:
- bugfix: Large amounts of blood splatters should impact server performance significantly
less.
- tweak: Simple mobs now produce fewer blood splatters each time they are hit.
2022-03-21:
Forester40:
- imageadd: The right-facing worn sprite for the boatsman hat has been moved one
pixel to the right.
Vrow:
- bugfix: Fixes the IV drip overwriting Vaurca breath mask types.
- tweak: Made the mask you place over patients with the IV mask non-adjustable to
prevent strange behavior
2022-03-30:
Aticius:
- rscadd: Unathi now have two new hairstyles; A droopy dorsal frill for the edgelords
and a pair of regal frills for the ostentatious.
- rscadd: Unathi can now select hair gradients. But only for their hair, not their
facial hair.
MattAtlas:
- tweak: Clicking a turf no longer has a face direction cooldown, meaning that you&#x27;ll
always face the turf you click.
- tweak: Direction lock no longer prevents facing a different direction if your
direction is changed, as an example by clicking or using control and arrow keys.
- rscadd: RIGs now have a special footstep sound ported from Hestia.
Vrow:
- tweak: Needles aren&#x27;t able to lung rescue Vaurca.
- bugfix: Fixed Robotic Limbs not properly screwing the hatch closed
- bugfix: Fixed Robotic Limbs saying they&#x27;re bleeding if they get damaged when
the hatch is unscrewed.
mikomyazaki:
- tweak: Research module borgs now have a multitool to enable them to connect machines
together.
2022-04-04:
MattAtlas:
- rscadd: Autofire now continues spraying even if you hold your mouse down on one
tile.
- bugfix: Fixed a bug where unwielding and rewielding a gun may result in a slower
fire delay.
- rscadd: Added a current date field to the Stats menu.
TheGreyWolf, mikomyazaki:
- rscadd: Added shield diffusers. They prevent shielding on adjacent turfs, allowing
e.g. the supermatter to be ejected while shielding is online.
- rscadd: The bubble shield generator now has the option for multi-z shields.
- tweak: Changed what kind of turfs hull shields make shields on. They should no
longer make shields within the station/ship.
-6
View File
@@ -1,6 +0,0 @@
author: Vrow
delete-after: True
changes:
- bugfix: "Fixed Invisible Blood Bags and Blood Bags not displaying their internal contents right."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 14 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 93 KiB

+12 -24
View File
@@ -23668,33 +23668,21 @@
/turf/simulated/floor/tiled/white,
/area/crew_quarters/sleep/medical)
"bbS" = (
/obj/item/device/radio{
frequency = 1487;
name = "Medbay Emergency Radio Link";
pixel_x = -5;
pixel_y = 5
},
/obj/item/device/radio{
frequency = 1487;
name = "Medbay Emergency Radio Link";
pixel_x = 5;
pixel_y = 5
},
/obj/item/device/radio{
frequency = 1487;
name = "Medbay Emergency Radio Link";
pixel_x = 5;
pixel_y = -5
},
/obj/item/device/radio{
frequency = 1487;
name = "Medbay Emergency Radio Link";
pixel_x = -5;
pixel_y = -5
},
/obj/effect/floor_decal/corner/white/diagonal,
/obj/structure/table/standard,
/obj/machinery/firealarm/south,
/obj/item/device/radio/med{
name = "Medbay Emergency Radio Link"
},
/obj/item/device/radio/med{
name = "Medbay Emergency Radio Link"
},
/obj/item/device/radio/med{
name = "Medbay Emergency Radio Link"
},
/obj/item/device/radio/med{
name = "Medbay Emergency Radio Link"
},
/turf/simulated/floor/tiled,
/area/medical/medbay4)
"bbT" = (
+25 -25
View File
@@ -2811,10 +2811,6 @@
/area/security/main)
"afx" = (
/obj/structure/table/standard,
/obj/item/device/radio,
/obj/item/device/radio,
/obj/item/device/radio,
/obj/item/device/radio,
/obj/effect/floor_decal/corner/blue{
dir = 9
},
@@ -2822,8 +2818,11 @@
dir = 5
},
/obj/machinery/firealarm/north,
/obj/item/device/radio,
/obj/item/device/radio,
/obj/item/device/radio/sec,
/obj/item/device/radio/sec,
/obj/item/device/radio/sec,
/obj/item/device/radio/sec,
/obj/item/device/radio/sec,
/turf/simulated/floor/tiled,
/area/security/main)
"afy" = (
@@ -7616,15 +7615,15 @@
/area/engineering/atmos/storage)
"aoV" = (
/obj/structure/table/standard,
/obj/item/device/radio/off,
/obj/item/device/radio/off,
/obj/item/device/radio/off,
/obj/effect/floor_decal/corner/blue{
dir = 1
},
/obj/effect/floor_decal/corner/yellow{
dir = 4
},
/obj/item/device/radio/eng,
/obj/item/device/radio/eng,
/obj/item/device/radio/eng,
/turf/simulated/floor/tiled,
/area/engineering/atmos/storage)
"aoW" = (
@@ -19222,12 +19221,12 @@
/area/engineering/storage_eva)
"aHA" = (
/obj/structure/table/standard,
/obj/item/device/radio/off,
/obj/item/device/radio/off,
/obj/item/device/radio/off,
/obj/item/device/radio/off,
/obj/item/device/radio/off,
/obj/item/device/flashlight/heavy,
/obj/item/device/radio/eng,
/obj/item/device/radio/eng,
/obj/item/device/radio/eng,
/obj/item/device/radio/eng,
/obj/item/device/radio/eng,
/turf/simulated/floor/tiled,
/area/engineering/storage_eva)
"aHB" = (
@@ -38717,15 +38716,6 @@
dir = 8
},
/obj/structure/table/standard,
/obj/item/device/radio{
anchored = 1;
canhear_range = 1;
frequency = 1487;
icon_state = "red_phone";
name = "Virology Lab Emergency Phone";
pixel_x = 8;
pixel_y = -2
},
/obj/effect/floor_decal/corner/grey/diagonal,
/turf/simulated/floor/tiled/white,
/area/medical/reception)
@@ -40333,7 +40323,7 @@
c_tag = "Central Corridor";
dir = 1
},
/obj/machinery/computer/HolodeckControl/Exodus{
/obj/machinery/computer/HolodeckControl/Aurora{
pixel_y = -32
},
/turf/simulated/floor/tiled,
@@ -62384,6 +62374,16 @@
},
/turf/simulated/floor/tiled/white,
/area/crew_quarters/kitchen)
"ikn" = (
/obj/structure/table/standard,
/obj/effect/floor_decal/corner_wide/mauve{
dir = 6
},
/obj/item/device/radio/sci,
/obj/item/device/radio/sci,
/obj/item/device/radio/sci,
/turf/simulated/floor/tiled/white,
/area/rnd/telesci)
"ikR" = (
/obj/random/gloves,
/turf/simulated/floor/plating,
@@ -93678,7 +93678,7 @@ aYh
aEK
auX
bIN
azR
ikn
azR
ciy
aCU
-79
View File
@@ -1,79 +0,0 @@
// This file is not included because this map does not work at the moment.
/datum/map/exodus
name = "Exodus"
full_name = "NSS Exodus"
path = "exodus"
lobby_icons = list('icons/misc/titlescreens/aurora/humans.dmi', 'icons/misc/titlescreens/aurora/synthetics.dmi', 'icons/misc/titlescreens/aurora/king_of_the_world.dmi')
lobby_transitions = 10 SECONDS
station_name = "NSS Exodus"
station_short = "Exodus"
dock_name = "NTCC Odin"
dock_short = "Odin"
boss_name = "Central Command"
boss_short = "CentCom"
company_name = "NanoTrasen"
company_short = "NT"
station_networks = list(
NETWORK_CIVILIAN_EAST,
NETWORK_CIVILIAN_WEST,
NETWORK_COMMAND,
NETWORK_ENGINE,
NETWORK_ENGINEERING,
NETWORK_ENGINEERING_OUTPOST,
NETWORK_STATION,
NETWORK_MEDICAL,
NETWORK_MINE,
NETWORK_RESEARCH,
NETWORK_RESEARCH_OUTPOST,
NETWORK_ROBOTS,
NETWORK_PRISON,
NETWORK_SECURITY
)
shuttle_docked_message = "The scheduled Crew Transfer Shuttle to %dock% has docked with the station. It will depart in approximately %ETA%."
shuttle_leaving_dock = "The Crew Transfer Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock%."
shuttle_called_message = "A crew transfer to %dock% has been scheduled. The shuttle has been called. It will arrive in approximately %ETA%."
shuttle_recall_message = "The scheduled crew transfer has been cancelled."
emergency_shuttle_docked_message = "The Emergency Shuttle has docked with the station. You have approximately %ETA% to board the Emergency Shuttle."
emergency_shuttle_leaving_dock = "The Emergency Shuttle has left the station. Estimate %ETA% until the shuttle docks at %dock%."
emergency_shuttle_recall_message = "The emergency shuttle has been recalled."
emergency_shuttle_called_message = "An emergency evacuation shuttle has been called. It will arrive in approximately %ETA%."
evac_controller_type = /datum/evacuation_controller/shuttle
station_levels = list(1)
admin_levels = list(2)
contact_levels = list(1, 5)
player_levels = list(1, 3, 4, 5, 6)
accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = 60)
meteor_levels = list(1)
map_shuttles = list(
/datum/shuttle/autodock/ferry/escape_pod/pod/escape_pod1,
/datum/shuttle/autodock/ferry/escape_pod/pod/escape_pod2,
/datum/shuttle/autodock/ferry/escape_pod/pod/escape_pod3,
/datum/shuttle/autodock/ferry/emergency/exodus,
/datum/shuttle/autodock/ferry/supply/exodus,
/datum/shuttle/autodock/multi/admin,
/datum/shuttle/autodock/ferry/autoreturn/ccia,
/datum/shuttle/autodock/ferry/engi,
/datum/shuttle/autodock/ferry/mining,
/datum/shuttle/autodock/ferry/research_exodus,
/datum/shuttle/autodock/ferry/specops/ert_exodus,
/datum/shuttle/autodock/multi/antag/skipjack_exodus,
/datum/shuttle/autodock/multi/antag/merc_exodus,
/datum/shuttle/autodock/ferry/legion_exodus,
/datum/shuttle/autodock/ferry/merchant/exodus
)
warehouse_basearea = /area/quartermaster/storage
/datum/map/exodus/generate_asteroid()
new /datum/random_map/automata/cave_system(null, 13, 32, 5, 217, 223)
new /datum/random_map/noise/ore(null, 13, 32, 5, 217, 223)
/datum/map/exodus/finalize_load()
world.maxz++
-12
View File
@@ -1,12 +0,0 @@
/area/gateway
name = "Gateway"
icon_state = "teleporter"
/area/medical/surgery2
name = "Operating Theatre 2"
icon_state = "surgery"
/area/AIsattele
name = "AI Satellite Teleporter Room"
icon_state = "teleporter"
ambience = AMBIENCE_AI
-74
View File
@@ -1,74 +0,0 @@
/datum/map/exodus
holodeck_programs = list(
"emptycourt" = new/datum/holodeck_program(/area/holodeck/source_emptycourt,
list('sound/music/THUNDERDOME.ogg')
),
"boxingcourt" = new/datum/holodeck_program(/area/holodeck/source_boxingcourt,
list('sound/music/THUNDERDOME.ogg')
),
"basketball" = new/datum/holodeck_program(/area/holodeck/source_basketball,
list('sound/music/THUNDERDOME.ogg')
),
"thunderdomecourt" = new/datum/holodeck_program(/area/holodeck/source_thunderdomecourt,
list('sound/music/THUNDERDOME.ogg')
),
"beach" = new/datum/holodeck_program(/area/holodeck/source_beach),
"desert" = new/datum/holodeck_program(/area/holodeck/source_desert,
list(
'sound/effects/wind/wind_2_1.ogg',
'sound/effects/wind/wind_2_2.ogg',
'sound/effects/wind/wind_3_1.ogg',
'sound/effects/wind/wind_4_1.ogg',
'sound/effects/wind/wind_4_2.ogg',
'sound/effects/wind/wind_5_1.ogg'
)
),
"snowfield" = new/datum/holodeck_program(/area/holodeck/source_snowfield,
list(
'sound/effects/wind/wind_2_1.ogg',
'sound/effects/wind/wind_2_2.ogg',
'sound/effects/wind/wind_3_1.ogg',
'sound/effects/wind/wind_4_1.ogg',
'sound/effects/wind/wind_4_2.ogg',
'sound/effects/wind/wind_5_1.ogg'
)
),
"space" = new/datum/holodeck_program(/area/holodeck/source_space,
list(
'sound/ambience/ambispace.ogg',
'sound/music/main.ogg',
'sound/music/space.ogg',
'sound/music/traitor.ogg'
)
),
"picnicarea" = new/datum/holodeck_program(/area/holodeck/source_picnicarea,
list('sound/music/title2.ogg')
),
"theatre" = new/datum/holodeck_program(/area/holodeck/source_theatre),
"meetinghall" = new/datum/holodeck_program(/area/holodeck/source_meetinghall),
"courtroom" = new/datum/holodeck_program(/area/holodeck/source_courtroom,
list('sound/music/traitor.ogg')
),
"burntest" = new/datum/holodeck_program(/area/holodeck/source_burntest, list()),
"wildlifecarp" = new/datum/holodeck_program(/area/holodeck/source_wildlife, list()),
"turnoff" = new/datum/holodeck_program(/area/holodeck/source_plating, list())
)
holodeck_supported_programs = list(
"Empty Court" = "emptycourt",
"Basketball Court" = "basketball",
"Thunderdome Court" = "thunderdomecourt",
"Boxing Ring" = "boxingcourt",
"Beach" = "beach",
"Desert" = "desert",
"Space" = "space",
"Picnic Area" = "picnicarea",
"Snow Field" = "snowfield",
"Theatre" = "theatre",
"Meeting Hall" = "meetinghall",
"Courtroom" = "courtroom"
)
holodeck_restricted_programs = list(
"Atmospheric Burn Simulation" = "burntest",
"Wildlife Simulation" = "wildlifecarp"
)
-411
View File
@@ -1,411 +0,0 @@
/datum/shuttle/autodock/ferry/escape_pod/pod
category = /datum/shuttle/autodock/ferry/escape_pod/pod
sound_takeoff = 'sound/effects/rocket.ogg'
sound_landing = 'sound/effects/rocket_backwards.ogg'
warmup_time = 10
/obj/effect/shuttle_landmark/escape_pod/start
name = "Docked"
base_turf = /turf/simulated/floor/reinforced/airless
/obj/effect/shuttle_landmark/escape_pod/transit
name = "In transit"
/obj/effect/shuttle_landmark/escape_pod/out
name = "Escaped"
#define EXODUS_ESCAPE_POD(NUMBER) \
/datum/shuttle/autodock/ferry/escape_pod/pod/escape_pod##NUMBER { \
name = "Escape Pod " + #NUMBER; \
shuttle_area = /area/shuttle/escape_pod/pod##NUMBER; \
location = 0; \
dock_target = "escape_pod_" + #NUMBER; \
arming_controller = "escape_pod_"+ #NUMBER +"_berth"; \
waypoint_station = "escape_pod_"+ #NUMBER +"_start"; \
landmark_transition = "escape_pod_"+ #NUMBER +"_interim"; \
waypoint_offsite = "escape_pod_"+ #NUMBER +"_out"; \
} \
/obj/effect/shuttle_landmark/escape_pod/start/pod##NUMBER { \
landmark_tag = "escape_pod_"+ #NUMBER +"_start"; \
docking_controller = "escape_pod_"+ #NUMBER +"_berth"; \
} \
/obj/effect/shuttle_landmark/escape_pod/out/pod##NUMBER { \
landmark_tag = "escape_pod_"+ #NUMBER +"_out"; \
} \
/obj/effect/shuttle_landmark/escape_pod/transit/pod##NUMBER { \
landmark_tag = "escape_pod_"+ #NUMBER +"_interim"; \
}
EXODUS_ESCAPE_POD(1)
EXODUS_ESCAPE_POD(2)
EXODUS_ESCAPE_POD(3)
//-// Transfer Shuttle //-//
/datum/shuttle/autodock/ferry/emergency/exodus
name = "Escape Shuttle"
location = 1
move_time = 20
warmup_time = 10
shuttle_area = /area/shuttle/escape
dock_target = "escape_shuttle"
waypoint_station = "nav_emergency_dock"
landmark_transition = "nav_emergency_interim"
waypoint_offsite = "nav_emergency_start"
/obj/effect/shuttle_landmark/emergency/start
name = "Escape Shuttle Centcom Dock"
landmark_tag = "nav_emergency_start"
docking_controller = "centcom_dock"
base_turf = /turf/unsimulated/floor/plating
/obj/effect/shuttle_landmark/emergency/interim
name = "In Transit"
landmark_tag = "nav_emergency_interim"
/obj/effect/shuttle_landmark/emergency/dock
name = "Escape Shuttle Dock"
landmark_tag = "nav_emergency_dock"
docking_controller = "escape_dock"
landmark_flags = SLANDMARK_FLAG_AUTOSET
//-// Supply Shuttle //-//
/datum/shuttle/autodock/ferry/supply/exodus
name = "Supply Shuttle"
location = 1
shuttle_area = /area/supply/dock
dock_target = "supply_shuttle"
waypoint_station = "nav_supply_dock"
waypoint_offsite = "nav_supply_start"
/obj/effect/shuttle_landmark/supply/start
name = "Supply Centcom Dock"
landmark_tag = "nav_supply_start"
base_turf = /turf/unsimulated/floor/plating
/obj/effect/shuttle_landmark/supply/dock
name = "Supply Shuttle Dock"
landmark_tag = "nav_supply_dock"
docking_controller = "cargo_bay"
landmark_flags = SLANDMARK_FLAG_AUTOSET
// Admin Shuttle
/datum/shuttle/autodock/multi/admin
name = "Crescent Shuttle"
current_location = "nav_admin_start"
warmup_time = 10
shuttle_area = /area/shuttle/administration
dock_target = "admin_shuttle"
destination_tags = list(
"nav_admin_start",
"nav_admin_command",
"nav_admin_green"
)
/obj/effect/shuttle_landmark/admin/start
name = "Crescent Shuttle Base"
landmark_tag = "nav_admin_start"
docking_controller = "admin_shuttle_bay"
base_turf = /turf/unsimulated/floor/plating
/obj/effect/shuttle_landmark/admin/command
name = "Command Surface Dock"
landmark_tag = "nav_admin_command"
docking_controller = "admin_shuttle_dock_airlock"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/admin/green
name = "Emergency Services Dock"
landmark_tag = "nav_admin_green"
docking_controller = "green_dock_north"
landmark_flags = SLANDMARK_FLAG_AUTOSET
// CCIA Shuttle
/datum/shuttle/autodock/ferry/autoreturn/ccia
name = "Agent Shuttle"
location = 1
warmup_time = 10
shuttle_area = /area/shuttle/transport1
dock_target = "centcom_shuttle"
waypoint_station = "nav_ccia_dock"
waypoint_offsite = "nav_ccia_start"
category = /datum/shuttle/autodock/ferry/autoreturn
/obj/effect/shuttle_landmark/ccia/start
name = "Agent Shuttle Base"
landmark_tag = "nav_ccia_start"
docking_controller = "centcom_shuttle_bay"
base_turf = /turf/unsimulated/floor/plating
/obj/effect/shuttle_landmark/ccia/dock
name = "Agent Shuttle Dock"
landmark_tag = "nav_ccia_dock"
docking_controller = "centcom_shuttle_dock_airlock"
landmark_flags = SLANDMARK_FLAG_AUTOSET
// Engineering Shuttle
/datum/shuttle/autodock/ferry/engi
name = "Engineering Shuttle"
location = 0
warmup_time = 10
shuttle_area = /area/shuttle/constructionsite
dock_target = "engineering_shuttle"
waypoint_station = "nav_engi_start"
waypoint_offsite = "nav_engi_dock"
/obj/effect/shuttle_landmark/engi/start
name = "Engineering Shuttle Exodus"
landmark_tag = "nav_engi_start"
docking_controller = "engineering_dock_airlock"
/obj/effect/shuttle_landmark/engi/dock
name = "Engineering Shuttle Asteroid"
landmark_tag = "nav_engi_dock"
docking_controller = "edock_airlock"
landmark_flags = SLANDMARK_FLAG_AUTOSET
// Mining Shuttle
/datum/shuttle/autodock/ferry/mining
name = "Mining Shuttle"
location = 0
warmup_time = 10
shuttle_area = /area/shuttle/mining
dock_target = "mining_shuttle"
waypoint_station = "nav_mining_start"
waypoint_offsite = "nav_mining_dock"
/obj/effect/shuttle_landmark/mining/start
name = "Mining Shuttle Exodus"
landmark_tag = "nav_mining_start"
docking_controller = "mining_dock_airlock"
/obj/effect/shuttle_landmark/mining/dock
name = "Mining Shuttle Asteroid"
landmark_tag = "nav_mining_dock"
docking_controller = "mining_outpost_airlock"
landmark_flags = SLANDMARK_FLAG_AUTOSET
// Research Shuttle
/datum/shuttle/autodock/ferry/research_exodus
name = "Research Shuttle"
location = 0
warmup_time = 10
shuttle_area = /area/shuttle/research
dock_target = "research_shuttle"
waypoint_station = "nav_research_start"
waypoint_offsite = "nav_research_dock"
/obj/effect/shuttle_landmark/research_exodus/start
name = "Research Shuttle Exodus"
landmark_tag = "nav_research_start"
docking_controller = "research_dock_airlock"
/obj/effect/shuttle_landmark/research_exodus/dock
name = "Research Shuttle Asteroid"
landmark_tag = "nav_research_dock"
docking_controller = "research_outpost_airlock"
landmark_flags = SLANDMARK_FLAG_AUTOSET
// ERT Shuttle (the NT one)
/datum/shuttle/autodock/ferry/specops/ert_exodus
name = "Phoenix Shuttle"
location = 1
warmup_time = 10
shuttle_area = /area/shuttle/specops
dock_target = "specops_shuttle_port"
waypoint_station = "nav_ert_dock"
waypoint_offsite = "nav_ert_start"
/obj/effect/shuttle_landmark/ert/start
name = "Phoenix Base"
landmark_tag = "nav_ert_start"
docking_controller = "specops_centcom_dock"
base_turf = /turf/unsimulated/floor/plating
/obj/effect/shuttle_landmark/ert/dock
name = "ERT Dock"
landmark_tag = "nav_ert_dock"
docking_controller = "specops_dock_airlock"
special_dock_targets = list("Phoenix Shuttle" = "specops_shuttle_fore")
landmark_flags = SLANDMARK_FLAG_AUTOSET
//Skipjack.
/datum/shuttle/autodock/multi/antag/skipjack_exodus
name = "Skipjack"
current_location = "nav_skipjack_start"
landmark_transition = "nav_skipjack_interim"
warmup_time = 10
move_time = 75
shuttle_area = /area/shuttle/skipjack
destination_tags = list(
"nav_skipjack_start",
"nav_skipjack_northeast_solars",
"nav_skipjack_northwest_solars",
"nav_skipjack_southeast_solars",
"nav_skipjack_southwest_solars",
"nav_skipjack_mining_asteroid"
)
landmark_transition = "nav_skipjack_interim"
announcer = "NDV Icarus"
arrival_message = "Attention, we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not."
departure_message = "Attention, your guests are pulling away - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip."
/obj/effect/shuttle_landmark/skipjack/start
name = "Pirate Hideout"
landmark_tag = "nav_skipjack_start"
/obj/effect/shuttle_landmark/skipjack/interim
name = "In Transit"
landmark_tag = "nav_skipjack_interim"
/obj/effect/shuttle_landmark/skipjack/northeast_solars
name = "North-East Solars"
landmark_tag = "nav_skipjack_northeast_solars"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/skipjack/northwest_solars
name = "North-West Solars"
landmark_tag = "nav_skipjack_northwest_solars"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/skipjack/southeast_solars
name = "South-East Solars"
landmark_tag = "nav_skipjack_southeast_solars"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/skipjack/southwest_solars
name = "South-West Solars"
landmark_tag = "nav_skipjack_southwest_solars"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/skipjack/mining_asteroid
name = "Mining Asteroid"
landmark_tag = "nav_skipjack_mining_asteroid"
landmark_flags = SLANDMARK_FLAG_AUTOSET
//Nuke Ops shuttle.
/datum/shuttle/autodock/multi/antag/merc_exodus
name = "Mercenary Shuttle"
current_location = "nav_merc_start"
landmark_transition = "nav_merc_interim"
dock_target = "merc_shuttle"
warmup_time = 10
move_time = 75
shuttle_area = /area/shuttle/mercenary
destination_tags = list(
"nav_merc_dock",
"nav_merc_start",
"nav_merc_northwest",
"nav_merc_north",
"nav_merc_northeast",
"nav_merc_southwest",
"nav_merc_south",
"nav_merc_southeast",
"nav_merc_telecomms",
"nav_merc_mining_asteroid"
)
landmark_transition = "nav_merc_interim"
announcer = "NDV Icarus"
arrival_message = "Attention, you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors."
departure_message = "Attention, your visitors are on their way out of the system, burning delta-v like it's nothing. Good riddance."
/obj/effect/shuttle_landmark/merc/start
name = "Mercenary Base"
landmark_tag = "nav_merc_start"
docking_controller = "merc_base"
/obj/effect/shuttle_landmark/merc/interim
name = "In Transit"
landmark_tag = "nav_merc_interim"
/obj/effect/shuttle_landmark/merc/dock
name = "Station Dock"
landmark_tag = "nav_merc_dock"
docking_controller = "nuke_shuttle_dock_airlock"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/merc/northwest
name = "North-West of the Station"
landmark_tag = "nav_merc_northwest"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/merc/north
name = "North of the Station"
landmark_tag = "nav_merc_north"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/merc/northeast
name = "North-East of the Station"
landmark_tag = "nav_merc_northeast"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/merc/southwest
name = "South-West of the Station"
landmark_tag = "nav_merc_southwest"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/merc/south
name = "South of the Station"
landmark_tag = "nav_merc_south"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/merc/southeast
name = "South-East of the Station"
landmark_tag = "nav_merc_southeast"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/merc/telecomms
name = "Telecommunications"
landmark_tag = "nav_merc_telecomms"
landmark_flags = SLANDMARK_FLAG_AUTOSET
/obj/effect/shuttle_landmark/merc/mining_asteroid
name = "Mining Asteroid"
landmark_tag = "nav_merc_mining_asteroid"
landmark_flags = SLANDMARK_FLAG_AUTOSET
// TCFL Shuttle
/datum/shuttle/autodock/ferry/legion_exodus
name = "Legion Shuttle"
location = 1
warmup_time = 10
shuttle_area = /area/shuttle/legion
dock_target = "Legion Shuttle"
waypoint_station = "nav_legion_dock"
waypoint_offsite = "nav_legion_start"
/obj/effect/shuttle_landmark/legion_exodus/start
name = "Legion Base"
landmark_tag = "nav_legion_start"
base_turf = /turf/unsimulated/floor/plating
/obj/effect/shuttle_landmark/legion_exodus/dock
name = "Legion Station"
landmark_tag = "nav_legion_dock"
landmark_flags = SLANDMARK_FLAG_AUTOSET
// Merchant Shuttle
/datum/shuttle/autodock/ferry/merchant/exodus
name = "Merchant Shuttle"
location = 1
warmup_time = 10
shuttle_area = /area/shuttle/merchant
dock_target = "merchant_shuttle"
waypoint_station = "nav_merchant_dock"
waypoint_offsite = "nav_merchant_start"
/obj/effect/shuttle_landmark/merchant/start
name = "Merchant Shuttle Base"
landmark_tag = "nav_merchant_start"
docking_controller = "merchant_station"
/obj/effect/shuttle_landmark/merchant/dock
name = "Merchant Shuttle Dock"
landmark_tag = "nav_merchant_dock"
docking_controller = "merchant_shuttle_dock"
landmark_flags = SLANDMARK_FLAG_AUTOSET
-34
View File
@@ -1,34 +0,0 @@
/datum/map/exodus
ut_environ_exempt_areas = list(/area/space
,/area/solar
,/area/shuttle
,/area/holodeck
,/area/supply/station
,/area/tdome
,/area/centcom
,/area/antag
,/area/beach
,/area/prison
,/area/supply/dock
,/area/turbolift
,/area/mine
)
ut_apc_exempt_areas = list(/area/construction
,/area/medical/genetics
)
ut_atmos_exempt_areas = list(/area/maintenance
,/area/storage
,/area/engineering/atmos/storage
,/area/rnd/test_area
,/area/construction
,/area/server
,/area/security/nuke_storage
,/area/tcommsat/chamber
,/area/bridge/aibunker
,/area/engineering/cooling
,/area/outpost/research/emergency_storage
)
/datum/unit_test/map_test/all_station_areas_shall_be_on_station_zlevels/start_test()
pass("Exodus skips this test.")
return 1
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+7 -5
View File
@@ -9,7 +9,7 @@
<b>Detected SMES units with RCON support:</b><br>
{{for data.smes_info}}
<div class = "item">
<div class="itemLabel">
<div class="itemLabel">
{{:value.RCON_tag}}
</div>
<div class="itemContent">
@@ -31,14 +31,16 @@
<td>
{{:helper.link('', 'power', { 'smes_in_toggle' : value.RCON_tag})}}
{{:helper.link('', 'pencil', { 'smes_in_set' : value.RCON_tag})}}
{{:helper.link('', 'arrowthickstop-1-e', { 'smes_in_max' : value.RCON_tag})}}
<tr><td>
Output: {{:value.output_val}}W - {{:value.output_set ? "ONLINE" : "OFFLINE"}}
<td>
{{:helper.link('', 'power', { 'smes_out_toggle' : value.RCON_tag})}}
{{:helper.link('', 'pencil', { 'smes_out_set' : value.RCON_tag})}}
{{:helper.link('', 'arrowthickstop-1-e', { 'smes_out_max' : value.RCON_tag})}}
<tr><td>
Output Load:
Output Load:
<td>
{{:value.output_load}}W
{{/if}}
@@ -55,7 +57,7 @@
<b>Detected Breaker Boxes with RCON support:</b><br>
{{for data.breaker_info}}
<div class = "item">
<div class="itemLabel">
<div class="itemLabel">
{{:value.RCON_tag}}
</div>
<div class="itemContent">
@@ -70,4 +72,4 @@
{{empty}}
No connected Breaker Boxes detected!
{{/for}}
{{/if}}
{{/if}}
Binary file not shown.
-12
View File
@@ -1,12 +0,0 @@
@echo off
cd ../../maps/exodus
for /R %%f in (*.dmm) do copy "%%f" "%%f.backup"
cls
echo All dmm files in the maps/exodus directory have been backed up.
echo Now you can make your changes...
echo ---
echo Remember to run mapmerge.bat just before you commit your changes!
echo ---
pause
-11
View File
@@ -1,11 +0,0 @@
cd ../../maps/exodus
for f in *.dmm; do
cp -- "$f" "${f%.dmm}.dmm.backup"
done
echo "All dmm files in the maps/exodus directory have been backed up."
echo "Now you can make your changes."
echo "---"
echo "Remember to run mapmerge.sh just before you commit your changes!"
echo "---"
+1 -1
View File
@@ -1,5 +1,5 @@
pygit2==1.4.0
bidict==0.21.2
Pillow==9.0.0
Pillow==9.0.1
PyYAML==5.4.1
beautifulsoup4==4.10.0