diff --git a/.github/workflows/render_nanomaps.yml b/.github/workflows/render_nanomaps.yml
new file mode 100644
index 0000000000..6b58c9e8e0
--- /dev/null
+++ b/.github/workflows/render_nanomaps.yml
@@ -0,0 +1,35 @@
+# GitHub action to autorender nanomaps outside the game
+# This kills off the awful verb we have that takes a full 50 seconds and hangs the whole server
+# The file names and locations are VERY important here
+# DO NOT EDIT THIS UNLESS YOU KNOW WHAT YOU ARE DOING
+# -aa
+name: 'Render Nanomaps'
+on:
+ push:
+ branches: master
+ paths:
+ - 'maps/**'
+
+jobs:
+ generate_maps:
+ name: 'Generate NanoMaps'
+ runs-on: ubuntu-18.04
+ steps:
+ - name: 'Update Branch'
+ uses: actions/checkout@v2
+ with:
+ fetch-depth: 1
+
+ - name: 'Generate Maps'
+ run: './tools/github-actions/nanomap-renderer-invoker.sh'
+
+ - name: 'Commit Maps'
+ run: |
+ git config --local user.email "action@github.com"
+ git config --local user.name "NanoMap Generation"
+ git pull origin master
+ git commit -m "NanoMap Auto-Update (`date`)" -a || true
+ - name: 'Push Maps'
+ uses: ad-m/github-push-action@master
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/README.md b/README.md
index 1f00987671..77f9127bf4 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,8 @@ Going to make a Pull Request? Make sure you read the [CONTRIBUTING.md](.github/C
CHOMPStation is a fork of the Yawn-wider code branch which is a fork of the VOREStation code branch which is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, for the game Space Station 13.
+
+
---
### LICENSE
diff --git a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm
index fb686820ee..f95b613466 100644
--- a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm
@@ -232,7 +232,7 @@
// 0 amount = 0 means ejecting a full stack; -1 means eject everything
/obj/machinery/atmospherics/binary/algae_farm/proc/eject_materials(var/material_name, var/amount)
var/recursive = amount == -1 ? 1 : 0
- var/material/matdata = get_material_by_name(material_name)
+ var/datum/material/matdata = get_material_by_name(material_name)
var/stack_type = matdata.stack_type
var/obj/item/stack/material/S = new stack_type(loc)
if(amount <= 0)
@@ -266,7 +266,7 @@
to_chat(user, "\The [src] cannot hold more [S.name].")
return 1
-/material/algae
+/datum/material/algae
name = MAT_ALGAE
stack_type = /obj/item/stack/material/algae
icon_colour = "#557722"
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index dd38dae3ca..e960d36fa7 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -13,6 +13,7 @@
desc = "A one-way air valve that can be used to regulate input or output pressure, and flow rate. Does not require power."
use_power = USE_POWER_OFF
+ interact_offline = TRUE
var/unlocked = 0 //If 0, then the valve is locked closed, otherwise it is open(-able, it's a one-way valve so it closes if gas would flow backwards).
var/target_pressure = ONE_ATMOSPHERE
@@ -216,7 +217,7 @@
tgui_interact(user)
/obj/machinery/atmospherics/binary/passive_gate/tgui_interact(mob/user, datum/tgui/ui)
- if(stat & (BROKEN|NOPOWER))
+ if(stat & BROKEN)
return FALSE
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm
index 56171a0880..00e2f9d5dc 100644
--- a/code/ATMOSPHERICS/components/omni_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm
@@ -33,8 +33,10 @@
return ..()
/obj/machinery/atmospherics/omni/atmos_filter/sort_ports()
+ var/any_updated = FALSE
for(var/datum/omni_port/P in ports)
if(P.update)
+ any_updated = TRUE
if(output == P)
output = null
if(input == P)
@@ -50,6 +52,8 @@
output = P
if(ATM_O2 to ATM_N2O)
atmos_filters += P
+ if(any_updated)
+ rebuild_filtering_list()
/obj/machinery/atmospherics/omni/atmos_filter/error_check()
if(!input || !output || !atmos_filters)
@@ -231,7 +235,6 @@
target_port.mode = mode
if(target_port.mode != previous_mode)
handle_port_change(target_port)
- rebuild_filtering_list()
else
return
else
diff --git a/code/ATMOSPHERICS/pipes/tank.dm b/code/ATMOSPHERICS/pipes/tank.dm
index 54f90d9521..a893facff6 100644
--- a/code/ATMOSPHERICS/pipes/tank.dm
+++ b/code/ATMOSPHERICS/pipes/tank.dm
@@ -70,10 +70,6 @@
if(istype(W, /obj/item/device/pipe_painter))
return
- if(istype(W, /obj/item/device/analyzer) && in_range(user, src))
- var/obj/item/device/analyzer/A = W
- A.analyze_gases(src, user)
-
/obj/machinery/atmospherics/pipe/tank/air
name = "Pressure Tank (Air)"
icon_state = "air_map"
diff --git a/code/__defines/misc_vr.dm b/code/__defines/misc_vr.dm
index 57c651c195..46d8a347e8 100644
--- a/code/__defines/misc_vr.dm
+++ b/code/__defines/misc_vr.dm
@@ -63,4 +63,5 @@
#define MAT_TITANIUMGLASS "ti-glass"
#define MAT_PLASTITANIUM "plastitanium"
+#define MAT_PLASTITANIUMHULL "plastitanium hull"
#define MAT_PLASTITANIUMGLASS "plastitanium glass"
\ No newline at end of file
diff --git a/code/__defines/pda.dm b/code/__defines/pda.dm
new file mode 100644
index 0000000000..c5d32f03ba
--- /dev/null
+++ b/code/__defines/pda.dm
@@ -0,0 +1,3 @@
+#define PDA_APP_UPDATE 0
+#define PDA_APP_NOUPDATE 1
+#define PDA_APP_UPDATE_SLOW 2
diff --git a/code/_global_vars/religion.dm b/code/_global_vars/religion.dm
new file mode 100644
index 0000000000..7dab008b19
--- /dev/null
+++ b/code/_global_vars/religion.dm
@@ -0,0 +1,8 @@
+// All religion stuff
+GLOBAL_VAR(religion)
+GLOBAL_VAR(deity)
+
+//bible
+GLOBAL_VAR(bible_name)
+GLOBAL_VAR(bible_icon_state)
+GLOBAL_VAR(bible_item_state)
diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm
index 02a8806089..a9aac1ffcf 100644
--- a/code/_helpers/text.dm
+++ b/code/_helpers/text.dm
@@ -21,6 +21,27 @@
/*
* Text sanitization
*/
+// Can be used almost the same way as normal input for text
+/proc/clean_input(Message, Title, Default, mob/user=usr)
+ var/txt = input(user, Message, Title, Default) as text | null
+ if(txt)
+ return html_encode(txt)
+
+//Simply removes < and > and limits the length of the message
+/proc/strip_html_simple(var/t,var/limit=MAX_MESSAGE_LEN)
+ var/list/strip_chars = list("<",">")
+ t = copytext(t,1,limit)
+ for(var/char in strip_chars)
+ var/index = findtext(t, char)
+ while(index)
+ t = copytext(t, 1, index) + copytext(t, index+1)
+ index = findtext(t, char)
+ return t
+
+//Runs byond's sanitization proc along-side strip_html_simple
+//I believe strip_html_simple() is required to run first to prevent '<' from displaying as '<' that html_encode() would cause
+/proc/adminscrub(var/t,var/limit=MAX_MESSAGE_LEN)
+ return copytext((html_encode(strip_html_simple(t))),1,limit)
//Used for preprocessing entered text
/proc/sanitize(var/input, var/max_length = MAX_MESSAGE_LEN, var/encode = 1, var/trim = 1, var/extra = 1)
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 859884a8b7..76b18f7222 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -141,8 +141,9 @@
return 1
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
- Topic(src, list("command"="enable", "value"="[!enabled]"))
- return 1
+ enabled = !enabled
+ updateTurrets()
+ return TRUE
/atom/proc/AIAltClick(var/atom/A)
return AltClick(A)
@@ -156,8 +157,10 @@
return 1
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
- Topic(src, list("command"="lethal", "value"="[!lethal]"))
- return 1
+ if(lethal_is_configurable)
+ lethal = !lethal
+ updateTurrets()
+ return TRUE
/atom/proc/AIMiddleClick(var/mob/living/silicon/user)
return 0
diff --git a/code/_onclick/hud/alert_vr.dm b/code/_onclick/hud/alert_vr.dm
new file mode 100644
index 0000000000..19310ad315
--- /dev/null
+++ b/code/_onclick/hud/alert_vr.dm
@@ -0,0 +1,25 @@
+/obj/screen/alert/fat
+ name = "Full"
+ desc = "You overate! If you don't exercise soon, you might find yourself gaining weight."
+
+/obj/screen/alert/fat/vampire
+ desc = "You overdrank! If you don't exercise soon, you might find yourself gaining weight."
+
+/obj/screen/alert/fat/synth
+ name = "Overcharged"
+
+/obj/screen/alert/hungry/vampire
+ desc = "You could use a bloodpack or two."
+
+/obj/screen/alert/hungry/synth
+ name = "Undercharged"
+
+/obj/screen/alert/starving
+ desc = "You're extremely hungry. The hunger pains make moving around a chore."
+
+/obj/screen/alert/starving/vampire
+ desc = "You are starving! Without some blood, moving around is a pain."
+
+/obj/screen/alert/starving/synth
+ name = "Low Power"
+ desc = "Your battery is very low! Low power mode makes all movements slower."
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 66cf3d1c12..5e5f044ac2 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -515,7 +515,7 @@
if("Show Crew Manifest")
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
- AI.ai_roster()
+ AI.subsystem_crew_manifest()
if("Show Alerts")
if(isAI(usr))
@@ -540,12 +540,14 @@
if("PDA - Send Message")
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
- AI.aiPDA.cmd_send_pdamesg(usr)
+ AI.aiPDA.start_program(AI.aiPDA.find_program(/datum/data/pda/app/messenger))
+ AI.aiPDA.cmd_pda_open_ui(usr)
if("PDA - Show Message Log")
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
- AI.aiPDA.cmd_show_message_log(usr)
+ AI.aiPDA.start_program(AI.aiPDA.find_program(/datum/data/pda/app/messenger))
+ AI.aiPDA.cmd_pda_open_ui(usr)
if("Take Image")
if(isAI(usr))
diff --git a/code/controllers/subsystems/persistence.dm b/code/controllers/subsystems/persistence.dm
index c2724c2d60..00c08363de 100644
--- a/code/controllers/subsystems/persistence.dm
+++ b/code/controllers/subsystems/persistence.dm
@@ -31,7 +31,7 @@ SUBSYSTEM_DEF(persistence)
return
// if((!T.z in GLOB.using_map.station_levels) || !initialized)
- if(!T.z in using_map.station_levels)
+ if(!(T.z in using_map.station_levels))
return
if(!tracking_values[track_type])
diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm
index 52a8776071..2447a0f122 100644
--- a/code/controllers/subsystems/supply.dm
+++ b/code/controllers/subsystems/supply.dm
@@ -105,7 +105,7 @@ SUBSYSTEM_DEF(supply)
// Sell phoron and platinum
if(istype(A, /obj/item/stack))
var/obj/item/stack/P = A
- var/material/mat = P.get_material()
+ var/datum/material/mat = P.get_material()
if(mat?.supply_conversion_value)
EC.contents[EC.contents.len]["value"] = P.get_amount() * mat.supply_conversion_value
EC.contents[EC.contents.len]["quantity"] = P.get_amount()
diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm
index 31a1de0266..5d6aaf1fc3 100644
--- a/code/controllers/subsystems/ticker.dm
+++ b/code/controllers/subsystems/ticker.dm
@@ -32,12 +32,6 @@ SUBSYSTEM_DEF(ticker)
var/list/datum/mind/minds = list() // The people in the game. Used for objective tracking.
- // TODO - I am sure there is a better place these can go.
- var/Bible_icon_state // icon_state the chaplain has chosen for his bible
- var/Bible_item_state // item_state the chaplain has chosen for his bible
- var/Bible_name // name of the bible
- var/Bible_deity_name
-
var/random_players = FALSE // If set to nonzero, ALL players who latejoin or declare-ready join will have random appearances/genders
// TODO - Should this go here or in the job subsystem?
@@ -567,8 +561,4 @@ var/global/datum/controller/subsystem/ticker/ticker
minds = SSticker.minds
- Bible_icon_state = SSticker.Bible_icon_state
- Bible_item_state = SSticker.Bible_item_state
- Bible_name = SSticker.Bible_name
- Bible_deity_name = SSticker.Bible_deity_name
random_players = SSticker.random_players
diff --git a/code/datums/datum.dm b/code/datums/datum.dm
index 61eb4c6953..d806728f5d 100644
--- a/code/datums/datum.dm
+++ b/code/datums/datum.dm
@@ -31,5 +31,5 @@
weakref = null // Clear this reference to ensure it's kept for as brief duration as possible.
tag = null
- SSnanoui.close_uis(src)
+ SStgui.close_uis(src)
return QDEL_HINT_QUEUE
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 10a7b4b7b9..bca9df5ae1 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -85,7 +85,6 @@
current.verbs -= /datum/changeling/proc/EvolutionMenu
current.mind = null
- SSnanoui.user_transferred(current, new_character) // transfer active NanoUI instances to new user
if(new_character.mind) //remove any mind currently in our new body's mind variable
new_character.mind.current = null
diff --git a/code/datums/repositories/crew.dm b/code/datums/repositories/crew.dm
index 7a748049bc..c45202194b 100644
--- a/code/datums/repositories/crew.dm
+++ b/code/datums/repositories/crew.dm
@@ -38,9 +38,10 @@ var/global/datum/repository/crew/crew_repository = new()
crewmemberData["assignment"] = H.get_assignment(if_no_id="Unknown", if_no_job="No Job")
if(C.sensor_mode >= SUIT_SENSOR_BINARY)
- crewmemberData["dead"] = H.stat > UNCONSCIOUS
+ crewmemberData["dead"] = H.stat == DEAD
if(C.sensor_mode >= SUIT_SENSOR_VITAL)
+ crewmemberData["stat"] = H.stat
crewmemberData["oxy"] = round(H.getOxyLoss(), 1)
crewmemberData["tox"] = round(H.getToxLoss(), 1)
crewmemberData["fire"] = round(H.getFireLoss(), 1)
diff --git a/code/datums/supplypacks/engineering_vr.dm b/code/datums/supplypacks/engineering_vr.dm
index 61c0f0e180..ae02babaca 100644
--- a/code/datums/supplypacks/engineering_vr.dm
+++ b/code/datums/supplypacks/engineering_vr.dm
@@ -39,3 +39,11 @@
containertype = /obj/structure/closet/crate/secure/engineering
containername = "Tesla Generator crate"
access = access_ce
+
+/datum/supply_pack/eng/inducer
+ contains = list(/obj/item/weapon/inducer = 3)
+ name = "inducer"
+ cost = 90 //Relatively expensive
+ containertype = /obj/structure/closet/crate/xion
+ containername = "Inducers crate"
+ access = access_engine
diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm
index 1307b8f985..69f198bbd4 100644
--- a/code/datums/supplypacks/medical.dm
+++ b/code/datums/supplypacks/medical.dm
@@ -32,6 +32,13 @@
containertype = /obj/structure/closet/crate/nanomed
containername = "BloodPack crate"
+/datum/supply_pack/med/synthplas
+ name = "BloodPack (Synthplas) crate"
+ contains = list(/obj/item/weapon/reagent_containers/blood/synthplas = 6)
+ cost = 80
+ containertype = /obj/structure/closet/crate/nanomed
+ containername = "SynthPlas crate"
+
/datum/supply_pack/med/bodybag
name = "Body bag crate"
contains = list(/obj/item/weapon/storage/box/bodybags = 3)
diff --git a/code/datums/supplypacks/recreation_vr.dm b/code/datums/supplypacks/recreation_vr.dm
index 2e61f93473..5c2266523f 100644
--- a/code/datums/supplypacks/recreation_vr.dm
+++ b/code/datums/supplypacks/recreation_vr.dm
@@ -64,3 +64,25 @@
cost = 25
containertype = /obj/structure/closet/crate
containername = "collar crate"
+
+/datum/supply_pack/recreation/shiny
+ name = "Shiny Clothing"
+ contains = list(
+ /obj/item/clothing/mask/muzzle/ballgag = 1,
+ /obj/item/clothing/mask/muzzle/ballgag/ringgag = 1,
+ /obj/item/clothing/head/shiny_hood = 1,
+ /obj/item/clothing/head/shiny_hood/poly = 1,
+ /obj/item/clothing/head/shiny_hood/closed = 1,
+ /obj/item/clothing/head/shiny_hood/closed/poly = 1,
+ /obj/item/clothing/under/shiny/catsuit = 1,
+ /obj/item/clothing/under/shiny/catsuit/poly = 1,
+ /obj/item/clothing/under/shiny/leotard = 1,
+ /obj/item/clothing/under/shiny/leotard/poly = 1,
+ /obj/item/clothing/accessory/shiny/gloves = 1,
+ /obj/item/clothing/accessory/shiny/gloves/poly = 1,
+ /obj/item/clothing/accessory/shiny/socks = 1,
+ /obj/item/clothing/accessory/shiny/socks/poly = 1
+ )
+ containertype = /obj/structure/closet/crate
+ containername = "Shiny clothes crate"
+ cost = 30
diff --git a/code/datums/uplink/announcements.dm b/code/datums/uplink/announcements.dm
index 1c4a448cee..e85541a55d 100644
--- a/code/datums/uplink/announcements.dm
+++ b/code/datums/uplink/announcements.dm
@@ -25,16 +25,7 @@
return list("title" = title, "message" = message)
/datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
- for (var/obj/machinery/computer/communications/C in machines)
- if(! (C.stat & (BROKEN|NOPOWER) ) )
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
- P.name = "'[command_name()] Update.'"
- P.info = replacetext(args["message"], "\n", "
")
- P.update_space(P.info)
- P.update_icon()
- C.messagetitle.Add(args["title"])
- C.messagetext.Add(P.info)
-
+ post_comm_message(args["title"], replacetext(args["message"], "\n", "
"))
command_announcement.Announce(args["message"], args["title"])
return 1
diff --git a/code/datums/uplink/implants.dm b/code/datums/uplink/implants.dm
index bbbeaf9e7e..d1bb93acdc 100644
--- a/code/datums/uplink/implants.dm
+++ b/code/datums/uplink/implants.dm
@@ -73,3 +73,13 @@
name = "Integrated Surge Implant"
item_cost = 40
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/surge
+
+/datum/uplink_item/item/implants/imp_armblade
+ name = "Integrated Armblade Implant"
+ item_cost = 40
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/armblade
+
+/datum/uplink_item/item/implants/imp_handblade
+ name = "Integrated Handblade Implant"
+ item_cost = 25
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/handblade
diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm
index cca1933c9c..8d9de8f732 100644
--- a/code/datums/uplink/uplink_items.dm
+++ b/code/datums/uplink/uplink_items.dm
@@ -51,7 +51,7 @@ var/datum/uplink/uplink = new()
if(!can_buy(U))
return
- if(U.CanUseTopic(user, inventory_state) != STATUS_INTERACTIVE)
+ if(U.CanUseTopic(user, GLOB.tgui_inventory_state) != STATUS_INTERACTIVE)
return
var/cost = cost(U.uses, U)
diff --git a/code/datums/vending/stored_item.dm b/code/datums/vending/stored_item.dm
index 7c27776aa9..23d06c909a 100644
--- a/code/datums/vending/stored_item.dm
+++ b/code/datums/vending/stored_item.dm
@@ -2,11 +2,11 @@
* Datum that holds the instances and information about the items stored. Currently used in SmartFridges and Vending Machines.
*/
/datum/stored_item
- var/item_name = "name" //Name of the item(s) displayed
- var/item_path = null
- var/amount = 0
- var/list/instances //What items are actually stored
- var/stored //The thing holding it is
+ var/item_name = "name" //Name of the item(s) displayed
+ var/item_path = null
+ var/amount = 0
+ var/list/instances //What items are actually stored
+ var/stored //The thing holding it is
/datum/stored_item/New(var/stored, var/path, var/name = null, var/amount = 0)
src.item_path = path
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 7efbb84c20..0cb7cbd594 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -10,6 +10,8 @@
w_class = ITEMSIZE_SMALL
attack_verb = list("called", "rang")
hitsound = 'sound/weapons/ring.ogg'
+ drop_sound = 'sound/items/drop/device.ogg'
+ pickup_sound = 'sound/items/pickup/device.ogg'
/obj/item/weapon/rsp
name = "\improper Rapid-Seed-Producer (RSP)"
@@ -22,6 +24,8 @@
var/stored_matter = 0
var/mode = 1
w_class = ITEMSIZE_NORMAL
+ drop_sound = 'sound/items/drop/device.ogg'
+ pickup_sound = 'sound/items/pickup/device.ogg'
/obj/item/weapon/soap
name = "soap"
@@ -35,7 +39,6 @@
throwforce = 0
throw_speed = 4
throw_range = 20
- drop_sound = 'sound/misc/slip.ogg'
/obj/item/weapon/soap/nanotrasen
desc = "A NanoTrasen-brand bar of soap. Smells of phoron."
@@ -149,6 +152,8 @@
throw_range = 20
matter = list(DEFAULT_WALL_MATERIAL = 100)
origin_tech = list(TECH_MAGNET = 1)
+ drop_sound = 'sound/items/drop/device.ogg'
+ pickup_sound = 'sound/items/pickup/device.ogg'
/obj/item/weapon/staff
name = "wizards staff"
@@ -196,6 +201,8 @@
item_state = "std_mod"
w_class = ITEMSIZE_SMALL
var/mtype = 1 // 1=electronic 2=hardware
+ drop_sound = 'sound/items/drop/component.ogg'
+ pickup_sound = 'sound/items/pickup/component.ogg'
/obj/item/weapon/module/card_reader
name = "card reader module"
@@ -227,7 +234,6 @@
item_state = "std_mod"
desc = "Charging circuits for power cells."
-
/obj/item/device/camera_bug
name = "camera bug"
icon = 'icons/obj/device.dmi'
@@ -304,6 +310,8 @@
display_contents_with_number = 1
max_w_class = ITEMSIZE_NORMAL
max_storage_space = 100
+ drop_sound = 'sound/items/drop/device.ogg'
+ pickup_sound = 'sound/items/pickup/device.ogg'
/obj/item/weapon/storage/part_replacer/adv
name = "advanced rapid part exchange device"
@@ -332,7 +340,8 @@
icon = 'icons/obj/stock_parts.dmi'
w_class = ITEMSIZE_SMALL
var/rating = 1
- drop_sound = 'sound/items/drop/glass.ogg'
+ drop_sound = 'sound/items/drop/component.ogg'
+ pickup_sound = 'sound/items/pickup/component.ogg'
/obj/item/weapon/stock_parts/New()
src.pixel_x = rand(-5.0, 5)
diff --git a/code/game/antagonist/outsider/ert_vr.dm b/code/game/antagonist/outsider/ert_vr.dm
new file mode 100644
index 0000000000..e808272614
--- /dev/null
+++ b/code/game/antagonist/outsider/ert_vr.dm
@@ -0,0 +1,6 @@
+//boosted ERT spawn/cap numbers to match the Von Braun's spawns, just to be safe. not much point going to all the effort of giving you twelve slots if only seven can ever be used without admin fuckery. -Killian
+/datum/antagonist/ert
+ hard_cap = 12
+ hard_cap_round = 12
+ initial_spawn_req = 4
+ initial_spawn_target = 12
\ No newline at end of file
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index ddd49703c6..3ed52d317c 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -280,7 +280,7 @@ var/global/list/datum/dna/gene/dna_genes[0]
// Set a DNA UI block's raw value.
/datum/dna/proc/SetUIValue(var/block,var/value,var/defer=0)
if (block<=0) return
- ASSERT(value>0)
+ ASSERT(value>=0)
ASSERT(value<=4095)
UI[block]=value
dirtyUI=1
@@ -296,7 +296,6 @@ var/global/list/datum/dna/gene/dna_genes[0]
// Used in hair and facial styles (value being the index and maxvalue being the len of the hairstyle list)
/datum/dna/proc/SetUIValueRange(var/block,var/value,var/maxvalue,var/defer=0)
if (block<=0) return
- if (value==0) value = 1 // FIXME: hair/beard/eye RGB values if they are 0 are not set, this is a work around we'll encode it in the DNA to be 1 instead.
ASSERT(maxvalue<=4095)
var/range = (4095 / maxvalue)
if(value)
@@ -306,7 +305,7 @@ var/global/list/datum/dna/gene/dna_genes[0]
/datum/dna/proc/GetUIValueRange(var/block,var/maxvalue)
if (block<=0) return 0
var/value = GetUIValue(block)
- return round(0.5 + (value / 4096) * maxvalue)
+ return round(0.5 + (value / 4095) * maxvalue)
// Is the UI gene "on" or "off"?
// For UI, this is simply a check of if the value is > 2050.
@@ -392,7 +391,7 @@ var/global/list/datum/dna/gene/dna_genes[0]
/datum/dna/proc/GetSEValueRange(var/block,var/maxvalue)
if (block<=0) return 0
var/value = GetSEValue(block)
- return round(1 +(value / 4096)*maxvalue)
+ return round(1 +(value / 4095)*maxvalue)
// Is the block "on" (1) or "off" (0)? (Un-assigned genes are always off.)
/datum/dna/proc/GetSEState(var/block)
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index f4fcffbd34..cd3ec6a44d 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -177,7 +177,7 @@
// Ears
var/ears = dna.GetUIValueRange(DNA_UI_EAR_STYLE, ear_styles_list.len + 1) - 1
- if(ears <= 1)
+ if(ears < 1)
H.ear_style = null
else if((0 < ears) && (ears <= ear_styles_list.len))
H.ear_style = ear_styles_list[ear_styles_list[ears]]
@@ -192,14 +192,14 @@
//Tail
var/tail = dna.GetUIValueRange(DNA_UI_TAIL_STYLE, tail_styles_list.len + 1) - 1
- if(tail <= 1)
+ if(tail < 1)
H.tail_style = null
else if((0 < tail) && (tail <= tail_styles_list.len))
H.tail_style = tail_styles_list[tail_styles_list[tail]]
//Wing
var/wing = dna.GetUIValueRange(DNA_UI_WING_STYLE, wing_styles_list.len + 1) - 1
- if(wing <= 1)
+ if(wing < 1)
H.wing_style = null
else if((0 < wing) && (wing <= wing_styles_list.len))
H.wing_style = wing_styles_list[wing_styles_list[wing]]
diff --git a/code/game/gamemodes/changeling/powers/fabricate_clothing.dm b/code/game/gamemodes/changeling/powers/fabricate_clothing.dm
index b90b402e78..6ec87a64d4 100644
--- a/code/game/gamemodes/changeling/powers/fabricate_clothing.dm
+++ b/code/game/gamemodes/changeling/powers/fabricate_clothing.dm
@@ -286,5 +286,5 @@ var/global/list/changeling_fabricated_clothing = list(
if(!registered_user)
registered_user = usr
usr.set_id_info(src)
- ui_interact(registered_user)
+ tgui_interact(registered_user)
..()
\ No newline at end of file
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 9bb25ec6b4..c946965072 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -182,7 +182,7 @@
/proc/get_access_by_id(id)
var/list/AS = get_all_access_datums_by_id()
- return AS[id]
+ return AS["[id]"]
/proc/get_all_jobs()
var/list/all_jobs = list()
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index e767bb5c35..10174fd37b 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -29,7 +29,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
job_description = "The Site Manager manages the other Command Staff, and through them the rest of the station. Though they have access to everything, \
they do not understand everything, and are expected to delegate tasks to the appropriate crew member. The Site Manager is expected to \
have an understanding of Standard Operating Procedure, and is subject to it, and legal action, in the same way as every other crew member."
- alt_titles = list("Overseer"= /datum/alt_title/overseer)
+ alt_titles = list("Overseer"= /datum/alt_title/overseer,"Colony Director"= /datum/alt_title/colonydirector) //CHOMPEdit
//YW UNCOMMENTINGSTART: REINSTATE LOYALTY IMPLANT
/datum/job/captain/equip(var/mob/living/carbon/human/H)
@@ -46,7 +46,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
// Captain Alt Titles
/datum/alt_title/overseer
title = "Overseer"
-
+/datum/alt_title/colonydirector //CHOMPEdit
+ title = "Colony Director" //CHOMPEdit
//////////////////////////////////
// Head of Personnel
//////////////////////////////////
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index 93989d2c44..5fba7b155d 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -32,136 +32,69 @@
if(!B)
return
- spawn(0)
- var/religion_name = "Unitarianism"
- var/new_religion = sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Unitarianism", "Name change", religion_name), MAX_NAME_LEN)
+ if(GLOB.religion)
+ B.deity_name = GLOB.deity
+ B.name = GLOB.bible_name
+ B.icon_state = GLOB.bible_icon_state
+ B.item_state = GLOB.bible_item_state
+ to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the [title].")
+ return
+
+ INVOKE_ASYNC(src, .proc/religion_prompts, H, B)
- if (!new_religion)
- new_religion = religion_name
- switch(lowertext(new_religion))
- if("unitarianism")
- B.name = "The Great Canon"
- if("christianity")
- B.name = "The Holy Bible"
- if("judaism")
- B.name = "The Torah"
- if("islam")
- B.name = "Quran"
- if("buddhism")
- B.name = "Tripitakas"
- if("hinduism")
- B.name = pick("The Srimad Bhagvatam", "The Four Vedas", "The Shiv Mahapuran", "Devi Mahatmya")
- if("neopaganism")
- B.name = "Neopagan Hymnbook"
- if("phact shintoism")
- B.name = "The Kojiki"
- if("kishari national faith")
- B.name = "The Scriptures of Kishar"
- if("pleromanism")
- B.name = "The Revised Great Canon"
- if("spectralism")
- B.name = "The Book of the Spark"
- if("hauler")
- B.name = "Histories of Captaincy"
- if("nock")
- B.name = "The Book of the First"
- if("singulitarian worship")
- B.name = "The Book of the Precursors"
- if("starlit path of angessa martei")
- B.name = "Quotations of Exalted Martei"
- if("sikhism")
- B.name = "Guru Granth Sahib"
- else
- B.name = "The Holy Book of [new_religion]"
- feedback_set_details("religion_name","[new_religion]")
+/datum/job/chaplain/proc/religion_prompts(mob/living/carbon/human/H, obj/item/weapon/storage/bible/B)
+ var/religion_name = "Unitarianism"
+ var/new_religion = sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Unitarianism", "Name change", religion_name), MAX_NAME_LEN)
+ if(!new_religion)
+ new_religion = religion_name
- spawn(1)
- var/deity_name = "Hashem"
- var/new_deity = sanitize(input(H, "Would you like to change your deity? Default is Hashem", "Name change", deity_name), MAX_NAME_LEN)
+ switch(lowertext(new_religion))
+ if("unitarianism")
+ B.name = "The Great Canon"
+ if("christianity")
+ B.name = "The Holy Bible"
+ if("judaism")
+ B.name = "The Torah"
+ if("islam")
+ B.name = "Quran"
+ if("buddhism")
+ B.name = "Tripitakas"
+ if("hinduism")
+ B.name = pick("The Srimad Bhagvatam", "The Four Vedas", "The Shiv Mahapuran", "Devi Mahatmya")
+ if("neopaganism")
+ B.name = "Neopagan Hymnbook"
+ if("phact shintoism")
+ B.name = "The Kojiki"
+ if("kishari national faith")
+ B.name = "The Scriptures of Kishar"
+ if("pleromanism")
+ B.name = "The Revised Great Canon"
+ if("spectralism")
+ B.name = "The Book of the Spark"
+ if("hauler")
+ B.name = "Histories of Captaincy"
+ if("nock")
+ B.name = "The Book of the First"
+ if("singulitarian worship")
+ B.name = "The Book of the Precursors"
+ if("starlit path of angessa martei")
+ B.name = "Quotations of Exalted Martei"
+ if("sikhism")
+ B.name = "Guru Granth Sahib"
+ else
+ B.name = "The Holy Book of [new_religion]"
+ feedback_set_details("religion_name","[new_religion]")
- if ((length(new_deity) == 0) || (new_deity == "Hashem") )
- new_deity = deity_name
- B.deity_name = new_deity
+ var/deity_name = "Hashem"
+ var/new_deity = sanitize(input(H, "Would you like to change your deity? Default is Hashem", "Name change", deity_name), MAX_NAME_LEN)
- var/accepted = 0
- var/outoftime = 0
- spawn(200) // 20 seconds to choose
- outoftime = 1
- var/new_book_style = "Bible"
+ if((length(new_deity) == 0) || (new_deity == "Hashem"))
+ new_deity = deity_name
+ B.deity_name = new_deity
- while(!accepted)
- if(!B) break // prevents possible runtime errors
- new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Pagan", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon","Orthodox","Torah")
- switch(new_book_style)
- if("Koran")
- B.icon_state = "koran"
- B.item_state = "koran"
- if("Scrapbook")
- B.icon_state = "scrapbook"
- B.item_state = "scrapbook"
- if("White Bible")
- B.icon_state = "white"
- B.item_state = "syringe_kit"
- if("Holy Light")
- B.icon_state = "holylight"
- B.item_state = "syringe_kit"
- if("Athiest")
- B.icon_state = "athiest"
- B.item_state = "syringe_kit"
- if("Tome")
- B.icon_state = "tome"
- B.item_state = "syringe_kit"
- if("The King in Yellow")
- B.icon_state = "kingyellow"
- B.item_state = "kingyellow"
- if("Ithaqua")
- B.icon_state = "ithaqua"
- B.item_state = "ithaqua"
- if("Scientology")
- B.icon_state = "scientology"
- B.item_state = "scientology"
- if("the bible melts")
- B.icon_state = "melted"
- B.item_state = "melted"
- if("Necronomicon")
- B.icon_state = "necronomicon"
- B.item_state = "necronomicon"
- if("Pagan")
- B.icon_state = "shadows"
- B.item_state = "syringe_kit"
- if("Orthodox")
- B.icon_state = "orthodoxy"
- B.item_state = "bible"
- if("Torah")
- B.icon_state = "torah"
- B.item_state = "clipboard"
- if("Guru")
- B.icon_state = "guru"
- B.item_state = "clipboard"
- else
- B.icon_state = "bible"
- B.item_state = "bible"
+ GLOB.religion = new_religion
+ GLOB.bible_name = B.name
+ GLOB.deity = B.deity_name
+ feedback_set_details("religion_deity","[new_deity]")
+
- H.update_inv_l_hand() // so that it updates the bible's item_state in his hand
-
- switch(input(H,"Look at your bible - is this what you want?") in list("Yes","No"))
- if("Yes")
- accepted = 1
- if("No")
- if(outoftime)
- to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.")
- accepted = 1
-
- if(ticker)
- ticker.Bible_icon_state = B.icon_state
- ticker.Bible_item_state = B.item_state
- ticker.Bible_name = B.name
- ticker.Bible_deity_name = B.deity_name
- feedback_set_details("religion_deity","[new_deity]")
- feedback_set_details("religion_book","[new_book_style]")
- return 1
-
-/* If you uncomment this, every time the mob preview updates it makes a new PDA. It seems to work just fine and display without it, so why this exists, haven't a clue. -Hawk
-/datum/job/chaplain/equip_preview(var/mob/living/carbon/human/H, var/alt_title)
- return equip(H, alt_title, FALSE)
-*/
diff --git a/code/game/jobs/job/exploration_vr.dm b/code/game/jobs/job/exploration_vr.dm
index d555c531a2..7f3b57f0b1 100644
--- a/code/game/jobs/job/exploration_vr.dm
+++ b/code/game/jobs/job/exploration_vr.dm
@@ -130,6 +130,7 @@ var/const/SAR =(1<<14)
outfit_type = /decl/hierarchy/outfit/job/assistant/explorer
job_description = "Off-duty crew has no responsibilities or authority and is just there to spend their well-deserved time off."
pto_type = PTO_EXPLORATION
+ economic_modifier = 5
/datum/alt_title/offduty_exp
- title = "Off-duty Explorer"
\ No newline at end of file
+ title = "Off-duty Explorer"
diff --git a/code/game/jobs/job/offduty_vr.dm b/code/game/jobs/job/offduty_vr.dm
index 416543956c..1928e242e6 100644
--- a/code/game/jobs/job/offduty_vr.dm
+++ b/code/game/jobs/job/offduty_vr.dm
@@ -16,6 +16,7 @@
outfit_type = /decl/hierarchy/outfit/job/assistant/worker
job_description = "Off-duty crew has no responsibilities or authority and is just there to spend their well-deserved time off."
pto_type = PTO_CIVILIAN
+ economic_modifier = 2
/datum/alt_title/offduty_civ
title = "Off-duty Worker"
@@ -34,6 +35,7 @@
outfit_type = /decl/hierarchy/outfit/job/assistant/cargo
job_description = "Off-duty crew has no responsibilities or authority and is just there to spend their well-deserved time off."
pto_type = PTO_CARGO
+ economic_modifier = 2
/datum/alt_title/offduty_crg
title = "Off-duty Cargo"
@@ -52,6 +54,7 @@
outfit_type = /decl/hierarchy/outfit/job/assistant/engineer
job_description = "Off-duty crew has no responsibilities or authority and is just there to spend their well-deserved time off."
pto_type = PTO_ENGINEERING
+ economic_modifier = 5
/datum/alt_title/offduty_eng
title = "Off-duty Engineer"
@@ -70,6 +73,7 @@
outfit_type = /decl/hierarchy/outfit/job/assistant/medic
job_description = "Off-duty crew has no responsibilities or authority and is just there to spend their well-deserved time off."
pto_type = PTO_MEDICAL
+ economic_modifier = 5
/datum/alt_title/offduty_med
title = "Off-duty Medic"
@@ -88,6 +92,7 @@
outfit_type = /decl/hierarchy/outfit/job/assistant/scientist
job_description = "Off-duty crew has no responsibilities or authority and is just there to spend their well-deserved time off."
pto_type = PTO_SCIENCE
+ economic_modifier = 5
/datum/alt_title/offduty_sci
title = "Off-duty Scientist"
@@ -106,6 +111,7 @@
outfit_type = /decl/hierarchy/outfit/job/assistant/officer
job_description = "Off-duty crew has no responsibilities or authority and is just there to spend their well-deserved time off."
pto_type = PTO_SECURITY
+ economic_modifier = 5
/datum/alt_title/offduty_sec
title = "Off-duty Officer"
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 403efbf4fe..3aec6c8c37 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -540,6 +540,8 @@ var/global/datum/controller/occupations/job_master
// EMAIL GENERATION
// Email addresses will be created under this domain name. Mostly for the looks.
var/domain = "freemail.nt"
+ if(using_map && LAZYLEN(using_map.usable_email_tlds))
+ domain = using_map.usable_email_tlds[1]
var/sanitized_name = sanitize(replacetext(replacetext(lowertext(H.real_name), " ", "."), "'", ""))
var/complete_login = "[sanitized_name]@[domain]"
diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm
index 6fc853dba4..d430eacaf3 100644
--- a/code/game/jobs/jobs.dm
+++ b/code/game/jobs/jobs.dm
@@ -54,7 +54,7 @@ var/list/assistant_occupations = list(
var/list/command_positions = list(
- "Colony Director",
+ "Site Manager",
"Head of Personnel",
"Head of Security",
"Chief Engineer",
@@ -136,7 +136,7 @@ var/list/nonhuman_positions = list(
)
var/list/whitelisted_positions = list(
- "Colony Director",
+ "Site Manager",
"Head of Personnel",
"Head of Security",
"Chief Engineer",
diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm
index a5d8759173..d87eae4118 100644
--- a/code/game/machinery/air_alarm.dm
+++ b/code/game/machinery/air_alarm.dm
@@ -188,7 +188,7 @@
/obj/machinery/alarm/proc/handle_heating_cooling(var/datum/gas_mixture/environment)
if(!regulating_temperature)
//check for when we should start adjusting temperature
- if(!get_danger_level(target_temperature, TLV["temperature"]) && abs(environment.temperature - target_temperature) > 2.0)
+ if(!get_danger_level(target_temperature, TLV["temperature"]) && abs(environment.temperature - target_temperature) > 2.0 && environment.return_pressure() >= 1)
update_use_power(USE_POWER_ACTIVE)
regulating_temperature = 1
audible_message("\The [src] clicks as it starts [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\
@@ -196,7 +196,7 @@
playsound(src, 'sound/machines/click.ogg', 50, 1)
else
//check for when we should stop adjusting temperature
- if(get_danger_level(target_temperature, TLV["temperature"]) || abs(environment.temperature - target_temperature) <= 0.5)
+ if(get_danger_level(target_temperature, TLV["temperature"]) || abs(environment.temperature - target_temperature) <= 0.5 || environment.return_pressure() < 1)
update_use_power(USE_POWER_IDLE)
regulating_temperature = 0
audible_message("\The [src] clicks quietly as it stops [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 6fe30aeaab..2d5e39b1b7 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -260,7 +260,7 @@ update_flag
..()
- SSnanoui.update_uis(src) // Update all NanoUIs attached to src
+ SStgui.update_uis(src) // Update all NanoUIs attached to src
/obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 915fb8fac1..dc530ecc2f 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -136,12 +136,6 @@
else
to_chat(user, "Nothing happens.")
return
-
- else if ((istype(W, /obj/item/device/analyzer)) && Adjacent(user))
- var/obj/item/device/analyzer/A = W
- A.analyze_gases(src, user)
- return
-
return
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 0159c151ec..4351d29698 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -316,7 +316,7 @@
/obj/machinery/autolathe/dismantle()
for(var/mat in stored_material)
- var/material/M = get_material_by_name(mat)
+ var/datum/material/M = get_material_by_name(mat)
if(!istype(M))
continue
var/obj/item/stack/material/S = new M.stack_type(get_turf(src))
@@ -330,7 +330,7 @@
/obj/machinery/autolathe/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything
var/recursive = amount == -1 ? 1 : 0
var/matstring = lowertext(material)
- var/material/M = get_material_by_name(matstring)
+ var/datum/material/M = get_material_by_name(matstring)
var/obj/item/stack/material/S = M.place_sheet(get_turf(src))
if(amount <= 0)
diff --git a/code/game/machinery/bomb_tester_vr.dm b/code/game/machinery/bomb_tester_vr.dm
index 826f632492..e3a3643526 100644
--- a/code/game/machinery/bomb_tester_vr.dm
+++ b/code/game/machinery/bomb_tester_vr.dm
@@ -237,12 +237,12 @@
pressure = faketank.return_pressure()
var/strength = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE
- var/mult = ((faketank.volume/140)**(1/2)) * (faketank.total_moles**2/3)/((29*0.64) **2/3) //Don't ask me what this is, see tanks.dm
+ var/mult = ((faketank.volume/140)**(1/2)) * (faketank.total_moles**(2/3))/((29*0.64) **(2/3)) //Don't ask me what this is, see tanks.dm
var/dev = round((mult*strength)*0.15)
var/heavy = round((mult*strength)*0.35)
var/light = round((mult*strength)*0.80)
- simulation_results += "

"
- else
- dat+="None"
- dat+="| Timestamp | -Target | -Reason | -Value | -Terminal | -
| [T.date] [T.time] | -[T.target_name] | -[T.purpose] | -[T.amount] | -[T.source_terminal] | -
| Timestamp | +Target | +Reason | +Value | +Terminal | +
| Account Number | -Holder | -Balance | -Status | -|
| [T.date] [T.time] | +[T.target_name] | +[T.purpose] | +[T.amount] | +[T.source_terminal] | +
| #[D.account_number] | -[D.owner_name] | -$[D.money] | -[D.suspended ? "Suspended" : "Active"] | -
| Account Number | +Holder | +Balance | +Status | +
| #[D.account_number] | +[D.owner_name] | +$[D.money] | +[D.suspended ? "Suspended" : "Active"] | +
| {{:helper.link('', 'gear', {'set' : value.name})}} | {{:value.name}} | {{:value.value}} | -
| Electronic warfare: | -{{:helper.link('Enabled', null, {'electronic_warfare' : 1}, data.electronic_warfare ? 'selected' : null)}} | -{{:helper.link('Disabled',null, {'electronic_warfare' : 0}, data.electronic_warfare ? null : 'selected')}} | -
| {{:helper.link('', 'gear', {'set' : value.name})}} | {{:value.name}} | {{:value.value}} | +
| Electronic warfare: | +{{:helper.link('Enabled', null, {'electronic_warfare' : 1}, data.electronic_warfare ? 'selected' : null)}} | +{{:helper.link('Disabled',null, {'electronic_warfare' : 0}, data.electronic_warfare ? null : 'selected')}} | +
| {{:value.name}}: | -{{:helper.link(value.enabled, null, {'command' : value.command, 'activate' : value.act ? 1 : 0}, value.active ? 'selected' : null)}} | -{{:helper.link(value.disabled,null, {'command' : value.command, 'activate' : value.act ? 0 : 1}, !value.active ? (value.danger ? 'redButton' : 'selected') : null)}} | -
| {{:value.name}}: | +{{:helper.link(value.enabled, null, {'command' : value.command, 'activate' : value.act ? 1 : 0}, value.active ? 'selected' : null)}} | +{{:helper.link(value.disabled,null, {'command' : value.command, 'activate' : value.act ? 0 : 1}, !value.active ? (value.danger ? 'redButton' : 'selected') : null)}} | +