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
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -17,7 +17,6 @@ env:
|
||||
matrix:
|
||||
- USE_MAP=aurora
|
||||
- USE_MAP=runtime
|
||||
- USE_MAP=exodus
|
||||
|
||||
cache:
|
||||
directories:
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
#define DEFAULT_MAP "exodus"
|
||||
@@ -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"))
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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>"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"]]
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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'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'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'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'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'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't breathe.</li>
|
||||
<li class="rscadd">You can knock IV stands over, and you can also trip on them! Plus it'll bring down whoever is wearing the IV'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 & 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 'You hear something about' 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'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">
|
||||
|
||||
@@ -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'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 'You hear something about' 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 & 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'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'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't breathe.
|
||||
- rscadd: You can knock IV stands over, and you can also trip on them! Plus it'll
|
||||
bring down whoever is wearing the IV'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'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't able to lung rescue Vaurca.
|
||||
- bugfix: Fixed Robotic Limbs not properly screwing the hatch closed
|
||||
- bugfix: Fixed Robotic Limbs saying they'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.
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
author: Vrow
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- bugfix: "Fixed Invisible Blood Bags and Blood Bags not displaying their internal contents right."
|
||||
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 465 B |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 93 KiB |
@@ -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" = (
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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++
|
||||
@@ -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
|
||||
@@ -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"
|
||||
)
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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}}
|
||||
|
||||
@@ -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
|
||||
@@ -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,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
|
||||
|
||||