Merge remote-tracking branch 'tgstation/master' into upstream-2025-11-29

# Conflicts:
#	_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
#	_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	_maps/map_files/tramstation/tramstation.dmm
#	code/_onclick/hud/new_player.dm
#	code/datums/components/squashable.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/datums/diseases/chronic_illness.dm
#	code/datums/status_effects/buffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/stamcrit.dm
#	code/game/machinery/computer/crew.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/wall_mounted.dm
#	code/game/turfs/closed/indestructible.dm
#	code/modules/admin/view_variables/filterrific.dm
#	code/modules/antagonists/heretic/influences.dm
#	code/modules/cargo/orderconsole.dm
#	code/modules/client/preferences.dm
#	code/modules/events/space_vines/vine_mutations.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/carbon/human/death.dm
#	code/modules/mob/living/carbon/human/species_types/jellypeople.dm
#	code/modules/mob/living/damage_procs.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mob_spawn/mob_spawn.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/projectiles/guns/ballistic/launchers.dm
#	code/modules/projectiles/guns/energy/laser.dm
#	code/modules/reagents/chemistry/machinery/chem_dispenser.dm
#	code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/medicine_reagents.dm
#	code/modules/surgery/healing.dm
#	code/modules/unit_tests/designs.dm
#	icons/mob/inhands/items_lefthand.dmi
#	icons/mob/inhands/items_righthand.dmi
#	tgui/packages/tgui/interfaces/ChemDispenser.tsx
This commit is contained in:
nevimer
2025-11-29 22:49:21 -05:00
1185 changed files with 39068 additions and 32028 deletions
+33 -18
View File
@@ -36,29 +36,44 @@
////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS
ADMIN_VERB(spawn_atom, R_SPAWN, "Spawn", "Spawn an atom.", ADMIN_CATEGORY_DEBUG, object as text)
if(!object)
return
var/list/preparsed = splittext(object,":")
var/path = preparsed[1]
ADMIN_VERB(spawn_atom, R_SPAWN, "Spawn", "Spawn an atom.", ADMIN_CATEGORY_DEBUG, object as text|null)
var/static/list/atom_types
if (isnull(atom_types))
atom_types = subtypesof(/atom)
var/chosen_path = null
var/list/preparsed = null
if (object)
preparsed = splittext(object, ":")
var/list/matches = filter_fancy_list(atom_types, preparsed[1])
if (length(matches) == 1)
chosen_path = matches[1]
if(!chosen_path)
var/datum/spawn_menu/menu = user.holder.spawn_menu
if (!menu)
menu = new()
user.holder.spawn_menu = menu
menu.init_value = object
menu.ui_interact(user.mob)
BLACKBOX_LOG_ADMIN_VERB("Spawn Atom")
return TRUE
var/amount = 1
if(preparsed.len > 1)
amount = clamp(text2num(preparsed[2]),1,ADMIN_SPAWN_CAP)
if (length(preparsed) > 1)
amount = clamp(text2num(preparsed[2]), 1, ADMIN_SPAWN_CAP)
var/chosen = pick_closest_path(path)
if(!chosen)
return
var/turf/T = get_turf(user.mob)
if(ispath(chosen, /turf))
T.ChangeTurf(chosen)
var/turf/target_turf = get_turf(user.mob)
if (ispath(chosen_path, /turf))
target_turf.ChangeTurf(chosen_path)
else
for(var/i in 1 to amount)
var/atom/A = new chosen(T)
A.flags_1 |= ADMIN_SPAWNED_1
for (var/i in 1 to amount)
var/atom/spawned = new chosen_path(target_turf)
spawned.flags_1 |= ADMIN_SPAWNED_1
log_admin("[key_name(user)] spawned [amount] x [chosen] at [AREACOORD(user.mob)]")
log_admin("[key_name(user.mob)] spawned [amount] x [chosen_path] at [AREACOORD(user.mob)]")
BLACKBOX_LOG_ADMIN_VERB("Spawn Atom")
return TRUE
ADMIN_VERB(spawn_atom_pod, R_SPAWN, "PodSpawn", "Spawn an atom via supply drop.", ADMIN_CATEGORY_DEBUG, object as text)
var/chosen = pick_closest_path(object)
+3 -1
View File
@@ -32,12 +32,14 @@ GLOBAL_PROTECT(href_token)
var/deadmined
var/datum/filter_editor/filteriffic
var/datum/filter_editor/filterrific
var/datum/particle_editor/particle_test
var/datum/colorblind_tester/color_test
var/datum/plane_master_debug/plane_debug
var/obj/machinery/computer/libraryconsole/admin_only_do_not_map_in_you_fucker/library_manager
var/datum/pathfind_debug/path_debug
var/datum/spawn_menu/spawn_menu
var/datum/spawnpanel/spawn_panel
/// Whether or not the user tried to connect, but was blocked by 2FA
var/blocked_by_2fa = FALSE
+1 -1
View File
@@ -4,4 +4,4 @@
/datum/smite/brain_damage/effect(client/user, mob/living/target)
. = ..()
target.adjustOrganLoss(ORGAN_SLOT_BRAIN, BRAIN_DAMAGE_DEATH - 1, BRAIN_DAMAGE_DEATH - 1)
target.adjust_organ_loss(ORGAN_SLOT_BRAIN, BRAIN_DAMAGE_DEATH - 1, BRAIN_DAMAGE_DEATH - 1)
+1 -1
View File
@@ -22,7 +22,7 @@
if (target.health <= 1)
target.gib(DROP_BODYPARTS)
else
target.adjustBruteLoss(min(BSA_MAX_DAMAGE, target.health - 1))
target.adjust_brute_loss(min(BSA_MAX_DAMAGE, target.health - 1))
target.Paralyze(BSA_PARALYZE_TIME)
target.set_stutter(BSA_STUTTER_TIME)
+1 -1
View File
@@ -11,7 +11,7 @@
/proc/lightningbolt(mob/living/user)
var/turf/lightning_source = get_step(get_step(user, NORTH), NORTH)
lightning_source.Beam(user, icon_state="lightning[rand(1,12)]", time = 5)
user.adjustFireLoss(LIGHTNING_BOLT_DAMAGE)
user.adjust_fire_loss(LIGHTNING_BOLT_DAMAGE)
playsound(get_turf(user), 'sound/effects/magic/lightningbolt.ogg', 50, TRUE)
if(ishuman(user))
var/mob/living/carbon/human/human_target = user
+92
View File
@@ -0,0 +1,92 @@
/datum/spawn_menu
/// Does the menu default to a regex prefix?
var/regex_search = FALSE
/// Does the search include atom names?
var/name_search = TRUE
/// Should we display full typepaths or the condensed versions?
var/fancy_types = TRUE
/// Should abstract types be included in the search?
var/include_abstracts = FALSE
/// Initial search value from the latest command
var/init_value = null
/datum/spawn_menu/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if (!ui)
ui = new(user, src, "SpawnSearch")
ui.open()
/datum/spawn_menu/ui_state(mob/user)
return ADMIN_STATE(R_SPAWN)
/datum/spawn_menu/ui_act(action, params, datum/tgui/ui)
if (..() || !check_rights_for(ui.user.client, R_SPAWN))
return FALSE
switch (action)
if ("setRegexSearch")
regex_search = params["regexSearch"]
return TRUE
if ("setNameSearch")
name_search = params["searchNames"]
return TRUE
if ("setFancyTypes")
fancy_types = params["fancyTypes"]
return TRUE
if ("setIncludeAbstracts")
include_abstracts = params["includeAbstracts"]
return TRUE
if ("spawn")
var/path = text2path(params["type"])
if (!path)
return TRUE
var/amount = clamp(text2num(params["amount"]) || 1, 1, ADMIN_SPAWN_CAP)
var/turf/target_turf = get_turf(ui.user)
if(ispath(path, /turf))
target_turf.ChangeTurf(path)
else
for(var/i in 1 to amount)
var/atom/spawned = new path(target_turf)
spawned.flags_1 |= ADMIN_SPAWNED_1
log_admin("[key_name(ui.user)] spawned [amount] x [path] at [AREACOORD(ui.user)]")
SStgui.close_uis(src)
return TRUE
if ("cancel")
SStgui.close_uis(src)
return TRUE
/datum/spawn_menu/ui_data(mob/user)
var/list/data = list()
data["initValue"] = init_value
data["searchNames"] = name_search
data["regexSearch"] = regex_search
data["fancyTypes"] = fancy_types
data["includeAbstracts"] = include_abstracts
return data
/datum/spawn_menu/ui_assets(mob/user)
return list(
get_asset_datum(/datum/asset/json/spawn_menu),
)
/datum/asset/json/spawn_menu
name = "spawn_menu_atom_data"
/datum/asset/json/spawn_menu/generate()
var/list/data = list()
var/static/list/types_list
if (isnull(types_list))
var/list/local_types = list()
for (var/atom/atom_type as anything in subtypesof(/atom))
local_types[atom_type] = atom_type::name || ""
types_list = local_types
data["types"] = types_list
data["abstractTypes"] = get_abstract_types()
data["fancyTypes"] = GLOB.fancy_type_replacements
return data
+3 -40
View File
@@ -15,14 +15,10 @@
#define OFFSET_ABSOLUTE "Absolute offset"
#define OFFSET_RELATIVE "Relative offset"
GLOBAL_LIST_INIT(spawnpanels_by_ckey, list())
/*
An instance of a /tg/UI™ Spawn Panel. Stores preferences, spawns things, controls the UI. Unique for each user (their ckey).
*/
/datum/spawnpanel
/// Who this instance of spawn panel belongs to. The instances are unique to correctly keep modified values between multiple admins.
var/owner_ckey
/// Where and how the atom should be spawned.
var/where_target_type = WHERE_FLOOR_BELOW_MOB
/// The atom selected from the panel.
@@ -57,45 +53,21 @@ GLOBAL_LIST_INIT(spawnpanels_by_ckey, list())
offset = list("X" = 0, "Y" = 0, "Z" = 0)
/datum/spawnpanel/ui_interact(mob/user, datum/tgui/ui)
if(user.client.ckey != owner_ckey)
return
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "SpawnPanel")
ui.open()
/// Returns a `spawnpanel` instance belonging to this `user`, or creates and registers a new one
/proc/get_spawnpanel_for_admin(mob/user)
if(!user?.client?.ckey)
return null
var/ckey = user.client.ckey
if(GLOB.spawnpanels_by_ckey[ckey])
return GLOB.spawnpanels_by_ckey[ckey]
var/datum/spawnpanel/new_panel = new()
new_panel.owner_ckey = ckey
GLOB.spawnpanels_by_ckey[ckey] = new_panel
return new_panel
/datum/spawnpanel/ui_close(mob/user)
. = ..()
if (precise_mode && precise_mode != PRECISE_MODE_OFF)
toggle_precise_mode(PRECISE_MODE_OFF)
/datum/spawnpanel/ui_state(mob/user)
if(user.client.ckey != owner_ckey)
return GLOB.never_state
return ADMIN_STATE(R_ADMIN)
return ADMIN_STATE(R_SPAWN)
/datum/spawnpanel/ui_act(action, params)
if(..())
return FALSE
if(usr.client.ckey != owner_ckey)
/datum/spawnpanel/ui_act(action, params, datum/tgui/ui)
if(..() || !check_rights_for(ui.user.client, R_SPAWN))
return FALSE
switch(action)
@@ -106,12 +78,10 @@ GLOBAL_LIST_INIT(spawnpanels_by_ckey, list())
available_icon_states = icon_states(selected_atom_icon)
if(!(selected_atom_icon_state in available_icon_states))
selected_atom_icon_state = available_icon_states[1]
SStgui.update_uis(src)
return TRUE
if("set-apply-icon-override")
apply_icon_override = !!params["value"]
SStgui.update_uis(src)
return TRUE
if("reset-DMI-icon")
@@ -123,35 +93,28 @@ GLOBAL_LIST_INIT(spawnpanels_by_ckey, list())
available_icon_states = icon_states(selected_atom_icon)
else
available_icon_states = list()
SStgui.update_uis(src)
return TRUE
if("select-new-icon-state")
selected_atom_icon_state = params["new_state"]
SStgui.update_uis(src)
return TRUE
if("reset-icon-state")
selected_atom_icon_state = null
if(selected_atom)
selected_atom_icon_state = initial(selected_atom.icon_state)
SStgui.update_uis(src)
return TRUE
if("set-icon-size")
atom_icon_size = params["size"]
SStgui.update_uis(src)
return TRUE
if("reset-icon-size")
atom_icon_size = 100
SStgui.update_uis(src)
return TRUE
if("get-icon-states")
available_icon_states = icon_states(selected_atom_icon)
SStgui.update_uis(src)
return TRUE
if("selected-atom-changed")
+4 -4
View File
@@ -44,10 +44,10 @@
#define TAG_MARK(X) "<b>(<A href='byond://?_src_=holder;[HrefToken(forceGlobal = TRUE)];mark_datum=[REF(X)]'>MARK</a>)</b>"
#define TAG_SIMPLE_HEALTH(X) "<font color='#ff0000'><b>Health: [X.health]</b></font>"
#define TAG_CARBON_HEALTH(X) "<font color='#ff0000'><b>Health: [X.health]</b></font> (\
<font color='#ff3333'>[X.getBruteLoss()]</font> \
<font color='#ff9933'>[X.getFireLoss()]</font> \
<font color='#00cc66'>[X.getToxLoss()]</font> \
<font color='#00cccc'>[X.getOxyLoss()]</font>"
<font color='#ff3333'>[X.get_brute_loss()]</font> \
<font color='#ff9933'>[X.get_fire_loss()]</font> \
<font color='#00cc66'>[X.get_tox_loss()]</font> \
<font color='#00cccc'>[X.get_oxy_loss()]</font>"
ADMIN_VERB(display_tags, R_ADMIN, "View Tags", "Display all of the tagged datums.", ADMIN_CATEGORY_GAME)
var/index = 0
+12 -2
View File
@@ -731,8 +731,8 @@
if(DEAD)
status = "<font color='red'><b>Dead</b></font>"
health_description = "Status: [status]"
health_description += "<br>Brute: [lifer.getBruteLoss()] - Burn: [lifer.getFireLoss()] - Toxin: [lifer.getToxLoss()] - Suffocation: [lifer.getOxyLoss()]"
health_description += "<br>Brain: [lifer.get_organ_loss(ORGAN_SLOT_BRAIN)] - Stamina: [lifer.getStaminaLoss()]"
health_description += "<br>Brute: [lifer.get_brute_loss()] - Burn: [lifer.get_fire_loss()] - Toxin: [lifer.get_tox_loss()] - Suffocation: [lifer.get_oxy_loss()]"
health_description += "<br>Brain: [lifer.get_organ_loss(ORGAN_SLOT_BRAIN)] - Stamina: [lifer.get_stamina_loss()]"
else
health_description = "This mob type has no health to speak of."
@@ -946,6 +946,16 @@
return
M.get_language_holder().open_language_menu(usr)
else if(href_list["rpreminder"])
var/mob/rper = locate(href_list["rpreminder"]) in GLOB.player_list
if(QDELETED(rper))
return
// literally just gives them a sound and a message
SEND_SOUND(rper, sound('sound/misc/roleplay.ogg'))
to_chat(rper, boxed_message("You hear a nagging voice in your head... [span_hypnophrase("Please roleplay appropriately.")]"))
message_admins("[ADMIN_LOOKUPFLW(usr)] reminded [ADMIN_LOOKUPFLW(rper)] to roleplay appropriately.")
log_admin("[key_name(usr)] reminded [key_name(rper)] to roleplay appropriately.")
else if(href_list["traitor"])
if(!check_rights(R_ADMIN))
return
+7 -5
View File
@@ -129,7 +129,8 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mo
body += "<A href='byond://?_src_=holder;[HrefToken()];narrateto=[REF(player)]'>Narrate to</A> | "
body += "<A href='byond://?_src_=holder;[HrefToken()];subtlemessage=[REF(player)]'>Subtle message</A> | "
body += "<A href='byond://?_src_=holder;[HrefToken()];playsoundto=[REF(player)]'>Play sound to</A> | "
body += "<A href='byond://?_src_=holder;[HrefToken()];languagemenu=[REF(player)]'>Language Menu</A>"
body += "<A href='byond://?_src_=holder;[HrefToken()];languagemenu=[REF(player)]'>Language Menu</A> | "
body += "<A href='byond://?_src_=holder;[HrefToken()];rpreminder=[REF(player)]'>Roleplay Reminder</A>"
if(player.client)
if(!isnewplayer(player))
@@ -449,8 +450,9 @@ ADMIN_VERB(lag_switch_panel, R_ADMIN, "Show Lag Switches", "Display the controls
user << browse(dat.Join(), "window=lag_switch_panel;size=420x480")
ADMIN_VERB(spawn_panel, R_SPAWN, "Spawn Panel", "Spawn Panel (TGUI).", ADMIN_CATEGORY_GAME)
var/datum/spawnpanel/panel = get_spawnpanel_for_admin(user.mob)
if(panel)
panel.ui_interact(user.mob)
var/datum/spawnpanel/panel = user.holder.spawn_panel
if(!panel)
panel = new()
user.holder.spawn_panel = panel
panel.ui_interact(user.mob)
BLACKBOX_LOG_ADMIN_VERB("Spawn Panel")
+2 -2
View File
@@ -1,6 +1,6 @@
ADMIN_VERB(toggle_game_debug, R_DEBUG, "Debug-Game", "Toggles game debugging.", ADMIN_CATEGORY_DEBUG)
GLOB.Debug2 = !GLOB.Debug2
var/message = "toggled debugging [(GLOB.Debug2 ? "ON" : "OFF")]"
GLOB.debugging_enabled = !GLOB.debugging_enabled
var/message = "toggled debugging [(GLOB.debugging_enabled ? "ON" : "OFF")]"
message_admins("[key_name_admin(user)] [message].")
log_admin("[key_name(user)] [message].")
BLACKBOX_LOG_ADMIN_VERB("Toggle Debug Two")
@@ -0,0 +1,57 @@
ADMIN_VERB(upload_jukebox_music, R_SERVER, "Jukebox Upload Music", "Upload a valid .ogg file to be accessed via the jukebox.", ADMIN_CATEGORY_SERVER)
var/file = input(user, "Select a .ogg file to upload to the jukebox.") as sound|null
if(!file)
return
// we could theorticly support other sound types but OGG is the better format from what I am aware and I am 100% sure its length is properly fetched.
if(!IS_OGG_FILE(file))
tgui_alert(user, "Invalid file type. Please select an OGG file.", "Loading error", list("Ok"))
return
var/list/track_data = splittext(file, "+")
if(track_data.len < 2)
if(tgui_alert(user, "Your song currently does not have a beat in deciseconds added to its title, e.g: SS13+5.ogg. Continue?", "Confirmation", list("Yes", "No")) != "Yes")
return
if(track_data.len > 2)
tgui_alert(user, "Titles should only have its title and beat in deciseconds, e.g: SS13+5.ogg", "Loading error", list("Ok"))
return
var/clean_name = SANITIZE_FILENAME("[file]")
var/save_path = "[CONFIG_JUKEBOX_SOUNDS][clean_name]"
// Copy uploaded file to the server
fcopy(file, save_path)
message_admins("[key_name_admin(user)] uploaded [clean_name] to the jukebox!")
to_chat(user, span_notice("Successfully uploaded [clean_name]!"))
ADMIN_VERB(browse_jukebox_music, R_SERVER, "Jukebox Browse Music", "Browse music files for moderation.", ADMIN_CATEGORY_SERVER)
var/list/files = flist(CONFIG_JUKEBOX_SOUNDS)
// Filter out things that are not sound files, like the exclude
for(var/thing in files)
if(!IS_SOUND_FILE(thing))
files -= thing
if(!files.len)
to_chat(user, span_warning("No uploaded tracks found."))
return
var/choice = tgui_input_list(user, "Select a track:", "Select Jukebox Music", files)
if(!choice)
return
var/path = "[CONFIG_JUKEBOX_SOUNDS][choice]"
switch(tgui_alert(user, "Play, Delete, or Download?", choice, list("Play", "Delete", "Download")))
if ("Play")
SEND_SOUND(user, sound(path))
if ("Delete")
fdel(path)
var/msg = "[key_name_admin(user)] deleted [choice] from the jukebox!"
message_admins(msg)
log_admin(msg)
SSblackbox.record_feedback("associative", "jukebox_deletion", 1, list("round_id" = "[GLOB.round_id]", "deletor" = "[key_name_admin(user)]", "deleted" = "[choice]"))
if ("Download")
user << ftp(file(path))
else
return
+1 -1
View File
@@ -554,7 +554,7 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage"))
for(var/mob/living/carbon/human/human_mob in GLOB.player_list)
to_chat(human_mob, span_bolddanger("You suddenly feel stupid."), confidential = TRUE)
human_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60, 80)
human_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 60, 80)
message_admins("[key_name_admin(holder)] made everybody brain damaged")
if("floorlava")
SSweather.run_weather(/datum/weather/floor_is_lava)
@@ -10,7 +10,7 @@
/datum/filter_editor/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Filteriffic")
ui = new(user, src, "Filterrific")
ui.open()
/datum/filter_editor/ui_static_data(mob/user)
@@ -21,7 +21,14 @@
/datum/filter_editor/ui_data()
var/list/data = list()
data["target_name"] = target.name
data["target_filter_data"] = target.filter_data
var/list/target_filter_data = list()
for (var/list/filter_info as anything in target.filter_data)
filter_info = deep_copy_list(filter_info)
if (filter_info["transform"])
var/matrix/filter_transform = filter_info["transform"]
filter_info["transform"] = list("a" = filter_transform.a, "b" = filter_transform.b, "c" = filter_transform.c, "d" = filter_transform.d, "e" = filter_transform.e, "f" = filter_transform.f)
target_filter_data += list(filter_info)
data["target_filter_data"] = target_filter_data
return data
/datum/filter_editor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
@@ -68,6 +75,16 @@
if(new_icon)
target.modify_filter(params["name"], list("icon" = new_icon))
. = TRUE
if("modify_transform_value")
var/list/filter_info = target.get_filter_data(params["name"])
if (!filter_info)
return
var/matrix/new_transform = matrix(filter_info[params["field_name"]])
if (!(params["transform_key"] in list("a", "b", "c", "d", "e", "f")))
return
new_transform.vars[params["transform_key"]] = text2num(params["transform_value"])
target.modify_filter(params["name"], list(params["field_name"] = new_transform))
. = TRUE
if("mass_apply")
if(!check_rights_for(usr.client, R_FUN))
to_chat(usr, span_userdanger("Stay in your lane, jannie."))
@@ -4,7 +4,7 @@
*
* More than just a completely true statement, this datum is created as a tgui interface
* allowing you to modify each vector until you know what you're doing.
* Much like filteriffic, 'nobody wants to learn matrix math' is meant for developers like you and I
* Much like filterrific, 'nobody wants to learn matrix math' is meant for developers like you and I
* to implement interesting matrix transformations without the hassle if needing to know... algebra? Damn, i'm stupid.
*/
/datum/nobody_wants_to_learn_matrix_math
+11 -11
View File
@@ -74,23 +74,23 @@
var/newamt
switch(Text)
if("brute")
L.adjustBruteLoss(amount, forced = TRUE)
newamt = L.getBruteLoss()
L.adjust_brute_loss(amount, forced = TRUE)
newamt = L.get_brute_loss()
if("fire")
L.adjustFireLoss(amount, forced = TRUE)
newamt = L.getFireLoss()
L.adjust_fire_loss(amount, forced = TRUE)
newamt = L.get_fire_loss()
if("toxin")
L.adjustToxLoss(amount, forced = TRUE)
newamt = L.getToxLoss()
L.adjust_tox_loss(amount, forced = TRUE)
newamt = L.get_tox_loss()
if("oxygen")
L.adjustOxyLoss(amount, forced = TRUE)
newamt = L.getOxyLoss()
L.adjust_oxy_loss(amount, forced = TRUE)
newamt = L.get_oxy_loss()
if("brain")
L.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount)
L.adjust_organ_loss(ORGAN_SLOT_BRAIN, amount)
newamt = L.get_organ_loss(ORGAN_SLOT_BRAIN)
if("stamina")
L.adjustStaminaLoss(amount, forced = TRUE)
newamt = L.getStaminaLoss()
L.adjust_stamina_loss(amount, forced = TRUE)
newamt = L.get_stamina_loss()
else
to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]", confidential = TRUE)
return