diff --git a/.github/workflows/auto_changelog.yml b/.github/workflows/auto_changelog.yml
index 3921e7c573bc..28886f287736 100644
--- a/.github/workflows/auto_changelog.yml
+++ b/.github/workflows/auto_changelog.yml
@@ -13,12 +13,22 @@ jobs:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
steps:
+ - name: Generate App Token
+ id: app-token-generation
+ uses: actions/create-github-app-token@v1
+ with:
+ app-id: ${{ secrets.APP_ID }}
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
- name: Checkout
uses: actions/checkout@v3
+ with:
+ token: ${{ steps.app-token-generation.outputs.token }}
+
- name: Run auto changelog
uses: actions/github-script@v6
with:
script: |
const { processAutoChangelog } = await import('${{ github.workspace }}/tools/pull_request_hooks/autoChangelog.js')
await processAutoChangelog({ github, context })
- github-token: ${{ secrets.BOT_TOKEN_CM || secrets.GITHUB_TOKEN }}
+ github-token: ${{ steps.app-token-generation.outputs.token }}
diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml
index 85947f08b18b..0c37f54a4d80 100644
--- a/.github/workflows/compile_changelogs.yml
+++ b/.github/workflows/compile_changelogs.yml
@@ -18,6 +18,14 @@ jobs:
unset SECRET_EXISTS
if [ -n "$ENABLER_SECRET" ]; then SECRET_EXISTS=true ; fi
echo "ACTIONS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT
+
+ - name: Generate App Token
+ id: app-token-generation
+ uses: actions/create-github-app-token@v1
+ with:
+ app-id: ${{ secrets.APP_ID }}
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
- name: "Setup python"
if: steps.value_holder.outputs.ACTIONS_ENABLED
uses: actions/setup-python@v3
@@ -35,6 +43,7 @@ jobs:
with:
fetch-depth: 25
persist-credentials: false
+ token: ${{ steps.app-token-generation.outputs.token }}
- name: "Compile"
if: steps.value_holder.outputs.ACTIONS_ENABLED
run: |
@@ -42,8 +51,8 @@ jobs:
- name: Commit
if: steps.value_holder.outputs.ACTIONS_ENABLED
run: |
- git config --local user.email "action@github.com"
- git config --local user.name "Changelogs"
+ git config --local user.email "${{ secrets.APP_PUBLIC_ID }}+${{ secrets.APP_PUBLIC_NAME }}[bot]@users.noreply.github.com"
+ git config --local user.name "${{ secrets.APP_PUBLIC_NAME }}[bot]"
git pull origin master
git add html/changelogs/archive
git commit -m "Automatic changelog compile [ci skip]" -a || true
@@ -51,4 +60,4 @@ jobs:
if: steps.value_holder.outputs.ACTIONS_ENABLED
uses: ad-m/github-push-action@master
with:
- github_token: ${{ secrets.BOT_TOKEN_CM || secrets.GITHUB_TOKEN }}
+ github_token: ${{ steps.app-token-generation.outputs.token }}
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index fb924fe250a0..2b63e921a799 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -14,6 +14,14 @@ jobs:
unset SECRET_EXISTS
if [ -n "$ENABLER_SECRET" ]; then SECRET_EXISTS=true ; fi
echo "ACTIONS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT
+
+ - name: Generate App Token
+ id: app-token-generation
+ uses: actions/create-github-app-token@v1
+ with:
+ app-id: ${{ secrets.APP_ID }}
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
- name: Get The Script
if: steps.value_holder.outputs.ACTIONS_ENABLED
run: |
@@ -35,5 +43,5 @@ jobs:
python add_labels.py
env:
REPO: ${{ github.repository }}
- TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ TOKEN: ${{ steps.app-token-generation.outputs.token }}
PR_NUMBER: ${{ github.event.number }}
diff --git a/.github/workflows/run_approval.yml b/.github/workflows/run_approval.yml
index 1d452c5f8aa7..f65e6e910e08 100644
--- a/.github/workflows/run_approval.yml
+++ b/.github/workflows/run_approval.yml
@@ -7,9 +7,16 @@ jobs:
name: Automatic Approve Workflows
runs-on: ubuntu-latest
steps:
+ - name: Generate App Token
+ id: app-token-generation
+ uses: actions/create-github-app-token@v1
+ with:
+ app-id: ${{ secrets.APP_ID }}
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
- name: Automatic Approve
uses: mheap/automatic-approve-action@v1
with:
- token: ${{ secrets.GITHUB_TOKEN }}
+ token: ${{ steps.app-token-generation.outputs.token }}
workflows: "ci_suite.yml"
dangerous_files: "build.bat"
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 13cb50704387..27179bd3a109 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -10,9 +10,17 @@ jobs:
runs-on: ubuntu-latest
steps:
+
+ - name: Generate App Token
+ id: app-token-generation
+ uses: actions/create-github-app-token@v1
+ with:
+ app-id: ${{ secrets.APP_ID }}
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
- uses: actions/stale@v4
with:
- repo-token: ${{ secrets.GITHUB_TOKEN }}
+ repo-token: ${{ steps.app-token-generation.outputs.token }}
stale-pr-message: "This PR has been inactive for long enough to be automatically marked as stale. This means it is at risk of being auto closed in ~ 7 days, please address any outstanding review items and ensure your PR is finished, if these are all true and you are auto-staled anyway, you need to actively ask maintainers if your PR will be merged. Once you have done any of the previous actions then you should request a maintainer remove the stale label on your PR, to reset the stale timer. If you feel no maintainer will respond in that time, you may wish to close this PR youself, while you seek maintainer comment, as you will then be able to reopen the PR yourself"
days-before-stale: 7
days-before-close: 7
diff --git a/.github/workflows/update_changelog.yml b/.github/workflows/update_changelog.yml
index 0b30a268d4aa..effd9ab70d7e 100644
--- a/.github/workflows/update_changelog.yml
+++ b/.github/workflows/update_changelog.yml
@@ -9,6 +9,14 @@ jobs:
concurrency: changelog
runs-on: ubuntu-latest
steps:
+
+ - name: Generate App Token
+ id: app-token-generation
+ uses: actions/create-github-app-token@v1
+ with:
+ app-id: ${{ secrets.APP_ID }}
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
- name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps"
id: value_holder
env:
@@ -31,6 +39,8 @@ jobs:
- name: Checkout
if: steps.value_holder.outputs.ACTIONS_ENABLED
uses: actions/checkout@v3
+ with:
+ token: ${{ steps.app-token-generation.outputs.token }}
- name: Fetch Changelog
if: steps.value_holder.outputs.ACTIONS_ENABLED
run: |
@@ -45,12 +55,12 @@ jobs:
if: steps.value_holder.outputs.ACTIONS_ENABLED
run: |
git pull origin master
- git config --local user.email "action@github.com"
- git config --local user.name "Changelogs"
+ git config --local user.email "${{ secrets.APP_PUBLIC_ID }}+${{ secrets.APP_PUBLIC_NAME }}[bot]@users.noreply.github.com"
+ git config --local user.name "${{ secrets.APP_PUBLIC_NAME }}[bot]"
git add html/changelogs/archive
git commit -m "Automatic changelog compile [ci skip]" -a || true
- name: "Push"
if: steps.value_holder.outputs.ACTIONS_ENABLED
uses: ad-m/github-push-action@master
with:
- github_token: ${{ secrets.GITHUB_TOKEN }}
+ github_token: ${{ steps.app-token-generation.outputs.token }}
diff --git a/.github/workflows/update_tgs_dmapi.yml b/.github/workflows/update_tgs_dmapi.yml
index b197e62f392f..404fd94e80b6 100644
--- a/.github/workflows/update_tgs_dmapi.yml
+++ b/.github/workflows/update_tgs_dmapi.yml
@@ -10,8 +10,18 @@ jobs:
runs-on: ubuntu-latest
name: Update the TGS DMAPI
steps:
+
+ - name: Generate App Token
+ id: app-token-generation
+ uses: actions/create-github-app-token@v1
+ with:
+ app-id: ${{ secrets.APP_ID }}
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
- name: Clone
uses: actions/checkout@v3
+ with:
+ token: ${{ steps.app-token-generation.outputs.token }}
- name: Branch
run: |
@@ -28,8 +38,8 @@ jobs:
- name: Commit and Push
continue-on-error: true
run: |
- git config user.name tgstation-server
- git config user.email tgstation-server@users.noreply.github.com
+ git config user.name "${{ secrets.APP_PUBLIC_NAME }}[bot]"
+ git config user.email "${{ secrets.APP_PUBLIC_ID }}+${{ secrets.APP_PUBLIC_NAME }}[bot]@users.noreply.github.com"
git add .
git commit -m 'Update TGS DMAPI'
git push -f -u origin tgs-dmapi-update
@@ -44,4 +54,4 @@ jobs:
pr_body: "This pull request updates the TGS DMAPI to the latest version. Please note any breaking or unimplemented changes before merging."
pr_label: "Tools"
pr_allow_empty: false
- github_token: ${{ secrets.BOT_TOKEN_CM }}
+ github_token: ${{ steps.app-token-generation.outputs.token }}
diff --git a/code/__DEFINES/client_prefs.dm b/code/__DEFINES/client_prefs.dm
index 1090b6776b35..20d5177dbaea 100644
--- a/code/__DEFINES/client_prefs.dm
+++ b/code/__DEFINES/client_prefs.dm
@@ -1,10 +1,21 @@
#define BE_ALIEN_AFTER_DEATH (1<<0)
#define BE_AGENT (1<<1)
+/// Determines how abilities are activated, whether they're activated via middle click, shift click or right click.
+#define XENO_ABILITY_CLICK_MIDDLE 1
+#define XENO_ABILITY_CLICK_SHIFT 2
+#define XENO_ABILITY_CLICK_RIGHT 3
+
+/// Update this to whatever the largest value of the XENO_ABILITY_CLICK_* defines is.
+#define XENO_ABILITY_CLICK_MAX 3
+
//toggle_prefs bits from /datum/preferences
#define TOGGLE_IGNORE_SELF (1<<0) // Determines whether you will not hurt yourself when clicking yourself
#define TOGGLE_HELP_INTENT_SAFETY (1<<1) // Determines whether help intent will be completely harmless
-#define TOGGLE_MIDDLE_MOUSE_CLICK (1<<2) // This toggles whether selected ability for xeno uses middle mouse clicking or shift clicking
+// Deprecated. Can't remove this or bitshift values down because it would fuck up the savefiles
+// Feel free to replace this whatever you want, if you can find a useful toggle for it. Alternatively, don't because savefiles using flags
+// Is a complete and utter mistake.
+#define TOGGLE_FREE_PLACE_YOUR_OWN_TOGGLE_HERE (1<<2)
#define TOGGLE_DIRECTIONAL_ATTACK (1<<3) // This toggles whether attacks for xeno use directional attacks
#define TOGGLE_AUTO_EJECT_MAGAZINE_OFF (1<<4) // This toggles whether guns with auto ejectors will not auto eject their magazines
// MUTUALLY EXCLUSIVE TO TOGGLE_AUTO_EJECT_MAGAZINE_TO_HAND
diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm
index d63c6da26ac6..22ff3f9ff9c9 100644
--- a/code/__DEFINES/surgery.dm
+++ b/code/__DEFINES/surgery.dm
@@ -95,6 +95,7 @@ See also /datum/surgery_step/cut_larval_pseudoroots, /datum/surgery_step/retract
/obj/item/tool/surgery/scalpel/pict_system = SURGERY_TOOL_MULT_SUBOPTIMAL,\
/obj/item/attachable/bayonet = SURGERY_TOOL_MULT_SUBSTITUTE,\
/obj/item/tool/kitchen/knife = SURGERY_TOOL_MULT_SUBSTITUTE,\
+ /obj/item/weapon/throwing_knife = SURGERY_TOOL_MULT_AWFUL,\
/obj/item/shard = SURGERY_TOOL_MULT_AWFUL\
)
diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm
index 4766b3dfe661..42f2d5fc31fe 100644
--- a/code/__DEFINES/tgs.dm
+++ b/code/__DEFINES/tgs.dm
@@ -1,7 +1,7 @@
// tgstation-server DMAPI
// The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in IETF RFC 2119.
-#define TGS_DMAPI_VERSION "7.2.1"
+#define TGS_DMAPI_VERSION "7.3.0"
// All functions and datums outside this document are subject to change with any version and should not be relied on.
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 5a307ac02ed5..069bf49f8d37 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -46,8 +46,8 @@
#define format_frequency(f) "[floor((f) / 10)].[(f) % 10]"
#define reverse_direction(direction) ( \
- ( dir & (NORTH|SOUTH) ? ~dir & (NORTH|SOUTH) : 0 ) | \
- ( dir & (EAST|WEST) ? ~dir & (EAST|WEST) : 0 ) \
+ ( direction & (NORTH|SOUTH) ? ~direction & (NORTH|SOUTH) : 0 ) | \
+ ( direction & (EAST|WEST) ? ~direction & (EAST|WEST) : 0 ) \
)
// The sane, counter-clockwise angle to turn to get from /direction/ A to /direction/ B
@@ -1436,7 +1436,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
if(isRemoteControlling(user))
return TRUE
// If the user is not a xeno (with active ability) with the shift click pref on, we examine. God forgive me for snowflake
- if(user.client?.prefs && !(user.client?.prefs?.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK))
+ if(user.get_ability_mouse_key() == XENO_ABILITY_CLICK_SHIFT)
if(isxeno(user))
var/mob/living/carbon/xenomorph/X = user
if(X.selected_ability)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index a8162911804b..b51a18149a75 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -37,7 +37,7 @@
/atom/movable/screen/close
name = "close"
- icon_state = "x"
+ icon_state = "close"
/atom/movable/screen/close/clicked(mob/user)
diff --git a/code/_onclick/human.dm b/code/_onclick/human.dm
index 4a353d5ed5c5..2a8cfb88bd99 100644
--- a/code/_onclick/human.dm
+++ b/code/_onclick/human.dm
@@ -12,22 +12,28 @@
/mob/living/carbon/human/click(atom/A, list/mods)
- if(mods["shift"] && !mods["middle"])
- if(selected_ability && client && client.prefs && !(client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK))
- selected_ability.use_ability(A)
- return TRUE
-
- if(mods["middle"] && !mods["shift"])
- if(selected_ability && client && client.prefs && client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK)
- selected_ability.use_ability(A)
- return TRUE
+ var/use_ability = FALSE
+ switch(get_ability_mouse_key())
+ if(XENO_ABILITY_CLICK_SHIFT)
+ if(mods[SHIFT_CLICK] && mods[LEFT_CLICK])
+ use_ability = TRUE
+ if(XENO_ABILITY_CLICK_MIDDLE)
+ if(mods[MIDDLE_CLICK] && !mods[SHIFT_CLICK])
+ use_ability = TRUE
+ if(XENO_ABILITY_CLICK_RIGHT)
+ if(mods[RIGHT_CLICK])
+ use_ability = TRUE
+
+ if(selected_ability && use_ability)
+ selected_ability.use_ability(A)
+ return TRUE
if(interactee)
var/result = interactee.handle_click(src, A, mods)
if(result != HANDLE_CLICK_PASS_THRU)
return result
- if (mods["middle"] && !mods["shift"] && ishuman(A) && get_dist(src, A) <= 1)
+ if (mods[MIDDLE_CLICK] && !mods[SHIFT_CLICK] && ishuman(A) && get_dist(src, A) <= 1)
var/mob/living/carbon/human/H = A
H.receive_from(src)
return TRUE
diff --git a/code/_onclick/xeno.dm b/code/_onclick/xeno.dm
index 15dc1c39f495..2894d9f370d4 100644
--- a/code/_onclick/xeno.dm
+++ b/code/_onclick/xeno.dm
@@ -114,9 +114,11 @@ so that it doesn't double up on the delays) so that it applies the delay immedia
handle_queued_action(target)
return TRUE
- var/alt_pressed = mods["alt"] == "1"
- var/shift_pressed = mods["shift"] == "1"
- var/middle_pressed = mods["middle"] == "1"
+ var/left_pressed = mods[LEFT_CLICK] == "1"
+ var/alt_pressed = mods[ALT_CLICK] == "1"
+ var/shift_pressed = mods[SHIFT_CLICK] == "1"
+ var/middle_pressed = mods[MIDDLE_CLICK] == "1"
+ var/right_pressed = mods[RIGHT_CLICK] == "1"
if(alt_pressed && shift_pressed)
if(istype(target, /mob/living/carbon/xenomorph))
@@ -126,15 +128,24 @@ so that it doesn't double up on the delays) so that it applies the delay immedia
next_move = world.time + 3 // Some minimal delay so this isn't crazy spammy
return TRUE
- var/middle_pref = client.prefs && (client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK) != 0 // client is already tested to be non-null by caller
- if(selected_ability && shift_pressed == !middle_pref && middle_pressed == middle_pref)
+ var/preference = get_ability_mouse_key() // client is already tested to be non-null by caller
+ var/activate_ability = FALSE
+ switch(preference)
+ if(XENO_ABILITY_CLICK_MIDDLE)
+ activate_ability = middle_pressed && !shift_pressed
+ if(XENO_ABILITY_CLICK_RIGHT)
+ activate_ability = right_pressed
+ if(XENO_ABILITY_CLICK_SHIFT)
+ activate_ability = left_pressed && shift_pressed
+
+ if(activate_ability && selected_ability)
if(istype(target, /atom/movable/screen))
// Click through the UI: Currently this won't attempt to sprite click any mob there, just the turf
var/turf/turf = params2turf(mods["screen-loc"], get_turf(client.eye), client)
if(turf)
target = turf
- if(selected_ability.use_ability_wrapper(target, mods))
- return TRUE
+ selected_ability.use_ability_wrapper(target, mods)
+ return TRUE
if(next_move >= world.time)
return FALSE
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index 627859369231..bad72cc8397c 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -523,6 +523,8 @@ This maintains a list of ip addresses that are able to bypass topic filtering.
/datum/config_entry/string/regular_adminhelp_webhook_url
+/datum/config_entry/string/profiler_webhook_url
+
/datum/config_entry/string/adminhelp_webhook_pfp
/datum/config_entry/string/adminhelp_webhook_name
diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm
index f9ba79046c2c..3a536c9bcbec 100644
--- a/code/controllers/subsystem/profiler.dm
+++ b/code/controllers/subsystem/profiler.dm
@@ -36,6 +36,8 @@ SUBSYSTEM_DEF(profiler)
if(CONFIG_GET(flag/auto_profile))
DumpFile(allow_yield = FALSE)
world.Profile(PROFILE_CLEAR, type = "sendmaps")
+ if(CONFIG_GET(string/profiler_webhook_url))
+ SendInfoToDiscord()
return ..()
/datum/controller/subsystem/profiler/proc/StartProfiling()
@@ -70,5 +72,22 @@ SUBSYSTEM_DEF(profiler)
WRITE_FILE(sendmaps_file, current_sendmaps_data)
write_cost = MC_AVERAGE(write_cost, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer))
+/proc/sort_overtime_data(list/A, list/B)
+ return B["over"] - A["over"]
+
+/datum/controller/subsystem/profiler/proc/SendInfoToDiscord()
+ var/current_profile_data = world.Profile(PROFILE_REFRESH, format = "json")
+ var/list/data = json_decode(current_profile_data)
+
+ sortTim(data, GLOBAL_PROC_REF(sort_overtime_data))
+
+ var/datum/discord_embed/embed = new()
+ embed.title = "Profile of Round #[GLOB.round_id] - Highest Overtiming Procs"
+ embed.fields = list()
+ for(var/i in 1 to 10)
+ var/list/entry = data[i]
+ embed.fields[entry["name"]] = "**Overtime:** [entry["over"]], **Self Cost:** [entry["self"]], **Total Cost:** [entry["total"]], **Calls:** [entry["calls"]]"
+ send2webhook(embed, CONFIG_GET(string/profiler_webhook_url))
+
#undef PROFILER_FILENAME
#undef SENDMAPS_FILENAME
diff --git a/code/datums/ammo/bullet/special_ammo.dm b/code/datums/ammo/bullet/special_ammo.dm
index cd30f8db1a78..b6d1ad4c93c3 100644
--- a/code/datums/ammo/bullet/special_ammo.dm
+++ b/code/datums/ammo/bullet/special_ammo.dm
@@ -9,10 +9,12 @@
icon_state = "redbullet"
flags_ammo_behavior = AMMO_BALLISTIC
+ damage_falloff = DAMAGE_FALLOFF_TIER_7
max_range = 12
accuracy = HIT_ACCURACY_TIER_4
damage = 30
penetration = 0
+ effective_range_max = 7
/datum/ammo/bullet/smartgun/armor_piercing
name = "armor-piercing smartgun bullet"
@@ -31,6 +33,7 @@
shrapnel_chance = SHRAPNEL_CHANCE_TIER_7
accurate_range = 32
accuracy = HIT_ACCURACY_TIER_3
+ damage_falloff = DAMAGE_FALLOFF_TIER_10
damage = 40
penetration = 0
diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm
index 01866b82a9d1..9df0ec3bb321 100644
--- a/code/datums/skills/uscm.dm
+++ b/code/datums/skills/uscm.dm
@@ -174,7 +174,7 @@ MILITARY NONCOMBATANT
skills = list(
SKILL_CQC = SKILL_CQC_SKILLED,
SKILL_POLICE = SKILL_POLICE_SKILLED,
- SKILL_FIREMAN = SKILL_FIREMAN_TRAINED,
+ SKILL_FIREMAN = SKILL_FIREMAN_SKILLED,
SKILL_LEADERSHIP = SKILL_LEAD_TRAINED,
SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED,
SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED,
diff --git a/code/game/jobs/job/command/cic/executive.dm b/code/game/jobs/job/command/cic/executive.dm
index f717a03e1229..f03c384bbb86 100644
--- a/code/game/jobs/job/command/cic/executive.dm
+++ b/code/game/jobs/job/command/cic/executive.dm
@@ -18,7 +18,8 @@
GLOB.marine_leaders -= JOB_XO
AddTimelock(/datum/job/command/executive, list(
- JOB_COMMAND_ROLES = 5 HOURS,
+ JOB_COMMAND_ROLES = 20 HOURS,
+ JOB_SQUAD_LEADER = 10 HOURS,
))
/obj/effect/landmark/start/executive
diff --git a/code/game/machinery/doors/poddoor/shutters/shutters.dm b/code/game/machinery/doors/poddoor/shutters/shutters.dm
index f91f1f48cade..a7f837d8ddfa 100644
--- a/code/game/machinery/doors/poddoor/shutters/shutters.dm
+++ b/code/game/machinery/doors/poddoor/shutters/shutters.dm
@@ -152,7 +152,7 @@
return
/obj/structure/machinery/door/poddoor/shutters/almayer/uniform_vendors/attackby(obj/item/attacking_item, mob/user)
- if(HAS_TRAIT(attacking_item, TRAIT_TOOL_CROWBAR))
+ if(HAS_TRAIT(attacking_item, TRAIT_TOOL_CROWBAR) || attacking_item.pry_capable)
return
..()
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
index 0d338502972d..430a673c5cb7 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
@@ -49,6 +49,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list(
list("ENGINEERING SUPPLIES", 0, null, null, null),
list("Plastic Explosive", 10, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR),
+ list("Signal Flare Pack", 5, /obj/item/storage/box/m94/signal, null, VENDOR_ITEM_REGULAR),
list("Breaching Charge", 10, /obj/item/explosive/plastic/breaching_charge, null, VENDOR_ITEM_REGULAR),
list("ES-11 Mobile Fuel Canister", 5, /obj/item/tool/weldpack/minitank, null, VENDOR_ITEM_REGULAR),
list("ME3 Hand Welder", 5, /obj/item/tool/weldingtool/simple, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/objects/effects/decals/floor_symbol.dm b/code/game/objects/effects/decals/floor_symbol.dm
new file mode 100644
index 000000000000..17d61d28a6a9
--- /dev/null
+++ b/code/game/objects/effects/decals/floor_symbol.dm
@@ -0,0 +1,53 @@
+/obj/effect/decal/floor_symbol
+ icon = 'icons/turf/upp_floor.dmi'
+ icon_state = "upp_c"
+ name = "\improper UPP Logo"
+ layer = WEED_LAYER
+
+/obj/effect/decal/floor_symbol/westface
+ icon_state = "upp_directional"
+
+/obj/effect/decal/floor_symbol/westface/southwest
+ dir = SOUTHWEST
+
+/obj/effect/decal/floor_symbol/westface/north
+ dir = NORTH
+
+/obj/effect/decal/floor_symbol/westface/east
+ dir = EAST
+
+/obj/effect/decal/floor_symbol/westface/west
+ dir = WEST
+
+/obj/effect/decal/floor_symbol/westface/northeast
+ dir = NORTHEAST
+
+/obj/effect/decal/floor_symbol/westface/southeast
+ dir = SOUTHEAST
+
+/obj/effect/decal/floor_symbol/westface/northwest
+ dir = NORTHWEST
+
+/obj/effect/decal/floor_symbol/northface/
+ icon_state = "upp_directional1"
+
+/obj/effect/decal/floor_symbol/northface/southwest
+ dir = SOUTHWEST
+
+/obj/effect/decal/floor_symbol/northface/north
+ dir = NORTH
+
+/obj/effect/decal/floor_symbol/northface/east
+ dir = EAST
+
+/obj/effect/decal/floor_symbol/northface/west
+ dir = WEST
+
+/obj/effect/decal/floor_symbol/northface/northeast
+ dir = NORTHEAST
+
+/obj/effect/decal/floor_symbol/northface/southeast
+ dir = SOUTHEAST
+
+/obj/effect/decal/floor_symbol/northface/northwest
+ dir = NORTHWEST
diff --git a/code/game/objects/effects/landmarks/survivor_spawner.dm b/code/game/objects/effects/landmarks/survivor_spawner.dm
index 4a6e5272ed05..ce83712aee7b 100644
--- a/code/game/objects/effects/landmarks/survivor_spawner.dm
+++ b/code/game/objects/effects/landmarks/survivor_spawner.dm
@@ -87,7 +87,7 @@
//Weyland-Yutani Survivors//
/obj/effect/landmark/survivor_spawner/lv624_corporate_dome_cl
- equipment = /datum/equipment_preset/survivor/wy/executive
+ equipment = /datum/equipment_preset/survivor/corporate/executive
synth_equipment = /datum/equipment_preset/synth/survivor/wy/security_synth
intro_text = list("
You are the last alive Executive of Lazarus Landing!
",\
"You are aware of the xenomorph threat.",\
@@ -146,7 +146,7 @@
spawn_priority = SPAWN_PRIORITY_VERY_HIGH
/obj/effect/landmark/survivor_spawner/bigred_crashed_cl
- equipment = /datum/equipment_preset/survivor/wy/manager
+ equipment = /datum/equipment_preset/survivor/corporate/manager
synth_equipment = /datum/equipment_preset/synth/survivor/pmc
intro_text = list("You are a survivor of a crash landing!
",\
"You are NOT aware of the xenomorph threat.",\
@@ -159,7 +159,7 @@
spawn_priority = SPAWN_PRIORITY_VERY_HIGH
/obj/effect/landmark/survivor_spawner/shivas_panic_room_cl
- equipment = /datum/equipment_preset/survivor/wy/asstmanager
+ equipment = /datum/equipment_preset/survivor/corporate/asstmanager
synth_equipment = /datum/equipment_preset/synth/survivor/wy/corporate_synth
intro_text = list("You are the last alive Senior Administrator on the Colony!
",\
"You are aware of the xenomorph threat.",\
@@ -169,7 +169,7 @@
spawn_priority = SPAWN_PRIORITY_VERY_HIGH
/obj/effect/landmark/survivor_spawner/shivas_panic_room_doc
- equipment = /datum/equipment_preset/survivor/doctor
+ equipment = /datum/equipment_preset/survivor/doctor/shiva
synth_equipment = /datum/equipment_preset/synth/survivor/emt_synth
intro_text = list("You are a Medical Doctor on the Colony!
",\
"You are aware of the xenomorph threat.",\
@@ -179,7 +179,7 @@
spawn_priority = SPAWN_PRIORITY_HIGH
/obj/effect/landmark/survivor_spawner/shivas_panic_room_sci
- equipment = /datum/equipment_preset/survivor/scientist
+ equipment = /datum/equipment_preset/survivor/scientist/shiva
synth_equipment = /datum/equipment_preset/synth/survivor/scientist_synth
intro_text = list("You are a Weyland-Yutani Scientist on the Colony!
",\
"You are aware of the xenomorph threat.",\
diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm
index 3248115adfa8..66cf13f2efce 100644
--- a/code/game/objects/items/devices/binoculars.dm
+++ b/code/game/objects/items/devices/binoculars.dm
@@ -408,18 +408,16 @@
return
var/mob/living/carbon/human/human = owner
if(human.selected_ability == src)
- to_chat(human, "You will no longer use [name] with \
- [human.client && human.client.prefs && human.client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ to_chat(human, "You will no longer use [name] with [human.get_ability_mouse_name()].")
button.icon_state = "template"
- human.selected_ability = null
+ human.set_selected_ability(null)
else
- to_chat(human, "You will now use [name] with \
- [human.client && human.client.prefs && human.client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ to_chat(human, "You will now use [name] with [human.get_ability_mouse_name()].")
if(human.selected_ability)
human.selected_ability.button.icon_state = "template"
- human.selected_ability = null
+ human.set_selected_ability(null)
button.icon_state = "template_on"
- human.selected_ability = src
+ human.set_selected_ability(src)
/datum/action/item_action/specialist/spotter_target/can_use_action()
var/mob/living/carbon/human/human = owner
diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm
index 0497a75e6fba..2debcf82d7d0 100644
--- a/code/game/objects/items/devices/defibrillator.dm
+++ b/code/game/objects/items/devices/defibrillator.dm
@@ -166,7 +166,7 @@
var/mob/dead/observer/G = H.get_ghost()
if(istype(G) && G.client)
- playsound_client(G.client, 'sound/effects/revive_notify.ogg')
+ playsound_client(G.client, 'sound/effects/adminhelp_new.ogg')
to_chat(G, SPAN_BOLDNOTICE(FONT_SIZE_LARGE("Someone is trying to revive your body. Return to it if you want to be resurrected! \
(Verbs -> Ghost -> Re-enter corpse, or click here!)")))
diff --git a/code/game/objects/items/hoverpack.dm b/code/game/objects/items/hoverpack.dm
index 65406eb15dc6..ce5db050c1f6 100644
--- a/code/game/objects/items/hoverpack.dm
+++ b/code/game/objects/items/hoverpack.dm
@@ -211,18 +211,16 @@
. = ..()
var/mob/living/carbon/human/H = owner
if(H.selected_ability == src)
- to_chat(H, "You will no longer use [name] with \
- [H.client && H.client.prefs && H.client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ to_chat(H, "You will no longer use [name] with [H.get_ability_mouse_name()].")
button.icon_state = "template"
- H.selected_ability = null
+ H.set_selected_ability(null)
else
- to_chat(H, "You will now use [name] with \
- [H.client && H.client.prefs && H.client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ to_chat(H, "You will now use [name] with [H.get_ability_mouse_name()].")
if(H.selected_ability)
H.selected_ability.button.icon_state = "template"
- H.selected_ability = null
+ H.set_selected_ability(null)
button.icon_state = "template_on"
- H.selected_ability = src
+ H.set_selected_ability(src)
/datum/action/item_action/hover/update_button_icon()
var/obj/item/hoverpack/HP = holder_item
@@ -246,7 +244,7 @@
/datum/action/item_action/hover/remove_from(mob/living/carbon/human/H)
..()
if(H.selected_ability == src)
- H.selected_ability = null
+ H.set_selected_ability(null)
update_button_icon()
button.icon_state = "template"
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 3856aebd7971..b00f72205d08 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -199,7 +199,7 @@ Also change the icon to reflect the amount of sheets, if possible.*/
if(R.one_per_turf != ONE_TYPE_PER_BORDER) //all barricade-esque structures utilize this define and have their own check for object density. checking twice is unneeded.
for(var/obj/object in usr.loc)
- if(object.density || istype(object, /obj/structure/machinery/door))
+ if(object.density || istype(object, /obj/structure/machinery/door/airlock))
to_chat(usr, SPAN_WARNING("[object] is blocking you from constructing \the [R.title]!"))
return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 2270685c0cf6..7fe5a1579b07 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -142,7 +142,8 @@ GLOBAL_LIST_INIT(admin_verbs_minor_event, list(
/client/proc/toggle_hardcore_perma,
/client/proc/toggle_bypass_joe_restriction,
/client/proc/toggle_joe_respawns,
- /datum/admins/proc/open_shuttlepanel
+ /datum/admins/proc/open_shuttlepanel,
+ /client/proc/get_whitelisted_clients,
))
GLOBAL_LIST_INIT(admin_verbs_major_event, list(
diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm
index fa0f43780031..332f7185fd57 100644
--- a/code/modules/admin/tabs/event_tab.dm
+++ b/code/modules/admin/tabs/event_tab.dm
@@ -42,6 +42,23 @@
CEI.handle_event_info_update(faction)
+/client/proc/get_whitelisted_clients()
+ set name = "Find Whitelisted Players"
+ set category = "Admin.Events"
+ if(!admin_holder)
+ return
+
+ var/flag = tgui_input_list(src, "Which flag?", "Whitelist Flags", GLOB.bitfields["whitelist_status"])
+
+ var/list/ckeys = list()
+ for(var/client/test_client in GLOB.clients)
+ if(test_client.check_whitelist_status(GLOB.bitfields["whitelist_status"][flag]))
+ ckeys += test_client.ckey
+ if(!length(ckeys))
+ to_chat(src, SPAN_NOTICE("There are no players with that whitelist online"))
+ return
+ to_chat(src, SPAN_NOTICE("Whitelist holders: [ckeys.Join(", ")]."))
+
/client/proc/change_security_level()
if(!check_rights(R_ADMIN))
return
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 3dfba42032b3..18a4958d2c93 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -319,7 +319,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
var/webhook = CONFIG_GET(string/urgent_adminhelp_webhook_url)
if(!urgent)
webhook = CONFIG_GET(string/regular_adminhelp_webhook_url)
+ send2webhook(message_or_embed, webhook)
+/proc/send2webhook(message_or_embed, webhook)
if(!webhook)
return
var/list/webhook_info = list()
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 52aa1be1408b..e3cb211311ba 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -44,7 +44,6 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list(
/client/proc/toggle_eject_to_hand,
/client/proc/toggle_automatic_punctuation,
/client/proc/toggle_ammo_display_type,
- /client/proc/toggle_middle_mouse_click,
/client/proc/toggle_ability_deactivation,
/client/proc/toggle_clickdrag_override,
/client/proc/toggle_dualwield,
@@ -912,3 +911,13 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list(
return TRUE
return FALSE
+
+/client/proc/set_right_click_menu_mode(shift_only)
+ if(shift_only)
+ winset(src, "mapwindow.map", "right-click=true")
+ winset(src, "ShiftUp", "is-disabled=false")
+ winset(src, "Shift", "is-disabled=false")
+ else
+ winset(src, "mapwindow.map", "right-click=false")
+ winset(src, "default.Shift", "is-disabled=true")
+ winset(src, "default.ShiftUp", "is-disabled=true")
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index dd0d406560ab..34135945d8fe 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -51,7 +51,8 @@ GLOBAL_LIST_INIT(bgstate_options, list(
var/lastchangelog = "" // Saved changlog filesize to detect if there was a change
var/ooccolor
var/be_special = 0 // Special role selection
- var/toggle_prefs = TOGGLE_MIDDLE_MOUSE_CLICK|TOGGLE_DIRECTIONAL_ATTACK|TOGGLE_MEMBER_PUBLIC|TOGGLE_AMBIENT_OCCLUSION|TOGGLE_VEND_ITEM_TO_HAND // flags in #define/mode.dm
+ var/toggle_prefs = TOGGLE_DIRECTIONAL_ATTACK|TOGGLE_MEMBER_PUBLIC|TOGGLE_AMBIENT_OCCLUSION|TOGGLE_VEND_ITEM_TO_HAND // flags in #define/mode.dm
+ var/xeno_ability_click_mode = XENO_ABILITY_CLICK_MIDDLE
var/auto_fit_viewport = FALSE
var/adaptive_zoom = 0
var/UI_style = "midnight"
@@ -604,6 +605,7 @@ GLOBAL_LIST_INIT(bgstate_options, list(
dat += "Play Lobby Music: [(toggles_sound & SOUND_LOBBY) ? "Yes" : "No"]
"
dat += "Play VOX Announcements: [(hear_vox) ? "Yes" : "No"]
"
dat += "Default Ghost Night Vision Level: [ghost_vision_pref]
"
+ dat += "Button To Activate Xenomorph Abilities: [xeno_ability_mouse_pref_to_string(xeno_ability_click_mode)]
"
dat += "Read Random Tip of the Round
"
if(CONFIG_GET(flag/allow_Metadata))
dat += "OOC Notes: Edit "
@@ -615,8 +617,6 @@ GLOBAL_LIST_INIT(bgstate_options, list(
[toggle_prefs & TOGGLE_IGNORE_SELF ? "Off" : "On"]
"
dat += "Toggle Help Intent Safety: \
[toggle_prefs & TOGGLE_HELP_INTENT_SAFETY ? "On" : "Off"]
"
- dat += "Toggle Middle Mouse Ability Activation: \
- [toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "On" : "Off"]
"
dat += "Toggle Ability Deactivation: \
[toggle_prefs & TOGGLE_ABILITY_DEACTIVATION_OFF ? "Off" : "On"]
"
dat += "Toggle Directional Assist: \
@@ -1249,7 +1249,31 @@ GLOBAL_LIST_INIT(bgstate_options, list(
if(!choice)
return
ghost_vision_pref = choice
-
+ if("mouse_button_activation")
+ var/static/list/mouse_button_list = list(
+ xeno_ability_mouse_pref_to_string(XENO_ABILITY_CLICK_MIDDLE) = XENO_ABILITY_CLICK_MIDDLE,
+ xeno_ability_mouse_pref_to_string(XENO_ABILITY_CLICK_SHIFT) = XENO_ABILITY_CLICK_SHIFT,
+ xeno_ability_mouse_pref_to_string(XENO_ABILITY_CLICK_RIGHT) = XENO_ABILITY_CLICK_RIGHT
+ )
+ var/choice = tgui_input_list(user, "Choose how you will activate your xenomorph and human abilities.", "Mouse Activation Button", mouse_button_list)
+ if(!choice)
+ return
+ xeno_ability_click_mode = mouse_button_list[choice]
+ // This isn't that great of a way to do it, but ability code is already not that modular considering
+ // the fact that we have two datums for xeno/human abilities. Might need to refactor abilities as a whole in the future
+ // so that the `activable` type is the parent of both xeno/human abilities - it would get rid of this headache in an instant.
+ if(isxeno(user))
+ var/mob/living/carbon/xenomorph/xeno = user
+ if(xeno.selected_ability)
+ var/datum/action/xeno_action/activable/ability = xeno.selected_ability
+ xeno.set_selected_ability(null)
+ xeno.set_selected_ability(ability)
+ if(ishuman(user))
+ var/mob/living/carbon/human/human = user
+ if(human.selected_ability)
+ var/datum/action/human_action/activable/ability = human.selected_ability
+ human.set_selected_ability(null)
+ human.set_selected_ability(ability)
if("synth_name")
var/raw_name = input(user, "Choose your Synthetic's name:", "Character Preference") as text|null
if(raw_name) // Check to ensure that the user entered text (rather than cancel.)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index f383aade5932..17fde8ebe8b4 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -1,5 +1,5 @@
#define SAVEFILE_VERSION_MIN 8
-#define SAVEFILE_VERSION_MAX 25
+#define SAVEFILE_VERSION_MAX 26
//handles converting savefiles to new formats
//MAKE SURE YOU KEEP THIS UP TO DATE!
@@ -152,6 +152,15 @@
S["nanotrasen_relation"] >> relation
S["weyland_yutani_relation"] << relation
+ if(savefile_version < 26)
+ // Removes TOGGLE_MIDDLE_MOUSE_CLICK (1<<2) and replaces it with a new pref
+ var/toggle_prefs = 0
+ S["toggle_prefs"] >> toggle_prefs
+ if(toggle_prefs & (1<<2))
+ S["xeno_ability_click_mode"] << XENO_ABILITY_CLICK_MIDDLE
+ else
+ S["xeno_ability_click_mode"] << XENO_ABILITY_CLICK_SHIFT
+
savefile_version = SAVEFILE_VERSION_MAX
return 1
@@ -197,6 +206,7 @@
S["toggles_langchat"] >> toggles_langchat
S["toggles_sound"] >> toggles_sound
S["toggle_prefs"] >> toggle_prefs
+ S["xeno_ability_click_mode"] >> xeno_ability_click_mode
S["dual_wield_pref"] >> dual_wield_pref
S["toggles_flashing"] >> toggles_flashing
S["toggles_ert"] >> toggles_ert
@@ -284,6 +294,7 @@
toggles_langchat = sanitize_integer(toggles_langchat, 0, SHORT_REAL_LIMIT, initial(toggles_langchat))
toggles_sound = sanitize_integer(toggles_sound, 0, SHORT_REAL_LIMIT, initial(toggles_sound))
toggle_prefs = sanitize_integer(toggle_prefs, 0, SHORT_REAL_LIMIT, initial(toggle_prefs))
+ xeno_ability_click_mode = sanitize_integer(xeno_ability_click_mode, 1, XENO_ABILITY_CLICK_MAX, initial(xeno_ability_click_mode))
dual_wield_pref = sanitize_integer(dual_wield_pref, 0, 2, initial(dual_wield_pref))
toggles_flashing= sanitize_integer(toggles_flashing, 0, SHORT_REAL_LIMIT, initial(toggles_flashing))
toggles_ert = sanitize_integer(toggles_ert, 0, SHORT_REAL_LIMIT, initial(toggles_ert))
@@ -399,6 +410,7 @@
S["toggles_langchat"] << toggles_langchat
S["toggles_sound"] << toggles_sound
S["toggle_prefs"] << toggle_prefs
+ S["xeno_ability_click_mode"] << xeno_ability_click_mode
S["dual_wield_pref"] << dual_wield_pref
S["toggles_flashing"] << toggles_flashing
S["toggles_ert"] << toggles_ert
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 97449e5952ae..54ed868b9557 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -275,7 +275,6 @@
"Toggle Semi-Auto Ammo Counter
",
"Toggle 'Unload Weapon' Ejecting Magazines to Your Hands
",
"Toggle Automatic Punctuation
",
- "Toggle Middle Mouse Ability Activation
",
"Toggle Ability Deactivation
",
"Toggle Combat Click-Drag Override
",
"Toggle Alternate-Fire Dual Wielding
",
@@ -358,14 +357,6 @@
to_chat(src, SPAN_BOLDNOTICE("Your messages will no longer be automatically punctuated if they are not punctuated already."))
prefs.save_preferences()
-/client/proc/toggle_middle_mouse_click() // Toggle whether abilities should use middle or shift clicking
- prefs.toggle_prefs ^= TOGGLE_MIDDLE_MOUSE_CLICK
- if (prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK)
- to_chat(src, SPAN_NOTICE("Your selected ability will now be activated with middle clicking."))
- else
- to_chat(src, SPAN_NOTICE("Your selected ability will now be activated with shift clicking."))
- prefs.save_preferences()
-
/client/proc/toggle_ability_deactivation() // Toggle whether the current ability can be deactivated when re-selected
prefs.toggle_prefs ^= TOGGLE_ABILITY_DEACTIVATION_OFF
if (prefs.toggle_prefs & TOGGLE_ABILITY_DEACTIVATION_OFF)
diff --git a/code/modules/clothing/glasses/night.dm b/code/modules/clothing/glasses/night.dm
index 984a906eabed..d822a1598320 100644
--- a/code/modules/clothing/glasses/night.dm
+++ b/code/modules/clothing/glasses/night.dm
@@ -94,7 +94,7 @@
icon_state = "m56_goggles"
deactive_state = "m56_goggles_0"
toggleable = TRUE
- actions_types = list(/datum/action/item_action/toggle, /datum/action/item_action/m56_goggles/far_sight)
+ actions_types = list(/datum/action/item_action/toggle)
vision_flags = SEE_TURFS
fullscreen_vision = null
req_skill = SKILL_SPEC_WEAPONS
@@ -203,6 +203,7 @@
name = "\improper M56T head mounted sight"
desc = "A headset and goggles system for the M56T 'Terminator' Smartgun. Has a low-light vision processor as well as a system allowing detection of thermal signatures though solid surfaces."
vision_flags = SEE_TURFS|SEE_MOBS
+ actions_types = list(/datum/action/item_action/toggle, /datum/action/item_action/m56_goggles/far_sight)
/obj/item/clothing/glasses/night/yautja
name = "bio-mask nightvision"
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index cea9e26869b0..b5ce6fdbdda8 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -838,7 +838,7 @@
/obj/item/storage/bible,
/obj/item/storage/toolkit,
)
- storage_flags = NONE //no verb, no quick draw, no tile gathering
+ storage_flags = STORAGE_ALLOW_DRAWING_METHOD_TOGGLE
/obj/item/clothing/accessory/storage/holster
name = "shoulder holster"
diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm
index 14336cbdba04..2ca371fa75a9 100644
--- a/code/modules/cm_preds/yaut_weapons.dm
+++ b/code/modules/cm_preds/yaut_weapons.dm
@@ -60,7 +60,7 @@
w_class = SIZE_HUGE
edge = TRUE
sharp = IS_SHARP_ITEM_ACCURATE
- flags_item = NOSHIELD|NODROP|ITEM_PREDATOR
+ flags_item = NOSHIELD|NODROP|DELONDROP|ITEM_PREDATOR
flags_equip_slot = NO_FLAGS
hitsound = 'sound/weapons/wristblades_hit.ogg'
attack_speed = 6
diff --git a/code/modules/gear_presets/survivors/lv_624/corporate_dome_insert_lv624.dm b/code/modules/gear_presets/survivors/lv_624/corporate_dome_insert_lv624.dm
index 395d51f6e77d..508333da303d 100644
--- a/code/modules/gear_presets/survivors/lv_624/corporate_dome_insert_lv624.dm
+++ b/code/modules/gear_presets/survivors/lv_624/corporate_dome_insert_lv624.dm
@@ -1,7 +1,7 @@
// /obj/effect/landmark/survivor_spawner/lv624_corporate_dome/cl
// corporatedomehold.dmm
-/datum/equipment_preset/survivor/wy/executive
+/datum/equipment_preset/survivor/corporate/executive
name = "Survivor - LV-624 Paranoid Corporate Liaison"
flags = EQUIPMENT_PRESET_START_OF_ROUND
paygrades = list(PAY_SHORT_WYC5 = JOB_PLAYTIME_TIER_0)
@@ -28,7 +28,7 @@
survivor_variant = CORPORATE_SURVIVOR
-/datum/equipment_preset/survivor/wy/executive/load_gear(mob/living/carbon/human/new_human)
+/datum/equipment_preset/survivor/corporate/executive/load_gear(mob/living/carbon/human/new_human)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/field(new_human), WEAR_BODY)
if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD])
add_ice_colony_survivor_equipment(new_human)
diff --git a/code/modules/gear_presets/survivors/shivas_snowball/panic_room_insert_shivas.dm b/code/modules/gear_presets/survivors/shivas_snowball/panic_room_insert_shivas.dm
index 16092ad51130..f023935240cc 100644
--- a/code/modules/gear_presets/survivors/shivas_snowball/panic_room_insert_shivas.dm
+++ b/code/modules/gear_presets/survivors/shivas_snowball/panic_room_insert_shivas.dm
@@ -1,7 +1,7 @@
// /obj/effect/landmark/survivor_spawner/shivas_assistant_manager
// panic_room_insert_shivas.dmm
-/datum/equipment_preset/survivor/wy/asstmanager
+/datum/equipment_preset/survivor/corporate/asstmanager
name = "Survivor - Corporate Assistant Manager"
flags = EQUIPMENT_PRESET_EXTRA
paygrades = list(PAY_SHORT_WYC7 = JOB_PLAYTIME_TIER_0)
@@ -28,7 +28,7 @@
survivor_variant = CORPORATE_SURVIVOR
-/datum/equipment_preset/survivor/wy/asstmanager/load_gear(mob/living/carbon/human/new_human)
+/datum/equipment_preset/survivor/corporate/asstmanager/load_gear(mob/living/carbon/human/new_human)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/manager(new_human), WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/lockable/liaison, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/glass/beaker/vial/random/good(new_human), WEAR_IN_BACK)
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 de117b9a5a56..a23b405ef019 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
@@ -77,7 +77,7 @@
// /obj/effect/landmark/survivor_spawner/bigred_crashed_cl
-/datum/equipment_preset/survivor/wy/manager
+/datum/equipment_preset/survivor/corporate/manager
name = "Survivor - Corporate Supervisor"
flags = EQUIPMENT_PRESET_EXTRA
paygrades = list(PAY_SHORT_WYC6 = JOB_PLAYTIME_TIER_0)
@@ -106,7 +106,7 @@
survivor_variant = CORPORATE_SURVIVOR
-/datum/equipment_preset/survivor/wy/manager/load_gear(mob/living/carbon/human/new_human)
+/datum/equipment_preset/survivor/corporate/manager/load_gear(mob/living/carbon/human/new_human)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/manager(new_human), WEAR_BODY)
if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD])
diff --git a/code/modules/gear_presets/survivors/survivors.dm b/code/modules/gear_presets/survivors/survivors.dm
index 0e28e64e9fc4..1378bb6f6dbb 100644
--- a/code/modules/gear_presets/survivors/survivors.dm
+++ b/code/modules/gear_presets/survivors/survivors.dm
@@ -370,9 +370,30 @@ Everything bellow is a parent used as a base for one or multiple maps.
ACCESS_WY_EXEC,
)
languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE)
-
survivor_variant = CORPORATE_SURVIVOR
+/datum/equipment_preset/survivor/corporate/load_rank(mob/living/carbon/human/new_human, client/mob_client)
+ if(paygrades.len == 1)
+ return paygrades[1]
+ var/playtime
+ if(!mob_client)
+ playtime = JOB_PLAYTIME_TIER_1
+ else
+ playtime = get_job_playtime(mob_client, JOB_CORPORATE_LIAISON)
+ if((playtime >= JOB_PLAYTIME_TIER_1) && !mob_client.prefs.playtime_perks)
+ playtime = JOB_PLAYTIME_TIER_1
+ var/final_paygrade
+ for(var/current_paygrade as anything in paygrades)
+ var/required_time = paygrades[current_paygrade]
+ if(required_time - playtime > 0)
+ break
+ final_paygrade = current_paygrade
+ if(!final_paygrade)
+ . = "???"
+ CRASH("[key_name(new_human)] spawned with no valid paygrade.")
+
+ return final_paygrade
+
/datum/equipment_preset/survivor/corporate/load_gear(mob/living/carbon/human/new_human)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/field(new_human), WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(new_human), WEAR_JACKET)
diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm
index 9ef15ff955ae..94f03f0d7e7f 100644
--- a/code/modules/gear_presets/uscm_event.dm
+++ b/code/modules/gear_presets/uscm_event.dm
@@ -197,10 +197,9 @@
/datum/equipment_preset/uscm_event/provost/enforcer
name = "Provost Enforcer"
-
assignment = JOB_PROVOST_ENFORCER
- rank = "Provost Enforcer"
- paygrades = list(PAY_SHORT_CPO = JOB_PLAYTIME_TIER_0)
+ rank = JOB_PROVOST_ENFORCER
+ paygrades = list(PAY_SHORT_ME5 = JOB_PLAYTIME_TIER_0, PAY_SHORT_ME6 = JOB_PLAYTIME_TIER_1, PAY_SHORT_ME7 = JOB_PLAYTIME_TIER_3)
role_comm_title = "PvE"
flags = EQUIPMENT_PRESET_EXTRA
@@ -243,10 +242,9 @@
/datum/equipment_preset/uscm_event/provost/tml
name = "Provost Team Leader"
skills = /datum/skills/CMP
-
assignment = JOB_PROVOST_TML
- rank = "Provost Team Leader"
- paygrades = list(PAY_SHORT_CSPO = JOB_PLAYTIME_TIER_0)
+ rank = JOB_PROVOST_TML
+ paygrades = list(PAY_SHORT_ME8 = JOB_PLAYTIME_TIER_0, PAY_SHORT_ME9 = JOB_PLAYTIME_TIER_3)
role_comm_title = "PvTML"
flags = EQUIPMENT_PRESET_EXTRA
@@ -289,9 +287,8 @@
/datum/equipment_preset/uscm_event/provost/inspector
name = "Provost Inspector"
-
assignment = JOB_PROVOST_INSPECTOR
- rank = "Provost Inspector"
+ rank = JOB_PROVOST_INSPECTOR
paygrades = list(PAY_SHORT_PVI = JOB_PLAYTIME_TIER_0)
role_comm_title = "PvI"
flags = EQUIPMENT_PRESET_EXTRA
@@ -330,7 +327,6 @@
/datum/equipment_preset/uscm_event/provost/inspector/chief
name = "Provost Chief Inspector"
-
assignment = JOB_PROVOST_CINSPECTOR
rank = JOB_PROVOST_CINSPECTOR
paygrades = list(PAY_SHORT_PVCI = JOB_PLAYTIME_TIER_0)
@@ -370,10 +366,9 @@
/datum/equipment_preset/uscm_event/provost/inspector/advisor
name = "Provost Advisor"
-
assignment = JOB_PROVOST_ADVISOR
- rank = "Provost Advisor"
- paygrades = list(PAY_SHORT_CSPO = JOB_PLAYTIME_TIER_0)
+ rank = JOB_PROVOST_ADVISOR
+ paygrades = list(PAY_SHORT_ME8E = JOB_PLAYTIME_TIER_0, PAY_SHORT_ME9E = JOB_PLAYTIME_TIER_3)
role_comm_title = "PvA"
flags = EQUIPMENT_PRESET_EXTRA
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index d4db6bccde83..7f52beac6073 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -1038,7 +1038,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
for(var/role in mobs_by_role)
for(var/freed_mob in mobs_by_role[role])
freed_mob_choices["[freed_mob] ([role])"] = freed_mob
-
+ if(!length(freed_mob_choices))
+ to_chat(src, SPAN_WARNING("There are no Freed Mobs available."))
+ return
var/choice = tgui_input_list(usr, "Pick a Freed Mob:", "Join as Freed Mob", freed_mob_choices)
if(!choice)
return
diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm
index 58e4b617a19c..2e24e0f3254b 100644
--- a/code/modules/mob/living/carbon/human/human_abilities.dm
+++ b/code/modules/mob/living/carbon/human/human_abilities.dm
@@ -1,3 +1,12 @@
+/mob/living/carbon/human/proc/set_selected_ability(datum/action/human_action/activable/ability)
+ if(!ability)
+ selected_ability = null
+ client?.set_right_click_menu_mode(shift_only = FALSE)
+ return
+ selected_ability = ability
+ if(get_ability_mouse_key() == XENO_ABILITY_CLICK_RIGHT)
+ client?.set_right_click_menu_mode(shift_only = TRUE)
+
/datum/action/human_action/update_button_icon()
if(action_cooldown_check())
button.color = rgb(120,120,120,200)
@@ -163,23 +172,21 @@ CULT
return
var/mob/living/carbon/human/H = owner
if(H.selected_ability == src)
- to_chat(H, "You will no longer use [name] with \
- [H.client && H.client.prefs && H.client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ to_chat(H, "You will no longer use [name] with [H.get_ability_mouse_name()].")
button.icon_state = "template"
- H.selected_ability = null
+ H.set_selected_ability(null)
else
- to_chat(H, "You will now use [name] with \
- [H.client && H.client.prefs && H.client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ to_chat(H, "You will now use [name] with [H.get_ability_mouse_name()].")
if(H.selected_ability)
H.selected_ability.button.icon_state = "template"
- H.selected_ability = null
+ H.set_selected_ability(null)
button.icon_state = "template_on"
- H.selected_ability = src
+ H.set_selected_ability(src)
/datum/action/human_action/activable/remove_from(mob/living/carbon/human/H)
..()
if(H.selected_ability == src)
- H.selected_ability = null
+ H.set_selected_ability(null)
/datum/action/human_action/activable/proc/use_ability(mob/M)
return
diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm
index c5f39281ee19..af46cdfc4e1d 100644
--- a/code/modules/mob/living/carbon/human/login.dm
+++ b/code/modules/mob/living/carbon/human/login.dm
@@ -1,3 +1,6 @@
/mob/living/carbon/human/Login()
..()
- if(species) species.handle_login_special(src)
+ if(species)
+ species.handle_login_special(src)
+ if(selected_ability)
+ set_selected_ability(null)
diff --git a/code/modules/mob/living/carbon/human/species/zombie.dm b/code/modules/mob/living/carbon/human/species/zombie.dm
index 21a220e48e55..4e8a0b5e98e2 100644
--- a/code/modules/mob/living/carbon/human/species/zombie.dm
+++ b/code/modules/mob/living/carbon/human/species/zombie.dm
@@ -127,7 +127,7 @@
/datum/species/zombie/proc/handle_alert_ghost(mob/living/carbon/human/zombie)
var/mob/dead/observer/ghost = zombie.get_ghost()
if(ghost?.client)
- playsound_client(ghost.client, 'sound/effects/revive_notify.ogg')
+ playsound_client(ghost.client, 'sound/effects/adminhelp_new.ogg')
to_chat(ghost, SPAN_BOLDNOTICE(FONT_SIZE_LARGE("Your body has risen! (Verbs -> Ghost -> Re-enter corpse, or click here!)")))
/datum/species/zombie/proc/remove_from_revive(mob/living/carbon/human/zombie)
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
index b262624bfe01..5749e3b76e9c 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm
@@ -7,6 +7,15 @@
plasma internally. Bear that in mind. -4khan
*/
+/mob/living/carbon/xenomorph/proc/set_selected_ability(datum/action/xeno_action/activable/ability)
+ if(!ability)
+ selected_ability = null
+ client?.set_right_click_menu_mode(shift_only = FALSE)
+ return
+ selected_ability = ability
+ if(get_ability_mouse_key() == XENO_ABILITY_CLICK_RIGHT)
+ client?.set_right_click_menu_mode(shift_only = TRUE)
+
/datum/action/xeno_action/onclick/plant_weeds
name = "Plant Weeds (75)"
ability_name = "Plant Weeds"
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm b/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm
index bff59186fd04..3371e1298233 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/xeno_action.dm
@@ -169,21 +169,19 @@
return // We clicked the same ability in a very short time
if(xeno.client && xeno.client.prefs && xeno.client.prefs.toggle_prefs & TOGGLE_ABILITY_DEACTIVATION_OFF)
return
- to_chat(xeno, "You will no longer use [ability_name] with \
- [xeno.client && xeno.client.prefs && xeno.client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ to_chat(xeno, "You will no longer use [ability_name] with [xeno.get_ability_mouse_name()].")
button.icon_state = "template"
- xeno.selected_ability = null
+ xeno.set_selected_ability(null)
if(charge_time)
stop_charging_ability()
else
- to_chat(xeno, "You will now use [ability_name] with \
- [xeno.client && xeno.client.prefs && xeno.client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ to_chat(xeno, "You will now use [ability_name] with [xeno.get_ability_mouse_name()].")
if(xeno.selected_ability)
xeno.selected_ability.action_deselect()
if(xeno.selected_ability.charge_time)
xeno.selected_ability.stop_charging_ability()
button.icon_state = "template_on"
- xeno.selected_ability = src
+ xeno.set_selected_ability(src)
xeno.deselect_timer = world.time + 5 // Half a second
if(charges != NO_ACTION_CHARGES)
to_chat(xeno, SPAN_INFO("It has [charges] uses left."))
@@ -198,7 +196,7 @@
/datum/action/xeno_action/activable/remove_from(mob/living/carbon/xenomorph/xeno)
..()
if(xeno.selected_ability == src)
- xeno.selected_ability = null
+ xeno.set_selected_ability(null)
if(macro_path)
remove_verb(xeno, macro_path)
diff --git a/code/modules/mob/living/carbon/xenomorph/login.dm b/code/modules/mob/living/carbon/xenomorph/login.dm
index e381aea4015e..4e77f3ef17a7 100644
--- a/code/modules/mob/living/carbon/xenomorph/login.dm
+++ b/code/modules/mob/living/carbon/xenomorph/login.dm
@@ -6,3 +6,5 @@
generate_name()
if(SSticker.mode)
SSticker.mode.xenomorphs |= mind
+ if(selected_ability)
+ set_selected_ability(null)
diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm b/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm
index 8a1981fe512b..a4e7d5f65d2f 100644
--- a/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm
+++ b/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm
@@ -102,22 +102,6 @@
xeno_hostile_hud = !xeno_hostile_hud
-
-/mob/living/carbon/xenomorph/verb/middle_mouse_toggle()
- set name = "Toggle Middle/Shift Clicking"
- set desc = "Toggles between using middle mouse click and shift click for selected ability use."
- set category = "Alien"
-
- if (!client || !client.prefs)
- return
-
- client.prefs.toggle_prefs ^= TOGGLE_MIDDLE_MOUSE_CLICK
- client.prefs.save_preferences()
- if (client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK)
- to_chat(src, SPAN_NOTICE("The selected xeno ability will now be activated with middle mouse clicking."))
- else
- to_chat(src, SPAN_NOTICE("The selected xeno ability will now be activated with shift clicking."))
-
/mob/living/carbon/xenomorph/verb/ability_deactivation_toggle()
set name = "Toggle Ability Deactivation"
set desc = "Toggles whether you can deactivate your currently active ability when re-selecting it."
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm
index 6bb0202c2deb..891c9540735d 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm
@@ -171,7 +171,7 @@
desc = "A large, wolf-like reptile."
if(user == src)
. += SPAN_NOTICE("\nRest on the ground to restore 5% of your health every second.")
- . += SPAN_NOTICE("You're able to pounce targets by using [client && client.prefs && client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ . += SPAN_NOTICE("You're able to pounce targets by using [get_ability_mouse_name()].")
. += SPAN_NOTICE("You will aggressively maul targets that are prone. Any click on yourself will be passed down to mobs below you, so feel free to click on your sprite in order to attack pounced targets.")
else if((user.faction in faction_group))
desc = "[initial(desc)] There's a hint of warmth in them."
@@ -718,15 +718,22 @@
//Middle mouse button/shift click to pounce.
/mob/living/simple_animal/hostile/retaliate/giant_lizard/click(atom/clicked_atom, list/mods)
- if(mods["shift"] && !mods["middle"])
- if(client && client.prefs && !(client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK))
- pounce(clicked_atom)
- return TRUE
-
- if(mods["middle"] && !mods["shift"])
- if(client && client.prefs && client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK)
- pounce(clicked_atom)
- return TRUE
+ var/should_pounce = FALSE
+ switch(get_ability_mouse_key())
+ if(XENO_ABILITY_CLICK_MIDDLE)
+ if(mods[MIDDLE_CLICK] && mods[LEFT_CLICK])
+ should_pounce = TRUE
+ if(XENO_ABILITY_CLICK_RIGHT)
+ if(mods[RIGHT_CLICK])
+ should_pounce = TRUE
+ if(XENO_ABILITY_CLICK_MIDDLE)
+ if(mods[MIDDLE_CLICK])
+ should_pounce = TRUE
+
+ if(should_pounce)
+ pounce(clicked_atom)
+ return TRUE
+
return ..()
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 38157a067367..acaf54933ae3 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -59,6 +59,7 @@
CB.Invoke()
client.init_verbs()
+ client.set_right_click_menu_mode(shift_only = FALSE)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_LOGGED_IN, src)
SEND_SIGNAL(client, COMSIG_CLIENT_MOB_LOGGED_IN, src)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index f1007ab2ad4f..d9910b34827e 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -615,3 +615,24 @@ GLOBAL_LIST_INIT(limb_types_by_name, list(
lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
sync_lighting_plane_alpha()
+
+/mob/proc/get_ability_mouse_key()
+ if(!client)
+ return XENO_ABILITY_CLICK_MIDDLE
+
+ return client.prefs.xeno_ability_click_mode
+
+/proc/xeno_ability_mouse_pref_to_string(preference_value)
+ switch(preference_value)
+ if(XENO_ABILITY_CLICK_MIDDLE)
+ return "middle click"
+ if(XENO_ABILITY_CLICK_RIGHT)
+ return "right click"
+ if(XENO_ABILITY_CLICK_SHIFT)
+ return "shift click"
+ return "middle click"
+
+/mob/proc/get_ability_mouse_name()
+ var/ability = get_ability_mouse_key()
+
+ return xeno_ability_mouse_pref_to_string(ability)
diff --git a/code/modules/projectiles/ammo_boxes/round_boxes.dm b/code/modules/projectiles/ammo_boxes/round_boxes.dm
index ab1d1667c15f..b4849466c309 100644
--- a/code/modules/projectiles/ammo_boxes/round_boxes.dm
+++ b/code/modules/projectiles/ammo_boxes/round_boxes.dm
@@ -104,7 +104,7 @@
overlay_gun_type = "_rounds_type71"
overlay_content = "_type71_reg"
caliber = "5.45x39mm"
- default_ammo = /datum/ammo/bullet/rifle
+ default_ammo = /datum/ammo/bullet/rifle/type71
/obj/item/ammo_box/rounds/type71/empty
empty = TRUE
@@ -115,7 +115,7 @@
icon_state = "base_type71"
overlay_gun_type = "_rounds_type71"
overlay_content = "_type71_ap"
- default_ammo = /datum/ammo/bullet/rifle/ap
+ default_ammo = /datum/ammo/bullet/rifle/type71/ap
/obj/item/ammo_box/rounds/type71/ap/empty
empty = TRUE
diff --git a/code/modules/projectiles/guns/specialist/sniper.dm b/code/modules/projectiles/guns/specialist/sniper.dm
index b400350e415b..7718c83c7ccd 100644
--- a/code/modules/projectiles/guns/specialist/sniper.dm
+++ b/code/modules/projectiles/guns/specialist/sniper.dm
@@ -67,18 +67,16 @@
return
var/mob/living/carbon/human/H = owner
if(H.selected_ability == src)
- to_chat(H, "You will no longer use [name] with \
- [H.client && H.client.prefs && H.client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ to_chat(H, "You will no longer use [name] with [H.get_ability_mouse_name()].")
button.icon_state = "template"
- H.selected_ability = null
+ H.set_selected_ability(null)
else
- to_chat(H, "You will now use [name] with \
- [H.client && H.client.prefs && H.client.prefs.toggle_prefs & TOGGLE_MIDDLE_MOUSE_CLICK ? "middle-click" : "shift-click"].")
+ to_chat(H, "You will now use [name] with [H.get_ability_mouse_name()].")
if(H.selected_ability)
H.selected_ability.button.icon_state = "template"
- H.selected_ability = null
+ H.set_selected_ability(null)
button.icon_state = "template_on"
- H.selected_ability = src
+ H.set_selected_ability(src)
/datum/action/item_action/specialist/aimed_shot/can_use_action()
var/mob/living/carbon/human/H = owner
diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm
index 843332272453..051befa14fba 100644
--- a/code/modules/reagents/chemistry_properties/prop_positive.dm
+++ b/code/modules/reagents/chemistry_properties/prop_positive.dm
@@ -603,7 +603,7 @@
var/mob/dead/observer/ghost = dead.get_ghost()
if(ghost?.client)
COOLDOWN_START(src, ghost_notif, 30 SECONDS)
- playsound_client(ghost.client, 'sound/effects/revive_notify.ogg')
+ playsound_client(ghost.client, 'sound/effects/adminhelp_new.ogg')
to_chat(ghost, SPAN_BOLDNOTICE("Your heart is struggling to pump! There is a chance you might get up!(Verbs -> Ghost -> Re-enter corpse, or click here!)"))
return TRUE
diff --git a/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm b/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm
index c2c6b818b37b..7d1c1eeb24cc 100644
--- a/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm
+++ b/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm
@@ -78,11 +78,11 @@
cryos += list(cryotube)
if (occupant_count > max_capacity)
playsound(src,'sound/effects/escape_pod_warmup.ogg', 50, 1)
+ mode = SHUTTLE_CRASHED
sleep(31)
var/turf/sploded = return_center_turf()
cell_explosion(sploded, 100, 20, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data("escape pod malfunction")) //Clears out walls
sleep(25)
- mode = SHUTTLE_CRASHED
for(var/obj/structure/machinery/cryopod/evacuation/cryotube in cryos)
cryotube.go_out()
door_handler.control_doors("force-unlock")
diff --git a/code/modules/surgery/chestburster.dm b/code/modules/surgery/chestburster.dm
index e387978fb8ee..08b19b24e515 100644
--- a/code/modules/surgery/chestburster.dm
+++ b/code/modules/surgery/chestburster.dm
@@ -33,6 +33,7 @@
/obj/item/tool/surgery/scalpel/pict_system = SURGERY_TOOL_MULT_IDEAL,
/obj/item/attachable/bayonet = SURGERY_TOOL_MULT_SUBSTITUTE,
/obj/item/tool/kitchen/knife = SURGERY_TOOL_MULT_SUBSTITUTE,
+ /obj/item/weapon/throwing_knife = SURGERY_TOOL_MULT_AWFUL,
/obj/item/shard = SURGERY_TOOL_MULT_AWFUL,
)
time = 5 SECONDS
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index c5d7f37a444c..3f938bd3f3cd 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -223,6 +223,7 @@
/obj/item/attachable/bayonet = SURGERY_TOOL_MULT_AWFUL,
/obj/item/tool/surgery/scalpel = SURGERY_TOOL_MULT_AWFUL,
/obj/item/tool/kitchen/knife = SURGERY_TOOL_MULT_AWFUL,
+ /obj/item/weapon/throwing_knife = SURGERY_TOOL_MULT_AWFUL,
/obj/item/shard = SURGERY_TOOL_MULT_AWFUL
)
preop_sound = 'sound/surgery/retractor1.ogg'
diff --git a/code/modules/surgery/xeno.dm b/code/modules/surgery/xeno.dm
index d3175a2f78d5..4082aadc4a8f 100644
--- a/code/modules/surgery/xeno.dm
+++ b/code/modules/surgery/xeno.dm
@@ -133,6 +133,7 @@
/obj/item/tool/surgery/scalpel/pict_system = SURGERY_TOOL_MULT_IDEAL,
/obj/item/attachable/bayonet = SURGERY_TOOL_MULT_SUBSTITUTE,
/obj/item/tool/kitchen/knife = SURGERY_TOOL_MULT_SUBSTITUTE,
+ /obj/item/weapon/throwing_knife = SURGERY_TOOL_MULT_AWFUL,
/obj/item/shard = SURGERY_TOOL_MULT_AWFUL,
)
time = 4 SECONDS
diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm
index f4806f7adb97..29ea239ad84d 100644
--- a/code/modules/tgs/v5/__interop_version.dm
+++ b/code/modules/tgs/v5/__interop_version.dm
@@ -1 +1 @@
-"5.9.0"
+"5.10.0"
diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm
index 92c7a8388a71..a47bfd78000b 100644
--- a/code/modules/tgs/v5/_defines.dm
+++ b/code/modules/tgs/v5/_defines.dm
@@ -95,6 +95,7 @@
#define DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION "newServerVersion"
#define DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE "broadcastMessage"
+#define DMAPI5_TOPIC_RESPONSE_CLIENT_COUNT "clientCount"
#define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE "commandResponse"
#define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE "commandResponseMessage"
#define DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES "chatResponses"
diff --git a/code/modules/tgs/v5/topic.dm b/code/modules/tgs/v5/topic.dm
index e1f2cb638578..59e5e63e5cd4 100644
--- a/code/modules/tgs/v5/topic.dm
+++ b/code/modules/tgs/v5/topic.dm
@@ -149,7 +149,9 @@
if(DMAPI5_TOPIC_COMMAND_HEALTHCHECK)
if(event_handler && event_handler.receive_health_checks)
event_handler.HandleEvent(TGS_EVENT_HEALTH_CHECK)
- return TopicResponse()
+ var/list/health_check_response = TopicResponse()
+ health_check_response[DMAPI5_TOPIC_RESPONSE_CLIENT_COUNT] = TGS_CLIENT_COUNT
+ return health_check_response;
if(DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH)
detached = FALSE
diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm
index 237207fdfd05..acd19dfa6411 100644
--- a/code/modules/tgs/v5/undefs.dm
+++ b/code/modules/tgs/v5/undefs.dm
@@ -18,7 +18,6 @@
#undef DMAPI5_PARAMETER_ACCESS_IDENTIFIER
#undef DMAPI5_PARAMETER_CUSTOM_COMMANDS
-#undef DMAPI5_PARAMETER_TOPIC_PORT
#undef DMAPI5_CHUNK
#undef DMAPI5_CHUNK_PAYLOAD
@@ -95,6 +94,7 @@
#undef DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION
#undef DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE
+#undef DMAPI5_TOPIC_RESPONSE_CLIENT_COUNT
#undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE
#undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE
#undef DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES
diff --git a/colonialmarines.dme b/colonialmarines.dme
index 48996a93ec30..9fff0d7db91b 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -1041,6 +1041,7 @@
#include "code\game\objects\effects\step_triggers.dm"
#include "code\game\objects\effects\temporary_visuals.dm"
#include "code\game\objects\effects\decals\crayon.dm"
+#include "code\game\objects\effects\decals\floor_symbol.dm"
#include "code\game\objects\effects\decals\hefa_cult_decals.dm"
#include "code\game\objects\effects\decals\kutjevo_decals.dm"
#include "code\game\objects\effects\decals\medical_decals.dm"
diff --git a/html/changelogs/AutoChangeLog-pr-6602.yml b/html/changelogs/AutoChangeLog-pr-6602.yml
deleted file mode 100644
index d83ef6e5cdd9..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6602.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Steelpoint"
-delete-after: True
-changes:
- - maptweak: "The northern half of the main colony of Solaris Ridge has received an aesthetic upgrade."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6977.yml b/html/changelogs/AutoChangeLog-pr-6977.yml
deleted file mode 100644
index 5fd981b237e0..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6977.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "SpartanBobby"
-delete-after: True
-changes:
- - maptweak: "LV522 changes relating to the overall size of the map, redefining chokepoints in the reactor, changes to engineering and the west side of the map and removing the poplock"
- - maptweak: "LV522, LZ1 Tunnel (the place FORECON holds) has been given fog for the start of the round meaning FORECON will have to adapt to survive."
- - maptweak: "buffed crashed ship lootspawns on LV522"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-7060.yml b/html/changelogs/AutoChangeLog-pr-7060.yml
deleted file mode 100644
index 79db32d7c1cf..000000000000
--- a/html/changelogs/AutoChangeLog-pr-7060.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "hislittlecuzingames"
-delete-after: True
-changes:
- - qol: "Deletes empty pill packets when dropped."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-7158.yml b/html/changelogs/AutoChangeLog-pr-7158.yml
new file mode 100644
index 000000000000..ca7c3fc60f2a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7158.yml
@@ -0,0 +1,4 @@
+author: "deathrobotpunch"
+delete-after: True
+changes:
+ - bugfix: "fixes UPP ammo storage boxes"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-7159.yml b/html/changelogs/AutoChangeLog-pr-7159.yml
new file mode 100644
index 000000000000..57ecc3d24917
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-7159.yml
@@ -0,0 +1,4 @@
+author: "deathrobotpunch"
+delete-after: True
+changes:
+ - bugfix: "Pred wristblades now del on drop"
\ No newline at end of file
diff --git a/html/changelogs/archive/2024-09.yml b/html/changelogs/archive/2024-09.yml
new file mode 100644
index 000000000000..a75e92b922d5
--- /dev/null
+++ b/html/changelogs/archive/2024-09.yml
@@ -0,0 +1,76 @@
+2024-09-02:
+ SpartanBobby:
+ - maptweak: LV522 changes relating to the overall size of the map, redefining chokepoints
+ in the reactor, changes to engineering and the west side of the map and removing
+ the poplock
+ - maptweak: LV522, LZ1 Tunnel (the place FORECON holds) has been given fog for the
+ start of the round meaning FORECON will have to adapt to survive.
+ - maptweak: buffed crashed ship lootspawns on LV522
+ Steelpoint:
+ - maptweak: The northern half of the main colony of Solaris Ridge has received an
+ aesthetic upgrade.
+ hislittlecuzingames:
+ - qol: Deletes empty pill packets when dropped.
+2024-09-05:
+ benbot16:
+ - bugfix: Fixes stacking explosions in overloaded escape pods.
+ joookschad:
+ - sounddel: removed the new revive notification
+ realforest2001:
+ - rscadd: Added a staff event verb to check for a particular whitelist and report
+ online players that have it. Code for the proc from HarryOB
+2024-09-06:
+ hislittlecuzingames:
+ - config: Adjusted XO Hour Requirements.
+2024-09-08:
+ BOBAMA:
+ - bugfix: fixed monkey spawn on Shiva's LZ2 in fog
+ Blundir:
+ - imageadd: replaces ancient close backpack red cross with a modern icon
+ Nihisohel:
+ - qol: Throwing Knives can now perform basic surgery on par with glass shards
+ SpartanBobby:
+ - maptweak: Widens trijent platform (the one northeast of engineering west of the
+ padlock)
+ - maptweak: Changes to the handrails and tiles on predship
+ Steelpoint:
+ - maptweak: Removes a overpowered shotgun from Solaris.
+ Steelpoint, Crowford:
+ - imageadd: A UPP faction floor symbol has been added for mappers to use.
+ kiVts:
+ - code_imp: Join as freed mobs will now notify the user if there is no freed mobs
+ to take.
+2024-09-09:
+ realforest2001:
+ - bugfix: Survivor CL now draws ranks from CL playtime as previously.
+ - rscadd: Provost Advisor, Team Lead and Enforcer now use military ranks again.
+2024-09-10:
+ Watermelon914:
+ - rscadd: Added a webhook to send the top 10 most overtiming procs to a discord
+ webhook on server shutdown.
+ - qol: 'Adds a new preference option for activating xeno abilities: Right click.
+ Prevents the context menu from opening whenever you have an ability active,
+ and the ability can then be triggered with right click. Context menu can still
+ be forced open by holding shift before right clicking, even if the ability is
+ active.'
+ realforest2001:
+ - bugfix: You can build on tiles with fire doors again.
+2024-09-11:
+ rythenx:
+ - bugfix: drop pouch's switch storage drawing method now works correctly instead
+ of doing nothing
+2024-09-13:
+ Git-Nivrak:
+ - balance: Removed far-sight from SG sights
+ - balance: Increased smartgun bullet falloff to 4 from 1
+ - balance: Increased smartgun bullet effective range to 7 from 0
+2024-09-14:
+ MistChristmas:
+ - balance: Buffs MW Fireman skill in line with the rest of MPs
+2024-09-15:
+ realforest2001:
+ - bugfix: Scientists and Doctors from the Shiva panic room nightmare insert now
+ spawn with snow gear as intended.
+ - bugfix: Fixes uniform vendor shutters being openable without access.
+ tallfission:
+ - rscadd: FTL vendors get signal flare packs for 5 points.
diff --git a/icons/mob/hud/screen1.dmi b/icons/mob/hud/screen1.dmi
index c79f6321a083..17d390d9e490 100644
Binary files a/icons/mob/hud/screen1.dmi and b/icons/mob/hud/screen1.dmi differ
diff --git a/icons/turf/upp_floor.dmi b/icons/turf/upp_floor.dmi
new file mode 100644
index 000000000000..c4413310c3ad
Binary files /dev/null and b/icons/turf/upp_floor.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index e31c42938cd9..9b8a870e68e8 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -1,4 +1,12 @@
macro "default"
+ elem ".winset :map.right-click=false"
+ name = "SHIFT+Shift"
+ elem "Shift"
+ name = "SHIFT"
+ command = ".winset :map.right-click=false"
+ elem "ShiftUp"
+ name = "SHIFT+UP"
+ command = ".winset :map.right-click=true"
menu "menu"
elem
diff --git a/maps/map_files/BigRed/BigRed.dmm b/maps/map_files/BigRed/BigRed.dmm
index ec03a01d7633..bf30b8b73fd2 100644
--- a/maps/map_files/BigRed/BigRed.dmm
+++ b/maps/map_files/BigRed/BigRed.dmm
@@ -38778,10 +38778,6 @@
pixel_x = 7
},
/obj/structure/surface/table/woodentable,
-/obj/item/weapon/gun/shotgun/double/sawn{
- pixel_x = 1;
- pixel_y = 10
- },
/turf/open/floor/wood,
/area/bigredv2/outside/bar)
"xJX" = (
diff --git a/maps/map_files/DesertDam/Desert_Dam.dmm b/maps/map_files/DesertDam/Desert_Dam.dmm
index 7fc58191e032..14404540f73d 100644
--- a/maps/map_files/DesertDam/Desert_Dam.dmm
+++ b/maps/map_files/DesertDam/Desert_Dam.dmm
@@ -4748,10 +4748,6 @@
},
/turf/open/floor/prison,
/area/desert_dam/building/water_treatment_two/floodgate_control)
-"asP" = (
-/obj/structure/flora/grass/desert/lightgrass_6,
-/turf/open/desert/dirt/dirt2,
-/area/desert_dam/exterior/valley/north_valley_dam)
"asQ" = (
/obj/structure/surface/table,
/obj/structure/machinery/computer/emails,
@@ -14363,12 +14359,6 @@
/obj/effect/blocker/toxic_water/Group_2,
/turf/open/desert/desert_shore/shore_corner2/west,
/area/desert_dam/exterior/river/riverside_central_north)
-"bfQ" = (
-/obj/structure/platform{
- dir = 1
- },
-/turf/open/desert/dirt/dirt2,
-/area/desert_dam/exterior/valley/north_valley_dam)
"bfR" = (
/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{
dir = 2;
@@ -14609,10 +14599,6 @@
"bgR" = (
/turf/open/desert/dirt/desert_transition_edge1/east,
/area/desert_dam/exterior/valley/north_valley_dam)
-"bgT" = (
-/obj/structure/platform,
-/turf/open/desert/dirt/dirt2,
-/area/desert_dam/exterior/valley/north_valley_dam)
"bgU" = (
/obj/structure/platform,
/turf/open/desert/dirt/dirt2,
@@ -14862,12 +14848,6 @@
},
/turf/open/asphalt/tile,
/area/desert_dam/exterior/valley/bar_valley_dam)
-"bie" = (
-/obj/structure/platform{
- dir = 4
- },
-/turf/open/desert/dirt/dirt2,
-/area/desert_dam/exterior/valley/north_valley_dam)
"bif" = (
/obj/effect/decal/sand_overlay/sand1{
dir = 8
@@ -15168,19 +15148,13 @@
/turf/open/asphalt,
/area/desert_dam/exterior/valley/north_valley_dam)
"bjs" = (
-/obj/structure/stairs,
-/obj/structure/platform{
- dir = 8
- },
-/turf/open/asphalt/cement_sunbleached/cement_sunbleached14,
-/area/desert_dam/exterior/valley/north_valley_dam)
-"bjt" = (
-/obj/structure/stairs,
+/obj/structure/platform,
+/obj/effect/blocker/toxic_water/Group_2,
/obj/structure/platform{
dir = 4
},
-/turf/open/asphalt/cement_sunbleached/cement_sunbleached15,
-/area/desert_dam/exterior/valley/north_valley_dam)
+/turf/open/gm/river/desert/deep,
+/area/desert_dam/exterior/river/riverside_central_north)
"bju" = (
/turf/open/asphalt/cement_sunbleached/cement_sunbleached15,
/area/desert_dam/exterior/valley/north_valley_dam)
@@ -15240,27 +15214,19 @@
},
/turf/open/floor/interior/wood,
/area/desert_dam/building/security/detective)
-"bjJ" = (
-/obj/structure/platform_decoration{
- dir = 4
- },
-/turf/open/desert/dirt/dirt2,
-/area/desert_dam/exterior/valley/north_valley_dam)
"bjK" = (
-/obj/structure/platform_decoration{
- dir = 8
- },
-/turf/open/desert/dirt/dirt2,
-/area/desert_dam/exterior/valley/north_valley_dam)
+/obj/effect/blocker/toxic_water/Group_2,
+/obj/structure/platform_decoration,
+/turf/open/gm/river/desert/shallow,
+/area/desert_dam/exterior/river/riverside_central_north)
"bjL" = (
-/obj/structure/platform{
- dir = 1
- },
-/obj/structure/platform{
- dir = 4
+/obj/structure/stairs/perspective{
+ dir = 8;
+ icon_state = "p_stair_full"
},
+/obj/structure/platform/stair_cut/alt,
/turf/open/desert/dirt/dirt2,
-/area/desert_dam/exterior/valley/north_valley_dam)
+/area/desert_dam/exterior/river/riverside_central_north)
"bjM" = (
/turf/open/asphalt/cement_sunbleached/cement_sunbleached13,
/area/desert_dam/exterior/valley/north_valley_dam)
@@ -15527,12 +15493,12 @@
/turf/open/floor/prison,
/area/desert_dam/building/water_treatment_two/lobby)
"blg" = (
+/obj/effect/blocker/toxic_water/Group_2,
/obj/structure/platform{
dir = 4
},
-/obj/structure/platform,
-/turf/open/desert/dirt/dirt2,
-/area/desert_dam/exterior/valley/north_valley_dam)
+/turf/open/gm/river/desert/shallow_edge/northeast,
+/area/desert_dam/exterior/river/riverside_central_north)
"blh" = (
/obj/structure/desertdam/decals/road_edge{
icon_state = "road_edge_decal5"
@@ -23961,10 +23927,11 @@
/turf/open/gm/river/desert/shallow_edge/west,
/area/desert_dam/exterior/river/riverside_central_north)
"bXj" = (
-/obj/structure/platform_decoration{
- dir = 8
- },
/obj/effect/blocker/toxic_water/Group_2,
+/obj/structure/platform{
+ dir = 4
+ },
+/obj/structure/platform,
/turf/open/desert/desert_shore/desert_shore1/east,
/area/desert_dam/exterior/river/riverside_central_north)
"bXk" = (
@@ -24045,20 +24012,20 @@
},
/turf/open/asphalt,
/area/desert_dam/exterior/valley/valley_mining)
-"bXy" = (
-/obj/structure/platform,
-/obj/effect/blocker/toxic_water/Group_2,
-/turf/open/gm/river/desert/shallow_corner,
-/area/desert_dam/exterior/river/riverside_central_north)
"bXz" = (
-/obj/structure/platform,
/obj/effect/blocker/toxic_water/Group_2,
-/turf/open/gm/river/desert/shallow_edge/northeast,
+/obj/structure/platform{
+ dir = 4
+ },
+/turf/open/gm/river/desert/shallow_corner,
/area/desert_dam/exterior/river/riverside_central_north)
"bXA" = (
-/obj/structure/platform,
-/obj/effect/blocker/toxic_water/Group_2,
-/turf/open/desert/desert_shore/shore_corner2/west,
+/obj/structure/stairs/perspective{
+ dir = 10;
+ icon_state = "p_stair_full"
+ },
+/obj/structure/platform_decoration,
+/turf/open/desert/dirt/dirt2,
/area/desert_dam/exterior/river/riverside_central_north)
"bXB" = (
/turf/open/asphalt/cement_sunbleached/cement_sunbleached2,
@@ -80726,16 +80693,16 @@ dTs
dTs
dTs
dTs
-bcY
-bcY
+and
+ard
anb
bcY
bdK
bdt
-aKw
-aZe
-aXS
-bXv
+bjK
+blg
+bXz
+bjs
bYc
bTi
bTi
@@ -80961,16 +80928,16 @@ dTs
dTs
dTs
dTs
-and
-and
+bjL
+bXA
and
and
bek
bXj
-bdt
-aZe
-bXy
-bYc
+bhk
+bhk
+bhk
+blM
bTi
bTi
bTi
@@ -81200,11 +81167,11 @@ bif
biS
bhk
bhk
-bfQ
-bdK
-bdt
-bXz
-bYc
+bhk
+bhk
+bhk
+bhk
+blM
bYF
bYF
bYF
@@ -81431,13 +81398,13 @@ dTs
dTs
bgP
biw
-biT
-bit
-bjs
-bjJ
-bgj
-bdK
-bXA
+bmv
+bhk
+bhk
+bhk
+bhk
+bhk
+bhk
blM
bir
biP
@@ -81665,13 +81632,13 @@ dTs
dTs
bgQ
bhi
-bhD
-bia
-bjt
-bjK
-bgj
-asP
-bgT
+bmv
+bhk
+bhk
+bhk
+bhk
+bhk
+bhk
blM
bir
bki
@@ -81899,13 +81866,13 @@ dTs
bhH
bhj
bhi
-bhD
-bhZ
+bmv
+bhk
+bhk
+bhk
+bhk
+bhk
bhk
-bjL
-bie
-bie
-blg
blM
bir
biP
@@ -82133,8 +82100,8 @@ dTs
bgA
bgP
bix
-bhD
-bia
+biT
+bit
bit
bjM
bjM
diff --git a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
index 51f7589f4987..6c1c5460a935 100644
--- a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
+++ b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
@@ -7394,8 +7394,8 @@
/area/shiva/interior/colony/research_hab)
"dgG" = (
/obj/effect/landmark/monkey_spawn,
-/turf/open/auto_turf/snow/layer2,
-/area/shiva/exterior/lz1_valley)
+/turf/open/auto_turf/snow/layer1,
+/area/shiva/interior/caves/cp_camp)
"dgS" = (
/obj/vehicle/train/cargo/engine,
/turf/open/auto_turf/snow/layer0,
@@ -26918,7 +26918,7 @@ xAS
xAS
kvQ
uqb
-dgG
+uqb
kLM
kLM
kLM
@@ -27072,7 +27072,7 @@ tlB
xAS
aFO
xAS
-xAS
+dgG
oRH
oRH
rzw
diff --git a/maps/predship/huntership.dmm b/maps/predship/huntership.dmm
index 6247c6ce1347..e84ed8c00976 100644
--- a/maps/predship/huntership.dmm
+++ b/maps/predship/huntership.dmm
@@ -151,7 +151,11 @@
/area/yautja)
"ap" = (
/obj/structure/stairs/perspective{
- color = "#b29082"
+ color = "#b29082";
+ icon_state = "p_stair_full"
+ },
+/obj/structure/platform/kutjevo{
+ dir = 8
},
/turf/open/shuttle/predship,
/area/yautja)
@@ -279,6 +283,9 @@
/obj/item/hunting_trap,
/obj/item/hunting_trap,
/obj/item/hunting_trap,
+/obj/structure/platform/kutjevo{
+ dir = 8
+ },
/turf/open/floor/corsat/squareswood/north,
/area/yautja)
"aD" = (
@@ -455,6 +462,16 @@
/obj/item/stack/sheet/mineral/sandstone/large_stack,
/turf/open/floor/corsat/squareswood/north,
/area/yautja)
+"bh" = (
+/obj/structure/platform/kutjevo{
+ dir = 4
+ },
+/obj/structure/stairs/perspective{
+ color = "#b29082";
+ icon_state = "p_stair_full"
+ },
+/turf/open/shuttle/predship,
+/area/yautja)
"bj" = (
/turf/closed/wall/huntership,
/area/yautja)
@@ -713,14 +730,17 @@
/turf/open/floor/corsat/squareswood/north,
/area/yautja)
"bZ" = (
-/obj/item/storage/fancy/candle_box,
-/turf/open/floor/corsat/squareswood/north,
+/obj/structure/platform_decoration/kutjevo{
+ dir = 4
+ },
+/turf/open/shuttle/predship,
/area/yautja)
"ca" = (
-/obj/structure/barricade/handrail/strata{
- dir = 1
+/obj/structure/stairs/perspective{
+ color = "#b29082";
+ icon_state = "p_stair_full"
},
-/turf/open/gm/dirtgrassborder/weedable/grass1,
+/turf/open/shuttle/predship,
/area/yautja)
"cb" = (
/obj/structure/machinery/door_control{
@@ -736,9 +756,6 @@
/obj/structure/barricade/handrail/strata{
dir = 8
},
-/obj/structure/barricade/handrail/strata{
- dir = 1
- },
/turf/open/gm/dirtgrassborder/grassdirt_corner/north_west,
/area/yautja)
"cd" = (
@@ -1405,16 +1422,15 @@
/turf/open/space/basic,
/area/space)
"dS" = (
-/obj/structure/prop/brazier/torch{
- pixel_y = -2
+/obj/structure/platform/kutjevo{
+ dir = 1
},
-/turf/closed/wall/mineral/sandstone/runed/decor,
+/turf/open/shuttle/predship,
/area/yautja)
"eg" = (
/obj/structure/barricade/handrail/strata{
dir = 4
},
-/obj/structure/barricade/handrail/strata,
/turf/open/gm/dirtgrassborder/grassdirt_corner/south_east,
/area/yautja)
"er" = (
@@ -1534,7 +1550,6 @@
/turf/open/floor/corsat/squareswood/north,
/area/yautja)
"fS" = (
-/obj/structure/barricade/handrail/strata,
/turf/open/gm/dirtgrassborder/weedable/grass1,
/area/yautja)
"gb" = (
@@ -1622,22 +1637,18 @@
/turf/open/floor/corsat/squareswood/north,
/area/yautja)
"ha" = (
-/obj/structure/barricade/handrail/strata,
/obj/structure/barricade/handrail/strata{
dir = 8
},
/turf/open/gm/dirtgrassborder/weedable/grass1,
/area/yautja)
"hI" = (
-/obj/structure/shuttle/window{
- color = "#6b675e"
+/obj/structure/window/framed/colony/reinforced/hull{
+ color = "#aba9a9"
},
/turf/open/floor/grey_dark2,
/area/yautja)
"hJ" = (
-/obj/structure/barricade/handrail/strata{
- dir = 1
- },
/obj/structure/barricade/handrail/strata{
dir = 4
},
@@ -1662,6 +1673,16 @@
/obj/item/reagent_container/food/snacks/sliceable/xenomeatbread,
/turf/open/floor/darkred2/west,
/area/yautja)
+"iL" = (
+/obj/structure/stairs/perspective{
+ color = "#b29082";
+ icon_state = "p_stair_full"
+ },
+/obj/structure/platform/kutjevo{
+ dir = 4
+ },
+/turf/open/shuttle/predship,
+/area/yautja)
"iV" = (
/obj/structure/surface/table/reinforced/prison{
color = "#6b675e"
@@ -1844,6 +1865,16 @@
},
/turf/open/floor/strata/grey_multi_tiles,
/area/yautja)
+"og" = (
+/obj/structure/platform/kutjevo{
+ dir = 8
+ },
+/obj/structure/stairs/perspective{
+ color = "#b29082";
+ icon_state = "p_stair_full"
+ },
+/turf/open/shuttle/predship,
+/area/yautja)
"ov" = (
/obj/structure/surface/rack{
color = "#6b675e";
@@ -1896,10 +1927,8 @@
/turf/open/floor/corsat/squareswood/north,
/area/yautja)
"rH" = (
-/obj/structure/shuttle/window{
- color = "#6b675e"
- },
-/turf/open/floor/corsat/squareswood/north,
+/obj/structure/barricade/handrail/strata,
+/turf/open/shuttle/predship,
/area/yautja)
"rY" = (
/obj/structure/surface/rack{
@@ -2154,7 +2183,6 @@
/obj/structure/barricade/handrail/strata{
dir = 8
},
-/obj/structure/barricade/handrail/strata,
/turf/open/gm/dirtgrassborder/grassdirt_corner/south_west,
/area/yautja)
"xn" = (
@@ -2573,11 +2601,10 @@
/turf/open/shuttle/predship,
/area/yautja)
"Ip" = (
-/obj/structure/barricade/handrail/strata,
/obj/structure/barricade/handrail/strata{
- dir = 4
+ dir = 1
},
-/turf/open/gm/dirtgrassborder/weedable/grass1,
+/turf/open/shuttle/predship,
/area/yautja)
"Iw" = (
/obj/structure/machinery/door/airlock/yautja/secure{
@@ -2789,13 +2816,10 @@
/turf/open/floor/corsat/squareswood/north,
/area/yautja)
"QK" = (
-/obj/structure/barricade/handrail/strata{
- dir = 1
- },
-/obj/structure/barricade/handrail/strata{
+/obj/structure/platform_decoration/kutjevo{
dir = 8
},
-/turf/open/gm/dirtgrassborder/weedable/grass1,
+/turf/open/shuttle/predship,
/area/yautja)
"Rq" = (
/obj/structure/machinery/prop/almayer/CICmap/yautja,
@@ -2817,6 +2841,24 @@
},
/turf/open/shuttle/predship,
/area/yautja)
+"SM" = (
+/obj/structure/surface/rack{
+ color = "#6b675e";
+ layer = 2.79
+ },
+/obj/item/hunting_trap,
+/obj/item/hunting_trap,
+/obj/item/hunting_trap,
+/obj/item/hunting_trap,
+/obj/item/hunting_trap,
+/obj/item/hunting_trap,
+/obj/item/hunting_trap,
+/obj/item/hunting_trap,
+/obj/structure/platform/kutjevo{
+ dir = 4
+ },
+/turf/open/floor/corsat/squareswood/north,
+/area/yautja)
"Ut" = (
/obj/structure/surface/rack{
color = "#6b675e";
@@ -2963,9 +3005,6 @@
/turf/open/shuttle/predship,
/area/yautja)
"Xs" = (
-/obj/structure/barricade/handrail/strata{
- dir = 1
- },
/obj/structure/barricade/handrail/strata{
dir = 4
},
@@ -4990,8 +5029,8 @@ aa
ae
bj
bN
-aC
-cP
+SM
+QK
bL
bj
bL
@@ -5006,9 +5045,9 @@ wQ
cP
bL
wQ
-rH
+Fy
bd
-rH
+Fy
wQ
bL
cP
@@ -5063,7 +5102,7 @@ ad
bj
ag
GP
-cP
+dS
bL
bj
bL
@@ -5134,8 +5173,8 @@ bj
bj
bj
ay
-ap
-cP
+og
+bZ
bL
bj
eS
@@ -5206,8 +5245,8 @@ aa
ac
bj
aA
-ap
-cP
+bh
+QK
bL
bj
nT
@@ -5227,7 +5266,7 @@ cP
bL
bL
bL
-bZ
+bL
JH
yr
bj
@@ -5277,9 +5316,9 @@ aa
aa
ad
bj
+ag
YM
-ap
-cP
+dS
bL
bj
fg
@@ -5291,7 +5330,7 @@ cP
bL
bj
JH
-ab
+bL
cI
bL
bL
@@ -5299,7 +5338,7 @@ cP
bL
bL
mv
-xO
+bL
JH
yr
bj
@@ -5351,7 +5390,7 @@ bj
bj
ah
ap
-cP
+bZ
bL
bj
bj
@@ -5364,13 +5403,13 @@ bj
bj
JH
bQ
+ab
cP
cP
cP
cP
cP
-cP
-cP
+xO
Dk
JH
yr
@@ -5422,7 +5461,7 @@ aa
ac
bj
ai
-ap
+ca
cP
bL
bL
@@ -5437,11 +5476,11 @@ JH
JH
bL
cP
+cP
bL
bL
bL
-bL
-bL
+cP
cP
bL
JH
@@ -5459,13 +5498,13 @@ bj
cP
bL
bL
-cP
+rH
cc
uf
uf
uf
wW
-cP
+Ip
bL
bL
bj
@@ -5494,8 +5533,8 @@ aa
ae
bj
aj
-ap
-cP
+iL
+QK
cP
cP
ar
@@ -5530,15 +5569,15 @@ cP
Wg
bL
bL
-cP
-QK
+rH
+ha
RS
ZI
Ok
Br
dw
ha
-cP
+Ip
bL
bL
ct
@@ -5565,9 +5604,9 @@ aa
aa
ae
bj
+ag
+GP
dS
-ap
-cP
bL
bL
ti
@@ -5602,22 +5641,22 @@ bL
bj
cK
cP
-cP
-ca
+rH
+fS
RS
Ok
GM
Ok
dw
fS
+Ip
cP
cP
-cP
-ti
+sx
JH
Rq
JH
-ti
+sx
cP
bL
bj
@@ -5639,7 +5678,7 @@ ae
bj
ak
ap
-cP
+bZ
cP
cP
ar
@@ -5674,15 +5713,15 @@ cP
Wg
bL
bL
-cP
+rH
hJ
RS
lw
Ok
nd
dw
+hJ
Ip
-cP
bL
bL
ct
@@ -5710,7 +5749,7 @@ aa
ad
bj
al
-ap
+ca
cP
bL
bL
@@ -5725,11 +5764,11 @@ JH
JH
bL
cP
+cP
bL
bL
bL
-bL
-bL
+cP
cP
bL
JH
@@ -5747,13 +5786,13 @@ bj
cP
bL
bL
-cP
+rH
Xs
zg
zg
zg
eg
-cP
+Ip
bL
bL
bj
@@ -5782,8 +5821,8 @@ bj
bj
bj
am
-ap
-cP
+iL
+QK
bL
bj
bj
@@ -5796,13 +5835,13 @@ bj
bj
JH
cd
+cz
cP
cP
cP
cP
cP
-cP
-cP
+Mb
Gk
JH
bL
@@ -5853,9 +5892,9 @@ aa
aa
ac
bj
+ag
YM
-ap
-cP
+dS
bL
bj
fg
@@ -5867,7 +5906,7 @@ cP
bL
bj
JH
-cz
+bL
kA
bL
bL
@@ -5875,7 +5914,7 @@ cP
bL
bL
uZ
-Mb
+bL
JH
bL
bj
@@ -5927,7 +5966,7 @@ ad
bj
ay
ap
-cP
+bZ
bL
bj
nT
@@ -5998,8 +6037,8 @@ bj
bj
bj
aA
-ap
-cP
+iL
+QK
bL
bj
ww
@@ -6071,7 +6110,7 @@ ac
bj
ag
GP
-cP
+dS
bL
bj
bL
@@ -6143,7 +6182,7 @@ ae
bj
bN
aC
-cP
+bZ
bL
bj
bL
@@ -6158,9 +6197,9 @@ cQ
cP
bL
cH
-ti
+sx
bd
-ti
+sx
uj
bL
cP
diff --git a/sound/effects/revive_notify.ogg b/sound/effects/revive_notify.ogg
deleted file mode 100644
index d155f345181c..000000000000
Binary files a/sound/effects/revive_notify.ogg and /dev/null differ