diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm
index e2c89df90e..4766b3dfe6 100644
--- a/code/__DEFINES/tgs.dm
+++ b/code/__DEFINES/tgs.dm
@@ -1,18 +1,19 @@
// 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.1.2"
+#define TGS_DMAPI_VERSION "7.2.1"
// All functions and datums outside this document are subject to change with any version and should not be relied on.
// CONFIGURATION
-/// Create this define if you want to do TGS configuration outside of this file.
+/// Consumers SHOULD create this define if you want to do TGS configuration outside of this file.
#ifndef TGS_EXTERNAL_CONFIGURATION
-// Comment this out once you've filled in the below.
+// Consumers MUST comment this out once you've filled in the below and are not using [TGS_EXTERNAL_CONFIGURATION].
#error TGS API unconfigured
-// Uncomment this if you wish to allow the game to interact with TGS 3..
+// Consumers MUST uncomment this if you wish to allow the game to interact with TGS version 3.
// This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()().
//#define TGS_V3_API
@@ -52,7 +53,7 @@
#ifndef TGS_FILE2TEXT_NATIVE
#ifdef file2text
-#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You can fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses
+#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You SHOULD fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses
#endif
#define TGS_FILE2TEXT_NATIVE file2text
#endif
@@ -152,16 +153,17 @@
//REQUIRED HOOKS
/**
- * Call this somewhere in [/world/proc/New] that is always run. This function may sleep!
+ * Consumers MUST call this somewhere in [/world/proc/New] that is always run. This function may sleep!
*
* * event_handler - Optional user defined [/datum/tgs_event_handler].
* * minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated. Can be one of [TGS_SECURITY_ULTRASAFE], [TGS_SECURITY_SAFE], or [TGS_SECURITY_TRUSTED].
+ * * http_handler - Optional user defined [/datum/tgs_http_handler].
*/
-/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE)
+/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE, datum/tgs_http_handler/http_handler)
return
/**
- * Call this when your initializations are complete and your game is ready to play before any player interactions happen.
+ * Consumers MUST call this when world initializations are complete and the game is ready to play before any player interactions happen.
*
* This may use [/world/var/sleep_offline] to make this happen so ensure no changes are made to it while this call is running.
* Afterwards, consider explicitly setting it to what you want to avoid this BYOND bug: http://www.byond.com/forum/post/2575184
@@ -170,12 +172,10 @@
/world/proc/TgsInitializationComplete()
return
-/// Put this at the start of [/world/proc/Topic].
+/// Consumers MUST run this macro at the start of [/world/proc/Topic].
#define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return
-/**
- * Call this as late as possible in [world/proc/Reboot] (BEFORE ..()).
- */
+/// Consumers MUST call this as late as possible in [world/proc/Reboot] (BEFORE ..()).
/world/proc/TgsReboot()
return
@@ -269,7 +269,7 @@
/// The [/datum/tgs_chat_channel] the user was from.
var/datum/tgs_chat_channel/channel
-/// User definable handler for TGS events.
+/// User definable handler for TGS events This abstract version SHOULD be overridden to be used.
/datum/tgs_event_handler
/// If the handler receieves [TGS_EVENT_HEALTH_CHECK] events.
var/receive_health_checks = FALSE
@@ -283,7 +283,41 @@
set waitfor = FALSE
return
-/// User definable chat command.
+/// User definable handler for HTTP calls. This abstract version MUST be overridden to be used.
+/datum/tgs_http_handler
+
+/**
+ * User definable callback for executing HTTP GET requests.
+ * MUST perform BYOND sleeps while the request is in flight.
+ * MUST return a [/datum/tgs_http_result].
+ * SHOULD log its own errors
+ *
+ * url - The full URL to execute the GET request for including query parameters.
+ */
+/datum/tgs_http_handler/proc/PerformGet(url)
+ CRASH("[type]/PerformGet not implemented!")
+
+/// Result of a [/datum/tgs_http_handler] call. MUST NOT be overridden.
+/datum/tgs_http_result
+ /// HTTP response as text
+ var/response_text
+ /// Boolean request success flag. Set for any 2XX response code.
+ var/success
+
+/**
+ * Create a [/datum/tgs_http_result].
+ *
+ * * response_text - HTTP response as text. Must be provided in New().
+ * * success - Boolean request success flag. Set for any 2XX response code. Must be provided in New().
+ */
+/datum/tgs_http_result/New(response_text, success)
+ if(response_text && !istext(response_text))
+ CRASH("response_text was not text!")
+
+ src.response_text = response_text
+ src.success = success
+
+/// User definable chat command. This abstract version MUST be overridden to be used.
/datum/tgs_chat_command
/// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...`.
var/name = ""
@@ -296,21 +330,27 @@
/**
* Process command activation. Should return a [/datum/tgs_message_content] to respond to the issuer with.
+ * MUST be implemented
*
- * sender - The [/datum/tgs_chat_user] who issued the command.
- * params - The trimmed string following the command `/datum/tgs_chat_command/var/name].
+ * * sender - The [/datum/tgs_chat_user] who issued the command.
+ * * params - The trimmed string following the command `/datum/tgs_chat_command/var/name].
*/
/datum/tgs_chat_command/proc/Run(datum/tgs_chat_user/sender, params)
CRASH("[type] has no implementation for Run()")
-/// User definable chat message.
+/// User definable chat message. MUST NOT be overridden.
/datum/tgs_message_content
- /// The tring content of the message. Must be provided in New().
+ /// The string content of the message. Must be provided in New().
var/text
/// The [/datum/tgs_chat_embed] to embed in the message. Not supported on all chat providers.
var/datum/tgs_chat_embed/structure/embed
+/**
+ * Create a [/datum/tgs_message_content].
+ *
+ * * text - The string content of the message.
+ */
/datum/tgs_message_content/New(text)
..()
if(!istext(text))
@@ -319,7 +359,7 @@
src.text = text
-/// User definable chat embed. Currently mirrors Discord chat embeds. See https://discord.com/developers/docs/resources/channel#embed-object-embed-structure for details.
+/// User definable chat embed. Currently mirrors Discord chat embeds. See https://discord.com/developers/docs/resources/message#embed-object for details.
/datum/tgs_chat_embed/structure
var/title
var/description
@@ -331,13 +371,13 @@
/// Colour must be #AARRGGBB or #RRGGBB hex string.
var/colour
- /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details.
+ /// See https://discord.com/developers/docs/resources/message#embed-object-embed-image-structure for details.
var/datum/tgs_chat_embed/media/image
- /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-thumbnail-structure for details.
+ /// See https://discord.com/developers/docs/resources/message#embed-object-embed-thumbnail-structure for details.
var/datum/tgs_chat_embed/media/thumbnail
- /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details.
+ /// See https://discord.com/developers/docs/resources/message#embed-object-embed-video-structure for details.
var/datum/tgs_chat_embed/media/video
var/datum/tgs_chat_embed/footer/footer
@@ -346,7 +386,7 @@
var/list/datum/tgs_chat_embed/field/fields
-/// Common datum for similar discord embed medias.
+/// Common datum for similar Discord embed medias.
/datum/tgs_chat_embed/media
/// Must be set in New().
var/url
@@ -354,6 +394,7 @@
var/height
var/proxy_url
+/// Create a [/datum/tgs_chat_embed].
/datum/tgs_chat_embed/media/New(url)
..()
if(!istext(url))
@@ -361,13 +402,14 @@
src.url = url
-/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure for details.
+/// See https://discord.com/developers/docs/resources/message#embed-object-embed-footer-structure for details.
/datum/tgs_chat_embed/footer
/// Must be set in New().
var/text
var/icon_url
var/proxy_icon_url
+/// Create a [/datum/tgs_chat_embed/footer].
/datum/tgs_chat_embed/footer/New(text)
..()
if(!istext(text))
@@ -375,16 +417,17 @@
src.text = text
-/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-provider-structure for details.
+/// See https://discord.com/developers/docs/resources/message#embed-object-embed-provider-structure for details.
/datum/tgs_chat_embed/provider
var/name
var/url
-/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-author-structure for details. Must have name set in New().
+/// See https://discord.com/developers/docs/resources/message#embed-object-embed-author-structure for details. Must have name set in New().
/datum/tgs_chat_embed/provider/author
var/icon_url
var/proxy_icon_url
+/// Create a [/datum/tgs_chat_embed/footer].
/datum/tgs_chat_embed/provider/author/New(name)
..()
if(!istext(name))
@@ -392,12 +435,15 @@
src.name = name
-/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-field-structure for details. Must have name and value set in New().
+/// See https://discord.com/developers/docs/resources/message#embed-object-embed-field-structure for details.
/datum/tgs_chat_embed/field
+ /// Must be set in New().
var/name
+ /// Must be set in New().
var/value
var/is_inline
+/// Create a [/datum/tgs_chat_embed/field].
/datum/tgs_chat_embed/field/New(name, value)
..()
if(!istext(name))
diff --git a/code/game/objects/items/storage/misc.dm b/code/game/objects/items/storage/misc.dm
index 12f6fbb3d0..19e680a197 100644
--- a/code/game/objects/items/storage/misc.dm
+++ b/code/game/objects/items/storage/misc.dm
@@ -146,7 +146,7 @@
w_class = SIZE_LARGE
max_w_class = SIZE_MEDIUM
storage_slots = 3
-
+
/obj/item/storage/box/M1911_loadout/fill_preset_inventory()
new /obj/item/weapon/gun/pistol/m1911(src)
new /obj/item/ammo_magazine/pistol/m1911(src)
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index 32364e1072..7c294da311 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -61,33 +61,9 @@
"nano/templates/",
)
-/datum/asset/directory/nanoui/weapons
- common_dirs = list(
- "nano/images/weapons/",
- )
-
- uncommon_dirs = list()
-
-/datum/asset/directory/nanoui/weapons/send(client)
- if(!client)
- log_debug("Warning! Tried to send nanoui weapon data with a null client! (asset_list_items.dm line 93)")
- return
- SSassets.transport.send_assets(client, common)
-
-
/datum/asset/simple/nanoui_images
keep_local_name = TRUE
- assets = list(
- "auto.png" = 'nano/images/weapons/auto.png',
- "burst.png" = 'nano/images/weapons/burst.png',
- "single.png" = 'nano/images/weapons/single.png',
- "disabled_automatic.png" = 'nano/images/weapons/disabled_automatic.png',
- "disabled_burst.png" = 'nano/images/weapons/disabled_burst.png',
- "disabled_single.png" = 'nano/images/weapons/disabled_single.png',
- "no_name.png" = 'nano/images/weapons/no_name.png',
- )
-
var/list/common_dirs = list(
"nano/images/",
)
@@ -384,9 +360,29 @@
name = "gunlineart"
/datum/asset/spritesheet/gun_lineart/register()
- InsertAll("", 'icons/obj/items/weapons/guns/lineart.dmi')
+ var/icon_file = 'icons/obj/items/weapons/guns/lineart.dmi'
+ InsertAll("", icon_file)
+
+ for(var/obj/item/weapon/gun/current_gun as anything in subtypesof(/obj/item/weapon/gun))
+ if(isnull(initial(current_gun.icon_state)))
+ continue
+ if(initial(current_gun.flags_gun_features) & GUN_UNUSUAL_DESIGN)
+ continue // These don't have a way to inspect weapon stats
+ var/obj/item/weapon/gun/temp_gun = new current_gun
+ var/icon_state = temp_gun.base_gun_icon // base_gun_icon is set in Initialize generally
+ qdel(temp_gun)
+ if(icon_state && isnull(sprites[icon_state]))
+ // upgrade this to a stack_trace once all guns have a lineart and we want to lint against that
+ log_debug("[current_gun] does not have a valid lineart icon state, icon=[icon_file], icon_state=[json_encode(icon_state)]")
+
..()
+/datum/asset/spritesheet/gun_lineart_modes
+ name = "gunlineartmodes"
+
+/datum/asset/spritesheet/gun_lineart_modes/register()
+ InsertAll("", 'icons/obj/items/weapons/guns/lineart_modes.dmi')
+ ..()
/datum/asset/simple/orbit
assets = list(
@@ -400,17 +396,6 @@
"ntosradarpointerS.png" = 'icons/images/ui_images/ntosradar_pointer_S.png'
)
-/datum/asset/simple/firemodes
- assets = list(
- "auto.png" = 'html/images/auto.png',
- "disabled_auto.png" = 'html/images/disabled_automatic.png',
- "burst.png" = 'html/images/burst.png',
- "disabled_burst.png" = 'html/images/disabled_burst.png',
- "single.png" = 'html/images/single.png',
- "disabled_single.png" = 'html/images/disabled_single.png',
- )
-
-
/datum/asset/simple/particle_editor
assets = list(
"motion" = 'icons/images/ui_images/particle_editor/motion.png',
diff --git a/code/modules/autowiki/pages/guns.dm b/code/modules/autowiki/pages/guns.dm
index ad675c51a4..7f63602d56 100644
--- a/code/modules/autowiki/pages/guns.dm
+++ b/code/modules/autowiki/pages/guns.dm
@@ -7,14 +7,18 @@
var/list/gun_to_ammo = list()
- for(var/obj/item/ammo_magazine/typepath as anything in subtypesof(/obj/item/ammo_magazine) - subtypesof(/obj/item/ammo_magazine/internal))
+ for(var/obj/item/ammo_magazine/typepath as anything in subtypesof(/obj/item/ammo_magazine) - typesof(/obj/item/ammo_magazine/internal))
+ if(isnull(initial(typepath.icon_state)))
+ continue // Skip mags with no icon_state (e.g. base types)
LAZYADD(gun_to_ammo[initial(typepath.gun_type)], typepath)
for(var/typepath in sort_list(subtypesof(/obj/item/weapon/gun), GLOBAL_PROC_REF(cmp_typepaths_asc)))
- var/obj/item/weapon/gun/generating_gun = new typepath()
+ var/obj/item/weapon/gun/generating_gun = typepath
+ if(isnull(initial(generating_gun.icon_state)))
+ continue // Skip guns with no icon_state (e.g. base types)
+ generating_gun = new typepath()
var/filename = SANITIZE_FILENAME(escape_value(format_text(generating_gun.name)))
-
var/list/gun_data = generating_gun.ui_data()
var/list/valid_mag_types = list()
@@ -70,6 +74,8 @@
var/list/attachments_by_slot = list()
for(var/obj/item/attachable/attachment_typepath as anything in generating_gun.attachable_allowed)
+ if(isnull(initial(attachment_typepath.icon_state)))
+ continue // Skip attachments with no icon_state (e.g. base types)
LAZYADD(attachments_by_slot[capitalize(initial(attachment_typepath.slot))], attachment_typepath)
var/attachments = ""
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index d7cd69d206..ef0a90f0f5 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -73,6 +73,7 @@ var/global/list/gear_datums_by_name = list()
/datum/gear/eyewear/sunglasses
display_name = "Sunglasses"
path = /obj/item/clothing/glasses/sunglasses
+ cost = 0
/datum/gear/eyewear/prescription_sunglasses
display_name = "Prescription sunglasses"
@@ -279,6 +280,10 @@ var/global/list/gear_datums_by_name = list()
display_name = "USCM cap"
path = /obj/item/clothing/head/cmcap
+/datum/gear/headwear/uscm/cap/flap
+ display_name = "USCM flapcap"
+ path = /obj/item/clothing/head/cmcap/flap
+
/datum/gear/headwear/uscm/headband_brown
display_name = "USCM headband, brown"
path = /obj/item/clothing/head/headband/brown
@@ -1083,7 +1088,7 @@ var/global/list/gear_datums_by_name = list()
/datum/gear/misc/patch_uscm
display_name = "USCM shoulder patch"
path = /obj/item/clothing/accessory/patch
- cost = 1
+ cost = 0
slot = WEAR_IN_ACCESSORY
allowed_origins = USCM_ORIGINS
@@ -1117,3 +1122,8 @@ var/global/list/gear_datums_by_name = list()
display_name = "M67 flak jacket"
path = /obj/item/clothing/accessory/flak
cost = 3
+
+/datum/gear/misc/servicejacket
+ display_name = "Marine Service Jacket"
+ path = /obj/item/clothing/suit/storage/jacket/marine/service
+ cost = 3
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 70b0ad3b41..7dc0a56943 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -608,14 +608,13 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
gun_recoil = recoil_buildup
var/penetration = 0
- var/armor_punch = 0
var/accuracy = 0
var/min_accuracy = 0
var/max_range = 0
+ var/effective_range = 0
var/scatter = 0
var/list/damage_armor_profile_xeno = list()
var/list/damage_armor_profile_marine = list()
- var/list/damage_armor_profile_armorbreak = list()
var/list/damage_armor_profile_headers = list()
var/datum/ammo/in_ammo
@@ -638,35 +637,26 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
falloff = in_ammo.damage_falloff * damage_falloff_mult
penetration = in_ammo.penetration
- armor_punch = in_ammo.damage_armor_punch
accuracy = in_ammo.accurate_range
min_accuracy = in_ammo.accurate_range_min
max_range = in_ammo.max_range
+ effective_range = in_ammo.effective_range_max
scatter = in_ammo.scatter
for(var/i = 0; i<=CODEX_ARMOR_MAX; i+=CODEX_ARMOR_STEP)
damage_armor_profile_headers.Add(i)
- damage_armor_profile_marine.Add(round(armor_damage_reduction(GLOB.marine_ranged_stats, damage, i, penetration)))
- damage_armor_profile_xeno.Add(round(armor_damage_reduction(GLOB.xeno_ranged_stats, damage, i, penetration)))
- if(!GLOB.xeno_general.armor_ignore_integrity)
- if(i != 0)
- damage_armor_profile_armorbreak.Add("[round(armor_break_calculation(GLOB.xeno_ranged_stats, damage, i, penetration, in_ammo.pen_armor_punch, armor_punch)/i)]%")
- else
- damage_armor_profile_armorbreak.Add("N/A")
+ damage_armor_profile_marine.Add(floor(armor_damage_reduction(GLOB.marine_ranged_stats, damage, i, penetration)))
+ damage_armor_profile_xeno.Add(floor(armor_damage_reduction(GLOB.xeno_ranged_stats, damage, i, penetration)))
var/rpm = max(fire_delay, 1)
var/burst_rpm = max((fire_delay * 1.5 + (burst_amount - 1) * burst_delay)/max(burst_amount, 1), 0.0001)
// weapon info
- data["icon"] = SSassets.transport.get_asset_url("no_name.png")
-
- if(SSassets.cache["[base_gun_icon].png"])
- data["icon"] = SSassets.transport.get_asset_url("[base_gun_icon].png")
-
+ data["icon"] = base_gun_icon
data["name"] = name
data["desc"] = desc
data["two_handed_only"] = (flags_gun_features & GUN_WIELDED_FIRING_ONLY)
@@ -688,19 +678,18 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
data["damage"] = damage
data["falloff"] = falloff
data["total_projectile_amount"] = bonus_projectile_amount+1
- data["armor_punch"] = armor_punch
data["penetration"] = penetration
data["accuracy"] = accuracy * accuracy_mult
data["unwielded_accuracy"] = accuracy * accuracy_mult_unwielded
data["min_accuracy"] = min_accuracy
data["max_range"] = max_range
+ data["effective_range"] = effective_range
// damage table data
data["damage_armor_profile_headers"] = damage_armor_profile_headers
data["damage_armor_profile_marine"] = damage_armor_profile_marine
data["damage_armor_profile_xeno"] = damage_armor_profile_xeno
- data["damage_armor_profile_armorbreak"] = damage_armor_profile_armorbreak
return data
@@ -715,10 +704,10 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
data["damage_max"] = 100
data["accuracy_max"] = 32
data["range_max"] = 32
+ data["effective_range_max"] = EFFECTIVE_RANGE_MAX_TIER_4
data["falloff_max"] = DAMAGE_FALLOFF_TIER_1
data["penetration_max"] = ARMOR_PENETRATION_TIER_10
data["punch_max"] = 5
- data["glob_armourbreak"] = GLOB.xeno_general.armor_ignore_integrity
data["automatic"] = (GUN_FIREMODE_AUTOMATIC in gun_firemode_list)
data["auto_only"] = ((length(gun_firemode_list) == 1) && (GUN_FIREMODE_AUTOMATIC in gun_firemode_list))
@@ -726,8 +715,8 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w
/obj/item/weapon/gun/ui_assets(mob/user)
. = ..() || list()
- . += get_asset_datum(/datum/asset/simple/firemodes)
- //. += get_asset_datum(/datum/asset/spritesheet/gun_lineart)
+ . += get_asset_datum(/datum/asset/spritesheet/gun_lineart_modes)
+ . += get_asset_datum(/datum/asset/spritesheet/gun_lineart)
// END TGUI \\
diff --git a/code/modules/projectiles/guns/pistols.dm b/code/modules/projectiles/guns/pistols.dm
index ae8bef53f6..3397c75457 100644
--- a/code/modules/projectiles/guns/pistols.dm
+++ b/code/modules/projectiles/guns/pistols.dm
@@ -236,7 +236,6 @@
icon = 'icons/obj/items/weapons/guns/guns_by_faction/colony.dmi'
icon_state = "c_deagle"
item_state = "c_deagle"
- base_gun_icon = "c_deagle"
current_mag = /obj/item/ammo_magazine/pistol/heavy/super/highimpact
black_market_value = 100
@@ -257,7 +256,6 @@
desc = "A Desert Eagle anodized in gold and adorned with rosewood grips. The living definition of ostentatious, it's flashy, unwieldy, tremendously heavy, and kicks like a mule. But as a symbol of power, there's nothing like it."
icon_state = "g_deagle"
item_state = "g_deagle"
- base_gun_icon = "g_deagle"
//-------------------------------------------------------
//NP92 pistol
@@ -588,7 +586,7 @@
name = "\improper 88 Mod 4 combat pistol"
desc = "Standard issue USCM firearm. Also found in the hands of Weyland-Yutani PMC teams. Fires 9mm armor shredding rounds and is capable of 3-round burst."
icon = 'icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi'
- icon_state = "88m4"
+ icon_state = "_88m4" // to comply with css standards
item_state = "88m4"
fire_sound = "88m4"
firesound_volume = 20
diff --git a/code/modules/tgs/README.md b/code/modules/tgs/README.md
index 6319028d81..35ca73d7e9 100644
--- a/code/modules/tgs/README.md
+++ b/code/modules/tgs/README.md
@@ -1,6 +1,6 @@
# DMAPI Internals
-This folder should be placed on it's own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified.
+This folder should be placed on its own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified.
- [includes.dm](./includes.dm) is the file that should be included by DM code, it handles including the rest.
- The [core](./core) folder includes all code not directly part of any API version.
diff --git a/code/modules/tgs/core/README.md b/code/modules/tgs/core/README.md
index b82d8f49e2..965e21b549 100644
--- a/code/modules/tgs/core/README.md
+++ b/code/modules/tgs/core/README.md
@@ -3,7 +3,7 @@
This folder contains all DMAPI code not directly involved in an API.
- [_definitions.dm](./definitions.dm) contains defines needed across DMAPI internals.
+- [byond_world_export.dm](./byond_world_export.dm) contains the default `/datum/tgs_http_handler` implementation which uses `world.Export()`.
- [core.dm](./core.dm) contains the implementations of the `/world/proc/TgsXXX()` procs. Many map directly to the `/datum/tgs_api` functions. It also contains the /datum selection and setup code.
- [datum.dm](./datum.dm) contains the `/datum/tgs_api` declarations that all APIs must implement.
- [tgs_version.dm](./tgs_version.dm) contains the `/datum/tgs_version` definition
--
diff --git a/code/modules/tgs/core/byond_world_export.dm b/code/modules/tgs/core/byond_world_export.dm
new file mode 100644
index 0000000000..6ef8d841b8
--- /dev/null
+++ b/code/modules/tgs/core/byond_world_export.dm
@@ -0,0 +1,22 @@
+/datum/tgs_http_handler/byond_world_export
+
+/datum/tgs_http_handler/byond_world_export/PerformGet(url)
+ // This is an infinite sleep until we get a response
+ var/export_response = world.Export(url)
+ TGS_DEBUG_LOG("byond_world_export: Export complete")
+
+ if(!export_response)
+ TGS_ERROR_LOG("byond_world_export: Failed request: [url]")
+ return new /datum/tgs_http_result(null, FALSE)
+
+ var/content = export_response["CONTENT"]
+ if(!content)
+ TGS_ERROR_LOG("byond_world_export: Failed request, missing content!")
+ return new /datum/tgs_http_result(null, FALSE)
+
+ var/response_json = TGS_FILE2TEXT_NATIVE(content)
+ if(!response_json)
+ TGS_ERROR_LOG("byond_world_export: Failed request, failed to load content!")
+ return new /datum/tgs_http_result(null, FALSE)
+
+ return new /datum/tgs_http_result(response_json, TRUE)
diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm
index 15622228e9..63cb5a2c35 100644
--- a/code/modules/tgs/core/core.dm
+++ b/code/modules/tgs/core/core.dm
@@ -1,4 +1,4 @@
-/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE)
+/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE, datum/tgs_http_handler/http_handler = null)
var/current_api = TGS_READ_GLOBAL(tgs)
if(current_api)
TGS_ERROR_LOG("API datum already set (\ref[current_api] ([current_api]))! Was TgsNew() called more than once?")
@@ -55,7 +55,10 @@
TGS_ERROR_LOG("Invalid parameter for event_handler: [event_handler]")
event_handler = null
- var/datum/tgs_api/new_api = new api_datum(event_handler, version)
+ if(!http_handler)
+ http_handler = new /datum/tgs_http_handler/byond_world_export
+
+ var/datum/tgs_api/new_api = new api_datum(event_handler, version, http_handler)
TGS_WRITE_GLOBAL(tgs, new_api)
diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm
index f734fd0527..3ca53e9bf7 100644
--- a/code/modules/tgs/core/datum.dm
+++ b/code/modules/tgs/core/datum.dm
@@ -6,7 +6,7 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null)
var/list/warned_deprecated_command_runs
-/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version)
+/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version, datum/tgs_http_handler/http_handler)
..()
src.event_handler = event_handler
src.version = version
diff --git a/code/modules/tgs/includes.dm b/code/modules/tgs/includes.dm
index 23b714f9d0..f5118ed55a 100644
--- a/code/modules/tgs/includes.dm
+++ b/code/modules/tgs/includes.dm
@@ -1,4 +1,5 @@
#include "core\_definitions.dm"
+#include "core\byond_world_export.dm"
#include "core\core.dm"
#include "core\datum.dm"
#include "core\tgs_version.dm"
diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm
index 95b8edd3ee..3e328fc7c2 100644
--- a/code/modules/tgs/v5/api.dm
+++ b/code/modules/tgs/v5/api.dm
@@ -31,9 +31,12 @@
var/detached = FALSE
-/datum/tgs_api/v5/New()
+ var/datum/tgs_http_handler/http_handler
+
+/datum/tgs_api/v5/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version, datum/tgs_http_handler/http_handler)
. = ..()
interop_version = version
+ src.http_handler = http_handler
TGS_DEBUG_LOG("V5 API created: [json_encode(args)]")
/datum/tgs_api/v5/ApiVersion()
@@ -50,7 +53,9 @@
version = null // we want this to be the TGS version, not the interop version
// sleep once to prevent an issue where world.Export on the first tick can hang indefinitely
+ TGS_DEBUG_LOG("Starting Export bug prevention sleep tick. time:[world.time] sleep_offline:[world.sleep_offline]")
sleep(world.tick_lag)
+ TGS_DEBUG_LOG("Export bug prevention sleep complete")
var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands(), DMAPI5_PARAMETER_TOPIC_PORT = GetTopicPort()))
if(!istype(bridge_response))
diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm
index 0c5e701a32..62201fcc9e 100644
--- a/code/modules/tgs/v5/bridge.dm
+++ b/code/modules/tgs/v5/bridge.dm
@@ -78,27 +78,24 @@
WaitForReattach(FALSE)
TGS_DEBUG_LOG("Bridge request start")
- // This is an infinite sleep until we get a response
- var/export_response = world.Export(bridge_request)
+ var/datum/tgs_http_result/result = http_handler.PerformGet(bridge_request)
TGS_DEBUG_LOG("Bridge request complete")
- if(!export_response)
- TGS_ERROR_LOG("Failed bridge request: [bridge_request]")
+ if(isnull(result))
+ TGS_ERROR_LOG("Failed bridge request, handler returned null!")
return
- var/content = export_response["CONTENT"]
- if(!content)
- TGS_ERROR_LOG("Failed bridge request, missing content!")
+ if(!istype(result) || result.type != /datum/tgs_http_result)
+ TGS_ERROR_LOG("Failed bridge request, handler returned non-[/datum/tgs_http_result]!")
return
- var/response_json = TGS_FILE2TEXT_NATIVE(content)
- if(!response_json)
- TGS_ERROR_LOG("Failed bridge request, failed to load content!")
+ if(!result.success)
+ TGS_DEBUG_LOG("Failed bridge request, HTTP request failed!")
return
- var/list/bridge_response = json_decode(response_json)
+ var/list/bridge_response = json_decode(result.response_text)
if(!bridge_response)
- TGS_ERROR_LOG("Failed bridge request, bad json: [response_json]")
+ TGS_ERROR_LOG("Failed bridge request, bad json: [result.response_text]")
return
var/error = bridge_response[DMAPI5_RESPONSE_ERROR_MESSAGE]
diff --git a/code/modules/unit_tests/spritesheets.dm b/code/modules/unit_tests/spritesheets.dm
index c7c16c6535..142d3f9588 100644
--- a/code/modules/unit_tests/spritesheets.dm
+++ b/code/modules/unit_tests/spritesheets.dm
@@ -2,6 +2,7 @@
/datum/unit_test/spritesheets
/datum/unit_test/spritesheets/Run()
+ var/regex/valid_css_class = new(@"^([\l_][\w\-]|[\l_\-][\l_])")
for(var/datum/asset/spritesheet/sheet as anything in subtypesof(/datum/asset/spritesheet))
if(!initial(sheet.name)) //Ignore abstract types
continue
@@ -9,3 +10,6 @@
for(var/sprite_name in sheet.sprites)
if(!sprite_name)
TEST_FAIL("Spritesheet [sheet.type] has a nameless icon state.")
+ if(!valid_css_class.Find(sprite_name))
+ // https://www.w3.org/TR/CSS2/syndata.html#value-def-identifier
+ TEST_FAIL("Spritesheet [sheet.type] has a icon state that doesn't comply with css standards: '[sprite_name]'.")
diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml
index 050c64bd12..b8745e8c53 100644
--- a/html/changelogs/archive/2024-08.yml
+++ b/html/changelogs/archive/2024-08.yml
@@ -76,3 +76,6 @@
xDanilcusx:
- bugfix: AI can track through electrified/locked/welded doors
- code_imp: AI now doesn't swipe on poddoors and shutters, opening them instead
+2024-08-19:
+ Doubleumc:
+ - bugfix: fixed WeaponStats TGUI
diff --git a/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi b/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi
index c5946b587a..e57c625158 100644
Binary files a/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi and b/icons/obj/items/weapons/guns/guns_by_faction/uscm.dmi differ
diff --git a/icons/obj/items/weapons/guns/lineart.dmi b/icons/obj/items/weapons/guns/lineart.dmi
index 35241cf3a3..6920290c7e 100644
Binary files a/icons/obj/items/weapons/guns/lineart.dmi and b/icons/obj/items/weapons/guns/lineart.dmi differ
diff --git a/icons/obj/items/weapons/guns/lineart_modes.dmi b/icons/obj/items/weapons/guns/lineart_modes.dmi
new file mode 100644
index 0000000000..787fdd34f2
Binary files /dev/null and b/icons/obj/items/weapons/guns/lineart_modes.dmi differ
diff --git a/nano/images/weapons/88m4.png b/nano/images/weapons/88m4.png
deleted file mode 100644
index 77faa65720..0000000000
Binary files a/nano/images/weapons/88m4.png and /dev/null differ
diff --git a/nano/images/weapons/aamateba.png b/nano/images/weapons/aamateba.png
deleted file mode 100644
index 30a5c1c72c..0000000000
Binary files a/nano/images/weapons/aamateba.png and /dev/null differ
diff --git a/nano/images/weapons/amateba.png b/nano/images/weapons/amateba.png
deleted file mode 100644
index 6d411d2ad7..0000000000
Binary files a/nano/images/weapons/amateba.png and /dev/null differ
diff --git a/nano/images/weapons/auto.png b/nano/images/weapons/auto.png
deleted file mode 100644
index 7efc6ff1c8..0000000000
Binary files a/nano/images/weapons/auto.png and /dev/null differ
diff --git a/nano/images/weapons/auto9.png b/nano/images/weapons/auto9.png
deleted file mode 100644
index 8fbc101f2f..0000000000
Binary files a/nano/images/weapons/auto9.png and /dev/null differ
diff --git a/nano/images/weapons/b92fs.png b/nano/images/weapons/b92fs.png
deleted file mode 100644
index 2788124dfb..0000000000
Binary files a/nano/images/weapons/b92fs.png and /dev/null differ
diff --git a/nano/images/weapons/burst.png b/nano/images/weapons/burst.png
deleted file mode 100644
index 669bd676eb..0000000000
Binary files a/nano/images/weapons/burst.png and /dev/null differ
diff --git a/nano/images/weapons/c70.png b/nano/images/weapons/c70.png
deleted file mode 100644
index b7e2ed731b..0000000000
Binary files a/nano/images/weapons/c70.png and /dev/null differ
diff --git a/nano/images/weapons/c_deagle.png b/nano/images/weapons/c_deagle.png
deleted file mode 100644
index c2a5c991ac..0000000000
Binary files a/nano/images/weapons/c_deagle.png and /dev/null differ
diff --git a/nano/images/weapons/cmateba.png b/nano/images/weapons/cmateba.png
deleted file mode 100644
index f949d4b547..0000000000
Binary files a/nano/images/weapons/cmateba.png and /dev/null differ
diff --git a/nano/images/weapons/cshotgun.png b/nano/images/weapons/cshotgun.png
deleted file mode 100644
index 9820f58546..0000000000
Binary files a/nano/images/weapons/cshotgun.png and /dev/null differ
diff --git a/nano/images/weapons/dartgun.png b/nano/images/weapons/dartgun.png
deleted file mode 100644
index 218dc742dc..0000000000
Binary files a/nano/images/weapons/dartgun.png and /dev/null differ
diff --git a/nano/images/weapons/deagle.png b/nano/images/weapons/deagle.png
deleted file mode 100644
index 059a730d7e..0000000000
Binary files a/nano/images/weapons/deagle.png and /dev/null differ
diff --git a/nano/images/weapons/disabled_automatic.png b/nano/images/weapons/disabled_automatic.png
deleted file mode 100644
index 94da079d80..0000000000
Binary files a/nano/images/weapons/disabled_automatic.png and /dev/null differ
diff --git a/nano/images/weapons/disabled_burst.png b/nano/images/weapons/disabled_burst.png
deleted file mode 100644
index 71b88bcaf9..0000000000
Binary files a/nano/images/weapons/disabled_burst.png and /dev/null differ
diff --git a/nano/images/weapons/disabled_single.png b/nano/images/weapons/disabled_single.png
deleted file mode 100644
index bf2cef4b15..0000000000
Binary files a/nano/images/weapons/disabled_single.png and /dev/null differ
diff --git a/nano/images/weapons/dshotgun.png b/nano/images/weapons/dshotgun.png
deleted file mode 100644
index cd79598281..0000000000
Binary files a/nano/images/weapons/dshotgun.png and /dev/null differ
diff --git a/nano/images/weapons/fp9000.png b/nano/images/weapons/fp9000.png
deleted file mode 100644
index b9f971eb07..0000000000
Binary files a/nano/images/weapons/fp9000.png and /dev/null differ
diff --git a/nano/images/weapons/fp9000_pmc.png b/nano/images/weapons/fp9000_pmc.png
deleted file mode 100644
index b9f971eb07..0000000000
Binary files a/nano/images/weapons/fp9000_pmc.png and /dev/null differ
diff --git a/nano/images/weapons/g_deagle.png b/nano/images/weapons/g_deagle.png
deleted file mode 100644
index c2a5c991ac..0000000000
Binary files a/nano/images/weapons/g_deagle.png and /dev/null differ
diff --git a/nano/images/weapons/hg3712.png b/nano/images/weapons/hg3712.png
deleted file mode 100644
index f7f32190c4..0000000000
Binary files a/nano/images/weapons/hg3712.png and /dev/null differ
diff --git a/nano/images/weapons/highpower.png b/nano/images/weapons/highpower.png
deleted file mode 100644
index a7d25c4480..0000000000
Binary files a/nano/images/weapons/highpower.png and /dev/null differ
diff --git a/nano/images/weapons/holdout.png b/nano/images/weapons/holdout.png
deleted file mode 100644
index 1d6f26fad2..0000000000
Binary files a/nano/images/weapons/holdout.png and /dev/null differ
diff --git a/nano/images/weapons/hunting.png b/nano/images/weapons/hunting.png
deleted file mode 100644
index 5d9613117f..0000000000
Binary files a/nano/images/weapons/hunting.png and /dev/null differ
diff --git a/nano/images/weapons/kt42.png b/nano/images/weapons/kt42.png
deleted file mode 100644
index ecf0ee41a9..0000000000
Binary files a/nano/images/weapons/kt42.png and /dev/null differ
diff --git a/nano/images/weapons/l42mk1.png b/nano/images/weapons/l42mk1.png
deleted file mode 100644
index b5efcc14d3..0000000000
Binary files a/nano/images/weapons/l42mk1.png and /dev/null differ
diff --git a/nano/images/weapons/m16.png b/nano/images/weapons/m16.png
deleted file mode 100644
index 2287f73196..0000000000
Binary files a/nano/images/weapons/m16.png and /dev/null differ
diff --git a/nano/images/weapons/m240.png b/nano/images/weapons/m240.png
deleted file mode 100644
index 72eb477c9e..0000000000
Binary files a/nano/images/weapons/m240.png and /dev/null differ
diff --git a/nano/images/weapons/m240t.png b/nano/images/weapons/m240t.png
deleted file mode 100644
index 619551d690..0000000000
Binary files a/nano/images/weapons/m240t.png and /dev/null differ
diff --git a/nano/images/weapons/m37-17.png b/nano/images/weapons/m37-17.png
deleted file mode 100644
index 7d53cbd761..0000000000
Binary files a/nano/images/weapons/m37-17.png and /dev/null differ
diff --git a/nano/images/weapons/m37.png b/nano/images/weapons/m37.png
deleted file mode 100644
index f888adaeb6..0000000000
Binary files a/nano/images/weapons/m37.png and /dev/null differ
diff --git a/nano/images/weapons/m39.png b/nano/images/weapons/m39.png
deleted file mode 100644
index f6fbb0a489..0000000000
Binary files a/nano/images/weapons/m39.png and /dev/null differ
diff --git a/nano/images/weapons/m41a.png b/nano/images/weapons/m41a.png
deleted file mode 100644
index 9476e0d1f4..0000000000
Binary files a/nano/images/weapons/m41a.png and /dev/null differ
diff --git a/nano/images/weapons/m41a2.png b/nano/images/weapons/m41a2.png
deleted file mode 100644
index 4179cb37f5..0000000000
Binary files a/nano/images/weapons/m41a2.png and /dev/null differ
diff --git a/nano/images/weapons/m41ae2.png b/nano/images/weapons/m41ae2.png
deleted file mode 100644
index 4a5232fd66..0000000000
Binary files a/nano/images/weapons/m41ae2.png and /dev/null differ
diff --git a/nano/images/weapons/m41amk1.png b/nano/images/weapons/m41amk1.png
deleted file mode 100644
index 3f44c62b0f..0000000000
Binary files a/nano/images/weapons/m41amk1.png and /dev/null differ
diff --git a/nano/images/weapons/m41b.png b/nano/images/weapons/m41b.png
deleted file mode 100644
index 1d63443f25..0000000000
Binary files a/nano/images/weapons/m41b.png and /dev/null differ
diff --git a/nano/images/weapons/m42a.png b/nano/images/weapons/m42a.png
deleted file mode 100644
index f0d07328c1..0000000000
Binary files a/nano/images/weapons/m42a.png and /dev/null differ
diff --git a/nano/images/weapons/m42c.png b/nano/images/weapons/m42c.png
deleted file mode 100644
index 47d53b86ce..0000000000
Binary files a/nano/images/weapons/m42c.png and /dev/null differ
diff --git a/nano/images/weapons/m44r.png b/nano/images/weapons/m44r.png
deleted file mode 100644
index d7deb2589e..0000000000
Binary files a/nano/images/weapons/m44r.png and /dev/null differ
diff --git a/nano/images/weapons/m44rc.png b/nano/images/weapons/m44rc.png
deleted file mode 100644
index 1c20973a0a..0000000000
Binary files a/nano/images/weapons/m44rc.png and /dev/null differ
diff --git a/nano/images/weapons/m46c.png b/nano/images/weapons/m46c.png
deleted file mode 100644
index d404a6d88f..0000000000
Binary files a/nano/images/weapons/m46c.png and /dev/null differ
diff --git a/nano/images/weapons/m4a3.png b/nano/images/weapons/m4a3.png
deleted file mode 100644
index 9169c71c51..0000000000
Binary files a/nano/images/weapons/m4a3.png and /dev/null differ
diff --git a/nano/images/weapons/m4a345.png b/nano/images/weapons/m4a345.png
deleted file mode 100644
index 1ba0015846..0000000000
Binary files a/nano/images/weapons/m4a345.png and /dev/null differ
diff --git a/nano/images/weapons/m4a3c.png b/nano/images/weapons/m4a3c.png
deleted file mode 100644
index 95731a6c71..0000000000
Binary files a/nano/images/weapons/m4a3c.png and /dev/null differ
diff --git a/nano/images/weapons/m5.png b/nano/images/weapons/m5.png
deleted file mode 100644
index 7d502fdaaf..0000000000
Binary files a/nano/images/weapons/m5.png and /dev/null differ
diff --git a/nano/images/weapons/m56.png b/nano/images/weapons/m56.png
deleted file mode 100644
index baf9b9bd9c..0000000000
Binary files a/nano/images/weapons/m56.png and /dev/null differ
diff --git a/nano/images/weapons/m57a4.png b/nano/images/weapons/m57a4.png
deleted file mode 100644
index 6c2cbcbdbe..0000000000
Binary files a/nano/images/weapons/m57a4.png and /dev/null differ
diff --git a/nano/images/weapons/m60.png b/nano/images/weapons/m60.png
deleted file mode 100644
index 08baffaa74..0000000000
Binary files a/nano/images/weapons/m60.png and /dev/null differ
diff --git a/nano/images/weapons/m79.png b/nano/images/weapons/m79.png
deleted file mode 100644
index 365280f242..0000000000
Binary files a/nano/images/weapons/m79.png and /dev/null differ
diff --git a/nano/images/weapons/m81.png b/nano/images/weapons/m81.png
deleted file mode 100644
index 7b1a6a195b..0000000000
Binary files a/nano/images/weapons/m81.png and /dev/null differ
diff --git a/nano/images/weapons/m82f.png b/nano/images/weapons/m82f.png
deleted file mode 100644
index f6d5e24ec8..0000000000
Binary files a/nano/images/weapons/m82f.png and /dev/null differ
diff --git a/nano/images/weapons/m92.png b/nano/images/weapons/m92.png
deleted file mode 100644
index ce64c3df36..0000000000
Binary files a/nano/images/weapons/m92.png and /dev/null differ
diff --git a/nano/images/weapons/m93b2.png b/nano/images/weapons/m93b2.png
deleted file mode 100644
index 987f56643a..0000000000
Binary files a/nano/images/weapons/m93b2.png and /dev/null differ
diff --git a/nano/images/weapons/mac15.png b/nano/images/weapons/mac15.png
deleted file mode 100644
index 179c8b7a61..0000000000
Binary files a/nano/images/weapons/mac15.png and /dev/null differ
diff --git a/nano/images/weapons/mar30.png b/nano/images/weapons/mar30.png
deleted file mode 100644
index 3a5c19f336..0000000000
Binary files a/nano/images/weapons/mar30.png and /dev/null differ
diff --git a/nano/images/weapons/mar40.png b/nano/images/weapons/mar40.png
deleted file mode 100644
index 043d6529ef..0000000000
Binary files a/nano/images/weapons/mar40.png and /dev/null differ
diff --git a/nano/images/weapons/mateba.png b/nano/images/weapons/mateba.png
deleted file mode 100644
index 49ec3f897a..0000000000
Binary files a/nano/images/weapons/mateba.png and /dev/null differ
diff --git a/nano/images/weapons/mk221.png b/nano/images/weapons/mk221.png
deleted file mode 100644
index a15773fb26..0000000000
Binary files a/nano/images/weapons/mk221.png and /dev/null differ
diff --git a/nano/images/weapons/mou.png b/nano/images/weapons/mou.png
deleted file mode 100644
index a471e16f6e..0000000000
Binary files a/nano/images/weapons/mou.png and /dev/null differ
diff --git a/nano/images/weapons/mp5.png b/nano/images/weapons/mp5.png
deleted file mode 100644
index e36fccdca4..0000000000
Binary files a/nano/images/weapons/mp5.png and /dev/null differ
diff --git a/nano/images/weapons/mp7.png b/nano/images/weapons/mp7.png
deleted file mode 100644
index 9494c8003d..0000000000
Binary files a/nano/images/weapons/mp7.png and /dev/null differ
diff --git a/nano/images/weapons/no_name.png b/nano/images/weapons/no_name.png
deleted file mode 100644
index 8babb2fda5..0000000000
Binary files a/nano/images/weapons/no_name.png and /dev/null differ
diff --git a/nano/images/weapons/ny762.png b/nano/images/weapons/ny762.png
deleted file mode 100644
index bdd5fe500e..0000000000
Binary files a/nano/images/weapons/ny762.png and /dev/null differ
diff --git a/nano/images/weapons/painless.png b/nano/images/weapons/painless.png
deleted file mode 100644
index f493c662eb..0000000000
Binary files a/nano/images/weapons/painless.png and /dev/null differ
diff --git a/nano/images/weapons/pk9.png b/nano/images/weapons/pk9.png
deleted file mode 100644
index 7c66494637..0000000000
Binary files a/nano/images/weapons/pk9.png and /dev/null differ
diff --git a/nano/images/weapons/pk9r.png b/nano/images/weapons/pk9r.png
deleted file mode 100644
index be9adcd507..0000000000
Binary files a/nano/images/weapons/pk9r.png and /dev/null differ
diff --git a/nano/images/weapons/pk9u.png b/nano/images/weapons/pk9u.png
deleted file mode 100644
index 519f574f6e..0000000000
Binary files a/nano/images/weapons/pk9u.png and /dev/null differ
diff --git a/nano/images/weapons/ppsh17b.png b/nano/images/weapons/ppsh17b.png
deleted file mode 100644
index 4ea9e0214f..0000000000
Binary files a/nano/images/weapons/ppsh17b.png and /dev/null differ
diff --git a/nano/images/weapons/single.png b/nano/images/weapons/single.png
deleted file mode 100644
index 2f784868ca..0000000000
Binary files a/nano/images/weapons/single.png and /dev/null differ
diff --git a/nano/images/weapons/skorpion.png b/nano/images/weapons/skorpion.png
deleted file mode 100644
index 342fc75e3e..0000000000
Binary files a/nano/images/weapons/skorpion.png and /dev/null differ
diff --git a/nano/images/weapons/skorpion_u.png b/nano/images/weapons/skorpion_u.png
deleted file mode 100644
index 72128e1f46..0000000000
Binary files a/nano/images/weapons/skorpion_u.png and /dev/null differ
diff --git a/nano/images/weapons/smartpistol.png b/nano/images/weapons/smartpistol.png
deleted file mode 100644
index e688ac9260..0000000000
Binary files a/nano/images/weapons/smartpistol.png and /dev/null differ
diff --git a/nano/images/weapons/spearhead.png b/nano/images/weapons/spearhead.png
deleted file mode 100644
index 7b740dbdc5..0000000000
Binary files a/nano/images/weapons/spearhead.png and /dev/null differ
diff --git a/nano/images/weapons/sshotgun.png b/nano/images/weapons/sshotgun.png
deleted file mode 100644
index f052433653..0000000000
Binary files a/nano/images/weapons/sshotgun.png and /dev/null differ
diff --git a/nano/images/weapons/supremo.png b/nano/images/weapons/supremo.png
deleted file mode 100644
index 83f6a6fb4b..0000000000
Binary files a/nano/images/weapons/supremo.png and /dev/null differ
diff --git a/nano/images/weapons/svd003.png b/nano/images/weapons/svd003.png
deleted file mode 100644
index 6395b8d3b6..0000000000
Binary files a/nano/images/weapons/svd003.png and /dev/null differ
diff --git a/nano/images/weapons/sw357.png b/nano/images/weapons/sw357.png
deleted file mode 100644
index a89ea9cb2f..0000000000
Binary files a/nano/images/weapons/sw357.png and /dev/null differ
diff --git a/nano/images/weapons/sw358.png b/nano/images/weapons/sw358.png
deleted file mode 100644
index c24e72bfce..0000000000
Binary files a/nano/images/weapons/sw358.png and /dev/null differ
diff --git a/nano/images/weapons/syringegun.png b/nano/images/weapons/syringegun.png
deleted file mode 100644
index bf18bf425d..0000000000
Binary files a/nano/images/weapons/syringegun.png and /dev/null differ
diff --git a/nano/images/weapons/taser.png b/nano/images/weapons/taser.png
deleted file mode 100644
index 6337a89966..0000000000
Binary files a/nano/images/weapons/taser.png and /dev/null differ
diff --git a/nano/images/weapons/type71.png b/nano/images/weapons/type71.png
deleted file mode 100644
index 700ff164d6..0000000000
Binary files a/nano/images/weapons/type71.png and /dev/null differ
diff --git a/nano/images/weapons/type71c.png b/nano/images/weapons/type71c.png
deleted file mode 100644
index 273ac0bcbe..0000000000
Binary files a/nano/images/weapons/type71c.png and /dev/null differ
diff --git a/nano/images/weapons/type73.png b/nano/images/weapons/type73.png
deleted file mode 100644
index 63294f7cc9..0000000000
Binary files a/nano/images/weapons/type73.png and /dev/null differ
diff --git a/nano/images/weapons/vp78.png b/nano/images/weapons/vp78.png
deleted file mode 100644
index 2383b4e3ad..0000000000
Binary files a/nano/images/weapons/vp78.png and /dev/null differ
diff --git a/nano/images/weapons/xm42b.png b/nano/images/weapons/xm42b.png
deleted file mode 100644
index 645c552314..0000000000
Binary files a/nano/images/weapons/xm42b.png and /dev/null differ
diff --git a/tgui/packages/tgui/interfaces/WeaponStats.jsx b/tgui/packages/tgui/interfaces/WeaponStats.jsx
index 4978e93ec0..4def237f6b 100644
--- a/tgui/packages/tgui/interfaces/WeaponStats.jsx
+++ b/tgui/packages/tgui/interfaces/WeaponStats.jsx
@@ -1,4 +1,5 @@
import { map } from 'common/collections';
+import { classes } from 'common/react';
import { useBackend } from '../backend';
import { Box, Divider, Flex, ProgressBar, Section, Table } from '../components';
@@ -68,7 +69,7 @@ const GeneralInfo = (props) => {
-
+
@@ -78,25 +79,33 @@ const GeneralInfo = (props) => {
- {!auto_only ? (
-
- ) : (
-
- )}
+
- {!auto_only && burst_amount > 1 ? (
-
- ) : (
-
- )}
+ 1 ? 'burst' : 'disabled_burst'
+ }`,
+ ])}
+ />
- {automatic ? (
-
- ) : (
-
- )}
+
@@ -272,13 +281,27 @@ const Accuracy = (props) => {
const Range = (props) => {
const { data } = useBackend();
- const { max_range, range_max, falloff, falloff_max } = data;
+ const {
+ max_range,
+ range_max,
+ falloff,
+ falloff_max,
+ effective_range,
+ effective_range_max,
+ } = data;
return (
<>
Max range: {max_range} / {range_max}
+
+ Effective range: {effective_range}
+
+
Falloff: {falloff} / {falloff_max}
@@ -289,16 +312,13 @@ const Range = (props) => {
const ArmourPen = (props) => {
const { data } = useBackend();
- const { penetration, penetration_max, armor_punch, punch_max } = data;
+ const { penetration, penetration_max } = data;
return (
<>
Armour penetration: {penetration} / {penetration_max}
-
- Armour punch: {armor_punch} / {punch_max}
-
>
);
};
@@ -308,9 +328,7 @@ const DamageTable = (props) => {
const {
damage_armor_profile_marine,
damage_armor_profile_xeno,
- damage_armor_profile_armorbreak,
damage_armor_profile_headers,
- glob_armourbreak,
} = data;
return (
@@ -337,14 +355,6 @@ const DamageTable = (props) => {
{entry}
))}
- {!glob_armourbreak ? (
-
- Armor break
- {map(damage_armor_profile_armorbreak, (entry, i) => (
- {entry}
- ))}
-
- ) : null}
);