Missed mirrors (#28919)

Handful of missed mirrors (#3739)

* fix duplicate traits

* Adds a Contraband trait, and implements contraband as a mechanic to security bounties. (#84003)

This PR does a few things but centrally it's all centered around
mechanically enforcing what items are and are-not considered contraband
in-game.

Contraband items are visually indistinguishable from non-contraband. If
an item is Contraband, it can only be detected in two ways:
* After being scanned by an N-Spect scanner, which is a standard item
security item, assuming it still has a charge to do so.
* Via a scanner gate, which can now be upgraded with an N-spect scanner
to allow for it to scan a person and all their contents for contraband.

Contraband items are intended to be determined both logically and
through other relevant examine text. However, here's the short list of
items that are considered contraband, reserving the right to expand the
list.

<details>
  <summary>In hindsight it's kind of a long list.</summary>

* Items that have "contraband" or "illegal" in the name or description.
* Items that allow for the player to obtain other illegal items, that
are NOT particularly stealthy.
* This means that a syndicate uplink is NOT considered contraband, as
they're typically hidden on your person as something else.
* Stealth items under the syndicate uplink, the revolutionary flash, and
some mapped in dangerous items that can come from both syndicate and
company-aligned resources are not considered dangerous.
* Items that are purchased from cargo after emagging or switching to
extended cargo range.
* Items purchased FROM syndicate uplinks, the wizard knowledge scroll,
or other antagonist shops.
* Cursed artifacts/tools magically produced by cultists or heretics.
* Items purchased from the blackmarket.
* Items purchased from the contraband section of vending machines.
* Some drugs and overtly dangerous or criminal byproducts.

</details>

Well, primarily, this is an aid for in-game enforcement of space law.
Based on the length of the above list, we have a LONG, LONG list of
items in-game that are technically considered, in one way or another,
illegal to have on the station, and yet without either metaknowledge of
what those items are, or how they're used, security officers lack some
of the certainty of how to deal with these kinds of encounters.

Additionally to the knowledge aspect of this trait, security officers
may now receive a new civilian bounty to collect items that are
considered contraband, also giving them an incentive to look for and
confiscate contraband that's been found across the station while
upholding space law.

Security has a bounty for 3 different rechargers, and considering access
limitations, most security players aren't going to make this exchange,
so I've lowered the required amount down to 1.

Adjusted the N-spect scanner's description to match it's new
functionality.

The Civilian bounty TGUI now has an additional 1 point of padding to
make it feel less cramped.

https://github.com/tgstation/tgstation/assets/41715314/c3cd4752-b03a-4e0b-959e-1252fcc2369d

**Updated as of 6/19/2024:**
Additionally, some storage items will block the presence of contraband
when going through a contraband aligned scanning gate. These items
include the infiltrator modsuit core, storage implant, void cloak, the
aptly named smuggler's satchel, and the chameleon kit's backpack.

**Updated as of 6/23/2024:**
N-spect scanner now has contextual screentips.

**Updated as of 6/29/2024:**
Scanner gates are now available in all lathes that have a feature
specific to how scanner gates function. So, includes cargo (contraband),
security (weapons), and medbay (diseases).

Originally, this started out as a way to be able to provide more
in-character and in-flavor bounties for security officers, because they
suck! Most security bounties as they exist right now do the worst
possible things from all respective bounties:
* They detract away from a job's actual responsibilities as opposed to
working with them.
* They're best completed while sitting next to your lathe and running
items back to the bounty pad.
* They exist with such esoteric rarity of high quantity of items that
it's miserable to fulfil.

As a result, I started work on this as a framework to allow security
officers to be further incentivized to collect contraband across the
station, either as a result of the gamemode or just through routine
patrols across the station.

Implementing it as a learning tool for security as well just happened to
work out as an additional bonus, and having a function in-game allowing
newer or less experienced players to know if an item is considered
dangerous or conspicuous also works as a particularly good way to
provide information where a player may not know what they're up against.

If nothing else, this might be interesting to try, and if not, I'll just
snip out the QOL changes from it and we'll see how it goes.

Going forward, I am a bit hesitant about the contraband scanner gate
mode, and as such, will try working with the admin team to determine if
that's a good feature to keep around for game health, while hoping to
give it a chance in the fullness of time.

🆑
add: Items spawned via traitor uplinks or are known illegal contraband
on the station can now be scanned and identified as such by the N-spect
scanners in security. These only applies to overt traitor or antagonist
items, and "stealth" items will not be seen as such.
add: Scanner gates can now be upgraded by using an N-spect scanner on it
to unlock "contraband scanning" mode.
add: Security officers can now be offered a bounty to turn in pieces of
contraband.
add: Some stealthy storage items like storage implants, smuggler's
satchels, void cloaks, the infiltrator modsuit, and the chameleon
backpack will block the presence of contraband on your person when
placed inside.
qol: N-spect scanner contextual screentips.
balance: Recharger security bounties ask for a quantity of 1, down from
3.
qol: security, cargo, and medbay have access to scanner gate boards.
/🆑

---------



* Adds six new strange object powers! (#84775)

DESIGN CONCEPT: Strange Devices are at their best when they're odd tools
which can help a department out, with some strange drawbacks that make
them interesting and unique. Foam for the Janitor, Flashbang for
Security, Teleporter for tiders, Corgimaker for the chef. They're also
ambiguous enough that they can really be used by anyone for silly
hijinks.

Drink Dispenser: Creates a glass, then fills it up with a random drink.

Bioscrambler: After a noticeable warning, bioscrambles people nearby.
33% chance to be used up on use.

Recharger: Shocks you, but recharges one random item to max battery.

Hugger: Hugs everyone in range as if you had the friendly trait.

DImensional: Converts the surroundings to a random material-theme. Each
use increases cooldown by two seconds.

Disguiser: Drops your clothing to the ground and replaces it with a
delete-on-drop costume and a randomly assigned cardboard ID.

Removed an unused and unusable shock flag.

Removed an unused dumb ghost item.

Added a proc that returns a hex color with the # attached.

> DESIGN CONCEPT: Strange Devices are at their best when they're odd
tools which can help a department out, with some strange drawbacks that
make them interesting and unique. Foam for the Janitor, Flashbang for
Security, Teleporter for tiders, Corgimaker for the chef. They're also
ambiguous enough that they can really be used by anyone for silly
hijinks.

Request by ArcaneMusic! He wanted new abilities to go along with the new
sprites, and approved these.

> Removed an unused dumb ghost item.

please stop using costume subtypes for OP items. whats the damn point of
the subtype if youre just going to screw with it

> Added a proc that returns a hex color with the # attached.

idk why it didnt have this tbh

🆑
add: Adds six new strange object powers! Drink dispenser, bioscrambler,
recharger, hugger, dimensional, disguiser.
code: Removed some unused code and items, and added a proc that returns
a random #colorstring.
/🆑

* [NO GBP] the random spawner loot weight config is not an integer (#84814)

Sets `integer` to false.
Also a tidbit about the `skew_loot_weight` proc, though loot lists with
uneven weights all tend to add a value to all entries so it isn't an
issue.

The config isn't an integer.

N/A

* The techweb no longer erroneously refers to MODsuits as exosuits (#84800)

At some point, some of the techweb node descriptions were changed, so
that it referred to certain modsuits as exosuits. This just changes it
back.

The term "exosuit" is generally used for mechs, not modsuits. The
techweb descriptions should refer to modsuits as modsuits.
🆑
spellcheck: The techweb no longer erroneously refers to MODsuits as
exosuits.
/🆑

* Adds new hairstyle - Short Bangs 2 (#84804)

Adds a new hairstyle called Short Bangs 2.
The hairstyle is basically an edit of the existing double buns, except
the hair buns themselves are removed.

https://github.com/tgstation/tgstation/assets/66234359/38fe3b09-c42b-43e6-9e30-949428aab506

More customization, variety and character flavor is great. Double buns
itself is a good hairstyle but some may not like the hair buns out of
personal preference or that it can look weird on non-human species like
felinids.

🆑 Hardly3D
add: Added new hairstyle: Short Bangs 2
/🆑

* Offset render relays for non-offsetting planes to match highest matching render plane (#84184)

**Alternate title: "Fix blind people getting so blind they become deaf
when going down a flight of stairs"**

So 'bout half a week to a week ago I overheard a friend complaining
about blind people not seeing runechat on lower multi-z levels. Asked a
bit, apparently they'd reported this about half a year ago, and it's
still an issue.
So in my never-ending hubris I decided to just go and fix it!
Now, admittedly? I really _really_ do not get the rendering system we
use.
The simple options were right out: we can't allow the fullscreens plane
to be offset, as this causes issues with looking up/down, or disallow
runechat from being offset, which causes issues with runechat from other
levels.

After poking our very cool and smart rendering guy several times over
the course of the last week, this is what we got to:

We simply make the rendering relays for non-offsetting plane masters
point to the highest rendering plane that matches the target.
We do this by offsetting the rendering relays in place, by adjusting
their plane and layer values to match the new offset, with a new
`offset_relays_in_place(new_offset)` proc called in
`/datum/plane_master_group/proc/transform_lower_turfs(...)`.
Importantly, we compare the current layer values to what they should've
been, so we don't accidentally override relays with custom-set layers.

This fixes our issue (as tested on wawastation):
<details>
  <summary>Images</summary>

![image](https://github.com/tgstation/tgstation/assets/42909981/c6a10e04-dd08-4642-bc4d-d99ae5004a40)

![image](https://github.com/tgstation/tgstation/assets/42909981/740dc894-7495-4c35-b729-ffcc539ca928)

![image](https://github.com/tgstation/tgstation/assets/42909981/986433a7-e66e-408a-8e77-1f1eb89cb67c)

</details>

Fixes #80376.
🆑
fix: You can see runechat above fullscreen overlays on lower multi-z
levels again. Rejoice, blind players. Please report any weird rendering
layering issues.
/🆑

* illegal tech flag got changed

* Automatic changelog for PR #84003 [ci skip]

* Automatic changelog for PR #84775 [ci skip]

* Automatic changelog for PR #84800 [ci skip]

* Automatic changelog for PR #84804 [ci skip]

* Automatic changelog for PR #84184 [ci skip]

* Makes the smoking pipe sprite not give you a phantom stache. (#84898)

The smoking pipe currently gives you a phantom stache. Observe, note the
black background and know this character has no facial hair.

![image](https://github.com/tgstation/tgstation/assets/70115628/2939afa9-e4e4-4ee2-b38b-fc517e207d01)
I basically adjusted the pixels so it'd look better from different
directions.
This is the new look - approximately.

![image](https://github.com/tgstation/tgstation/assets/70115628/55e23d8e-2367-468a-94c2-9c5741f34762)
Smoking pipe is cool for RP but the sprite's fucked.
🆑
image: the smoking pipe's directional looks have been altered to make it
less ugly
/🆑

(cherry picked from commit c499c51bb3)

* Automatic changelog for PR #84898 [ci skip]

(cherry picked from commit 1e80a72dee)

* Revert "Automatic changelog for PR #84898 [ci skip]"

This reverts commit 1ddc7d43de30bb7ef029d1ddd39f86ded94e110c.

* Revert "Makes the smoking pipe sprite not give you a phantom stache. (#84898)"

This reverts commit b66b9d634e5f28e40e800586d4642468049767e6.

---------

Co-authored-by: FlufflesTheDog <piecopresident@gmail.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: carlarctg <53100513+carlarctg@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: GPeckman <21979502+GPeckman@users.noreply.github.com>
Co-authored-by: Hardly3D <66234359+Hardly3D@users.noreply.github.com>
Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com>
Co-authored-by: orange man <61334995+comfyorange@users.noreply.github.com>
Co-authored-by: NewyearnewmeUwu <70115628+NewyearnewmeUwu@users.noreply.github.com>
Co-authored-by: SomeRandomOwl <2568378+SomeRandomOwl@users.noreply.github.com>
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
This commit is contained in:
SpaceLoveSs13
2024-07-20 14:23:18 +05:30
committed by GitHub
co-authored by FlufflesTheDog MrMelbert carlarctg Ghom GPeckman Hardly3D _0Steven orange man NewyearnewmeUwu SomeRandomOwl Bloop
parent f87d978c78
commit fa2ab65f07
87 changed files with 715 additions and 111 deletions
+5
View File
@@ -314,6 +314,11 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list(
#define UPLINK_SHARED_STOCK_KITS "uplink_shared_stock_kits"
#define UPLINK_SHARED_STOCK_SURPLUS "uplink_shared_stock_surplus"
/// Does this item provide illegal tech?
#define SYNDIE_ILLEGAL_TECH (1 << 0)
/// Does this item go off when scanned by a contraband scanner?
#define SYNDIE_TRIPS_CONTRABAND (1 << 1)
// Used for traitor objectives
/// If the objective hasn't been taken yet
#define OBJECTIVE_STATE_INACTIVE 1
+1
View File
@@ -9,3 +9,4 @@
#define SHIPPING_METHOD_LAUNCH "Launch"
// Sends a supply pod to the buyer's location, showy.
#define SHIPPING_METHOD_SUPPLYPOD "Supply Pod"
+1
View File
@@ -10,6 +10,7 @@
#define CLOWN_INSPECTOR_PRINT_SOUND_MODE_LAST 4
#define INSPECTOR_ENERGY_USAGE_HONK (0.015 * STANDARD_CELL_CHARGE)
#define INSPECTOR_ENERGY_USAGE_NORMAL (0.005 * STANDARD_CELL_CHARGE)
#define INSPECTOR_ENERGY_USAGE_LOW (0.001 * STANDARD_CELL_CHARGE)
#define INSPECTOR_TIME_MODE_SLOW 1
#define INSPECTOR_TIME_MODE_FAST 2
#define INSPECTOR_TIME_MODE_HONK 3
+9
View File
@@ -321,6 +321,15 @@
#define PLANE_CRITICAL_FUCKO_PARALLAX (PLANE_CRITICAL_DISPLAY|PLANE_CRITICAL_NO_RELAY|PLANE_CRITICAL_CUT_RENDER)
//---------- Plane Master offsetting_flags -------------
// Describes how different plane masters behave regarding being offset
/// This plane master will not be offset itself, existing only once with an offset of 0
/// Mostly used for planes that really don't need to be duplicated, like the hud planes
#define BLOCKS_PLANE_OFFSETTING (1<<0)
/// This plane master will have its relays offset to match the highest rendering plane that matches the target
/// Required for making things like the blind fullscreen not render over runechat
#define OFFSET_RELAYS_MATCH_HIGHEST (1<<1)
/// A value of /datum/preference/numeric/multiz_performance that disables the option
#define MULTIZ_PERFORMANCE_DISABLE -1
/// We expect at most 3 layers of multiz
+6 -1
View File
@@ -770,6 +770,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_DANGEROUS_OBJECT "dangerous_object"
/// determines whether or not objects are haunted and teleport/attack randomly
#define TRAIT_HAUNTED "haunted"
/// An item that, if it has contents, will ignore it's contents when scanning for contraband.
#define TRAIT_CONTRABAND_BLOCKER "contraband_blocker"
//quirk traits
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
@@ -1164,7 +1166,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Trait which means whatever has this is dancing by a dance machine
#define TRAIT_DISCO_DANCER "disco_dancer"
/// That which allows mobs to instantly break down boulders.
/// Trait which allows mobs to instantly break down boulders.
#define TRAIT_INSTANTLY_PROCESSES_BOULDERS "instantly_processes_boulders"
/// Trait applied to objects and mobs that can attack a boulder and break it down. (See /obj/item/boulder/manual_process())
@@ -1183,6 +1185,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Does this item bypass ranged armor checks?
#define TRAIT_BYPASS_RANGED_ARMOR "bypass_ranged_armor"
/// Trait which means that this item is considered illegal contraband, and valid for the contraband bounty or when scanned by an nspect scanner.
#define TRAIT_CONTRABAND "illegal_contraband"
/// Traits given by settler, each with their own specific effects for cases where someone would have that trait, but not the other settler effects
#define TRAIT_EXPERT_FISHER "expert_fisher" // fishing is easier
+12
View File
@@ -33,6 +33,18 @@
processing += checked_atom.contents
. += checked_atom
///Returns the src and all recursive contents, but skipping going any deeper if an atom has a specific trait.
/atom/proc/get_all_contents_skipping_traits(skipped_trait)
. = list(src)
if(!skipped_trait)
CRASH("get_all_contents_skipping_traits called without a skipped_trait")
var/i = 0
while(i < length(.))
var/atom/checked_atom = .[++i]
if(HAS_TRAIT(checked_atom, skipped_trait))
continue
. += checked_atom.contents
///Returns a list of all locations (except the area) the movable is within.
/proc/get_nested_locs(atom/movable/atom_on_location, include_turf = FALSE)
. = list()
+10
View File
@@ -190,6 +190,16 @@
var/picked_reagent = pick(random_reagents)
return picked_reagent
///Returns a random reagent consumable ethanol object minus blacklisted reagents
/proc/get_random_drink_id()
var/static/list/random_drinks = list()
if(!random_drinks.len)
for(var/datum/reagent/drink_path as anything in subtypesof(/datum/reagent/consumable/ethanol))
if(initial(drink_path.chemical_flags) & REAGENT_CAN_BE_SYNTHESIZED)
random_drinks += drink_path
var/picked_drink = pick(random_drinks)
return picked_drink
///Returns reagent datum from reagent name string
/proc/get_chem_id(chem_name)
for(var/X in GLOB.chemical_reagents_list)
+3
View File
@@ -463,6 +463,9 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
/proc/random_color()
return random_string(6, GLOB.hex_characters)
/proc/ready_random_color()
return "#" + random_string(6, GLOB.hex_characters)
//merges non-null characters (3rd argument) from "from" into "into". Returns result
//e.g. into = "Hello World"
// from = "Seeya______"
+4 -4
View File
@@ -118,6 +118,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
// SKYRAT EDIT ADDITON END - Synthetic wounds
/obj = list(
"TRAIT_WALLMOUNTED" = TRAIT_WALLMOUNTED,
"TRAIT_CONTRABAND" = TRAIT_CONTRABAND,
),
/mob = list(
"TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING,
@@ -356,7 +357,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NO_EXTINGUISH" = TRAIT_NO_EXTINGUISH,
"TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM,
"TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE,
"TRAIT_NO_PLASMA_TRANSFORM" = TRAIT_NO_PLASMA_TRANSFORM,
"TRAIT_NO_GUN_AKIMBO" = TRAIT_NO_GUN_AKIMBO,
"TRAIT_NO_IMMOBILIZE" = TRAIT_NO_IMMOBILIZE,
"TRAIT_NO_JUMPSUIT" = TRAIT_NO_JUMPSUIT,
@@ -435,7 +435,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_ROD_SUPLEX" = TRAIT_ROD_SUPLEX,
"TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER,
"TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO,
"TRAIT_SACRIFICED" = TRAIT_SACRIFICED,
"TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD,
"TRAIT_SEE_WORN_COLOURS" = TRAIT_SEE_WORN_COLOURS,
"TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE,
@@ -534,9 +533,11 @@ GLOBAL_LIST_INIT(traits_by_type, list(
),
/obj/item = list(
"TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING,
"TRAIT_BAKEABLE" = TRAIT_BAKEABLE,
"TRAIT_BASIC_QUALITY_BAIT" = TRAIT_BASIC_QUALITY_BAIT,
"TRAIT_BLIND_TOOL" = TRAIT_BLIND_TOOL,
"TRAIT_BYPASS_RANGED_ARMOR" = TRAIT_BYPASS_RANGED_ARMOR,
"TRAIT_CONTRABAND_BLOCKER" = TRAIT_CONTRABAND_BLOCKER,
"TRAIT_CUSTOM_TAP_SOUND" = TRAIT_CUSTOM_TAP_SOUND,
"TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT,
"TRAIT_FISHING_BAIT" = TRAIT_FISHING_BAIT,
@@ -546,6 +547,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_HAUNTED" = TRAIT_HAUNTED,
"TRAIT_HONKSPAMMING" = TRAIT_HONKSPAMMING,
"TRAIT_INNATELY_FANTASTICAL_ITEM" = TRAIT_INNATELY_FANTASTICAL_ITEM,
"TRAIT_INSTANTLY_PROCESSES_BOULDERS" = TRAIT_INSTANTLY_PROCESSES_BOULDERS,
"TRAIT_ITEM_OBJECTIVE_BLOCKED" = TRAIT_ITEM_OBJECTIVE_BLOCKED,
"TRAIT_NEEDS_TWO_HANDS" = TRAIT_NEEDS_TWO_HANDS,
"TRAIT_NO_BARCODES" = TRAIT_NO_BARCODES,
@@ -559,8 +561,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_TRANSFORM_ACTIVE" = TRAIT_TRANSFORM_ACTIVE,
"TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE,
"TRAIT_WIELDED" = TRAIT_WIELDED,
"TRAIT_BAKEABLE" = TRAIT_BAKEABLE,
"TRAIT_INSTANTLY_PROCESSES_BOULDERS" = TRAIT_INSTANTLY_PROCESSES_BOULDERS,
),
/obj/item/ammo_casing = list(
"TRAIT_DART_HAS_INSERT" = TRAIT_DART_HAS_INSERT,
+4 -5
View File
@@ -210,7 +210,7 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(
for(var/group_key as anything in master_groups)
var/datum/plane_master_group/group = master_groups[group_key]
group.transform_lower_turfs(src, current_plane_offset)
group.build_planes_offset(src, current_plane_offset)
/datum/hud/proc/should_use_scale()
return should_sight_scale(mymob.sight)
@@ -229,10 +229,9 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(
current_plane_offset = new_offset
SEND_SIGNAL(src, COMSIG_HUD_OFFSET_CHANGED, old_offset, new_offset)
if(should_use_scale())
for(var/group_key as anything in master_groups)
var/datum/plane_master_group/group = master_groups[group_key]
group.transform_lower_turfs(src, new_offset)
for(var/group_key as anything in master_groups)
var/datum/plane_master_group/group = master_groups[group_key]
group.build_planes_offset(src, new_offset)
/datum/hud/Destroy()
if(mymob.hud_used == src)
@@ -45,7 +45,7 @@
our_hud = viewing_hud
our_hud.master_groups[key] = src
show_hud()
transform_lower_turfs(our_hud, active_offset)
build_planes_offset(our_hud, active_offset)
/// Hide the plane master from its current hud, fully clear it out
/datum/plane_master_group/proc/orphan_hud()
@@ -64,7 +64,7 @@
hide_hud()
rebuild_plane_masters()
show_hud()
transform_lower_turfs(our_hud, active_offset)
build_planes_offset(our_hud, active_offset)
/// Regenerate our plane masters, this is useful if we don't have a mob but still want to rebuild. Such in the case of changing the screen_loc of relays
/datum/plane_master_group/proc/rebuild_plane_masters()
@@ -97,7 +97,7 @@
/datum/plane_master_group/proc/build_plane_masters(starting_offset, ending_offset)
for(var/atom/movable/screen/plane_master/mytype as anything in get_plane_types())
for(var/plane_offset in starting_offset to ending_offset)
if(plane_offset != 0 && !initial(mytype.allows_offsetting))
if(plane_offset != 0 && (initial(mytype.offsetting_flags) & BLOCKS_PLANE_OFFSETTING))
continue
var/atom/movable/screen/plane_master/instance = new mytype(null, null, src, plane_offset)
plane_masters["[instance.plane]"] = instance
@@ -110,7 +110,7 @@
// It would be nice to setup parallaxing for stairs and things when doing this
// So they look nicer. if you can't it's all good, if you think you can sanely look at monster's work
// It's hard, and potentially expensive. be careful
/datum/plane_master_group/proc/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE)
/datum/plane_master_group/proc/build_planes_offset(datum/hud/source, new_offset, use_scale = TRUE)
// Check if this feature is disabled for the client, in which case don't use scale.
var/mob/our_mob = our_hud?.mymob
if(!our_mob?.client?.prefs?.read_preference(/datum/preference/toggle/multiz_parallax))
@@ -158,7 +158,11 @@
for(var/plane_key in plane_masters)
var/atom/movable/screen/plane_master/plane = plane_masters[plane_key]
if(!plane.allows_offsetting)
if(plane.offsetting_flags & BLOCKS_PLANE_OFFSETTING)
if(plane.offsetting_flags & OFFSET_RELAYS_MATCH_HIGHEST)
// Don't offset the plane, do offset where the relays point
// Required for making things like the blind fullscreen not render over runechat
plane.offset_relays_in_place(new_offset)
continue
var/visual_offset = plane.offset - new_offset
@@ -199,13 +203,13 @@
#undef MAX_CLIENT_BUILD_WITH_WORKING_SECONDARY_MAPS
/datum/plane_master_group/popup/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE)
/datum/plane_master_group/popup/build_planes_offset(datum/hud/source, new_offset, use_scale = TRUE)
return ..(source, new_offset, FALSE)
/// Holds the main plane master
/datum/plane_master_group/main
/datum/plane_master_group/main/transform_lower_turfs(datum/hud/source, new_offset, use_scale = TRUE)
/datum/plane_master_group/main/build_planes_offset(datum/hud/source, new_offset, use_scale = TRUE)
if(use_scale)
return ..(source, new_offset, source.should_use_scale())
return ..()
@@ -20,9 +20,9 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/plane_master)
/// The plane master group we're a member of, our "home"
var/datum/plane_master_group/home
/// If our plane master allows for offsetting
/// Mostly used for planes that really don't need to be duplicated, like the hud planes
var/allows_offsetting = TRUE
/// If our plane master has different offsetting logic
/// Possible flags are defined in [_DEFINES/layers.dm]
var/offsetting_flags = NONE
/// Our offset from our "true" plane, see below
var/offset
/// When rendering multiz, lower levels get their own set of plane masters
@@ -7,7 +7,7 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
render_relay_planes = list()
// We do NOT allow offsetting, because there's no case where you would want to block only one layer, at least currently
allows_offsetting = FALSE
offsetting_flags = BLOCKS_PLANE_OFFSETTING
// We mark as multiz_scaled FALSE so transforms don't effect us, and we draw to the planes below us as if they were us.
// This is safe because we will ALWAYS be on the top z layer, so it DON'T MATTER
multiz_scaled = FALSE
@@ -368,7 +368,7 @@
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR
render_relay_planes = list(RENDER_PLANE_NON_GAME)
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
allows_offsetting = FALSE
offsetting_flags = BLOCKS_PLANE_OFFSETTING|OFFSET_RELAYS_MATCH_HIGHEST
/atom/movable/screen/plane_master/runechat
name = "Runechat"
@@ -397,7 +397,7 @@
plane = HUD_PLANE
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR
render_relay_planes = list(RENDER_PLANE_NON_GAME)
allows_offsetting = FALSE
offsetting_flags = BLOCKS_PLANE_OFFSETTING|OFFSET_RELAYS_MATCH_HIGHEST
/atom/movable/screen/plane_master/above_hud
name = "Above HUD"
@@ -405,7 +405,7 @@
plane = ABOVE_HUD_PLANE
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR
render_relay_planes = list(RENDER_PLANE_NON_GAME)
allows_offsetting = FALSE
offsetting_flags = BLOCKS_PLANE_OFFSETTING|OFFSET_RELAYS_MATCH_HIGHEST
/atom/movable/screen/plane_master/splashscreen
name = "Splashscreen"
@@ -413,7 +413,7 @@
plane = SPLASHSCREEN_PLANE
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR
render_relay_planes = list(RENDER_PLANE_NON_GAME)
allows_offsetting = FALSE
offsetting_flags = BLOCKS_PLANE_OFFSETTING|OFFSET_RELAYS_MATCH_HIGHEST
/atom/movable/screen/plane_master/escape_menu
name = "Escape Menu"
@@ -421,4 +421,4 @@
plane = ESCAPE_MENU_PLANE
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR
render_relay_planes = list(RENDER_PLANE_MASTER)
allows_offsetting = FALSE
offsetting_flags = BLOCKS_PLANE_OFFSETTING|OFFSET_RELAYS_MATCH_HIGHEST
@@ -457,6 +457,8 @@
// That's what this is for
if(show_to)
show_to.screen += relay
if(offsetting_flags & OFFSET_RELAYS_MATCH_HIGHEST && home.our_hud)
offset_relay(relay, home.our_hud.current_plane_offset)
return relay
/// Breaks a connection between this plane master, and the passed in place
@@ -479,3 +481,40 @@
return relay
return null
/**
* Offsets our relays in place using the given parameter by adjusting their plane and
* layer values, avoiding changing the layer for relays with custom-set layers.
*
* Used in [proc/build_planes_offset] to make the relays for non-offsetting planes
* match the highest rendering plane that matches the target, to avoid them rendering
* on the highest level above things that should be visible.
*
* Parameters:
* - new_offset: the offset we will adjust our relays to
*/
/atom/movable/screen/plane_master/proc/offset_relays_in_place(new_offset)
for(var/atom/movable/render_plane_relay/rpr in relays)
offset_relay(rpr, new_offset)
/**
* Offsets a given render relay using the given parameter by adjusting its plane and
* layer values, avoiding changing the layer if it has a custom-set layer.
*
* Parameters:
* - rpr: the render plane relay we will offset
* - new_offset: the offset we will adjust it by
*/
/atom/movable/screen/plane_master/proc/offset_relay(atom/movable/render_plane_relay/rpr, new_offset)
var/base_relay_plane = PLANE_TO_TRUE(rpr.plane)
var/old_offset = PLANE_TO_OFFSET(rpr.plane)
rpr.plane = GET_NEW_PLANE(base_relay_plane, new_offset)
var/old_offset_plane = real_plane - (PLANE_RANGE * old_offset)
var/old_layer = (old_offset_plane + abs(LOWEST_EVER_PLANE * 30))
if(rpr.layer != old_layer) // Avoid overriding custom-set layers
return
var/offset_plane = real_plane - (PLANE_RANGE * new_offset)
var/new_layer = (offset_plane + abs(LOWEST_EVER_PLANE * 30))
rpr.layer = new_layer
@@ -471,5 +471,6 @@
* If higher than 1, it'll lean toward common spawns even more.
*/
/datum/config_entry/number/random_loot_weight_modifier
integer = FALSE
default = 1
min_val = 0.05
+3 -1
View File
@@ -79,7 +79,7 @@ SUBSYSTEM_DEF(blackmarket)
to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting that the order is being teleported to [get_area(targetturf)] in 60 seconds."))
// do_teleport does not want to teleport items from nullspace, so it just forceMoves and does sparks.
addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/controller/subsystem/blackmarket,fake_teleport), purchase, targetturf), 60 SECONDS)
addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/controller/subsystem/blackmarket, fake_teleport), purchase, targetturf), 60 SECONDS)
// Get the current location of the uplink if it exists, then throws the item from space at the station from a random direction.
if(SHIPPING_METHOD_LAUNCH)
@@ -88,6 +88,7 @@ SUBSYSTEM_DEF(blackmarket)
var/pickedloc = spaceDebrisStartLoc(startSide, T.z)
var/atom/movable/item = purchase.entry.spawn_item(pickedloc, purchase)
purchase.post_purchase_effects(item)
item.throw_at(purchase.uplink, 3, 3, spin = FALSE)
to_chat(buyer, span_notice("[purchase.uplink] flashes a message noting the order is being launched at the station from [dir2text(startSide)]."))
@@ -110,6 +111,7 @@ SUBSYSTEM_DEF(blackmarket)
if(QDELETED(purchase))
return
var/atom/movable/thing = purchase.entry.spawn_item(target, purchase)
purchase.post_purchase_effects(thing)
var/datum/effect_system/spark_spread/sparks = new
sparks.set_up(5, 1, target)
sparks.attach(thing)
+1 -1
View File
@@ -898,7 +898,7 @@ ADMIN_VERB(load_away_mission, R_FUN, "Load Away Mission", "Load a specific away
var/offset_plane = GET_NEW_PLANE(plane_to_use, plane_offset)
var/string_plane = "[offset_plane]"
if(!initial(master_type.allows_offsetting))
if(initial(master_type.offsetting_flags) & BLOCKS_PLANE_OFFSETTING)
plane_offset_blacklist[string_plane] = TRUE
var/render_target = initial(master_type.render_target)
if(!render_target)
+4
View File
@@ -661,6 +661,10 @@
name = "Short Bangs"
icon_state = "hair_shortbangs"
/datum/sprite_accessory/hair/shortbangs2
name = "Short Bangs 2"
icon_state = "hair_shortbangs2"
/datum/sprite_accessory/hair/short
name = "Short Hair"
icon_state = "hair_a"
@@ -5,6 +5,7 @@
#define SCANGATE_WANTED "Wanted"
#define SCANGATE_SPECIES "Species"
#define SCANGATE_NUTRITION "Nutrition"
#define SCANGATE_CONTRABAND "Contraband"
#define SCANGATE_HUMAN "human"
#define SCANGATE_LIZARD "lizard"
@@ -45,7 +46,7 @@
var/next_beep = 0
///Bool to check if the scanner's controls are locked by an ID.
var/locked = FALSE
///Which setting is the scanner checking for? See defines in scan_gate.dm for the list.
///Which setting is the scanner checking for? See defines in scanner_gate.dm for the list.
var/scangate_mode = SCANGATE_NONE
///Is searching for a disease, what severity is enough to trigger the gate?
var/disease_threshold = DISEASE_SEVERITY_MINOR
@@ -62,6 +63,8 @@
///Does the scanner ignore light_pass and light_fail for sending signals?
var/ignore_signals = FALSE
var/detect_gender = "male" //SKYRAT EDIT - MORE SCANNER GATE OPTIONS
///Is an n-spect scanner attached to the gate? Enables contraband scanning.
var/obj/item/inspector/n_spect = null
/obj/machinery/scanner_gate/Initialize(mapload)
@@ -72,18 +75,37 @@
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
register_context()
/obj/machinery/scanner_gate/Destroy()
qdel(wires)
set_wires(null)
. = ..()
/obj/machinery/scanner_gate/atom_deconstruct(disassembled)
. = ..()
if(n_spect)
n_spect.forceMove(drop_location())
n_spect = null
/obj/machinery/scanner_gate/examine(mob/user)
. = ..()
if(locked)
. += span_notice("The control panel is ID-locked. Swipe a valid ID to unlock it.")
else
. += span_notice("The control panel is unlocked. Swipe an ID to lock it.")
if(n_spect)
. += span_notice("The scanner is equipped with an N-Spect scanner. Use a [span_boldnotice("crowbar")] to uninstall.")
/obj/machinery/scanner_gate/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
if(n_spect && held_item?.tool_behaviour == TOOL_CROWBAR)
context[SCREENTIP_CONTEXT_LMB] = "Remove N-Spect scanner"
return CONTEXTUAL_SCREENTIP_SET
if(!n_spect && istype(held_item, /obj/item/inspector))
context[SCREENTIP_CONTEXT_LMB] = "Install N-Spect scanner"
return CONTEXTUAL_SCREENTIP_SET
/obj/machinery/scanner_gate/proc/on_entered(datum/source, atom/movable/AM)
SIGNAL_HANDLER
@@ -100,6 +122,19 @@
if(duration)
scanline_timer = addtimer(CALLBACK(src, PROC_REF(set_scanline), "passive"), duration, TIMER_STOPPABLE)
/obj/machinery/scanner_gate/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(istype(tool, /obj/item/inspector))
if(n_spect)
to_chat(user, span_warning("The scanner is already equipped with an N-Spect scanner."))
return ITEM_INTERACT_BLOCKING
else
to_chat(user, span_notice("You install an N-Spect scanner on [src]."))
n_spect = tool
if(!user.transferItemToLoc(tool, src))
return ITEM_INTERACT_BLOCKING
return ITEM_INTERACT_SUCCESS
return NONE
/obj/machinery/scanner_gate/attackby(obj/item/W, mob/user, params)
var/obj/item/card/id/card = W.GetID()
if(card)
@@ -122,6 +157,20 @@
wires.interact(user)
return ..()
/obj/machinery/scanner_gate/crowbar_act(mob/living/user, obj/item/tool)
. = ..()
if(n_spect)
to_chat(user, span_notice("You uninstall [n_spect] from [src]."))
n_spect.forceMove(drop_location())
return ITEM_INTERACT_SUCCESS
/obj/machinery/scanner_gate/Exited(atom/gone)
. = ..()
if(gone == n_spect)
n_spect = null
if(scangate_mode == SCANGATE_CONTRABAND)
scangate_mode = SCANGATE_NONE
/obj/machinery/scanner_gate/emag_act(mob/user, obj/item/card/emag/emag_card)
if(obj_flags & EMAGGED)
return FALSE
@@ -226,6 +275,13 @@
if(scanned_human.gender == detect_gender)
beep = TRUE
//SKYRAT EDIT END - MORE SCANNER GATE OPTIONS
if(SCANGATE_CONTRABAND)
for(var/obj/item/content in M.get_all_contents_skipping_traits(TRAIT_CONTRABAND_BLOCKER))
if(content.is_contraband())
beep = TRUE
break
if(!n_spect.scans_correctly)
beep = !beep //We do a little trolling
if(reverse)
beep = !beep
@@ -274,6 +330,7 @@
data["target_species"] = detect_species
data["target_nutrition"] = detect_nutrition
data["target_gender"] = detect_gender //SKYRAT EDIT - MORE SCANNER GATE OPTIONS
data["contraband_enabled"] = !!n_spect
return data
/obj/machinery/scanner_gate/ui_act(action, params)
@@ -338,6 +395,7 @@
#undef SCANGATE_WANTED
#undef SCANGATE_SPECIES
#undef SCANGATE_NUTRITION
#undef SCANGATE_CONTRABAND
#undef SCANGATE_HUMAN
#undef SCANGATE_LIZARD
@@ -88,11 +88,15 @@
pixel_y = -16
duration = 0.5 SECONDS
color = COLOR_LIME
var/max_alpha = 255
/obj/effect/temp_visual/bioscrambler_wave/Initialize(mapload)
transform = matrix().Scale(0.1)
animate(src, transform = matrix().Scale(2), time = duration, flags = ANIMATION_PARALLEL)
animate(src, alpha = 255, time = duration * 0.6, flags = ANIMATION_PARALLEL)
animate(src, alpha = max_alpha, time = duration * 0.6, flags = ANIMATION_PARALLEL)
animate(alpha = 0, time = duration * 0.4)
apply_wibbly_filters(src)
return ..()
/obj/effect/temp_visual/bioscrambler_wave/light
max_alpha = 128
@@ -4,6 +4,10 @@
poster_type = /obj/structure/sign/poster/contraband/random
icon_state = "rolled_poster"
/obj/item/poster/random_contraband/Initialize(mapload, obj/structure/sign/poster/new_poster_structure)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/structure/sign/poster/contraband
poster_item_name = "contraband poster"
poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities."
@@ -25,6 +25,12 @@
/obj/item/reagent_containers/pill/maintenance = 5,
)
/obj/effect/spawner/random/contraband/make_item(spawn_loc, type_path_to_make)
var/obj/item/made = ..()
ADD_TRAIT(made, TRAIT_CONTRABAND, INNATE_TRAIT)
return made
/obj/effect/spawner/random/contraband/plus
name = "contraband loot spawner plus"
desc = "Where'd ya find this?"
@@ -103,7 +103,7 @@
var/loot_weight = loot_list[loot_type]
if(loot_weight <= 1)
if(exponent < 1)
loot_list[loot_type] *= precision
loot_list[loot_type] = precision
continue
loot_list[loot_type] = round(loot_weight ** exponent * precision, 1)
+14
View File
@@ -1829,6 +1829,20 @@
SEND_SIGNAL(loc, COMSIG_ATOM_CONTENTS_WEIGHT_CLASS_CHANGED, src, old_w_class, new_w_class)
return TRUE
/**
* Used to determine if an item should be considered contraband by N-spect scanners or scanner gates.
* Returns true when an item has the contraband trait, or is included in the traitor uplink.
*/
/obj/item/proc/is_contraband()
if(HAS_TRAIT(src, TRAIT_CONTRABAND))
return TRUE
for(var/datum/uplink_item/traitor_item as anything in SStraitor.uplink_items)
if(istype(src, traitor_item.item))
if(!(traitor_item.uplink_item_flags & SYNDIE_TRIPS_CONTRABAND))
return FALSE
return TRUE
return FALSE
/// Fetches embedding data
/obj/item/proc/get_embed()
RETURN_TYPE(/datum/embed_data)
+9
View File
@@ -18,6 +18,10 @@
icon_state = "saturnx_glob" //tell kryson to sprite two more variants in the future.
food_reagents = list(/datum/reagent/drug/saturnx = 10)
/obj/item/food/drug/saturnx/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/item/food/drug/moon_rock
name = "moon rock"
desc = "A small hard lump of kronkaine freebase.\nIt is said the average kronkaine addict causes as much criminal damage as four cat burglars, two arsonists and one rabid pit bull terrier combined."
@@ -28,6 +32,7 @@
. = ..()
icon_state = pick("moon_rock1", "moon_rock2", "moon_rock3")
AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOONICORN, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/item/reagent_containers/cup/blastoff_ampoule
name = "bLaSToFF ampoule" //stylized name
@@ -70,3 +75,7 @@
SplashReagents(hit_atom, TRUE)
qdel(src)
hit_atom.Bumped(ampoule_shard)
/obj/item/reagent_containers/cup/blastoff_ampoule/Initialize(mapload, vol)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
@@ -36,7 +36,7 @@
return TRUE
return FALSE
create_storage(storage_type = /datum/storage/implant)
ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT)
return ..()
/obj/item/implanter/storage
+54 -1
View File
@@ -8,7 +8,7 @@
*/
/obj/item/inspector
name = "\improper N-spect scanner"
desc = "Central Command-issued inspection device. Performs inspections according to Nanotrasen protocols when activated, then prints an encrypted report regarding the maintenance of the station. Definitely not giving you cancer."
desc = "Central Command standard issue inspection device. Can perform either wide area scans that central command can use to verify the security of the station, or detailed scans to determine if an item is contraband."
icon = 'icons/obj/devices/scanner.dmi'
icon_state = "inspector"
worn_icon_state = "salestagger"
@@ -32,11 +32,15 @@
var/cell_cover_open = FALSE
///Energy used per print.
var/energy_per_print = INSPECTOR_ENERGY_USAGE_NORMAL
///Does this item scan for contraband correctly? If not, will provide a flipped response.
var/scans_correctly = TRUE
/obj/item/inspector/Initialize(mapload)
. = ..()
if(ispath(cell))
cell = new cell(src)
register_context()
register_item_context()
// Clean up the cell on destroy
/obj/item/inspector/Exited(atom/movable/gone, direction)
@@ -93,6 +97,54 @@
else
. += "\The [cell] is firmly in place. [span_info("Ctrl-click with an empty hand to remove it.")]"
/obj/item/inspector/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!user.Adjacent(interacting_with))
return ITEM_INTERACT_BLOCKING
if(cell_cover_open)
balloon_alert(user, "close cover first!")
return ITEM_INTERACT_BLOCKING
if(!cell || !cell.use(INSPECTOR_ENERGY_USAGE_LOW))
balloon_alert(user, "check cell!")
return ITEM_INTERACT_BLOCKING
if(!isitem(interacting_with))
return ITEM_INTERACT_BLOCKING
var/obj/item/contraband_item = interacting_with
var/contraband_status = contraband_item.is_contraband()
if((!contraband_status && scans_correctly) || (contraband_status && !scans_correctly))
playsound(src, 'sound/machines/ping.ogg', 20)
balloon_alert(user, "clear")
return ITEM_INTERACT_SUCCESS
playsound(src, 'sound/machines/uplinkerror.ogg', 40)
balloon_alert(user, "contraband detected!")
return ITEM_INTERACT_SUCCESS
/obj/item/inspector/add_context(atom/source, list/context, obj/item/held_item, mob/user)
var/update_context = FALSE
if(cell_cover_open && cell)
context[SCREENTIP_CONTEXT_CTRL_LMB] = "Remove cell"
update_context = TRUE
if(cell_cover_open && !cell && istype(held_item, /obj/item/stock_parts/power_store/cell))
context[SCREENTIP_CONTEXT_LMB] = "Install cell"
update_context = TRUE
if(held_item?.tool_behaviour == TOOL_CROWBAR)
context[SCREENTIP_CONTEXT_LMB] = "[cell_cover_open ? "close" : "open"] battery panel"
update_context = TRUE
if(update_context)
return CONTEXTUAL_SCREENTIP_SET
return NONE
/obj/item/inspector/add_item_context(obj/item/source, list/context, atom/target, mob/living/user)
if(cell_cover_open || !cell)
return NONE
if(isitem(target))
context[SCREENTIP_CONTEXT_LMB] = "Contraband Scan"
return CONTEXTUAL_SCREENTIP_SET
return NONE
/**
* Create our report
*
@@ -178,6 +230,7 @@
* Can be crafted into a bananium HONK-spect scanner
*/
/obj/item/inspector/clown
scans_correctly = FALSE
///will only cycle through modes with numbers lower than this
var/max_mode = CLOWN_INSPECTOR_PRINT_SOUND_MODE_LAST
///names of modes, ordered first to last
@@ -8,6 +8,9 @@
icon = 'icons/obj/devices/circuitry_n_data.dmi'
icon_state = "datadisk3"
/obj/item/malf_upgrade/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/item/malf_upgrade/pre_attack(atom/A, mob/living/user, proximity)
if(!proximity)
@@ -37,6 +40,10 @@
icon = 'icons/obj/devices/circuitry_n_data.dmi'
icon_state = "datadisk3"
/obj/item/surveillance_upgrade/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/item/surveillance_upgrade/pre_attack(atom/A, mob/living/user, proximity)
if(!proximity)
return ..()
@@ -213,6 +213,10 @@
icon_state = "cyborg_upgrade3"
require_model = TRUE
/obj/item/borg/upgrade/syndicate/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/borg, mob/living/user = usr)
. = ..()
if(!.)
+4
View File
@@ -174,6 +174,10 @@
icon_state = "synd"
contraband = TRUE
/obj/item/sticker/syndicate/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/item/sticker/syndicate/c4
name = "C-4 sticker"
icon_state = "c4"
@@ -387,6 +387,7 @@
AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE, INVISIBILITY_MAXIMUM, use_anchor = TRUE) // SKYRAT EDIT - Ghosts can't see smuggler's satchels
atom_storage.max_total_storage = 15
atom_storage.set_holdable(cant_hold_list = /obj/item/storage/backpack/satchel/flat) //muh recursive backpacks
ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT)
/obj/item/storage/backpack/satchel/flat/PopulateContents()
for(var/items in 1 to 4)
@@ -85,6 +85,7 @@ Striking a noncultist, however, will tear their flesh."}
speed = 4 SECONDS, \
effectiveness = 100, \
)
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/item/melee/cultblade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
if(IS_CULTIST(owner) && prob(final_block_chance))
@@ -658,6 +659,10 @@ Striking a noncultist, however, will tear their flesh."}
righthand_file = 'icons/mob/inhands/items/drinks_righthand.dmi'
list_reagents = list(/datum/reagent/fuel/unholywater = 50)
/obj/item/reagent_containers/cup/beaker/unholywater/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
///how many times can the shuttle be cursed?
#define MAX_SHUTTLE_CURSES 3
///if the max number of shuttle curses are used within this duration, the entire cult gets an achievement
@@ -131,6 +131,7 @@
COOLDOWN_START(src, use_cooldown, use_cooldown_duration)
for(var/item_to_make in spawned_items)
var/obj/item/made_item = new item_to_make(get_turf(src))
ADD_TRAIT(made_item, TRAIT_CONTRABAND, INNATE_TRAIT)
succcess_message(user, made_item)
@@ -151,7 +151,8 @@
///Attempts to make a new item and put it in a potential inventory slot in the provided mob.
/datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
var/item = new item_path(mob)
var/obj/item = new item_path(mob)
ADD_TRAIT(item, TRAIT_CONTRABAND, INNATE_TRAIT)
var/where = mob.equip_conspicuous_item(item)
if(!where)
to_chat(mob, span_userdanger("Unfortunately, you weren't able to get [item]. This is very bad and you should adminhelp immediately (press F1)."))
@@ -155,7 +155,9 @@
return FALSE
for(var/result in result_atoms)
new result(loc)
var/atom/result_item = new result(loc)
if(isitem(result_item))
ADD_TRAIT(result_item, TRAIT_CONTRABAND, INNATE_TRAIT)
return TRUE
/**
@@ -97,6 +97,7 @@
. = ..()
create_storage(storage_type = /datum/storage/pockets/void_cloak)
make_visible()
ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT)
/obj/item/clothing/suit/hooded/cultrobes/void/equipped(mob/user, slot)
. = ..()
@@ -215,6 +215,11 @@
log_spellbook("[key_name(user)] bought [src] for [cost] points")
SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name)
log_purchase(user.key)
ADD_TRAIT(spawned_path, TRAIT_CONTRABAND, INNATE_TRAIT)
for(var/obj/contained as anything in spawned_path.contents)
ADD_TRAIT(contained, TRAIT_CONTRABAND, INNATE_TRAIT)
try_equip_item(user, spawned_path)
return spawned_path
+13 -3
View File
@@ -1,8 +1,8 @@
/datum/bounty/item/security/recharger
name = "Rechargers"
description = "Nanotrasen military academy is conducting marksmanship exercises. They request that rechargers be shipped."
name = "Weapon Recharger"
description = "Nanotrasen military academy is conducting marksmanship exercises. They request that a recharger be shipped."
reward = CARGO_CRATE_VALUE * 4
required_count = 3
required_count = 1
wanted_types = list(/obj/machinery/recharger = TRUE)
/datum/bounty/item/security/pepperspray
@@ -81,3 +81,13 @@
if(istype(slip.scanned_area, demanded_area))
return TRUE
return FALSE
/datum/bounty/item/security/contraband
name = "Confiscated Contraband"
description = "The syndicate are constantly acting to subvert crewmates of Nanotrasen afilliated stations. Ship us your latest batch of confiscated contraband."
reward = CARGO_CRATE_VALUE * 4
required_count = 5
wanted_types = list(/obj/item = TRUE)
/datum/bounty/item/security/contraband/applies_to(obj/O)
return HAS_TRAIT(O, TRAIT_CONTRABAND)
+13 -2
View File
@@ -10,6 +10,8 @@
var/list/available_items = list()
/// Item categories available from this market, only items which are in these categories can be gotten from this market. Automatically assigned, so don't manually adjust.
var/list/categories = list()
/// Are the items from this market legal or illegal? If illegal, apply a contrband trait to the bought object.
var/legal_status = TRUE
/// Adds item to the available items and add it's category if it is not in categories yet.
/datum/market/proc/add_item(datum/market_item/item)
@@ -30,7 +32,15 @@
if(!length(available_items[item.category]))
available_items -= item.category
/// Handles buying the item, this is mainly for future use and moving the code away from the uplink.
/**
* Handles buying the item for a market.
*
* @param identifier The identifier of the item to buy.
* @param category The category of the item to buy.
* @param method The shipping method to use to get the item on the station.
* @param uplink The uplink object that is buying the item.
* @param user The mob that is buying the item.
*/
/datum/market/proc/purchase(identifier, category, method, obj/item/market_uplink/uplink, user)
var/datum/market_item/item = available_items[category][identifier]
if(isnull(item))
@@ -54,7 +64,7 @@
to_chat(user, span_warning("You don't have enough credits in [uplink] for [item] with [method] shipping."))
return FALSE
if(item.buy(uplink, user, method))
if(item.buy(uplink, user, method, legal_status))
uplink.current_user.adjust_money(-price, "Other: Third Party Transaction")
if(ismob(user))
var/mob/m_user = user
@@ -70,3 +80,4 @@
SHIPPING_METHOD_LAUNCH = 10,
SHIPPING_METHOD_TELEPORT= 75,
)
legal_status = FALSE
+25 -4
View File
@@ -81,8 +81,15 @@
return new item(loc)
CRASH("Invalid item type for market item [item || "null"]")
/// Buys the item and makes SSblackmarket handle it.
/datum/market_item/proc/buy(obj/item/market_uplink/uplink, mob/buyer, shipping_method)
/**
* Buys the item and makes SSblackmarket handle it.
*
* @param uplink The uplink that is buying the item.
* @param buyer The mob that is buying the item.
* @param shipping_method The shipping method used to get the market item onto the station.
* @param legal_status The legal status of the market. Determines if the item to be spawned is contraband.
*/
/datum/market_item/proc/buy(obj/item/market_uplink/uplink, mob/buyer, shipping_method, legal_status)
SHOULD_CALL_PARENT(TRUE)
// Sanity
if(!istype(uplink) || !istype(buyer))
@@ -93,7 +100,7 @@
return FALSE
// Alright, the item has been purchased.
var/datum/market_purchase/purchase = new(src, uplink, shipping_method)
var/datum/market_purchase/purchase = new(src, uplink, shipping_method, legal_status)
// SSblackmarket takes care of the shipping.
if(SSblackmarket.queue_item(purchase))
@@ -102,6 +109,7 @@
return TRUE
return FALSE
// This exists because it is easier to keep track of all the vars this way.
/datum/market_purchase
/// The entry being purchased.
@@ -112,13 +120,16 @@
var/obj/item/market_uplink/uplink
/// Shipping method used to buy this item.
var/method
/// Is this item considered contraband? If illegal, applies the contraband trait to the item when spawned.
var/legallity
/datum/market_purchase/New(datum/market_item/entry, obj/item/market_uplink/uplink, method)
/datum/market_purchase/New(datum/market_item/entry, obj/item/market_uplink/uplink, method, legal_status)
if(!uplink || !entry || !method)
CRASH("[type] created with a false value arg: (entry: [entry] - uplink: [uplink] - method: [method])")
src.entry = entry
src.uplink = uplink
src.method = method
src.legallity = legal_status
RegisterSignal(entry, COMSIG_QDELETING, PROC_REF(on_instance_del))
RegisterSignal(uplink, COMSIG_QDELETING, PROC_REF(on_instance_del))
if(ismovable(entry.item))
@@ -137,3 +148,13 @@
return
// Uh oh, uplink or item is gone. We will just keep the money and you will not get your order.
qdel(src)
/**
* Proc that applies secondary effects to objects that are spawned via a market.
*
* @param spawned_item - Reference to the atom being spawned.
* @param legal_status - Is this item considered legal? If illegal, will apply the contraband trait to the spawned item.
*/
/datum/market_purchase/proc/post_purchase_effects(atom/spawned_item)
if(!legallity && isobj(spawned_item))
ADD_TRAIT(spawned_item, TRAIT_CONTRABAND, INNATE_TRAIT)
@@ -91,6 +91,7 @@
if(receiving)
receiving.item = receiving.entry.spawn_item(turf, receiving)
receiving.post_purchase_effects(receiving.item)
use_energy(energy_usage_per_teleport / power_efficiency)
var/datum/effect_system/spark_spread/sparks = new
@@ -157,6 +157,9 @@
accessible_markets = list(/datum/market/blackmarket)
custom_premium_price = PAYCHECK_CREW * 2.5
/obj/item/market_uplink/blackmarket/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/datum/crafting_recipe/blackmarket_uplink
name = "Black Market Uplink"
+3
View File
@@ -185,6 +185,9 @@
else
account_holder = "Cargo"
var/obj/structure/closet/crate/crate = pack.generate(A, paying_account)
if(pack.contraband)
for(var/atom/movable/item_within as anything in crate.get_all_contents())
ADD_TRAIT(item_within, TRAIT_CONTRABAND, INNATE_TRAIT)
if(department_destination)
crate.AddElement(/datum/element/deliver_first, department_destination, pack.cost)
generateManifest(crate, account_holder, pack, pack.cost)
+1
View File
@@ -178,6 +178,7 @@
"desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name.
"goody" = P.goody,
"access" = P.access,
"contraband" = P.contraband,
))
return data
+1
View File
@@ -77,6 +77,7 @@
continue
A.flags_1 |= ADMIN_SPAWNED_1
/// For generating supply packs at runtime. Returns a list of supply packs to use instead of this one.
/datum/supply_pack/proc/generate_supply_packs()
return
@@ -13,4 +13,4 @@
for(var/group_key as anything in my_hud.master_groups)
var/datum/plane_master_group/group = my_hud.master_groups[group_key]
group.transform_lower_turfs(my_hud, my_hud.current_plane_offset)
group.build_planes_offset(my_hud, my_hud.current_plane_offset)
@@ -18,4 +18,4 @@
for(var/group_key as anything in my_hud.master_groups)
var/datum/plane_master_group/group = my_hud.master_groups[group_key]
group.transform_lower_turfs(my_hud, my_hud.current_plane_offset)
group.build_planes_offset(my_hud, my_hud.current_plane_offset)
@@ -252,6 +252,10 @@ do { \
name = "backpack"
actions_types = list(/datum/action/item_action/chameleon/change/backpack)
/obj/item/storage/backpack/chameleon/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT)
/obj/item/storage/backpack/chameleon/broken
/obj/item/storage/backpack/chameleon/broken/Initialize(mapload)
+11 -1
View File
@@ -22,8 +22,18 @@
if(!isinhands && check_holidays(HALLOWEEN))
. += emissive_appearance('icons/mob/simple/mob.dmi', "ghost", offset_spokesman = src, alpha = src.alpha)
/obj/item/clothing/suit/costume/ghost_sheet/spooky
/obj/item/clothing/suit/spooky_ghost_sheet
name = "spooky ghost"
desc = "This is obviously just a bedsheet, but maybe try it on?"
icon = 'icons/obj/clothing/suits/costume.dmi'
worn_icon = 'icons/mob/clothing/suits/costume.dmi'
user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
inhand_icon_state = null
throwforce = 0
throw_speed = 1
throw_range = 2
w_class = WEIGHT_CLASS_TINY
flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
species_exception = list(/datum/species/golem)
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire
@@ -16,6 +16,10 @@
growing_icon = 'icons/obj/service/hydroponics/growing.dmi'
reagents_add = list(/datum/reagent/consumable/nutriment = 0.05)
/obj/item/seeds/kronkus/Initialize(mapload, nogenes)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/item/food/grown/kronkus
seed = /obj/item/seeds/kronkus
name = "kronkus vine segment"
@@ -24,3 +28,7 @@
filling_color = "#37946e"
foodtypes = VEGETABLES | TOXIC
distill_reagent = /datum/reagent/kronkus_extract
/obj/item/food/grown/kronkus/Initialize(mapload, nogenes)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
@@ -294,8 +294,8 @@
else
Knockdown(stun_duration)
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/helper)
var/nosound = FALSE //SKYRAT EDIT ADDITION - EMOTES
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/helper, force_friendly)
var/nosound = FALSE //SKYRATEDIT ADDITION - EMOTES
if(on_fire)
to_chat(helper, span_warning("You can't put [p_them()] out with just your bare hands!"))
return
@@ -419,7 +419,7 @@
else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
to_chat(helper, span_warning("It feels like [src] is freezing as you hug [p_them()]."))
if(HAS_TRAIT(helper, TRAIT_FRIENDLY))
if(HAS_TRAIT(helper, TRAIT_FRIENDLY) || force_friendly)
if (helper.mob_mood.sanity >= SANITY_GREAT)
new /obj/effect/temp_visual/heart(loc)
add_mood_event("friendly_hug", /datum/mood_event/besthug, helper)
@@ -553,7 +553,7 @@
. = rand(-1000, 1000)
..() //Called afterwards because getting the mind after getting gibbed is sketchy
/mob/living/carbon/human/help_shake_act(mob/living/carbon/helper)
/mob/living/carbon/human/help_shake_act(mob/living/carbon/helper, force_friendly)
if(!istype(helper))
return
+3
View File
@@ -354,6 +354,9 @@
/obj/item/mod/module/quick_cuff,
)
/obj/item/mod/control/pre_equipped/infiltrator/Initialize(mapload, new_theme, new_skin, new_core)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND_BLOCKER, INNATE_TRAIT)
/obj/item/mod/control/pre_equipped/interdyne
theme = /datum/mod_theme/interdyne
@@ -316,6 +316,10 @@
name = "unlabeled syringe"
desc = "A syringe containing some sort of unknown chemical cocktail."
/obj/item/reagent_containers/syringe/contraband/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/item/reagent_containers/syringe/contraband/space_drugs
list_reagents = list(/datum/reagent/drug/space_drugs = 15)
@@ -660,7 +660,7 @@
category = list(
RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL
)
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_MEDICAL
/datum/design/board/holopad
name = "AI Holopad Board"
+164
View File
@@ -616,6 +616,12 @@
PROC_REF(uncontrolled_teleport),
PROC_REF(heat_and_explode),
PROC_REF(rapid_self_dupe),
PROC_REF(drink_dispenser),
PROC_REF(tummy_ache),
PROC_REF(charger),
PROC_REF(hugger),
PROC_REF(dimensional_shift),
PROC_REF(disguiser),
)
/obj/item/relic/attack_self(mob/user)
@@ -721,6 +727,164 @@
throw_smoke(get_turf(user))
warn_admins(user, "Teleport", 0)
// Creates a glass and fills it up with a drink.
/obj/item/relic/proc/drink_dispenser(mob/user)
var/obj/item/reagent_containers/cup/glass/drinkingglass/freebie = new(get_step_rand(user))
playsound(freebie, 'sound/effects/phasein.ogg', rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
addtimer(CALLBACK(src, PROC_REF(dispense_drink), freebie), 0.5 SECONDS)
/obj/item/relic/proc/dispense_drink(obj/item/reagent_containers/cup/glass/glasser)
glasser.reagents.add_reagent(get_random_drink_id(), rand(glasser.volume * 0.3, glasser.volume))
playsound(glasser, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
throw_smoke(get_turf(glasser))
// Scrambles your organs. 33% chance to delete after use.
/obj/item/relic/proc/tummy_ache(mob/user)
new /obj/effect/temp_visual/bioscrambler_wave/light(get_turf(src))
to_chat(user, span_notice("Your stomach starts growling..."))
addtimer(CALLBACK(src, PROC_REF(scrambliticus), user), rand(1 SECONDS, 3 SECONDS)) // throw it away!
/obj/item/relic/proc/scrambliticus(mob/user)
new /obj/effect/temp_visual/bioscrambler_wave(get_turf(src))
playsound(src, 'sound/magic/cosmic_energy.ogg', vol = 50, vary = TRUE)
for(var/mob/living/carbon/nearby in hearers(2, src))
nearby.bioscramble(name)
playsound(nearby, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
throw_smoke(get_turf(nearby))
to_chat(nearby, span_notice("You feel weird."))
if(prob(33))
qdel(src)
// Charges an item or two in your inventory. Also yourself.
/obj/item/relic/proc/charger(mob/living/user)
to_chat(user, span_danger("You're recharged!"))
var/stunner = 1.25 SECONDS
if(iscarbon(user))
var/mob/living/carbon/carboner = user
carboner.electrocute_act(15, src, flags = SHOCK_NOGLOVES, stun_duration = stunner)
else
user.electrocute_act(15, src, flags = SHOCK_NOGLOVES)
playsound(user, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
var/list/chargeable_batteries = list()
for(var/obj/item/stock_parts/power_store/C in user.get_all_contents())
if(C.charge < (C.maxcharge * 0.95)) // otherwise the PDA always gets recharged
chargeable_batteries |= C
lightning_fx(user, stunner)
var/recharges = rand(1, 2)
if(!length(chargeable_batteries))
to_chat(user, span_notice("You have a strange feeling for a moment, but then it passes."))
return
for(var/obj/item/stock_parts/power_store/to_charge as anything in recharges)
to_charge = pick(chargeable_batteries)
to_charge.charge = to_charge.maxcharge
// The device powered by the cell is assumed to be its location.
var/obj/device = to_charge.loc
// If it's not an object, or the loc's assigned power_store isn't the cell, undo.
if(!istype(device) || (device.get_cell() != to_charge))
device = to_charge
device.update_appearance(UPDATE_ICON|UPDATE_OVERLAYS)
to_chat(user, span_notice("[device] feels energized!"))
lightning_fx(device, 0.8 SECONDS)
/obj/item/relic/proc/lightning_fx(atom/shocker, time)
var/lightning = mutable_appearance('icons/effects/effects.dmi', "electricity3", layer = ABOVE_MOB_LAYER)
shocker.add_overlay(lightning)
addtimer(CALLBACK(src, PROC_REF(cut_the_overlay), shocker, lightning), time)
/obj/item/relic/proc/cut_the_overlay(atom/shocker, lightning)
shocker.cut_overlay(lightning)
// Hugs/shakes everyone in range!
/obj/item/relic/proc/hugger(mob/user)
var/list/mob/living/carbon/huggeds = oviewers(3, user)
for(var/mob/living/carbon/victim in huggeds)
victim.help_shake_act(user, force_friendly = TRUE)
new /obj/effect/temp_visual/heart(victim.loc)
if(length(huggeds))
to_chat(user, span_nicegreen("You feel friendly!"))
else
to_chat(user, pick(span_notice("You hug yourself, for some reason."), span_notice("You have a strange feeling for a moment, but then it passes.")))
// Converts a 3x3 area into a random dimensional theme.
/obj/item/relic/proc/dimensional_shift(mob/user)
var/new_theme_path = pick(subtypesof(/datum/dimension_theme))
var/datum/dimension_theme/shifter = SSmaterials.dimensional_themes[new_theme_path]
for(var/turf/shiftee in range(1, user))
shifter.apply_theme(shiftee, show_effect = TRUE)
qdel(shifter)
// prevent *total* spam conversion
min_cooldown += 2 SECONDS
max_cooldown += 2 SECONDS
// Replaces your clothing with a random costume, and your ID with a cardboard one.
// TODO: make them part of the same kit (lobster hat, lobster suit)
/obj/item/relic/proc/disguiser(mob/user)
if(!iscarbon(user))
to_chat(user, span_notice("You have a strange feeling for a moment, but then it passes."))
return
if(prob(80)) // >:)
ADD_TRAIT(user, TRAIT_NO_JUMPSUIT, REF(src)) // prevent dropping pockets & belt
// magic trick!
playsound(user, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
throw_smoke(user)
// carbons always get a hat at least
var/mob/living/carbon/carbonius = user
//hat
var/obj/item/clothing/head/costume/disguise_hat = roll_costume(/obj/item/clothing/head/costume, HIDEMASK)
carbonius.dropItemToGround(carbonius.head)
carbonius.equip_to_slot_or_del(disguise_hat, ITEM_SLOT_HEAD)
if(!ishuman(carbonius))
to_chat(user, span_notice("You have a peculiar feeling for a moment, but then it passes."))
return
var/mob/living/carbon/human/humerus = carbonius
// uniform
var/obj/item/clothing/under/costume/disguise_uniform = roll_costume(/obj/item/clothing/under/costume)
humerus.dropItemToGround(humerus.w_uniform)
humerus.equip_to_slot_or_del(disguise_uniform, ITEM_SLOT_ICLOTHING)
// suit
var/obj/item/clothing/suit/costume/disguise_suit = roll_costume(/obj/item/clothing/suit/costume)
humerus.dropItemToGround(humerus.wear_suit)
humerus.equip_to_slot_or_del(disguise_suit, ITEM_SLOT_OCLOTHING)
// id
var/obj/item/card/cardboard/card_id = new()
humerus.dropItemToGround(humerus.wear_id)
humerus.equip_to_slot_or_del(card_id, ITEM_SLOT_ID)
// edit the card to a random job & name
if(!card_id)
return
card_id.scribbled_name = "[pick(GLOB.first_names)] [pick(GLOB.last_names)]"
card_id.update_name()
card_id.details_colors = list(ready_random_color(), ready_random_color(), ready_random_color())
card_id.item_flags |= DROPDEL
var/datum/id_trim/random_trim = pick(subtypesof(/datum/id_trim)) // this can pick silly things
random_trim = new random_trim()
if(random_trim.trim_state && random_trim.assignment)
card_id.scribbled_trim = replacetext(random_trim.trim_state, "trim_", "cardboard_")
card_id.scribbled_assignment = random_trim.assignment
card_id.update_overlays()
REMOVE_TRAIT(user, TRAIT_NO_JUMPSUIT, REF(src))
/obj/item/relic/proc/roll_costume(type, flagcheck)
var/list/candidates = list()
for(var/obj/item/thingy as anything in subtypesof(type))
if(flagcheck && !(initial(thingy.flags_inv) & flagcheck))
continue
if(isnull(initial(thingy.icon_state)))
continue
candidates |= thingy
var/obj/item/new_costume = pick(candidates)
new_costume = new new_costume()
new_costume.item_flags |= DROPDEL
return new_costume
//Admin Warning proc for relics
/obj/item/relic/proc/warn_admins(mob/user, relic_type, priority = 1)
var/turf/location = get_turf(src)
@@ -1,8 +1,8 @@
/datum/techweb_node/mech_assembly
id = TECHWEB_NODE_MECH_ASSEMBLY
starting_node = TRUE
display_name = "Mech Assembly"
description = "Development of mech designed to contend with artificial gravity while transporting cargo."
display_name = "Exosuit Assembly"
description = "Development of mechanical exosuits designed to contend with artificial gravity while transporting cargo."
prereq_ids = list(TECHWEB_NODE_ROBOTICS)
design_ids = list(
"mechapower",
@@ -21,7 +21,7 @@
/datum/techweb_node/mech_equipment
id = TECHWEB_NODE_MECH_EQUIPMENT
display_name = "Expedition Equipment"
description = "Specialized mech gear tailored for navigating space and celestial bodies, ensuring durability and functionality in the harshest conditions."
description = "Specialized exosuit gear tailored for navigating space and celestial bodies, ensuring durability and functionality in the harshest conditions."
prereq_ids = list(TECHWEB_NODE_MECH_ASSEMBLY)
design_ids = list(
"mechacontrol",
@@ -63,7 +63,7 @@
/datum/techweb_node/mech_medical
id = TECHWEB_NODE_MECH_MEDICAL
display_name = "Medical Mech"
display_name = "Medical Exosuit"
description = "Advanced robotic unit equipped with syringe guns and healing beams, revolutionizing medical assistance in hazardous environments."
prereq_ids = list(TECHWEB_NODE_MECH_ASSEMBLY, TECHWEB_NODE_CHEM_SYNTHESIS)
design_ids = list(
@@ -83,8 +83,8 @@
/datum/techweb_node/mech_mining
id = TECHWEB_NODE_MECH_MINING
display_name = "Mining Mech"
description = "Robust mech engineered to withstand lava and storms for continuous off-station mining operations."
display_name = "Mining Exosuit"
description = "Robust exosuit engineered to withstand lava and storms for continuous off-station mining operations."
prereq_ids = list(TECHWEB_NODE_MECH_EQUIPMENT, TECHWEB_NODE_MINING)
design_ids = list(
"clarke_chassis",
@@ -99,8 +99,8 @@
/datum/techweb_node/mech_combat
id = TECHWEB_NODE_MECH_COMBAT
display_name = "Combat Mechs"
description = "Modular armor upgrades and specialized equipment for security mechs."
display_name = "Combat Exosuits"
description = "Modular armor upgrades and specialized equipment for security exosuits."
prereq_ids = list(TECHWEB_NODE_MECH_EQUIPMENT)
design_ids = list(
"mech_ccw_armor",
@@ -115,8 +115,8 @@
/datum/techweb_node/mech_assault
id = TECHWEB_NODE_MECH_ASSAULT
display_name = "Assault Mech"
description = "Heavy battle mech boasting robust armor but sacrificing speed for enhanced durability."
display_name = "Assault Exosuits"
description = "Heavy battle exosuits boasting robust armor but sacrificing speed for enhanced durability."
prereq_ids = list(TECHWEB_NODE_MECH_COMBAT)
design_ids = list(
"durand_armor",
@@ -135,8 +135,8 @@
/datum/techweb_node/mech_light
id = TECHWEB_NODE_MECH_LIGHT
display_name = "Light Combat Mech"
description = "Agile combat mech equipped with overclocking capabilities for temporary speed boosts, prioritizing speed over durability on the battlefield."
display_name = "Light Combat Exosuits"
description = "Agile combat exosuits equipped with overclocking capabilities for temporary speed boosts, prioritizing speed over durability on the battlefield."
prereq_ids = list(TECHWEB_NODE_MECH_COMBAT)
design_ids = list(
"gygax_armor",
@@ -155,7 +155,7 @@
/datum/techweb_node/mech_heavy
id = TECHWEB_NODE_MECH_HEAVY
display_name = "Heavy Mech"
display_name = "Heavy Exosuits"
description = "Advanced heavy mechanized unit with dual pilot capability, designed for robust battlefield performance and increased tactical versatility."
prereq_ids = list(TECHWEB_NODE_MECH_ASSAULT)
design_ids = list(
@@ -175,8 +175,8 @@
/datum/techweb_node/mech_infiltrator
id = TECHWEB_NODE_MECH_INFILTRATOR
display_name = "Infiltration Mech"
description = "Advanced mech with phasing capabilities, allowing it to move through walls and obstacles, ideal for covert and special operations."
display_name = "Infiltration Exosuits"
description = "Advanced exosuit with phasing capabilities, allowing it to move through walls and obstacles, ideal for covert and special operations."
prereq_ids = list(TECHWEB_NODE_MECH_LIGHT, TECHWEB_NODE_ANOMALY_RESEARCH)
design_ids = list(
"phazon_armor",
@@ -211,8 +211,8 @@
/datum/techweb_node/mech_energy_guns
id = TECHWEB_NODE_MECH_ENERGY_GUNS
display_name = "Mech Energy Guns"
description = "Scaled-up versions of electric weapons optimized for mech deployment."
display_name = "Exosuit Energy Guns"
description = "Scaled-up versions of electric weapons optimized for exosuit deployment."
prereq_ids = list(TECHWEB_NODE_MECH_COMBAT, TECHWEB_NODE_ELECTRIC_WEAPONS)
design_ids = list(
"mech_laser",
@@ -225,7 +225,7 @@
/datum/techweb_node/mech_firearms
id = TECHWEB_NODE_MECH_FIREARMS
display_name = "Mech Firearms"
display_name = "Exosuit Firearms"
description = "Mounted ballistic weaponry, enhancing combat capabilities for mechanized units."
prereq_ids = list(TECHWEB_NODE_MECH_ENERGY_GUNS, TECHWEB_NODE_EXOTIC_AMMO)
design_ids = list(
@@ -240,7 +240,7 @@
/datum/techweb_node/mech_heavy_arms
id = TECHWEB_NODE_MECH_HEAVY_ARMS
display_name = "Heavy Mech Firearms"
display_name = "Heavy Exosuit Firearms"
description = "High-impact weaponry integrated into mechs, optimized for maximum firepower."
prereq_ids = list(TECHWEB_NODE_MECH_HEAVY, TECHWEB_NODE_EXOTIC_AMMO)
design_ids = list(
@@ -255,7 +255,7 @@
/datum/techweb_node/mech_equip_bluespace
id = TECHWEB_NODE_BLUESPACE
display_name = "Bluespace Mech Equipment"
display_name = "Bluespace Exosuit Equipment"
description = "An array of equipment empowered by bluespace, providing unmatched mobility and utility."
prereq_ids = list(TECHWEB_NODE_MECH_INFILTRATOR, TECHWEB_NODE_BLUESPACE_TRAVEL)
design_ids = list(
@@ -1,7 +1,7 @@
/datum/techweb_node/mod_suit
id = TECHWEB_NODE_MOD_SUIT
starting_node = TRUE
display_name = "Modular Exosuit"
display_name = "Modular Suit"
description = "Specialized back mounted power suits with various different modules."
prereq_ids = list(TECHWEB_NODE_ROBOTICS)
design_ids = list(
@@ -52,7 +52,7 @@
/datum/techweb_node/mod_medical
id = TECHWEB_NODE_MOD_MEDICAL
display_name = "Medical Modular Suit"
description = "Medical exosuits for quick rescue purposes."
description = "Medical MODsuits for quick rescue purposes."
prereq_ids = list(TECHWEB_NODE_MOD_SUIT, TECHWEB_NODE_CHEM_SYNTHESIS)
design_ids = list(
"mod_plating_medical",
@@ -98,7 +98,7 @@
/datum/techweb_node/mod_medical_adv
id = TECHWEB_NODE_MOD_MEDICAL_ADV
display_name = "Field Surgery Modules"
description = "Medical exosuit equipment designed for conducting surgical operations in field conditions."
description = "Medical MODsuit equipment designed for conducting surgical operations in field conditions."
prereq_ids = list(TECHWEB_NODE_MOD_MEDICAL, TECHWEB_NODE_SURGERY_ADV)
design_ids = list(
"mod_defib",
@@ -130,7 +130,7 @@
/datum/techweb_node/mod_anomaly
id = TECHWEB_NODE_MOD_ANOMALY
display_name = "Anomalock Modular Suit"
description = "Modules for exosuits that require anomaly cores to function."
description = "Modules for MODsuits that require anomaly cores to function."
prereq_ids = list(TECHWEB_NODE_MOD_ENGI_ADV, TECHWEB_NODE_ANOMALY_RESEARCH)
design_ids = list(
"mod_antigrav",
@@ -33,7 +33,7 @@
required_items_to_unlock = list()
for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type)
var/datum/uplink_item/item = SStraitor.uplink_items_by_type[item_path]
if(!item.item || !item.illegal_tech)
if(!item.item || !(item.uplink_item_flags & SYNDIE_ILLEGAL_TECH))
continue
required_items_to_unlock |= item.item //allows deconning to unlock.
@@ -149,6 +149,10 @@
surgery_speed = 0.75
loaded_overlay = "autosurgeon_syndicate_loaded_overlay"
/obj/item/autosurgeon/syndicate/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
/obj/item/autosurgeon/syndicate/laser_arm
desc = "A single use autosurgeon that contains a combat arms-up laser augment. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
+13 -5
View File
@@ -78,8 +78,8 @@
var/purchase_log_vis = TRUE // Visible in the purchase log?
/// Whether this purchase is restricted or not (VR/Events related)
var/restricted = FALSE
/// Can this item be deconstructed to unlock certain techweb research nodes?
var/illegal_tech = TRUE
/// Flags related to if an item will provide illegal tech, or trips contraband detectors once spawned in as an item.
var/uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND
/// String to be shown instead of the price, e.g for the Random item.
var/cost_override_string = ""
/// Whether this item locks all other items from being purchased. Used by syndicate balloon and a few other purchases.
@@ -142,6 +142,12 @@
spawned_item = spawn_path
if(refundable)
spawned_item.AddElement(/datum/element/uplink_reimburse, (refund_amount ? refund_amount : cost))
if(uplink_item_flags & SYNDIE_TRIPS_CONTRABAND) // Ignore things that shouldn't be detectable as contraband on the station.
ADD_TRAIT(spawned_item, TRAIT_CONTRABAND, INNATE_TRAIT)
for(var/obj/contained as anything in spawned_item.get_all_contents())
ADD_TRAIT(contained, TRAIT_CONTRABAND, INNATE_TRAIT)
var/mob/living/carbon/human/human_user = user
if(istype(human_user) && isitem(spawned_item) && human_user.put_in_hands(spawned_item))
to_chat(human_user, span_boldnotice("[spawned_item] materializes into your hands!"))
@@ -154,8 +160,10 @@
/// Can be used to "de-restrict" some items, such as Nukie guns spawning with Syndicate pins
/datum/uplink_item/proc/spawn_item_for_generic_use(mob/user)
var/atom/movable/created = new item(user.loc)
if(isgun(created))
if(uplink_item_flags & SYNDIE_TRIPS_CONTRABAND) // Things that shouldn't be detectable as contraband on the station.
ADD_TRAIT(created, TRAIT_CONTRABAND, INNATE_TRAIT)
for(var/obj/contained as anything in created.get_all_contents())
ADD_TRAIT(contained, TRAIT_CONTRABAND, INNATE_TRAIT)
replace_pin(created)
else if(istype(created, /obj/item/storage/toolbox/guncase))
for(var/obj/item/gun/gun in created)
@@ -205,7 +213,7 @@
name = "Objective-Specific Equipment"
desc = "Equipment necessary for accomplishing specific objectives. If you are seeing this, something has gone wrong."
limited_stock = 1
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY // Ditto
/datum/uplink_item/special_equipment/purchase(mob/user, datum/component/uplink/U)
@@ -12,7 +12,7 @@
item = /obj/item/ammo_box/foambox/riot
cost = 2
surplus = 0
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
purchasable_from = ~UPLINK_SERIOUS_OPS
/datum/uplink_item/ammo/pistol
@@ -21,7 +21,7 @@
item = /obj/item/ammo_box/magazine/m9mm
cost = 1
purchasable_from = ~UPLINK_ALL_SYNDIE_OPS
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/ammo/pistolap
name = "9mm Armour Piercing Magazine"
@@ -54,4 +54,4 @@
item = /obj/item/ammo_box/a357
cost = 4
purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) //nukies get their own version
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
+4 -4
View File
@@ -14,7 +14,7 @@
cost = 20
lock_other_purchases = TRUE
cant_discount = TRUE
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/badass/balloon/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source)
. = ..()
@@ -36,14 +36,14 @@
item = /obj/item/toy/cards/deck/syndicate
cost = 1
surplus = 40
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/badass/syndiecigs
name = "Syndicate Smokes"
desc = "Strong flavor, dense smoke, infused with omnizine."
item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate
cost = 2
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/badass/syndiecash
name = "Syndicate Briefcase Full of Cash"
@@ -53,7 +53,7 @@
item = /obj/item/storage/briefcase/secure/syndie
cost = 3
restricted = TRUE
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/badass/costumes/clown
name = "Clown Costume"
+3 -3
View File
@@ -35,7 +35,7 @@
cost = 1 //much cheaper for clown ops than for clowns
item = /obj/item/firing_pin/clown/ultra
purchasable_from = UPLINK_CLOWN_OPS
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/weapon_kits/clownopsuperpin
name = "Super Ultra Hilarious Firing Pin"
@@ -43,7 +43,7 @@
cost = 4 //much cheaper for clown ops than for clowns
item = /obj/item/firing_pin/clown/ultra/selfdestruct
purchasable_from = UPLINK_CLOWN_OPS
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/weapon_kits/foamsmg
name = "Toy Submachine Gun"
@@ -159,4 +159,4 @@
item = /obj/item/dnainjector/clumsymut
cost = 1
purchasable_from = UPLINK_CLOWN_OPS
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
@@ -29,7 +29,7 @@
throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs."
item = /obj/item/storage/box/syndie_kit/throwing_weapons
cost = 3
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/dangerous/sword
name = "Energy Sword"
@@ -12,7 +12,7 @@
item = /obj/item/soap/syndie
cost = 1
surplus = 50
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/device_tools/surgerybag
name = "Syndicate Surgery Duffel Bag"
@@ -113,7 +113,7 @@
item = /obj/item/disk/nuclear/fake
cost = 1
surplus = 1
illegal_tech = FALSE
uplink_item_flags = NONE
/datum/uplink_item/device_tools/frame
name = "F.R.A.M.E. disk"
@@ -165,7 +165,7 @@
multitool and combat gloves that are resistant to shocks and heat."
item = /obj/item/storage/toolbox/syndicate
cost = 1
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/device_tools/rad_laser
name = "Radioactive Microlaser"
+4 -4
View File
@@ -21,7 +21,7 @@
desc = "A box of five (5) counterfeit devices. Each single-use device can hold one normal sized object, and impersonate an ordinary postal envelope addressed to whoever you choose. Optionally, can be rigged to activate held items - great for if you want to surprise someone with a primed grenade!"
item = /obj/item/storage/box/syndie_kit/mail_counterfeit
cost = 2
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
restricted_roles = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER)
surplus = 5
@@ -45,7 +45,7 @@
item = /obj/item/dnainjector/clumsymut
cost = 1
restricted_roles = list(JOB_CLOWN)
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
surplus = 25
/datum/uplink_item/role_restricted/ancient_jumpsuit
@@ -70,7 +70,7 @@
cost = 4
item = /obj/item/firing_pin/clown/ultra
restricted_roles = list(JOB_CLOWN)
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
surplus = 25
/datum/uplink_item/role_restricted/clownsuperpin
@@ -79,7 +79,7 @@
cost = 7
item = /obj/item/firing_pin/clown/ultra/selfdestruct
restricted_roles = list(JOB_CLOWN)
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
surplus = 25
/datum/uplink_item/role_restricted/syndimmi
+1 -1
View File
@@ -385,7 +385,7 @@
item = /obj/item/ammo_box/magazine/plastikov9mm
cost = 1
purchasable_from = UPLINK_SERIOUS_OPS
illegal_tech = FALSE
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
// Explosives and Grenades
// ~~ Grenades ~~
@@ -10,12 +10,14 @@
// Cost doesn't really matter since it's free, but it determines which loot pool it falls into.
// By default, these fall into easy-medium spy bounty loot pool
cost = SPY_LOWER_COST_THRESHOLD
uplink_item_flags = NONE
/datum/uplink_item/spy_unique/syndie_bowman
name = "Syndicate Bowman"
desc = "A bowman headset for members of the Syndicate. Not very conspicuous."
item = /obj/item/radio/headset/syndicate/alt
cost = 1
uplink_item_flags = SYNDIE_ILLEGAL_TECH
/datum/uplink_item/spy_unique/megaphone
name = "Megaphone"
@@ -43,6 +45,7 @@
name = "Kudzu"
desc = "A packet of Kudzu - plant and forget, a great distraction."
item = /obj/item/seeds/kudzu
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/spy_unique/big_knife
name = "Combat Knife"
@@ -53,6 +56,7 @@
name = "Switchblade"
desc = "A switchblade. Switches between not sharp and sharp."
item = /obj/item/switchblade
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/spy_unique/sechud_implant
name = "SecHUD Implant"
@@ -64,30 +68,35 @@
desc = "A bolt-action rifle, with a scope. Won't jam, either."
item = /obj/item/gun/ballistic/rifle/boltaction/prime
cost = SPY_UPPER_COST_THRESHOLD
uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/spy_unique/cycler_shotgun
name = "Cycler Shotgun"
desc = "A cycler shotgun. It's a shotgun that cycles between two barrels."
item = /obj/item/gun/ballistic/shotgun/automatic/dual_tube/deadly
cost = SPY_UPPER_COST_THRESHOLD
uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/spy_unique/bulldog_shotgun
name = "Bulldog Shotgun"
desc = "A bulldog shotgun. It's a shotgun that shoots bulldogs."
item = /obj/item/gun/ballistic/shotgun/bulldog/unrestricted
cost = SPY_UPPER_COST_THRESHOLD
uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/spy_unique/ansem_pistol
name = "Ansem Pistol"
desc = "A pistol that's really good at making people sleep."
item = /obj/item/gun/ballistic/automatic/pistol/clandestine
cost = SPY_UPPER_COST_THRESHOLD
uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/spy_unique/rocket_launcher
name = "Rocket Launcher"
desc = "A rocket launcher. I would recommend against jumping with it."
item = /obj/item/gun/ballistic/rocketlauncher
cost = SPY_UPPER_COST_THRESHOLD - 1 // It's a meme item
uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/spy_unique/shotgun_ammo
name = "Box of Buckshot"
@@ -110,17 +119,20 @@
desc = "A stealth belt that lets you sneak behind enemy lines."
item = /obj/item/shadowcloak/weaker
cost = SPY_UPPER_COST_THRESHOLD
uplink_item_flags = SYNDIE_ILLEGAL_TECH
/datum/uplink_item/spy_unique/katana
name = "Katana"
desc = "A really sharp Katana. Did I mention it's sharp?"
item = /obj/item/katana
cost = /datum/uplink_item/dangerous/doublesword::cost // Puts it in the same pool as Desword
uplink_item_flags = SYNDIE_ILLEGAL_TECH | SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/spy_unique/medkit_lite
name = "Syndicate First Medic Kit"
desc = "A syndicate tactical combat medkit, but only stocked enough to do basic first aid."
item = /obj/item/storage/medkit/tactical_lite
uplink_item_flags = SYNDIE_TRIPS_CONTRABAND
/datum/uplink_item/spy_unique/antistun
name = /datum/uplink_item/implants/nuclear/antistun::name
@@ -4,6 +4,7 @@
/datum/uplink_item/stealthy_weapons
category = /datum/uplink_category/stealthy
uplink_item_flags = SYNDIE_ILLEGAL_TECH
/datum/uplink_item/stealthy_weapons/dart_pistol
@@ -4,6 +4,7 @@
/datum/uplink_item/stealthy_tools
category = /datum/uplink_category/stealthy_tools
uplink_item_flags = SYNDIE_ILLEGAL_TECH
/datum/uplink_item/stealthy_tools/agent_card
@@ -90,7 +91,7 @@
item = /obj/item/storage/backpack/satchel/flat/with_tools
cost = 1
surplus = 30
illegal_tech = FALSE
uplink_item_flags = NONE
/datum/uplink_item/stealthy_tools/mail_counterfeit
name = "GLA Brand Mail Counterfeit Device"
+2
View File
@@ -1445,6 +1445,8 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock)
var/obj/item/vended_item
if(!LAZYLEN(item_record.returned_products)) //always give out free returned stuff first, e.g. to avoid walling a traitor objective in a bag behind paid items
vended_item = new item_record.product_path(get_turf(src))
if(vended_item.type in contraband)
ADD_TRAIT(vended_item, TRAIT_CONTRABAND, INNATE_TRAIT)
on_dispense(vended_item)
else
vended_item = LAZYACCESS(item_record.returned_products, LAZYLEN(item_record.returned_products)) //first in, last out
@@ -0,0 +1,10 @@
author: "ArcaneMusic"
delete-after: True
changes:
- rscadd: "Items spawned via traitor uplinks or are known illegal contraband on the station can now be scanned and identified as such by the N-spect scanners in security. These only applies to overt traitor or antagonist items, and \"stealth\" items will not be seen as such."
- rscadd: "Scanner gates can now be upgraded by using an N-spect scanner on it to unlock \"contraband scanning\" mode."
- rscadd: "Security officers can now be offered a bounty to turn in pieces of contraband."
- rscadd: "Some stealthy storage items like storage implants, smuggler's satchels, void cloaks, the infiltrator modsuit, and the chameleon backpack will block the presence of contraband on your person when placed inside."
- qol: "N-spect scanner contextual screentips."
- balance: "Recharger security bounties ask for a quantity of 1, down from 3."
- qol: "security, cargo, and medbay have access to scanner gate boards."
@@ -0,0 +1,4 @@
author: "00-Steven"
delete-after: True
changes:
- bugfix: "You can see runechat above fullscreen overlays on lower multi-z levels again. Rejoice, blind players. Please report any weird rendering layering issues."
@@ -0,0 +1,5 @@
author: "carlarctg"
delete-after: True
changes:
- rscadd: "Adds six new strange object powers! Drink dispenser, bioscrambler, recharger, hugger, dimensional, disguiser."
- code_imp: "Removed some unused code and items, and added a proc that returns a random #colorstring."
@@ -0,0 +1,4 @@
author: "GPeckman"
delete-after: True
changes:
- spellcheck: "The techweb no longer erroneously refers to MODsuits as exosuits."
@@ -0,0 +1,4 @@
author: "Hardly3D"
delete-after: True
changes:
- rscadd: "Added new hairstyle: Short Bangs 2"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 104 KiB

@@ -1,2 +1,2 @@
/datum/uplink_item/suits/plate_compression
illegal_tech = FALSE
uplink_item_flags = NONE
@@ -21,14 +21,14 @@
desc = "A pair of highly robust combat gripper gloves that excels at performing takedowns at close range, with an added lining of insulation. Careful not to hit a wall!"
item = /obj/item/clothing/gloves/tackler/combat/insulated
cost = 2
illegal_tech = FALSE
uplink_item_flags = NONE
/datum/uplink_item/device_tools/ammo_pouch
name = "Ammo Pouch"
desc = "A small yet large enough pouch that can fit in your pocket, and has room for three magazines."
item = /obj/item/storage/pouch/ammo
cost = 1
illegal_tech = FALSE
uplink_item_flags = NONE
/datum/uplink_item/device_tools/syndie_glue
name = "Glue"
@@ -5,4 +5,4 @@
cost = 2
surplus = 0
progression_minimum = 10 MINUTES
illegal_tech = FALSE
uplink_item_flags = NONE
@@ -3,7 +3,7 @@
desc = "A slim Type I armored vest that provides decent protection against most types of damage."
item = /obj/item/clothing/suit/armor/vest
cost = 1
illegal_tech = FALSE
uplink_item_flags = NONE
progression_minimum = 10 MINUTES
/datum/uplink_item/suits/bulletproof_armor
@@ -11,7 +11,7 @@
desc = "A Type III heavy bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
item = /obj/item/clothing/suit/armor/bulletproof
cost = 3
illegal_tech = FALSE
uplink_item_flags = NONE
progression_minimum = 15 MINUTES
/datum/uplink_item/suits/swathelmet_traitor
@@ -19,5 +19,5 @@
desc = "An extremely robust, space-worthy helmet in a nefarious red and black stripe pattern."
item = /obj/item/clothing/head/helmet/swat
cost = 2
illegal_tech = FALSE
uplink_item_flags = NONE
progression_minimum = 10 MINUTES
+1 -1
View File
@@ -2138,7 +2138,7 @@
#include "code\game\machinery\recycler.dm"
#include "code\game\machinery\requests_console.dm"
#include "code\game\machinery\roulette_machine.dm"
#include "code\game\machinery\scan_gate.dm"
#include "code\game\machinery\scanner_gate.dm"
#include "code\game\machinery\sheetifier.dm"
#include "code\game\machinery\shieldgen.dm"
#include "code\game\machinery\sleepers.dm"
@@ -206,6 +206,11 @@ function CatalogList(props: CatalogListProps) {
<Icon color="average" name="lock" />
</Tooltip>
)}
{!!pack.contraband && (
<Tooltip content="Contraband">
<Icon color="bad" name="pastafarianism" />
</Tooltip>
)}
</Table.Cell>
<Table.Cell collapsing textAlign="right">
<Button
@@ -35,6 +35,7 @@ export type Supply = {
id: string;
name: string;
small_item: BooleanLike;
contraband: BooleanLike;
};
type CartEntry = {
@@ -153,6 +153,7 @@ const BountyPickButton = (props) => {
color="black"
backgroundColor="linen"
lineHeight="1.2em"
p={1}
>
{props.bounty_info}
</Box>
+25 -1
View File
@@ -177,6 +177,10 @@ const SCANNER_GATE_ROUTES = {
component: () => ScannerGateGender,
},
// SKYRAT EDIT END - MORE SCANNER GATE OPTIONS
Contraband: {
title: 'Scanner Mode: Contraband',
component: () => ScannerGateContraband,
},
};
const ScannerGateControl = (props) => {
@@ -203,7 +207,8 @@ const ScannerGateControl = (props) => {
};
const ScannerGateOff = (props) => {
const { act } = useBackend();
const { act, data } = useBackend();
const { contraband_enabled } = data;
return (
<>
<Box mb={2}>Select a scanning mode below.</Box>
@@ -236,6 +241,11 @@ const ScannerGateOff = (props) => {
content="Nutrition"
onClick={() => act('set_mode', { new_mode: 'Nutrition' })}
/>
<Button
content="Contraband"
disabled={contraband_enabled ? false : true}
onClick={() => act('set_mode', { new_mode: 'Contraband' })}
/>
</Box>
</>
);
@@ -406,6 +416,20 @@ const ScannerGateGender = (props) => {
);
};
// SKYRAT EDIT END - MORE SCANNER GATE OPTIONS
const ScannerGateContraband = (props) => {
const { data } = useBackend();
const { reverse } = data;
return (
<>
<Box mb={2}>
Trigger if the person scanned {reverse ? 'does not have' : 'has'} any
anything considered contraband. Requires an N-spect scanner installed to
enable.
</Box>
<ScannerGateMode />
</>
);
};
const ScannerGateMode = (props) => {
const { act, data } = useBackend();