From fe35cc5927f873f7a3497d02a6389c9678a61a7f Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Wed, 6 Dec 2023 09:44:50 +0000 Subject: [PATCH 01/20] Forest Bugfix Bundle (#5127) # About the pull request Forest is stupid. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Fixes custom sent ERTs broadcasting when they shouldn't. fix: Fixes UPP friendly ERT telling staff it's hostile. /:cl: --- code/datums/emergency_calls/emergency_call.dm | 2 +- code/modules/admin/tabs/event_tab.dm | 21 ++++++++--------- code/modules/admin/topic/topic_events.dm | 23 ++++++++----------- .../mob/living/carbon/human/inventory.dm | 2 ++ 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index 9db46955a5ea..c6f71382b877 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -200,7 +200,7 @@ SSticker.mode.picked_calls += src show_join_message() //Show our potential candidates the message to let them join. - message_admins("Distress beacon: '[name]' activated [src.hostility? "[SPAN_WARNING("(THEY ARE HOSTILE)")]":"(they are friendly)"]. Looking for candidates.") + message_admins("Distress beacon: '[name]' activated [hostility? "[SPAN_WARNING("(THEY ARE HOSTILE)")]":"(they are friendly)"]. Looking for candidates.") if(!quiet_launch) marine_announcement("A distress beacon has been launched from the [MAIN_SHIP_NAME].", "Priority Alert", 'sound/AI/distressbeacon.ogg', logging = ARES_LOG_SECURITY) diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index ff558c341c4b..6ae974d2faea 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -217,18 +217,15 @@ if(!istype(chosen_ert)) return - - var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) - if(launch_broadcast == "Yes") - launch_broadcast = TRUE - else - launch_broadcast = FALSE - - var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) - if(announce_receipt == "Yes") + var/quiet_launch = TRUE + var/ql_prompt = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(ql_prompt == "Yes") + quiet_launch = FALSE + + var/announce_receipt = FALSE + var/ar_prompt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(ar_prompt == "Yes") announce_receipt = TRUE - else - announce_receipt = FALSE var/turf/override_spawn_loc var/prompt = tgui_alert(usr, "Spawn at their assigned spawn, or at your location?", "Spawnpoint Selection", list("Spawn", "Current Location"), 0) @@ -238,7 +235,7 @@ if(prompt == "Current Location") override_spawn_loc = get_turf(usr) - chosen_ert.activate(quiet_launch = launch_broadcast, announce_incoming = announce_receipt, override_spawn_loc = override_spawn_loc) + chosen_ert.activate(quiet_launch, announce_receipt, override_spawn_loc) message_admins("[key_name_admin(usr)] admin-called a [choice == "Randomize" ? "randomized ":""]distress beacon: [chosen_ert.name]") diff --git a/code/modules/admin/topic/topic_events.dm b/code/modules/admin/topic/topic_events.dm index 5e59ba4835f5..0c37e81f2641 100644 --- a/code/modules/admin/topic/topic_events.dm +++ b/code/modules/admin/topic/topic_events.dm @@ -205,20 +205,17 @@ em_call.mob_max = humans.len em_call.players_to_offer = humans em_call.owner = owner - - var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) - if(launch_broadcast == "Yes") - launch_broadcast = TRUE - else - launch_broadcast = FALSE - - var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) - if(announce_receipt == "Yes") + var/quiet_launch = TRUE + var/ql_prompt = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(ql_prompt == "Yes") + quiet_launch = FALSE + + var/announce_receipt = FALSE + var/ar_prompt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(ar_prompt == "Yes") announce_receipt = TRUE - else - announce_receipt = FALSE - - em_call.activate(launch_broadcast, announce_receipt) + log_debug("ERT DEBUG (CUSTOM SET): [quiet_launch] - [announce_receipt]") + em_call.activate(quiet_launch, announce_receipt) message_admins("[key_name_admin(usr)] created [humans_to_spawn] humans as [job_name] at [get_area(initial_spot)]") diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index b86a6a625f57..b54f03e2ce7d 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -550,6 +550,7 @@ to_chat(src, SPAN_WARNING("You can't put \the [interact_item.name] on [target_mob]!")) return visible_message(SPAN_NOTICE("[src] tries to put \the [interact_item.name] on [target_mob]."), null, null, 5) + log_interact(src, target_mob, "[key_name(src)] attempted to put [interact_item.name] on [key_name(target_mob)]'s ([slot_to_process]).") if(do_after(src, get_strip_delay(src, target_mob), INTERRUPT_ALL, BUSY_ICON_GENERIC, target_mob, INTERRUPT_MOVED, BUSY_ICON_GENERIC)) if(interact_item == get_active_hand() && !target_mob.get_item_by_slot(slot_to_process) && Adjacent(target_mob)) if(interact_item.flags_item & WIELDED) //to prevent re-wielding it during the do_after @@ -558,6 +559,7 @@ drop_inv_item_on_ground(interact_item) if(interact_item && !QDELETED(interact_item)) //Might be self-deleted? target_mob.equip_to_slot_if_possible(interact_item, slot_to_process, 1, 0, 1, 1) + log_interact(src, target_mob, "[key_name(src)] put [interact_item.name] on [key_name(target_mob)]'s ([slot_to_process]) successfully.") if(ishuman(target_mob) && target_mob.stat == DEAD) var/mob/living/carbon/human/human_target = target_mob human_target.disable_lights() // take that powergamers -spookydonut From fbb5cff339eb5ed000ab07169740ba7865ddd27d Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 6 Dec 2023 09:53:18 +0000 Subject: [PATCH 02/20] Automatic changelog for PR #5127 [ci skip] --- html/changelogs/AutoChangeLog-pr-5127.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5127.yml diff --git a/html/changelogs/AutoChangeLog-pr-5127.yml b/html/changelogs/AutoChangeLog-pr-5127.yml new file mode 100644 index 000000000000..6aa332377bce --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5127.yml @@ -0,0 +1,5 @@ +author: "realforest2001" +delete-after: True +changes: + - bugfix: "Fixes custom sent ERTs broadcasting when they shouldn't." + - bugfix: "Fixes UPP friendly ERT telling staff it's hostile." \ No newline at end of file From 48e26a8ad1186a39c9f0b75e82eaa3e6becfc5a7 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Wed, 6 Dec 2023 09:55:13 +0000 Subject: [PATCH 03/20] Fixes a freeze when opening the 'Create Object' panel (#5125) # About the pull request Removes the long freeze when opening the 'Create Object' interface through the game panel. This was caused by line 40 of `create_object.html`, which attempts to fill the object list with every subtype of `/obj` when the interface is first opened. The "fix" was just removing that line. https://github.com/cmss13-devs/cmss13/blob/0b133929724c569aff3945749c65559c4e65e4c5/html/create_object.html#L33-L42 This does mean that the user has to search for a type before anything shows up, but I would consider that a pretty minor trade-off.
I also increased the window size so that the 'Spawn' button is on the screen by default, removed a couple of empty `value`s, and added some spaces so that the HTML code lines up a bit more with the final UI. # Explain why it's good for the game Fixes a 30ish second freeze for admins. (Give or take a bit, but it's still long either way.) # Testing Photographs and Procedure
Videos **Before:** https://github.com/cmss13-devs/cmss13/assets/57483089/6d5d0aa7-74a9-4fbc-b78f-4bd6a960af87 **After:** https://github.com/cmss13-devs/cmss13/assets/57483089/93fc0f99-41a5-4df6-9061-38740aa0e751
# Changelog :cl: admin: Fixed a freeze when opening the the 'Create Object' interface. admin: Adjusted the size and positioning of the 'Create Object/Mob/Turf' panels so that everything fits into the window. /:cl: --- code/modules/admin/create_mob.dm | 2 +- code/modules/admin/create_object.dm | 4 ++-- code/modules/admin/create_turf.dm | 2 +- html/create_object.html | 13 +++++++------ 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 9ac4c5f807ea..910bafd50a9b 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -8,4 +8,4 @@ create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"") create_mob_html = replacetext(create_mob_html, "/* href token */", RawHrefToken(forceGlobal = TRUE)) - show_browser(user, replacetext(create_mob_html, "/* ref src */", "\ref[src]"), "Create Mob", "create_mob", "size=425x475") + show_browser(user, replacetext(create_mob_html, "/* ref src */", "\ref[src]"), "Create Mob", "create_mob", "size=450x525") diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm index 3b1f978dd50a..054fc20aef5e 100644 --- a/code/modules/admin/create_object.dm +++ b/code/modules/admin/create_object.dm @@ -8,7 +8,7 @@ create_object_html = replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"") create_object_html = replacetext(create_object_html, "/* href token */", RawHrefToken(forceGlobal = TRUE)) - show_browser(user, replacetext(create_object_html, "/* ref src */", "\ref[src]"), "Create Object", "create_object", "size=425x475") + show_browser(user, replacetext(create_object_html, "/* ref src */", "\ref[src]"), "Create Object", "create_object", "size=450x525") /datum/admins/proc/quick_create_object(mob/user) @@ -46,4 +46,4 @@ quick_create_object_html = replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"") quick_create_object_html = replacetext(quick_create_object_html, "/* href token */", RawHrefToken(forceGlobal = TRUE)) - show_browser(user, replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "Quick Create Object", "quick_create_object", "size=425x475") + show_browser(user, replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "Quick Create Object", "quick_create_object", "size=450x525") diff --git a/code/modules/admin/create_turf.dm b/code/modules/admin/create_turf.dm index 1535c303bcd9..cc8bd1a5ec77 100644 --- a/code/modules/admin/create_turf.dm +++ b/code/modules/admin/create_turf.dm @@ -8,4 +8,4 @@ create_turf_html = replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"") create_turf_html = replacetext(create_turf_html, "/* href token */", RawHrefToken(forceGlobal = TRUE)) - show_browser(usr, replacetext(create_turf_html, "/* ref src */", "\ref[src]"), "Create Turf", "create_turf", "size=425x475") + show_browser(usr, replacetext(create_turf_html, "/* ref src */", "\ref[src]"), "Create Turf", "create_turf", "size=450x525") diff --git a/html/create_object.html b/html/create_object.html index a4c3085a9ac6..8e67b99aebca 100644 --- a/html/create_object.html +++ b/html/create_object.html @@ -9,16 +9,17 @@
- Type
- Offset: + Offset: A R
Number: Dir: - Name:
+ Name:
+ Where:

+
@@ -37,13 +39,11 @@ var objects = object_paths == null ? new Array() : object_paths.split(";"); document.spawner.filter.focus(); - populateList(objects); function populateList(from_list) { object_list.options.length = 0; - var i; - for (i in from_list) { + for (var i in from_list) { var new_option = document.createElement("option"); new_option.value = from_list[i]; new_option.text = from_list[i]; @@ -71,6 +71,7 @@ return false; } + // Carriage return if (event.keyCode == 13 || event.which == 13) { object_list.options[0].selected = 'true'; } From 464bae1f4b529639acf28b9390c1c983ea0bd5d5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:03:54 +0000 Subject: [PATCH 04/20] Automatic changelog for PR #5125 [ci skip] --- html/changelogs/AutoChangeLog-pr-5125.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5125.yml diff --git a/html/changelogs/AutoChangeLog-pr-5125.yml b/html/changelogs/AutoChangeLog-pr-5125.yml new file mode 100644 index 000000000000..236ad26c2f8d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5125.yml @@ -0,0 +1,5 @@ +author: "SabreML" +delete-after: True +changes: + - admin: "Fixed a freeze when opening the the 'Create Object' interface." + - admin: "Adjusted the size and positioning of the 'Create Object/Mob/Turf' panels so that everything fits into the window." \ No newline at end of file From 8152651ec39936722c9e60362877b935e3a865c0 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Wed, 6 Dec 2023 01:56:48 -0800 Subject: [PATCH 05/20] Check_keybindings now only saves keybinds rather than everything (#5120) # About the pull request This PR is a followup to #5110 and #2926 making it so we only save the `key_bindings` value rather than all preferences. I'd be inclined to just not save at all, but the initial commit on the ported input system has us saving `remembered_key_bindings` just a few lines down anyways so no matter what we're writing something. # Explain why it's good for the game Should better future proof this trampling preferences, but still retain existing behavior where any automatically rebound keys are immediately saved. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Drathek code: Reduced most preference re-saving when preferences are initially loaded /:cl: --- code/modules/client/preferences_savefile.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 4ba42c0e39c3..c67effe90eb1 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -274,6 +274,7 @@ vars["fps"] = fps check_keybindings() + S["key_bindings"] << key_bindings if(remembered_key_bindings) for(var/i in GLOB.keybindings_by_name) @@ -652,7 +653,7 @@ addedbind = TRUE if(!addedbind) notadded += kb - save_preferences() + if(length(notadded)) addtimer(CALLBACK(src, PROC_REF(announce_conflict), notadded), 5 SECONDS) From f1bd5420e83f2d9056a2fd0d64429e2f21d2d059 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:16:51 +0000 Subject: [PATCH 06/20] Automatic changelog for PR #5120 [ci skip] --- html/changelogs/AutoChangeLog-pr-5120.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5120.yml diff --git a/html/changelogs/AutoChangeLog-pr-5120.yml b/html/changelogs/AutoChangeLog-pr-5120.yml new file mode 100644 index 000000000000..eb9c6fc96e9a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5120.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - code_imp: "Reduced most preference re-saving when preferences are initially loaded" \ No newline at end of file From cc21f9b32a38617376813f7e25c5a745fce22ea5 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Wed, 6 Dec 2023 01:58:58 -0800 Subject: [PATCH 07/20] Fix Nano Subsystem Init Error (#5119) # About the pull request This PR fixes an unintended change made in #4940 where the flag for the nano subsystem was changed. If Initialize was used instead of New this change would be correct, but using New is intentional. # Explain why it's good for the game Fixes: `Initialized Nano UI subsystem with errors within 0 seconds!` and `[20:19:57]WARNING: Nano UI subsystem does not implement Initialize() or it returns ..(). If the former is true, the SS_NO_INIT flag should be set for this subsystem.` # Testing Photographs and Procedure
Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/5b32237a-cc7e-4bd6-95fc-1a3ac41c382b)
# Changelog :cl: Drathek fix: Fix some errors regarding the nano subystem /:cl: --- code/controllers/subsystem/nanoui.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/controllers/subsystem/nanoui.dm b/code/controllers/subsystem/nanoui.dm index d89474dd50f1..85ad0d32aaf4 100644 --- a/code/controllers/subsystem/nanoui.dm +++ b/code/controllers/subsystem/nanoui.dm @@ -1,5 +1,6 @@ SUBSYSTEM_DEF(nano) name = "Nano UI" + flags = SS_NO_INIT wait = 2 SECONDS priority = SS_PRIORITY_NANOUI runlevels = RUNLEVELS_DEFAULT|RUNLEVEL_LOBBY From fdb95cb3e1465e3440e7be0cfba1704295d18a44 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:34:52 +0000 Subject: [PATCH 08/20] Automatic changelog for PR #5119 [ci skip] --- html/changelogs/AutoChangeLog-pr-5119.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5119.yml diff --git a/html/changelogs/AutoChangeLog-pr-5119.yml b/html/changelogs/AutoChangeLog-pr-5119.yml new file mode 100644 index 000000000000..5ec2e0a33e33 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5119.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fix some errors regarding the nano subystem" \ No newline at end of file From 8d379bfc81d456265041a3a3471b9c363818c948 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:22:50 +0000 Subject: [PATCH 09/20] Datacore Maintenance (#5099) # About the pull request A bit of maintenance for the generic datacore, changes one letter vars & makes it so that when viewing the list of datacore entries for human players it is possible to determine who's entry is who's without opening up a hundred of them one by one. # Explain why it's good for the game QOL # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: code: Cleaned up 1 letter vars in the global datacore. Also made the entry names reflect the real name of who they relate to, for VV purposes. /:cl: --- code/__HELPERS/unsorted.dm | 7 +- code/datums/datacore.dm | 192 +++++++++++++++++----------------- code/defines/procs/records.dm | 90 ++++++++-------- 3 files changed, 148 insertions(+), 141 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a7af9d7f6324..0782826a4dc9 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -281,9 +281,10 @@ //update the datacore records! This is goig to be a bit costly. var/mob_ref = WEAKREF(src) for(var/list/L in list(GLOB.data_core.general, GLOB.data_core.medical, GLOB.data_core.security, GLOB.data_core.locked)) - for(var/datum/data/record/R in L) - if(R.fields["ref"] == mob_ref) - R.fields["name"] = newname + for(var/datum/data/record/record_entry in L) + if(record_entry.fields["ref"] == mob_ref) + record_entry.fields["name"] = newname + record_entry.name = newname break //update our pda and id if we have them on our person diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 02cbc5b2d019..933b547aa1f2 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -32,12 +32,12 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) ) departments += marines_by_squad var/list/manifest_out = list() - for(var/datum/data/record/t in GLOB.data_core.general) - if(t.fields["mob_faction"] != FACTION_MARINE) //we process only USCM humans + for(var/datum/data/record/record_entry in GLOB.data_core.general) + if(record_entry.fields["mob_faction"] != FACTION_MARINE) //we process only USCM humans continue - var/name = t.fields["name"] - var/rank = t.fields["rank"] - var/squad = t.fields["squad"] + var/name = record_entry.fields["name"] + var/rank = record_entry.fields["rank"] + var/squad = record_entry.fields["squad"] if(isnull(name) || isnull(rank)) continue var/has_department = FALSE @@ -85,14 +85,14 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) var/dept_flags = NO_FLAGS //Is there anybody in the department?. var/list/squad_sublists = GLOB.ROLES_SQUAD_ALL.Copy() //Are there any marines in the squad? - for(var/datum/data/record/t in GLOB.data_core.general) - if(t.fields["mob_faction"] != FACTION_MARINE) //we process only USCM humans + for(var/datum/data/record/record_entry in GLOB.data_core.general) + if(record_entry.fields["mob_faction"] != FACTION_MARINE) //we process only USCM humans continue - var/name = t.fields["name"] - var/rank = t.fields["rank"] - var/real_rank = t.fields["real_rank"] - var/squad_name = t.fields["squad"] + var/name = record_entry.fields["name"] + var/rank = record_entry.fields["rank"] + var/real_rank = record_entry.fields["real_rank"] + var/squad_name = record_entry.fields["squad"] if(isnull(name) || isnull(rank) || isnull(real_rank)) continue @@ -104,7 +104,7 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) break isactive[name] = active ? "Active" : "Inactive" else - isactive[name] = t.fields["p_stat"] + isactive[name] = record_entry.fields["p_stat"] //cael - to prevent multiple appearances of a player/job combination, add a continue after each line if(real_rank in GLOB.ROLES_CIC) @@ -216,14 +216,14 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) var/datum/data/record/foundrecord var/use_name = isnull(ref) - for(var/datum/data/record/t in GLOB.data_core.general) + for(var/datum/data/record/record_entry in GLOB.data_core.general) if(use_name) - if(t.fields["name"] == name) - foundrecord = t + if(record_entry.fields["name"] == name) + foundrecord = record_entry break else - if(t.fields["ref"] == ref) - foundrecord = t + if(record_entry.fields["ref"] == ref) + foundrecord = record_entry break if(foundrecord) @@ -239,102 +239,106 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) return TRUE return FALSE -/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H) +/datum/datacore/proc/manifest_inject(mob/living/carbon/human/target) var/assignment - if(H.job) - assignment = H.job + if(target.job) + assignment = target.job else assignment = "Unassigned" - var/id = add_zero(num2hex(H.gid), 6) //this was the best they could come up with? A large random number? *sigh* + var/id = add_zero(num2hex(target.gid), 6) //this was the best they could come up with? A large random number? *sigh* //var/icon/front = new(get_id_photo(H), dir = SOUTH) //var/icon/side = new(get_id_photo(H), dir = WEST) //General Record - var/datum/data/record/G = new() - G.fields["id"] = id - G.fields["name"] = H.real_name - G.fields["real_rank"] = H.job - G.fields["rank"] = assignment - G.fields["squad"] = H.assigned_squad ? H.assigned_squad.name : null - G.fields["age"] = H.age - G.fields["p_stat"] = "Active" - G.fields["m_stat"] = "Stable" - G.fields["sex"] = H.gender - G.fields["species"] = H.get_species() - G.fields["origin"] = H.origin - G.fields["faction"] = H.personal_faction - G.fields["mob_faction"] = H.faction - G.fields["religion"] = H.religion - G.fields["ref"] = WEAKREF(H) - //G.fields["photo_front"] = front - //G.fields["photo_side"] = side - - if(H.gen_record && !jobban_isbanned(H, "Records")) - G.fields["notes"] = H.gen_record + var/datum/data/record/record_general = new() + record_general.fields["id"] = id + record_general.fields["name"] = target.real_name + record_general.name = target.real_name + record_general.fields["real_rank"] = target.job + record_general.fields["rank"] = assignment + record_general.fields["squad"] = target.assigned_squad ? target.assigned_squad.name : null + record_general.fields["age"] = target.age + record_general.fields["p_stat"] = "Active" + record_general.fields["m_stat"] = "Stable" + record_general.fields["sex"] = target.gender + record_general.fields["species"] = target.get_species() + record_general.fields["origin"] = target.origin + record_general.fields["faction"] = target.personal_faction + record_general.fields["mob_faction"] = target.faction + record_general.fields["religion"] = target.religion + record_general.fields["ref"] = WEAKREF(target) + //record_general.fields["photo_front"] = front + //record_general.fields["photo_side"] = side + + if(target.gen_record && !jobban_isbanned(target, "Records")) + record_general.fields["notes"] = target.gen_record else - G.fields["notes"] = "No notes found." - general += G + record_general.fields["notes"] = "No notes found." + general += record_general //Medical Record - var/datum/data/record/M = new() - M.fields["id"] = id - M.fields["name"] = H.real_name - M.fields["b_type"] = H.blood_type - M.fields["mi_dis"] = "None" - M.fields["mi_dis_d"] = "No minor disabilities have been declared." - M.fields["ma_dis"] = "None" - M.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - M.fields["alg"] = "None" - M.fields["alg_d"] = "No allergies have been detected in this patient." - M.fields["cdi"] = "None" - M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - M.fields["last_scan_time"] = null - M.fields["last_scan_result"] = "No scan data on record" // body scanner results - M.fields["autodoc_data"] = list() - M.fields["autodoc_manual"] = list() - M.fields["ref"] = WEAKREF(H) - - if(H.med_record && !jobban_isbanned(H, "Records")) - M.fields["notes"] = H.med_record + var/datum/data/record/record_medical = new() + record_medical.fields["id"] = id + record_medical.fields["name"] = target.real_name + record_medical.name = target.name + record_medical.fields["b_type"] = target.blood_type + record_medical.fields["mi_dis"] = "None" + record_medical.fields["mi_dis_d"] = "No minor disabilities have been declared." + record_medical.fields["ma_dis"] = "None" + record_medical.fields["ma_dis_d"] = "No major disabilities have been diagnosed." + record_medical.fields["alg"] = "None" + record_medical.fields["alg_d"] = "No allergies have been detected in this patient." + record_medical.fields["cdi"] = "None" + record_medical.fields["cdi_d"] = "No diseases have been diagnosed at the moment." + record_medical.fields["last_scan_time"] = null + record_medical.fields["last_scan_result"] = "No scan data on record" // body scanner results + record_medical.fields["autodoc_data"] = list() + record_medical.fields["autodoc_manual"] = list() + record_medical.fields["ref"] = WEAKREF(target) + + if(target.med_record && !jobban_isbanned(target, "Records")) + record_medical.fields["notes"] = target.med_record else - M.fields["notes"] = "No notes found." - medical += M + record_medical.fields["notes"] = "No notes found." + medical += record_medical //Security Record - var/datum/data/record/S = new() - S.fields["id"] = id - S.fields["name"] = H.real_name - S.fields["criminal"] = "None" - S.fields["incident"] = "" - S.fields["ref"] = WEAKREF(H) + var/datum/data/record/record_security = new() + record_security.fields["id"] = id + record_security.fields["name"] = target.real_name + record_security.name = target.real_name + record_security.fields["criminal"] = "None" + record_security.fields["incident"] = "" + record_security.fields["ref"] = WEAKREF(target) - if(H.sec_record && !jobban_isbanned(H, "Records")) - var/new_comment = list("entry" = H.sec_record, "created_by" = list("name" = "\[REDACTED\]", "rank" = "Military Police"), "deleted_by" = null, "deleted_at" = null, "created_at" = "Pre-Deployment") - S.fields["comments"] = list("1" = new_comment) - S.fields["notes"] = H.sec_record - security += S + if(target.sec_record && !jobban_isbanned(target, "Records")) + var/new_comment = list("entry" = target.sec_record, "created_by" = list("name" = "\[REDACTED\]", "rank" = "Military Police"), "deleted_by" = null, "deleted_at" = null, "created_at" = "Pre-Deployment") + record_security.fields["comments"] = list("1" = new_comment) + record_security.fields["notes"] = target.sec_record + security += record_security //Locked Record - var/datum/data/record/L = new() - L.fields["id"] = md5("[H.real_name][H.job]") - L.fields["name"] = H.real_name - L.fields["rank"] = H.job - L.fields["age"] = H.age - L.fields["sex"] = H.gender - L.fields["b_type"] = H.b_type - L.fields["species"] = H.get_species() - L.fields["origin"] = H.origin - L.fields["faction"] = H.personal_faction - L.fields["religion"] = H.religion - L.fields["ref"] = WEAKREF(H) - - if(H.exploit_record && !jobban_isbanned(H, "Records")) - L.fields["exploit_record"] = H.exploit_record + var/datum/data/record/record_locked = new() + record_locked.fields["id"] = md5("[target.real_name][target.job]") + record_locked.fields["name"] = target.real_name + record_locked.name = target.real_name + record_locked.fields["rank"] = target.job + record_locked.fields["age"] = target.age + record_locked.fields["sex"] = target.gender + record_locked.fields["b_type"] = target.b_type + record_locked.fields["species"] = target.get_species() + record_locked.fields["origin"] = target.origin + record_locked.fields["faction"] = target.personal_faction + record_locked.fields["religion"] = target.religion + record_locked.fields["ref"] = WEAKREF(target) + + if(target.exploit_record && !jobban_isbanned(target, "Records")) + record_locked.fields["exploit_record"] = target.exploit_record else - L.fields["exploit_record"] = "No additional information acquired." - locked += L + record_locked.fields["exploit_record"] = "No additional information acquired." + locked += record_locked /proc/get_id_photo(mob/living/carbon/human/H) diff --git a/code/defines/procs/records.dm b/code/defines/procs/records.dm index a1e2ade2b709..a9d40f993629 100644 --- a/code/defines/procs/records.dm +++ b/code/defines/procs/records.dm @@ -1,48 +1,50 @@ /proc/CreateGeneralRecord() - var/datum/data/record/G = new /datum/data/record() - G.fields["name"] = "New Record" - G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6)) - G.fields["rank"] = "Unassigned" - G.fields["real_rank"] = "Unassigned" - G.fields["sex"] = "Male" - G.fields["age"] = "Unknown" - G.fields["ethnicity"] = "Unknown" - G.fields["p_stat"] = "Active" - G.fields["m_stat"] = "Stable" - G.fields["species"] = "Human" - G.fields["origin"] = "Unknown" - G.fields["faction"] = "Unknown" - G.fields["mob_faction"] = "Unknown" - G.fields["religion"] = "Unknown" - GLOB.data_core.general += G - return G + var/datum/data/record/general_record = new /datum/data/record() + general_record.fields["name"] = "New Record" + general_record.name = "New Record" + general_record.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6)) + general_record.fields["rank"] = "Unassigned" + general_record.fields["real_rank"] = "Unassigned" + general_record.fields["sex"] = "Male" + general_record.fields["age"] = "Unknown" + general_record.fields["ethnicity"] = "Unknown" + general_record.fields["p_stat"] = "Active" + general_record.fields["m_stat"] = "Stable" + general_record.fields["species"] = "Human" + general_record.fields["origin"] = "Unknown" + general_record.fields["faction"] = "Unknown" + general_record.fields["mob_faction"] = "Unknown" + general_record.fields["religion"] = "Unknown" + GLOB.data_core.general += general_record + return general_record /proc/CreateSecurityRecord(name as text, id as text) - var/datum/data/record/R = new /datum/data/record() - R.fields["name"] = name - R.fields["id"] = id - R.name = text("Security Record #[id]") - R.fields["incidents"] = "None" - GLOB.data_core.security += R - return R + var/datum/data/record/security_record = new /datum/data/record() + security_record.fields["name"] = name + security_record.fields["id"] = id + security_record.name = text("Security Record #[id]") + security_record.fields["incidents"] = "None" + GLOB.data_core.security += security_record + return security_record -/proc/create_medical_record(mob/living/carbon/human/H) - var/datum/data/record/M = new /datum/data/record() - M.fields["id"] = null - M.fields["name"] = H.real_name - M.fields["b_type"] = H.b_type - M.fields["mi_dis"] = "None" - M.fields["mi_dis_d"] = "No minor disabilities have been declared." - M.fields["ma_dis"] = "None" - M.fields["ma_dis_d"] = "No major disabilities have been diagnosed." - M.fields["alg"] = "None" - M.fields["alg_d"] = "No allergies have been detected in this patient." - M.fields["cdi"] = "None" - M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - M.fields["last_scan_time"] = null - M.fields["last_scan_result"] = "No scan data on record" - M.fields["autodoc_data"] = list() - M.fields["autodoc_manual"] = list() - M.fields["ref"] = WEAKREF(H) - GLOB.data_core.medical += M - return M +/proc/create_medical_record(mob/living/carbon/human/person) + var/datum/data/record/medical_record = new /datum/data/record() + medical_record.fields["id"] = null + medical_record.fields["name"] = person.real_name + medical_record.name = person.real_name + medical_record.fields["b_type"] = person.b_type + medical_record.fields["mi_dis"] = "None" + medical_record.fields["mi_dis_d"] = "No minor disabilities have been declared." + medical_record.fields["ma_dis"] = "None" + medical_record.fields["ma_dis_d"] = "No major disabilities have been diagnosed." + medical_record.fields["alg"] = "None" + medical_record.fields["alg_d"] = "No allergies have been detected in this patient." + medical_record.fields["cdi"] = "None" + medical_record.fields["cdi_d"] = "No diseases have been diagnosed at the moment." + medical_record.fields["last_scan_time"] = null + medical_record.fields["last_scan_result"] = "No scan data on record" + medical_record.fields["autodoc_data"] = list() + medical_record.fields["autodoc_manual"] = list() + medical_record.fields["ref"] = WEAKREF(person) + GLOB.data_core.medical += medical_record + return medical_record From f1cfdbdd508f8fa0241e1376727a47040755fb2b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:48:09 +0000 Subject: [PATCH 10/20] Automatic changelog for PR #5099 [ci skip] --- html/changelogs/AutoChangeLog-pr-5099.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5099.yml diff --git a/html/changelogs/AutoChangeLog-pr-5099.yml b/html/changelogs/AutoChangeLog-pr-5099.yml new file mode 100644 index 000000000000..bbdd8c2954be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5099.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - code_imp: "Cleaned up 1 letter vars in the global datacore. Also made the entry names reflect the real name of who they relate to, for VV purposes." \ No newline at end of file From f4f334de22e5d2782f35115a9b1461326e1c4a8c Mon Sep 17 00:00:00 2001 From: Doubleumc Date: Wed, 6 Dec 2023 05:38:20 -0500 Subject: [PATCH 11/20] Vehicle autofire (#4959) # About the pull request Convert vehicle hardpoints from using their bespoke firing system to one structured closely on handheld guns and deployables such as the M2C. Now using the `autofire` component. Much like handheld weapons it is capable of different firemodes (semi/burst/auto) and changing targets during fire. Hardpoints were converted to match their old effectiveness as closely as possible; this is intended as a quality of life improvement, not a rebalance. Damage, AP, range, ammo, etc were not touched. Fire rates were copied over directly. Single-fire weapons with long delays were made semi-auto (e.g. LTB), and those with short delays were made full-auto (e.g. autocannon). Burst-fire weapons with significant extra delays after the burst remained burst-fire (cupola, smokescreen), and the rest were converted to full-auto (e.g. dual cannon). While changing firemodes is easily implemented, no weapon seemed a good candidate for more than one firemode and so that is omitted for now. Scatter was approximated. The existing `accuracy` functioned as a percent chance the shot would stray one tile from the target. Gun-style `scatter` is instead a cone of fire in degrees. No direct conversion is possible, so scatter values are roughly set such that firing at a tile at the edge of the screen should "feel" about as accurate. Closer ranges would experience less spread than before, longer ranges more. The buffing weapon sensor module was adjusted to work with the new firing system, and effects hardpoint scatter angle and firing rate. Vehicle buffs still use multipliers instead of adding/subtracting as handheld guns do, as a flat +/- adjustment to fire delay would have a significantly different effect on slow firing weapons (e.g. LTB) vs fast firing (e.g. autocannon). One major difference is that burstfire delays are effected and buffs increases the burst density. Before, there was a single cooldown initiated at the start of the burst, and only that cooldown was modified by the buff. Now, since the inter-burst delay is needed by the `autofire` component both the inter-burst delay and the after-burst delay are modified by buffs. Activating non-selected hardpoints was removed as not compatible. The issue is that tracking a single click's modifiers is no longer sufficient, it has to track through the whole mousedown-to-mouseup period and the user can change multiple click modifiers in that time. I could not find a method that was satisfactory without a much bigger overhaul of vehicle controls than I'd like to take on in a PR not meant for it. I'm sure it can be done, but that brings up the question of if that's even the control scheme we'd want, in a PR that was never meant to ask that question let alone answer it. # Explain why it's good for the game Vehicle weapons using `gun`-like code makes them easier and more familiar to use, and more code commonality makes maintenance just a little bit easier. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: refactor: vehicle weapons can fire full-auto del: no more controls for firing vehicle non-selected weapons /:cl: --- code/modules/vehicles/hardpoints/hardpoint.dm | 441 ++++++++++++------ .../vehicles/hardpoints/holder/holder.dm | 24 +- .../vehicles/hardpoints/holder/tank_turret.dm | 46 +- .../vehicles/hardpoints/primary/autocannon.dm | 9 +- .../hardpoints/primary/dual_cannon.dm | 29 +- .../vehicles/hardpoints/primary/flamer.dm | 37 +- .../vehicles/hardpoints/primary/ltb.dm | 5 +- .../vehicles/hardpoints/primary/minigun.dm | 86 ++-- .../vehicles/hardpoints/secondary/cupola.dm | 31 +- .../vehicles/hardpoints/secondary/flamer.dm | 47 +- .../hardpoints/secondary/frontal_cannon.dm | 29 +- .../hardpoints/secondary/grenade_launcher.dm | 41 +- .../vehicles/hardpoints/secondary/tow.dm | 6 +- .../hardpoints/special/firing_port_weapon.dm | 93 ++-- .../vehicles/hardpoints/support/artillery.dm | 9 +- .../vehicles/hardpoints/support/flare.dm | 5 +- .../vehicles/interior/interactable/seats.dm | 6 +- code/modules/vehicles/multitile/multitile.dm | 9 + .../multitile/multitile_hardpoints.dm | 44 -- .../multitile/multitile_interaction.dm | 111 ++--- .../vehicles/multitile/multitile_verbs.dm | 13 +- 21 files changed, 550 insertions(+), 571 deletions(-) diff --git a/code/modules/vehicles/hardpoints/hardpoint.dm b/code/modules/vehicles/hardpoints/hardpoint.dm index 5963b0b4e36b..acdefca18fd2 100644 --- a/code/modules/vehicles/hardpoints/hardpoint.dm +++ b/code/modules/vehicles/hardpoints/hardpoint.dm @@ -1,22 +1,20 @@ -/* - Hardpoints are any items that attach to a base vehicle, such as wheels/treads, support systems and guns -*/ - +/** + * Hardpoints are any items that attach to a base vehicle, such as wheels/treads, support systems and guns + */ /obj/item/hardpoint //------MAIN VARS---------- - // Which slot is this hardpoint in - // Purely to check for conflicting hardpoints + /// Which slot is this hardpoint in. Purely to check for conflicting hardpoints. var/slot - // The vehicle this hardpoint is installed on + /// The vehicle this hardpoint is installed on. var/obj/vehicle/multitile/owner health = 100 w_class = SIZE_LARGE - // Determines how much of any incoming damage is actually taken + /// Determines how much of any incoming damage is actually taken. var/damage_multiplier = 1 - // Origin coords of the hardpoint relative to the vehicle + /// Origin coords of the hardpoint relative to the vehicle. var/list/origins = list(0, 0) var/list/buff_multipliers @@ -32,13 +30,13 @@ var/disp_icon //This also differentiates tank vs apc vs other var/disp_icon_state - // List of pixel offsets for each direction + /// List of pixel offsets for each direction. var/list/px_offsets - //visual layer of hardpoint when on vehicle + /// Visual layer of hardpoint when on vehicle. var/hdpt_layer = HDPT_LAYER_WHEELS - // List of offsets for where to place the muzzle flash for each direction + /// List of offsets for where to place the muzzle flash for each direction. var/list/muzzle_flash_pos = list( "1" = list(0, 0), "2" = list(0, 0), @@ -54,33 +52,23 @@ var/const_mz_offset_y = 0 //------SOUNDS VARS---------- - // Sounds to play when the module activated/fired + /// Sounds to play when the module activated/fired. var/list/activation_sounds //------INTERACTION VARS---------- - //which seat can use this module + /// Which seat can use this module. var/allowed_seat = VEHICLE_GUNNER - //Cooldown on use of the hardpoint - var/cooldown = 100 - var/next_use = 0 - - //whether hardpoint has activatable ability like shooting or zooming + /// Whether hardpoint has activatable ability like shooting or zooming. var/activatable = 0 - //used to prevent welder click spam + /// Used to prevent welder click spam. var/being_repaired = FALSE - //current user. We can have only one user at a time. Better never change that - var/user - - //Accuracy of the hardpoint. (which is, in fact, a scatter. Need to change this system) - var/accuracy = 1 - - // The firing arc of this hardpoint + /// The firing arc of this hardpoint. var/firing_arc = 0 //in degrees. 0 skips whole arc of fire check // Muzzleflash @@ -91,17 +79,53 @@ //------AMMUNITION VARS---------- - //Currently loaded ammo that we shoot from + /// Currently loaded ammo that we shoot from. var/obj/item/ammo_magazine/hardpoint/ammo - //spare magazines that we can reload from + /// Spare magazines that we can reload from. var/list/backup_clips - //maximum amount of spare mags + /// Maximum amount of spare mags. var/max_clips = 0 /// An assoc list in the format list(/datum/element/bullet_trait_to_give = list(...args)) - /// that will be given to a projectile fired from the hardpoint + /// that will be given to a projectile fired from the hardpoint. var/list/list/traits_to_give + /// How much the bullet scatters when fired, in degrees. + var/scatter = 0 + /// How many bullets the gun fired while burst firing/auto firing. + var/shots_fired = 0 + /// Delay before a new firing sequence can start. + COOLDOWN_DECLARE(fire_cooldown) + + // Firemodes. + /// Current selected firemode of the gun. + var/gun_firemode = GUN_FIREMODE_SEMIAUTO + /// List of allowed firemodes. + var/list/gun_firemode_list = list( + GUN_FIREMODE_SEMIAUTO, + ) + + // Semi-auto and full-auto. + /// For regular shots, how long to wait before firing again. Use modify_fire_delay and set_fire_delay instead of modifying this on the fly + var/fire_delay = 0 + /// The multiplier for how much slower this should fire in automatic mode. 1 is normal, 1.2 is 20% slower, 2 is 100% slower, etc. Protected due to it never needing to be edited. + var/autofire_slow_mult = 1 + /// If the gun is currently auto firing. + var/auto_firing = FALSE + + // Burst fire. + /// How many shots can the weapon shoot in burst? Anything less than 2 and you cannot toggle burst. Use modify_burst_amount and set_burst_amount instead of modifying this + var/burst_amount = 1 + /// The delay in between shots. Lower = less delay = faster. Use modify_burst_delay and set_burst_delay instead of modifying this + var/burst_delay = 1 + /// When burst-firing, this number is extra time before the weapon can fire again. + var/extra_delay = 0 + /// If the gun is currently burst firing. + var/burst_firing = FALSE + + /// Currently selected target to fire at. Set with set_target(). + var/atom/target + //----------------------------- //------GENERAL PROCS---------- //----------------------------- @@ -109,6 +133,7 @@ /obj/item/hardpoint/Initialize() . = ..() set_bullet_traits() + AddComponent(/datum/component/automatedfire/autofire, fire_delay, burst_delay, burst_amount, gun_firemode, autofire_slow_mult, CALLBACK(src, PROC_REF(set_burst_firing)), CALLBACK(src, PROC_REF(reset_fire)), CALLBACK(src, PROC_REF(fire_wrapper)), callback_set_firing = CALLBACK(src, PROC_REF(set_auto_firing))) /obj/item/hardpoint/Destroy() if(owner) @@ -117,7 +142,7 @@ owner = null QDEL_NULL_LIST(backup_clips) QDEL_NULL(ammo) - + set_target(null) return ..() /obj/item/hardpoint/ex_act(severity) @@ -166,37 +191,64 @@ /obj/item/hardpoint/proc/get_integrity_percent() return 100.0*health/initial(health) -/obj/item/hardpoint/proc/on_install(obj/vehicle/multitile/V) - apply_buff(V) - return +/// Apply hardpoint effects to vehicle and self. +/obj/item/hardpoint/proc/on_install(obj/vehicle/multitile/vehicle) + if(!vehicle) //in loose holder + return + RegisterSignal(vehicle, COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES, PROC_REF(recalculate_hardpoint_bonuses)) + apply_buff(vehicle) -/obj/item/hardpoint/proc/on_uninstall(obj/vehicle/multitile/V) - remove_buff(V) - return +/// Remove hardpoint effects from vehicle and self. +/obj/item/hardpoint/proc/on_uninstall(obj/vehicle/multitile/vehicle) + if(!vehicle) //in loose holder + return + UnregisterSignal(vehicle, COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES) + remove_buff(vehicle) + //resetting values like set_gun_config_values() would be tidy, but unnecessary as it gets recalc'd on install anyway -//applying passive buffs like damage type resistance, speed, accuracy, cooldowns -/obj/item/hardpoint/proc/apply_buff(obj/vehicle/multitile/V) +/// Applying passive buffs like damage type resistance, speed, accuracy, cooldowns. +/obj/item/hardpoint/proc/apply_buff(obj/vehicle/multitile/vehicle) if(buff_applied) return if(LAZYLEN(type_multipliers)) for(var/type in type_multipliers) - V.dmg_multipliers[type] *= LAZYACCESS(type_multipliers, type) + vehicle.dmg_multipliers[type] *= LAZYACCESS(type_multipliers, type) if(LAZYLEN(buff_multipliers)) for(var/type in buff_multipliers) - V.misc_multipliers[type] *= LAZYACCESS(buff_multipliers, type) + vehicle.misc_multipliers[type] *= LAZYACCESS(buff_multipliers, type) buff_applied = TRUE + SEND_SIGNAL(vehicle, COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES) -//removing buffs -/obj/item/hardpoint/proc/remove_buff(obj/vehicle/multitile/V) +/// Removing passive buffs like damage type resistance, speed, accuracy, cooldowns. +/obj/item/hardpoint/proc/remove_buff(obj/vehicle/multitile/vehicle) if(!buff_applied) return if(LAZYLEN(type_multipliers)) for(var/type in type_multipliers) - V.dmg_multipliers[type] *= 1 / LAZYACCESS(type_multipliers, type) + vehicle.dmg_multipliers[type] *= 1 / LAZYACCESS(type_multipliers, type) if(LAZYLEN(buff_multipliers)) for(var/type in buff_multipliers) - V.misc_multipliers[type] *= 1 / LAZYACCESS(buff_multipliers, type) + vehicle.misc_multipliers[type] *= 1 / LAZYACCESS(buff_multipliers, type) buff_applied = FALSE + SEND_SIGNAL(vehicle, COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES) + +/// Recalculates hardpoint values based on vehicle modifiers. +/obj/item/hardpoint/proc/recalculate_hardpoint_bonuses() + scatter = initial(scatter) / owner.misc_multipliers["accuracy"] + var/cooldown_mult = owner.misc_multipliers["cooldown"] + set_fire_delay(initial(fire_delay) * cooldown_mult) + set_burst_delay(initial(burst_delay) * cooldown_mult) + extra_delay = initial(extra_delay) * cooldown_mult + +/// Setter for fire_delay. +/obj/item/hardpoint/proc/set_fire_delay(value) + fire_delay = value + SEND_SIGNAL(src, COMSIG_GUN_AUTOFIREDELAY_MODIFIED, fire_delay) + +/// Setter for burst_delay. +/obj/item/hardpoint/proc/set_burst_delay(value) + burst_delay = value + SEND_SIGNAL(src, COMSIG_GUN_BURST_SHOT_DELAY_MODIFIED, burst_delay) //this proc called on each move of vehicle /obj/item/hardpoint/proc/on_move(turf/old, turf/new_turf, move_dir) @@ -253,13 +305,12 @@ return data -// Traces backwards from the gun origin to the vehicle to check for obstacles between the vehicle and the muzzle -/obj/item/hardpoint/proc/clear_los(atom/A) - +/// Traces backwards from the gun origin to the vehicle to check for obstacles between the vehicle and the muzzle. +/obj/item/hardpoint/proc/clear_los() if(origins[1] == 0 && origins[2] == 0) //skipping check for modules we don't need this return TRUE - var/turf/muzzle_turf = locate(owner.x + origins[1], owner.y + origins[2], owner.z) + var/turf/muzzle_turf = get_origin_turf() var/turf/checking_turf = muzzle_turf while(!(owner in checking_turf)) @@ -268,24 +319,24 @@ return FALSE // Ensure that we can pass over all objects in the turf - for(var/obj/O in checking_turf) + for(var/obj/object in checking_turf) // Since vehicles are multitile the - if(O == owner) + if(object == owner) continue // Non-dense objects are irrelevant - if(!O.density) + if(!object.density) continue // Make sure we can pass object from all directions - if(!(O.pass_flags.flags_can_pass_all & PASS_OVER_THROW_ITEM)) - if(!(O.flags_atom & ON_BORDER)) + if(!HAS_FLAG(object.pass_flags.flags_can_pass_all, PASS_OVER_THROW_ITEM)) + if(!HAS_FLAG(object.flags_atom, ON_BORDER)) return FALSE //If we're behind the object, check the behind pass flags - else if(dir == O.dir && !(O.pass_flags.flags_can_pass_behind & PASS_OVER_THROW_ITEM)) + else if(dir == object.dir && !HAS_FLAG(object.pass_flags.flags_can_pass_behind, PASS_OVER_THROW_ITEM)) return FALSE //If we're in front, check front pass flags - else if(dir == turn(O.dir, 180) && !(O.pass_flags.flags_can_pass_front & PASS_OVER_THROW_ITEM)) + else if(dir == turn(object.dir, 180) && !HAS_FLAG(object.pass_flags.flags_can_pass_front, PASS_OVER_THROW_ITEM)) return FALSE // Trace back towards the vehicle @@ -297,47 +348,6 @@ //------INTERACTION PROCS---------- //----------------------------- -//If the hardpoint can be activated by current user -/obj/item/hardpoint/proc/can_activate(mob/user, atom/A) - if(!owner) - return - - var/seat = owner.get_mob_seat(user) - if(!seat) - return - - if(seat != allowed_seat) - to_chat(user, SPAN_WARNING("Only [allowed_seat] can use [name].")) - return - - if(health <= 0) - to_chat(user, SPAN_WARNING("\The [name] is broken!")) - return FALSE - - if(world.time < next_use) - if(cooldown >= 20) //filter out guns with high firerate to prevent message spam. - to_chat(user, SPAN_WARNING("You need to wait [SPAN_HELPFUL((next_use - world.time) / 10)] seconds before [name] can be used again.")) - return FALSE - - if(ammo && ammo.current_rounds <= 0) - to_chat(user, SPAN_WARNING("\The [name] is out of ammo! Magazines: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) - return FALSE - - if(!in_firing_arc(A)) - to_chat(user, SPAN_WARNING("The target is not within your firing arc!")) - return FALSE - - if(!clear_los(A)) - to_chat(user, SPAN_WARNING("You don't have a clear line of sight to the target!")) - return FALSE - - return TRUE - -//Called when you want to activate the hardpoint, by default firing a gun -//This can also be used for some type of temporary buff or toggling mode, up to you -/obj/item/hardpoint/proc/activate(mob/user, atom/A) - fire(user, A) - /obj/item/hardpoint/proc/deactivate() return @@ -490,76 +500,201 @@ user.visible_message(SPAN_NOTICE("[user] stops repairing \the [name]."), SPAN_NOTICE("You stop repairing \the [name]. The integrity of the module is at [SPAN_HELPFUL(round(get_integrity_percent()))]%.")) return -//determines whether something is in firing arc of a hardpoint -/obj/item/hardpoint/proc/in_firing_arc(atom/A) - if(!owner) - return FALSE +/// Setter proc for the automatic firing flag. +/obj/item/hardpoint/proc/set_auto_firing(auto = FALSE) + if(auto_firing != auto) + auto_firing = auto + if(!auto_firing) //end-of-fire, show changed ammo + display_ammo() + +/// Setter proc for the burst firing flag. +/obj/item/hardpoint/proc/set_burst_firing(burst = FALSE) + if(burst_firing != burst) + burst_firing = burst + if(!burst_firing) //end-of-fire, show changed ammo + display_ammo() + +/// Clean all firing references. +/obj/item/hardpoint/proc/reset_fire() + shots_fired = 0 + set_target(null) + set_auto_firing(FALSE) //on abnormal exits automatic fire doesn't call set_auto_firing() + +/// Set the target and take care of hard delete. +/obj/item/hardpoint/proc/set_target(atom/object) + if(object == target || object == loc) + return + if(target) + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + target = object + if(target) + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(clean_target)) + +/// Set the target to its turf, so we keep shooting even when it was qdeled. +/obj/item/hardpoint/proc/clean_target() + SIGNAL_HANDLER + target = get_turf(target) + +/// Print how much ammo is left to chat. +/obj/item/hardpoint/proc/display_ammo(mob/user) + if(!user) + user = owner.get_seat_mob(allowed_seat) + if(!user) + return - if(!firing_arc) - return TRUE + if(ammo) + to_chat(user, SPAN_WARNING("[name] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) - var/turf/T = get_turf(A) - if(!T) - return FALSE +/// Reset variables used in firing and remove the gun from the autofire system. +/obj/item/hardpoint/proc/stop_fire(datum/source, atom/object, turf/location, control, params) + SEND_SIGNAL(src, COMSIG_GUN_STOP_FIRE) + if(auto_firing) + reset_fire() //automatic fire doesn't reset itself from COMSIG_GUN_STOP_FIRE - var/dx = T.x - (owner.x + origins[1]/2) - var/dy = T.y - (owner.y + origins[2]/2) - - var/deg = 0 - switch(dir) - if(EAST) - deg = 0 - if(NORTH) - deg = -90 - if(WEST) - deg = 180 - if(SOUTH) - deg = 90 - - var/nx = dx * cos(deg) - dy * sin(deg) - var/ny = dx * sin(deg) + dy * cos(deg) - if(nx == 0) - return firing_arc >= 90 - - var/angle = arctan(ny/nx) - if(nx < 0) - angle += 180 - - return abs(angle) <= (firing_arc/2) - -//doing last preparation before actually firing gun -/obj/item/hardpoint/proc/fire(mob/user, atom/A) - if(!ammo) //Prevents a runtime +/// Update the target if you dragged your mouse. +/obj/item/hardpoint/proc/change_target(datum/source, atom/src_object, atom/over_object, turf/src_location, turf/over_location, src_control, over_control, params) + set_target(get_turf_on_clickcatcher(over_object, source, params)) + +/// Check if the gun can fire and add it to bucket autofire system if needed, or just fire the gun if not. +/obj/item/hardpoint/proc/start_fire(datum/source, atom/object, turf/location, control, params) + if(istype(object, /atom/movable/screen)) return - if(ammo.current_rounds <= 0) + + if(QDELETED(object)) return - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - A = get_step(get_turf(A), pick(GLOB.cardinals)) + if(!auto_firing && !burst_firing && !COOLDOWN_FINISHED(src, fire_cooldown)) + if(max(fire_delay, burst_delay + extra_delay) >= 2.0 SECONDS) //filter out guns with high firerate to prevent message spam. + to_chat(source, SPAN_WARNING("You need to wait [SPAN_HELPFUL(COOLDOWN_SECONDSLEFT(src, fire_cooldown))] seconds before [name] can be used again.")) + return - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) + set_target(get_turf_on_clickcatcher(object, source, params)) - fire_projectile(user, A) + if(gun_firemode == GUN_FIREMODE_SEMIAUTO) + var/fire_return = try_fire(object, source, params) + //end-of-fire, show ammo (if changed) + if(fire_return == AUTOFIRE_CONTINUE) + reset_fire() + display_ammo(source) + else + SEND_SIGNAL(src, COMSIG_GUN_FIRE) + +/// Wrapper proc for the autofire system to ensure the important args aren't null. +/obj/item/hardpoint/proc/fire_wrapper(atom/target, mob/living/user, params) + SHOULD_NOT_OVERRIDE(TRUE) + if(!target) + target = src.target + if(!user) + user = owner.get_seat_mob(allowed_seat) + if(!target || !user) + return NONE + + return try_fire(target, user, params) + +/// Tests if firing should be interrupted, otherwise fires. +/obj/item/hardpoint/proc/try_fire(atom/target, mob/living/user, params) + if(health <= 0) + to_chat(user, SPAN_WARNING("\The [name] is broken!")) + return NONE - to_chat(user, SPAN_WARNING("[name] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) + if(ammo && ammo.current_rounds <= 0) + click_empty(user) + return NONE -//finally firing the gun -/obj/item/hardpoint/proc/fire_projectile(mob/user, atom/A) - set waitfor = 0 + if(!in_firing_arc(target)) + to_chat(user, SPAN_WARNING("The target is not within your firing arc!")) + return NONE - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) + if(!clear_los()) + to_chat(user, SPAN_WARNING("The muzzle is obstructed!")) + return NONE - var/obj/projectile/P = generate_bullet(user, origin_turf) - SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, user) - P.fire_at(A, user, src, P.ammo.max_range, P.ammo.shell_speed) + return handle_fire(target, user, params) - if(use_muzzle_flash) - muzzle_flash(Get_Angle(origin_turf, A)) +/// Actually fires the gun, sets up the projectile and fires it. +/obj/item/hardpoint/proc/handle_fire(atom/target, mob/living/user, params) + var/turf/origin_turf = get_origin_turf() + var/obj/projectile/projectile_to_fire = generate_bullet(user, origin_turf) ammo.current_rounds-- + SEND_SIGNAL(projectile_to_fire, COMSIG_BULLET_USER_EFFECTS, user) + + // turf-targeted projectiles are fired without scatter, because proc would raytrace them further away + var/ammo_flags = projectile_to_fire.ammo.flags_ammo_behavior | projectile_to_fire.projectile_override_flags + if(!HAS_FLAG(ammo_flags, AMMO_HITS_TARGET_TURF) && !HAS_FLAG(ammo_flags, AMMO_EXPLOSIVE)) //AMMO_EXPLOSIVE is also a turf-targeted projectile + projectile_to_fire.scatter = scatter + target = simulate_scatter(projectile_to_fire, target, origin_turf, get_turf(target), user) + + INVOKE_ASYNC(projectile_to_fire, TYPE_PROC_REF(/obj/projectile, fire_at), target, user, src, projectile_to_fire.ammo.max_range, projectile_to_fire.ammo.shell_speed) + projectile_to_fire = null + + shots_fired++ + play_firing_sounds() + if(use_muzzle_flash) + muzzle_flash(Get_Angle(origin_turf, target)) + + set_fire_cooldown(gun_firemode) + + return AUTOFIRE_CONTINUE + +/// Start cooldown to respect delay of firemode. +/obj/item/hardpoint/proc/set_fire_cooldown(firemode) + var/cooldown_time = 0 + switch(firemode) + if(GUN_FIREMODE_SEMIAUTO) + cooldown_time = fire_delay + if(GUN_FIREMODE_BURSTFIRE) + cooldown_time = burst_delay + extra_delay + if(GUN_FIREMODE_AUTOMATIC) + cooldown_time = fire_delay + COOLDOWN_START(src, fire_cooldown, cooldown_time) + +/// Adjust target based on random scatter angle. +/obj/item/hardpoint/proc/simulate_scatter(obj/projectile/projectile_to_fire, atom/target, turf/curloc, turf/targloc) + var/fire_angle = Get_Angle(curloc, targloc) + var/total_scatter_angle = projectile_to_fire.scatter + + //Not if the gun doesn't scatter at all, or negative scatter. + if(total_scatter_angle > 0) + fire_angle += rand(-total_scatter_angle, total_scatter_angle) + target = get_angle_target_turf(curloc, fire_angle, 30) + + return target + +/// Get turf at hardpoint origin offset, used as the muzzle. +/obj/item/hardpoint/proc/get_origin_turf() + return get_offset_target_turf(get_turf(src), origins[1], origins[2]) + +/// Plays 'click' noise and announced to chat. Usually called when weapon empty. +/obj/item/hardpoint/proc/click_empty(mob/user) + playsound(src, 'sound/weapons/gun_empty.ogg', 25, 1, 5) + if(user) + to_chat(user, SPAN_WARNING("*click*")) + +/// Selects and plays a firing sound from the list. +/obj/item/hardpoint/proc/play_firing_sounds() + if(LAZYLEN(activation_sounds)) + playsound(get_turf(src), pick(activation_sounds), 60, 1) + +/// Determines whether something is in firing arc of a hardpoint. +/obj/item/hardpoint/proc/in_firing_arc(atom/target) + if(!firing_arc || !ISINRANGE_EX(firing_arc, 0, 360)) + return TRUE + + var/turf/muzzle_turf = get_origin_turf() + var/turf/target_turf = get_turf(target) + + //same tile angle returns EAST, returning FALSE to ensure consistency + if(muzzle_turf == target_turf) + return FALSE + + var/angle_diff = SIMPLIFY_DEGREES(dir2angle(dir) - get_angle(muzzle_turf, target_turf)) + if(angle_diff < -180) + angle_diff += 360 + else if(angle_diff > 180) + angle_diff -= 360 + + return abs(angle_diff) <= (firing_arc * 0.5) //----------------------------- //------ICON PROCS---------- diff --git a/code/modules/vehicles/hardpoints/holder/holder.dm b/code/modules/vehicles/hardpoints/holder/holder.dm index b14e078a3997..fc8e849d105c 100644 --- a/code/modules/vehicles/hardpoints/holder/holder.dm +++ b/code/modules/vehicles/hardpoints/holder/holder.dm @@ -43,10 +43,21 @@ for(var/obj/item/hardpoint/H in hardpoints) H.take_damage(damage) -/obj/item/hardpoint/holder/on_install(obj/vehicle/multitile/V) - for(var/obj/item/hardpoint/HP in hardpoints) - HP.owner = V - return +/obj/item/hardpoint/holder/on_install(obj/vehicle/multitile/vehicle) + ..() + if(!vehicle) //in loose holder + return + for(var/obj/item/hardpoint/hardpoint in hardpoints) + hardpoint.owner = vehicle + hardpoint.on_install(vehicle) + +/obj/item/hardpoint/holder/on_uninstall(obj/vehicle/multitile/vehicle) + if(!vehicle) //in loose holder + return + for(var/obj/item/hardpoint/hardpoint in hardpoints) + hardpoint.on_uninstall(vehicle) + hardpoint.owner = null + ..() /obj/item/hardpoint/holder/proc/can_install(obj/item/hardpoint/H) // Can only have 1 hardpoint of each slot type @@ -121,16 +132,17 @@ H.forceMove(src) LAZYADD(hardpoints, H) + H.on_install(owner) H.rotate(turning_angle(H.dir, dir)) /obj/item/hardpoint/holder/proc/remove_hardpoint(obj/item/hardpoint/H, turf/uninstall_to) if(!hardpoints) return - hardpoints -= H H.forceMove(uninstall_to ? uninstall_to : get_turf(src)) + H.on_uninstall(owner) H.reset_rotation() - + hardpoints -= H H.owner = null if(H.health <= 0) diff --git a/code/modules/vehicles/hardpoints/holder/tank_turret.dm b/code/modules/vehicles/hardpoints/holder/tank_turret.dm index 27ab6c95404c..896628e609bb 100644 --- a/code/modules/vehicles/hardpoints/holder/tank_turret.dm +++ b/code/modules/vehicles/hardpoints/holder/tank_turret.dm @@ -13,8 +13,6 @@ density = TRUE //come on, it's huge activatable = TRUE - cooldown = 150 - accuracy = 0.8 ammo = new /obj/item/ammo_magazine/hardpoint/turret_smoke max_clips = 2 @@ -60,6 +58,15 @@ // Used during the windup var/rotating = FALSE + scatter = 4 + gun_firemode = GUN_FIREMODE_BURSTFIRE + gun_firemode_list = list( + GUN_FIREMODE_BURSTFIRE, + ) + burst_amount = 2 + burst_delay = 1.0 SECONDS + extra_delay = 13.0 SECONDS + /obj/item/hardpoint/holder/tank_turret/update_icon() var/broken = (health <= 0) icon_state = "tank_turret_[broken]" @@ -182,12 +189,7 @@ user.client.pixel_x = -1 * AM.view_tile_offset * 32 user.client.pixel_y = 0 -/obj/item/hardpoint/holder/tank_turret/fire(mob/user, atom/A) - if(ammo.current_rounds <= 0) - return - - next_use = world.time + cooldown - +/obj/item/hardpoint/holder/tank_turret/try_fire(atom/target, mob/living/user, params) var/turf/L var/turf/R switch(owner.dir) @@ -204,26 +206,14 @@ L = locate(owner.x - 4, owner.y + 2, owner.z) R = locate(owner.x - 4, owner.y - 2, owner.z) - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, L) + if(shots_fired) + target = R + else + target = L - sleep(10) + return ..() - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, R) - - to_chat(user, SPAN_WARNING("Smoke Screen uses left: [SPAN_HELPFUL(ammo ? ammo.current_rounds / 2 : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds / 2 : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) - -/obj/item/hardpoint/holder/tank_turret/fire_projectile(mob/user, atom/A) - set waitfor = 0 - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) +/obj/item/hardpoint/holder/tank_turret/get_origin_turf() + var/origin_turf = ..() origin_turf = get_step(get_step(origin_turf, owner.dir), owner.dir) //this should get us tile in front of tank to prevent grenade being stuck under us. - - var/obj/projectile/P = generate_bullet(user, origin_turf) - SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, owner.seats[VEHICLE_GUNNER]) - P.fire_at(A, owner.seats[VEHICLE_GUNNER], src, get_dist(origin_turf, A) + 1, P.ammo.shell_speed) - ammo.current_rounds-- + return origin_turf diff --git a/code/modules/vehicles/hardpoints/primary/autocannon.dm b/code/modules/vehicles/hardpoints/primary/autocannon.dm index df9224011b32..b6dc2cedc674 100644 --- a/code/modules/vehicles/hardpoints/primary/autocannon.dm +++ b/code/modules/vehicles/hardpoints/primary/autocannon.dm @@ -8,8 +8,6 @@ activation_sounds = list('sound/weapons/vehicles/autocannon_fire.ogg') health = 500 - cooldown = 7 - accuracy = 0.98 firing_arc = 60 origins = list(0, -3) @@ -23,3 +21,10 @@ "4" = list(32, 0), "8" = list(-32, 0) ) + + scatter = 1 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.7 SECONDS diff --git a/code/modules/vehicles/hardpoints/primary/dual_cannon.dm b/code/modules/vehicles/hardpoints/primary/dual_cannon.dm index ad57e20e8456..4033a4bffb2a 100644 --- a/code/modules/vehicles/hardpoints/primary/dual_cannon.dm +++ b/code/modules/vehicles/hardpoints/primary/dual_cannon.dm @@ -12,10 +12,7 @@ damage_multiplier = 0.2 health = 500 - cooldown = 7 - accuracy = 0.98 firing_arc = 60 - var/burst_amount = 2 origins = list(0, -2) @@ -33,27 +30,15 @@ "8" = list(14, 9) ) + scatter = 1 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.3 SECONDS + /obj/item/hardpoint/primary/dualcannon/set_bullet_traits() ..() LAZYADD(traits_to_give, list( BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) )) - -/obj/item/hardpoint/primary/dualcannon/fire(mob/user, atom/A) - if(ammo.current_rounds <= 0) - return - - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - - for(var/bullets_fired = 1, bullets_fired <= burst_amount, bullets_fired++) - var/atom/T = A - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - T = get_step(get_turf(A), pick(GLOB.cardinals)) - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, T) - if(ammo.current_rounds <= 0) - break - if(bullets_fired < burst_amount) //we need to sleep only if there are more bullets to shoot in the burst - sleep(3) - to_chat(user, SPAN_WARNING("[src] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) diff --git a/code/modules/vehicles/hardpoints/primary/flamer.dm b/code/modules/vehicles/hardpoints/primary/flamer.dm index 929842df2307..13beee9dd2c2 100644 --- a/code/modules/vehicles/hardpoints/primary/flamer.dm +++ b/code/modules/vehicles/hardpoints/primary/flamer.dm @@ -8,8 +8,6 @@ activation_sounds = list('sound/weapons/vehicles/flamethrower.ogg') health = 400 - cooldown = 20 - accuracy = 0.75 firing_arc = 90 origins = list(0, -3) @@ -26,36 +24,19 @@ use_muzzle_flash = FALSE + scatter = 5 + fire_delay = 2.0 SECONDS + /obj/item/hardpoint/primary/flamer/set_bullet_traits() ..() LAZYADD(traits_to_give, list( BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) )) -/obj/item/hardpoint/primary/flamer/can_activate(mob/user, atom/A) - if(!..()) - return FALSE - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - if(origin_turf == get_turf(A)) - return FALSE - - return TRUE - -/obj/item/hardpoint/primary/flamer/fire_projectile(mob/user, atom/A) - set waitfor = 0 - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - - var/range = get_dist(origin_turf, A) + 1 - - var/obj/projectile/P = generate_bullet(user, origin_turf) - SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, owner.seats[VEHICLE_GUNNER]) - P.fire_at(A, owner.seats[VEHICLE_GUNNER], src, range < P.ammo.max_range ? range : P.ammo.max_range, P.ammo.shell_speed) - - if(use_muzzle_flash) - muzzle_flash(Get_Angle(owner, A)) +/obj/item/hardpoint/primary/flamer/try_fire(target, user, params) + var/turf/origin_turf = get_origin_turf() + if(origin_turf == get_turf(target)) + to_chat(user, SPAN_WARNING("The target is too close.")) + return NONE - ammo.current_rounds-- + return ..() diff --git a/code/modules/vehicles/hardpoints/primary/ltb.dm b/code/modules/vehicles/hardpoints/primary/ltb.dm index 7c663dc27fbc..19b5c7e7b9b4 100644 --- a/code/modules/vehicles/hardpoints/primary/ltb.dm +++ b/code/modules/vehicles/hardpoints/primary/ltb.dm @@ -8,8 +8,6 @@ activation_sounds = list('sound/weapons/vehicles/cannon_fire1.ogg', 'sound/weapons/vehicles/cannon_fire2.ogg') health = 500 - cooldown = 200 - accuracy = 0.97 firing_arc = 60 origins = list(0, -3) @@ -30,3 +28,6 @@ "4" = list(89, -4), "8" = list(-89, -4) ) + + scatter = 2 + fire_delay = 20.0 SECONDS diff --git a/code/modules/vehicles/hardpoints/primary/minigun.dm b/code/modules/vehicles/hardpoints/primary/minigun.dm index a6e44d2dbf2c..3acf37eec268 100644 --- a/code/modules/vehicles/hardpoints/primary/minigun.dm +++ b/code/modules/vehicles/hardpoints/primary/minigun.dm @@ -7,8 +7,6 @@ disp_icon_state = "ltaaap_minigun" health = 350 - cooldown = 8 - accuracy = 0.6 firing_arc = 90 origins = list(0, -3) @@ -30,46 +28,58 @@ "8" = list(-77, 0) ) - //changed minigun mechanic so instead of having lowered cooldown with each shot it now has increased burst size. - //While it's still spammy, user doesn't have to click as fast as possible anymore and has margin of 2 seconds before minigun will start slowing down - - var/chained_shots = 1 //how many quick succession shots we've fired, 1 by default - var/last_shot_time = 0 //when was last shot fired, after 3 seconds we stop barrel - var/list/chain_bursts = list(1, 1, 2, 2, 3, 3, 3, 4, 4, 4) //how many shots per click we do + scatter = 7 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.8 SECONDS //base fire rate, modified by stage_delay_mult + activation_sounds = list('sound/weapons/gun_minigun.ogg') + /// Active firing time to reach max spin_stage. + var/spinup_time = 8 SECONDS + /// Grace period before losing spin_stage. + var/spindown_grace_time = 2 SECONDS + COOLDOWN_DECLARE(spindown_grace_cooldown) + /// Cooldown time to reach min spin_stage. + var/spindown_time = 3 SECONDS + /// Index of stage_rate. + var/spin_stage = 1 + /// Shots fired per fire_delay at a particular spin_stage. + var/list/stage_rate = list(1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5) + /// Fire delay multiplier for current spin_stage. + var/stage_delay_mult = 1 + /// When it was last fired, related to world.time. + var/last_fired = 0 -/obj/item/hardpoint/primary/minigun/fire(mob/user, atom/A) +/obj/item/hardpoint/primary/minigun/set_fire_delay(value) + fire_delay = value + SEND_SIGNAL(src, COMSIG_GUN_AUTOFIREDELAY_MODIFIED, fire_delay * stage_delay_mult) - var/S = 'sound/weapons/vehicles/minigun_stop.ogg' - //check how much time since last shot. 2 seconds are grace period before minigun starts to lose rotation momentum - var/t = world.time - last_shot_time - 2 SECONDS - t = round(t / 10) - if(t > 0) - chained_shots = max(chained_shots - t * 3, 1) //we lose 3 chained_shots per second - else - if(chained_shots < 11) - chained_shots++ - S = 'sound/weapons/vehicles/minigun_loop.ogg' +/obj/item/hardpoint/primary/minigun/set_fire_cooldown() + calculate_stage_delay_mult() //needs to check grace_cooldown before refreshed + last_fired = world.time + COOLDOWN_START(src, spindown_grace_cooldown, spindown_grace_time) + COOLDOWN_START(src, fire_cooldown, fire_delay * stage_delay_mult) - if(chained_shots == 1) - playsound(get_turf(src), 'sound/weapons/vehicles/minigun_start.ogg', 40, 1) +/obj/item/hardpoint/primary/minigun/proc/calculate_stage_delay_mult() + var/stage_rate_len = stage_rate.len + var/delta_time = world.time - last_fired - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - - //how many rounds we will shoot in this burst - if(chained_shots > LAZYLEN(chain_bursts)) //5 shots at maximum rotation - t = 5 + var/old_spin_stage = spin_stage + if(auto_firing || burst_firing) //spinup if continuing fire + var/delta_stage = delta_time * (stage_rate_len - 1) + spin_stage += delta_stage / spinup_time + else if(COOLDOWN_FINISHED(src, spindown_grace_cooldown)) //spindown if initiating fire after grace + var/delta_stage = (delta_time - spindown_grace_time) * (stage_rate_len - 1) + spin_stage -= delta_stage / spindown_time else - t = LAZYACCESS(chain_bursts, chained_shots) - for(var/i = 1; i <= t; i++) - var/atom/T = A - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - T = get_step(get_turf(T), pick(GLOB.cardinals)) - fire_projectile(user, T) - if(ammo.current_rounds <= 0) - break - sleep(2) - to_chat(user, SPAN_WARNING("[src] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) + return + spin_stage = Clamp(spin_stage, 1, stage_rate_len) + + var/old_stage_rate = stage_rate[Floor(old_spin_stage)] + var/new_stage_rate = stage_rate[Floor(spin_stage)] - playsound(get_turf(src), S, 40, 1) - last_shot_time = world.time + if(old_stage_rate != new_stage_rate) + stage_delay_mult = 1 / new_stage_rate + SEND_SIGNAL(src, COMSIG_GUN_AUTOFIREDELAY_MODIFIED, fire_delay * stage_delay_mult) diff --git a/code/modules/vehicles/hardpoints/secondary/cupola.dm b/code/modules/vehicles/hardpoints/secondary/cupola.dm index 3c329e135855..f259d6ea2623 100644 --- a/code/modules/vehicles/hardpoints/secondary/cupola.dm +++ b/code/modules/vehicles/hardpoints/secondary/cupola.dm @@ -8,10 +8,7 @@ activation_sounds = list('sound/weapons/gun_smartgun1.ogg', 'sound/weapons/gun_smartgun2.ogg', 'sound/weapons/gun_smartgun3.ogg', 'sound/weapons/gun_smartgun4.ogg') health = 350 - cooldown = 15 - accuracy = 0.9 firing_arc = 120 - var/burst_amount = 3 origins = list(0, -2) @@ -25,27 +22,17 @@ "8" = list(-5, 7) ) + scatter = 3 + gun_firemode = GUN_FIREMODE_BURSTFIRE + gun_firemode_list = list( + GUN_FIREMODE_BURSTFIRE, + ) + burst_amount = 3 + burst_delay = 0.3 SECONDS + extra_delay = 0.6 SECONDS + /obj/item/hardpoint/secondary/m56cupola/set_bullet_traits() ..() LAZYADD(traits_to_give, list( BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) )) - -/obj/item/hardpoint/secondary/m56cupola/fire(mob/user, atom/A) - if(ammo.current_rounds <= 0) - return - - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - - for(var/bullets_fired = 1, bullets_fired <= burst_amount, bullets_fired++) - var/atom/T = A - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - T = get_step(get_turf(A), pick(GLOB.cardinals)) - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, T) - if(ammo.current_rounds <= 0) - break - if(bullets_fired < burst_amount) //we need to sleep only if there are more bullets to shoot in the burst - sleep(3) - to_chat(user, SPAN_WARNING("[src] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) diff --git a/code/modules/vehicles/hardpoints/secondary/flamer.dm b/code/modules/vehicles/hardpoints/secondary/flamer.dm index 10f7453d8c95..5557cfb24e17 100644 --- a/code/modules/vehicles/hardpoints/secondary/flamer.dm +++ b/code/modules/vehicles/hardpoints/secondary/flamer.dm @@ -8,8 +8,6 @@ activation_sounds = list('sound/weapons/vehicles/flamethrower.ogg') health = 300 - cooldown = 30 - accuracy = 0.68 firing_arc = 120 origins = list(0, -2) @@ -28,31 +26,20 @@ "8" = list(-3, 18) ) -/obj/item/hardpoint/secondary/small_flamer/fire_projectile(mob/user, atom/A) - set waitfor = 0 - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - var/list/turf/turfs = getline2(origin_turf, A) - var/distance = 0 - var/turf/prev_T - - for(var/turf/T in turfs) - if(T == loc) - prev_T = T - continue - if(!ammo.current_rounds) break - if(distance >= max_range) break - if(prev_T && LinkBlocked(prev_T, T)) - break - ammo.current_rounds-- - flame_turf(T, user) - distance++ - prev_T = T - sleep(1) - -/obj/item/hardpoint/secondary/small_flamer/proc/flame_turf(turf/T, mob/user) - if(!istype(T)) return - - if(!locate(/obj/flamer_fire) in T) // No stacking flames! - new/obj/flamer_fire(T, create_cause_data(initial(name), user)) + scatter = 6 + fire_delay = 3.0 SECONDS + +/obj/item/hardpoint/secondary/small_flamer/handle_fire(atom/target, mob/living/user, params) + var/turf/origin_turf = get_origin_turf() + + var/distance = get_dist(origin_turf, get_turf(target)) + var/fire_amount = min(ammo.current_rounds, distance+1, max_range) + ammo.current_rounds -= fire_amount + + new /obj/flamer_fire(origin_turf, create_cause_data(initial(name), user), null, fire_amount, null, FLAMESHAPE_LINE, target, CALLBACK(src, PROC_REF(display_ammo), user)) + + play_firing_sounds() + + COOLDOWN_START(src, fire_cooldown, fire_delay) + + return AUTOFIRE_CONTINUE diff --git a/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm b/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm index a4d7370935fe..536b5742cfcd 100644 --- a/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm +++ b/code/modules/vehicles/hardpoints/secondary/frontal_cannon.dm @@ -11,10 +11,7 @@ damage_multiplier = 0.11 health = 350 - cooldown = 16 - accuracy = 0.8 firing_arc = 120 - var/burst_amount = 4 origins = list(0, -2) @@ -32,27 +29,15 @@ "8" = list(-62, -26) ) + scatter = 4 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.3 SECONDS + /obj/item/hardpoint/secondary/frontalcannon/set_bullet_traits() ..() LAZYADD(traits_to_give, list( BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) )) - -/obj/item/hardpoint/secondary/frontalcannon/fire(mob/user, atom/A) - if(ammo.current_rounds <= 0) - return - - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - - for(var/bullets_fired = 1, bullets_fired <= burst_amount, bullets_fired++) - var/atom/T = A - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - T = get_step(get_turf(A), pick(GLOB.cardinals)) - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, T) - if(ammo.current_rounds <= 0) - break - if(bullets_fired < burst_amount) //we need to sleep only if there are more bullets to shoot in the burst - sleep(3) - to_chat(user, SPAN_WARNING("[src] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)] | Mags: [SPAN_HELPFUL(LAZYLEN(backup_clips))]/[SPAN_HELPFUL(max_clips)]")) diff --git a/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm b/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm index 8151a1ee50c1..efd151e93cb3 100644 --- a/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm +++ b/code/modules/vehicles/hardpoints/secondary/grenade_launcher.dm @@ -8,8 +8,6 @@ activation_sounds = list('sound/weapons/gun_m92_attachable.ogg') health = 500 - cooldown = 30 - accuracy = 0.4 firing_arc = 90 var/max_range = 7 @@ -27,40 +25,19 @@ "8" = list(-6, 17) ) + scatter = 10 + fire_delay = 3.0 SECONDS + /obj/item/hardpoint/secondary/grenade_launcher/set_bullet_traits() ..() LAZYADD(traits_to_give, list( BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) )) -/obj/item/hardpoint/secondary/grenade_launcher/can_activate(mob/user, atom/A) - if(!..()) - return FALSE - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - if(get_dist(origin_turf, A) < 1) - to_chat(usr, SPAN_WARNING("The target is too close.")) - return FALSE - - return TRUE - -/obj/item/hardpoint/secondary/grenade_launcher/fire_projectile(mob/user, atom/A) - set waitfor = 0 - - var/turf/origin_turf = get_turf(src) - origin_turf = locate(origin_turf.x + origins[1], origin_turf.y + origins[2], origin_turf.z) - - //getting distance between supposed target and tank center. - var/range = get_dist(origin_turf, A) + 1 //otherwise nade falls one tile shorter - if(range > max_range) - range = max_range - - var/obj/projectile/P = generate_bullet(user, origin_turf) - SEND_SIGNAL(P, COMSIG_BULLET_USER_EFFECTS, owner.seats[VEHICLE_GUNNER]) - P.fire_at(A, owner.seats[VEHICLE_GUNNER], src, P.ammo.max_range, P.ammo.shell_speed) - - if(use_muzzle_flash) - muzzle_flash(Get_Angle(owner, A)) +/obj/item/hardpoint/secondary/grenade_launcher/try_fire(mob/user, atom/A) + var/turf/origin_turf = get_origin_turf() + if(origin_turf == get_turf(A)) + to_chat(user, SPAN_WARNING("The target is too close.")) + return NONE - ammo.current_rounds-- + return ..() diff --git a/code/modules/vehicles/hardpoints/secondary/tow.dm b/code/modules/vehicles/hardpoints/secondary/tow.dm index 4bdbc6f417fb..7c58f7970c7b 100644 --- a/code/modules/vehicles/hardpoints/secondary/tow.dm +++ b/code/modules/vehicles/hardpoints/secondary/tow.dm @@ -7,8 +7,6 @@ disp_icon_state = "towlauncher" health = 500 - cooldown = 150 - accuracy = 0.8 firing_arc = 60 origins = list(0, -2) @@ -29,3 +27,7 @@ "4" = list(5, -8), "8" = list(-5, 10) ) + + scatter = 4 + fire_delay = 15.0 SECONDS + diff --git a/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm b/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm index b6f3daed9f4e..780c195f00be 100644 --- a/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm +++ b/code/modules/vehicles/hardpoints/special/firing_port_weapon.dm @@ -10,10 +10,7 @@ activation_sounds = list('sound/weapons/gun_smartgun1.ogg', 'sound/weapons/gun_smartgun2.ogg', 'sound/weapons/gun_smartgun3.ogg', 'sound/weapons/gun_smartgun4.ogg') health = 100 - cooldown = 10 - accuracy = 0.9 firing_arc = 120 - var/burst_amount = 3 //FPWs reload automatically var/reloading = FALSE var/reload_time = 10 SECONDS @@ -30,6 +27,13 @@ underlayer_north_muzzleflash = TRUE + scatter = 3 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.3 SECONDS + /obj/item/hardpoint/special/firing_port_weapon/set_bullet_traits() ..() LAZYADD(traits_to_give, list( @@ -49,46 +53,6 @@ return data - -/obj/item/hardpoint/special/firing_port_weapon/can_activate(mob/user, atom/A) - if(!owner) - return FALSE - - var/seat = owner.get_mob_seat(user) - if(!seat) - return FALSE - - if(seat != allowed_seat) - to_chat(user, SPAN_WARNING("Only [allowed_seat] can use [name].")) - return FALSE - - //FPW stop working at 50% hull - if(owner.health < initial(owner.health) * 0.5) - to_chat(user, SPAN_WARNING("\The [owner]'s hull is too damaged!")) - return FALSE - - if(world.time < next_use) - if(cooldown >= 20) //filter out guns with high firerate to prevent message spam. - to_chat(user, SPAN_WARNING("You need to wait [SPAN_HELPFUL((next_use - world.time) / 10)] seconds before [name] can be used again.")) - return FALSE - - if(reloading) - to_chat(user, SPAN_NOTICE("\The [name] is reloading. Wait [SPAN_HELPFUL("[((reload_time_started + reload_time - world.time) / 10)]")] seconds.")) - return FALSE - - if(ammo && ammo.current_rounds <= 0) - if(reloading) - to_chat(user, SPAN_WARNING("\The [name] is out of ammo! You have to wait [(reload_time_started + reload_time - world.time) / 10] seconds before it reloads!")) - else - start_auto_reload(user) - return FALSE - - if(!in_firing_arc(A)) - to_chat(user, SPAN_WARNING("The target is not within your firing arc!")) - return FALSE - - return TRUE - /obj/item/hardpoint/special/firing_port_weapon/reload(mob/user) if(!ammo) ammo = new /obj/item/ammo_magazine/hardpoint/firing_port_weapon @@ -116,27 +80,32 @@ to_chat(user, SPAN_NOTICE("\The [name] reloads automatically.")) return FALSE +/obj/item/hardpoint/special/firing_port_weapon/try_fire(atom/target, mob/living/user, params) + if(!owner) + return NONE + + //FPW stop working at 50% hull + if(owner.health < initial(owner.health) * 0.5) + to_chat(user, SPAN_WARNING("\The [owner]'s hull is too damaged!")) + return NONE -/obj/item/hardpoint/special/firing_port_weapon/fire(mob/user, atom/A) if(user.get_active_hand()) to_chat(user, SPAN_WARNING("You need a free hand to use \the [name].")) - return + return NONE - if(ammo.current_rounds <= 0) - start_auto_reload(user) - return + if(reloading) + to_chat(user, SPAN_NOTICE("\The [name] is reloading. Wait [SPAN_HELPFUL("[((reload_time_started + reload_time - world.time) / 10)]")] seconds.")) + return NONE + + if(ammo && ammo.current_rounds <= 0) + if(reloading) + to_chat(user, SPAN_WARNING("\The [name] is out of ammo! You have to wait [(reload_time_started + reload_time - world.time) / 10] seconds before it reloads!")) + else + start_auto_reload(user) + return NONE + + if(!in_firing_arc(target)) + to_chat(user, SPAN_WARNING("The target is not within your firing arc!")) + return NONE - next_use = world.time + cooldown * owner.misc_multipliers["cooldown"] - - for(var/bullets_fired = 1, bullets_fired <= burst_amount, bullets_fired++) - var/atom/T = A - if(!prob((accuracy * 100) / owner.misc_multipliers["accuracy"])) - T = get_step(get_turf(A), pick(GLOB.cardinals)) - if(LAZYLEN(activation_sounds)) - playsound(get_turf(src), pick(activation_sounds), 60, 1) - fire_projectile(user, T) - if(ammo.current_rounds <= 0) - break - if(bullets_fired < burst_amount) //we need to sleep only if there are more bullets to shoot in the burst - sleep(3) - to_chat(user, SPAN_WARNING("[src] Ammo: [SPAN_HELPFUL(ammo ? ammo.current_rounds : 0)]/[SPAN_HELPFUL(ammo ? ammo.max_rounds : 0)]")) + return handle_fire(target, user, params) diff --git a/code/modules/vehicles/hardpoints/support/artillery.dm b/code/modules/vehicles/hardpoints/support/artillery.dm index aacb83fcf383..dfcdcaf73f74 100644 --- a/code/modules/vehicles/hardpoints/support/artillery.dm +++ b/code/modules/vehicles/hardpoints/support/artillery.dm @@ -14,7 +14,7 @@ var/view_buff = 10 //This way you can VV for more or less fun var/view_tile_offset = 7 -/obj/item/hardpoint/support/artillery_module/activate(mob/user, atom/A) +/obj/item/hardpoint/support/artillery_module/handle_fire(atom/target, mob/living/user, params) if(!user.client) return @@ -62,8 +62,9 @@ user.client.pixel_y = 0 is_active = FALSE -/obj/item/hardpoint/support/artillery_module/can_activate() +/obj/item/hardpoint/support/artillery_module/try_fire(target, user, params) if(health <= 0) to_chat(usr, SPAN_WARNING("\The [src] is broken!")) - return FALSE - return TRUE + return NONE + + return handle_fire(target, user, params) diff --git a/code/modules/vehicles/hardpoints/support/flare.dm b/code/modules/vehicles/hardpoints/support/flare.dm index 00dcd3ac1886..432c9636dadd 100644 --- a/code/modules/vehicles/hardpoints/support/flare.dm +++ b/code/modules/vehicles/hardpoints/support/flare.dm @@ -13,8 +13,6 @@ activatable = TRUE health = 500 - cooldown = 30 - accuracy = 0.7 firing_arc = 120 origins = list(0, -2) @@ -33,6 +31,9 @@ "8" = list(14, -6) ) + scatter = 6 + fire_delay = 3.0 SECONDS + /obj/item/hardpoint/support/flare_launcher/set_bullet_traits() ..() LAZYADD(traits_to_give, list( diff --git a/code/modules/vehicles/interior/interactable/seats.dm b/code/modules/vehicles/interior/interactable/seats.dm index ea961bc72593..253b4a066b4f 100644 --- a/code/modules/vehicles/interior/interactable/seats.dm +++ b/code/modules/vehicles/interior/interactable/seats.dm @@ -40,8 +40,8 @@ return if(QDELETED(buckled_mob)) - vehicle.set_seated_mob(seat, null) M.unset_interaction() + vehicle.set_seated_mob(seat, null) if(M.client) M.client.change_view(GLOB.world_view_size, vehicle) M.client.pixel_x = 0 @@ -174,8 +174,8 @@ return if(QDELETED(buckled_mob)) - vehicle.set_seated_mob(seat, null) M.unset_interaction() + vehicle.set_seated_mob(seat, null) if(M.client) M.client.change_view(GLOB.world_view_size, vehicle) M.client.pixel_x = 0 @@ -252,8 +252,8 @@ return if(QDELETED(buckled_mob)) - vehicle.set_seated_mob(seat, null) M.unset_interaction() + vehicle.set_seated_mob(seat, null) if(M.client) M.client.change_view(GLOB.world_view_size, vehicle) M.client.pixel_x = 0 diff --git a/code/modules/vehicles/multitile/multitile.dm b/code/modules/vehicles/multitile/multitile.dm index c8138c5b8f86..f3b7be510b08 100644 --- a/code/modules/vehicles/multitile/multitile.dm +++ b/code/modules/vehicles/multitile/multitile.dm @@ -340,15 +340,24 @@ M.reset_view(src) give_action(M, /datum/action/human_action/vehicle_unbuckle) +/// Get crewmember of seat. /obj/vehicle/multitile/proc/get_seat_mob(seat) return seats[seat] +/// Get seat of crewmember. /obj/vehicle/multitile/proc/get_mob_seat(mob/M) for(var/seat in seats) if(seats[seat] == M) return seat return null +/// Get active hardpoint of crewmember. +/obj/vehicle/multitile/proc/get_mob_hp(mob/crew) + var/seat = get_mob_seat(crew) + if(seat) + return active_hp[seat] + return null + /obj/vehicle/multitile/proc/get_passengers() if(interior) return interior.get_passengers() diff --git a/code/modules/vehicles/multitile/multitile_hardpoints.dm b/code/modules/vehicles/multitile/multitile_hardpoints.dm index 2c5a343b802a..a6014c6cf2cd 100644 --- a/code/modules/vehicles/multitile/multitile_hardpoints.dm +++ b/code/modules/vehicles/multitile/multitile_hardpoints.dm @@ -230,47 +230,3 @@ qdel(old) update_icon() - -//proc that fires non selected weaponry -/obj/vehicle/multitile/proc/shoot_other_weapon(mob/living/carbon/human/M, seat, atom/A) - - if(!istype(M)) - return - - var/list/usable_hps = get_hardpoints_with_ammo(seat) - for(var/obj/item/hardpoint/HP in usable_hps) - if(HP == active_hp[seat] || HP.slot != HDPT_PRIMARY && HP.slot != HDPT_SECONDARY) - usable_hps.Remove(HP) - - if(!LAZYLEN(usable_hps)) - to_chat(M, SPAN_WARNING("No other working weapons detected.")) - return - - for(var/obj/item/hardpoint/HP in usable_hps) - if(!HP.can_activate(M, A)) - return - HP.activate(M, A) - break - return - -//proc that activates support module if it can be activated and you meet requirements -/obj/vehicle/multitile/proc/activate_support_module(mob/living/carbon/human/M, seat, atom/A) - - if(!istype(M)) - return - - var/list/usable_hps = get_activatable_hardpoints(seat) - for(var/obj/item/hardpoint/HP in usable_hps) - if(HP.slot != HDPT_SUPPORT) - usable_hps.Remove(HP) - - if(!LAZYLEN(usable_hps)) - to_chat(M, SPAN_WARNING("No activatable support modules detected.")) - return - - for(var/obj/item/hardpoint/HP in usable_hps) - if(!HP.can_activate(M, A)) - return - HP.activate(M, A) - break - return diff --git a/code/modules/vehicles/multitile/multitile_interaction.dm b/code/modules/vehicles/multitile/multitile_interaction.dm index 42b141327bd8..aa2025d151b5 100644 --- a/code/modules/vehicles/multitile/multitile_interaction.dm +++ b/code/modules/vehicles/multitile/multitile_interaction.dm @@ -330,80 +330,61 @@ healthcheck() -/obj/vehicle/multitile/handle_click(mob/living/user, atom/A, list/mods) - - var/seat - for(var/vehicle_seat in seats) - if(seats[vehicle_seat] == user) - seat = vehicle_seat - break - - if(istype(A, /atom/movable/screen) || !seat) +/obj/vehicle/multitile/on_set_interaction(mob/user) + RegisterSignal(user, COMSIG_MOB_MOUSEDOWN, PROC_REF(crew_mousedown)) + RegisterSignal(user, COMSIG_MOB_MOUSEDRAG, PROC_REF(crew_mousedrag)) + RegisterSignal(user, COMSIG_MOB_MOUSEUP, PROC_REF(crew_mouseup)) + +/obj/vehicle/multitile/on_unset_interaction(mob/user) + UnregisterSignal(user, list(COMSIG_MOB_MOUSEUP, COMSIG_MOB_MOUSEDOWN, COMSIG_MOB_MOUSEDRAG)) + + var/obj/item/hardpoint/hardpoint = get_mob_hp(user) + if(hardpoint) + SEND_SIGNAL(hardpoint, COMSIG_GUN_INTERRUPT_FIRE) //abort fire when crew leaves + +/// Relays crew mouse release to active hardpoint. +/obj/vehicle/multitile/proc/crew_mouseup(datum/source, atom/object, turf/location, control, params) + SIGNAL_HANDLER + var/obj/item/hardpoint/hardpoint = get_mob_hp(source) + if(!hardpoint) return - if(seat == VEHICLE_DRIVER) - if(mods["shift"] && !mods["alt"]) - A.examine(user) - return - - if(mods["ctrl"] && !mods["alt"]) - activate_horn() - return - - var/obj/item/hardpoint/HP = active_hp[seat] - if(!HP) - to_chat(user, SPAN_WARNING("Please select an active hardpoint first.")) - return - - if(!HP.can_activate(user, A)) - return - - HP.activate(user, A) - - if(seat == VEHICLE_GUNNER) - if(mods["shift"] && !mods["middle"]) - if(vehicle_flags & VEHICLE_TOGGLE_SHIFT_CLICK_GUNNER) - shoot_other_weapon(user, seat, A) - else - A.examine(user) - return - if(mods["middle"] && !mods["shift"]) - if(!(vehicle_flags & VEHICLE_TOGGLE_SHIFT_CLICK_GUNNER)) - shoot_other_weapon(user, seat, A) - return - if(mods["alt"]) - toggle_gyrostabilizer() - return - if(mods["ctrl"]) - activate_support_module(user, seat, A) - return + hardpoint.stop_fire(source, object, location, control, params) - var/obj/item/hardpoint/HP = active_hp[seat] - if(!HP) - to_chat(user, SPAN_WARNING("Please select an active hardpoint first.")) - return +/// Relays crew mouse movement to active hardpoint. +/obj/vehicle/multitile/proc/crew_mousedrag(datum/source, atom/src_object, atom/over_object, turf/src_location, turf/over_location, src_control, over_control, params) + SIGNAL_HANDLER + var/obj/item/hardpoint/hardpoint = get_mob_hp(source) + if(!hardpoint) + return - if(!HP.can_activate(user, A)) - return + hardpoint.change_target(source, src_object, over_object, src_location, over_location, src_control, over_control, params) - HP.activate(user, A) +/// Checks for special control keybinds, else relays crew mouse press to active hardpoint. +/obj/vehicle/multitile/proc/crew_mousedown(datum/source, atom/object, turf/location, control, params) + SIGNAL_HANDLER - if(seat == VEHICLE_SUPPORT_GUNNER_ONE || seat == VEHICLE_SUPPORT_GUNNER_TWO) - if(mods["shift"]) - A.examine(user) - return - if(mods["middle"] || mods["alt"] || mods["ctrl"]) - return + var/list/modifiers = params2list(params) + if(modifiers[SHIFT_CLICK] || modifiers[MIDDLE_CLICK] || modifiers[RIGHT_CLICK]) //don't step on examine, point, etc + return - var/obj/item/hardpoint/HP = active_hp[seat] - if(!HP) - to_chat(user, SPAN_WARNING("Please select an active hardpoint first.")) - return + var/seat = get_mob_seat(source) + switch(seat) + if(VEHICLE_DRIVER) + if(modifiers[LEFT_CLICK] && modifiers[CTRL_CLICK]) + activate_horn() + return + if(VEHICLE_GUNNER) + if(modifiers[LEFT_CLICK] && modifiers[ALT_CLICK]) + toggle_gyrostabilizer() + return - if(!HP.can_activate(user, A)) - return + var/obj/item/hardpoint/hardpoint = get_mob_hp(source) + if(!hardpoint) + to_chat(source, SPAN_WARNING("Please select an active hardpoint first.")) + return - HP.activate(user, A) + hardpoint.start_fire(source, object, location, control, params) /obj/vehicle/multitile/proc/handle_player_entrance(mob/M) if(!M || M.client == null) return diff --git a/code/modules/vehicles/multitile/multitile_verbs.dm b/code/modules/vehicles/multitile/multitile_verbs.dm index c7dd29bbf0a9..3801cd2e176c 100644 --- a/code/modules/vehicles/multitile/multitile_verbs.dm +++ b/code/modules/vehicles/multitile/multitile_verbs.dm @@ -30,6 +30,10 @@ if(!HP) return + var/obj/item/hardpoint/old_HP = V.active_hp[seat] + if(old_HP) + SEND_SIGNAL(old_HP, COMSIG_GUN_INTERRUPT_FIRE) //stop fire when switching away from HP + V.active_hp[seat] = HP var/msg = "You select \the [HP]." if(HP.ammo) @@ -66,6 +70,10 @@ if(!HP) return + var/obj/item/hardpoint/old_HP = V.active_hp[seat] + if(old_HP) + SEND_SIGNAL(old_HP, COMSIG_GUN_INTERRUPT_FIRE) //stop fire when switching away from HP + V.active_hp[seat] = HP var/msg = "You select \the [HP]." if(HP.ammo) @@ -225,10 +233,7 @@ 3. \"G: Toggle Turret Gyrostabilizer\" - toggles Turret Gyrostabilizer allowing it to keep current direction ignoring hull turning. (Exists only on vehicles with rotating turret, e.g. M34A2 Longstreet Light Tank)
\ Support Gunner verbs:
1. \"Reload Firing Port Weapon\" - initiates automated reloading process for M56 FPW. Requires a confirmation.
\ Driver shortcuts:
1. \"CTRL + Click\" - activates vehicle horn.
\ - Gunner shortcuts:
1. \"ALT + Click\" - toggles Turret Gyrostabilizer. (Exists only on vehicles with rotating turret, e.g. M34A2 Longstreet Light Tank)
\ - 2. \"CTRL + Click\" - activates not destroyed activatable support module.
\ - 3. \"Middle Mouse Button Click (MMB)\" - default shortcut to shoot currently not selected weapon if possible. Won't work if SHIFT + Click firing is toggled ON.
\ - 4. \"SHIFT + Click\" - examines target as usual, unless \"G: Toggle Middle/Shift Clicking\" verb was used to toggle SHIFT + Click firing ON. In this case, it will fire currently not selected weapon if possible.
" + Gunner shortcuts:
1. \"ALT + Click\" - toggles Turret Gyrostabilizer. (Exists only on vehicles with rotating turret, e.g. M34A2 Longstreet Light Tank)
" show_browser(user, dat, "Vehicle Controls Guide", "vehicle_help", "size=900x500") onclose(user, "vehicle_help") From 38ce90b34e40f34cdf98c2845975915d8926a4a1 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 6 Dec 2023 11:02:27 +0000 Subject: [PATCH 12/20] Automatic changelog for PR #4959 [ci skip] --- html/changelogs/AutoChangeLog-pr-4959.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4959.yml diff --git a/html/changelogs/AutoChangeLog-pr-4959.yml b/html/changelogs/AutoChangeLog-pr-4959.yml new file mode 100644 index 000000000000..353ab3f02880 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4959.yml @@ -0,0 +1,5 @@ +author: "Doubleumc" +delete-after: True +changes: + - refactor: "vehicle weapons can fire full-auto" + - rscdel: "no more controls for firing vehicle non-selected weapons" \ No newline at end of file From 72d3ff6c3b94eff98002bdc4c3f489f4cf03f7c0 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:48:28 +0000 Subject: [PATCH 13/20] Paygrade shorthand defines. (#5128) # About the pull request This PR converts all paygrade shorthands (e.g. ME1) into PAY_SHORT_XXX defines. The reason for this is to ensure any changes are reflected across the board, and also to allow the shorthand to carry description of what it is. It can be hard to tell what a paygrade is meant to be based upon arbitrary letters. # Explain why it's good for the game Makes future code changes easier. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: code: Paygrade shorthands now use defines. fix: CLF and Survivors are no longer privates. fix: Civillian Mr/Ms/Mx prefix now works correctly, and is the default for new ID cards. /:cl: --- code/__DEFINES/paygrade_defs/civilian.dm | 35 +++++ code/__DEFINES/paygrade_defs/cmb.dm | 20 +++ code/__DEFINES/paygrade_defs/dutch.dm | 17 +++ code/__DEFINES/paygrade_defs/marines.dm | 80 ++++++++++++ code/__DEFINES/paygrade_defs/navy.dm | 74 +++++++++++ code/__DEFINES/paygrade_defs/provost.dm | 14 ++ code/__DEFINES/paygrade_defs/upp.dm | 59 +++++++++ code/__DEFINES/paygrade_defs/weyland.dm | 32 +++++ .../paygrades/factions/civillian/civilian.dm | 30 ----- .../paygrades/factions/other/civilian.dm | 52 ++++++++ code/datums/paygrades/factions/other/cmb.dm | 71 ++-------- .../paygrades/factions/other/dutch_dozen.dm | 24 ++-- code/datums/paygrades/factions/other/misc.dm | 6 +- code/datums/paygrades/factions/upp/upp.dm | 40 +++--- code/datums/paygrades/factions/uscm/marine.dm | 52 ++++---- code/datums/paygrades/factions/uscm/navy.dm | 48 +++---- .../datums/paygrades/factions/uscm/provost.dm | 41 ++---- code/datums/paygrades/factions/wy/goons.dm | 15 --- code/datums/paygrades/factions/wy/wy.dm | 20 +-- code/datums/paygrades/paygrade.dm | 46 +++---- code/game/objects/items/cards_ids.dm | 2 +- code/modules/clothing/under/rank_pins.dm | 122 +++++++----------- code/modules/gear_presets/agents.dm | 4 +- code/modules/gear_presets/cbrn.dm | 10 +- code/modules/gear_presets/clf.dm | 4 + code/modules/gear_presets/cmb.dm | 20 +-- code/modules/gear_presets/corpses.dm | 12 +- code/modules/gear_presets/dust_raider.dm | 12 +- code/modules/gear_presets/dutch.dm | 10 +- code/modules/gear_presets/fun.dm | 8 +- .../survivors/lv_522/forcon_survivors.dm | 6 +- code/modules/gear_presets/survivors/misc.dm | 4 +- .../crashlanding-offices_insert_bigred.dm | 2 +- .../gear_presets/survivors/survivors.dm | 14 +- .../crashlanding_upp_bar_insert_trijent.dm | 21 ++- code/modules/gear_presets/synths.dm | 8 +- code/modules/gear_presets/upp.dm | 52 ++++---- code/modules/gear_presets/uscm.dm | 52 ++++---- code/modules/gear_presets/uscm_dress.dm | 38 +++--- code/modules/gear_presets/uscm_event.dm | 50 +++---- code/modules/gear_presets/uscm_medical.dm | 10 +- code/modules/gear_presets/uscm_police.dm | 12 +- code/modules/gear_presets/uscm_ship.dm | 50 +++---- code/modules/gear_presets/whiteout.dm | 2 +- code/modules/gear_presets/wo.dm | 42 +++--- code/modules/gear_presets/wy.dm | 22 ++-- code/modules/gear_presets/wy_goons.dm | 6 +- colonialmarines.dme | 11 +- 48 files changed, 826 insertions(+), 556 deletions(-) create mode 100644 code/__DEFINES/paygrade_defs/civilian.dm create mode 100644 code/__DEFINES/paygrade_defs/cmb.dm create mode 100644 code/__DEFINES/paygrade_defs/dutch.dm create mode 100644 code/__DEFINES/paygrade_defs/marines.dm create mode 100644 code/__DEFINES/paygrade_defs/navy.dm create mode 100644 code/__DEFINES/paygrade_defs/provost.dm create mode 100644 code/__DEFINES/paygrade_defs/upp.dm create mode 100644 code/__DEFINES/paygrade_defs/weyland.dm delete mode 100644 code/datums/paygrades/factions/civillian/civilian.dm create mode 100644 code/datums/paygrades/factions/other/civilian.dm delete mode 100644 code/datums/paygrades/factions/wy/goons.dm diff --git a/code/__DEFINES/paygrade_defs/civilian.dm b/code/__DEFINES/paygrade_defs/civilian.dm new file mode 100644 index 000000000000..ed99a363dedd --- /dev/null +++ b/code/__DEFINES/paygrade_defs/civilian.dm @@ -0,0 +1,35 @@ +// Paygrade shorthand defines, to allow clearer designation. + +// Civilians +/// CIV, Civilian +#define PAY_SHORT_CIV "CIV" + +/// CNUR, Nurse +#define PAY_SHORT_CNUR "CNUR" + +/// CDOC, Doctor +#define PAY_SHORT_CDOC "CDOC" + +/// CCMO, Professor +#define PAY_SHORT_CCMO "CCMO" + +/// CREP, Representative +#define PAY_SHORT_CREP "CREP" + +/// SYN, Synthetic +#define PAY_SHORT_SYN "SYN" + +/// OPR, Operative +#define PAY_SHORT_OPR "OPR" + +/// CPO, Officer +#define PAY_SHORT_CPO "CPO" + +/// CSPO, Senior Officer +#define PAY_SHORT_CSPO "CSPO" + +/// REB, Rebel +#define PAY_SHORT_REB "REB" + +/// REBC, Rebel Commander "REBC" +#define PAY_SHORT_REBC "REBC" diff --git a/code/__DEFINES/paygrade_defs/cmb.dm b/code/__DEFINES/paygrade_defs/cmb.dm new file mode 100644 index 000000000000..8ebd7902dbf8 --- /dev/null +++ b/code/__DEFINES/paygrade_defs/cmb.dm @@ -0,0 +1,20 @@ +// Paygrade shorthand defines, to allow clearer designation. + +// Colonial Marshal Bureau +/// IHRO, Interstellar Human Rights Observer +#define PAY_SHORT_IHRO "IHRO" + +/// ICCL, Interstellar Commerce Commission Corporate Liaison +#define PAY_SHORT_ICCL "ICCL" + +/// ICCA, Interstellar Commerce Commission Agent +#define PAY_SHORT_ICCA "ICCA" + +/// CMBM, CMB Marshal +#define PAY_SHORT_CMBM "CMBM" + +/// CMBD, CMB Deputy +#define PAY_SHORT_CMBD "CMBD" + +/// CMBS, CMB Synthetic +#define PAY_SHORT_CMBS "CMBS" diff --git a/code/__DEFINES/paygrade_defs/dutch.dm b/code/__DEFINES/paygrade_defs/dutch.dm new file mode 100644 index 000000000000..299096060f3f --- /dev/null +++ b/code/__DEFINES/paygrade_defs/dutch.dm @@ -0,0 +1,17 @@ +// Paygrade shorthand defines, to allow clearer designation. + +// Dutches Dozen +/// DTC, Dutch's Dozen Standard Mercenary +#define PAY_SHORT_DTC "DTC" + +/// DTCM, Dutch's Dozen Medic +#define PAY_SHORT_DTCM "DTCM" + +/// DTCF, Dutch's Dozen Flamethrower Specialist +#define PAY_SHORT_DTCF "DTCF" + +/// DTCMG, Dutch's Dozen Machinegunner +#define PAY_SHORT_DTCMG "DTCMG" + +/// DTCA, Arnold +#define PAY_SHORT_DTCA "DTCA" diff --git a/code/__DEFINES/paygrade_defs/marines.dm b/code/__DEFINES/paygrade_defs/marines.dm new file mode 100644 index 000000000000..74b659630820 --- /dev/null +++ b/code/__DEFINES/paygrade_defs/marines.dm @@ -0,0 +1,80 @@ +// Paygrade shorthand defines, to allow clearer designation. + +// USCM MARINES +/// ME1, Private +#define PAY_SHORT_ME1 "ME1" + +/// ME2, Private First Class +#define PAY_SHORT_ME2 "ME2" + +/// ME3, Lance Corporal +#define PAY_SHORT_ME3 "ME3" + +/// ME4, Corporal +#define PAY_SHORT_ME4 "ME4" + +/// ME5, Sergeant +#define PAY_SHORT_ME5 "ME5" + +/// ME6, Staff Sergeant +#define PAY_SHORT_ME6 "ME6" + +/// ME7, Gunnery Sergeant +#define PAY_SHORT_ME7 "ME7" + +/// ME8, Master Sergeant +#define PAY_SHORT_ME8 "ME8" + +/// ME8E, First Sergeant +#define PAY_SHORT_ME8E "ME8E" + +/// ME9, Master Gunnery Sergeant +#define PAY_SHORT_ME9 "ME9" + +/// ME9E, Sergeant Major +#define PAY_SHORT_ME9E "ME9E" + +/// ME9C, Sergeant Major of the Colonial Marine Corps +#define PAY_SHORT_ME9C "ME9C" + +/// MO1, Second Lieutenant +#define PAY_SHORT_MO1 "MO1" + +/// MO2, First Lieutenant +#define PAY_SHORT_MO2 "MO2" +/// MO3, Captain + +#define PAY_SHORT_MO3 "MO3" +/// MO4, Major + +#define PAY_SHORT_MO4 "MO4" +/// MO5, Lieutenant Colonel + +#define PAY_SHORT_MO5 "MO5" +/// MO6, Colonel + +#define PAY_SHORT_MO6 "MO6" +/// MO6E, Senior Colonel + +#define PAY_SHORT_MO6E "MO6E" +/// MO6C, Division Colonel + +#define PAY_SHORT_MO6C "MO6C" +/// MO7, Brigadier General + +#define PAY_SHORT_MO7 "MO7" +/// MO8, Major General + +#define PAY_SHORT_MO8 "MO8" +/// MO9, Lieutenant General + +#define PAY_SHORT_MO9 "MO9" +/// MO10, General + +#define PAY_SHORT_MO10 "MO10" + +/// MO10C, Assistant Commandant of the Marine Corps +#define PAY_SHORT_MO10C "MO10C" + +/// MO10S, Commandant of the Marine Corps +#define PAY_SHORT_MO10S "MO10S" diff --git a/code/__DEFINES/paygrade_defs/navy.dm b/code/__DEFINES/paygrade_defs/navy.dm new file mode 100644 index 000000000000..d51cccb8fe97 --- /dev/null +++ b/code/__DEFINES/paygrade_defs/navy.dm @@ -0,0 +1,74 @@ +// Paygrade shorthand defines, to allow clearer designation. + +// USCM NAVY +/// NE1, Seaman Recruit +#define PAY_SHORT_NE1 "NE1" + +/// NE2M, Seaman Apprentice +#define PAY_SHORT_NE2 "NE2" + +/// NE3, Seaman +#define PAY_SHORT_NE3 "NE3" + +/// NE4, Petty Officer 3rd Class +#define PAY_SHORT_NE4 "NE4" + +/// NE5, Petty Officer 2nd Class +#define PAY_SHORT_NE5 "NE5" + +/// NE6, Petty Officer 1st Class +#define PAY_SHORT_NE6 "N36" + +/// NE7, Chief Petty Officer +#define PAY_SHORT_NE7 "NE7" + +/// NE8, Senior Chief Petty Officer +#define PAY_SHORT_NE8 "NE8" + +/// NE8C, Command Senior Chief Petty Officer +#define PAY_SHORT_NE8C "NE8C" + +/// NE9, Master Chief Petty Officer +#define PAY_SHORT_NE9 "NE9" + +/// NE9C, Command Master Chief Petty Officer +#define PAY_SHORT_NE9C "NE9C" + +/// NO1, Ensign +#define PAY_SHORT_NO1 "NO1" + +/// NO2, Lieutenant Junior Grade +#define PAY_SHORT_NO2 "NO2" + +/// NO3, Lieutenant +#define PAY_SHORT_NO3 "NO3" + +/// NO4, Lieutenant Commander +#define PAY_SHORT_NO4 "NO4" + +/// NO5, Commander +#define PAY_SHORT_NO5 "NO5" + +/// NO6, Captain +#define PAY_SHORT_NO6 "NO6" + +/// NO6E, Commodore +#define PAY_SHORT_NO6E "NO6E" + +/// NO6C, Senior Commodore +#define PAY_SHORT_NO6C "NO6C" + +/// NO7, Rear Admiral (Lower Half) +#define PAY_SHORT_NO7 "NO7" + +/// NO8, Rear Admiral (Upper Half) +#define PAY_SHORT_NO8 "NO8" + +/// NO9, Vice Admiral +#define PAY_SHORT_NO9 "NO9" + +/// NO10, Admiral +#define PAY_SHORT_NO10 "NO10" + +/// NO10C, Chief of Naval Operations +#define PAY_SHORT_NO10C "NO10C" diff --git a/code/__DEFINES/paygrade_defs/provost.dm b/code/__DEFINES/paygrade_defs/provost.dm new file mode 100644 index 000000000000..5b2121642d52 --- /dev/null +++ b/code/__DEFINES/paygrade_defs/provost.dm @@ -0,0 +1,14 @@ +// Paygrade shorthand defines, to allow clearer designation. + +// PROVOST OFFICE +/// PvI, Provost Inspector +#define PAY_SHORT_PVI "PvI" + +/// PvM, Provost Marshal +#define PAY_SHORT_PVM "PvM" + +/// PvSM, Provost Sector Marshal +#define PAY_SHORT_PVSM "PvSM" + +/// PvCM, Provost Chief Marshal +#define PAY_SHORT_PVCM "PvCM" diff --git a/code/__DEFINES/paygrade_defs/upp.dm b/code/__DEFINES/paygrade_defs/upp.dm new file mode 100644 index 000000000000..40c0d8441b2e --- /dev/null +++ b/code/__DEFINES/paygrade_defs/upp.dm @@ -0,0 +1,59 @@ +// Paygrade shorthand defines, to allow clearer designation. + +// Union of Progressive Peoples +/// UE, +#define PAY_SHORT_UEC "UEC" + +/// UE1, Private +#define PAY_SHORT_UE1 "UE1" + +/// UE2, Private First Class +#define PAY_SHORT_UE2 "UE2" + +/// UE3, Korporal +#define PAY_SHORT_UE3 "UE3" + +/// UE4, unior Serzhant +#define PAY_SHORT_UE4 "UE4" + +/// UE5, Serzhant +#define PAY_SHORT_UE5 "UE5" + +/// UE6, Master Serzhant +#define PAY_SHORT_UE6 "UE6" + +/// UC1, Junior Kommando +#define PAY_SHORT_UC1 "UC1" + +/// UC2, 2nd Kommando +#define PAY_SHORT_UC2 "UC2" + +/// UC3, 1st Kommando +#define PAY_SHORT_UC3 "UC3" + +/// UO1, Leytenant +#define PAY_SHORT_UO1 "UO1" + +/// UO2, Senior Leytenant +#define PAY_SHORT_UO2 "UO2" + +/// UO3, Kapitan +#define PAY_SHORT_UO3 "UO3" + +/// UO4, Mayjor +#define PAY_SHORT_UO4 "UO4" + +/// UO5, Leytenant Kolonel +#define PAY_SHORT_UO5 "UO5" + +/// UO6, Kolonel +#define PAY_SHORT_UO6 "UO6" + +/// UO7, Mayjor General +#define PAY_SHORT_UO7 "UO7" + +/// UO8, Leytenant General +#define PAY_SHORT_UO8 "UO8" + +/// UO9, Army General +#define PAY_SHORT_UO9 "UO9" diff --git a/code/__DEFINES/paygrade_defs/weyland.dm b/code/__DEFINES/paygrade_defs/weyland.dm new file mode 100644 index 000000000000..1b6c168e9b6e --- /dev/null +++ b/code/__DEFINES/paygrade_defs/weyland.dm @@ -0,0 +1,32 @@ +// Paygrade shorthand defines, to allow clearer designation. + +// Weyland Yutani +/// WYC1, Trainee +#define PAY_SHORT_WYC1 "WYC1" + +/// WYC2, Junior Executive +#define PAY_SHORT_WYC2 "WYC2" + +/// WYC3, Executive +#define PAY_SHORT_WYC3 "WYC3" + +/// WYC4, Senior Executive +#define PAY_SHORT_WYC4 "WYC4" + +/// WYC5, Executive Specialist +#define PAY_SHORT_WYC5 "WYC5" + +/// WYC6, Executive Supervisor +#define PAY_SHORT_WYC6 "WYC6" + +/// WYC7, Assistant Manager +#define PAY_SHORT_WYC7 "WYC7" + +/// WYC8, Division Manager +#define PAY_SHORT_WYC8 "WYC8" + +/// WYC9, Chief Executive +#define PAY_SHORT_WYC9 "WYC9" + +/// WYC10, Director +#define PAY_SHORT_WYC10 "WYC10" diff --git a/code/datums/paygrades/factions/civillian/civilian.dm b/code/datums/paygrades/factions/civillian/civilian.dm deleted file mode 100644 index 2c2aa5feac1c..000000000000 --- a/code/datums/paygrades/factions/civillian/civilian.dm +++ /dev/null @@ -1,30 +0,0 @@ -/datum/paygrade/civilian - name = "Civilian Paygrade" - pay_multiplier = 0.5 // civvies are poor - -/datum/paygrade/civilian/civilian - paygrade = "C" - name = "Civilian" - -/datum/paygrade/civilian/nurse - paygrade = "CN" - name = "Nurse" - prefix = "Nrs." - -/datum/paygrade/civilian/doctor - paygrade = "CD" - name = "Doctor" - prefix = "Dr." - pay_multiplier = 0.75 - -/datum/paygrade/civilian/professor - paygrade = "CCMO" - name = "Professor" - prefix = "Prof." - pay_multiplier = 1 - -/datum/paygrade/civillian/representative - paygrade = "CR" - name = "Representative" - prefix = "Rep." - pay_multiplier = 1 diff --git a/code/datums/paygrades/factions/other/civilian.dm b/code/datums/paygrades/factions/other/civilian.dm new file mode 100644 index 000000000000..6587a82a54d6 --- /dev/null +++ b/code/datums/paygrades/factions/other/civilian.dm @@ -0,0 +1,52 @@ +/datum/paygrade/civilian + name = "Civilian Paygrade" + pay_multiplier = 0.5 // civvies are poor + +/datum/paygrade/civilian/civilian + paygrade = PAY_SHORT_CIV + name = "Civilian" + prefix = "C" + +/datum/paygrade/civilian/nurse + paygrade = PAY_SHORT_CNUR + name = "Nurse" + prefix = "Nrs." + +/datum/paygrade/civilian/doctor + paygrade = PAY_SHORT_CDOC + name = "Doctor" + prefix = "Dr." + pay_multiplier = 0.75 + +/datum/paygrade/civilian/professor + paygrade = PAY_SHORT_CCMO + name = "Professor" + prefix = "Prof." + pay_multiplier = 1 + +/datum/paygrade/civillian/representative + paygrade = PAY_SHORT_CREP + name = "Representative" + prefix = "Rep." + pay_multiplier = 1 + +/datum/paygrade/civillian/officer + paygrade = PAY_SHORT_CPO + name = "Officer" + prefix = "Off." + pay_multiplier = 0.66 + +/datum/paygrade/civillian/officer/senior + paygrade = PAY_SHORT_CSPO + name = "Senior Officer" + prefix = "Sr. Off." + pay_multiplier = 0.8 + +/datum/paygrade/civilian/rebel + paygrade = PAY_SHORT_REB + name = "Rebel" + +/datum/paygrade/civilian/rebel/leader + paygrade = PAY_SHORT_REBC + name = "Rebel Commander" + prefix = "CMDR." diff --git a/code/datums/paygrades/factions/other/cmb.dm b/code/datums/paygrades/factions/other/cmb.dm index a4b656d8692d..eeeb061ea335 100644 --- a/code/datums/paygrades/factions/other/cmb.dm +++ b/code/datums/paygrades/factions/other/cmb.dm @@ -3,78 +3,29 @@ pay_multiplier = 1.4 // Government work. Nice benefits. /datum/paygrade/cmb/standard - paygrade = "GS-9" + paygrade = PAY_SHORT_CMBD name = "CMB Deputy" prefix = "Dep." /datum/paygrade/cmb/leader - paygrade = "GS-13" + paygrade = PAY_SHORT_CMBM name = "CMB Marshal" prefix = "Marshal" /datum/paygrade/cmb/syn - paygrade = "GS-C.9" + paygrade = PAY_SHORT_CMBS name = "CMB Investigative Synthetic" -/datum/paygrade/cmb/liaison - paygrade = "GS-6" +/datum/paygrade/cmb/icc + paygrade = PAY_SHORT_ICCA + name = "Interstellar Commerce Commission Agent" + prefix = "Agent" + +/datum/paygrade/cmb/icc/liaison + paygrade = PAY_SHORT_ICCL name = "Interstellar Commerce Commission Corporate Liaison" prefix = "Exec." /datum/paygrade/cmb/observer - paygrade = "GS-3" + paygrade = PAY_SHORT_IHRO name = "Interstellar Human Rights Observer" -/datum/paygrade/marine - name = "Marine Paygrade" - rank_pin = /obj/item/clothing/accessory/ranks/marine - pay_multiplier = 1 - -// ENLISTED PAYGRADES - -/datum/paygrade/marine/e1 - paygrade = "ME1" - name = "Private" - prefix = "PVT" - rank_pin = /obj/item/clothing/accessory/ranks/marine/e1 - ranking = 0 - pay_multiplier = 0.8 - -/datum/paygrade/marine/e2 - paygrade = "ME2" - name = "Private First Class" - prefix = "PFC" - rank_pin = /obj/item/clothing/accessory/ranks/marine/e2 - ranking = 1 - pay_multiplier = 1 // the default. - -/datum/paygrade/marine/e3 - paygrade = "ME3" - name = "Lance Corporal" - prefix = "LCpl" - rank_pin = /obj/item/clothing/accessory/ranks/marine/e3 - ranking = 2 - pay_multiplier = 1.4 - -/datum/paygrade/marine/e4 - paygrade = "ME4" - name = "Corporal" - prefix = "Cpl" - rank_pin = /obj/item/clothing/accessory/ranks/marine/e4 - ranking = 3 - pay_multiplier = 1.6 - -/datum/paygrade/marine/e5 - paygrade = "ME5" - name = "Sergeant" - prefix = "Sgt" - rank_pin = /obj/item/clothing/accessory/ranks/marine/e5 - ranking = 4 - pay_multiplier = 1.8 - -/datum/paygrade/marine/e6 - paygrade = "ME6" - name = "Staff Sergeant" - prefix = "SSgt" - rank_pin = /obj/item/clothing/accessory/ranks/marine/e6 - ranking = 5 - pay_multiplier = 2 diff --git a/code/datums/paygrades/factions/other/dutch_dozen.dm b/code/datums/paygrades/factions/other/dutch_dozen.dm index 9b8bd7e4f8c4..8877bd11afbb 100644 --- a/code/datums/paygrades/factions/other/dutch_dozen.dm +++ b/code/datums/paygrades/factions/other/dutch_dozen.dm @@ -1,33 +1,33 @@ /datum/paygrade/dutch name = "Dutch Paygrade" pay_multiplier = 5 + fprefix = "DTC." /datum/paygrade/dutch/standard - paygrade = "DTC" + paygrade = PAY_SHORT_DTC name = "Dutch's Dozen Standard Mercenary" - prefix = "DTC." /datum/paygrade/dutch/medic - paygrade = "DTCM" + paygrade = PAY_SHORT_DTCM name = "Dutch's Dozen Medic" - prefix = "DTC MED." + prefix = "MED." pay_multiplier = 6 /datum/paygrade/dutch/specialist_flamer - paygrade = "DTCF" + paygrade = PAY_SHORT_DTCF name = "Dutch's Dozen Flamethrower Specialist" - prefix = "DTC SPC." + prefix = "SPC." pay_multiplier = 6 /datum/paygrade/dutch/specialist_minigunner - paygrade = "DTCMG" - name = "Dutch's Dozen Medic" - prefix = "DTC SPC." + paygrade = PAY_SHORT_DTCMG + name = "Dutch's Dozen Machinegunner" + prefix = "SPC." pay_multiplier = 6 /datum/paygrade/dutch/arnold - paygrade = "ARN" - name = "Arnold" - prefix = "DTC LDR." + paygrade = PAY_SHORT_DTCA + name = "Major" + prefix = "LDR." pay_multiplier = 9 diff --git a/code/datums/paygrades/factions/other/misc.dm b/code/datums/paygrades/factions/other/misc.dm index 30865228d3af..04e522580b50 100644 --- a/code/datums/paygrades/factions/other/misc.dm +++ b/code/datums/paygrades/factions/other/misc.dm @@ -1,9 +1,9 @@ -/datum/paygrade/misc/operator +/datum/paygrade/misc/operative name = "Operative" - paygrade = "O" + paygrade = PAY_SHORT_OPR pay_multiplier = 1 //???? /datum/paygrade/misc/synth name = "Synthetic" - paygrade = "SYN" + paygrade = PAY_SHORT_SYN pay_multiplier = 1 diff --git a/code/datums/paygrades/factions/upp/upp.dm b/code/datums/paygrades/factions/upp/upp.dm index a1363383ad55..8670f99269dc 100644 --- a/code/datums/paygrades/factions/upp/upp.dm +++ b/code/datums/paygrades/factions/upp/upp.dm @@ -5,115 +5,115 @@ //UPP Enlisted /datum/paygrade/upp/ue0 - paygrade = "UE0" + paygrade = PAY_SHORT_UEC name = "Conscript" pay_multiplier = 0.05 /datum/paygrade/upp/ue1 - paygrade = "UE1" + paygrade = PAY_SHORT_UE1 name = "Private" prefix = "PVT." /datum/paygrade/upp/ue2 - paygrade = "UE2" + paygrade = PAY_SHORT_UE2 name = "Private First Class" prefix = "PFC." pay_multiplier = 0.2 /datum/paygrade/upp/ue3 - paygrade = "UE3" + paygrade = PAY_SHORT_UE3 name = "Korporal" prefix = "Kpl." pay_multiplier = 0.3 /datum/paygrade/upp/ue4 - paygrade = "UE4" + paygrade = PAY_SHORT_UE4 name = "Junior Serzhant" prefix = "JrSzh." pay_multiplier = 0.5 /datum/paygrade/upp/ue5 - paygrade = "UE5" + paygrade = PAY_SHORT_UE5 name = "Serzhant" prefix = "Szh." pay_multiplier = 0.7 /datum/paygrade/upp/ue6 - paygrade = "UE6" + paygrade = PAY_SHORT_UE6 name = "Master Serzhant" prefix = "MSzh." pay_multiplier = 0.9 //UPP Commandos /datum/paygrade/upp/uc1 - paygrade = "UC1" + paygrade = PAY_SHORT_UC1 name = "Junior Kommando" prefix = "JKdo." pay_multiplier = 1.5 /datum/paygrade/upp/uc2 - paygrade = "UC2" + paygrade = PAY_SHORT_UC2 name = "2nd Kommando" prefix = "2ndKdo." pay_multiplier = 2 /datum/paygrade/upp/uc3 - paygrade = "UC3" + paygrade = PAY_SHORT_UC3 name = "1st Kommando" prefix = "1stKdo." pay_multiplier = 2.5 //UPP Officers /datum/paygrade/upp/uo1 - paygrade = "UO1" + paygrade = PAY_SHORT_UO1 name = "Leytenant" prefix = "Lt." pay_multiplier = 1.25 /datum/paygrade/upp/uo2 - paygrade = "UO2" + paygrade = PAY_SHORT_UO2 name = "Senior Leytenant" prefix = "Sr. LT." pay_multiplier = 1.5 /datum/paygrade/upp/uo3 - paygrade = "UO3" + paygrade = PAY_SHORT_UO3 name = "Kapitan" prefix = "Kpt." pay_multiplier = 2 /datum/paygrade/upp/uo4 - paygrade = "UO4" - name = "Mayjor." + paygrade = PAY_SHORT_UO4 + name = "Mayjor" prefix = "May." pay_multiplier = 2.5 /datum/paygrade/upp/uo5 - paygrade = "UO5" + paygrade = PAY_SHORT_UO5 name = "Leytenant Kolonel" prefix = "Lt. Kol." pay_multiplier = 3 /datum/paygrade/upp/uo6 - paygrade = "UO6" + paygrade = PAY_SHORT_UO6 name = "Kolonel" prefix = "Kol." pay_multiplier = 4 /datum/paygrade/upp/uo7 - paygrade = "UO7" + paygrade = PAY_SHORT_UO7 name = "Mayjor General" prefix = "May. Gen." pay_multiplier = 5 /datum/paygrade/upp/uo8 - paygrade = "UO8" + paygrade = PAY_SHORT_UO8 name = "Leytenant General" prefix = "Lt. Gen." pay_multiplier = 6 /datum/paygrade/upp/uo9 - paygrade = "UO9" + paygrade = PAY_SHORT_UO9 name = "Army General" prefix = "Gen." pay_multiplier = 7 diff --git a/code/datums/paygrades/factions/uscm/marine.dm b/code/datums/paygrades/factions/uscm/marine.dm index e351311e65ee..7d315f364025 100644 --- a/code/datums/paygrades/factions/uscm/marine.dm +++ b/code/datums/paygrades/factions/uscm/marine.dm @@ -6,7 +6,7 @@ // ENLISTED PAYGRADES /datum/paygrade/marine/e1 - paygrade = "ME1" + paygrade = PAY_SHORT_ME1 name = "Private" prefix = "PVT" rank_pin = /obj/item/clothing/accessory/ranks/marine/e1 @@ -14,7 +14,7 @@ pay_multiplier = 1.6 /datum/paygrade/marine/e2 - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 name = "Private First Class" prefix = "PFC" rank_pin = /obj/item/clothing/accessory/ranks/marine/e2 @@ -22,7 +22,7 @@ pay_multiplier = 1.7 /datum/paygrade/marine/e3 - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 name = "Lance Corporal" prefix = "LCpl" rank_pin = /obj/item/clothing/accessory/ranks/marine/e3 @@ -30,7 +30,7 @@ pay_multiplier = 1.9 /datum/paygrade/marine/e4 - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 name = "Corporal" prefix = "Cpl" rank_pin = /obj/item/clothing/accessory/ranks/marine/e4 @@ -38,7 +38,7 @@ pay_multiplier = 2.1 /datum/paygrade/marine/e5 - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 name = "Sergeant" prefix = "Sgt" rank_pin = /obj/item/clothing/accessory/ranks/marine/e5 @@ -46,7 +46,7 @@ pay_multiplier = 2.2 /datum/paygrade/marine/e6 - paygrade = "ME6" + paygrade = PAY_SHORT_ME6 name = "Staff Sergeant" prefix = "SSgt" rank_pin = /obj/item/clothing/accessory/ranks/marine/e6 @@ -54,7 +54,7 @@ pay_multiplier = 2.4 /datum/paygrade/marine/e7 - paygrade = "ME7" + paygrade = PAY_SHORT_ME7 name = "Gunnery Sergeant" prefix = "GySgt" rank_pin = /obj/item/clothing/accessory/ranks/marine/e7 @@ -62,7 +62,7 @@ pay_multiplier = 2.75 /datum/paygrade/marine/e8 - paygrade = "ME8" + paygrade = PAY_SHORT_ME8 name = "Master Sergeant" prefix = "MSgt" rank_pin = /obj/item/clothing/accessory/ranks/marine/e8 @@ -70,7 +70,7 @@ pay_multiplier = 2.75 /datum/paygrade/marine/e8e - paygrade = "ME8E" + paygrade = PAY_SHORT_ME8E name = "First Sergeant" prefix = "1Sgt" rank_pin = /obj/item/clothing/accessory/ranks/marine/e8e @@ -78,7 +78,7 @@ pay_multiplier = 2.75 /datum/paygrade/marine/e9 - paygrade = "ME9" + paygrade = PAY_SHORT_ME9 name = "Master Gunnery Sergeant" prefix = "MGySgt" rank_pin = /obj/item/clothing/accessory/ranks/marine/e9 @@ -86,7 +86,7 @@ pay_multiplier = 3 /datum/paygrade/marine/e9e - paygrade = "ME9E" + paygrade = PAY_SHORT_ME9E name = "Sergeant Major" prefix = "SgtMaj" rank_pin = /obj/item/clothing/accessory/ranks/marine/e9e @@ -94,7 +94,7 @@ pay_multiplier = 3 /datum/paygrade/marine/e9c - paygrade = "ME9C" + paygrade = PAY_SHORT_ME9C name = "Sergeant Major of the Colonial Marine Corps" prefix = "SMCMC" rank_pin = /obj/item/clothing/accessory/ranks/marine/e9c @@ -104,7 +104,7 @@ // COMMISSIONED PAYGRADES /datum/paygrade/marine/o1 - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 name = "Second Lieutenant" prefix = "2ndLt" rank_pin = /obj/item/clothing/accessory/ranks/marine/o1 @@ -112,7 +112,7 @@ pay_multiplier = 3 /datum/paygrade/marine/o2 - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 name = "First Lieutenant" prefix = "1stLt" rank_pin = /obj/item/clothing/accessory/ranks/marine/o2 @@ -120,7 +120,7 @@ pay_multiplier = 3.2 /datum/paygrade/marine/o3 - paygrade = "MO3" + paygrade = PAY_SHORT_MO3 name = "Captain" prefix = "Capt" rank_pin = /obj/item/clothing/accessory/ranks/marine/o3 @@ -128,7 +128,7 @@ pay_multiplier = 4 /datum/paygrade/marine/o4 - paygrade = "MO4" + paygrade = PAY_SHORT_MO4 name = "Major" prefix = "Maj" rank_pin = /obj/item/clothing/accessory/ranks/marine/o4 @@ -136,7 +136,7 @@ pay_multiplier = 4 /datum/paygrade/marine/o5 - paygrade = "MO5" + paygrade = PAY_SHORT_MO5 name = "Lieutenant Colonel" prefix = "LtCol" rank_pin = /obj/item/clothing/accessory/ranks/marine/o5 @@ -145,7 +145,7 @@ //Platoon Commander /datum/paygrade/marine/o6 - paygrade = "MO6" + paygrade = PAY_SHORT_MO6 name = "Colonel" prefix = "Col" rank_pin = /obj/item/clothing/accessory/ranks/marine/o6 @@ -153,7 +153,7 @@ pay_multiplier = 4.4 /datum/paygrade/marine/o6e - paygrade = "MO6E" + paygrade = PAY_SHORT_MO6E name = "Senior Colonel" prefix = "Snr Col." rank_pin = /obj/item/clothing/accessory/ranks/marine/o6e @@ -161,7 +161,7 @@ pay_multiplier = 4.6 /datum/paygrade/marine/o6c - paygrade = "MO6C" + paygrade = PAY_SHORT_MO6C name = "Division Colonel" prefix = "Div Col." rank_pin = /obj/item/clothing/accessory/ranks/marine/o6c @@ -170,7 +170,7 @@ //High Command /datum/paygrade/marine/o7 - paygrade = "MO7" + paygrade = PAY_SHORT_MO7 name = "Brigadier General" prefix = "BGen" rank_pin = /obj/item/clothing/accessory/ranks/marine/o7 @@ -178,7 +178,7 @@ pay_multiplier = 6 /datum/paygrade/marine/o8 - paygrade = "MO8" + paygrade = PAY_SHORT_MO8 name = "Major General" prefix = "MajGen" rank_pin = /obj/item/clothing/accessory/ranks/marine/o8 @@ -186,7 +186,7 @@ pay_multiplier = 6.2 /datum/paygrade/marine/o9 - paygrade = "MO9" + paygrade = PAY_SHORT_MO9 name = "Lieutenant General" prefix = "LtGen" rank_pin = /obj/item/clothing/accessory/ranks/marine/o9 @@ -194,7 +194,7 @@ pay_multiplier = 6.4 /datum/paygrade/marine/o10 - paygrade = "MO10" + paygrade = PAY_SHORT_MO10 name = "General" prefix = "Gen" rank_pin = /obj/item/clothing/accessory/ranks/marine/o10 @@ -202,7 +202,7 @@ pay_multiplier = 6.6 /datum/paygrade/marine/o10c - paygrade = "MO10C" + paygrade = PAY_SHORT_MO10C name = "Assistant Commandant of the Marine Corps" prefix = "ACMC" rank_pin = /obj/item/clothing/accessory/ranks/marine/o10c @@ -210,7 +210,7 @@ pay_multiplier = 6.8 /datum/paygrade/marine/o10s - paygrade = "MO10S" + paygrade = PAY_SHORT_MO10S name = "Commandant of the Marine Corps" prefix = "CMC" rank_pin = /obj/item/clothing/accessory/ranks/marine/o10c diff --git a/code/datums/paygrades/factions/uscm/navy.dm b/code/datums/paygrades/factions/uscm/navy.dm index 7e648a75bac2..9e22c72fe566 100644 --- a/code/datums/paygrades/factions/uscm/navy.dm +++ b/code/datums/paygrades/factions/uscm/navy.dm @@ -6,77 +6,77 @@ // ENLISTED PAYGRADES /datum/paygrade/navy/e1 - paygrade = "NE1" + paygrade = PAY_SHORT_NE1 name = "Seaman Recruit" prefix = "SR." rank_pin = /obj/item/clothing/accessory/ranks/navy/e1 ranking = 0 /datum/paygrade/navy/e2 - paygrade = "NE2" + paygrade = PAY_SHORT_NE2 name = "Seaman Apprentice" prefix = "SA." rank_pin = /obj/item/clothing/accessory/ranks/navy/e2 ranking = 1 /datum/paygrade/navy/e3 - paygrade = "NE3" + paygrade = PAY_SHORT_NE3 name = "Seaman" prefix = "SN." rank_pin = /obj/item/clothing/accessory/ranks/navy/e3 ranking = 2 /datum/paygrade/navy/e4 - paygrade = "NE4" + paygrade = PAY_SHORT_NE4 name = "Petty Officer 3rd Class" prefix = "PO1." rank_pin = /obj/item/clothing/accessory/ranks/navy/e4 ranking = 3 /datum/paygrade/navy/e5 - paygrade = "NE5" + paygrade = PAY_SHORT_NE5 name = "Petty Officer 2nd Class" prefix = "PO2." rank_pin = /obj/item/clothing/accessory/ranks/navy/e5 ranking = 4 /datum/paygrade/navy/e6 - paygrade = "NE6" + paygrade = PAY_SHORT_NE6 name = "Petty Officer 1st Class" prefix = "PO1." rank_pin = /obj/item/clothing/accessory/ranks/navy/e6 ranking = 5 /datum/paygrade/navy/e7 - paygrade = "NE7" + paygrade = PAY_SHORT_NE7 name = "Chief Petty Officer" prefix = "CPO." rank_pin = /obj/item/clothing/accessory/ranks/navy/e7 ranking = 6 /datum/paygrade/navy/e8 - paygrade = "NE8" + paygrade = PAY_SHORT_NE8 name = "Senior Chief Petty Officer" prefix = "SCPO." rank_pin = /obj/item/clothing/accessory/ranks/navy/e8 ranking = 7 /datum/paygrade/navy/e8c - paygrade = "NE8C" + paygrade = PAY_SHORT_NE8C name = "Command Senior Chief Petty Officer" prefix = "CSCPO." rank_pin = /obj/item/clothing/accessory/ranks/navy/e8c ranking = 8 /datum/paygrade/navy/e9 - paygrade = "NE9" + paygrade = PAY_SHORT_NE9 name = "Master Chief Petty Officer" prefix = "MCPO." rank_pin = /obj/item/clothing/accessory/ranks/navy/e9 ranking = 9 /datum/paygrade/navy/e9c - paygrade = "NE9C" + paygrade = PAY_SHORT_NE9C name = "Command Master Chief Petty Officer" prefix = "CMCPO." rank_pin = /obj/item/clothing/accessory/ranks/navy/e9c @@ -85,91 +85,91 @@ // COMMISSIONED PAYGRADES /datum/paygrade/navy/o1 - paygrade = "NO1" + paygrade = PAY_SHORT_NO1 name = "Ensign" prefix = "ENS." rank_pin = /obj/item/clothing/accessory/ranks/navy/o1 ranking = 11 /datum/paygrade/navy/o2 - paygrade = "NO2" + paygrade = PAY_SHORT_NO2 name = "Lieutenant Junior Grade" prefix = "LTJG." rank_pin = /obj/item/clothing/accessory/ranks/navy/o2 ranking = 12 /datum/paygrade/navy/o3 - paygrade = "NO3" + paygrade = PAY_SHORT_NO3 name = "Lieutenant" prefix = "LT." rank_pin = /obj/item/clothing/accessory/ranks/navy/o3 ranking = 13 /datum/paygrade/navy/o4 - paygrade = "NO4" + paygrade = PAY_SHORT_NO4 name = "Lieutenant Commander" prefix = "LCDR." rank_pin = /obj/item/clothing/accessory/ranks/navy/o4 ranking = 14 /datum/paygrade/navy/o5 - paygrade = "NO5" + paygrade = PAY_SHORT_NO5 name = "Commander" prefix = "CDR." rank_pin = /obj/item/clothing/accessory/ranks/navy/o5 ranking = 15 /datum/paygrade/navy/o6 - paygrade = "NO6" + paygrade = PAY_SHORT_NO6 name = "Captain" prefix = "CAPT." rank_pin = /obj/item/clothing/accessory/ranks/navy/o6 ranking = 16 /datum/paygrade/navy/o6e - paygrade = "NO6E" + paygrade = PAY_SHORT_NO6E name = "Commodore" prefix = "CDRE." rank_pin = /obj/item/clothing/accessory/ranks/navy/o6e ranking = 17 /datum/paygrade/navy/o6c - paygrade = "NO6C" + paygrade = PAY_SHORT_NO6C name = "Senior Commodore" prefix = "Snr CDRE." rank_pin = /obj/item/clothing/accessory/ranks/navy/o6e ranking = 18 /datum/paygrade/navy/o7 - paygrade = "NO7" + paygrade = PAY_SHORT_NO7 name = "Rear Admiral (Lower Half)" prefix = "RDML." rank_pin = /obj/item/clothing/accessory/ranks/navy/o7 ranking = 19 /datum/paygrade/navy/o8 - paygrade = "NO8" + paygrade = PAY_SHORT_NO8 name = "Rear Admiral (Upper Half)" prefix = "RADM." rank_pin = /obj/item/clothing/accessory/ranks/navy/o8 ranking = 20 /datum/paygrade/navy/o9 - paygrade = "NO9" + paygrade = PAY_SHORT_NO9 name = "Vice Admiral" prefix = "VADM." rank_pin = /obj/item/clothing/accessory/ranks/navy/o9 ranking = 21 /datum/paygrade/navy/o10 - paygrade = "NO10" + paygrade = PAY_SHORT_NO10 name = "Admiral" prefix = "ADM." rank_pin = /obj/item/clothing/accessory/ranks/navy/o10 ranking = 22 /datum/paygrade/navy/o10c - paygrade = "NO10C" + paygrade = PAY_SHORT_NO10C name = "Chief of Naval Operations" prefix = "CNO." rank_pin = /obj/item/clothing/accessory/ranks/navy/o10c diff --git a/code/datums/paygrades/factions/uscm/provost.dm b/code/datums/paygrades/factions/uscm/provost.dm index b27c8f7f721f..e378bd7beb61 100644 --- a/code/datums/paygrades/factions/uscm/provost.dm +++ b/code/datums/paygrades/factions/uscm/provost.dm @@ -2,44 +2,23 @@ name = "Provost Paygrade" pay_multiplier = 2 -/datum/paygrade/provost/officer - paygrade = "PvE7" - name = "Chief Petty Officer" - prefix = "CPO." - rank_pin = /obj/item/clothing/accessory/ranks/navy/e7/pvst - -/datum/paygrade/provost/enforcer - paygrade = "PvE8" - name = "Senior Chief Petty Officer" - prefix = "SCPO." - rank_pin = /obj/item/clothing/accessory/ranks/navy/e8/pvst - -/datum/paygrade/provost/tml - paygrade = "PvE9" - name = "Master Chief Petty Officer" - prefix = "MCPO." - rank_pin = /obj/item/clothing/accessory/ranks/navy/e9/pvst - /datum/paygrade/provost/inspector - paygrade = "PvI" - name = "Inspector" + paygrade = PAY_SHORT_PVI + name = "Provost Inspector" prefix = "Insp." rank_pin = /obj/item/clothing/accessory/ranks/special/insp /datum/paygrade/provost/marshal - paygrade = "PvO8" - name = "Rear Admiral" - prefix = "RADM." - rank_pin = /obj/item/clothing/accessory/ranks/navy/o8/pvst + paygrade = PAY_SHORT_PVM + name = "Provost Marshal" + prefix = "Marshal" /datum/paygrade/provost/sectormarshal - paygrade = "PvO9" - name = "Vice Admiral" - prefix = "VADM." - rank_pin = /obj/item/clothing/accessory/ranks/navy/o9/pvst + paygrade = PAY_SHORT_PVSM + name = "Provost Sector Marshal" + prefix = "S. Marshal" /datum/paygrade/provost/chiefmarshal - paygrade = "PvCM" + paygrade = PAY_SHORT_PVCM name = "Provost Chief Marshal" - prefix = "PCM." - rank_pin = /obj/item/clothing/accessory/ranks/navy/o10c/pvst + prefix = "Chief Marshal" diff --git a/code/datums/paygrades/factions/wy/goons.dm b/code/datums/paygrades/factions/wy/goons.dm deleted file mode 100644 index 679bb42e7f76..000000000000 --- a/code/datums/paygrades/factions/wy/goons.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/paygrade/goon - name = "WY Goon Paygrade" - pay_multiplier = 0.66 // better than colonists. barely. - -//Standard PMCs -/datum/paygrade/goon/standard - paygrade = "WEY-GOON" - name = "Officer" - prefix = "Off." - -/datum/paygrade/goon/lead - paygrade = "WEY-GOON-L" - name = "Senior Officer" - prefix = "Sr. Off." - pay_multiplier = 0.8 diff --git a/code/datums/paygrades/factions/wy/wy.dm b/code/datums/paygrades/factions/wy/wy.dm index 03d54cbd3cda..58ec9eb3f197 100644 --- a/code/datums/paygrades/factions/wy/wy.dm +++ b/code/datums/paygrades/factions/wy/wy.dm @@ -3,69 +3,69 @@ pay_multiplier = 1 /datum/paygrade/wy_ranks/wyc1 - paygrade = "WYC1" + paygrade = PAY_SHORT_WYC1 name = "Trainee" prefix = "Trn." ranking = 0 /datum/paygrade/wy_ranks/wyc2 - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 name = "Junior Executive" prefix = "Jr. Exec." ranking = 1 pay_multiplier = 2 /datum/paygrade/wy_ranks/wyc3 - paygrade = "WYC3" + paygrade = PAY_SHORT_WYC3 name = "Executive" prefix = "Exec." ranking = 2 pay_multiplier = 3 /datum/paygrade/wy_ranks/wyc4 - paygrade = "WYC4" + paygrade = PAY_SHORT_WYC4 name = "Senior Executive" prefix = "Sr. Exec." ranking = 3 pay_multiplier = 4 /datum/paygrade/wy_ranks/wyc5 - paygrade = "WYC5" + paygrade = PAY_SHORT_WYC5 name = "Executive Specialist" prefix = "Exec. Spc." ranking = 4 pay_multiplier = 5 /datum/paygrade/wy_ranks/wyc6 - paygrade = "WYC6" + paygrade = PAY_SHORT_WYC6 name = "Executive Supervisor" prefix = "Exec. Suvp." ranking = 5 pay_multiplier = 6 /datum/paygrade/wy_ranks/wyc7 - paygrade = "WYC7" + paygrade = PAY_SHORT_WYC7 name = "Assistant Manager" prefix = "Assis. Mng." ranking = 6 pay_multiplier = 7 /datum/paygrade/wy_ranks/wyc8 - paygrade = "WYC8" + paygrade = PAY_SHORT_WYC8 name = "Division Manager" prefix = "Div. Mng." ranking = 7 pay_multiplier = 8 /datum/paygrade/wy_ranks/wyc9 - paygrade = "WYC9" + paygrade = PAY_SHORT_WYC9 name = "Chief Executive" prefix = "Chief. Exec." ranking = 8 pay_multiplier = 9 /datum/paygrade/wy_ranks/wyc10 - paygrade = "WYC10" + paygrade = PAY_SHORT_WYC10 name = "Director" prefix = "Director" ranking = 9 diff --git a/code/datums/paygrades/paygrade.dm b/code/datums/paygrades/paygrade.dm index bb0a3aa84bfa..cc336319278a 100644 --- a/code/datums/paygrades/paygrade.dm +++ b/code/datums/paygrades/paygrade.dm @@ -26,36 +26,36 @@ GLOBAL_LIST_INIT_TYPED(paygrades, /datum/paygrade, setup_paygrades()) GLOBAL_LIST_INIT(highcom_paygrades, list( "PvI", - "NO7", - "MO7", - "NO8", - "MO8", - "NO9", - "MO9", - "NO10", - "MO10", - "NO10C", - "MO10C", + PAY_SHORT_NO7, + PAY_SHORT_MO7, + PAY_SHORT_NO8, + PAY_SHORT_MO8, + PAY_SHORT_NO9, + PAY_SHORT_MO9, + PAY_SHORT_NO10, + PAY_SHORT_MO10, + PAY_SHORT_NO10C, + PAY_SHORT_MO10C, "PvO8", "PvO9", "PvCM" )) GLOBAL_LIST_INIT(co_paygrades, list( - "NO6", - "NO6E", - "NO6C", - "NO5", - "NO4", - "MO6", - "MO6E", - "MO6C", - "MO5", - "MO4" + PAY_SHORT_NO6, + PAY_SHORT_NO6E, + PAY_SHORT_NO6C, + PAY_SHORT_NO5, + PAY_SHORT_NO4, + PAY_SHORT_MO6, + PAY_SHORT_MO6E, + PAY_SHORT_MO6C, + PAY_SHORT_MO5, + PAY_SHORT_MO4 )) GLOBAL_LIST_INIT(wy_paygrades, list( - "WYC8", - "WYC9", - "WYC10" + PAY_SHORT_WYC8, + PAY_SHORT_WYC9, + PAY_SHORT_WYC10 )) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index f6af3c0ca237..ac5136b07a4a 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -80,7 +80,7 @@ /// actual job var/rank = null /// Marine's paygrade - var/paygrade = "ME1" + var/paygrade = PAY_SHORT_CIV /// For medics and engineers to 'claim' a locker var/claimedgear = 1 diff --git a/code/modules/clothing/under/rank_pins.dm b/code/modules/clothing/under/rank_pins.dm index bcadaec52090..894ff6d879b7 100644 --- a/code/modules/clothing/under/rank_pins.dm +++ b/code/modules/clothing/under/rank_pins.dm @@ -5,7 +5,7 @@ desc = "A set of rank pins, used to denote the paygrade of someone within the military." icon_state = "ranks_enlisted" var/rank = "Private" - var/rank_short = "ME1" + var/rank_short = PAY_SHORT_ME1 slot = ACCESSORY_SLOT_RANK high_visibility = TRUE gender = PLURAL @@ -23,116 +23,116 @@ /obj/item/clothing/accessory/ranks/marine/e1 /obj/item/clothing/accessory/ranks/marine/e2 - rank_short = "ME2" + rank_short = PAY_SHORT_ME2 /obj/item/clothing/accessory/ranks/marine/e3 - rank_short = "ME3" + rank_short = PAY_SHORT_ME3 /obj/item/clothing/accessory/ranks/marine/e4 - rank_short = "ME4" + rank_short = PAY_SHORT_ME4 icon_state = "ranks_nco" /obj/item/clothing/accessory/ranks/marine/e5 - rank_short = "ME5" + rank_short = PAY_SHORT_ME5 icon_state = "ranks_nco" /obj/item/clothing/accessory/ranks/marine/e6 - rank_short = "ME6" + rank_short = PAY_SHORT_ME6 icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e7 - rank_short = "ME7" + rank_short = PAY_SHORT_ME7 icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e8 - rank_short = "ME8" + rank_short = PAY_SHORT_ME8 icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e8e - rank_short = "ME8E" + rank_short = PAY_SHORT_ME8E icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e9 - rank_short = "ME9" + rank_short = PAY_SHORT_ME9 icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e9e - rank_short = "ME9E" + rank_short = PAY_SHORT_ME9E icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/marine/e9c - rank_short = "ME9C" + rank_short = PAY_SHORT_ME9C icon_state = "ranks_snco" //OFFICERS /obj/item/clothing/accessory/ranks/marine/o1 name = "rank boards" - rank_short = "MO1" + rank_short = PAY_SHORT_MO1 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/marine/o2 name = "rank boards" - rank_short = "MO2" + rank_short = PAY_SHORT_MO2 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/marine/o3 name = "rank boards" - rank_short = "MO3" + rank_short = PAY_SHORT_MO3 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/marine/o4 name = "rank boards" - rank_short = "MO4" + rank_short = PAY_SHORT_MO4 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/marine/o5 name = "rank boards" - rank_short = "MO5" + rank_short = PAY_SHORT_MO5 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/marine/o6 name = "rank boards" - rank_short = "MO6" + rank_short = PAY_SHORT_MO6 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/marine/o6e name = "rank boards" - rank_short = "MO6E" + rank_short = PAY_SHORT_MO6E icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/marine/o6c name = "rank boards" - rank_short = "MO6C" + rank_short = PAY_SHORT_MO6C icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o7 name = "rank boards" - rank_short = "MO7" + rank_short = PAY_SHORT_MO7 icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o8 name = "rank boards" - rank_short = "MO8" + rank_short = PAY_SHORT_MO8 icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o9 name = "rank boards" - rank_short = "MO9" + rank_short = PAY_SHORT_MO9 icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o10 name = "rank boards" - rank_short = "MO10" + rank_short = PAY_SHORT_MO10 icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o10c name = "rank boards" - rank_short = "MO10C" + rank_short = PAY_SHORT_MO10C icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/marine/o10s name = "rank boards" - rank_short = "MO10S" + rank_short = PAY_SHORT_MO10S icon_state = "ranks_flagofficer" /*################################################ @@ -140,134 +140,112 @@ ################################################*/ //ENLISTED /obj/item/clothing/accessory/ranks/navy/e1 - rank_short = "NE1" + rank_short = PAY_SHORT_NE1 /obj/item/clothing/accessory/ranks/navy/e2 - rank_short = "NE2" + rank_short = PAY_SHORT_NE2 /obj/item/clothing/accessory/ranks/navy/e3 - rank_short = "NE3" + rank_short = PAY_SHORT_NE3 /obj/item/clothing/accessory/ranks/navy/e4 - rank_short = "NE4" + rank_short = PAY_SHORT_NE4 icon_state = "ranks_nco" /obj/item/clothing/accessory/ranks/navy/e5 - rank_short = "NE5" + rank_short = PAY_SHORT_NE5 icon_state = "ranks_nco" /obj/item/clothing/accessory/ranks/navy/e6 - rank_short = "NE6" + rank_short = PAY_SHORT_NE6 icon_state = "ranks_nco" /obj/item/clothing/accessory/ranks/navy/e7 - rank_short = "NE7" + rank_short = PAY_SHORT_NE7 icon_state = "ranks_snco" -/obj/item/clothing/accessory/ranks/navy/e7/pvst - icon_state = "ranks_pvst" - /obj/item/clothing/accessory/ranks/navy/e8 - rank_short = "NE8" + rank_short = PAY_SHORT_NE8 icon_state = "ranks_snco" -/obj/item/clothing/accessory/ranks/navy/e8/pvst - icon_state = "ranks_pvst" - /obj/item/clothing/accessory/ranks/navy/e8c - rank_short = "NE8C" + rank_short = PAY_SHORT_NE8C icon_state = "ranks_snco" /obj/item/clothing/accessory/ranks/navy/e9 - rank_short = "NE9" + rank_short = PAY_SHORT_NE9 icon_state = "ranks_snco" -/obj/item/clothing/accessory/ranks/navy/e9/pvst - icon_state = "ranks_pvst" - /obj/item/clothing/accessory/ranks/navy/e9c - rank_short = "NE9C" + rank_short = PAY_SHORT_NE9C icon_state = "ranks_snco" //OFFICERS /obj/item/clothing/accessory/ranks/navy/o1 name = "rank boards" - rank_short = "NO1" + rank_short = PAY_SHORT_NO1 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/navy/o2 name = "rank boards" - rank_short = "NO2" + rank_short = PAY_SHORT_NO2 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/navy/o3 name = "rank boards" - rank_short = "NO3" + rank_short = PAY_SHORT_NO3 icon_state = "ranks_officer" /obj/item/clothing/accessory/ranks/navy/o4 name = "rank boards" - rank_short = "NO4" + rank_short = PAY_SHORT_NO4 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/navy/o5 name = "rank boards" - rank_short = "NO5" + rank_short = PAY_SHORT_NO5 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/navy/o6 name = "rank boards" - rank_short = "NO6" + rank_short = PAY_SHORT_NO6 icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/navy/o6e name = "rank boards" - rank_short = "NO6E" + rank_short = PAY_SHORT_NO6E icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/navy/o6c name = "rank boards" - rank_short = "NO6C" + rank_short = PAY_SHORT_NO6C icon_state = "ranks_seniorofficer" /obj/item/clothing/accessory/ranks/navy/o7 name = "rank boards" - rank_short = "NO7" + rank_short = PAY_SHORT_NO7 icon_state = "ranks_flagofficer" /obj/item/clothing/accessory/ranks/navy/o8 name = "rank boards" - rank_short = "NO8" + rank_short = PAY_SHORT_NO8 icon_state = "ranks_flagofficer" -/obj/item/clothing/accessory/ranks/navy/o8/pvst - icon_state = "ranks_pvstofficer" - /obj/item/clothing/accessory/ranks/navy/o9 name = "rank boards" - rank_short = "NO9" + rank_short = PAY_SHORT_NO9 icon_state = "ranks_flagofficer" -/obj/item/clothing/accessory/ranks/navy/o9/pvst - icon_state = "ranks_pvstofficer" - /obj/item/clothing/accessory/ranks/navy/o10 name = "rank boards" - rank_short = "NO10" + rank_short = PAY_SHORT_NO10 icon_state = "ranks_flagofficer" -/obj/item/clothing/accessory/ranks/navy/o10/pvst - icon_state = "ranks_pvstofficer" - /obj/item/clothing/accessory/ranks/navy/o10c name = "rank boards" - rank_short = "NO10C" + rank_short = PAY_SHORT_NO10C icon_state = "ranks_flagofficer" -/obj/item/clothing/accessory/ranks/navy/o10c/pvst - rank_short = "PvCM" - icon_state = "ranks_pvstofficer" - /*################################################ ################# SPECIAL ################# ################################################*/ diff --git a/code/modules/gear_presets/agents.dm b/code/modules/gear_presets/agents.dm index b51e623a198c..c7449883b87f 100644 --- a/code/modules/gear_presets/agents.dm +++ b/code/modules/gear_presets/agents.dm @@ -69,7 +69,7 @@ ) assignment = JOB_UPP_REPRESENTATIVE rank = JOB_UPP_REPRESENTATIVE - paygrade = "CR" + paygrade = PAY_SHORT_CREP role_comm_title = "UPP Rep." skills = /datum/skills/civilian/survivor @@ -105,7 +105,7 @@ ) assignment = JOB_TWE_REPRESENTATIVE rank = JOB_TWE_REPRESENTATIVE - paygrade = "CR" + paygrade = PAY_SHORT_CREP role_comm_title = "TWE Rep." skills = /datum/skills/civilian/survivor diff --git a/code/modules/gear_presets/cbrn.dm b/code/modules/gear_presets/cbrn.dm index 00934bc94fc7..e59f276fe486 100644 --- a/code/modules/gear_presets/cbrn.dm +++ b/code/modules/gear_presets/cbrn.dm @@ -2,7 +2,7 @@ name = "Generic CBRN" //Parent type for easier gear assignment = JOB_SQUAD_MARINE rank = JOB_SQUAD_MARINE - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "CBRN" flags = EQUIPMENT_PRESET_EXTRA auto_squad_name = SQUAD_CBRN @@ -67,7 +67,7 @@ /datum/equipment_preset/uscm/cbrn/engineer name = "CBRN Combat Technician" - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI role_comm_title = "ComTech" @@ -111,7 +111,7 @@ /datum/equipment_preset/uscm/cbrn/medic name = "CBRN Hospital Corpsman" - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC role_comm_title = "HM" @@ -154,7 +154,7 @@ /datum/equipment_preset/uscm/cbrn/leader name = "CBRN Fireteam Leader" - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 assignment = JOB_SQUAD_TEAM_LEADER rank = JOB_SQUAD_TEAM_LEADER role_comm_title = "TL" @@ -189,7 +189,7 @@ /datum/equipment_preset/uscm/cbrn/specialist name = "CBRN Specialist" - paygrade = "O" + paygrade = PAY_SHORT_OPR assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST role_comm_title = "Spc" diff --git a/code/modules/gear_presets/clf.dm b/code/modules/gear_presets/clf.dm index 62cbeb9edd29..d89e349a62c1 100644 --- a/code/modules/gear_presets/clf.dm +++ b/code/modules/gear_presets/clf.dm @@ -3,6 +3,7 @@ languages = list(LANGUAGE_JAPANESE, LANGUAGE_ENGLISH) assignment = JOB_CLF rank = FACTION_CLF + paygrade = PAY_SHORT_REB faction = FACTION_CLF origin_override = ORIGIN_CIVILIAN idtype = /obj/item/card/id/data @@ -281,6 +282,7 @@ assignment = JOB_CLF_MEDIC rank = JOB_CLF_MEDIC role_comm_title = "MED" + paygrade = PAY_SHORT_CDOC skills = /datum/skills/clf/combat_medic /datum/equipment_preset/clf/medic/load_gear(mob/living/carbon/human/new_human) @@ -709,6 +711,7 @@ skills = /datum/skills/colonial_synthetic assignment = JOB_CLF_SYNTH rank = JOB_CLF_SYNTH + paygrade = PAY_SHORT_SYN role_comm_title = "Syn" /datum/equipment_preset/clf/synth/New() @@ -897,6 +900,7 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_CLF_COMMANDER rank = JOB_CLF_COMMANDER + paygrade = PAY_SHORT_REBC role_comm_title = "CMDR" skills = /datum/skills/clf/commander diff --git a/code/modules/gear_presets/cmb.dm b/code/modules/gear_presets/cmb.dm index 2dd2c531d787..aa2c7438ba75 100644 --- a/code/modules/gear_presets/cmb.dm +++ b/code/modules/gear_presets/cmb.dm @@ -58,7 +58,7 @@ /datum/equipment_preset/cmb/standard name = "CMB - Colonial Marshal Deputy" - paygrade = "GS-9" + paygrade = PAY_SHORT_CMBD role_comm_title = "CMB DEP" flags = EQUIPMENT_PRESET_EXTRA assignment = "CMB Deputy" @@ -141,7 +141,7 @@ /datum/equipment_preset/cmb/leader name = "CMB - The Colonial Marshal" - paygrade = "GS-13" + paygrade = PAY_SHORT_CMBM idtype = /obj/item/card/id/marshal role_comm_title = "CMB MAR" flags = EQUIPMENT_PRESET_EXTRA @@ -195,7 +195,7 @@ //*****************************************************************************************************/ /datum/equipment_preset/cmb/synth name = "CMB - Colonial Marshal Investigative Synthetic" - paygrade = "GS-C.9" + paygrade = PAY_SHORT_CMBS idtype = /obj/item/card/id/deputy role_comm_title = "CMB Syn" flags = EQUIPMENT_PRESET_EXTRA @@ -298,7 +298,7 @@ /datum/equipment_preset/cmb/liaison name = "CMB - ICC Liaison" - paygrade = "GS-6" + paygrade = PAY_SHORT_ICCL idtype = /obj/item/card/id/silver/cl role_comm_title = "ICC Rep." flags = EQUIPMENT_PRESET_EXTRA @@ -357,7 +357,7 @@ /datum/equipment_preset/cmb/observer name = "CMB - Interstellar Human Rights Observer" - paygrade = "GS-3" + paygrade = PAY_SHORT_IHRO idtype = /obj/item/card/id/lanyard role_comm_title = "OBS" flags = EQUIPMENT_PRESET_EXTRA @@ -416,7 +416,7 @@ assignment = "Anchorpoint Station Marine Rifleman" rank = JOB_SQUAD_MARINE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "A-RFN" skills = /datum/skills/pfc/crafty faction = FACTION_MARSHAL @@ -466,7 +466,7 @@ assignment = "Anchorpoint Station Marine Team Leader" rank = JOB_SQUAD_LEADER - paygrade = "ME6" + paygrade = PAY_SHORT_ME6 role_comm_title = "A-TL" minimum_age = 25 skills = /datum/skills/SL @@ -511,7 +511,7 @@ assignment = "Anchorpoint Station Marine Technical Specialist" rank = JOB_SQUAD_TEAM_LEADER - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "A-TS" skills = /datum/skills/tl @@ -556,7 +556,7 @@ assignment = "Anchorpoint Station Hospital Corpsman" rank = JOB_SQUAD_MEDIC - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "A-HM" skills = /datum/skills/combat_medic @@ -617,7 +617,7 @@ assignment = "Anchorpoint Station Marine Smartgunner" rank = JOB_SQUAD_SMARTGUN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "A-SG" skills = /datum/skills/smartgunner diff --git a/code/modules/gear_presets/corpses.dm b/code/modules/gear_presets/corpses.dm index de24f1f84ff3..ca2b2e2ab52d 100644 --- a/code/modules/gear_presets/corpses.dm +++ b/code/modules/gear_presets/corpses.dm @@ -338,7 +338,7 @@ name = "Corpse - Corporate Liaison" assignment = "Corporate Liaison" xenovictim = TRUE - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 access = list( ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_LOGISTICS, @@ -430,7 +430,7 @@ idtype = /obj/item/card/id/general assignment = "Bridge Officer" uses_special_name = TRUE - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 access = list( ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_LOGISTICS, @@ -637,7 +637,7 @@ /datum/equipment_preset/corpse/wy/manager name = "Corpse - Corporate Supervisor" flags = EQUIPMENT_PRESET_EXTRA - paygrade = "WYC7" + paygrade = PAY_SHORT_WYC6 assignment = "Colony Supervisor" role_comm_title = "Supervisor" rank = FACTION_WY @@ -800,7 +800,7 @@ languages = list(LANGUAGE_ENGLISH) assignment = JOB_WY_GOON rank = JOB_WY_GOON - paygrade = "WEY-GOON" + paygrade = PAY_SHORT_CPO skills = /datum/skills/MP /datum/equipment_preset/corpse/pmc/goon/load_gear(mob/living/carbon/human/new_human) @@ -822,7 +822,7 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_WY_GOON_LEAD rank = JOB_WY_GOON_LEAD - paygrade = "WEY-GOON-L" + paygrade = PAY_SHORT_CSPO /datum/equipment_preset/corpse/pmc/goon/lead/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress, WEAR_L_EAR) @@ -985,7 +985,7 @@ name = "Corpse - USCM Reconnaissance Spotter" assignment = "Reconnaissance Spotter" xenovictim = FALSE - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 idtype = /obj/item/card/id/dogtag role_comm_title = "FORECON" faction_group = list(FACTION_USCM, FACTION_SURVIVOR) diff --git a/code/modules/gear_presets/dust_raider.dm b/code/modules/gear_presets/dust_raider.dm index 1d979ed66a5f..27a3ce086c85 100644 --- a/code/modules/gear_presets/dust_raider.dm +++ b/code/modules/gear_presets/dust_raider.dm @@ -24,7 +24,7 @@ access = list(ACCESS_MARINE_PREP) assignment = JOB_SQUAD_MARINE rank = JOB_SQUAD_MARINE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "RFN" skills = /datum/skills/pfc/crafty @@ -46,7 +46,7 @@ access = list(ACCESS_MARINE_PREP) assignment = JOB_SQUAD_LEADER rank = JOB_SQUAD_LEADER - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "SL" skills = /datum/skills/SL @@ -75,7 +75,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) assignment = JOB_SQUAD_SMARTGUN rank = JOB_SQUAD_SMARTGUN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "SG" skills = /datum/skills/smartgunner @@ -100,7 +100,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "Eng" skills = /datum/skills/combat_engineer @@ -129,7 +129,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY) assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "HM" skills = /datum/skills/combat_medic @@ -164,7 +164,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SPECPREP) assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "Spc" skills = /datum/skills/specialist diff --git a/code/modules/gear_presets/dutch.dm b/code/modules/gear_presets/dutch.dm index 2844eef68a96..66a7254494b2 100644 --- a/code/modules/gear_presets/dutch.dm +++ b/code/modules/gear_presets/dutch.dm @@ -2,7 +2,7 @@ /datum/equipment_preset/dutch name = JOB_DUTCH_RIFLEMAN - paygrade = "DTC" + paygrade = PAY_SHORT_DTC assignment = JOB_DUTCH_RIFLEMAN flags = EQUIPMENT_PRESET_EXTRA faction = FACTION_DUTCH @@ -83,7 +83,7 @@ /datum/equipment_preset/dutch/minigun name = JOB_DUTCH_MINIGUNNER - paygrade = "DTCMG" + paygrade = PAY_SHORT_DTCMG assignment = JOB_DUTCH_MINIGUNNER flags = EQUIPMENT_PRESET_EXTRA @@ -116,7 +116,7 @@ /datum/equipment_preset/dutch/flamer name = JOB_DUTCH_FLAMETHROWER - paygrade = "DTCF" + paygrade = PAY_SHORT_DTCF assignment = JOB_DUTCH_FLAMETHROWER flags = EQUIPMENT_PRESET_EXTRA @@ -150,7 +150,7 @@ /datum/equipment_preset/dutch/medic name = JOB_DUTCH_MEDIC - paygrade = "DTCM" + paygrade = PAY_SHORT_DTCM assignment = JOB_DUTCH_MEDIC flags = EQUIPMENT_PRESET_EXTRA @@ -193,7 +193,7 @@ /datum/equipment_preset/dutch/arnie name = "Dutch's Dozen - Arnold" - paygrade = "ARN" + paygrade = PAY_SHORT_DTCA assignment = JOB_DUTCH_ARNOLD flags = EQUIPMENT_PRESET_EXTRA diff --git a/code/modules/gear_presets/fun.dm b/code/modules/gear_presets/fun.dm index 8bbe686b5cea..68253afbf90a 100644 --- a/code/modules/gear_presets/fun.dm +++ b/code/modules/gear_presets/fun.dm @@ -240,7 +240,7 @@ /datum/equipment_preset/fun/santa name = "Fun - Santa" - paygrade = "C" + paygrade = PAY_SHORT_CIV flags = EQUIPMENT_PRESET_EXTRA skills = /datum/skills/everything faction = FACTION_MARINE @@ -338,7 +338,7 @@ /datum/equipment_preset/fun/van_bandolier name = "Fun - Big Game Hunter" - paygrade = "CCMO" + paygrade = PAY_SHORT_CCMO uses_special_name = TRUE flags = EQUIPMENT_PRESET_EXTRA skills = /datum/skills/everything @@ -440,7 +440,7 @@ assignment = "Monkey Marine" rank = "Monkey Marine" - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 /datum/equipment_preset/fun/monkey/marine/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine(new_human), WEAR_BODY) @@ -457,7 +457,7 @@ assignment = "Monkey Soldier" rank = "Monkey Soldier" - paygrade = "UE1" + paygrade = PAY_SHORT_UE1 /datum/equipment_preset/fun/monkey/soldier/get_random_name(mob/living/carbon/human/new_human) return new_human.gender == MALE ? pick(GLOB.first_names_male_upp) : pick(GLOB.first_names_female_upp) diff --git a/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm b/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm index 825228f29735..34cbc8e0ab9c 100644 --- a/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm +++ b/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm @@ -1,7 +1,7 @@ ///*****************************LV-522 Force Recon Survivors*******************************************************/ //Nanu told me to put them here so they dont clutter up survivors.dm /datum/equipment_preset/survivor/forecon - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 idtype = /obj/item/card/id/dogtag role_comm_title = "FORECON" rank = JOB_SURVIVOR @@ -208,7 +208,7 @@ name = "Survivor - USCM Reconnaissance Squad Leader" assignment = JOB_FORECON_SL skills = /datum/skills/military/survivor/forecon_squad_leader - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 /datum/equipment_preset/survivor/forecon/squad_leader/load_gear(mob/living/carbon/human/new_human) var/obj/item/clothing/under/marine/reconnaissance/uniform = new() @@ -234,7 +234,7 @@ name = "Survivor - USCM Reconnaissance Major" assignment = JOB_FORECON_CO skills = /datum/skills/commander - paygrade = "MO4" + paygrade = PAY_SHORT_MO4 idtype = /obj/item/card/id/gold role_comm_title = "FORECON CO" diff --git a/code/modules/gear_presets/survivors/misc.dm b/code/modules/gear_presets/survivors/misc.dm index 3beba6a31b06..15eae8dfe5d4 100644 --- a/code/modules/gear_presets/survivors/misc.dm +++ b/code/modules/gear_presets/survivors/misc.dm @@ -178,7 +178,7 @@ everything bellow isn't used or out of place. name = "Survivor - Corporate Security Goon" flags = EQUIPMENT_PRESET_START_OF_ROUND assignment = JOB_WY_GOON - paygrade = "WEY-GOON" + paygrade = PAY_SHORT_CPO idtype = /obj/item/card/id/silver/cl skills = /datum/skills/civilian/survivor/goon languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE) @@ -257,7 +257,7 @@ everything bellow isn't used or out of place. name = "Survivor - USASF Commander" assignment = "USASF Commander" skills = /datum/skills/commander - paygrade = "NO5" + paygrade = PAY_SHORT_NO5 idtype = /obj/item/card/id/gold role_comm_title = "USASF CDR" flags = EQUIPMENT_PRESET_START_OF_ROUND diff --git a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm index 35a9b8e5eaba..cbc777ad6852 100644 --- a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm +++ b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm @@ -82,7 +82,7 @@ /datum/equipment_preset/survivor/wy/manager name = "Survivor - Corporate Supervisor" flags = EQUIPMENT_PRESET_EXTRA - paygrade = "WYC7" + paygrade = PAY_SHORT_WYC6 skills = /datum/skills/civilian/survivor/manager assignment = "Colony Supervisor" role_comm_title = "Supervisor" diff --git a/code/modules/gear_presets/survivors/survivors.dm b/code/modules/gear_presets/survivors/survivors.dm index 7a346fe1edd6..ae26fc40938b 100644 --- a/code/modules/gear_presets/survivors/survivors.dm +++ b/code/modules/gear_presets/survivors/survivors.dm @@ -5,7 +5,7 @@ skills = /datum/skills/civilian/survivor languages = list(LANGUAGE_ENGLISH) - paygrade = "C" + paygrade = PAY_SHORT_CIV idtype = /obj/item/card/id/lanyard faction = FACTION_SURVIVOR faction_group = list(FACTION_SURVIVOR) @@ -195,7 +195,7 @@ Standart Survivors : /datum/equipment_preset/survivor/scientist, /datum/equipment_preset/survivor/colonial_marshal name = "Survivor - Colonial Marshal Deputy" assignment = "CMB Deputy" - paygrade = "GS-9" + paygrade = PAY_SHORT_CMBD skills = /datum/skills/civilian/survivor/marshal flags = EQUIPMENT_PRESET_START_OF_ROUND idtype = /obj/item/card/id/deputy @@ -293,7 +293,7 @@ Everything bellow is a parent used as a base for one or multiple maps. assignment = "Corporate Liaison" skills = /datum/skills/civilian/survivor flags = EQUIPMENT_PRESET_START_OF_ROUND - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 idtype = /obj/item/card/id/silver/clearance_badge/cl access = list( ACCESS_CIVILIAN_PUBLIC, @@ -325,11 +325,11 @@ Everything bellow is a parent used as a base for one or multiple maps. var/playtime = get_job_playtime(new_human.client, JOB_CORPORATE_LIAISON) if(new_human.client.prefs.playtime_perks) if(playtime > JOB_PLAYTIME_TIER_4) - return "WYC5" + return PAY_SHORT_WYC5 else if(playtime > JOB_PLAYTIME_TIER_3) - return "WYC4" + return PAY_SHORT_WYC4 else if(playtime > JOB_PLAYTIME_TIER_2) - return "WYC3" + return PAY_SHORT_WYC3 else return paygrade return paygrade @@ -411,7 +411,7 @@ and is used as a base for all of the maps. assignment = "Interstellar Commerce Commission Corporate Liaison" skills = /datum/skills/civilian/survivor idtype = /obj/item/card/id/silver/cl - paygrade = "WYC2" + paygrade = PAY_SHORT_ICCL role_comm_title = "ICC Rep." flags = EQUIPMENT_PRESET_START_OF_ROUND diff --git a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm index c1ca81683c4b..324cfbe3bf7a 100644 --- a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm +++ b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm @@ -2,7 +2,7 @@ //crashlanding-upp-bar.dmm map. /datum/equipment_preset/survivor/upp name = "Survivor - UPP" - paygrade = "UE1" + paygrade = PAY_SHORT_UE1 origin_override = ORIGIN_UPP rank = JOB_SURVIVOR skills = /datum/skills/military/survivor/upp_private @@ -39,7 +39,7 @@ //crashlanding-upp-bar.dmm /datum/equipment_preset/survivor/upp/soldier name = "Survivor - UPP Soldier" - paygrade = "UE2" + paygrade = PAY_SHORT_UE2 assignment = JOB_UPP rank = JOB_UPP skills = /datum/skills/military/survivor/upp_private @@ -60,11 +60,18 @@ spawn_random_upp_belt(new_human) ..() + +/datum/equipment_preset/survivor/upp/soldier/load_rank(mob/living/carbon/human/new_human) + if(new_human.client) + if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) + return PAY_SHORT_UE1 + return paygrade + // /obj/effect/landmark/survivor_spawner/upp_sapper //crashlanding-upp-bar.dmm /datum/equipment_preset/survivor/upp/sapper name = "Survivor - UPP Sapper" - paygrade = "UE3" + paygrade = PAY_SHORT_UE3 assignment = JOB_UPP_ENGI rank = JOB_UPP_ENGI skills = /datum/skills/military/survivor/upp_sapper @@ -92,7 +99,7 @@ //crashlanding-upp-bar.dmm /datum/equipment_preset/survivor/upp/medic name = "Survivor - UPP Medic" - paygrade = "UE3" + paygrade = PAY_SHORT_UE3 assignment = JOB_UPP_MEDIC rank = JOB_UPP_MEDIC skills = /datum/skills/military/survivor/upp_medic @@ -124,7 +131,7 @@ name = "Survivor - UPP Specialist" assignment = JOB_UPP_SPECIALIST rank = JOB_UPP_SPECIALIST - paygrade = "UE4" + paygrade = PAY_SHORT_UE4 skills = /datum/skills/military/survivor/upp_spec /datum/equipment_preset/survivor/upp/specialist/load_gear(mob/living/carbon/human/new_human) @@ -143,7 +150,7 @@ // /obj/effect/landmark/survivor_spawner/squad_leader /datum/equipment_preset/survivor/upp/squad_leader name = "Survivor - UPP Squad Leader" - paygrade = "UE5" + paygrade = PAY_SHORT_UE5 assignment = JOB_UPP_LEADER rank = JOB_UPP_LEADER languages = list(LANGUAGE_RUSSIAN, LANGUAGE_ENGLISH, LANGUAGE_GERMAN, LANGUAGE_CHINESE) @@ -171,7 +178,7 @@ faction = FACTION_UPP faction_group = list(FACTION_UPP, FACTION_SURVIVOR) skills = /datum/skills/colonial_synthetic - paygrade = "SYN" + paygrade = PAY_SHORT_SYN idtype = /obj/item/card/id/dogtag role_comm_title = "173/RECON Syn" diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index 651a324003bc..3b2efd8c22be 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -3,7 +3,7 @@ uses_special_name = TRUE languages = ALL_SYNTH_LANGUAGES skills = /datum/skills/synthetic - paygrade = "SYN" + paygrade = PAY_SHORT_SYN minimap_icon = "synth" @@ -41,7 +41,7 @@ idtype = /obj/item/card/id/gold assignment = JOB_SYNTH rank = "Synthetic" - paygrade = "SYN" + paygrade = PAY_SHORT_SYN role_comm_title = "Syn" /datum/equipment_preset/synth/uscm/load_gear(mob/living/carbon/human/new_human) @@ -65,7 +65,7 @@ idtype = /obj/item/card/id/gold assignment = JOB_SYNTH rank = "Synthetic" - paygrade = "SYN" + paygrade = PAY_SHORT_SYN role_comm_title = "Syn" /datum/equipment_preset/synth/uscm/councillor/load_gear(mob/living/carbon/human/new_human) @@ -654,7 +654,7 @@ rank = JOB_COLONIST skills = /datum/skills/infiltrator_synthetic idtype = /obj/item/card/id/lanyard - paygrade = "C" + paygrade = PAY_SHORT_CIV /datum/equipment_preset/synth/infiltrator/New() . = ..() diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm index 5a2c09b63b85..dc79f87c5135 100644 --- a/code/modules/gear_presets/upp.dm +++ b/code/modules/gear_presets/upp.dm @@ -64,7 +64,7 @@ assignment = JOB_UPP rank = JOB_UPP role_comm_title = "Sol" - paygrade = "UE2" + paygrade = PAY_SHORT_UE2 /datum/equipment_preset/upp/soldier/load_gear(mob/living/carbon/human/new_human) //TODO: add backpacks and satchels @@ -86,6 +86,12 @@ load_upp_soldier(new_human, UPP) +/datum/equipment_preset/upp/soldier/load_rank(mob/living/carbon/human/new_human) + if(new_human.client) + if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) + return PAY_SHORT_UE1 + return paygrade + /datum/equipment_preset/upp/soldier/proc/load_upp_soldier(mob/living/carbon/human/new_human, obj/item/clothing/under/marine/veteran/UPP/UPP) var/percentage = rand(1, 100) switch(percentage) @@ -230,7 +236,7 @@ assignment = JOB_UPP_MEDIC rank = JOB_UPP_MEDIC role_comm_title = "Med" - paygrade = "UE3" + paygrade = PAY_SHORT_UE3 /datum/equipment_preset/upp/medic/load_gear(mob/living/carbon/human/new_human) //back @@ -399,7 +405,7 @@ assignment = JOB_UPP_ENGI rank = JOB_UPP_ENGI role_comm_title = "Sap" - paygrade = "UE3" + paygrade = PAY_SHORT_UE3 /datum/equipment_preset/upp/sapper/load_gear(mob/living/carbon/human/new_human) //Sappers should have lots of gear and whatnot that helps them attack or siege marines @@ -533,7 +539,7 @@ assignment = JOB_UPP_SPECIALIST rank = JOB_UPP_SPECIALIST role_comm_title = "Spc" - paygrade = "UE5" + paygrade = PAY_SHORT_UE5 /datum/equipment_preset/upp/specialist/load_gear(mob/living/carbon/human/new_human) //back @@ -660,7 +666,7 @@ assignment = JOB_UPP_SPECIALIST rank = JOB_UPP_SPECIALIST role_comm_title = "Spc" - paygrade = "UE5" + paygrade = PAY_SHORT_UE5 /datum/equipment_preset/upp/machinegunner/load_gear(mob/living/carbon/human/new_human) //back @@ -785,7 +791,7 @@ assignment = JOB_UPP_LEADER rank = JOB_UPP_LEADER role_comm_title = "SL" - paygrade = "UE6" + paygrade = PAY_SHORT_UE6 /datum/equipment_preset/upp/leader/load_gear(mob/living/carbon/human/new_human) var/UPPleadsidearm = rand(1,4) @@ -953,7 +959,7 @@ assignment = JOB_UPP_POLICE rank = JOB_UPP_POLICE role_comm_title = "MP" - paygrade = "UE6" + paygrade = PAY_SHORT_UE6 /datum/equipment_preset/upp/military_police/load_gear(mob/living/carbon/human/new_human) //back @@ -1105,7 +1111,7 @@ assignment = JOB_UPP_LT_OFFICER rank = JOB_UPP_LT_OFFICER role_comm_title = "Lt." - paygrade = "UO1" + paygrade = PAY_SHORT_UO1 /datum/equipment_preset/upp/officer/load_gear(mob/living/carbon/human/new_human) //back @@ -1265,7 +1271,7 @@ assignment = JOB_UPP_SRLT_OFFICER rank = JOB_UPP_SRLT_OFFICER role_comm_title = "Sr-Lt." - paygrade = "UO2" + paygrade = PAY_SHORT_UO2 /datum/equipment_preset/upp/officer/senior/load_gear(mob/living/carbon/human/new_human) //back @@ -1425,7 +1431,7 @@ assignment = JOB_UPP_KPT_OFFICER rank = JOB_UPP_KPT_OFFICER role_comm_title = "May." - paygrade = "UO3" + paygrade = PAY_SHORT_UO3 skills = /datum/skills/upp/kapitan /datum/equipment_preset/upp/officer/kapitan/load_gear(mob/living/carbon/human/new_human) @@ -1586,7 +1592,7 @@ assignment = JOB_UPP_MAY_OFFICER rank = JOB_UPP_MAY_OFFICER role_comm_title = "May." - paygrade = "UO4" + paygrade = PAY_SHORT_UO4 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/major/load_gear(mob/living/carbon/human/new_human) @@ -1747,7 +1753,7 @@ assignment = JOB_UPP_LTKOL_OFFICER rank = JOB_UPP_LTKOL_OFFICER role_comm_title = "Lt. Kol." - paygrade = "UO5" + paygrade = PAY_SHORT_UO5 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/lt_kolonel/load_gear(mob/living/carbon/human/new_human) @@ -1908,7 +1914,7 @@ assignment = JOB_UPP_KOL_OFFICER rank = JOB_UPP_KOL_OFFICER role_comm_title = "Kol." - paygrade = "UO6" + paygrade = PAY_SHORT_UO6 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/kolonel/load_gear(mob/living/carbon/human/new_human) @@ -2069,7 +2075,7 @@ assignment = JOB_UPP_KOL_OFFICER rank = JOB_UPP_KOL_OFFICER role_comm_title = "May. Gen." - paygrade = "UO7" + paygrade = PAY_SHORT_UO7 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/may_gen/load_gear(mob/living/carbon/human/new_human) @@ -2230,7 +2236,7 @@ assignment = JOB_UPP_KOL_OFFICER rank = JOB_UPP_KOL_OFFICER role_comm_title = "Lt. Gen." - paygrade = "UO8" + paygrade = PAY_SHORT_UO8 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/ley_gen/load_gear(mob/living/carbon/human/new_human) @@ -2391,7 +2397,7 @@ assignment = JOB_UPP_KOL_OFFICER rank = JOB_UPP_KOL_OFFICER role_comm_title = "Gen." - paygrade = "UO9" + paygrade = PAY_SHORT_UO9 skills = /datum/skills/upp/commander /datum/equipment_preset/upp/officer/gen/load_gear(mob/living/carbon/human/new_human) @@ -2592,7 +2598,7 @@ skills = /datum/skills/synthetic assignment = JOB_UPP_COMBAT_SYNTH rank = JOB_UPP_COMBAT_SYNTH - paygrade = "SYN" + paygrade = PAY_SHORT_SYN idtype = /obj/item/card/id/gold /datum/equipment_preset/upp/synth/load_name(mob/living/carbon/human/new_human, randomise) @@ -2801,7 +2807,7 @@ assignment = JOB_UPP_CONSCRIPT rank = JOB_UPP_CONSCRIPT role_comm_title = "Cons" - paygrade = "UE1" + paygrade = PAY_SHORT_UE1 /datum/equipment_preset/upp/conscript/load_gear(mob/living/carbon/human/new_human) //TODO: add backpacks and satchels @@ -2909,7 +2915,7 @@ assignment = JOB_UPP_COMMANDO rank = JOB_UPP_COMMANDO role_comm_title = "JKdo" - paygrade = "UC1" + paygrade = PAY_SHORT_UC1 idtype = /obj/item/card/id/data languages = list(LANGUAGE_RUSSIAN, LANGUAGE_ENGLISH, LANGUAGE_TSL, LANGUAGE_SPANISH, LANGUAGE_CHINESE) @@ -3038,7 +3044,7 @@ assignment = JOB_UPP_COMMANDO_MEDIC rank = JOB_UPP_COMMANDO_MEDIC role_comm_title = "2ndKdo" - paygrade = "UC2" + paygrade = PAY_SHORT_UC2 /datum/equipment_preset/upp/commando/medic/load_gear(mob/living/carbon/human/new_human) //TODO: add backpacks and satchels @@ -3207,7 +3213,7 @@ assignment = JOB_UPP_COMMANDO_LEADER rank = JOB_UPP_COMMANDO_LEADER role_comm_title = "1stKdo" - paygrade = "UC3" + paygrade = PAY_SHORT_UC3 idtype = /obj/item/card/id/silver /datum/equipment_preset/upp/commando/leader/load_gear(mob/living/carbon/human/new_human) @@ -3459,7 +3465,7 @@ assignment = JOB_UPP_CREWMAN rank = JOB_UPP_CREWMAN - paygrade = "UE5" + paygrade = PAY_SHORT_UE5 role_comm_title = "TANK" minimum_age = 30 skills = /datum/skills/tank_crew @@ -3577,7 +3583,7 @@ assignment = JOB_UPP_LT_DOKTOR rank = JOB_UPP_LT_DOKTOR role_comm_title = "Lt. Med." - paygrade = "UO1" + paygrade = PAY_SHORT_UO1 /datum/equipment_preset/upp/doctor/load_gear(mob/living/carbon/human/new_human) //back diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index bb3cf26e2dee..8677b372159b 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -67,7 +67,7 @@ access = list(ACCESS_MARINE_PREP) assignment = JOB_SQUAD_MARINE rank = JOB_SQUAD_MARINE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "RFN" skills = /datum/skills/pfc @@ -83,7 +83,7 @@ /datum/equipment_preset/uscm/pfc/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME1" + return PAY_SHORT_ME1 return paygrade /datum/equipment_preset/uscm/pfc/cryo @@ -103,7 +103,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) assignment = JOB_SQUAD_SMARTGUN rank = JOB_SQUAD_SMARTGUN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "SG" skills = /datum/skills/smartgunner @@ -159,7 +159,7 @@ ) assignment = JOB_CREWMAN rank = JOB_CREWMAN - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "CRMN" minimum_age = 30 skills = /datum/skills/tank_crew @@ -220,7 +220,7 @@ ) assignment = JOB_INTEL rank = JOB_INTEL - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "IO" skills = /datum/skills/intel @@ -276,7 +276,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SPECPREP) assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "Spc" skills = /datum/skills/specialist @@ -333,7 +333,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY) assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "HM" skills = /datum/skills/combat_medic @@ -365,7 +365,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_TL_PREP) assignment = JOB_SQUAD_TEAM_LEADER rank = JOB_SQUAD_TEAM_LEADER - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "FTL" skills = /datum/skills/tl @@ -395,7 +395,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "ComTech" skills = /datum/skills/combat_engineer @@ -427,7 +427,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) assignment = JOB_SQUAD_LEADER rank = JOB_SQUAD_LEADER - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "SL" minimum_age = 27 skills = /datum/skills/SL @@ -460,7 +460,7 @@ access = list(ACCESS_MARINE_PREP) assignment = JOB_SQUAD_MARINE rank = JOB_SQUAD_MARINE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "RFN" skills = /datum/skills/pfc/crafty @@ -472,7 +472,7 @@ /datum/equipment_preset/uscm/private_equipped/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME1" + return PAY_SHORT_ME1 return paygrade /datum/equipment_preset/uscm/private_equipped/load_gear(mob/living/carbon/human/new_human) @@ -508,7 +508,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) assignment = JOB_SQUAD_LEADER rank = JOB_SQUAD_LEADER - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "SL" minimum_age = 27 skills = /datum/skills/SL @@ -550,7 +550,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) assignment = JOB_SQUAD_SMARTGUN rank = JOB_SQUAD_SMARTGUN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "SG" skills = /datum/skills/smartgunner @@ -587,7 +587,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "ComTech" skills = /datum/skills/combat_engineer @@ -633,7 +633,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY) assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "HM" skills = /datum/skills/combat_medic @@ -687,7 +687,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SPECPREP) assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "Spc" skills = /datum/skills/specialist @@ -757,7 +757,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_TL_PREP) assignment = JOB_SQUAD_TEAM_LEADER rank = JOB_SQUAD_TEAM_LEADER - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "TL" skills = /datum/skills/tl @@ -798,7 +798,7 @@ skills = /datum/skills/commando/deathsquad auto_squad_name = SQUAD_SOF ert_squad = TRUE - paygrade = "ME6" + paygrade = PAY_SHORT_ME6 minimap_icon = "private" @@ -851,7 +851,7 @@ /datum/equipment_preset/uscm/marsoc/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) > JOB_PLAYTIME_TIER_2) - return "ME7" + return PAY_SHORT_ME7 return paygrade //Covert Raiders @@ -871,7 +871,7 @@ assignment = JOB_MARINE_RAIDER_SL rank = JOB_MARINE_RAIDER_SL role_comm_title = "TL." - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 skills = /datum/skills/commando/deathsquad/leader minimap_icon = "leader" @@ -879,7 +879,7 @@ /datum/equipment_preset/uscm/marsoc/sl/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) > JOB_PLAYTIME_TIER_2) - return "MO2" + return PAY_SHORT_MO2 return paygrade //Codenamed Team Leader @@ -898,13 +898,13 @@ assignment = JOB_MARINE_RAIDER_CMD rank = JOB_MARINE_RAIDER_CMD role_comm_title = "CMD." - paygrade = "MO3" + paygrade = PAY_SHORT_MO3 skills = /datum/skills/commando/deathsquad/officer /datum/equipment_preset/uscm/marsoc/cmd/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) > JOB_PLAYTIME_TIER_3) - return "MO4" + return PAY_SHORT_MO4 return paygrade /datum/equipment_preset/uscm/marsoc/low_threat @@ -954,7 +954,7 @@ assignment = JOB_MARINE_RAIDER_SL rank = JOB_MARINE_RAIDER_SL role_comm_title = "TL." - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 skills = /datum/skills/commando/deathsquad/leader minimap_icon = "leader" @@ -962,5 +962,5 @@ /datum/equipment_preset/uscm/marsoc/sl/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) > JOB_PLAYTIME_TIER_2) - return "MO2" + return PAY_SHORT_MO2 return paygrade diff --git a/code/modules/gear_presets/uscm_dress.dm b/code/modules/gear_presets/uscm_dress.dm index 393cc5b41a66..080ed18d7c40 100644 --- a/code/modules/gear_presets/uscm_dress.dm +++ b/code/modules/gear_presets/uscm_dress.dm @@ -5,7 +5,7 @@ rank = JOB_MARINE access = list(ACCESS_MARINE_PREP) minimum_age = 18 - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "Mar" skills = /datum/skills/pfc @@ -25,13 +25,13 @@ /datum/equipment_preset/uscm_event/dress/lcpl name = "Dress Blues - (E-3) Lance Corporal" - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 //NCOs/SNCOs// /datum/equipment_preset/uscm_event/dress/nco name = "Dress Blues - (E-4) Corporal" - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 skills = /datum/skills/SL dress_under = list(/obj/item/clothing/under/marine/dress/blues/senior) @@ -44,11 +44,11 @@ /datum/equipment_preset/uscm_event/dress/nco/sgt name = "Dress Blues - (E-5) Sergeant" - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 /datum/equipment_preset/uscm_event/dress/nco/snco name = "Dress Blues - (E-6) Staff Sergeant" - paygrade = "ME6" + paygrade = PAY_SHORT_ME6 skills = /datum/skills/SEA access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP) @@ -58,29 +58,29 @@ /datum/equipment_preset/uscm_event/dress/nco/snco/gysgt name = "Dress Blues - (E-7) Gunnery Sergeant" - paygrade = "ME7" + paygrade = PAY_SHORT_ME7 /datum/equipment_preset/uscm_event/dress/nco/snco/msgt name = "Dress Blues - (E-8) Master Sergeant" - paygrade = "ME8" + paygrade = PAY_SHORT_ME8 /datum/equipment_preset/uscm_event/dress/nco/snco/firstsgt name = "Dress Blues - (E-8E) First Sergeant" - paygrade = "ME8E" + paygrade = PAY_SHORT_ME8E /datum/equipment_preset/uscm_event/dress/nco/snco/mgysgt name = "Dress Blues - (E-9) Master Gunnery Sergeant" - paygrade = "ME9" + paygrade = PAY_SHORT_ME9 /datum/equipment_preset/uscm_event/dress/nco/snco/sgtmaj name = "Dress Blues - (E-9E) Sergeant Major" - paygrade = "ME9E" + paygrade = PAY_SHORT_ME9E //FIELD OFFICERS// /datum/equipment_preset/uscm_event/dress/officer name = "Dress Blues - (O-1) 2nd Lieutenant" - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 idtype = /obj/item/card/id/silver skills = /datum/skills/SO access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_MEDBAY) @@ -100,11 +100,11 @@ /datum/equipment_preset/uscm_event/dress/officer/firstlt name = "Dress Blues - (O-2) 1st Lieutenant" - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 /datum/equipment_preset/uscm_event/dress/officer/capt name = "Dress Blues - (O-3) Captain" - paygrade = "MO3" + paygrade = PAY_SHORT_MO3 idtype = /obj/item/card/id/gold skills = /datum/skills/XO @@ -115,7 +115,7 @@ /datum/equipment_preset/uscm_event/dress/officer/co name = "Dress Blues - (O-4) Major" - paygrade = "MO4" + paygrade = PAY_SHORT_MO4 idtype = /obj/item/card/id/gold skills = /datum/skills/commander @@ -125,19 +125,19 @@ /datum/equipment_preset/uscm_event/dress/officer/co/ltcol name = "Dress Blues - (O-5) Lieutenant Colonel" - paygrade = "MO5" + paygrade = PAY_SHORT_MO5 idtype = /obj/item/card/id/gold/council /datum/equipment_preset/uscm_event/dress/officer/co/col name = "Dress Blues - (O-6) Colonel" - paygrade = "MO6" + paygrade = PAY_SHORT_MO6 idtype = /obj/item/card/id/general //GENERAL OFFICERS// /datum/equipment_preset/uscm_event/dress/officer/general name = "Dress Blues - (O-8) Major General" - paygrade = "MO8" + paygrade = PAY_SHORT_MO8 idtype = /obj/item/card/id/general skills = /datum/skills/general @@ -155,8 +155,8 @@ /datum/equipment_preset/uscm_event/dress/officer/general/ltgen name = "Dress Blues - (O-9) Lieutenant General" - paygrade = "MO9" + paygrade = PAY_SHORT_MO9 /datum/equipment_preset/uscm_event/dress/officer/general/gen name = "Dress Blues - (O-10) General" - paygrade = "MO10" + paygrade = PAY_SHORT_MO10 diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm index 12db6323ac40..ce36f1fd807f 100644 --- a/code/modules/gear_presets/uscm_event.dm +++ b/code/modules/gear_presets/uscm_event.dm @@ -16,7 +16,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_COLONEL rank = JOB_COLONEL - paygrade = "MO6" + paygrade = PAY_SHORT_MO6 role_comm_title = "COL" minimum_age = 40 skills = /datum/skills/general @@ -61,7 +61,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_GENERAL rank = JOB_GENERAL - paygrade = "MO7" + paygrade = PAY_SHORT_MO7 role_comm_title = "GEN" minimum_age = 50 skills = /datum/skills/general @@ -102,30 +102,30 @@ /datum/equipment_preset/uscm_event/general/o7 name = "USCM O-7 - Brigadier General (High Command)" - paygrade = "MO7" + paygrade = PAY_SHORT_MO7 /datum/equipment_preset/uscm_event/general/o8 name = "USCM O-8 - Major General (High Command)" - paygrade = "MO8" + paygrade = PAY_SHORT_MO8 /datum/equipment_preset/uscm_event/general/o9 name = "USCM O-9 - Lieutenant General (High Command)" - paygrade = "MO9" + paygrade = PAY_SHORT_MO9 /datum/equipment_preset/uscm_event/general/o10 name = "USCM O-10 - General (High Command)" - paygrade = "MO10" + paygrade = PAY_SHORT_MO10 /datum/equipment_preset/uscm_event/general/o10c name = "USCM O-10C - Assistant Commandant of the Marine Corps (High Command)" - paygrade = "MO10C" + paygrade = PAY_SHORT_MO10C assignment = JOB_ACMC rank = JOB_ACMC role_comm_title = "ACMC" /datum/equipment_preset/uscm_event/general/o10s name = "USCM O-10S - Commandant of the Marine Corps (High Command)" - paygrade = "MO10S" + paygrade = PAY_SHORT_MO10S assignment = JOB_CMC rank = JOB_CMC role_comm_title = "CMC" @@ -145,7 +145,7 @@ ) assignment = JOB_ORDNANCE_TECH rank = "UPP" - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "OT" skills = /datum/skills/spy @@ -192,11 +192,11 @@ access = get_access(ACCESS_LIST_MARINE_ALL) /datum/equipment_preset/uscm_event/provost/enforcer - name = "Provost Enforcer (ME5)" + name = "Provost Enforcer" assignment = JOB_PROVOST_ENFORCER rank = "Provost Enforcer" - paygrade = "ME5" + paygrade = PAY_SHORT_CPO role_comm_title = "PvE" flags = EQUIPMENT_PRESET_EXTRA @@ -233,12 +233,12 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/combat(new_human), WEAR_J_STORE) /datum/equipment_preset/uscm_event/provost/tml - name = "Provost Team Leader (ME6)" + name = "Provost Team Leader" skills = /datum/skills/CMP assignment = JOB_PROVOST_TML rank = "Provost Team Leader" - paygrade = "ME6" + paygrade = PAY_SHORT_CSPO role_comm_title = "PvTML" flags = EQUIPMENT_PRESET_EXTRA @@ -276,11 +276,11 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/combat(new_human), WEAR_J_STORE) /datum/equipment_preset/uscm_event/provost/inspector - name = "Provost Inspector (PvI)" + name = "Provost Inspector" assignment = JOB_PROVOST_INSPECTOR rank = "Provost Inspector" - paygrade = "PvI" + paygrade = PAY_SHORT_PVI role_comm_title = "PvI" flags = EQUIPMENT_PRESET_EXTRA @@ -312,11 +312,11 @@ new_human.equip_to_slot_or_del(new /obj/item/handcuffs(new_human), WEAR_IN_JACKET) /datum/equipment_preset/uscm_event/provost/inspector/advisor - name = "Provost Advisor (ME6)" + name = "Provost Advisor" assignment = JOB_PROVOST_ADVISOR rank = "Provost Advisor" - paygrade = "ME6" + paygrade = PAY_SHORT_CSPO role_comm_title = "PvA" flags = EQUIPMENT_PRESET_EXTRA @@ -327,8 +327,8 @@ assignment = JOB_PROVOST_MARSHAL rank = "Provost Marshal" - paygrade = "MO6" - role_comm_title = "PvM" + paygrade = PAY_SHORT_PVM + role_comm_title = PAY_SHORT_PVM flags = EQUIPMENT_PRESET_EXTRA /datum/equipment_preset/uscm_event/provost/marshal/load_gear(mob/living/carbon/human/new_human) @@ -358,8 +358,8 @@ assignment = JOB_PROVOST_SMARSHAL rank = "Provost Sector Marshal" - paygrade = "MO7" - role_comm_title = "PvSM" + paygrade = PAY_SHORT_PVSM + role_comm_title = PAY_SHORT_PVSM /datum/equipment_preset/uscm_event/provost/marshal/chief name = "Provost Chief Marshal (PvCM)" @@ -367,8 +367,8 @@ assignment = JOB_PROVOST_CMARSHAL rank = "Provost Chief Marshal" - paygrade = "PvCM" - role_comm_title = "PvCM" + paygrade = PAY_SHORT_PVCM + role_comm_title = PAY_SHORT_PVCM /*****************************************************************************************************/ @@ -389,7 +389,7 @@ assignment = JOB_TIS_IO rank = "UAAC-TIS Intelligence Officer" - paygrade = "NO2" + paygrade = PAY_SHORT_NO2 role_comm_title = "TIS-IO" flags = EQUIPMENT_PRESET_EXTRA @@ -416,7 +416,7 @@ assignment = JOB_TIS_SA rank = "UAAC-TIS Special Agent" - paygrade = "NO5" + paygrade = PAY_SHORT_NO5 role_comm_title = "TIS-SA" flags = EQUIPMENT_PRESET_EXTRA diff --git a/code/modules/gear_presets/uscm_medical.dm b/code/modules/gear_presets/uscm_medical.dm index 47d5ee19c9b4..be599755bacf 100644 --- a/code/modules/gear_presets/uscm_medical.dm +++ b/code/modules/gear_presets/uscm_medical.dm @@ -36,7 +36,7 @@ ) assignment = JOB_CMO rank = JOB_CMO - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 role_comm_title = "CMO" skills = /datum/skills/CMO @@ -80,7 +80,7 @@ assignment = JOB_DOCTOR rank = JOB_DOCTOR - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "Doc" skills = /datum/skills/doctor @@ -114,7 +114,7 @@ assignment = JOB_NURSE rank = JOB_NURSE - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "Nurse" skills = /datum/skills/nurse @@ -139,7 +139,7 @@ /datum/equipment_preset/uscm_ship/uscm_medical/nurse/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME3" + return PAY_SHORT_ME3 return paygrade //*****************************************************************************************************/ @@ -149,7 +149,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_RESEARCHER rank = JOB_RESEARCHER - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "Rsr" skills = /datum/skills/researcher diff --git a/code/modules/gear_presets/uscm_police.dm b/code/modules/gear_presets/uscm_police.dm index 0ead4f713c23..14e35d990348 100644 --- a/code/modules/gear_presets/uscm_police.dm +++ b/code/modules/gear_presets/uscm_police.dm @@ -27,7 +27,7 @@ ) assignment = JOB_POLICE rank = JOB_POLICE - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "MP" skills = /datum/skills/MP @@ -61,7 +61,7 @@ /datum/equipment_preset/uscm_ship/uscm_police/mp/load_rank(mob/living/carbon/human/human) if(human.client && get_job_playtime(human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME3" + return PAY_SHORT_ME3 return paygrade //*****************************************************************************************************/ @@ -90,7 +90,7 @@ ) assignment = JOB_WARDEN rank = JOB_WARDEN - paygrade = "ME6" + paygrade = PAY_SHORT_ME6 role_comm_title = "MW" skills = /datum/skills/MW @@ -151,7 +151,7 @@ ) assignment = JOB_CHIEF_POLICE rank = JOB_CHIEF_POLICE - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 role_comm_title = "CMP" skills = /datum/skills/CMP @@ -195,7 +195,7 @@ access = list() assignment = JOB_RIOT rank = JOB_RIOT - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "RMP" skills = /datum/skills/CMP @@ -243,6 +243,6 @@ assignment = JOB_RIOT_CHIEF rank = JOB_RIOT_CHIEF - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "CRMP" skills = /datum/skills/CMP diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index d34137a1c36b..b5ef13f35b2b 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -45,7 +45,7 @@ ) assignment = JOB_CORPORATE_LIAISON rank = JOB_CORPORATE_LIAISON - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 role_comm_title = "CL" skills = /datum/skills/civilian @@ -89,11 +89,11 @@ var/playtime = get_job_playtime(new_human.client, rank) if(new_human.client.prefs.playtime_perks) if(playtime > JOB_PLAYTIME_TIER_4) - return "WYC5" + return PAY_SHORT_WYC5 else if(playtime > JOB_PLAYTIME_TIER_3) - return "WYC4" + return PAY_SHORT_WYC4 else if(playtime > JOB_PLAYTIME_TIER_2) - return "WYC3" + return PAY_SHORT_WYC3 else return paygrade return paygrade @@ -119,7 +119,7 @@ ) assignment = JOB_COMBAT_REPORTER rank = JOB_COMBAT_REPORTER - paygrade = "C" + paygrade = PAY_SHORT_CIV role_comm_title = "PRESS" skills = /datum/skills/civilian idtype = /obj/item/card/id/silver/cl @@ -151,7 +151,7 @@ ) assignment = JOB_COMBAT_REPORTER rank = JOB_COMBAT_REPORTER - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "CC" skills = /datum/skills/pfc idtype = /obj/item/card/id/dogtag @@ -203,7 +203,7 @@ ) assignment = JOB_CHIEF_ENGINEER rank = JOB_CHIEF_ENGINEER - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "CE" minimum_age = 27 skills = /datum/skills/CE @@ -239,7 +239,7 @@ ) assignment = JOB_MAINT_TECH rank = JOB_MAINT_TECH - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "MT" skills = /datum/skills/MT @@ -267,7 +267,7 @@ /datum/equipment_preset/uscm_ship/maint/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME1" + return PAY_SHORT_ME1 return paygrade //*****************************************************************************************************/ @@ -285,7 +285,7 @@ ) assignment = JOB_ORDNANCE_TECH rank = JOB_ORDNANCE_TECH - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "OT" skills = /datum/skills/OT @@ -326,7 +326,7 @@ ) assignment = JOB_CHIEF_REQUISITION rank = JOB_CHIEF_REQUISITION - paygrade = "ME7" + paygrade = PAY_SHORT_ME7 role_comm_title = "QM" minimum_age = 27 skills = /datum/skills/RO @@ -359,7 +359,7 @@ access = list(ACCESS_MARINE_CARGO, ACCESS_MARINE_PREP) assignment = JOB_CARGO_TECH rank = JOB_CARGO_TECH - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "CT" skills = /datum/skills/CT @@ -384,7 +384,7 @@ /datum/equipment_preset/uscm_ship/cargo/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME1" + return PAY_SHORT_ME1 return paygrade //*****************************************************************************************************/ @@ -396,7 +396,7 @@ idtype = /obj/item/card/id/gold assignment = JOB_CO rank = JOB_CO - paygrade = "MO4" + paygrade = PAY_SHORT_MO4 role_comm_title = "CO" minimum_age = 30 skills = /datum/skills/commander @@ -469,7 +469,7 @@ idtype = /obj/item/card/id/gold/council rank = JOB_CO - paygrade = "MO5" + paygrade = PAY_SHORT_MO5 role_comm_title = "CO" minimum_age = 35 @@ -488,7 +488,7 @@ /datum/equipment_preset/uscm_ship/commander/council/plus name = "USCM Commanding Officer (CO++)" idtype = /obj/item/card/id/general - paygrade = "MO6" + paygrade = PAY_SHORT_MO6 /datum/equipment_preset/uscm_ship/commander/council/plus/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/beret/marine/commander/councilchief(new_human), WEAR_HEAD) @@ -503,7 +503,7 @@ idtype = /obj/item/card/id/silver assignment = JOB_XO rank = JOB_XO - paygrade = "MO3" + paygrade = PAY_SHORT_MO3 role_comm_title = "XO" minimum_age = 35 skills = /datum/skills/XO @@ -542,7 +542,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_MEDBAY) assignment = JOB_SO rank = JOB_SO - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "SO" minimum_age = 25 skills = /datum/skills/SO @@ -575,7 +575,7 @@ access assignment = JOB_SEA rank = JOB_SEA - paygrade = "ME7" + paygrade = PAY_SHORT_ME7 role_comm_title = "SEA" minimum_age = 40 skills = /datum/skills/SEA @@ -619,7 +619,7 @@ idtype = /obj/item/card/id/silver assignment = JOB_AUXILIARY_OFFICER rank = JOB_AUXILIARY_OFFICER - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 role_comm_title = "ASO" minimum_age = 27 skills = /datum/skills/auxiliary_officer @@ -678,7 +678,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_PILOT) assignment = JOB_PILOT rank = JOB_PILOT - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "DP" skills = /datum/skills/pilot @@ -728,7 +728,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_PILOT) assignment = JOB_DROPSHIP_CREW_CHIEF rank = JOB_DROPSHIP_CREW_CHIEF - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "DCC" skills = /datum/skills/crew_chief @@ -778,7 +778,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = "USCM Officer" rank = "USCM Officer" - paygrade = "MO3" + paygrade = PAY_SHORT_MO3 role_comm_title = "Cpt" minimum_age = 40 skills = /datum/skills/commander @@ -818,7 +818,7 @@ access = list(ACCESS_MARINE_KITCHEN) assignment = JOB_MESS_SERGEANT rank = JOB_MESS_SERGEANT - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "MST" skills = /datum/skills/mess_technician @@ -844,5 +844,5 @@ /datum/equipment_preset/uscm_ship/chef/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) - return "ME1" + return PAY_SHORT_ME1 return paygrade diff --git a/code/modules/gear_presets/whiteout.dm b/code/modules/gear_presets/whiteout.dm index 0f367b57e9e2..62b6d5db8008 100644 --- a/code/modules/gear_presets/whiteout.dm +++ b/code/modules/gear_presets/whiteout.dm @@ -9,7 +9,7 @@ languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE, LANGUAGE_CHINESE, LANGUAGE_RUSSIAN, LANGUAGE_GERMAN, LANGUAGE_SPANISH, LANGUAGE_YAUTJA, LANGUAGE_XENOMORPH, LANGUAGE_TSL) //Synths after all. skills = /datum/skills/everything //They are Synths, programmed for Everything. idtype = /obj/item/card/id/pmc/ds - paygrade = "O" + paygrade = PAY_SHORT_OPR /datum/equipment_preset/pmc/w_y_whiteout/New() . = ..() diff --git a/code/modules/gear_presets/wo.dm b/code/modules/gear_presets/wo.dm index acc795dc6882..884b865bce11 100644 --- a/code/modules/gear_presets/wo.dm +++ b/code/modules/gear_presets/wo.dm @@ -17,7 +17,7 @@ assignment = JOB_WO_CO rank = JOB_WO_CO - paygrade = "MO2" + paygrade = PAY_SHORT_MO2 role_comm_title = "CDR" skills = /datum/skills/commander idtype = /obj/item/card/id/gold @@ -96,7 +96,7 @@ assignment = JOB_WO_XO rank = JOB_WO_XO - paygrade = "MO1" + paygrade = PAY_SHORT_MO1 role_comm_title = "LCDR" skills = /datum/skills/XO idtype = /obj/item/card/id/silver @@ -140,7 +140,7 @@ access = list(ACCESS_MARINE_BRIG, ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_PREP, ACCESS_MARINE_CMP, ACCESS_MARINE_MEDBAY) assignment = JOB_WO_CHIEF_POLICE rank = JOB_WO_CHIEF_POLICE - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "HGSL" skills = /datum/skills/honor_guard/lead idtype = /obj/item/card/id/silver @@ -176,7 +176,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_BRIG, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE) assignment = JOB_WO_SO rank = JOB_WO_SO - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "VHG" skills = /datum/skills/honor_guard/vet idtype = /obj/item/card/id/silver @@ -218,7 +218,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE) assignment = JOB_WO_CREWMAN rank = JOB_WO_CREWMAN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "HGS" skills = /datum/skills/honor_guard/spec idtype = /obj/item/card/id/gold @@ -258,7 +258,7 @@ access = list(ACCESS_MARINE_BRIG, ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_PREP, ACCESS_MARINE_MEDBAY) assignment = JOB_WO_POLICE rank = JOB_WO_POLICE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "HG" skills = /datum/skills/honor_guard @@ -292,7 +292,7 @@ access = list(ACCESS_MARINE_COMMAND, ACCESS_MARINE_DROPSHIP, ACCESS_MARINE_PILOT) assignment = JOB_WO_PILOT rank = JOB_WO_PILOT - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "MC" skills = /datum/skills/mortar_crew @@ -327,7 +327,7 @@ access = list(ACCESS_MARINE_CARGO, ACCESS_MARINE_RO, ACCESS_MARINE_COMMAND) assignment = JOB_WO_CHIEF_REQUISITION rank = JOB_WO_CHIEF_REQUISITION - paygrade = "ME8" + paygrade = PAY_SHORT_ME8 role_comm_title = "QM" skills = /datum/skills/RO idtype = /obj/item/card/id/silver @@ -357,7 +357,7 @@ access = list(ACCESS_MARINE_ENGINEERING, ACCESS_CIVILIAN_ENGINEERING, ACCESS_MARINE_CARGO) assignment = JOB_WO_REQUISITION rank = JOB_WO_REQUISITION - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "BCL" skills = /datum/skills/CE idtype = /obj/item/card/id @@ -389,7 +389,7 @@ access = list(ACCESS_MARINE_CMO, ACCESS_MARINE_MEDBAY, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_COMMAND, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_WO_CMO rank = JOB_WO_CMO - paygrade = "CCMO" + paygrade = PAY_SHORT_CCMO role_comm_title = "HS" skills = /datum/skills/CMO idtype = /obj/item/card/id/silver @@ -432,7 +432,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_WO_DOCTOR rank = JOB_WO_DOCTOR - paygrade = "CD" + paygrade = PAY_SHORT_CDOC role_comm_title = "Doc" skills = /datum/skills/doctor idtype = /obj/item/card/id @@ -472,7 +472,7 @@ access = list(ACCESS_MARINE_MEDBAY, ACCESS_MARINE_RESEARCH, ACCESS_MARINE_CHEMISTRY, ACCESS_MARINE_MORGUE) assignment = JOB_WO_RESEARCHER rank = JOB_WO_RESEARCHER - paygrade = "CD" + paygrade = PAY_SHORT_CDOC role_comm_title = "Chem" skills = /datum/skills/researcher idtype = /obj/item/card/id @@ -512,7 +512,7 @@ access = list(ACCESS_MARINE_CE, ACCESS_MARINE_ENGINEERING, ACCESS_MARINE_COMMAND, ACCESS_CIVILIAN_ENGINEERING, ACCESS_MARINE_DATABASE) assignment = JOB_WO_CHIEF_ENGINEER rank = JOB_WO_CHIEF_ENGINEER - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "BCM" skills = /datum/skills/CE idtype = /obj/item/card/id/silver @@ -546,7 +546,7 @@ access = list(ACCESS_MARINE_CE, ACCESS_MARINE_ENGINEERING, ACCESS_MARINE_COMMAND, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_WO_ORDNANCE_TECH rank = JOB_WO_ORDNANCE_TECH - paygrade = "ME4" + paygrade = PAY_SHORT_ME4 role_comm_title = "BC" skills = /datum/skills/OT idtype = /obj/item/card/id @@ -579,7 +579,7 @@ assignment = JOB_WO_CORPORATE_LIAISON rank = JOB_WO_CORPORATE_LIAISON - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 role_comm_title = "PRESS" skills = /datum/skills/civilian idtype = /obj/item/card/id/silver/cl @@ -623,7 +623,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) assignment = JOB_SQUAD_LEADER rank = JOB_SQUAD_LEADER - paygrade = "ME5" + paygrade = PAY_SHORT_ME5 role_comm_title = "SL" skills = /datum/skills/SL @@ -658,7 +658,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SPECPREP) assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "Spc" skills = /datum/skills/specialist @@ -693,7 +693,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) assignment = JOB_SQUAD_SMARTGUN rank = JOB_SQUAD_SMARTGUN - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "SG" skills = /datum/skills/smartgunner @@ -717,7 +717,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "ComTech" skills = /datum/skills/combat_engineer @@ -751,7 +751,7 @@ access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY) assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC - paygrade = "ME3" + paygrade = PAY_SHORT_ME3 role_comm_title = "HM" skills = /datum/skills/combat_medic @@ -789,7 +789,7 @@ access = list(ACCESS_MARINE_PREP) assignment = JOB_SQUAD_MARINE rank = JOB_SQUAD_MARINE - paygrade = "ME2" + paygrade = PAY_SHORT_ME2 role_comm_title = "RFN" skills = /datum/skills/pfc diff --git a/code/modules/gear_presets/wy.dm b/code/modules/gear_presets/wy.dm index d5b5194401bd..0b63c76b59d0 100644 --- a/code/modules/gear_presets/wy.dm +++ b/code/modules/gear_presets/wy.dm @@ -1,6 +1,6 @@ /datum/equipment_preset/wy name = "WY" - paygrade = "WYC1" + paygrade = PAY_SHORT_WYC1 faction = FACTION_WY rank = FACTION_WY @@ -29,7 +29,7 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_TRAINEE rank = JOB_TRAINEE - paygrade = "WYC1" + paygrade = PAY_SHORT_WYC1 /datum/equipment_preset/wy/trainee/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/trainee(new_human), WEAR_BODY) @@ -40,35 +40,35 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_JUNIOR_EXECUTIVE rank = JOB_JUNIOR_EXECUTIVE - paygrade = "WYC2" + paygrade = PAY_SHORT_WYC2 /datum/equipment_preset/wy/exec name = "Corporate - C - Executive" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_EXECUTIVE rank = JOB_EXECUTIVE - paygrade = "WYC3" + paygrade = PAY_SHORT_WYC3 /datum/equipment_preset/wy/senior_exec name = "Corporate - D - Senior Executive" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_SENIOR_EXECUTIVE rank = JOB_SENIOR_EXECUTIVE - paygrade = "WYC4" + paygrade = PAY_SHORT_WYC4 /datum/equipment_preset/wy/exec_spec name = "Corporate - E - Executive Specialist" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_EXECUTIVE_SPECIALIST rank = JOB_EXECUTIVE_SPECIALIST - paygrade = "WYC5" + paygrade = PAY_SHORT_WYC5 /datum/equipment_preset/wy/exec_supervisor name = "Corporate - F - Executive Supervisor" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_EXECUTIVE_SUPERVISOR rank = JOB_EXECUTIVE_SUPERVISOR - paygrade = "WYC6" + paygrade = PAY_SHORT_WYC6 /datum/equipment_preset/wy/manager skills = /datum/skills/civilian/manager @@ -91,21 +91,21 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_ASSISTANT_MANAGER rank = JOB_ASSISTANT_MANAGER - paygrade = "WYC7" + paygrade = PAY_SHORT_WYC7 /datum/equipment_preset/wy/manager/division_manager name = "Corporate - H - Division Manager" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_DIVISION_MANAGER rank = JOB_DIVISION_MANAGER - paygrade = "WYC8" + paygrade = PAY_SHORT_WYC8 /datum/equipment_preset/wy/manager/chief_executive name = "Corporate - I - Chief Executive" flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_CHIEF_EXECUTIVE rank = JOB_CHIEF_EXECUTIVE - paygrade = "WYC9" + paygrade = PAY_SHORT_WYC9 /datum/equipment_preset/wy/manager/chief_executive/New() . = ..() @@ -116,7 +116,7 @@ flags = EQUIPMENT_PRESET_EXTRA assignment = JOB_DIRECTOR rank = JOB_DIRECTOR - paygrade = "WYC10" + paygrade = PAY_SHORT_WYC10 skills = /datum/skills/civilian/manager/director headset_type = /obj/item/device/radio/headset/distress/pmc/command/director diff --git a/code/modules/gear_presets/wy_goons.dm b/code/modules/gear_presets/wy_goons.dm index 1be8cb990255..a7c0dad679ee 100644 --- a/code/modules/gear_presets/wy_goons.dm +++ b/code/modules/gear_presets/wy_goons.dm @@ -61,7 +61,7 @@ assignment = JOB_WY_GOON rank = JOB_WY_GOON - paygrade = "WEY-GOON" + paygrade = PAY_SHORT_CPO skills = /datum/skills/MP /datum/equipment_preset/goon/standard/load_gear(mob/living/carbon/human/new_human) @@ -94,7 +94,7 @@ assignment = JOB_WY_GOON_LEAD rank = JOB_WY_GOON_LEAD - paygrade = "WEY-GOON-L" + paygrade = PAY_SHORT_CSPO skills = /datum/skills/MP /datum/equipment_preset/goon/lead/New() @@ -130,7 +130,7 @@ assignment = JOB_WY_GOON_RESEARCHER rank = JOB_WY_GOON_RESEARCHER - paygrade = "CCMO" + paygrade = PAY_SHORT_CCMO skills = /datum/skills/researcher /datum/equipment_preset/goon/researcher/load_gear(mob/living/carbon/human/new_human) diff --git a/colonialmarines.dme b/colonialmarines.dme index 16b54d55aa98..a2c032428adf 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -134,6 +134,14 @@ #include "code\__DEFINES\dcs\signals\atom\mob\living\signals_human.dm" #include "code\__DEFINES\dcs\signals\atom\mob\living\signals_living.dm" #include "code\__DEFINES\dcs\signals\atom\mob\living\signals_xeno.dm" +#include "code\__DEFINES\paygrade_defs\civilian.dm" +#include "code\__DEFINES\paygrade_defs\cmb.dm" +#include "code\__DEFINES\paygrade_defs\dutch.dm" +#include "code\__DEFINES\paygrade_defs\marines.dm" +#include "code\__DEFINES\paygrade_defs\navy.dm" +#include "code\__DEFINES\paygrade_defs\provost.dm" +#include "code\__DEFINES\paygrade_defs\upp.dm" +#include "code\__DEFINES\paygrade_defs\weyland.dm" #include "code\__DEFINES\typecheck\assemblers.dm" #include "code\__DEFINES\typecheck\datums.dm" #include "code\__DEFINES\typecheck\generic_types.dm" @@ -571,7 +579,7 @@ #include "code\datums\pain\pain_zombie.dm" #include "code\datums\paygrades\helper.dm" #include "code\datums\paygrades\paygrade.dm" -#include "code\datums\paygrades\factions\civillian\civilian.dm" +#include "code\datums\paygrades\factions\other\civilian.dm" #include "code\datums\paygrades\factions\other\cmb.dm" #include "code\datums\paygrades\factions\other\contractors.dm" #include "code\datums\paygrades\factions\other\dutch_dozen.dm" @@ -582,7 +590,6 @@ #include "code\datums\paygrades\factions\uscm\marine.dm" #include "code\datums\paygrades\factions\uscm\navy.dm" #include "code\datums\paygrades\factions\uscm\provost.dm" -#include "code\datums\paygrades\factions\wy\goons.dm" #include "code\datums\paygrades\factions\wy\pmc.dm" #include "code\datums\paygrades\factions\wy\wy.dm" #include "code\datums\redis\redis_message.dm" From 35be4155372caa5d56779e47558c1e9a413c54eb Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 6 Dec 2023 11:25:17 +0000 Subject: [PATCH 14/20] Automatic changelog for PR #5128 [ci skip] --- html/changelogs/AutoChangeLog-pr-5128.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5128.yml diff --git a/html/changelogs/AutoChangeLog-pr-5128.yml b/html/changelogs/AutoChangeLog-pr-5128.yml new file mode 100644 index 000000000000..572e5b13f457 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5128.yml @@ -0,0 +1,6 @@ +author: "realforest2001" +delete-after: True +changes: + - code_imp: "Paygrade shorthands now use defines." + - bugfix: "CLF and Survivors are no longer privates." + - bugfix: "Civillian Mr/Ms/Mx prefix now works correctly, and is the default for new ID cards." \ No newline at end of file From e448b009fc2e2abdffef790680bca086420002cf Mon Sep 17 00:00:00 2001 From: Vile Beggar Date: Wed, 6 Dec 2023 12:12:09 +0100 Subject: [PATCH 15/20] Adds a scaling direct hit sound to the XM88 (#5117) # About the pull request Adds a scaling impact sound for every direct hit you obtain with the XM88, depending on the current penetration value. # Explain why it's good for the game The bullseye mechanic makes this weapon very, very powerful. However, you don't really feel like you're doing any more damage with it. The XM88 doesn't really give the user any proper feedback if they're managing to nail several direct hits. A good sound effect can give them a dopamine rush, and in turn, make the weapon more fun to use. # Testing Photographs and Procedure
Screenshots & Videos https://github.com/cmss13-devs/cmss13/assets/17518895/555995ab-74ef-4174-ac71-0f5eecbead3f
# Changelog :cl: soundadd: The XM88 now has a scaling hit sound for every direct hit you manage to land with it. /:cl: --- code/modules/projectiles/guns/lever_action.dm | 10 ++++++++++ sound/weapons/gun_xm88_directhit_high.ogg | Bin 0 -> 29009 bytes sound/weapons/gun_xm88_directhit_low.ogg | Bin 0 -> 16389 bytes sound/weapons/gun_xm88_directhit_medium.ogg | Bin 0 -> 18225 bytes 4 files changed, 10 insertions(+) create mode 100644 sound/weapons/gun_xm88_directhit_high.ogg create mode 100644 sound/weapons/gun_xm88_directhit_low.ogg create mode 100644 sound/weapons/gun_xm88_directhit_medium.ogg diff --git a/code/modules/projectiles/guns/lever_action.dm b/code/modules/projectiles/guns/lever_action.dm index d93796fbb15f..849844f4f044 100644 --- a/code/modules/projectiles/guns/lever_action.dm +++ b/code/modules/projectiles/guns/lever_action.dm @@ -373,6 +373,7 @@ their unique feature is that a direct hit will buff your damage and firerate hit_buff_reset_cooldown = 2 SECONDS //how much time after a direct hit until streaks reset var/floating_penetration = FLOATING_PENETRATION_TIER_0 //holder var var/floating_penetration_upper_limit = FLOATING_PENETRATION_TIER_4 + var/direct_hit_sound = 'sound/weapons/gun_xm88_directhit_low.ogg' attachable_allowed = list( /obj/item/attachable/bayonet/upp, // Barrel /obj/item/attachable/bayonet, @@ -499,12 +500,16 @@ their unique feature is that a direct hit will buff your damage and firerate switch(floating_penetration) if(FLOATING_PENETRATION_TIER_1) P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88/pen20] + direct_hit_sound = "sound/weapons/gun_xm88_directhit_low.ogg" if(FLOATING_PENETRATION_TIER_2) P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88/pen30] + direct_hit_sound = "sound/weapons/gun_xm88_directhit_medium.ogg" if(FLOATING_PENETRATION_TIER_3) P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88/pen40] + direct_hit_sound = "sound/weapons/gun_xm88_directhit_medium.ogg" if(FLOATING_PENETRATION_TIER_4) P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88/pen50] + direct_hit_sound = "sound/weapons/gun_xm88_directhit_high.ogg" return ..() /obj/item/weapon/gun/lever_action/xm88/unload(mob/user) @@ -524,6 +529,7 @@ their unique feature is that a direct hit will buff your damage and firerate lever_message = initial(lever_message) wield_delay = initial(wield_delay) cur_onehand_chance = initial(cur_onehand_chance) + direct_hit_sound = "sound/weapons/gun_xm88_directhit_low.ogg" if(in_chamber) var/obj/projectile/P = in_chamber P.ammo = GLOB.ammo_list[/datum/ammo/bullet/lever_action/xm88] @@ -536,6 +542,10 @@ their unique feature is that a direct hit will buff your damage and firerate if(one_hand_lever) addtimer(VARSET_CALLBACK(src, cur_onehand_chance, reset_onehand_chance), 4 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE) +/obj/item/weapon/gun/lever_action/xm88/direct_hit_buff(mob/user, mob/target, one_hand_lever = FALSE) + . = ..() + playsound(target, direct_hit_sound, 75) + #undef FLOATING_PENETRATION_TIER_0 #undef FLOATING_PENETRATION_TIER_1 #undef FLOATING_PENETRATION_TIER_2 diff --git a/sound/weapons/gun_xm88_directhit_high.ogg b/sound/weapons/gun_xm88_directhit_high.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6db42f73cf0e2b2c60560fa963434cd143102e65 GIT binary patch literal 29009 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 literal 0 HcmV?d00001 diff --git a/sound/weapons/gun_xm88_directhit_low.ogg b/sound/weapons/gun_xm88_directhit_low.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c516f4fc26501cfb2f38036a4ff31abae1bb3c47 GIT binary patch literal 16389 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%0D02Cc@|!Qhmf!#`Ry5CAfHS~1N!O&Yij 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 Date: Wed, 6 Dec 2023 11:45:12 +0000 Subject: [PATCH 16/20] Automatic changelog for PR #5117 [ci skip] --- html/changelogs/AutoChangeLog-pr-5117.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5117.yml diff --git a/html/changelogs/AutoChangeLog-pr-5117.yml b/html/changelogs/AutoChangeLog-pr-5117.yml new file mode 100644 index 000000000000..7c87e5dfa082 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5117.yml @@ -0,0 +1,4 @@ +author: "VileBeggar" +delete-after: True +changes: + - soundadd: "The XM88 now has a scaling hit sound for every direct hit you manage to land with it." \ No newline at end of file From 01ec6e3f93fd2333d646a8928965ee31292b5c0b Mon Sep 17 00:00:00 2001 From: zzzmike <85382350+zzzmike@users.noreply.github.com> Date: Wed, 6 Dec 2023 03:35:23 -0800 Subject: [PATCH 17/20] Fixes disarm chance calculation (#5111) # About the pull request I was testing stuff out for a different PR and thought the disarm chance (for human vs human) seemed weird at times, so I forced it to output attacker_skill_level and defender_skill_level to chat every time a disarm was done. And then found out it's not calculating it properly. This seems to fix it in limited testing but might need more testing. I'm kinda surprised it wasn't noticed earlier cause there's two signs it's wrong in certain situations even with skill_level variables being invisible: the "tackled" message should only appear when the attacker's CQC level is two or higher (otherwise it should say pushed/shoved), and also, anyone that has a CQC advantage is still disarm-stunning everyone for the same amount of time as anyone else on average ('on average' because there was apparently some variance with a tick offset bug before the TG status effect testmerge) - the code implies it should be longer. # Explain why it's good for the game Bugs should be fixed. From a balance perspective I don't know if it 'should' be fixed from what it is currently in it's bugged state... but regardless, it's a bug. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: disarm chance wasn't calculating properly /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/modules/mob/living/carbon/human/human_attackhand.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 2bb113d67739..354d9c759f23 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -155,7 +155,7 @@ return held_weapon.afterattack(target,src) var/disarm_chance = rand(1, 100) - var/attacker_skill_level = skills && attacking_mob.skills ? skills.get_skill_level(SKILL_CQC) : SKILL_CQC_MAX // No skills, so assume max + var/attacker_skill_level = attacking_mob.skills ? attacking_mob.skills.get_skill_level(SKILL_CQC) : SKILL_CQC_MAX // No skills, so assume max var/defender_skill_level = skills ? skills.get_skill_level(SKILL_CQC) : SKILL_CQC_MAX // No skills, so assume max disarm_chance -= 5 * attacker_skill_level disarm_chance += 5 * defender_skill_level From 918988d74e1275e223463eb9e0fe8e4b369aa80f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 6 Dec 2023 12:03:10 +0000 Subject: [PATCH 18/20] Automatic changelog for PR #5111 [ci skip] --- html/changelogs/AutoChangeLog-pr-5111.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5111.yml diff --git a/html/changelogs/AutoChangeLog-pr-5111.yml b/html/changelogs/AutoChangeLog-pr-5111.yml new file mode 100644 index 000000000000..61bab6e59ca9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5111.yml @@ -0,0 +1,4 @@ +author: "zzzmike" +delete-after: True +changes: + - bugfix: "disarm chance wasn't calculating properly" \ No newline at end of file From 1c6b18497b4360bf281f4699f57c984a079d8c2b Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Wed, 6 Dec 2023 17:54:09 +0000 Subject: [PATCH 19/20] Ckey check verb (#5073) # About the pull request Stops requirement for proccall on handy feature for staff. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: admin: Added a Check Ckey verb to analyze for multikey. We're watching you Wazowski. Always watching. /:cl: --------- Co-authored-by: harryob Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/modules/admin/admin_verbs.dm | 1 + code/modules/admin/tabs/admin_tab.dm | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9833505ee346..07d7d4e89623 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -36,6 +36,7 @@ GLOBAL_LIST_INIT(admin_verbs_default, list( /client/proc/togglenichelogs, /datum/admins/proc/display_tags, /datum/admins/proc/player_notes_show, + /datum/admins/proc/check_ckey, /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ /datum/admins/proc/togglelooc, /*toggles ooc on/off for everyone*/ /datum/admins/proc/toggledsay, /*toggles dsay on/off for everyone*/ diff --git a/code/modules/admin/tabs/admin_tab.dm b/code/modules/admin/tabs/admin_tab.dm index cc927a62d3b0..8dce41ac8235 100644 --- a/code/modules/admin/tabs/admin_tab.dm +++ b/code/modules/admin/tabs/admin_tab.dm @@ -185,6 +185,29 @@ dat += "" show_browser(usr, dat, "Admin record for [key]", "adminplayerinfo", "size=480x480") +/datum/admins/proc/check_ckey(target_key as text) + set name = "Check CKey" + set category = "Admin" + + var/mob/user = usr + if (!istype(src, /datum/admins)) + src = user.client.admin_holder + if (!istype(src, /datum/admins) || !(rights & R_MOD)) + to_chat(user, "Error: you are not an admin!") + return + target_key = ckey(target_key) + if(!target_key) + to_chat(user, "Error: No key detected!") + return + to_chat(user, SPAN_WARNING("Checking Ckey: [target_key]")) + var/list/keys = analyze_ckey(target_key) + if(!keys) + to_chat(user, SPAN_WARNING("No results for [target_key].")) + return + to_chat(user, SPAN_WARNING("Check CKey Results: [keys.Join(", ")]")) + + log_admin("[key_name(user)] analyzed ckey '[target_key]'") + /datum/admins/proc/sleepall() set name = "Sleep All" set category = "Admin.InView" From 280f179faca3945f08fbce7d59c30b1e2970ed2b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 6 Dec 2023 18:02:19 +0000 Subject: [PATCH 20/20] Automatic changelog for PR #5073 [ci skip] --- html/changelogs/AutoChangeLog-pr-5073.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5073.yml diff --git a/html/changelogs/AutoChangeLog-pr-5073.yml b/html/changelogs/AutoChangeLog-pr-5073.yml new file mode 100644 index 000000000000..6eb992e2759c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5073.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - admin: "Added a Check Ckey verb to analyze for multikey. We're watching you Wazowski. Always watching." \ No newline at end of file