From cd42997b5b90cbedd5bbc21f54db0a45179cdd8d Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 9 Aug 2021 17:51:17 -0400 Subject: [PATCH 001/206] clean this shit up --- code/__DEFINES/combat.dm | 176 +++++++++++++++++++-------------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 08bdc3bfe520..56ea541f5f23 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -3,41 +3,41 @@ //Damage and status effect defines //Damage defines //TODO: merge these down to reduce on defines -#define BRUTE "brute" -#define BURN "fire" -#define TOX "toxin" -#define OXY "oxygen" -#define CLONE "clone" -#define STAMINA "stamina" -#define BRAIN "brain" +#define BRUTE "brute" +#define BURN "fire" +#define TOX "toxin" +#define OXY "oxygen" +#define CLONE "clone" +#define STAMINA "stamina" +#define BRAIN "brain" //bitflag damage defines used for suicide_act -#define BRUTELOSS (1<<0) -#define FIRELOSS (1<<1) -#define TOXLOSS (1<<2) -#define OXYLOSS (1<<3) -#define SHAME (1<<4) -#define MANUAL_SUICIDE (1<<5) //suicide_act will do the actual killing. -#define MANUAL_SUICIDE_NONLETHAL (1<<6) //when the suicide is conditionally lethal - -#define EFFECT_STUN "stun" -#define EFFECT_KNOCKDOWN "knockdown" -#define EFFECT_UNCONSCIOUS "unconscious" -#define EFFECT_PARALYZE "paralyze" -#define EFFECT_IMMOBILIZE "immobilize" -#define EFFECT_IRRADIATE "irradiate" -#define EFFECT_STUTTER "stutter" -#define EFFECT_SLUR "slur" -#define EFFECT_EYE_BLUR "eye_blur" -#define EFFECT_DROWSY "drowsy" -#define EFFECT_JITTER "jitter" +#define BRUTELOSS (1<<0) +#define FIRELOSS (1<<1) +#define TOXLOSS (1<<2) +#define OXYLOSS (1<<3) +#define SHAME (1<<4) +#define MANUAL_SUICIDE (1<<5) //suicide_act will do the actual killing. +#define MANUAL_SUICIDE_NONLETHAL (1<<6) //when the suicide is conditionally lethal + +#define EFFECT_STUN "stun" +#define EFFECT_KNOCKDOWN "knockdown" +#define EFFECT_UNCONSCIOUS "unconscious" +#define EFFECT_PARALYZE "paralyze" +#define EFFECT_IMMOBILIZE "immobilize" +#define EFFECT_IRRADIATE "irradiate" +#define EFFECT_STUTTER "stutter" +#define EFFECT_SLUR "slur" +#define EFFECT_EYE_BLUR "eye_blur" +#define EFFECT_DROWSY "drowsy" +#define EFFECT_JITTER "jitter" //Bitflags defining which status effects could be or are inflicted on a mob -#define CANSTUN (1<<0) -#define CANKNOCKDOWN (1<<1) -#define CANUNCONSCIOUS (1<<2) -#define CANPUSH (1<<3) -#define GODMODE (1<<4) +#define CANSTUN (1<<0) +#define CANKNOCKDOWN (1<<1) +#define CANUNCONSCIOUS (1<<2) +#define CANPUSH (1<<3) +#define GODMODE (1<<4) //Health Defines #define HEALTH_THRESHOLD_CRIT 0 @@ -64,13 +64,13 @@ #define INSTANT_CUFFBREAK 2 //Grab levels -#define GRAB_PASSIVE 0 -#define GRAB_AGGRESSIVE 1 -#define GRAB_NECK 2 -#define GRAB_KILL 3 +#define GRAB_PASSIVE 0 +#define GRAB_AGGRESSIVE 1 +#define GRAB_NECK 2 +#define GRAB_KILL 3 //Grab breakout odds -#define BASE_GRAB_RESIST_CHANCE 30 +#define BASE_GRAB_RESIST_CHANCE 30 //slowdown when in softcrit. Note that crawling slowdown will also apply at the same time! #define SOFTCRIT_ADD_SLOWDOWN 2 @@ -85,25 +85,25 @@ #define LEAP_ATTACK 5 //attack visual effects -#define ATTACK_EFFECT_PUNCH "punch" -#define ATTACK_EFFECT_KICK "kick" -#define ATTACK_EFFECT_SMASH "smash" -#define ATTACK_EFFECT_CLAW "claw" -#define ATTACK_EFFECT_SLASH "slash" -#define ATTACK_EFFECT_DISARM "disarm" -#define ATTACK_EFFECT_BITE "bite" -#define ATTACK_EFFECT_MECHFIRE "mech_fire" -#define ATTACK_EFFECT_MECHTOXIN "mech_toxin" -#define ATTACK_EFFECT_BOOP "boop" //Honk +#define ATTACK_EFFECT_PUNCH "punch" +#define ATTACK_EFFECT_KICK "kick" +#define ATTACK_EFFECT_SMASH "smash" +#define ATTACK_EFFECT_CLAW "claw" +#define ATTACK_EFFECT_SLASH "slash" +#define ATTACK_EFFECT_DISARM "disarm" +#define ATTACK_EFFECT_BITE "bite" +#define ATTACK_EFFECT_MECHFIRE "mech_fire" +#define ATTACK_EFFECT_MECHTOXIN "mech_toxin" +#define ATTACK_EFFECT_BOOP "boop" //Honk //intent defines -#define INTENT_HELP "help" -#define INTENT_GRAB "grab" +#define INTENT_HELP "help" +#define INTENT_GRAB "grab" #define INTENT_DISARM "disarm" -#define INTENT_HARM "harm" +#define INTENT_HARM "harm" //NOTE: INTENT_HOTKEY_* defines are not actual intents! //they are here to support hotkeys -#define INTENT_HOTKEY_LEFT "left" +#define INTENT_HOTKEY_LEFT "left" #define INTENT_HOTKEY_RIGHT "right" //the define for visible message range in combat @@ -127,19 +127,19 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( //Combat object defines //Embedded objects -#define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) -#define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object) -#define EMBED_CHANCE 45 //Chance for an object to embed into somebody when thrown (if it's sharp) -#define EMBEDDED_PAIN_MULTIPLIER 2 //Coefficient of multiplication for the damage the item does while embedded (this*item.w_class) -#define EMBEDDED_FALL_PAIN_MULTIPLIER 5 //Coefficient of multiplication for the damage the item does when it falls out (this*item.w_class) -#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 //Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) -#define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) -#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) -#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) -#define EMBEDDED_JOSTLE_CHANCE 5 //Chance for embedded objects to cause pain every time they move (jostle) -#define EMBEDDED_JOSTLE_PAIN_MULTIPLIER 1 //Coefficient of multiplication for the damage the item does while -#define EMBEDDED_PAIN_STAM_PCT 0.0 //This percentage of all pain will be dealt as stam damage rather than brute (0-1) -#define EMBED_CHANCE_TURF_MOD -15 //You are this many percentage points less likely to embed into a turf (good for things glass shards and spears vs walls) +#define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) +#define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object) +#define EMBED_CHANCE 45 //Chance for an object to embed into somebody when thrown (if it's sharp) +#define EMBEDDED_PAIN_MULTIPLIER 2 //Coefficient of multiplication for the damage the item does while embedded (this*item.w_class) +#define EMBEDDED_FALL_PAIN_MULTIPLIER 5 //Coefficient of multiplication for the damage the item does when it falls out (this*item.w_class) +#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 //Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) +#define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) +#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) +#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) +#define EMBEDDED_JOSTLE_CHANCE 5 //Chance for embedded objects to cause pain every time they move (jostle) +#define EMBEDDED_JOSTLE_PAIN_MULTIPLIER 1 //Coefficient of multiplication for the damage the item does while +#define EMBEDDED_PAIN_STAM_PCT 0.0 //This percentage of all pain will be dealt as stam damage rather than brute (0-1) +#define EMBED_CHANCE_TURF_MOD -15 //You are this many percentage points less likely to embed into a turf (good for things glass shards and spears vs walls) #define EMBED_HARMLESS list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE) #define EMBED_HARMLESS_SUPERIOR list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE, "embed_chance" = 100, "fall_chance" = 0.1) @@ -186,13 +186,13 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define SUPPRESSED_VERY 2 /// no message //Projectile Reflect -#define REFLECT_NORMAL (1<<0) -#define REFLECT_FAKEPROJECTILE (1<<1) +#define REFLECT_NORMAL (1<<0) +#define REFLECT_FAKEPROJECTILE (1<<1) //Object/Item sharpness -#define IS_BLUNT 0 -#define IS_SHARP 1 -#define IS_SHARP_ACCURATE 2 +#define IS_BLUNT 0 +#define IS_SHARP 1 +#define IS_SHARP_ACCURATE 2 //His Grace. #define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep. @@ -205,11 +205,11 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define HIS_GRACE_FORCE_BONUS 4 //How much force is gained per kill. -#define EXPLODE_NONE 0 //Don't even ask me why we need this. +#define EXPLODE_NONE 0 //Don't even ask me why we need this. #define EXPLODE_DEVASTATE 1 #define EXPLODE_HEAVY 2 #define EXPLODE_LIGHT 3 -#define EXPLODE_GIB_THRESHOLD 50 //ex_act() with EXPLODE_DEVASTATE severity will gib mobs with less than this much bomb armor +#define EXPLODE_GIB_THRESHOLD 50 //ex_act() with EXPLODE_DEVASTATE severity will gib mobs with less than this much bomb armor #define EMP_HEAVY 1 #define EMP_LIGHT 2 @@ -218,27 +218,27 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define GRENADE_NONCLUMSY_FUMBLE 2 #define GRENADE_NO_FUMBLE 3 -#define BODY_ZONE_HEAD "head" -#define BODY_ZONE_CHEST "chest" -#define BODY_ZONE_L_ARM "l_arm" -#define BODY_ZONE_R_ARM "r_arm" -#define BODY_ZONE_L_LEG "l_leg" -#define BODY_ZONE_R_LEG "r_leg" - -#define BODY_ZONE_PRECISE_EYES "eyes" -#define BODY_ZONE_PRECISE_MOUTH "mouth" -#define BODY_ZONE_PRECISE_GROIN "groin" -#define BODY_ZONE_PRECISE_L_HAND "l_hand" -#define BODY_ZONE_PRECISE_R_HAND "r_hand" -#define BODY_ZONE_PRECISE_L_FOOT "l_foot" -#define BODY_ZONE_PRECISE_R_FOOT "r_foot" +#define BODY_ZONE_HEAD "head" +#define BODY_ZONE_CHEST "chest" +#define BODY_ZONE_L_ARM "l_arm" +#define BODY_ZONE_R_ARM "r_arm" +#define BODY_ZONE_L_LEG "l_leg" +#define BODY_ZONE_R_LEG "r_leg" + +#define BODY_ZONE_PRECISE_EYES "eyes" +#define BODY_ZONE_PRECISE_MOUTH "mouth" +#define BODY_ZONE_PRECISE_GROIN "groin" +#define BODY_ZONE_PRECISE_L_HAND "l_hand" +#define BODY_ZONE_PRECISE_R_HAND "r_hand" +#define BODY_ZONE_PRECISE_L_FOOT "l_foot" +#define BODY_ZONE_PRECISE_R_FOOT "r_foot" //We will round to this value in damage calculations. #define DAMAGE_PRECISION 0.1 //bullet_act() return values -#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. -#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. -#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. +#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. -#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle +#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle From 003dd6645758caedc5449459cec5f39b64ed732d Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 9 Aug 2021 18:11:21 -0400 Subject: [PATCH 002/206] attachment boilerplate --- code/datums/components/attachment.dm | 110 +++++++++++++++++ code/datums/components/attachment_holder.dm | 128 ++++++++++++++++++++ 2 files changed, 238 insertions(+) create mode 100644 code/datums/components/attachment.dm create mode 100644 code/datums/components/attachment_holder.dm diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm new file mode 100644 index 000000000000..95d5c3714b01 --- /dev/null +++ b/code/datums/components/attachment.dm @@ -0,0 +1,110 @@ +#define COMSIG_ATTACHMENT_ATTACH "attach-attach" +#define COMSIG_ATTACHMENT_DETACH "attach-detach" +#define COMSIG_ATTACHMENT_EXAMINE "attach-examine" +#define COMSIG_ATTACHMENT_EXAMINE_MORE "attach-examine-more" +#define COMSIG_ATTACHMENT_PRE_ATTACK "attach-pre-attack" +#define COMSIG_ATTACHMENT_ATTACK "attach-attacked" +#define COMSIG_ATTACHMENT_UPDATE_OVERLAY "attach-overlay" + +#define COMSIG_ATTACHMENT_GET_SLOT "attach-slot-who" + #define ATTACHMENT_SLOT_MUZZLE "attach-slot-muzzle" + #define ATTACHMENT_SLOT_SCOPE "attach-slot-scope" + #define ATTACHMENT_SLOT_GRIP "attach-slot-grip" + #define ATTACHMENT_SLOT_RAIL "attach-slot-rail" + +#define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" + +#define TRAIT_ATTACHABLE "attachable" + +/datum/component/attachment + var/slot + var/list/valid_parent_types + var/datum/callback/on_attach + var/datum/callback/on_detach + var/datum/callback/on_toggle + var/mutable_appearance/attachment_overlay + var/list/datum/action/actions + +/datum/component/attachment/Initialize( + slot = ATTACHMENT_SLOT_RAIL, + mutable_appearance/attachment_overlay = null, + valid_parent_types = list(/obj/item/gun), + datum/callback/on_attach = null, + datum/callback/on_detach = null, + datum/callback/on_toggle = null, + list/signals = null, + ) + + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.slot = slot + src.attachment_overlay = attachment_overlay + src.valid_parent_types = valid_parent_types + src.on_attach = on_attach + src.on_detach = on_detach + src.on_toggle = on_toggle + + ADD_TRAIT(parent, TRAIT_ATTACHABLE, src) + RegisterSignal(parent, COMSIG_ATTACHMENT_ATTACH, .proc/try_attach) + RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, .proc/try_detach) + RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, .proc/try_toggle) + + if(attachment_overlay) + RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, .proc/update_overlays) + + for(var/signal in signals) + RegisterSignal(parent, signal, signals[signal]) + +/datum/component/attachment/Destroy(force, silent) + REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, src) + if(actions && length(actions)) + var/obj/item/gun/parent = src.parent + parent.actions -= actions + QDEL_LIST(actions) + return ..() + +/datum/component/attachment/proc/try_toggle(obj/item/parent, obj/item/holder, mob/user) + SIGNAL_HANDLER + + CallAsync(src, .proc/do_toggle) + + +/datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user) + if(on_toggle) + on_toggle.Invoke(parent, holder, user) + return TRUE + + parent.attack_self(user) + return TRUE + +/datum/component/attachment/proc/update_overlays(obj/item/parent, list/overlays, list/offset) + overlays += attachment_overlay + +/datum/component/attachment/proc/try_attach(obj/item/parent, obj/item/holder, mob/user) + SIGNAL_HANDLER + + if(!parent.Adjacent(user) || (length(valid_parent_types) && (holder.type in valid_parent_types))) + return FALSE + + if(on_attach && !on_attach.Invoke(parent, holder, user)) + return FALSE + + parent.forceMove(holder) + return TRUE + +/datum/component/attachment/proc/try_detach(obj/item/parent, obj/item/holder, mob/user) + SIGNAL_HANDLER + + if(!parent.Adjacent(user) || (valid_parent_types && (holder.type in valid_parent_types))) + return FALSE + + if(on_attach && !on_detach.Invoke(parent, holder, user)) + return FALSE + + if(user.can_put_in_hand(parent)) + user.put_in_hand(parent) + return TRUE + + parent.forceMove(holder.drop_location()) + return TRUE diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm new file mode 100644 index 000000000000..df2483b5d1e8 --- /dev/null +++ b/code/datums/components/attachment_holder.dm @@ -0,0 +1,128 @@ + + +/datum/component/attachment_holder + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + + var/list/valid_types = null + var/max_attachments = 2 + var/list/slot_room = null + var/list/slot_offsets = null + + var/list/obj/item/attachments = list() + +/datum/component/attachment_holder/Initialize( + max_attachments = 2, + list/slot_room = null, + list/valid_types = null, + list/slot_offsets = null, + ) + + if(!isgun(parent)) + return COMPONENT_INCOMPATIBLE + + src.max_attachments = max_attachments + src.slot_room = slot_room + src.valid_types = valid_types + src.slot_offsets = slot_offsets + + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/handle_attack) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/handle_examine) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE_MORE, .proc/handle_examine_more) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, .proc/handle_qdel) + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, .proc/handle_item_pre_attack) + RegisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT, .proc/handle_ctrl_shift_click) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/handle_overlays) + +/datum/component/attachment_holder/proc/handle_overlays(obj/item/parent, list/overlays) + SIGNAL_HANDLER + + for(var/obj/item/attach as anything in attachments) + var/slot = SEND_SIGNAL(attach, COMSIG_ATTACHMENT_GET_SLOT) + var/list/attach_overlays = list() + SEND_SIGNAL(attach, COMSIG_ATTACHMENT_UPDATE_OVERLAY, attach_overlays) + for(var/mutable_appearance/overlay as anything in attach_overlays) + var/matrix/overlay_matrix = new + overlay_matrix.Translate(slot_offsets[slot]["x"], slot_offsets[slot]["y"]) + overlay.transform = overlay_matrix + overlays += overlay + +/datum/component/attachment_holder/proc/handle_qdel() + SIGNAL_HANDLER + qdel(src) + +/datum/component/attachment_holder/Destroy(force, silent) + QDEL_LIST(attachments) + attachments = null + return ..() + +/datum/component/attachment_holder/proc/handle_ctrl_shift_click(obj/item/parent, mob/user) + SIGNAL_HANDLER + + // TODO: ATTACHMENT RADIAL MENU + +/datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) + examine_list += "It has [max_attachments] attachment-slot\s." + examine_list += "\tThere are [max_attachments - length(attachments)] slot\s left." + for(var/obj/item/attach as anything in attachments) + SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE, user, examine_list) + +/datum/component/attachment_holder/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list) + if(!length(attachments)) + return + examine_list += "It has the following attachments:" + for(var/obj/item/attach as anything in attachments) + examine_list += "\t- [attach.name]" + examine_list += "\tThey can be removed with a crowbar" + for(var/obj/item/attach as anything in attachments) + SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE_MORE, user, examine_list) + +/datum/component/attachment_holder/proc/do_attach(obj/item/attachment, mob/user) + var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) + if(slot_room && !slot_room[slot]) + return + slot_room[slot]-- + . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_ATTACH, parent, user) + if(.) + attachments += attachment + +/datum/component/attachment_holder/proc/do_detach(obj/item/attachment, mob/user) + var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) + if(slot_room) + slot_room[slot]++ + . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_DETACH, parent, user) + if(.) + attachments -= attachment + +/datum/component/attachment_holder/proc/handle_detach(obj/item/parent, obj/item/tool, mob/user) + var/list/list = list() + for(var/obj/item/attach as anything in attachments) + list[attach.name] = attach + var/selected = tgui_input_list(user, "Select Attachment", "Detach", list) + if(!parent.Adjacent(user) || !selected || !tool || !tool.use_tool(parent, user, 2 SECONDS * tool.toolspeed)) + return + do_detach(list[selected], user) + +/datum/component/attachment_holder/proc/handle_attack(obj/item/parent, obj/item/item, mob/user) + SIGNAL_HANDLER + + if(!user.Adjacent(parent)) + return + + if(item.tool_behaviour == TOOL_CROWBAR && length(attachments)) + CallAsync(src, .proc/handle_detach, list(parent, item, user)) + return TRUE + + if(HAS_TRAIT(item, TRAIT_ATTACHABLE) && length(attachments) < max_attachments) + CallAsync(src, .proc/do_attach, list(item, user)) + return TRUE + + for(var/obj/item/attach as anything in attachments) + if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_ATTACK, parent, item, user)) + return TRUE + +/datum/component/attachment_holder/proc/handle_item_pre_attack(obj/item/parent, atom/target, mob/user, params) + SIGNAL_HANDLER + + for(var/obj/item/attach as anything in attachments) + if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_PRE_ATTACK, parent, target, user, params)) + return TRUE From e6171aac64834b41ff1ca7dca7035eb14c48f6ab Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 9 Aug 2021 18:11:38 -0400 Subject: [PATCH 003/206] tick attachment stuff and alphabatize --- tgstation.dme | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/tgstation.dme b/tgstation.dme index a664a79bb48f..d3a3443791f9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -416,6 +416,8 @@ #include "code\datums\components\anti_magic.dm" #include "code\datums\components\armor_plate.dm" #include "code\datums\components\art.dm" +#include "code\datums\components\attachment.dm" +#include "code\datums\components\attachment_holder.dm" #include "code\datums\components\bane.dm" #include "code\datums\components\beauty.dm" #include "code\datums\components\beetlejuice.dm" @@ -2193,8 +2195,8 @@ #include "code\modules\mob\mob_helpers.dm" #include "code\modules\mob\mob_lists.dm" #include "code\modules\mob\mob_movement.dm" -#include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\mob_say.dm" +#include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\status_procs.dm" #include "code\modules\mob\transform_procs.dm" #include "code\modules\mob\update_icons.dm" @@ -2212,8 +2214,8 @@ #include "code\modules\mob\dead\observer\notificationprefs.dm" #include "code\modules\mob\dead\observer\observer.dm" #include "code\modules\mob\dead\observer\observer_movement.dm" -#include "code\modules\mob\dead\observer\orbit.dm" #include "code\modules\mob\dead\observer\observer_say.dm" +#include "code\modules\mob\dead\observer\orbit.dm" #include "code\modules\mob\living\blood.dm" #include "code\modules\mob\living\bloodcrawl.dm" #include "code\modules\mob\living\damage_procs.dm" @@ -2226,36 +2228,37 @@ #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_movement.dm" +#include "code\modules\mob\living\living_say.dm" #include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\logout.dm" -#include "code\modules\mob\living\living_say.dm" #include "code\modules\mob\living\status_procs.dm" #include "code\modules\mob\living\taste.dm" #include "code\modules\mob\living\ventcrawling.dm" #include "code\modules\mob\living\brain\brain.dm" #include "code\modules\mob\living\brain\brain_item.dm" +#include "code\modules\mob\living\brain\brain_say.dm" #include "code\modules\mob\living\brain\death.dm" #include "code\modules\mob\living\brain\emote.dm" #include "code\modules\mob\living\brain\life.dm" #include "code\modules\mob\living\brain\MMI.dm" #include "code\modules\mob\living\brain\posibrain.dm" -#include "code\modules\mob\living\brain\brain_say.dm" #include "code\modules\mob\living\brain\status_procs.dm" #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" #include "code\modules\mob\living\carbon\carbon_defines.dm" #include "code\modules\mob\living\carbon\carbon_movement.dm" +#include "code\modules\mob\living\carbon\carbon_say.dm" #include "code\modules\mob\living\carbon\damage_procs.dm" #include "code\modules\mob\living\carbon\death.dm" #include "code\modules\mob\living\carbon\emote.dm" #include "code\modules\mob\living\carbon\examine.dm" #include "code\modules\mob\living\carbon\inventory.dm" #include "code\modules\mob\living\carbon\life.dm" -#include "code\modules\mob\living\carbon\carbon_say.dm" #include "code\modules\mob\living\carbon\status_procs.dm" #include "code\modules\mob\living\carbon\update_icons.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" #include "code\modules\mob\living\carbon\alien\alien_defense.dm" +#include "code\modules\mob\living\carbon\alien\alien_say.dm" #include "code\modules\mob\living\carbon\alien\damage_procs.dm" #include "code\modules\mob\living\carbon\alien\death.dm" #include "code\modules\mob\living\carbon\alien\emote.dm" @@ -2263,7 +2266,6 @@ #include "code\modules\mob\living\carbon\alien\login.dm" #include "code\modules\mob\living\carbon\alien\logout.dm" #include "code\modules\mob\living\carbon\alien\organs.dm" -#include "code\modules\mob\living\carbon\alien\alien_say.dm" #include "code\modules\mob\living\carbon\alien\screen.dm" #include "code\modules\mob\living\carbon\alien\status_procs.dm" #include "code\modules\mob\living\carbon\alien\update_icons.dm" @@ -2301,10 +2303,10 @@ #include "code\modules\mob\living\carbon\human\human_defines.dm" #include "code\modules\mob\living\carbon\human\human_helpers.dm" #include "code\modules\mob\living\carbon\human\human_movement.dm" +#include "code\modules\mob\living\carbon\human\human_say.dm" #include "code\modules\mob\living\carbon\human\inventory.dm" #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\physiology.dm" -#include "code\modules\mob\living\carbon\human\human_say.dm" #include "code\modules\mob\living\carbon\human\species.dm" #include "code\modules\mob\living\carbon\human\status_procs.dm" #include "code\modules\mob\living\carbon\human\suicides.dm" @@ -2344,12 +2346,13 @@ #include "code\modules\mob\living\silicon\examine.dm" #include "code\modules\mob\living\silicon\laws.dm" #include "code\modules\mob\living\silicon\login.dm" -#include "code\modules\mob\living\silicon\silicon_say.dm" #include "code\modules\mob\living\silicon\silicon.dm" #include "code\modules\mob\living\silicon\silicon_defense.dm" #include "code\modules\mob\living\silicon\silicon_movement.dm" +#include "code\modules\mob\living\silicon\silicon_say.dm" #include "code\modules\mob\living\silicon\ai\ai.dm" #include "code\modules\mob\living\silicon\ai\ai_defense.dm" +#include "code\modules\mob\living\silicon\ai\ai_say.dm" #include "code\modules\mob\living\silicon\ai\death.dm" #include "code\modules\mob\living\silicon\ai\examine.dm" #include "code\modules\mob\living\silicon\ai\laws.dm" @@ -2358,7 +2361,6 @@ #include "code\modules\mob\living\silicon\ai\logout.dm" #include "code\modules\mob\living\silicon\ai\multicam.dm" #include "code\modules\mob\living\silicon\ai\robot_control.dm" -#include "code\modules\mob\living\silicon\ai\ai_say.dm" #include "code\modules\mob\living\silicon\ai\vox_sounds.dm" #include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" #include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" @@ -2367,9 +2369,9 @@ #include "code\modules\mob\living\silicon\pai\death.dm" #include "code\modules\mob\living\silicon\pai\pai.dm" #include "code\modules\mob\living\silicon\pai\pai_defense.dm" +#include "code\modules\mob\living\silicon\pai\pai_say.dm" #include "code\modules\mob\living\silicon\pai\pai_shell.dm" #include "code\modules\mob\living\silicon\pai\personality.dm" -#include "code\modules\mob\living\silicon\pai\pai_say.dm" #include "code\modules\mob\living\silicon\pai\software.dm" #include "code\modules\mob\living\silicon\robot\death.dm" #include "code\modules\mob\living\silicon\robot\emote.dm" @@ -2418,11 +2420,11 @@ #include "code\modules\mob\living\simple_animal\friendly\sloth.dm" #include "code\modules\mob\living\simple_animal\friendly\snake.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\drone_say.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\drones_as_items.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\extra_drone_types.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\interaction.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\inventory.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\drone_say.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm" #include "code\modules\mob\living\simple_animal\guardian\guardian.dm" @@ -2518,8 +2520,8 @@ #include "code\modules\mob\living\simple_animal\slime\emote.dm" #include "code\modules\mob\living\simple_animal\slime\life.dm" #include "code\modules\mob\living\simple_animal\slime\powers.dm" -#include "code\modules\mob\living\simple_animal\slime\slime_say.dm" #include "code\modules\mob\living\simple_animal\slime\slime.dm" +#include "code\modules\mob\living\simple_animal\slime\slime_say.dm" #include "code\modules\mob\living\simple_animal\slime\subtypes.dm" #include "code\modules\modular_computers\laptop_vendor.dm" #include "code\modules\modular_computers\computers\_modular_computer_shared.dm" From dce2de0158c73589f94820aa88d5527acd32b392 Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 9 Aug 2021 18:13:04 -0400 Subject: [PATCH 004/206] get rid of snowflake attachments --- code/modules/projectiles/gun.dm | 203 +----------------- code/modules/projectiles/guns/ballistic.dm | 3 - .../projectiles/guns/ballistic/automatic.dm | 2 - .../projectiles/guns/ballistic/rifle.dm | 3 - code/modules/projectiles/guns/energy.dm | 2 +- .../projectiles/guns/energy/energy_gun.dm | 9 - .../guns/energy/kinetic_accelerator.dm | 2 - .../projectiles/guns/energy/mounted.dm | 1 - code/modules/projectiles/guns/energy/pulse.dm | 1 - .../projectiles/guns/energy/special.dm | 3 - code/modules/projectiles/guns/energy/stun.dm | 3 - .../projectiles/guns/ballistic/automatic.dm | 1 - 12 files changed, 6 insertions(+), 227 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 22b54daeef32..95b74a71e3a2 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -49,15 +49,6 @@ var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns - var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one. - var/obj/item/flashlight/seclite/gun_light - var/mutable_appearance/flashlight_overlay - var/datum/action/item_action/toggle_gunlight/alight - var/gunlight_state = "flight" - - var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one. - var/obj/item/kitchen/knife/bayonet - var/mutable_appearance/knife_overlay var/knife_x_offset = 0 var/knife_y_offset = 0 @@ -77,21 +68,19 @@ var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds var/pb_knockback = 0 + /// Reference to our attachment holder to prevent subtypes having to call GetComponent + var/datum/component/attachment_holder/attachment_holder + /obj/item/gun/Initialize() . = ..() if(pin) pin = new pin(src) - if(gun_light) - alight = new(src) build_zooming() + attachment_holder = AddComponent(/datum/component/attachment_holder) /obj/item/gun/Destroy() if(isobj(pin)) //Can still be the initial path, then we skip QDEL_NULL(pin) - if(gun_light) - QDEL_NULL(gun_light) - if(bayonet) - QDEL_NULL(bayonet) if(chambered) //Not all guns are chambered (EMP'ed energy guns etc) QDEL_NULL(chambered) if(azoom) @@ -104,10 +93,6 @@ if(A == chambered) chambered = null update_icon() - if(A == bayonet) - clear_bayonet() - if(A == gun_light) - clear_gunlight() return ..() /obj/item/gun/examine(mob/user) @@ -118,20 +103,6 @@ else . += "It doesn't have a firing pin installed, and won't fire." - if(gun_light) - . += "It has \a [gun_light] [can_flashlight ? "" : "permanently "]mounted on it." - if(can_flashlight) //if it has a light and this is false, the light is permanent. - . += "[gun_light] looks like it can be unscrewed from [src]." - else if(can_flashlight) - . += "It has a mounting point for a seclite." - - if(bayonet) - . += "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it." - if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent. - . += "[bayonet] looks like it can be unscrewed from [src]." - else if(can_bayonet) - . += "It has a bayonet lug on it." - /obj/item/gun/equipped(mob/living/user, slot) . = ..() if(zoomed && user.get_active_held_item() != src) @@ -362,87 +333,8 @@ /obj/item/gun/attack(mob/M as mob, mob/user) if(user.a_intent == INTENT_HARM) //Flogging - if(bayonet) - M.attackby(bayonet, user) - return - else - return ..() - return - -/obj/item/gun/attack_obj(obj/O, mob/user) - if(user.a_intent == INTENT_HARM) - if(bayonet) - O.attackby(bayonet, user) - return - return ..() - -/obj/item/gun/attackby(obj/item/I, mob/user, params) - if(user.a_intent == INTENT_HARM) return ..() - else if(istype(I, /obj/item/flashlight/seclite)) - if(!can_flashlight) - return ..() - var/obj/item/flashlight/seclite/S = I - if(!gun_light) - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You click [S] into place on [src].") - set_gun_light(S) - update_gunlight() - alight = new(src) - if(loc == user) - alight.Grant(user) - else if(istype(I, /obj/item/kitchen/knife)) - var/obj/item/kitchen/knife/K = I - if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it. - return ..() - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You attach [K] to [src]'s bayonet lug.") - bayonet = K - var/state = "bayonet" //Generic state. - if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state? - state = bayonet.icon_state - var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi' - knife_overlay = mutable_appearance(bayonet_icons, state) - knife_overlay.pixel_x = knife_x_offset - knife_overlay.pixel_y = knife_y_offset - add_overlay(knife_overlay, TRUE) - else - return ..() - -/obj/item/gun/screwdriver_act(mob/living/user, obj/item/I) - . = ..() - if(.) - return - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - if((can_flashlight && gun_light) && (can_bayonet && bayonet)) //give them a choice instead of removing both - var/list/possible_items = list(gun_light, bayonet) - var/obj/item/item_to_remove = input(user, "Select an attachment to remove", "Attachment Removal") as null|obj in sortNames(possible_items) - if(!item_to_remove || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - return remove_gun_attachment(user, I, item_to_remove) - - else if(gun_light && can_flashlight) //if it has a gun_light and can_flashlight is false, the flashlight is permanently attached. - return remove_gun_attachment(user, I, gun_light, "unscrewed") - - else if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed - return remove_gun_attachment(user, I, bayonet, "unfix") - - /*WS Edit - Fixes Pin Removal - else if(pin && user.is_holding(src)) - user.visible_message("[user] attempts to remove [pin] from [src] with [I].", - "You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)", null, 3) - if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, volume = 50)) - if(!pin) //check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay - return - user.visible_message("[pin] is pried out of [src] by [user], destroying the pin in the process.", - "You pry [pin] out with [I], destroying the pin in the process.", null, 3) - QDEL_NULL(pin) - return TRUE - WS End */ - + return /obj/item/gun/welder_act(mob/living/user, obj/item/I) . = ..() @@ -478,91 +370,6 @@ QDEL_NULL(pin) return TRUE -/obj/item/gun/proc/remove_gun_attachment(mob/living/user, obj/item/tool_item, obj/item/item_to_remove, removal_verb) - if(tool_item) - tool_item.play_tool_sound(src) - to_chat(user, "You [removal_verb ? removal_verb : "remove"] [item_to_remove] from [src].") - item_to_remove.forceMove(drop_location()) - - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(item_to_remove) - - if(item_to_remove == bayonet) - return clear_bayonet() - else if(item_to_remove == gun_light) - return clear_gunlight() - -/obj/item/gun/proc/clear_bayonet() - if(!bayonet) - return - bayonet = null - if(knife_overlay) - cut_overlay(knife_overlay, TRUE) - knife_overlay = null - return TRUE - -/obj/item/gun/proc/clear_gunlight() - if(!gun_light) - return - var/obj/item/flashlight/seclite/removed_light = gun_light - set_gun_light(null) - update_gunlight() - removed_light.update_brightness() - QDEL_NULL(alight) - return TRUE - -/** - * Swaps the gun's seclight, dropping the old seclight if it has not been qdel'd. - * - * Returns the former gun_light that has now been replaced by this proc. - * Arguments: - * * new_light - The new light to attach to the weapon. Can be null, which will mean the old light is removed with no replacement. - */ -/obj/item/gun/proc/set_gun_light(obj/item/flashlight/seclite/new_light) - // Doesn't look like this should ever happen? We're replacing our old light with our old light? - if(gun_light == new_light) - CRASH("Tried to set a new gun light when the old gun light was also the new gun light.") - - . = gun_light - - // If there's an old gun light that isn't being QDELETED, detatch and drop it to the floor. - if(!QDELETED(gun_light)) - gun_light.set_light_flags(gun_light.light_flags & ~LIGHT_ATTACHED) - if(gun_light.loc != get_turf(src)) - gun_light.forceMove(get_turf(src)) - - // If there's a new gun light to be added, attach and move it to the gun. - if(new_light) - new_light.set_light_flags(new_light.light_flags | LIGHT_ATTACHED) - if(new_light.loc != src) - new_light.forceMove(src) - - gun_light = new_light - -/obj/item/gun/ui_action_click(mob/user, actiontype) - if(istype(actiontype, alight)) - toggle_gunlight() - else - ..() - -/obj/item/gun/proc/toggle_gunlight() - if(!gun_light) - return - - var/mob/living/carbon/human/user = usr - gun_light.on = !gun_light.on - gun_light.update_brightness() - to_chat(user, "You toggle the gunlight [gun_light.on ? "on":"off"].") - - playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) - update_gunlight() - -/obj/item/gun/proc/update_gunlight() - update_icon() - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() - /obj/item/gun/pickup(mob/user) ..() if(azoom) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index c338438ba872..2e2a7b2d9d51 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -452,9 +452,6 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( if(sawn_off) to_chat(user, "\The [src] is already shortened!") return - if(bayonet) - to_chat(user, "You cannot saw-off \the [src] with \the [bayonet] attached!") - return user.changeNext_move(CLICK_CD_MELEE) user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src]...") diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index e8e7d3a2fda9..9c6b9a45e7f9 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -67,7 +67,6 @@ fire_delay = 2 burst_size = 2 pin = /obj/item/firing_pin/implant/pindicate - can_bayonet = TRUE knife_x_offset = 26 knife_y_offset = 12 mag_display = TRUE @@ -90,7 +89,6 @@ mag_type = /obj/item/ammo_box/magazine/wt550m9 can_suppress = FALSE actions_types = list() - can_bayonet = TRUE knife_x_offset = 25 knife_y_offset = 12 mag_display = TRUE diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 199ee7563ca1..13317fb1a649 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -63,7 +63,6 @@ item_state = "moistnugget" slot_flags = ITEM_SLOT_BACK mag_type = /obj/item/ammo_box/magazine/internal/boltaction - can_bayonet = TRUE knife_x_offset = 27 knife_y_offset = 13 can_be_sawn_off = TRUE @@ -72,7 +71,6 @@ . = ..() if(.) spread = 36 - can_bayonet = FALSE item_state = "moistnugget_sawn" /obj/item/gun/ballistic/rifle/boltaction/blow_up(mob/user) @@ -99,7 +97,6 @@ icon_state = "arcane_barrage" item_state = "arcane_barrage" slot_flags = null - can_bayonet = FALSE item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NOBLUDGEON flags_1 = NONE trigger_guard = TRIGGER_GUARD_ALLOW_ALL diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index dd4c9b20fa18..dfa052850846 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -144,7 +144,7 @@ update_icon() /obj/item/gun/energy/screwdriver_act(mob/living/user, obj/item/I) - if(cell && !internal_cell && !gun_light && !bayonet) + if(cell && !internal_cell) to_chat(user, "You begin unscrewing and pulling out the cell...") if(I.use_tool(src, user, unscrewing_time, volume=100)) to_chat(user, "You remove the power cell.") diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 3d97947f8405..23ae43c79d62 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -6,7 +6,6 @@ item_state = null //so the human update icon uses the icon_state instead. ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) modifystate = 1 - can_flashlight = TRUE ammo_x_offset = 3 flight_x_offset = 15 flight_y_offset = 10 @@ -22,16 +21,10 @@ small_gun = TRUE ammo_x_offset = 2 charge_sections = 3 - can_flashlight = FALSE // Can't attach or detach the flashlight, and override it's icon update - gunlight_state = "mini-light" flight_x_offset = 19 flight_y_offset = 13 weapon_weight = WEAPON_LIGHT -/obj/item/gun/energy/e_gun/mini/Initialize() - set_gun_light(new /obj/item/flashlight/seclite(src)) - return ..() - /obj/item/gun/energy/e_gun/stun name = "tactical energy gun" desc = "Military issue energy gun, is able to fire stun rounds." @@ -72,7 +65,6 @@ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap) - can_flashlight = FALSE ammo_x_offset = 1 fire_rate = 1.5 @@ -90,7 +82,6 @@ w_class = WEIGHT_CLASS_HUGE ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) weapon_weight = WEAPON_HEAVY - can_flashlight = FALSE trigger_guard = TRIGGER_GUARD_NONE ammo_x_offset = 2 automatic = 1 diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 14dce080b3d1..bc141b8cfa36 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -8,11 +8,9 @@ item_flags = NONE obj_flags = UNIQUE_RENAME weapon_weight = WEAPON_LIGHT - can_flashlight = TRUE flight_x_offset = 15 flight_y_offset = 9 automatic_charge_overlays = FALSE - can_bayonet = TRUE knife_x_offset = 20 knife_y_offset = 12 internal_cell = TRUE //prevents you from giving it an OP cell - WS Edit diff --git a/code/modules/projectiles/guns/energy/mounted.dm b/code/modules/projectiles/guns/energy/mounted.dm index 89114e805df4..b0d0d5ed7e48 100644 --- a/code/modules/projectiles/guns/energy/mounted.dm +++ b/code/modules/projectiles/guns/energy/mounted.dm @@ -6,7 +6,6 @@ item_state = "armcannonstun4" force = 5 selfcharge = 1 - can_flashlight = FALSE trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses neural signals instead /obj/item/gun/energy/e_gun/advtaser/mounted/dropped()//if somebody manages to drop this somehow... diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index c1ffa9041c77..25fc7f1603cb 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -48,7 +48,6 @@ internal_cell = FALSE big_gun = TRUE //haha gun go brr cell_type = "/obj/item/stock_parts/cell/gun/large" - can_flashlight = TRUE flight_x_offset = 18 flight_y_offset = 12 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 9c32d698ac46..6a695eb643eb 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -7,7 +7,6 @@ shaded_charge = FALSE ammo_x_offset = 2 ammo_y_offset = 2 - can_flashlight = FALSE w_class = WEIGHT_CLASS_HUGE big_gun = TRUE //yes, you can put the comically large cell in it. No, you aren't getting it roundstart. You slut. flags_1 = CONDUCT_1 @@ -26,7 +25,6 @@ ammo_x_offset = 2 ammo_y_offset = 0 pin = null - can_flashlight = TRUE flight_x_offset = 18 flight_y_offset = 11 @@ -101,7 +99,6 @@ overheat_time = 20 holds_charge = TRUE unique_frequency = TRUE - can_flashlight = FALSE max_mod_capacity = 0 /obj/item/gun/energy/kinetic_accelerator/crossbow/halloween diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 6c82925f21d3..77dbbdc36338 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -12,7 +12,6 @@ icon_state = "tesla" item_state = "tesla" ammo_type = list(/obj/item/ammo_casing/energy/tesla_revolver) - can_flashlight = FALSE pin = null shaded_charge = 1 @@ -26,7 +25,6 @@ /obj/item/gun/energy/e_gun/advtaser/cyborg name = "cyborg taser" desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating." - can_flashlight = FALSE can_charge = FALSE use_cyborg_cell = TRUE @@ -37,7 +35,6 @@ item_state = null ammo_type = list(/obj/item/ammo_casing/energy/disabler) ammo_x_offset = 2 - can_flashlight = TRUE flight_x_offset = 15 flight_y_offset = 10 diff --git a/whitesands/code/modules/projectiles/guns/ballistic/automatic.dm b/whitesands/code/modules/projectiles/guns/ballistic/automatic.dm index df9e444e7103..9a2f2d2c33bf 100644 --- a/whitesands/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/whitesands/code/modules/projectiles/guns/ballistic/automatic.dm @@ -8,7 +8,6 @@ can_suppress = FALSE fire_rate = 5 actions_types = list() - can_bayonet = FALSE mag_display = TRUE w_class = WEIGHT_CLASS_BULKY From ab617721f5de52fe6aab37f65b7072460b5ff272 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 07:22:17 -0400 Subject: [PATCH 005/206] attachment radial and CallAsync to INVOKE_ASYNC --- code/datums/components/attachment.dm | 2 +- code/datums/components/attachment_holder.dm | 28 +++++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 95d5c3714b01..06740b5cd813 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -67,7 +67,7 @@ /datum/component/attachment/proc/try_toggle(obj/item/parent, obj/item/holder, mob/user) SIGNAL_HANDLER - CallAsync(src, .proc/do_toggle) + INVOKE_ASYNC(src, .proc/do_toggle, parent, holder, user) /datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index df2483b5d1e8..4738e236887f 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -1,5 +1,3 @@ - - /datum/component/attachment_holder dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS @@ -55,10 +53,23 @@ attachments = null return ..() +/datum/component/attachment_holder/proc/attachments_to_list() + . = list() + for(var/obj/item/attach as anything in attachments) + if(attach.name in .) + stack_trace("two attachments with same name; this shouldn't happen and will cause failures") + continue + .[attach.name] = attach + /datum/component/attachment_holder/proc/handle_ctrl_shift_click(obj/item/parent, mob/user) SIGNAL_HANDLER - // TODO: ATTACHMENT RADIAL MENU + INVOKE_ASYNC(src, .proc/do_attachment_radial, parent, user) + +/datum/component/attachment_holder/proc/do_attachment_radial(obj/item/parent, mob/user) + var/list/attachments_as_list = attachments_to_list() + var/selection = show_radial_menu(user, parent, attachments_as_list) + SEND_SIGNAL(attachments_as_list[selection], COMSIG_ATTACHMENT_TOGGLE, parent, user) /datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) examine_list += "It has [max_attachments] attachment-slot\s." @@ -78,9 +89,10 @@ /datum/component/attachment_holder/proc/do_attach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) - if(slot_room && !slot_room[slot]) - return - slot_room[slot]-- + if(slot_room) + if(!slot_room[slot]) + return + slot_room[slot]-- . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_ATTACH, parent, user) if(.) attachments += attachment @@ -109,11 +121,11 @@ return if(item.tool_behaviour == TOOL_CROWBAR && length(attachments)) - CallAsync(src, .proc/handle_detach, list(parent, item, user)) + INVOKE_ASYNC(src, .proc/handle_detach, parent, item, user) return TRUE if(HAS_TRAIT(item, TRAIT_ATTACHABLE) && length(attachments) < max_attachments) - CallAsync(src, .proc/do_attach, list(item, user)) + INVOKE_ASYNC(src, .proc/do_attach, item, user) return TRUE for(var/obj/item/attach as anything in attachments) From 12cd826b71394b1642e6c00c51ea5c64b0b3f4b4 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 07:45:13 -0400 Subject: [PATCH 006/206] fix a 'static ref warning' --- code/datums/components/attachment_holder.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 4738e236887f..53c011e26d8f 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -69,7 +69,10 @@ /datum/component/attachment_holder/proc/do_attachment_radial(obj/item/parent, mob/user) var/list/attachments_as_list = attachments_to_list() var/selection = show_radial_menu(user, parent, attachments_as_list) - SEND_SIGNAL(attachments_as_list[selection], COMSIG_ATTACHMENT_TOGGLE, parent, user) + var/obj/item/attach = attachments_as_list[selection] + if(!attach) + CRASH("Invalid attachment reference") + SEND_SIGNAL(attach, COMSIG_ATTACHMENT_TOGGLE, parent, user) /datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) examine_list += "It has [max_attachments] attachment-slot\s." From 73bea528842d986f3cb9d45264273c591d0253cf Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 07:45:54 -0400 Subject: [PATCH 007/206] change overlay passing to generate on the fly --- code/datums/components/attachment.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 06740b5cd813..32791a7cf171 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -49,9 +49,7 @@ RegisterSignal(parent, COMSIG_ATTACHMENT_ATTACH, .proc/try_attach) RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, .proc/try_detach) RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, .proc/try_toggle) - - if(attachment_overlay) - RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, .proc/update_overlays) + RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, .proc/update_overlays) for(var/signal in signals) RegisterSignal(parent, signal, signals[signal]) @@ -79,7 +77,7 @@ return TRUE /datum/component/attachment/proc/update_overlays(obj/item/parent, list/overlays, list/offset) - overlays += attachment_overlay + overlays += mutable_appearance(parent.icon, "[parent.icon_state]-attach") /datum/component/attachment/proc/try_attach(obj/item/parent, obj/item/holder, mob/user) SIGNAL_HANDLER From cc18b88cf0061b44be02820b9641c75a0b903f73 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 07:46:27 -0400 Subject: [PATCH 008/206] update invoke args --- code/datums/components/attachment.dm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 32791a7cf171..caf07c32b9c4 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -22,12 +22,10 @@ var/datum/callback/on_attach var/datum/callback/on_detach var/datum/callback/on_toggle - var/mutable_appearance/attachment_overlay var/list/datum/action/actions /datum/component/attachment/Initialize( slot = ATTACHMENT_SLOT_RAIL, - mutable_appearance/attachment_overlay = null, valid_parent_types = list(/obj/item/gun), datum/callback/on_attach = null, datum/callback/on_detach = null, @@ -70,7 +68,7 @@ /datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user) if(on_toggle) - on_toggle.Invoke(parent, holder, user) + on_toggle.Invoke(src, holder, user) return TRUE parent.attack_self(user) @@ -85,7 +83,7 @@ if(!parent.Adjacent(user) || (length(valid_parent_types) && (holder.type in valid_parent_types))) return FALSE - if(on_attach && !on_attach.Invoke(parent, holder, user)) + if(on_attach && !on_attach.Invoke(src, holder, user)) return FALSE parent.forceMove(holder) @@ -97,7 +95,7 @@ if(!parent.Adjacent(user) || (valid_parent_types && (holder.type in valid_parent_types))) return FALSE - if(on_attach && !on_detach.Invoke(parent, holder, user)) + if(on_attach && !on_detach.Invoke(src, holder, user)) return FALSE if(user.can_put_in_hand(parent)) From 7c5f09895aeb8300cd6a30251f93f77580eeb984 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 08:00:27 -0400 Subject: [PATCH 009/206] begone --- code/datums/components/attachment.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index caf07c32b9c4..3f328719ed2b 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -37,7 +37,6 @@ return COMPONENT_INCOMPATIBLE src.slot = slot - src.attachment_overlay = attachment_overlay src.valid_parent_types = valid_parent_types src.on_attach = on_attach src.on_detach = on_detach From b30f3bd3ee5cad15c542dd1ee5a4e97f162e307b Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 08:00:42 -0400 Subject: [PATCH 010/206] attachment helper subtype and tick --- .../objects/items/attachments/_attachment.dm | 46 +++++++++++++++++++ tgstation.dme | 2 + 2 files changed, 48 insertions(+) create mode 100644 code/game/objects/items/attachments/_attachment.dm diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm new file mode 100644 index 000000000000..2f1d7a4a9df3 --- /dev/null +++ b/code/game/objects/items/attachments/_attachment.dm @@ -0,0 +1,46 @@ +/obj/item/attachment + name = "broken attachment" + desc = "alert coders" + // icon = 'icons/obj/attachments.dmi' + + var/slot = ATTACHMENT_SLOT_RAIL + var/list/valid_parents = list() + var/list/signals = null + + var/toggled = FALSE + + var/datum/component/attachment/attachment_comp + +/obj/item/attachment/Initialize() + . = ..() + attachment_comp = AddComponent( \ + /datum/component/attachment, \ + slot, \ + valid_parents, \ + CALLBACK(src, .proc/Attach), \ + CALLBACK(src, .proc/Detach), \ + CALLBACK(src, .proc/Toggle), \ + signals) + +/obj/item/attachment/proc/Toggle(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) + SHOULD_CALL_PARENT(TRUE) + + toggled = !toggled + icon_state = "[initial(icon_state)][toggled ? "-on" : ""]" + +/// Checks if a user should be allowed to attach this attachment to the given parent +/obj/item/attachment/proc/Attach(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) + SHOULD_CALL_PARENT(TRUE) + + if(toggled) + to_chat(user, "You cannot attach [src] while it is active!") + return FALSE + + return TRUE + +/obj/item/attachment/proc/Detach(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) + SHOULD_CALL_PARENT(TRUE) + + if(toggled) + Toggle(holder, gun, user) + return TRUE diff --git a/tgstation.dme b/tgstation.dme index d3a3443791f9..b89ed3985923 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1059,6 +1059,8 @@ #include "code\game\objects\items\vending_items.dm" #include "code\game\objects\items\wayfinding.dm" #include "code\game\objects\items\weaponry.dm" +#include "code\game\objects\items\attachments\_attachment.dm" +#include "code\game\objects\items\attachments\laser_sight.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" #include "code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "code\game\objects\items\circuitboards\machine_circuitboards.dm" From 86de93ae52b67bbf5536bdd305046bf6e978dc5c Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 08:00:48 -0400 Subject: [PATCH 011/206] laser sight :) --- .../game/objects/items/attachments/laser_sight.dm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 code/game/objects/items/attachments/laser_sight.dm diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm new file mode 100644 index 000000000000..c7b27cbc6871 --- /dev/null +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -0,0 +1,15 @@ +/obj/item/attachment/laser_sight + name = "Laser Sight" + desc = "This laser sight is designed to be rail-mounted on a compatible firearm to provide increased accuracy." + icon_state = "laser_sight" + +/obj/item/attachment/laser_sight/Toggle(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) + . = ..() + + playsound(user, toggled ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE) + + if(toggled) + gun.spread *= 0.6 + return + + gun.spread = initial(gun.spread) From 44da3ffe8d00e192305cea7df7b7eb77aafa23d6 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 08:03:44 -0400 Subject: [PATCH 012/206] wordage? idk --- code/datums/components/attachment_holder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 53c011e26d8f..2d48adc1e22a 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -76,7 +76,7 @@ /datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) examine_list += "It has [max_attachments] attachment-slot\s." - examine_list += "\tThere are [max_attachments - length(attachments)] slot\s left." + examine_list += "\t[max_attachments - length(attachments)] attachment-slot\s remain." for(var/obj/item/attach as anything in attachments) SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE, user, examine_list) From 5ddef6d682f97cfe8c6741d214e231428f484a09 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 08:20:28 -0400 Subject: [PATCH 013/206] just gonna sneak this one in here --- code/_onclick/click.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 7cabddfab355..c2c0b406f67f 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -366,7 +366,7 @@ return /atom/proc/CtrlShiftClick(mob/user) - SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT) + SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT, user) return /* From 3c7f5cb11af8cd2aaa3a2bfe09cd125e13ebca40 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 08:20:43 -0400 Subject: [PATCH 014/206] if they didnt pass offsets dont runtime trying to use them --- code/datums/components/attachment_holder.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 2d48adc1e22a..6ddfc4d24454 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -39,9 +39,10 @@ var/list/attach_overlays = list() SEND_SIGNAL(attach, COMSIG_ATTACHMENT_UPDATE_OVERLAY, attach_overlays) for(var/mutable_appearance/overlay as anything in attach_overlays) - var/matrix/overlay_matrix = new - overlay_matrix.Translate(slot_offsets[slot]["x"], slot_offsets[slot]["y"]) - overlay.transform = overlay_matrix + if(slot_offsets && slot_offsets[slot]) + var/matrix/overlay_matrix = new + overlay_matrix.Translate(slot_offsets[slot]["x"], slot_offsets[slot]["y"]) + overlay.transform = overlay_matrix overlays += overlay /datum/component/attachment_holder/proc/handle_qdel() @@ -99,6 +100,8 @@ . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_ATTACH, parent, user) if(.) attachments += attachment + var/atom/parent = src.parent + parent.update_icon() /datum/component/attachment_holder/proc/do_detach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) From 3fff14f1daea5cdfe8c31ced3f9d677edad2e7f3 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 08:20:55 -0400 Subject: [PATCH 015/206] uncomment this --- code/game/objects/items/attachments/_attachment.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index 2f1d7a4a9df3..ed297073ba86 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -1,7 +1,7 @@ /obj/item/attachment name = "broken attachment" desc = "alert coders" - // icon = 'icons/obj/attachments.dmi' + icon = 'icons/obj/attachments.dmi' var/slot = ATTACHMENT_SLOT_RAIL var/list/valid_parents = list() From 78ac1ccf11cdbcaa2151aa401b60c05d70a4d0d0 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 08:21:02 -0400 Subject: [PATCH 016/206] ugly ass fucking sprites --- icons/obj/attachments.dmi | Bin 0 -> 374 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/obj/attachments.dmi diff --git a/icons/obj/attachments.dmi b/icons/obj/attachments.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1a962827ea36a58da9e4a51dfa20207863195ae2 GIT binary patch literal 374 zcmV-+0g3*JP)@l1&N&Aq++naQ68iS)?cEF~&vr3cdeX8iopH1`37Jf%z03 zK7&6f(IwNLO=TLhtg>P!D2W#HJy(Dpvxr`2v29d;b>y!jwnT#slDI%_D1%W^w3wAa z5-`}K;!QFr)KCUbyUdh(8gY;8p0aWhEkyfR5hAT|c1$zLkxA~EM`50M$Y1`)3$_v! U9q>FlSpWb407*qoM6N<$f*s3~IRF3v literal 0 HcmV?d00001 From 8aae9ff87a162ab993925f29b24d203390bc53e8 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 08:38:41 -0400 Subject: [PATCH 017/206] update icon on detach too --- code/datums/components/attachment_holder.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 6ddfc4d24454..7d27a1d72f2b 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -110,6 +110,8 @@ . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_DETACH, parent, user) if(.) attachments -= attachment + var/atom/parent = src.parent + parent.update_icon() /datum/component/attachment_holder/proc/handle_detach(obj/item/parent, obj/item/tool, mob/user) var/list/list = list() From 41ec5137b17e447ce28e355245f9a78b1cccc86c Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 08:38:52 -0400 Subject: [PATCH 018/206] haha yea boy --- .../game/objects/items/attachments/rail_light.dm | 16 ++++++++++++++++ tgstation.dme | 1 + 2 files changed, 17 insertions(+) create mode 100644 code/game/objects/items/attachments/rail_light.dm diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm new file mode 100644 index 000000000000..8e4adfc5f56d --- /dev/null +++ b/code/game/objects/items/attachments/rail_light.dm @@ -0,0 +1,16 @@ +/obj/item/attachment/rail_light + name = "Rail Light" + desc = "Rail mounted gun light for better visibility down range." + icon_state = "laser_sight" + + light_color = "#FFCC66" + light_system = MOVABLE_LIGHT_DIRECTIONAL + light_range = 4 + light_power = 0.8 + light_on = FALSE + +/obj/item/attachment/rail_light/Toggle(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) + . = ..() + + set_light_on(toggled) + update_icon() diff --git a/tgstation.dme b/tgstation.dme index b89ed3985923..a83fcc8565d0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1061,6 +1061,7 @@ #include "code\game\objects\items\weaponry.dm" #include "code\game\objects\items\attachments\_attachment.dm" #include "code\game\objects\items\attachments\laser_sight.dm" +#include "code\game\objects\items\attachments\rail_light.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" #include "code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "code\game\objects\items\circuitboards\machine_circuitboards.dm" From b59758fcaff3c2b91bf5e607ca50c3482b74b6dd Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 09:26:39 -0400 Subject: [PATCH 019/206] better flag handling --- code/game/objects/items/attachments/rail_light.dm | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm index 8e4adfc5f56d..7374a9cd7235 100644 --- a/code/game/objects/items/attachments/rail_light.dm +++ b/code/game/objects/items/attachments/rail_light.dm @@ -11,6 +11,19 @@ /obj/item/attachment/rail_light/Toggle(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) . = ..() - set_light_on(toggled) update_icon() + +/obj/item/attachment/rail_light/Attach(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) + . = ..() + if(!.) + return + + set_light_flags(light_flags | LIGHT_ATTACHED) + +/obj/item/attachment/rail_light/Detach(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) + . = ..() + if(!.) + return + + set_light_flags(light_flags & ~LIGHT_ATTACHED) From e765c5eb8a37ff4782e02bb29f2883ea03484549 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 09:26:56 -0400 Subject: [PATCH 020/206] attack animation if any attachment handles it --- code/datums/components/attachment_holder.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 7d27a1d72f2b..57bc46067dc4 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -145,4 +145,5 @@ for(var/obj/item/attach as anything in attachments) if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_PRE_ATTACK, parent, target, user, params)) + user.do_attack_animation(target) return TRUE From 1dd9149e2a8015d9ea7a166fb709e80592dd064f Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 09:27:02 -0400 Subject: [PATCH 021/206] stabby stabby :) --- .../game/objects/items/attachments/bayonet.dm | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 code/game/objects/items/attachments/bayonet.dm diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm new file mode 100644 index 000000000000..a83f56436f27 --- /dev/null +++ b/code/game/objects/items/attachments/bayonet.dm @@ -0,0 +1,23 @@ +/obj/item/attachment/bayonet + name = "Bayonet" + desc = "Stabby-Stabby" + icon_state = "laser_sight" + force = 20 + signals = list( + COMSIG_ATTACHMENT_PRE_ATTACK = .proc/handle_attack + ) + + var/range = 1 + var/range_extended = 2 + var/force_extended = 10 + +/obj/item/attachment/bayonet/Toggle(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) + . = ..() + + range = toggled ? range_extended : initial(range) + force = toggled ? force_extended : initial(force) + +/obj/item/attachment/bayonet/proc/handle_attack(datum/component/attachment_holder/holder, obj/item/gun/gun, atom/target, mob/user, list/params) + if(target in range(range, user)) + target.attackby(src, user, params) + return From 3f11acfecb44082e67713856f231f3d0d9973bf7 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 09:27:07 -0400 Subject: [PATCH 022/206] tick --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index a83fcc8565d0..e57143bbe465 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1060,6 +1060,7 @@ #include "code\game\objects\items\wayfinding.dm" #include "code\game\objects\items\weaponry.dm" #include "code\game\objects\items\attachments\_attachment.dm" +#include "code\game\objects\items\attachments\bayonet.dm" #include "code\game\objects\items\attachments\laser_sight.dm" #include "code\game\objects\items\attachments\rail_light.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" From db3a7ac502694585998b0306b3bdfa9fd656f08d Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 09:30:28 -0400 Subject: [PATCH 023/206] fix proc path --- code/game/objects/items/attachments/bayonet.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index a83f56436f27..32c169acb048 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -4,7 +4,7 @@ icon_state = "laser_sight" force = 20 signals = list( - COMSIG_ATTACHMENT_PRE_ATTACK = .proc/handle_attack + COMSIG_ATTACHMENT_PRE_ATTACK = /obj/item/attachment/bayonet/proc/handle_attack ) var/range = 1 From 1feef8d73345880da9c0f4a91153ee7550aff574 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 10:48:21 -0400 Subject: [PATCH 024/206] preattack callback bayonet stabby --- code/datums/components/attachment.dm | 16 +++++++++++++--- code/datums/components/attachment_holder.dm | 6 +++--- .../objects/items/attachments/_attachment.dm | 14 +++++++++----- code/game/objects/items/attachments/bayonet.dm | 18 +++++++----------- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 3f328719ed2b..c1837dedb50d 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -22,6 +22,7 @@ var/datum/callback/on_attach var/datum/callback/on_detach var/datum/callback/on_toggle + var/datum/callback/on_preattack var/list/datum/action/actions /datum/component/attachment/Initialize( @@ -30,6 +31,7 @@ datum/callback/on_attach = null, datum/callback/on_detach = null, datum/callback/on_toggle = null, + datum/callback/on_preattack = null, list/signals = null, ) @@ -41,11 +43,13 @@ src.on_attach = on_attach src.on_detach = on_detach src.on_toggle = on_toggle + src.on_preattack = on_preattack ADD_TRAIT(parent, TRAIT_ATTACHABLE, src) RegisterSignal(parent, COMSIG_ATTACHMENT_ATTACH, .proc/try_attach) RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, .proc/try_detach) RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, .proc/try_toggle) + RegisterSignal(parent, COMSIG_ATTACHMENT_PRE_ATTACK, .proc/relay_pre_attack) RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, .proc/update_overlays) for(var/signal in signals) @@ -67,7 +71,7 @@ /datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user) if(on_toggle) - on_toggle.Invoke(src, holder, user) + on_toggle.Invoke( holder, user) return TRUE parent.attack_self(user) @@ -82,7 +86,7 @@ if(!parent.Adjacent(user) || (length(valid_parent_types) && (holder.type in valid_parent_types))) return FALSE - if(on_attach && !on_attach.Invoke(src, holder, user)) + if(on_attach && !on_attach.Invoke(holder, user)) return FALSE parent.forceMove(holder) @@ -94,7 +98,7 @@ if(!parent.Adjacent(user) || (valid_parent_types && (holder.type in valid_parent_types))) return FALSE - if(on_attach && !on_detach.Invoke(src, holder, user)) + if(on_attach && !on_detach.Invoke(holder, user)) return FALSE if(user.can_put_in_hand(parent)) @@ -103,3 +107,9 @@ parent.forceMove(holder.drop_location()) return TRUE + +/datum/component/attachment/proc/relay_pre_attack(obj/item/parent, obj/item/gun, atom/target_atom, mob/user, params) + SIGNAL_HANDLER_DOES_SLEEP + + if(on_preattack) + return on_preattack.Invoke(gun, target_atom, user, params) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 57bc46067dc4..79d6e26744f3 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -140,10 +140,10 @@ if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_ATTACK, parent, item, user)) return TRUE -/datum/component/attachment_holder/proc/handle_item_pre_attack(obj/item/parent, atom/target, mob/user, params) +/datum/component/attachment_holder/proc/handle_item_pre_attack(obj/item/parent, atom/target_atom, mob/user, params) SIGNAL_HANDLER for(var/obj/item/attach as anything in attachments) - if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_PRE_ATTACK, parent, target, user, params)) - user.do_attack_animation(target) + if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_PRE_ATTACK, parent, target_atom, user, params)) + user.do_attack_animation(target_atom) return TRUE diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index ed297073ba86..91903be44eb6 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -5,7 +5,7 @@ var/slot = ATTACHMENT_SLOT_RAIL var/list/valid_parents = list() - var/list/signals = null + var/list/signals = list() var/toggled = FALSE @@ -20,16 +20,17 @@ CALLBACK(src, .proc/Attach), \ CALLBACK(src, .proc/Detach), \ CALLBACK(src, .proc/Toggle), \ + CALLBACK(src, .proc/PreAttack), \ signals) -/obj/item/attachment/proc/Toggle(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) +/obj/item/attachment/proc/Toggle(obj/item/gun/gun, mob/user) SHOULD_CALL_PARENT(TRUE) toggled = !toggled icon_state = "[initial(icon_state)][toggled ? "-on" : ""]" /// Checks if a user should be allowed to attach this attachment to the given parent -/obj/item/attachment/proc/Attach(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) +/obj/item/attachment/proc/Attach(obj/item/gun/gun, mob/user) SHOULD_CALL_PARENT(TRUE) if(toggled) @@ -38,9 +39,12 @@ return TRUE -/obj/item/attachment/proc/Detach(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) +/obj/item/attachment/proc/Detach(obj/item/gun/gun, mob/user) SHOULD_CALL_PARENT(TRUE) if(toggled) - Toggle(holder, gun, user) + Toggle(gun, user) return TRUE + +/obj/item/attachment/proc/PreAttack(obj/item/gun/gun, atom/target, mob/user, list/params) + return FALSE diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 32c169acb048..6715036a8e64 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -1,23 +1,19 @@ /obj/item/attachment/bayonet - name = "Bayonet" + name = "bayonet" desc = "Stabby-Stabby" icon_state = "laser_sight" force = 20 - signals = list( - COMSIG_ATTACHMENT_PRE_ATTACK = /obj/item/attachment/bayonet/proc/handle_attack - ) - var/range = 1 - var/range_extended = 2 + var/reach_extended = 2 var/force_extended = 10 -/obj/item/attachment/bayonet/Toggle(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) +/obj/item/attachment/bayonet/Toggle(obj/item/gun/gun, mob/user) . = ..() - range = toggled ? range_extended : initial(range) + reach = toggled ? reach_extended : initial(reach) force = toggled ? force_extended : initial(force) -/obj/item/attachment/bayonet/proc/handle_attack(datum/component/attachment_holder/holder, obj/item/gun/gun, atom/target, mob/user, list/params) - if(target in range(range, user)) +/obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/user, list/params) + if(CheckToolReach(user, target, max(reach, gun.reach))) target.attackby(src, user, params) - return + return TRUE From a890431b5f21bc9b43be7174b97b08d0f9dd6929 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 11:04:55 -0400 Subject: [PATCH 025/206] bayonets make a sound when you toggle them fix reach code --- code/game/objects/items/attachments/bayonet.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 6715036a8e64..1a6b7ebc6849 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -13,7 +13,10 @@ reach = toggled ? reach_extended : initial(reach) force = toggled ? force_extended : initial(force) + playsound(user, 'sound/weapons/batonextend.ogg') + user.visible_message("[user] [toggled ? "expands" : "retracts"] [user.p_their()] [src].", "You [toggled ? "expand" : "retract"] \the [src].") + /obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/user, list/params) - if(CheckToolReach(user, target, max(reach, gun.reach))) + if(user.CanReach(target, src, TRUE)) target.attackby(src, user, params) return TRUE From 3fe85400cc17395847b5447f802b00a93d94a5b8 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 11:10:47 -0400 Subject: [PATCH 026/206] what if we just call the melee chain directly --- code/game/objects/items/attachments/bayonet.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 1a6b7ebc6849..89f8a76faae3 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -13,10 +13,9 @@ reach = toggled ? reach_extended : initial(reach) force = toggled ? force_extended : initial(force) - playsound(user, 'sound/weapons/batonextend.ogg') + playsound(gun, 'sound/weapons/batonextend.ogg') user.visible_message("[user] [toggled ? "expands" : "retracts"] [user.p_their()] [src].", "You [toggled ? "expand" : "retract"] \the [src].") /obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/user, list/params) - if(user.CanReach(target, src, TRUE)) - target.attackby(src, user, params) - return TRUE + if(user.CanReach(target, src, TRUE)) // Call our melee chain and if we do anything cancel our parents. + return melee_attack_chain(user, target, params) From 298249cac543e201aa7bfa91000a293afa188227 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 11 Aug 2021 11:17:03 -0400 Subject: [PATCH 027/206] actually fix reach --- code/game/objects/items/attachments/bayonet.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 89f8a76faae3..f2c8de96bf64 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -16,6 +16,8 @@ playsound(gun, 'sound/weapons/batonextend.ogg') user.visible_message("[user] [toggled ? "expands" : "retracts"] [user.p_their()] [src].", "You [toggled ? "expand" : "retract"] \the [src].") -/obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/user, list/params) - if(user.CanReach(target, src, TRUE)) // Call our melee chain and if we do anything cancel our parents. - return melee_attack_chain(user, target, params) +/obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) + // Call our melee chain if they are are trying to melee attack something they can reach + if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) + melee_attack_chain(user, target, params) + return TRUE From caa6f5b6ae008d688bf6f5da01c43f949f1d9911 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 25 Aug 2021 07:31:18 -0400 Subject: [PATCH 028/206] better sprites --- icons/obj/attachments.dmi | Bin 374 -> 2694 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/attachments.dmi b/icons/obj/attachments.dmi index 1a962827ea36a58da9e4a51dfa20207863195ae2..b52b70d07e13d2bd8b5c3b66e4ed64a2141a2af0 100644 GIT binary patch literal 2694 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 YODbh@es-=%K9+!koh$O?X>8)Z0MpAA4*&oF literal 374 zcmV-+0g3*JP)@l1&N&Aq++naQ68iS)?cEF~&vr3cdeX8iopH1`37Jf%z03 zK7&6f(IwNLO=TLhtg>P!D2W#HJy(Dpvxr`2v29d;b>y!jwnT#slDI%_D1%W^w3wAa z5-`}K;!QFr)KCUbyUdh(8gY;8p0aWhEkyfR5hAT|c1$zLkxA~EM`50M$Y1`)3$_v! U9q>FlSpWb407*qoM6N<$f*s3~IRF3v From d0bffccdc69bf9fa1af024e3e0502649a7be7279 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 25 Aug 2021 07:31:30 -0400 Subject: [PATCH 029/206] fix this --- code/datums/components/attachment.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index c1837dedb50d..2424b3a9ac0c 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -78,7 +78,7 @@ return TRUE /datum/component/attachment/proc/update_overlays(obj/item/parent, list/overlays, list/offset) - overlays += mutable_appearance(parent.icon, "[parent.icon_state]-attach") + overlays += mutable_appearance(parent.icon, "[parent.icon_state]-attached") /datum/component/attachment/proc/try_attach(obj/item/parent, obj/item/holder, mob/user) SIGNAL_HANDLER From 294478557aadb63ab13ba6b677fe868b344aab92 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 25 Aug 2021 07:37:19 -0400 Subject: [PATCH 030/206] extendo and correct icon state --- code/game/objects/items/attachments/bayonet.dm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index f2c8de96bf64..195ff7df07d9 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -1,17 +1,19 @@ /obj/item/attachment/bayonet name = "bayonet" desc = "Stabby-Stabby" - icon_state = "laser_sight" - force = 20 + icon_state = "ebayonet" + force = 2 + var/force_on = 20 + var/extended = FALSE var/reach_extended = 2 var/force_extended = 10 /obj/item/attachment/bayonet/Toggle(obj/item/gun/gun, mob/user) . = ..() - reach = toggled ? reach_extended : initial(reach) - force = toggled ? force_extended : initial(force) + reach = toggled ? reach : initial(reach) + force = toggled ? force : initial(force) playsound(gun, 'sound/weapons/batonextend.ogg') user.visible_message("[user] [toggled ? "expands" : "retracts"] [user.p_their()] [src].", "You [toggled ? "expand" : "retract"] \the [src].") @@ -19,5 +21,12 @@ /obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) // Call our melee chain if they are are trying to melee attack something they can reach if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) + if(target == user && toggled) + extended = !extended + reach = extended ? reach_extended : initial(reach) + force = extended ? force_extended : force_on + icon_state += "_long" + user.visible_message("[user] [extended ? "increased" : "decreased"] the length of [src].") + return TRUE melee_attack_chain(user, target, params) return TRUE From 5f115bc73a62a69b019bd88d38c7ac7a0d05619d Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 25 Aug 2021 07:37:44 -0400 Subject: [PATCH 031/206] correct lasersight proc parameters and icon state --- code/game/objects/items/attachments/laser_sight.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm index c7b27cbc6871..883869312f58 100644 --- a/code/game/objects/items/attachments/laser_sight.dm +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -1,9 +1,9 @@ /obj/item/attachment/laser_sight name = "Laser Sight" desc = "This laser sight is designed to be rail-mounted on a compatible firearm to provide increased accuracy." - icon_state = "laser_sight" + icon_state = "laserpointer" -/obj/item/attachment/laser_sight/Toggle(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) +/obj/item/attachment/laser_sight/Toggle(obj/item/gun/gun, mob/user) . = ..() playsound(user, toggled ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE) From 88874053ea983117399840cb8783d7d44e6165a3 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 25 Aug 2021 07:37:57 -0400 Subject: [PATCH 032/206] fix rail light params and icon state --- code/game/objects/items/attachments/rail_light.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm index 7374a9cd7235..9e2054367c07 100644 --- a/code/game/objects/items/attachments/rail_light.dm +++ b/code/game/objects/items/attachments/rail_light.dm @@ -1,7 +1,7 @@ /obj/item/attachment/rail_light name = "Rail Light" desc = "Rail mounted gun light for better visibility down range." - icon_state = "laser_sight" + icon_state = "raillight" light_color = "#FFCC66" light_system = MOVABLE_LIGHT_DIRECTIONAL @@ -9,19 +9,19 @@ light_power = 0.8 light_on = FALSE -/obj/item/attachment/rail_light/Toggle(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) +/obj/item/attachment/rail_light/Toggle(obj/item/gun/gun, mob/user) . = ..() set_light_on(toggled) update_icon() -/obj/item/attachment/rail_light/Attach(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) +/obj/item/attachment/rail_light/Attach(obj/item/gun/gun, mob/user) . = ..() if(!.) return set_light_flags(light_flags | LIGHT_ATTACHED) -/obj/item/attachment/rail_light/Detach(datum/component/attachment_holder/holder, obj/item/gun/gun, mob/user) +/obj/item/attachment/rail_light/Detach(obj/item/gun/gun, mob/user) . = ..() if(!.) return From b87fd94ff5b7ac4d112039e6775226ed1efdd391 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 25 Aug 2021 07:38:08 -0400 Subject: [PATCH 033/206] remove deprecated vars --- code/modules/projectiles/gun.dm | 13 +++++++++---- .../modules/projectiles/guns/ballistic/automatic.dm | 4 ---- code/modules/projectiles/guns/ballistic/rifle.dm | 2 -- .../projectiles/guns/energy/kinetic_accelerator.dm | 2 -- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 95b74a71e3a2..dbdc05244f71 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -49,9 +49,6 @@ var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns - var/knife_x_offset = 0 - var/knife_y_offset = 0 - var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite var/ammo_y_offset = 0 var/flight_x_offset = 0 @@ -68,15 +65,23 @@ var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds var/pb_knockback = 0 + /// The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED + var/list/valid_attachments = list() /// Reference to our attachment holder to prevent subtypes having to call GetComponent var/datum/component/attachment_holder/attachment_holder + /// Maximum number of attachments allowed + var/attachment_max = 2 + /// Number of attachments that can fit on a given slot + var/list/slot_available = list() + /// Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y + var/list/slot_offsets = list() /obj/item/gun/Initialize() . = ..() if(pin) pin = new pin(src) build_zooming() - attachment_holder = AddComponent(/datum/component/attachment_holder) + attachment_holder = AddComponent(/datum/component/attachment_holder, attachment_max, slot_available, valid_attachments, slot_offsets) /obj/item/gun/Destroy() if(isobj(pin)) //Can still be the initial path, then we skip diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 9c6b9a45e7f9..35bc26ec156b 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -67,8 +67,6 @@ fire_delay = 2 burst_size = 2 pin = /obj/item/firing_pin/implant/pindicate - knife_x_offset = 26 - knife_y_offset = 12 mag_display = TRUE mag_display_ammo = TRUE empty_indicator = TRUE @@ -89,8 +87,6 @@ mag_type = /obj/item/ammo_box/magazine/wt550m9 can_suppress = FALSE actions_types = list() - knife_x_offset = 25 - knife_y_offset = 12 mag_display = TRUE mag_display_ammo = TRUE empty_indicator = TRUE diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 13317fb1a649..8f4f247f3728 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -63,8 +63,6 @@ item_state = "moistnugget" slot_flags = ITEM_SLOT_BACK mag_type = /obj/item/ammo_box/magazine/internal/boltaction - knife_x_offset = 27 - knife_y_offset = 13 can_be_sawn_off = TRUE /obj/item/gun/ballistic/rifle/boltaction/sawoff(mob/user) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index bc141b8cfa36..c1db1c3988c4 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -11,8 +11,6 @@ flight_x_offset = 15 flight_y_offset = 9 automatic_charge_overlays = FALSE - knife_x_offset = 20 - knife_y_offset = 12 internal_cell = TRUE //prevents you from giving it an OP cell - WS Edit var/overheat_time = 16 var/holds_charge = FALSE From 764826e672105bca2a0ffdc7ea1ac5d0f39395ea Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 25 Aug 2021 07:40:29 -0400 Subject: [PATCH 034/206] remove old flight vars --- code/modules/projectiles/gun.dm | 2 -- code/modules/projectiles/guns/energy/energy_gun.dm | 4 ---- code/modules/projectiles/guns/energy/kinetic_accelerator.dm | 2 -- code/modules/projectiles/guns/energy/pulse.dm | 2 -- code/modules/projectiles/guns/energy/special.dm | 2 -- code/modules/projectiles/guns/energy/stun.dm | 2 -- 6 files changed, 14 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index dbdc05244f71..dbb448bdc6ef 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -51,8 +51,6 @@ var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite var/ammo_y_offset = 0 - var/flight_x_offset = 0 - var/flight_y_offset = 0 //Zooming var/zoomable = FALSE //whether the gun generates a Zoom action on creation diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 23ae43c79d62..6b6e7893f5bd 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -7,8 +7,6 @@ ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) modifystate = 1 ammo_x_offset = 3 - flight_x_offset = 15 - flight_y_offset = 10 weapon_weight = WEAPON_MEDIUM /obj/item/gun/energy/e_gun/mini @@ -21,8 +19,6 @@ small_gun = TRUE ammo_x_offset = 2 charge_sections = 3 - flight_x_offset = 19 - flight_y_offset = 13 weapon_weight = WEAPON_LIGHT /obj/item/gun/energy/e_gun/stun diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index c1db1c3988c4..45c2628f30a9 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -8,8 +8,6 @@ item_flags = NONE obj_flags = UNIQUE_RENAME weapon_weight = WEAPON_LIGHT - flight_x_offset = 15 - flight_y_offset = 9 automatic_charge_overlays = FALSE internal_cell = TRUE //prevents you from giving it an OP cell - WS Edit var/overheat_time = 16 diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 25fc7f1603cb..c43bde7460f5 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -48,8 +48,6 @@ internal_cell = FALSE big_gun = TRUE //haha gun go brr cell_type = "/obj/item/stock_parts/cell/gun/large" - flight_x_offset = 18 - flight_y_offset = 12 /obj/item/gun/energy/pulse/carbine/loyalpin pin = /obj/item/firing_pin/implant/mindshield diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 09f97c30b3f5..edcccced9238 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -25,8 +25,6 @@ ammo_x_offset = 2 ammo_y_offset = 0 pin = null - flight_x_offset = 18 - flight_y_offset = 11 /obj/item/gun/energy/decloner name = "biological demolecularisor" diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 77dbbdc36338..5d3b282d452b 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -35,8 +35,6 @@ item_state = null ammo_type = list(/obj/item/ammo_casing/energy/disabler) ammo_x_offset = 2 - flight_x_offset = 15 - flight_y_offset = 10 /obj/item/gun/energy/disabler/cyborg name = "cyborg disabler" From 2fc75cdc2c901d73a73a9a2d8bd2b00135d6b2a0 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 25 Aug 2021 07:41:03 -0400 Subject: [PATCH 035/206] this will default to zero for the time being --- code/modules/projectiles/gun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index dbb448bdc6ef..8754ae23bf4e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -68,7 +68,7 @@ /// Reference to our attachment holder to prevent subtypes having to call GetComponent var/datum/component/attachment_holder/attachment_holder /// Maximum number of attachments allowed - var/attachment_max = 2 + var/attachment_max = 0 /// Number of attachments that can fit on a given slot var/list/slot_available = list() /// Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y From bab49d494b7fe23c236944f88a866465de03ef3b Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 27 Aug 2021 00:21:38 -0400 Subject: [PATCH 036/206] slots are handled as bflags --- code/datums/components/attachment.dm | 34 +++++++++++++++++++++ code/datums/components/attachment_holder.dm | 13 +++++--- code/modules/projectiles/gun.dm | 4 ++- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 2424b3a9ac0c..00a306540c6e 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -12,10 +12,39 @@ #define ATTACHMENT_SLOT_GRIP "attach-slot-grip" #define ATTACHMENT_SLOT_RAIL "attach-slot-rail" +/proc/attachment_slot_to_bflag(slot) + switch(slot) + if(ATTACHMENT_SLOT_MUZZLE) + return (1<<0) + if(ATTACHMENT_SLOT_SCOPE) + return (1<<1) + if(ATTACHMENT_SLOT_GRIP) + return (1<<2) + if(ATTACHMENT_SLOT_RAIL) + return (1<<3) + +/proc/attachment_slot_from_bflag(slot) + switch(slot) + if(1<<0) + return ATTACHMENT_SLOT_MUZZLE + if(1<<1) + return ATTACHMENT_SLOT_SCOPE + if(1<<2) + return ATTACHMENT_SLOT_GRIP + if(1<<3) + return ATTACHMENT_SLOT_RAIL + #define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" #define TRAIT_ATTACHABLE "attachable" +#define ATTACHMENT_DEFAULT_SLOT_AVAILABLE list( \ + ATTACHMENT_SLOT_MUZZLE = 1, \ + ATTACHMENT_SLOT_SCOPE = 1, \ + ATTACHMENT_SLOT_GRIP = 1, \ + ATTACHMENT_SLOT_RAIL = 1, \ +) + /datum/component/attachment var/slot var/list/valid_parent_types @@ -51,6 +80,7 @@ RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, .proc/try_toggle) RegisterSignal(parent, COMSIG_ATTACHMENT_PRE_ATTACK, .proc/relay_pre_attack) RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, .proc/update_overlays) + RegisterSignal(parent, COMSIG_ATTACHMENT_GET_SLOT, .proc/send_slot) for(var/signal in signals) RegisterSignal(parent, signal, signals[signal]) @@ -113,3 +143,7 @@ if(on_preattack) return on_preattack.Invoke(gun, target_atom, user, params) + +/datum/component/attachment/proc/send_slot(obj/item/parent) + SIGNAL_HANDLER + return attachment_slot_to_bflag(slot) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 79d6e26744f3..0d6b676c5be1 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -36,6 +36,7 @@ for(var/obj/item/attach as anything in attachments) var/slot = SEND_SIGNAL(attach, COMSIG_ATTACHMENT_GET_SLOT) + slot = attachment_slot_from_bflag(slot) var/list/attach_overlays = list() SEND_SIGNAL(attach, COMSIG_ATTACHMENT_UPDATE_OVERLAY, attach_overlays) for(var/mutable_appearance/overlay as anything in attach_overlays) @@ -93,10 +94,11 @@ /datum/component/attachment_holder/proc/do_attach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) - if(slot_room) - if(!slot_room[slot]) - return - slot_room[slot]-- + slot = attachment_slot_from_bflag(slot) + if(!slot_room[slot]) + to_chat(user, "[parent] does not contain room for [attachment]!") + return + slot_room[slot]-- . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_ATTACH, parent, user) if(.) attachments += attachment @@ -105,7 +107,8 @@ /datum/component/attachment_holder/proc/do_detach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) - if(slot_room) + slot = attachment_slot_from_bflag(slot) + if(slot in slot_room) slot_room[slot]++ . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_DETACH, parent, user) if(.) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8754ae23bf4e..b67f1ef7caa0 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -63,6 +63,8 @@ var/automatic = 0 //can gun use it, 0 is no, anything above 0 is the delay between clicks in ds var/pb_knockback = 0 + + // ATTACHMENT STUFF RIGHT HERE // /// The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED var/list/valid_attachments = list() /// Reference to our attachment holder to prevent subtypes having to call GetComponent @@ -70,7 +72,7 @@ /// Maximum number of attachments allowed var/attachment_max = 0 /// Number of attachments that can fit on a given slot - var/list/slot_available = list() + var/list/slot_available = ATTACHMENT_DEFAULT_SLOT_AVAILABLE /// Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y var/list/slot_offsets = list() From 14253fe9bd6f730f5864018c47e11ec953246e50 Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 27 Aug 2021 00:21:54 -0400 Subject: [PATCH 037/206] update icon on any attachment change always --- code/datums/components/attachment_holder.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 0d6b676c5be1..d570a684cfc9 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -73,8 +73,9 @@ var/selection = show_radial_menu(user, parent, attachments_as_list) var/obj/item/attach = attachments_as_list[selection] if(!attach) - CRASH("Invalid attachment reference") + return SEND_SIGNAL(attach, COMSIG_ATTACHMENT_TOGGLE, parent, user) + parent.update_icon() /datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) examine_list += "It has [max_attachments] attachment-slot\s." @@ -141,6 +142,7 @@ for(var/obj/item/attach as anything in attachments) if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_ATTACK, parent, item, user)) + parent.update_icon() return TRUE /datum/component/attachment_holder/proc/handle_item_pre_attack(obj/item/parent, atom/target_atom, mob/user, params) @@ -149,4 +151,5 @@ for(var/obj/item/attach as anything in attachments) if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_PRE_ATTACK, parent, target_atom, user, params)) user.do_attack_animation(target_atom) + parent.update_icon() return TRUE From 938e213d010abe8c1bb0c55f69a3f508b8673282 Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 27 Aug 2021 00:22:02 -0400 Subject: [PATCH 038/206] correcet attach icon states --- icons/obj/attachments.dmi | Bin 2694 -> 2695 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/attachments.dmi b/icons/obj/attachments.dmi index b52b70d07e13d2bd8b5c3b66e4ed64a2141a2af0..3148d28eed934e4377ec42bfc5d752c4e7ac5e02 100644 GIT binary patch delta 225 zcmV<703QE_6^9j&B!A3$R9JLGWpiV4X>fFDZ*Bkpc$}S)!485j5Jb=IS8U)aM$l_7 z24XnCKUBNYCbcDP)$sQohi7-kdr@3ivsS8iTxqQa8RC^Ows_`~ zHMs8j7XCD?C=san1Psc}GFWJ9hBVsW$I+qpHnCA20>4NUsXN4j-fFDZ*Bkpc$}q?u?oU45QgXEDUNnkvDGz; zv`B~c6(pLo3B;r%QR&+|6sJ~9bi0H9`ws5U;ZPr&4yv}H4|HBx0}S??EhSGSf&>P; zk`jrkmtk6b-~oX_rnyHqSY-mbj1r-o2L=TtSI2KS&5Pl+HC12pjw`KIFGGAXMvG@Y zT7%!M@8CyiNr^zsM_^E_7QmCXrcb8*eHa{iZxcVtL*N&Q;x{U(koa43B&DMGJ2T?X a(o!`!)LjKt+t3$wWBrolVX)+}`Hl(EvS(cY From f37814f8ffbc43c3b4be640e7bc3da0c6f21218e Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 27 Aug 2021 00:22:41 -0400 Subject: [PATCH 039/206] silencer into attachment --- .../objects/items/attachments/silencer.dm | 26 +++++++++++ code/game/objects/items/storage/backpack.dm | 2 +- code/game/objects/items/storage/briefcase.dm | 2 +- .../game/objects/items/storage/uplink_kits.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 45 ------------------- .../projectiles/guns/ballistic/automatic.dm | 13 +++++- .../projectiles/guns/ballistic/pistol.dm | 4 +- .../research/designs/weapon_designs.dm | 2 +- code/modules/uplink/uplink_items.dm | 2 +- tgstation.dme | 1 + 10 files changed, 46 insertions(+), 53 deletions(-) create mode 100644 code/game/objects/items/attachments/silencer.dm diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm new file mode 100644 index 000000000000..26ae423c48e7 --- /dev/null +++ b/code/game/objects/items/attachments/silencer.dm @@ -0,0 +1,26 @@ +/obj/item/attachment/silencer + name = "silencer" + desc = "For when you need to kill someone but not be seen killing someone!" + icon_state = "silencer" + slot = ATTACHMENT_SLOT_MUZZLE + +/obj/item/attachment/silencer/Attach(obj/item/gun/gun, mob/user) + . = ..() + if(!gun.can_suppress) + to_chat(user, "You cannot attach [src] to [gun]!") + return FALSE + gun.suppressed = TRUE + +/obj/item/attachment/silencer/Toggle(obj/item/gun/gun, mob/user) + . = ..() + // TODO: Consider making attachments that dont toggle a custom subtype + if(toggled) + Toggle(gun, user) + +/obj/item/attachment/silencer/Detach(obj/item/gun/gun, mob/user) + . = ..() + if(!gun.can_unsuppress) + to_chat(user, "You cannot detach [src] from [gun]!") + return FALSE + gun.suppressed = FALSE + return TRUE diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 8523bd234e0b..32619bacdd03 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -521,7 +521,7 @@ new /obj/item/ammo_box/magazine/smgm45(src) new /obj/item/ammo_box/magazine/smgm45(src) new /obj/item/gun/ballistic/automatic/c20r(src) - new /obj/item/suppressor/specialoffer(src) + new /obj/item/attachment/silencer(src) /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle desc = "A large duffel bag containing a Bulldog, some drums, and a pair of thermal imaging glasses." diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index 1cd0acf8a88e..b0a3ff5e80ab 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -46,5 +46,5 @@ new /obj/item/clothing/under/syndicate/sniper(src) new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) - new /obj/item/suppressor/specialoffer(src) + new /obj/item/attachment/silencer(src) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 149768454086..7c662d134cc2 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -120,7 +120,7 @@ switch (pickweight(list( "bond" = 2, "ninja" = 1, "darklord" = 1, "white_whale_holy_grail" = 2, "mad_scientist" = 2, "bee" = 1, "mr_freeze" = 2, "made_man"= 1))) if("bond") new /obj/item/gun/ballistic/automatic/pistol(src) - new /obj/item/suppressor(src) + new /obj/item/attachment/silencer(src) new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/clothing/under/chameleon(src) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index e067a7725d9a..87ae180b1c18 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -262,21 +262,6 @@ A.update_icon() update_icon() return - if(istype(A, /obj/item/suppressor)) - var/obj/item/suppressor/S = A - if(!can_suppress) - to_chat(user, "You can't seem to figure out how to fit [S] on [src]!") - return - if(!user.is_holding(src)) - to_chat(user, "You need be holding [src] to fit [S] to it!") - return - if(suppressed) - to_chat(user, "[src] already has a suppressor!") - return - if(user.transferItemToLoc(A, src)) - to_chat(user, "You screw \the [S] onto \the [src].") - install_suppressor(A) - return if (can_be_sawn_off) if (sawoff(user, A)) return @@ -287,27 +272,10 @@ bonus_spread += SAWN_OFF_ACC_PENALTY . = ..() -///Installs a new suppressor, assumes that the suppressor is already in the contents of src -/obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/S) - suppressed = S - w_class += S.w_class //so pistols do not fit in pockets when suppressed - update_icon() - /obj/item/gun/ballistic/AltClick(mob/user) if (unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) reskin_obj(user) return - if(loc == user) - if(suppressed && can_unsuppress) - var/obj/item/suppressor/S = suppressed - if(!user.is_holding(src)) - return ..() - to_chat(user, "You unscrew \the [suppressed] from \the [src].") - user.put_in_hands(suppressed) - w_class -= S.w_class - suppressed = null - update_icon() - return ///Prefire empty checks for the bolt drop /obj/item/gun/ballistic/proc/prefire_empty_checks() @@ -482,16 +450,3 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( if(AC.BB) process_fire(user, user, FALSE) . = TRUE - - -/obj/item/suppressor - name = "suppressor" - desc = "A syndicate small-arms suppressor for maximum espionage." - icon = 'icons/obj/guns/projectile.dmi' - icon_state = "suppressor" - w_class = WEIGHT_CLASS_TINY - - -/obj/item/suppressor/specialoffer - name = "cheap suppressor" - desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits most weapons." diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 35bc26ec156b..c43d20406cc0 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -85,12 +85,23 @@ icon_state = "wt550" item_state = "arg" mag_type = /obj/item/ammo_box/magazine/wt550m9 - can_suppress = FALSE actions_types = list() mag_display = TRUE mag_display_ammo = TRUE empty_indicator = TRUE fire_rate = 4 //zedaedit: autorifle but awesome + attachment_max = 2 + slot_available = list(ATTACHMENT_SLOT_RAIL = 1, ATTACHMENT_SLOT_MUZZLE = 1) + slot_offsets = list( + ATTACHMENT_SLOT_RAIL = list( + "x" = 18, + "y" = 15, + ), + ATTACHMENT_SLOT_MUZZLE = list( + "x" = 31, + "y" = 19, + ) + ) /obj/item/gun/ballistic/automatic/mini_uzi name = "\improper Type U3 Uzi" diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 4b0e6a127e47..327c1eec2183 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -29,8 +29,8 @@ /obj/item/gun/ballistic/automatic/pistol/suppressed/Initialize(mapload) . = ..() - var/obj/item/suppressor/S = new(src) - install_suppressor(S) + var/obj/item/attachment/silencer/silencer = new(src) + attachment_holder.do_attach(silencer, null) /obj/item/gun/ballistic/automatic/pistol/m1911 name = "\improper M1911" diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index d24b917026ff..c9f750fde8fa 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -343,7 +343,7 @@ id = "suppressor" build_type = PROTOLATHE materials = list(/datum/material/iron = 2000, /datum/material/silver = 500) - build_path = /obj/item/suppressor + build_path = /obj/item/attachment/silencer category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SECURITY diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 24d3f9c2e2c8..4bb031834f1e 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -677,7 +677,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_weapons/suppressor name = "Suppressor" desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. It is compatible with many small ballistic guns including the Stechkin and C-20r, but not revolvers or energy guns." - item = /obj/item/suppressor + item = /obj/item/attachment/silencer cost = 3 surplus = 10 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) diff --git a/tgstation.dme b/tgstation.dme index 18a4ad7326cc..ca1c0beb02c6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1065,6 +1065,7 @@ #include "code\game\objects\items\attachments\bayonet.dm" #include "code\game\objects\items\attachments\laser_sight.dm" #include "code\game\objects\items\attachments\rail_light.dm" +#include "code\game\objects\items\attachments\silencer.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" #include "code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "code\game\objects\items\circuitboards\machine_circuitboards.dm" From 563019beff8323293fe3c7f26cc0ee6de3ff7ece Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 27 Aug 2021 00:22:49 -0400 Subject: [PATCH 040/206] haha AHHA AHHAHAHA --- code/game/objects/items/attachments/bayonet.dm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 195ff7df07d9..13cf35aace31 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -24,9 +24,14 @@ if(target == user && toggled) extended = !extended reach = extended ? reach_extended : initial(reach) + gun.reach = reach // Even if your gun has a longer reach you default to the bayonets because STAB STAB STAB force = extended ? force_extended : force_on - icon_state += "_long" + // Hey, I just met you + if(extended) // And this is crazy + icon_state += "-long" // But heres my number + else // Call me never + icon_state = replacetext(icon_state, "-long", "") // Because why is this so ugly user.visible_message("[user] [extended ? "increased" : "decreased"] the length of [src].") - return TRUE + return COMPONENT_NO_ATTACK melee_attack_chain(user, target, params) - return TRUE + return COMPONENT_NO_ATTACK From 1a19ae1c01b50b61fe3476d6d22990f254f0bc08 Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 27 Aug 2021 00:23:06 -0400 Subject: [PATCH 041/206] craft plasma bayonet --- code/datums/components/crafting/recipes.dm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 1b63308488b4..85a97e7bb061 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -25,6 +25,23 @@ /datum/crafting_recipe/proc/check_requirements(mob/user, list/collected_requirements) return TRUE +/datum/crafting_recipe/energy_bayonet + name = "Plasma Bayonet" + result = /obj/item/attachment/bayonet + reqs = list( + /obj/item/kitchen/knife/combat = 1, + /obj/item/stack/cable_coil = 30, + /obj/item/stack/sheet/plasteel = 5, + /obj/item/stack/ore/plasma = 20, + /obj/item/assembly/igniter = 1, + ) + time = 10 SECONDS + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + tools = list( + TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_MULTITOOL + ) + /datum/crafting_recipe/IED name = "IED" result = /obj/item/grenade/iedcasing From 3656aeb1091f89acb1dc65e5672c0179ad8f8246 Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 27 Aug 2021 00:36:58 -0400 Subject: [PATCH 042/206] update icon state again --- icons/obj/attachments.dmi | Bin 2695 -> 2714 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/attachments.dmi b/icons/obj/attachments.dmi index 3148d28eed934e4377ec42bfc5d752c4e7ac5e02..fdb8e1f24b723bd5cbf494ce16042f9c28d7fb5b 100644 GIT binary patch literal 2714 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 WCs6RCZ-@J{1gy;M;WehdN&f Date: Fri, 27 Aug 2021 00:45:11 -0400 Subject: [PATCH 043/206] haha dont forget this yes --- .../projectiles/guns/energy/kinetic_accelerator.dm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 45c2628f30a9..b970143d0b39 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -22,6 +22,20 @@ var/recharge_timerid + valid_attachments = list( + /obj/item/attachment/bayonet + ) + attachment_max = 1 + slot_available = list( + ATTACHMENT_SLOT_RAIL = 1 + ) + slot_offsets = list( + ATTACHMENT_SLOT_RAIL = list( + "x" = 24, + "y" = 13, + ) + ) + /obj/item/gun/energy/kinetic_accelerator/examine(mob/user) . = ..() if(max_mod_capacity) From 46e4dce2b5242b38d6c1398b73b796cf08413b2b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 21 Nov 2023 19:40:42 -0600 Subject: [PATCH 044/206] a thing --- code/modules/guncrafting/lathe.dm | 24 ++++++++++++++++++++++++ icons/obj/guncrafting.dmi | Bin 0 -> 2238 bytes shiptest.dme | 1 + 3 files changed, 25 insertions(+) create mode 100644 code/modules/guncrafting/lathe.dm create mode 100644 icons/obj/guncrafting.dmi diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm new file mode 100644 index 000000000000..add8008603e1 --- /dev/null +++ b/code/modules/guncrafting/lathe.dm @@ -0,0 +1,24 @@ +/obj/structure/lathe + name = "Machine Lathe" + desc = "You could make alot of things with this." + icon = 'icons/obj/guncrafting.dmi' + icon_state = "lathe" + density = TRUE + anchored = FALSE + var/obj/item/work_piece = FALSE + +/obj/structure/lathe/AltClick(mob/user) + if(work_piece) + vis_contents -= work_piece + work_piece.forceMove(drop_location()) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(work_piece) + work_piece = FALSE + +/obj/structure/lathe/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/gun)) + I.forceMove(src) + work_piece = I + vis_contents += work_piece + + diff --git a/icons/obj/guncrafting.dmi b/icons/obj/guncrafting.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4f4ff6072ea3a02af610374c244f776a196cd707 GIT binary patch literal 2238 zcmV;v2toIWP)V=-0C=1w$2$suFc1a6I(v$T>BV20Mk10z?-0mp0)8M_^!gTdGaBPGyA^hE z^l&cezF;ua4XHN;i7@CpQjyah7L)Riz_?0D;O3c0h0tE;Q5zWk#6QaTW?{i^kp6NylH;RUoN+BZjvRT6NG==&O)BQfLh+wTn zDTPuWpJgw&3-I-CKB{(FEva7Fpb!Ln_SO~rbEj#?KBd^D==%(eq0?^T9J_;=x7Ikj zxyj0bCGr<51b}nRp{EoA^d}|&n2aLaYj9f!7C3ovV+>|A1gF;4n6;Kdp+GxL$+d+! z?cqC`*cievB*^86Q^S@Y(-+~;p+hvc>SSD(>A5T-P>A%X8d@oOOL^u7K1PI@V|RQs zKx7m>V`zsV@4a`HFGdkNu1i4#R|H=v(oTo9ci!e`7}FRGxOnmu2a^ObhNu!V9|Y93 z#xn-jT8s#)rPu@#tvP-2LmKB~DWmpn%YIQAtc8O)(<) zo(sN@s}xORxZLkEnIudrMb2?hnG92og8^J?aUEwLz^DTGe4eD!VagbK$pEW0{UpKo zJ}wXdJ*~mdaIRY?t2NCyL3%x^B1FDV#TYL4dSo4kDXqzAOT$% zf~OR2r$asVJ{sV@d++7tbI;>xjiWVdo=dry=gEg30N{5oy+Xa!p$G(8BO=tAJG?IP ziI(8h)YN`}H~#RFoH})idZEBUW9ak-l#6-ltq$$#I{iURwHZ<>4Eq*D_yD-`$O^g1 zEXE3s9zrCkp*M($<9MhKCKp;#=Avi$4mEBx@jhX8o-wV%PBJ>p=s$tB0(_AXrBlfdm=IAaX+ z-7c4w=FzFb(HdhcKYii}d86OwYncppeDAy0=fLsf$E8#%QLopr*7A+JZlfnIzUT4t z=YNSYhA$ucJb~{M$be?pVdvBt1UTt?lnOa!ibWbbJJeepR+0pAIb56Ysp(1X?fD)&72@bw`mm&;@_86Nn;=a6e{r8Ku4x`|vy08{5b~&oZ;I&EalDnx-`Cb@XI`_&(v zde&q4D_zjIS%WC0bv|tfJB5hdp(jQ;X98!bR8f`5>{4L z*xK5{w|x>-B%}L8L5^f+hbZo%T^HAN$!4?Ur}A`b8zhrHk#R8n4xX!-$YcwTPJ$8K+xUNgD*CW;$vOqYnMBNBKKf_cI z5GaG^xj2ph!o>UnwN^yV_K6Ei0Qj~~tcP-2EEJfCWAa&#tBp1~?GZM%=ytm}j>Btf z|KbO`6%Y|Bl?njA_|0#}bYbuD?2}0Dhriu5$8lI+Umrbl0fHbP3`26c95*k{0${9V zW_pHNy-sOnhB!&c1OYocO#l`b7Di4tuU=(wVF6<;>l+(bE2PGZWTRA?Artsit2NfE zjp5-Y2!=`RO7Y{5KfWLLKQ!61L4CLiyZtY`@PZmuVArOnr)f5u`*y64YvoppPfty8 zX?`B16xLcC$H7|5u_)qK>+7Q!yEXUy+|VNl92(dhH%T8(>VXPM9%S1DTM41ap( z0*@>%qLl)rXe9}+TFb`vHX?$jHNsHoj0mx{pcGqMTVqul1E|;QIF3Ulia5WpfHjt* zaflWn91M7~RKj&#j$GL$t2NbrpVLcA#Bt2w?QJ}zIGoROVR@M}P4Rsn5h3aKInwWQ zVPj(yII5Ko7`jO(MdrwHg4)wahxkaPZ0%1|o=3WVI&mI2_&F z9Q_NljKPTD6$&V&Mlo&(;JU-+<#roi>tWddUu)hE!_j?gExy)V>~x5&CD`-Z_HL^+ z_TA{d+Z~H>Lx5fLK68+TJ?q?Bp|Y_~p-`k+t5GZ#hZ9l2cQl=L8>L{jJWI7!!_k`M zrNuFyn^&*G`O720+XrBbp;D<}jN$TDop;~A01OY2;kE2@x#8@+P}wA(&m$tV+ihTY ztly~ZjM|lIV=U0FkKI`N0LtYu&1REwxjZ_S{jcrBi4zir;h4_+8<9yOno&Xl0ssI2 M07*qoM6N<$f*#>GR{#J2 literal 0 HcmV?d00001 diff --git a/shiptest.dme b/shiptest.dme index e1b52aaaac6b..412bbd5f8c7e 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -2161,6 +2161,7 @@ #include "code\modules\games\cas.dm" #include "code\modules\games\kotahi.dm" #include "code\modules\games\tarot.dm" +#include "code\modules\guncrafting\lathe.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\foreign_calendar.dm" #include "code\modules\holiday\holidays.dm" From 55d0b191ca048f0c8f415d850abd546429ccea6a Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 21 Nov 2023 21:25:54 -0600 Subject: [PATCH 045/206] kinda workin --- code/modules/guncrafting/lathe.dm | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index add8008603e1..431203385fd4 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -15,10 +15,22 @@ user.put_in_hands(work_piece) work_piece = FALSE +/* +/obj/structure/lathe/attack_hand(mob/user) + if(work_piece) + var/list/choose_options = list() + choose_options += list("Screwdriver" = image(icon = 'icons/obj/tools.dmi', icon_state = "screwdriver_nuke")) + var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) + if(picked_option) + if(picked_option == "Screwdriver") + work_piece.screwdriver_act(user, /obj/item/screwdriver) +*/ + /obj/structure/lathe/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/gun)) + if(!work_piece && istype(I, /obj/item/gun)) I.forceMove(src) work_piece = I + work_piece.vis_flags |= VIS_INHERIT_ID vis_contents += work_piece - - + else + work_piece.attackby(I, user) From 809d2049af08b834bd911fe15fdf7031d2bb3f19 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 21 Nov 2023 22:34:41 -0600 Subject: [PATCH 046/206] this uhh is not working. gonna rework this all --- code/modules/guncrafting/lathe.dm | 23 ++++++++++++++++------- icons/obj/guncrafting.dmi | Bin 2238 -> 2411 bytes 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 431203385fd4..540aaa71e21c 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -15,22 +15,31 @@ user.put_in_hands(work_piece) work_piece = FALSE -/* /obj/structure/lathe/attack_hand(mob/user) - if(work_piece) + if(istype(work_piece, /obj/item/work_piece)) + var/obj/item/work_piece/to_work = work_piece var/list/choose_options = list() choose_options += list("Screwdriver" = image(icon = 'icons/obj/tools.dmi', icon_state = "screwdriver_nuke")) var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) if(picked_option) if(picked_option == "Screwdriver") - work_piece.screwdriver_act(user, /obj/item/screwdriver) -*/ + to_work.improve_item(user) /obj/structure/lathe/attackby(obj/item/I, mob/user) - if(!work_piece && istype(I, /obj/item/gun)) + if(!work_piece && istype(I, /obj/item/work_piece)) I.forceMove(src) work_piece = I work_piece.vis_flags |= VIS_INHERIT_ID vis_contents += work_piece - else - work_piece.attackby(I, user) + +/obj/item/work_piece + name = "Work Piece" + desc = "A piece of metal that can be worked on." + icon = 'icons/obj/guncrafting.dmi' + icon_state = "work_piece" + var/steps_left = 5 + +/obj/item/work_piece/proc/improve_item(mob/user) + if(steps_left >= 0 && do_after(user, 20, target = src)) + steps_left-- + to_chat(user, "You made some progress on the work piece. You only have [steps_left] steps left.") diff --git a/icons/obj/guncrafting.dmi b/icons/obj/guncrafting.dmi index 4f4ff6072ea3a02af610374c244f776a196cd707..9f4de524fb8840ffb7c7f65d06855f2c7a08f53f 100644 GIT binary patch literal 2411 zcmV-x36%DUP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#Gp5=$~tmAE)lGK-28Y!wW-IMa#}b5kK~xGG!+B#>z0D_{5r_`xnKQnS}o|5l#W@d`f)jDn%0^llzh|tMq zX_Q7ORM!~oc6mtzYb{DCl-jr!TS+(<;0s?qpw{YjDPLHm5CnYU)>-`1Cuqh#*zw~`SWBT$pqZxRn!=>^@EuKT42?#EAeSRf4avWF(QoZy<_VN5E@0t7@Ca+Cr_T@GhxV@>rxQG6~R}EwAJGHn}1_Z zBW5*n>xTXa$mjDUtrjE3&`Bb!)^w8uMF@={62Vgnx7DH=d)JNV)zBB<{`>CZ#nXrJ zw8qhzxIC z`~iw6iKy0FSQLj29ojM;04^D!^?3T}r~5YWiEn~M}w*kN_G!Y`hm>u0-Gt8wS< zS>{(NB=+CV(bI~XwoPJ;q26p`t)glTVDX^iQs9)-Ft3ea`?@KAnH;AbcIYM%m9-{D7$E<{AADcF{oU_dHq>^14mf!5pg4|0u~_V9`Hv?q@SXb~>;-$}$FOdXu%le#oa1nN8_ut5 z@b)&mZ46WGHs@xh(5b@F8e=R!dh9WIt=r}EnGAP)BYDy6ZMN;^KQAKRNs}j4|B3_frJEPaqMsMvJv$ZzI4_-($RxW2{(Y zb#0Amy~S*jKrV-C6K)tC=8K(#3t>n_gog_S%2C8`=jOO~-$NVfi(ABMDy!F63K#-JSsEB`gI|1)UlZFkG%GTm+$$8nh0elugk zKG{rw^@iAU%Pn}WOE8op2^(Z}k9;aZElpW9hE-z-ttB*uj}?2>2{gSWKe(r z1<&KJj>ASi&?AQr$!4<;y-#3MbAa#rtgf!&c^;XOF|v*&Ocfbdup}5~h(fVIqa7lm z=va^KpZhFnr;SQ4`+(k-*dxJpG&kq-c#gwD6w!!d43LQMdZ$B@Bz$fEgPSI{QSzIC z3y>rUv$L}-FE8WUE{Q6V(OtqIN3ym?7`M@`i|e{%vsv;ZdD@jll3}0FIGAn=&(#cN zGKk;HSXL#pQcdBWyNKeLyki*|o#gG8Uu9})ic@bMXWv&I-VmXUjDpL=H=6kY0RUXr zrPJvU>kL_-5m~}^h@T&0BnSwU!Sh@kM*v}HYMM$tBxk$Cg&6>R+a=aLyIU+27>Z-^ zS&xgWO?29!vARsV-NtboUOD~`zV$wxJMidJ>d4_kveB$=mV93T5n+CQ9)O?z@>c^7 ztUn&xjOBgryO-fO4hstlSG;#6d=OHbfeR1>0gXn3TrS7W+a>@o)-pCaMx|P1d~A$3 zNyr2NYil(CwoOm>8(F$|k!{n{7;9NrT*O)-HKuPH#>dCV1U}_*g@y8J?{Fmut|hMx zqwfSCdE}9gY+aId8>IJU`f~kq&po##Eb+jp@aX6$wOZ{1@7PN9Iv*Pu;oQ^|N-3?<*DVotR)qYh0zMmoohB%`@!Z zwhgTmC`CO!X*HWD1rwzS z%9RR^)@+~IHqhqM#f$Ln`M%-WD(DMfjA4F$9%BsWm#e(>&KaP0h}pQ5{amg$d!LzK zBA?GAA~c&#pm(gkSXt|r=gX@DfiAakIo4J|Uw~4nM6Fh%R4VbzGtXQTlk)iEk4vM` d*it9M{{mp^Tz8l8zw7`2002ovPDHLkV1hWfl|=vm literal 2238 zcmV;v2toIWP)V=-0C=1w$2$suFc1a6I(v$T>BV20Mk10z?-0mp0)8M_^!gTdGaBPGyA^hE z^l&cezF;ua4XHN;i7@CpQjyah7L)Riz_?0D;O3c0h0tE;Q5zWk#6QaTW?{i^kp6NylH;RUoN+BZjvRT6NG==&O)BQfLh+wTn zDTPuWpJgw&3-I-CKB{(FEva7Fpb!Ln_SO~rbEj#?KBd^D==%(eq0?^T9J_;=x7Ikj zxyj0bCGr<51b}nRp{EoA^d}|&n2aLaYj9f!7C3ovV+>|A1gF;4n6;Kdp+GxL$+d+! z?cqC`*cievB*^86Q^S@Y(-+~;p+hvc>SSD(>A5T-P>A%X8d@oOOL^u7K1PI@V|RQs zKx7m>V`zsV@4a`HFGdkNu1i4#R|H=v(oTo9ci!e`7}FRGxOnmu2a^ObhNu!V9|Y93 z#xn-jT8s#)rPu@#tvP-2LmKB~DWmpn%YIQAtc8O)(<) zo(sN@s}xORxZLkEnIudrMb2?hnG92og8^J?aUEwLz^DTGe4eD!VagbK$pEW0{UpKo zJ}wXdJ*~mdaIRY?t2NCyL3%x^B1FDV#TYL4dSo4kDXqzAOT$% zf~OR2r$asVJ{sV@d++7tbI;>xjiWVdo=dry=gEg30N{5oy+Xa!p$G(8BO=tAJG?IP ziI(8h)YN`}H~#RFoH})idZEBUW9ak-l#6-ltq$$#I{iURwHZ<>4Eq*D_yD-`$O^g1 zEXE3s9zrCkp*M($<9MhKCKp;#=Avi$4mEBx@jhX8o-wV%PBJ>p=s$tB0(_AXrBlfdm=IAaX+ z-7c4w=FzFb(HdhcKYii}d86OwYncppeDAy0=fLsf$E8#%QLopr*7A+JZlfnIzUT4t z=YNSYhA$ucJb~{M$be?pVdvBt1UTt?lnOa!ibWbbJJeepR+0pAIb56Ysp(1X?fD)&72@bw`mm&;@_86Nn;=a6e{r8Ku4x`|vy08{5b~&oZ;I&EalDnx-`Cb@XI`_&(v zde&q4D_zjIS%WC0bv|tfJB5hdp(jQ;X98!bR8f`5>{4L z*xK5{w|x>-B%}L8L5^f+hbZo%T^HAN$!4?Ur}A`b8zhrHk#R8n4xX!-$YcwTPJ$8K+xUNgD*CW;$vOqYnMBNBKKf_cI z5GaG^xj2ph!o>UnwN^yV_K6Ei0Qj~~tcP-2EEJfCWAa&#tBp1~?GZM%=ytm}j>Btf z|KbO`6%Y|Bl?njA_|0#}bYbuD?2}0Dhriu5$8lI+Umrbl0fHbP3`26c95*k{0${9V zW_pHNy-sOnhB!&c1OYocO#l`b7Di4tuU=(wVF6<;>l+(bE2PGZWTRA?Artsit2NfE zjp5-Y2!=`RO7Y{5KfWLLKQ!61L4CLiyZtY`@PZmuVArOnr)f5u`*y64YvoppPfty8 zX?`B16xLcC$H7|5u_)qK>+7Q!yEXUy+|VNl92(dhH%T8(>VXPM9%S1DTM41ap( z0*@>%qLl)rXe9}+TFb`vHX?$jHNsHoj0mx{pcGqMTVqul1E|;QIF3Ulia5WpfHjt* zaflWn91M7~RKj&#j$GL$t2NbrpVLcA#Bt2w?QJ}zIGoROVR@M}P4Rsn5h3aKInwWQ zVPj(yII5Ko7`jO(MdrwHg4)wahxkaPZ0%1|o=3WVI&mI2_&F z9Q_NljKPTD6$&V&Mlo&(;JU-+<#roi>tWddUu)hE!_j?gExy)V>~x5&CD`-Z_HL^+ z_TA{d+Z~H>Lx5fLK68+TJ?q?Bp|Y_~p-`k+t5GZ#hZ9l2cQl=L8>L{jJWI7!!_k`M zrNuFyn^&*G`O720+XrBbp;D<}jN$TDop;~A01OY2;kE2@x#8@+P}wA(&m$tV+ihTY ztly~ZjM|lIV=U0FkKI`N0LtYu&1REwxjZ_S{jcrBi4zir;h4_+8<9yOno&Xl0ssI2 M07*qoM6N<$f*#>GR{#J2 From c4906acbc7758f5571e067568e7d80e8fda0ccb5 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 22 Nov 2023 12:46:15 -0600 Subject: [PATCH 047/206] Improves deconstruction functionality to lathe --- code/modules/guncrafting/lathe.dm | 90 +++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 17 deletions(-) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 540aaa71e21c..6ac3ab5392f5 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -1,3 +1,6 @@ +#define DECONSTRUCT_STAMINA_MINIMUM 50 +#define DECONSTRUCT_STAMINA_USE 40 + /obj/structure/lathe name = "Machine Lathe" desc = "You could make alot of things with this." @@ -6,8 +9,28 @@ density = TRUE anchored = FALSE var/obj/item/work_piece = FALSE + var/steps_left = 0 + //Whether there is an active job on the table + var/in_progress = FALSE + //Defines what job type its currently working on + var/mode = FALSE + //If activily doing a do untill loop + var/working = FALSE + +/obj/structure/lathe/Initialize() + AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/plasma, /datum/material/gold, /datum/material/diamond, /datum/material/plastic, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), INFINITY, FALSE, null, null, null, TRUE) + . = ..() + + +/obj/structure/lathe/examine(mob/user) + . = ..() + if(steps_left) + . += "\nThere are [steps_left] steps left." /obj/structure/lathe/AltClick(mob/user) + if(in_progress) + to_chat(user, "The lathe is currently in use.") + return if(work_piece) vis_contents -= work_piece work_piece.forceMove(drop_location()) @@ -15,31 +38,64 @@ user.put_in_hands(work_piece) work_piece = FALSE -/obj/structure/lathe/attack_hand(mob/user) - if(istype(work_piece, /obj/item/work_piece)) - var/obj/item/work_piece/to_work = work_piece +/obj/structure/lathe/attack_hand(mob/living/carbon/human/user) + if(istype(work_piece, /obj/item) && !mode) var/list/choose_options = list() - choose_options += list("Screwdriver" = image(icon = 'icons/obj/tools.dmi', icon_state = "screwdriver_nuke")) - var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) - if(picked_option) - if(picked_option == "Screwdriver") - to_work.improve_item(user) + choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder")) + mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) + if(mode && !working) + if(mode == "Deconstruct") + deconstruct_part(user) /obj/structure/lathe/attackby(obj/item/I, mob/user) - if(!work_piece && istype(I, /obj/item/work_piece)) + if(!work_piece && istype(I, /obj/item)) I.forceMove(src) work_piece = I work_piece.vis_flags |= VIS_INHERIT_ID vis_contents += work_piece -/obj/item/work_piece - name = "Work Piece" - desc = "A piece of metal that can be worked on." +///////////////// +// DECONSTRUCT // +///////////////// + +/obj/structure/lathe/proc/deconstruct_part(mob/living/carbon/human/user) + if(!in_progress) + in_progress = TRUE + steps_left = 3 + working = TRUE + if(do_after(user, 20, work_piece)) + if(steps_left > 1) + steps_left-- + to_chat(user, "You have [steps_left] steps left.") + user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE) + deconstruct_part(user) + else + scrap_item(work_piece) + working = FALSE + +/obj/structure/lathe/proc/scrap_item(mob/user) + to_chat(user, "The [work_piece.name] is broken down into parts.") + if(istype (work_piece, /obj/item/gun)) + deconstruct_gun() + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) + var/material_amount = materials.get_item_material_amount(work_piece) + if(material_amount) + materials.insert_item(work_piece) + materials.retrieve_all() + vis_contents -= work_piece + qdel(work_piece) + work_piece = FALSE + in_progress = FALSE + mode = FALSE + +/obj/structure/lathe/proc/deconstruct_gun() + var/obj/item/new_part = new /obj/item/gun_part + new_part.forceMove(drop_location()) + +/obj/item/gun_part + name = "Gun Part" + desc = "This could fabcricate metal parts." icon = 'icons/obj/guncrafting.dmi' icon_state = "work_piece" - var/steps_left = 5 -/obj/item/work_piece/proc/improve_item(mob/user) - if(steps_left >= 0 && do_after(user, 20, target = src)) - steps_left-- - to_chat(user, "You made some progress on the work piece. You only have [steps_left] steps left.") +/obj/item/mod_gun/frame From b1c734ebf7b1bdc7ee6be1c1e96c464e3243c7c4 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 22 Nov 2023 14:41:47 -0600 Subject: [PATCH 048/206] new options? half working --- code/modules/guncrafting/lathe.dm | 116 +++++++++++++++++++++++++----- icons/obj/guncrafting.dmi | Bin 2411 -> 2682 bytes 2 files changed, 98 insertions(+), 18 deletions(-) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 6ac3ab5392f5..f9ecd3e2a03a 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -9,6 +9,7 @@ density = TRUE anchored = FALSE var/obj/item/work_piece = FALSE + var/obj/item/blueprint/blueprint = FALSE var/steps_left = 0 //Whether there is an active job on the table var/in_progress = FALSE @@ -31,29 +32,60 @@ if(in_progress) to_chat(user, "The lathe is currently in use.") return - if(work_piece) - vis_contents -= work_piece - work_piece.forceMove(drop_location()) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(work_piece) - work_piece = FALSE + remove_part(user) /obj/structure/lathe/attack_hand(mob/living/carbon/human/user) - if(istype(work_piece, /obj/item) && !mode) + if(!mode) var/list/choose_options = list() - choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder")) + if(istype(work_piece, /obj/item)) + choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder")) + choose_options += list("Research" = image(icon = 'icons/obj/tools.dmi', icon_state = "analyzer")) + if(blueprint) + choose_options += list("Fabricate" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench")) mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) if(mode && !working) if(mode == "Deconstruct") deconstruct_part(user) + if(mode == "Research") + research_part(user) + if(mode == "Fabricate") + fabricate_part(user) /obj/structure/lathe/attackby(obj/item/I, mob/user) - if(!work_piece && istype(I, /obj/item)) + if(istype(I, /obj/item/blueprint)) + if(blueprint) + to_chat(user, "You cant add another blueprint to the lathe.") + return + I.forceMove(src) + blueprint = I + return + if(work_piece) + to_chat(user, "You cant add another item to the lathe.") + return + if(istype(I, /obj/item)) I.forceMove(src) work_piece = I work_piece.vis_flags |= VIS_INHERIT_ID vis_contents += work_piece +/obj/structure/lathe/proc/remove_part(mob/user) + if(work_piece) + vis_contents -= work_piece + work_piece.forceMove(drop_location()) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(work_piece) + work_piece = FALSE + in_progress = FALSE + mode = FALSE + +/obj/structure/lathe/proc/destroy_part(mob/user) + if(work_piece) + vis_contents -= work_piece + qdel(work_piece) + work_piece = FALSE + in_progress = FALSE + mode = FALSE + ///////////////// // DECONSTRUCT // ///////////////// @@ -66,6 +98,7 @@ if(do_after(user, 20, work_piece)) if(steps_left > 1) steps_left-- + playsound(src,'sound/items/welder2.ogg',50,TRUE) to_chat(user, "You have [steps_left] steps left.") user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE) deconstruct_part(user) @@ -75,22 +108,58 @@ /obj/structure/lathe/proc/scrap_item(mob/user) to_chat(user, "The [work_piece.name] is broken down into parts.") + playsound(src,'sound/items/welder.ogg',50,TRUE) if(istype (work_piece, /obj/item/gun)) - deconstruct_gun() + var/obj/item/new_part = new /obj/item/gun_part + new_part.forceMove(drop_location()) var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(work_piece) if(material_amount) materials.insert_item(work_piece) materials.retrieve_all() - vis_contents -= work_piece - qdel(work_piece) - work_piece = FALSE - in_progress = FALSE - mode = FALSE + destroy_part(user) -/obj/structure/lathe/proc/deconstruct_gun() - var/obj/item/new_part = new /obj/item/gun_part - new_part.forceMove(drop_location()) +////////////// +// RESEARCH // +////////////// + +/obj/structure/lathe/proc/research_part(mob/living/carbon/human/user) + if(!in_progress) + in_progress = TRUE + steps_left = 3 + working = TRUE + if(do_after(user, 20, work_piece)) + if(steps_left > 1) + steps_left-- + playsound(src,'sound/items/welder2.ogg',50,TRUE) + to_chat(user, "You have [steps_left] steps left.") + user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE) + research_part(user) + else + var/obj/item/blueprint/blueprint = new /obj/item/blueprint + blueprint.desc += "\nA blueprint on [work_piece.name]." + blueprint.design = work_piece + blueprint.forceMove(drop_location()) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(blueprint) + remove_part(user) + working = FALSE + +/////////////// +// FABRICATE // +/////////////// + +/obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user) + if(blueprint) + var/obj/item/new_part = new blueprint.design(loc) + new_part.forceMove(drop_location()) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(new_part) + + +/////////// +// ITEMS // +/////////// /obj/item/gun_part name = "Gun Part" @@ -99,3 +168,14 @@ icon_state = "work_piece" /obj/item/mod_gun/frame + +/obj/item/blueprint + name = "Blueprint" + desc = "This could be used to make a gun." + icon = 'icons/obj/guncrafting.dmi' + icon_state = "blueprint" + var/design = FALSE + +/obj/item/blueprint/gun + name = "Gun Blueprint" + design = /obj/item/gun/ballistic/shotgun/winchester/mk1 diff --git a/icons/obj/guncrafting.dmi b/icons/obj/guncrafting.dmi index 9f4de524fb8840ffb7c7f65d06855f2c7a08f53f..5bcfdde8c47a4fac7cf21c356a10415848f24c51 100644 GIT binary patch delta 2589 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 From 3bbba1fcc598d5f6c588be2a76d5c0f1a589cb8c Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 22 Nov 2023 18:25:19 -0600 Subject: [PATCH 049/206] might try to port some eris stuff (foolish) --- code/modules/guncrafting/lathe.dm | 32 +++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index f9ecd3e2a03a..9b9c4910a31f 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -37,18 +37,25 @@ /obj/structure/lathe/attack_hand(mob/living/carbon/human/user) if(!mode) var/list/choose_options = list() - if(istype(work_piece, /obj/item)) - choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder")) - choose_options += list("Research" = image(icon = 'icons/obj/tools.dmi', icon_state = "analyzer")) - if(blueprint) - choose_options += list("Fabricate" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench")) + choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder")) + choose_options += list("Research" = image(icon = 'icons/obj/tools.dmi', icon_state = "analyzer")) + choose_options += list("Fabricate" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench")) mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) if(mode && !working) if(mode == "Deconstruct") + if(!work_piece) + to_chat(user, "There is no item on the lathe.") + return deconstruct_part(user) if(mode == "Research") + if(!work_piece) + to_chat(user, "There is no item on the lathe.") + return research_part(user) if(mode == "Fabricate") + if(!blueprint) + to_chat(user, "There is no blueprint on the lathe.") + return fabricate_part(user) /obj/structure/lathe/attackby(obj/item/I, mob/user) @@ -175,7 +182,16 @@ icon = 'icons/obj/guncrafting.dmi' icon_state = "blueprint" var/design = FALSE + var/blueprint = FALSE + +/obj/item/blueprint/winchester + name = "Winchester Blueprint" + design = /obj/item/gun/ballistic/shotgun/winchester/mk2 + blueprint = /datum/design/winchestermk2 + +/obj/item/blueprint/gun_frame + name = "Gun Frame Blueprint" + design = /obj/item/mod_gun/frame + blueprint = /datum/design/gun_frame + -/obj/item/blueprint/gun - name = "Gun Blueprint" - design = /obj/item/gun/ballistic/shotgun/winchester/mk1 From 39679d8577ecc0ec65831afc00d5259b2c4228d6 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 23 Nov 2023 14:12:22 -0600 Subject: [PATCH 050/206] gun parts --- code/modules/guncrafting/lathe.dm | 37 +++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 9b9c4910a31f..31d4f2755fb2 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -168,13 +168,42 @@ // ITEMS // /////////// -/obj/item/gun_part +/obj/item/stack/gun_part name = "Gun Part" desc = "This could fabcricate metal parts." icon = 'icons/obj/guncrafting.dmi' icon_state = "work_piece" - -/obj/item/mod_gun/frame + max_amount = 10 + +/obj/item/part/gun + name = "gun part" + desc = "Spare part of gun." + +/obj/item/part/gun/frame + name = "gun frame" + desc = "a generic gun frame. consider debug" + var/result = /obj/item/gun/ballistic + + // Currently installed grip + var/obj/item/part/gun/modular/grip/InstalledGrip + // Which grips does the frame accept? + var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black) + + // What are the results (in order relative to gripvars)? + //var/list/resultvars = list(/obj/item/gun/ballistic, /obj/item/gun/energy) + + // Currently installed mechanism + var/obj/item/part/gun/modular/grip/InstalledMechanism + // Which mechanism the frame accepts? + var/list/mechanismvar = /obj/item/part/gun/modular/mechanism + + // Currently installed barrel + var/obj/item/part/gun/modular/barrel/InstalledBarrel + // Which barrels does the frame accept? + var/list/barrelvars = list(/obj/item/part/gun/modular/barrel) + + // Bonuses from forging/type or maluses from printing + var/cheap = FALSE // Set this to true for cheap variants /obj/item/blueprint name = "Blueprint" @@ -191,7 +220,7 @@ /obj/item/blueprint/gun_frame name = "Gun Frame Blueprint" - design = /obj/item/mod_gun/frame + design = /obj/item/part/gun/frame blueprint = /datum/design/gun_frame From d3155d0e2dc69351643caef7da199c7070b0dd18 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 24 Nov 2023 18:39:53 -0600 Subject: [PATCH 051/206] "works" dont like how this is handled --- code/modules/guncrafting/lathe.dm | 213 +++++++++++++++++++++++++++--- 1 file changed, 196 insertions(+), 17 deletions(-) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 31d4f2755fb2..373a71df018e 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -116,8 +116,8 @@ /obj/structure/lathe/proc/scrap_item(mob/user) to_chat(user, "The [work_piece.name] is broken down into parts.") playsound(src,'sound/items/welder.ogg',50,TRUE) - if(istype (work_piece, /obj/item/gun)) - var/obj/item/new_part = new /obj/item/gun_part + if(istype (work_piece, /obj/item/modgun)) + var/obj/item/new_part = new /obj/item/part/gun new_part.forceMove(drop_location()) var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(work_piece) @@ -182,15 +182,15 @@ /obj/item/part/gun/frame name = "gun frame" desc = "a generic gun frame. consider debug" - var/result = /obj/item/gun/ballistic + var/result = /obj/item/modgun // Currently installed grip var/obj/item/part/gun/modular/grip/InstalledGrip // Which grips does the frame accept? var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black) - + // What are the results (in order relative to gripvars)? - //var/list/resultvars = list(/obj/item/gun/ballistic, /obj/item/gun/energy) + var/list/resultvars = list(/obj/item/modgun, /obj/item/modgun) // Currently installed mechanism var/obj/item/part/gun/modular/grip/InstalledMechanism @@ -205,6 +205,197 @@ // Bonuses from forging/type or maluses from printing var/cheap = FALSE // Set this to true for cheap variants +/obj/item/part/gun/frame/New(loc, ...) + . = ..() + var/obj/item/modgun/G = new result(null) + +/obj/item/part/gun/frame/New(loc) + ..() + var/spawn_with_preinstalled_parts = FALSE + + if(spawn_with_preinstalled_parts) + var/list/parts_list = list("mechanism", "barrel", "grip") + + pick_n_take(parts_list) + if(prob(50)) + pick_n_take(parts_list) + + for(var/part in parts_list) + switch(part) + if("mechanism") + InstalledMechanism = new mechanismvar(src) + if("barrel") + var/select = pick(barrelvars) + InstalledBarrel = new select(src) + if("grip") + var/select = pick(gripvars) + InstalledGrip = new select(src) + var/variantnum = gripvars.Find(select) + result = resultvars[variantnum] + +/obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user) + if(!I || !user.IsAdvancedToolUser() || user.stat || !user.Adjacent(I)) + return FALSE + user.put_in_hands(I) + playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1) + user.visible_message( + "[user] removes [I] from [src].", + span_notice("You remove [I] from [src].") + ) + return TRUE + +/obj/item/part/gun/frame/proc/insert_item(obj/item/I, mob/living/user) + if(!I || !istype(user) || user.stat) + return FALSE + I.forceMove(src) + playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1) + to_chat(user, span_notice("You insert [I] into [src].")) + return TRUE + +/obj/item/part/gun/frame/proc/replace_item(obj/item/I_old, obj/item/I_new, mob/living/user) + if(!I_old || !I_new || !istype(user) || user.stat || !user.Adjacent(I_new) || !user.Adjacent(I_old)) + return FALSE + I_new.forceMove(src) + user.put_in_hands(I_old) + playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1) + spawn(2) + playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1) + user.visible_message( + "[user] replaces [I_old] with [I_new] in [src].", + span_notice("You replace [I_old] with [I_new] in [src].")) + return TRUE + +/obj/item/part/gun/frame/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/part/gun/modular/grip)) + if(InstalledGrip) + to_chat(user, span_warning("[src] already has a grip attached!")) + return + else + handle_gripvar(I, user) + + if(istype(I, /obj/item/part/gun/modular/mechanism)) + if(InstalledMechanism) + to_chat(user, span_warning("[src] already has a mechanism attached!")) + return + else + handle_mechanismvar(I, user) + + if(istype(I, /obj/item/part/gun/modular/barrel)) + if(InstalledBarrel) + to_chat(user, span_warning("[src] already has a barrel attached!")) + return + else + handle_barrelvar(I, user) + + if(I.tool_behaviour == TOOL_SCREWDRIVER) + var/list/possibles = contents.Copy() + var/obj/item/part/gun/toremove = input("Which part would you like to remove?","Removing parts") in possibles + if(!toremove) + return + if(I.use_tool(src, user, 40, volume=50)) + eject_item(toremove, user) + if(istype(toremove, /obj/item/part/gun/modular/grip)) + InstalledGrip = null + else if(istype(toremove, /obj/item/part/gun/modular/barrel)) + InstalledBarrel = FALSE + else if(istype(toremove, /obj/item/part/gun/modular/mechanism)) + InstalledMechanism = FALSE + + return ..() + +/obj/item/part/gun/frame/proc/handle_gripvar(obj/item/I, mob/living/user) + if(I.type in gripvars) + if(insert_item(I, user)) + var/variantnum = gripvars.Find(I.type) + result = resultvars[variantnum] + InstalledGrip = I + to_chat(user, span_notice("You have attached the grip to \the [src].")) + return + else + to_chat(user, span_warning("This grip does not fit!")) + return + +/obj/item/part/gun/frame/proc/handle_mechanismvar(obj/item/I, mob/living/user) + if(I.type == mechanismvar) + if(insert_item(I, user)) + InstalledMechanism = I + to_chat(user, span_notice("You have attached the mechanism to \the [src].")) + return + else + to_chat(user, span_warning("This mechanism does not fit!")) + return + +/obj/item/part/gun/frame/proc/handle_barrelvar(obj/item/I, mob/living/user) + if(I.type in barrelvars) + if(insert_item(I, user)) + InstalledBarrel = I + to_chat(user, span_notice("You have attached the barrel to \the [src].")) + return + else + to_chat(user, span_warning("This barrel does not fit!")) + return + +/obj/item/part/gun/frame/attack_self(mob/user) + . = ..() + var/turf/T = get_turf(src) + if(!InstalledGrip) + to_chat(user, span_warning("\the [src] does not have a grip!")) + return + if(!InstalledMechanism) + to_chat(user, span_warning("\the [src] does not have a mechanism!")) + return + if(!InstalledBarrel) + to_chat(user, span_warning("\the [src] does not have a barrel!")) + return + var/obj/item/modgun/G = new result(T) + if(barrelvars.len > 1 && istype(G, /obj/item/modgun)) + var/obj/item/modgun/P = G + P.caliber = InstalledBarrel.caliber + G.gun_parts = list(src.type = 1, InstalledGrip.type = 1, InstalledMechanism.type = 1, InstalledBarrel.type = 1) + qdel(src) + return + +/obj/item/part/gun/frame/examine(user, distance) + . = ..() + if(.) + if(InstalledGrip) + to_chat(user, span_notice("\the [src] has \a [InstalledGrip] installed.")) + else + to_chat(user, span_notice("\the [src] does not have a grip installed.")) + if(InstalledMechanism) + to_chat(user, span_notice("\the [src] has \a [InstalledMechanism] installed.")) + else + to_chat(user, span_notice("\the [src] does not have a mechanism installed.")) + if(InstalledBarrel) + to_chat(user, span_notice("\the [src] has \a [InstalledBarrel] installed.")) + else + to_chat(user, span_notice("\the [src] does not have a barrel installed.")) + +/obj/item/modgun + name = "gun" + desc = "A gun." + icon = 'icons/obj/guns/projectile.dmi' + icon_state = "detective" + item_state = "gun" + var/caliber = 357 + var/gun_parts = list() + +/obj/item/part/gun + name = "gun part" + desc = "Spare part of gun." + icon = 'icons/obj/guncrafting.dmi' + icon_state = "gun_part" + +/obj/item/part/gun/modular +/obj/item/part/gun/modular/grip/wood + name = "wooden grip" +/obj/item/part/gun/modular/grip/black + name = "black grip" +/obj/item/part/gun/modular/mechanism + name = "mechanism" +/obj/item/part/gun/modular/barrel + name = "barrel" + var/caliber = 357 /obj/item/blueprint name = "Blueprint" desc = "This could be used to make a gun." @@ -212,15 +403,3 @@ icon_state = "blueprint" var/design = FALSE var/blueprint = FALSE - -/obj/item/blueprint/winchester - name = "Winchester Blueprint" - design = /obj/item/gun/ballistic/shotgun/winchester/mk2 - blueprint = /datum/design/winchestermk2 - -/obj/item/blueprint/gun_frame - name = "Gun Frame Blueprint" - design = /obj/item/part/gun/frame - blueprint = /datum/design/gun_frame - - From 5bbc36a8aafa0ce0eb90393d265fbf3393277436 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 25 Nov 2023 00:57:15 -0600 Subject: [PATCH 052/206] we getting there --- code/modules/guncrafting/lathe.dm | 37 +++++++++++++++++++++++++----- icons/obj/crafts.dmi | Bin 0 -> 8184 bytes 2 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 icons/obj/crafts.dmi diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 373a71df018e..407a41f77681 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -182,6 +182,8 @@ /obj/item/part/gun/frame name = "gun frame" desc = "a generic gun frame. consider debug" + icon_state = "frame_olivaw" + generic = FALSE var/result = /obj/item/modgun // Currently installed grip @@ -380,21 +382,44 @@ var/caliber = 357 var/gun_parts = list() +/obj/item/part + icon ='icons/obj/crafts.dmi' + /obj/item/part/gun name = "gun part" desc = "Spare part of gun." - icon = 'icons/obj/guncrafting.dmi' - icon_state = "gun_part" + icon_state = "gun_part_1" + var/generic = TRUE + +/obj/item/part/gun/Initialize() + . = ..() + if(generic) + icon_state = "gun_part_[rand(1,6)]" /obj/item/part/gun/modular + name = "modular gun part" + desc = "You dont think this should exist." + generic = FALSE + /obj/item/part/gun/modular/grip/wood - name = "wooden grip" + name = "wood grip" + desc = "A wood firearm grip, unattached from a firearm." + icon_state = "grip_wood" + /obj/item/part/gun/modular/grip/black - name = "black grip" + name = "plastic grip" + desc = "A black plastic firearm grip, unattached from a firearm. For sleekness and decorum." + icon_state = "grip_black" + /obj/item/part/gun/modular/mechanism - name = "mechanism" + name = "generic mechanism" + desc = "All the bits that makes the bullet go bang." + icon_state = "mechanism_pistol" + /obj/item/part/gun/modular/barrel - name = "barrel" + name = "generic barrel" + desc = "A gun barrel, which keeps the bullet going in the right direction." + icon_state = "barrel_35" var/caliber = 357 /obj/item/blueprint name = "Blueprint" diff --git a/icons/obj/crafts.dmi b/icons/obj/crafts.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7f510b84c7e37b249bd78629ed8d933ff40839df GIT binary patch literal 8184 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 literal 0 HcmV?d00001 From db2edc32a09122630acad770354fb63b3d4e14f4 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 25 Nov 2023 01:02:02 -0600 Subject: [PATCH 053/206] grip dont control gun and seperate files --- code/modules/guncrafting/frame.dm | 197 +++++++++++++++++++++++++ code/modules/guncrafting/lathe.dm | 237 ------------------------------ code/modules/guncrafting/part.dm | 39 +++++ shiptest.dme | 2 + 4 files changed, 238 insertions(+), 237 deletions(-) create mode 100644 code/modules/guncrafting/frame.dm create mode 100644 code/modules/guncrafting/part.dm diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm new file mode 100644 index 000000000000..0ea6a1e791b9 --- /dev/null +++ b/code/modules/guncrafting/frame.dm @@ -0,0 +1,197 @@ +/obj/item/part/gun/frame + name = "gun frame" + desc = "a generic gun frame. consider debug" + icon_state = "frame_olivaw" + generic = FALSE + var/result = /obj/item/modgun + + // Currently installed grip + var/obj/item/part/gun/modular/grip/InstalledGrip + // Which grips does the frame accept? + var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black) + + // What are the results (in order relative to gripvars)? + var/list/resultvars = list(/obj/item/modgun, /obj/item/modgun) + + // Currently installed mechanism + var/obj/item/part/gun/modular/grip/InstalledMechanism + // Which mechanism the frame accepts? + //var/list/mechanismvar = /obj/item/part/gun/modular/mechanism + + // Currently installed barrel + var/obj/item/part/gun/modular/barrel/InstalledBarrel + // Which barrels does the frame accept? + var/list/barrelvars = list(/obj/item/part/gun/modular/barrel) + + // Bonuses from forging/type or maluses from printing + var/cheap = FALSE // Set this to true for cheap variants + +/obj/item/part/gun/frame/New(loc, ...) + . = ..() + var/obj/item/modgun/G = new result(null) + +/obj/item/part/gun/frame/New(loc) + ..() + var/spawn_with_preinstalled_parts = FALSE + + if(spawn_with_preinstalled_parts) + var/list/parts_list = list("mechanism", "barrel", "grip") + + pick_n_take(parts_list) + if(prob(50)) + pick_n_take(parts_list) + + for(var/part in parts_list) + switch(part) + if("mechanism") + InstalledMechanism = new mechanismvar(src) + if("barrel") + var/select = pick(barrelvars) + InstalledBarrel = new select(src) + if("grip") + var/select = pick(gripvars) + InstalledGrip = new select(src) + /* + var/variantnum = gripvars.Find(select) + result = resultvars[variantnum] + */ + +/obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user) + if(!I || !user.IsAdvancedToolUser() || user.stat || !user.Adjacent(I)) + return FALSE + user.put_in_hands(I) + playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1) + user.visible_message( + "[user] removes [I] from [src].", + span_notice("You remove [I] from [src].") + ) + return TRUE + +/obj/item/part/gun/frame/proc/insert_item(obj/item/I, mob/living/user) + if(!I || !istype(user) || user.stat) + return FALSE + I.forceMove(src) + playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1) + to_chat(user, span_notice("You insert [I] into [src].")) + return TRUE + +/obj/item/part/gun/frame/proc/replace_item(obj/item/I_old, obj/item/I_new, mob/living/user) + if(!I_old || !I_new || !istype(user) || user.stat || !user.Adjacent(I_new) || !user.Adjacent(I_old)) + return FALSE + I_new.forceMove(src) + user.put_in_hands(I_old) + playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1) + spawn(2) + playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1) + user.visible_message( + "[user] replaces [I_old] with [I_new] in [src].", + span_notice("You replace [I_old] with [I_new] in [src].")) + return TRUE + +/obj/item/part/gun/frame/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/part/gun/modular/grip)) + if(InstalledGrip) + to_chat(user, span_warning("[src] already has a grip attached!")) + return + else + handle_gripvar(I, user) + + if(istype(I, /obj/item/part/gun/modular/mechanism)) + if(InstalledMechanism) + to_chat(user, span_warning("[src] already has a mechanism attached!")) + return + else + handle_mechanismvar(I, user) + + if(istype(I, /obj/item/part/gun/modular/barrel)) + if(InstalledBarrel) + to_chat(user, span_warning("[src] already has a barrel attached!")) + return + else + handle_barrelvar(I, user) + + if(I.tool_behaviour == TOOL_SCREWDRIVER) + var/list/possibles = contents.Copy() + var/obj/item/part/gun/toremove = input("Which part would you like to remove?","Removing parts") in possibles + if(!toremove) + return + if(I.use_tool(src, user, 40, volume=50)) + eject_item(toremove, user) + if(istype(toremove, /obj/item/part/gun/modular/grip)) + InstalledGrip = null + else if(istype(toremove, /obj/item/part/gun/modular/barrel)) + InstalledBarrel = FALSE + else if(istype(toremove, /obj/item/part/gun/modular/mechanism)) + InstalledMechanism = FALSE + + return ..() + +/obj/item/part/gun/frame/proc/handle_gripvar(obj/item/I, mob/living/user) + if(I.type in gripvars) + if(insert_item(I, user)) + /* + var/variantnum = gripvars.Find(I.type) + result = resultvars[variantnum] + */ + InstalledGrip = I + to_chat(user, span_notice("You have attached the grip to \the [src].")) + return + else + to_chat(user, span_warning("This grip does not fit!")) + return + +/obj/item/part/gun/frame/proc/handle_mechanismvar(obj/item/I, mob/living/user) + if(I.type == mechanismvar) + if(insert_item(I, user)) + InstalledMechanism = I + to_chat(user, span_notice("You have attached the mechanism to \the [src].")) + return + else + to_chat(user, span_warning("This mechanism does not fit!")) + return + +/obj/item/part/gun/frame/proc/handle_barrelvar(obj/item/I, mob/living/user) + if(I.type in barrelvars) + if(insert_item(I, user)) + InstalledBarrel = I + to_chat(user, span_notice("You have attached the barrel to \the [src].")) + return + else + to_chat(user, span_warning("This barrel does not fit!")) + return + +/obj/item/part/gun/frame/attack_self(mob/user) + . = ..() + var/turf/T = get_turf(src) + if(!InstalledGrip) + to_chat(user, span_warning("\the [src] does not have a grip!")) + return + if(!InstalledMechanism) + to_chat(user, span_warning("\the [src] does not have a mechanism!")) + return + if(!InstalledBarrel) + to_chat(user, span_warning("\the [src] does not have a barrel!")) + return + var/obj/item/modgun/G = new result(T) + if(barrelvars.len > 1 && istype(G, /obj/item/modgun)) + var/obj/item/modgun/P = G + P.caliber = InstalledBarrel.caliber + G.gun_parts = list(src.type = 1, InstalledGrip.type = 1, InstalledMechanism.type = 1, InstalledBarrel.type = 1) + qdel(src) + return + +/obj/item/part/gun/frame/examine(user, distance) + . = ..() + if(.) + if(InstalledGrip) + to_chat(user, span_notice("\the [src] has \a [InstalledGrip] installed.")) + else + to_chat(user, span_notice("\the [src] does not have a grip installed.")) + if(InstalledMechanism) + to_chat(user, span_notice("\the [src] has \a [InstalledMechanism] installed.")) + else + to_chat(user, span_notice("\the [src] does not have a mechanism installed.")) + if(InstalledBarrel) + to_chat(user, span_notice("\the [src] has \a [InstalledBarrel] installed.")) + else + to_chat(user, span_notice("\the [src] does not have a barrel installed.")) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 407a41f77681..5c954c7c8f15 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -175,204 +175,6 @@ icon_state = "work_piece" max_amount = 10 -/obj/item/part/gun - name = "gun part" - desc = "Spare part of gun." - -/obj/item/part/gun/frame - name = "gun frame" - desc = "a generic gun frame. consider debug" - icon_state = "frame_olivaw" - generic = FALSE - var/result = /obj/item/modgun - - // Currently installed grip - var/obj/item/part/gun/modular/grip/InstalledGrip - // Which grips does the frame accept? - var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black) - - // What are the results (in order relative to gripvars)? - var/list/resultvars = list(/obj/item/modgun, /obj/item/modgun) - - // Currently installed mechanism - var/obj/item/part/gun/modular/grip/InstalledMechanism - // Which mechanism the frame accepts? - var/list/mechanismvar = /obj/item/part/gun/modular/mechanism - - // Currently installed barrel - var/obj/item/part/gun/modular/barrel/InstalledBarrel - // Which barrels does the frame accept? - var/list/barrelvars = list(/obj/item/part/gun/modular/barrel) - - // Bonuses from forging/type or maluses from printing - var/cheap = FALSE // Set this to true for cheap variants - -/obj/item/part/gun/frame/New(loc, ...) - . = ..() - var/obj/item/modgun/G = new result(null) - -/obj/item/part/gun/frame/New(loc) - ..() - var/spawn_with_preinstalled_parts = FALSE - - if(spawn_with_preinstalled_parts) - var/list/parts_list = list("mechanism", "barrel", "grip") - - pick_n_take(parts_list) - if(prob(50)) - pick_n_take(parts_list) - - for(var/part in parts_list) - switch(part) - if("mechanism") - InstalledMechanism = new mechanismvar(src) - if("barrel") - var/select = pick(barrelvars) - InstalledBarrel = new select(src) - if("grip") - var/select = pick(gripvars) - InstalledGrip = new select(src) - var/variantnum = gripvars.Find(select) - result = resultvars[variantnum] - -/obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user) - if(!I || !user.IsAdvancedToolUser() || user.stat || !user.Adjacent(I)) - return FALSE - user.put_in_hands(I) - playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1) - user.visible_message( - "[user] removes [I] from [src].", - span_notice("You remove [I] from [src].") - ) - return TRUE - -/obj/item/part/gun/frame/proc/insert_item(obj/item/I, mob/living/user) - if(!I || !istype(user) || user.stat) - return FALSE - I.forceMove(src) - playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1) - to_chat(user, span_notice("You insert [I] into [src].")) - return TRUE - -/obj/item/part/gun/frame/proc/replace_item(obj/item/I_old, obj/item/I_new, mob/living/user) - if(!I_old || !I_new || !istype(user) || user.stat || !user.Adjacent(I_new) || !user.Adjacent(I_old)) - return FALSE - I_new.forceMove(src) - user.put_in_hands(I_old) - playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1) - spawn(2) - playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1) - user.visible_message( - "[user] replaces [I_old] with [I_new] in [src].", - span_notice("You replace [I_old] with [I_new] in [src].")) - return TRUE - -/obj/item/part/gun/frame/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/part/gun/modular/grip)) - if(InstalledGrip) - to_chat(user, span_warning("[src] already has a grip attached!")) - return - else - handle_gripvar(I, user) - - if(istype(I, /obj/item/part/gun/modular/mechanism)) - if(InstalledMechanism) - to_chat(user, span_warning("[src] already has a mechanism attached!")) - return - else - handle_mechanismvar(I, user) - - if(istype(I, /obj/item/part/gun/modular/barrel)) - if(InstalledBarrel) - to_chat(user, span_warning("[src] already has a barrel attached!")) - return - else - handle_barrelvar(I, user) - - if(I.tool_behaviour == TOOL_SCREWDRIVER) - var/list/possibles = contents.Copy() - var/obj/item/part/gun/toremove = input("Which part would you like to remove?","Removing parts") in possibles - if(!toremove) - return - if(I.use_tool(src, user, 40, volume=50)) - eject_item(toremove, user) - if(istype(toremove, /obj/item/part/gun/modular/grip)) - InstalledGrip = null - else if(istype(toremove, /obj/item/part/gun/modular/barrel)) - InstalledBarrel = FALSE - else if(istype(toremove, /obj/item/part/gun/modular/mechanism)) - InstalledMechanism = FALSE - - return ..() - -/obj/item/part/gun/frame/proc/handle_gripvar(obj/item/I, mob/living/user) - if(I.type in gripvars) - if(insert_item(I, user)) - var/variantnum = gripvars.Find(I.type) - result = resultvars[variantnum] - InstalledGrip = I - to_chat(user, span_notice("You have attached the grip to \the [src].")) - return - else - to_chat(user, span_warning("This grip does not fit!")) - return - -/obj/item/part/gun/frame/proc/handle_mechanismvar(obj/item/I, mob/living/user) - if(I.type == mechanismvar) - if(insert_item(I, user)) - InstalledMechanism = I - to_chat(user, span_notice("You have attached the mechanism to \the [src].")) - return - else - to_chat(user, span_warning("This mechanism does not fit!")) - return - -/obj/item/part/gun/frame/proc/handle_barrelvar(obj/item/I, mob/living/user) - if(I.type in barrelvars) - if(insert_item(I, user)) - InstalledBarrel = I - to_chat(user, span_notice("You have attached the barrel to \the [src].")) - return - else - to_chat(user, span_warning("This barrel does not fit!")) - return - -/obj/item/part/gun/frame/attack_self(mob/user) - . = ..() - var/turf/T = get_turf(src) - if(!InstalledGrip) - to_chat(user, span_warning("\the [src] does not have a grip!")) - return - if(!InstalledMechanism) - to_chat(user, span_warning("\the [src] does not have a mechanism!")) - return - if(!InstalledBarrel) - to_chat(user, span_warning("\the [src] does not have a barrel!")) - return - var/obj/item/modgun/G = new result(T) - if(barrelvars.len > 1 && istype(G, /obj/item/modgun)) - var/obj/item/modgun/P = G - P.caliber = InstalledBarrel.caliber - G.gun_parts = list(src.type = 1, InstalledGrip.type = 1, InstalledMechanism.type = 1, InstalledBarrel.type = 1) - qdel(src) - return - -/obj/item/part/gun/frame/examine(user, distance) - . = ..() - if(.) - if(InstalledGrip) - to_chat(user, span_notice("\the [src] has \a [InstalledGrip] installed.")) - else - to_chat(user, span_notice("\the [src] does not have a grip installed.")) - if(InstalledMechanism) - to_chat(user, span_notice("\the [src] has \a [InstalledMechanism] installed.")) - else - to_chat(user, span_notice("\the [src] does not have a mechanism installed.")) - if(InstalledBarrel) - to_chat(user, span_notice("\the [src] has \a [InstalledBarrel] installed.")) - else - to_chat(user, span_notice("\the [src] does not have a barrel installed.")) - /obj/item/modgun name = "gun" desc = "A gun." @@ -382,45 +184,6 @@ var/caliber = 357 var/gun_parts = list() -/obj/item/part - icon ='icons/obj/crafts.dmi' - -/obj/item/part/gun - name = "gun part" - desc = "Spare part of gun." - icon_state = "gun_part_1" - var/generic = TRUE - -/obj/item/part/gun/Initialize() - . = ..() - if(generic) - icon_state = "gun_part_[rand(1,6)]" - -/obj/item/part/gun/modular - name = "modular gun part" - desc = "You dont think this should exist." - generic = FALSE - -/obj/item/part/gun/modular/grip/wood - name = "wood grip" - desc = "A wood firearm grip, unattached from a firearm." - icon_state = "grip_wood" - -/obj/item/part/gun/modular/grip/black - name = "plastic grip" - desc = "A black plastic firearm grip, unattached from a firearm. For sleekness and decorum." - icon_state = "grip_black" - -/obj/item/part/gun/modular/mechanism - name = "generic mechanism" - desc = "All the bits that makes the bullet go bang." - icon_state = "mechanism_pistol" - -/obj/item/part/gun/modular/barrel - name = "generic barrel" - desc = "A gun barrel, which keeps the bullet going in the right direction." - icon_state = "barrel_35" - var/caliber = 357 /obj/item/blueprint name = "Blueprint" desc = "This could be used to make a gun." diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm new file mode 100644 index 000000000000..697d5e26febc --- /dev/null +++ b/code/modules/guncrafting/part.dm @@ -0,0 +1,39 @@ +/obj/item/part + icon ='icons/obj/crafts.dmi' + +/obj/item/part/gun + name = "gun part" + desc = "Spare part of gun." + icon_state = "gun_part_1" + var/generic = TRUE + +/obj/item/part/gun/Initialize() + . = ..() + if(generic) + icon_state = "gun_part_[rand(1,6)]" + +/obj/item/part/gun/modular + name = "modular gun part" + desc = "You dont think this should exist." + generic = FALSE + +/obj/item/part/gun/modular/grip/wood + name = "wood grip" + desc = "A wood firearm grip, unattached from a firearm." + icon_state = "grip_wood" + +/obj/item/part/gun/modular/grip/black + name = "plastic grip" + desc = "A black plastic firearm grip, unattached from a firearm. For sleekness and decorum." + icon_state = "grip_black" + +/obj/item/part/gun/modular/mechanism + name = "generic mechanism" + desc = "All the bits that makes the bullet go bang." + icon_state = "mechanism_pistol" + +/obj/item/part/gun/modular/barrel + name = "generic barrel" + desc = "A gun barrel, which keeps the bullet going in the right direction." + icon_state = "barrel_35" + var/caliber = 357 diff --git a/shiptest.dme b/shiptest.dme index 412bbd5f8c7e..15600e073602 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -2161,7 +2161,9 @@ #include "code\modules\games\cas.dm" #include "code\modules\games\kotahi.dm" #include "code\modules\games\tarot.dm" +#include "code\modules\guncrafting\frame.dm" #include "code\modules\guncrafting\lathe.dm" +#include "code\modules\guncrafting\part.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\foreign_calendar.dm" #include "code\modules\holiday\holidays.dm" From de7c2b5e20656f473e40cd24312e6e26c5a89ae6 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 25 Nov 2023 11:01:56 -0600 Subject: [PATCH 054/206] shrug --- code/modules/guncrafting/part.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm index 697d5e26febc..17a03247668b 100644 --- a/code/modules/guncrafting/part.dm +++ b/code/modules/guncrafting/part.dm @@ -16,6 +16,8 @@ name = "modular gun part" desc = "You dont think this should exist." generic = FALSE + var/list/attached_mods = list() + var/list/legal_mods = list() /obj/item/part/gun/modular/grip/wood name = "wood grip" From 22de36f410a942ac71aac58fef482cf5055bd43e Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 19 Jan 2024 00:45:07 -0600 Subject: [PATCH 055/206] scrap blueprint system --- code/modules/guncrafting/frame.dm | 33 ++++++----------- code/modules/guncrafting/lathe.dm | 61 +++++-------------------------- code/modules/projectiles/gun.dm | 3 ++ 3 files changed, 25 insertions(+), 72 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 0ea6a1e791b9..a6120a6e76a0 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -3,20 +3,17 @@ desc = "a generic gun frame. consider debug" icon_state = "frame_olivaw" generic = FALSE - var/result = /obj/item/modgun + var/result = /obj/item/gun // Currently installed grip var/obj/item/part/gun/modular/grip/InstalledGrip // Which grips does the frame accept? var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black) - // What are the results (in order relative to gripvars)? - var/list/resultvars = list(/obj/item/modgun, /obj/item/modgun) - // Currently installed mechanism var/obj/item/part/gun/modular/grip/InstalledMechanism // Which mechanism the frame accepts? - //var/list/mechanismvar = /obj/item/part/gun/modular/mechanism + var/list/mechanismvar = /obj/item/part/gun/modular/mechanism // Currently installed barrel var/obj/item/part/gun/modular/barrel/InstalledBarrel @@ -32,15 +29,10 @@ /obj/item/part/gun/frame/New(loc) ..() - var/spawn_with_preinstalled_parts = FALSE + var/spawn_with_preinstalled_parts = TRUE if(spawn_with_preinstalled_parts) var/list/parts_list = list("mechanism", "barrel", "grip") - - pick_n_take(parts_list) - if(prob(50)) - pick_n_take(parts_list) - for(var/part in parts_list) switch(part) if("mechanism") @@ -51,10 +43,6 @@ if("grip") var/select = pick(gripvars) InstalledGrip = new select(src) - /* - var/variantnum = gripvars.Find(select) - result = resultvars[variantnum] - */ /obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user) if(!I || !user.IsAdvancedToolUser() || user.stat || !user.Adjacent(I)) @@ -184,14 +172,17 @@ . = ..() if(.) if(InstalledGrip) - to_chat(user, span_notice("\the [src] has \a [InstalledGrip] installed.")) + . += "\the [src] has \a [InstalledGrip] installed." else - to_chat(user, span_notice("\the [src] does not have a grip installed.")) + . += "\the [src] does not have a grip installed." if(InstalledMechanism) - to_chat(user, span_notice("\the [src] has \a [InstalledMechanism] installed.")) + . += "\the [src] has \a [InstalledMechanism] installed." else - to_chat(user, span_notice("\the [src] does not have a mechanism installed.")) + . += "\the [src] does not have a mechanism installed." if(InstalledBarrel) - to_chat(user, span_notice("\the [src] has \a [InstalledBarrel] installed.")) + . += "\the [src] has \a [InstalledBarrel] installed." else - to_chat(user, span_notice("\the [src] does not have a barrel installed.")) + . += "\the [src] does not have a barrel installed." + +/obj/item/part/gun/frame/mk1 + result = /obj/item/gun/ballistic/shotgun/winchester/mk1 diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 5c954c7c8f15..a29644753a79 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -1,5 +1,5 @@ #define DECONSTRUCT_STAMINA_MINIMUM 50 -#define DECONSTRUCT_STAMINA_USE 40 +#define DECONSTRUCT_STAMINA_USE 20 /obj/structure/lathe name = "Machine Lathe" @@ -9,7 +9,6 @@ density = TRUE anchored = FALSE var/obj/item/work_piece = FALSE - var/obj/item/blueprint/blueprint = FALSE var/steps_left = 0 //Whether there is an active job on the table var/in_progress = FALSE @@ -38,7 +37,6 @@ if(!mode) var/list/choose_options = list() choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder")) - choose_options += list("Research" = image(icon = 'icons/obj/tools.dmi', icon_state = "analyzer")) choose_options += list("Fabricate" = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench")) mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) if(mode && !working) @@ -47,25 +45,10 @@ to_chat(user, "There is no item on the lathe.") return deconstruct_part(user) - if(mode == "Research") - if(!work_piece) - to_chat(user, "There is no item on the lathe.") - return - research_part(user) if(mode == "Fabricate") - if(!blueprint) - to_chat(user, "There is no blueprint on the lathe.") - return fabricate_part(user) /obj/structure/lathe/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/blueprint)) - if(blueprint) - to_chat(user, "You cant add another blueprint to the lathe.") - return - I.forceMove(src) - blueprint = I - return if(work_piece) to_chat(user, "You cant add another item to the lathe.") return @@ -101,6 +84,9 @@ if(!in_progress) in_progress = TRUE steps_left = 3 + if(user.getStaminaLoss() > DECONSTRUCT_STAMINA_MINIMUM) + balloon_alert(user, "too tired") + return working = TRUE if(do_after(user, 20, work_piece)) if(steps_left > 1) @@ -116,9 +102,13 @@ /obj/structure/lathe/proc/scrap_item(mob/user) to_chat(user, "The [work_piece.name] is broken down into parts.") playsound(src,'sound/items/welder.ogg',50,TRUE) - if(istype (work_piece, /obj/item/modgun)) + if(istype (work_piece, /obj/item/gun)) + var/obj/item/gun/gun_work_piece = work_piece var/obj/item/new_part = new /obj/item/part/gun new_part.forceMove(drop_location()) + if(gun_work_piece.frame) + var/obj/item/frame = gun_work_piece.frame + frame.forceMove(drop_location()) var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(work_piece) if(material_amount) @@ -126,43 +116,12 @@ materials.retrieve_all() destroy_part(user) -////////////// -// RESEARCH // -////////////// - -/obj/structure/lathe/proc/research_part(mob/living/carbon/human/user) - if(!in_progress) - in_progress = TRUE - steps_left = 3 - working = TRUE - if(do_after(user, 20, work_piece)) - if(steps_left > 1) - steps_left-- - playsound(src,'sound/items/welder2.ogg',50,TRUE) - to_chat(user, "You have [steps_left] steps left.") - user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE) - research_part(user) - else - var/obj/item/blueprint/blueprint = new /obj/item/blueprint - blueprint.desc += "\nA blueprint on [work_piece.name]." - blueprint.design = work_piece - blueprint.forceMove(drop_location()) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(blueprint) - remove_part(user) - working = FALSE - /////////////// // FABRICATE // /////////////// /obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user) - if(blueprint) - var/obj/item/new_part = new blueprint.design(loc) - new_part.forceMove(drop_location()) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(new_part) - + return /////////// // ITEMS // diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index b250e23751d5..e3b503b4b30e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -133,6 +133,9 @@ ///If the saftey on? If so, we can't fire the weapon var/safety = FALSE + // Used when deconstructing + var/frame = FALSE + /obj/item/gun/Initialize() . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) From 8f28e6bd1766f3c940d8b2f372586ffe8feae3db Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 19 Jan 2024 20:51:26 -0600 Subject: [PATCH 056/206] frames on gun init --- code/modules/guncrafting/frame.dm | 4 ---- code/modules/guncrafting/lathe.dm | 29 +++++++++++++++++++++++++---- code/modules/projectiles/gun.dm | 4 +++- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index a6120a6e76a0..1c6de3a7b5b5 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -23,10 +23,6 @@ // Bonuses from forging/type or maluses from printing var/cheap = FALSE // Set this to true for cheap variants -/obj/item/part/gun/frame/New(loc, ...) - . = ..() - var/obj/item/modgun/G = new result(null) - /obj/item/part/gun/frame/New(loc) ..() var/spawn_with_preinstalled_parts = TRUE diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index a29644753a79..dada9a36ec15 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -34,6 +34,9 @@ remove_part(user) /obj/structure/lathe/attack_hand(mob/living/carbon/human/user) + if(!work_piece) + to_chat(user, "There is no item on the lathe.") + return if(!mode) var/list/choose_options = list() choose_options += list("Deconstruct" = image(icon = 'icons/obj/tools.dmi', icon_state = "welder")) @@ -41,9 +44,6 @@ mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) if(mode && !working) if(mode == "Deconstruct") - if(!work_piece) - to_chat(user, "There is no item on the lathe.") - return deconstruct_part(user) if(mode == "Fabricate") fabricate_part(user) @@ -121,7 +121,28 @@ /////////////// /obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user) - return + if(istype (work_piece, /obj/item/gun)) + var/obj/item/gun/gun_work_piece = work_piece + var/list/choose_options = list() + choose_options += list("Grip" = image(icon ='icons/obj/crafts.dmi', icon_state = "grip_wood")) + choose_options += list("Mechanism" = image(icon ='icons/obj/crafts.dmi', icon_state = "mechanism_pistol")) + choose_options += list("Barrel" = image(icon ='icons/obj/crafts.dmi', icon_state = "barrel_35")) + if(gun_work_piece.frame) + choose_options += list("Frame" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.icon_state)) + var/choosen_part = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) + if(choosen_part) + var/obj/part_to_build + switch(choosen_part) + if("Grip") + part_to_build = new /obj/item/part/gun/modular/grip/wood + if("Mechanism") + part_to_build = new /obj/item/part/gun/modular/mechanism + if("Barrel") + part_to_build = new /obj/item/part/gun/modular/barrel + if("Frame") + part_to_build = new /obj/item/part/gun/frame + part_to_build.forceMove(drop_location()) + mode = FALSE /////////// // ITEMS // diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index e3b503b4b30e..8f53f5895835 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -134,10 +134,12 @@ var/safety = FALSE // Used when deconstructing - var/frame = FALSE + var/obj/item/part/gun/frame/frame /obj/item/gun/Initialize() . = ..() + if(!frame) + frame = new(src) RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) if(pin) From 976ae141b84266f4d630597b67199e56c2d634aa Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 22 Jan 2024 17:28:32 -0600 Subject: [PATCH 057/206] dynamicly generate the parts --- code/modules/guncrafting/lathe.dm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index dada9a36ec15..f1e49db7242f 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -124,9 +124,12 @@ if(istype (work_piece, /obj/item/gun)) var/obj/item/gun/gun_work_piece = work_piece var/list/choose_options = list() - choose_options += list("Grip" = image(icon ='icons/obj/crafts.dmi', icon_state = "grip_wood")) - choose_options += list("Mechanism" = image(icon ='icons/obj/crafts.dmi', icon_state = "mechanism_pistol")) - choose_options += list("Barrel" = image(icon ='icons/obj/crafts.dmi', icon_state = "barrel_35")) + if(gun_work_piece.frame.InstalledGrip) + choose_options += list("Grip" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledGrip.icon_state)) + if(gun_work_piece.frame.InstalledMechanism) + choose_options += list("Mechanism" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledMechanism.icon_state)) + if(gun_work_piece.frame.InstalledBarrel) + choose_options += list("Barrel" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledBarrel.icon_state)) if(gun_work_piece.frame) choose_options += list("Frame" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.icon_state)) var/choosen_part = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) @@ -134,13 +137,13 @@ var/obj/part_to_build switch(choosen_part) if("Grip") - part_to_build = new /obj/item/part/gun/modular/grip/wood + part_to_build = new gun_work_piece.frame.InstalledGrip.type if("Mechanism") - part_to_build = new /obj/item/part/gun/modular/mechanism + part_to_build = new gun_work_piece.frame.InstalledMechanism.type if("Barrel") - part_to_build = new /obj/item/part/gun/modular/barrel + part_to_build = new gun_work_piece.frame.InstalledBarrel.type if("Frame") - part_to_build = new /obj/item/part/gun/frame + part_to_build = new gun_work_piece.frame.type part_to_build.forceMove(drop_location()) mode = FALSE From 04982c490477aa6879487d2243b38d4e745e9b21 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 24 Jan 2024 12:53:02 -0600 Subject: [PATCH 058/206] yea --- code/modules/guncrafting/frame.dm | 11 ++++------- code/modules/projectiles/gun.dm | 10 +++++++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 1c6de3a7b5b5..9d29078973b9 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -146,7 +146,6 @@ /obj/item/part/gun/frame/attack_self(mob/user) . = ..() - var/turf/T = get_turf(src) if(!InstalledGrip) to_chat(user, span_warning("\the [src] does not have a grip!")) return @@ -156,12 +155,10 @@ if(!InstalledBarrel) to_chat(user, span_warning("\the [src] does not have a barrel!")) return - var/obj/item/modgun/G = new result(T) - if(barrelvars.len > 1 && istype(G, /obj/item/modgun)) - var/obj/item/modgun/P = G - P.caliber = InstalledBarrel.caliber - G.gun_parts = list(src.type = 1, InstalledGrip.type = 1, InstalledMechanism.type = 1, InstalledBarrel.type = 1) - qdel(src) + var/turf/T = get_turf(src) + var/obj/item/gun/newGun = new result(T) + newGun.frame = src + src.forceMove(newGun) return /obj/item/part/gun/frame/examine(user, distance) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8f53f5895835..25e26933a5b0 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -133,13 +133,17 @@ ///If the saftey on? If so, we can't fire the weapon var/safety = FALSE - // Used when deconstructing + // Guncrafting var/obj/item/part/gun/frame/frame + // 0 means no frame 1-5 are diffrent quality parts + var/quality = 3 + /obj/item/gun/Initialize() . = ..() - if(!frame) - frame = new(src) + if(quality != 0) + if(!frame) + frame = new(src) RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) if(pin) From 08df15fbaa7caaf94c35c353e1ee261cee96a308 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 24 Jan 2024 16:17:16 -0600 Subject: [PATCH 059/206] yea --- code/modules/guncrafting/frame.dm | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 9d29078973b9..d9c0aafd70ec 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -8,12 +8,12 @@ // Currently installed grip var/obj/item/part/gun/modular/grip/InstalledGrip // Which grips does the frame accept? - var/list/gripvars = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black) + var/list/validGrips = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black) // Currently installed mechanism var/obj/item/part/gun/modular/grip/InstalledMechanism // Which mechanism the frame accepts? - var/list/mechanismvar = /obj/item/part/gun/modular/mechanism + var/list/validMechanism = /obj/item/part/gun/modular/mechanism // Currently installed barrel var/obj/item/part/gun/modular/barrel/InstalledBarrel @@ -32,12 +32,12 @@ for(var/part in parts_list) switch(part) if("mechanism") - InstalledMechanism = new mechanismvar(src) + InstalledMechanism = new validMechanism(src) if("barrel") var/select = pick(barrelvars) InstalledBarrel = new select(src) if("grip") - var/select = pick(gripvars) + var/select = pick(validGrips) InstalledGrip = new select(src) /obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user) @@ -85,7 +85,7 @@ to_chat(user, span_warning("[src] already has a mechanism attached!")) return else - handle_mechanismvar(I, user) + handle_validMechanism(I, user) if(istype(I, /obj/item/part/gun/modular/barrel)) if(InstalledBarrel) @@ -111,10 +111,10 @@ return ..() /obj/item/part/gun/frame/proc/handle_gripvar(obj/item/I, mob/living/user) - if(I.type in gripvars) + if(I.type in validGrips) if(insert_item(I, user)) /* - var/variantnum = gripvars.Find(I.type) + var/variantnum = validGrips.Find(I.type) result = resultvars[variantnum] */ InstalledGrip = I @@ -124,8 +124,8 @@ to_chat(user, span_warning("This grip does not fit!")) return -/obj/item/part/gun/frame/proc/handle_mechanismvar(obj/item/I, mob/living/user) - if(I.type == mechanismvar) +/obj/item/part/gun/frame/proc/handle_validMechanism(obj/item/I, mob/living/user) + if(I.type == validMechanism) if(insert_item(I, user)) InstalledMechanism = I to_chat(user, span_notice("You have attached the mechanism to \the [src].")) @@ -156,7 +156,9 @@ to_chat(user, span_warning("\the [src] does not have a barrel!")) return var/turf/T = get_turf(src) - var/obj/item/gun/newGun = new result(T) + var/obj/item/gun/newGun = result + newGun.quality = 0 + new newGun(T) newGun.frame = src src.forceMove(newGun) return From 8cc5bfebbb168bccfa312c3a7297550c2fb6715b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 24 Jan 2024 16:41:34 -0600 Subject: [PATCH 060/206] aaa --- code/modules/guncrafting/frame.dm | 32 ++++++++++++++----------------- code/modules/guncrafting/lathe.dm | 17 ---------------- 2 files changed, 14 insertions(+), 35 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index d9c0aafd70ec..e48d011cef19 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -13,15 +13,14 @@ // Currently installed mechanism var/obj/item/part/gun/modular/grip/InstalledMechanism // Which mechanism the frame accepts? - var/list/validMechanism = /obj/item/part/gun/modular/mechanism + var/list/validMechanisms = list(/obj/item/part/gun/modular/mechanism) // Currently installed barrel var/obj/item/part/gun/modular/barrel/InstalledBarrel // Which barrels does the frame accept? - var/list/barrelvars = list(/obj/item/part/gun/modular/barrel) + var/list/validBarrels = list(/obj/item/part/gun/modular/barrel) - // Bonuses from forging/type or maluses from printing - var/cheap = FALSE // Set this to true for cheap variants + var/quality = 4 /obj/item/part/gun/frame/New(loc) ..() @@ -32,9 +31,10 @@ for(var/part in parts_list) switch(part) if("mechanism") - InstalledMechanism = new validMechanism(src) + var/select = pick(validMechanisms) + InstalledMechanism = new select(src) if("barrel") - var/select = pick(barrelvars) + var/select = pick(validBarrels) InstalledBarrel = new select(src) if("grip") var/select = pick(validGrips) @@ -78,21 +78,21 @@ to_chat(user, span_warning("[src] already has a grip attached!")) return else - handle_gripvar(I, user) + handle_grip(I, user) if(istype(I, /obj/item/part/gun/modular/mechanism)) if(InstalledMechanism) to_chat(user, span_warning("[src] already has a mechanism attached!")) return else - handle_validMechanism(I, user) + handle_mechanism(I, user) if(istype(I, /obj/item/part/gun/modular/barrel)) if(InstalledBarrel) to_chat(user, span_warning("[src] already has a barrel attached!")) return else - handle_barrelvar(I, user) + handle_barrel(I, user) if(I.tool_behaviour == TOOL_SCREWDRIVER) var/list/possibles = contents.Copy() @@ -110,13 +110,9 @@ return ..() -/obj/item/part/gun/frame/proc/handle_gripvar(obj/item/I, mob/living/user) +/obj/item/part/gun/frame/proc/handle_grip(obj/item/I, mob/living/user) if(I.type in validGrips) if(insert_item(I, user)) - /* - var/variantnum = validGrips.Find(I.type) - result = resultvars[variantnum] - */ InstalledGrip = I to_chat(user, span_notice("You have attached the grip to \the [src].")) return @@ -124,8 +120,8 @@ to_chat(user, span_warning("This grip does not fit!")) return -/obj/item/part/gun/frame/proc/handle_validMechanism(obj/item/I, mob/living/user) - if(I.type == validMechanism) +/obj/item/part/gun/frame/proc/handle_mechanism(obj/item/I, mob/living/user) + if(I.type == validMechanisms) if(insert_item(I, user)) InstalledMechanism = I to_chat(user, span_notice("You have attached the mechanism to \the [src].")) @@ -134,8 +130,8 @@ to_chat(user, span_warning("This mechanism does not fit!")) return -/obj/item/part/gun/frame/proc/handle_barrelvar(obj/item/I, mob/living/user) - if(I.type in barrelvars) +/obj/item/part/gun/frame/proc/handle_barrel(obj/item/I, mob/living/user) + if(I.type in validBarrels) if(insert_item(I, user)) InstalledBarrel = I to_chat(user, span_notice("You have attached the barrel to \the [src].")) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index f1e49db7242f..65313f1cdeb9 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -157,20 +157,3 @@ icon = 'icons/obj/guncrafting.dmi' icon_state = "work_piece" max_amount = 10 - -/obj/item/modgun - name = "gun" - desc = "A gun." - icon = 'icons/obj/guns/projectile.dmi' - icon_state = "detective" - item_state = "gun" - var/caliber = 357 - var/gun_parts = list() - -/obj/item/blueprint - name = "Blueprint" - desc = "This could be used to make a gun." - icon = 'icons/obj/guncrafting.dmi' - icon_state = "blueprint" - var/design = FALSE - var/blueprint = FALSE From 5304d07e5e8e2f40b1f3844b654604ccfa386df3 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 24 Jan 2024 19:21:56 -0600 Subject: [PATCH 061/206] wow it just works!! --- code/modules/guncrafting/frame.dm | 17 +++++++++-------- code/modules/guncrafting/part.dm | 11 ++++++++++- code/modules/projectiles/gun.dm | 4 +++- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index e48d011cef19..6989e364cc4e 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -1,9 +1,9 @@ /obj/item/part/gun/frame name = "gun frame" - desc = "a generic gun frame. consider debug" + desc = "a generic gun frame." icon_state = "frame_olivaw" generic = FALSE - var/result = /obj/item/gun + var/obj/item/gun/result = /obj/item/gun // Currently installed grip var/obj/item/part/gun/modular/grip/InstalledGrip @@ -20,9 +20,7 @@ // Which barrels does the frame accept? var/list/validBarrels = list(/obj/item/part/gun/modular/barrel) - var/quality = 4 - -/obj/item/part/gun/frame/New(loc) +/obj/item/part/gun/frame/Initialize(mapload) ..() var/spawn_with_preinstalled_parts = TRUE @@ -152,9 +150,7 @@ to_chat(user, span_warning("\the [src] does not have a barrel!")) return var/turf/T = get_turf(src) - var/obj/item/gun/newGun = result - newGun.quality = 0 - new newGun(T) + var/obj/item/gun/newGun = new result(T, 0) newGun.frame = src src.forceMove(newGun) return @@ -176,4 +172,9 @@ . += "\the [src] does not have a barrel installed." /obj/item/part/gun/frame/mk1 + name = "wellmade gun frame" + icon_state = "frame_shotgun" result = /obj/item/gun/ballistic/shotgun/winchester/mk1 + validGrips = list(/obj/item/part/gun/modular/grip/wood) + validMechanisms = list(/obj/item/part/gun/modular/mechanism/shotgun) + validBarrels = list(/obj/item/part/gun/modular/barrel/shotgun) diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm index 17a03247668b..785a749c3469 100644 --- a/code/modules/guncrafting/part.dm +++ b/code/modules/guncrafting/part.dm @@ -34,8 +34,17 @@ desc = "All the bits that makes the bullet go bang." icon_state = "mechanism_pistol" +/obj/item/part/gun/modular/mechanism/shotgun + name = "generic shotgun mechanism" + desc = "All the bits that makes the bullet go bang." + icon_state = "mechanism_shotgun" + /obj/item/part/gun/modular/barrel name = "generic barrel" desc = "A gun barrel, which keeps the bullet going in the right direction." icon_state = "barrel_35" - var/caliber = 357 + +/obj/item/part/gun/modular/barrel/shotgun + name = "generic shotgun barrel" + desc = "A gun barrel, which keeps the bullet going in the right direction." + icon_state = "barrel_30" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 25e26933a5b0..56af3894f2f6 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -139,8 +139,10 @@ var/quality = 3 -/obj/item/gun/Initialize() +/obj/item/gun/Initialize(mapload, proviedQuality) . = ..() + if(proviedQuality) + quality = proviedQuality if(quality != 0) if(!frame) frame = new(src) From 182551f82cee3cf21d6b3df477f0bd93f3ddd856 Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 25 Jan 2024 10:39:42 -0600 Subject: [PATCH 062/206] bitflags soon --- code/__DEFINES/gun_crafting.dm | 4 ++++ code/modules/guncrafting/frame.dm | 2 ++ code/modules/guncrafting/part.dm | 13 +++++++++---- code/modules/guncrafting/recipe.dm | 18 ++++++++++++++++++ shiptest.dme | 2 ++ 5 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 code/__DEFINES/gun_crafting.dm create mode 100644 code/modules/guncrafting/recipe.dm diff --git a/code/__DEFINES/gun_crafting.dm b/code/__DEFINES/gun_crafting.dm new file mode 100644 index 000000000000..a0257209d6f9 --- /dev/null +++ b/code/__DEFINES/gun_crafting.dm @@ -0,0 +1,4 @@ +#define GUN_PART_FRAME (1<<0) +#define GUN_PART_BARREL (1<<1) +#define GUN_PART_MECHANISM (1<<2) +#define GUN_PART_GRIP (1<<3) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 6989e364cc4e..46f8496d75d9 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -19,6 +19,8 @@ var/obj/item/part/gun/modular/barrel/InstalledBarrel // Which barrels does the frame accept? var/list/validBarrels = list(/obj/item/part/gun/modular/barrel) + + gun_part_type = FRAME /obj/item/part/gun/frame/Initialize(mapload) ..() diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm index 785a749c3469..a037697a41f0 100644 --- a/code/modules/guncrafting/part.dm +++ b/code/modules/guncrafting/part.dm @@ -5,7 +5,7 @@ name = "gun part" desc = "Spare part of gun." icon_state = "gun_part_1" - var/generic = TRUE + var/gun_part_type = NONE /obj/item/part/gun/Initialize() . = ..() @@ -15,9 +15,12 @@ /obj/item/part/gun/modular name = "modular gun part" desc = "You dont think this should exist." - generic = FALSE - var/list/attached_mods = list() - var/list/legal_mods = list() + +/obj/item/part/gun/modular/grip + name = "generic grip" + desc = "A firearm grip, unattached from a firearm." + icon_state = "grip_wood" + gun_part_type = GRIP /obj/item/part/gun/modular/grip/wood name = "wood grip" @@ -33,6 +36,7 @@ name = "generic mechanism" desc = "All the bits that makes the bullet go bang." icon_state = "mechanism_pistol" + gun_part_type = MECHANISM /obj/item/part/gun/modular/mechanism/shotgun name = "generic shotgun mechanism" @@ -43,6 +47,7 @@ name = "generic barrel" desc = "A gun barrel, which keeps the bullet going in the right direction." icon_state = "barrel_35" + gun_part_type = BARREL /obj/item/part/gun/modular/barrel/shotgun name = "generic shotgun barrel" diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm new file mode 100644 index 000000000000..7e4807361a14 --- /dev/null +++ b/code/modules/guncrafting/recipe.dm @@ -0,0 +1,18 @@ +/datum/lathe_recipe + var/obj/item/result = /obj/item/gun + +/datum/lathe_recipe/gun + var/list/validParts = list() + var/requiredPartTypes = ALL + +/datum/lathe_recipe/gun/winchester + result = /obj/item/gun/ballistic/shotgun/winchester + var/list/validParts = list( + /obj/item/part/gun/frame/mk1, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism/shotgun, + /obj/item/part/gun/modular/barrel/shotgun + ) + + + diff --git a/shiptest.dme b/shiptest.dme index 15600e073602..ed720cc109a9 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -65,6 +65,7 @@ #include "code\__DEFINES\food.dm" #include "code\__DEFINES\footsteps.dm" #include "code\__DEFINES\forensics.dm" +#include "code\__DEFINES\gun_crafting.dm" #include "code\__DEFINES\hud.dm" #include "code\__DEFINES\icon_smoothing.dm" #include "code\__DEFINES\important_recursive_contents.dm" @@ -2164,6 +2165,7 @@ #include "code\modules\guncrafting\frame.dm" #include "code\modules\guncrafting\lathe.dm" #include "code\modules\guncrafting\part.dm" +#include code\modules\guncrafting\recipe.dm #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\foreign_calendar.dm" #include "code\modules\holiday\holidays.dm" From ad28497971e07ec9412451208b2addd579a6592e Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 25 Jan 2024 20:57:20 -0600 Subject: [PATCH 063/206] ye --- code/modules/guncrafting/frame.dm | 9 +++++++-- code/modules/guncrafting/lathe.dm | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 46f8496d75d9..ae6c1e29f9e6 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -19,13 +19,18 @@ var/obj/item/part/gun/modular/barrel/InstalledBarrel // Which barrels does the frame accept? var/list/validBarrels = list(/obj/item/part/gun/modular/barrel) - + gun_part_type = FRAME /obj/item/part/gun/frame/Initialize(mapload) ..() var/spawn_with_preinstalled_parts = TRUE +/obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts) + ..() + if(dont_spawn_with_parts) + spawn_with_preinstalled_parts = FALSE + if(spawn_with_preinstalled_parts) var/list/parts_list = list("mechanism", "barrel", "grip") for(var/part in parts_list) @@ -121,7 +126,7 @@ return /obj/item/part/gun/frame/proc/handle_mechanism(obj/item/I, mob/living/user) - if(I.type == validMechanisms) + if(I.type in validMechanisms) if(insert_item(I, user)) InstalledMechanism = I to_chat(user, span_notice("You have attached the mechanism to \the [src].")) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 65313f1cdeb9..8b3810ab6120 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -143,7 +143,7 @@ if("Barrel") part_to_build = new gun_work_piece.frame.InstalledBarrel.type if("Frame") - part_to_build = new gun_work_piece.frame.type + part_to_build = new gun_work_piece.frame.type(src, TRUE) part_to_build.forceMove(drop_location()) mode = FALSE From 8a870e01ef8cb57314f186c0a316d94214f4541d Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 25 Jan 2024 21:41:03 -0600 Subject: [PATCH 064/206] yea --- code/modules/guncrafting/frame.dm | 8 ++------ code/modules/guncrafting/part.dm | 11 +++-------- code/modules/guncrafting/recipe.dm | 11 ++++++++++- shiptest.dme | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index ae6c1e29f9e6..06589ce61f98 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -2,7 +2,6 @@ name = "gun frame" desc = "a generic gun frame." icon_state = "frame_olivaw" - generic = FALSE var/obj/item/gun/result = /obj/item/gun // Currently installed grip @@ -20,14 +19,11 @@ // Which barrels does the frame accept? var/list/validBarrels = list(/obj/item/part/gun/modular/barrel) - gun_part_type = FRAME - -/obj/item/part/gun/frame/Initialize(mapload) - ..() - var/spawn_with_preinstalled_parts = TRUE + gun_part_type = GUN_PART_FRAME /obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts) ..() + var/spawn_with_preinstalled_parts = TRUE if(dont_spawn_with_parts) spawn_with_preinstalled_parts = FALSE diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm index a037697a41f0..3c95f5a6390b 100644 --- a/code/modules/guncrafting/part.dm +++ b/code/modules/guncrafting/part.dm @@ -7,11 +7,6 @@ icon_state = "gun_part_1" var/gun_part_type = NONE -/obj/item/part/gun/Initialize() - . = ..() - if(generic) - icon_state = "gun_part_[rand(1,6)]" - /obj/item/part/gun/modular name = "modular gun part" desc = "You dont think this should exist." @@ -20,7 +15,7 @@ name = "generic grip" desc = "A firearm grip, unattached from a firearm." icon_state = "grip_wood" - gun_part_type = GRIP + gun_part_type = GUN_PART_GRIP /obj/item/part/gun/modular/grip/wood name = "wood grip" @@ -36,7 +31,7 @@ name = "generic mechanism" desc = "All the bits that makes the bullet go bang." icon_state = "mechanism_pistol" - gun_part_type = MECHANISM + gun_part_type = GUN_PART_MECHANISM /obj/item/part/gun/modular/mechanism/shotgun name = "generic shotgun mechanism" @@ -47,7 +42,7 @@ name = "generic barrel" desc = "A gun barrel, which keeps the bullet going in the right direction." icon_state = "barrel_35" - gun_part_type = BARREL + gun_part_type = GUN_PART_BARREL /obj/item/part/gun/modular/barrel/shotgun name = "generic shotgun barrel" diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index 7e4807361a14..f9b2f90da651 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -7,7 +7,16 @@ /datum/lathe_recipe/gun/winchester result = /obj/item/gun/ballistic/shotgun/winchester - var/list/validParts = list( + validParts = list( + /obj/item/part/gun/frame/mk1, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism/shotgun, + /obj/item/part/gun/modular/barrel/shotgun + ) + +/datum/lathe_recipe/gun/winchester + result = /obj/item/gun/ballistic/shotgun/winchester + validParts = list( /obj/item/part/gun/frame/mk1, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/shotgun, diff --git a/shiptest.dme b/shiptest.dme index ed720cc109a9..6c743328d115 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -2165,7 +2165,7 @@ #include "code\modules\guncrafting\frame.dm" #include "code\modules\guncrafting\lathe.dm" #include "code\modules\guncrafting\part.dm" -#include code\modules\guncrafting\recipe.dm +#include "code\modules\guncrafting\recipe.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\foreign_calendar.dm" #include "code\modules\holiday\holidays.dm" From a5dc31707feb67ff82fdcc64c7d37a09b757dbd8 Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 30 Jan 2024 18:25:49 -0600 Subject: [PATCH 065/206] commit to recipes --- code/modules/guncrafting/frame.dm | 35 ++++++++++++++++++++++++++---- code/modules/guncrafting/recipe.dm | 23 ++++++++++++++++---- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 06589ce61f98..1efce108fea0 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -23,6 +23,7 @@ /obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts) ..() + /* var/spawn_with_preinstalled_parts = TRUE if(dont_spawn_with_parts) spawn_with_preinstalled_parts = FALSE @@ -40,6 +41,7 @@ if("grip") var/select = pick(validGrips) InstalledGrip = new select(src) + */ /obj/item/part/gun/frame/proc/eject_item(obj/item/I, mob/living/user) if(!I || !user.IsAdvancedToolUser() || user.stat || !user.Adjacent(I)) @@ -102,15 +104,17 @@ return if(I.use_tool(src, user, 40, volume=50)) eject_item(toremove, user) + /* if(istype(toremove, /obj/item/part/gun/modular/grip)) InstalledGrip = null else if(istype(toremove, /obj/item/part/gun/modular/barrel)) InstalledBarrel = FALSE else if(istype(toremove, /obj/item/part/gun/modular/mechanism)) InstalledMechanism = FALSE + */ return ..() - +/* /obj/item/part/gun/frame/proc/handle_grip(obj/item/I, mob/living/user) if(I.type in validGrips) if(insert_item(I, user)) @@ -140,9 +144,21 @@ else to_chat(user, span_warning("This barrel does not fit!")) return +*/ + +/obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user) + /obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user) + if(I.type in /datum/lathe_recipe/gun/m1911/validParts) + if(insert_item(I, user)) + to_chat(user, span_notice("You have attached the part to \the [src].")) + return + else + to_chat(user, span_warning("This part does not fit!")) + return /obj/item/part/gun/frame/attack_self(mob/user) . = ..() + /* if(!InstalledGrip) to_chat(user, span_warning("\the [src] does not have a grip!")) return @@ -152,6 +168,8 @@ if(!InstalledBarrel) to_chat(user, span_warning("\the [src] does not have a barrel!")) return + */ + for each(I in ) var/turf/T = get_turf(src) var/obj/item/gun/newGun = new result(T, 0) newGun.frame = src @@ -174,10 +192,19 @@ else . += "\the [src] does not have a barrel installed." -/obj/item/part/gun/frame/mk1 - name = "wellmade gun frame" +/obj/item/part/gun/frame/winchester + name = "Winchester Gun Frame icon_state = "frame_shotgun" - result = /obj/item/gun/ballistic/shotgun/winchester/mk1 + result = /obj/item/gun/ballistic/shotgun/winchester validGrips = list(/obj/item/part/gun/modular/grip/wood) validMechanisms = list(/obj/item/part/gun/modular/mechanism/shotgun) validBarrels = list(/obj/item/part/gun/modular/barrel/shotgun) + +/obj/item/part/gun/frame/winchester/mk1 + result = /obj/item/gun/ballistic/shotgun/winchester/mk1 + +/obj/item/part/gun/frame/m1911 + result = /obj/item/gun/ballistic/automatic/pistol/m1911 + +/obj/item/part/gun/frame/commander + result = /obj/item/gun/ballistic/automatic/pistol/commander diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index f9b2f90da651..616a19f982b4 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -8,20 +8,35 @@ /datum/lathe_recipe/gun/winchester result = /obj/item/gun/ballistic/shotgun/winchester validParts = list( - /obj/item/part/gun/frame/mk1, + /obj/item/part/gun/frame/winchester, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/shotgun, /obj/item/part/gun/modular/barrel/shotgun ) /datum/lathe_recipe/gun/winchester - result = /obj/item/gun/ballistic/shotgun/winchester + result = /obj/item/gun/ballistic/shotgun/winchester/mk1 validParts = list( - /obj/item/part/gun/frame/mk1, + /obj/item/part/gun/frame/winchester/mk1, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/shotgun, /obj/item/part/gun/modular/barrel/shotgun ) +/datum/lathe_recipe/gun/m1911 + result = /obj/item/gun/ballistic/automatic/pistol/m1911 + validParts = list( + /obj/item/part/gun/frame/m1911, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism/pistol, + /obj/item/part/gun/modular/barrel/pistolm1911 + ) - +/datum/lathe_recipe/gun/tec9 + result = /obj/item/gun/ballistic/automatic/pistol/tec9 + validParts = list( + /obj/item/part/gun/frame/tec9, + /obj/item/part/gun/modular/grip/plastic, + /obj/item/part/gun/modular/mechanism/pistol, + /obj/item/part/gun/modular/barrel/pistol + ) From 98b5d805e65ce6d89fbac1eab3e2f81c3a5a0da5 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 30 Jan 2024 20:23:35 -0600 Subject: [PATCH 066/206] yea --- code/modules/guncrafting/frame.dm | 49 +++++++++++++++++------------- code/modules/guncrafting/lathe.dm | 2 ++ code/modules/guncrafting/recipe.dm | 14 +++++---- code/modules/guncrafting/tools.dm | 27 ++++++++++++++++ code/modules/projectiles/gun.dm | 1 + 5 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 code/modules/guncrafting/tools.dm diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 1efce108fea0..e4b95cc1c009 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -2,22 +2,23 @@ name = "gun frame" desc = "a generic gun frame." icon_state = "frame_olivaw" - var/obj/item/gun/result = /obj/item/gun + //var/obj/item/gun/result = /obj/item/gun + var/list/installedParts = list() // Currently installed grip - var/obj/item/part/gun/modular/grip/InstalledGrip + //var/obj/item/part/gun/modular/grip/InstalledGrip // Which grips does the frame accept? - var/list/validGrips = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black) + //var/list/validGrips = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black) // Currently installed mechanism - var/obj/item/part/gun/modular/grip/InstalledMechanism + //var/obj/item/part/gun/modular/grip/InstalledMechanism // Which mechanism the frame accepts? - var/list/validMechanisms = list(/obj/item/part/gun/modular/mechanism) + //var/list/validMechanisms = list(/obj/item/part/gun/modular/mechanism) // Currently installed barrel - var/obj/item/part/gun/modular/barrel/InstalledBarrel + //var/obj/item/part/gun/modular/barrel/InstalledBarrel // Which barrels does the frame accept? - var/list/validBarrels = list(/obj/item/part/gun/modular/barrel) + //var/list/validBarrels = list(/obj/item/part/gun/modular/barrel) gun_part_type = GUN_PART_FRAME @@ -76,6 +77,7 @@ return TRUE /obj/item/part/gun/frame/attackby(obj/item/I, mob/living/user, params) + /* if(istype(I, /obj/item/part/gun/modular/grip)) if(InstalledGrip) to_chat(user, span_warning("[src] already has a grip attached!")) @@ -96,6 +98,7 @@ return else handle_barrel(I, user) + */ if(I.tool_behaviour == TOOL_SCREWDRIVER) var/list/possibles = contents.Copy() @@ -147,15 +150,14 @@ */ /obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user) - /obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user) - if(I.type in /datum/lathe_recipe/gun/m1911/validParts) - if(insert_item(I, user)) - to_chat(user, span_notice("You have attached the part to \the [src].")) - return + //if(I.type in /datum/lathe_recipe/gun/m1911.validParts) + if(insert_item(I, user)) + to_chat(user, span_notice("You have attached the part to \the [src].")) + return else to_chat(user, span_warning("This part does not fit!")) return - +/* /obj/item/part/gun/frame/attack_self(mob/user) . = ..() /* @@ -175,7 +177,9 @@ newGun.frame = src src.forceMove(newGun) return +*/ +/* /obj/item/part/gun/frame/examine(user, distance) . = ..() if(.) @@ -191,20 +195,23 @@ . += "\the [src] has \a [InstalledBarrel] installed." else . += "\the [src] does not have a barrel installed." +*/ /obj/item/part/gun/frame/winchester - name = "Winchester Gun Frame + name = "Winchester Gun Frame" icon_state = "frame_shotgun" - result = /obj/item/gun/ballistic/shotgun/winchester - validGrips = list(/obj/item/part/gun/modular/grip/wood) - validMechanisms = list(/obj/item/part/gun/modular/mechanism/shotgun) - validBarrels = list(/obj/item/part/gun/modular/barrel/shotgun) + //result = /obj/item/gun/ballistic/shotgun/winchester + //validGrips = list(/obj/item/part/gun/modular/grip/wood) + //validMechanisms = list(/obj/item/part/gun/modular/mechanism/shotgun) + //validBarrels = list(/obj/item/part/gun/modular/barrel/shotgun) /obj/item/part/gun/frame/winchester/mk1 - result = /obj/item/gun/ballistic/shotgun/winchester/mk1 + //result = /obj/item/gun/ballistic/shotgun/winchester/mk1 /obj/item/part/gun/frame/m1911 - result = /obj/item/gun/ballistic/automatic/pistol/m1911 + //result = /obj/item/gun/ballistic/automatic/pistol/m1911 /obj/item/part/gun/frame/commander - result = /obj/item/gun/ballistic/automatic/pistol/commander + //result = /obj/item/gun/ballistic/automatic/pistol/commander + +/obj/item/part/gun/frame/boltaction diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 8b3810ab6120..f3a6445931a1 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -121,6 +121,7 @@ /////////////// /obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user) + /* if(istype (work_piece, /obj/item/gun)) var/obj/item/gun/gun_work_piece = work_piece var/list/choose_options = list() @@ -145,6 +146,7 @@ if("Frame") part_to_build = new gun_work_piece.frame.type(src, TRUE) part_to_build.forceMove(drop_location()) + */ mode = FALSE /////////// diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index 616a19f982b4..b0cc8f5afd0d 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -28,15 +28,17 @@ validParts = list( /obj/item/part/gun/frame/m1911, /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/pistol, - /obj/item/part/gun/modular/barrel/pistolm1911 + /obj/item/part/gun/modular/mechanism, + /obj/item/part/gun/modular/barrel ) /datum/lathe_recipe/gun/tec9 result = /obj/item/gun/ballistic/automatic/pistol/tec9 validParts = list( - /obj/item/part/gun/frame/tec9, - /obj/item/part/gun/modular/grip/plastic, - /obj/item/part/gun/modular/mechanism/pistol, - /obj/item/part/gun/modular/barrel/pistol + /obj/item/part/gun/frame, + /obj/item/part/gun/modular/grip, + /obj/item/part/gun/modular/mechanism, + /obj/item/part/gun/modular/barrel ) +/datum/lathe_recipe/gun/boltaction + result = /obj/item/gun/ballistic/rifle/boltaction diff --git a/code/modules/guncrafting/tools.dm b/code/modules/guncrafting/tools.dm new file mode 100644 index 000000000000..f17ddb9f0cea --- /dev/null +++ b/code/modules/guncrafting/tools.dm @@ -0,0 +1,27 @@ +/obj/item/tool/hammer + name = "hammer" + +/obj/item/tool/file + name = "file" + +/obj/item/tool/saw + name = "saw" + +/obj/item/storage/box/parts + name = "gunmakers box" + desc = "A set of tools and parts to assemble your first weapon" + +/obj/item/storage/box/parts/PopulateContents() + new /obj/item/tool/hammer(src) + new /obj/item/tool/file(src) + new /obj/item/tool/saw(src) + /* + new /obj/item/part/gun/frame/winchester(src) + new /obj/item/part/gun/modular/grip/wood(src) + new /obj/item/part/gun/modular/mechanism/shotgun(src) + new /obj/item/part/gun/modular/barrel/shotgun(src) + new /obj/item/part/gun/frame/winchester(src) + new /obj/item/part/gun/modular/grip/wood(src) + new /obj/item/part/gun/modular/mechanism/shotgun(src) + new /obj/item/part/gun/modular/barrel/shotgun(src) + */ diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 56af3894f2f6..2a053adb3098 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -3,6 +3,7 @@ #define FIRING_PIN_REMOVAL_DELAY 50 #define MANUFACTURER_NONE null +#define MANUFACTURER_KYBER "the simple, handmade marking of an unknown gunsmith" #define MANUFACTURER_SHARPLITE "the Sharplite Defense logo" #define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo" #define MANUFACTURER_HUNTERSPRIDE "the Hunter's Pride Arms and Ammunition logo" From 8c1b7c500ecb6b1dfdfe95119591e2cc7621c309 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 31 Jan 2024 09:41:22 -0600 Subject: [PATCH 067/206] Refactor gun crafting module and add new tools --- code/modules/guncrafting/frame.dm | 9 ++++++--- code/modules/guncrafting/tools.dm | 8 ++++++-- shiptest.dme | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index e4b95cc1c009..60b877f8cf89 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -150,16 +150,19 @@ */ /obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user) - //if(I.type in /datum/lathe_recipe/gun/m1911.validParts) if(insert_item(I, user)) to_chat(user, span_notice("You have attached the part to \the [src].")) return else to_chat(user, span_warning("This part does not fit!")) return -/* + /obj/item/part/gun/frame/attack_self(mob/user) . = ..() + for(var/datum/lathe_recipe/gun/recipe in /datum/lathe_recipe/gun) + if(src.type in recipe.validParts) + if(I.type in recipe.validParts) + handle_part(I, user) /* if(!InstalledGrip) to_chat(user, span_warning("\the [src] does not have a grip!")) @@ -171,7 +174,7 @@ to_chat(user, span_warning("\the [src] does not have a barrel!")) return */ - for each(I in ) +/* var/turf/T = get_turf(src) var/obj/item/gun/newGun = new result(T, 0) newGun.frame = src diff --git a/code/modules/guncrafting/tools.dm b/code/modules/guncrafting/tools.dm index f17ddb9f0cea..1a6805ce5234 100644 --- a/code/modules/guncrafting/tools.dm +++ b/code/modules/guncrafting/tools.dm @@ -1,11 +1,17 @@ /obj/item/tool/hammer name = "hammer" + icon = 'icons/obj/tools.dmi' + icon_state = "oldcrowbar" /obj/item/tool/file name = "file" + icon = 'icons/obj/tools.dmi' + icon_state = "oldwrench" /obj/item/tool/saw name = "saw" + icon = 'icons/obj/tools.dmi' + icon_state = "oldcutters_map" /obj/item/storage/box/parts name = "gunmakers box" @@ -15,7 +21,6 @@ new /obj/item/tool/hammer(src) new /obj/item/tool/file(src) new /obj/item/tool/saw(src) - /* new /obj/item/part/gun/frame/winchester(src) new /obj/item/part/gun/modular/grip/wood(src) new /obj/item/part/gun/modular/mechanism/shotgun(src) @@ -24,4 +29,3 @@ new /obj/item/part/gun/modular/grip/wood(src) new /obj/item/part/gun/modular/mechanism/shotgun(src) new /obj/item/part/gun/modular/barrel/shotgun(src) - */ diff --git a/shiptest.dme b/shiptest.dme index 6c743328d115..73cd4f734c28 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -2166,6 +2166,7 @@ #include "code\modules\guncrafting\lathe.dm" #include "code\modules\guncrafting\part.dm" #include "code\modules\guncrafting\recipe.dm" +#include "code\modules\guncrafting\tools.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\foreign_calendar.dm" #include "code\modules\holiday\holidays.dm" From 2959730798568b46f17a76f22df51e8936ffb867 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 31 Jan 2024 10:13:51 -0600 Subject: [PATCH 068/206] poorly optimized holy dang --- code/modules/guncrafting/frame.dm | 32 ++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 60b877f8cf89..93161ebea3a9 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -149,17 +149,32 @@ return */ -/obj/item/part/gun/frame/proc/handle_part(obj/item/I, mob/living/user) - if(insert_item(I, user)) - to_chat(user, span_notice("You have attached the part to \the [src].")) - return +/obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user) + if(I.gun_part_type && !(I.gun_part_type & get_part_types())) + if(insert_item(I, user)) + to_chat(user, span_notice("You have attached the part to \the [src].")) + return else to_chat(user, span_warning("This part does not fit!")) return +//Finds all recipes that match the current parts +/obj/item/part/gun/frame/proc/get_current_recipes() + var/list/gun_recipes = subtypesof(/datum/lathe_recipe/gun) + var/list/filtered_recipes = list() + + for(var/datum/lathe_recipe/gun/recipe in gun_recipes) + if(istype(src.type)) + filtered_recipes += recipe_type + for(var/obj/item/part/gun/installed_part in installedParts) + if(istype(part, installed_part)) + filtered_recipes += recipe_type + + return filtered_recipes + /obj/item/part/gun/frame/attack_self(mob/user) . = ..() - for(var/datum/lathe_recipe/gun/recipe in /datum/lathe_recipe/gun) + for(var/datum/lathe_recipe/gun/recipe in get_current_recipes()) if(src.type in recipe.validParts) if(I.type in recipe.validParts) handle_part(I, user) @@ -182,6 +197,13 @@ return */ +/obj/item/part/gun/frame/proc/get_part_types() + var/part_types = NONE + part_types |= gun_part_type + for(var/obj/item/part/gun/part in installedParts) + part_types |= part.gin_part_type + return part_types + /* /obj/item/part/gun/frame/examine(user, distance) . = ..() From 93f18130d2b77a41d82c7c7be6c4f095149c7221 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 31 Jan 2024 10:18:48 -0600 Subject: [PATCH 069/206] yea --- code/modules/guncrafting/frame.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 93161ebea3a9..43f31b8e47f3 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -165,14 +165,14 @@ for(var/datum/lathe_recipe/gun/recipe in gun_recipes) if(istype(src.type)) - filtered_recipes += recipe_type + filtered_recipes += recipe for(var/obj/item/part/gun/installed_part in installedParts) if(istype(part, installed_part)) - filtered_recipes += recipe_type + filtered_recipes += recipe return filtered_recipes -/obj/item/part/gun/frame/attack_self(mob/user) +/obj/item/part/gun/frame/attack_self(obj/item/I, mob/user) . = ..() for(var/datum/lathe_recipe/gun/recipe in get_current_recipes()) if(src.type in recipe.validParts) @@ -201,7 +201,7 @@ var/part_types = NONE part_types |= gun_part_type for(var/obj/item/part/gun/part in installedParts) - part_types |= part.gin_part_type + part_types |= part.gun_part_type return part_types /* From 2bf0717f5355d5de2edaf33122e0b732764a8722 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 31 Jan 2024 10:24:38 -0600 Subject: [PATCH 070/206] evil tbh --- code/modules/guncrafting/frame.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 43f31b8e47f3..1441982c4c42 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -164,10 +164,10 @@ var/list/filtered_recipes = list() for(var/datum/lathe_recipe/gun/recipe in gun_recipes) - if(istype(src.type)) + if(istype(recipe, src.type)) filtered_recipes += recipe for(var/obj/item/part/gun/installed_part in installedParts) - if(istype(part, installed_part)) + if(istype(recipe, installed_part.type)) filtered_recipes += recipe return filtered_recipes @@ -175,9 +175,8 @@ /obj/item/part/gun/frame/attack_self(obj/item/I, mob/user) . = ..() for(var/datum/lathe_recipe/gun/recipe in get_current_recipes()) - if(src.type in recipe.validParts) - if(I.type in recipe.validParts) - handle_part(I, user) + if(I.type in recipe.validParts) + handle_part(I, user) /* if(!InstalledGrip) to_chat(user, span_warning("\the [src] does not have a grip!")) From f08b4bb18ea1487e11d70ef712021043be84e289 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 31 Jan 2024 10:37:13 -0600 Subject: [PATCH 071/206] ye --- code/modules/guncrafting/frame.dm | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 1441982c4c42..be194726100f 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -203,10 +203,16 @@ part_types |= part.gun_part_type return part_types -/* /obj/item/part/gun/frame/examine(user, distance) . = ..() if(.) + for (var/obj/item/part/gun/part in installedParts) + . += "\the [src] has \a [part] [icon2html(part, user)] installed." + for(var/datum/lathe_recipe/gun/recipe in get_current_recipes()) + for(var/obj/item/part in recipe.validParts) + . += "\the [src] could hold \a [part] [icon2html(part, user)]." + +/* if(InstalledGrip) . += "\the [src] has \a [InstalledGrip] installed." else @@ -224,18 +230,11 @@ /obj/item/part/gun/frame/winchester name = "Winchester Gun Frame" icon_state = "frame_shotgun" - //result = /obj/item/gun/ballistic/shotgun/winchester - //validGrips = list(/obj/item/part/gun/modular/grip/wood) - //validMechanisms = list(/obj/item/part/gun/modular/mechanism/shotgun) - //validBarrels = list(/obj/item/part/gun/modular/barrel/shotgun) /obj/item/part/gun/frame/winchester/mk1 - //result = /obj/item/gun/ballistic/shotgun/winchester/mk1 /obj/item/part/gun/frame/m1911 - //result = /obj/item/gun/ballistic/automatic/pistol/m1911 /obj/item/part/gun/frame/commander - //result = /obj/item/gun/ballistic/automatic/pistol/commander /obj/item/part/gun/frame/boltaction From 4420698086e1b5e013b65447b63481d6b843ca96 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 31 Jan 2024 10:47:17 -0600 Subject: [PATCH 072/206] kinda working i think? --- code/modules/guncrafting/frame.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index be194726100f..7e7271963ad8 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -22,9 +22,9 @@ gun_part_type = GUN_PART_FRAME +/* /obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts) ..() - /* var/spawn_with_preinstalled_parts = TRUE if(dont_spawn_with_parts) spawn_with_preinstalled_parts = FALSE From f4c2581c113ea802dfa5a3a6a9090479d68cfe4e Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 31 Jan 2024 11:23:38 -0600 Subject: [PATCH 073/206] unit test? --- code/modules/guncrafting/frame.dm | 21 +++++++++++---------- code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/gun_crafting.dm | 12 ++++++++++++ 3 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 code/modules/unit_tests/gun_crafting.dm diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 7e7271963ad8..cbf87de8f778 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -150,13 +150,15 @@ */ /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user) - if(I.gun_part_type && !(I.gun_part_type & get_part_types())) - if(insert_item(I, user)) - to_chat(user, span_notice("You have attached the part to \the [src].")) - return - else - to_chat(user, span_warning("This part does not fit!")) - return + for(var/datum/lathe_recipe/gun/recipe in get_current_recipes()) + if(I.type in recipe.validParts) + if(I.gun_part_type && !(I.gun_part_type & get_part_types())) + if(insert_item(I, user)) + to_chat(user, span_notice("You have attached the part to \the [src].")) + return + else + to_chat(user, span_warning("This part does not fit!")) + return //Finds all recipes that match the current parts /obj/item/part/gun/frame/proc/get_current_recipes() @@ -174,9 +176,8 @@ /obj/item/part/gun/frame/attack_self(obj/item/I, mob/user) . = ..() - for(var/datum/lathe_recipe/gun/recipe in get_current_recipes()) - if(I.type in recipe.validParts) - handle_part(I, user) + if(istype(I, obj/item/part/gun)) + handle_part(I, user) /* if(!InstalledGrip) to_chat(user, span_warning("\the [src] does not have a grip!")) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index cc12fe0c638f..74ed6919862f 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -72,6 +72,7 @@ #include "create_and_destroy.dm" #include "biome_lists.dm" #include "emoting.dm" +#include "gun_crafting.dm" #include "keybinding_init.dm" #include "machine_disassembly.dm" #include "open_air.dm" diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm new file mode 100644 index 000000000000..0efba76beefa --- /dev/null +++ b/code/modules/unit_tests/gun_crafting.dm @@ -0,0 +1,12 @@ +//Makes sure preinstalled frame parts can be removed an reinstalled +/datum/unit_test/gun_crafting/Run() + var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) + for(var/frame_type in subtypesof(/obj/item/part/gun/frame)) + var/obj/item/part/gun/frame/frame = new frame_type + var/list/frame_parts = frame.installedParts + for(var/obj/item/part/installedPart in frame.installedParts) + frame.eject_item(installedPart, human) + frame.handle_part(installedPart, human) + TEST_ASSERT_EQUAL(frame_parts, frame.installedParts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.") + + From 3a2863c4750e45e048950878e2287f75dcec012d Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 31 Jan 2024 11:27:20 -0600 Subject: [PATCH 074/206] yea --- code/modules/guncrafting/frame.dm | 3 ++- code/modules/guncrafting/lathe.dm | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index cbf87de8f778..8c519cf0ee1a 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -155,6 +155,7 @@ if(I.gun_part_type && !(I.gun_part_type & get_part_types())) if(insert_item(I, user)) to_chat(user, span_notice("You have attached the part to \the [src].")) + installedParts += I return else to_chat(user, span_warning("This part does not fit!")) @@ -176,7 +177,7 @@ /obj/item/part/gun/frame/attack_self(obj/item/I, mob/user) . = ..() - if(istype(I, obj/item/part/gun)) + if(istype(I, /obj/item/part/gun)) handle_part(I, user) /* if(!InstalledGrip) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index f3a6445931a1..7aa5cf5a21cc 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -154,7 +154,8 @@ /////////// /obj/item/stack/gun_part - name = "Gun Part" + name = "Gun Parts" + singular_name = "Gun Part" desc = "This could fabcricate metal parts." icon = 'icons/obj/guncrafting.dmi' icon_state = "work_piece" From d4762b3c18c591a4dd0fc6813c0739e61b9a0dc3 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 31 Jan 2024 11:34:05 -0600 Subject: [PATCH 075/206] hard to tell if parts are reinstalled without any --- code/modules/guncrafting/frame.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 8c519cf0ee1a..63bf53c60ef5 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -232,10 +232,20 @@ /obj/item/part/gun/frame/winchester name = "Winchester Gun Frame" icon_state = "frame_shotgun" + installedParts = list( + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism/shotgun, + /obj/item/part/gun/modular/barrel/shotgun + ) /obj/item/part/gun/frame/winchester/mk1 /obj/item/part/gun/frame/m1911 + installedParts = list( + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism, + /obj/item/part/gun/modular/barrel + ) /obj/item/part/gun/frame/commander From f80aad3364de9711106a74114b5adba45d06a262 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 31 Jan 2024 11:39:36 -0600 Subject: [PATCH 076/206] what if wrong? --- code/modules/guncrafting/frame.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 63bf53c60ef5..147fc1cf28e8 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -244,7 +244,7 @@ installedParts = list( /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism, - /obj/item/part/gun/modular/barrel + /obj/item/part/gun/modular/barrel/shotgun ) /obj/item/part/gun/frame/commander From 026d860a263c151eedffd4d4187a370252fa7688 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 31 Jan 2024 11:50:32 -0600 Subject: [PATCH 077/206] TEST --- code/modules/guncrafting/frame.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 147fc1cf28e8..7ae7904e96d6 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -52,6 +52,7 @@ user.visible_message( "[user] removes [I] from [src].", span_notice("You remove [I] from [src].") + installedParts -= I ) return TRUE @@ -244,7 +245,7 @@ installedParts = list( /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism, - /obj/item/part/gun/modular/barrel/shotgun + /obj/item/part/gun/modular/barrel ) /obj/item/part/gun/frame/commander From 750378906f02ce88a8bc2f9928831156dd10238f Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 31 Jan 2024 18:52:35 -0600 Subject: [PATCH 078/206] bleh --- code/modules/guncrafting/frame.dm | 45 ++++++++++++++++++++---------- code/modules/guncrafting/recipe.dm | 2 +- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 7ae7904e96d6..883803ed8fec 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -3,7 +3,9 @@ desc = "a generic gun frame." icon_state = "frame_olivaw" //var/obj/item/gun/result = /obj/item/gun + var/list/preinstalledParts = list() var/list/installedParts = list() + var/list/filtered_recipes = list() // Currently installed grip //var/obj/item/part/gun/modular/grip/InstalledGrip @@ -22,9 +24,12 @@ gun_part_type = GUN_PART_FRAME -/* -/obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts) + +/obj/item/part/gun/frame/Initialize() ..() + for (var/partType in preinstalledParts) + installedParts += new partType(src) + /* var/spawn_with_preinstalled_parts = TRUE if(dont_spawn_with_parts) spawn_with_preinstalled_parts = FALSE @@ -52,8 +57,8 @@ user.visible_message( "[user] removes [I] from [src].", span_notice("You remove [I] from [src].") - installedParts -= I ) + installedParts -= I return TRUE /obj/item/part/gun/frame/proc/insert_item(obj/item/I, mob/living/user) @@ -78,6 +83,9 @@ return TRUE /obj/item/part/gun/frame/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(istype(I, /obj/item/part/gun)) + handle_part(I, user) /* if(istype(I, /obj/item/part/gun/modular/grip)) if(InstalledGrip) @@ -151,8 +159,14 @@ */ /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user) - for(var/datum/lathe_recipe/gun/recipe in get_current_recipes()) + get_current_recipes() + var/list/valid_recipes = filtered_recipes + to_chat(user, span_warning("Recipes [valid_recipes]")) + for(var/datum/lathe_recipe/gun/recipe in valid_recipes) if(I.type in recipe.validParts) + to_chat(user, span_warning("Recipe [recipe]")) + to_chat(user, span_warning("Part [I]")) + to_chat(user, span_warning("Part type [recipe.validParts]")) if(I.gun_part_type && !(I.gun_part_type & get_part_types())) if(insert_item(I, user)) to_chat(user, span_notice("You have attached the part to \the [src].")) @@ -161,11 +175,14 @@ else to_chat(user, span_warning("This part does not fit!")) return + to_chat(user, span_warning("Weird!")) + //Finds all recipes that match the current parts /obj/item/part/gun/frame/proc/get_current_recipes() - var/list/gun_recipes = subtypesof(/datum/lathe_recipe/gun) - var/list/filtered_recipes = list() + var/list/datum/gun_recipes = subtypesof(/datum/lathe_recipe/gun) + filtered_recipes = list() + filtered_recipes += /datum/lathe_recipe/gun/winchester for(var/datum/lathe_recipe/gun/recipe in gun_recipes) if(istype(recipe, src.type)) @@ -176,10 +193,8 @@ return filtered_recipes -/obj/item/part/gun/frame/attack_self(obj/item/I, mob/user) - . = ..() - if(istype(I, /obj/item/part/gun)) - handle_part(I, user) +///obj/item/part/gun/frame/attack_self(obj/item/I, mob/user) + /* if(!InstalledGrip) to_chat(user, span_warning("\the [src] does not have a grip!")) @@ -211,8 +226,10 @@ if(.) for (var/obj/item/part/gun/part in installedParts) . += "\the [src] has \a [part] [icon2html(part, user)] installed." - for(var/datum/lathe_recipe/gun/recipe in get_current_recipes()) - for(var/obj/item/part in recipe.validParts) + get_current_recipes() + var/list/datum/valid_recipes = filtered_recipes + for(var/datum/lathe_recipe/gun/recipe in valid_recipes) + for(var/part in recipe.validParts) . += "\the [src] could hold \a [part] [icon2html(part, user)]." /* @@ -233,7 +250,7 @@ /obj/item/part/gun/frame/winchester name = "Winchester Gun Frame" icon_state = "frame_shotgun" - installedParts = list( + preinstalledParts = list( /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/shotgun, /obj/item/part/gun/modular/barrel/shotgun @@ -242,7 +259,7 @@ /obj/item/part/gun/frame/winchester/mk1 /obj/item/part/gun/frame/m1911 - installedParts = list( + preinstalledParts = list( /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism, /obj/item/part/gun/modular/barrel diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index b0cc8f5afd0d..df5bbc9a7a7e 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -14,7 +14,7 @@ /obj/item/part/gun/modular/barrel/shotgun ) -/datum/lathe_recipe/gun/winchester +/datum/lathe_recipe/gun/winchester/mk1 result = /obj/item/gun/ballistic/shotgun/winchester/mk1 validParts = list( /obj/item/part/gun/frame/winchester/mk1, From b05cf87c2c654dcd64451353e24060bbb240e53e Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 1 Feb 2024 10:08:51 -0600 Subject: [PATCH 079/206] no bitflags --- code/__DEFINES/gun_crafting.dm | 4 ---- code/modules/guncrafting/frame.dm | 2 +- code/modules/guncrafting/recipe.dm | 25 ++++++++++++++++++++++++- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/gun_crafting.dm b/code/__DEFINES/gun_crafting.dm index a0257209d6f9..e69de29bb2d1 100644 --- a/code/__DEFINES/gun_crafting.dm +++ b/code/__DEFINES/gun_crafting.dm @@ -1,4 +0,0 @@ -#define GUN_PART_FRAME (1<<0) -#define GUN_PART_BARREL (1<<1) -#define GUN_PART_MECHANISM (1<<2) -#define GUN_PART_GRIP (1<<3) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 7ae7904e96d6..eae05aba15d7 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -20,7 +20,7 @@ // Which barrels does the frame accept? //var/list/validBarrels = list(/obj/item/part/gun/modular/barrel) - gun_part_type = GUN_PART_FRAME + gun_part_type = "gun_frame" /* /obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts) diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index b0cc8f5afd0d..80c675dee61d 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -1,5 +1,28 @@ /datum/lathe_recipe - var/obj/item/result = /obj/item/gun + var/result + var/list/steps = list() + var/time = 30 //time in deciseconds + +/datum/lathe_recipe/part + var/list/reqs = list(/obj/item/stack/sheet/metal = 3) + +/datum/lathe_recipe/part/frame + result = /obj/item/part/gun/frame + +/datum/lathe_recipe/part/frame/winchester + result = /obj/item/part/gun/frame/winchester + +/datum/lathe_recipe/part/grip/wood + result = /obj/item/part/gun/modular/grip/wood + reqs = list(/obj/item/stack/sheet/mineral/wood = 3) + +/datum/lathe_recipe/part/mechanism/shotgun + result = /obj/item/part/gun/modular/mechanism/shotgun + reqs = list(/obj/item/stack/sheet/metal = 2, + /obj/item/stack/gun_part = 1) + +/datum/lathe_recipe/part/barrel/shotgun + result = /obj/item/part/gun/modular/barrel/shotgun /datum/lathe_recipe/gun var/list/validParts = list() From 2aec984766b853324fa030bcea2868e0dff9e6f0 Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 1 Feb 2024 10:16:57 -0600 Subject: [PATCH 080/206] shrug --- code/__DEFINES/gun_crafting.dm | 4 ++++ code/modules/guncrafting/frame.dm | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/gun_crafting.dm b/code/__DEFINES/gun_crafting.dm index e69de29bb2d1..d4db4d300a77 100644 --- a/code/__DEFINES/gun_crafting.dm +++ b/code/__DEFINES/gun_crafting.dm @@ -0,0 +1,4 @@ +#define GUN_PART_FRAME "frame" +#define GUN_PART_BARREL "barrel" +#define GUN_PART_GRIP "grip" +#define GUN_PART_MECHANISM "mechanism" diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index eae05aba15d7..7ae7904e96d6 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -20,7 +20,7 @@ // Which barrels does the frame accept? //var/list/validBarrels = list(/obj/item/part/gun/modular/barrel) - gun_part_type = "gun_frame" + gun_part_type = GUN_PART_FRAME /* /obj/item/part/gun/frame/Initialize(mapload, dont_spawn_with_parts) From 281debc1c48e9d36842262250334ed6a466fe890 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 1 Feb 2024 20:24:43 -0600 Subject: [PATCH 081/206] yea --- code/__HELPERS/global_lists.dm | 4 +++ code/_globalvars/lists/objects.dm | 1 + code/modules/guncrafting/frame.dm | 50 ++++++++++++++++-------------- code/modules/guncrafting/recipe.dm | 1 + 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 1048aaa5c861..bb3d176d66e7 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -64,6 +64,10 @@ GLOB.surgeries_list += new path() sortList(GLOB.surgeries_list, /proc/cmp_typepaths_asc) + for(var/path in subtypesof(/datum/lathe_recipe/gun)) + GLOB.gun_recipe_list += new path() + sortList(GLOB.gun_recipe_list, /proc/cmp_typepaths_asc) + // Hair Gradients - Initialise all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name for(var/path in subtypesof(/datum/sprite_accessory/hair_gradient)) var/datum/sprite_accessory/hair_gradient/H = new path() diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 82258dfdcd43..6f3e2453440e 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -17,6 +17,7 @@ GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums index GLOBAL_LIST_EMPTY(materials_list) //list of all /datum/material datums indexed by material id. GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id. GLOBAL_LIST_EMPTY(surgeries_list) //list of all surgeries by name, associated with their path. +GLOBAL_LIST_EMPTY(gun_recipe_list) GLOBAL_LIST_EMPTY(crafting_recipes) //list of all table craft recipes GLOBAL_LIST_EMPTY(rcd_list) //list of Rapid Construction Devices. GLOBAL_LIST_EMPTY(apcs_list) //list of all Area Power Controller machines, separate from machines for powernet speeeeeeed. diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 883803ed8fec..8df623a1181e 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -29,6 +29,7 @@ ..() for (var/partType in preinstalledParts) installedParts += new partType(src) + get_current_recipes() /* var/spawn_with_preinstalled_parts = TRUE if(dont_spawn_with_parts) @@ -159,40 +160,36 @@ */ /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user) - get_current_recipes() - var/list/valid_recipes = filtered_recipes - to_chat(user, span_warning("Recipes [valid_recipes]")) - for(var/datum/lathe_recipe/gun/recipe in valid_recipes) + for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) if(I.type in recipe.validParts) - to_chat(user, span_warning("Recipe [recipe]")) - to_chat(user, span_warning("Part [I]")) - to_chat(user, span_warning("Part type [recipe.validParts]")) if(I.gun_part_type && !(I.gun_part_type & get_part_types())) if(insert_item(I, user)) to_chat(user, span_notice("You have attached the part to \the [src].")) installedParts += I + get_current_recipes() return else to_chat(user, span_warning("This part does not fit!")) return - to_chat(user, span_warning("Weird!")) //Finds all recipes that match the current parts /obj/item/part/gun/frame/proc/get_current_recipes() - var/list/datum/gun_recipes = subtypesof(/datum/lathe_recipe/gun) filtered_recipes = list() - filtered_recipes += /datum/lathe_recipe/gun/winchester - - for(var/datum/lathe_recipe/gun/recipe in gun_recipes) - if(istype(recipe, src.type)) + for(var/datum/lathe_recipe/gun/recipe in GLOB.gun_recipe_list) + if(is_recipe_valid(recipe)) filtered_recipes += recipe - for(var/obj/item/part/gun/installed_part in installedParts) - if(istype(recipe, installed_part.type)) - filtered_recipes += recipe - return filtered_recipes + +//Should return false if +/obj/item/part/gun/frame/proc/is_recipe_valid(datum/lathe_recipe/gun/recipe) + if(!(src.type in recipe.validParts)) + return FALSE + for(var/obj/item/part/gun/installed_part in installedParts) + if(!(installed_part.type in recipe.validParts)) + return FALSE + return TRUE ///obj/item/part/gun/frame/attack_self(obj/item/I, mob/user) /* @@ -214,6 +211,8 @@ return */ +/obj/item/part/gun/frame/proc/can_be_installed() + /obj/item/part/gun/frame/proc/get_part_types() var/part_types = NONE part_types |= gun_part_type @@ -225,12 +224,11 @@ . = ..() if(.) for (var/obj/item/part/gun/part in installedParts) - . += "\the [src] has \a [part] [icon2html(part, user)] installed." - get_current_recipes() - var/list/datum/valid_recipes = filtered_recipes - for(var/datum/lathe_recipe/gun/recipe in valid_recipes) - for(var/part in recipe.validParts) - . += "\the [src] could hold \a [part] [icon2html(part, user)]." + . += "[src] has \a [part] [icon2html(part, user)] installed." + for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) + for(var/obj/part as anything in recipe.validParts) + . += "[src] could hold \a [initial(part.name)]." + . += "[src] could hold \a [get_part_types()]." /* if(InstalledGrip) @@ -248,7 +246,7 @@ */ /obj/item/part/gun/frame/winchester - name = "Winchester Gun Frame" + name = "winchester gun frame" icon_state = "frame_shotgun" preinstalledParts = list( /obj/item/part/gun/modular/grip/wood, @@ -257,8 +255,10 @@ ) /obj/item/part/gun/frame/winchester/mk1 + name = "winchester mk1 gun frame" /obj/item/part/gun/frame/m1911 + name = "m1911 gun frame" preinstalledParts = list( /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism, @@ -266,5 +266,7 @@ ) /obj/item/part/gun/frame/commander + name = "commander gun frame" /obj/item/part/gun/frame/boltaction + name = "bolt action gun frame" diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index 6ef1c5c86f68..25840add3471 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -63,5 +63,6 @@ /obj/item/part/gun/modular/mechanism, /obj/item/part/gun/modular/barrel ) + /datum/lathe_recipe/gun/boltaction result = /obj/item/gun/ballistic/rifle/boltaction From 0eee1212f68f2f0a91b06d4357d3031f055ac33e Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 2 Feb 2024 17:00:01 -0600 Subject: [PATCH 082/206] yea --- code/modules/guncrafting/frame.dm | 17 +++--- .../guncrafting}/guncrafting.dm | 10 +++- code/modules/guncrafting/lathe.dm | 12 ----- code/modules/guncrafting/recipe.dm | 54 +++++++++++++++++++ code/modules/research/designs.dm | 5 +- 5 files changed, 74 insertions(+), 24 deletions(-) rename code/{datums/components/crafting => modules/guncrafting}/guncrafting.dm (77%) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 8df623a1181e..e5cd6f5fe7cc 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -26,7 +26,7 @@ /obj/item/part/gun/frame/Initialize() - ..() + . = ..() for (var/partType in preinstalledParts) installedParts += new partType(src) get_current_recipes() @@ -162,15 +162,18 @@ /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user) for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) if(I.type in recipe.validParts) - if(I.gun_part_type && !(I.gun_part_type & get_part_types())) - if(insert_item(I, user)) - to_chat(user, span_notice("You have attached the part to \the [src].")) - installedParts += I - get_current_recipes() - return + //if(I.gun_part_type && !(I.gun_part_type & get_part_types())) + if(insert_item(I, user)) + to_chat(user, span_notice("You have attached the part to \the [src].")) + installedParts += I + get_current_recipes() + return else to_chat(user, span_warning("This part does not fit!")) return + else + to_chat(user, span_warning("This part cannot be installed on this [src]!")) + return //Finds all recipes that match the current parts diff --git a/code/datums/components/crafting/guncrafting.dm b/code/modules/guncrafting/guncrafting.dm similarity index 77% rename from code/datums/components/crafting/guncrafting.dm rename to code/modules/guncrafting/guncrafting.dm index c26b81bc41eb..db3ea57a8cc2 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/modules/guncrafting/guncrafting.dm @@ -1,5 +1,3 @@ -//Gun crafting parts til they can be moved elsewhere - // PARTS // /obj/item/weaponcrafting/receiver @@ -20,3 +18,11 @@ desc = "A long piece of Silk that looks like a cable coil." icon = 'icons/obj/improvised.dmi' icon_state = "silkstring" + +/obj/item/stack/gun_part + name = "Gun Parts" + singular_name = "Gun Part" + desc = "This could fabcricate metal parts." + icon = 'icons/obj/guncrafting.dmi' + icon_state = "work_piece" + max_amount = 10 diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 7aa5cf5a21cc..34819f7541b6 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -148,15 +148,3 @@ part_to_build.forceMove(drop_location()) */ mode = FALSE - -/////////// -// ITEMS // -/////////// - -/obj/item/stack/gun_part - name = "Gun Parts" - singular_name = "Gun Part" - desc = "This could fabcricate metal parts." - icon = 'icons/obj/guncrafting.dmi' - icon_state = "work_piece" - max_amount = 10 diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index 25840add3471..5542082d5732 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -66,3 +66,57 @@ /datum/lathe_recipe/gun/boltaction result = /obj/item/gun/ballistic/rifle/boltaction + +/datum/lathe_recipe/gun/doublebarrel + result = /obj/item/gun/ballistic/shotgun/doublebarrel + validParts = list( + /obj/item/part/gun/frame/doublebarrel, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism/shotgun, + /obj/item/part/gun/modular/barrel/shotgun + ) + +/datum/lathe_recipe/gun/derringer + result = /obj/item/gun/ballistic/derringer + validParts = list( + /obj/item/part/gun/frame/derringer, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism, + /obj/item/part/gun/modular/barrel + ) + +/datum/lathe_recipe/gun/srmrevolver + result = /obj/item/gun/ballistic/revolver/srm + validParts = list( + /obj/item/part/gun/frame/srmrevolver, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism, + /obj/item/part/gun/modular/barrel + ) + +/datum/lathe_recipe/gun/pepperbox + result = /obj/item/gun/ballistic/revolver/pepperbox + validParts = list( + /obj/item/part/gun/frame/pepperbox, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism, + /obj/item/part/gun/modular/barrel + ) + +/datum/lathe_recipe/gun/nagantrevolver + result = /obj/item/gun/ballistic/revolver/nagant + validParts = list( + /obj/item/part/gun/frame/nagantrevolver, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism, + /obj/item/part/gun/modular/barrel + ) + +/datum/lathe_recipe/gun/nagantrifle + result = /obj/item/gun/ballistic/rifle/boltaction/nagantrifle + validParts = list( + /obj/item/part/gun/frame/nagantrifle, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism, + /obj/item/part/gun/modular/barrel + ) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ec4038ec8f2b..ab96a25edcf0 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -145,16 +145,15 @@ other types of metals and chemistry for reagents). . = ..() blueprints[1] = new /datum/design/n762() -/obj/item/disk/design_disk/adv/disposable_gun +/obj/item/disk/design_disk/disposable_gun name = "design disk - disposable gun" desc = "A design disk containing designs for a cheap and disposable gun." illustration = "gun" max_blueprints = 2 -/obj/item/disk/design_disk/adv/disposable_gun/Initialize() +/obj/item/disk/design_disk/disposable_gun/Initialize() . = ..() blueprints[1] = new /datum/design/disposable_gun() - blueprints[2] = new /datum/design/pizza_disposable_gun() /obj/item/disk/design_disk/cmm_mechs name = "design disk - CMM mecha modifications" From c52fb7f4b3bce5256e569d8e22c95806c441bbb2 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 4 Feb 2024 16:12:37 -0600 Subject: [PATCH 083/206] wooo so much stuff.. --- code/modules/guncrafting/frame.dm | 190 ++++++------------ code/modules/guncrafting/guncrafting.dm | 23 +++ code/modules/guncrafting/part.dm | 14 +- code/modules/guncrafting/recipe.dm | 52 ++--- code/modules/guncrafting/tools.dm | 17 -- .../boxes_magazines/_box_magazine.dm | 4 +- code/modules/projectiles/guns/ballistic.dm | 16 +- .../projectiles/guns/ballistic/shotgun.dm | 1 - shiptest.dme | 2 +- 9 files changed, 144 insertions(+), 175 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index e5cd6f5fe7cc..94a113f72f94 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -2,26 +2,10 @@ name = "gun frame" desc = "a generic gun frame." icon_state = "frame_olivaw" - //var/obj/item/gun/result = /obj/item/gun var/list/preinstalledParts = list() var/list/installedParts = list() var/list/filtered_recipes = list() - // Currently installed grip - //var/obj/item/part/gun/modular/grip/InstalledGrip - // Which grips does the frame accept? - //var/list/validGrips = list(/obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/grip/black) - - // Currently installed mechanism - //var/obj/item/part/gun/modular/grip/InstalledMechanism - // Which mechanism the frame accepts? - //var/list/validMechanisms = list(/obj/item/part/gun/modular/mechanism) - - // Currently installed barrel - //var/obj/item/part/gun/modular/barrel/InstalledBarrel - // Which barrels does the frame accept? - //var/list/validBarrels = list(/obj/item/part/gun/modular/barrel) - gun_part_type = GUN_PART_FRAME @@ -87,29 +71,6 @@ . = ..() if(istype(I, /obj/item/part/gun)) handle_part(I, user) - /* - if(istype(I, /obj/item/part/gun/modular/grip)) - if(InstalledGrip) - to_chat(user, span_warning("[src] already has a grip attached!")) - return - else - handle_grip(I, user) - - if(istype(I, /obj/item/part/gun/modular/mechanism)) - if(InstalledMechanism) - to_chat(user, span_warning("[src] already has a mechanism attached!")) - return - else - handle_mechanism(I, user) - - if(istype(I, /obj/item/part/gun/modular/barrel)) - if(InstalledBarrel) - to_chat(user, span_warning("[src] already has a barrel attached!")) - return - else - handle_barrel(I, user) - */ - if(I.tool_behaviour == TOOL_SCREWDRIVER) var/list/possibles = contents.Copy() var/obj/item/part/gun/toremove = input("Which part would you like to remove?","Removing parts") in possibles @@ -117,63 +78,23 @@ return if(I.use_tool(src, user, 40, volume=50)) eject_item(toremove, user) - /* - if(istype(toremove, /obj/item/part/gun/modular/grip)) - InstalledGrip = null - else if(istype(toremove, /obj/item/part/gun/modular/barrel)) - InstalledBarrel = FALSE - else if(istype(toremove, /obj/item/part/gun/modular/mechanism)) - InstalledMechanism = FALSE - */ - return ..() -/* -/obj/item/part/gun/frame/proc/handle_grip(obj/item/I, mob/living/user) - if(I.type in validGrips) - if(insert_item(I, user)) - InstalledGrip = I - to_chat(user, span_notice("You have attached the grip to \the [src].")) - return - else - to_chat(user, span_warning("This grip does not fit!")) - return - -/obj/item/part/gun/frame/proc/handle_mechanism(obj/item/I, mob/living/user) - if(I.type in validMechanisms) - if(insert_item(I, user)) - InstalledMechanism = I - to_chat(user, span_notice("You have attached the mechanism to \the [src].")) - return - else - to_chat(user, span_warning("This mechanism does not fit!")) - return - -/obj/item/part/gun/frame/proc/handle_barrel(obj/item/I, mob/living/user) - if(I.type in validBarrels) - if(insert_item(I, user)) - InstalledBarrel = I - to_chat(user, span_notice("You have attached the barrel to \the [src].")) - return - else - to_chat(user, span_warning("This barrel does not fit!")) - return -*/ /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user) for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) if(I.type in recipe.validParts) - //if(I.gun_part_type && !(I.gun_part_type & get_part_types())) - if(insert_item(I, user)) - to_chat(user, span_notice("You have attached the part to \the [src].")) - installedParts += I - get_current_recipes() - return + if(I.gun_part_type && !(I.gun_part_type in get_part_types())) + if(insert_item(I, user)) + to_chat(user, span_notice("You have attached the part to \the [src].")) + installedParts += I + get_current_recipes() + return + else + to_chat(user, span_warning("This part does not fit!")) else - to_chat(user, span_warning("This part does not fit!")) - return + to_chat(user, span_warning("This type of part is already installed!")) else to_chat(user, span_warning("This part cannot be installed on this [src]!")) - return //Finds all recipes that match the current parts @@ -193,31 +114,40 @@ if(!(installed_part.type in recipe.validParts)) return FALSE return TRUE -///obj/item/part/gun/frame/attack_self(obj/item/I, mob/user) - /* - if(!InstalledGrip) - to_chat(user, span_warning("\the [src] does not have a grip!")) - return - if(!InstalledMechanism) - to_chat(user, span_warning("\the [src] does not have a mechanism!")) +/obj/item/part/gun/frame/attack_self(mob/user) + var/list/choose_options = list() + var/list/option_results = list() + for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) + var/obj/recipe_result = recipe.result + var/list/parts_for_craft = list() + for(var/obj/item/part/gun/part as anything in recipe.validParts) + var/part_type = initial(part.gun_part_type) + var/list/installed_types = get_part_types() + if(!(part_type in installed_types)) + parts_for_craft += " \a [initial(part.name)]" + if(length(parts_for_craft) != 0) + to_chat(user, span_warning("Parts needed for a [initial(recipe_result.name)]:")) + for(var/part in parts_for_craft) + to_chat(user, span_warning(part)) + else + to_chat(user, span_notice("You can craft a [initial(recipe_result.name)] with the parts installed.")) + choose_options += list("Craft [initial(recipe_result.name)]" = image(icon = initial(recipe_result.icon), icon_state = initial(recipe_result.icon_state))) + option_results["Craft [initial(recipe_result.name)]"] = recipe_result + if(length(choose_options) == 0) + to_chat(user, span_warning("No recipes can be crafted with the parts installed.")) return - if(!InstalledBarrel) - to_chat(user, span_warning("\the [src] does not have a barrel!")) + var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) + if(!picked_option) return - */ -/* var/turf/T = get_turf(src) - var/obj/item/gun/newGun = new result(T, 0) + var/obj/item/gun/ballistic/pickedGun = option_results[picked_option] + var/obj/item/gun/newGun = new pickedGun(T, TRUE) newGun.frame = src src.forceMove(newGun) - return -*/ - -/obj/item/part/gun/frame/proc/can_be_installed() /obj/item/part/gun/frame/proc/get_part_types() - var/part_types = NONE + var/list/part_types = list() part_types |= gun_part_type for(var/obj/item/part/gun/part in installedParts) part_types |= part.gun_part_type @@ -226,26 +156,28 @@ /obj/item/part/gun/frame/examine(user, distance) . = ..() if(.) - for (var/obj/item/part/gun/part in installedParts) + for(var/obj/item/part/gun/part in installedParts) . += "[src] has \a [part] [icon2html(part, user)] installed." for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) - for(var/obj/part as anything in recipe.validParts) - . += "[src] could hold \a [initial(part.name)]." - . += "[src] could hold \a [get_part_types()]." - + var/obj/recipe_result = recipe.result + var/list/parts_for_craft = list() + for(var/obj/item/part/gun/part as anything in recipe.validParts) + var/part_type = initial(part.gun_part_type) + var/list/installed_types = get_part_types() + if(!(part_type in installed_types)) + parts_for_craft += " \a [initial(part.name)]" + if(length(parts_for_craft) != 0) + . += "Parts needed for a [initial(recipe_result.name)]:" + for(var/part in parts_for_craft) + . += part + else + . += "You can craft a [initial(recipe_result.name)] with the parts installed." /* - if(InstalledGrip) - . += "\the [src] has \a [InstalledGrip] installed." - else - . += "\the [src] does not have a grip installed." - if(InstalledMechanism) - . += "\the [src] has \a [InstalledMechanism] installed." - else - . += "\the [src] does not have a mechanism installed." - if(InstalledBarrel) - . += "\the [src] has \a [InstalledBarrel] installed." - else - . += "\the [src] does not have a barrel installed." + var/part_type_message = "" + for(var/part_type in get_part_types()) + part_type_message += "\a [part_type], " + if(part_type_message) + . += "[src] has " + part_type_message + "." */ /obj/item/part/gun/frame/winchester @@ -253,8 +185,8 @@ icon_state = "frame_shotgun" preinstalledParts = list( /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/shotgun, - /obj/item/part/gun/modular/barrel/shotgun + /obj/item/part/gun/modular/mechanism/rifle, + /obj/item/part/gun/modular/barrel/rifle ) /obj/item/part/gun/frame/winchester/mk1 @@ -264,8 +196,8 @@ name = "m1911 gun frame" preinstalledParts = list( /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism, - /obj/item/part/gun/modular/barrel + /obj/item/part/gun/modular/mechanism/pistol, + /obj/item/part/gun/modular/barrel/pistol ) /obj/item/part/gun/frame/commander @@ -273,3 +205,9 @@ /obj/item/part/gun/frame/boltaction name = "bolt action gun frame" + +/obj/item/part/gun/frame/revolver + +/obj/item/part/gun/frame/tec9 + +/obj/item/part/gun/frame/shotgun diff --git a/code/modules/guncrafting/guncrafting.dm b/code/modules/guncrafting/guncrafting.dm index db3ea57a8cc2..423fb6f1a28a 100644 --- a/code/modules/guncrafting/guncrafting.dm +++ b/code/modules/guncrafting/guncrafting.dm @@ -26,3 +26,26 @@ icon = 'icons/obj/guncrafting.dmi' icon_state = "work_piece" max_amount = 10 + +/obj/item/storage/box/parts + name = "gunmakers box" + desc = "A set of tools and parts to assemble your first weapon" + +/obj/item/storage/box/parts/PopulateContents() + new /obj/item/tool/hammer(src) + new /obj/item/tool/file(src) + new /obj/item/tool/saw(src) + new /obj/item/part/gun/frame/winchester(src) + new /obj/item/part/gun/modular/grip/wood(src) + new /obj/item/part/gun/modular/mechanism/shotgun(src) + new /obj/item/part/gun/modular/barrel/shotgun(src) + new /obj/item/part/gun/frame/winchester(src) + new /obj/item/part/gun/modular/grip/wood(src) + new /obj/item/part/gun/modular/mechanism/shotgun(src) + new /obj/item/part/gun/modular/barrel/shotgun(src) + new /obj/item/part/gun/frame(src) + new /obj/item/part/gun/frame/m1911(src) + new /obj/item/part/gun/modular/grip/wood(src) + new /obj/item/part/gun/modular/mechanism(src) + new /obj/item/part/gun/modular/barrel(src) + diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm index 3c95f5a6390b..7fc06a6cec20 100644 --- a/code/modules/guncrafting/part.dm +++ b/code/modules/guncrafting/part.dm @@ -35,9 +35,15 @@ /obj/item/part/gun/modular/mechanism/shotgun name = "generic shotgun mechanism" - desc = "All the bits that makes the bullet go bang." icon_state = "mechanism_shotgun" +/obj/item/part/gun/modular/mechanism/rifle + +/obj/item/part/gun/modular/mechanism/revolver + name = "generic revolver mechanism" + +/obj/item/part/gun/modular/mechanism/pistol + /obj/item/part/gun/modular/barrel name = "generic barrel" desc = "A gun barrel, which keeps the bullet going in the right direction." @@ -48,3 +54,9 @@ name = "generic shotgun barrel" desc = "A gun barrel, which keeps the bullet going in the right direction." icon_state = "barrel_30" + +/obj/item/part/gun/modular/barrel/rifle + +/obj/item/part/gun/modular/barrel/revolver + +/obj/item/part/gun/modular/barrel/pistol diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index 5542082d5732..a1e1eb1d810e 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -33,8 +33,8 @@ validParts = list( /obj/item/part/gun/frame/winchester, /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/shotgun, - /obj/item/part/gun/modular/barrel/shotgun + /obj/item/part/gun/modular/mechanism/rifle, + /obj/item/part/gun/modular/barrel/rifle ) /datum/lathe_recipe/gun/winchester/mk1 @@ -42,8 +42,8 @@ validParts = list( /obj/item/part/gun/frame/winchester/mk1, /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/shotgun, - /obj/item/part/gun/modular/barrel/shotgun + /obj/item/part/gun/modular/mechanism/rifle, + /obj/item/part/gun/modular/barrel/rifle ) /datum/lathe_recipe/gun/m1911 @@ -51,26 +51,32 @@ validParts = list( /obj/item/part/gun/frame/m1911, /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism, - /obj/item/part/gun/modular/barrel + /obj/item/part/gun/modular/mechanism/pistol, + /obj/item/part/gun/modular/barrel/pistol ) /datum/lathe_recipe/gun/tec9 result = /obj/item/gun/ballistic/automatic/pistol/tec9 validParts = list( - /obj/item/part/gun/frame, - /obj/item/part/gun/modular/grip, - /obj/item/part/gun/modular/mechanism, - /obj/item/part/gun/modular/barrel + /obj/item/part/gun/frame/tec9, + /obj/item/part/gun/modular/grip/black, + /obj/item/part/gun/modular/mechanism/pistol, + /obj/item/part/gun/modular/barrel/pistol ) /datum/lathe_recipe/gun/boltaction result = /obj/item/gun/ballistic/rifle/boltaction + validParts = list( + /obj/item/part/gun/frame/boltaction, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism/rifle, + /obj/item/part/gun/modular/barrel/rifle + ) /datum/lathe_recipe/gun/doublebarrel result = /obj/item/gun/ballistic/shotgun/doublebarrel validParts = list( - /obj/item/part/gun/frame/doublebarrel, + /obj/item/part/gun/frame/shotgun, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/shotgun, /obj/item/part/gun/modular/barrel/shotgun @@ -79,43 +85,43 @@ /datum/lathe_recipe/gun/derringer result = /obj/item/gun/ballistic/derringer validParts = list( - /obj/item/part/gun/frame/derringer, + /obj/item/part/gun/frame/revolver, /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism, - /obj/item/part/gun/modular/barrel + /obj/item/part/gun/modular/mechanism/revolver, + /obj/item/part/gun/modular/barrel/revolver ) /datum/lathe_recipe/gun/srmrevolver result = /obj/item/gun/ballistic/revolver/srm validParts = list( - /obj/item/part/gun/frame/srmrevolver, + /obj/item/part/gun/frame/revolver, /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism, - /obj/item/part/gun/modular/barrel + /obj/item/part/gun/modular/mechanism/revolver, + /obj/item/part/gun/modular/barrel/revolver ) /datum/lathe_recipe/gun/pepperbox result = /obj/item/gun/ballistic/revolver/pepperbox validParts = list( - /obj/item/part/gun/frame/pepperbox, + /obj/item/part/gun/frame/revolver, /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism, - /obj/item/part/gun/modular/barrel + /obj/item/part/gun/modular/mechanism/revolver, + /obj/item/part/gun/modular/barrel/revolver ) /datum/lathe_recipe/gun/nagantrevolver result = /obj/item/gun/ballistic/revolver/nagant validParts = list( - /obj/item/part/gun/frame/nagantrevolver, + /obj/item/part/gun/frame, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism, /obj/item/part/gun/modular/barrel ) /datum/lathe_recipe/gun/nagantrifle - result = /obj/item/gun/ballistic/rifle/boltaction/nagantrifle + result = /obj/item/gun/ballistic/rifle/boltaction validParts = list( - /obj/item/part/gun/frame/nagantrifle, + /obj/item/part/gun/frame, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism, /obj/item/part/gun/modular/barrel diff --git a/code/modules/guncrafting/tools.dm b/code/modules/guncrafting/tools.dm index 1a6805ce5234..6403005791ea 100644 --- a/code/modules/guncrafting/tools.dm +++ b/code/modules/guncrafting/tools.dm @@ -12,20 +12,3 @@ name = "saw" icon = 'icons/obj/tools.dmi' icon_state = "oldcutters_map" - -/obj/item/storage/box/parts - name = "gunmakers box" - desc = "A set of tools and parts to assemble your first weapon" - -/obj/item/storage/box/parts/PopulateContents() - new /obj/item/tool/hammer(src) - new /obj/item/tool/file(src) - new /obj/item/tool/saw(src) - new /obj/item/part/gun/frame/winchester(src) - new /obj/item/part/gun/modular/grip/wood(src) - new /obj/item/part/gun/modular/mechanism/shotgun(src) - new /obj/item/part/gun/modular/barrel/shotgun(src) - new /obj/item/part/gun/frame/winchester(src) - new /obj/item/part/gun/modular/grip/wood(src) - new /obj/item/part/gun/modular/mechanism/shotgun(src) - new /obj/item/part/gun/modular/barrel/shotgun(src) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index c3989e7a4952..424906b8a71e 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -34,8 +34,10 @@ ///cost of the materials in the magazine/box itself var/list/base_cost -/obj/item/ammo_box/Initialize() +/obj/item/ammo_box/Initialize(mapload, should_start_empty) . = ..() + if(should_start_empty) + start_empty = TRUE if (!bullet_cost) for (var/material in custom_materials) var/material_amount = custom_materials[material] diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index a8e2a201c81a..92c7f22b2b43 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -93,14 +93,20 @@ ///If we have the 'snowflake mechanic,' how long should it take to reload? var/tactical_reload_delay = 1 SECONDS -/obj/item/gun/ballistic/Initialize() +/obj/item/gun/ballistic/Initialize(mapload, dontspawnwithmag) . = ..() + var/no_mag_ammo = FALSE + if(dontspawnwithmag) + spawnwithmagazine = FALSE if (!spawnwithmagazine) - bolt_locked = TRUE - update_appearance() - return + if(internal_magazine) + no_mag_ammo = TRUE + else + bolt_locked = TRUE + update_appearance() + return if (!magazine) - magazine = new mag_type(src) + magazine = new mag_type(src, no_mag_ammo) chamber_round(TRUE) update_appearance() diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index de8b923fb967..c4e6ea56f650 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -241,7 +241,6 @@ bolt_type = BOLT_TYPE_NO_BOLT can_be_sawn_off = TRUE pb_knockback = 3 // it's a super shotgun! - manufacturer = MANUFACTURER_HUNTERSPRIDE /obj/item/gun/ballistic/shotgun/doublebarrel/AltClick(mob/user) . = ..() diff --git a/shiptest.dme b/shiptest.dme index 73cd4f734c28..071758700aea 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -533,7 +533,6 @@ #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\wet_floor.dm" #include "code\datums\components\crafting\crafting.dm" -#include "code\datums\components\crafting\guncrafting.dm" #include "code\datums\components\crafting\recipes.dm" #include "code\datums\components\crafting\tailoring.dm" #include "code\datums\components\fantasy\_fantasy.dm" @@ -2163,6 +2162,7 @@ #include "code\modules\games\kotahi.dm" #include "code\modules\games\tarot.dm" #include "code\modules\guncrafting\frame.dm" +#include "code\modules\guncrafting\guncrafting.dm" #include "code\modules\guncrafting\lathe.dm" #include "code\modules\guncrafting\part.dm" #include "code\modules\guncrafting\recipe.dm" From 3c9125def0f18004125b23fde6cdec0128324e53 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 4 Feb 2024 17:16:03 -0600 Subject: [PATCH 084/206] much clearer --- code/modules/guncrafting/frame.dm | 2 +- code/modules/guncrafting/lathe.dm | 6 +++--- .../boxes_magazines/_box_magazine.dm | 4 ++-- code/modules/projectiles/guns/ballistic.dm | 20 +++++++------------ 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 94a113f72f94..5e50454febaf 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -142,7 +142,7 @@ return var/turf/T = get_turf(src) var/obj/item/gun/ballistic/pickedGun = option_results[picked_option] - var/obj/item/gun/newGun = new pickedGun(T, TRUE) + var/obj/item/gun/newGun = new pickedGun(T, FALSE, FALSE) newGun.frame = src src.forceMove(newGun) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 34819f7541b6..303f24b8d69d 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -102,7 +102,7 @@ /obj/structure/lathe/proc/scrap_item(mob/user) to_chat(user, "The [work_piece.name] is broken down into parts.") playsound(src,'sound/items/welder.ogg',50,TRUE) - if(istype (work_piece, /obj/item/gun)) + if(istype(work_piece, /obj/item/gun)) var/obj/item/gun/gun_work_piece = work_piece var/obj/item/new_part = new /obj/item/part/gun new_part.forceMove(drop_location()) @@ -121,10 +121,10 @@ /////////////// /obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user) - /* if(istype (work_piece, /obj/item/gun)) var/obj/item/gun/gun_work_piece = work_piece var/list/choose_options = list() + /* if(gun_work_piece.frame.InstalledGrip) choose_options += list("Grip" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledGrip.icon_state)) if(gun_work_piece.frame.InstalledMechanism) @@ -146,5 +146,5 @@ if("Frame") part_to_build = new gun_work_piece.frame.type(src, TRUE) part_to_build.forceMove(drop_location()) - */ + */ mode = FALSE diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 424906b8a71e..38fc25c578a2 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -34,9 +34,9 @@ ///cost of the materials in the magazine/box itself var/list/base_cost -/obj/item/ammo_box/Initialize(mapload, should_start_empty) +/obj/item/ammo_box/Initialize(mapload, init_spawn_with_ammo = TRUE) . = ..() - if(should_start_empty) + if(!init_spawn_with_ammo) start_empty = TRUE if (!bullet_cost) for (var/material in custom_materials) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 92c7f22b2b43..da13be546a7f 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -93,21 +93,15 @@ ///If we have the 'snowflake mechanic,' how long should it take to reload? var/tactical_reload_delay = 1 SECONDS -/obj/item/gun/ballistic/Initialize(mapload, dontspawnwithmag) +/obj/item/gun/ballistic/Initialize(mapload, init_spawn_with_mag = TRUE, init_spawn_with_ammo = TRUE) . = ..() - var/no_mag_ammo = FALSE - if(dontspawnwithmag) - spawnwithmagazine = FALSE - if (!spawnwithmagazine) - if(internal_magazine) - no_mag_ammo = TRUE - else - bolt_locked = TRUE - update_appearance() - return + if ((!spawnwithmagazine || !init_spawn_with_mag) && !internal_magazine) + bolt_locked = TRUE + update_appearance() + return if (!magazine) - magazine = new mag_type(src, no_mag_ammo) - chamber_round(TRUE) + magazine = new mag_type(src, init_spawn_with_ammo) + chamber_round() update_appearance() /obj/item/gun/ballistic/update_icon_state() From e81474225b324cdb58936123c72a6aa747ee002b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 4 Feb 2024 18:26:33 -0600 Subject: [PATCH 085/206] oops all camelCase --- code/modules/guncrafting/frame.dm | 40 ++++++++++++------------- code/modules/guncrafting/lathe.dm | 33 ++++++++------------ code/modules/guncrafting/recipe.dm | 26 ++++++++-------- code/modules/unit_tests/gun_crafting.dm | 6 ++-- 4 files changed, 48 insertions(+), 57 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 5e50454febaf..cf05f893bfff 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -2,8 +2,8 @@ name = "gun frame" desc = "a generic gun frame." icon_state = "frame_olivaw" - var/list/preinstalledParts = list() - var/list/installedParts = list() + var/list/preinstalled_parts = list() + var/list/installed_parts = list() var/list/filtered_recipes = list() gun_part_type = GUN_PART_FRAME @@ -11,8 +11,8 @@ /obj/item/part/gun/frame/Initialize() . = ..() - for (var/partType in preinstalledParts) - installedParts += new partType(src) + for (var/part_type in preinstalled_parts) + installed_parts += new part_type(src) get_current_recipes() /* var/spawn_with_preinstalled_parts = TRUE @@ -43,7 +43,7 @@ "[user] removes [I] from [src].", span_notice("You remove [I] from [src].") ) - installedParts -= I + installed_parts -= I return TRUE /obj/item/part/gun/frame/proc/insert_item(obj/item/I, mob/living/user) @@ -82,11 +82,11 @@ /obj/item/part/gun/frame/proc/handle_part(obj/item/part/gun/I, mob/living/user) for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) - if(I.type in recipe.validParts) + if(I.type in recipe.valid_parts) if(I.gun_part_type && !(I.gun_part_type in get_part_types())) if(insert_item(I, user)) to_chat(user, span_notice("You have attached the part to \the [src].")) - installedParts += I + installed_parts += I get_current_recipes() return else @@ -108,10 +108,10 @@ //Should return false if /obj/item/part/gun/frame/proc/is_recipe_valid(datum/lathe_recipe/gun/recipe) - if(!(src.type in recipe.validParts)) + if(!(src.type in recipe.valid_parts)) return FALSE - for(var/obj/item/part/gun/installed_part in installedParts) - if(!(installed_part.type in recipe.validParts)) + for(var/obj/item/part/gun/installed_part in installed_parts) + if(!(installed_part.type in recipe.valid_parts)) return FALSE return TRUE @@ -121,7 +121,7 @@ for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) var/obj/recipe_result = recipe.result var/list/parts_for_craft = list() - for(var/obj/item/part/gun/part as anything in recipe.validParts) + for(var/obj/item/part/gun/part as anything in recipe.valid_parts) var/part_type = initial(part.gun_part_type) var/list/installed_types = get_part_types() if(!(part_type in installed_types)) @@ -141,27 +141,27 @@ if(!picked_option) return var/turf/T = get_turf(src) - var/obj/item/gun/ballistic/pickedGun = option_results[picked_option] - var/obj/item/gun/newGun = new pickedGun(T, FALSE, FALSE) - newGun.frame = src - src.forceMove(newGun) + var/obj/item/gun/ballistic/picked_gun = option_results[picked_option] + var/obj/item/gun/new_gun = new picked_gun(T, FALSE, FALSE) + new_gun.frame = src + src.forceMove(new_gun) /obj/item/part/gun/frame/proc/get_part_types() var/list/part_types = list() part_types |= gun_part_type - for(var/obj/item/part/gun/part in installedParts) + for(var/obj/item/part/gun/part in installed_parts) part_types |= part.gun_part_type return part_types /obj/item/part/gun/frame/examine(user, distance) . = ..() if(.) - for(var/obj/item/part/gun/part in installedParts) + for(var/obj/item/part/gun/part in installed_parts) . += "[src] has \a [part] [icon2html(part, user)] installed." for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) var/obj/recipe_result = recipe.result var/list/parts_for_craft = list() - for(var/obj/item/part/gun/part as anything in recipe.validParts) + for(var/obj/item/part/gun/part as anything in recipe.valid_parts) var/part_type = initial(part.gun_part_type) var/list/installed_types = get_part_types() if(!(part_type in installed_types)) @@ -183,7 +183,7 @@ /obj/item/part/gun/frame/winchester name = "winchester gun frame" icon_state = "frame_shotgun" - preinstalledParts = list( + preinstalled_parts = list( /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/rifle, /obj/item/part/gun/modular/barrel/rifle @@ -194,7 +194,7 @@ /obj/item/part/gun/frame/m1911 name = "m1911 gun frame" - preinstalledParts = list( + preinstalled_parts = list( /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/pistol, /obj/item/part/gun/modular/barrel/pistol diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 303f24b8d69d..861b49c9ec0c 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -124,27 +124,18 @@ if(istype (work_piece, /obj/item/gun)) var/obj/item/gun/gun_work_piece = work_piece var/list/choose_options = list() - /* - if(gun_work_piece.frame.InstalledGrip) - choose_options += list("Grip" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledGrip.icon_state)) - if(gun_work_piece.frame.InstalledMechanism) - choose_options += list("Mechanism" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledMechanism.icon_state)) - if(gun_work_piece.frame.InstalledBarrel) - choose_options += list("Barrel" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.InstalledBarrel.icon_state)) + var/list/option_results = list() if(gun_work_piece.frame) - choose_options += list("Frame" = image(icon ='icons/obj/crafts.dmi', icon_state = gun_work_piece.frame.icon_state)) + choose_options += list("Craft [gun_work_piece.frame.name]" = image(icon = gun_work_piece.frame.icon , icon_state = gun_work_piece.frame.icon_state)) + option_results["Craft [gun_work_piece.frame.name]"] = gun_work_piece.frame.type + for(var/obj/item/part/gun/gun_part in gun_work_piece.frame.installed_parts) + choose_options += list("Craft [gun_part.name]" = image(icon = gun_part.icon, icon_state = gun_part.icon_state)) + option_results["Craft [gun_part.name]"] = gun_part.type var/choosen_part = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) - if(choosen_part) - var/obj/part_to_build - switch(choosen_part) - if("Grip") - part_to_build = new gun_work_piece.frame.InstalledGrip.type - if("Mechanism") - part_to_build = new gun_work_piece.frame.InstalledMechanism.type - if("Barrel") - part_to_build = new gun_work_piece.frame.InstalledBarrel.type - if("Frame") - part_to_build = new gun_work_piece.frame.type(src, TRUE) - part_to_build.forceMove(drop_location()) - */ + if(!choosen_part) + return + var/turf/T = get_turf(src) + var/obj/item/part/gun/picked_part = option_results[choosen_part] + var/obj/item/part/gun/new_part = new picked_part(T) + new_part.forceMove(drop_location()) mode = FALSE diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index a1e1eb1d810e..1b1dfa7ed5a5 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -25,12 +25,12 @@ result = /obj/item/part/gun/modular/barrel/shotgun /datum/lathe_recipe/gun - var/list/validParts = list() - var/requiredPartTypes = ALL + var/list/valid_parts = list() + var/required_part_types = ALL /datum/lathe_recipe/gun/winchester result = /obj/item/gun/ballistic/shotgun/winchester - validParts = list( + valid_parts = list( /obj/item/part/gun/frame/winchester, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/rifle, @@ -39,7 +39,7 @@ /datum/lathe_recipe/gun/winchester/mk1 result = /obj/item/gun/ballistic/shotgun/winchester/mk1 - validParts = list( + valid_parts = list( /obj/item/part/gun/frame/winchester/mk1, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/rifle, @@ -48,7 +48,7 @@ /datum/lathe_recipe/gun/m1911 result = /obj/item/gun/ballistic/automatic/pistol/m1911 - validParts = list( + valid_parts = list( /obj/item/part/gun/frame/m1911, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/pistol, @@ -57,7 +57,7 @@ /datum/lathe_recipe/gun/tec9 result = /obj/item/gun/ballistic/automatic/pistol/tec9 - validParts = list( + valid_parts = list( /obj/item/part/gun/frame/tec9, /obj/item/part/gun/modular/grip/black, /obj/item/part/gun/modular/mechanism/pistol, @@ -66,7 +66,7 @@ /datum/lathe_recipe/gun/boltaction result = /obj/item/gun/ballistic/rifle/boltaction - validParts = list( + valid_parts = list( /obj/item/part/gun/frame/boltaction, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/rifle, @@ -75,7 +75,7 @@ /datum/lathe_recipe/gun/doublebarrel result = /obj/item/gun/ballistic/shotgun/doublebarrel - validParts = list( + valid_parts = list( /obj/item/part/gun/frame/shotgun, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/shotgun, @@ -84,7 +84,7 @@ /datum/lathe_recipe/gun/derringer result = /obj/item/gun/ballistic/derringer - validParts = list( + valid_parts = list( /obj/item/part/gun/frame/revolver, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/revolver, @@ -93,7 +93,7 @@ /datum/lathe_recipe/gun/srmrevolver result = /obj/item/gun/ballistic/revolver/srm - validParts = list( + valid_parts = list( /obj/item/part/gun/frame/revolver, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/revolver, @@ -102,7 +102,7 @@ /datum/lathe_recipe/gun/pepperbox result = /obj/item/gun/ballistic/revolver/pepperbox - validParts = list( + valid_parts = list( /obj/item/part/gun/frame/revolver, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/revolver, @@ -111,7 +111,7 @@ /datum/lathe_recipe/gun/nagantrevolver result = /obj/item/gun/ballistic/revolver/nagant - validParts = list( + valid_parts = list( /obj/item/part/gun/frame, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism, @@ -120,7 +120,7 @@ /datum/lathe_recipe/gun/nagantrifle result = /obj/item/gun/ballistic/rifle/boltaction - validParts = list( + valid_parts = list( /obj/item/part/gun/frame, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism, diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm index 0efba76beefa..672e3b68b142 100644 --- a/code/modules/unit_tests/gun_crafting.dm +++ b/code/modules/unit_tests/gun_crafting.dm @@ -3,10 +3,10 @@ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) for(var/frame_type in subtypesof(/obj/item/part/gun/frame)) var/obj/item/part/gun/frame/frame = new frame_type - var/list/frame_parts = frame.installedParts - for(var/obj/item/part/installedPart in frame.installedParts) + var/list/frame_parts = frame.installed_parts + for(var/obj/item/part/installedPart in frame.installed_parts) frame.eject_item(installedPart, human) frame.handle_part(installedPart, human) - TEST_ASSERT_EQUAL(frame_parts, frame.installedParts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.") + TEST_ASSERT_EQUAL(frame_parts, frame.installed_parts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.") From 422ddb19c4eddc7d0501498b7dec6b4515cef134 Mon Sep 17 00:00:00 2001 From: fallcon Date: Mon, 5 Feb 2024 09:54:10 -0600 Subject: [PATCH 086/206] see how this goes --- code/modules/unit_tests/gun_crafting.dm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm index 672e3b68b142..ced2cdbc1bd4 100644 --- a/code/modules/unit_tests/gun_crafting.dm +++ b/code/modules/unit_tests/gun_crafting.dm @@ -1,5 +1,11 @@ //Makes sure preinstalled frame parts can be removed an reinstalled /datum/unit_test/gun_crafting/Run() + var/list/guns = typesof(/obj/item/gun) + for(var/gunType in guns) + var/obj/item/gun/G = new gunType // Create an instance of the gun + if(G.magazine) // If the gun has a magazine + TEST_FAIL("Gun: [G.type], Magazine: [G.magazine.type], Caliber: [G.magazine.caliber]") +/* var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) for(var/frame_type in subtypesof(/obj/item/part/gun/frame)) var/obj/item/part/gun/frame/frame = new frame_type @@ -8,5 +14,4 @@ frame.eject_item(installedPart, human) frame.handle_part(installedPart, human) TEST_ASSERT_EQUAL(frame_parts, frame.installed_parts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.") - - +*/ From 0ffb50f3aaf988a0cab769680ac53a155573979f Mon Sep 17 00:00:00 2001 From: fallcon Date: Mon, 5 Feb 2024 09:59:49 -0600 Subject: [PATCH 087/206] ballistic --- code/modules/unit_tests/gun_crafting.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm index ced2cdbc1bd4..eaf315fc3370 100644 --- a/code/modules/unit_tests/gun_crafting.dm +++ b/code/modules/unit_tests/gun_crafting.dm @@ -1,9 +1,9 @@ //Makes sure preinstalled frame parts can be removed an reinstalled /datum/unit_test/gun_crafting/Run() - var/list/guns = typesof(/obj/item/gun) + var/list/guns = typesof(/obj/item/gun/ballistic) for(var/gunType in guns) - var/obj/item/gun/G = new gunType // Create an instance of the gun - if(G.magazine) // If the gun has a magazine + var/obj/item/gun/ballistic/G = new gunType + if(G.magazine) TEST_FAIL("Gun: [G.type], Magazine: [G.magazine.type], Caliber: [G.magazine.caliber]") /* var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) From e54f627cebcd8a44f7081df91b3474d11f4af111 Mon Sep 17 00:00:00 2001 From: fallcon Date: Mon, 5 Feb 2024 10:39:15 -0600 Subject: [PATCH 088/206] cruft guns --- .../lavaland_surface_fuckedupandevilclub.dmm | 4 +- .../game/objects/items/storage/uplink_kits.dm | 3 - code/modules/antagonists/cult/blood_magic.dm | 14 +---- code/modules/antagonists/cult/cult_items.dm | 41 -------------- .../antagonists/wizard/equipment/spellbook.dm | 12 ---- code/modules/cargo/exports/lavaland.dm | 1 - .../living/simple_animal/hostile/stickman.dm | 2 - .../projectiles/ammunition/special/magic.dm | 3 - .../boxes_magazines/internal/rifle.dm | 7 --- .../projectiles/guns/ballistic/pistol.dm | 24 -------- .../projectiles/guns/ballistic/revolver.dm | 24 -------- .../projectiles/guns/ballistic/rifle.dm | 56 ------------------- .../research/designs/weapon_designs.dm | 8 --- .../spells/spell_types/infinite_guns.dm | 27 --------- code/modules/unit_tests/gun_crafting.dm | 4 +- code/modules/uplink/uplink_items.dm | 8 --- shiptest.dme | 1 - 17 files changed, 4 insertions(+), 235 deletions(-) delete mode 100644 code/modules/spells/spell_types/infinite_guns.dm diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_fuckedupandevilclub.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_fuckedupandevilclub.dmm index 98488b286f8d..f8ee293334ce 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_fuckedupandevilclub.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_fuckedupandevilclub.dmm @@ -261,9 +261,7 @@ /area/ruin/unpowered) "ro" = ( /obj/structure/table/wood/poker, -/obj/item/gun/ballistic/revolver/russian/soul{ - name = "Nar'Siean revolver" - }, +/obj/item/gun/ballistic/revolver, /turf/open/floor/plasteel/cult, /area/ruin/unpowered) "ru" = ( diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 6b3658b523df..f767361415f1 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -526,9 +526,6 @@ for(var/i in 1 to 3) new/obj/item/grenade/chem_grenade/ez_clean(src) -/obj/item/storage/box/hug/reverse_revolver/PopulateContents() - new /obj/item/gun/ballistic/revolver/reverse(src) - /obj/item/storage/box/syndie_kit/mimery/PopulateContents() new /obj/item/book/granter/spell/mimery_blockade(src) new /obj/item/book/granter/spell/mimery_guns(src) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 26f0bb1d81ea..6bfccc48524d 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -812,7 +812,7 @@ /obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user) if(iscultist(user)) - var/list/options = list("Blood Spear (150)", "Blood Bolt Barrage (300)", "Blood Beam (500)") + var/list/options = list("Blood Spear (150)", "Blood Beam (500)") var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options if(!choice) to_chat(user, "You decide against conducting a greater blood rite.") @@ -835,18 +835,6 @@ user.visible_message( "A [rite.name] appears at [user]'s feet!", \ "A [rite.name] materializes at your feet.") - if("Blood Bolt Barrage (300)") - if(uses < BLOOD_BARRAGE_COST) - to_chat(user, "You need [BLOOD_BARRAGE_COST] charges to perform this rite.") - else - var/obj/rite = new /obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage/blood() - uses -= BLOOD_BARRAGE_COST - qdel(src) - if(user.put_in_hands(rite)) - to_chat(user, "Your hands glow with power!") - else - to_chat(user, "You need a free hand for this rite!") - qdel(rite) if("Blood Beam (500)") if(uses < BLOOD_BEAM_COST) to_chat(user, "You need [BLOOD_BEAM_COST] charges to perform this rite.") diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index b09b7d989758..6f2de1c0fdda 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -703,47 +703,6 @@ L.visible_message("An unseen force pulls the blood spear from [L]'s hands!") spear.throw_at(owner, 10, 2, owner) - -/obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage/blood - name = "blood bolt barrage" - desc = "Blood for blood." - color = "#ff0000" - guns_left = 24 - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood - fire_sound = 'sound/magic/wand_teleport.ogg' - - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood - ammo_type = /obj/item/ammo_casing/magic/arcane_barrage/blood - -/obj/item/ammo_casing/magic/arcane_barrage/blood - projectile_type = /obj/projectile/magic/arcane_barrage/blood - firing_effect_type = /obj/effect/temp_visual/cult/sparks - -/obj/projectile/magic/arcane_barrage/blood - name = "blood bolt" - icon_state = "mini_leaper" - nondirectional_sprite = TRUE - damage_type = BRUTE - impact_effect_type = /obj/effect/temp_visual/dir_setting/bloodsplatter - -/obj/projectile/magic/arcane_barrage/blood/Bump(atom/target) - var/turf/T = get_turf(target) - playsound(T, 'sound/effects/splat.ogg', 50, TRUE) - if(iscultist(target)) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.stat != DEAD) - H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 4) - if(isshade(target) || isconstruct(target)) - var/mob/living/simple_animal/M = target - if(M.health+5 < M.maxHealth) - M.adjustHealth(-5) - new /obj/effect/temp_visual/cult/sparks(T) - qdel(src) - else - ..() - /obj/item/blood_beam name = "\improper magical aura" desc = "Sinister looking aura that distorts the flow of reality around it." diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 58e397a64d40..cf85a922dbb6 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -223,18 +223,6 @@ . = ..() REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "lightning_bolt_spell") -/datum/spellbook_entry/infinite_guns - name = "Lesser Summon Guns" - spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun - cost = 3 - no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - -/datum/spellbook_entry/arcane_barrage - name = "Arcane Barrage" - spell_type = /obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - cost = 3 - no_coexistance_typecache = /obj/effect/proc_holder/spell/targeted/infinite_guns/gun - /datum/spellbook_entry/barnyard name = "Barnyard Curse" spell_type = /obj/effect/proc_holder/spell/pointed/barnyardcurse diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index b6920bb419bf..804f1fcb5e59 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -25,7 +25,6 @@ /obj/item/clothing/shoes/clown_shoes/banana_shoes, /obj/item/gun/magic/staff/honk, /obj/item/kitchen/knife/envy, - /obj/item/gun/ballistic/revolver/russian/soul, /obj/item/veilrender/vealrender, /obj/item/nullrod/scythe/talking/necro, /obj/item/clothing/suit/armor/ascetic) diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm index 1eb03b07650c..1f3f176c10ec 100644 --- a/code/modules/mob/living/simple_animal/hostile/stickman.dm +++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm @@ -39,8 +39,6 @@ icon_living = "stickmanranged" casingtype = /obj/item/ammo_casing/c45 projectilesound = 'sound/misc/bang.ogg' - loot = list(/obj/item/gun/ballistic/automatic/pistol/stickman) - /mob/living/simple_animal/hostile/stickman/dog name = "Angry Stick Dog" diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index e38df896bed1..4d9aae44329d 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -39,9 +39,6 @@ /obj/item/ammo_casing/magic/spellblade projectile_type = /obj/projectile/magic/spellblade -/obj/item/ammo_casing/magic/arcane_barrage - projectile_type = /obj/projectile/magic/arcane_barrage - /obj/item/ammo_casing/magic/honk projectile_type = /obj/projectile/bullet/honker diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm index b85b223c254b..e410fb94129d 100644 --- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -6,13 +6,6 @@ max_ammo = 5 instant_load = TRUE -/obj/item/ammo_box/magazine/internal/boltaction/enchanted - max_ammo = 1 - ammo_type = /obj/item/ammo_casing/a762_54 - -/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage - ammo_type = /obj/item/ammo_casing/magic/arcane_barrage - /obj/item/ammo_box/magazine/internal/boltaction/solgov name = "SSG-669C internal magazine" ammo_type = /obj/item/ammo_casing/caseless/a858 diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 97974ff341fb..0fe9c2c4855f 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -107,23 +107,6 @@ fire_delay = 2 actions_types = list(/datum/action/item_action/toggle_firemode) -/obj/item/gun/ballistic/automatic/pistol/stickman - name = "flat gun" - desc = "A 2 dimensional gun.. what?" - icon_state = "flatgun" - manufacturer = MANUFACTURER_NONE - -/obj/item/gun/ballistic/automatic/pistol/stickman/pickup(mob/living/user) - SHOULD_CALL_PARENT(0) - to_chat(user, "As you try to pick up [src], it slips out of your grip..") - if(prob(50)) - to_chat(user, "..and vanishes from your vision! Where the hell did it go?") - qdel(src) - user.update_icons() - else - to_chat(user, "..and falls into view. Whew, that was a close one.") - user.dropItemToGround(src) - /obj/item/gun/ballistic/automatic/pistol/commander name = "\improper Commander" desc = "A classic handgun in a tasteful black and stainless steel color scheme. An enamel Nanotrasen logo is set into the grips. Chambered in 9mm." @@ -265,13 +248,6 @@ to_chat(user, "Theres no magazine to replace!") return -/obj/item/gun/ballistic/automatic/pistol/disposable/pizza - name = "pizza disposable gun" - desc = "How horrible. Whoever you point at with this won't be very cheesed to meet you." //this is a warcrime against italians // IF YOU'RE GOING TO DO US DIRTY SPELL IT RIGHT - icon_state = "disposable_pizza" - random_icon = FALSE - custom_materials = list(/datum/material/pizza=2000) - //not technically a pistol but whatever /obj/item/gun/ballistic/derringer name = ".38 Derringer" diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 454a790728d2..5799df8dd3b8 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -305,30 +305,6 @@ user.apply_damage(300, BRUTE, affecting) user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!") -/obj/item/gun/ballistic/revolver/russian/soul - name = "cursed Russian revolver" - desc = "To play with this revolver requires wagering your very soul." - -/obj/item/gun/ballistic/revolver/russian/soul/shoot_self(mob/living/user) - ..() - var/obj/item/soulstone/anybody/revolver/SS = new /obj/item/soulstone/anybody/revolver(get_turf(src)) - if(!SS.transfer_soul("FORCE", user)) //Something went wrong - qdel(SS) - return - user.visible_message("[user.name]'s soul is captured by \the [src]!", "You've lost the gamble! Your soul is forfeit!") - -/obj/item/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course. - clumsy_check = 0 - -/obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user) - if((HAS_TRAIT(user, TRAIT_CLUMSY)) || (user.mind && user.mind.assigned_role == "Clown")) - return ..() - if(process_fire(user, user, FALSE, null, BODY_ZONE_HEAD)) - user.visible_message("[user] somehow manages to shoot [user.p_them()]self in the face!", "You somehow shoot yourself in the face! How the hell?!") - user.emote("scream") - user.drop_all_held_items() - user.Paralyze(80) - /obj/item/gun/ballistic/revolver/srm name = "SRM Standard Issue .357 Revolver" //should have used the pepperbox... desc = "A sturdy, powerful, and reliable revolver utilized by the Saint-Roumain Militia." diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 6506edc4bb1d..b772b7803185 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -53,10 +53,6 @@ . = ..() . += "The bolt is [bolt_locked ? "open" : "closed"]." -/////////////////////// -// BOLT ACTION RIFLE // -/////////////////////// - /obj/item/gun/ballistic/rifle/boltaction name = "\improper Illestren Hunting Rifle" desc = "One of Hunter's Pride most successful firearms. The bolt-action is popular among colonists, pirates, snipers, and countless more. Chambered in 7.62x54." @@ -119,58 +115,6 @@ manufacturer = MANUFACTURER_HUNTERSPRIDE -/obj/item/gun/ballistic/rifle/boltaction/enchanted - name = "enchanted bolt-action rifle" - desc = "Careful not to lose your head." - var/guns_left = 30 - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted - can_be_sawn_off = FALSE - manufacturer = MANUFACTURER_NONE - -/obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage - name = "arcane barrage" - desc = "Pew Pew Pew." - fire_sound = 'sound/weapons/emitter.ogg' - pin = /obj/item/firing_pin/magic - icon = 'icons/obj/guns/projectile.dmi' - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - icon_state = "arcane_barrage" - item_state = "arcane_barrage" - slot_flags = null - can_bayonet = FALSE - item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NOBLUDGEON - flags_1 = NONE - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - - mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage - -/obj/item/gun/ballistic/rifle/boltaction/enchanted/dropped() - . = ..() - guns_left = 0 - -/obj/item/gun/ballistic/rifle/boltaction/enchanted/proc/discard_gun(mob/living/user) - user.throw_item(pick(oview(7,get_turf(user)))) - -/obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage/discard_gun(mob/living/user) - qdel(src) - -/obj/item/gun/ballistic/rifle/boltaction/enchanted/attack_self() - return - -/obj/item/gun/ballistic/rifle/boltaction/enchanted/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - . = ..() - if(!.) - return - if(guns_left) - var/obj/item/gun/ballistic/rifle/boltaction/enchanted/gun = new type - gun.guns_left = guns_left - 1 - discard_gun(user) - user.swap_hand() - user.put_in_hands(gun) - else - user.dropItemToGround(src, TRUE) - /obj/item/gun/ballistic/rifle/boltaction/polymer name = "polymer survivor rifle" desc = "A bolt-action rifle made of scrap, desperation, and luck. Likely to shatter at any moment. Chambered in .300 Blackout." diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 2ac4359e2bf8..b3252b9d86ca 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -679,14 +679,6 @@ build_path = /obj/item/gun/ballistic/automatic/pistol/disposable category = list("Imported") -/datum/design/pizza_disposable_gun - name = "Pizza Disposable Gun" - id = "disposable_pizza" - build_type = AUTOLATHE - materials = list(/datum/material/pizza = 4000) - build_path = /obj/item/gun/ballistic/automatic/pistol/disposable/pizza - category = list("Imported") - //SRM Ballistics /datum/design/doublebarrel name = "Double Barrel Shotgun" diff --git a/code/modules/spells/spell_types/infinite_guns.dm b/code/modules/spells/spell_types/infinite_guns.dm deleted file mode 100644 index d3361284814a..000000000000 --- a/code/modules/spells/spell_types/infinite_guns.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/infinite_guns - name = "Lesser Summon Guns" - desc = "Why reload when you have infinite guns? Summons an unending stream of bolt action rifles that deal little damage, but will knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Arcane Barrage." - invocation_type = "none" - include_user = TRUE - range = -1 - - school = "conjuration" - charge_max = 750 - clothes_req = TRUE - cooldown_min = 10 //Gun wizard - action_icon_state = "bolt_action" - var/summon_path = /obj/item/gun/ballistic/rifle/boltaction/enchanted - -/obj/effect/proc_holder/spell/targeted/infinite_guns/cast(list/targets, mob/user = usr) - for(var/mob/living/carbon/C in targets) - C.drop_all_held_items() - var/GUN = new summon_path - C.put_in_hands(GUN) - -/obj/effect/proc_holder/spell/targeted/infinite_guns/gun - -/obj/effect/proc_holder/spell/targeted/infinite_guns/arcane_barrage - name = "Arcane Barrage" - desc = "Fire a torrent of arcane energy at your foes with this (powerful) spell. Deals much more damage than Lesser Summon Guns, but won't knock targets down. Requires both hands free to use. Learning this spell makes you unable to learn Lesser Summon Gun." - action_icon_state = "arcane_barrage" - summon_path = /obj/item/gun/ballistic/rifle/boltaction/enchanted/arcane_barrage diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm index eaf315fc3370..3dc74430681c 100644 --- a/code/modules/unit_tests/gun_crafting.dm +++ b/code/modules/unit_tests/gun_crafting.dm @@ -1,11 +1,12 @@ //Makes sure preinstalled frame parts can be removed an reinstalled /datum/unit_test/gun_crafting/Run() +/* var/list/guns = typesof(/obj/item/gun/ballistic) for(var/gunType in guns) var/obj/item/gun/ballistic/G = new gunType if(G.magazine) TEST_FAIL("Gun: [G.type], Magazine: [G.magazine.type], Caliber: [G.magazine.caliber]") -/* +*/ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) for(var/frame_type in subtypesof(/obj/item/part/gun/frame)) var/obj/item/part/gun/frame/frame = new frame_type @@ -14,4 +15,3 @@ frame.eject_item(installedPart, human) frame.handle_part(installedPart, human) TEST_ASSERT_EQUAL(frame_parts, frame.installed_parts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.") -*/ diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 53b49ab30f0b..40b382faf358 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1952,14 +1952,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/reverse_bear_trap restricted_roles = list("Clown") -/datum/uplink_item/role_restricted/reverse_revolver - name = "Reverse Revolver" - desc = "A revolver that always fires at its user. \"Accidentally\" drop your weapon, then watch as the greedy corporate pigs blow their own brains all over the wall. \ - The revolver itself is actually real. Only clumsy people, and clowns, can fire it normally. Comes in a box of hugs. Honk." - cost = 14 - item = /obj/item/storage/box/hug/reverse_revolver - restricted_roles = list("Clown") - /datum/uplink_item/role_restricted/clownpin name = "Ultra Hilarious Firing Pin" desc = "A firing pin that, when inserted into a gun, makes that gun only usable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it." diff --git a/shiptest.dme b/shiptest.dme index f1c0517dbdd3..e4eb0b858cd7 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -3278,7 +3278,6 @@ #include "code\modules\spells\spell_types\forcewall.dm" #include "code\modules\spells\spell_types\genetic.dm" #include "code\modules\spells\spell_types\godhand.dm" -#include "code\modules\spells\spell_types\infinite_guns.dm" #include "code\modules\spells\spell_types\inflict_handler.dm" #include "code\modules\spells\spell_types\knock.dm" #include "code\modules\spells\spell_types\lichdom.dm" From 30277b30f065dbb19c7f15427f5d43fcac3bad28 Mon Sep 17 00:00:00 2001 From: fallcon Date: Mon, 5 Feb 2024 12:28:05 -0600 Subject: [PATCH 089/206] kills pins --- .../BeachRuins/beach_ancient_ruin.dmm | 5 +- .../icemoon_surface_corporate_rejects.dmm | 1 - .../RandomRuins/JungleRuins/jungle_demon.dmm | 2 +- .../RockRuins/rockplanet_budgetcuts.dmm | 3 - .../RockRuins/rockplanet_harmfactory.dmm | 2 +- .../RandomRuins/SpaceRuins/provinggrounds.dmm | 2 +- .../SpaceRuins/singularity_lab.dmm | 4 +- .../WasteRuins/wasteplanet_pandora.dmm | 2 +- _maps/map_files/generic/CentCom.dmm | 2 +- .../independent/independent_halftrack.dmm | 12 +- .../shuttles/independent/independent_nemo.dmm | 1 - .../minutemen/minutemen_asclepius.dmm | 1 - .../shuttles/minutemen/minutemen_cepheus.dmm | 4 - .../shuttles/nanotrasen/nanotrasen_heron.dmm | 6 +- _maps/shuttles/pirate/pirate_noderider.dmm | 2 +- .../syndicate/syndicate_gorlex_komodo.dmm | 4 +- .../syndicate/syndicate_luxembourg.dmm | 2 +- code/game/gamemodes/clown_ops/clown_ops.dm | 1 - code/game/objects/items/storage/boxes.dm | 29 -- .../game/objects/items/storage/uplink_kits.dm | 13 +- code/game/objects/structures/salvaging.dm | 4 +- .../abductor/equipment/abduction_gear.dm | 11 - .../awaymissions/mission_code/snowdin.dm | 2 +- .../clothing/outfits/ert/nanotrasen_ert.dm | 8 +- code/modules/clothing/outfits/standard.dm | 2 +- code/modules/mining/abandoned_crates.dm | 6 +- .../hostile/mining_mobs/hivelord.dm | 2 +- code/modules/projectiles/gun.dm | 71 ---- .../projectiles/guns/ballistic/automatic.dm | 1 - .../projectiles/guns/ballistic/launchers.dm | 9 - .../projectiles/guns/ballistic/revolver.dm | 1 - .../projectiles/guns/ballistic/rifle.dm | 1 - .../projectiles/guns/ballistic/shotgun.dm | 9 - .../modules/projectiles/guns/ballistic/smg.dm | 14 +- .../modules/projectiles/guns/ballistic/toy.dm | 25 +- .../projectiles/guns/energy/energy_gun.dm | 3 - code/modules/projectiles/guns/energy/laser.dm | 6 - code/modules/projectiles/guns/energy/pulse.dm | 26 -- .../projectiles/guns/energy/special.dm | 5 - .../projectiles/guns/misc/beam_rifle.dm | 1 - code/modules/projectiles/pins.dm | 343 ------------------ code/modules/vending/liberation.dm | 2 +- code/modules/vending/liberation_toy.dm | 10 +- code/modules/vending/security.dm | 6 +- code/modules/vending/toys.dm | 10 +- shiptest.dme | 1 - 46 files changed, 53 insertions(+), 624 deletions(-) delete mode 100644 code/modules/projectiles/pins.dm diff --git a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm index b67667e26c69..be52f6a67f46 100644 --- a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm @@ -374,11 +374,8 @@ }, /obj/item/gun/energy/lasercannon{ pixel_y = 5; - pin = /obj/item/firing_pin - }, -/obj/item/gun/energy/lasercannon{ - pin = /obj/item/firing_pin }, +/obj/item/gun/energy/lasercannon, /obj/effect/turf_decal/industrial/hatch, /turf/open/floor/plasteel/mono, /area/ruin/beach/complex) diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm index d518df47dc6e..e9e2fc7531a6 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm @@ -1327,7 +1327,6 @@ "En" = ( /obj/item/gun/ballistic/automatic/smg/proto, /obj/structure/rack, -/obj/item/firing_pin, /turf/open/floor/vault, /area/ruin/unpowered/corprejectvault) "Er" = ( diff --git a/_maps/RandomRuins/JungleRuins/jungle_demon.dmm b/_maps/RandomRuins/JungleRuins/jungle_demon.dmm index adbb037af38c..006770d3b37c 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_demon.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_demon.dmm @@ -296,7 +296,7 @@ /area/ruin/powered) "yM" = ( /obj/structure/table/reinforced, -/obj/item/gun/ballistic/shotgun/bulldog/unrestricted, +/obj/item/gun/ballistic/shotgun/bulldog, /turf/open/floor/plasteel/dark, /area/ruin/powered) "AB" = ( diff --git a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm index 9cf2b5a40bae..7de5ce9c1b05 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm @@ -2602,9 +2602,6 @@ /obj/structure/railing{ dir = 4 }, -/obj/item/firing_pin{ - pixel_y = 6 - }, /turf/open/floor/plasteel, /area/ruin/powered) "Tl" = ( diff --git a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm index 9b5adb277fa8..48f7614da429 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm @@ -251,7 +251,7 @@ /area/ruin/powered) "ga" = ( /obj/structure/table/wood/reinforced, -/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot{ +/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot{ pixel_x = 5; pixel_y = 7 }, diff --git a/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm b/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm index c43ba0812698..842385176784 100644 --- a/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm +++ b/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm @@ -1924,7 +1924,7 @@ "XA" = ( /obj/structure/rack, /obj/item/ammo_box/foambox/riot, -/obj/item/gun/ballistic/automatic/toy/pistol/riot/unrestricted, +/obj/item/gun/ballistic/automatic/toy/pistol/riot, /obj/structure/cable{ icon_state = "1-2" }, diff --git a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm index 486cbbce85fd..3b39d4b1025d 100644 --- a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm +++ b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm @@ -9132,7 +9132,7 @@ /obj/item/clothing/under/rank/rnd/scientist, /obj/item/clothing/shoes/sneakers/white, /obj/effect/gibspawner, -/obj/item/gun/energy/lasercannon/unrestricted{ +/obj/item/gun/energy/lasercannon{ desc = "An advanced laser cannon, a laser etched inscription in the handle states 'NT-LS-1013'. The casing is made of a lightweight alloy."; icon_state = "pulse"; name = "NT-LS-1013" @@ -10940,7 +10940,7 @@ "PZ" = ( /obj/effect/turf_decal/box, /obj/machinery/light/directional/north, -/obj/item/gun/energy/lasercannon/unrestricted{ +/obj/item/gun/energy/lasercannon{ desc = "An advanced laser cannon, a laser etched inscription in the handle states 'NT-LS-1013'. The casing is made of a lightweight alloy."; icon_state = "pulse"; name = "NT-LS-1013" diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm index 83249514118f..8a63378ced3c 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm @@ -798,7 +798,7 @@ /turf/open/floor/wood/waste, /area/ruin/wasteplanet) "Fn" = ( -/obj/item/gun/ballistic/automatic/smg/proto/unrestricted{ +/obj/item/gun/ballistic/automatic/smg/proto{ pixel_y = -18 }, /obj/item/ammo_casing/spent{ diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index e2b1ff97158c..bb0626e5c681 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -5333,7 +5333,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "aUp" = ( -/obj/item/gun/energy/pulse/carbine/loyalpin, +/obj/item/gun/energy/pulse/carbine, /obj/item/flashlight/seclite, /obj/structure/table/reinforced, /obj/machinery/airalarm/directional/south, diff --git a/_maps/shuttles/independent/independent_halftrack.dmm b/_maps/shuttles/independent/independent_halftrack.dmm index f82d26ffd66d..bddb6a328e74 100644 --- a/_maps/shuttles/independent/independent_halftrack.dmm +++ b/_maps/shuttles/independent/independent_halftrack.dmm @@ -218,8 +218,8 @@ /area/ship/maintenance/port) "fT" = ( /obj/structure/closet/secure_closet/security, -/obj/item/gun/ballistic/shotgun/bulldog/unrestricted, -/obj/item/gun/ballistic/shotgun/bulldog/unrestricted, +/obj/item/gun/ballistic/shotgun/bulldog, +/obj/item/gun/ballistic/shotgun/bulldog, /obj/item/gun/ballistic/automatic/hmg/l6_saw, /obj/item/gun/ballistic/automatic/hmg/l6_saw, /obj/item/ammo_box/magazine/m12g/slug, @@ -1600,18 +1600,18 @@ pixel_x = 28; name = "foam gun cabinet" }, -/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted, -/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted, +/obj/item/gun/ballistic/automatic/toy/pistol, +/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy, /obj/item/ammo_box/magazine/toy/m762, /obj/item/ammo_box/magazine/toy/m762, /obj/item/ammo_box/magazine/toy/m762, -/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted, +/obj/item/gun/ballistic/automatic/smg/c20r/toy, /obj/item/ammo_box/magazine/toy/smg, /obj/item/ammo_box/magazine/toy/smg, /obj/item/ammo_box/magazine/toy/smg, /obj/item/ammo_box/foambox, /obj/item/ammo_box/foambox, -/obj/item/gun/ballistic/shotgun/toy/unrestricted, +/obj/item/gun/ballistic/shotgun/toy, /turf/open/floor/plasteel/dark, /area/ship/security/range) "Ob" = ( diff --git a/_maps/shuttles/independent/independent_nemo.dmm b/_maps/shuttles/independent/independent_nemo.dmm index f693cbcbdc27..87a57d6041cd 100644 --- a/_maps/shuttles/independent/independent_nemo.dmm +++ b/_maps/shuttles/independent/independent_nemo.dmm @@ -2176,7 +2176,6 @@ pixel_x = -32; req_access = list(30) }, -/obj/item/firing_pin, /obj/item/kitchen/knife/hunting, /obj/item/gun/ballistic/shotgun/contender, /obj/item/ammo_box/a4570, diff --git a/_maps/shuttles/minutemen/minutemen_asclepius.dmm b/_maps/shuttles/minutemen/minutemen_asclepius.dmm index b2d763063f39..266c08c80661 100644 --- a/_maps/shuttles/minutemen/minutemen_asclepius.dmm +++ b/_maps/shuttles/minutemen/minutemen_asclepius.dmm @@ -10,7 +10,6 @@ dir = 8 }, /obj/item/camera, -/obj/item/firing_pin, /obj/item/folder/red, /obj/item/taperecorder, /turf/open/floor/carpet/red, diff --git a/_maps/shuttles/minutemen/minutemen_cepheus.dmm b/_maps/shuttles/minutemen/minutemen_cepheus.dmm index 9686aff53035..8337fd01738a 100644 --- a/_maps/shuttles/minutemen/minutemen_cepheus.dmm +++ b/_maps/shuttles/minutemen/minutemen_cepheus.dmm @@ -1411,10 +1411,6 @@ pixel_x = 8; pixel_y = -22 }, -/obj/item/firing_pin{ - pixel_x = 3; - pixel_y = -7 - }, /turf/open/floor/plasteel/tech, /area/ship/security) "qk" = ( diff --git a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm index 669e1df22ab8..d93acd364776 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm @@ -3383,13 +3383,13 @@ "mt" = ( /obj/structure/window/reinforced/spawner, /obj/structure/rack, -/obj/item/gun/ballistic/automatic/smg/proto/unrestricted{ +/obj/item/gun/ballistic/automatic/smg/proto{ pixel_y = 3 }, -/obj/item/gun/ballistic/automatic/smg/proto/unrestricted{ +/obj/item/gun/ballistic/automatic/smg/proto{ pixel_y = -2 }, -/obj/item/gun/ballistic/automatic/smg/proto/unrestricted{ +/obj/item/gun/ballistic/automatic/smg/proto{ pixel_y = -7 }, /turf/open/floor/plasteel/tech, diff --git a/_maps/shuttles/pirate/pirate_noderider.dmm b/_maps/shuttles/pirate/pirate_noderider.dmm index e9a28b74cfde..c10e072892df 100644 --- a/_maps/shuttles/pirate/pirate_noderider.dmm +++ b/_maps/shuttles/pirate/pirate_noderider.dmm @@ -1037,7 +1037,7 @@ /obj/item/gun/energy/laser/iot, /obj/item/gun/energy/laser/iot, /obj/item/gun/energy/e_gun/smg, -/obj/item/gun/energy/lasercannon/unrestricted, +/obj/item/gun/energy/lasercannon, /obj/item/melee/baton/loaded, /obj/item/melee/baton/loaded, /turf/open/floor/plasteel/tech, diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm index 3da232da75dc..68ee81cb02f2 100644 --- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm +++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm @@ -981,8 +981,8 @@ /obj/structure/railing{ dir = 4 }, -/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted, -/obj/item/gun/ballistic/shotgun/bulldog/unrestricted, +/obj/item/gun/ballistic/automatic/smg/c20r, +/obj/item/gun/ballistic/shotgun/bulldog, /turf/open/floor/pod/dark, /area/ship/security/armory) "jh" = ( diff --git a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm index 6dde77123cba..cff4c84386e0 100644 --- a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm +++ b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm @@ -831,7 +831,7 @@ /obj/structure/closet/crate/wooden/toy, /obj/item/ammo_box/magazine/toy/smgm45/riot, /obj/item/ammo_box/magazine/toy/smgm45/riot, -/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot, +/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot, /obj/item/soap/syndie, /obj/item/soap/syndie, /obj/item/soap/syndie, diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm index 5017b1d38c06..23500e032ee5 100644 --- a/code/game/gamemodes/clown_ops/clown_ops.dm +++ b/code/game/gamemodes/clown_ops/clown_ops.dm @@ -40,7 +40,6 @@ backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ /obj/item/kitchen/knife/combat/survival, /obj/item/dnainjector/clumsymut, //in case you want to be clumsy for the memes - /obj/item/storage/box/syndie_kit/clownpins, //for any guns that you get your grubby little clown op mitts on /obj/item/reagent_containers/spray/waterflower/lube) implants = list(/obj/item/implant/sad_trombone) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 7b1710cd8960..7ac8e822eeaf 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -607,35 +607,6 @@ for(var/i in 1 to 6) new /obj/item/cartridge/security(src) -/obj/item/storage/box/firingpins - name = "box of standard firing pins" - desc = "A box full of standard firing pins, to allow newly-developed firearms to operate." - icon_state = "secbox" - illustration = "firingpin" - -/obj/item/storage/box/firingpins/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/firing_pin(src) - -/obj/item/storage/box/firingpins/paywall - name = "box of paywall firing pins" - desc = "A box full of paywall firing pins, to allow newly-developed firearms to operate behind a custom-set paywall." - illustration = "firingpin" - -/obj/item/storage/box/firingpins/paywall/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/firing_pin/paywall(src) - -/obj/item/storage/box/lasertagpins - name = "box of laser tag firing pins" - desc = "A box full of laser tag firing pins, to allow newly-developed firearms to require wearing brightly coloured plastic armor before being able to be used." - illustration = "firingpin" - -/obj/item/storage/box/lasertagpins/PopulateContents() - for(var/i in 1 to 3) - new /obj/item/firing_pin/tag/red(src) - new /obj/item/firing_pin/tag/blue(src) - /obj/item/storage/box/handcuffs name = "box of spare handcuffs" desc = "A box full of handcuffs." diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 6b3658b523df..cc070ba21d5c 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -108,7 +108,7 @@ if("metaops") new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc - new /obj/item/gun/ballistic/shotgun/bulldog/unrestricted(src) // 8 tc + new /obj/item/gun/ballistic/shotgun/bulldog(src) // 8 tc new /obj/item/implanter/explosive(src) // 2 tc new /obj/item/ammo_box/magazine/m12g(src) // 2 tc new /obj/item/ammo_box/magazine/m12g(src) // 2 tc @@ -165,7 +165,7 @@ new /obj/item/assembly/signaler(src) // 0 tc new /obj/item/storage/toolbox/syndicate(src) // 1 tc new /obj/item/pen/edagger(src) - new /obj/item/gun/energy/decloner/unrestricted(src) + new /obj/item/gun/energy/decloner(src) if("bee") new /obj/item/paper/fluff/bee_objectives(src) // 0 tc (motivation) @@ -306,7 +306,7 @@ /obj/item/storage/box/syndie_kit/imp_radio, /obj/item/storage/box/syndie_kit/imp_uplink, /obj/item/clothing/gloves/krav_maga/combatglovesplus, - /obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot, + /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot, /obj/item/reagent_containers/hypospray/medipen/stimulants, /obj/item/storage/box/syndie_kit/imp_freedom, /obj/item/toy/eightball/haunted @@ -370,13 +370,6 @@ for(var/i in 1 to 7) new /obj/item/reagent_containers/syringe/bioterror(src) -/obj/item/storage/box/syndie_kit/clownpins - name = "ultra hilarious firing pin box" - -/obj/item/storage/box/syndie_kit/clownpins/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/firing_pin/clown/ultra(src) - /obj/item/storage/box/syndie_kit/imp_adrenal name = "adrenal implant box" diff --git a/code/game/objects/structures/salvaging.dm b/code/game/objects/structures/salvaging.dm index 3d90a25a1013..1a2cdcba9925 100644 --- a/code/game/objects/structures/salvaging.dm +++ b/code/game/objects/structures/salvaging.dm @@ -584,8 +584,8 @@ ) /obj/effect/spawner/lootdrop/random_gun_protolathe_lootdrop loot = list( - /obj/item/gun/energy/lasercannon/unrestricted = 1, - /obj/item/gun/ballistic/automatic/smg/proto/unrestricted = 1, + /obj/item/gun/energy/lasercannon = 1, + /obj/item/gun/ballistic/automatic/smg/proto = 1, /obj/item/gun/energy/temperature/security = 1, ) /obj/effect/spawner/lootdrop/random_ammo_protolathe_lootdrop diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 9a5b95d21184..5efddfb3cf8c 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -369,21 +369,10 @@ to_chat(user, "You send the message to your target.") log_directed_talk(user, L, message, LOG_SAY, "abductor whisper") - -/obj/item/firing_pin/abductor - name = "alien firing pin" - icon_state = "firing_pin_ayy" - desc = "This firing pin is slimy and warm; you can swear you feel it constantly trying to mentally probe you." - fail_message = "Firing error, please contact Command." - -/obj/item/firing_pin/abductor/pin_auth(mob/living/user) - . = isabductor(user) - /obj/item/gun/energy/alien name = "alien pistol" desc = "A complicated gun that fires bursts of high-intensity radiation." ammo_type = list(/obj/item/ammo_casing/energy/declone) - pin = /obj/item/firing_pin/abductor icon_state = "alienpistol" item_state = "alienpistol" trigger_guard = TRIGGER_GUARD_ALLOW_ALL diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index f5cfc93c6eee..c8214de7c65f 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -513,7 +513,7 @@ /obj/item/organ/brain/alien = 17, /obj/item/dualsaber = 15, /obj/item/organ/heart/demon = 7, - /obj/item/gun/ballistic/automatic/smg/c20r/unrestricted = 16, + /obj/item/gun/ballistic/automatic/smg/c20r = 16, /obj/item/gun/magic/wand/resurrection/inert = 15, /obj/item/gun/magic/wand/resurrection = 10, /obj/item/uplink/old = 2, diff --git a/code/modules/clothing/outfits/ert/nanotrasen_ert.dm b/code/modules/clothing/outfits/ert/nanotrasen_ert.dm index 2d397b8de828..6864bd6677eb 100644 --- a/code/modules/clothing/outfits/ert/nanotrasen_ert.dm +++ b/code/modules/clothing/outfits/ert/nanotrasen_ert.dm @@ -47,7 +47,7 @@ glasses = /obj/item/clothing/glasses/thermal/eyepatch backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ - /obj/item/gun/energy/pulse/pistol/loyalpin=1) + /obj/item/gun/energy/pulse/pistol=1) l_pocket = /obj/item/melee/transforming/energy/sword/saber /datum/outfit/centcom/ert/security @@ -77,7 +77,7 @@ /datum/outfit/centcom/ert/security/alert name = "ERT Security - High Alert" - suit_store = /obj/item/gun/energy/pulse/carbine/loyalpin + suit_store = /obj/item/gun/energy/pulse/carbine mask = /obj/item/clothing/mask/gas/sechailer/swat backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/storage/box/handcuffs=1,\ @@ -114,7 +114,7 @@ mask = /obj/item/clothing/mask/gas/sechailer/swat backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ - /obj/item/gun/energy/pulse/pistol/loyalpin=1,\ + /obj/item/gun/energy/pulse/pistol=1,\ /obj/item/reagent_containers/hypospray/combat/nanites=1,\ /obj/item/gun/medbeam=1) @@ -150,7 +150,7 @@ mask = /obj/item/clothing/mask/gas/sechailer/swat backpack_contents = list(/obj/item/storage/box/survival/engineer=1,\ /obj/item/melee/baton/loaded=1,\ - /obj/item/gun/energy/pulse/pistol/loyalpin=1,\ + /obj/item/gun/energy/pulse/pistol=1,\ /obj/item/construction/rcd/combat=1) // official diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 72127bbaf7df..55587dedac5b 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -162,7 +162,7 @@ r_pocket = /obj/item/shield/energy suit_store = /obj/item/tank/internals/emergency_oxygen/double belt = /obj/item/gun/ballistic/revolver/mateba - r_hand = /obj/item/gun/energy/pulse/loyalpin + r_hand = /obj/item/gun/energy/pulse id = /obj/item/card/id/ert/deathsquad ears = /obj/item/radio/headset/headset_cent/alt diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 140b87c1707f..b6058b596444 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -229,9 +229,9 @@ for(var/i in 1 to 4) new /obj/item/clothing/mask/balaclava(src) new /obj/item/gun/ballistic/shotgun/toy(src) - new /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted(src) - new /obj/item/gun/ballistic/automatic/toy/unrestricted(src) - new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted(src) + new /obj/item/gun/ballistic/automatic/toy/pistol(src) + new /obj/item/gun/ballistic/automatic/toy(src) + new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy(src) new /obj/item/ammo_box/foambox(src) if(98) for(var/i in 1 to 3) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 474c9c5d9ca6..bea421014108 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -744,7 +744,7 @@ else back = pickweight(list( /obj/item/energyhalberd = 5, - /obj/item/gun/ballistic/rocketlauncher/unrestricted = 5 + /obj/item/gun/ballistic/rocketlauncher = 5 ) ) if(prob(25)) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index b64e76d1f075..4402a88ead17 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,6 +1,5 @@ #define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6 -#define FIRING_PIN_REMOVAL_DELAY 50 #define MANUFACTURER_NONE null #define MANUFACTURER_SHARPLITE "the Sharplite Defense logo" @@ -49,7 +48,6 @@ var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' var/suppressed_volume = 60 var/can_unsuppress = TRUE - var/clumsy_check = TRUE var/obj/item/ammo_casing/chambered = null trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers var/sawn_desc = null //description change if weapon is sawn-off @@ -68,7 +66,6 @@ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' var/list/attachment_options = list() //This.. works for now.. gun refactor soon - var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one. var/obj/item/flashlight/seclite/gun_light @@ -138,8 +135,6 @@ . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) - if(pin) - pin = new pin(src) if(gun_light) alight = new(src) muzzle_flash = new(src, muzzleflash_iconstate) @@ -173,8 +168,6 @@ user.remove_movespeed_modifier(/datum/movespeed_modifier/gun) /obj/item/gun/Destroy() - if(isobj(pin)) //Can still be the initial path, then we skip - QDEL_NULL(pin) if(gun_light) QDEL_NULL(gun_light) if(bayonet) @@ -190,8 +183,6 @@ return ..() /obj/item/gun/handle_atom_del(atom/A) - if(A == pin) - pin = null if(A == chambered) chambered = null update_appearance() @@ -203,12 +194,6 @@ /obj/item/gun/examine(mob/user) . = ..() - if(pin) - . += "It has \a [pin] installed." - . += "[pin] looks like it could be removed with some tools." - else - . += "It doesn't have a firing pin installed, and won't fire." - if(gun_light) . += "It has \a [gun_light] [can_flashlight ? "" : "permanently "]mounted on it." if(can_flashlight) //if it has a light and this is false, the light is permanent. @@ -361,22 +346,6 @@ user.dropItemToGround(src, TRUE) return TRUE -/obj/item/gun/can_trigger_gun(mob/living/user) - . = ..() - if(!handle_pins(user)) - return FALSE - -/obj/item/gun/proc/handle_pins(mob/living/user) - if(pin) - if(pin.pin_auth(user) || (pin.obj_flags & EMAGGED)) - return TRUE - else - pin.auth_fail(user) - return FALSE - else - to_chat(user, "[src]'s trigger is locked. This weapon doesn't have a firing pin installed!") - return FALSE - /obj/item/gun/proc/recharge_newshot() return @@ -571,40 +540,6 @@ else if(picked_option == "Knife") return remove_gun_attachment(user, I, bayonet, "unfix") -/obj/item/gun/welder_act(mob/living/user, obj/item/I) - . = ..() - if(.) - return - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - if(pin && user.is_holding(src)) - user.visible_message("[user] attempts to remove [pin] from [src] with [I].", - "You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)", null, 3) - if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, 5, volume = 50)) - if(!pin) //check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay - return - user.visible_message("[pin] is spliced out of [src] by [user], melting part of the pin in the process.", - "You splice [pin] out of [src] with [I], melting part of the pin in the process.", null, 3) - QDEL_NULL(pin) - return TRUE - -/obj/item/gun/wirecutter_act(mob/living/user, obj/item/I) - . = ..() - if(.) - return - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - if(pin && user.is_holding(src)) - user.visible_message("[user] attempts to remove [pin] from [src] with [I].", - "You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)", null, 3) - if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, volume = 50)) - if(!pin) //check to see if the pin is still there, or we can spam messages by clicking multiple times during the tool delay - return - user.visible_message("[pin] is ripped out of [src] by [user], mangling the pin in the process.", - "You rip [pin] out of [src] with [I], mangling the pin in the process.", null, 3) - QDEL_NULL(pin) - return TRUE - /obj/item/gun/proc/remove_gun_attachment(mob/living/user, obj/item/tool_item, obj/item/item_to_remove, removal_verb) if(tool_item) tool_item.play_tool_sound(src) @@ -772,11 +707,6 @@ process_fire(target, user, TRUE, params, BODY_ZONE_HEAD) -/obj/item/gun/proc/unlock() //used in summon guns and as a convience for admins - if(pin) - qdel(pin) - pin = new /obj/item/firing_pin - //Happens before the actual projectile creation /obj/item/gun/proc/before_firing(atom/target,mob/user) return @@ -942,5 +872,4 @@ azoom = new() azoom.gun = src -#undef FIRING_PIN_REMOVAL_DELAY #undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 841e36927cb5..2b4741d5593a 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -91,7 +91,6 @@ desc = "A heavily-modified .50 BMG anti-material rifle utilized by Syndicate agents. Requires both hands to fire." can_suppress = TRUE can_unsuppress = TRUE - pin = /obj/item/firing_pin/implant/pindicate // Old Semi-Auto Rifle // diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index c7d73c5459bc..061f256229a1 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -9,13 +9,9 @@ mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg' w_class = WEIGHT_CLASS_NORMAL - pin = /obj/item/firing_pin/implant/pindicate bolt_type = BOLT_TYPE_NO_BOLT fire_delay = 10 -/obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, params) ..() if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing)) @@ -27,7 +23,6 @@ icon = 'icons/mecha/mecha_equipment.dmi' icon_state = "mecha_grenadelnchr" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenademulti - pin = /obj/item/firing_pin /obj/item/gun/ballistic/revolver/grenadelauncher/cyborg/attack_self() return @@ -53,7 +48,6 @@ load_sound = 'sound/weapons/gun/general/rocket_load.ogg' w_class = WEIGHT_CLASS_BULKY can_suppress = FALSE - pin = /obj/item/firing_pin burst_size = 1 fire_delay = 0 casing_ejector = FALSE @@ -65,9 +59,6 @@ tac_reloads = FALSE manufacturer = MANUFACTURER_SCARBOROUGH -/obj/item/gun/ballistic/rocketlauncher/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/rocketlauncher/afterattack() . = ..() magazine.get_round(FALSE) //Hack to clear the mag after it's fired diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 454a790728d2..57b088fc16b7 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -197,7 +197,6 @@ icon_state = "goldrevolver" fire_sound = 'sound/weapons/resonator_blast.ogg' recoil = 8 - pin = /obj/item/firing_pin manufacturer = MANUFACTURER_NONE /obj/item/gun/ballistic/revolver/nagant diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 6506edc4bb1d..2edda6bb9ecd 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -131,7 +131,6 @@ name = "arcane barrage" desc = "Pew Pew Pew." fire_sound = 'sound/weapons/emitter.ogg' - pin = /obj/item/firing_pin/magic icon = 'icons/obj/guns/projectile.dmi' lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 8d4390398075..a96ef808e695 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -115,9 +115,6 @@ var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine semi_auto = TRUE -/obj/item/gun/ballistic/shotgun/automatic/dual_tube/mindshield - pin = /obj/item/firing_pin/implant/mindshield - /obj/item/gun/ballistic/shotgun/automatic/dual_tube/examine(mob/user) . = ..() . += "Alt-click to pump it." @@ -167,7 +164,6 @@ can_suppress = FALSE burst_size = 1 fire_delay = 0 - pin = /obj/item/firing_pin/implant/pindicate fire_sound = 'sound/weapons/gun/shotgun/shot.ogg' actions_types = list() mag_display = TRUE @@ -188,16 +184,12 @@ wield_slowdown = 0.6 wield_delay = 0.65 SECONDS -/obj/item/gun/ballistic/shotgun/bulldog/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/shotgun/bulldog/inteq name = "\improper Mastiff Shotgun" desc = "A variation of the Bulldog, seized from Syndicate armories by deserting troopers then modified to IRMG's standards." icon_state = "bulldog-inteq" item_state = "bulldog-inteq" mag_type = /obj/item/ammo_box/magazine/m12g - pin = /obj/item/firing_pin manufacturer = MANUFACTURER_INTEQ /obj/item/gun/ballistic/shotgun/bulldog/minutemen @@ -207,7 +199,6 @@ mag_type = /obj/item/ammo_box/magazine/cm15_mag icon_state = "cm15" item_state = "cm15" - pin = /obj/item/firing_pin empty_alarm = FALSE empty_indicator = FALSE special_mags = FALSE diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index 7efd0a579925..696a934e71c4 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -27,9 +27,6 @@ . = ..() AddComponent(/datum/component/automatic_fire, 0.15 SECONDS) -/obj/item/gun/ballistic/automatic/smg/proto/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/automatic/smg/c20r name = "\improper C-20r SMG" desc = "A bullpup .45 SMG, designated 'C-20r'. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp." @@ -49,9 +46,6 @@ . = ..() AddComponent(/datum/component/automatic_fire, 0.15 SECONDS) -/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/automatic/smg/c20r/Initialize() . = ..() update_appearance() @@ -156,7 +150,6 @@ var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel burst_size = 3 fire_delay = 2 - pin = /obj/item/firing_pin/implant/pindicate mag_display = TRUE empty_indicator = TRUE fire_sound = 'sound/weapons/gun/rifle/shot_alt.ogg' @@ -171,12 +164,9 @@ underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src) update_appearance() -/obj/item/gun/ballistic/automatic/smg/m90/unrestricted - pin = /obj/item/firing_pin - -/obj/item/gun/ballistic/automatic/smg/m90/unrestricted/Initialize() +/obj/item/gun/ballistic/automatic/smg/m90/Initialize() . = ..() - underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(src) + underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src) update_appearance() /obj/item/gun/ballistic/automatic/smg/m90/afterattack(atom/target, mob/living/user, flag, params) diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 4ce2819a902e..4d1e7884225c 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -20,9 +20,6 @@ . = ..() . += "[icon_state]_toy" -/obj/item/gun/ballistic/automatic/toy/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/automatic/toy/pistol name = "foam force pistol" desc = "A small, easily concealable toy handgun. Ages 8 and up." @@ -45,12 +42,6 @@ magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src) return ..() -/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted - pin = /obj/item/firing_pin - -/obj/item/gun/ballistic/automatic/toy/pistol/riot/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/shotgun/toy name = "foam force shotgun" desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up." @@ -75,9 +66,6 @@ if(chambered && !chambered.BB) qdel(chambered) -/obj/item/gun/ballistic/shotgun/toy/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/shotgun/toy/crossbow name = "foam force crossbow" desc = "A weapon favored by many overactive children. Ages 8 and up." @@ -105,13 +93,6 @@ recoil = -10 //its a toy... recoil_unwielded = -10 -/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted //Use this for actual toys - pin = /obj/item/firing_pin - mag_type = /obj/item/ammo_box/magazine/toy/smgm45 - -/obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot - mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot - /obj/item/gun/ballistic/automatic/smg/c20r/toy/update_overlays() . = ..() . += "[icon_state]_toy" @@ -129,11 +110,7 @@ recoil = -10 //its a toy... recoil_unwielded = -10 -/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted //Use this for actual toys - pin = /obj/item/firing_pin - mag_type = /obj/item/ammo_box/magazine/toy/m762 - -/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted/riot +/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot mag_type = /obj/item/ammo_box/magazine/toy/m762/riot /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/update_overlays() diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 223cdc09e157..d8dbc159a8d0 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -12,9 +12,6 @@ dual_wield_spread = 60 manufacturer = MANUFACTURER_SHARPLITE_NEW -/obj/item/gun/energy/e_gun/mindshield - pin = /obj/item/firing_pin/implant/mindshield - /obj/item/gun/energy/e_gun/mini name = "miniature energy gun" desc = "A small, pistol-sized energy gun with a built-in flashlight. It has two settings: disable and kill." diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 0c02e2ff90e8..8e3774737c06 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -75,7 +75,6 @@ item_state = "shotgun" desc = "A combat shotgun gutted and refitted with an internal laser system. Can switch between taser and scattered disabler shots." shaded_charge = 0 - pin = /obj/item/firing_pin/implant/mindshield ammo_type = list(/obj/item/ammo_casing/energy/disabler/scatter, /obj/item/ammo_casing/energy/electrode) manufacturer = MANUFACTURER_NONE @@ -97,9 +96,6 @@ ammo_x_offset = 3 manufacturer = MANUFACTURER_SHARPLITE -/obj/item/gun/energy/lasercannon/unrestricted - pin = /obj/item/firing_pin - /obj/item/ammo_casing/energy/laser/accelerator projectile_type = /obj/projectile/beam/laser/accelerator select_name = "accelerator" @@ -135,7 +131,6 @@ ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag) item_flags = NONE clumsy_check = FALSE - pin = /obj/item/firing_pin/tag/blue ammo_x_offset = 2 selfcharge = TRUE manufacturer = MANUFACTURER_NONE @@ -150,7 +145,6 @@ ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag) item_flags = NONE clumsy_check = FALSE - pin = /obj/item/firing_pin/tag/red ammo_x_offset = 2 selfcharge = TRUE manufacturer = MANUFACTURER_NONE diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index f5efacbf96c3..fe5a85131ac5 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -24,26 +24,6 @@ /obj/item/gun/energy/pulse/emp_act(severity) return -/obj/item/gun/energy/pulse/prize - pin = /obj/item/firing_pin - -/obj/item/gun/energy/pulse/prize/Initialize() - . = ..() - GLOB.poi_list += src - var/turf/T = get_turf(src) - - message_admins("A pulse rifle prize has been created at [ADMIN_VERBOSEJMP(T)]") - log_game("A pulse rifle prize has been created at [AREACOORD(T)]") - - notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT, header = "Pulse rifle prize") - -/obj/item/gun/energy/pulse/prize/Destroy() - GLOB.poi_list -= src - . = ..() - -/obj/item/gun/energy/pulse/loyalpin - pin = /obj/item/firing_pin - /obj/item/gun/energy/pulse/carbine name = "pulse carbine" desc = "A next-generation pulse weapon for Nanotrasen's security forces. High production costs and logistical issues have limited its deployment to specialist Loss Prevention and Emergency Response units." @@ -61,9 +41,6 @@ ammo_x_offset = 2 charge_sections = 4 -/obj/item/gun/energy/pulse/carbine/loyalpin - pin = /obj/item/firing_pin/implant/mindshield - /obj/item/gun/energy/pulse/pistol name = "pulse pistol" desc = "A pulse rifle in an easily concealed handgun package with low capacity." @@ -76,9 +53,6 @@ ammo_x_offset = 2 charge_sections = 4 -/obj/item/gun/energy/pulse/pistol/loyalpin - pin = /obj/item/firing_pin/implant/mindshield - /obj/item/gun/energy/pulse/destroyer name = "pulse destroyer" desc = "A heavy-duty energy rifle built for pure destruction." diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 5a01abfdc0f1..d8291feae088 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -44,10 +44,6 @@ if(!QDELETED(cell) && (cell.charge > shot.e_cost)) . += "decloner_spin" -/obj/item/gun/energy/decloner/unrestricted - pin = /obj/item/firing_pin - ammo_type = list(/obj/item/ammo_casing/energy/declone/weak) - /obj/item/gun/energy/floragun name = "floral somatoray" desc = "A tool that discharges controlled radiation which induces mutation in plant cells." @@ -341,7 +337,6 @@ /obj/item/gun/energy/temperature/security name = "security temperature gun" desc = "A weapon that can only be used to its full potential by the truly robust." - pin = /obj/item/firing_pin /obj/item/gun/energy/laser/instakill name = "instakill rifle" diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index fad4f485aa88..cdd54d60c579 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -82,7 +82,6 @@ cell_type = /obj/item/stock_parts/cell/infinite aiming_time = 0 recoil = 0 - pin = /obj/item/firing_pin /obj/item/gun/energy/beam_rifle/equipped(mob/user) set_user(user) diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm deleted file mode 100644 index 23093e5d8d51..000000000000 --- a/code/modules/projectiles/pins.dm +++ /dev/null @@ -1,343 +0,0 @@ -/obj/item/firing_pin - name = "electronic firing pin" - desc = "A small authentication device, to be inserted into a firearm receiver to allow operation. NT safety regulations require all new designs to incorporate one." - icon = 'icons/obj/device.dmi' - icon_state = "firing_pin" - item_state = "pen" - flags_1 = CONDUCT_1 - w_class = WEIGHT_CLASS_TINY - attack_verb = list("poked") - var/fail_message = "INVALID USER." - var/selfdestruct = 0 // Explode when user check is failed. - var/force_replace = 0 // Can forcefully replace other pins. - var/pin_removeable = 0 // Can be replaced by any pin. - var/obj/item/gun/gun - -/obj/item/firing_pin/New(newloc) - ..() - if(istype(newloc, /obj/item/gun)) - gun = newloc - -/obj/item/firing_pin/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(proximity_flag) - if(istype(target, /obj/item/gun)) - var/obj/item/gun/G = target - var/obj/item/firing_pin/old_pin = G.pin - if(old_pin && (force_replace || old_pin.pin_removeable)) - to_chat(user, "You remove [old_pin] from [G].") - if(Adjacent(user)) - user.put_in_hands(old_pin) - else - old_pin.forceMove(G.drop_location()) - old_pin.gun_remove(user) - - if(!G.pin) - if(!user.temporarilyRemoveItemFromInventory(src)) - return - gun_insert(user, G) - to_chat(user, "You insert [src] into [G].") - else - to_chat(user, "This firearm already has a firing pin installed.") - -/obj/item/firing_pin/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - obj_flags |= EMAGGED - to_chat(user, "You override the authentication mechanism.") - -/obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/G) - gun = G - forceMove(gun) - gun.pin = src - return - -/obj/item/firing_pin/proc/gun_remove(mob/living/user) - gun.pin = null - gun = null - return - -/obj/item/firing_pin/proc/pin_auth(mob/living/user) - return TRUE - -/obj/item/firing_pin/proc/auth_fail(mob/living/user) - if(user) - user.show_message(fail_message, MSG_VISUAL) - if(selfdestruct) - if(user) - user.show_message("SELF-DESTRUCTING...
", MSG_VISUAL) - to_chat(user, "[gun] explodes!") - explosion(get_turf(gun), -1, 0, 2, 3) - if(gun) - qdel(gun) - - -/obj/item/firing_pin/magic - name = "magic crystal shard" - desc = "A small enchanted shard which allows magical weapons to fire." - - -// Test pin, works only near firing range. -/obj/item/firing_pin/test_range - name = "test-range firing pin" - desc = "This safety firing pin allows weapons to be fired within proximity to a firing range." - fail_message = "TEST RANGE CHECK FAILED." - pin_removeable = TRUE - -/obj/item/firing_pin/test_range/pin_auth(mob/living/user) - if(!istype(user)) - return FALSE - if (istype(get_area(user), /area/ship/security/range)) - return TRUE - return FALSE - - -// Implant pin, checks for implant -/obj/item/firing_pin/implant - name = "implant-keyed firing pin" - desc = "This is a security firing pin which only authorizes users who are implanted with a certain device." - fail_message = "IMPLANT CHECK FAILED." - var/obj/item/implant/req_implant = null - -/obj/item/firing_pin/implant/pin_auth(mob/living/user) - if(user) - for(var/obj/item/implant/I in user.implants) - if(req_implant && I.type == req_implant) - return TRUE - return FALSE - -/obj/item/firing_pin/implant/mindshield - name = "mindshield firing pin" - desc = "This Security firing pin authorizes the weapon for only mindshield-implanted users." - icon_state = "firing_pin_loyalty" - req_implant = /obj/item/implant/mindshield - -/obj/item/firing_pin/implant/pindicate - name = "syndicate firing pin" - icon_state = "firing_pin_pindi" - req_implant = /obj/item/implant/weapons_auth - - - -// Honk pin, clown's joke item. -// Can replace other pins. Replace a pin in cap's laser for extra fun! -/obj/item/firing_pin/clown - name = "hilarious firing pin" - desc = "Advanced clowntech that can convert any firearm into a far more useful object." - color = "#FFFF00" - fail_message = "HONK!" - force_replace = TRUE - -/obj/item/firing_pin/clown/pin_auth(mob/living/user) - playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE) - return FALSE - -// Ultra-honk pin, clown's deadly joke item. -// A gun with ultra-honk pin is useful for clown and useless for everyone else. -/obj/item/firing_pin/clown/ultra - name = "ultra hilarious firing pin" - -/obj/item/firing_pin/clown/ultra/pin_auth(mob/living/user) - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE) - if(QDELETED(user)) //how the hell...? - stack_trace("/obj/item/firing_pin/clown/ultra/pin_auth called with a [isnull(user) ? "null" : "invalid"] user.") - return TRUE - if(HAS_TRAIT(user, TRAIT_CLUMSY)) //clumsy - return TRUE - if(user.mind) - if(user.mind.assigned_role == "Clown") //traitor clowns can use this, even though they're technically not clumsy - return TRUE - if(user.mind.has_antag_datum(/datum/antagonist/nukeop/clownop)) //clown ops aren't clumsy by default and technically don't have an assigned role of "Clown", but come on, they're basically clowns - return TRUE - if(user.mind.has_antag_datum(/datum/antagonist/nukeop/leader/clownop)) //Wanna hear a funny joke? - return TRUE //The clown op leader antag datum isn't a subtype of the normal clown op antag datum. - return FALSE - -/obj/item/firing_pin/clown/ultra/gun_insert(mob/living/user, obj/item/gun/G) - ..() - G.clumsy_check = FALSE - -/obj/item/firing_pin/clown/ultra/gun_remove(mob/living/user) - gun.clumsy_check = initial(gun.clumsy_check) - ..() - -// Now two times deadlier! -/obj/item/firing_pin/clown/ultra/selfdestruct - name = "super ultra hilarious firing pin" - desc = "Advanced clowntech that can convert any firearm into a far more useful object. It has a small nitrobananium charge on it." - selfdestruct = TRUE - - -// DNA-keyed pin. -// When you want to keep your toys for yourself. -/obj/item/firing_pin/dna - name = "DNA-keyed firing pin" - desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link." - icon_state = "firing_pin_dna" - fail_message = "DNA CHECK FAILED." - var/unique_enzymes = null - -/obj/item/firing_pin/dna/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(proximity_flag && iscarbon(target)) - var/mob/living/carbon/M = target - if(M.dna && M.dna.unique_enzymes) - unique_enzymes = M.dna.unique_enzymes - to_chat(user, "DNA-LOCK SET.") - -/obj/item/firing_pin/dna/pin_auth(mob/living/carbon/user) - if(user && user.dna && user.dna.unique_enzymes) - if(user.dna.unique_enzymes == unique_enzymes) - return TRUE - return FALSE - -/obj/item/firing_pin/dna/auth_fail(mob/living/carbon/user) - if(!unique_enzymes) - if(user && user.dna && user.dna.unique_enzymes) - unique_enzymes = user.dna.unique_enzymes - to_chat(user, "DNA-LOCK SET.") - else - ..() - -/obj/item/firing_pin/dna/dredd - desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it." - selfdestruct = TRUE - -// Paywall pin, brought to you by ARMA 3 DLC. -// Checks if the user has a valid bank account on an ID and if so attempts to extract a one-time payment to authorize use of the gun. Otherwise fails to shoot. -/obj/item/firing_pin/paywall - name = "paywall firing pin" - desc = "A firing pin with a built-in configurable paywall." - color = "#FFD700" - fail_message = "" - var/list/gun_owners = list() //list of people who've accepted the license prompt. If this is the multi-payment pin, then this means they accepted the waiver that each shot will cost them money - var/payment_amount //how much gets paid out to license yourself to the gun - var/obj/item/card/id/pin_owner - var/multi_payment = FALSE //if true, user has to pay everytime they fire the gun - var/owned = FALSE - var/active_prompt = FALSE //purchase prompt to prevent spamming it - -/obj/item/firing_pin/paywall/attack_self(mob/user) - multi_payment = !multi_payment - to_chat(user, "You set the pin to [(multi_payment) ? "process payment for every shot" : "one-time license payment"].") - -/obj/item/firing_pin/paywall/examine(mob/user) - . = ..() - if(pin_owner) - . += "This firing pin is currently authorized to pay into the account of [pin_owner.registered_name]." - -/obj/item/firing_pin/paywall/gun_insert(mob/living/user, obj/item/gun/G) - if(!pin_owner) - to_chat(user, "ERROR: Please swipe valid identification card before installing firing pin!") - return - gun = G - forceMove(gun) - gun.pin = src - if(multi_payment) - gun.desc += " This [gun.name] has a per-shot cost of [payment_amount] credit[(payment_amount > 1) ? "s" : ""]." - return - gun.desc += " This [gun.name] has a license permit cost of [payment_amount] credit[(payment_amount > 1) ? "s" : ""]." - return - - -/obj/item/firing_pin/paywall/gun_remove(mob/living/user) - gun.desc = initial(desc) - ..() - -/obj/item/firing_pin/paywall/attackby(obj/item/M, mob/user, params) - if(istype(M, /obj/item/card/id)) - var/obj/item/card/id/id = M - if(!id.registered_account) - to_chat(user, "ERROR: Identification card lacks registered bank account!") - return - if(id != pin_owner && owned) - to_chat(user, "ERROR: This firing pin has already been authorized!") - return - if(id == pin_owner) - to_chat(user, "You unlink the card from the firing pin.") - gun_owners -= user - pin_owner = null - owned = FALSE - return - var/transaction_amount = input(user, "Insert valid deposit amount for gun purchase", "Money Deposit") as null|num - if(transaction_amount < 1) - to_chat(user, "ERROR: Invalid amount designated.") - return - if(!transaction_amount) - return - pin_owner = id - owned = TRUE - payment_amount = transaction_amount - gun_owners += user - to_chat(user, "You link the card to the firing pin.") - -/obj/item/firing_pin/paywall/pin_auth(mob/living/user) - if(!istype(user))//nice try commie - return FALSE - if(ishuman(user)) - var/datum/bank_account/credit_card_details - var/mob/living/carbon/human/H = user - if(H.get_bank_account()) - credit_card_details = H.get_bank_account() - if(H in gun_owners) - if(multi_payment && credit_card_details) - if(credit_card_details.adjust_money(-payment_amount)) - pin_owner.registered_account.adjust_money(payment_amount) - return TRUE - to_chat(user, "ERROR: User balance insufficent for successful transaction!") - return FALSE - return TRUE - if(credit_card_details && !active_prompt) - var/license_request = alert(usr, "Do you wish to pay [payment_amount] credit[(payment_amount > 1) ? "s" : ""] for [(multi_payment) ? "each shot of [gun.name]" : "usage license of [gun.name]"]?", "Weapon Purchase", "Yes", "No") - active_prompt = TRUE - if(!user.canUseTopic(src, BE_CLOSE)) - active_prompt = FALSE - return FALSE - switch(license_request) - if("Yes") - if(credit_card_details.adjust_money(-payment_amount)) - pin_owner.registered_account.adjust_money(payment_amount) - gun_owners += H - to_chat(user, "Gun license purchased, have a secure day!") - active_prompt = FALSE - return FALSE //we return false here so you don't click initially to fire, get the prompt, accept the prompt, and THEN the gun - to_chat(user, "ERROR: User balance insufficent for successful transaction!") - return FALSE - if("No") - to_chat(user, "ERROR: User has declined to purchase gun license!") - return FALSE - to_chat(user, "ERROR: User has no valid bank account to substract neccesary funds from!") - return FALSE - -// Laser tag pins -/obj/item/firing_pin/tag - name = "laser tag firing pin" - desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on." - fail_message = "SUIT CHECK FAILED." - var/obj/item/clothing/suit/suit_requirement = null - var/tagcolor = "" - -/obj/item/firing_pin/tag/pin_auth(mob/living/user) - if(ishuman(user)) - var/mob/living/carbon/human/M = user - if(istype(M.wear_suit, suit_requirement)) - return TRUE - to_chat(user, "You need to be wearing [tagcolor] laser tag armor!") - return FALSE - -/obj/item/firing_pin/tag/red - name = "red laser tag firing pin" - icon_state = "firing_pin_red" - suit_requirement = /obj/item/clothing/suit/redtag - tagcolor = "red" - -/obj/item/firing_pin/tag/blue - name = "blue laser tag firing pin" - icon_state = "firing_pin_blue" - suit_requirement = /obj/item/clothing/suit/bluetag - tagcolor = "blue" - -/obj/item/firing_pin/Destroy() - if(gun) - gun.pin = null - return ..() diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm index d2fb11bfef4b..6656e9e37b49 100644 --- a/code/modules/vending/liberation.dm +++ b/code/modules/vending/liberation.dm @@ -13,7 +13,7 @@ /obj/item/gun/ballistic/automatic/pistol/deagle/gold = 2, /obj/item/gun/ballistic/automatic/pistol/deagle/camo = 2, /obj/item/gun/ballistic/automatic/pistol/m1911 = 2, - /obj/item/gun/ballistic/automatic/smg/proto/unrestricted = 2, + /obj/item/gun/ballistic/automatic/smg/proto = 2, /obj/item/gun/ballistic/shotgun/automatic/combat = 2, /obj/item/gun/ballistic/automatic/gyropistol = 1, /obj/item/gun/ballistic/shotgun = 2, diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index 90df6b673b16..23a65a503c96 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -6,9 +6,9 @@ product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!" vend_reply = "Come back for more!" circuit = /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor - products = list(/obj/item/gun/ballistic/automatic/toy/unrestricted = 10, - /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10, - /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10, + products = list(/obj/item/gun/ballistic/automatic/toy = 10, + /obj/item/gun/ballistic/automatic/toy/pistol = 10, + /obj/item/gun/ballistic/shotgun/toy = 10, /obj/item/toy/sword = 10, /obj/item/ammo_box/foambox = 20, /obj/item/toy/foamblade = 10, @@ -17,8 +17,8 @@ /obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant contraband = list( /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting! - /obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted/riot = 10, - /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted/riot = 10, + /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot = 10, + /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot = 10, /obj/item/ammo_box/foambox/riot = 20, /obj/item/toy/katana = 10, /obj/item/dualsaber/toy = 5, diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index d71dcae5ab41..482071c8b520 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -134,10 +134,10 @@ /obj/item/melee/transforming/energy/sword/saber/red = 1, ) voucher_items = list( - "M-90gl Carbine" = /obj/item/gun/ballistic/automatic/smg/m90/unrestricted, + "M-90gl Carbine" = /obj/item/gun/ballistic/automatic/smg/m90, "sniper rifle" = /obj/item/gun/ballistic/automatic/sniper_rifle, - "C-20r SMG" = /obj/item/gun/ballistic/automatic/smg/c20r/unrestricted, - "Bulldog Shotgun" = /obj/item/gun/ballistic/shotgun/bulldog/unrestricted) + "C-20r SMG" = /obj/item/gun/ballistic/automatic/smg/c20r, + "Bulldog Shotgun" = /obj/item/gun/ballistic/shotgun/bulldog) /obj/machinery/vending/security/marine/nanotrasen icon_state = "nt-marine" diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index 8a938b50d435..a497afacc5e4 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -8,9 +8,9 @@ light_mask = "donksoft-light-mask" circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor products = list( - /obj/item/gun/ballistic/automatic/toy/unrestricted = 10, - /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10, - /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10, + /obj/item/gun/ballistic/automatic/toy = 10, + /obj/item/gun/ballistic/automatic/toy/pistol = 10, + /obj/item/gun/ballistic/shotgun/toy = 10, /obj/item/toy/sword = 10, /obj/item/ammo_box/foambox = 20, /obj/item/toy/foamblade = 10, @@ -19,8 +19,8 @@ /obj/item/clothing/head/syndicatefake = 5) contraband = list( /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, - /obj/item/gun/ballistic/automatic/smg/c20r/toy/unrestricted = 10, - /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/unrestricted = 10, + /obj/item/gun/ballistic/automatic/smg/c20r/toy = 10, + /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy = 10, /obj/item/toy/katana = 10, /obj/item/dualsaber/toy = 5) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) diff --git a/shiptest.dme b/shiptest.dme index 543b4322394d..580d8162e721 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -2934,7 +2934,6 @@ #include "code\modules\power\tesla\energy_ball.dm" #include "code\modules\power\tesla\generator.dm" #include "code\modules\projectiles\gun.dm" -#include "code\modules\projectiles\pins.dm" #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\_ammunition.dm" #include "code\modules\projectiles\ammunition\_firing.dm" From 475643850c2ad8235d981b6c6600574464331411 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 5 Feb 2024 17:31:55 -0600 Subject: [PATCH 090/206] hm --- code/modules/unit_tests/gun_crafting.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm index 3dc74430681c..31ee1edc2285 100644 --- a/code/modules/unit_tests/gun_crafting.dm +++ b/code/modules/unit_tests/gun_crafting.dm @@ -1,12 +1,11 @@ //Makes sure preinstalled frame parts can be removed an reinstalled /datum/unit_test/gun_crafting/Run() -/* var/list/guns = typesof(/obj/item/gun/ballistic) for(var/gunType in guns) var/obj/item/gun/ballistic/G = new gunType if(G.magazine) - TEST_FAIL("Gun: [G.type], Magazine: [G.magazine.type], Caliber: [G.magazine.caliber]") -*/ + TEST_FAIL("[G.type], Mag: [G.magazine.type], Cali: [G.magazine.caliber]") +/* var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) for(var/frame_type in subtypesof(/obj/item/part/gun/frame)) var/obj/item/part/gun/frame/frame = new frame_type @@ -15,3 +14,4 @@ frame.eject_item(installedPart, human) frame.handle_part(installedPart, human) TEST_ASSERT_EQUAL(frame_parts, frame.installed_parts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.") +*/ From a049ff914082cfd6af65fe7d0af39dd01af0bfdb Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 5 Feb 2024 17:38:14 -0600 Subject: [PATCH 091/206] oh the paths changed alot? --- code/modules/guncrafting/recipe.dm | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index 1b1dfa7ed5a5..1072dd7b4777 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -28,6 +28,16 @@ var/list/valid_parts = list() var/required_part_types = ALL +/datum/lathe_recipe/gun/m1911 + result = /obj/item/gun/ballistic/automatic/pistol/m1911 + valid_parts = list( + /obj/item/part/gun/frame/m1911, + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism/pistol, + /obj/item/part/gun/modular/barrel/pistol + ) + +/* /datum/lathe_recipe/gun/winchester result = /obj/item/gun/ballistic/shotgun/winchester valid_parts = list( @@ -46,15 +56,6 @@ /obj/item/part/gun/modular/barrel/rifle ) -/datum/lathe_recipe/gun/m1911 - result = /obj/item/gun/ballistic/automatic/pistol/m1911 - valid_parts = list( - /obj/item/part/gun/frame/m1911, - /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/pistol, - /obj/item/part/gun/modular/barrel/pistol - ) - /datum/lathe_recipe/gun/tec9 result = /obj/item/gun/ballistic/automatic/pistol/tec9 valid_parts = list( @@ -126,3 +127,4 @@ /obj/item/part/gun/modular/mechanism, /obj/item/part/gun/modular/barrel ) +*/ From 54ec41868c48dc9d897945efc021311e61139906 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 5 Feb 2024 17:41:00 -0600 Subject: [PATCH 092/206] yea --- code/modules/guncrafting/frame.dm | 4 ++-- code/modules/guncrafting/recipe.dm | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index cf05f893bfff..de54637a7190 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -192,8 +192,8 @@ /obj/item/part/gun/frame/winchester/mk1 name = "winchester mk1 gun frame" -/obj/item/part/gun/frame/m1911 - name = "m1911 gun frame" +/obj/item/part/gun/frame/candor + name = "candor gun frame" preinstalled_parts = list( /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/pistol, diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index 1072dd7b4777..2fea8240799c 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -28,10 +28,10 @@ var/list/valid_parts = list() var/required_part_types = ALL -/datum/lathe_recipe/gun/m1911 - result = /obj/item/gun/ballistic/automatic/pistol/m1911 +/datum/lathe_recipe/gun/candor + result = /obj/item/gun/ballistic/automatic/pistol/candor valid_parts = list( - /obj/item/part/gun/frame/m1911, + /obj/item/part/gun/frame/candor, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/pistol, /obj/item/part/gun/modular/barrel/pistol From f6af1222b0c796596321de246a3282253e52626d Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 5 Feb 2024 17:43:19 -0600 Subject: [PATCH 093/206] candor --- code/modules/guncrafting/guncrafting.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/guncrafting/guncrafting.dm b/code/modules/guncrafting/guncrafting.dm index 423fb6f1a28a..84975f846d7f 100644 --- a/code/modules/guncrafting/guncrafting.dm +++ b/code/modules/guncrafting/guncrafting.dm @@ -44,7 +44,7 @@ new /obj/item/part/gun/modular/mechanism/shotgun(src) new /obj/item/part/gun/modular/barrel/shotgun(src) new /obj/item/part/gun/frame(src) - new /obj/item/part/gun/frame/m1911(src) + new /obj/item/part/gun/frame/candor(src) new /obj/item/part/gun/modular/grip/wood(src) new /obj/item/part/gun/modular/mechanism(src) new /obj/item/part/gun/modular/barrel(src) From f39fe7e454b3372041af7c2d7043c498006fcbdd Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 5 Feb 2024 18:04:49 -0600 Subject: [PATCH 094/206] firing pins are the devil i think --- .../icemoon_underground_oldstation.dmm | 1 - _maps/RandomRuins/SpaceRuins/oldstation.dmm | 1 - .../shuttles/nanotrasen/nanotrasen_mimir.dmm | 1 - _maps/shuttles/pirate/pirate_ember.dmm | 4 -- .../syndicate/syndicate_gorlex_komodo.dmm | 3 -- code/__DEFINES/dcs/signals.dm | 2 - code/datums/components/gunpoint.dm | 3 -- code/datums/components/sitcomlaughter.dm | 2 +- code/game/machinery/computer/arcade.dm | 6 --- .../game/objects/items/storage/uplink_kits.dm | 3 -- .../crates_lockers/closets/secure/security.dm | 2 - .../mission_code/stationCollision.dm | 2 - code/modules/cargo/packs/gun.dm | 19 --------- code/modules/projectiles/gun.dm | 14 ------- .../projectiles/guns/ballistic/revolver.dm | 12 ------ .../modules/projectiles/guns/ballistic/smg.dm | 1 - .../modules/projectiles/guns/ballistic/toy.dm | 4 -- .../projectiles/guns/energy/energy_gun.dm | 1 - code/modules/projectiles/guns/energy/laser.dm | 5 --- .../projectiles/guns/energy/special.dm | 5 --- code/modules/projectiles/guns/magic.dm | 2 - .../projectiles/guns/misc/beam_rifle.dm | 1 - .../projectiles/guns/misc/blastcannon.dm | 6 --- .../modules/projectiles/guns/misc/chem_gun.dm | 1 - .../projectiles/guns/misc/syringe_gun.dm | 1 - code/modules/projectiles/guns/powered.dm | 4 -- .../research/designs/weapon_designs.dm | 30 -------------- .../ruins/spaceruin_code/forgottenship.dm | 8 ---- .../spells/spell_types/rightandwrong.dm | 2 - code/modules/uplink/uplink_items.dm | 40 ------------------- 30 files changed, 1 insertion(+), 185 deletions(-) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_oldstation.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_oldstation.dmm index b63742662227..84adfe2c8cbb 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_oldstation.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_oldstation.dmm @@ -3941,7 +3941,6 @@ /obj/machinery/light/small/directional/east, /obj/item/assembly/flash/handheld, /obj/item/assembly/flash/handheld, -/obj/item/storage/box/firingpins, /obj/structure/closet/crate/secure/weapon{ req_access_txt = "203" }, diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 1b9136861194..898e1b41f989 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -8428,7 +8428,6 @@ /obj/machinery/light/small/directional/east, /obj/item/assembly/flash/handheld, /obj/item/assembly/flash/handheld, -/obj/item/storage/box/firingpins, /obj/structure/closet/crate/secure/weapon{ req_access_txt = "203" }, diff --git a/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm b/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm index 8f7fb343e1a4..126eb82ccd6f 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_mimir.dmm @@ -3249,7 +3249,6 @@ /obj/item/storage/box/handcuffs, /obj/item/storage/box/handcuffs, /obj/item/storage/box/prisoner, -/obj/item/storage/box/firingpins, /obj/item/storage/box/seccarts, /obj/item/storage/box/teargas, /obj/item/storage/box/zipties, diff --git a/_maps/shuttles/pirate/pirate_ember.dmm b/_maps/shuttles/pirate/pirate_ember.dmm index f114c64f153f..afc537e6e6ff 100644 --- a/_maps/shuttles/pirate/pirate_ember.dmm +++ b/_maps/shuttles/pirate/pirate_ember.dmm @@ -4032,10 +4032,6 @@ pixel_y = 7; pixel_x = 4 }, -/obj/item/storage/box/firingpins{ - pixel_x = -6; - pixel_y = 4 - }, /obj/item/storage/box/syndie_kit/throwing_weapons, /obj/machinery/light/directional/south, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm index 68ee81cb02f2..6c86468d04ac 100644 --- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm +++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm @@ -1739,9 +1739,6 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/airalarm/directional/south, -/obj/item/storage/box/firingpins{ - pixel_x = 21 - }, /obj/item/clothing/glasses/night{ pixel_y = 6 }, diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 004b2f23fedf..07c5f1d83835 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -447,8 +447,6 @@ ///From /datum/component/creamed/Initialize() #define COMSIG_MOB_CREAMED "mob_creamed" -///From /obj/item/gun/proc/check_botched() -#define COMSIG_MOB_CLUMSY_SHOOT_FOOT "mob_clumsy_shoot_foot" ///When a carbon mob hugs someone, this is called on the carbon that is hugging. (mob/living/hugger, mob/living/hugged) #define COMSIG_CARBON_HUG "carbon_hug" diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm index 2865865c98ab..26bbb641a8eb 100644 --- a/code/datums/components/gunpoint.dm +++ b/code/datums/components/gunpoint.dm @@ -126,9 +126,6 @@ if(weapon.chambered && weapon.chambered.BB) weapon.chambered.BB.damage *= damage_mult - if(weapon.check_botched(shooter)) - return - weapon.process_fire(target, shooter) qdel(src) diff --git a/code/datums/components/sitcomlaughter.dm b/code/datums/components/sitcomlaughter.dm index 8dfef21b749d..8a5c32d2e2d1 100644 --- a/code/datums/components/sitcomlaughter.dm +++ b/code/datums/components/sitcomlaughter.dm @@ -1,6 +1,6 @@ /datum/component/wearertargeting/sitcomlaughter valid_slots = list(ITEM_SLOT_HANDS, ITEM_SLOT_BELT, ITEM_SLOT_ID, ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET, ITEM_SLOT_SUITSTORE, ITEM_SLOT_DEX_STORAGE) - signals = list(COMSIG_MOB_CREAMED, COMSIG_ON_CARBON_SLIP, COMSIG_ON_VENDOR_CRUSH, COMSIG_MOB_CLUMSY_SHOOT_FOOT) + signals = list(COMSIG_MOB_CREAMED, COMSIG_ON_CARBON_SLIP, COMSIG_ON_VENDOR_CRUSH) proctype = PROC_REF(EngageInComedy) mobtype = /mob/living ///Sounds used for when user has a sitcom action occur diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 571d5b090da9..f0d03e645a1d 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -88,12 +88,6 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( prizes *= 2 for(var/i = 0, i < prizes, i++) SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade) - if(prob(0.0001)) //1 in a million - new /obj/item/gun/energy/pulse/prize(src) - visible_message("[src] dispenses.. woah, a gun! Way past cool.", "You hear a chime and a shot.") - user.client.give_award(/datum/award/achievement/misc/pulse, user) - return - var/prizeselect if(prize_override) prizeselect = pickweight(prize_override) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index cc070ba21d5c..08b9a4f86d81 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -519,9 +519,6 @@ for(var/i in 1 to 3) new/obj/item/grenade/chem_grenade/ez_clean(src) -/obj/item/storage/box/hug/reverse_revolver/PopulateContents() - new /obj/item/gun/ballistic/revolver/reverse(src) - /obj/item/storage/box/syndie_kit/mimery/PopulateContents() new /obj/item/book/granter/spell/mimery_blockade(src) new /obj/item/book/granter/spell/mimery_guns(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 66b803e7d041..caeec2241a67 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -296,7 +296,6 @@ /obj/structure/closet/secure_closet/armory2/PopulateContents() ..() - new /obj/item/storage/box/firingpins(src) for(var/i in 1 to 3) new /obj/item/storage/box/rubbershot(src) for(var/i in 1 to 3) @@ -309,7 +308,6 @@ /obj/structure/closet/secure_closet/armory3/PopulateContents() ..() - new /obj/item/storage/box/firingpins(src) new /obj/item/gun/energy/ionrifle(src) for(var/i in 1 to 3) new /obj/item/gun/energy/e_gun(src) diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index 4312d2f89f48..063966c86d63 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -44,7 +44,6 @@ icon_state = "retro" desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces." // projectile_type = "/obj/projectile/practice" - clumsy_check = 0 //No sense in having a harmless gun blow up in the clowns face //Syndicate sub-machine guns. /obj/item/gun/ballistic/automatic/smg/c20r/sc_c20r @@ -68,7 +67,6 @@ /obj/item/gun/energy/laser/practice/sc_laser name = "Old laser" desc = "A once potent weapon, years of dust have collected in the chamber and lens of this weapon, weakening the beam significantly." - clumsy_check = 0 /* * Safe code hints diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 6ca715889855..45c8d9ba371c 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -147,22 +147,3 @@ contains = list(/obj/item/gun/ballistic/automatic/assault/ak47, /obj/item/gun/ballistic/automatic/assault/ak47) crate_name = "auto rifle crate" - -/* - Firing pins -*/ - -/datum/supply_pack/gun/firingpins - name = "Standard Firing Pins Crate" - desc = "Upgrade your arsenal with 10 standard firing pins." - cost = 2000 - contains = list(/obj/item/storage/box/firingpins, - /obj/item/storage/box/firingpins) - crate_name = "firing pins crate" - -/datum/supply_pack/gun/lasertag_pins - name = "Laser Tag Firing Pins Crate" - desc = "Three laser tag firing pins used in laser-tag units to ensure users are wearing their vests." - cost = 1500 - contains = list(/obj/item/storage/box/lasertagpins) - crate_name = "laser tag pin crate" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 4402a88ead17..3201211fdc5e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -314,9 +314,6 @@ shoot_with_empty_chamber(user) return - if(check_botched(user)) - return - if(weapon_weight == WEAPON_HEAVY && (!wielded)) to_chat(user, "You need a more secure grip to fire [src]!") return @@ -335,17 +332,6 @@ return process_fire(target, user, TRUE, params, null, bonus_spread) -/obj/item/gun/proc/check_botched(mob/living/user, params) - if(clumsy_check) - if(istype(user)) - if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40)) - to_chat(user, "You shoot yourself in the foot with [src]!") - var/shot_leg = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - process_fire(user, user, FALSE, params, shot_leg) - SEND_SIGNAL(user, COMSIG_MOB_CLUMSY_SHOOT_FOOT) - user.dropItemToGround(src, TRUE) - return TRUE - /obj/item/gun/proc/recharge_newshot() return diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 57b088fc16b7..d5cad1c23b48 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -316,18 +316,6 @@ return user.visible_message("[user.name]'s soul is captured by \the [src]!", "You've lost the gamble! Your soul is forfeit!") -/obj/item/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course. - clumsy_check = 0 - -/obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user) - if((HAS_TRAIT(user, TRAIT_CLUMSY)) || (user.mind && user.mind.assigned_role == "Clown")) - return ..() - if(process_fire(user, user, FALSE, null, BODY_ZONE_HEAD)) - user.visible_message("[user] somehow manages to shoot [user.p_them()]self in the face!", "You somehow shoot yourself in the face! How the hell?!") - user.emote("scream") - user.drop_all_held_items() - user.Paralyze(80) - /obj/item/gun/ballistic/revolver/srm name = "SRM Standard Issue .357 Revolver" //should have used the pepperbox... desc = "A sturdy, powerful, and reliable revolver utilized by the Saint-Roumain Militia." diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index 696a934e71c4..43944c0fcc50 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -18,7 +18,6 @@ icon_state = "saber" actions_types = list() mag_type = /obj/item/ammo_box/magazine/smgm9mm - pin = null bolt_type = BOLT_TYPE_LOCKING mag_display = TRUE manufacturer = MANUFACTURER_NANOTRASEN_OLD diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 4d1e7884225c..63c25c5d62f6 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -9,7 +9,6 @@ throwforce = 0 burst_size = 3 can_suppress = TRUE - clumsy_check = 0 item_flags = NONE casing_ejector = FALSE manufacturer = MANUFACTURER_NANOTRASEN @@ -49,7 +48,6 @@ throwforce = 0 mag_type = /obj/item/ammo_box/magazine/internal/shot/toy fire_sound = 'sound/items/syringeproj.ogg' - clumsy_check = FALSE item_flags = NONE casing_ejector = FALSE can_suppress = FALSE @@ -88,7 +86,6 @@ mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot fire_sound = 'sound/items/syringeproj.ogg' casing_ejector = FALSE - clumsy_check = FALSE manufacturer = MANUFACTURER_DONKCO recoil = -10 //its a toy... recoil_unwielded = -10 @@ -105,7 +102,6 @@ item_flags = NONE mag_type = /obj/item/ammo_box/magazine/toy/m762/riot casing_ejector = FALSE - clumsy_check = FALSE manufacturer = MANUFACTURER_DONKCO recoil = -10 //its a toy... recoil_unwielded = -10 diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index d8dbc159a8d0..e1887f0ea425 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -128,7 +128,6 @@ icon_state = "nucgun" item_state = "nucgun" charge_delay = 5 - pin = null can_charge = FALSE internal_cell = TRUE ammo_x_offset = 2 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 8e3774737c06..3456eabe0901 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -18,7 +18,6 @@ name = "practice laser gun" desc = "A modified version of the L-204 laser gun, this one fires less concentrated energy bolts designed for target practice." ammo_type = list(/obj/item/ammo_casing/energy/laser/practice) - clumsy_check = TRUE item_flags = NONE /obj/item/gun/energy/laser/retro @@ -92,7 +91,6 @@ flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/laser/accelerator) - pin = null ammo_x_offset = 3 manufacturer = MANUFACTURER_SHARPLITE @@ -119,7 +117,6 @@ icon_state = "xray" item_state = null ammo_type = list(/obj/item/ammo_casing/energy/xray) - pin = null ammo_x_offset = 3 ////////Laser Tag//////////////////// @@ -130,7 +127,6 @@ desc = "A retro laser gun modified to fire harmless blue beams of light. Sound effects included!" ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag) item_flags = NONE - clumsy_check = FALSE ammo_x_offset = 2 selfcharge = TRUE manufacturer = MANUFACTURER_NONE @@ -144,7 +140,6 @@ desc = "A retro laser gun modified to fire harmless beams red of light. Sound effects included!" ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag) item_flags = NONE - clumsy_check = FALSE ammo_x_offset = 2 selfcharge = TRUE manufacturer = MANUFACTURER_NONE diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d8291feae088..27b7b65b622d 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -25,7 +25,6 @@ slot_flags = ITEM_SLOT_BELT ammo_x_offset = 2 ammo_y_offset = 0 - pin = null can_flashlight = TRUE flight_x_offset = 18 flight_y_offset = 11 @@ -35,7 +34,6 @@ desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements." icon_state = "decloner" ammo_type = list(/obj/item/ammo_casing/energy/declone) - pin = null ammo_x_offset = 1 /obj/item/gun/energy/decloner/update_overlays() @@ -63,7 +61,6 @@ w_class = WEIGHT_CLASS_BULKY ammo_type = list(/obj/item/ammo_casing/energy/meteor) cell_type = /obj/item/stock_parts/cell/potato - clumsy_check = 0 //Admin spawn only, might as well let clowns use it. selfcharge = 1 /obj/item/gun/energy/meteorgun/pen @@ -117,7 +114,6 @@ custom_materials = list(/datum/material/iron=4000) suppressed = null ammo_type = list(/obj/item/ammo_casing/energy/bolt/large) - pin = null manufacturer = MANUFACTURER_NONE @@ -332,7 +328,6 @@ ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot) cell_type = /obj/item/stock_parts/cell/gun/upgraded ammo_x_offset = 2 - pin = null /obj/item/gun/energy/temperature/security name = "security temperature gun" diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 63c4ef8aa2d0..9360c24be499 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -17,9 +17,7 @@ var/can_charge = TRUE var/ammo_type var/no_den_usage - clumsy_check = 0 trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses magic instead - pin = /obj/item/firing_pin/magic /obj/item/gun/magic/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) if(no_den_usage) diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index cdd54d60c579..8b6626bc5e97 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -32,7 +32,6 @@ big_gun = TRUE cell_type = "/obj/item/stock_parts/cell/gun/large" canMouseDown = TRUE - pin = null var/aiming = FALSE var/aiming_time = 12 var/aiming_time_fire_threshold = 5 diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index 888e680479ea..161aa216b866 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -8,7 +8,6 @@ force = 10 fire_sound = 'sound/weapons/blastcannon.ogg' item_flags = NONE - clumsy_check = FALSE randomspread = FALSE var/hugbox = TRUE @@ -26,11 +25,6 @@ debug_power = 80 bombcheck = FALSE -/obj/item/gun/blastcannon/Initialize() - . = ..() - if(!pin) - pin = new - /obj/item/gun/blastcannon/Destroy() QDEL_NULL(bomb) return ..() diff --git a/code/modules/projectiles/guns/misc/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm index 6d9c5eda699d..fef47121af5f 100644 --- a/code/modules/projectiles/guns/misc/chem_gun.dm +++ b/code/modules/projectiles/guns/misc/chem_gun.dm @@ -10,7 +10,6 @@ throw_range = 7 force = 4 custom_materials = list(/datum/material/iron=2000) - clumsy_check = FALSE fire_sound = 'sound/items/syringeproj.ogg' var/time_per_syringe = 250 var/syringes_left = 4 diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index 34af73b855c6..96927eb91afc 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -8,7 +8,6 @@ throw_range = 7 force = 4 custom_materials = list(/datum/material/iron=2000) - clumsy_check = 0 fire_sound = 'sound/items/syringeproj.ogg' var/list/syringes = list() var/max_syringes = 1 diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm index 698826436b18..ac7418748d9b 100644 --- a/code/modules/projectiles/guns/powered.dm +++ b/code/modules/projectiles/guns/powered.dm @@ -52,10 +52,6 @@ /obj/item/gun/ballistic/automatic/powered/get_cell() return cell -/obj/item/gun/ballistic/automatic/powered/nopin - pin = null - spawnwithmagazine = FALSE - //the things below were taken from energy gun code. blame whoever coded this, not me /obj/item/gun/ballistic/automatic/powered/attackby(obj/item/A, mob/user, params) if (!internal_cell && istype(A, /obj/item/stock_parts/cell/gun)) diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 4d28452521af..68e9362fd424 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -67,36 +67,6 @@ category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS -/datum/design/pin_testing - name = "Test-Range Firing Pin" - desc = "This safety firing pin allows firearms to be operated within proximity to a firing range." - id = "pin_testing" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 300) - build_path = /obj/item/firing_pin/test_range - category = list("Firing Pins") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/pin_mindshield - name = "Mindshield Firing Pin" - desc = "This is a security firing pin which only authorizes users who are mindshield-implanted." - id = "pin_loyalty" - build_type = PROTOLATHE - materials = list(/datum/material/silver = 600, /datum/material/diamond = 600, /datum/material/uranium = 200) - build_path = /obj/item/firing_pin/implant/mindshield - category = list("Firing Pins") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/pin - name = "Standard Firing Pin" - desc = "A simple, electronic firing pin which is required in most standardized modern weapons." - id = "pin_standard" - build_type = PROTOLATHE - materials = list(/datum/material/silver = 600, /datum/material/diamond = 600, /datum/material/uranium = 200) - build_path = /obj/item/firing_pin - category = list("Firing Pins") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS - /datum/design/stunrevolver name = "Tesla Canon" desc = "A high-tech cannon that fires internal, reusable bolt cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers" diff --git a/code/modules/ruins/spaceruin_code/forgottenship.dm b/code/modules/ruins/spaceruin_code/forgottenship.dm index 8e3ae585d73d..def148f22239 100644 --- a/code/modules/ruins/spaceruin_code/forgottenship.dm +++ b/code/modules/ruins/spaceruin_code/forgottenship.dm @@ -47,14 +47,6 @@ GLOBAL_VAR_INIT(fscpassword, generate_password()) . = ..() AddComponent(/datum/component/gps, "Old Encrypted Signal") -/obj/item/storage/box/firingpins/syndicate - name = "box of syndicate firing pins" - desc = "A box full of special syndicate firing pins which allow only syndicate operatives to use weapons with those firing pins." - -/obj/item/storage/box/firingpins/syndicate/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/firing_pin/implant/pindicate(src) - /////////// AI Laws /obj/item/aiModule/core/full/cybersun diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index ee40b2782574..60ad5ce9399c 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -118,8 +118,6 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) var/gun_type = pick(GLOB.summoned_guns) var/obj/item/gun/G = new gun_type(get_turf(H)) - if (istype(G)) // The list contains some non-gun type guns like the speargun which do not have this proc - G.unlock() playsound(get_turf(H),'sound/magic/summon_guns.ogg', 50, TRUE) var/in_hand = H.put_in_hands(G) // not always successful diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 53b49ab30f0b..c045387546ed 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -365,22 +365,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 0 include_modes = list(/datum/game_mode/nuclear/clown_ops) -/datum/uplink_item/dangerous/clownoppin - name = "Ultra Hilarious Firing Pin" - desc = "A firing pin that, when inserted into a gun, makes that gun only useable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it." - cost = 1 //much cheaper for clown ops than for clowns - item = /obj/item/firing_pin/clown/ultra - include_modes = list(/datum/game_mode/nuclear/clown_ops) - illegal_tech = FALSE - -/datum/uplink_item/dangerous/clownopsuperpin - name = "Super Ultra Hilarious Firing Pin" - desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it." - cost = 4 //much cheaper for clown ops than for clowns - item = /obj/item/firing_pin/clown/ultra/selfdestruct - include_modes = list(/datum/game_mode/nuclear/clown_ops) - illegal_tech = FALSE - /datum/uplink_item/dangerous/bioterror name = "Biohazardous Chemical Sprayer" desc = "A handheld chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \ @@ -1952,30 +1936,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/reverse_bear_trap restricted_roles = list("Clown") -/datum/uplink_item/role_restricted/reverse_revolver - name = "Reverse Revolver" - desc = "A revolver that always fires at its user. \"Accidentally\" drop your weapon, then watch as the greedy corporate pigs blow their own brains all over the wall. \ - The revolver itself is actually real. Only clumsy people, and clowns, can fire it normally. Comes in a box of hugs. Honk." - cost = 14 - item = /obj/item/storage/box/hug/reverse_revolver - restricted_roles = list("Clown") - -/datum/uplink_item/role_restricted/clownpin - name = "Ultra Hilarious Firing Pin" - desc = "A firing pin that, when inserted into a gun, makes that gun only usable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it." - cost = 4 - item = /obj/item/firing_pin/clown/ultra - restricted_roles = list("Clown") - illegal_tech = FALSE - -/datum/uplink_item/role_restricted/clownsuperpin - name = "Super Ultra Hilarious Firing Pin" - desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it." - cost = 7 - item = /obj/item/firing_pin/clown/ultra/selfdestruct - restricted_roles = list("Clown") - illegal_tech = FALSE - /datum/uplink_item/role_restricted/laser_arm name = "Laser Arm Implant" desc = "An implant that grants you a recharging laser gun inside your arm. Weak to EMPs. Comes with a syndicate autosurgeon for immediate self-application." From bc765fa2889342a63cf44b92274b66f65b71d1bc Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 5 Feb 2024 18:12:53 -0600 Subject: [PATCH 095/206] ok no errors? --- _maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm | 2 +- _maps/shuttles/syndicate/syndicate_luxembourg.dmm | 2 +- code/game/objects/items/storage/uplink_kits.dm | 2 +- code/modules/vending/liberation_toy.dm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm index 48f7614da429..c3d59b531da1 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm @@ -251,7 +251,7 @@ /area/ruin/powered) "ga" = ( /obj/structure/table/wood/reinforced, -/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot{ +/obj/item/gun/ballistic/automatic/smg/c20r/toy{ pixel_x = 5; pixel_y = 7 }, diff --git a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm index cff4c84386e0..991d2769c163 100644 --- a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm +++ b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm @@ -831,7 +831,7 @@ /obj/structure/closet/crate/wooden/toy, /obj/item/ammo_box/magazine/toy/smgm45/riot, /obj/item/ammo_box/magazine/toy/smgm45/riot, -/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot, +/obj/item/gun/ballistic/automatic/smg/c20r/toy, /obj/item/soap/syndie, /obj/item/soap/syndie, /obj/item/soap/syndie, diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index d91fc622cd56..e47922ae3623 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -306,7 +306,7 @@ /obj/item/storage/box/syndie_kit/imp_radio, /obj/item/storage/box/syndie_kit/imp_uplink, /obj/item/clothing/gloves/krav_maga/combatglovesplus, - /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot, + /obj/item/gun/ballistic/automatic/smg/c20r/toy, /obj/item/reagent_containers/hypospray/medipen/stimulants, /obj/item/storage/box/syndie_kit/imp_freedom, /obj/item/toy/eightball/haunted diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index 23a65a503c96..19301643fac4 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -17,7 +17,7 @@ /obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant contraband = list( /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting! - /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot = 10, + /obj/item/gun/ballistic/automatic/smg/c20r/toy = 10, /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot = 10, /obj/item/ammo_box/foambox/riot = 20, /obj/item/toy/katana = 10, From 6c3113db54e8f802b90a14dd34505af24d58e5a7 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 5 Feb 2024 18:20:36 -0600 Subject: [PATCH 096/206] some more --- _maps/shuttles/nanotrasen/nanotrasen_ranger.dmm | 2 +- code/modules/research/techweb/all_nodes.dm | 13 ++----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm index ed46e7e7ef1e..0bf245f53010 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm @@ -3117,7 +3117,7 @@ /area/ship/engineering) "Ha" = ( /obj/structure/closet/secure_closet/lp/lieutenant, -/obj/item/gun/energy/e_gun/mindshield{ +/obj/item/gun/energy/e_gun{ pixel_y = 1 }, /obj/item/stock_parts/cell/gun, diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 12ce53dc175d..769449c42bb5 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -641,7 +641,7 @@ display_name = "Weapon Development Technology" description = "Our researchers have found new ways to weaponize just about everything now." prereq_ids = list("engineering") - design_ids = list("pin_testing", "tele_shield","gun_cell") + design_ids = list("tele_shield","gun_cell") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) export_price = 5000 @@ -650,19 +650,10 @@ display_name = "Advanced Weapon Development Technology" description = "Our weapons are breaking the rules of reality by now." prereq_ids = list("adv_engi", "weaponry") - design_ids = list("pin_loyalty", "gun_cell_upgraded", "gun_cell_large") + design_ids = list("gun_cell_upgraded", "gun_cell_large") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) export_price = 5000 -/datum/techweb_node/firingpin - id = "firingpin" - display_name = "Pin Security Decompilation" - description = "A resource-intensive hacking operation, allowing for the creation of pins without a mindshield brake." - prereq_ids = list("adv_weaponry") - design_ids = list("pin_standard") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 15000) - export_price = 5000 - /datum/techweb_node/electric_weapons id = "electronic_weapons" display_name = "Electric Weapons" From 598154059e6d759ae459174ab69e34cdfebcde62 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 5 Feb 2024 18:38:51 -0600 Subject: [PATCH 097/206] than k you thingrvr :thumbsup: --- check_regex.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check_regex.yaml b/check_regex.yaml index df64dec9aae1..d19ee9828e4e 100644 --- a/check_regex.yaml +++ b/check_regex.yaml @@ -29,7 +29,7 @@ standards: - exactly: [1, "/area text paths", '"/area'] - exactly: [17, "/datum text paths", '"/datum'] - exactly: [4, "/mob text paths", '"/mob'] - - exactly: [44, "/obj text paths", '"/obj'] + - exactly: [43, "/obj text paths", '"/obj'] - exactly: [0, "/turf text paths", '"/turf'] - exactly: [117, "text2path uses", "text2path"] From 7547ca674920b482e5344523e7bb879d822b44c5 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 7 Feb 2024 13:25:26 -0600 Subject: [PATCH 098/206] proper foam darts where needed --- .../RandomRuins/RockRuins/rockplanet_harmfactory.dmm | 2 +- _maps/shuttles/syndicate/syndicate_luxembourg.dmm | 2 +- code/game/objects/items/storage/backpack.dm | 4 ++-- code/game/objects/items/storage/uplink_kits.dm | 2 +- code/modules/projectiles/guns/ballistic/toy.dm | 11 +++++++---- code/modules/uplink/uplink_items.dm | 4 ++-- code/modules/vending/liberation_toy.dm | 2 +- 7 files changed, 15 insertions(+), 12 deletions(-) diff --git a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm index c3d59b531da1..48f7614da429 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm @@ -251,7 +251,7 @@ /area/ruin/powered) "ga" = ( /obj/structure/table/wood/reinforced, -/obj/item/gun/ballistic/automatic/smg/c20r/toy{ +/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot{ pixel_x = 5; pixel_y = 7 }, diff --git a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm index 991d2769c163..cff4c84386e0 100644 --- a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm +++ b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm @@ -831,7 +831,7 @@ /obj/structure/closet/crate/wooden/toy, /obj/item/ammo_box/magazine/toy/smgm45/riot, /obj/item/ammo_box/magazine/toy/smgm45/riot, -/obj/item/gun/ballistic/automatic/smg/c20r/toy, +/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot, /obj/item/soap/syndie, /obj/item/soap/syndie, /obj/item/soap/syndie, diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index b4ec267bd770..dc750fb15594 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -644,7 +644,7 @@ /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents() new /obj/item/clothing/shoes/magboots/syndie(src) new /obj/item/storage/firstaid/tactical(src) - new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy(src) + new /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot(src) new /obj/item/ammo_box/foambox/riot(src) /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle @@ -654,7 +654,7 @@ new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src) new /obj/item/storage/box/syndie_kit/chemical(src) new /obj/item/gun/syringe/syndicate(src) - new /obj/item/gun/ballistic/automatic/smg/c20r/toy(src) + new /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot(src) new /obj/item/storage/box/syringes(src) new /obj/item/ammo_box/foambox/riot(src) new /obj/item/grenade/chem_grenade/bioterrorfoam(src) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index e47922ae3623..d91fc622cd56 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -306,7 +306,7 @@ /obj/item/storage/box/syndie_kit/imp_radio, /obj/item/storage/box/syndie_kit/imp_uplink, /obj/item/clothing/gloves/krav_maga/combatglovesplus, - /obj/item/gun/ballistic/automatic/smg/c20r/toy, + /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot, /obj/item/reagent_containers/hypospray/medipen/stimulants, /obj/item/storage/box/syndie_kit/imp_freedom, /obj/item/toy/eightball/haunted diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 63c25c5d62f6..95911c9269bc 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -78,29 +78,32 @@ recoil = -10 //its a toy... recoil_unwielded = -10 -/obj/item/gun/ballistic/automatic/smg/c20r/toy //This is the syndicate variant with syndicate firing pin and riot darts. +/obj/item/gun/ballistic/automatic/smg/c20r/toy name = "donksoft SMG" desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up." can_suppress = FALSE item_flags = NONE - mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot + mag_type = /obj/item/ammo_box/magazine/toy/smgm45 fire_sound = 'sound/items/syringeproj.ogg' casing_ejector = FALSE manufacturer = MANUFACTURER_DONKCO recoil = -10 //its a toy... recoil_unwielded = -10 +/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot + mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot + /obj/item/gun/ballistic/automatic/smg/c20r/toy/update_overlays() . = ..() . += "[icon_state]_toy" -/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy //This is the syndicate variant with syndicate firing pin and riot darts. +/obj/item/gun/ballistic/automatic/hmg/l6_saw/toy name = "donksoft LMG" desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up." fire_sound = 'sound/items/syringeproj.ogg' can_suppress = FALSE item_flags = NONE - mag_type = /obj/item/ammo_box/magazine/toy/m762/riot + mag_type = /obj/item/ammo_box/magazine/toy/m762 casing_ejector = FALSE manufacturer = MANUFACTURER_DONKCO recoil = -10 //its a toy... diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 6943b4edd4e2..f58f94df84dd 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -516,7 +516,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/dangerous/foamsmg name = "Toy Submachine Gun" desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade darts with a 20-round magazine." - item = /obj/item/gun/ballistic/automatic/smg/c20r/toy + item = /obj/item/gun/ballistic/automatic/smg/c20r/toy/riot cost = 5 surplus = 0 include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) @@ -525,7 +525,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "Toy Machine Gun" desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating \ riot grade darts, that can briefly incapacitate someone in just one volley." - item = /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy + item = /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot cost = 10 surplus = 0 include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index 19301643fac4..8bf1121ee157 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -18,7 +18,7 @@ contraband = list( /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting! /obj/item/gun/ballistic/automatic/smg/c20r/toy = 10, - /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy/riot = 10, + /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy = 10, /obj/item/ammo_box/foambox/riot = 20, /obj/item/toy/katana = 10, /obj/item/dualsaber/toy = 5, From a4604f455980a031c75f831de562a639892ea11a Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 29 Feb 2024 15:13:02 -0600 Subject: [PATCH 099/206] ya --- code/modules/guncrafting/frame.dm | 43 +++++++++++++++++++++---------- code/modules/guncrafting/lathe.dm | 4 ++- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index de54637a7190..6ab248e373f6 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -118,25 +118,42 @@ /obj/item/part/gun/frame/attack_self(mob/user) var/list/choose_options = list() var/list/option_results = list() + for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) var/obj/recipe_result = recipe.result - var/list/parts_for_craft = list() - for(var/obj/item/part/gun/part as anything in recipe.valid_parts) - var/part_type = initial(part.gun_part_type) - var/list/installed_types = get_part_types() - if(!(part_type in installed_types)) - parts_for_craft += " \a [initial(part.name)]" - if(length(parts_for_craft) != 0) - to_chat(user, span_warning("Parts needed for a [initial(recipe_result.name)]:")) - for(var/part in parts_for_craft) - to_chat(user, span_warning(part)) + var/list/missing_parts = get_missing_parts_for_recipe(recipe) + + if(length(missing_parts) != 0) + display_missing_parts_warning(user, recipe_result, missing_parts) else - to_chat(user, span_notice("You can craft a [initial(recipe_result.name)] with the parts installed.")) - choose_options += list("Craft [initial(recipe_result.name)]" = image(icon = initial(recipe_result.icon), icon_state = initial(recipe_result.icon_state))) - option_results["Craft [initial(recipe_result.name)]"] = recipe_result + add_recipe_to_options(user, recipe_result, choose_options, option_results) + if(length(choose_options) == 0) to_chat(user, span_warning("No recipes can be crafted with the parts installed.")) return + + craft_selected_option(user, choose_options, option_results) + +/obj/item/part/gun/frame/proc/get_missing_parts_for_recipe(datum/lathe_recipe/gun/recipe) + var/list/missing_parts = list() + for(var/obj/item/part/gun/part as anything in recipe.valid_parts) + var/part_type = initial(part.gun_part_type) + var/list/installed_types = get_part_types() + if(!(part_type in installed_types)) + missing_parts += " \a [initial(part.name)]" + return missing_parts + +/obj/item/part/gun/frame/proc/display_missing_parts_warning(mob/user, obj/recipe_result, list/missing_parts) + to_chat(user, span_warning("Parts needed for a [initial(recipe_result.name)]:")) + for(var/part in missing_parts) + to_chat(user, span_warning(part)) + +/obj/item/part/gun/frame/proc/add_recipe_to_options(mob/user, obj/recipe_result, list/choose_options, list/option_results) + to_chat(user, span_notice("You can craft a [initial(recipe_result.name)] with the parts installed.")) + choose_options += list("Craft [initial(recipe_result.name)]" = image(icon = initial(recipe_result.icon), icon_state = initial(recipe_result.icon_state))) + option_results["Craft [initial(recipe_result.name)]"] = recipe_result + +/obj/item/part/gun/frame/proc/craft_selected_option(mob/user, list/choose_options, list/option_results) var/picked_option = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) if(!picked_option) return diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 861b49c9ec0c..8da0ac5be7af 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -104,11 +104,13 @@ playsound(src,'sound/items/welder.ogg',50,TRUE) if(istype(work_piece, /obj/item/gun)) var/obj/item/gun/gun_work_piece = work_piece - var/obj/item/new_part = new /obj/item/part/gun + var/obj/item/new_part = new /obj/item/stack/gun_part new_part.forceMove(drop_location()) + /* I think this should be a seperate procces for obtaining the frame if(gun_work_piece.frame) var/obj/item/frame = gun_work_piece.frame frame.forceMove(drop_location()) + */ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(work_piece) if(material_amount) From e735f975706a5f62e58385136ca8ee7f792b1e3b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 4 Mar 2024 23:11:37 -0600 Subject: [PATCH 100/206] i dunno --- code/modules/cargo/packs/material.dm | 10 +++ code/modules/guncrafting/frame.dm | 12 +++ code/modules/guncrafting/guncrafting.dm | 19 ++--- code/modules/guncrafting/lathe.dm | 2 +- code/modules/guncrafting/recipe.dm | 101 +++++++++--------------- 5 files changed, 66 insertions(+), 78 deletions(-) diff --git a/code/modules/cargo/packs/material.dm b/code/modules/cargo/packs/material.dm index ee0f00e42d96..2c75c44d7740 100644 --- a/code/modules/cargo/packs/material.dm +++ b/code/modules/cargo/packs/material.dm @@ -110,3 +110,13 @@ contains = list(/obj/item/stack/sheet/mineral/wood/fifty) crate_name = "wood planks crate" +/datum/supply_pack/material/gun_parts + name = "Gun Parts Crate" + desc = "Contains a variety of parts for assembling and maintaining firearms." + cost = 1000 + contains = list(/obj/item/stack/gun_part, + /obj/item/stack/gun_part, + /obj/item/stack/gun_part, + /obj/item/stack/gun_part, + /obj/item/stack/gun_part) + crate_name = "gun parts crate" diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 6ab248e373f6..d4981fd9b37f 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -197,6 +197,7 @@ . += "[src] has " + part_type_message + "." */ +/* /obj/item/part/gun/frame/winchester name = "winchester gun frame" icon_state = "frame_shotgun" @@ -223,8 +224,19 @@ /obj/item/part/gun/frame/boltaction name = "bolt action gun frame" +*/ + /obj/item/part/gun/frame/revolver + name = "revolver gun frame" + icon_state = "frame_revolver" + preinstalled_parts = list( + /obj/item/part/gun/modular/grip/wood, + /obj/item/part/gun/modular/mechanism/revolver, + /obj/item/part/gun/modular/barrel/revolver + ) +/* /obj/item/part/gun/frame/tec9 /obj/item/part/gun/frame/shotgun +*/ diff --git a/code/modules/guncrafting/guncrafting.dm b/code/modules/guncrafting/guncrafting.dm index 84975f846d7f..483a887c1622 100644 --- a/code/modules/guncrafting/guncrafting.dm +++ b/code/modules/guncrafting/guncrafting.dm @@ -35,17 +35,12 @@ new /obj/item/tool/hammer(src) new /obj/item/tool/file(src) new /obj/item/tool/saw(src) - new /obj/item/part/gun/frame/winchester(src) + new /obj/item/stack/gun_part(src) + new /obj/item/part/gun/frame/revolver(src) new /obj/item/part/gun/modular/grip/wood(src) - new /obj/item/part/gun/modular/mechanism/shotgun(src) - new /obj/item/part/gun/modular/barrel/shotgun(src) - new /obj/item/part/gun/frame/winchester(src) + new /obj/item/part/gun/modular/mechanism/revolver(src) + new /obj/item/part/gun/modular/barrel/revolver(src) + new /obj/item/part/gun/frame/revolver(src) new /obj/item/part/gun/modular/grip/wood(src) - new /obj/item/part/gun/modular/mechanism/shotgun(src) - new /obj/item/part/gun/modular/barrel/shotgun(src) - new /obj/item/part/gun/frame(src) - new /obj/item/part/gun/frame/candor(src) - new /obj/item/part/gun/modular/grip/wood(src) - new /obj/item/part/gun/modular/mechanism(src) - new /obj/item/part/gun/modular/barrel(src) - + new /obj/item/part/gun/modular/mechanism/revolver(src) + new /obj/item/part/gun/modular/barrel/revolver(src) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 8da0ac5be7af..e42a680e5359 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -103,7 +103,7 @@ to_chat(user, "The [work_piece.name] is broken down into parts.") playsound(src,'sound/items/welder.ogg',50,TRUE) if(istype(work_piece, /obj/item/gun)) - var/obj/item/gun/gun_work_piece = work_piece + //var/obj/item/gun/gun_work_piece = work_piece var/obj/item/new_part = new /obj/item/stack/gun_part new_part.forceMove(drop_location()) /* I think this should be a seperate procces for obtaining the frame diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index 2fea8240799c..e2eb1b16de9e 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -9,13 +9,15 @@ /datum/lathe_recipe/part/frame result = /obj/item/part/gun/frame -/datum/lathe_recipe/part/frame/winchester - result = /obj/item/part/gun/frame/winchester /datum/lathe_recipe/part/grip/wood result = /obj/item/part/gun/modular/grip/wood reqs = list(/obj/item/stack/sheet/mineral/wood = 3) +/* +/datum/lathe_recipe/part/frame/winchester + result = /obj/item/part/gun/frame/winchester + /datum/lathe_recipe/part/mechanism/shotgun result = /obj/item/part/gun/modular/mechanism/shotgun reqs = list(/obj/item/stack/sheet/metal = 2, @@ -23,68 +25,47 @@ /datum/lathe_recipe/part/barrel/shotgun result = /obj/item/part/gun/modular/barrel/shotgun +*/ + +/datum/lathe_recipe/part/barrel/revolver + result = /obj/item/part/gun/modular/barrel/revolver + reqs = list(/obj/item/stack/sheet/metal = 2) + +/datum/lathe_recipe/part/mechanism/revolver + result = /obj/item/part/gun/modular/mechanism/revolver + reqs = list(/obj/item/stack/sheet/metal = 2, + /obj/item/stack/gun_part = 2) + +/datum/lathe_recipe/part/frame/revolver + result = /obj/item/part/gun/frame/revolver + reqs = list(/obj/item/stack/sheet/metal = 2) /datum/lathe_recipe/gun var/list/valid_parts = list() var/required_part_types = ALL -/datum/lathe_recipe/gun/candor - result = /obj/item/gun/ballistic/automatic/pistol/candor - valid_parts = list( - /obj/item/part/gun/frame/candor, - /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/pistol, - /obj/item/part/gun/modular/barrel/pistol - ) - /* -/datum/lathe_recipe/gun/winchester - result = /obj/item/gun/ballistic/shotgun/winchester +/datum/lathe_recipe/gun/vickland + result = /obj/item/gun/ballistic/automatic/vickland valid_parts = list( - /obj/item/part/gun/frame/winchester, + /obj/item/part/gun/frame, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/rifle, /obj/item/part/gun/modular/barrel/rifle ) -/datum/lathe_recipe/gun/winchester/mk1 - result = /obj/item/gun/ballistic/shotgun/winchester/mk1 +/datum/lathe_recipe/gun/candor + result = /obj/item/gun/ballistic/automatic/pistol/candor valid_parts = list( - /obj/item/part/gun/frame/winchester/mk1, + /obj/item/part/gun/frame/candor, /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/rifle, - /obj/item/part/gun/modular/barrel/rifle - ) - -/datum/lathe_recipe/gun/tec9 - result = /obj/item/gun/ballistic/automatic/pistol/tec9 - valid_parts = list( - /obj/item/part/gun/frame/tec9, - /obj/item/part/gun/modular/grip/black, /obj/item/part/gun/modular/mechanism/pistol, /obj/item/part/gun/modular/barrel/pistol ) +*/ -/datum/lathe_recipe/gun/boltaction - result = /obj/item/gun/ballistic/rifle/boltaction - valid_parts = list( - /obj/item/part/gun/frame/boltaction, - /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/rifle, - /obj/item/part/gun/modular/barrel/rifle - ) - -/datum/lathe_recipe/gun/doublebarrel - result = /obj/item/gun/ballistic/shotgun/doublebarrel - valid_parts = list( - /obj/item/part/gun/frame/shotgun, - /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/shotgun, - /obj/item/part/gun/modular/barrel/shotgun - ) - -/datum/lathe_recipe/gun/derringer - result = /obj/item/gun/ballistic/derringer +/datum/lathe_recipe/gun/montagne + result = /obj/item/gun/ballistic/revolver/montagne valid_parts = list( /obj/item/part/gun/frame/revolver, /obj/item/part/gun/modular/grip/wood, @@ -92,8 +73,8 @@ /obj/item/part/gun/modular/barrel/revolver ) -/datum/lathe_recipe/gun/srmrevolver - result = /obj/item/gun/ballistic/revolver/srm +/datum/lathe_recipe/gun/ashhand + result = /obj/item/gun/ballistic/revolver/ashhand valid_parts = list( /obj/item/part/gun/frame/revolver, /obj/item/part/gun/modular/grip/wood, @@ -101,8 +82,8 @@ /obj/item/part/gun/modular/barrel/revolver ) -/datum/lathe_recipe/gun/pepperbox - result = /obj/item/gun/ballistic/revolver/pepperbox +/datum/lathe_recipe/gun/firebrand + result = /obj/item/gun/ballistic/revolver/firebrand valid_parts = list( /obj/item/part/gun/frame/revolver, /obj/item/part/gun/modular/grip/wood, @@ -110,21 +91,11 @@ /obj/item/part/gun/modular/barrel/revolver ) -/datum/lathe_recipe/gun/nagantrevolver - result = /obj/item/gun/ballistic/revolver/nagant - valid_parts = list( - /obj/item/part/gun/frame, - /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism, - /obj/item/part/gun/modular/barrel - ) - -/datum/lathe_recipe/gun/nagantrifle - result = /obj/item/gun/ballistic/rifle/boltaction +/datum/lathe_recipe/gun/shadow + result = /obj/item/gun/ballistic/revolver/shadow valid_parts = list( - /obj/item/part/gun/frame, + /obj/item/part/gun/frame/revolver, /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism, - /obj/item/part/gun/modular/barrel + /obj/item/part/gun/modular/mechanism/revolver, + /obj/item/part/gun/modular/barrel/revolver ) -*/ From f345d44bc57686a1f2bcc8018076a39a2ff6fcf2 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 9 Mar 2024 13:52:58 -0600 Subject: [PATCH 101/206] yea --- code/modules/guncrafting/frame.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index d4981fd9b37f..806c0be26fd7 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -173,8 +173,10 @@ /obj/item/part/gun/frame/examine(user, distance) . = ..() if(.) - for(var/obj/item/part/gun/part in installed_parts) - . += "[src] has \a [part] [icon2html(part, user)] installed." + if(length(installed_parts) != 0) + . += "[src] has parts installed:" + for(var/obj/item/part/gun/part in installed_parts) + . += "\a [part] [icon2html(part, user)] installed." for(var/datum/lathe_recipe/gun/recipe in filtered_recipes) var/obj/recipe_result = recipe.result var/list/parts_for_craft = list() @@ -188,7 +190,7 @@ for(var/part in parts_for_craft) . += part else - . += "You can craft a [initial(recipe_result.name)] with the parts installed." + . += "You can craft a [initial(recipe_result.name)]." /* var/part_type_message = "" for(var/part_type in get_part_types()) From 850647831734f56fba2c3d35c67fc641402a3436 Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 21 Mar 2024 10:05:11 -0500 Subject: [PATCH 102/206] culling to pistols and revvys and reduces gun part quanity from crate --- code/modules/cargo/packs/material.dm | 4 +-- code/modules/guncrafting/frame.dm | 48 ++++++---------------------- code/modules/guncrafting/part.dm | 16 ++-------- code/modules/guncrafting/recipe.dm | 25 --------------- 4 files changed, 13 insertions(+), 80 deletions(-) diff --git a/code/modules/cargo/packs/material.dm b/code/modules/cargo/packs/material.dm index 2c75c44d7740..2ace6bcf60cd 100644 --- a/code/modules/cargo/packs/material.dm +++ b/code/modules/cargo/packs/material.dm @@ -116,7 +116,5 @@ cost = 1000 contains = list(/obj/item/stack/gun_part, /obj/item/stack/gun_part, - /obj/item/stack/gun_part, - /obj/item/stack/gun_part, - /obj/item/stack/gun_part) + /obj/item/stack/gun_part,) crate_name = "gun parts crate" diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 806c0be26fd7..f4bc7a114891 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -2,7 +2,7 @@ name = "gun frame" desc = "a generic gun frame." icon_state = "frame_olivaw" - var/list/preinstalled_parts = list() + //var/list/preinstalled_parts = list() var/list/installed_parts = list() var/list/filtered_recipes = list() @@ -11,8 +11,10 @@ /obj/item/part/gun/frame/Initialize() . = ..() + /* for (var/part_type in preinstalled_parts) installed_parts += new part_type(src) + */ get_current_recipes() /* var/spawn_with_preinstalled_parts = TRUE @@ -199,46 +201,14 @@ . += "[src] has " + part_type_message + "." */ -/* -/obj/item/part/gun/frame/winchester - name = "winchester gun frame" - icon_state = "frame_shotgun" - preinstalled_parts = list( - /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/rifle, - /obj/item/part/gun/modular/barrel/rifle - ) - -/obj/item/part/gun/frame/winchester/mk1 - name = "winchester mk1 gun frame" - -/obj/item/part/gun/frame/candor - name = "candor gun frame" - preinstalled_parts = list( - /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/pistol, - /obj/item/part/gun/modular/barrel/pistol - ) - -/obj/item/part/gun/frame/commander - name = "commander gun frame" - -/obj/item/part/gun/frame/boltaction - name = "bolt action gun frame" - -*/ - /obj/item/part/gun/frame/revolver name = "revolver gun frame" icon_state = "frame_revolver" - preinstalled_parts = list( - /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/revolver, - /obj/item/part/gun/modular/barrel/revolver - ) -/* -/obj/item/part/gun/frame/tec9 +/obj/item/part/gun/frame/deringer + name = "deringer gun frame" + icon_state = "frame_revolver" -/obj/item/part/gun/frame/shotgun -*/ +/obj/item/part/gun/frame/pistol + name = "pistol gun frame" + icon_state = "frame_pistol" diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm index 7fc06a6cec20..005fed46d839 100644 --- a/code/modules/guncrafting/part.dm +++ b/code/modules/guncrafting/part.dm @@ -33,16 +33,11 @@ icon_state = "mechanism_pistol" gun_part_type = GUN_PART_MECHANISM -/obj/item/part/gun/modular/mechanism/shotgun - name = "generic shotgun mechanism" - icon_state = "mechanism_shotgun" - -/obj/item/part/gun/modular/mechanism/rifle - /obj/item/part/gun/modular/mechanism/revolver name = "generic revolver mechanism" /obj/item/part/gun/modular/mechanism/pistol + name = "generic pistol mechanism" /obj/item/part/gun/modular/barrel name = "generic barrel" @@ -50,13 +45,8 @@ icon_state = "barrel_35" gun_part_type = GUN_PART_BARREL -/obj/item/part/gun/modular/barrel/shotgun - name = "generic shotgun barrel" - desc = "A gun barrel, which keeps the bullet going in the right direction." - icon_state = "barrel_30" - -/obj/item/part/gun/modular/barrel/rifle - /obj/item/part/gun/modular/barrel/revolver + name = "generic revolver barrel" /obj/item/part/gun/modular/barrel/pistol + name = "generic pistol barrel" diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index e2eb1b16de9e..84b234a75b38 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -9,24 +9,10 @@ /datum/lathe_recipe/part/frame result = /obj/item/part/gun/frame - /datum/lathe_recipe/part/grip/wood result = /obj/item/part/gun/modular/grip/wood reqs = list(/obj/item/stack/sheet/mineral/wood = 3) -/* -/datum/lathe_recipe/part/frame/winchester - result = /obj/item/part/gun/frame/winchester - -/datum/lathe_recipe/part/mechanism/shotgun - result = /obj/item/part/gun/modular/mechanism/shotgun - reqs = list(/obj/item/stack/sheet/metal = 2, - /obj/item/stack/gun_part = 1) - -/datum/lathe_recipe/part/barrel/shotgun - result = /obj/item/part/gun/modular/barrel/shotgun -*/ - /datum/lathe_recipe/part/barrel/revolver result = /obj/item/part/gun/modular/barrel/revolver reqs = list(/obj/item/stack/sheet/metal = 2) @@ -44,16 +30,6 @@ var/list/valid_parts = list() var/required_part_types = ALL -/* -/datum/lathe_recipe/gun/vickland - result = /obj/item/gun/ballistic/automatic/vickland - valid_parts = list( - /obj/item/part/gun/frame, - /obj/item/part/gun/modular/grip/wood, - /obj/item/part/gun/modular/mechanism/rifle, - /obj/item/part/gun/modular/barrel/rifle - ) - /datum/lathe_recipe/gun/candor result = /obj/item/gun/ballistic/automatic/pistol/candor valid_parts = list( @@ -62,7 +38,6 @@ /obj/item/part/gun/modular/mechanism/pistol, /obj/item/part/gun/modular/barrel/pistol ) -*/ /datum/lathe_recipe/gun/montagne result = /obj/item/gun/ballistic/revolver/montagne From 9e22fae7c523320859b17d9b4b54bbb7c5b7ad7c Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 21 Mar 2024 11:26:40 -0500 Subject: [PATCH 103/206] augh --- .../datums/mapgen/planetary/WasteGenerator.dm | 1 + .../game/objects/effects/spawners/lootdrop.dm | 18 +++ code/modules/guncrafting/frame.dm | 3 + code/modules/guncrafting/lathe.dm | 109 ++++++++++++++---- code/modules/guncrafting/part.dm | 8 ++ 5 files changed, 118 insertions(+), 21 deletions(-) diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm index d0243740bc3b..58bdbd6b3868 100644 --- a/code/datums/mapgen/planetary/WasteGenerator.dm +++ b/code/datums/mapgen/planetary/WasteGenerator.dm @@ -227,6 +227,7 @@ flora_spawn_list = list( //there are no plants here /obj/effect/spawner/lootdrop/waste/mechwreck = 200, /obj/effect/spawner/lootdrop/waste/mechwreck/rare = 50, + /obj/effect/spawner/lootdrop/gun_parts = 500, /obj/effect/spawner/lootdrop/waste/trash = 900, /obj/effect/spawner/lootdrop/waste/radiation = 80, /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 20, diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index d1f47ff647f6..1fd2ab83a1fb 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -1007,6 +1007,24 @@ //wasteplanet things +/obj/effect/spawner/lootdrop/gun_parts + name = "gun parts spawner" + loot = list( + /obj/item/stack/gun_part = 10, + /obj/item/part/gun/modular/grip = 1, + /obj/item/part/gun/modular/grip/wood = 1, + /obj/item/part/gun/modular/grip/black = 1, + /obj/item/part/gun/modular/mechanism = 1, + /obj/item/part/gun/modular/mechanism/revolver = 1, + /obj/item/part/gun/modular/mechanism/pistol = 1, + /obj/item/part/gun/modular/barrel = 1, + /obj/item/part/gun/modular/barrel/revolver = 1, + /obj/item/part/gun/modular/barrel/pistol = 1, + /obj/item/part/gun/frame/revolver = 1, + /obj/item/part/gun/frame/deringer = 1, + /obj/item/part/gun/frame/pistol + ) + /obj/effect/spawner/lootdrop/waste/grille_or_trash name = "wasteplanet loot spawner" loot = list( diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index f4bc7a114891..5ced1cd4e36d 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -204,11 +204,14 @@ /obj/item/part/gun/frame/revolver name = "revolver gun frame" icon_state = "frame_revolver" + material_cost = list(/obj/item/stack/sheet/metal = 2) /obj/item/part/gun/frame/deringer name = "deringer gun frame" icon_state = "frame_revolver" + material_cost = list(/obj/item/stack/sheet/metal = 2) /obj/item/part/gun/frame/pistol name = "pistol gun frame" icon_state = "frame_pistol" + material_cost = list(/obj/item/stack/sheet/metal = 2) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index e42a680e5359..ed3cc72abd9f 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -16,6 +16,10 @@ var/mode = FALSE //If activily doing a do untill loop var/working = FALSE + //The part that the user has picked to fabricate + var/obj/item/picked_part = FALSE + var/list/tools_required = list(/obj/item/tool/hammer, /obj/item/tool/file, /obj/item/tool/saw) + var/tool_required = FALSE /obj/structure/lathe/Initialize() AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/plasma, /datum/material/gold, /datum/material/diamond, /datum/material/plastic, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), INFINITY, FALSE, null, null, null, TRUE) @@ -31,7 +35,7 @@ if(in_progress) to_chat(user, "The lathe is currently in use.") return - remove_part(user) + remove_work_piece(user) /obj/structure/lathe/attack_hand(mob/living/carbon/human/user) if(!work_piece) @@ -44,9 +48,9 @@ mode = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) if(mode && !working) if(mode == "Deconstruct") - deconstruct_part(user) + deconstruct_work_piece(user) if(mode == "Fabricate") - fabricate_part(user) + work_on_part(user) /obj/structure/lathe/attackby(obj/item/I, mob/user) if(work_piece) @@ -58,7 +62,7 @@ work_piece.vis_flags |= VIS_INHERIT_ID vis_contents += work_piece -/obj/structure/lathe/proc/remove_part(mob/user) +/obj/structure/lathe/proc/remove_work_piece(mob/user) if(work_piece) vis_contents -= work_piece work_piece.forceMove(drop_location()) @@ -68,7 +72,7 @@ in_progress = FALSE mode = FALSE -/obj/structure/lathe/proc/destroy_part(mob/user) +/obj/structure/lathe/proc/destroy_work_piece(mob/user) if(work_piece) vis_contents -= work_piece qdel(work_piece) @@ -76,11 +80,18 @@ in_progress = FALSE mode = FALSE +/obj/structure/lathe/proc/reset_lathe() + picked_part = FALSE + in_progress = FALSE + mode = FALSE + steps_left = FALSE + working = FALSE + ///////////////// // DECONSTRUCT // ///////////////// -/obj/structure/lathe/proc/deconstruct_part(mob/living/carbon/human/user) +/obj/structure/lathe/proc/deconstruct_work_piece(mob/living/carbon/human/user) if(!in_progress) in_progress = TRUE steps_left = 3 @@ -94,12 +105,12 @@ playsound(src,'sound/items/welder2.ogg',50,TRUE) to_chat(user, "You have [steps_left] steps left.") user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE) - deconstruct_part(user) + deconstruct_work_piece(user) else - scrap_item(work_piece) + scrap_work_piece(work_piece) working = FALSE -/obj/structure/lathe/proc/scrap_item(mob/user) +/obj/structure/lathe/proc/scrap_work_piece(mob/user) to_chat(user, "The [work_piece.name] is broken down into parts.") playsound(src,'sound/items/welder.ogg',50,TRUE) if(istype(work_piece, /obj/item/gun)) @@ -116,28 +127,84 @@ if(material_amount) materials.insert_item(work_piece) materials.retrieve_all() - destroy_part(user) + destroy_work_piece(user) + reset_lathe() /////////////// // FABRICATE // /////////////// -/obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user) +/obj/structure/lathe/proc/choose_part(mob/living/carbon/human/user) if(istype (work_piece, /obj/item/gun)) var/obj/item/gun/gun_work_piece = work_piece var/list/choose_options = list() var/list/option_results = list() if(gun_work_piece.frame) - choose_options += list("Craft [gun_work_piece.frame.name]" = image(icon = gun_work_piece.frame.icon , icon_state = gun_work_piece.frame.icon_state)) - option_results["Craft [gun_work_piece.frame.name]"] = gun_work_piece.frame.type - for(var/obj/item/part/gun/gun_part in gun_work_piece.frame.installed_parts) - choose_options += list("Craft [gun_part.name]" = image(icon = gun_part.icon, icon_state = gun_part.icon_state)) - option_results["Craft [gun_part.name]"] = gun_part.type + var/obj/item/part/gun/frame = gun_work_piece.frame + if(frame.material_cost) + choose_options += list("Craft [frame.name]" = image(icon = frame.icon , icon_state = frame.icon_state)) + option_results["Craft [frame.name]"] = frame.type + for(var/obj/item/part/gun/gun_part in frame.installed_parts) + if(gun_part.material_cost) + choose_options += list("Craft [gun_part.name]" = image(icon = gun_part.icon, icon_state = gun_part.icon_state)) + option_results["Craft [gun_part.name]"] = gun_part.type var/choosen_part = show_radial_menu(user, src, choose_options, radius = 38, require_near = TRUE) if(!choosen_part) return - var/turf/T = get_turf(src) - var/obj/item/part/gun/picked_part = option_results[choosen_part] - var/obj/item/part/gun/new_part = new picked_part(T) - new_part.forceMove(drop_location()) - mode = FALSE + if(check_materials(choosen_part)) + return option_results[choosen_part] + +/obj/structure/lathe/proc/get_surrounding_items() + var/list/surrounding_items = list() + for(var/obj/item/I in view(1, src)) + surrounding_items[I.type] += 1 + return surrounding_items + +/obj/structure/lathe/proc/check_materials(obj/item/part/gun/gun_part) + var/list/surrounding_items = get_surrounding_items() + for(var/obj/item/material in gun_part.material_cost) + if(!(material in surrounding_items) || surrounding_items[material] < gun_part.material_cost[material]) + return FALSE + return TRUE + +/obj/structure/lathe/proc/start_work(mob/living/carbon/human/user) + if(in_progress) + return TRUE + in_progress = TRUE + tools_required = list(/obj/item/tool/hammer, /obj/item/tool/file, /obj/item/tool/saw) + tool_required = pick(tools_required) + steps_left = 3 + return TRUE + +/obj/structure/lathe/proc/work_on_part(mob/living/carbon/human/user) + if(!picked_part) + picked_part = choose_part(user) + if(!picked_part || !start_work(user)) + return + if(!user.has_item_of_type(tool_required)) + balloon_alert(user, "You need a [tool_required.name] to work on this part.") + return + if(user.getStaminaLoss() > DECONSTRUCT_STAMINA_MINIMUM) + balloon_alert(user, "too tired") + return FALSE + working = TRUE + if(do_after(user, 20, work_piece)) + if(steps_left > 1) + steps_left-- + playsound(src,'sound/items/welder2.ogg',50,TRUE) + to_chat(user, "You have [steps_left] steps left.") + user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE) + tool_required = pick(tools_required) + balloon_alert(user, "You need a [tool_required.name] next.") + work_on_part(user) + else + fabricate_part(user) + working = FALSE + +/obj/structure/lathe/proc/fabricate_part(mob/living/carbon/human/user) + if(!picked_part) + return + var/turf/T = get_turf(src) + var/obj/item/part/gun/new_part = new picked_part(T) + new_part.forceMove(drop_location()) + reset_lathe() diff --git a/code/modules/guncrafting/part.dm b/code/modules/guncrafting/part.dm index 005fed46d839..9d9c6c3cd53e 100644 --- a/code/modules/guncrafting/part.dm +++ b/code/modules/guncrafting/part.dm @@ -6,6 +6,7 @@ desc = "Spare part of gun." icon_state = "gun_part_1" var/gun_part_type = NONE + var/material_cost = list() /obj/item/part/gun/modular name = "modular gun part" @@ -21,11 +22,14 @@ name = "wood grip" desc = "A wood firearm grip, unattached from a firearm." icon_state = "grip_wood" + material_cost = list(/obj/item/stack/sheet/mineral/wood = 3) + /obj/item/part/gun/modular/grip/black name = "plastic grip" desc = "A black plastic firearm grip, unattached from a firearm. For sleekness and decorum." icon_state = "grip_black" + material_cost = list(/obj/item/stack/sheet/metal = 2) /obj/item/part/gun/modular/mechanism name = "generic mechanism" @@ -35,9 +39,11 @@ /obj/item/part/gun/modular/mechanism/revolver name = "generic revolver mechanism" + material_cost = list(/obj/item/stack/sheet/metal = 3) /obj/item/part/gun/modular/mechanism/pistol name = "generic pistol mechanism" + material_cost = list(/obj/item/stack/sheet/metal = 3) /obj/item/part/gun/modular/barrel name = "generic barrel" @@ -47,6 +53,8 @@ /obj/item/part/gun/modular/barrel/revolver name = "generic revolver barrel" + material_cost = list(/obj/item/stack/sheet/metal = 2) /obj/item/part/gun/modular/barrel/pistol name = "generic pistol barrel" + material_cost = list(/obj/item/stack/sheet/metal = 2) From 91e07f2fcd30059dee2ecf1c939a9d488080b517 Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 2 Apr 2024 08:28:58 -0500 Subject: [PATCH 104/206] unit unit --- code/modules/unit_tests/gun_crafting.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/unit_tests/gun_crafting.dm b/code/modules/unit_tests/gun_crafting.dm index 31ee1edc2285..c3d203023ee4 100644 --- a/code/modules/unit_tests/gun_crafting.dm +++ b/code/modules/unit_tests/gun_crafting.dm @@ -1,11 +1,12 @@ //Makes sure preinstalled frame parts can be removed an reinstalled /datum/unit_test/gun_crafting/Run() +/* var/list/guns = typesof(/obj/item/gun/ballistic) for(var/gunType in guns) var/obj/item/gun/ballistic/G = new gunType if(G.magazine) TEST_FAIL("[G.type], Mag: [G.magazine.type], Cali: [G.magazine.caliber]") -/* +*/ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) for(var/frame_type in subtypesof(/obj/item/part/gun/frame)) var/obj/item/part/gun/frame/frame = new frame_type @@ -14,4 +15,4 @@ frame.eject_item(installedPart, human) frame.handle_part(installedPart, human) TEST_ASSERT_EQUAL(frame_parts, frame.installed_parts, "Frame parts to match there original contents. I assume frame parts were not reinstalled correctly.") -*/ + From 1fe0695a6c01c83670ce52b2fdc92d620278c06a Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 2 Apr 2024 09:51:20 -0500 Subject: [PATCH 105/206] soft port of CEV-eris tool system --- code/__DEFINES/tools.dm | 25 ----- code/__DEFINES/tools_and_qualities.dm | 97 +++++++++++++++++++ code/game/objects/items.dm | 2 + code/game/objects/items/tools/_tools.dm | 119 ++++++++++++++++++++++++ code/modules/guncrafting/frame.dm | 3 + code/modules/guncrafting/lathe.dm | 19 +++- code/modules/guncrafting/tools.dm | 14 --- shiptest.dme | 4 +- 8 files changed, 237 insertions(+), 46 deletions(-) delete mode 100644 code/__DEFINES/tools.dm create mode 100644 code/__DEFINES/tools_and_qualities.dm create mode 100644 code/game/objects/items/tools/_tools.dm delete mode 100644 code/modules/guncrafting/tools.dm diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm deleted file mode 100644 index 320648170b44..000000000000 --- a/code/__DEFINES/tools.dm +++ /dev/null @@ -1,25 +0,0 @@ -// Tool types -#define TOOL_CROWBAR "crowbar" -#define TOOL_MULTITOOL "multitool" -#define TOOL_SCREWDRIVER "screwdriver" -#define TOOL_WIRECUTTER "wirecutter" -#define TOOL_WRENCH "wrench" -#define TOOL_WELDER "welder" -#define TOOL_ANALYZER "analyzer" -#define TOOL_MINING "mining" -#define TOOL_SHOVEL "shovel" -#define TOOL_RETRACTOR "retractor" -#define TOOL_HEMOSTAT "hemostat" -#define TOOL_CAUTERY "cautery" -#define TOOL_DRILL "drill" -#define TOOL_SCALPEL "scalpel" -#define TOOL_SAW "saw" - -// If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY, -// tool sound is only played when op is started. If not, it's played twice. -#define MIN_TOOL_SOUND_DELAY 20 - -/// When a tooltype_act proc is successful -#define TOOL_ACT_TOOLTYPE_SUCCESS (1<<0) -/// When [COMSIG_ATOM_TOOL_ACT] blocks the act -#define TOOL_ACT_SIGNAL_BLOCKING (1<<1) diff --git a/code/__DEFINES/tools_and_qualities.dm b/code/__DEFINES/tools_and_qualities.dm new file mode 100644 index 000000000000..5ea1a0e88e05 --- /dev/null +++ b/code/__DEFINES/tools_and_qualities.dm @@ -0,0 +1,97 @@ +// Tool types +#define TOOL_CROWBAR "crowbar" +#define TOOL_MULTITOOL "multitool" +#define TOOL_SCREWDRIVER "screwdriver" +#define TOOL_WIRECUTTER "wirecutter" +#define TOOL_WRENCH "wrench" +#define TOOL_WELDER "welder" +#define TOOL_ANALYZER "analyzer" +#define TOOL_MINING "mining" +#define TOOL_SHOVEL "shovel" +#define TOOL_RETRACTOR "retractor" +#define TOOL_HEMOSTAT "hemostat" +#define TOOL_CAUTERY "cautery" +#define TOOL_DRILL "drill" +#define TOOL_SCALPEL "scalpel" +#define TOOL_SAW "saw" + +/////////////// +// ERIS PORT // +/////////////// + +// If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY, +// tool sound is only played when op is started. If not, it's played twice. +#define MIN_TOOL_SOUND_DELAY 20 + +/// When a tooltype_act proc is successful +#define TOOL_ACT_TOOLTYPE_SUCCESS (1<<0) +/// When [COMSIG_ATOM_TOOL_ACT] blocks the act +#define TOOL_ACT_SIGNAL_BLOCKING (1<<1) + +#define ABORT_CHECK -1 +#define TOOL_USE_FAIL -1 +#define TOOL_USE_CANCEL 0 +#define TOOL_USE_SUCCESS 1 + +#define QUALITY_BOLT_TURNING "bolt turning" +#define QUALITY_PULSING "pulsing" +#define QUALITY_PRYING "prying" +#define QUALITY_WELDING "welding" +#define QUALITY_SCREW_DRIVING "screw driving" +#define QUALITY_WIRE_CUTTING "wire cutting" +#define QUALITY_CLAMPING "clamping" +#define QUALITY_CAUTERIZING "cauterizing" +#define QUALITY_RETRACTING "retracting" +#define QUALITY_DRILLING "drilling" +#define QUALITY_HAMMERING "hammering" +#define QUALITY_SAWING "sawing" +#define QUALITY_BONE_SETTING "bone setting" +#define QUALITY_SHOVELING "shoveling" +#define QUALITY_DIGGING "digging" +#define QUALITY_EXCAVATION "excavation" +#define QUALITY_CUTTING "cutting" +#define QUALITY_LASER_CUTTING "laser cutting" //laser scalpels and e-swords - bloodless cutting +#define QUALITY_ADHESIVE "adhesive" +#define QUALITY_SEALING "sealing" +#define QUALITY_FILING "filing" + +//Time for a work for tool system calculated in that way: basic time - tool level - stat check.. +//It means that basic tools will give -30 on time, and people on right job should have -20 at least, or even more. +#define WORKTIME_INSTANT 0 +#define WORKTIME_NEAR_INSTANT 30 +#define WORKTIME_FAST 60 +#define WORKTIME_NORMAL 90 +#define WORKTIME_SLOW 120 +#define WORKTIME_LONG 170 +#define WORKTIME_EXTREMELY_LONG 250 + +//Fail chance for tool system calculated in that way: basic chance - tool level - stat check. +//Basic tools will give -30% on fail chance, and people on right job should have -20% at least. +#define FAILCHANCE_ZERO 0 +#define FAILCHANCE_VERY_EASY 30 +#define FAILCHANCE_EASY 50 +#define FAILCHANCE_NORMAL 60 +#define FAILCHANCE_HARD 80 +#define FAILCHANCE_CHALLENGING 90 +#define FAILCHANCE_VERY_HARD 120 +#define FAILCHANCE_IMPOSSIBLE 150 + +//Sounds for working with tools +#define NO_WORKSOUND -1 + +#define WORKSOUND_CIRCULAR_SAW 'sound/weapons/circsawhit.ogg' +#define WORKSOUND_SIMPLE_SAW 'sound/items/saw.ogg' +#define WORKSOUND_WRENCHING 'sound/items/Ratchet.ogg' +#define WORKSOUND_WIRECUTTING 'sound/items/Wirecutter.ogg' +#define WORKSOUND_WELDING "weld" +#define WORKSOUND_PULSING 'sound/items/multitool_pulse.ogg' +#define WORKSOUND_SCREW_DRIVING 'sound/items/Screwdriver.ogg' +#define WORKSOUND_EASY_CROWBAR 'sound/items/Crowbar.ogg' +#define WORKSOUND_HAMMER 'sound/items/hammer.ogg' +#define WORKSOUND_REMOVING 'sound/items/Deconstruct.ogg' +#define WORKSOUND_DRIVER_TOOL 'sound/items/e_screwdriver.ogg' +#define WORKSOUND_PICKAXE 'sound/items/pickaxe.ogg' +#define WORKSOUND_HARD_SLASH 'sound/weapons/bladeslice.ogg' +#define WORKSOUND_CHAINSAW 'sound/items/chainsaw.ogg' +#define WORKSOUND_TAPE 'sound/items/duct_tape.ogg' +#define WORKSOUND_HONK 'sound/items/bikehorn.ogg' diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index df7c5ae431c5..b63b2ccbf286 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -97,6 +97,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb ///you can see someone's mask through their transparent visor, but you can't reach it var/transparent_protection = NONE + var/list/tool_qualities// List of item qualities for tools system. See tools_and_qualities.dm. + ///flags for what should be done when you click on the item, default is picking it up var/interaction_flags_item = INTERACT_ITEM_ATTACK_HAND_PICKUP diff --git a/code/game/objects/items/tools/_tools.dm b/code/game/objects/items/tools/_tools.dm new file mode 100644 index 000000000000..8fbba03478e1 --- /dev/null +++ b/code/game/objects/items/tools/_tools.dm @@ -0,0 +1,119 @@ +// Time added to tool operations in percent based on original time +// (if you dig hole in 10 seconds then 50 ADDITIONAL_TIME_LOWHEALTH will add 0 on full health, 2.5sec on 50% health and 5sec ~0% health) +#define ADDITIONAL_TIME_LOWHEALTH 60 + +/obj/item/tool + name = "tool" + icon = 'icons/obj/tools.dmi' + slot_flags = SLOT_BELT + force = WEAPON_FORCE_NORMAL + throwforce = WEAPON_FORCE_NORMAL + w_class = ITEM_SIZE_SMALL + +/* + //spawn values + bad_type = /obj/item/tool + spawn_tags = SPAWN_TAG_TOOL + + price_tag = 20 + + health = 600 + maxHealth = 600 + + var/tool_in_use = FALSE + + var/force_upgrade_mults = 1 + + var/force_upgrade_mods = 0 + + var/sparks_on_use = FALSE //Set to TRUE if you want to have sparks on each use of a tool + var/eye_hazard = FALSE //Set to TRUE should damage users eyes if they without eye protection + + var/use_power_cost = 0 //For tool system, determinze how much power tool will drain from cells, 0 means no cell needed + var/obj/item/cell/cell + var/suitable_cell //Dont forget to edit this for a tool, if you want in to consume cells + var/passive_power_cost = 1 //Energy consumed per process tick while active + + var/use_fuel_cost = 0 //Same, only for fuel. And for the sake of God, DONT USE CELLS AND FUEL SIMULTANEOUSLY. + var/passive_fuel_cost = 0.03 //Fuel consumed per process tick while active + var/max_fuel = 0 + + var/mode = NOMODE //For various tool icon updates. + + //Third type of resource, stock. A tool that uses physical objects (or itself) in order to work + //Currently used for tape roll + var/use_stock_cost = 0 + var/stock = 0 + var/max_stock = 0 + var/allow_decimal_stock = TRUE + var/delete_when_empty = TRUE + + + //Variables used for tool degradation + health = 0 // Health of a tool. + maxHealth = 1000 + var/degradation = 0.8 //If nonzero, the health of the tool decreases by this amount after each tool operation + var/health_threshold = 40 // threshold in percent on which tool health stops dropping + var/lastNearBreakMessage = 0 // used to show messages that tool is about to break + var/isBroken = FALSE + + + var/toggleable = FALSE //Determines if it can be switched ON or OFF, for example, if you need a tool that will consume power/fuel upon turning it ON only. Such as welder. + var/switched_on = FALSE //Curent status of tool. Dont edit this in subtypes vars, its for procs only. + var/switched_on_qualities //This var will REPLACE tool_qualities when tool will be toggled on. + var/switched_on_force + var/switched_on_hitsound + var/switched_off_qualities //This var will REPLACE tool_qualities when tool will be toggled off. So its possible for tool to have diferent qualities both for ON and OFF state. + var/create_hot_spot = FALSE //Set this TRUE to ignite plasma on turf with tool upon activation + var/glow_color //Set color of glow upon activation, or leave it null if you dont want any light + var/last_tooluse = 0 //When the tool was last used for a tool operation. This is set both at the start of an operation, and after the doafter call + + //Vars for tool upgrades + var/precision = 0 //Subtracted from failure rates + var/workspeed = 1 //Worktimes are divided by this + var/extra_bulk = 0 //Extra physicial volume added by certain mods + var/list/prefixes = list() +*/ + +/obj/item/proc/has_quality(quality_id) + return !quality_id || (quality_id in tool_qualities) + +/obj/item/tool/admin_debug + name = "Electric Boogaloo 3000" + icon_state = "omnitool" + item_state = "omnitool" + spawn_tags = null + tool_qualities = list(QUALITY_BOLT_TURNING = 100, + QUALITY_PRYING = 100, + QUALITY_WELDING = 100, + QUALITY_SCREW_DRIVING = 100, + QUALITY_CLAMPING = 100, + QUALITY_CAUTERIZING = 100, + QUALITY_WIRE_CUTTING = 100, + QUALITY_RETRACTING = 100, + QUALITY_DRILLING = 100, + QUALITY_SAWING = 100, + QUALITY_VEIN_FIXING = 100, + QUALITY_BONE_SETTING = 100, + QUALITY_BONE_FIXING = 100, + QUALITY_SHOVELING = 100, + QUALITY_DIGGING = 100, + QUALITY_EXCAVATION = 100, + QUALITY_CUTTING = 100, + QUALITY_HAMMERING = 100, + QUALITY_FILING = 100) + +/obj/item/tool/hammer + name = "ballpin hammer" + icon_state = "oldcrowbar" + tool_qualities = (QUALITY_HAMMERING = 50) + +/obj/item/tool/file + name = "metal file" + icon_state = "oldwrench" + tool_qualities = (QUALITY_FILING = 50) + +/obj/item/tool/saw + name = "rusty hacksaw" + icon_state = "oldcutters_map" + tool_qualities = (QUALITY_SAWING = 50) diff --git a/code/modules/guncrafting/frame.dm b/code/modules/guncrafting/frame.dm index 5ced1cd4e36d..8fa9d7bd16ca 100644 --- a/code/modules/guncrafting/frame.dm +++ b/code/modules/guncrafting/frame.dm @@ -215,3 +215,6 @@ name = "pistol gun frame" icon_state = "frame_pistol" material_cost = list(/obj/item/stack/sheet/metal = 2) + +/obj/item/part/gun/frame/pistol/candor + name = "candor gun frame" diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index ed3cc72abd9f..57eacfea330b 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -18,7 +18,7 @@ var/working = FALSE //The part that the user has picked to fabricate var/obj/item/picked_part = FALSE - var/list/tools_required = list(/obj/item/tool/hammer, /obj/item/tool/file, /obj/item/tool/saw) + var/list/tools_required = list(QUALITY_HAMMERING, QUALITY_SAWING, QUALITY_FILING) var/tool_required = FALSE /obj/structure/lathe/Initialize() @@ -53,6 +53,14 @@ work_on_part(user) /obj/structure/lathe/attackby(obj/item/I, mob/user) + if(mode && !working) + if(is_valid_tool(I)) + if(mode == "Deconstruct") + deconstruct_work_piece(user) + if(mode == "Fabricate") + work_on_part(user) + else + balloon_alert(user, "You need a tool with [tool_required] to work on this part.") if(work_piece) to_chat(user, "You cant add another item to the lathe.") return @@ -87,6 +95,10 @@ steps_left = FALSE working = FALSE +/obj/structure/lathe/proc/is_valid_tool(obj/item/I) + if(I.has_quality(tool_required)) + return TRUE + ///////////////// // DECONSTRUCT // ///////////////// @@ -140,7 +152,7 @@ var/list/choose_options = list() var/list/option_results = list() if(gun_work_piece.frame) - var/obj/item/part/gun/frame = gun_work_piece.frame + var/obj/item/part/gun/frame/frame = gun_work_piece.frame if(frame.material_cost) choose_options += list("Craft [frame.name]" = image(icon = frame.icon , icon_state = frame.icon_state)) option_results["Craft [frame.name]"] = frame.type @@ -181,9 +193,6 @@ picked_part = choose_part(user) if(!picked_part || !start_work(user)) return - if(!user.has_item_of_type(tool_required)) - balloon_alert(user, "You need a [tool_required.name] to work on this part.") - return if(user.getStaminaLoss() > DECONSTRUCT_STAMINA_MINIMUM) balloon_alert(user, "too tired") return FALSE diff --git a/code/modules/guncrafting/tools.dm b/code/modules/guncrafting/tools.dm deleted file mode 100644 index 6403005791ea..000000000000 --- a/code/modules/guncrafting/tools.dm +++ /dev/null @@ -1,14 +0,0 @@ -/obj/item/tool/hammer - name = "hammer" - icon = 'icons/obj/tools.dmi' - icon_state = "oldcrowbar" - -/obj/item/tool/file - name = "file" - icon = 'icons/obj/tools.dmi' - icon_state = "oldwrench" - -/obj/item/tool/saw - name = "saw" - icon = 'icons/obj/tools.dmi' - icon_state = "oldcutters_map" diff --git a/shiptest.dme b/shiptest.dme index 725823ff0c9b..508ee627d31b 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -141,7 +141,7 @@ #include "code\__DEFINES\tgs.dm" #include "code\__DEFINES\tgui.dm" #include "code\__DEFINES\time.dm" -#include "code\__DEFINES\tools.dm" +#include "code\__DEFINES\tools_and_qualities.dm" #include "code\__DEFINES\traits.dm" #include "code\__DEFINES\turfs.dm" #include "code\__DEFINES\typeids.dm" @@ -1306,6 +1306,7 @@ #include "code\game\objects\items\tanks\tank_types.dm" #include "code\game\objects\items\tanks\tanks.dm" #include "code\game\objects\items\tanks\watertank.dm" +#include "code\game\objects\items\tools\_tools.dm" #include "code\game\objects\items\tools\chisel.dm" #include "code\game\objects\items\tools\crowbar.dm" #include "code\game\objects\items\tools\screwdriver.dm" @@ -2196,7 +2197,6 @@ #include "code\modules\guncrafting\lathe.dm" #include "code\modules\guncrafting\part.dm" #include "code\modules\guncrafting\recipe.dm" -#include "code\modules\guncrafting\tools.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\foreign_calendar.dm" #include "code\modules\holiday\holidays.dm" From 1cba2a00e778398b4407d64c3f9247d0c82580e1 Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 2 Apr 2024 10:03:26 -0500 Subject: [PATCH 106/206] stuff --- code/__DEFINES/tools_and_qualities.dm | 2 +- code/game/objects/items/tools/_tools.dm | 128 +++--------------- code/game/objects/items/tools/simple_tools.dm | 41 ++++++ shiptest.dme | 1 + 4 files changed, 64 insertions(+), 108 deletions(-) create mode 100644 code/game/objects/items/tools/simple_tools.dm diff --git a/code/__DEFINES/tools_and_qualities.dm b/code/__DEFINES/tools_and_qualities.dm index 5ea1a0e88e05..2cc3177fe229 100644 --- a/code/__DEFINES/tools_and_qualities.dm +++ b/code/__DEFINES/tools_and_qualities.dm @@ -94,4 +94,4 @@ #define WORKSOUND_HARD_SLASH 'sound/weapons/bladeslice.ogg' #define WORKSOUND_CHAINSAW 'sound/items/chainsaw.ogg' #define WORKSOUND_TAPE 'sound/items/duct_tape.ogg' -#define WORKSOUND_HONK 'sound/items/bikehorn.ogg' +#define WORKSOUND_HONK 'sound/items/bikehorn.ogg' diff --git a/code/game/objects/items/tools/_tools.dm b/code/game/objects/items/tools/_tools.dm index 8fbba03478e1..78d8b408186f 100644 --- a/code/game/objects/items/tools/_tools.dm +++ b/code/game/objects/items/tools/_tools.dm @@ -1,119 +1,33 @@ -// Time added to tool operations in percent based on original time -// (if you dig hole in 10 seconds then 50 ADDITIONAL_TIME_LOWHEALTH will add 0 on full health, 2.5sec on 50% health and 5sec ~0% health) -#define ADDITIONAL_TIME_LOWHEALTH 60 - /obj/item/tool name = "tool" icon = 'icons/obj/tools.dmi' slot_flags = SLOT_BELT - force = WEAPON_FORCE_NORMAL - throwforce = WEAPON_FORCE_NORMAL + force = 10 + throwforce = 10 w_class = ITEM_SIZE_SMALL -/* - //spawn values - bad_type = /obj/item/tool - spawn_tags = SPAWN_TAG_TOOL - - price_tag = 20 - - health = 600 - maxHealth = 600 - - var/tool_in_use = FALSE - - var/force_upgrade_mults = 1 - - var/force_upgrade_mods = 0 - - var/sparks_on_use = FALSE //Set to TRUE if you want to have sparks on each use of a tool - var/eye_hazard = FALSE //Set to TRUE should damage users eyes if they without eye protection - - var/use_power_cost = 0 //For tool system, determinze how much power tool will drain from cells, 0 means no cell needed - var/obj/item/cell/cell - var/suitable_cell //Dont forget to edit this for a tool, if you want in to consume cells - var/passive_power_cost = 1 //Energy consumed per process tick while active - - var/use_fuel_cost = 0 //Same, only for fuel. And for the sake of God, DONT USE CELLS AND FUEL SIMULTANEOUSLY. - var/passive_fuel_cost = 0.03 //Fuel consumed per process tick while active - var/max_fuel = 0 - - var/mode = NOMODE //For various tool icon updates. - - //Third type of resource, stock. A tool that uses physical objects (or itself) in order to work - //Currently used for tape roll - var/use_stock_cost = 0 - var/stock = 0 - var/max_stock = 0 - var/allow_decimal_stock = TRUE - var/delete_when_empty = TRUE - - - //Variables used for tool degradation - health = 0 // Health of a tool. - maxHealth = 1000 - var/degradation = 0.8 //If nonzero, the health of the tool decreases by this amount after each tool operation - var/health_threshold = 40 // threshold in percent on which tool health stops dropping - var/lastNearBreakMessage = 0 // used to show messages that tool is about to break - var/isBroken = FALSE - - - var/toggleable = FALSE //Determines if it can be switched ON or OFF, for example, if you need a tool that will consume power/fuel upon turning it ON only. Such as welder. - var/switched_on = FALSE //Curent status of tool. Dont edit this in subtypes vars, its for procs only. - var/switched_on_qualities //This var will REPLACE tool_qualities when tool will be toggled on. - var/switched_on_force - var/switched_on_hitsound - var/switched_off_qualities //This var will REPLACE tool_qualities when tool will be toggled off. So its possible for tool to have diferent qualities both for ON and OFF state. - var/create_hot_spot = FALSE //Set this TRUE to ignite plasma on turf with tool upon activation - var/glow_color //Set color of glow upon activation, or leave it null if you dont want any light - var/last_tooluse = 0 //When the tool was last used for a tool operation. This is set both at the start of an operation, and after the doafter call - - //Vars for tool upgrades - var/precision = 0 //Subtracted from failure rates - var/workspeed = 1 //Worktimes are divided by this - var/extra_bulk = 0 //Extra physicial volume added by certain mods - var/list/prefixes = list() -*/ - +/****************************** + /* Data and Checking */ +*******************************/ /obj/item/proc/has_quality(quality_id) return !quality_id || (quality_id in tool_qualities) -/obj/item/tool/admin_debug - name = "Electric Boogaloo 3000" - icon_state = "omnitool" - item_state = "omnitool" - spawn_tags = null - tool_qualities = list(QUALITY_BOLT_TURNING = 100, - QUALITY_PRYING = 100, - QUALITY_WELDING = 100, - QUALITY_SCREW_DRIVING = 100, - QUALITY_CLAMPING = 100, - QUALITY_CAUTERIZING = 100, - QUALITY_WIRE_CUTTING = 100, - QUALITY_RETRACTING = 100, - QUALITY_DRILLING = 100, - QUALITY_SAWING = 100, - QUALITY_VEIN_FIXING = 100, - QUALITY_BONE_SETTING = 100, - QUALITY_BONE_FIXING = 100, - QUALITY_SHOVELING = 100, - QUALITY_DIGGING = 100, - QUALITY_EXCAVATION = 100, - QUALITY_CUTTING = 100, - QUALITY_HAMMERING = 100, - QUALITY_FILING = 100) -/obj/item/tool/hammer - name = "ballpin hammer" - icon_state = "oldcrowbar" - tool_qualities = (QUALITY_HAMMERING = 50) +/obj/item/proc/get_tool_quality(quality_id) + if(tool_qualities && tool_qualities.len) + return tool_qualities[quality_id] + return null + +//We are cheking if our item got required qualities. If we require several qualities, and item posses more than one of those, we ask user to choose how that item should be used +/obj/item/proc/get_tool_type(mob/living/user, list/required_qualities, atom/use_on, datum/callback/CB) + if(!tool_qualities) //This is not a tool, or does not have tool qualities + return -/obj/item/tool/file - name = "metal file" - icon_state = "oldwrench" - tool_qualities = (QUALITY_FILING = 50) + var/list/L = required_qualities & tool_qualities -/obj/item/tool/saw - name = "rusty hacksaw" - icon_state = "oldcutters_map" - tool_qualities = (QUALITY_SAWING = 50) + if(L.len) + if(L.len == 1) + return L[1] + for(var/i in L) + L[i] = image(icon = 'icons/mob/radial.dmi', icon_state = i) + return show_radial_menu(user, use_on ? use_on : user, L, tooltips = TRUE, require_near = TRUE, custom_check = CB) diff --git a/code/game/objects/items/tools/simple_tools.dm b/code/game/objects/items/tools/simple_tools.dm new file mode 100644 index 000000000000..da9c76cddf44 --- /dev/null +++ b/code/game/objects/items/tools/simple_tools.dm @@ -0,0 +1,41 @@ +// Tools not cool enough for there own file + +/obj/item/tool/admin_debug + name = "Electric Boogaloo 3000" + icon_state = "omnitool" + item_state = "omnitool" + spawn_tags = null + tool_qualities = list(QUALITY_BOLT_TURNING = 100, + QUALITY_PRYING = 100, + QUALITY_WELDING = 100, + QUALITY_SCREW_DRIVING = 100, + QUALITY_CLAMPING = 100, + QUALITY_CAUTERIZING = 100, + QUALITY_WIRE_CUTTING = 100, + QUALITY_RETRACTING = 100, + QUALITY_DRILLING = 100, + QUALITY_SAWING = 100, + QUALITY_VEIN_FIXING = 100, + QUALITY_BONE_SETTING = 100, + QUALITY_BONE_FIXING = 100, + QUALITY_SHOVELING = 100, + QUALITY_DIGGING = 100, + QUALITY_EXCAVATION = 100, + QUALITY_CUTTING = 100, + QUALITY_HAMMERING = 100, + QUALITY_FILING = 100) + +/obj/item/tool/hammer + name = "ballpin hammer" + icon_state = "oldcrowbar" + tool_qualities = (QUALITY_HAMMERING = 50) + +/obj/item/tool/file + name = "metal file" + icon_state = "oldwrench" + tool_qualities = (QUALITY_FILING = 50) + +/obj/item/tool/saw + name = "rusty hacksaw" + icon_state = "oldcutters_map" + tool_qualities = (QUALITY_SAWING = 50) diff --git a/shiptest.dme b/shiptest.dme index 508ee627d31b..ca26079a77a2 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1310,6 +1310,7 @@ #include "code\game\objects\items\tools\chisel.dm" #include "code\game\objects\items\tools\crowbar.dm" #include "code\game\objects\items\tools\screwdriver.dm" +#include "code\game\objects\items\tools\simple_tools.dm" #include "code\game\objects\items\tools\weldingtool.dm" #include "code\game\objects\items\tools\wirecutters.dm" #include "code\game\objects\items\tools\wrench.dm" From d0f65524b1d003e50c19e77fbaa853165f20549f Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 2 Apr 2024 10:27:49 -0500 Subject: [PATCH 107/206] yea --- code/game/objects/items/tools/_tools.dm | 4 ++-- code/game/objects/items/tools/simple_tools.dm | 7 +++---- code/modules/guncrafting/lathe.dm | 2 +- code/modules/guncrafting/recipe.dm | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/tools/_tools.dm b/code/game/objects/items/tools/_tools.dm index 78d8b408186f..eb4e03e9b406 100644 --- a/code/game/objects/items/tools/_tools.dm +++ b/code/game/objects/items/tools/_tools.dm @@ -1,10 +1,10 @@ /obj/item/tool name = "tool" icon = 'icons/obj/tools.dmi' - slot_flags = SLOT_BELT + slot_flags = ITEM_SLOT_BELT force = 10 throwforce = 10 - w_class = ITEM_SIZE_SMALL + w_class = WEIGHT_CLASS_SMALL /****************************** /* Data and Checking */ diff --git a/code/game/objects/items/tools/simple_tools.dm b/code/game/objects/items/tools/simple_tools.dm index da9c76cddf44..e30fe286a9c8 100644 --- a/code/game/objects/items/tools/simple_tools.dm +++ b/code/game/objects/items/tools/simple_tools.dm @@ -4,7 +4,6 @@ name = "Electric Boogaloo 3000" icon_state = "omnitool" item_state = "omnitool" - spawn_tags = null tool_qualities = list(QUALITY_BOLT_TURNING = 100, QUALITY_PRYING = 100, QUALITY_WELDING = 100, @@ -28,14 +27,14 @@ /obj/item/tool/hammer name = "ballpin hammer" icon_state = "oldcrowbar" - tool_qualities = (QUALITY_HAMMERING = 50) + tool_qualities = list(QUALITY_HAMMERING = 50) /obj/item/tool/file name = "metal file" icon_state = "oldwrench" - tool_qualities = (QUALITY_FILING = 50) + tool_qualities = list(QUALITY_FILING = 50) /obj/item/tool/saw name = "rusty hacksaw" icon_state = "oldcutters_map" - tool_qualities = (QUALITY_SAWING = 50) + tool_qualities = list(QUALITY_SAWING = 50) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index 57eacfea330b..d0a235c753a7 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -60,7 +60,7 @@ if(mode == "Fabricate") work_on_part(user) else - balloon_alert(user, "You need a tool with [tool_required] to work on this part.") + balloon_alert(user, "you need a tool with [tool_required] to work on this part.") if(work_piece) to_chat(user, "You cant add another item to the lathe.") return diff --git a/code/modules/guncrafting/recipe.dm b/code/modules/guncrafting/recipe.dm index 84b234a75b38..d1432cf6952c 100644 --- a/code/modules/guncrafting/recipe.dm +++ b/code/modules/guncrafting/recipe.dm @@ -33,7 +33,7 @@ /datum/lathe_recipe/gun/candor result = /obj/item/gun/ballistic/automatic/pistol/candor valid_parts = list( - /obj/item/part/gun/frame/candor, + /obj/item/part/gun/frame/pistol/candor, /obj/item/part/gun/modular/grip/wood, /obj/item/part/gun/modular/mechanism/pistol, /obj/item/part/gun/modular/barrel/pistol From ecfdd90f0b2352e72f6a80801e8ae90df516cebd Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 2 Apr 2024 10:31:22 -0500 Subject: [PATCH 108/206] pass mabye --- code/modules/guncrafting/lathe.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/guncrafting/lathe.dm b/code/modules/guncrafting/lathe.dm index d0a235c753a7..f1bae422a228 100644 --- a/code/modules/guncrafting/lathe.dm +++ b/code/modules/guncrafting/lathe.dm @@ -204,7 +204,7 @@ to_chat(user, "You have [steps_left] steps left.") user.adjustStaminaLoss(DECONSTRUCT_STAMINA_USE) tool_required = pick(tools_required) - balloon_alert(user, "You need a [tool_required.name] next.") + balloon_alert(user, "You need a tool with [tool_required] next.") work_on_part(user) else fabricate_part(user) From e7a6c2b67a7f2b57e7ea08aec27bb91851034324 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 3 Apr 2024 21:44:31 -0500 Subject: [PATCH 109/206] wow surpised it already builds --- code/controllers/subsystem/traumas.dm | 1 - code/game/gamemodes/objective.dm | 25 --- code/game/objects/items/storage/belt.dm | 27 ---- .../antagonists/survivalist/survivalist.dm | 14 -- .../antagonists/wizard/equipment/spellbook.dm | 47 ------ code/modules/antagonists/wizard/wizard.dm | 1 - code/modules/cargo/exports/lavaland.dm | 4 +- code/modules/events/wizard/magicarp.dm | 8 +- code/modules/mining/equipment/survival_pod.dm | 4 - .../mining/lavaland/necropolis_chests.dm | 4 +- .../modules/mob/dead/new_player/new_player.dm | 2 - .../projectiles/ammunition/special/magic.dm | 4 +- code/modules/projectiles/guns/magic/staff.dm | 142 ------------------ .../guns/{magic/wand.dm => misc/debug.dm} | 140 ----------------- code/modules/projectiles/projectile/debug.dm | 23 +++ code/modules/projectiles/projectile/magic.dm | 50 ------ .../spells/spell_types/rightandwrong.dm | 101 +------------ code/modules/vending/autodrobe.dm | 1 - shiptest.dme | 4 +- 19 files changed, 40 insertions(+), 562 deletions(-) delete mode 100644 code/modules/projectiles/guns/magic/staff.dm rename code/modules/projectiles/guns/{magic/wand.dm => misc/debug.dm} (51%) create mode 100644 code/modules/projectiles/projectile/debug.dm diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 1e697327c844..9b6fd4b65daa 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -132,7 +132,6 @@ SUBSYSTEM_DEF(traumas) /obj/item/soulstone, /obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff, /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/wizard, - /obj/item/gun/magic/staff, /obj/item/gun/magic/wand, /obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain)), "aliens" = typecacheof(list( diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 82735ff9d522..65e161f2176b 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -883,31 +883,6 @@ GLOBAL_LIST_EMPTY(possible_items_special) explanation_text = "Steal at least five guns!" wanted_items = list(/obj/item/gun) -/datum/objective/steal_five_of_type/summon_magic - name = "steal magic" - explanation_text = "Steal at least five magical artefacts!" - wanted_items = list() - -/datum/objective/steal_five_of_type/summon_magic/New() - wanted_items = GLOB.summoned_magic_objectives - ..() - -/datum/objective/steal_five_of_type/summon_magic/check_completion() - var/list/datum/mind/owners = get_owners() - var/stolen_count = 0 - for(var/datum/mind/M in owners) - if(!isliving(M.current)) - continue - var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for wanted items - if(istype(I, /obj/item/book/granter/spell)) - var/obj/item/book/granter/spell/spellbook = I - if(!spellbook.used || !spellbook.oneuse) //if the book still has powers... - stolen_count++ //it counts. nice. - else if(is_type_in_typecache(I, wanted_items)) - stolen_count++ - return stolen_count >= 5 - //Created by admin tools /datum/objective/custom name = "custom" diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index d6ef29b86233..216bf5b23485 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -592,33 +592,6 @@ /obj/item/multitool = 1) generate_items_inside(items_inside,src) - -/obj/item/storage/belt/wands - name = "wand belt" - desc = "A belt designed to hold various rods of power. A veritable fanny pack of exotic magic." - icon_state = "soulstone" - item_state = "soulstone" - -/obj/item/storage/belt/wands/ComponentInitialize() - . = ..() - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 6 - STR.set_holdable(list( - /obj/item/gun/magic/wand - )) - -/obj/item/storage/belt/wands/full/PopulateContents() - new /obj/item/gun/magic/wand/death(src) - new /obj/item/gun/magic/wand/resurrection(src) - new /obj/item/gun/magic/wand/polymorph(src) - new /obj/item/gun/magic/wand/teleport(src) - new /obj/item/gun/magic/wand/door(src) - new /obj/item/gun/magic/wand/fireball(src) - - for(var/obj/item/gun/magic/wand/W in contents) //All wands in this pack come in the best possible condition - W.max_charges = initial(W.max_charges) - W.charges = W.max_charges - /obj/item/storage/belt/janitor name = "janibelt" desc = "A belt used to hold most janitorial supplies." diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 0e38dc57105d..1fb457eea64b 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -26,17 +26,3 @@ guns.owner = owner objectives += guns ..() - -/datum/antagonist/survivalist/magic - name = "Amateur Magician" - greet_message = "Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way." - -/datum/antagonist/survivalist/magic/greet() - ..() - to_chat(owner, "As a wonderful magician, you should remember that spellbooks don't mean anything if they are used up.") - -/datum/antagonist/survivalist/magic/forge_objectives() - var/datum/objective/steal_five_of_type/summon_magic/magic = new - magic.owner = owner - objectives += magic - ..() diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index cf85a922dbb6..690cf94cd9a3 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -279,47 +279,6 @@ dat += "[surplus] left.
" return dat -/datum/spellbook_entry/item/staffchange - name = "Staff of Change" - desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." - item_path = /obj/item/gun/magic/staff/change - -/datum/spellbook_entry/item/staffanimation - name = "Staff of Animation" - desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines." - item_path = /obj/item/gun/magic/staff/animate - category = "Assistance" - -/datum/spellbook_entry/item/staffchaos - name = "Staff of Chaos" - desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended." - item_path = /obj/item/gun/magic/staff/chaos - -/datum/spellbook_entry/item/spellblade - name = "Spellblade" - desc = "A sword capable of firing blasts of energy which rip targets limb from limb." - item_path = /obj/item/gun/magic/staff/spellblade - -/datum/spellbook_entry/item/staffdoor - name = "Staff of Door Creation" - desc = "A particular staff that can mold solid walls into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass." - item_path = /obj/item/gun/magic/staff/door - cost = 1 - category = "Mobility" - -/datum/spellbook_entry/item/staffhealing - name = "Staff of Healing" - desc = "An altruistic staff that can heal the lame and raise the dead." - item_path = /obj/item/gun/magic/staff/healing - cost = 1 - category = "Defensive" - -/datum/spellbook_entry/item/lockerstaff - name = "Staff of the Locker" - desc = "A staff that shoots lockers. It eats anyone it hits on its way, leaving a welded locker with your victims behind." - item_path = /obj/item/gun/magic/staff/locker - category = "Defensive" - /datum/spellbook_entry/item/scryingorb name = "Scrying Orb" desc = "An incandescent orb of crackling energy. Using it will allow you to release your ghost while alive, allowing you to spy upon others and talk to the deceased. In addition, buying it will permanently grant you X-ray vision." @@ -344,12 +303,6 @@ item_path = /obj/item/necromantic_stone category = "Assistance" -/datum/spellbook_entry/item/wands - name = "Wand Assortment" - desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative with their use. Comes in a handy belt." - item_path = /obj/item/storage/belt/wands/full - category = "Defensive" - /datum/spellbook_entry/item/armor name = "Mastercrafted Armor Set" desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 14cf56d51ae0..96a41b2ac07b 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -204,7 +204,6 @@ if(APPRENTICE_HEALING) owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null)) owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null)) - H.put_in_hands(new /obj/item/gun/magic/staff/healing(H)) to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned life-saving survival spells. You are able to cast charge and forcewall.") if(APPRENTICE_ROBELESS) owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index 9b0adbf0d106..e325b8e8d09b 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -23,7 +23,6 @@ /obj/item/lava_staff, /obj/item/ship_in_a_bottle, /obj/item/clothing/shoes/clown_shoes/banana_shoes, - /obj/item/gun/magic/staff/honk, /obj/item/kitchen/knife/envy, /obj/item/veilrender/vealrender, /obj/item/nullrod/scythe/talking/necro, @@ -54,8 +53,7 @@ /obj/machinery/anomalous_crystal, /obj/item/mayhem, /obj/item/blood_contract, - /obj/item/guardiancreator/miner/choose,//this is basically the most valulable mining loot so good luck getting a miner to part ways - /obj/item/gun/magic/staff/spellblade, + /obj/item/guardiancreator/miner/choose//this is basically the most valulable mining loot so good luck getting a miner to part ways ) /datum/export/lavaland/trophycommon diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index 68a38f0479e1..2546b1ebbb18 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -41,8 +41,8 @@ food_type = list() tame_chance = 0 bonus_tame_chance = 0 - var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, + var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, + /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) /mob/living/simple_animal/hostile/carp/ranged/Initialize() @@ -69,7 +69,7 @@ /mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology gold_core_spawnable = HOSTILE_SPAWN - allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, + allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, + /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/nothing, /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/necropotence, /obj/projectile/magic/fortify, /obj/projectile/magic/spell/magic_missile)//now THIS is chaos diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 5e012735b706..9cee3f8742f4 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -313,10 +313,6 @@ /obj/item/hierophant_club, /obj/item/gun/energy/minigun, /obj/item/gun/ballistic/automatic/hmg/l6_saw, - /obj/item/gun/magic/staff/chaos, - /obj/item/gun/magic/staff/spellblade, - /obj/item/gun/magic/wand/death, - /obj/item/gun/magic/wand/fireball, /obj/item/stack/telecrystal/twenty, /obj/item/nuke_core, /obj/item/phylactery, diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 985c5212299b..4edc13071932 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -1493,14 +1493,12 @@ /obj/structure/closet/crate/necropolis/bubblegum/PopulateContents() new /obj/item/clothing/suit/space/hostile_environment(src) new /obj/item/clothing/head/helmet/space/hostile_environment(src) - var/loot = rand(1,3) + var/loot = rand(1,2) switch(loot) if(1) new /obj/item/mayhem(src) if(2) new /obj/item/blood_contract(src) - if(3) - new /obj/item/gun/magic/staff/spellblade(src) /obj/structure/closet/crate/necropolis/bubblegum/crusher name = "bloody bubblegum chest" diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 9baa46f526b5..46d5240e922b 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -335,8 +335,6 @@ if(GLOB.summon_guns_triggered) give_guns(humanc) - if(GLOB.summon_magic_triggered) - give_magic(humanc) if(GLOB.curse_of_madness_triggered) give_madness(humanc, GLOB.curse_of_madness_triggered) if(CONFIG_GET(flag/roundstart_traits)) diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index 4d9aae44329d..5d30ba97690e 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -12,11 +12,11 @@ projectile_type = /obj/projectile/magic/animate /obj/item/ammo_casing/magic/heal - projectile_type = /obj/projectile/magic/resurrection + projectile_type = /obj/projectile/debug/resurrection harmful = FALSE /obj/item/ammo_casing/magic/death - projectile_type = /obj/projectile/magic/death + projectile_type = /obj/projectile/debug/death /obj/item/ammo_casing/magic/teleport projectile_type = /obj/projectile/magic/teleport diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm deleted file mode 100644 index e8f1683d21a1..000000000000 --- a/code/modules/projectiles/guns/magic/staff.dm +++ /dev/null @@ -1,142 +0,0 @@ -/obj/item/gun/magic/staff - slot_flags = ITEM_SLOT_BACK - lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - item_flags = NEEDS_PERMIT | NO_MAT_REDEMPTION - -/obj/item/gun/magic/staff/change - name = "staff of change" - desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/change - icon_state = "staffofchange" - item_state = "staffofchange" - -/obj/item/gun/magic/staff/animate - name = "staff of animation" - desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines." - fire_sound = 'sound/magic/staff_animation.ogg' - ammo_type = /obj/item/ammo_casing/magic/animate - icon_state = "staffofanimation" - item_state = "staffofanimation" - -/obj/item/gun/magic/staff/healing - name = "staff of healing" - desc = "An artefact that spits bolts of restoring magic which can remove ailments of all kinds and even raise the dead." - fire_sound = 'sound/magic/staff_healing.ogg' - ammo_type = /obj/item/ammo_casing/magic/heal - icon_state = "staffofhealing" - item_state = "staffofhealing" - -/obj/item/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves - return - -/obj/item/gun/magic/staff/chaos - name = "staff of chaos" - desc = "An artefact that spits bolts of chaotic magic that can potentially do anything." - fire_sound = 'sound/magic/staff_chaos.ogg' - ammo_type = /obj/item/ammo_casing/magic/chaos - icon_state = "staffofchaos" - item_state = "staffofchaos" - max_charges = 10 - recharge_rate = 2 - no_den_usage = 1 - var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, /obj/projectile/magic/resurrection, - /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, - /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/flying, - /obj/projectile/magic/bounty, /obj/projectile/magic/antimagic, /obj/projectile/magic/fetch, /obj/projectile/magic/sapping, - /obj/projectile/magic/necropotence, /obj/projectile/magic, /obj/projectile/temp/chill, /obj/projectile/magic/wipe) - -/obj/item/gun/magic/staff/chaos/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - chambered.projectile_type = pick(allowed_projectile_types) - . = ..() - -/obj/item/gun/magic/staff/door - name = "staff of door creation" - desc = "An artefact that spits bolts of transformative magic that can create doors in walls." - fire_sound = 'sound/magic/staff_door.ogg' - ammo_type = /obj/item/ammo_casing/magic/door - icon_state = "staffofdoor" - item_state = "staffofdoor" - max_charges = 10 - recharge_rate = 2 - no_den_usage = 1 - -/obj/item/gun/magic/staff/honk - name = "staff of the honkmother" - desc = "Honk." - fire_sound = 'sound/items/airhorn.ogg' - ammo_type = /obj/item/ammo_casing/magic/honk - icon_state = "honker" - item_state = "honker" - max_charges = 4 - recharge_rate = 8 - -/obj/item/gun/magic/staff/spellblade - name = "spellblade" - desc = "A deadly combination of laziness and boodlust, this blade allows the user to dismember their enemies without all the hard work of actually swinging the sword." - fire_sound = 'sound/magic/fireball.ogg' - ammo_type = /obj/item/ammo_casing/magic/spellblade - icon_state = "spellblade" - item_state = "spellblade" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - hitsound = 'sound/weapons/rapierhit.ogg' - force = 20 - armour_penetration = 75 - block_chance = 50 - sharpness = IS_SHARP - max_charges = 4 - -/obj/item/gun/magic/staff/spellblade/Initialize() - . = ..() - AddComponent(/datum/component/butchering, 15, 125, 0, hitsound) - -/obj/item/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 - return ..() - -/obj/item/gun/magic/staff/locker - name = "staff of the locker" - desc = "An artefact that expells encapsulating bolts, for incapacitating thy enemy." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/locker - icon_state = "locker" - item_state = "locker" - max_charges = 6 - recharge_rate = 4 - -//yes, they don't have sounds. they're admin staves, and their projectiles will play the chaos bolt sound anyway so why bother? - -/obj/item/gun/magic/staff/flying - name = "staff of flying" - desc = "An artefact that spits bolts of graceful magic that can make something fly." - fire_sound = 'sound/magic/staff_healing.ogg' - ammo_type = /obj/item/ammo_casing/magic/flying - icon_state = "staffofflight" - item_state = "staffofflight" - -/obj/item/gun/magic/staff/sapping - name = "staff of sapping" - desc = "An artefact that spits bolts of sapping magic that can make something sad." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/sapping - icon_state = "staffofsapping" - item_state = "staffofsapping" - -/obj/item/gun/magic/staff/necropotence - name = "staff of necropotence" - desc = "An artefact that spits bolts of death magic that can repurpose the soul." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/necropotence - icon_state = "staffofnecropotence" - item_state = "staffofnecropotence" - -/obj/item/gun/magic/staff/wipe - name = "staff of possession" - desc = "An artefact that spits bolts of mind-unlocking magic that can let ghosts invade the victim's mind." - fire_sound = 'sound/magic/staff_change.ogg' - ammo_type = /obj/item/ammo_casing/magic/wipe - icon_state = "staffofwipe" - item_state = "staffofwipe" diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/misc/debug.dm similarity index 51% rename from code/modules/projectiles/guns/magic/wand.dm rename to code/modules/projectiles/guns/misc/debug.dm index c6a25127878a..607dbec425b5 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/misc/debug.dm @@ -1,6 +1,3 @@ -//For use in prob() to determine if an empty wand will shoot once then break. -#define WAND_WREST_CHANCE (1/121) - /obj/item/gun/magic/wand name = "wand" desc = "You shouldn't have this." @@ -57,24 +54,11 @@ return update_appearance() -/obj/item/gun/magic/wand/shoot_with_empty_chamber(mob/living/user) - if(prob(100*WAND_WREST_CHANCE)) - to_chat(user,"You manage to activate [src] one last time.") - charges++ - recharge_newshot() - return TRUE - return ..() - /obj/item/gun/magic/wand/proc/zap_self(mob/living/user) user.visible_message("[user] zaps [user.p_them()]self with [src].") playsound(user, fire_sound, 50, TRUE) user.log_message("zapped [user.p_them()]self with a [src]", LOG_ATTACK) - -///////////////////////////////////// -//WAND OF DEATH -///////////////////////////////////// - /obj/item/gun/magic/wand/death name = "wand of death" desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail." @@ -108,11 +92,6 @@ can_charge = TRUE recharge_rate = 1 - -///////////////////////////////////// -//WAND OF HEALING -///////////////////////////////////// - /obj/item/gun/magic/wand/resurrection name = "wand of healing" desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason." @@ -145,122 +124,3 @@ variable_charges = FALSE can_charge = TRUE recharge_rate = 1 - -///////////////////////////////////// -//WAND OF POLYMORPH -///////////////////////////////////// - -/obj/item/gun/magic/wand/polymorph - name = "wand of polymorph" - desc = "This wand is attuned to chaos and will radically alter the victim's form." - ammo_type = /obj/item/ammo_casing/magic/change - icon_state = "polywand" - base_icon_state = "polywand" - fire_sound = 'sound/magic/staff_change.ogg' - max_charges = 10 //10, 5, 5, 4 - -/obj/item/gun/magic/wand/polymorph/zap_self(mob/living/user) - ..() //because the user mob ceases to exists by the time wabbajack fully resolves - - wabbajack(user) - charges-- - -///////////////////////////////////// -//WAND OF TELEPORTATION -///////////////////////////////////// - -/obj/item/gun/magic/wand/teleport - name = "wand of teleportation" - desc = "This wand will wrench targets through space and time to move them somewhere else." - ammo_type = /obj/item/ammo_casing/magic/teleport - fire_sound = 'sound/magic/wand_teleport.ogg' - icon_state = "telewand" - base_icon_state = "telewand" - max_charges = 10 //10, 5, 5, 4 - no_den_usage = TRUE - -/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user) - if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(3, user.loc) - smoke.start() - charges-- - ..() - -/obj/item/gun/magic/wand/safety - name = "wand of safety" - desc = "This wand will use the lightest of bluespace currents to gently place the target somewhere safe." - ammo_type = /obj/item/ammo_casing/magic/safety - fire_sound = 'sound/magic/wand_teleport.ogg' - icon_state = "telewand" - base_icon_state = "telewand" - max_charges = 10 //10, 5, 5, 4 - no_den_usage = FALSE - -/obj/item/gun/magic/wand/safety/zap_self(mob/living/user) - var/turf/origin = get_turf(user) - var/turf/destination = find_safe_turf() - - if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC)) - for(var/t in list(origin, destination)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, t) - smoke.start() - ..() - -/obj/item/gun/magic/wand/safety/debug - desc = "This wand has 'find_safe_turf()' engraved into its blue wood. Perhaps it's a secret message?" - max_charges = 500 - variable_charges = FALSE - can_charge = TRUE - recharge_rate = 1 - - -///////////////////////////////////// -//WAND OF DOOR CREATION -///////////////////////////////////// - -/obj/item/gun/magic/wand/door - name = "wand of door creation" - desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics." - ammo_type = /obj/item/ammo_casing/magic/door - icon_state = "doorwand" - base_icon_state = "doorwand" - fire_sound = 'sound/magic/staff_door.ogg' - max_charges = 20 //20, 10, 10, 7 - no_den_usage = 1 - -/obj/item/gun/magic/wand/door/zap_self(mob/living/user) - to_chat(user, "You feel vaguely more open with your feelings.") - charges-- - ..() - -///////////////////////////////////// -//WAND OF FIREBALL -///////////////////////////////////// - -/obj/item/gun/magic/wand/fireball - name = "wand of fireball" - desc = "This wand shoots scorching balls of fire that explode into destructive flames." - fire_sound = 'sound/magic/fireball.ogg' - ammo_type = /obj/item/ammo_casing/magic/fireball - icon_state = "firewand" - base_icon_state = "firewand" - max_charges = 8 //8, 4, 4, 3 - -/obj/item/gun/magic/wand/fireball/zap_self(mob/living/user) - ..() - explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) - charges-- - -///////////////////////////////////// -//WAND OF NOTHING -///////////////////////////////////// - -/obj/item/gun/magic/wand/nothing - name = "wand of nothing" - desc = "It's not just a stick, it's a MAGIC stick?" - ammo_type = /obj/item/ammo_casing/magic/nothing - - -#undef WAND_WREST_CHANCE diff --git a/code/modules/projectiles/projectile/debug.dm b/code/modules/projectiles/projectile/debug.dm new file mode 100644 index 000000000000..06b1ea7ca3e1 --- /dev/null +++ b/code/modules/projectiles/projectile/debug.dm @@ -0,0 +1,23 @@ +/obj/projectile/debug/death + name = "bolt of death" + icon_state = "pulse1_bl" + +/obj/projectile/debug/death/on_hit(target) + . = ..() + if(ismob(target)) + var/mob/M = target + M.death(0) + +/obj/projectile/debug/resurrection + name = "bolt of resurrection" + icon_state = "ion" + nodamage = TRUE + +/obj/projectile/debug/resurrection/on_hit(mob/living/carbon/target) + . = ..() + if(isliving(target)) + if(target.revive(full_heal = TRUE, admin_revive = TRUE)) + target.grab_ghost(force = TRUE) // even suicides + to_chat(target, "You rise with a start, you're alive!!!") + else if(target.stat != DEAD) + to_chat(target, "You feel great!") diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 458c19d053da..544e2cc95005 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -7,56 +7,6 @@ armour_penetration = 100 flag = "magic" -/obj/projectile/magic/death - name = "bolt of death" - icon_state = "pulse1_bl" - -/obj/projectile/magic/death/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - if(isliving(M)) - var/mob/living/L = M - if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead - if(L.hellbound && L.stat == DEAD) - return BULLET_ACT_BLOCK - if(L.revive(full_heal = TRUE, admin_revive = TRUE)) - L.grab_ghost(force = TRUE) - to_chat(L, "You rise with a start, you're undead!!!") - else if(L.stat != DEAD) - to_chat(L, "You feel great!") - else - L.death(0) - else - M.death(0) - -/obj/projectile/magic/resurrection - name = "bolt of resurrection" - icon_state = "ion" - damage = 0 - damage_type = OXY - nodamage = TRUE - -/obj/projectile/magic/resurrection/on_hit(mob/living/carbon/target) - . = ..() - if(isliving(target)) - if(target.anti_magic_check()) - target.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - if(target.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead - target.death(0) - else - if(target.hellbound && target.stat == DEAD) - return BULLET_ACT_BLOCK - if(target.revive(full_heal = TRUE, admin_revive = TRUE)) - target.grab_ghost(force = TRUE) // even suicides - to_chat(target, "You rise with a start, you're alive!!!") - else if(target.stat != DEAD) - to_chat(target, "You feel great!") - /obj/projectile/magic/teleport name = "bolt of teleportation" icon_state = "bluespace" diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index e79ffb8a491e..ed6d9a9b957d 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -49,60 +49,8 @@ GLOBAL_LIST_INIT(summoned_guns, list( /obj/item/gun/energy/laser/scatter, /obj/item/gun/energy/gravity_gun)) -//if you add anything that isn't covered by the typepaths below, add it to summon_magic_objective_types -GLOBAL_LIST_INIT(summoned_magic, list( - /obj/item/book/granter/spell/fireball, - /obj/item/book/granter/spell/smoke, - /obj/item/book/granter/spell/blind, - /obj/item/book/granter/spell/mindswap, - /obj/item/book/granter/spell/forcewall, - /obj/item/book/granter/spell/knock, - /obj/item/book/granter/spell/barnyard, - /obj/item/book/granter/spell/charge, - /obj/item/book/granter/spell/summonitem, - /obj/item/gun/magic/wand/nothing, - /obj/item/gun/magic/wand/death, - /obj/item/gun/magic/wand/resurrection, - /obj/item/gun/magic/wand/polymorph, - /obj/item/gun/magic/wand/teleport, - /obj/item/gun/magic/wand/door, - /obj/item/gun/magic/wand/fireball, - /obj/item/gun/magic/staff/healing, - /obj/item/gun/magic/staff/door, - /obj/item/scrying, - /obj/item/voodoo, - /obj/item/warpwhistle, - /obj/item/clothing/suit/space/hardsuit/shielded/wizard, - /obj/item/immortality_talisman, - /obj/item/melee/ghost_sword)) - -GLOBAL_LIST_INIT(summoned_special_magic, list( - /obj/item/gun/magic/staff/change, - /obj/item/gun/magic/staff/animate, - /obj/item/storage/belt/wands/full, - /obj/item/antag_spawner/contract, - /obj/item/gun/magic/staff/chaos, - /obj/item/necromantic_stone, - /obj/item/blood_contract)) - -//everything above except for single use spellbooks, because they are counted separately (and are for basic bitches anyways) -GLOBAL_LIST_INIT(summoned_magic_objectives, list( - /obj/item/antag_spawner/contract, - /obj/item/blood_contract, - /obj/item/clothing/suit/space/hardsuit/shielded/wizard, - /obj/item/gun/magic, - /obj/item/immortality_talisman, - /obj/item/melee/ghost_sword, - /obj/item/necromantic_stone, - /obj/item/scrying, - /obj/item/spellbook, - /obj/item/storage/belt/wands/full, - /obj/item/voodoo, - /obj/item/warpwhistle)) - // If true, it's the probability of triggering "survivor" antag. GLOBAL_VAR_INIT(summon_guns_triggered, FALSE) -GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) /proc/give_guns(mob/living/carbon/human/H) if(H.stat == DEAD || !(H.client)) @@ -125,54 +73,19 @@ GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) to_chat(H, "\A [G] appears [in_hand ? "in your hand" : "at your feet"]!") -/proc/give_magic(mob/living/carbon/human/H) - if(H.stat == DEAD || !(H.client)) - return - if(H.mind) - if(iswizard(H) || H.mind.has_antag_datum(/datum/antagonist/survivalist/magic)) - return - - if(prob(GLOB.summon_magic_triggered) && !(H.mind.has_antag_datum(/datum/antagonist))) - H.mind.add_antag_datum(/datum/antagonist/survivalist/magic) - H.log_message("was made into a survivalist, and trusts no one!", LOG_ATTACK, color="red") - - var/magic_type = pick(GLOB.summoned_magic) - var/lucky = FALSE - if(prob(SPECIALIST_MAGIC_PROB)) - magic_type = pick(GLOB.summoned_special_magic) - lucky = TRUE - - var/obj/item/M = new magic_type(get_turf(H)) - playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, TRUE) - - var/in_hand = H.put_in_hands(M) - - to_chat(H, "\A [M] appears [in_hand ? "in your hand" : "at your feet"]!") - if(lucky) - to_chat(H, "You feel incredibly lucky.") - - -/proc/rightandwrong(summon_type, mob/user, survivor_probability) - if(user) //in this case either someone holding a spellbook or a badmin - to_chat(user, "You summoned [summon_type]!") - message_admins("[ADMIN_LOOKUPFLW(user)] summoned [summon_type]!") - log_game("[key_name(user)] summoned [summon_type]!") +/proc/rightandwrong(mob/user, survivor_probability) + if(user) //in this case someone is a badmin + to_chat(user, "You summoned guns!") + message_admins("[ADMIN_LOOKUPFLW(user)] summoned guns!") + log_game("[key_name(user)] summoned guns!") - if(summon_type == SUMMON_MAGIC) - GLOB.summon_magic_triggered = survivor_probability - else if(summon_type == SUMMON_GUNS) - GLOB.summon_guns_triggered = survivor_probability - else - CRASH("Bad summon_type given: [summon_type]") + GLOB.summon_guns_triggered = survivor_probability for(var/mob/living/carbon/human/H in GLOB.player_list) var/turf/T = get_turf(H) if(T && is_away_level(T)) continue - if(summon_type == SUMMON_MAGIC) - give_magic(H) - else - give_guns(H) + give_guns(H) /proc/summonevents() if(!SSevents.wizardmode) diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index b1d85fb3fcbb..6cca888295a2 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -115,7 +115,6 @@ /obj/item/clothing/head/powdered_wig = 1, /obj/item/clothing/accessory/fan_mime_pin = 1, /obj/item/clothing/accessory/fan_clown_pin = 1, - /obj/item/gun/magic/wand/nothing = 2, /obj/item/clothing/glasses/sunglasses/garb = 2, /obj/item/clothing/glasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2) diff --git a/shiptest.dme b/shiptest.dme index 79563ae65d92..9131ace1bffd 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -3031,17 +3031,17 @@ #include "code\modules\projectiles\guns\energy\special.dm" #include "code\modules\projectiles\guns\energy\stun.dm" #include "code\modules\projectiles\guns\faction\gezena\energy_gunsword.dm" -#include "code\modules\projectiles\guns\magic\staff.dm" -#include "code\modules\projectiles\guns\magic\wand.dm" #include "code\modules\projectiles\guns\misc\beam_rifle.dm" #include "code\modules\projectiles\guns\misc\blastcannon.dm" #include "code\modules\projectiles\guns\misc\bow.dm" #include "code\modules\projectiles\guns\misc\chem_gun.dm" +#include "code\modules\projectiles\guns\misc\debug.dm" #include "code\modules\projectiles\guns\misc\grenade_launcher.dm" #include "code\modules\projectiles\guns\misc\medbeam.dm" #include "code\modules\projectiles\guns\misc\syringe_gun.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\debug.dm" #include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\bullets\_incendiary.dm" #include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" From 6564855fbb7b63676fba1a064ff3bcefb9294aa3 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 3 Apr 2024 22:03:43 -0500 Subject: [PATCH 110/206] regenerate and Atomproc call admin tools make these pointless --- code/modules/clothing/outfits/standard.dm | 2 - .../projectiles/ammunition/special/magic.dm | 7 - code/modules/projectiles/guns/misc/debug.dm | 126 ------------------ code/modules/projectiles/projectile/debug.dm | 23 ---- shiptest.dme | 2 - 5 files changed, 160 deletions(-) delete mode 100644 code/modules/projectiles/guns/misc/debug.dm delete mode 100644 code/modules/projectiles/projectile/debug.dm diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index d039d06dae35..100cc7ff0f52 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -226,8 +226,6 @@ backpack_contents = list( /obj/item/melee/transforming/energy/axe=1,\ /obj/item/storage/part_replacer/bluespace/tier4=1,\ - /obj/item/gun/magic/wand/resurrection/debug=1,\ - /obj/item/gun/magic/wand/death/debug=1,\ /obj/item/debug/human_spawner=1,\ /obj/item/debug/omnitool=1 ) diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index 5d30ba97690e..8459e5b93e9c 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -11,13 +11,6 @@ /obj/item/ammo_casing/magic/animate projectile_type = /obj/projectile/magic/animate -/obj/item/ammo_casing/magic/heal - projectile_type = /obj/projectile/debug/resurrection - harmful = FALSE - -/obj/item/ammo_casing/magic/death - projectile_type = /obj/projectile/debug/death - /obj/item/ammo_casing/magic/teleport projectile_type = /obj/projectile/magic/teleport harmful = FALSE diff --git a/code/modules/projectiles/guns/misc/debug.dm b/code/modules/projectiles/guns/misc/debug.dm deleted file mode 100644 index 607dbec425b5..000000000000 --- a/code/modules/projectiles/guns/misc/debug.dm +++ /dev/null @@ -1,126 +0,0 @@ -/obj/item/gun/magic/wand - name = "wand" - desc = "You shouldn't have this." - ammo_type = /obj/item/ammo_casing/magic - icon_state = "nothingwand" - item_state = "wand" - base_icon_state = "nothingwand" - w_class = WEIGHT_CLASS_SMALL - can_charge = FALSE - max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths) - var/variable_charges = TRUE - -/obj/item/gun/magic/wand/Initialize() - if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges - if(prob(33)) - max_charges = CEILING(max_charges / 3, 1) - else - max_charges = CEILING(max_charges / 2, 1) - return ..() - -/obj/item/gun/magic/wand/examine(mob/user) - . = ..() - . += "Has [charges] charge\s remaining." - -/obj/item/gun/magic/wand/update_icon_state() - icon_state = "[base_icon_state][charges ? null : "-drained"]" - return ..() - -/obj/item/gun/magic/wand/attack(atom/target, mob/living/user) - if(target == user) - return - ..() - -/obj/item/gun/magic/wand/afterattack(atom/target, mob/living/user) - var/wrested = FALSE - if(!charges) - wrested = shoot_with_empty_chamber(user) - if(!wrested) - return - if(target == user) - if(no_den_usage) - var/area/A = get_area(user) - if(istype(A, /area/wizard_station)) - to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") - return - else - no_den_usage = 0 - zap_self(user) - else - . = ..() - if(wrested) - to_chat(user,"[src] overloads and disintegrates.") - qdel(src) - return - update_appearance() - -/obj/item/gun/magic/wand/proc/zap_self(mob/living/user) - user.visible_message("[user] zaps [user.p_them()]self with [src].") - playsound(user, fire_sound, 50, TRUE) - user.log_message("zapped [user.p_them()]self with a [src]", LOG_ATTACK) - -/obj/item/gun/magic/wand/death - name = "wand of death" - desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail." - fire_sound = 'sound/magic/wandodeath.ogg' - ammo_type = /obj/item/ammo_casing/magic/death - icon_state = "deathwand" - base_icon_state = "deathwand" - max_charges = 3 //3, 2, 2, 1 - -/obj/item/gun/magic/wand/death/zap_self(mob/living/user) - ..() - charges-- - if(user.anti_magic_check()) - user.visible_message("[src] has no effect on [user]!") - return - if(isliving(user)) - var/mob/living/L = user - if(L.mob_biotypes & MOB_UNDEAD) //negative energy heals the undead - user.revive(full_heal = TRUE, admin_revive = TRUE) - to_chat(user, "You feel great!") - return - to_chat(user, "You irradiate yourself with pure negative energy! \ - [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\ - ") - user.death(FALSE) - -/obj/item/gun/magic/wand/death/debug - desc = "In some obscure circles, this is known as the 'cloning tester's friend'." - max_charges = 500 - variable_charges = FALSE - can_charge = TRUE - recharge_rate = 1 - -/obj/item/gun/magic/wand/resurrection - name = "wand of healing" - desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason." - ammo_type = /obj/item/ammo_casing/magic/heal - fire_sound = 'sound/magic/staff_healing.ogg' - icon_state = "revivewand" - base_icon_state = "revivewand" - max_charges = 10 //10, 5, 5, 4 - -/obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user) - ..() - charges-- - if(user.anti_magic_check()) - user.visible_message("[src] has no effect on [user]!") - return - if(isliving(user)) - var/mob/living/L = user - if(L.mob_biotypes & MOB_UNDEAD) //positive energy harms the undead - to_chat(user, "You irradiate yourself with pure positive energy! \ - [pick("Do not pass go. Do not collect 200 zorkmids.","You feel more confident in your spell casting skills.","You Die...","Do you want your possessions identified?")]\ - ") - user.death(0) - return - user.revive(full_heal = TRUE, admin_revive = TRUE) - to_chat(user, "You feel great!") - -/obj/item/gun/magic/wand/resurrection/debug //for testing - desc = "Is it possible for something to be even more powerful than regular magic? This wand is." - max_charges = 500 - variable_charges = FALSE - can_charge = TRUE - recharge_rate = 1 diff --git a/code/modules/projectiles/projectile/debug.dm b/code/modules/projectiles/projectile/debug.dm deleted file mode 100644 index 06b1ea7ca3e1..000000000000 --- a/code/modules/projectiles/projectile/debug.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/projectile/debug/death - name = "bolt of death" - icon_state = "pulse1_bl" - -/obj/projectile/debug/death/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/M = target - M.death(0) - -/obj/projectile/debug/resurrection - name = "bolt of resurrection" - icon_state = "ion" - nodamage = TRUE - -/obj/projectile/debug/resurrection/on_hit(mob/living/carbon/target) - . = ..() - if(isliving(target)) - if(target.revive(full_heal = TRUE, admin_revive = TRUE)) - target.grab_ghost(force = TRUE) // even suicides - to_chat(target, "You rise with a start, you're alive!!!") - else if(target.stat != DEAD) - to_chat(target, "You feel great!") diff --git a/shiptest.dme b/shiptest.dme index 9131ace1bffd..59fc9bc5997a 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -3035,13 +3035,11 @@ #include "code\modules\projectiles\guns\misc\blastcannon.dm" #include "code\modules\projectiles\guns\misc\bow.dm" #include "code\modules\projectiles\guns\misc\chem_gun.dm" -#include "code\modules\projectiles\guns\misc\debug.dm" #include "code\modules\projectiles\guns\misc\grenade_launcher.dm" #include "code\modules\projectiles\guns\misc\medbeam.dm" #include "code\modules\projectiles\guns\misc\syringe_gun.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\debug.dm" #include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\bullets\_incendiary.dm" #include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" From 32ad922cfdd81fa93c8036936f897c604d975f52 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 3 Apr 2024 22:11:43 -0500 Subject: [PATCH 111/206] how did i readd this --- .../syndicate/syndicate_luxembourg.dmm | 3314 ----------------- 1 file changed, 3314 deletions(-) delete mode 100644 _maps/shuttles/syndicate/syndicate_luxembourg.dmm diff --git a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm deleted file mode 100644 index cff4c84386e0..000000000000 --- a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm +++ /dev/null @@ -1,3314 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aB" = ( -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"aD" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"aK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/south, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_engine"; - location = "lux_crew" - }, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"bi" = ( -/obj/machinery/button/door{ - id = "syndiefuck"; - name = "Loading Shutters Control"; - pixel_x = -25; - pixel_y = -7; - dir = 4 - }, -/obj/machinery/button/door{ - id = "warehouse"; - name = "Warehouse Control"; - pixel_x = -25; - pixel_y = 5; - dir = 4 - }, -/obj/machinery/button/door{ - id = "cargodoors"; - name = "Cargo Bay Shutter Control"; - pixel_x = -35; - pixel_y = 5; - dir = 4 - }, -/obj/machinery/button/door{ - id = "externalshutters"; - name = "External Shutters Control"; - pixel_x = -35; - pixel_y = -7; - dir = 4 - }, -/obj/machinery/computer/cargo/express{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"bp" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/blue/half{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"bt" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/volume_pump{ - dir = 8 - }, -/obj/structure/catwalk/over/plated_catwalk/white, -/turf/open/floor/plating, -/area/ship/engineering) -"bB" = ( -/obj/structure/rack, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 9 - }, -/obj/item/gps/mining, -/obj/item/paicard, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"bN" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"bV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/displaycase, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"cb" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"cq" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/computer/mech_bay_power_console{ - dir = 8 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"cs" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"cB" = ( -/obj/item/toy/figure/cargotech, -/obj/item/clothing/suit/hooded/wintercoat/cargo, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/item/hand_labeler_refill, -/obj/item/clothing/under/syndicate/donk, -/obj/item/clothing/suit/hazardvest/donk, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/item/stack/wrapping_paper, -/obj/item/stack/packageWrap, -/obj/structure/closet/wall{ - dir = 8; - icon_door = "orange_wall"; - name = "employee closet"; - pixel_x = 28 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"cI" = ( -/obj/structure/rack, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"dp" = ( -/obj/structure/displaycase, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"dA" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/hallway/central) -"dC" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/obj/machinery/space_heater, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"dH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/displaycase, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"dL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"dM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"eD" = ( -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 10 - }, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"eF" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 12 - }, -/obj/structure/mirror{ - pixel_x = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/item/storage/firstaid/regular, -/obj/item/storage/firstaid/medical{ - pixel_x = -5; - pixel_y = -4 - }, -/obj/structure/closet/wall/white/med{ - dir = 1; - name = "medicine locker"; - pixel_y = -28 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"eL" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/structure/catwalk/over/plated_catwalk/white, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"eX" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"fn" = ( -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"fo" = ( -/obj/item/card/emag, -/obj/item/tank/internals/emergency_oxygen/double, -/obj/item/storage/backpack/duffelbag/syndie{ - name = "manager's duffel bag" - }, -/obj/item/clothing/under/syndicate/donk/qm, -/obj/item/clothing/suit/hazardvest/donk/qm, -/obj/item/melee/classic_baton/telescopic, -/obj/item/radio/headset/syndicate/alt/leader, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000, -/obj/structure/closet/secure_closet/wall{ - dir = 4; - icon_state = "solgov_wall"; - name = "manager's locker"; - pixel_x = -28; - req_access_txt = "41" - }, -/obj/machinery/light_switch{ - pixel_y = 22 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"fv" = ( -/obj/machinery/selling_pad, -/obj/effect/turf_decal/box, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"fy" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/opaque/brown/filled/warning, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"fB" = ( -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 8 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"ga" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "cargodoors" - }, -/obj/item/radio/intercom/directional/north{ - pixel_y = 22 - }, -/turf/open/floor/plasteel/dark, -/area/ship/cargo) -"gf" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"gj" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 6 - }, -/obj/structure/closet/secure_closet/engineering_welding, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"gC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"hd" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"hi" = ( -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"hm" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"hs" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/cargo) -"hu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/obj/machinery/suit_storage_unit/inherit/industrial, -/obj/item/clothing/suit/space/syndicate, -/obj/item/clothing/head/helmet/space/syndicate, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"hX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 8 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"if" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/obj/machinery/computer/cryopod/directional/south, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/crew/dorm) -"it" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/shieldwallgen/atmos{ - anchored = 1; - dir = 1; - id = "luxembourg_cargo"; - locked = 1 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "syndiefuck" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"iF" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/vending_refill/engineering, -/obj/item/vending_refill/engineering, -/obj/item/vending_refill/engivend, -/obj/item/vending_refill/engivend, -/obj/item/vending_refill/hydronutrients, -/obj/item/vending_refill/hydronutrients, -/obj/item/vending_refill/boozeomat, -/obj/item/vending_refill/boozeomat, -/obj/item/vending_refill/medical, -/obj/item/vending_refill/medical, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/snack, -/obj/item/vending_refill/snack, -/obj/item/vending_refill/sovietsoda, -/obj/item/vending_refill/cola, -/obj/item/vending_refill/cola, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"iO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 10 - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"iR" = ( -/obj/machinery/power/shuttle/engine/fueled/plasma{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/layer_manifold, -/turf/open/floor/plating, -/area/ship/engineering) -"iZ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 - }, -/obj/structure/catwalk/over/plated_catwalk/white, -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"jr" = ( -/turf/open/floor/carpet/red_gold, -/area/ship/hallway/central) -"jv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"jH" = ( -/obj/structure/table, -/obj/item/radio/intercom/wideband/table{ - dir = 4 - }, -/obj/machinery/light_switch{ - pixel_y = 22 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"jK" = ( -/obj/machinery/air_sensor/atmos/air_tank, -/turf/open/floor/engine/air, -/area/ship/engineering) -"ke" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"ks" = ( -/obj/structure/closet/crate, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"kE" = ( -/obj/machinery/chem_master/condimaster, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"kI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 5 - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"kZ" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/hallway/central) -"lb" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"lg" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"lt" = ( -/obj/machinery/atmospherics/components/binary/volume_pump, -/obj/structure/catwalk/over/plated_catwalk/white, -/turf/open/floor/plating, -/area/ship/engineering) -"lK" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"lQ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters{ - id = "warehouse" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/storage) -"lW" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 1 - }, -/obj/structure/catwalk/over/plated_catwalk/white, -/turf/open/floor/plating, -/area/ship/engineering) -"mi" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/crew/dorm) -"mm" = ( -/obj/item/toy/figure/cargotech, -/obj/item/clothing/suit/hooded/wintercoat/cargo, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/item/hand_labeler_refill, -/obj/item/clothing/under/syndicate/donk, -/obj/item/clothing/suit/hazardvest/donk, -/obj/item/stack/wrapping_paper, -/obj/item/stack/packageWrap, -/obj/structure/railing, -/obj/structure/closet/wall{ - dir = 4; - icon_door = "orange_wall"; - name = "employee closet"; - pixel_x = -28 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"mE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/effect/turf_decal/kfp_small/left{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"mK" = ( -/obj/machinery/light/directional/south, -/obj/machinery/computer/atmos_control/tank/air_tank{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"na" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering) -"nz" = ( -/obj/structure/sign/donk{ - pixel_x = -32 - }, -/obj/structure/rack, -/obj/item/radio/headset, -/obj/item/radio/headset, -/obj/item/radio/headset, -/obj/item/radio/headset, -/obj/item/radio/headset, -/obj/item/radio/headset, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"ow" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/crew/canteen) -"pd" = ( -/obj/machinery/light/directional/east, -/obj/structure/closet/crate/large{ - name = "Donk! Co. Powerloader In a Box" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/rechargefloor, -/obj/mecha/working/ripley/cargo{ - name = "\improper Donk! Co. Cargo Loading Device" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"pt" = ( -/turf/closed/wall/mineral/plastitanium, -/area/ship/engineering) -"pJ" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/autolathe, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"pL" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"pR" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"qe" = ( -/obj/effect/turf_decal/atmos/air, -/turf/open/floor/engine/air, -/area/ship/engineering) -"qf" = ( -/obj/structure/table, -/obj/machinery/door/firedoor, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"qh" = ( -/obj/machinery/airalarm/directional/west, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 8 - }, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_shopfloor"; - location = "lux_lobby" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"ql" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"qO" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"qP" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"qR" = ( -/turf/open/floor/engine/air, -/area/ship/engineering) -"qV" = ( -/obj/item/toy/sword, -/obj/structure/closet/crate/wooden/toy, -/obj/item/ammo_box/magazine/toy/smgm45/riot, -/obj/item/ammo_box/magazine/toy/smgm45/riot, -/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"rh" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/opaque/blue/filled/warning{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"rm" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"rq" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/window{ - dir = 8; - name = "Canteen" - }, -/obj/effect/turf_decal/siding/red, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"rG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"rU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/opaque/orange/filled/warning, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"rV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{ - dir = 4 - }, -/obj/structure/window/plasma/reinforced/spawner/east, -/turf/open/floor/engine/air, -/area/ship/engineering) -"sh" = ( -/obj/machinery/power/shuttle/engine/fueled/plasma{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"sk" = ( -/obj/effect/turf_decal/atmos/plasma, -/turf/open/floor/engine/plasma, -/area/ship/engineering) -"sF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"sI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 6 - }, -/obj/effect/turf_decal/industrial/traffic{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"sV" = ( -/mob/living/simple_animal/bot/mulebot{ - bot_name = "\proper Christine"; - desc = "A Multiple Utility Load Effector bot. This one seems oddly menacing..."; - id = "Christine"; - name = "\proper Christine" - }, -/obj/effect/turf_decal/corner/opaque/brown/bordercee, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = null; - location = "mulestation" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"tx" = ( -/obj/machinery/power/port_gen/pacman, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/item/stack/sheet/mineral/plasma/five, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"tF" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/blue, -/obj/structure/curtain/bounty, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"tH" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/siding/red{ - dir = 10 - }, -/obj/effect/turf_decal/corner/opaque/neutral/bordercorner{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"tO" = ( -/obj/effect/turf_decal/siding/blue/corner, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"tU" = ( -/obj/machinery/camera{ - dir = 10 - }, -/turf/open/floor/plating, -/area/template_noop) -"tV" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/button/door{ - id = "cargodoors"; - pixel_x = 8; - pixel_y = -24 - }, -/obj/machinery/door/window{ - dir = 8; - name = "Cargo Bay" - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "cargodoors" - }, -/turf/open/floor/plasteel/dark, -/area/ship/cargo) -"ug" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/eastright, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "cargodoors" - }, -/turf/open/floor/plasteel/dark, -/area/ship/cargo) -"ul" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/power/port_gen/pacman, -/obj/item/stack/sheet/mineral/plasma/five, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"uo" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"uB" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/item/reagent_containers/food/drinks/shaker{ - pixel_x = 10 - }, -/obj/item/kitchen/knife{ - pixel_x = -8 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"uK" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input{ - dir = 8 - }, -/obj/structure/window/plasma/reinforced/spawner/west, -/turf/open/floor/engine/plasma, -/area/ship/engineering) -"uX" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/obj/machinery/suit_storage_unit/inherit/industrial, -/obj/item/clothing/suit/space/syndicate/green, -/obj/item/clothing/head/helmet/space/syndicate/green, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"vb" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters{ - id = "warehouse" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/storage) -"vf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"vp" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering) -"vw" = ( -/obj/machinery/camera{ - dir = 1 - }, -/turf/open/floor/plating, -/area/template_noop) -"vz" = ( -/obj/machinery/atmospherics/components/unary/shuttle/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner, -/obj/machinery/door/poddoor/shutters{ - id = "externalshutters" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"vT" = ( -/obj/structure/closet/crate, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"wd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"wN" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks, -/obj/machinery/light/directional/north, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"wP" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"wT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output{ - dir = 8 - }, -/obj/structure/window/plasma/reinforced/spawner/west, -/turf/open/floor/engine/plasma, -/area/ship/engineering) -"xa" = ( -/obj/effect/turf_decal/siding/blue, -/obj/effect/turf_decal/corner/opaque/blue/half{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"xc" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"xt" = ( -/obj/machinery/light/directional/east, -/obj/item/clothing/head/HoS/beret/syndicate, -/obj/item/radio/headset/syndicate/alt, -/obj/item/gun/ballistic/shotgun/doublebarrel, -/obj/item/clothing/under/rank/civilian/bartender, -/obj/structure/closet/secure_closet/bar{ - req_access = null; - req_one_access_txt = list(25,41) - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"xw" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/clothing{ - default_price = 0; - extra_price = 0 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"yd" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks/beer, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"yf" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"yh" = ( -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 24; - pixel_y = 5 - }, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/obj/effect/turf_decal/corner/opaque/brown/bordercorner{ - dir = 1 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"ym" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"yQ" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/catwalk/over/plated_catwalk/dark, -/turf/open/floor/plating, -/area/ship/engineering) -"yX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_kitchen"; - location = "lux_shopfloor" - }, -/obj/machinery/holopad/emergency/cargo, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"zc" = ( -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"zW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 6 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"Ai" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/airlock{ - name = "Dormitory" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/crew/dorm) -"AE" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/layer_manifold, -/turf/open/floor/plating, -/area/ship/engineering) -"AL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Bt" = ( -/turf/closed/wall/mineral/plastitanium, -/area/ship/crew/canteen) -"Bw" = ( -/turf/closed/wall/mineral/plastitanium, -/area/ship/cargo) -"BM" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/blue, -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/curtain/bounty, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/light_switch{ - dir = 4; - pixel_x = -19; - pixel_y = 12 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"BX" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/cryopod{ - dir = 4 - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/crew/dorm) -"BZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"CC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"CI" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"CM" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer2, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"CT" = ( -/obj/machinery/computer/atmos_control/tank/toxin_tank{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"CV" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/red, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"CW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/structure/closet/secure_closet/engineering_electrical, -/obj/item/stack/circuit_stack/full, -/obj/item/stack/circuit_stack/full, -/obj/item/stack/circuit_stack/full, -/obj/item/stack/circuit_stack/full, -/obj/machinery/light/directional/north, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"Da" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock{ - name = "Canteen" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/crew/canteen) -"Dq" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_crew"; - location = "lux_kitchen" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"Dw" = ( -/obj/structure/table, -/obj/structure/window/plasma/reinforced, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"DA" = ( -/obj/effect/turf_decal/siding/red, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light_switch{ - dir = 1; - pixel_x = 6; - pixel_y = -24 - }, -/obj/machinery/airalarm/directional/east, -/obj/machinery/vending/dinnerware, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"DE" = ( -/obj/structure/rack, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"DG" = ( -/obj/machinery/light/directional/south, -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"DJ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/effect/turf_decal/number/five{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"DW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/chair/plastic, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"Ee" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Ej" = ( -/obj/machinery/modular_computer/console/preset/command{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"Er" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering) -"EG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/opaque/brown/filled/warning{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"EO" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/crew/dorm) -"EW" = ( -/turf/open/floor/engine/plasma, -/area/ship/engineering) -"EZ" = ( -/obj/item/radio/headset/syndicate/alt, -/obj/item/toy/figure/cargotech, -/obj/item/clothing/suit/hooded/wintercoat/cargo, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/item/hand_labeler_refill, -/obj/item/clothing/under/syndicate/donk, -/obj/item/clothing/suit/hazardvest/donk, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/item/stack/wrapping_paper, -/obj/item/stack/packageWrap, -/obj/structure/closet/wall{ - dir = 4; - icon_door = "orange_wall"; - name = "employee closet"; - pixel_x = -28 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"Fj" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/item/paper{ - desc = "A piece of paper depicting a extremely pissed up upper manager"; - default_raw_text = "YOU DAMNNED FOOLS! YOU ARENT SUPPOSED TO USE YOUR STOCK, YOU'RE SUPPOSED TO SELL THEM!! WE AREN'T WASTING MY MONEY ARE WE!?! NOW GET BACK TO WORK!!!"; - name = "angry letter from upper management" - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"Fq" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/holopad/emergency/bar, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"FV" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"Ga" = ( -/obj/machinery/computer/helm, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"Gr" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"GD" = ( -/obj/docking_port/stationary{ - width = 30; - height = 15; - dir = 8; - dwidth = 15 - }, -/turf/template_noop, -/area/template_noop) -"GG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"Hx" = ( -/turf/closed/wall/mineral/plastitanium, -/area/ship/crew/dorm) -"HG" = ( -/obj/machinery/power/shieldwallgen/atmos{ - anchored = 1; - id = "luxembourg_cargo"; - locked = 1 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "syndiefuck" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"HK" = ( -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/obj/machinery/light/directional/east, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"HZ" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/rag, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"Id" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"Ij" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/docking_port/mobile{ - can_move_docking_ports = 1; - dir = 2; - launch_status = 0 - }, -/obj/machinery/door/poddoor/shutters{ - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/hallway/central) -"Ip" = ( -/obj/item/toy/figure/cargotech, -/obj/item/clothing/suit/hooded/wintercoat/cargo, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/item/hand_labeler_refill, -/obj/item/clothing/under/syndicate/donk, -/obj/item/clothing/suit/hazardvest/donk, -/obj/item/stack/wrapping_paper, -/obj/item/stack/packageWrap, -/obj/structure/railing, -/obj/structure/closet/wall{ - dir = 8; - icon_door = "orange_wall"; - name = "employee closet"; - pixel_x = 28 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"Iv" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"IT" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/siding/blue, -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 20; - pixel_y = 11 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Je" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Ji" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/blue, -/obj/structure/curtain/bounty, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"Jq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Jr" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue/corner, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"JO" = ( -/obj/structure/closet/crate/science, -/obj/item/circuitboard/machine/chem_dispenser/drinks, -/obj/item/circuitboard/machine/chem_dispenser/drinks, -/obj/item/circuitboard/machine/chem_dispenser/drinks, -/obj/item/circuitboard/machine/chem_dispenser/drinks/beer, -/obj/item/circuitboard/machine/chem_dispenser/drinks/beer, -/obj/item/circuitboard/machine/chem_dispenser/drinks/beer, -/obj/item/circuitboard/machine/deep_fryer, -/obj/item/circuitboard/machine/deep_fryer, -/obj/item/circuitboard/machine/deep_fryer, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/ore_redemption, -/obj/item/circuitboard/machine/ore_redemption, -/obj/item/circuitboard/machine/ore_redemption, -/obj/item/circuitboard/machine/microwave, -/obj/item/circuitboard/machine/microwave, -/obj/item/circuitboard/machine/microwave, -/obj/machinery/firealarm/directional/east, -/obj/machinery/light_switch{ - pixel_x = 6; - pixel_y = 24 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"JT" = ( -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "syndiefuck" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"JU" = ( -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 6 - }, -/obj/machinery/suit_storage_unit/inherit/industrial, -/obj/item/clothing/suit/space/syndicate/blue, -/obj/item/clothing/head/helmet/space/syndicate/blue, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"JV" = ( -/obj/effect/turf_decal/corner/opaque/brown/bordercorner{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Ka" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/storage) -"Kg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/shower{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/curtain, -/obj/effect/turf_decal/steeldecal/steel_decals10{ - dir = 8 - }, -/obj/machinery/light_switch{ - pixel_y = 23; - pixel_x = 11 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"Kk" = ( -/obj/machinery/air_sensor/atmos/toxin_tank, -/turf/open/floor/engine/plasma, -/area/ship/engineering) -"Ko" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_lobby"; - location = "lux_warehouse" - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"KH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/autodrobe/all_access{ - default_price = 0; - extra_price = 0 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"KX" = ( -/obj/structure/closet/crate, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"KZ" = ( -/obj/effect/turf_decal/siding/red, -/obj/structure/closet/secure_closet/freezer/wall{ - dir = 1; - name = "refrigerator"; - pixel_y = -32 - }, -/obj/item/storage/box/donkpockets/donkpocketteriyaki, -/obj/item/storage/box/donkpockets/donkpocketteriyaki, -/obj/item/storage/box/donkpockets/donkpocketteriyaki, -/obj/item/storage/box/donkpockets/donkpocketteriyaki, -/obj/item/storage/box/donkpockets/donkpocketspicy, -/obj/item/storage/box/donkpockets/donkpocketspicy, -/obj/item/storage/box/donkpockets/donkpocketspicy, -/obj/item/storage/box/donkpockets/donkpocketspicy, -/obj/item/storage/box/donkpockets/donkpockethonk, -/obj/item/storage/box/donkpockets/donkpockethonk, -/obj/item/storage/box/donkpockets/donkpockethonk, -/obj/item/storage/box/donkpockets/donkpockethonk, -/obj/item/storage/box/donkpockets, -/obj/item/storage/box/donkpockets, -/obj/item/storage/box/donkpockets, -/obj/item/storage/box/donkpockets, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"La" = ( -/obj/effect/turf_decal/corner/opaque/blue{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "cargodoors"; - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Lr" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/paper{ - desc = "A piece of paper depicting a extremely pissed up upper manager"; - default_raw_text = "YOU ARENT SUPPOSED TO BE MINING, HEAR ME!?!! YOU'RE SUPPOSED TO BE SELLING SHIT TO THE CONSUMERS YOU HEAR!! AS PUNISHMENT FOR THE LAST SHIFT, I HAVE REMOVED ALLL OF YOUR MINING TOOLS!! NOW GET BACK TO WORK!!"; - name = "angry letter from upper management" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"Lu" = ( -/obj/structure/chair/plastic{ - dir = 1 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"LU" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{ - dir = 4 - }, -/obj/structure/window/plasma/reinforced/spawner/east, -/turf/open/floor/engine/air, -/area/ship/engineering) -"LV" = ( -/obj/machinery/vending/boozeomat/all_access{ - default_price = 0; - extra_price = 0 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"LY" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/closet/crate, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"Mg" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"Mi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/structure/window/plasma/reinforced, -/obj/machinery/door/window/eastright, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "cargodoors" - }, -/turf/open/floor/plasteel/dark, -/area/ship/cargo) -"Mj" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump, -/obj/machinery/advanced_airlock_controller{ - pixel_x = -25 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"Mx" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/machinery/light_switch{ - dir = 1; - pixel_x = 10; - pixel_y = -21 - }, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/trimline/opaque/blue/filled/warning, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Mz" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 9 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"MT" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/cargo) -"MU" = ( -/obj/machinery/door/window/brigdoor{ - name = "Bridge"; - req_access_txt = "41" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 10 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/hallway/central) -"Nr" = ( -/turf/template_noop, -/area/template_noop) -"NH" = ( -/obj/effect/turf_decal/siding/blue/corner, -/obj/effect/turf_decal/corner/opaque/blue/half{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"NJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"NQ" = ( -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ - pixel_x = 6 - }, -/obj/item/lighter/greyscale{ - pixel_x = -3; - pixel_y = 4 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"On" = ( -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/structure/closet/crate, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"Op" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/crew/canteen) -"Oq" = ( -/obj/structure/table, -/obj/item/toy/cards/deck/syndicate, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"Oz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"OR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 6 - }, -/obj/effect/decal/cleanable/oil, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"OY" = ( -/obj/structure/closet/crate/trashcart, -/obj/effect/spawner/lootdrop/maintenance/eight, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 9 - }, -/obj/machinery/button/shieldwallgen{ - id = "luxembourg_cargo"; - pixel_x = -10; - pixel_y = 25 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/button/door{ - id = "syndiefuck"; - pixel_x = -20; - pixel_y = 26 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Pb" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/crew/dorm) -"Ph" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/effect/turf_decal/number/zero{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"Ps" = ( -/obj/machinery/light/directional/south, -/obj/item/banner/cargo, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 10 - }, -/obj/machinery/button/shieldwallgen{ - dir = 1; - id = "luxembourg_cargo"; - pixel_x = -10; - pixel_y = -25 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/button/door{ - dir = 1; - id = "syndiefuck"; - pixel_x = -20; - pixel_y = -26 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"PO" = ( -/obj/structure/sign/poster/contraband/syndicate_recruitment{ - pixel_x = 4; - pixel_y = -30 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/opaque/blue/filled/warning, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"PW" = ( -/obj/structure/sign/donk{ - pixel_x = -32 - }, -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"QG" = ( -/obj/machinery/light/directional/west, -/obj/machinery/vending/toyliberationstation, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"QQ" = ( -/obj/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/hallway/central) -"QT" = ( -/obj/machinery/light/directional/east, -/obj/structure/window/plasma/reinforced, -/obj/machinery/computer/selling_pad_control{ - dir = 8 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"QU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/button/door{ - id = "warehouse"; - pixel_x = 24; - pixel_y = 21 - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"Rk" = ( -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/obj/machinery/light/directional/west, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"Ro" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/structure/catwalk/over/plated_catwalk/white, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"Rp" = ( -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"RH" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/cargo) -"RM" = ( -/obj/effect/turf_decal/trimline/opaque/brown/filled/warning, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Sn" = ( -/obj/effect/turf_decal/siding/blue, -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"SS" = ( -/obj/item/radio/headset/syndicate/alt, -/obj/item/toy/figure/cargotech, -/obj/item/clothing/suit/hooded/wintercoat/cargo, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/item/hand_labeler_refill, -/obj/item/clothing/under/syndicate/donk, -/obj/item/clothing/suit/hazardvest/donk, -/obj/item/stack/wrapping_paper, -/obj/item/stack/packageWrap, -/obj/structure/closet/wall{ - dir = 4; - icon_door = "orange_wall"; - name = "employee closet"; - pixel_x = -28 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"Tj" = ( -/obj/effect/turf_decal/siding/red, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/light_switch{ - dir = 1; - pixel_x = 11; - pixel_y = -16 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"Ty" = ( -/obj/machinery/light/directional/east, -/obj/structure/closet/crate/large, -/obj/item/mecha_parts/mecha_equipment/mining_scanner, -/mob/living/simple_animal/bot/secbot/grievous/toy, -/obj/effect/decal/cleanable/blood/old, -/obj/item/hand_labeler_refill, -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, -/obj/item/mecha_parts/mecha_equipment/rcd, -/obj/item/mecha_parts/mecha_equipment/cable_layer, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"TB" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"TJ" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/storage) -"TP" = ( -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"TY" = ( -/obj/effect/turf_decal/corner/opaque/brown/bordercorner{ - dir = 1 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Ud" = ( -/obj/effect/turf_decal/siding/blue, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Uk" = ( -/turf/closed/wall/mineral/plastitanium, -/area/ship/storage) -"Uo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/binary/volume_pump, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"Uu" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"Uw" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/structure/curtain, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"UE" = ( -/turf/open/floor/plating, -/area/ship/engineering) -"UI" = ( -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"UO" = ( -/obj/machinery/atmospherics/pipe/layer_manifold, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering) -"Va" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"Vb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/opaque/blue/filled/warning, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Vi" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/industrial/traffic{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"Vn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Vs" = ( -/obj/machinery/atmospherics/components/binary/volume_pump, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"VG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/effect/turf_decal/number/two{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"VR" = ( -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ship/engineering) -"VS" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/plastitaniumglass{ - amount = 20 - }, -/obj/item/stack/sheet/mineral/plastitanium{ - amount = 20 - }, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/decal/cleanable/dirt, -/obj/item/hand_labeler_refill, -/obj/item/stack/sheet/mineral/wood/fifty, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"Wh" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/opaque/orange/filled/warning, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"Wt" = ( -/obj/machinery/smartfridge/bloodbank/preloaded, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/storage) -"WB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"WE" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/hallway/central) -"WQ" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/suit_storage_unit/inherit{ - req_access_txt = "41" - }, -/obj/item/clothing/suit/space/syndicate, -/obj/item/clothing/head/helmet/space/syndicate, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"WU" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Xf" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable/yellow, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_warehouse"; - location = "lux_engine" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"Xw" = ( -/obj/machinery/washing_machine, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"XM" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"XS" = ( -/obj/machinery/atmospherics/components/unary/shuttle/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/poddoor/shutters{ - id = "externalshutters" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"Yd" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/catwalk/over/plated_catwalk/white, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/ship/engineering) -"Yq" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"YE" = ( -/obj/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east{ - pixel_y = 37 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/hallway/central) -"YI" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/crew/canteen) -"YK" = ( -/obj/machinery/airalarm/directional/west, -/obj/item/clothing/head/collectable/chef, -/obj/item/clothing/head/collectable/paper, -/obj/item/clothing/head/collectable/tophat, -/obj/item/clothing/head/collectable/captain, -/obj/item/clothing/head/collectable/beret, -/obj/item/clothing/head/collectable/welding, -/obj/item/clothing/head/collectable/flatcap, -/obj/item/clothing/head/collectable/pirate, -/obj/item/clothing/head/collectable/kitty, -/obj/item/clothing/head/collectable/rabbitears, -/obj/item/clothing/head/collectable/wizard, -/obj/item/clothing/head/collectable/hardhat, -/obj/item/clothing/head/collectable/HoS, -/obj/item/clothing/head/collectable/HoP, -/obj/item/clothing/head/collectable/thunderdome, -/obj/item/clothing/head/collectable/swat, -/obj/item/clothing/head/collectable/slime, -/obj/item/clothing/head/collectable/police, -/obj/item/clothing/head/collectable/xenom, -/obj/item/clothing/head/collectable/petehat, -/obj/structure/closet/crate, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"YL" = ( -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"YO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 5 - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"YZ" = ( -/obj/structure/closet/secure{ - icon_state = "eng_secure"; - name = "GEC Engineer's locker" - }, -/obj/item/clothing/gloves/color/yellow, -/obj/item/pipe_dispenser, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/suit/toggle/hazard, -/obj/item/clothing/head/beret/eng/hazard, -/obj/item/clothing/head/beret/eng, -/obj/item/holosign_creator/engineering, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/item/clothing/under/syndicate/gec, -/obj/item/clothing/under/syndicate/gec, -/obj/item/stack/tape/industrial/pro, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/light_switch{ - pixel_y = 23; - pixel_x = 11 - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"Zm" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"ZV" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 5 - }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ship/engineering) - -(1,1,1) = {" -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -GD -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -"} -(2,1,1) = {" -Nr -Nr -Nr -Nr -Nr -Nr -hs -HG -JT -JT -JT -it -Ka -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -"} -(3,1,1) = {" -Nr -Nr -Nr -Nr -Bw -MT -hs -OY -hX -hX -fB -Ps -Ka -TJ -TJ -Uk -Nr -Nr -Nr -Nr -pt -VR -pt -Nr -Nr -Nr -Nr -"} -(4,1,1) = {" -Nr -Nr -Nr -Bw -hs -Mz -qh -JV -AL -hi -CC -RM -vb -VS -qV -Wt -TJ -Uk -Nr -Uk -VR -qe -VR -pt -Nr -Nr -Nr -"} -(5,1,1) = {" -Nr -Nr -hs -hs -bB -TY -CC -OR -gf -Je -wP -fy -lQ -QU -kI -iF -vT -Ka -TJ -Ka -VR -qR -jK -VR -Nr -Nr -Nr -"} -(6,1,1) = {" -Nr -Nr -RH -sV -yh -BZ -Vn -Ee -EG -hu -uX -JU -Ka -JO -iO -Fj -YO -YK -ks -On -vp -rV -LU -VR -pt -Nr -Nr -"} -(7,1,1) = {" -Nr -Nr -hs -hs -hs -ga -ug -Mi -tV -hs -hs -hs -Ka -Ka -Ty -Ko -Uu -lg -hm -rU -Ro -uo -ZV -mK -vp -pt -Nr -"} -(8,1,1) = {" -Nr -Nr -Nr -WE -WE -La -aB -NJ -Ud -TP -Rk -PW -cI -Ka -Ka -KX -LY -cq -pd -ke -vp -dC -GG -Uo -XS -iR -hd -"} -(9,1,1) = {" -tU -WE -kZ -WE -QG -NH -wd -WB -tO -Iv -Iv -Iv -yf -DG -Ka -Ka -Ka -Ka -Ka -Ka -vp -gj -Zm -Vs -vz -sh -Nr -"} -(10,1,1) = {" -WE -WE -Ej -bi -QQ -xa -dp -bV -Sn -TP -TP -jv -pL -Mx -vp -fo -SS -EZ -mm -tx -pR -XM -ql -pJ -vp -vp -vp -"} -(11,1,1) = {" -Ij -Ga -dA -jr -MU -rh -TB -WU -yX -gC -gC -Yq -Jq -Vb -dL -VG -Ph -DJ -mE -yQ -Xf -CM -Va -dM -AE -Mj -qP -"} -(12,1,1) = {" -WE -WE -jH -fv -YE -xa -dp -dH -Sn -TP -TP -DE -Jr -PO -vp -WQ -xt -cB -Ip -ul -pR -lb -Gr -eD -na -UO -Er -"} -(13,1,1) = {" -vw -WE -kZ -WE -QT -bp -Oz -vf -lK -ym -cs -eX -CI -DG -EO -EO -EO -EO -EO -EO -vp -CW -lW -lt -vz -sh -Nr -"} -(14,1,1) = {" -Nr -Nr -Nr -WE -WE -YL -YL -qO -xc -tH -IT -HK -zc -EO -EO -BX -if -EO -Kg -Uw -vp -YZ -Yd -lt -vz -sh -UE -"} -(15,1,1) = {" -Nr -Nr -YI -YI -YI -qf -HZ -Lr -Dw -rq -YI -EO -EO -EO -nz -Vi -sI -Ai -FV -Wh -eL -iZ -bt -CT -vp -pt -Nr -"} -(16,1,1) = {" -Nr -Nr -ow -YI -yd -UI -UI -Fq -UI -Tj -YI -Ji -NQ -BM -zW -bN -aK -Pb -Xw -eF -vp -uK -wT -VR -pt -Nr -Nr -"} -(17,1,1) = {" -Nr -Nr -Bt -YI -wN -UI -rG -Mg -Dq -CV -Da -cb -aD -Id -rm -xw -KH -EO -mi -EO -VR -EW -Kk -VR -Nr -Nr -Nr -"} -(18,1,1) = {" -Nr -Nr -Nr -Bt -YI -uB -kE -sF -UI -KZ -YI -Rp -DW -Oq -Lu -EO -mi -Hx -Nr -Hx -VR -sk -VR -pt -Nr -Nr -Nr -"} -(19,1,1) = {" -Nr -Nr -Nr -Nr -Bt -Op -YI -fn -LV -DA -YI -tF -EO -mi -mi -Hx -Nr -Nr -Nr -Nr -pt -VR -pt -Nr -Nr -Nr -Nr -"} -(20,1,1) = {" -Nr -Nr -Nr -Nr -Nr -Nr -YI -YI -Op -YI -YI -EO -EO -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -"} From d5046c58fae00768de81c548caa533eb01b71024 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 3 Apr 2024 22:39:27 -0500 Subject: [PATCH 112/206] more lol --- code/__DEFINES/DNA.dm | 1 - code/datums/components/fantasy/suffixes.dm | 4 - code/datums/dna.dm | 2 - code/datums/mutations/actions.dm | 61 -- code/game/objects/items/dna_injector.dm | 5 - .../structures/icemoon/cave_entrance.dm | 1 - code/modules/admin/verbs/randomverbs.dm | 2 - code/modules/events/wizard/magicarp.dm | 75 -- .../human/species_types/lizardpeople.dm | 1 - .../projectiles/ammunition/special/magic.dm | 55 -- code/modules/projectiles/projectile/magic.dm | 665 ------------------ code/modules/research/experimentor.dm | 10 - .../ruins/icemoonruin_code/hotsprings.dm | 56 -- code/modules/shuttle/special.dm | 129 ---- code/modules/spells/spell_types/aimed.dm | 6 +- code/modules/spells/spell_types/devil.dm | 2 +- code/modules/spells/spell_types/shapeshift.dm | 1 - code/modules/uplink/uplink_items.dm | 7 - shiptest.dme | 2 - 19 files changed, 4 insertions(+), 1081 deletions(-) delete mode 100644 code/modules/events/wizard/magicarp.dm delete mode 100644 code/modules/ruins/icemoonruin_code/hotsprings.dm diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 204e24daeab6..ac150af5505a 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -31,7 +31,6 @@ #define GLOWY /datum/mutation/human/glow #define ANTIGLOWY /datum/mutation/human/glow/anti #define TELEPATHY /datum/mutation/human/telepathy -#define FIREBREATH /datum/mutation/human/firebreath #define VOID /datum/mutation/human/void #define TONGUESPIKE /datum/mutation/human/tonguespike #define TONGUESPIKECHEM /datum/mutation/human/tongue_spike/chem diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index ec1ee58735f9..8cabee42d21c 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -131,11 +131,7 @@ /obj/projectile/bullet/honker = 15, /obj/projectile/temp = 15, /obj/projectile/ion = 15, - /obj/projectile/magic/door = 15, - /obj/projectile/magic/locker = 15, - /obj/projectile/magic/fetch = 15, /obj/projectile/beam/emitter = 15, - /obj/projectile/magic/flying = 15, /obj/projectile/energy/net = 15, /obj/projectile/bullet/incendiary/c9mm = 15, /obj/projectile/temp/hot = 15, diff --git a/code/datums/dna.dm b/code/datums/dna.dm index dde90dd5dbe8..abd20fd29212 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -659,8 +659,6 @@ O.Remove(src) visible_message("[src] vomits up their [O.name]!", "You vomit up your [O.name]") //no "vomit up your the heart" O.forceMove(drop_location()) - if(prob(20)) - O.animate_atom_living() if(9 to 10) ForceContractDisease(new/datum/disease/gastrolosis()) to_chat(src, "Oh, I actually feel quite alright!") diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index f2ffe7c25fd2..53080247b827 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -88,67 +88,6 @@ if(direction_text) to_chat(user,"You consider [tracking_target]'s scent. The trail leads [direction_text].") -/datum/mutation/human/firebreath - name = "Fire Breath" - desc = "An ancient mutation that gives lizards breath of fire." - quality = POSITIVE - difficulty = 12 - locked = TRUE - text_gain_indication = "Your throat is burning!" - text_lose_indication = "Your throat is cooling down." - power = /obj/effect/proc_holder/spell/aimed/firebreath - instability = 30 - energy_coeff = 1 - power_coeff = 1 - -/datum/mutation/human/firebreath/modify() - if(power) - var/obj/effect/proc_holder/spell/aimed/firebreath/S = power - S.strength = GET_MUTATION_POWER(src) - -/obj/effect/proc_holder/spell/aimed/firebreath - name = "Fire Breath" - desc = "You can breathe fire at a target." - school = "evocation" - charge_max = 600 - clothes_req = FALSE - range = 20 - projectile_type = /obj/projectile/magic/aoe/fireball/firebreath - base_icon_state = "fireball" - action_icon_state = "fireball0" - sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises - active_msg = "You built up heat in your mouth." - deactive_msg = "You swallow the flame." - var/strength = 1 - -/obj/effect/proc_holder/spell/aimed/firebreath/before_cast(list/targets) - . = ..() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(C.is_mouth_covered()) - C.adjust_fire_stacks(2) - C.IgniteMob() - to_chat(C,"Something in front of your mouth caught fire!") - return FALSE - -/obj/effect/proc_holder/spell/aimed/firebreath/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration) - if(!istype(P, /obj/projectile/magic/aoe/fireball)) - return - var/obj/projectile/magic/aoe/fireball/F = P - switch(strength) - if(1 to 3) - F.exp_light = strength-1 - if(4 to INFINITY) - F.exp_heavy = strength-3 - F.exp_fire += strength - -/obj/projectile/magic/aoe/fireball/firebreath - name = "fire breath" - exp_heavy = 0 - exp_light = 0 - exp_flash = 0 - exp_fire= 4 - /datum/mutation/human/void name = "Void Magnet" desc = "A rare genome that attracts odd forces not usually observed." diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 34563d5e649c..e44c7ca7b12b 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -90,11 +90,6 @@ desc = "This will make you big and strong, but give you a bad skin condition." add_mutations = list(HULK) -/obj/item/dnainjector/firebreath - name = "\improper DNA injector (Fire Breath)" - desc = "Restores the dragon ancestry." - add_mutations = list(FIREBREATH) - /obj/item/dnainjector/xraymut name = "\improper DNA injector (X-ray)" desc = "Finally you can see what the Captain does." diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 07ecef04afac..5b77da4aafc7 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -1047,7 +1047,6 @@ GLOBAL_LIST_INIT(ore_probability, list( if(prob(45)) new /obj/item/dnainjector/dwarf(loc) if(prob(35)) - new /obj/item/dnainjector/firebreath(loc) new /mob/living/simple_animal/hostile/gorilla(loc) if(prob(35)) new /mob/living/simple_animal/hostile/gorilla(loc) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index ae621e17d479..c6b62604a92c 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -735,8 +735,6 @@ M.audible_message("...wabbajack...wabbajack...") playsound(M.loc, 'sound/magic/staff_change.ogg', 50, TRUE, -1) - wabbajack(M) - message_admins("Mass polymorph started by [who_did_it] is complete.") diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm deleted file mode 100644 index 2546b1ebbb18..000000000000 --- a/code/modules/events/wizard/magicarp.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/round_event_control/wizard/magicarp //these fish is loaded - name = "Magicarp" - weight = 1 - typepath = /datum/round_event/wizard/magicarp - max_occurrences = 1 - earliest_start = 0 MINUTES - -/datum/round_event/wizard/magicarp - announceWhen = 3 - startWhen = 50 - -/datum/round_event/wizard/magicarp/setup() - startWhen = rand(40, 60) - -/datum/round_event/wizard/magicarp/announce(fake) - priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") - -/datum/round_event/wizard/magicarp/start() - for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) - if(prob(5)) - new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc) - else - new /mob/living/simple_animal/hostile/carp/ranged(C.loc) - -/mob/living/simple_animal/hostile/carp/ranged - name = "magicarp" - desc = "50% magic, 50% carp, 100% horrible." - icon_state = "magicarp" - icon_living = "magicarp" - icon_dead = "magicarp_dead" - icon_gib = "magicarp_gib" - ranged = 1 - retreat_distance = 2 - minimum_distance = 0 //Between shots they can and will close in to nash - projectiletype = /obj/projectile/magic - projectilesound = 'sound/weapons/emitter.ogg' - maxHealth = 50 - health = 50 - gold_core_spawnable = NO_SPAWN - random_color = FALSE - food_type = list() - tame_chance = 0 - bonus_tame_chance = 0 - var/allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, - /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, - /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage) - -/mob/living/simple_animal/hostile/carp/ranged/Initialize() - projectiletype = pick(allowed_projectile_types) - . = ..() - -/mob/living/simple_animal/hostile/carp/ranged/chaos - name = "chaos magicarp" - desc = "50% carp, 100% magic, 150% horrible." - color = "#00FFFF" - maxHealth = 75 - health = 75 - gold_core_spawnable = NO_SPAWN - -/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot() - projectiletype = pick(allowed_projectile_types) - ..() - -/mob/living/simple_animal/hostile/carp/ranged/xenobiology // these are for the xenobio gold slime pool - gold_core_spawnable = HOSTILE_SPAWN - allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/teleport, - /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, - /obj/projectile/magic/spell/magic_missile, /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/locker) //thanks Lett1 /finally, we can synthesize the lockerfish - -/mob/living/simple_animal/hostile/carp/ranged/chaos/xenobiology - gold_core_spawnable = HOSTILE_SPAWN - allowed_projectile_types = list(/obj/projectile/magic/change, /obj/projectile/magic/animate, - /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/aoe/fireball, - /obj/projectile/magic/spellblade, /obj/projectile/magic/arcane_barrage, /obj/projectile/magic/locker, /obj/projectile/magic/nothing, - /obj/projectile/magic/aoe/lightning, /obj/projectile/magic/necropotence, /obj/projectile/magic/fortify, /obj/projectile/magic/spell/magic_missile)//now THIS is chaos diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 141efed98e12..11f66ad36815 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -20,7 +20,6 @@ exotic_bloodtype = "L" disliked_food = GRAIN | DAIRY | CLOTH | GROSS liked_food = GORE | MEAT - inert_mutation = FIREBREATH deathsound = 'sound/voice/lizard/deathsound.ogg' wings_icons = list("Dragon") species_language_holder = /datum/language_holder/lizard diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index 8459e5b93e9c..046ae7dbc078 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -4,58 +4,3 @@ projectile_type = /obj/projectile/magic firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic heavy_metal = FALSE - -/obj/item/ammo_casing/magic/change - projectile_type = /obj/projectile/magic/change - -/obj/item/ammo_casing/magic/animate - projectile_type = /obj/projectile/magic/animate - -/obj/item/ammo_casing/magic/teleport - projectile_type = /obj/projectile/magic/teleport - harmful = FALSE - -/obj/item/ammo_casing/magic/safety - projectile_type = /obj/projectile/magic/safety - harmful = FALSE - -/obj/item/ammo_casing/magic/door - projectile_type = /obj/projectile/magic/door - harmful = FALSE - -/obj/item/ammo_casing/magic/fireball - projectile_type = /obj/projectile/magic/aoe/fireball - -/obj/item/ammo_casing/magic/chaos - projectile_type = /obj/projectile/magic - -/obj/item/ammo_casing/magic/spellblade - projectile_type = /obj/projectile/magic/spellblade - -/obj/item/ammo_casing/magic/honk - projectile_type = /obj/projectile/bullet/honker - -/obj/item/ammo_casing/magic/locker - projectile_type = /obj/projectile/magic/locker - -/obj/item/ammo_casing/magic/flying - projectile_type = /obj/projectile/magic/flying - -/obj/item/ammo_casing/magic/bounty - projectile_type = /obj/projectile/magic/bounty - -/obj/item/ammo_casing/magic/antimagic - projectile_type = /obj/projectile/magic/antimagic - -/obj/item/ammo_casing/magic/sapping - projectile_type = /obj/projectile/magic/sapping - -/obj/item/ammo_casing/magic/necropotence - projectile_type = /obj/projectile/magic/necropotence - -/obj/item/ammo_casing/magic/wipe - projectile_type = /obj/projectile/magic/wipe - -/obj/item/ammo_casing/magic/nothing - projectile_type = /obj/projectile/magic/nothing - harmful = FALSE diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 544e2cc95005..67a91efa0f61 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -7,579 +7,6 @@ armour_penetration = 100 flag = "magic" -/obj/projectile/magic/teleport - name = "bolt of teleportation" - icon_state = "bluespace" - damage = 0 - damage_type = OXY - nodamage = TRUE - var/inner_tele_radius = 0 - var/outer_tele_radius = 6 - -/obj/projectile/magic/teleport/on_hit(mob/target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] fizzles on contact with [target]!") - return BULLET_ACT_BLOCK - var/teleammount = 0 - var/teleloc = target - if(!isturf(target)) - teleloc = target.loc - for(var/atom/movable/stuff in teleloc) - if(!stuff.anchored && stuff.loc && !isobserver(stuff)) - if(do_teleport(stuff, stuff, 10, channel = TELEPORT_CHANNEL_MAGIC)) - teleammount++ - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(max(round(4 - teleammount),0), stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity - smoke.start() - -/obj/projectile/magic/safety - name = "bolt of safety" - icon_state = "bluespace" - damage = 0 - damage_type = OXY - nodamage = TRUE - -/obj/projectile/magic/safety/on_hit(atom/target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] fizzles on contact with [target]!") - return BULLET_ACT_BLOCK - if(isturf(target)) - return BULLET_ACT_HIT - - var/turf/origin_turf = get_turf(target) - var/turf/destination_turf = find_safe_turf() - - if(do_teleport(target, destination_turf, channel=TELEPORT_CHANNEL_MAGIC)) - for(var/t in list(origin_turf, destination_turf)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, t) - smoke.start() - -/obj/projectile/magic/door - name = "bolt of door creation" - icon_state = "energy" - damage = 0 - damage_type = OXY - nodamage = TRUE - var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond) - -/obj/projectile/magic/door/on_hit(atom/target) - . = ..() - if(istype(target, /obj/machinery/door)) - OpenDoor(target) - else - var/turf/T = get_turf(target) - if(isclosedturf(T) && !isindestructiblewall(T)) - CreateDoor(T) - -/obj/projectile/magic/door/proc/CreateDoor(turf/T) - var/door_type = pick(door_types) - var/obj/structure/mineral_door/D = new door_type(T) - T.ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - D.Open() - -/obj/projectile/magic/door/proc/OpenDoor(obj/machinery/door/D) - if(istype(D, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = D - A.locked = FALSE - D.open() - -/obj/projectile/magic/change - name = "bolt of change" - icon_state = "ice_1" - damage = 0 - damage_type = BURN - nodamage = TRUE - -/obj/projectile/magic/change/on_hit(atom/change) - . = ..() - if(ismob(change)) - var/mob/M = change - if(M.anti_magic_check()) - M.visible_message("[src] fizzles on contact with [M]!") - qdel(src) - return BULLET_ACT_BLOCK - wabbajack(change) - qdel(src) - -/proc/wabbajack(mob/living/M) - if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags)) - return - - M.notransform = TRUE - ADD_TRAIT(M, TRAIT_IMMOBILIZED, MAGIC_TRAIT) - ADD_TRAIT(M, TRAIT_HANDS_BLOCKED, MAGIC_TRAIT) - M.icon = null - M.cut_overlays() - M.invisibility = INVISIBILITY_ABSTRACT - - var/list/contents = M.contents.Copy() - - if(iscyborg(M)) - var/mob/living/silicon/robot/Robot = M - // Disconnect AI's in shells - if(Robot.connected_ai) - Robot.connected_ai.disconnect_shell() - if(Robot.mmi) - qdel(Robot.mmi) - Robot.notify_ai(NEW_BORG) - else - for(var/obj/item/W in contents) - if(!M.dropItemToGround(W)) - qdel(W) - - var/mob/living/new_mob - - var/randomize = pick("monkey","robot","slime","xeno","humanoid","animal") - switch(randomize) - if("monkey") - new_mob = new /mob/living/carbon/monkey(M.loc) - - if("robot") - var/robot = pick(200;/mob/living/silicon/robot, - /mob/living/silicon/robot/modules/syndicate, - /mob/living/silicon/robot/modules/syndicate/medical, - /mob/living/silicon/robot/modules/syndicate/saboteur, - 200;/mob/living/simple_animal/drone/polymorphed) - new_mob = new robot(M.loc) - if(issilicon(new_mob)) - new_mob.gender = M.gender - new_mob.invisibility = 0 - new_mob.job = "Cyborg" - var/mob/living/silicon/robot/Robot = new_mob - Robot.lawupdate = FALSE - Robot.connected_ai = null - Robot.mmi.transfer_identity(M) //Does not transfer key/client. - Robot.clear_inherent_laws(0) - Robot.clear_zeroth_law(0) - - if("slime") - new_mob = new /mob/living/simple_animal/slime/random(M.loc) - - if("xeno") - var/Xe - if(M.ckey) - Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/carbon/alien/humanoid/sentinel) - else - Xe = pick(/mob/living/carbon/alien/humanoid/hunter,/mob/living/simple_animal/hostile/alien/sentinel) - new_mob = new Xe(M.loc) - - if("animal") - var/path = pick(/mob/living/simple_animal/hostile/carp, - /mob/living/simple_animal/hostile/bear, - /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/statue, - /mob/living/simple_animal/hostile/retaliate/bat, - /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/simple_animal/hostile/killertomato, - /mob/living/simple_animal/hostile/poison/giant_spider, - /mob/living/simple_animal/hostile/poison/giant_spider/hunter, - /mob/living/simple_animal/hostile/blob/blobbernaut/independent, - /mob/living/simple_animal/hostile/carp/ranged, - /mob/living/simple_animal/hostile/carp/ranged/chaos, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, - /mob/living/simple_animal/hostile/asteroid/goliath/beast, - /mob/living/simple_animal/hostile/headcrab, - /mob/living/simple_animal/hostile/morph, - /mob/living/simple_animal/hostile/stickman, - /mob/living/simple_animal/hostile/stickman/dog, - /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/hostile/gorilla, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/pet/dog/corgi, - /mob/living/simple_animal/crab, - /mob/living/simple_animal/pet/dog/pug, - /mob/living/simple_animal/pet/cat, - /mob/living/simple_animal/mouse, - /mob/living/simple_animal/chicken, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/hostile/lizard, - /mob/living/simple_animal/pet/fox, - /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/pet/cat/cak, - /mob/living/simple_animal/chick) - new_mob = new path(M.loc) - - if("humanoid") - new_mob = new /mob/living/carbon/human(M.loc) - - if(prob(50)) - var/list/chooseable_races = list() - for(var/speciestype in subtypesof(/datum/species)) - var/datum/species/S = speciestype - if(initial(S.changesource_flags) & WABBAJACK) - chooseable_races += speciestype - - if(chooseable_races.len) - new_mob.set_species(pick(chooseable_races)) - - var/datum/preferences/A = new() //Randomize appearance for the human - A.copy_to(new_mob, icon_updates=0) - - var/mob/living/carbon/human/H = new_mob - H.update_hair() - H.update_body_parts(TRUE) - H.dna.update_dna_identity() - - if(!new_mob) - return - - // Some forms can still wear some items - for(var/obj/item/W in contents) - new_mob.equip_to_appropriate_slot(W) - - M.log_message("became [new_mob.real_name]", LOG_ATTACK, color="orange") - - new_mob.a_intent = INTENT_HARM - - M.wabbajack_act(new_mob) - - to_chat(new_mob, "Your form morphs into that of a [randomize].") - - var/poly_msg = get_policy(POLICY_POLYMORPH) - if(poly_msg) - to_chat(new_mob, poly_msg) - - M.transfer_observers_to(new_mob) - - qdel(M) - return new_mob - -/obj/projectile/magic/animate - name = "bolt of animation" - icon_state = "red_1" - damage = 0 - damage_type = BURN - nodamage = TRUE - -/obj/projectile/magic/animate/on_hit(atom/target, blocked = FALSE) - target.animate_atom_living(firer) - ..() - -/atom/proc/animate_atom_living(mob/living/owner = null) - if((isitem(src) || isstructure(src)) && !is_type_in_list(src, GLOB.protected_objects)) - if(istype(src, /obj/structure/statue/petrified)) - var/obj/structure/statue/petrified/P = src - if(P.petrified_mob) - var/mob/living/L = P.petrified_mob - var/mob/living/simple_animal/hostile/statue/S = new(P.loc, owner) - S.name = "statue of [L.name]" - if(owner) - S.faction = list("[REF(owner)]") - S.icon = P.icon - S.icon_state = P.icon_state - S.copy_overlays(P, TRUE) - S.color = P.color - S.atom_colours = P.atom_colours.Copy() - if(L.mind) - L.mind.transfer_to(S) - if(owner) - to_chat(S, "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.") - P.forceMove(S) - return - else - var/obj/O = src - if(istype(O, /obj/item/gun)) - new /mob/living/simple_animal/hostile/mimic/copy/ranged(loc, src, owner) - else - new /mob/living/simple_animal/hostile/mimic/copy(loc, src, owner) - - else if(istype(src, /mob/living/simple_animal/hostile/mimic/copy)) - // Change our allegiance! - var/mob/living/simple_animal/hostile/mimic/copy/C = src - if(owner) - C.ChangeOwner(owner) - -/obj/projectile/magic/spellblade - name = "blade energy" - icon_state = "lavastaff" - damage = 15 - damage_type = BURN - flag = "magic" - dismemberment = 50 - nodamage = FALSE - -/obj/projectile/magic/spellblade/on_hit(target) - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - qdel(src) - return BULLET_ACT_BLOCK - . = ..() - -/obj/projectile/magic/arcane_barrage - name = "arcane bolt" - icon_state = "arcane_barrage" - damage = 20 - damage_type = BURN - nodamage = FALSE - armour_penetration = 0 - flag = "magic" - hitsound = 'sound/weapons/barragespellhit.ogg' - -/obj/projectile/magic/arcane_barrage/on_hit(target) - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - qdel(src) - return BULLET_ACT_BLOCK - . = ..() - - -/obj/projectile/magic/locker - name = "locker bolt" - icon_state = "locker" - nodamage = TRUE - flag = "magic" - var/weld = TRUE - var/created = FALSE //prevents creation of more then one locker if it has multiple hits - var/locker_suck = TRUE - var/obj/structure/closet/locker_temp_instance = /obj/structure/closet/decay - -/obj/projectile/magic/locker/Initialize() - . = ..() - locker_temp_instance = new(src) - -/obj/projectile/magic/locker/prehit_pierce(atom/A) - . = ..() - if(isliving(A) && locker_suck) - var/mob/living/M = A - if(M.anti_magic_check()) // no this doesn't check if ..() returned to phase through do I care no it's magic ain't gotta explain shit - M.visible_message("[src] vanishes on contact with [A]!") - return PROJECTILE_DELETE_WITHOUT_HITTING - if(!locker_temp_instance.insertion_allowed(M)) - return - M.forceMove(src) - return PROJECTILE_PIERCE_PHASE - -/obj/projectile/magic/locker/on_hit(target) - if(created) - return ..() - if(LAZYLEN(contents)) - for(var/atom/movable/AM in contents) - locker_temp_instance.insert(AM) - locker_temp_instance.welded = weld - locker_temp_instance.update_appearance() - created = TRUE - return ..() - -/obj/projectile/magic/locker/Destroy() - locker_suck = FALSE - RemoveElement(/datum/element/connect_loc, projectile_connections) //We do this manually so the forcemoves don't "hit" us. This behavior is kinda dumb, someone refactor this - for(var/atom/movable/AM in contents) - AM.forceMove(get_turf(src)) - . = ..() - -/obj/structure/closet/decay - breakout_time = 600 - icon_welded = null - var/magic_icon = "cursed" - var/weakened_icon = "decursed" - var/auto_destroy = TRUE - -/obj/structure/closet/decay/Initialize() - . = ..() - if(auto_destroy) - addtimer(CALLBACK(src, PROC_REF(bust_open)), 5 MINUTES) - addtimer(CALLBACK(src, PROC_REF(magicly_lock)), 5) - -/obj/structure/closet/decay/proc/magicly_lock() - if(!welded) - return - icon_state = magic_icon - update_appearance() - -/obj/structure/closet/decay/after_weld(weld_state) - if(weld_state) - unmagify() - -/obj/structure/closet/decay/proc/decay() - animate(src, alpha = 0, time = 30) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 30) - -/obj/structure/closet/decay/open(mob/living/user, force = FALSE) - . = ..() - if(.) - if(icon_state == magic_icon) //check if we used the magic icon at all before giving it the lesser magic icon - unmagify() - else - addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS) - -/obj/structure/closet/decay/proc/unmagify() - icon_state = weakened_icon - update_appearance() - addtimer(CALLBACK(src, PROC_REF(decay)), 15 SECONDS) - icon_welded = "welded" - -/obj/projectile/magic/flying - name = "bolt of flying" - icon_state = "flight" - -/obj/projectile/magic/flying/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check()) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - var/atom/throw_target = get_edge_target_turf(L, angle2dir(Angle)) - L.throw_at(throw_target, 200, 4) - -/obj/projectile/magic/bounty - name = "bolt of bounty" - icon_state = "bounty" - -/obj/projectile/magic/bounty/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !firer) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - L.apply_status_effect(STATUS_EFFECT_BOUNTY, firer) - -/obj/projectile/magic/antimagic - name = "bolt of antimagic" - icon_state = "antimagic" - -/obj/projectile/magic/antimagic/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check()) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - L.apply_status_effect(STATUS_EFFECT_ANTIMAGIC) - -/obj/projectile/magic/fetch - name = "bolt of fetching" - icon_state = "fetch" - -/obj/projectile/magic/fetch/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !firer) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - var/atom/throw_target = get_edge_target_turf(L, get_dir(L, firer)) - L.throw_at(throw_target, 200, 4) - -/obj/projectile/magic/sapping - name = "bolt of sapping" - icon_state = "sapping" - -/obj/projectile/magic/sapping/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/sapped) - -/obj/projectile/magic/necropotence - name = "bolt of necropotence" - icon_state = "necropotence" - -/obj/projectile/magic/necropotence/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - to_chat(L, "Your body feels drained and there is a burning pain in your chest.") - L.maxHealth -= 20 - L.health = min(L.health, L.maxHealth) - if(L.maxHealth <= 0) - to_chat(L, "Your weakened soul is completely consumed by the [src]!") - L.mind.hasSoul = FALSE - for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list) - spell.charge_counter = spell.charge_max - spell.recharging = FALSE - spell.update_appearance() - -/obj/projectile/magic/fortify - name = "bolt of light" - icon_state = "spark" - -/obj/projectile/magic/fortify/on_hit(target) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.anti_magic_check() || !L.mind || !L.mind.hasSoul) - L.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - to_chat(L, "You feel your body flood with magical strength! Your flesh feels cleansed, and somehow... tougher.") - L.maxHealth += 20 - L.heal_overall_damage(20, 20) - L.apply_damage(-200, CLONE)//cleanses cellular damage - if(L.mind.hasSoul == FALSE)//restores consumed souls - to_chat(L, "You feel a warm light in your chest... the [src] has restored something you'd long forgotten.") - L.mind.hasSoul = TRUE - if(L.hellbound == 1) - L.hellbound = 0//devil economy in shambles - for(var/obj/effect/proc_holder/spell/spell in L.mind.spell_list) - spell.charge_counter = spell.charge_max - spell.recharging = FALSE - spell.update_appearance() - -/obj/projectile/magic/wipe - name = "bolt of possession" - icon_state = "wipe" - -/obj/projectile/magic/wipe/on_hit(target) - . = ..() - if(iscarbon(target)) - var/mob/living/carbon/M = target - if(M.anti_magic_check()) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - for(var/x in M.get_traumas())//checks to see if the victim is already going through possession - if(istype(x, /datum/brain_trauma/special/imaginary_friend/trapped_owner)) - M.visible_message("[src] vanishes on contact with [target]!") - return BULLET_ACT_BLOCK - to_chat(M, "Your mind has been opened to possession!") - possession_test(M) - return BULLET_ACT_HIT - -/obj/projectile/magic/wipe/proc/possession_test(mob/living/carbon/M) - var/datum/brain_trauma/special/imaginary_friend/trapped_owner/trauma = M.gain_trauma(/datum/brain_trauma/special/imaginary_friend/trapped_owner) - var/poll_message = "Do you want to play as [M.real_name]?" - if(M.mind && M.mind.assigned_role) - poll_message = "[poll_message] Job:[M.mind.assigned_role]." - if(M.mind && M.mind.special_role) - poll_message = "[poll_message] Status:[M.mind.special_role]." - else if(M.mind) - var/datum/antagonist/A = M.mind.has_antag_datum(/datum/antagonist/) - if(A) - poll_message = "[poll_message] Status:[A.name]." - var/list/mob/dead/observer/candidates = pollCandidatesForMob(poll_message, ROLE_PAI, null, FALSE, 100, M) - if(M.stat == DEAD)//boo. - return - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - to_chat(M, "You have been noticed by a ghost and it has possessed you!") - var/oldkey = M.key - M.ghostize(0) - M.key = C.key - trauma.friend.key = oldkey - trauma.friend.reset_perspective(null) - trauma.friend.Show() - trauma.friend_initialized = TRUE - else - to_chat(M, "Your mind has managed to go unnoticed in the spirit world.") - qdel(trauma) - /obj/projectile/magic/aoe name = "Area Bolt" desc = "What the fuck does this do?!" @@ -592,95 +19,3 @@ if(L.stat != DEAD && L != firer && !L.anti_magic_check()) return Bump(L) ..() - - -/obj/projectile/magic/aoe/lightning - name = "lightning bolt" - icon_state = "tesla_projectile" //Better sprites are REALLY needed and appreciated!~ - damage = 15 - damage_type = BURN - nodamage = FALSE - speed = 0.3 - flag = "magic" - - var/zap_power = 20000 - var/zap_range = 15 - var/zap_flags = ZAP_MOB_DAMAGE | ZAP_MOB_STUN | ZAP_OBJ_DAMAGE - var/chain - var/mob/living/caster - -/obj/projectile/magic/aoe/lightning/fire(setAngle) - if(caster) - chain = caster.Beam(src, icon_state = "lightning[rand(1, 12)]", time = INFINITY, maxdistance = INFINITY) - ..() - -/obj/projectile/magic/aoe/lightning/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/M = target - if(M.anti_magic_check()) - visible_message("[src] fizzles on contact with [target]!") - qdel(src) - return BULLET_ACT_BLOCK - tesla_zap(src, zap_range, zap_power, zap_flags) - qdel(src) - -/obj/projectile/magic/aoe/lightning/Destroy() - qdel(chain) - . = ..() - -/obj/projectile/magic/aoe/fireball - name = "bolt of fireball" - icon_state = "fireball" - damage = 10 - damage_type = BRUTE - nodamage = FALSE - - //explosion values - var/exp_heavy = 0 - var/exp_light = 2 - var/exp_flash = 3 - var/exp_fire = 2 - -/obj/projectile/magic/aoe/fireball/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/living/M = target - if(M.anti_magic_check()) - visible_message("[src] vanishes into smoke on contact with [target]!") - return BULLET_ACT_BLOCK - M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately - var/turf/T = get_turf(target) - explosion(T, -1, exp_heavy, exp_light, exp_flash, 0, flame_range = exp_fire) - -/obj/projectile/magic/aoe/fireball/infernal - name = "infernal fireball" - exp_heavy = -1 - exp_light = -1 - exp_flash = 4 - exp_fire= 5 - -/obj/projectile/magic/aoe/fireball/infernal/on_hit(target) - . = ..() - if(ismob(target)) - var/mob/living/M = target - if(M.anti_magic_check()) - return BULLET_ACT_BLOCK - var/turf/T = get_turf(target) - for(var/i=0, i<50, i+=10) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), T, -1, exp_heavy, exp_light, exp_flash, FALSE, FALSE, exp_fire), i) - -//still magic related, but a different path - -/obj/projectile/temp/chill - name = "bolt of chills" - icon_state = "ice_2" - damage = 0 - damage_type = BURN - nodamage = FALSE - armour_penetration = 100 - temperature = -200 // Cools you down greatly per hit - flag = "magic" - -/obj/projectile/magic/nothing - name = "bolt of nothing" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 9016d60515e7..ce473ad739cb 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -355,16 +355,6 @@ C.name = "Cup of Suspicious Liquid" C.desc = "It has a large hazard symbol printed on the side in fading ink." investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR) - else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff)) - var/turf/start = get_turf(src) - var/mob/M = locate(/mob/living) in view(src, 3) - var/turf/MT = get_turf(M) - if(MT) - visible_message("[src] dangerously overheats, launching a flaming fuel orb!") - investigate_log("Experimentor has launched a fireball at [M]!", INVESTIGATE_EXPERIMENTOR) - var/obj/projectile/magic/aoe/fireball/FB = new /obj/projectile/magic/aoe/fireball(start) - FB.preparePixelProjectile(MT, start) - FB.fire() else if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message("[src] malfunctions, melting [exp_on] and releasing a burst of flame!") explosion(loc, -1, 0, 0, 0, 0, flame_range = 2) diff --git a/code/modules/ruins/icemoonruin_code/hotsprings.dm b/code/modules/ruins/icemoonruin_code/hotsprings.dm deleted file mode 100644 index dd4d39e91a20..000000000000 --- a/code/modules/ruins/icemoonruin_code/hotsprings.dm +++ /dev/null @@ -1,56 +0,0 @@ -GLOBAL_LIST_EMPTY(cursed_minds) - -/** - * Turns whoever enters into a mob or random person - * - * If mob is chosen, turns the person into a random animal type - * If appearance is chosen, turns the person into a random human with a random species - * This changes name, and changes their DNA as well - * Random species is same as wizard swap event so people don't get killed ex: plasmamen - * Once the spring is used, it cannot be used by the same mind ever again - * After usage, teleports the user back to a random safe turf (so mobs are not killed by ice moon atmosphere) - * - */ - -/turf/open/water/cursed_spring - baseturfs = /turf/open/water/cursed_spring - planetary_atmos = TRUE - initial_gas_mix = ICEMOON_DEFAULT_ATMOS - -/turf/open/water/cursed_spring/Entered(atom/movable/thing, atom/oldLoc) - . = ..() - if(!isliving(thing)) - return - var/mob/living/L = thing - if(!L.client) - return - if(GLOB.cursed_minds[L.mind]) - return - GLOB.cursed_minds[L.mind] = TRUE - RegisterSignal(L.mind, COMSIG_PARENT_QDELETING, PROC_REF(remove_from_cursed)) - var/random_choice = pick("Mob", "Appearance") - switch(random_choice) - if("Mob") - L = wabbajack(L, "animal") - if("Appearance") - var/mob/living/carbon/human/H = wabbajack(L, "humanoid") - randomize_human(H) - var/list/all_species = list() - for(var/stype in subtypesof(/datum/species)) - var/datum/species/S = stype - if(initial(S.changesource_flags) & RACE_SWAP) - all_species += stype - var/random_race = pick(all_species) - H.set_species(random_race) - H.dna.unique_enzymes = H.dna.generate_unique_enzymes() - L = H - var/turf/T = find_safe_turf() - L.forceMove(T) - to_chat(L, "You blink and find yourself in [get_area_name(T)].") - -/** - * Deletes minds from the cursed minds list after their deletion - * - */ -/turf/open/water/cursed_spring/proc/remove_from_cursed(datum/mind/M) - GLOB.cursed_minds -= M diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 2603d9ea3e24..1ddb26efba88 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -1,134 +1,5 @@ // Special objects for shuttle templates go here if nowhere else -// Wabbajack statue, a sleeping frog statue that shoots bolts of change if -// living carbons are put on its altar/tables - -/obj/machinery/power/emitter/energycannon/magical - name = "wabbajack statue" - desc = "Who am I? What is my purpose in life? What do I mean by who am I?" - projectile_type = /obj/projectile/magic/change - icon = 'icons/obj/machines/magic_emitter.dmi' - icon_state = "wabbajack_statue" - icon_state_on = "wabbajack_statue_on" - base_icon_state = "wabbajack_statue" - active = FALSE - allow_switch_interact = FALSE - var/list/active_tables = list() - var/tables_required = 2 - -/obj/machinery/power/emitter/energycannon/magical/Initialize() - . = ..() - if(prob(50)) - desc = "Oh no, not again." - update_appearance() - -/obj/machinery/power/emitter/energycannon/magical/update_icon_state() - . = ..() - icon_state = active ? icon_state_on : initial(icon_state) - -/obj/machinery/power/emitter/energycannon/magical/process() - . = ..() - if(active_tables.len >= tables_required) - if(!active) - visible_message("\ - [src] opens its eyes.") - active = TRUE - else - if(active) - visible_message("\ - [src] closes its eyes.") - active = FALSE - update_appearance() - -/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, params) - return - -/obj/machinery/power/emitter/energycannon/magical/ex_act(severity) - return - -/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user) - return - -/obj/structure/table/abductor/wabbajack - name = "wabbajack altar" - desc = "Whether you're sleeping or waking, it's going to be quite chaotic." - max_integrity = 1000 - verb_say = "chants" - var/obj/machinery/power/emitter/energycannon/magical/our_statue - var/list/mob/living/sleepers = list() - var/never_spoken = TRUE - flags_1 = NODECONSTRUCT_1 - -/obj/structure/table/abductor/wabbajack/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/structure/table/abductor/wabbajack/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/structure/table/abductor/wabbajack/process() - var/area = orange(4, src) - if(!our_statue) - for(var/obj/machinery/power/emitter/energycannon/magical/M in area) - our_statue = M - break - - if(!our_statue) - name = "inert [initial(name)]" - return - else - name = initial(name) - - var/turf/T = get_turf(src) - var/list/found = list() - for(var/mob/living/carbon/C in T) - if(C.stat != DEAD) - found += C - - // New sleepers - for(var/i in found - sleepers) - var/mob/living/L = i - L.add_atom_colour("#800080", TEMPORARY_COLOUR_PRIORITY) - L.visible_message("A strange purple glow wraps itself around [L] as [L.p_they()] suddenly fall[L.p_s()] unconscious.", - "[desc]") - // Don't let them sit suround unconscious forever - addtimer(CALLBACK(src, PROC_REF(sleeper_dreams), L), 100) - - // Existing sleepers - for(var/i in found) - var/mob/living/L = i - L.SetSleeping(200) - - // Missing sleepers - for(var/i in sleepers - found) - var/mob/living/L = i - L.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#800080") - L.visible_message("The glow from [L] fades \ - away.") - L.grab_ghost() - - sleepers = found - - if(sleepers.len) - our_statue.active_tables |= src - if(never_spoken || prob(5)) - say(desc) - never_spoken = FALSE - else - our_statue.active_tables -= src - -/obj/structure/table/abductor/wabbajack/proc/sleeper_dreams(mob/living/sleeper) - if(sleeper in sleepers) - to_chat(sleeper, "While you slumber, you have the strangest dream, like you can see yourself from the outside.") - sleeper.ghostize(TRUE) - -/obj/structure/table/abductor/wabbajack/left - desc = "You sleep so it may wake." - -/obj/structure/table/abductor/wabbajack/right - desc = "It wakes so you may sleep." - // Bar staff, GODMODE mobs(as long as they stay in the shuttle) that just want to make sure people have drinks // and a good time. diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 9e30c708774d..8e502cd592f5 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -2,7 +2,7 @@ /obj/effect/proc_holder/spell/aimed name = "aimed projectile spell" base_icon_state = "projectile" - var/projectile_type = /obj/projectile/magic/teleport + var/projectile_type = /obj/projectile var/deactive_msg = "You discharge your projectile..." var/active_msg = "You charge your projectile!" var/active_icon_state = "projectile" @@ -106,7 +106,7 @@ projectile_var_overrides = list("zap_range" = 15, "zap_power" = 20000, "zap_flags" = ZAP_MOB_DAMAGE) active_msg = "You energize your hands with arcane lightning!" deactive_msg = "You let the energy flow out of your hands back into yourself..." - projectile_type = /obj/projectile/magic/aoe/lightning + projectile_type = /obj/projectile/magic /obj/effect/proc_holder/spell/aimed/fireball name = "Fireball" @@ -118,7 +118,7 @@ invocation_type = INVOCATION_SHOUT range = 20 cooldown_min = 20 //10 deciseconds reduction per rank - projectile_type = /obj/projectile/magic/aoe/fireball + projectile_type = /obj/projectile/magic base_icon_state = "fireball" action_icon_state = "fireball0" sound = 'sound/magic/fireball.ogg' diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index 6631d943a3aa..421f02d78d65 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -84,7 +84,7 @@ invocation_type = INVOCATION_SHOUT range = 2 - projectile_type = /obj/projectile/magic/aoe/fireball/infernal + projectile_type = /obj/projectile/magic action_background_icon_state = "bg_demon" diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 65eb0cebb2b3..254a43dc23af 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -19,7 +19,6 @@ var/mob/living/shapeshift_type var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\ /mob/living/simple_animal/pet/dog/corgi,\ - /mob/living/simple_animal/hostile/carp/ranged/chaos,\ /mob/living/simple_animal/bot/secbot/ed209,\ /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper,\ /mob/living/simple_animal/hostile/construct/juggernaut) diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index f58f94df84dd..eaa0a631ec5d 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1712,13 +1712,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/flashlight/lantern/syndicate restricted_species = list("moth") //End WS edit -/datum/uplink_item/race_restricted/syndigenetics - name = "Fire Breath" - desc = "One of our subsidiaries, 23AndMe, have recently found the formula of backtracking lizard's genetic trail and giving them the ability to breathe fire, much like their dragon ancestors." - cost = 5 - item = /obj/item/dnainjector/firebreath - restricted_species = list("lizard") - /datum/uplink_item/race_restricted/razorwing name = "Razorwing Implant" desc = "Put those wings to good use! This implant makes your wingtips razor sharp and gives you the ability to flourish them, slicing anyone in range." diff --git a/shiptest.dme b/shiptest.dme index 59fc9bc5997a..61ff5146c7cb 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -2108,7 +2108,6 @@ #include "code\modules\events\wizard\invincible.dm" #include "code\modules\events\wizard\lava.dm" #include "code\modules\events\wizard\madness.dm" -#include "code\modules\events\wizard\magicarp.dm" #include "code\modules\events\wizard\petsplosion.dm" #include "code\modules\events\wizard\race.dm" #include "code\modules\events\wizard\rpgloot.dm" @@ -3230,7 +3229,6 @@ #include "code\modules\research\xenobiology\crossbreeding\stabilized.dm" #include "code\modules\ruins\lavaland_ruin_code.dm" #include "code\modules\ruins\rockplanet_ruin_code.dm" -#include "code\modules\ruins\icemoonruin_code\hotsprings.dm" #include "code\modules\ruins\icemoonruin_code\hydroponicslab.dm" #include "code\modules\ruins\icemoonruin_code\library.dm" #include "code\modules\ruins\icemoonruin_code\wrath.dm" From 1d48d3ee8643d14a7d311de6cec5d12cf8af26ef Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Thu, 4 Apr 2024 15:38:19 -0500 Subject: [PATCH 113/206] yea --- _maps/map_files/generic/CentCom.dmm | 5 ----- code/modules/projectiles/guns/magic.dm | 1 - code/modules/projectiles/projectile/magic/spellcard.dm | 6 ------ shiptest.dme | 1 - 4 files changed, 13 deletions(-) delete mode 100644 code/modules/projectiles/projectile/magic/spellcard.dm diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 07fec6af70db..9ad02e5f16ab 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -3063,11 +3063,6 @@ /area/wizard_station) "aEX" = ( /obj/structure/table/wood, -/obj/item/gun/magic/wand{ - desc = "Used in emergencies to reignite magma engines."; - max_charges = 0; - name = "wand of emergency engine ignition" - }, /turf/open/floor/plasteel, /area/wizard_station) "aEY" = ( diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 9360c24be499..be2f2394a543 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -74,7 +74,6 @@ recharge_newshot() return 1 - /obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) to_chat(user, "The [name] whizzles quietly.") diff --git a/code/modules/projectiles/projectile/magic/spellcard.dm b/code/modules/projectiles/projectile/magic/spellcard.dm deleted file mode 100644 index 464586d2f8a4..000000000000 --- a/code/modules/projectiles/projectile/magic/spellcard.dm +++ /dev/null @@ -1,6 +0,0 @@ -/obj/projectile/spellcard - name = "enchanted card" - desc = "A piece of paper enchanted to give it extreme durability and stiffness, along with a very hot burn to anyone unfortunate enough to get hit by a charged one." - icon_state = "spellcard" - damage_type = BURN - damage = 2 diff --git a/shiptest.dme b/shiptest.dme index 61ff5146c7cb..845389607403 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -3061,7 +3061,6 @@ #include "code\modules\projectiles\projectile\energy\nuclear_particle.dm" #include "code\modules\projectiles\projectile\energy\stun.dm" #include "code\modules\projectiles\projectile\energy\tesla.dm" -#include "code\modules\projectiles\projectile\magic\spellcard.dm" #include "code\modules\projectiles\projectile\reusable\_reusable.dm" #include "code\modules\projectiles\projectile\reusable\arrow.dm" #include "code\modules\projectiles\projectile\reusable\foam_dart.dm" From c696e6820a92b39f8fed530d2dbcf84a5a3e1c84 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 6 Apr 2024 17:28:46 -0500 Subject: [PATCH 114/206] removes more magic --- code/game/objects/items/granters.dm | 13 -- .../structures/fugitive_role_spawners.dm | 58 ------ .../structures/icemoon/cave_entrance.dm | 1 - .../changeling/powers/mutations.dm | 179 ------------------ .../antagonists/fugitive/fugitive_outfits.dm | 154 --------------- .../antagonists/wizard/equipment/spellbook.dm | 4 - .../awaymissions/mission_code/snowdin.dm | 13 -- code/modules/cargo/exports/lavaland.dm | 1 - .../mining/lavaland/necropolis_chests.dm | 90 --------- .../hostile/megafauna/codename_claw.dm | 16 +- .../mob/living/simple_animal/hostile/mimic.dm | 10 - .../boxes_magazines/internal/misc.dm | 6 - code/modules/projectiles/gun.dm | 1 + .../projectiles/guns/ballistic/shotgun.dm | 46 ----- code/modules/projectiles/guns/magic.dm | 84 -------- code/modules/projectiles/projectile/magic.dm | 21 -- .../xenobiology/crossbreeding/_weapons.dm | 51 ----- .../xenobiology/crossbreeding/chilling.dm | 23 --- code/modules/spells/spell_types/aimed.dm | 57 ------ code/modules/spells/spell_types/charge.dm | 14 -- shiptest.dme | 4 - 21 files changed, 3 insertions(+), 843 deletions(-) delete mode 100644 code/game/objects/structures/fugitive_role_spawners.dm delete mode 100644 code/modules/antagonists/fugitive/fugitive_outfits.dm delete mode 100644 code/modules/projectiles/guns/magic.dm delete mode 100644 code/modules/projectiles/projectile/magic.dm diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 0681892fd47e..f3cdfb068944 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -247,19 +247,6 @@ user.Stun(40, ignore_canstun = TRUE) user.petrify(30) -/obj/item/book/granter/spell/cards - spell = /obj/effect/proc_holder/spell/aimed/spell_cards - spellname = "spellcards" - icon_state ="bookspellcards" - desc = "The ultimate card trick, for users ten and up." - remarks = list("It's all about the razzmataz.", "...I don't think I'll actually be sawing anyone in half", "These are pretty flimsy, most armor would defeat them.", "They do burn damage? Weird.", "Why the dumb stance? It's just a flick of the hand...", "Are these cards? They feel stiffer then pages.", "Best performed using a top hat...") - -/obj/item/book/granter/spell/cards/recoil(mob/living/user) - ..() - to_chat(user,"The cards are against you!") - user.Stun(40, ignore_canstun = TRUE) - user.petrify(30) - /obj/item/book/granter/spell/shapechange spell = /obj/effect/proc_holder/spell/targeted/shapeshift spellname = "shapechange" diff --git a/code/game/objects/structures/fugitive_role_spawners.dm b/code/game/objects/structures/fugitive_role_spawners.dm deleted file mode 100644 index 4f98e919ffc5..000000000000 --- a/code/game/objects/structures/fugitive_role_spawners.dm +++ /dev/null @@ -1,58 +0,0 @@ - - -/obj/effect/mob_spawn/human/fugitive - assignedrole = "Fugitive Hunter" - flavour_text = "" //the flavor text will be the backstory argument called on the antagonist's greet, see hunter.dm for details - roundstart = FALSE - death = FALSE - random = TRUE - show_flavour = FALSE - density = TRUE - var/back_story = "error" - -/obj/effect/mob_spawn/human/fugitive/Initialize(mapload) - . = ..() - notify_ghosts("Hunters are waking up looking for refugees!", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_FUGITIVE) - -/obj/effect/mob_spawn/human/fugitive/spacepol - name = "police pod" - desc = "A small sleeper typically used to put people to sleep for briefing on the mission." - mob_name = "a spacepol officer" - flavour_text = "Justice has arrived. I am a member of the Spacepol!" - back_story = "space cop" - outfit = /datum/outfit/spacepol - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/human/fugitive/russian - name = "russian pod" - flavour_text = "Ay blyat. I am a space-russian smuggler! We were mid-flight when our cargo was beamed off our ship!" - back_story = "russian" - desc = "A small sleeper typically used to make long distance travel a bit more bearable." - mob_name = "russian" - outfit = /datum/outfit/frontier/hunter - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/human/fugitive/bounty - name = "bounty hunter pod" - flavour_text = "We got a new bounty on some fugitives, dead or alive." - back_story = "bounty hunters" - desc = "A small sleeper typically used to make long distance travel a bit more bearable." - mob_name = "bounty hunter" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/human/fugitive/bounty/Destroy() - var/obj/structure/fluff/empty_sleeper/S = new(drop_location()) - S.setDir(dir) - return ..() - -/obj/effect/mob_spawn/human/fugitive/bounty/armor - outfit = /datum/outfit/bountyarmor - -/obj/effect/mob_spawn/human/fugitive/bounty/hook - outfit = /datum/outfit/bountyhook - -/obj/effect/mob_spawn/human/fugitive/bounty/synth - outfit = /datum/outfit/bountysynth diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 5b77da4aafc7..2eff7f22567e 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -745,7 +745,6 @@ GLOBAL_LIST_INIT(ore_probability, list( new /obj/item/clothing/suit/space/hardsuit/carp(loc) new /mob/living/simple_animal/hostile/carp(loc) if(prob(45)) - new /obj/item/gun/magic/hook(loc) new /mob/living/simple_animal/hostile/carp(loc) if(prob(45)) new /obj/item/reagent_containers/food/snacks/fishmeat/carp(loc) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index d77c4ef6ff3c..90a12b7eab42 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -211,185 +211,6 @@ if(can_drop) new /obj/item/melee/synthetic_arm_blade(get_turf(user)) -/***************************************\ -|***********COMBAT TENTACLES*************| -\***************************************/ - -/datum/action/changeling/weapon/tentacle - name = "Tentacle" - desc = "We ready a tentacle to grab items or victims with. Costs 10 chemicals." - helptext = "We can use it once to retrieve a distant item. If used on living creatures, the effect depends on the intent: \ - Help will simply drag them closer, Disarm will grab whatever they're holding instead of them, Grab will put the victim in our hold after catching it, \ - and Harm will pull it in and stab it if we're also holding a sharp weapon. Cannot be used while in lesser form." - button_icon_state = "tentacle" - chemical_cost = 10 - dna_cost = 2 - req_human = 1 - weapon_type = /obj/item/gun/magic/tentacle - weapon_name_simple = "tentacle" - silent = TRUE - -/obj/item/gun/magic/tentacle - name = "tentacle" - desc = "A fleshy tentacle that can stretch out and grab things or people." - icon = 'icons/obj/changeling_items.dmi' - icon_state = "tentacle" - item_state = "tentacle" - lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' - righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | NOBLUDGEON - flags_1 = NONE - w_class = WEIGHT_CLASS_HUGE - slot_flags = NONE - ammo_type = /obj/item/ammo_casing/magic/tentacle - fire_sound = 'sound/effects/splat.ogg' - force = 0 - max_charges = 1 - fire_delay = 1 - throwforce = 0 //Just to be on the safe side - throw_range = 0 - throw_speed = 0 - -/obj/item/gun/magic/tentacle/Initialize(mapload, silent) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) - if(ismob(loc)) - if(!silent) - loc.visible_message("[loc.name]\'s arm starts stretching inhumanly!", "Our arm twists and mutates, transforming it into a tentacle.", "You hear organic matter ripping and tearing!") - else - to_chat(loc, "You prepare to extend a tentacle.") - - -/obj/item/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj) - to_chat(user, "The [name] is not ready yet.") - -/obj/item/gun/magic/tentacle/process_fire() - . = ..() - if(charges == 0) - qdel(src) - -/obj/item/ammo_casing/magic/tentacle - name = "tentacle" - desc = "A tentacle." - projectile_type = /obj/projectile/tentacle - caliber = "tentacle" - icon_state = "arrow" - firing_effect_type = null - var/obj/item/gun/magic/tentacle/gun //the item that shot it - -/obj/item/ammo_casing/magic/tentacle/Initialize() - gun = loc - . = ..() - -/obj/item/ammo_casing/magic/tentacle/Destroy() - gun = null - return ..() - -/obj/projectile/tentacle - name = "tentacle" - icon_state = "tentacle_end" - pass_flags = PASSTABLE - damage = 0 - damage_type = BRUTE - range = 8 - hitsound = 'sound/weapons/thudswoosh.ogg' - var/chain - var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it - -/obj/projectile/tentacle/Initialize() - source = loc - . = ..() - -/obj/projectile/tentacle/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE) - ..() - -/obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H) - if(H.throw_mode) - H.throw_mode_off() //Don't annoy the changeling if he doesn't catch the item - -/obj/projectile/tentacle/proc/tentacle_grab(mob/living/carbon/human/H, mob/living/carbon/C) - if(H.Adjacent(C)) - if(H.get_active_held_item() && !H.get_inactive_held_item()) - H.swap_hand() - if(H.get_active_held_item()) - return - C.grabbedby(H) - C.grippedby(H, instant = TRUE) //instant aggro grab - -/obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C) - if(H.Adjacent(C)) - for(var/obj/item/I in H.held_items) - if(I.get_sharpness()) - C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!") - C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST) - H.do_item_attack_animation(C, used_item = I) - H.add_mob_blood(C) - playsound(get_turf(H),I.hitsound,75,TRUE) - return - -/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE) - var/mob/living/carbon/human/H = firer - if(blocked >= 100) - return BULLET_ACT_BLOCK - if(isitem(target)) - var/obj/item/I = target - if(!I.anchored) - to_chat(firer, "You pull [I] towards yourself.") - H.throw_mode_on() - I.throw_at(H, 10, 2) - . = BULLET_ACT_HIT - - else if(isliving(target)) - var/mob/living/L = target - if(!L.anchored && !L.throwing)//avoid double hits - if(iscarbon(L)) - var/mob/living/carbon/C = L - var/firer_intent = INTENT_HARM - var/mob/M = firer - if(istype(M)) - firer_intent = M.a_intent - switch(firer_intent) - if(INTENT_HELP) - C.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2) - return BULLET_ACT_HIT - - if(INTENT_DISARM) - var/obj/item/I = C.get_active_held_item() - if(I) - if(C.dropItemToGround(I)) - C.visible_message("[I] is yanked off [C]'s hand by [src]!","A tentacle pulls [I] away from you!") - on_hit(I) //grab the item as if you had hit it directly with the tentacle - return BULLET_ACT_HIT - else - to_chat(firer, "You can't seem to pry [I] off [C]'s hands!") - return BULLET_ACT_BLOCK - else - to_chat(firer, "[C] has nothing in hand to disarm!") - return BULLET_ACT_HIT - - if(INTENT_GRAB) - C.visible_message("[L] is grabbed by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C)) - return BULLET_ACT_HIT - - if(INTENT_HARM) - C.visible_message("[L] is thrown towards [H] by a tentacle!","A tentacle grabs you and throws you towards [H]!") - C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_stab), H, C)) - return BULLET_ACT_HIT - else - L.visible_message("[L] is pulled by [H]'s tentacle!","A tentacle grabs you and pulls you towards [H]!") - L.throw_at(get_step_towards(H,L), 8, 2) - . = BULLET_ACT_HIT - -/obj/projectile/tentacle/Destroy() - qdel(chain) - source = null - return ..() - - /***************************************\ |****************SHIELD*****************| \***************************************/ diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm deleted file mode 100644 index df784813df40..000000000000 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ /dev/null @@ -1,154 +0,0 @@ -/datum/outfit/prisoner - name = "Prison Escapee" - uniform = /obj/item/clothing/under/rank/prisoner - shoes = /obj/item/clothing/shoes/sneakers/orange - r_pocket = /obj/item/kitchen/knife/shiv - -/datum/outfit/prisoner/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) - if(visualsOnly) - return - H.fully_replace_character_name(null,"NTP #CC-0[rand(111,999)]") //same as the lavaland prisoner transport, but this time they are from CC, or CentCom - -/datum/outfit/yalp_cultist - name = "Cultist of Yalp Elor" - uniform = /obj/item/clothing/under/rank/civilian/chaplain - suit = /obj/item/clothing/suit/chaplainsuit/holidaypriest - gloves = /obj/item/clothing/gloves/color/red - shoes = /obj/item/clothing/shoes/sneakers/black - mask = /obj/item/clothing/mask/gas/tiki_mask/yalp_elor - -/datum/outfit/waldo - name = "Waldo" - uniform = /obj/item/clothing/under/pants/jeans - suit = /obj/item/clothing/suit/striped_sweater - head = /obj/item/clothing/head/beanie/waldo - shoes = /obj/item/clothing/shoes/sneakers/brown - ears = /obj/item/radio/headset - glasses = /obj/item/clothing/glasses/regular/circle - -/datum/outfit/waldo/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) - if(visualsOnly) - return - H.fully_replace_character_name(null,"Waldo") - H.eye_color = "000" - H.gender = MALE - H.skin_tone = "caucasian3" - H.hairstyle = "Business Hair 3" - H.facial_hairstyle = "Shaved" - H.hair_color = "000" - H.facial_hair_color = H.hair_color - H.update_body() - if(H.mind) - H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null)) - var/list/no_drops = list() - no_drops += H.get_item_by_slot(ITEM_SLOT_FEET) - no_drops += H.get_item_by_slot(ITEM_SLOT_ICLOTHING) - no_drops += H.get_item_by_slot(ITEM_SLOT_OCLOTHING) - no_drops += H.get_item_by_slot(ITEM_SLOT_HEAD) - no_drops += H.get_item_by_slot(ITEM_SLOT_EYES) - for(var/i in no_drops) - var/obj/item/I = i - ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT) - -/datum/outfit/synthetic - name = "Factory Error Synth" - uniform = /obj/item/clothing/under/color/white - ears = /obj/item/radio/headset - -/datum/outfit/synthetic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/organ/eyes/robotic/glow/eyes = new() - eyes.Insert(src, drop_if_replaced = FALSE) - -/datum/outfit/spacepol - name = "Spacepol Officer" - uniform = /obj/item/clothing/under/rank/security/officer/beatcop - suit = /obj/item/clothing/suit/armor/vest/blueshirt - belt = /obj/item/gun/ballistic/automatic/pistol/candor - head = /obj/item/clothing/head/helmet/police - gloves = /obj/item/clothing/gloves/tackler/combat - shoes = /obj/item/clothing/shoes/jackboots - mask = /obj/item/clothing/mask/gas/sechailer/swat/spacepol - glasses = /obj/item/clothing/glasses/sunglasses - ears = /obj/item/radio/headset - l_pocket = /obj/item/ammo_box/magazine/m45 - r_pocket = /obj/item/restraints/handcuffs - id = /obj/item/card/id - -/datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/card/id/W = H.wear_id - W.assignment = "Police Officer" - W.registered_name = H.real_name - W.update_label() - -/datum/outfit/frontier/hunter - name = "Frontiersman Corpse (Hunter)" - ears = /obj/item/radio/headset - r_hand = /obj/item/gun/ballistic/rifle/illestren - -/datum/outfit/frontier/hunter/pre_equip(mob/living/carbon/human/H) - if(prob(50)) - head = /obj/item/clothing/head/trapper - -/datum/outfit/bountyarmor - name = "Bounty Hunter - Armored" - uniform = /obj/item/clothing/under/rank/prisoner - head = /obj/item/clothing/head/hunter - suit = /obj/item/clothing/suit/space/hunter - gloves = /obj/item/clothing/gloves/tackler/combat - shoes = /obj/item/clothing/shoes/jackboots - mask = /obj/item/clothing/mask/gas/hunter - glasses = /obj/item/clothing/glasses/sunglasses/garb - ears = /obj/item/radio/headset - l_pocket = /obj/item/tank/internals/emergency_oxygen - r_pocket = /obj/item/restraints/handcuffs/cable - id = /obj/item/card/id - r_hand = /obj/item/flamethrower/full/tank - -/datum/outfit/bountyarmor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/card/id/W = H.wear_id - W.assignment = "Bounty Hunter" - W.registered_name = H.real_name - W.update_label() - -/datum/outfit/bountyhook - name = "Bounty Hunter - Hook" - uniform = /obj/item/clothing/under/rank/prisoner - back = /obj/item/storage/backpack - head = /obj/item/clothing/head/scarecrow_hat - gloves = /obj/item/clothing/gloves/botanic_leather - ears = /obj/item/radio/headset - shoes = /obj/item/clothing/shoes/jackboots - mask = /obj/item/clothing/mask/scarecrow - r_pocket = /obj/item/restraints/handcuffs/cable - id = /obj/item/card/id - r_hand = /obj/item/gun/ballistic/shotgun/doublebarrel/hook - - backpack_contents = list( - /obj/item/ammo_casing/shotgun/incapacitate = 6 - ) - -/datum/outfit/bountyhook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - if(visualsOnly) - return - var/obj/item/card/id/W = H.wear_id - W.assignment = "Bounty Hunter" - W.registered_name = H.real_name - W.update_label() - -/datum/outfit/bountysynth - name = "Bounty Hunter - Synth" - uniform = /obj/item/clothing/under/rank/prisoner - back = /obj/item/storage/backpack - suit = /obj/item/clothing/suit/armor/riot - shoes = /obj/item/clothing/shoes/jackboots - glasses = /obj/item/clothing/glasses/eyepatch - r_pocket = /obj/item/restraints/handcuffs/cable - ears = /obj/item/radio/headset - id = /obj/item/card/id - r_hand = /obj/item/storage/firstaid/regular diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 690cf94cd9a3..69ff4bcfc2f5 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -106,10 +106,6 @@ name = "Fireball" spell_type = /obj/effect/proc_holder/spell/aimed/fireball -/datum/spellbook_entry/spell_cards - name = "Spell Cards" - spell_type = /obj/effect/proc_holder/spell/aimed/spell_cards - /datum/spellbook_entry/rod_form name = "Rod Form" spell_type = /obj/effect/proc_holder/spell/targeted/rod_form diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index c7aa46af728b..b64a2abf02de 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -487,7 +487,6 @@ /obj/item/shield/energy = 6, /obj/item/shield/riot/tele = 12, /obj/item/dnainjector/lasereyesmut = 7, - /obj/item/gun/magic/wand/fireball/inert = 3, /obj/item/pneumatic_cannon = 15, /obj/item/melee/transforming/energy/sword = 7, /obj/item/book/granter/spell/knock = 15, @@ -515,8 +514,6 @@ /obj/item/dualsaber = 15, /obj/item/organ/heart/demon = 7, /obj/item/gun/ballistic/automatic/smg/c20r = 16, - /obj/item/gun/magic/wand/resurrection/inert = 15, - /obj/item/gun/magic/wand/resurrection = 10, /obj/item/uplink/old = 2, /obj/item/book/granter/spell/charge = 12, /obj/item/grenade/clusterbuster/spawner_manhacks = 15, @@ -556,16 +553,6 @@ desc = "High speed, low drag combat boots, now with an added layer of insulation." min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT -/obj/item/gun/magic/wand/fireball/inert - name = "weakened wand of fireball" - desc = "This wand shoots scorching balls of fire that explode into destructive flames. The years of the cold have weakened the magic inside the wand." - max_charges = 4 - -/obj/item/gun/magic/wand/resurrection/inert - name = "weakened wand of healing" - desc = "This wand uses healing magics to heal and revive. The years of the cold have weakened the magic inside the wand." - max_charges = 5 - /obj/effect/mob_spawn/human/syndicatesoldier/coldres name = "Syndicate Snow Operative" outfit = /datum/outfit/snowsyndie/corpse diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index e325b8e8d09b..25438e1d4728 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -7,7 +7,6 @@ unit_name = "minor lava planet artifact" export_types = list(/obj/item/immortality_talisman, /obj/item/book_of_babel, - /obj/item/gun/magic/hook, /obj/item/wisp_lantern, /obj/item/reagent_containers/glass/bottle/potion/flight, /obj/item/katana/cursed, diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 4edc13071932..61a0158618c4 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -66,8 +66,6 @@ new /obj/item/wisp_lantern(src) if(20) new /obj/item/immortality_talisman(src) - if(21) - new /obj/item/gun/magic/hook(src) if(22) new /obj/item/voodoo(src) if(23) @@ -143,8 +141,6 @@ new /obj/item/wisp_lantern(src) if(20) new /obj/item/immortality_talisman(src) - if(21) - new /obj/item/gun/magic/hook(src) if(22) new /obj/item/voodoo(src) if(23) @@ -481,91 +477,6 @@ /obj/effect/warp_cube/ex_act(severity, target) return -//Meat Hook -/obj/item/gun/magic/hook - name = "meat hook" - desc = "A light hooked blade, attached by the handle to a long chain. Can be used to make quick strikes in hand, or thrown at enemies, magically dragging them to the user. Get over here!" - ammo_type = /obj/item/ammo_casing/magic/hook - icon_state = "hook" - item_state = "hook" - lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' - fire_sound = 'sound/weapons/batonextend.ogg' - max_charges = 1 - item_flags = NEEDS_PERMIT - force = 15 - sharpness = IS_SHARP - block_chance = 5//A pittance, but might be worth something in a scuffle - hitsound = 'sound/weapons/chainhit.ogg' - -/obj/item/gun/magic/hook/melee_attack_chain(mob/user, atom/target, params) - ..() - user.changeNext_move(CLICK_CD_MELEE * 0.5)//quick to swing. 15 force can be quite something with this attack frequency. - -/obj/item/gun/magic/hook/Initialize() - . = ..() - AddComponent(/datum/component/butchering, 15, 130, 0, hitsound) - -/obj/item/ammo_casing/magic/hook - name = "hook" - desc = "A hook." - projectile_type = /obj/projectile/hook - caliber = "hook" - icon_state = "arrow" - -/obj/projectile/hook - name = "hook" - icon_state = "hook" - icon = 'icons/obj/lavaland/artefacts.dmi' - pass_flags = PASSTABLE - damage = 20 - stamina = 20 - armour_penetration = 60 - damage_type = BRUTE - hitsound = 'sound/effects/splat.ogg' - var/chain - var/knockdown_time = (0.5 SECONDS) - -/obj/projectile/hook/fire(setAngle) - if(firer) - chain = firer.Beam(src, icon_state = "chain", emissive = FALSE) - ..() - //TODO: root the firer until the chain returns - -/obj/projectile/hook/on_hit(atom/target) - . = ..() - if(ismovable(target)) - var/atom/movable/A = target - if(A.anchored) - return - A.visible_message("[A] is snagged by [firer]'s hook!") - new /datum/forced_movement(A, get_turf(firer), 5, TRUE) - if (isliving(target)) - var/mob/living/fresh_meat = target - fresh_meat.Knockdown(knockdown_time) - return - //TODO: keep the chain beamed to A - //TODO: needs a callback to delete the chain - -/obj/projectile/hook/Destroy() - qdel(chain) - return ..() - -//just a nerfed version of the real thing for the bounty hunters. -/obj/item/gun/magic/hook/bounty - name = "hook" - ammo_type = /obj/item/ammo_casing/magic/hook/bounty - -/obj/item/gun/magic/hook/bounty/shoot_with_empty_chamber(mob/living/user) - to_chat(user, "The [src] isn't ready to fire yet!") - -/obj/item/ammo_casing/magic/hook/bounty - projectile_type = /obj/projectile/hook/bounty - -/obj/projectile/hook/bounty - damage = 0 - stamina = 40 - //Immortality Talisman: Now with state-of-the-art panic button technology /obj/item/immortality_talisman name = "\improper Immortality Talisman" @@ -1270,7 +1181,6 @@ new /obj/item/lava_staff(src) if(3) new /obj/item/book/granter/spell/sacredflame(src) - new /obj/item/gun/magic/wand/fireball(src) if(4) new /obj/item/dragons_blood(src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm index cca8a649353f..59ab203d4a85 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm @@ -146,7 +146,7 @@ if(3) //only should fire duing phase 2 emp_pulse() if(4) - tentacle(target) + sting_attack(target) if(5) summon_creatures() if(6) @@ -161,10 +161,7 @@ swift_dash(target, dash_num_long, 15) else if((get_dist(src, target) >= 4) && ((get_dist(src, target)) <= 8) && !shouldnt_move) - if(prob(60)) - tentacle(target) - return - else if(prob(40)) + if(prob(40)) sting_attack(target) return else @@ -230,15 +227,6 @@ empulse(src, 2, 4) shouldnt_move = FALSE -/////TENTACLE -/mob/living/simple_animal/hostile/megafauna/claw/proc/tentacle(target) - shake_animation(2) - projectiletype = /obj/projectile/tentacle - projectilesound = 'sound/effects/splat.ogg' - Shoot(target) - -/////TENTACLE END - /////STING ATTACK /mob/living/simple_animal/hostile/megafauna/claw/proc/sting_attack(target) shouldnt_move = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index ca595d4d682f..0568533c1e0c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -205,7 +205,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca /mob/living/simple_animal/hostile/mimic/copy/ranged var/obj/item/gun/TrueGun = null - var/obj/item/gun/magic/Zapstick var/obj/item/gun/ballistic/Pewgun var/obj/item/gun/energy/Zapgun @@ -223,10 +222,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca move_to_delay = 2 * G.w_class + 1 projectilesound = G.fire_sound TrueGun = G - if(istype(G, /obj/item/gun/magic)) - Zapstick = G - var/obj/item/ammo_casing/magic/M = Zapstick.ammo_type - projectiletype = initial(M.projectile_type) if(istype(G, /obj/item/gun/ballistic)) Pewgun = G var/obj/item/ammo_box/magazine/M = Pewgun.mag_type @@ -245,11 +240,6 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca Zapgun.cell.use(shot.e_cost) Zapgun.update_appearance() ..() - else if(Zapstick) - if(Zapstick.charges) - Zapstick.charges-- - Zapstick.update_appearance() - ..() else if(Pewgun) if(Pewgun.chambered) if(Pewgun.chambered.BB) diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm index 1d4316560e92..55b749ac3333 100644 --- a/code/modules/projectiles/boxes_magazines/internal/misc.dm +++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm @@ -1,9 +1,3 @@ -/obj/item/ammo_box/magazine/internal/hook - name = "hook internal tube" - ammo_type = /obj/item/ammo_casing/magic/hook - caliber = "hook" - max_ammo = 1 - /obj/item/ammo_box/magazine/internal/bow name = "bowstring" ammo_type = /obj/item/ammo_casing/caseless/arrow diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index c524ffd36516..4ffcf6cb6828 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -16,6 +16,7 @@ #define MANUFACTURER_DONKCO "the Donk! Co. logo" #define MANUFACTURER_PGF "the Etherbor Industries emblem" #define MANUFACTURER_IMPORT "Lanchester Import Co." + /obj/item/gun name = "gun" desc = "It's a gun. It's pretty terrible, though." diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 0b7e526c8a2b..58873cf387e2 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -433,52 +433,6 @@ sawn_off = TRUE slot_flags = ITEM_SLOT_BELT -/obj/item/gun/ballistic/shotgun/doublebarrel/hook - name = "hook modified sawn-off shotgun" - desc = "Range isn't an issue when you can bring your victim to you." - icon_state = "hookshotgun" - icon = 'icons/obj/guns/projectile.dmi' - item_state = "shotgun" - load_sound = 'sound/weapons/gun/shotgun/insert_shell.ogg' - mag_type = /obj/item/ammo_box/magazine/internal/shot/bounty - w_class = WEIGHT_CLASS_BULKY - weapon_weight = WEAPON_MEDIUM - can_be_sawn_off = FALSE - force = 16 //it has a hook on it - attack_verb = list("slashed", "hooked", "stabbed") - hitsound = 'sound/weapons/bladeslice.ogg' - //our hook gun! - var/obj/item/gun/magic/hook/bounty/hook - var/toggled = FALSE - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/Initialize() - . = ..() - hook = new /obj/item/gun/magic/hook/bounty(src) - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/AltClick(mob/user) - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) - return - if(toggled) - to_chat(user,"You switch to the shotgun.") - fire_sound = initial(fire_sound) - else - to_chat(user,"You switch to the hook.") - fire_sound = 'sound/weapons/batonextend.ogg' - toggled = !toggled - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/examine(mob/user) - . = ..() - if(toggled) - . += "Alt-click to switch to the shotgun." - else - . += "Alt-click to switch to the hook." - -/obj/item/gun/ballistic/shotgun/doublebarrel/hook/afterattack(atom/target, mob/living/user, flag, params) - if(toggled) - hook.afterattack(target, user, flag, params) - else - return ..() - /obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact name = "compact compact combat shotgun" desc = "A compact version of the compact version of the semi automatic combat shotgun. For when you want a gun the same size as your brain." diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm deleted file mode 100644 index be2f2394a543..000000000000 --- a/code/modules/projectiles/guns/magic.dm +++ /dev/null @@ -1,84 +0,0 @@ -/obj/item/gun/magic - name = "staff of nothing" - desc = "This staff is boring to watch because even though it came first you've seen everything it can do in other staves for years." - icon = 'icons/obj/guns/magic.dmi' - icon_state = "staffofnothing" - item_state = "staff" - lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' //not really a gun and some toys use these inhands - righthand_file = 'icons/mob/inhands/items_righthand.dmi' - fire_sound = 'sound/weapons/emitter.ogg' - flags_1 = CONDUCT_1 - w_class = WEIGHT_CLASS_HUGE - var/checks_antimagic = TRUE - var/max_charges = 6 - var/charges = 0 - var/recharge_rate = 4 - var/charge_tick = 0 - var/can_charge = TRUE - var/ammo_type - var/no_den_usage - trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses magic instead - -/obj/item/gun/magic/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) - if(no_den_usage) - var/area/A = get_area(user) - if(istype(A, /area/wizard_station)) - add_fingerprint(user) - to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") - return - else - no_den_usage = 0 - if(checks_antimagic && user.anti_magic_check(TRUE, FALSE, FALSE, 0, TRUE)) - add_fingerprint(user) - to_chat(user, "Something is interfering with [src].") - return - . = ..() - -/obj/item/gun/magic/can_shoot() - return charges - -/obj/item/gun/magic/recharge_newshot() - if (charges && chambered && !chambered.BB) - chambered.newshot() - -/obj/item/gun/magic/process_chamber() - if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired... - charges--//... drain a charge - recharge_newshot() - -/obj/item/gun/magic/Initialize() - . = ..() - charges = max_charges - if(ammo_type) - chambered = new ammo_type(src) - if(can_charge) - START_PROCESSING(SSobj, src) - - -/obj/item/gun/magic/Destroy() - if(can_charge) - STOP_PROCESSING(SSobj, src) - return ..() - - -/obj/item/gun/magic/process() - if (charges >= max_charges) - charge_tick = 0 - return - charge_tick++ - if(charge_tick < recharge_rate) - return 0 - charge_tick = 0 - charges++ - if(charges == 1) - recharge_newshot() - return 1 - -/obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) - to_chat(user, "The [name] whizzles quietly.") - -/obj/item/gun/magic/vv_edit_var(var_name, var_value) - . = ..() - switch(var_name) - if(NAMEOF(src, charges)) - recharge_newshot() diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm deleted file mode 100644 index 67a91efa0f61..000000000000 --- a/code/modules/projectiles/projectile/magic.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/projectile/magic - name = "bolt" - icon_state = "energy" - damage = 0 - damage_type = OXY - nodamage = TRUE - armour_penetration = 100 - flag = "magic" - -/obj/projectile/magic/aoe - name = "Area Bolt" - desc = "What the fuck does this do?!" - damage = 0 - var/proxdet = TRUE - -/obj/projectile/magic/aoe/Range() - if(proxdet) - for(var/mob/living/L in range(1, get_turf(src))) - if(L.stat != DEAD && L != firer && !L.anti_magic_check()) - return Bump(L) - ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 29ea3fbd4298..ac663059d0c0 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -65,54 +65,3 @@ Slimecrossing Weapons /obj/item/shield/adamantineshield/ComponentInitialize() . = ..() AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_wielded=15) - -//Bloodchiller - Chilling Green -/obj/item/gun/magic/bloodchill - name = "blood chiller" - desc = "A horrifying weapon made of your own bone and blood vessels. It shoots slowing globules of your own blood. Ech." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "bloodgun" - item_state = "bloodgun" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - item_flags = ABSTRACT | DROPDEL - w_class = WEIGHT_CLASS_HUGE - slot_flags = NONE - force = 5 - max_charges = 1 //Recharging costs blood. - recharge_rate = 1 - ammo_type = /obj/item/ammo_casing/magic/bloodchill - fire_sound = 'sound/effects/attackblob.ogg' - -/obj/item/gun/magic/bloodchill/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) - -/obj/item/gun/magic/bloodchill/process() - charge_tick++ - if(charge_tick < recharge_rate || charges >= max_charges) - return 0 - charge_tick = 0 - var/mob/living/M = loc - if(istype(M) && M.blood_volume >= 20) - charges++ - M.blood_volume -= 20 - if(charges == 1) - recharge_newshot() - return 1 - -/obj/item/ammo_casing/magic/bloodchill - projectile_type = /obj/projectile/magic/bloodchill - -/obj/projectile/magic/bloodchill - name = "blood ball" - icon_state = "pulse0_bl" - damage = 0 - damage_type = OXY - nodamage = TRUE - hitsound = 'sound/effects/splat.ogg' - -/obj/projectile/magic/bloodchill/on_hit(mob/living/target) - . = ..() - if(isliving(target)) - target.apply_status_effect(/datum/status_effect/bloodchill) diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 89fa16cca7f5..9fe7857c073b 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -235,29 +235,6 @@ Chilling extracts: user.visible_message("[src] lets out a peaceful ring as it shatters, but nothing happens...") ..() -/obj/item/slimecross/chilling/green - colour = "green" - effect_desc = "Creates a bone gun in the hand it is used in, which uses blood as ammo." - -/obj/item/slimecross/chilling/green/do_effect(mob/user) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - var/mob/living/L = user - if(!istype(user)) - return - var/obj/item/held = L.get_active_held_item() //This should be itself, but just in case... - L.dropItemToGround(held) - var/obj/item/gun/magic/bloodchill/gun = new(user) - if(!L.put_in_hands(gun)) - qdel(gun) - user.visible_message("[src] flash-freezes [user]'s arm, cracking the flesh horribly!") - else - user.visible_message("[src] chills and snaps off the front of the bone on [user]'s arm, leaving behind a strange, gun-like structure!") - user.emote("scream") - L.apply_damage(30,BURN,which_hand) - ..() - /obj/item/slimecross/chilling/pink colour = "pink" effect_desc = "Creates a slime corgi puppy." diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 8e502cd592f5..46737c5b5a99 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -130,60 +130,3 @@ var/range = 6 + 2*spell_level projectile_var_overrides = list("range" = range) return ..() - -/obj/effect/proc_holder/spell/aimed/spell_cards - name = "Spell Cards" - desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!" - school = "evocation" - charge_max = 50 - clothes_req = FALSE - invocation = "Sigi'lu M'Fan 'Tasia" - invocation_type = INVOCATION_SHOUT - range = 40 - cooldown_min = 10 - projectile_amount = 5 - projectiles_per_fire = 7 - projectile_type = /obj/projectile/spellcard - base_icon_state = "spellcard" - action_icon_state = "spellcard0" - var/datum/weakref/current_target_weakref - var/projectile_turnrate = 10 - var/projectile_pixel_homing_spread = 32 - var/projectile_initial_spread_amount = 30 - var/projectile_location_spread_amount = 12 - var/datum/component/lockon_aiming/lockon_component - ranged_clickcd_override = TRUE - -/obj/effect/proc_holder/spell/aimed/spell_cards/on_activation(mob/M) - QDEL_NULL(lockon_component) - lockon_component = M.AddComponent(/datum/component/lockon_aiming, 5, typecacheof(list(/mob/living)), 1, null, CALLBACK(src, PROC_REF(on_lockon_component))) - -/obj/effect/proc_holder/spell/aimed/spell_cards/proc/on_lockon_component(list/locked_weakrefs) - if(!length(locked_weakrefs)) - current_target_weakref = null - return - current_target_weakref = locked_weakrefs[1] - var/atom/A = current_target_weakref.resolve() - if(A) - var/mob/M = lockon_component.parent - M.face_atom(A) - -/obj/effect/proc_holder/spell/aimed/spell_cards/on_deactivation(mob/M) - QDEL_NULL(lockon_component) - -/obj/effect/proc_holder/spell/aimed/spell_cards/ready_projectile(obj/projectile/P, atom/target, mob/user, iteration) - if(current_target_weakref) - var/atom/A = current_target_weakref.resolve() - if(A && get_dist(A, user) < 7) - P.homing_turn_speed = projectile_turnrate - P.homing_inaccuracy_min = projectile_pixel_homing_spread - P.homing_inaccuracy_max = projectile_pixel_homing_spread - P.set_homing_target(current_target_weakref.resolve()) - var/rand_spr = rand() - var/total_angle = projectile_initial_spread_amount * 2 - var/adjusted_angle = total_angle - ((projectile_initial_spread_amount / projectiles_per_fire) * 0.5) - var/one_fire_angle = adjusted_angle / projectiles_per_fire - var/current_angle = iteration * one_fire_angle * rand_spr - (projectile_initial_spread_amount / 2) - P.pixel_x = rand(-projectile_location_spread_amount, projectile_location_spread_amount) - P.pixel_y = rand(-projectile_location_spread_amount, projectile_location_spread_amount) - P.preparePixelProjectile(target, user, null, current_angle) diff --git a/code/modules/spells/spell_types/charge.dm b/code/modules/spells/spell_types/charge.dm index 57325e685f4d..225c36580e49 100644 --- a/code/modules/spells/spell_types/charge.dm +++ b/code/modules/spells/spell_types/charge.dm @@ -51,20 +51,6 @@ I.used = FALSE charged_item = I break - else if(istype(item, /obj/item/gun/magic)) - var/obj/item/gun/magic/I = item - if(prob(80) && !I.can_charge) - I.max_charges-- - if(I.max_charges <= 0) - I.max_charges = 0 - burnt_out = TRUE - I.charges = I.max_charges - if(istype(item, /obj/item/gun/magic/wand) && I.max_charges != 0) - var/obj/item/gun/magic/W = item - W.icon_state = initial(W.icon_state) - I.recharge_newshot() - charged_item = I - break else if(istype(item, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = item if(!C.self_recharge) diff --git a/shiptest.dme b/shiptest.dme index 845389607403..c16cbd645b83 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1333,7 +1333,6 @@ #include "code\game\objects\structures\fireplace.dm" #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\fluff.dm" -#include "code\game\objects\structures\fugitive_role_spawners.dm" #include "code\game\objects\structures\ghost_role_spawners.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" @@ -1685,7 +1684,6 @@ #include "code\modules\antagonists\ert\nanotrasen.dm" #include "code\modules\antagonists\ert\solgov.dm" #include "code\modules\antagonists\ert\syndicate.dm" -#include "code\modules\antagonists\fugitive\fugitive_outfits.dm" #include "code\modules\antagonists\gang\outfits.dm" #include "code\modules\antagonists\greentext\greentext.dm" #include "code\modules\antagonists\magic_servant\servant.dm" @@ -3007,7 +3005,6 @@ #include "code\modules\projectiles\guns\ballistic.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\gunhud.dm" -#include "code\modules\projectiles\guns\magic.dm" #include "code\modules\projectiles\guns\powered.dm" #include "code\modules\projectiles\guns\ballistic\assault.dm" #include "code\modules\projectiles\guns\ballistic\automatic.dm" @@ -3039,7 +3036,6 @@ #include "code\modules\projectiles\guns\misc\syringe_gun.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\bullets\_incendiary.dm" #include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" #include "code\modules\projectiles\projectile\bullets\dnainjector.dm" From 5e86a5737120397e9e32295cd4a15957ed11e7d7 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 10 Apr 2024 22:34:36 -0500 Subject: [PATCH 115/206] fix --- _maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm | 3 --- 1 file changed, 3 deletions(-) diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm index b5135c604f0e..8e7bb5ba895f 100644 --- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm +++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm @@ -1721,9 +1721,6 @@ }, /obj/machinery/light/directional/north, /obj/machinery/firealarm/directional/east, -/obj/item/storage/box/firingpins{ - pixel_x = -12 - }, /turf/open/floor/pod/dark, /area/ship/security/armory) "qz" = ( From c3463954f30eb7c94930887638f30a19e95cf6d4 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 10 Apr 2024 22:37:40 -0500 Subject: [PATCH 116/206] unrestricted no longer exists --- _maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm index 8e7bb5ba895f..63bcd879d7e1 100644 --- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm +++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm @@ -2754,7 +2754,7 @@ }, /obj/structure/guncase, /obj/structure/railing, -/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted, +/obj/item/gun/ballistic/automatic/smg/c20r, /obj/machinery/light/directional/east, /turf/open/floor/pod/dark, /area/ship/security/armory) From 68e23f2a53d6fcbbd54734e415c958560e7bd7e8 Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 18 Apr 2024 09:24:36 -0500 Subject: [PATCH 117/206] gun defines more orginized --- code/__DEFINES/combat.dm | 66 --------------- code/__DEFINES/gun.dm | 95 ++++++++++++++++++++++ code/modules/projectiles/gun.dm | 21 ----- code/modules/projectiles/guns/ballistic.dm | 2 +- code/modules/projectiles/projectile.dm | 4 - shiptest.dme | 1 + 6 files changed, 97 insertions(+), 92 deletions(-) create mode 100644 code/__DEFINES/gun.dm diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 7df3a453acfb..ad0754c85b21 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -133,52 +133,6 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun))) #define EMBED_POINTY list("ignore_throwspeed_threshold" = TRUE) #define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE) -//Gun weapon weight -/// Allows you to dual wield this gun and your offhand gun -#define WEAPON_LIGHT 1 -/// Does not allow you to dual wield with this gun and your offhand gun -#define WEAPON_MEDIUM 2 -/// You must wield the gun to fire this gun -#define WEAPON_HEAVY 3 -//Gun trigger guards -#define TRIGGER_GUARD_ALLOW_ALL -1 -#define TRIGGER_GUARD_NONE 0 -#define TRIGGER_GUARD_NORMAL 1 -//Gun bolt types -///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted. -/// Example: c20, shotguns, m90 -#define BOLT_TYPE_STANDARD 1 -///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed. -/// Example: Some SMGs, the L6 -#define BOLT_TYPE_OPEN 2 -///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine. -/// Example: Break action shotguns, revolvers -#define BOLT_TYPE_NO_BOLT 3 -///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in. -/// Example: Pistols with a slide lock, some SMGs -#define BOLT_TYPE_LOCKING 4 -//Sawn off nerfs -///accuracy penalty of sawn off guns -#define SAWN_OFF_ACC_PENALTY 25 -///added recoil of sawn off guns -#define SAWN_OFF_RECOIL 1 - -//ammo box sprite defines -///ammo box will always use provided icon state -#define AMMO_BOX_ONE_SPRITE 0 -///ammo box will have a different state for each bullet; - -#define AMMO_BOX_PER_BULLET 1 -///ammo box will have a different state for full and empty; -max_ammo and -0 -#define AMMO_BOX_FULL_EMPTY 2 - -#define SUPPRESSED_NONE 0 -#define SUPPRESSED_QUIET 1 ///standard suppressed -#define SUPPRESSED_VERY 2 /// no message - -//Projectile Reflect -#define REFLECT_NORMAL (1<<0) -#define REFLECT_FAKEPROJECTILE (1<<1) - //Object/Item sharpness #define IS_BLUNT 0 #define IS_SHARP 1 @@ -214,23 +168,3 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun))) //We will round to this value in damage calculations. #define DAMAGE_PRECISION 0.1 - -//bullet_act() return values -#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. -#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. -#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. - -#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle - -//Autofire component -/// Compatible firemode is in the gun. Wait until it's held in the user hands. -#define AUTOFIRE_STAT_IDLE (1<<0) -/// Gun is active and in the user hands. Wait until user does a valid click. -#define AUTOFIRE_STAT_ALERT (1<<1) -/// Gun is shooting. -#define AUTOFIRE_STAT_FIRING (1<<2) - -#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown" - #define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0) -#define COMSIG_AUTOFIRE_SHOT "autofire_shot" - #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0) diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/gun.dm new file mode 100644 index 000000000000..c5936e6f2d0e --- /dev/null +++ b/code/__DEFINES/gun.dm @@ -0,0 +1,95 @@ +//Gun weapon weight +/// Allows you to dual wield this gun and your offhand gun +#define WEAPON_LIGHT 1 +/// Does not allow you to dual wield with this gun and your offhand gun +#define WEAPON_MEDIUM 2 +/// You must wield the gun to fire this gun +#define WEAPON_HEAVY 3 +//Gun trigger guards +#define TRIGGER_GUARD_ALLOW_ALL -1 +#define TRIGGER_GUARD_NONE 0 +#define TRIGGER_GUARD_NORMAL 1 +//Gun bolt types +///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted. +/// Example: c20, shotguns, m90 +#define BOLT_TYPE_STANDARD 1 +///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed. +/// Example: Some SMGs, the L6 +#define BOLT_TYPE_OPEN 2 +///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine. +/// Example: Break action shotguns, revolvers +#define BOLT_TYPE_NO_BOLT 3 +///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in. +/// Example: Pistols with a slide lock, some SMGs +#define BOLT_TYPE_LOCKING 4 +//Sawn off nerfs +///accuracy penalty of sawn off guns +#define SAWN_OFF_ACC_PENALTY 25 +///added recoil of sawn off guns +#define SAWN_OFF_RECOIL 1 + +//Autofire component +/// Compatible firemode is in the gun. Wait until it's held in the user hands. +#define AUTOFIRE_STAT_IDLE (1<<0) +/// Gun is active and in the user hands. Wait until user does a valid click. +#define AUTOFIRE_STAT_ALERT (1<<1) +/// Gun is shooting. +#define AUTOFIRE_STAT_FIRING (1<<2) + +#define COMSIG_AUTOFIRE_ONMOUSEDOWN "autofire_onmousedown" + #define COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS (1<<0) +#define COMSIG_AUTOFIRE_SHOT "autofire_shot" + #define COMPONENT_AUTOFIRE_SHOT_SUCCESS (1<<0) + +#define SUPPRESSED_NONE 0 +#define SUPPRESSED_QUIET 1 ///standard suppressed +#define SUPPRESSED_VERY 2 /// no message + +#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6 + +#define MANUFACTURER_NONE null +#define MANUFACTURER_SHARPLITE "the Sharplite Defense logo" +#define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo" +#define MANUFACTURER_HUNTERSPRIDE "the Hunter's Pride Arms and Ammunition logo" +#define MANUFACTURER_SOLARARMORIES "the Solarbundswaffenkammer emblem" +#define MANUFACTURER_SCARBOROUGH "the Scarborough Arms logo" +#define MANUFACTURER_EOEHOMA "the Eoehoma Firearms emblem" +#define MANUFACTURER_NANOTRASEN_OLD "an outdated Nanotrasen logo" +#define MANUFACTURER_NANOTRASEN "the Nanotrasen logo" +#define MANUFACTURER_BRAZIL "a green flag with a blue circle and a yellow diamond around it" +#define MANUFACTURER_INTEQ "an orange crest with the letters 'IRMG'" +#define MANUFACTURER_MINUTEMAN "the Lanchester City Firearms Plant logo" +#define MANUFACTURER_DONKCO "the Donk! Co. logo" +#define MANUFACTURER_PGF "the Etherbor Industries emblem" +#define MANUFACTURER_IMPORT "Lanchester Import Co." + + +///////////////// +// PROJECTILES // +///////////////// + +//bullet_act() return values +#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. +#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. + +#define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle + +//Projectile Reflect +#define REFLECT_NORMAL (1<<0) +#define REFLECT_FAKEPROJECTILE (1<<1) + +//ammo box sprite defines +///ammo box will always use provided icon state +#define AMMO_BOX_ONE_SPRITE 0 +///ammo box will have a different state for each bullet; - +#define AMMO_BOX_PER_BULLET 1 +///ammo box will have a different state for full and empty; -max_ammo and -0 +#define AMMO_BOX_FULL_EMPTY 2 + +//Projectile Reflect +#define REFLECT_NORMAL (1<<0) +#define REFLECT_FAKEPROJECTILE (1<<1) + +#define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan. +#define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers. diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 4ffcf6cb6828..865a7f0ac514 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,22 +1,3 @@ - -#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.6 - -#define MANUFACTURER_NONE null -#define MANUFACTURER_SHARPLITE "the Sharplite Defense logo" -#define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo" -#define MANUFACTURER_HUNTERSPRIDE "the Hunter's Pride Arms and Ammunition logo" -#define MANUFACTURER_SOLARARMORIES "the Solarbundswaffenkammer emblem" -#define MANUFACTURER_SCARBOROUGH "the Scarborough Arms logo" -#define MANUFACTURER_EOEHOMA "the Eoehoma Firearms emblem" -#define MANUFACTURER_NANOTRASEN_OLD "an outdated Nanotrasen logo" -#define MANUFACTURER_NANOTRASEN "the Nanotrasen logo" -#define MANUFACTURER_BRAZIL "a green flag with a blue circle and a yellow diamond around it" -#define MANUFACTURER_INTEQ "an orange crest with the letters 'IRMG'" -#define MANUFACTURER_MINUTEMAN "the Lanchester City Firearms Plant logo" -#define MANUFACTURER_DONKCO "the Donk! Co. logo" -#define MANUFACTURER_PGF "the Etherbor Industries emblem" -#define MANUFACTURER_IMPORT "Lanchester Import Co." - /obj/item/gun name = "gun" desc = "It's a gun. It's pretty terrible, though." @@ -872,5 +853,3 @@ if(zoomable) azoom = new() azoom.gun = src - -#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index f2cb9504dde7..b277f319bcb5 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -64,7 +64,7 @@ var/empty_autoeject = FALSE ///Whether the gun supports multiple special mag types var/special_mags = FALSE - ///The bolt type of the gun, affects quite a bit of functionality, see combat.dm defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT + ///The bolt type of the gun, affects quite a bit of functionality, see gun.dm in defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT var/bolt_type = BOLT_TYPE_STANDARD ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both. var/bolt_locked = FALSE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 7cc9b1c6ebb4..c3edaf6e7cd1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -1,7 +1,3 @@ - -#define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan. -#define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers. - /obj/projectile name = "projectile" icon = 'icons/obj/projectiles.dmi' diff --git a/shiptest.dme b/shiptest.dme index c16cbd645b83..73cfeec5e906 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -65,6 +65,7 @@ #include "code\__DEFINES\food.dm" #include "code\__DEFINES\footsteps.dm" #include "code\__DEFINES\forensics.dm" +#include "code\__DEFINES\gun.dm" #include "code\__DEFINES\hud.dm" #include "code\__DEFINES\icon_smoothing.dm" #include "code\__DEFINES\important_recursive_contents.dm" From fdd4e4001c0afcb11b3cb04fe6439004a508625c Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 18 Apr 2024 10:13:43 -0500 Subject: [PATCH 118/206] a bit to fix for sure --- code/modules/projectiles/guns/energy/stun.dm | 7 ------- 1 file changed, 7 deletions(-) diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 37ab08b30aed..b17eca4e4493 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -31,16 +31,9 @@ item_state = null ammo_type = list(/obj/item/ammo_casing/energy/disabler) ammo_x_offset = 2 -<<<<<<< HEAD -======= - can_flashlight = TRUE - flight_x_offset = 15 - flight_y_offset = 10 manufacturer = MANUFACTURER_SHARPLITE_NEW - spread = 2 spread_unwielded = 4 ->>>>>>> Shiptest/master /obj/item/gun/energy/disabler/cyborg name = "cyborg disabler" From 30327b7c4a02829069fd26d47dd9b18823c78e1c Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 18 Apr 2024 10:26:21 -0500 Subject: [PATCH 119/206] removes removed vars --- .../projectiles/guns/ballistic/automatic.dm | 2 -- code/modules/projectiles/guns/ballistic/hmg.dm | 2 -- code/modules/projectiles/guns/ballistic/rifle.dm | 1 - code/modules/projectiles/guns/ballistic/smg.dm | 9 --------- code/modules/projectiles/guns/energy.dm | 12 ------------ .../modules/projectiles/guns/energy/energy_gun.dm | 15 --------------- code/modules/projectiles/guns/energy/pulse.dm | 3 --- 7 files changed, 44 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index ec57fd588021..ee8d8697b204 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -179,8 +179,6 @@ icon_state = "ZipPistol" item_state = "ZipPistol" mag_type = /obj/item/ammo_box/magazine/zip_ammo_9mm - can_suppress = FALSE actions_types = list() - can_bayonet = FALSE mag_display = TRUE weapon_weight = WEAPON_LIGHT diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm index 3bd143e98b43..ce66281afdba 100644 --- a/code/modules/projectiles/guns/ballistic/hmg.dm +++ b/code/modules/projectiles/guns/ballistic/hmg.dm @@ -217,8 +217,6 @@ item_state = "arg" mag_type = /obj/item/ammo_box/magazine/rifle47x33mm spread = 7 - can_suppress = FALSE - can_bayonet = FALSE mag_display = TRUE w_class = WEIGHT_CLASS_BULKY manufacturer = MANUFACTURER_SOLARARMORIES diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 0aa3050a8136..1826a109c58a 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -91,7 +91,6 @@ if(.) spread = 36 spread_unwielded = 108 - can_bayonet = FALSE item_state = "illestren_sawn" mob_overlay_state = item_state weapon_weight = WEAPON_MEDIUM //you can fire it onehanded, makes it worse than worse than useless onehanded, but you can diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index ce740644d712..e6b663d8ad48 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -55,10 +55,6 @@ icon_state = "c20r" item_state = "c20r" mag_type = /obj/item/ammo_box/magazine/smgm45 - can_bayonet = TRUE - can_suppress = FALSE - knife_x_offset = 26 - knife_y_offset = 12 mag_display = TRUE mag_display_ammo = TRUE empty_indicator = TRUE @@ -78,7 +74,6 @@ /obj/item/gun/ballistic/automatic/smg/c20r/cobra name = "\improper Cobra 20" desc = "An older model of SMG manufactured by Scarborough Arms, a predecessor to the military C-20 series. Chambered in .45. " - can_bayonet = FALSE icon_state = "cobra20" item_state = "cobra20" @@ -93,12 +88,8 @@ icon_state = "wt550" item_state = "arg" mag_type = /obj/item/ammo_box/magazine/wt550m9 - can_suppress = FALSE burst_size = 1 actions_types = list() - can_bayonet = TRUE - knife_x_offset = 25 - knife_y_offset = 12 mag_display = TRUE mag_display_ammo = TRUE empty_indicator = TRUE diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index a6e424901d5e..a7d2190e4631 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -165,18 +165,6 @@ user.put_in_hands(old_cell) update_appearance() -/obj/item/gun/energy/get_gun_attachments() - if(cell && !internal_cell) - attachment_options += list("Cell" = image(icon = cell.icon, icon_state = cell.icon_state)) - ..() - -/obj/item/gun/energy/remove_gun_attachments(mob/living/user, obj/item/I, picked_option) - if(picked_option == "Cell") - if(I.use_tool(src, user, unscrewing_time, volume=100)) - eject_cell(user, I) - return TRUE - ..() - /obj/item/gun/energy/can_shoot(visuals) if(safety && !visuals) return FALSE diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 5f5ccdde3a24..2b230bfeef5f 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -5,10 +5,7 @@ item_state = null //so the human update icon uses the icon_state instead. ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) modifystate = 1 - can_flashlight = TRUE ammo_x_offset = 2 - flight_x_offset = 15 - flight_y_offset = 10 dual_wield_spread = 60 manufacturer = MANUFACTURER_SHARPLITE_NEW @@ -26,21 +23,12 @@ throwforce = 11 //This is funny, trust me. ammo_x_offset = 2 charge_sections = 3 - can_flashlight = FALSE // Can't attach or detach the flashlight, and override it's icon update - gunlight_state = "mini-light" - flight_x_offset = 19 - flight_y_offset = 13 - wield_delay = 0.2 SECONDS wield_slowdown = 0.15 spread = 2 spread_unwielded = 5 -/obj/item/gun/energy/e_gun/mini/Initialize() - set_gun_light(new /obj/item/flashlight/seclite(src)) - return ..() - /obj/item/gun/energy/e_gun/hades name = "SL AL-655 'Hades' energy rifle" desc = "The standard issue rifle of Nanotrasen's Security Forces. Most have been put in long term storage following the ICW, and usually aren't issued to low ranking security divisions." @@ -250,10 +238,7 @@ desc = "A hybrid energy gun fondly remembered as one of the worst weapons ever made. It hurts, but that's only if it manages to hit its target." icon_state = "e11" ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser/eoehoma) - can_flashlight = TRUE ammo_x_offset = 0 - flight_x_offset = 20 - flight_y_offset = 9 spread = 80 spread_unwielded = 140 dual_wield_spread = 140 diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 9ed110dfa041..ccf291b1bd44 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -55,9 +55,6 @@ internal_cell = FALSE big_gun = TRUE //haha gun go brr cell_type = /obj/item/stock_parts/cell/gun/large - can_flashlight = TRUE - flight_x_offset = 18 - flight_y_offset = 12 ammo_x_offset = 2 charge_sections = 4 From 902663deca2bc9f0ac1b3a04958681f996f34c57 Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 18 Apr 2024 10:30:51 -0500 Subject: [PATCH 120/206] insane --- code/modules/projectiles/guns/powered.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm index 698826436b18..0faf0c42bcbd 100644 --- a/code/modules/projectiles/guns/powered.dm +++ b/code/modules/projectiles/guns/powered.dm @@ -92,7 +92,7 @@ update_appearance() /obj/item/gun/ballistic/automatic/powered/screwdriver_act(mob/living/user, obj/item/I) - if(cell && !internal_cell && !bayonet && (!gun_light || !can_flashlight)) + if(cell && !internal_cell) to_chat(user, "You begin unscrewing and pulling out the cell...") if(I.use_tool(src, user, unscrewing_time, volume=100)) to_chat(user, "You remove the power cell.") From 13999e2b4c99323aff522bac0502eee6e7e1ce42 Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 18 Apr 2024 10:37:09 -0500 Subject: [PATCH 121/206] e --- code/__DEFINES/guns.dm | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 code/__DEFINES/guns.dm diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm deleted file mode 100644 index 0256ed11bedd..000000000000 --- a/code/__DEFINES/guns.dm +++ /dev/null @@ -1,16 +0,0 @@ -//weapon manufacturers -#define MANUFACTURER_NONE null -#define MANUFACTURER_SHARPLITE "the Sharplite Defense logo" -#define MANUFACTURER_SHARPLITE_NEW "the Nanotrasen-Sharplite logo" -#define MANUFACTURER_HUNTERSPRIDE "the Hunter's Pride Arms and Ammunition logo" -#define MANUFACTURER_SOLARARMORIES "the Solarbundswaffenkammer emblem" -#define MANUFACTURER_SCARBOROUGH "the Scarborough Arms logo" -#define MANUFACTURER_EOEHOMA "the Eoehoma Firearms emblem" -#define MANUFACTURER_NANOTRASEN_OLD "an outdated Nanotrasen logo" -#define MANUFACTURER_NANOTRASEN "the Nanotrasen logo" -#define MANUFACTURER_BRAZIL "a green flag with a blue circle and a yellow diamond around it" -#define MANUFACTURER_INTEQ "an orange crest with the letters 'IRMG'" -#define MANUFACTURER_MINUTEMAN "the Lanchester City Firearms Plant logo" -#define MANUFACTURER_DONKCO "the Donk! Co. logo" -#define MANUFACTURER_PGF "the Etherbor Industries emblem" -#define MANUFACTURER_IMPORT "Lanchester Import Co." From 4d6244ff6246f093f1ad54bf84d98f5472d3ff25 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:25:40 -0500 Subject: [PATCH 122/206] Update beach_ancient_ruin.dmm Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- _maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm | 1 - 1 file changed, 1 deletion(-) diff --git a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm index be52f6a67f46..c14b9dd474a1 100644 --- a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm @@ -375,7 +375,6 @@ /obj/item/gun/energy/lasercannon{ pixel_y = 5; }, -/obj/item/gun/energy/lasercannon, /obj/effect/turf_decal/industrial/hatch, /turf/open/floor/plasteel/mono, /area/ruin/beach/complex) From de2336dcfafb6a331154d3e13c9a29717dad842e Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:26:58 -0500 Subject: [PATCH 123/206] nvm im dum Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- _maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm | 1 + 1 file changed, 1 insertion(+) diff --git a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm index c14b9dd474a1..be52f6a67f46 100644 --- a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm @@ -375,6 +375,7 @@ /obj/item/gun/energy/lasercannon{ pixel_y = 5; }, +/obj/item/gun/energy/lasercannon, /obj/effect/turf_decal/industrial/hatch, /turf/open/floor/plasteel/mono, /area/ruin/beach/complex) From 1eb41c3f4d4460584861007b4cf720a6b2d30655 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:28:28 -0500 Subject: [PATCH 124/206] Delete _maps/shuttles/syndicate/syndicate_luxembourg.dmm oops some how readded it Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- .../syndicate/syndicate_luxembourg.dmm | 3314 ----------------- 1 file changed, 3314 deletions(-) delete mode 100644 _maps/shuttles/syndicate/syndicate_luxembourg.dmm diff --git a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm b/_maps/shuttles/syndicate/syndicate_luxembourg.dmm deleted file mode 100644 index cff4c84386e0..000000000000 --- a/_maps/shuttles/syndicate/syndicate_luxembourg.dmm +++ /dev/null @@ -1,3314 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aB" = ( -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"aD" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"aK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/south, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_engine"; - location = "lux_crew" - }, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"bi" = ( -/obj/machinery/button/door{ - id = "syndiefuck"; - name = "Loading Shutters Control"; - pixel_x = -25; - pixel_y = -7; - dir = 4 - }, -/obj/machinery/button/door{ - id = "warehouse"; - name = "Warehouse Control"; - pixel_x = -25; - pixel_y = 5; - dir = 4 - }, -/obj/machinery/button/door{ - id = "cargodoors"; - name = "Cargo Bay Shutter Control"; - pixel_x = -35; - pixel_y = 5; - dir = 4 - }, -/obj/machinery/button/door{ - id = "externalshutters"; - name = "External Shutters Control"; - pixel_x = -35; - pixel_y = -7; - dir = 4 - }, -/obj/machinery/computer/cargo/express{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"bp" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/blue/half{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"bt" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/volume_pump{ - dir = 8 - }, -/obj/structure/catwalk/over/plated_catwalk/white, -/turf/open/floor/plating, -/area/ship/engineering) -"bB" = ( -/obj/structure/rack, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 9 - }, -/obj/item/gps/mining, -/obj/item/paicard, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"bN" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"bV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/displaycase, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"cb" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"cq" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/computer/mech_bay_power_console{ - dir = 8 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"cs" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"cB" = ( -/obj/item/toy/figure/cargotech, -/obj/item/clothing/suit/hooded/wintercoat/cargo, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/item/hand_labeler_refill, -/obj/item/clothing/under/syndicate/donk, -/obj/item/clothing/suit/hazardvest/donk, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/item/stack/wrapping_paper, -/obj/item/stack/packageWrap, -/obj/structure/closet/wall{ - dir = 8; - icon_door = "orange_wall"; - name = "employee closet"; - pixel_x = 28 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"cI" = ( -/obj/structure/rack, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/item/rack_parts, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"dp" = ( -/obj/structure/displaycase, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"dA" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/hallway/central) -"dC" = ( -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/obj/machinery/space_heater, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"dH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/displaycase, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"dL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"dM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"eD" = ( -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 10 - }, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"eF" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 12 - }, -/obj/structure/mirror{ - pixel_x = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/item/storage/firstaid/regular, -/obj/item/storage/firstaid/medical{ - pixel_x = -5; - pixel_y = -4 - }, -/obj/structure/closet/wall/white/med{ - dir = 1; - name = "medicine locker"; - pixel_y = -28 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"eL" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/structure/catwalk/over/plated_catwalk/white, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"eX" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"fn" = ( -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"fo" = ( -/obj/item/card/emag, -/obj/item/tank/internals/emergency_oxygen/double, -/obj/item/storage/backpack/duffelbag/syndie{ - name = "manager's duffel bag" - }, -/obj/item/clothing/under/syndicate/donk/qm, -/obj/item/clothing/suit/hazardvest/donk/qm, -/obj/item/melee/classic_baton/telescopic, -/obj/item/radio/headset/syndicate/alt/leader, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000, -/obj/item/spacecash/bundle/c1000, -/obj/structure/closet/secure_closet/wall{ - dir = 4; - icon_state = "solgov_wall"; - name = "manager's locker"; - pixel_x = -28; - req_access_txt = "41" - }, -/obj/machinery/light_switch{ - pixel_y = 22 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"fv" = ( -/obj/machinery/selling_pad, -/obj/effect/turf_decal/box, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"fy" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/opaque/brown/filled/warning, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"fB" = ( -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 8 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"ga" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "cargodoors" - }, -/obj/item/radio/intercom/directional/north{ - pixel_y = 22 - }, -/turf/open/floor/plasteel/dark, -/area/ship/cargo) -"gf" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"gj" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 6 - }, -/obj/structure/closet/secure_closet/engineering_welding, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"gC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"hd" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"hi" = ( -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"hm" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"hs" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/cargo) -"hu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/obj/machinery/suit_storage_unit/inherit/industrial, -/obj/item/clothing/suit/space/syndicate, -/obj/item/clothing/head/helmet/space/syndicate, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"hX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 8 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"if" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/obj/machinery/computer/cryopod/directional/south, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/crew/dorm) -"it" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/shieldwallgen/atmos{ - anchored = 1; - dir = 1; - id = "luxembourg_cargo"; - locked = 1 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "syndiefuck" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"iF" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/vending_refill/engineering, -/obj/item/vending_refill/engineering, -/obj/item/vending_refill/engivend, -/obj/item/vending_refill/engivend, -/obj/item/vending_refill/hydronutrients, -/obj/item/vending_refill/hydronutrients, -/obj/item/vending_refill/boozeomat, -/obj/item/vending_refill/boozeomat, -/obj/item/vending_refill/medical, -/obj/item/vending_refill/medical, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/snack, -/obj/item/vending_refill/snack, -/obj/item/vending_refill/sovietsoda, -/obj/item/vending_refill/cola, -/obj/item/vending_refill/cola, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"iO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 10 - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"iR" = ( -/obj/machinery/power/shuttle/engine/fueled/plasma{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/layer_manifold, -/turf/open/floor/plating, -/area/ship/engineering) -"iZ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 - }, -/obj/structure/catwalk/over/plated_catwalk/white, -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"jr" = ( -/turf/open/floor/carpet/red_gold, -/area/ship/hallway/central) -"jv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"jH" = ( -/obj/structure/table, -/obj/item/radio/intercom/wideband/table{ - dir = 4 - }, -/obj/machinery/light_switch{ - pixel_y = 22 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"jK" = ( -/obj/machinery/air_sensor/atmos/air_tank, -/turf/open/floor/engine/air, -/area/ship/engineering) -"ke" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"ks" = ( -/obj/structure/closet/crate, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/obj/item/gun_voucher, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"kE" = ( -/obj/machinery/chem_master/condimaster, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"kI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 5 - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"kZ" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/hallway/central) -"lb" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"lg" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"lt" = ( -/obj/machinery/atmospherics/components/binary/volume_pump, -/obj/structure/catwalk/over/plated_catwalk/white, -/turf/open/floor/plating, -/area/ship/engineering) -"lK" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"lQ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters{ - id = "warehouse" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/storage) -"lW" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 1 - }, -/obj/structure/catwalk/over/plated_catwalk/white, -/turf/open/floor/plating, -/area/ship/engineering) -"mi" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/crew/dorm) -"mm" = ( -/obj/item/toy/figure/cargotech, -/obj/item/clothing/suit/hooded/wintercoat/cargo, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/item/hand_labeler_refill, -/obj/item/clothing/under/syndicate/donk, -/obj/item/clothing/suit/hazardvest/donk, -/obj/item/stack/wrapping_paper, -/obj/item/stack/packageWrap, -/obj/structure/railing, -/obj/structure/closet/wall{ - dir = 4; - icon_door = "orange_wall"; - name = "employee closet"; - pixel_x = -28 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"mE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/effect/turf_decal/kfp_small/left{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"mK" = ( -/obj/machinery/light/directional/south, -/obj/machinery/computer/atmos_control/tank/air_tank{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"na" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering) -"nz" = ( -/obj/structure/sign/donk{ - pixel_x = -32 - }, -/obj/structure/rack, -/obj/item/radio/headset, -/obj/item/radio/headset, -/obj/item/radio/headset, -/obj/item/radio/headset, -/obj/item/radio/headset, -/obj/item/radio/headset, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"ow" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/crew/canteen) -"pd" = ( -/obj/machinery/light/directional/east, -/obj/structure/closet/crate/large{ - name = "Donk! Co. Powerloader In a Box" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/rechargefloor, -/obj/mecha/working/ripley/cargo{ - name = "\improper Donk! Co. Cargo Loading Device" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"pt" = ( -/turf/closed/wall/mineral/plastitanium, -/area/ship/engineering) -"pJ" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/autolathe, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"pL" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"pR" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"qe" = ( -/obj/effect/turf_decal/atmos/air, -/turf/open/floor/engine/air, -/area/ship/engineering) -"qf" = ( -/obj/structure/table, -/obj/machinery/door/firedoor, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"qh" = ( -/obj/machinery/airalarm/directional/west, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 8 - }, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_shopfloor"; - location = "lux_lobby" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"ql" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"qO" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"qP" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"qR" = ( -/turf/open/floor/engine/air, -/area/ship/engineering) -"qV" = ( -/obj/item/toy/sword, -/obj/structure/closet/crate/wooden/toy, -/obj/item/ammo_box/magazine/toy/smgm45/riot, -/obj/item/ammo_box/magazine/toy/smgm45/riot, -/obj/item/gun/ballistic/automatic/smg/c20r/toy/riot, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/obj/item/soap/syndie, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"rh" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/opaque/blue/filled/warning{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"rm" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"rq" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/window{ - dir = 8; - name = "Canteen" - }, -/obj/effect/turf_decal/siding/red, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"rG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"rU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/opaque/orange/filled/warning, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"rV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{ - dir = 4 - }, -/obj/structure/window/plasma/reinforced/spawner/east, -/turf/open/floor/engine/air, -/area/ship/engineering) -"sh" = ( -/obj/machinery/power/shuttle/engine/fueled/plasma{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"sk" = ( -/obj/effect/turf_decal/atmos/plasma, -/turf/open/floor/engine/plasma, -/area/ship/engineering) -"sF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"sI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 6 - }, -/obj/effect/turf_decal/industrial/traffic{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"sV" = ( -/mob/living/simple_animal/bot/mulebot{ - bot_name = "\proper Christine"; - desc = "A Multiple Utility Load Effector bot. This one seems oddly menacing..."; - id = "Christine"; - name = "\proper Christine" - }, -/obj/effect/turf_decal/corner/opaque/brown/bordercee, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = null; - location = "mulestation" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"tx" = ( -/obj/machinery/power/port_gen/pacman, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/item/stack/sheet/mineral/plasma/five, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"tF" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/blue, -/obj/structure/curtain/bounty, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"tH" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/siding/red{ - dir = 10 - }, -/obj/effect/turf_decal/corner/opaque/neutral/bordercorner{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"tO" = ( -/obj/effect/turf_decal/siding/blue/corner, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"tU" = ( -/obj/machinery/camera{ - dir = 10 - }, -/turf/open/floor/plating, -/area/template_noop) -"tV" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/button/door{ - id = "cargodoors"; - pixel_x = 8; - pixel_y = -24 - }, -/obj/machinery/door/window{ - dir = 8; - name = "Cargo Bay" - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "cargodoors" - }, -/turf/open/floor/plasteel/dark, -/area/ship/cargo) -"ug" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/eastright, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "cargodoors" - }, -/turf/open/floor/plasteel/dark, -/area/ship/cargo) -"ul" = ( -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/power/port_gen/pacman, -/obj/item/stack/sheet/mineral/plasma/five, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"uo" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"uB" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/item/reagent_containers/food/drinks/shaker{ - pixel_x = 10 - }, -/obj/item/kitchen/knife{ - pixel_x = -8 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"uK" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxin_input{ - dir = 8 - }, -/obj/structure/window/plasma/reinforced/spawner/west, -/turf/open/floor/engine/plasma, -/area/ship/engineering) -"uX" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/obj/machinery/suit_storage_unit/inherit/industrial, -/obj/item/clothing/suit/space/syndicate/green, -/obj/item/clothing/head/helmet/space/syndicate/green, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"vb" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters{ - id = "warehouse" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/storage) -"vf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"vp" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering) -"vw" = ( -/obj/machinery/camera{ - dir = 1 - }, -/turf/open/floor/plating, -/area/template_noop) -"vz" = ( -/obj/machinery/atmospherics/components/unary/shuttle/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner, -/obj/machinery/door/poddoor/shutters{ - id = "externalshutters" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"vT" = ( -/obj/structure/closet/crate, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"wd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"wN" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks, -/obj/machinery/light/directional/north, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"wP" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"wT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxin_output{ - dir = 8 - }, -/obj/structure/window/plasma/reinforced/spawner/west, -/turf/open/floor/engine/plasma, -/area/ship/engineering) -"xa" = ( -/obj/effect/turf_decal/siding/blue, -/obj/effect/turf_decal/corner/opaque/blue/half{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"xc" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"xt" = ( -/obj/machinery/light/directional/east, -/obj/item/clothing/head/HoS/beret/syndicate, -/obj/item/radio/headset/syndicate/alt, -/obj/item/gun/ballistic/shotgun/doublebarrel, -/obj/item/clothing/under/rank/civilian/bartender, -/obj/structure/closet/secure_closet/bar{ - req_access = null; - req_one_access_txt = list(25,41) - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"xw" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/clothing{ - default_price = 0; - extra_price = 0 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"yd" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks/beer, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"yf" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"yh" = ( -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 24; - pixel_y = 5 - }, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/obj/effect/turf_decal/corner/opaque/brown/bordercorner{ - dir = 1 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"ym" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"yQ" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/catwalk/over/plated_catwalk/dark, -/turf/open/floor/plating, -/area/ship/engineering) -"yX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_kitchen"; - location = "lux_shopfloor" - }, -/obj/machinery/holopad/emergency/cargo, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"zc" = ( -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"zW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 6 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"Ai" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/airlock{ - name = "Dormitory" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/crew/dorm) -"AE" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/layer_manifold, -/turf/open/floor/plating, -/area/ship/engineering) -"AL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Bt" = ( -/turf/closed/wall/mineral/plastitanium, -/area/ship/crew/canteen) -"Bw" = ( -/turf/closed/wall/mineral/plastitanium, -/area/ship/cargo) -"BM" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/blue, -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/curtain/bounty, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/light_switch{ - dir = 4; - pixel_x = -19; - pixel_y = 12 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"BX" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/cryopod{ - dir = 4 - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/crew/dorm) -"BZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"CC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"CI" = ( -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"CM" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer2, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"CT" = ( -/obj/machinery/computer/atmos_control/tank/toxin_tank{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"CV" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/red, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"CW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/structure/closet/secure_closet/engineering_electrical, -/obj/item/stack/circuit_stack/full, -/obj/item/stack/circuit_stack/full, -/obj/item/stack/circuit_stack/full, -/obj/item/stack/circuit_stack/full, -/obj/machinery/light/directional/north, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"Da" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock{ - name = "Canteen" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/crew/canteen) -"Dq" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_crew"; - location = "lux_kitchen" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"Dw" = ( -/obj/structure/table, -/obj/structure/window/plasma/reinforced, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"DA" = ( -/obj/effect/turf_decal/siding/red, -/obj/machinery/firealarm/directional/south, -/obj/machinery/light_switch{ - dir = 1; - pixel_x = 6; - pixel_y = -24 - }, -/obj/machinery/airalarm/directional/east, -/obj/machinery/vending/dinnerware, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"DE" = ( -/obj/structure/rack, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"DG" = ( -/obj/machinery/light/directional/south, -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"DJ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/effect/turf_decal/number/five{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"DW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/chair/plastic, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"Ee" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Ej" = ( -/obj/machinery/modular_computer/console/preset/command{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"Er" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering) -"EG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/opaque/brown/filled/warning{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"EO" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/crew/dorm) -"EW" = ( -/turf/open/floor/engine/plasma, -/area/ship/engineering) -"EZ" = ( -/obj/item/radio/headset/syndicate/alt, -/obj/item/toy/figure/cargotech, -/obj/item/clothing/suit/hooded/wintercoat/cargo, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/item/hand_labeler_refill, -/obj/item/clothing/under/syndicate/donk, -/obj/item/clothing/suit/hazardvest/donk, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/item/stack/wrapping_paper, -/obj/item/stack/packageWrap, -/obj/structure/closet/wall{ - dir = 4; - icon_door = "orange_wall"; - name = "employee closet"; - pixel_x = -28 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"Fj" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/item/paper{ - desc = "A piece of paper depicting a extremely pissed up upper manager"; - default_raw_text = "YOU DAMNNED FOOLS! YOU ARENT SUPPOSED TO USE YOUR STOCK, YOU'RE SUPPOSED TO SELL THEM!! WE AREN'T WASTING MY MONEY ARE WE!?! NOW GET BACK TO WORK!!!"; - name = "angry letter from upper management" - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"Fq" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/holopad/emergency/bar, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"FV" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"Ga" = ( -/obj/machinery/computer/helm, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"Gr" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"GD" = ( -/obj/docking_port/stationary{ - width = 30; - height = 15; - dir = 8; - dwidth = 15 - }, -/turf/template_noop, -/area/template_noop) -"GG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"Hx" = ( -/turf/closed/wall/mineral/plastitanium, -/area/ship/crew/dorm) -"HG" = ( -/obj/machinery/power/shieldwallgen/atmos{ - anchored = 1; - id = "luxembourg_cargo"; - locked = 1 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "syndiefuck" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"HK" = ( -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/obj/machinery/light/directional/east, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"HZ" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/rag, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"Id" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"Ij" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/docking_port/mobile{ - can_move_docking_ports = 1; - dir = 2; - launch_status = 0 - }, -/obj/machinery/door/poddoor/shutters{ - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/hallway/central) -"Ip" = ( -/obj/item/toy/figure/cargotech, -/obj/item/clothing/suit/hooded/wintercoat/cargo, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/item/hand_labeler_refill, -/obj/item/clothing/under/syndicate/donk, -/obj/item/clothing/suit/hazardvest/donk, -/obj/item/stack/wrapping_paper, -/obj/item/stack/packageWrap, -/obj/structure/railing, -/obj/structure/closet/wall{ - dir = 8; - icon_door = "orange_wall"; - name = "employee closet"; - pixel_x = 28 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"Iv" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"IT" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/siding/blue, -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 20; - pixel_y = 11 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Je" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Ji" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/blue, -/obj/structure/curtain/bounty, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"Jq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Jr" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/obj/effect/turf_decal/siding/blue/corner, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"JO" = ( -/obj/structure/closet/crate/science, -/obj/item/circuitboard/machine/chem_dispenser/drinks, -/obj/item/circuitboard/machine/chem_dispenser/drinks, -/obj/item/circuitboard/machine/chem_dispenser/drinks, -/obj/item/circuitboard/machine/chem_dispenser/drinks/beer, -/obj/item/circuitboard/machine/chem_dispenser/drinks/beer, -/obj/item/circuitboard/machine/chem_dispenser/drinks/beer, -/obj/item/circuitboard/machine/deep_fryer, -/obj/item/circuitboard/machine/deep_fryer, -/obj/item/circuitboard/machine/deep_fryer, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/mechfab, -/obj/item/circuitboard/machine/ore_redemption, -/obj/item/circuitboard/machine/ore_redemption, -/obj/item/circuitboard/machine/ore_redemption, -/obj/item/circuitboard/machine/microwave, -/obj/item/circuitboard/machine/microwave, -/obj/item/circuitboard/machine/microwave, -/obj/machinery/firealarm/directional/east, -/obj/machinery/light_switch{ - pixel_x = 6; - pixel_y = 24 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"JT" = ( -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "syndiefuck" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"JU" = ( -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 6 - }, -/obj/machinery/suit_storage_unit/inherit/industrial, -/obj/item/clothing/suit/space/syndicate/blue, -/obj/item/clothing/head/helmet/space/syndicate/blue, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"JV" = ( -/obj/effect/turf_decal/corner/opaque/brown/bordercorner{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Ka" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/storage) -"Kg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/shower{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/curtain, -/obj/effect/turf_decal/steeldecal/steel_decals10{ - dir = 8 - }, -/obj/machinery/light_switch{ - pixel_y = 23; - pixel_x = 11 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"Kk" = ( -/obj/machinery/air_sensor/atmos/toxin_tank, -/turf/open/floor/engine/plasma, -/area/ship/engineering) -"Ko" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_lobby"; - location = "lux_warehouse" - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"KH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/autodrobe/all_access{ - default_price = 0; - extra_price = 0 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"KX" = ( -/obj/structure/closet/crate, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/obj/item/construction/rcd/combat, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"KZ" = ( -/obj/effect/turf_decal/siding/red, -/obj/structure/closet/secure_closet/freezer/wall{ - dir = 1; - name = "refrigerator"; - pixel_y = -32 - }, -/obj/item/storage/box/donkpockets/donkpocketteriyaki, -/obj/item/storage/box/donkpockets/donkpocketteriyaki, -/obj/item/storage/box/donkpockets/donkpocketteriyaki, -/obj/item/storage/box/donkpockets/donkpocketteriyaki, -/obj/item/storage/box/donkpockets/donkpocketspicy, -/obj/item/storage/box/donkpockets/donkpocketspicy, -/obj/item/storage/box/donkpockets/donkpocketspicy, -/obj/item/storage/box/donkpockets/donkpocketspicy, -/obj/item/storage/box/donkpockets/donkpockethonk, -/obj/item/storage/box/donkpockets/donkpockethonk, -/obj/item/storage/box/donkpockets/donkpockethonk, -/obj/item/storage/box/donkpockets/donkpockethonk, -/obj/item/storage/box/donkpockets, -/obj/item/storage/box/donkpockets, -/obj/item/storage/box/donkpockets, -/obj/item/storage/box/donkpockets, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"La" = ( -/obj/effect/turf_decal/corner/opaque/blue{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "cargodoors"; - pixel_y = 25 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Lr" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/paper{ - desc = "A piece of paper depicting a extremely pissed up upper manager"; - default_raw_text = "YOU ARENT SUPPOSED TO BE MINING, HEAR ME!?!! YOU'RE SUPPOSED TO BE SELLING SHIT TO THE CONSUMERS YOU HEAR!! AS PUNISHMENT FOR THE LAST SHIFT, I HAVE REMOVED ALLL OF YOUR MINING TOOLS!! NOW GET BACK TO WORK!!"; - name = "angry letter from upper management" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"Lu" = ( -/obj/structure/chair/plastic{ - dir = 1 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"LU" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{ - dir = 4 - }, -/obj/structure/window/plasma/reinforced/spawner/east, -/turf/open/floor/engine/air, -/area/ship/engineering) -"LV" = ( -/obj/machinery/vending/boozeomat/all_access{ - default_price = 0; - extra_price = 0 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"LY" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/closet/crate, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/card/emag/limited, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"Mg" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"Mi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/structure/window/plasma/reinforced, -/obj/machinery/door/window/eastright, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "cargodoors" - }, -/turf/open/floor/plasteel/dark, -/area/ship/cargo) -"Mj" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump, -/obj/machinery/advanced_airlock_controller{ - pixel_x = -25 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"Mx" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/machinery/light_switch{ - dir = 1; - pixel_x = 10; - pixel_y = -21 - }, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/trimline/opaque/blue/filled/warning, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Mz" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 9 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"MT" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/cargo) -"MU" = ( -/obj/machinery/door/window/brigdoor{ - name = "Bridge"; - req_access_txt = "41" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 10 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/hallway/central) -"Nr" = ( -/turf/template_noop, -/area/template_noop) -"NH" = ( -/obj/effect/turf_decal/siding/blue/corner, -/obj/effect/turf_decal/corner/opaque/blue/half{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"NJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"NQ" = ( -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ - pixel_x = 6 - }, -/obj/item/lighter/greyscale{ - pixel_x = -3; - pixel_y = 4 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"On" = ( -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/obj/structure/closet/crate, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"Op" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/crew/canteen) -"Oq" = ( -/obj/structure/table, -/obj/item/toy/cards/deck/syndicate, -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"Oz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"OR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 6 - }, -/obj/effect/decal/cleanable/oil, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"OY" = ( -/obj/structure/closet/crate/trashcart, -/obj/effect/spawner/lootdrop/maintenance/eight, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 9 - }, -/obj/machinery/button/shieldwallgen{ - id = "luxembourg_cargo"; - pixel_x = -10; - pixel_y = 25 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/button/door{ - id = "syndiefuck"; - pixel_x = -20; - pixel_y = 26 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Pb" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/crew/dorm) -"Ph" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/effect/turf_decal/number/zero{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"Ps" = ( -/obj/machinery/light/directional/south, -/obj/item/banner/cargo, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 10 - }, -/obj/machinery/button/shieldwallgen{ - dir = 1; - id = "luxembourg_cargo"; - pixel_x = -10; - pixel_y = -25 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/button/door{ - dir = 1; - id = "syndiefuck"; - pixel_x = -20; - pixel_y = -26 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"PO" = ( -/obj/structure/sign/poster/contraband/syndicate_recruitment{ - pixel_x = 4; - pixel_y = -30 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/opaque/blue/filled/warning, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"PW" = ( -/obj/structure/sign/donk{ - pixel_x = -32 - }, -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"QG" = ( -/obj/machinery/light/directional/west, -/obj/machinery/vending/toyliberationstation, -/obj/structure/window/plasma/reinforced, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"QQ" = ( -/obj/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/hallway/central) -"QT" = ( -/obj/machinery/light/directional/east, -/obj/structure/window/plasma/reinforced, -/obj/machinery/computer/selling_pad_control{ - dir = 8 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"QU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/button/door{ - id = "warehouse"; - pixel_x = 24; - pixel_y = 21 - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"Rk" = ( -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/obj/machinery/light/directional/west, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"Ro" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/structure/catwalk/over/plated_catwalk/white, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"Rp" = ( -/turf/open/floor/carpet/red_gold, -/area/ship/crew/dorm) -"RH" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/cargo) -"RM" = ( -/obj/effect/turf_decal/trimline/opaque/brown/filled/warning, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Sn" = ( -/obj/effect/turf_decal/siding/blue, -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"SS" = ( -/obj/item/radio/headset/syndicate/alt, -/obj/item/toy/figure/cargotech, -/obj/item/clothing/suit/hooded/wintercoat/cargo, -/obj/item/stack/sheet/cardboard/fifty, -/obj/item/hand_labeler, -/obj/item/hand_labeler_refill, -/obj/item/clothing/under/syndicate/donk, -/obj/item/clothing/suit/hazardvest/donk, -/obj/item/stack/wrapping_paper, -/obj/item/stack/packageWrap, -/obj/structure/closet/wall{ - dir = 4; - icon_door = "orange_wall"; - name = "employee closet"; - pixel_x = -28 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"Tj" = ( -/obj/effect/turf_decal/siding/red, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/light_switch{ - dir = 1; - pixel_x = 11; - pixel_y = -16 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"Ty" = ( -/obj/machinery/light/directional/east, -/obj/structure/closet/crate/large, -/obj/item/mecha_parts/mecha_equipment/mining_scanner, -/mob/living/simple_animal/bot/secbot/grievous/toy, -/obj/effect/decal/cleanable/blood/old, -/obj/item/hand_labeler_refill, -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, -/obj/item/mecha_parts/mecha_equipment/rcd, -/obj/item/mecha_parts/mecha_equipment/cable_layer, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"TB" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"TJ" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/obj/machinery/door/poddoor/shutters{ - dir = 4; - id = "externalshutters" - }, -/turf/open/floor/plating, -/area/ship/storage) -"TP" = ( -/obj/structure/rack, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"TY" = ( -/obj/effect/turf_decal/corner/opaque/brown/bordercorner{ - dir = 1 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Ud" = ( -/obj/effect/turf_decal/siding/blue, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Uk" = ( -/turf/closed/wall/mineral/plastitanium, -/area/ship/storage) -"Uo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/binary/volume_pump, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"Uu" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"Uw" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/structure/curtain, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"UE" = ( -/turf/open/floor/plating, -/area/ship/engineering) -"UI" = ( -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) -"UO" = ( -/obj/machinery/atmospherics/pipe/layer_manifold, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/engineering) -"Va" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"Vb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/opaque/blue/filled/warning, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Vi" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/industrial/traffic{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ship/crew/dorm) -"Vn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/corner/opaque/brown/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/cargo) -"Vs" = ( -/obj/machinery/atmospherics/components/binary/volume_pump, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"VG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/catwalk/over/plated_catwalk/dark, -/obj/effect/turf_decal/number/two{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ship/engineering) -"VR" = ( -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ship/engineering) -"VS" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/plastitaniumglass{ - amount = 20 - }, -/obj/item/stack/sheet/mineral/plastitanium{ - amount = 20 - }, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/effect/decal/cleanable/dirt, -/obj/item/hand_labeler_refill, -/obj/item/stack/sheet/mineral/wood/fifty, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"Wh" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/opaque/orange/filled/warning, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"Wt" = ( -/obj/machinery/smartfridge/bloodbank/preloaded, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/storage) -"WB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"WE" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/hallway/central) -"WQ" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/suit_storage_unit/inherit{ - req_access_txt = "41" - }, -/obj/item/clothing/suit/space/syndicate, -/obj/item/clothing/head/helmet/space/syndicate, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel/mono/dark, -/area/ship/engineering) -"WU" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"Xf" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable/yellow, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/navbeacon/wayfinding{ - codes_txt = "patrol;next_patrol=lux_warehouse"; - location = "lux_engine" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"Xw" = ( -/obj/machinery/washing_machine, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plasteel/patterned, -/area/ship/crew/dorm) -"XM" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"XS" = ( -/obj/machinery/atmospherics/components/unary/shuttle/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/door/poddoor/shutters{ - id = "externalshutters" - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"Yd" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/catwalk/over/plated_catwalk/white, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/ship/engineering) -"Yq" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/hallway/central) -"YE" = ( -/obj/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east{ - pixel_y = 37 - }, -/turf/open/floor/carpet/red_gold, -/area/ship/hallway/central) -"YI" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ship/crew/canteen) -"YK" = ( -/obj/machinery/airalarm/directional/west, -/obj/item/clothing/head/collectable/chef, -/obj/item/clothing/head/collectable/paper, -/obj/item/clothing/head/collectable/tophat, -/obj/item/clothing/head/collectable/captain, -/obj/item/clothing/head/collectable/beret, -/obj/item/clothing/head/collectable/welding, -/obj/item/clothing/head/collectable/flatcap, -/obj/item/clothing/head/collectable/pirate, -/obj/item/clothing/head/collectable/kitty, -/obj/item/clothing/head/collectable/rabbitears, -/obj/item/clothing/head/collectable/wizard, -/obj/item/clothing/head/collectable/hardhat, -/obj/item/clothing/head/collectable/HoS, -/obj/item/clothing/head/collectable/HoP, -/obj/item/clothing/head/collectable/thunderdome, -/obj/item/clothing/head/collectable/swat, -/obj/item/clothing/head/collectable/slime, -/obj/item/clothing/head/collectable/police, -/obj/item/clothing/head/collectable/xenom, -/obj/item/clothing/head/collectable/petehat, -/obj/structure/closet/crate, -/turf/open/floor/plasteel/mono/dark, -/area/ship/storage) -"YL" = ( -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/border{ - dir = 4 - }, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) -"YO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 5 - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) -"YZ" = ( -/obj/structure/closet/secure{ - icon_state = "eng_secure"; - name = "GEC Engineer's locker" - }, -/obj/item/clothing/gloves/color/yellow, -/obj/item/pipe_dispenser, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/suit/toggle/hazard, -/obj/item/clothing/head/beret/eng/hazard, -/obj/item/clothing/head/beret/eng, -/obj/item/holosign_creator/engineering, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/item/clothing/under/syndicate/gec, -/obj/item/clothing/under/syndicate/gec, -/obj/item/stack/tape/industrial/pro, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/light_switch{ - pixel_y = 23; - pixel_x = 11 - }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering) -"Zm" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) -"ZV" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 5 - }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ship/engineering) - -(1,1,1) = {" -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -GD -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -"} -(2,1,1) = {" -Nr -Nr -Nr -Nr -Nr -Nr -hs -HG -JT -JT -JT -it -Ka -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -"} -(3,1,1) = {" -Nr -Nr -Nr -Nr -Bw -MT -hs -OY -hX -hX -fB -Ps -Ka -TJ -TJ -Uk -Nr -Nr -Nr -Nr -pt -VR -pt -Nr -Nr -Nr -Nr -"} -(4,1,1) = {" -Nr -Nr -Nr -Bw -hs -Mz -qh -JV -AL -hi -CC -RM -vb -VS -qV -Wt -TJ -Uk -Nr -Uk -VR -qe -VR -pt -Nr -Nr -Nr -"} -(5,1,1) = {" -Nr -Nr -hs -hs -bB -TY -CC -OR -gf -Je -wP -fy -lQ -QU -kI -iF -vT -Ka -TJ -Ka -VR -qR -jK -VR -Nr -Nr -Nr -"} -(6,1,1) = {" -Nr -Nr -RH -sV -yh -BZ -Vn -Ee -EG -hu -uX -JU -Ka -JO -iO -Fj -YO -YK -ks -On -vp -rV -LU -VR -pt -Nr -Nr -"} -(7,1,1) = {" -Nr -Nr -hs -hs -hs -ga -ug -Mi -tV -hs -hs -hs -Ka -Ka -Ty -Ko -Uu -lg -hm -rU -Ro -uo -ZV -mK -vp -pt -Nr -"} -(8,1,1) = {" -Nr -Nr -Nr -WE -WE -La -aB -NJ -Ud -TP -Rk -PW -cI -Ka -Ka -KX -LY -cq -pd -ke -vp -dC -GG -Uo -XS -iR -hd -"} -(9,1,1) = {" -tU -WE -kZ -WE -QG -NH -wd -WB -tO -Iv -Iv -Iv -yf -DG -Ka -Ka -Ka -Ka -Ka -Ka -vp -gj -Zm -Vs -vz -sh -Nr -"} -(10,1,1) = {" -WE -WE -Ej -bi -QQ -xa -dp -bV -Sn -TP -TP -jv -pL -Mx -vp -fo -SS -EZ -mm -tx -pR -XM -ql -pJ -vp -vp -vp -"} -(11,1,1) = {" -Ij -Ga -dA -jr -MU -rh -TB -WU -yX -gC -gC -Yq -Jq -Vb -dL -VG -Ph -DJ -mE -yQ -Xf -CM -Va -dM -AE -Mj -qP -"} -(12,1,1) = {" -WE -WE -jH -fv -YE -xa -dp -dH -Sn -TP -TP -DE -Jr -PO -vp -WQ -xt -cB -Ip -ul -pR -lb -Gr -eD -na -UO -Er -"} -(13,1,1) = {" -vw -WE -kZ -WE -QT -bp -Oz -vf -lK -ym -cs -eX -CI -DG -EO -EO -EO -EO -EO -EO -vp -CW -lW -lt -vz -sh -Nr -"} -(14,1,1) = {" -Nr -Nr -Nr -WE -WE -YL -YL -qO -xc -tH -IT -HK -zc -EO -EO -BX -if -EO -Kg -Uw -vp -YZ -Yd -lt -vz -sh -UE -"} -(15,1,1) = {" -Nr -Nr -YI -YI -YI -qf -HZ -Lr -Dw -rq -YI -EO -EO -EO -nz -Vi -sI -Ai -FV -Wh -eL -iZ -bt -CT -vp -pt -Nr -"} -(16,1,1) = {" -Nr -Nr -ow -YI -yd -UI -UI -Fq -UI -Tj -YI -Ji -NQ -BM -zW -bN -aK -Pb -Xw -eF -vp -uK -wT -VR -pt -Nr -Nr -"} -(17,1,1) = {" -Nr -Nr -Bt -YI -wN -UI -rG -Mg -Dq -CV -Da -cb -aD -Id -rm -xw -KH -EO -mi -EO -VR -EW -Kk -VR -Nr -Nr -Nr -"} -(18,1,1) = {" -Nr -Nr -Nr -Bt -YI -uB -kE -sF -UI -KZ -YI -Rp -DW -Oq -Lu -EO -mi -Hx -Nr -Hx -VR -sk -VR -pt -Nr -Nr -Nr -"} -(19,1,1) = {" -Nr -Nr -Nr -Nr -Bt -Op -YI -fn -LV -DA -YI -tF -EO -mi -mi -Hx -Nr -Nr -Nr -Nr -pt -VR -pt -Nr -Nr -Nr -Nr -"} -(20,1,1) = {" -Nr -Nr -Nr -Nr -Nr -Nr -YI -YI -Op -YI -YI -EO -EO -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -Nr -"} From cc2405948d782bb508b8f8b3d3e0724b855ba7c4 Mon Sep 17 00:00:00 2001 From: fallcon Date: Thu, 18 Apr 2024 13:38:15 -0500 Subject: [PATCH 125/206] yea --- code/modules/projectiles/guns/ballistic/smg.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index 5d9aa00788f6..23ec4247a5da 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -167,11 +167,6 @@ underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src) update_appearance() -/obj/item/gun/ballistic/automatic/smg/m90/Initialize() - . = ..() - underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src) - update_appearance() - /obj/item/gun/ballistic/automatic/smg/m90/afterattack(atom/target, mob/living/user, flag, params) if(select == 2) underbarrel.afterattack(target, user, flag, params) From 9b8f6f931b41eb06ca6e6408271fcfe87b0c1549 Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 19 Apr 2024 10:18:52 -0500 Subject: [PATCH 126/206] PROC_REF stuff --- code/datums/components/attachment.dm | 14 ++++++------- code/datums/components/attachment_holder.dm | 20 +++++++++---------- .../objects/items/attachments/_attachment.dm | 8 ++++---- code/modules/projectiles/gun.dm | 2 -- 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 00a306540c6e..eea15310e14a 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -75,12 +75,12 @@ src.on_preattack = on_preattack ADD_TRAIT(parent, TRAIT_ATTACHABLE, src) - RegisterSignal(parent, COMSIG_ATTACHMENT_ATTACH, .proc/try_attach) - RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, .proc/try_detach) - RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, .proc/try_toggle) - RegisterSignal(parent, COMSIG_ATTACHMENT_PRE_ATTACK, .proc/relay_pre_attack) - RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, .proc/update_overlays) - RegisterSignal(parent, COMSIG_ATTACHMENT_GET_SLOT, .proc/send_slot) + RegisterSignal(parent, COMSIG_ATTACHMENT_ATTACH, PROC_REF(try_attach)) + RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, PROC_REF(try_detach)) + RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, PROC_REF(try_toggle)) + RegisterSignal(parent, COMSIG_ATTACHMENT_PRE_ATTACK, PROC_REF(relay_pre_attack)) + RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, PROC_REF(update_overlays)) + RegisterSignal(parent, COMSIG_ATTACHMENT_GET_SLOT, PROC_REF(send_slot)) for(var/signal in signals) RegisterSignal(parent, signal, signals[signal]) @@ -96,7 +96,7 @@ /datum/component/attachment/proc/try_toggle(obj/item/parent, obj/item/holder, mob/user) SIGNAL_HANDLER - INVOKE_ASYNC(src, .proc/do_toggle, parent, holder, user) + INVOKE_ASYNC(src, PROC_REF(do_toggle), parent, holder, user) /datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index d570a684cfc9..bb9de28a8772 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -23,13 +23,13 @@ src.valid_types = valid_types src.slot_offsets = slot_offsets - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/handle_attack) - RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/handle_examine) - RegisterSignal(parent, COMSIG_PARENT_EXAMINE_MORE, .proc/handle_examine_more) - RegisterSignal(parent, COMSIG_PARENT_QDELETING, .proc/handle_qdel) - RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, .proc/handle_item_pre_attack) - RegisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT, .proc/handle_ctrl_shift_click) - RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/handle_overlays) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(handle_attack)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(handle_examine)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE_MORE, PROC_REF(handle_examine_more)) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(handle_qdel)) + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(handle_item_pre_attack)) + RegisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT, PROC_REF(handle_ctrl_shift_click)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(handle_overlays)) /datum/component/attachment_holder/proc/handle_overlays(obj/item/parent, list/overlays) SIGNAL_HANDLER @@ -66,7 +66,7 @@ /datum/component/attachment_holder/proc/handle_ctrl_shift_click(obj/item/parent, mob/user) SIGNAL_HANDLER - INVOKE_ASYNC(src, .proc/do_attachment_radial, parent, user) + INVOKE_ASYNC(src, PROC_REF(do_attachment_radial), parent, user) /datum/component/attachment_holder/proc/do_attachment_radial(obj/item/parent, mob/user) var/list/attachments_as_list = attachments_to_list() @@ -133,11 +133,11 @@ return if(item.tool_behaviour == TOOL_CROWBAR && length(attachments)) - INVOKE_ASYNC(src, .proc/handle_detach, parent, item, user) + INVOKE_ASYNC(src, PROC_REF(handle_detach), parent, item, user) return TRUE if(HAS_TRAIT(item, TRAIT_ATTACHABLE) && length(attachments) < max_attachments) - INVOKE_ASYNC(src, .proc/do_attach, item, user) + INVOKE_ASYNC(src, PROC_REF(do_attach), item, user) return TRUE for(var/obj/item/attach as anything in attachments) diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index 91903be44eb6..fb02d55b8c35 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -17,10 +17,10 @@ /datum/component/attachment, \ slot, \ valid_parents, \ - CALLBACK(src, .proc/Attach), \ - CALLBACK(src, .proc/Detach), \ - CALLBACK(src, .proc/Toggle), \ - CALLBACK(src, .proc/PreAttack), \ + CALLBACK(src, PROC_REF(Attach)), \ + CALLBACK(src, PROC_REF(Detach)), \ + CALLBACK(src, PROC_REF(Toggle)), \ + CALLBACK(src, PROC_REF(PreAttack)), \ signals) /obj/item/attachment/proc/Toggle(obj/item/gun/gun, mob/user) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index e78fb28de840..8c206defbcfe 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -47,8 +47,6 @@ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - var/list/attachment_options = list() //This.. works for now.. gun refactor soon - var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite var/ammo_y_offset = 0 From e31f44622bea8c9a9f457a4dbcb42c8b96b9dbf4 Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 19 Apr 2024 11:50:45 -0500 Subject: [PATCH 127/206] orgnzies vars --- code/modules/projectiles/gun.dm | 158 ++++++++++++++++++++------------ 1 file changed, 99 insertions(+), 59 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8c206defbcfe..0f4ba4ff3416 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -4,6 +4,8 @@ icon = 'icons/obj/guns/projectile.dmi' icon_state = "detective" item_state = "gun" + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron=2000) @@ -16,69 +18,80 @@ attack_verb = list("struck", "hit", "bashed") pickup_sound = 'sound/items/handling/gun_pickup.ogg' drop_sound = 'sound/items/handling/gun_drop.ogg' + //trigger guard on the weapon, hulks can't fire them with their big meaty fingers + trigger_guard = TRIGGER_GUARD_NORMAL /// The manufacturer of this weapon. For flavor mostly. If none, this will not show. var/manufacturer = MANUFACTURER_NONE +/* + * Muzzle +*/ + ///Effect for the muzzle flash of the gun. + var/obj/effect/muzzle_flash/muzzle_flash + ///Icon state of the muzzle flash effect. + var/muzzleflash_iconstate + ///Brightness of the muzzle flash effect. + var/muzzle_flash_lum = 3 + ///Color of the muzzle flash effect. + var/muzzle_flash_color = COLOR_VERY_SOFT_YELLOW + +/* + * Firing +*/ var/fire_sound = 'sound/weapons/gun/pistol/shot.ogg' var/vary_fire_sound = TRUE var/fire_sound_volume = 50 var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg' - var/dry_fire_text = "click" //change this on non-gun things - var/suppressed = null //whether or not a message is displayed when fired + //change this on non-gun things + var/dry_fire_text = "click" + +/* + * Reloading +*/ + var/obj/item/ammo_casing/chambered = null + +/* + * Operation +*/ + //whether or not a message is displayed when fired + var/suppressed = null var/can_suppress = FALSE var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' var/suppressed_volume = 60 var/can_unsuppress = TRUE - var/obj/item/ammo_casing/chambered = null - trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers - var/sawn_desc = null //description change if weapon is sawn-off + //description change if weapon is sawn-off + var/sawn_desc = null var/sawn_off = FALSE - var/burst_size = 1 //how large a burst is - var/fire_delay = 0 //rate of fire for burst firing and semi auto - var/firing_burst = 0 //Prevent the weapon from firing again while already firing - var/semicd = 0 //cooldown handler - var/weapon_weight = WEAPON_LIGHT - var/dual_wield_spread = 24 //additional spread when dual wielding - var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. - - var/projectile_damage_multiplier = 1 //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - - var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite - var/ammo_y_offset = 0 - - //Zooming - var/zoomable = FALSE //whether the gun generates a Zoom action on creation - var/zoomed = FALSE //Zoom toggle - var/zoom_amt = 3 //Distance in TURFs to move the user's screen forward (the "zoom" effect) - var/zoom_out_amt = 0 - var/datum/action/toggle_scope_zoom/azoom + // true if the gun is wielded via twohanded component, shouldnt affect anything else + var/wielded = FALSE + // true if the gun is wielded after delay, should affects accuracy + var/wielded_fully = FALSE + ///Slowdown for wielding + var/wield_slowdown = 0.1 + ///How long between wielding and firing in tenths of seconds + var/wield_delay = 0.4 SECONDS + ///Storing value for above + var/wield_time = 0 +/* + * Stats +*/ + var/projectile_damage_multiplier = 1 //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. + var/weapon_weight = WEAPON_LIGHT + // Speed someone can be flung if its point blank var/pb_knockback = 0 - - // ATTACHMENT STUFF RIGHT HERE // - /// The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED - var/list/valid_attachments = list() - /// Reference to our attachment holder to prevent subtypes having to call GetComponent - var/datum/component/attachment_holder/attachment_holder - /// Maximum number of attachments allowed - var/attachment_max = 0 - /// Number of attachments that can fit on a given slot - var/list/slot_available = ATTACHMENT_DEFAULT_SLOT_AVAILABLE - /// Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y - var/list/slot_offsets = list() - var/wielded = FALSE // true if the gun is wielded via twohanded component, shouldnt affect anything else - - var/wielded_fully = FALSE // true if the gun is wielded after delay, should affects accuracy - + //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. + var/randomspread = 1 ///How much the bullet scatters when fired while wielded. var/spread = 4 ///How much the bullet scatters when fired while unwielded. var/spread_unwielded = 12 + //additional spread when dual wielding + var/dual_wield_spread = 24 + ///Screen shake when the weapon is fired while wielded. var/recoil = 0 @@ -89,28 +102,55 @@ ///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max. var/recoil_deviation = 22.5 - ///Slowdown for wielding - var/wield_slowdown = 0.1 - ///How long between wielding and firing in tenths of seconds - var/wield_delay = 0.4 SECONDS - ///Storing value for above - var/wield_time = 0 + //how large a burst is + var/burst_size = 1 + //rate of fire for burst firing and semi auto + var/fire_delay = 0 + //Prevent the weapon from firing again while already firing + var/firing_burst = 0 + //cooldown handler + var/semicd = 0 + +/* + * Overlay +*/ + //used for positioning ammo count overlay on sprite + var/ammo_x_offset = 0 + var/ammo_y_offset = 0 - ///Effect for the muzzle flash of the gun. - var/obj/effect/muzzle_flash/muzzle_flash - ///Icon state of the muzzle flash effect. - var/muzzleflash_iconstate - ///Brightness of the muzzle flash effect. - var/muzzle_flash_lum = 3 - ///Color of the muzzle flash effect. - var/muzzle_flash_color = COLOR_VERY_SOFT_YELLOW +/* + * Attachment +*/ + /// The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED + var/list/valid_attachments = list() + /// Reference to our attachment holder to prevent subtypes having to call GetComponent + var/datum/component/attachment_holder/attachment_holder + /// Maximum number of attachments allowed + var/attachment_max = 0 + /// Number of attachments that can fit on a given slot + var/list/slot_available = ATTACHMENT_DEFAULT_SLOT_AVAILABLE + /// Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y + var/list/slot_offsets = list() - //gun saftey +/* + * Zooming +*/ + //whether the gun generates a Zoom action on creation + var/zoomable = FALSE + //Zoom toggle + var/zoomed = FALSE + //Distance in TURFs to move the user's screen forward (the "zoom" effect) + var/zoom_amt = 3 + var/zoom_out_amt = 0 + var/datum/action/toggle_scope_zoom/azoom + +/* + * Saftey +*/ ///Does this gun have a saftey and thus can toggle it? var/has_safety = FALSE ///If the saftey on? If so, we can't fire the weapon var/safety = FALSE - ///The wording of safety. Useful for guns that have a non-standard safety system, like a revolver var/safety_wording = "safety" @@ -120,10 +160,10 @@ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) muzzle_flash = new(src, muzzleflash_iconstate) build_zooming() - attachment_holder = AddComponent(/datum/component/attachment_holder, attachment_max, slot_available, valid_attachments, slot_offsets) /obj/item/gun/ComponentInitialize() . = ..() + attachment_holder = AddComponent(/datum/component/attachment_holder, attachment_max, slot_available, valid_attachments, slot_offsets) AddComponent(/datum/component/two_handed) /// triggered on wield of two handed item From 4a857b28a29b7b61470bb8ddcda9c689f796f0de Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 19 Apr 2024 12:14:06 -0500 Subject: [PATCH 128/206] dumps subtype of gun vars into gun so i can combine like half of them lol --- code/modules/projectiles/gun.dm | 150 +++++++++++++++++++++ code/modules/projectiles/guns/ballistic.dm | 85 ------------ code/modules/projectiles/guns/energy.dm | 33 +---- code/modules/projectiles/guns/powered.dm | 15 --- 4 files changed, 153 insertions(+), 130 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 0f4ba4ff3416..76caceaaf15c 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -154,6 +154,156 @@ ///The wording of safety. Useful for guns that have a non-standard safety system, like a revolver var/safety_wording = "safety" +/* + * Ballistic.. For now +*/ + ///sound when inserting magazine + var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' + ///sound when inserting an empty magazine + var/load_empty_sound = 'sound/weapons/gun/general/magazine_insert_empty.ogg' + ///volume of loading sound + var/load_sound_volume = 40 + ///whether loading sound should vary + var/load_sound_vary = TRUE + ///sound of racking + var/rack_sound = 'sound/weapons/gun/general/bolt_rack.ogg' + ///volume of racking + var/rack_sound_volume = 60 + ///whether racking sound should vary + var/rack_sound_vary = TRUE + ///sound of when the bolt is locked back manually + var/lock_back_sound = 'sound/weapons/gun/general/slide_lock_1.ogg' + ///volume of lock back + var/lock_back_sound_volume = 60 + ///whether lock back varies + var/lock_back_sound_vary = TRUE + ///Sound of ejecting a magazine + var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' + ///sound of ejecting an empty magazine + var/eject_empty_sound = 'sound/weapons/gun/general/magazine_remove_empty.ogg' + ///volume of ejecting a magazine + var/eject_sound_volume = 40 + ///whether eject sound should vary + var/eject_sound_vary = TRUE + ///sound of dropping the bolt or releasing a slide + var/bolt_drop_sound = 'sound/weapons/gun/general/bolt_drop.ogg' + ///volume of bolt drop/slide release + var/bolt_drop_sound_volume = 60 + ///empty alarm sound (if enabled) + var/empty_alarm_sound = 'sound/weapons/gun/general/empty_alarm.ogg' + ///empty alarm volume sound + var/empty_alarm_volume = 70 + ///whether empty alarm sound varies + var/empty_alarm_vary = TRUE + + ///Whether the gun will spawn loaded with a magazine + var/spawnwithmagazine = TRUE + ///Compatible magazines with the gun + var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info + ///Whether the sprite has a visible magazine or not + var/mag_display = FALSE + ///Whether the sprite has a visible ammo display or not + var/mag_display_ammo = FALSE + ///Whether the sprite has a visible indicator for being empty or not. + var/empty_indicator = FALSE + ///Whether the gun alarms when empty or not. + var/empty_alarm = FALSE + ///Do we eject the magazine upon runing out of ammo? + var/empty_autoeject = FALSE + ///Whether the gun supports multiple special mag types + var/special_mags = FALSE + ///The bolt type of the gun, affects quite a bit of functionality, see gun.dm in defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT + var/bolt_type = BOLT_TYPE_STANDARD + ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both. + var/bolt_locked = FALSE + ///Whether the gun has to be racked each shot or not. + var/semi_auto = TRUE + ///Actual magazine currently contained within the gun + var/obj/item/ammo_box/magazine/magazine + ///whether the gun ejects the chambered casing + var/casing_ejector = TRUE + ///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT. + var/internal_magazine = FALSE + ///Phrasing of the bolt in examine and notification messages; ex: bolt, slide, etc. + var/bolt_wording = "bolt" + ///Phrasing of the magazine in examine and notification messages; ex: magazine, box, etx + var/magazine_wording = "magazine" + ///Phrasing of the cartridge in examine and notification messages; ex: bullet, shell, dart, etc. + var/cartridge_wording = "bullet" + ///length between individual racks + var/rack_delay = 5 + ///time of the most recent rack, used for cooldown purposes + var/recent_rack = 0 + ///Whether the gun can be sawn off by sawing tools + var/can_be_sawn_off = FALSE + + ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it + var/tac_reloads = TRUE + ///If we have the 'snowflake mechanic,' how long should it take to reload? + var/tactical_reload_delay = 1 SECONDS + +/* + * Enegry,.. For now +*/ + //What type of power cell this uses + var/obj/item/stock_parts/cell/gun/cell + var/cell_type = /obj/item/stock_parts/cell/gun + var/modifystate = 0 + var/list/ammo_type = list(/obj/item/ammo_casing/energy) + //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. + var/select = 1 + //Can it be charged in a recharger? + var/can_charge = TRUE + //Do we handle overlays with base update_appearance()? + var/automatic_charge_overlays = TRUE + var/charge_sections = 4 + + //if this gun uses a stateful charge bar for more detail + var/shaded_charge = FALSE + var/selfcharge = 0 + var/charge_tick = 0 + var/charge_delay = 4 + //whether the gun's cell drains the cyborg user's cell to recharge + var/use_cyborg_cell = FALSE + //set to true so the gun is given an empty cell + var/dead_cell = FALSE + + ///if the gun's cell cannot be replaced + var/internal_cell = FALSE + + ///if the gun is small and can only fit the small gun cell + var/small_gun = FALSE + //if the gun is big and can fit the comically large gun cell + var/big_gun = FALSE + ///Time it takes to unscrew the cell + var/unscrewing_time = 20 + +/* + * Powered.. For now +*/ + var/obj/item/stock_parts/cell/cell + var/cell_type = /obj/item/stock_parts/cell/gun + var/charge_sections = 3 + // play empty alarm if no battery + var/empty_battery_sound = FALSE + + //if this gun uses a stateful charge bar for more detail + var/shaded_charge = FALSE + //Do we handle overlays with base update_appearance()? + var/automatic_charge_overlays = TRUE + + //if the gun's cell cannot be replaced + var/internal_cell = FALSE + //if the gun is small and can only fit the small gun cell + var/small_gun = FALSE + //if the gun is big and can fit the comically large gun cell + var/big_gun = FALSE + //Time it takes to unscrew the cell + var/unscrewing_time = 2 SECONDS + //Volume of loading/unloading cell sounds + var/sound_volume = 40 + + /obj/item/gun/Initialize() . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 33ad4d2a3b46..94a97a73fe8e 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -9,91 +9,6 @@ has_safety = TRUE safety = TRUE - ///sound when inserting magazine - var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' - ///sound when inserting an empty magazine - var/load_empty_sound = 'sound/weapons/gun/general/magazine_insert_empty.ogg' - ///volume of loading sound - var/load_sound_volume = 40 - ///whether loading sound should vary - var/load_sound_vary = TRUE - ///sound of racking - var/rack_sound = 'sound/weapons/gun/general/bolt_rack.ogg' - ///volume of racking - var/rack_sound_volume = 60 - ///whether racking sound should vary - var/rack_sound_vary = TRUE - ///sound of when the bolt is locked back manually - var/lock_back_sound = 'sound/weapons/gun/general/slide_lock_1.ogg' - ///volume of lock back - var/lock_back_sound_volume = 60 - ///whether lock back varies - var/lock_back_sound_vary = TRUE - ///Sound of ejecting a magazine - var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' - ///sound of ejecting an empty magazine - var/eject_empty_sound = 'sound/weapons/gun/general/magazine_remove_empty.ogg' - ///volume of ejecting a magazine - var/eject_sound_volume = 40 - ///whether eject sound should vary - var/eject_sound_vary = TRUE - ///sound of dropping the bolt or releasing a slide - var/bolt_drop_sound = 'sound/weapons/gun/general/bolt_drop.ogg' - ///volume of bolt drop/slide release - var/bolt_drop_sound_volume = 60 - ///empty alarm sound (if enabled) - var/empty_alarm_sound = 'sound/weapons/gun/general/empty_alarm.ogg' - ///empty alarm volume sound - var/empty_alarm_volume = 70 - ///whether empty alarm sound varies - var/empty_alarm_vary = TRUE - - ///Whether the gun will spawn loaded with a magazine - var/spawnwithmagazine = TRUE - ///Compatible magazines with the gun - var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info - ///Whether the sprite has a visible magazine or not - var/mag_display = FALSE - ///Whether the sprite has a visible ammo display or not - var/mag_display_ammo = FALSE - ///Whether the sprite has a visible indicator for being empty or not. - var/empty_indicator = FALSE - ///Whether the gun alarms when empty or not. - var/empty_alarm = FALSE - ///Do we eject the magazine upon runing out of ammo? - var/empty_autoeject = FALSE - ///Whether the gun supports multiple special mag types - var/special_mags = FALSE - ///The bolt type of the gun, affects quite a bit of functionality, see gun.dm in defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT - var/bolt_type = BOLT_TYPE_STANDARD - ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both. - var/bolt_locked = FALSE - ///Whether the gun has to be racked each shot or not. - var/semi_auto = TRUE - ///Actual magazine currently contained within the gun - var/obj/item/ammo_box/magazine/magazine - ///whether the gun ejects the chambered casing - var/casing_ejector = TRUE - ///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT. - var/internal_magazine = FALSE - ///Phrasing of the bolt in examine and notification messages; ex: bolt, slide, etc. - var/bolt_wording = "bolt" - ///Phrasing of the magazine in examine and notification messages; ex: magazine, box, etx - var/magazine_wording = "magazine" - ///Phrasing of the cartridge in examine and notification messages; ex: bullet, shell, dart, etc. - var/cartridge_wording = "bullet" - ///length between individual racks - var/rack_delay = 5 - ///time of the most recent rack, used for cooldown purposes - var/recent_rack = 0 - ///Whether the gun can be sawn off by sawing tools - var/can_be_sawn_off = FALSE - - ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it - var/tac_reloads = TRUE //Snowflake mechanic no more. - ///If we have the 'snowflake mechanic,' how long should it take to reload? - var/tactical_reload_delay = 1 SECONDS - /obj/item/gun/ballistic/Initialize() . = ..() if (!spawnwithmagazine) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index a7d2190e4631..f4e5c8ec87eb 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -9,37 +9,10 @@ has_safety = TRUE safety = TRUE - - var/obj/item/stock_parts/cell/gun/cell //What type of power cell this uses - var/cell_type = /obj/item/stock_parts/cell/gun - var/modifystate = 0 - var/list/ammo_type = list(/obj/item/ammo_casing/energy) - var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. - var/can_charge = TRUE //Can it be charged in a recharger? - var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_appearance()? - var/charge_sections = 4 ammo_x_offset = 2 - var/shaded_charge = FALSE //if this gun uses a stateful charge bar for more detail - var/selfcharge = 0 - var/charge_tick = 0 - var/charge_delay = 4 - var/use_cyborg_cell = FALSE //whether the gun's cell drains the cyborg user's cell to recharge - var/dead_cell = FALSE //set to true so the gun is given an empty cell - - var/internal_cell = FALSE ///if the gun's cell cannot be replaced - var/small_gun = FALSE ///if the gun is small and can only fit the small gun cell - var/big_gun = FALSE ///if the gun is big and can fit the comically large gun cell - var/unscrewing_time = 20 ///Time it takes to unscrew the cell - - ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it - var/tac_reloads = FALSE - ///If we allow tacitcal reloads, how long should it take to reload? - var/tactical_reload_delay = 1.2 SECONDS - - var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' //Sound when inserting magazine. UPDATE PLEASE - var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' //Sound of ejecting a cell. UPDATE PLEASE - var/sound_volume = 40 //Volume of loading/unloading sounds - var/load_sound_vary = TRUE //Should the load/unload sounds vary? + + tac_reloads = FALSE + tactical_reload_delay = 1.2 SECONDS /obj/item/gun/energy/emp_act(severity) . = ..() diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm index 9a42899f6546..1c95a0b7fb77 100644 --- a/code/modules/projectiles/guns/powered.dm +++ b/code/modules/projectiles/guns/powered.dm @@ -2,21 +2,6 @@ mag_type = /obj/item/ammo_box/magazine/gauss can_suppress = FALSE - var/obj/item/stock_parts/cell/cell - var/cell_type = /obj/item/stock_parts/cell/gun - var/charge_sections = 3 - var/empty_battery_sound = FALSE // play empty alarm if no battery - - var/shaded_charge = FALSE //if this gun uses a stateful charge bar for more detail - var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_appearance()? - - var/internal_cell = FALSE ///if the gun's cell cannot be replaced - var/small_gun = FALSE ///if the gun is small and can only fit the small gun cell - var/big_gun = FALSE ///if the gun is big and can fit the comically large gun cell - var/unscrewing_time = 2 SECONDS ///Time it takes to unscrew the cell - var/sound_volume = 40 //Volume of loading/unloading cell sounds - - /obj/item/gun/ballistic/automatic/powered/Initialize() . = ..() if(cell_type) From 9bac2709f1d51eefabaaae6c64ca71407a6ead7b Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 19 Apr 2024 12:23:21 -0500 Subject: [PATCH 129/206] ALMOST every powered var was a energy var --- code/modules/projectiles/gun.dm | 26 ++---------------------- code/modules/projectiles/guns/powered.dm | 1 + 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 76caceaaf15c..eea4f7a28df9 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -268,6 +268,8 @@ //set to true so the gun is given an empty cell var/dead_cell = FALSE + // play empty alarm if no battery + var/empty_battery_sound = FALSE ///if the gun's cell cannot be replaced var/internal_cell = FALSE @@ -276,34 +278,10 @@ //if the gun is big and can fit the comically large gun cell var/big_gun = FALSE ///Time it takes to unscrew the cell - var/unscrewing_time = 20 - -/* - * Powered.. For now -*/ - var/obj/item/stock_parts/cell/cell - var/cell_type = /obj/item/stock_parts/cell/gun - var/charge_sections = 3 - // play empty alarm if no battery - var/empty_battery_sound = FALSE - - //if this gun uses a stateful charge bar for more detail - var/shaded_charge = FALSE - //Do we handle overlays with base update_appearance()? - var/automatic_charge_overlays = TRUE - - //if the gun's cell cannot be replaced - var/internal_cell = FALSE - //if the gun is small and can only fit the small gun cell - var/small_gun = FALSE - //if the gun is big and can fit the comically large gun cell - var/big_gun = FALSE - //Time it takes to unscrew the cell var/unscrewing_time = 2 SECONDS //Volume of loading/unloading cell sounds var/sound_volume = 40 - /obj/item/gun/Initialize() . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm index 1c95a0b7fb77..cd68c3d444c5 100644 --- a/code/modules/projectiles/guns/powered.dm +++ b/code/modules/projectiles/guns/powered.dm @@ -1,6 +1,7 @@ /obj/item/gun/ballistic/automatic/powered mag_type = /obj/item/ammo_box/magazine/gauss can_suppress = FALSE + charge_sections = 3 /obj/item/gun/ballistic/automatic/powered/Initialize() . = ..() From fecc734655b220fabac166b60ef17344be74e098 Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 19 Apr 2024 12:47:01 -0500 Subject: [PATCH 130/206] formating and combining small_gun and big_gun into mag_size --- code/__DEFINES/gun.dm | 4 ++ code/modules/projectiles/gun.dm | 41 +++++++++---------- .../projectiles/guns/ballistic/automatic.dm | 10 ++--- code/modules/projectiles/guns/energy.dm | 4 +- .../projectiles/guns/energy/energy_gun.dm | 4 +- code/modules/projectiles/guns/energy/laser.dm | 6 +-- code/modules/projectiles/guns/energy/pulse.dm | 2 +- .../projectiles/guns/energy/special.dm | 2 +- .../projectiles/guns/misc/beam_rifle.dm | 2 +- 9 files changed, 39 insertions(+), 36 deletions(-) diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/gun.dm index c5936e6f2d0e..19db84f76655 100644 --- a/code/__DEFINES/gun.dm +++ b/code/__DEFINES/gun.dm @@ -87,6 +87,10 @@ ///ammo box will have a different state for full and empty; -max_ammo and -0 #define AMMO_BOX_FULL_EMPTY 2 +#define MAG_SIZE_SMALL 1 +#define MAG_SIZE_MEDIUM 2 +#define MAG_SIZE_LARGE 3 + //Projectile Reflect #define REFLECT_NORMAL (1<<0) #define REFLECT_FAKEPROJECTILE (1<<1) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index eea4f7a28df9..c44d3c219a1b 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -21,7 +21,7 @@ //trigger guard on the weapon, hulks can't fire them with their big meaty fingers trigger_guard = TRIGGER_GUARD_NORMAL - /// The manufacturer of this weapon. For flavor mostly. If none, this will not show. + ///The manufacturer of this weapon. For flavor mostly. If none, this will not show. var/manufacturer = MANUFACTURER_NONE /* @@ -64,9 +64,9 @@ var/sawn_desc = null var/sawn_off = FALSE - // true if the gun is wielded via twohanded component, shouldnt affect anything else + //true if the gun is wielded via twohanded component, shouldnt affect anything else var/wielded = FALSE - // true if the gun is wielded after delay, should affects accuracy + //true if the gun is wielded after delay, should affects accuracy var/wielded_fully = FALSE ///Slowdown for wielding var/wield_slowdown = 0.1 @@ -78,9 +78,10 @@ /* * Stats */ - var/projectile_damage_multiplier = 1 //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. var/weapon_weight = WEAPON_LIGHT - // Speed someone can be flung if its point blank + //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. + var/projectile_damage_multiplier = 1 + //Speed someone can be flung if its point blank var/pb_knockback = 0 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. @@ -114,32 +115,32 @@ /* * Overlay */ - //used for positioning ammo count overlay on sprite + ///Used for positioning ammo count overlay on sprite var/ammo_x_offset = 0 var/ammo_y_offset = 0 /* * Attachment */ - /// The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED + ///The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED var/list/valid_attachments = list() - /// Reference to our attachment holder to prevent subtypes having to call GetComponent + ///Reference to our attachment holder to prevent subtypes having to call GetComponent var/datum/component/attachment_holder/attachment_holder - /// Maximum number of attachments allowed + ///Maximum number of attachments allowed var/attachment_max = 0 - /// Number of attachments that can fit on a given slot + ///Number of attachments that can fit on a given slot var/list/slot_available = ATTACHMENT_DEFAULT_SLOT_AVAILABLE - /// Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y + ///Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y var/list/slot_offsets = list() /* * Zooming */ - //whether the gun generates a Zoom action on creation + ///Whether the gun generates a Zoom action on creation var/zoomable = FALSE //Zoom toggle var/zoomed = FALSE - //Distance in TURFs to move the user's screen forward (the "zoom" effect) + ///Distance in TURFs to move the user's screen forward (the "zoom" effect) var/zoom_amt = 3 var/zoom_out_amt = 0 var/datum/action/toggle_scope_zoom/azoom @@ -155,7 +156,7 @@ var/safety_wording = "safety" /* - * Ballistic.. For now + * Ballistic... For now */ ///sound when inserting magazine var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' @@ -243,7 +244,7 @@ var/tactical_reload_delay = 1 SECONDS /* - * Enegry,.. For now + * Enegry and powered... For now */ //What type of power cell this uses var/obj/item/stock_parts/cell/gun/cell @@ -268,16 +269,14 @@ //set to true so the gun is given an empty cell var/dead_cell = FALSE - // play empty alarm if no battery + //play empty alarm if no battery var/empty_battery_sound = FALSE ///if the gun's cell cannot be replaced var/internal_cell = FALSE - ///if the gun is small and can only fit the small gun cell - var/small_gun = FALSE - //if the gun is big and can fit the comically large gun cell - var/big_gun = FALSE - ///Time it takes to unscrew the cell + ///Used for large and small cells + var/mag_size = MAG_SIZE_MEDIUM + //Time it takes to unscrew the cell var/unscrewing_time = 2 SECONDS //Volume of loading/unloading cell sounds var/sound_volume = 40 diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 3080e7a97aea..384cfcfa94b8 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -1,6 +1,6 @@ /obj/item/gun/ballistic/automatic w_class = WEIGHT_CLASS_NORMAL - var/select = 1 + var/firemode_select = 1 can_suppress = TRUE burst_size = 3 fire_delay = 2 @@ -23,9 +23,9 @@ /obj/item/gun/ballistic/automatic/update_overlays() . = ..() - if(!select) + if(!firemode_select) . += "[initial(icon_state)]_semi" - if(select == 1) + if(firemode_select == 1) . += "[initial(icon_state)]_burst" /obj/item/gun/ballistic/automatic/ui_action_click(mob/user, actiontype) @@ -36,8 +36,8 @@ /obj/item/gun/ballistic/automatic/proc/burst_select() var/mob/living/carbon/human/user = usr - select = !select - if(!select) + firemode_select = !firemode_select + if(!firemode_select) burst_size = 1 fire_delay = 0 to_chat(user, "You switch to semi-automatic.") diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index f4e5c8ec87eb..2cd7c756d9ed 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -101,10 +101,10 @@ return ..() /obj/item/gun/energy/proc/insert_cell(mob/user, obj/item/stock_parts/cell/gun/C) - if(small_gun && !istype(C, /obj/item/stock_parts/cell/gun/mini)) + if(mag_size == MAG_SIZE_SMALL && !istype(C, /obj/item/stock_parts/cell/gun/mini)) to_chat(user, "\The [C] doesn't seem to fit into \the [src]...") return FALSE - if(!big_gun && istype(C, /obj/item/stock_parts/cell/gun/large)) + if(mag_size == MAG_SIZE_LARGE && !istype(C, /obj/item/stock_parts/cell/gun/large)) to_chat(user, "\The [C] doesn't seem to fit into \the [src]...") return FALSE if(user.transferItemToLoc(C, src)) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 718d691297db..972a0a083893 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -16,7 +16,7 @@ item_state = "gun" w_class = WEIGHT_CLASS_SMALL cell_type = /obj/item/stock_parts/cell/gun/mini - small_gun = TRUE + mag_size = MAG_SIZE_SMALL throwforce = 11 //This is funny, trust me. ammo_x_offset = 2 charge_sections = 3 @@ -180,7 +180,7 @@ item_state = "gun" ammo_x_offset = 2 charge_sections = 6 - small_gun = TRUE + mag_size = MAG_SIZE_SMALL wield_delay = 0.2 SECONDS wield_slowdown = 0.15 diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 31261d31e30c..7d1cf3bc3892 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -85,7 +85,7 @@ icon_state = "lasercannon" item_state = "laser" w_class = WEIGHT_CLASS_BULKY - big_gun = TRUE + mag_size = MAG_SIZE_LARGE cell_type = "/obj/item/stock_parts/cell/gun/large" force = 10 flags_1 = CONDUCT_1 @@ -185,7 +185,7 @@ item_state = "gun" ammo_x_offset = 2 charge_sections = 4 - small_gun = TRUE + mag_size = MAG_SIZE_SMALL w_class = WEIGHT_CLASS_NORMAL cell_type = /obj/item/stock_parts/cell/gun/mini ammo_type = list(/obj/item/ammo_casing/energy/lasergun/hitscan) @@ -219,7 +219,7 @@ icon = 'icons/obj/guns/48x32guns.dmi' icon_state = "e50" - big_gun = TRUE + mag_size = MAG_SIZE_LARGE cell_type = /obj/item/stock_parts/cell/gun/large ammo_type = list(/obj/item/ammo_casing/energy/laser/eoehoma/e50) weapon_weight = WEAPON_HEAVY diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 9a38625ac629..077686b7b87c 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -33,7 +33,7 @@ icon_state = "pulse_carbine" item_state = null internal_cell = FALSE - big_gun = TRUE //haha gun go brr + mag_size = MAG_SIZE_LARGE //haha gun go brr cell_type = /obj/item/stock_parts/cell/gun/large ammo_x_offset = 2 charge_sections = 4 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d655f2a0e232..af094d2410b3 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -7,7 +7,7 @@ ammo_x_offset = 2 ammo_y_offset = 2 w_class = WEIGHT_CLASS_HUGE - big_gun = TRUE //yes, you can put the comically large cell in it. No, you aren't getting it roundstart. You slut. + mag_size = MAG_SIZE_LARGE //yes, you can put the comically large cell in it. No, you aren't getting it roundstart. You slut. flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/ion) diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 8b6626bc5e97..b131b03ec148 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -29,7 +29,7 @@ w_class = WEIGHT_CLASS_BULKY ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan) internal_cell = FALSE //prevents you from giving it an OP cell - WS Edit //shut up dumb nerd - big_gun = TRUE + mag_size = MAG_SIZE_LARGE cell_type = "/obj/item/stock_parts/cell/gun/large" canMouseDown = TRUE var/aiming = FALSE From 848ee9bff4c917f7e9b3023d5514aa91c5557fdf Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 19 Apr 2024 12:59:02 -0500 Subject: [PATCH 131/206] adds bool for toggling and wish for death looking at powered --- code/datums/components/attachment.dm | 8 +++++--- code/game/objects/items/attachments/silencer.dm | 6 ------ code/modules/projectiles/gun.dm | 2 -- code/modules/projectiles/guns/powered.dm | 12 ++++++------ 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index eea15310e14a..0372dce0dd84 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -53,6 +53,7 @@ var/datum/callback/on_toggle var/datum/callback/on_preattack var/list/datum/action/actions + var/has_toggle = FALSE /datum/component/attachment/Initialize( slot = ATTACHMENT_SLOT_RAIL, @@ -74,10 +75,11 @@ src.on_toggle = on_toggle src.on_preattack = on_preattack - ADD_TRAIT(parent, TRAIT_ATTACHABLE, src) + ADD_TRAIT(parent, TRAIT_ATTACHABLE, REF(src)) RegisterSignal(parent, COMSIG_ATTACHMENT_ATTACH, PROC_REF(try_attach)) RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, PROC_REF(try_detach)) - RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, PROC_REF(try_toggle)) + if(has_toggle) + RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, PROC_REF(try_toggle)) RegisterSignal(parent, COMSIG_ATTACHMENT_PRE_ATTACK, PROC_REF(relay_pre_attack)) RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, PROC_REF(update_overlays)) RegisterSignal(parent, COMSIG_ATTACHMENT_GET_SLOT, PROC_REF(send_slot)) @@ -86,7 +88,7 @@ RegisterSignal(parent, signal, signals[signal]) /datum/component/attachment/Destroy(force, silent) - REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, src) + REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, REF(src)) if(actions && length(actions)) var/obj/item/gun/parent = src.parent parent.actions -= actions diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index 26ae423c48e7..0a76aed7def9 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -11,12 +11,6 @@ return FALSE gun.suppressed = TRUE -/obj/item/attachment/silencer/Toggle(obj/item/gun/gun, mob/user) - . = ..() - // TODO: Consider making attachments that dont toggle a custom subtype - if(toggled) - Toggle(gun, user) - /obj/item/attachment/silencer/Detach(obj/item/gun/gun, mob/user) . = ..() if(!gun.can_unsuppress) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index c44d3c219a1b..8d56b964c5e0 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -321,8 +321,6 @@ QDEL_NULL(chambered) if(azoom) QDEL_NULL(azoom) - if(isatom(suppressed)) //SUPPRESSED IS USED AS BOTH A TRUE/FALSE AND AS A REF, WHAT THE FUCKKKKKKKKKKKKKKKKK - QDEL_NULL(suppressed) if(muzzle_flash) QDEL_NULL(muzzle_flash) return ..() diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm index cd68c3d444c5..658ae1bacf5a 100644 --- a/code/modules/projectiles/guns/powered.dm +++ b/code/modules/projectiles/guns/powered.dm @@ -47,20 +47,20 @@ return ..() /obj/item/gun/ballistic/automatic/powered/proc/insert_cell(mob/user, obj/item/stock_parts/cell/gun/C) - if(small_gun && !istype(C, /obj/item/stock_parts/cell/gun/mini)) - to_chat(user, "[C] doesn't seem to fit into [src]...") + if(mag_size == MAG_SIZE_SMALL && !istype(C, /obj/item/stock_parts/cell/gun/mini)) + to_chat(user, "\The [C] doesn't seem to fit into \the [src]...") return FALSE - if(!big_gun && istype(C, /obj/item/stock_parts/cell/gun/large)) - to_chat(user, "[C] doesn't seem to fit into [src]...") + if(mag_size == MAG_SIZE_LARGE && !istype(C, /obj/item/stock_parts/cell/gun/large)) + to_chat(user, "\The [C] doesn't seem to fit into \the [src]...") return FALSE if(user.transferItemToLoc(C, src)) cell = C - to_chat(user, "You load [C] into [src].") + to_chat(user, "You load the [C] into \the [src].") playsound(src, load_sound, sound_volume, load_sound_vary) update_appearance() return TRUE else - to_chat(user, "You cannot seem to get [src] out of your hands!") + to_chat(user, "You cannot seem to get \the [src] out of your hands!") return FALSE /obj/item/gun/ballistic/automatic/powered/proc/eject_cell(mob/user, obj/item/stock_parts/cell/gun/tac_load = null) From c4b04926d1a87d313e7ce7525185ff78f2fae441 Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 19 Apr 2024 13:13:11 -0500 Subject: [PATCH 132/206] right --- code/datums/components/attachment.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 0372dce0dd84..b9565c020ec5 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -75,7 +75,7 @@ src.on_toggle = on_toggle src.on_preattack = on_preattack - ADD_TRAIT(parent, TRAIT_ATTACHABLE, REF(src)) + ADD_TRAIT(parent, TRAIT_ATTACHABLE, "attachable") RegisterSignal(parent, COMSIG_ATTACHMENT_ATTACH, PROC_REF(try_attach)) RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, PROC_REF(try_detach)) if(has_toggle) @@ -88,7 +88,7 @@ RegisterSignal(parent, signal, signals[signal]) /datum/component/attachment/Destroy(force, silent) - REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, REF(src)) + REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, "attachable") if(actions && length(actions)) var/obj/item/gun/parent = src.parent parent.actions -= actions From d009f2d73b8f53bec64be73b4f5ace1521ea4f79 Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 19 Apr 2024 13:21:24 -0500 Subject: [PATCH 133/206] stuff --- code/datums/components/attachment.dm | 4 +++- code/game/objects/items/attachments/_attachment.dm | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index b9565c020ec5..e4a449dd4f7d 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -47,16 +47,17 @@ /datum/component/attachment var/slot + var/has_toggle var/list/valid_parent_types var/datum/callback/on_attach var/datum/callback/on_detach var/datum/callback/on_toggle var/datum/callback/on_preattack var/list/datum/action/actions - var/has_toggle = FALSE /datum/component/attachment/Initialize( slot = ATTACHMENT_SLOT_RAIL, + has_toggle = FALSE, valid_parent_types = list(/obj/item/gun), datum/callback/on_attach = null, datum/callback/on_detach = null, @@ -69,6 +70,7 @@ return COMPONENT_INCOMPATIBLE src.slot = slot + src.has_toggle = has_toggle src.valid_parent_types = valid_parent_types src.on_attach = on_attach src.on_detach = on_detach diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index fb02d55b8c35..b04b7b98caf6 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -7,6 +7,7 @@ var/list/valid_parents = list() var/list/signals = list() + var/has_toggle = FALSE var/toggled = FALSE var/datum/component/attachment/attachment_comp From 552204dac4795fd121d13404c46983cf9498b8d9 Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 19 Apr 2024 13:36:59 -0500 Subject: [PATCH 134/206] hoepfully it gets garbo colllected now? --- code/game/objects/items/attachments/_attachment.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index b04b7b98caf6..d7376a19f5ae 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -17,6 +17,7 @@ attachment_comp = AddComponent( \ /datum/component/attachment, \ slot, \ + has_toggle, \ valid_parents, \ CALLBACK(src, PROC_REF(Attach)), \ CALLBACK(src, PROC_REF(Detach)), \ @@ -24,6 +25,9 @@ CALLBACK(src, PROC_REF(PreAttack)), \ signals) +/obj/item/attachment/Destroy() + qdel(attachment_comp) + /obj/item/attachment/proc/Toggle(obj/item/gun/gun, mob/user) SHOULD_CALL_PARENT(TRUE) From fa0b97224a0541a506af05d21cf0dc769a012507 Mon Sep 17 00:00:00 2001 From: fallcon Date: Fri, 19 Apr 2024 13:54:08 -0500 Subject: [PATCH 135/206] kill him --- code/game/objects/items/attachments/_attachment.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index d7376a19f5ae..8efda6642de3 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -27,6 +27,8 @@ /obj/item/attachment/Destroy() qdel(attachment_comp) + attachment_comp = NULL + . = ..() /obj/item/attachment/proc/Toggle(obj/item/gun/gun, mob/user) SHOULD_CALL_PARENT(TRUE) From 6fbd0f154107d10d1433037fcb9376646def555d Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 20 Apr 2024 20:19:31 -0500 Subject: [PATCH 136/206] yea --- code/game/objects/items/attachments/_attachment.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index 8efda6642de3..29a7001ee9b3 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -27,7 +27,7 @@ /obj/item/attachment/Destroy() qdel(attachment_comp) - attachment_comp = NULL + attachment_comp = null . = ..() /obj/item/attachment/proc/Toggle(obj/item/gun/gun, mob/user) From e895ad138b2b9ffc16c7dda211617b2f38586058 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 21 Apr 2024 19:49:19 -0500 Subject: [PATCH 137/206] yea --- code/game/objects/items/attachments/bayonet.dm | 1 + code/game/objects/items/attachments/laser_sight.dm | 1 + code/game/objects/items/attachments/rail_light.dm | 1 + code/game/objects/items/attachments/silencer.dm | 1 + 4 files changed, 4 insertions(+) diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 13cf35aace31..e8b0e19fa03a 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -4,6 +4,7 @@ icon_state = "ebayonet" force = 2 + has_toggle = TRUE var/force_on = 20 var/extended = FALSE var/reach_extended = 2 diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm index 883869312f58..d461ac41d87e 100644 --- a/code/game/objects/items/attachments/laser_sight.dm +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -2,6 +2,7 @@ name = "Laser Sight" desc = "This laser sight is designed to be rail-mounted on a compatible firearm to provide increased accuracy." icon_state = "laserpointer" + has_toggle = TRUE /obj/item/attachment/laser_sight/Toggle(obj/item/gun/gun, mob/user) . = ..() diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm index 9e2054367c07..ea47c792f510 100644 --- a/code/game/objects/items/attachments/rail_light.dm +++ b/code/game/objects/items/attachments/rail_light.dm @@ -2,6 +2,7 @@ name = "Rail Light" desc = "Rail mounted gun light for better visibility down range." icon_state = "raillight" + has_toggle = TRUE light_color = "#FFCC66" light_system = MOVABLE_LIGHT_DIRECTIONAL diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index 0a76aed7def9..1dc5cc4a15d0 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -3,6 +3,7 @@ desc = "For when you need to kill someone but not be seen killing someone!" icon_state = "silencer" slot = ATTACHMENT_SLOT_MUZZLE + has_toggle = TRUE /obj/item/attachment/silencer/Attach(obj/item/gun/gun, mob/user) . = ..() From d589f5c58f04327175d5e0a7b5f6ef69718bd058 Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 23 Apr 2024 09:06:10 -0500 Subject: [PATCH 138/206] can suprres junk --- code/game/objects/items/attachments/silencer.dm | 6 ------ code/modules/projectiles/gun.dm | 2 -- code/modules/projectiles/guns/ballistic/assault.dm | 1 - code/modules/projectiles/guns/ballistic/automatic.dm | 6 ------ code/modules/projectiles/guns/ballistic/gauss.dm | 1 - code/modules/projectiles/guns/ballistic/hmg.dm | 1 - code/modules/projectiles/guns/ballistic/launchers.dm | 1 - code/modules/projectiles/guns/ballistic/pistol.dm | 8 -------- code/modules/projectiles/guns/ballistic/shotgun.dm | 1 - code/modules/projectiles/guns/ballistic/smg.dm | 2 -- code/modules/projectiles/guns/ballistic/toy.dm | 4 ---- code/modules/projectiles/guns/misc/syringe_gun.dm | 1 - code/modules/projectiles/guns/powered.dm | 1 - 13 files changed, 35 deletions(-) diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index 1dc5cc4a15d0..e55d04e0864f 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -7,15 +7,9 @@ /obj/item/attachment/silencer/Attach(obj/item/gun/gun, mob/user) . = ..() - if(!gun.can_suppress) - to_chat(user, "You cannot attach [src] to [gun]!") - return FALSE gun.suppressed = TRUE /obj/item/attachment/silencer/Detach(obj/item/gun/gun, mob/user) . = ..() - if(!gun.can_unsuppress) - to_chat(user, "You cannot detach [src] from [gun]!") - return FALSE gun.suppressed = FALSE return TRUE diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8d56b964c5e0..05de34ba41a9 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -56,10 +56,8 @@ */ //whether or not a message is displayed when fired var/suppressed = null - var/can_suppress = FALSE var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' var/suppressed_volume = 60 - var/can_unsuppress = TRUE //description change if weapon is sawn-off var/sawn_desc = null var/sawn_off = FALSE diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm index d0b69480a106..14957d6d0709 100644 --- a/code/modules/projectiles/guns/ballistic/assault.dm +++ b/code/modules/projectiles/guns/ballistic/assault.dm @@ -163,7 +163,6 @@ icon_state = "e40" item_state = "e40" mag_type = /obj/item/ammo_box/magazine/e40 - can_suppress = FALSE actions_types = list(/datum/action/item_action/toggle_firemode) var/obj/item/gun/energy/laser/e40_laser_secondary/secondary diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 384cfcfa94b8..f859e2d9d474 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -1,7 +1,6 @@ /obj/item/gun/ballistic/automatic w_class = WEIGHT_CLASS_NORMAL var/firemode_select = 1 - can_suppress = TRUE burst_size = 3 fire_delay = 2 actions_types = list(/datum/action/item_action/toggle_firemode) @@ -89,8 +88,6 @@ /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate name = "syndicate sniper rifle" desc = "A heavily-modified .50 BMG anti-material rifle utilized by Syndicate agents. Requires both hands to fire." - can_suppress = TRUE - can_unsuppress = TRUE // Old Semi-Auto Rifle // @@ -103,8 +100,6 @@ mag_type = /obj/item/ammo_box/magazine/m10mm/rifle fire_delay = 10 burst_size = 1 - can_unsuppress = TRUE - can_suppress = TRUE w_class = WEIGHT_CLASS_HUGE slot_flags = ITEM_SLOT_BACK actions_types = list() @@ -119,7 +114,6 @@ item_state = "arg" mag_type = /obj/item/ammo_box/magazine/recharge fire_delay = 2 - can_suppress = FALSE burst_size = 0 actions_types = list() fire_sound = 'sound/weapons/laser.ogg' diff --git a/code/modules/projectiles/guns/ballistic/gauss.dm b/code/modules/projectiles/guns/ballistic/gauss.dm index 8fce353d8b22..6e280388a1e3 100644 --- a/code/modules/projectiles/guns/ballistic/gauss.dm +++ b/code/modules/projectiles/guns/ballistic/gauss.dm @@ -7,7 +7,6 @@ mag_type = /obj/item/ammo_box/magazine/gauss fire_sound = 'sound/weapons/gun/gauss/magrifle.ogg' load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg' - can_suppress = FALSE burst_size = 1 fire_delay = 3 spread = 0 diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm index ce66281afdba..f5e3a05518ab 100644 --- a/code/modules/projectiles/guns/ballistic/hmg.dm +++ b/code/modules/projectiles/guns/ballistic/hmg.dm @@ -153,7 +153,6 @@ item_state = "l6closedmag" base_icon_state = "l6" mag_type = /obj/item/ammo_box/magazine/mm712x82 - can_suppress = FALSE spread = 7 bolt_type = BOLT_TYPE_OPEN mag_display = TRUE diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 01644cd6e9bb..5bebc8ec1251 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -48,7 +48,6 @@ fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg' load_sound = 'sound/weapons/gun/general/rocket_load.ogg' w_class = WEIGHT_CLASS_BULKY - can_suppress = FALSE burst_size = 1 fire_delay = 0 casing_ejector = FALSE diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index c6d1a94b0dd2..c13b28e164aa 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -4,7 +4,6 @@ icon_state = "pistol" w_class = WEIGHT_CLASS_SMALL mag_type = /obj/item/ammo_box/magazine/m10mm - can_suppress = TRUE burst_size = 1 fire_delay = 0 //spam it as fast as you can actions_types = list() @@ -53,7 +52,6 @@ item_state = "hp_generic" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/m45 - can_suppress = FALSE fire_sound = 'sound/weapons/gun/pistol/candor.ogg' rack_sound = 'sound/weapons/gun/pistol/candor_cocked.ogg' lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' @@ -85,7 +83,6 @@ icon_state = "deagle" force = 14 mag_type = /obj/item/ammo_box/magazine/m50 - can_suppress = FALSE mag_display = TRUE fire_sound = 'sound/weapons/gun/pistol/deagle.ogg' rack_sound = 'sound/weapons/gun/pistol/rack.ogg' @@ -118,7 +115,6 @@ icon_state = "aps" w_class = WEIGHT_CLASS_SMALL mag_type = /obj/item/ammo_box/magazine/pistolm9mm - can_suppress = FALSE burst_size = 3 fire_delay = 2 actions_types = list(/datum/action/item_action/toggle_firemode) @@ -129,7 +125,6 @@ icon_state = "commander" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/co9mm - can_suppress = FALSE manufacturer = MANUFACTURER_NANOTRASEN fire_sound = 'sound/weapons/gun/pistol/commander.ogg' load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' @@ -156,7 +151,6 @@ icon_state = "commander" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/co9mm - can_suppress = FALSE var/funnysounds = TRUE var/cooldown = 0 load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' @@ -242,7 +236,6 @@ w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/disposable custom_materials = list(/datum/material/plastic=2000) - can_suppress = FALSE manufacturer = MANUFACTURER_NONE has_safety = FALSE //thing barely costs anything, why would it have a safety? safety = FALSE @@ -304,7 +297,6 @@ icon_state = "himehabu" w_class = WEIGHT_CLASS_TINY mag_type = /obj/item/ammo_box/magazine/m22lr - can_suppress = FALSE fire_sound = 'sound/weapons/gun/pistol/himehabu.ogg' recoil = -2 diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 58873cf387e2..6daa99f4bd30 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -208,7 +208,6 @@ inhand_y_dimension = 32 weapon_weight = WEAPON_MEDIUM mag_type = /obj/item/ammo_box/magazine/m12g - can_suppress = FALSE burst_size = 1 fire_delay = 0 fire_sound = 'sound/weapons/gun/shotgun/bulldog.ogg' diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index e4f7d30b2f88..6d35883f53d9 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -139,7 +139,6 @@ icon_state = "m90" item_state = "m90" mag_type = /obj/item/ammo_box/magazine/m556 - can_suppress = FALSE actions_types = list(/datum/action/item_action/toggle_firemode) var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel burst_size = 3 @@ -209,7 +208,6 @@ icon_state = "firestorm" item_state = "firestorm" mag_type = /obj/item/ammo_box/magazine/c45_firestorm_mag - can_suppress = FALSE special_mags = TRUE burst_size = 1 actions_types = list() diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 95911c9269bc..0712b208b531 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -8,7 +8,6 @@ force = 0 throwforce = 0 burst_size = 3 - can_suppress = TRUE item_flags = NONE casing_ejector = FALSE manufacturer = MANUFACTURER_NANOTRASEN @@ -50,7 +49,6 @@ fire_sound = 'sound/items/syringeproj.ogg' item_flags = NONE casing_ejector = FALSE - can_suppress = FALSE pb_knockback = 0 recoil = -10 //its a toy... recoil_unwielded = -10 @@ -81,7 +79,6 @@ /obj/item/gun/ballistic/automatic/smg/c20r/toy name = "donksoft SMG" desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up." - can_suppress = FALSE item_flags = NONE mag_type = /obj/item/ammo_box/magazine/toy/smgm45 fire_sound = 'sound/items/syringeproj.ogg' @@ -101,7 +98,6 @@ name = "donksoft LMG" desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up." fire_sound = 'sound/items/syringeproj.ogg' - can_suppress = FALSE item_flags = NONE mag_type = /obj/item/ammo_box/magazine/toy/m762 casing_ejector = FALSE diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index 96927eb91afc..405cdda0ad28 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -80,7 +80,6 @@ w_class = WEIGHT_CLASS_SMALL force = 2 //Also very weak because it's smaller suppressed = TRUE //Softer fire sound - can_unsuppress = FALSE //Permanently silenced /obj/item/gun/syringe/dna name = "modified syringe gun" diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm index 658ae1bacf5a..85c4566060dc 100644 --- a/code/modules/projectiles/guns/powered.dm +++ b/code/modules/projectiles/guns/powered.dm @@ -1,6 +1,5 @@ /obj/item/gun/ballistic/automatic/powered mag_type = /obj/item/ammo_box/magazine/gauss - can_suppress = FALSE charge_sections = 3 /obj/item/gun/ballistic/automatic/powered/Initialize() From 151a4c8cefbe6a6e8de224c93ddd4fb9c57378ee Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 23 Apr 2024 09:08:55 -0500 Subject: [PATCH 139/206] attachment orginize --- .../objects/items/attachments/_attachment.dm | 2 +- icons/obj/attachments.dmi | Bin 2714 -> 0 bytes icons/obj/guns/attachments.dmi | Bin 0 -> 3113 bytes icons/obj/guns/bayonets.dmi | Bin 263 -> 0 bytes icons/obj/guns/energy.dmi | Bin 49502 -> 45729 bytes icons/obj/guns/flashlights.dmi | Bin 660 -> 0 bytes 6 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 icons/obj/attachments.dmi create mode 100644 icons/obj/guns/attachments.dmi delete mode 100644 icons/obj/guns/bayonets.dmi delete mode 100644 icons/obj/guns/flashlights.dmi diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index 29a7001ee9b3..f1ef4e0c7953 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -1,7 +1,7 @@ /obj/item/attachment name = "broken attachment" desc = "alert coders" - icon = 'icons/obj/attachments.dmi' + icon = 'icons/obj/guns/attachments.dmi' var/slot = ATTACHMENT_SLOT_RAIL var/list/valid_parents = list() diff --git a/icons/obj/attachments.dmi b/icons/obj/attachments.dmi deleted file mode 100644 index fdb8e1f24b723bd5cbf494ce16042f9c28d7fb5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2714 zcmcJQX*kVi~2DqSmpKu@h}AK`EtbFN4H347FB+HbO$HwXa3h5<5kr9ksN! z)V|eD6v0?ZXc)Nsy~T8XMansU*8btOHn+w7M&)ikI|I%-K(s~0#&9kc7R79aPZ=?trillk% z@trEED2dn}atI3)MugR;O3e5x2<{plVV9#|M+pkD9KyHfr1&a;}{HQULIb@MXmqT(sWi;l9ugBZnZq zeB=V=%`(UHrT)ZRf7H9*bq4B8EAzQ-DoV2q11zfT|C20LWvcHkHh#Wf)Ixd6_7n!x z%JrBW1_FLvVbiphmsW(*wDL*G6gQJ4nwK;ns?vD*0&p06SV;|@%EWNSQ~rE%?x=Q5bSsw&+_m9Kt~VHcJRmr>(iT76x>_nzfGFMuL@7$Y)b~HD zCi742GF+RNe+j(5WHbTJjS?LtngNi=4pr>!Wxgj{6Dw`@hl^3j=&7tz@;x9-Y;bs+ z>SJjF8^9SgbU#K^wSxy_TgU-)iD5_13^=(zuA;_A(5OuIZ~n8WnsZD{_f>ysh<%r2 zzxQkQ4u4w9i^o~4v+Z$Gjwhb+NQ#G>2LZ>Wzz0e%iL_1>mVHkuyx*qloT#T7-gVn% zVkt~}b^~eUk1~_7b>?z0keK=n_M7o@sSoy{=RahYeTC-f#i`M-ku9C&b{K(C6(&MX zBbXF?n&>zIrPg#i>Yse*VV=ht6slcHF@qUOwXu%*h2y^^49jz$3DitxOn$8xFMIEG zvUpTKV8bz6*eI+2b&EE!4$r_NTBBBv$(b+Fx88Q|ADryd8}tksL+VvsNO%dZx;)$9 zrXcz4Mg8uDXBbYmp8i~@q53oksPU^gc;NzW2n1WFQ zZ?MS3ESdG}s?OaLGmm(W1PjkHD+gIEOf!e*_M`{(ZaOSH%S2m{ZtR#ijS4y$divbz z?0A#-yE5wxNM0bUP=nzEysIXZ7VkRBxL@8uiBSZc#gOU)(G3L{F3)Bd)NuvJ8dP*g zb57jBXuUaXj`C8AYZsB9q$S=V|G3m0PJOq0eC!O~WEo4WSrg7&W4t{{igxQd69+~J z`sL#jA0uf_H%73^mfJF5)9Ye%_ML43PA4R>aQgGgttdcmqRS1~2>8VM1GGLaM4@Ip zbzvlpnN_>*AA$vz@1RpM`QV`q;@a**z|YKaolMgz9@l;qVOoh{v!ysCf;_8d3JOr~ zv^k!KGC8l(A1tb&>l15AF&g~x*fji!Zx+v*U08!{*S9i^hB58(Bjy2ME3n9A0P{_! z^_~Ysn01&Mgp3~ltWs2S;&cogANPibF^9Y6{nNs+Qf)fj2ER~AKAO9)k$@;HY|;7zGGIQ z;tgZA@0!oCQMlEYuufdbMcC2jC4Vy-AudwL|0LBq2RoU~#{F%woApyA>e)nw)Wsv| zDlZ~`H0T%OCZ3PkYKp6QsAfv=kaOU14Ng%KV@>4V`&CV)983~-Rh#}USIOw{s!<_+ zqzGG~3f80RLmoqNXLLKCCkRGEoN_+hJ>m##F;^$E(D z2FZwgL}{%+VQhpN@^|dbH6ej)S{{&9h@gsRM9dXnUfEaE!_XrhB87~(;-KyU@yLc4 zwHS&~x2ST51DLzl9G8y%5*W+>kl!Q9VmbHJ=X`!BKmLd*NwGsYJ<)_gfz1C0v~L+= zB?FHQ6xXbb7=Hw%Z&bRZ5g3iOzx;MoCD+n}(bpPsD?2+oS4*#6LZxtoy^@CrI_WJKQzsxXH}Knp&xtPwbFRgRp-)t)hf1Gl#A1kX>9Q zbkcC+%iqwSCSS{hZGXoVa`aGEQD;ZVM7{KlofE67X(7u2Bu9~2o9oXxJNHv_M*~;v zvx)OUVH`h3t#?4g1y=pM51SpsXO6I)-Kv0#y_5s=iTDa~Z+m6$%#~15Qu5^8IwZ#L zdID!loMC5<>*C#*xRC;JK?oH6EX1&I`0e*&Nr4YoFe>5g+s1L`_ps1Tk{W?I*Hl=7 zmETTL>S6*j-~SF()tI@2=%C)yFIW!;Be(v0&sX2k;`);SPugEB8(`i%G_wfh1tcrETON<70yVR&cVK%@BC?& z!sfB`4chq)xrSWyFWEt=ujmM z&ZFMwT1tjk^jx8eW~sNFUMnCY{C>#J>wN~rU!HEx7GyyHxbUmDkRtB8pK5r_kr{rj zge#Q70H(mL3BbSZPG;eAD0B=^r-7WO1E*}S9JLn4$miZC%#&FZQ n;=$CIuzLC_a*F62PNz%0I3R8$y5Cb`tZm??*=x^0ymRnZS++op>=}SraHHX>$YixYCJ_cl& zewXF5eCCFm`KGbd5m&;)H)vA!fGqBzZ;EQ zTuJz%Iw58HsRZ23w#{ufoe*%=+EQQ~5{VaCiN8EeB_-SfFht$ixNuI3N=L^^Gt$$s zd|I$w7#+{Eez6COqLw`DOwcjW_8*ecn{s^!1iH?5Ka6)6TXYmHPq6-!OA&ipBmPND zl4(9y0x1MA@`7dwr~~g`4TEOBWDN2c7N{MIWo;`*84ff1%3Kq!T0Ci*_t?L@D5Qm4ix5Gl$8VQ;=T8<%po}PCAqFuM}XXu9585v8pwMAL~hJG0SjHhzw z$B z6^$EEYy*Oto->b;Yx~}w$mKHHq&ws4cpRULs#>MJhxM0aN7(7|$6SXV&HZ$4J62r? zI89a=byQ|`{@jBY|J2YjVnjsBbgz164~OYX170sGmDCB06Yf<}l(^I%IqurSYirb; zzf;g?bOmW0zpGc|7F$EQ{V_|GNY!(~kQy^la2&P34IrzyPd zKYAGxy-z!63R;)xa^0mfNwpFq-?`JKQtu;O`JU;qr`yQO;xcu3QlhX@u2v{XHDq(* zrY!jjZn5af6_MM=?>`?PW66KQ2JH>8R+-jlucs`@aBf{$N9^T56PMBUHVRG7reX(6 zZOGd5n2>O6JJM?ZJxQKMJ6E!E_%v|k%V?d;NVOBr2w{;|aQCv{__E&_dn}Db7;Yi*!k4|>oQ%tHvWSEqJ&J~hh@`Co z#qia~h^|rKFYH&z;FA*iOe1XrejVq4Jd7qrwMvDy`n^!m%=@-pMoM6m#_A73>I3wB z8S-y`=PZ#WsAFq$l#Y{!WT`RBCU;t(R6!MGy(!qQJQSNi9Y4tKmzTUi3Jpv(5_~~U ze!QY=$78@)P?HuPq~E!ybB3dBjz}plbD82+MLi2jE|-}7RN?AyH(s%PSS+{%@nrIe zaN0o?zCfXHtlMm+78ajKg;aN zl9AfA*{nRXM00_r({@m*`j2<_DKT&L{hi9Ow_}#YCM|MT-HV&Y?+L3`EQ&mT|3cNGu#aL`qG{ z(*ftZ#hy;MOSWmwb}f9~J}jb!jmx%m3HST_Uh7!)JpxmMf-0=Bx5C<4$x-q~<1@)O ziVNQYqv1EPJ421~;=VBFTk_HB|887w^cpe_oDK56`wfDPKfsNvwi==x%~{UneVS%C zA|h9F&;s=f462DRJxdp}7X!;~y!GyY%+*HFzI2~QGX)n) za*^oGq3v^dcG|sDb42{}gvy+AYvLPv7H&vOdR=fYzrm~ci1e{?qA=Awz%okRny8O! z$xu|lB4L3fvY+#lNmX&ez5{f@mpy-cnOv{gkkzkH8OiRe-B(y8fbVQ^pzs zuj@H_Wn*N9jkorsaI*{RE0iK*tU%h2b>n{j$K(d3l}t`*%oDM?iCij^A(K!bS>e38 zI_(ci_4%mH7LCRDfj8bnt`h8vrK13(|3XyM3kmWv(Xp35i$L^LlZjU7Hyq?tvJpwK zqIaZpWx>qJwW@F%YHc`eJ8d{DUH*$QKx*TwSbHE*>em5a{CiyE8KT>s)NTqwYV#{s zZ_ZH8H!XIF2O=ptXdg5W6)I456wvFR1iNZh${&w#?gIR0Gyl7w|0ocH`y>*`kr1Ta zVM{m3u|;;Pvsn`FcmC`X?&jmOWi5FracXihByA=_Z?ML;#qTKOs-FX18qccsF8)0; zt`zbbe$Bm;wE5eZSnESlIOO*sbK9IcwxIz$wn|$Y@t-V9y|o2`m-l<}=B-)rr&o+$ z*Lpg6yOXUwu+V1qms^oQb!txt(Seh6gul*JQ9b_KKYIEO=4(#<v$AURT3zD9KDmZU+i49h!*+OKN1UVO3Gyo^UqRx8ufA8tvuj~Ka-Tmu_x9gp57uQV4{W*~N78rm z{tVP{fdApv*HWrJA%h z80gId#0BH&0WnuNIsa*FK0Y~W(UVOa3UxPurufc&4hJ6frb~SHp47v=p?Qdy>>LeD z&(*2TH8nh0TfrpD4eZRf$Yy3{-dGa>!+!L6vk!h2rcp&ErWw& Le^0Mg_aWk6No(lQ literal 0 HcmV?d00001 diff --git a/icons/obj/guns/bayonets.dmi b/icons/obj/guns/bayonets.dmi deleted file mode 100644 index 32b5448b8edc84a3cbc8ff700fadcb57e81b943d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*8>L*OrN{f%_Yd#&|XaK~d@VFTn*L zzdq6O*3~+9=6vvmP=kxc4<6~9_t8AbP}I}A!@@Yo__DE=!kkBwj!X(s2-eixXk@Ry z)uprBSatIX35}!^M`wmjnK7FyQCoY*ubmCNYz$Q|r2ew}&j|xstK;e77@{#TIYEN; zuo%ao28IxanKvalrcPl>)M}dIaDe4pdO#r%@QSv4W?WX!%6q)%pe|4!gQu&X%Q~lo FCIE^xUJC#K diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 3208083cd0bd3d46d3ac5b4c2bd033f44bc23ba0..6e30eb3f242e207dcb9bc337d5ee1eefacc8996d 100644 GIT binary patch literal 45729 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 literal 49502 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≺fWG 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 O_vnF|VxhcA!2bYTaN}A4 diff --git a/icons/obj/guns/flashlights.dmi b/icons/obj/guns/flashlights.dmi deleted file mode 100644 index eef6d953f94a53b63fc3346fd27240336082d8b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 660 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=%~c^0B`&GO$wiq3C7Jno3=9=> zg2M`mO22;zF8KKMiI%sn*10q1gExd4Tr__0Nawtd=E(pc$L!IgGahGs&TBLlba@MT z2Z`p0PPtTMblKQz$_|TQqwX%C0MAZ~%Uwdn!HPL1sULqeZuZJ-$7~qox=+cdRCK+I zdvPsq5AWRsh2*90bY^y4Ipg@p=cRB;O0l}TgQIWuB>ySZDlAMBtBX3O9$aD3S9sdw z22+j-Lv%wgO9Ji&Lo`Sng~spoCkYZ)0Lr^P0ni>!HGt>388b!BDzZQe4a z(2v)DPLE<*_2%1-=>LHtu}?1j);%V%`|cTr2S1eq_22yk+E_cy`6a{usjK(%{!+s3 zW`Z6wmtVliu=wJMXO;in9)4L8b=vO1%Aco8m}K5EhdCx&$cWuO&A(QRL4kv5$;(Bj zcCs#irhl1J$BMzAtiEGKSF`GeZMQ=$U%N|u?q+Zl5b3u$fAQ_NY|)$Z>+jdL9O7D$ o$O#N}em&;}`?kJMIQO3^xO$(nR_wXyz+}eY>FVdQ&MBb@00lJ}N&o-= From f67ca1dfbbb4209e1724500f06b220048159db75 Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 23 Apr 2024 09:48:27 -0500 Subject: [PATCH 140/206] stuff --- code/__DEFINES/gun.dm | 50 ++++++++++++++++ code/datums/components/attachment_holder.dm | 7 ++- code/game/objects/items/attachments/scope.dm | 53 ++++++++++++++++ code/modules/projectiles/gun.dm | 60 +------------------ code/modules/projectiles/guns/ballistic.dm | 10 ++-- .../projectiles/guns/ballistic/pistol.dm | 6 +- shiptest.dme | 1 + 7 files changed, 120 insertions(+), 67 deletions(-) create mode 100644 code/game/objects/items/attachments/scope.dm diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/gun.dm index 19db84f76655..b2db6bbe71b2 100644 --- a/code/__DEFINES/gun.dm +++ b/code/__DEFINES/gun.dm @@ -28,6 +28,33 @@ ///added recoil of sawn off guns #define SAWN_OFF_RECOIL 1 +/* Stolen from tgmc.. Will use soon +//Gun defines for gun related thing. More in the projectile folder. +//gun_features_flags +#define GUN_CAN_POINTBLANK (1<<0) +#define GUN_UNUSUAL_DESIGN (1<<1) +#define GUN_AMMO_COUNTER (1<<2) +#define GUN_WIELDED_FIRING_ONLY (1<<3) +#define GUN_ALLOW_SYNTHETIC (1<<4) +#define GUN_WIELDED_STABLE_FIRING_ONLY (1<<5) +#define GUN_IFF (1<<6) +#define GUN_DEPLOYED_FIRE_ONLY (1<<7) +#define GUN_IS_ATTACHMENT (1<<8) +#define GUN_ATTACHMENT_FIRE_ONLY (1<<9) +#define GUN_ENERGY (1<<10) +#define GUN_AMMO_COUNT_BY_PERCENTAGE (1<<11) +#define GUN_AMMO_COUNT_BY_SHOTS_REMAINING (1<<12) +#define GUN_NO_PITCH_SHIFT_NEAR_EMPTY (1<<13) +#define GUN_SHOWS_AMMO_REMAINING (1<<14) //Whether the mob sprite reflects the ammo level +#define GUN_SHOWS_LOADED (1<<15) //Whether the mob sprite as loaded or unloaded, a binary version of the above +#define GUN_SMOKE_PARTICLES (1<<16) //Whether the gun has smoke particles + +#define GUN_FIREMODE_SEMIAUTO "semi-auto fire mode" +#define GUN_FIREMODE_BURSTFIRE "burst-fire mode" +#define GUN_FIREMODE_AUTOMATIC "automatic fire mode" +#define GUN_FIREMODE_AUTOBURST "auto-burst-fire mode" +*/ + //Autofire component /// Compatible firemode is in the gun. Wait until it's held in the user hands. #define AUTOFIRE_STAT_IDLE (1<<0) @@ -87,6 +114,29 @@ ///ammo box will have a different state for full and empty; -max_ammo and -0 #define AMMO_BOX_FULL_EMPTY 2 +/* Stolen from tgmc.. Will use soon +//Ammo magazine defines, for magazine_flags +#define MAGAZINE_REFILLABLE (1<<0) +#define MAGAZINE_HANDFUL (1<<1) +#define MAGAZINE_WORN (1<<2) +#define MAGAZINE_REFUND_IN_CHAMBER (1<<3) + +//reciever_flags. Used to determin how the gun cycles, what kind of ammo it uses, etc. +#define AMMO_RECIEVER_REQUIRES_UNIQUE_ACTION (1<<0) + #define AMMO_RECIEVER_UNIQUE_ACTION_LOCKS (1<<1) +#define AMMO_RECIEVER_MAGAZINES (1<<2) + #define AMMO_RECIEVER_AUTO_EJECT (1<<3) +#define AMMO_RECIEVER_HANDFULS (1<<4) +#define AMMO_RECIEVER_TOGGLES_OPEN (1<<5) + #define AMMO_RECIEVER_TOGGLES_OPEN_EJECTS (1<<6) +#define AMMO_RECIEVER_CLOSED (1<<7) +#define AMMO_RECIEVER_ROTATES_CHAMBER (1<<8) +#define AMMO_RECIEVER_DO_NOT_EJECT_HANDFULS (1<<9) +#define AMMO_RECIEVER_DO_NOT_EMPTY_ROUNDS_AFTER_FIRE (1<<10) +#define AMMO_RECIEVER_CYCLE_ONLY_BEFORE_FIRE (1<<11) //The ammo stay in the magazine until the last moment +#define AMMO_RECIEVER_AUTO_EJECT_LOCKED (1<<12) //Not allowed to turn automatic unloading off +*/ + #define MAG_SIZE_SMALL 1 #define MAG_SIZE_MEDIUM 2 #define MAG_SIZE_LARGE 3 diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index bb9de28a8772..caa03924d1ab 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -13,6 +13,7 @@ list/slot_room = null, list/valid_types = null, list/slot_offsets = null, + list/default_attachments = null ) if(!isgun(parent)) @@ -31,6 +32,10 @@ RegisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT, PROC_REF(handle_ctrl_shift_click)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(handle_overlays)) + if(default_attachments) + for(var/obj/item/attachment/attachment in default_attachments) + INVOKE_ASYNC(src, PROC_REF(do_attach), attachment, null) + /datum/component/attachment_holder/proc/handle_overlays(obj/item/parent, list/overlays) SIGNAL_HANDLER @@ -79,7 +84,7 @@ /datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) examine_list += "It has [max_attachments] attachment-slot\s." - examine_list += "\t[max_attachments - length(attachments)] attachment-slot\s remain." + examine_list += "[max_attachments - length(attachments)] attachment-slot\s remain." for(var/obj/item/attach as anything in attachments) SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE, user, examine_list) diff --git a/code/game/objects/items/attachments/scope.dm b/code/game/objects/items/attachments/scope.dm new file mode 100644 index 000000000000..b2bb805f3457 --- /dev/null +++ b/code/game/objects/items/attachments/scope.dm @@ -0,0 +1,53 @@ +//I need to refactor this into an attachment + +/datum/action/toggle_scope_zoom + name = "Toggle Scope" + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "sniper_zoom" + var/obj/item/gun/gun = null + +/datum/action/toggle_scope_zoom/Trigger() + gun.zoom(owner, owner.dir) + +/datum/action/toggle_scope_zoom/IsAvailable() + . = ..() + if(!. && gun) + gun.zoom(owner, owner.dir, FALSE) + +/datum/action/toggle_scope_zoom/Remove(mob/living/L) + gun.zoom(L, L.dir, FALSE) + ..() + +/obj/item/gun/proc/rotate(atom/thing, old_dir, new_dir) + SIGNAL_HANDLER + + if(ismob(thing)) + var/mob/lad = thing + lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir) + +/obj/item/gun/proc/zoom(mob/living/user, direc, forced_zoom) + if(!user || !user.client) + return + + if(isnull(forced_zoom)) + zoomed = !zoomed + else + zoomed = forced_zoom + + if(zoomed) + RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate)) + user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, direc) + else + UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE) + user.client.view_size.zoomIn() + return zoomed + +//Proc, so that gun accessories/scopes/etc. can easily add zooming. +/obj/item/gun/proc/build_zooming() + if(azoom) + return + + if(zoomable) + azoom = new() + azoom.gun = src diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 05de34ba41a9..9d08dca6606f 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -120,6 +120,8 @@ /* * Attachment */ + ///Attachments spawned on initialization. Should also be in valid attachments or it SHOULD(once i add that) fail + var/list/default_attachments = list() ///The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED var/list/valid_attachments = list() ///Reference to our attachment holder to prevent subtypes having to call GetComponent @@ -288,7 +290,7 @@ /obj/item/gun/ComponentInitialize() . = ..() - attachment_holder = AddComponent(/datum/component/attachment_holder, attachment_max, slot_available, valid_attachments, slot_offsets) + attachment_holder = AddComponent(/datum/component/attachment_holder, attachment_max, slot_available, valid_attachments, slot_offsets, default_attachments) AddComponent(/datum/component/two_handed) /// triggered on wield of two handed item @@ -792,59 +794,3 @@ if(!QDELETED(flash_loc)) flash_loc.vis_contents -= muzzle_flash muzzle_flash.applied = FALSE - -///////////// -// ZOOMING // -///////////// - -/datum/action/toggle_scope_zoom - name = "Toggle Scope" - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "sniper_zoom" - var/obj/item/gun/gun = null - -/datum/action/toggle_scope_zoom/Trigger() - gun.zoom(owner, owner.dir) - -/datum/action/toggle_scope_zoom/IsAvailable() - . = ..() - if(!. && gun) - gun.zoom(owner, owner.dir, FALSE) - -/datum/action/toggle_scope_zoom/Remove(mob/living/L) - gun.zoom(L, L.dir, FALSE) - ..() - -/obj/item/gun/proc/rotate(atom/thing, old_dir, new_dir) - SIGNAL_HANDLER - - if(ismob(thing)) - var/mob/lad = thing - lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir) - -/obj/item/gun/proc/zoom(mob/living/user, direc, forced_zoom) - if(!user || !user.client) - return - - if(isnull(forced_zoom)) - zoomed = !zoomed - else - zoomed = forced_zoom - - if(zoomed) - RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate)) - user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, direc) - else - UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE) - user.client.view_size.zoomIn() - return zoomed - -//Proc, so that gun accessories/scopes/etc. can easily add zooming. -/obj/item/gun/proc/build_zooming() - if(azoom) - return - - if(zoomable) - azoom = new() - azoom.gun = src diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 94a97a73fe8e..cd13e59a1bf7 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -112,12 +112,12 @@ update_appearance() ///Handles all the logic needed for magazine insertion -/obj/item/gun/ballistic/proc/insert_magazine(mob/user, obj/item/ammo_box/magazine/AM, display_message = TRUE) - if(!istype(AM, mag_type)) - to_chat(user, "\The [AM] doesn't seem to fit into \the [src]...") +/obj/item/gun/ballistic/proc/insert_magazine(mob/user, obj/item/ammo_box/magazine/inserted_mag, display_message = TRUE) + if(!istype(inserted_mag, mag_type)) + to_chat(user, "\The [inserted_mag] doesn't seem to fit into \the [src]...") return FALSE - if(user.transferItemToLoc(AM, src)) - magazine = AM + if(user.transferItemToLoc(inserted_mag, src)) + magazine = inserted_mag if (display_message) to_chat(user, "You load a new [magazine_wording] into \the [src].") if (magazine.ammo_count()) diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index c13b28e164aa..05da8b3bd72a 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -36,10 +36,8 @@ /obj/item/gun/ballistic/automatic/pistol/no_mag spawnwithmagazine = FALSE -/obj/item/gun/ballistic/automatic/pistol/suppressed/Initialize(mapload) - . = ..() - var/obj/item/attachment/silencer/silencer = new(src) - attachment_holder.do_attach(silencer, null) +/obj/item/gun/ballistic/automatic/pistol/suppressed + default_attachments= list(/obj/item/attachment/silencer) /obj/item/gun/ballistic/automatic/pistol/suns desc = "A small, easily concealable 10mm handgun that bears Scarborough Arms stamps. It is painted in the colors of SUNS." diff --git a/shiptest.dme b/shiptest.dme index ebe99a9e76bd..62a1a4563c5e 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1192,6 +1192,7 @@ #include "code\game\objects\items\attachments\bayonet.dm" #include "code\game\objects\items\attachments\laser_sight.dm" #include "code\game\objects\items\attachments\rail_light.dm" +#include "code\game\objects\items\attachments\scope.dm" #include "code\game\objects\items\attachments\silencer.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" #include "code\game\objects\items\circuitboards\computer_circuitboards.dm" From 99771ced8dc0d2e8cb0a0d5998de76e94e8114d9 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 23 Apr 2024 17:17:02 -0500 Subject: [PATCH 141/206] yea --- code/game/objects/items/attachments/bayonet.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index e8b0e19fa03a..e343d900ff77 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -16,7 +16,7 @@ reach = toggled ? reach : initial(reach) force = toggled ? force : initial(force) - playsound(gun, 'sound/weapons/batonextend.ogg') + playsound(gun, 'sound/weapons/batonextend.ogg', 30) user.visible_message("[user] [toggled ? "expands" : "retracts"] [user.p_their()] [src].", "You [toggled ? "expand" : "retract"] \the [src].") /obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) From 02b4056bb568454447ceafb2722ed5120b2f6103 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 23 Apr 2024 20:06:35 -0500 Subject: [PATCH 142/206] pixel offsets for attachments, very bad scope, normal bayonet --- code/datums/components/attachment.dm | 2 +- code/datums/components/attachment_holder.dm | 16 +++-- code/datums/components/crafting/recipes.dm | 2 +- .../objects/items/attachments/_attachment.dm | 5 ++ .../game/objects/items/attachments/bayonet.dm | 23 +++++- code/game/objects/items/attachments/scope.dm | 68 +++++------------- code/modules/projectiles/gun.dm | 53 ++++++++++++++ .../projectiles/guns/ballistic/assault.dm | 21 ++++++ .../projectiles/guns/ballistic/pistol.dm | 13 ++++ .../projectiles/guns/ballistic/shotgun.dm | 2 - .../guns/energy/kinetic_accelerator.dm | 4 +- icons/obj/guns/attachments.dmi | Bin 3113 -> 3815 bytes 12 files changed, 145 insertions(+), 64 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index e4a449dd4f7d..fa6c4c3e792d 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -63,7 +63,7 @@ datum/callback/on_detach = null, datum/callback/on_toggle = null, datum/callback/on_preattack = null, - list/signals = null, + list/signals = null ) if(!isitem(parent)) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index caa03924d1ab..175bb06f68a4 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -5,7 +5,6 @@ var/max_attachments = 2 var/list/slot_room = null var/list/slot_offsets = null - var/list/obj/item/attachments = list() /datum/component/attachment_holder/Initialize( @@ -39,7 +38,7 @@ /datum/component/attachment_holder/proc/handle_overlays(obj/item/parent, list/overlays) SIGNAL_HANDLER - for(var/obj/item/attach as anything in attachments) + for(var/obj/item/attachment/attach as anything in attachments) var/slot = SEND_SIGNAL(attach, COMSIG_ATTACHMENT_GET_SLOT) slot = attachment_slot_from_bflag(slot) var/list/attach_overlays = list() @@ -47,7 +46,7 @@ for(var/mutable_appearance/overlay as anything in attach_overlays) if(slot_offsets && slot_offsets[slot]) var/matrix/overlay_matrix = new - overlay_matrix.Translate(slot_offsets[slot]["x"], slot_offsets[slot]["y"]) + overlay_matrix.Translate(slot_offsets[slot]["x"] - attach.pixel_shift_x, slot_offsets[slot]["y"] - attach.pixel_shift_y) overlay.transform = overlay_matrix overlays += overlay @@ -60,12 +59,14 @@ attachments = null return ..() -/datum/component/attachment_holder/proc/attachments_to_list() +/datum/component/attachment_holder/proc/attachments_to_list(only_toggles = FALSE) . = list() - for(var/obj/item/attach as anything in attachments) + for(var/obj/item/attachment/attach as anything in attachments) if(attach.name in .) stack_trace("two attachments with same name; this shouldn't happen and will cause failures") continue + if(only_toggles && attach.has_toggle) + continue .[attach.name] = attach /datum/component/attachment_holder/proc/handle_ctrl_shift_click(obj/item/parent, mob/user) @@ -74,7 +75,7 @@ INVOKE_ASYNC(src, PROC_REF(do_attachment_radial), parent, user) /datum/component/attachment_holder/proc/do_attachment_radial(obj/item/parent, mob/user) - var/list/attachments_as_list = attachments_to_list() + var/list/attachments_as_list = attachments_to_list(TRUE) var/selection = show_radial_menu(user, parent, attachments_as_list) var/obj/item/attach = attachments_as_list[selection] if(!attach) @@ -101,6 +102,9 @@ /datum/component/attachment_holder/proc/do_attach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) slot = attachment_slot_from_bflag(slot) + if(!(attachment.type in valid_types)) + to_chat(user, "[attachment] is not a valid attachment for this [parent]!") + return if(!slot_room[slot]) to_chat(user, "[parent] does not contain room for [attachment]!") return diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index f515896df22d..561774d8dc62 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -27,7 +27,7 @@ /datum/crafting_recipe/energy_bayonet name = "Plasma Bayonet" - result = /obj/item/attachment/bayonet + result = /obj/item/attachment/e_bayonet reqs = list( /obj/item/kitchen/knife/combat = 1, /obj/item/stack/cable_coil = 30, diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index f1ef4e0c7953..805530ae5419 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -12,6 +12,11 @@ var/datum/component/attachment/attachment_comp + ///Determines the amount of pixels to move the icon state for the overlay. in the x direction + var/pixel_shift_x = 16 + ///Determines the amount of pixels to move the icon state for the overlay. in the y direction + var/pixel_shift_y = 16 + /obj/item/attachment/Initialize() . = ..() attachment_comp = AddComponent( \ diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index e343d900ff77..000c8515df79 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -1,4 +1,4 @@ -/obj/item/attachment/bayonet +/obj/item/attachment/e_bayonet name = "bayonet" desc = "Stabby-Stabby" icon_state = "ebayonet" @@ -10,7 +10,7 @@ var/reach_extended = 2 var/force_extended = 10 -/obj/item/attachment/bayonet/Toggle(obj/item/gun/gun, mob/user) +/obj/item/attachment/e_bayonet/Toggle(obj/item/gun/gun, mob/user) . = ..() reach = toggled ? reach : initial(reach) @@ -19,7 +19,7 @@ playsound(gun, 'sound/weapons/batonextend.ogg', 30) user.visible_message("[user] [toggled ? "expands" : "retracts"] [user.p_their()] [src].", "You [toggled ? "expand" : "retract"] \the [src].") -/obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) +/obj/item/attachment/e_bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) // Call our melee chain if they are are trying to melee attack something they can reach if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) if(target == user && toggled) @@ -36,3 +36,20 @@ return COMPONENT_NO_ATTACK melee_attack_chain(user, target, params) return COMPONENT_NO_ATTACK + +/obj/item/attachment/bayonet + name = "bayonet" + desc = "Stabby-Stabby" + icon_state = "bayonet" + var/extra_force = 10 + +/obj/item/attachment/bayonet/Attach(obj/item/gun/gun, mob/user) + . = ..() + gun.force += extra_force + gun.hitsound = 'sound/weapons/bladeslice.ogg' + +/obj/item/attachment/bayonet/Detach(obj/item/gun/gun, mob/user) + . = ..() + gun.force -= extra_force + gun.hitsound = initial(gun.hitsound) + return TRUE diff --git a/code/game/objects/items/attachments/scope.dm b/code/game/objects/items/attachments/scope.dm index b2bb805f3457..336d87a2e6b2 100644 --- a/code/game/objects/items/attachments/scope.dm +++ b/code/game/objects/items/attachments/scope.dm @@ -1,53 +1,23 @@ -//I need to refactor this into an attachment +/obj/item/attachment/scope + name = "bayonet" + icon_state = "scope" + slot = ATTACHMENT_SLOT_SCOPE + var/zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. + var/zoom_out_amt = 5 -/datum/action/toggle_scope_zoom - name = "Toggle Scope" - check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "sniper_zoom" - var/obj/item/gun/gun = null -/datum/action/toggle_scope_zoom/Trigger() - gun.zoom(owner, owner.dir) - -/datum/action/toggle_scope_zoom/IsAvailable() +/obj/item/attachment/scope/Attach(obj/item/gun/gun, mob/user) . = ..() - if(!. && gun) - gun.zoom(owner, owner.dir, FALSE) - -/datum/action/toggle_scope_zoom/Remove(mob/living/L) - gun.zoom(L, L.dir, FALSE) - ..() - -/obj/item/gun/proc/rotate(atom/thing, old_dir, new_dir) - SIGNAL_HANDLER - - if(ismob(thing)) - var/mob/lad = thing - lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir) - -/obj/item/gun/proc/zoom(mob/living/user, direc, forced_zoom) - if(!user || !user.client) - return + gun.zoomable = TRUE + gun.zoom_amt = zoom_amt + gun.zoom_out_amt = zoom_out_amt + gun.build_zooming() - if(isnull(forced_zoom)) - zoomed = !zoomed - else - zoomed = forced_zoom - - if(zoomed) - RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate)) - user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, direc) - else - UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE) - user.client.view_size.zoomIn() - return zoomed - -//Proc, so that gun accessories/scopes/etc. can easily add zooming. -/obj/item/gun/proc/build_zooming() - if(azoom) - return - - if(zoomable) - azoom = new() - azoom.gun = src +/obj/item/attachment/scope/Detach(obj/item/gun/gun, mob/user) + . = ..() + gun.zoomable = FALSE + gun.zoom_amt = initial(gun.zoom_amt) + gun.zoom_out_amt = initial(gun.zoom_out_amt) + gun.actions -= gun.azoom + qdel(gun.azoom) + return TRUE diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 9d08dca6606f..037d8bdd82ff 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -794,3 +794,56 @@ if(!QDELETED(flash_loc)) flash_loc.vis_contents -= muzzle_flash muzzle_flash.applied = FALSE + +//I need to refactor this into an attachment +/datum/action/toggle_scope_zoom + name = "Toggle Scope" + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_LYING + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "sniper_zoom" + var/obj/item/gun/gun = null + +/datum/action/toggle_scope_zoom/Trigger() + gun.zoom(owner, owner.dir) + +/datum/action/toggle_scope_zoom/IsAvailable() + . = ..() + if(!. && gun) + gun.zoom(owner, owner.dir, FALSE) + +/datum/action/toggle_scope_zoom/Remove(mob/living/L) + gun.zoom(L, L.dir, FALSE) + ..() + +/obj/item/gun/proc/rotate(atom/thing, old_dir, new_dir) + SIGNAL_HANDLER + + if(ismob(thing)) + var/mob/lad = thing + lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir) + +/obj/item/gun/proc/zoom(mob/living/user, direc, forced_zoom) + if(!user || !user.client) + return + + if(isnull(forced_zoom)) + zoomed = !zoomed + else + zoomed = forced_zoom + + if(zoomed) + RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate)) + user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, direc) + else + UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE) + user.client.view_size.zoomIn() + return zoomed + +//Proc, so that gun accessories/scopes/etc. can easily add zooming. +/obj/item/gun/proc/build_zooming() + if(azoom) + return + + if(zoomable) + azoom = new() + azoom.gun = src diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm index 14957d6d0709..610b7aa24d8c 100644 --- a/code/modules/projectiles/guns/ballistic/assault.dm +++ b/code/modules/projectiles/guns/ballistic/assault.dm @@ -125,6 +125,27 @@ spread = 8 spread_unwielded = 15 + valid_attachments = list( + /obj/item/attachment/bayonet, + /obj/item/attachment/rail_light, + /obj/item/attachment/scope + ) + attachment_max = 2 + slot_available = list( + ATTACHMENT_SLOT_RAIL = 1, + ATTACHMENT_SLOT_SCOPE = 1 + ) + slot_offsets = list( + ATTACHMENT_SLOT_RAIL = list( + "x" = 24, + "y" = 13, + ), + ATTACHMENT_SLOT_SCOPE = list( + "x" = 15, + "y" = 24, + ) + ) + /obj/item/gun/ballistic/automatic/assault/swiss_cheese/ComponentInitialize() . = ..() AddComponent(/datum/component/automatic_fire, 0.65 SECONDS) diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 05da8b3bd72a..83c4218511a0 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -42,6 +42,19 @@ /obj/item/gun/ballistic/automatic/pistol/suns desc = "A small, easily concealable 10mm handgun that bears Scarborough Arms stamps. It is painted in the colors of SUNS." icon_state = "pistol_suns" + valid_attachments = list( + /obj/item/attachment/silencer + ) + attachment_max = 1 + slot_available = list( + ATTACHMENT_SLOT_MUZZLE = 1 + ) + slot_offsets = list( + ATTACHMENT_SLOT_MUZZLE = list( + "x" = 24, + "y" = 18, + ) + ) /obj/item/gun/ballistic/automatic/pistol/candor name = "\improper Candor" diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 6daa99f4bd30..a56661c0e5f0 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -124,8 +124,6 @@ recoil = 1 recoil_unwielded = 4 wield_delay = 0.65 SECONDS - -/obj/item/gun/ballistic/shotgun/automatic manufacturer = MANUFACTURER_NANOTRASEN /obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index b0b1c82e8a01..30c31f6bbbaf 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -29,9 +29,9 @@ var/recharge_timerid valid_attachments = list( - /obj/item/attachment/bayonet + /obj/item/attachment/bayonet, + /obj/item/attachment/rail_light ) - attachment_max = 1 slot_available = list( ATTACHMENT_SLOT_RAIL = 1 ) diff --git a/icons/obj/guns/attachments.dmi b/icons/obj/guns/attachments.dmi index ffd991435d5b2aabe8b08c2cb67e03023e22b401..a7b6ff49e53eac5189fd783ca41930be780115d9 100644 GIT binary patch literal 3815 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 literal 3113 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 Le^0Mg_aWk6No(lQ From 2e7c8f7b92eb48421b1f4dec1e03e6ad88b14c85 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 24 Apr 2024 08:09:41 -0500 Subject: [PATCH 143/206] cant belive those all were like that, copy paste smh --- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/guns/ballistic/shotgun.dm | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 037d8bdd82ff..114c89b9bfcc 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -236,7 +236,7 @@ ///time of the most recent rack, used for cooldown purposes var/recent_rack = 0 ///Whether the gun can be sawn off by sawing tools - var/can_be_sawn_off = FALSE + var/can_be_sawn_off = FALSE ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it var/tac_reloads = TRUE diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index a56661c0e5f0..43eb48c31ea7 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -65,7 +65,7 @@ manufacturer = MANUFACTURER_HUNTERSPRIDE fire_delay = 1 - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE /obj/item/gun/ballistic/shotgun/brimstone/ComponentInitialize() @@ -96,7 +96,7 @@ item_state = "hellfire" mag_type = /obj/item/ammo_box/magazine/internal/shot/riot sawn_desc = "Come with me if you want to live." - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE rack_sound = 'sound/weapons/gun/shotgun/rack_alt.ogg' fire_delay = 1 @@ -286,7 +286,7 @@ "Stained Green" = "dshotgun_green" ) semi_auto = TRUE - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE bolt_type = BOLT_TYPE_NO_BOLT pb_knockback = 3 // it's a super shotgun! manufacturer = MANUFACTURER_HUNTERSPRIDE @@ -437,7 +437,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact/compact w_class = WEIGHT_CLASS_SMALL sawn_desc = "You know, this isn't funny anymore." - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE /obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) if(prob(0 + (magazine.ammo_count() * 20))) //minimum probability of 20, maximum of 60 @@ -460,7 +460,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact/compact/compact w_class = WEIGHT_CLASS_TINY sawn_desc = "Sigh. This is a trigger attached to a bullet." - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE /obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact/compact/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) if(prob(50)) //It's going to blow up. @@ -551,7 +551,7 @@ rack_sound = 'sound/weapons/gun/rifle/skm_cocked.ogg' bolt_wording = "lever" cartridge_wording = "bullet" - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE wield_slowdown = 0.5 wield_delay = 0.65 SECONDS @@ -671,7 +671,7 @@ slot_flags = ITEM_SLOT_BACK obj_flags = UNIQUE_RENAME semi_auto = TRUE - can_be_sawn_off = TRUE + can_be_sawn_off = TRUE pb_knockback = 3 wield_slowdown = 0.7 spread_unwielded = 15 From b6c472bdd5ede2c56ab5819ba589e06f7532410b Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 24 Apr 2024 09:09:32 -0500 Subject: [PATCH 144/206] duplicate declerations --- code/modules/projectiles/guns/ballistic/shotgun.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 43eb48c31ea7..4e919b652234 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -663,12 +663,9 @@ inhand_y_dimension = 32 mag_type = /obj/item/ammo_box/magazine/internal/shot/beacon fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg' - can_be_sawn_off=TRUE w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_MEDIUM force = 10 - flags_1 = CONDUCT_1 - slot_flags = ITEM_SLOT_BACK obj_flags = UNIQUE_RENAME semi_auto = TRUE can_be_sawn_off = TRUE From 5936ef8095c0bcab12f54958c2e8d5d6f0d9515a Mon Sep 17 00:00:00 2001 From: fallcon Date: Mon, 29 Apr 2024 11:05:29 -0500 Subject: [PATCH 145/206] I dont think we need to do it like this --- code/datums/components/attachment.dm | 32 ++++----------------- code/datums/components/attachment_holder.dm | 3 -- 2 files changed, 5 insertions(+), 30 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index fa6c4c3e792d..de317339ee86 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -7,32 +7,10 @@ #define COMSIG_ATTACHMENT_UPDATE_OVERLAY "attach-overlay" #define COMSIG_ATTACHMENT_GET_SLOT "attach-slot-who" - #define ATTACHMENT_SLOT_MUZZLE "attach-slot-muzzle" - #define ATTACHMENT_SLOT_SCOPE "attach-slot-scope" - #define ATTACHMENT_SLOT_GRIP "attach-slot-grip" - #define ATTACHMENT_SLOT_RAIL "attach-slot-rail" - -/proc/attachment_slot_to_bflag(slot) - switch(slot) - if(ATTACHMENT_SLOT_MUZZLE) - return (1<<0) - if(ATTACHMENT_SLOT_SCOPE) - return (1<<1) - if(ATTACHMENT_SLOT_GRIP) - return (1<<2) - if(ATTACHMENT_SLOT_RAIL) - return (1<<3) - -/proc/attachment_slot_from_bflag(slot) - switch(slot) - if(1<<0) - return ATTACHMENT_SLOT_MUZZLE - if(1<<1) - return ATTACHMENT_SLOT_SCOPE - if(1<<2) - return ATTACHMENT_SLOT_GRIP - if(1<<3) - return ATTACHMENT_SLOT_RAIL +#define ATTACHMENT_SLOT_MUZZLE "attach-slot-muzzle" +#define ATTACHMENT_SLOT_SCOPE "attach-slot-scope" +#define ATTACHMENT_SLOT_GRIP "attach-slot-grip" +#define ATTACHMENT_SLOT_RAIL "attach-slot-rail" #define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" @@ -150,4 +128,4 @@ /datum/component/attachment/proc/send_slot(obj/item/parent) SIGNAL_HANDLER - return attachment_slot_to_bflag(slot) + return slot diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 175bb06f68a4..d18955fbe3cf 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -40,7 +40,6 @@ for(var/obj/item/attachment/attach as anything in attachments) var/slot = SEND_SIGNAL(attach, COMSIG_ATTACHMENT_GET_SLOT) - slot = attachment_slot_from_bflag(slot) var/list/attach_overlays = list() SEND_SIGNAL(attach, COMSIG_ATTACHMENT_UPDATE_OVERLAY, attach_overlays) for(var/mutable_appearance/overlay as anything in attach_overlays) @@ -101,7 +100,6 @@ /datum/component/attachment_holder/proc/do_attach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) - slot = attachment_slot_from_bflag(slot) if(!(attachment.type in valid_types)) to_chat(user, "[attachment] is not a valid attachment for this [parent]!") return @@ -117,7 +115,6 @@ /datum/component/attachment_holder/proc/do_detach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) - slot = attachment_slot_from_bflag(slot) if(slot in slot_room) slot_room[slot]++ . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_DETACH, parent, user) From 34a8abdbcd3ad62a05e17ef17a1757a853f66a7e Mon Sep 17 00:00:00 2001 From: fallcon Date: Mon, 29 Apr 2024 12:00:49 -0500 Subject: [PATCH 146/206] examine stuff --- code/datums/components/attachment.dm | 10 ++++++++++ code/datums/components/attachment_holder.dm | 10 ++++------ code/modules/projectiles/gun.dm | 4 +--- code/modules/projectiles/guns/ballistic/assault.dm | 1 - code/modules/projectiles/guns/ballistic/pistol.dm | 1 - 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index de317339ee86..1f44083c9895 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -58,6 +58,8 @@ ADD_TRAIT(parent, TRAIT_ATTACHABLE, "attachable") RegisterSignal(parent, COMSIG_ATTACHMENT_ATTACH, PROC_REF(try_attach)) RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, PROC_REF(try_detach)) + RegisterSignal(parent, COMSIG_ATTACHMENT_EXAMINE, PROC_REF(handle_examine)) + RegisterSignal(parent, COMSIG_ATTACHMENT_EXAMINE_MORE, PROC_REF(handle_examine_more)) if(has_toggle) RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, PROC_REF(try_toggle)) RegisterSignal(parent, COMSIG_ATTACHMENT_PRE_ATTACK, PROC_REF(relay_pre_attack)) @@ -120,6 +122,14 @@ parent.forceMove(holder.drop_location()) return TRUE +/datum/component/attachment/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) + SIGNAL_HANDLER + +/datum/component/attachment/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list) + SIGNAL_HANDLER + + examine_list += parent.name + /datum/component/attachment/proc/relay_pre_attack(obj/item/parent, obj/item/gun, atom/target_atom, mob/user, params) SIGNAL_HANDLER_DOES_SLEEP diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index d18955fbe3cf..de5cc786b0ae 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -2,13 +2,11 @@ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS var/list/valid_types = null - var/max_attachments = 2 var/list/slot_room = null var/list/slot_offsets = null var/list/obj/item/attachments = list() /datum/component/attachment_holder/Initialize( - max_attachments = 2, list/slot_room = null, list/valid_types = null, list/slot_offsets = null, @@ -18,7 +16,6 @@ if(!isgun(parent)) return COMPONENT_INCOMPATIBLE - src.max_attachments = max_attachments src.slot_room = slot_room src.valid_types = valid_types src.slot_offsets = slot_offsets @@ -83,8 +80,9 @@ parent.update_icon() /datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) - examine_list += "It has [max_attachments] attachment-slot\s." - examine_list += "[max_attachments - length(attachments)] attachment-slot\s remain." + for(slot_room) + if(slot_room[slot]) + examine_list += "It has room for [slot_room[slot]] more attachments on this slot" for(var/obj/item/attach as anything in attachments) SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE, user, examine_list) @@ -142,7 +140,7 @@ INVOKE_ASYNC(src, PROC_REF(handle_detach), parent, item, user) return TRUE - if(HAS_TRAIT(item, TRAIT_ATTACHABLE) && length(attachments) < max_attachments) + if(HAS_TRAIT(item, TRAIT_ATTACHABLE)) INVOKE_ASYNC(src, PROC_REF(do_attach), item, user) return TRUE diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 114c89b9bfcc..dc9e00926352 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -126,8 +126,6 @@ var/list/valid_attachments = list() ///Reference to our attachment holder to prevent subtypes having to call GetComponent var/datum/component/attachment_holder/attachment_holder - ///Maximum number of attachments allowed - var/attachment_max = 0 ///Number of attachments that can fit on a given slot var/list/slot_available = ATTACHMENT_DEFAULT_SLOT_AVAILABLE ///Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y @@ -290,7 +288,7 @@ /obj/item/gun/ComponentInitialize() . = ..() - attachment_holder = AddComponent(/datum/component/attachment_holder, attachment_max, slot_available, valid_attachments, slot_offsets, default_attachments) + attachment_holder = AddComponent(/datum/component/attachment_holder, slot_available, valid_attachments, slot_offsets, default_attachments) AddComponent(/datum/component/two_handed) /// triggered on wield of two handed item diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm index 610b7aa24d8c..0f3389d890d7 100644 --- a/code/modules/projectiles/guns/ballistic/assault.dm +++ b/code/modules/projectiles/guns/ballistic/assault.dm @@ -130,7 +130,6 @@ /obj/item/attachment/rail_light, /obj/item/attachment/scope ) - attachment_max = 2 slot_available = list( ATTACHMENT_SLOT_RAIL = 1, ATTACHMENT_SLOT_SCOPE = 1 diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 83c4218511a0..5022e3572b3b 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -45,7 +45,6 @@ valid_attachments = list( /obj/item/attachment/silencer ) - attachment_max = 1 slot_available = list( ATTACHMENT_SLOT_MUZZLE = 1 ) From 7e626c1dca3462bc63b0d10890ee4976f743f341 Mon Sep 17 00:00:00 2001 From: fallcon Date: Mon, 29 Apr 2024 12:03:41 -0500 Subject: [PATCH 147/206] better examine --- code/datums/components/attachment_holder.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index de5cc786b0ae..11247d141194 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -80,15 +80,18 @@ parent.update_icon() /datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) - for(slot_room) - if(slot_room[slot]) - examine_list += "It has room for [slot_room[slot]] more attachments on this slot" + if(length(attachments)) + examine_list += "It has [length(attachments)] attachments." + for(var/obj/item/attach as anything in attachments) SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE, user, examine_list) /datum/component/attachment_holder/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list) if(!length(attachments)) return + for(slot_room) + if(slot_room[slot]) + examine_list += "It has room for [slot_room[slot]] more attachments on this slot." examine_list += "It has the following attachments:" for(var/obj/item/attach as anything in attachments) examine_list += "\t- [attach.name]" From fb474938b63dd667de813e4b148b55f7f244e0fb Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 29 Apr 2024 16:16:50 -0500 Subject: [PATCH 148/206] ok im lazy im going back to how they had it instead of figuring it out --- code/datums/components/attachment.dm | 34 +++++++++++++++---- code/datums/components/attachment_holder.dm | 6 ++-- .../objects/items/attachments/silencer.dm | 2 ++ .../projectiles/guns/ballistic/pistol.dm | 4 +-- shiptest.dme | 2 +- 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 1f44083c9895..bb045e08625d 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -7,10 +7,32 @@ #define COMSIG_ATTACHMENT_UPDATE_OVERLAY "attach-overlay" #define COMSIG_ATTACHMENT_GET_SLOT "attach-slot-who" -#define ATTACHMENT_SLOT_MUZZLE "attach-slot-muzzle" -#define ATTACHMENT_SLOT_SCOPE "attach-slot-scope" -#define ATTACHMENT_SLOT_GRIP "attach-slot-grip" -#define ATTACHMENT_SLOT_RAIL "attach-slot-rail" + #define ATTACHMENT_SLOT_MUZZLE "attach-slot-muzzle" + #define ATTACHMENT_SLOT_SCOPE "attach-slot-scope" + #define ATTACHMENT_SLOT_GRIP "attach-slot-grip" + #define ATTACHMENT_SLOT_RAIL "attach-slot-rail" + +/proc/attachment_slot_to_bflag(slot) + switch(slot) + if(ATTACHMENT_SLOT_MUZZLE) + return (1<<0) + if(ATTACHMENT_SLOT_SCOPE) + return (1<<1) + if(ATTACHMENT_SLOT_GRIP) + return (1<<2) + if(ATTACHMENT_SLOT_RAIL) + return (1<<3) + +/proc/attachment_slot_from_bflag(slot) + switch(slot) + if(1<<0) + return ATTACHMENT_SLOT_MUZZLE + if(1<<1) + return ATTACHMENT_SLOT_SCOPE + if(1<<2) + return ATTACHMENT_SLOT_GRIP + if(1<<3) + return ATTACHMENT_SLOT_RAIL #define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" @@ -128,8 +150,6 @@ /datum/component/attachment/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list) SIGNAL_HANDLER - examine_list += parent.name - /datum/component/attachment/proc/relay_pre_attack(obj/item/parent, obj/item/gun, atom/target_atom, mob/user, params) SIGNAL_HANDLER_DOES_SLEEP @@ -138,4 +158,4 @@ /datum/component/attachment/proc/send_slot(obj/item/parent) SIGNAL_HANDLER - return slot + return attachment_slot_to_bflag(slot) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 11247d141194..dd4603f3e722 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -37,6 +37,7 @@ for(var/obj/item/attachment/attach as anything in attachments) var/slot = SEND_SIGNAL(attach, COMSIG_ATTACHMENT_GET_SLOT) + slot = attachment_slot_from_bflag(slot) var/list/attach_overlays = list() SEND_SIGNAL(attach, COMSIG_ATTACHMENT_UPDATE_OVERLAY, attach_overlays) for(var/mutable_appearance/overlay as anything in attach_overlays) @@ -89,9 +90,6 @@ /datum/component/attachment_holder/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list) if(!length(attachments)) return - for(slot_room) - if(slot_room[slot]) - examine_list += "It has room for [slot_room[slot]] more attachments on this slot." examine_list += "It has the following attachments:" for(var/obj/item/attach as anything in attachments) examine_list += "\t- [attach.name]" @@ -101,6 +99,7 @@ /datum/component/attachment_holder/proc/do_attach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) + slot = attachment_slot_from_bflag(slot) if(!(attachment.type in valid_types)) to_chat(user, "[attachment] is not a valid attachment for this [parent]!") return @@ -116,6 +115,7 @@ /datum/component/attachment_holder/proc/do_detach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) + slot = attachment_slot_from_bflag(slot) if(slot in slot_room) slot_room[slot]++ . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_DETACH, parent, user) diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index e55d04e0864f..ef2334c2d7af 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -4,6 +4,8 @@ icon_state = "silencer" slot = ATTACHMENT_SLOT_MUZZLE has_toggle = TRUE + pixel_shift_x = 1 + pixel_shift_y = 1 /obj/item/attachment/silencer/Attach(obj/item/gun/gun, mob/user) . = ..() diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 5022e3572b3b..0f1caa977b9b 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -50,8 +50,8 @@ ) slot_offsets = list( ATTACHMENT_SLOT_MUZZLE = list( - "x" = 24, - "y" = 18, + "x" = 26, + "y" = 20, ) ) diff --git a/shiptest.dme b/shiptest.dme index 62a1a4563c5e..1700da46fc9f 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1861,8 +1861,8 @@ #include "code\modules\buildmode\submodes\map_export.dm" #include "code\modules\buildmode\submodes\outfit.dm" #include "code\modules\buildmode\submodes\proccall.dm" -#include "code\modules\buildmode\submodes\throwing.dm" #include "code\modules\buildmode\submodes\relocate_to.dm" +#include "code\modules\buildmode\submodes\throwing.dm" #include "code\modules\buildmode\submodes\tweakcomps.dm" #include "code\modules\buildmode\submodes\variable_edit.dm" #include "code\modules\cargo\bounty.dm" From 4a117814988152021dce6774d7c61de6bd09dd80 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 29 Apr 2024 17:28:01 -0500 Subject: [PATCH 149/206] cleaning up radial and overlay shiifting --- code/datums/components/attachment_holder.dm | 2 +- .../game/objects/items/attachments/bayonet.dm | 2 ++ .../objects/items/attachments/laser_sight.dm | 2 ++ .../objects/items/attachments/rail_light.dm | 2 ++ code/game/objects/items/attachments/scope.dm | 1 + .../objects/items/attachments/silencer.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 2 -- .../projectiles/guns/ballistic/pistol.dm | 31 ++++++++++++------- 8 files changed, 29 insertions(+), 15 deletions(-) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index dd4603f3e722..edb4edb94702 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -62,7 +62,7 @@ if(attach.name in .) stack_trace("two attachments with same name; this shouldn't happen and will cause failures") continue - if(only_toggles && attach.has_toggle) + if(only_toggles && !attach.has_toggle) continue .[attach.name] = attach diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 000c8515df79..3423570db110 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -42,6 +42,8 @@ desc = "Stabby-Stabby" icon_state = "bayonet" var/extra_force = 10 + pixel_shift_x = 1 + pixel_shift_y = 4 /obj/item/attachment/bayonet/Attach(obj/item/gun/gun, mob/user) . = ..() diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm index d461ac41d87e..ffb03d39610d 100644 --- a/code/game/objects/items/attachments/laser_sight.dm +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -3,6 +3,8 @@ desc = "This laser sight is designed to be rail-mounted on a compatible firearm to provide increased accuracy." icon_state = "laserpointer" has_toggle = TRUE + pixel_shift_x = 1 + pixel_shift_y = 4 /obj/item/attachment/laser_sight/Toggle(obj/item/gun/gun, mob/user) . = ..() diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm index ea47c792f510..a8ae57f7cfdd 100644 --- a/code/game/objects/items/attachments/rail_light.dm +++ b/code/game/objects/items/attachments/rail_light.dm @@ -3,6 +3,8 @@ desc = "Rail mounted gun light for better visibility down range." icon_state = "raillight" has_toggle = TRUE + pixel_shift_x = 1 + pixel_shift_y = 4 light_color = "#FFCC66" light_system = MOVABLE_LIGHT_DIRECTIONAL diff --git a/code/game/objects/items/attachments/scope.dm b/code/game/objects/items/attachments/scope.dm index 336d87a2e6b2..0b4971d53139 100644 --- a/code/game/objects/items/attachments/scope.dm +++ b/code/game/objects/items/attachments/scope.dm @@ -4,6 +4,7 @@ slot = ATTACHMENT_SLOT_SCOPE var/zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. var/zoom_out_amt = 5 + has_toggle = FALSE /obj/item/attachment/scope/Attach(obj/item/gun/gun, mob/user) diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index ef2334c2d7af..c6c25a407277 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -3,7 +3,7 @@ desc = "For when you need to kill someone but not be seen killing someone!" icon_state = "silencer" slot = ATTACHMENT_SLOT_MUZZLE - has_toggle = TRUE + has_toggle = FALSE pixel_shift_x = 1 pixel_shift_y = 1 diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index cd13e59a1bf7..df134dc714e3 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -275,8 +275,6 @@ . += "It does not seem to have a round chambered." if (bolt_locked) . += "The [bolt_wording] is locked back and needs to be released before firing." - if (suppressed) - . += "It has a suppressor attached that can be removed with alt+click." . += "You can [bolt_wording] [src] by pressing the unqiue action key. By default, this is space" ///Gets the number of bullets in the gun diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 0f1caa977b9b..bb51dcfa3d40 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -33,28 +33,37 @@ muzzleflash_iconstate = "muzzle_flash_light" -/obj/item/gun/ballistic/automatic/pistol/no_mag - spawnwithmagazine = FALSE - -/obj/item/gun/ballistic/automatic/pistol/suppressed - default_attachments= list(/obj/item/attachment/silencer) - -/obj/item/gun/ballistic/automatic/pistol/suns - desc = "A small, easily concealable 10mm handgun that bears Scarborough Arms stamps. It is painted in the colors of SUNS." - icon_state = "pistol_suns" valid_attachments = list( - /obj/item/attachment/silencer + /obj/item/attachment/silencer, + /obj/item/attachment/laser_sight, + /obj/item/attachment/rail_light, + /obj/item/attachment/bayonet ) slot_available = list( - ATTACHMENT_SLOT_MUZZLE = 1 + ATTACHMENT_SLOT_MUZZLE = 1, + ATTACHMENT_SLOT_RAIL = 1 ) slot_offsets = list( ATTACHMENT_SLOT_MUZZLE = list( "x" = 26, "y" = 20, + ), + ATTACHMENT_SLOT_RAIL = list( + "x" = 19, + "y" = 18, ) ) +/obj/item/gun/ballistic/automatic/pistol/no_mag + spawnwithmagazine = FALSE + +/obj/item/gun/ballistic/automatic/pistol/suppressed + default_attachments = list(/obj/item/attachment/silencer) + +/obj/item/gun/ballistic/automatic/pistol/suns + desc = "A small, easily concealable 10mm handgun that bears Scarborough Arms stamps. It is painted in the colors of SUNS." + icon_state = "pistol_suns" + /obj/item/gun/ballistic/automatic/pistol/candor name = "\improper Candor" desc = "A classic semi-automatic handgun, widely popular throughout the Frontier. An engraving on the slide marks it as a product of Hunter's Pride. Chambered in .45." From db3c2642c463cd9574cf82c008ca7136d902e4f0 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 29 Apr 2024 17:47:57 -0500 Subject: [PATCH 150/206] crates! --- code/modules/cargo/packs/gun.dm | 28 +++++++++++++++++++++ code/modules/projectiles/guns/ballistic.dm | 2 -- icons/obj/guns/projectile.dmi | Bin 46428 -> 41148 bytes 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 85a1cb0e0c3c..096095cd1c6f 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -160,3 +160,31 @@ cost = 5000 contains = list(/obj/item/gun/ballistic/automatic/assault/skm) crate_name = "auto rifle crate" + +/datum/supply_pack/gun/attachment/rail_light + name = "Tactical Rail Light Crate" + desc = "Rail mounted gun light for better visibility down range." + cost = 250 + contains = list(/obj/item/attachment/rail_light) + crate_name = "rail light crate" + +/datum/supply_pack/gun/attachment/laser_sight + name = "Laser Sight Crate" + desc = "Laser sight for better accuracy down range." + cost = 250 + contains = list(/obj/item/attachment/laser_sight) + crate_name = "laser sight crate" + +/datum/supply_pack/gun/attachment/bayonet + name = "Bayonet Crate" + desc = "Bayonet for close quarters combat." + cost = 250 + contains = list(/obj/item/attachment/bayonet) + crate_name = "bayonet crate" + +/datum/supply_pack/gun/attachment/silencer + name = "Silencer Crate" + desc = "Silencer for stealthy operations." + cost = 250 + contains = list(/obj/item/attachment/silencer) + crate_name = "silencer crate" diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index df134dc714e3..1c1c39325ae0 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -33,8 +33,6 @@ . += "[icon_state]_bolt[bolt_locked ? "_locked" : ""]" if (bolt_type == BOLT_TYPE_OPEN && bolt_locked) . += "[icon_state]_bolt" - if (suppressed) - . += "[icon_state]_suppressor" if (magazine) if (special_mags) . += "[icon_state]_mag_[magazine.base_icon_state]" diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 690ed5d86d2fb008d4e0b3d71d0463dbf328c962..541077fb0bb48272c4cb4124ef1e22e224166610 100644 GIT binary patch literal 41148 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 L4Y~4XmZAR*ofJZu From 76cf65071823694d6e9460d4eef25c642348fdad Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 30 Apr 2024 10:11:41 -0500 Subject: [PATCH 151/206] gonna get bitfield proper working --- code/__DEFINES/gun.dm | 61 +++++++++++++++++++ code/datums/components/attachment.dm | 47 -------------- .../game/objects/items/attachments/bayonet.dm | 2 + code/game/objects/items/attachments/scope.dm | 2 + .../projectiles/guns/ballistic/assault.dm | 20 ------ 5 files changed, 65 insertions(+), 67 deletions(-) diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/gun.dm index b2db6bbe71b2..4f9745249883 100644 --- a/code/__DEFINES/gun.dm +++ b/code/__DEFINES/gun.dm @@ -90,6 +90,67 @@ #define MANUFACTURER_PGF "the Etherbor Industries emblem" #define MANUFACTURER_IMPORT "Lanchester Import Co." +///////////////// +// ATTACHMENTS // +///////////////// +#define COMSIG_ATTACHMENT_ATTACH "attach-attach" +#define COMSIG_ATTACHMENT_DETACH "attach-detach" +#define COMSIG_ATTACHMENT_EXAMINE "attach-examine" +#define COMSIG_ATTACHMENT_EXAMINE_MORE "attach-examine-more" +#define COMSIG_ATTACHMENT_PRE_ATTACK "attach-pre-attack" +#define COMSIG_ATTACHMENT_ATTACK "attach-attacked" +#define COMSIG_ATTACHMENT_UPDATE_OVERLAY "attach-overlay" + +#define COMSIG_ATTACHMENT_GET_SLOT "attach-slot-who" +#define ATTACHMENT_SLOT_MUZZLE "attach-slot-muzzle" +#define ATTACHMENT_SLOT_SCOPE "attach-slot-scope" +#define ATTACHMENT_SLOT_GRIP "attach-slot-grip" +#define ATTACHMENT_SLOT_RAIL "attach-slot-rail" + +#define NEW_ATTACHMENT_SLOT_MUZZLE (1<<0) +#define NEW_ATTACHMENT_SLOT_SCOPE (1<<1) +#define NEW_ATTACHMENT_SLOT_GRIP (1<<2) +#define NEW_ATTACHMENT_SLOT_RAIL (1<<3) + +DEFINE_BITFIELD(attach_slots, list( + ATTACHMENT_SLOT_MUZZLE = NEW_ATTACHMENT_SLOT_MUZZLE, + ATTACHMENT_SLOT_SCOPE = NEW_ATTACHMENT_SLOT_SCOPE, + ATTACHMENT_SLOT_GRIP = NEW_ATTACHMENT_SLOT_GRIP, + ATTACHMENT_SLOT_RAIL = NEW_ATTACHMENT_SLOT_RAIL +)) + +#define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" + +#define TRAIT_ATTACHABLE "attachable" + +#define ATTACHMENT_DEFAULT_SLOT_AVAILABLE list( \ + ATTACHMENT_SLOT_MUZZLE = 1, \ + ATTACHMENT_SLOT_SCOPE = 1, \ + ATTACHMENT_SLOT_GRIP = 1, \ + ATTACHMENT_SLOT_RAIL = 1, \ +) + +/proc/attachment_slot_to_bflag(slot) + switch(slot) + if(ATTACHMENT_SLOT_MUZZLE) + return (1<<0) + if(ATTACHMENT_SLOT_SCOPE) + return (1<<1) + if(ATTACHMENT_SLOT_GRIP) + return (1<<2) + if(ATTACHMENT_SLOT_RAIL) + return (1<<3) + +/proc/attachment_slot_from_bflag(slot) + switch(slot) + if(1<<0) + return ATTACHMENT_SLOT_MUZZLE + if(1<<1) + return ATTACHMENT_SLOT_SCOPE + if(1<<2) + return ATTACHMENT_SLOT_GRIP + if(1<<3) + return ATTACHMENT_SLOT_RAIL ///////////////// // PROJECTILES // diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index bb045e08625d..42b55a1f6d76 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -1,50 +1,3 @@ -#define COMSIG_ATTACHMENT_ATTACH "attach-attach" -#define COMSIG_ATTACHMENT_DETACH "attach-detach" -#define COMSIG_ATTACHMENT_EXAMINE "attach-examine" -#define COMSIG_ATTACHMENT_EXAMINE_MORE "attach-examine-more" -#define COMSIG_ATTACHMENT_PRE_ATTACK "attach-pre-attack" -#define COMSIG_ATTACHMENT_ATTACK "attach-attacked" -#define COMSIG_ATTACHMENT_UPDATE_OVERLAY "attach-overlay" - -#define COMSIG_ATTACHMENT_GET_SLOT "attach-slot-who" - #define ATTACHMENT_SLOT_MUZZLE "attach-slot-muzzle" - #define ATTACHMENT_SLOT_SCOPE "attach-slot-scope" - #define ATTACHMENT_SLOT_GRIP "attach-slot-grip" - #define ATTACHMENT_SLOT_RAIL "attach-slot-rail" - -/proc/attachment_slot_to_bflag(slot) - switch(slot) - if(ATTACHMENT_SLOT_MUZZLE) - return (1<<0) - if(ATTACHMENT_SLOT_SCOPE) - return (1<<1) - if(ATTACHMENT_SLOT_GRIP) - return (1<<2) - if(ATTACHMENT_SLOT_RAIL) - return (1<<3) - -/proc/attachment_slot_from_bflag(slot) - switch(slot) - if(1<<0) - return ATTACHMENT_SLOT_MUZZLE - if(1<<1) - return ATTACHMENT_SLOT_SCOPE - if(1<<2) - return ATTACHMENT_SLOT_GRIP - if(1<<3) - return ATTACHMENT_SLOT_RAIL - -#define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" - -#define TRAIT_ATTACHABLE "attachable" - -#define ATTACHMENT_DEFAULT_SLOT_AVAILABLE list( \ - ATTACHMENT_SLOT_MUZZLE = 1, \ - ATTACHMENT_SLOT_SCOPE = 1, \ - ATTACHMENT_SLOT_GRIP = 1, \ - ATTACHMENT_SLOT_RAIL = 1, \ -) - /datum/component/attachment var/slot var/has_toggle diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 3423570db110..5726e456fcbd 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -1,3 +1,4 @@ +/* /obj/item/attachment/e_bayonet name = "bayonet" desc = "Stabby-Stabby" @@ -36,6 +37,7 @@ return COMPONENT_NO_ATTACK melee_attack_chain(user, target, params) return COMPONENT_NO_ATTACK +*/ /obj/item/attachment/bayonet name = "bayonet" diff --git a/code/game/objects/items/attachments/scope.dm b/code/game/objects/items/attachments/scope.dm index 0b4971d53139..c84a2144086c 100644 --- a/code/game/objects/items/attachments/scope.dm +++ b/code/game/objects/items/attachments/scope.dm @@ -1,3 +1,4 @@ +/* /obj/item/attachment/scope name = "bayonet" icon_state = "scope" @@ -22,3 +23,4 @@ gun.actions -= gun.azoom qdel(gun.azoom) return TRUE +*/ diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm index 0f3389d890d7..14957d6d0709 100644 --- a/code/modules/projectiles/guns/ballistic/assault.dm +++ b/code/modules/projectiles/guns/ballistic/assault.dm @@ -125,26 +125,6 @@ spread = 8 spread_unwielded = 15 - valid_attachments = list( - /obj/item/attachment/bayonet, - /obj/item/attachment/rail_light, - /obj/item/attachment/scope - ) - slot_available = list( - ATTACHMENT_SLOT_RAIL = 1, - ATTACHMENT_SLOT_SCOPE = 1 - ) - slot_offsets = list( - ATTACHMENT_SLOT_RAIL = list( - "x" = 24, - "y" = 13, - ), - ATTACHMENT_SLOT_SCOPE = list( - "x" = 15, - "y" = 24, - ) - ) - /obj/item/gun/ballistic/automatic/assault/swiss_cheese/ComponentInitialize() . = ..() AddComponent(/datum/component/automatic_fire, 0.65 SECONDS) From 2e364bb7e2f0a25670e09b1bfad9c1b58a508a24 Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 30 Apr 2024 10:13:42 -0500 Subject: [PATCH 152/206] bit --- code/__DEFINES/gun.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/gun.dm index 4f9745249883..242bf07146c3 100644 --- a/code/__DEFINES/gun.dm +++ b/code/__DEFINES/gun.dm @@ -107,16 +107,16 @@ #define ATTACHMENT_SLOT_GRIP "attach-slot-grip" #define ATTACHMENT_SLOT_RAIL "attach-slot-rail" -#define NEW_ATTACHMENT_SLOT_MUZZLE (1<<0) -#define NEW_ATTACHMENT_SLOT_SCOPE (1<<1) -#define NEW_ATTACHMENT_SLOT_GRIP (1<<2) -#define NEW_ATTACHMENT_SLOT_RAIL (1<<3) +#define BIT_ATTACHMENT_SLOT_MUZZLE (1<<0) +#define BIT_ATTACHMENT_SLOT_SCOPE (1<<1) +#define BIT_ATTACHMENT_SLOT_GRIP (1<<2) +#define BIT_ATTACHMENT_SLOT_RAIL (1<<3) DEFINE_BITFIELD(attach_slots, list( - ATTACHMENT_SLOT_MUZZLE = NEW_ATTACHMENT_SLOT_MUZZLE, - ATTACHMENT_SLOT_SCOPE = NEW_ATTACHMENT_SLOT_SCOPE, - ATTACHMENT_SLOT_GRIP = NEW_ATTACHMENT_SLOT_GRIP, - ATTACHMENT_SLOT_RAIL = NEW_ATTACHMENT_SLOT_RAIL + ATTACHMENT_SLOT_MUZZLE = BIT_ATTACHMENT_SLOT_MUZZLE, + ATTACHMENT_SLOT_SCOPE = BIT_ATTACHMENT_SLOT_SCOPE, + ATTACHMENT_SLOT_GRIP = BIT_ATTACHMENT_SLOT_GRIP, + ATTACHMENT_SLOT_RAIL = BIT_ATTACHMENT_SLOT_RAIL )) #define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" From c55f50d4f7f35e20dbdca3ac577b62cf6deb5e77 Mon Sep 17 00:00:00 2001 From: fallcon Date: Tue, 30 Apr 2024 11:09:39 -0500 Subject: [PATCH 153/206] actions and bipod --- code/datums/components/attachment.dm | 16 +++++++ code/datums/components/attachment_holder.dm | 2 +- code/game/objects/items/attachments/bipod.dm | 47 +++++++++++++++++++ .../objects/items/attachments/rail_light.dm | 2 +- code/game/objects/items/attachments/scope.dm | 2 +- shiptest.dme | 1 + 6 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 code/game/objects/items/attachments/bipod.dm diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 42b55a1f6d76..232ba2564d60 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -44,6 +44,9 @@ for(var/signal in signals) RegisterSignal(parent, signal, signals[signal]) + var/datum/action/attachment_action = new /datum/action/attachment(parent) + actions += attachment_action + /datum/component/attachment/Destroy(force, silent) REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, "attachable") if(actions && length(actions)) @@ -79,6 +82,9 @@ return FALSE parent.forceMove(holder) + if(length(actions)) + holder.actions += actions + return TRUE /datum/component/attachment/proc/try_detach(obj/item/parent, obj/item/holder, mob/user) @@ -90,6 +96,9 @@ if(on_attach && !on_detach.Invoke(holder, user)) return FALSE + if(length(actions)) + holder.actions -= actions + if(user.can_put_in_hand(parent)) user.put_in_hand(parent) return TRUE @@ -112,3 +121,10 @@ /datum/component/attachment/proc/send_slot(obj/item/parent) SIGNAL_HANDLER return attachment_slot_to_bflag(slot) + +/datum/action/attachment + check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS + button_icon_state = null + +/datum/action/attachment/New(target) + name = target.name diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index edb4edb94702..eac43f1345a0 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -112,7 +112,7 @@ attachments += attachment var/atom/parent = src.parent parent.update_icon() - + /datum/component/attachment_holder/proc/do_detach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) slot = attachment_slot_from_bflag(slot) diff --git a/code/game/objects/items/attachments/bipod.dm b/code/game/objects/items/attachments/bipod.dm new file mode 100644 index 000000000000..1b3010fc2d7e --- /dev/null +++ b/code/game/objects/items/attachments/bipod.dm @@ -0,0 +1,47 @@ +/obj/item/attachment/bipod + name = "bipod" + desc = "A bipod that can be attached to a weapon to improve stability." + icon_state = "laserpointer" + has_toggle = TRUE + +/obj/item/attachment/bipod/Attach(obj/item/gun/gun, mob/user) + gun.has_bipod = TRUE + +/obj/item/attachment/bipod/Detach(obj/item/gun/gun, mob/user) + gun.has_bipod = FALSE + +/obj/item/attachment/foldable_stock + name = "foldable stock" + desc = "A foldable stock that can be attached to a weapon to improve stability." + icon_state = "laserpointer" + has_toggle = TRUE + +/obj/item/attachment/foldable_stock/Attach(obj/item/gun/gun, mob/user) + gun.w_class = WEIGHT_CLASS_NORMAL + gun.wield_delay = gun.unfolded_wield_delay + gun.wield_slowdown = gun.unfolded_slowdown + +/obj/item/attachment/foldable_stock/Toggle(obj/item/gun/gun, mob/user) + . = ..() + if(toggled) + to_chat(user, "You unfold the stock on the [src].") + gun.w_class = WEIGHT_CLASS_BULKY + gun.wield_delay = gun.folded_wield_delay + gun.wield_slowdown = gun.folded_slowdown + else + to_chat(user, "You fold the stock on the [src].") + gun.w_class = WEIGHT_CLASS_NORMAL + gun.wield_delay = gun.unfolded_wield_delay + gun.wield_slowdown = gun.unfolded_slowdown + + if(wielded) + user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown) + + toggled = !toggled + playsound(src, 'sound/weapons/empty.ogg', 100, 1) + +/obj/item/attachment/foldable_stock/Detach(obj/item/gun/gun, mob/user) + . = ..() + gun.w_class = initial(gun.w_class) + gun.wield_delay = initial(gun.unfolded_wield_delay) + gun.wield_slowdown = initial(gun.unfolded_slowdown) diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm index a8ae57f7cfdd..c2f10622f717 100644 --- a/code/game/objects/items/attachments/rail_light.dm +++ b/code/game/objects/items/attachments/rail_light.dm @@ -1,5 +1,5 @@ /obj/item/attachment/rail_light - name = "Rail Light" + name = "rail light" desc = "Rail mounted gun light for better visibility down range." icon_state = "raillight" has_toggle = TRUE diff --git a/code/game/objects/items/attachments/scope.dm b/code/game/objects/items/attachments/scope.dm index c84a2144086c..8afdf8112152 100644 --- a/code/game/objects/items/attachments/scope.dm +++ b/code/game/objects/items/attachments/scope.dm @@ -1,6 +1,6 @@ /* /obj/item/attachment/scope - name = "bayonet" + name = "scope" icon_state = "scope" slot = ATTACHMENT_SLOT_SCOPE var/zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. diff --git a/shiptest.dme b/shiptest.dme index 1700da46fc9f..a57c3b5fa62f 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1190,6 +1190,7 @@ #include "code\game\objects\items\weaponry.dm" #include "code\game\objects\items\attachments\_attachment.dm" #include "code\game\objects\items\attachments\bayonet.dm" +#include "code\game\objects\items\attachments\bipod.dm" #include "code\game\objects\items\attachments\laser_sight.dm" #include "code\game\objects\items\attachments\rail_light.dm" #include "code\game\objects\items\attachments\scope.dm" From b12c6159b2f469af11105c30993150129e820311 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 30 Apr 2024 17:44:23 -0500 Subject: [PATCH 154/206] buttons --- code/datums/components/attachment.dm | 12 +++++++----- code/datums/components/crafting/recipes.dm | 2 ++ code/game/objects/items/attachments/bipod.dm | 2 ++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 232ba2564d60..6b83afba5e0e 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -7,6 +7,7 @@ var/datum/callback/on_toggle var/datum/callback/on_preattack var/list/datum/action/actions + var/datum/action/attachment_action /datum/component/attachment/Initialize( slot = ATTACHMENT_SLOT_RAIL, @@ -44,8 +45,8 @@ for(var/signal in signals) RegisterSignal(parent, signal, signals[signal]) - var/datum/action/attachment_action = new /datum/action/attachment(parent) - actions += attachment_action + attachment_action = new /datum/action/attachment(parent) + actions += list(attachment_action) /datum/component/attachment/Destroy(force, silent) REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, "attachable") @@ -84,6 +85,8 @@ parent.forceMove(holder) if(length(actions)) holder.actions += actions + for(var/datum/action/attachment_action in actions) + attachment_action.Grant(user) return TRUE @@ -97,6 +100,8 @@ return FALSE if(length(actions)) + for(var/datum/action/attachment_action in actions) + attachment_action.Remove(user) holder.actions -= actions if(user.can_put_in_hand(parent)) @@ -125,6 +130,3 @@ /datum/action/attachment check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS button_icon_state = null - -/datum/action/attachment/New(target) - name = target.name diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 561774d8dc62..6e6a990de54d 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -25,6 +25,7 @@ /datum/crafting_recipe/proc/check_requirements(mob/user, list/collected_requirements) return TRUE +/* /datum/crafting_recipe/energy_bayonet name = "Plasma Bayonet" result = /obj/item/attachment/e_bayonet @@ -41,6 +42,7 @@ tools = list( TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_MULTITOOL ) +*/ /datum/crafting_recipe/IED name = "IED" diff --git a/code/game/objects/items/attachments/bipod.dm b/code/game/objects/items/attachments/bipod.dm index 1b3010fc2d7e..e85438eeba80 100644 --- a/code/game/objects/items/attachments/bipod.dm +++ b/code/game/objects/items/attachments/bipod.dm @@ -1,3 +1,4 @@ +/* /obj/item/attachment/bipod name = "bipod" desc = "A bipod that can be attached to a weapon to improve stability." @@ -45,3 +46,4 @@ gun.w_class = initial(gun.w_class) gun.wield_delay = initial(gun.unfolded_wield_delay) gun.wield_slowdown = initial(gun.unfolded_slowdown) +*/ From da2af2a1681f783bfc6089cbf99903d9d9c9fc73 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 30 Apr 2024 20:31:45 -0500 Subject: [PATCH 155/206] ough idk actions are being slighlty annoying --- code/datums/components/attachment.dm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 6b83afba5e0e..2e7ac6b91770 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -7,7 +7,8 @@ var/datum/callback/on_toggle var/datum/callback/on_preattack var/list/datum/action/actions - var/datum/action/attachment_action + var/list/datum/action/test_actions + var/datum/action/test_attachment_action /datum/component/attachment/Initialize( slot = ATTACHMENT_SLOT_RAIL, @@ -45,8 +46,9 @@ for(var/signal in signals) RegisterSignal(parent, signal, signals[signal]) - attachment_action = new /datum/action/attachment(parent) - actions += list(attachment_action) + test_attachment_action = new /datum/action/item_action/toggle/attachment(parent) + actions += list(test_attachment_action) + test_actions += list(test_attachment_action) /datum/component/attachment/Destroy(force, silent) REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, "attachable") @@ -85,7 +87,7 @@ parent.forceMove(holder) if(length(actions)) holder.actions += actions - for(var/datum/action/attachment_action in actions) + for(var/datum/action/item_action/toggle/attachment_action in actions) attachment_action.Grant(user) return TRUE @@ -100,9 +102,12 @@ return FALSE if(length(actions)) - for(var/datum/action/attachment_action in actions) + for(var/datum/action/item_action/toggle/attachment_action in actions) attachment_action.Remove(user) + to_chat(user, length(actions)) holder.actions -= actions + to_chat(user, length(actions)) + test_actions += actions if(user.can_put_in_hand(parent)) user.put_in_hand(parent) @@ -127,6 +132,4 @@ SIGNAL_HANDLER return attachment_slot_to_bflag(slot) -/datum/action/attachment - check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS - button_icon_state = null +/datum/action/item_action/toggle/attachment From 5ddd1a0ba764f48b83769b2c38c027b180f3510b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 30 Apr 2024 22:03:05 -0500 Subject: [PATCH 156/206] making progress just need to get the icon updated --- code/datums/components/attachment.dm | 62 ++++++++++++++----- code/datums/components/attachment_holder.dm | 7 ++- .../objects/items/attachments/_attachment.dm | 4 ++ 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 2e7ac6b91770..ac40e0326a74 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -7,8 +7,7 @@ var/datum/callback/on_toggle var/datum/callback/on_preattack var/list/datum/action/actions - var/list/datum/action/test_actions - var/datum/action/test_attachment_action + var/datum/action/attachment/attachment_toggle_action /datum/component/attachment/Initialize( slot = ATTACHMENT_SLOT_RAIL, @@ -46,9 +45,8 @@ for(var/signal in signals) RegisterSignal(parent, signal, signals[signal]) - test_attachment_action = new /datum/action/item_action/toggle/attachment(parent) - actions += list(test_attachment_action) - test_actions += list(test_attachment_action) + if(has_toggle) + attachment_toggle_action = new /datum/action/attachment(parent) /datum/component/attachment/Destroy(force, silent) REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, "attachable") @@ -85,10 +83,11 @@ return FALSE parent.forceMove(holder) - if(length(actions)) - holder.actions += actions - for(var/datum/action/item_action/toggle/attachment_action in actions) - attachment_action.Grant(user) + + if(has_toggle) + holder.actions += list(attachment_toggle_action) + attachment_toggle_action.gun = holder + attachment_toggle_action.Grant(user) return TRUE @@ -101,13 +100,10 @@ if(on_attach && !on_detach.Invoke(holder, user)) return FALSE - if(length(actions)) - for(var/datum/action/item_action/toggle/attachment_action in actions) - attachment_action.Remove(user) - to_chat(user, length(actions)) - holder.actions -= actions - to_chat(user, length(actions)) - test_actions += actions + if(has_toggle) + holder.actions -= list(attachment_toggle_action) + attachment_toggle_action.gun = null + attachment_toggle_action.Remove(user) if(user.can_put_in_hand(parent)) user.put_in_hand(parent) @@ -132,4 +128,36 @@ SIGNAL_HANDLER return attachment_slot_to_bflag(slot) -/datum/action/item_action/toggle/attachment +/datum/action/attachment + name = "Toggle Attachment" + check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS + button_icon_state = null + var/obj/item/gun/gun = null + +/datum/action/attachment/New(Target) + ..() + name = "Toggle [target.name]" + button.name = name + icon_icon = target.icon + button_icon_state = target.icon_state + +/datum/action/attachment/Trigger() + ..() + SEND_SIGNAL(target, COMSIG_ATTACHMENT_TOGGLE, gun, owner) + +/datum/action/attachment/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) + if(button_icon && button_icon_state) + // If set, use the custom icon that we set instead + // of the item appearence + ..() + else if((target && current_button.appearance_cache != target.appearance) || force) //replace with /ref comparison if this is not valid. + var/obj/item/I = target + var/old_layer = I.layer + var/old_plane = I.plane + I.layer = FLOAT_LAYER //AAAH + I.plane = FLOAT_PLANE //^ what that guy said + current_button.cut_overlays() + current_button.add_overlay(I) + I.layer = old_layer + I.plane = old_plane + current_button.appearance_cache = I.appearance diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index eac43f1345a0..ddb68204d2eb 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -28,9 +28,10 @@ RegisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT, PROC_REF(handle_ctrl_shift_click)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(handle_overlays)) - if(default_attachments) + if(length(default_attachments)) for(var/obj/item/attachment/attachment in default_attachments) - INVOKE_ASYNC(src, PROC_REF(do_attach), attachment, null) + var/obj/item/attachment/new_attachment = new(attachment) + INVOKE_ASYNC(src, PROC_REF(do_attach), new_attachment, null) /datum/component/attachment_holder/proc/handle_overlays(obj/item/parent, list/overlays) SIGNAL_HANDLER @@ -112,7 +113,7 @@ attachments += attachment var/atom/parent = src.parent parent.update_icon() - + /datum/component/attachment_holder/proc/do_detach(obj/item/attachment, mob/user) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) slot = attachment_slot_from_bflag(slot) diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index 805530ae5419..1a829a428d33 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -12,6 +12,9 @@ var/datum/component/attachment/attachment_comp + var/toggle_on_sound = 'sound/items/flashlight_on.ogg' + var/toggle_off_sound = 'sound/items/flashlight_off.ogg' + ///Determines the amount of pixels to move the icon state for the overlay. in the x direction var/pixel_shift_x = 16 ///Determines the amount of pixels to move the icon state for the overlay. in the y direction @@ -38,6 +41,7 @@ /obj/item/attachment/proc/Toggle(obj/item/gun/gun, mob/user) SHOULD_CALL_PARENT(TRUE) + playsound(user, toggled ? toggle_on_sound : toggle_off_sound, 40, TRUE) toggled = !toggled icon_state = "[initial(icon_state)][toggled ? "-on" : ""]" From 42f1ac1357bdd49d485fa1a9c3e5447f4a0f206b Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 1 May 2024 09:00:10 -0500 Subject: [PATCH 157/206] attachment flags --- code/__DEFINES/gun.dm | 4 ++++ code/datums/components/attachment.dm | 20 +++++++++---------- code/datums/components/attachment_holder.dm | 5 +++-- .../objects/items/attachments/_attachment.dm | 9 ++++----- .../game/objects/items/attachments/bayonet.dm | 2 +- code/game/objects/items/attachments/bipod.dm | 4 ++-- .../objects/items/attachments/laser_sight.dm | 2 +- .../objects/items/attachments/rail_light.dm | 2 +- code/game/objects/items/attachments/scope.dm | 2 -- .../objects/items/attachments/silencer.dm | 1 - 10 files changed, 25 insertions(+), 26 deletions(-) diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/gun.dm index 242bf07146c3..a43499e5c8f1 100644 --- a/code/__DEFINES/gun.dm +++ b/code/__DEFINES/gun.dm @@ -152,6 +152,10 @@ DEFINE_BITFIELD(attach_slots, list( if(1<<3) return ATTACHMENT_SLOT_RAIL +//attach_features_flags +#define ATTACH_REMOVABLE (1<<0) +#define ATTACH_TOGGLE (1<<1) + ///////////////// // PROJECTILES // ///////////////// diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index ac40e0326a74..8fb5c9f5c949 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -1,6 +1,6 @@ /datum/component/attachment var/slot - var/has_toggle + var/attach_features_flags var/list/valid_parent_types var/datum/callback/on_attach var/datum/callback/on_detach @@ -11,7 +11,7 @@ /datum/component/attachment/Initialize( slot = ATTACHMENT_SLOT_RAIL, - has_toggle = FALSE, + attach_features_flags = ATTACH_REMOVABLE, valid_parent_types = list(/obj/item/gun), datum/callback/on_attach = null, datum/callback/on_detach = null, @@ -24,7 +24,7 @@ return COMPONENT_INCOMPATIBLE src.slot = slot - src.has_toggle = has_toggle + src.attach_features_flags = attach_features_flags src.valid_parent_types = valid_parent_types src.on_attach = on_attach src.on_detach = on_detach @@ -36,8 +36,9 @@ RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, PROC_REF(try_detach)) RegisterSignal(parent, COMSIG_ATTACHMENT_EXAMINE, PROC_REF(handle_examine)) RegisterSignal(parent, COMSIG_ATTACHMENT_EXAMINE_MORE, PROC_REF(handle_examine_more)) - if(has_toggle) + if(CHECK_BITFIELD(attach_features_flags, ATTACH_TOGGLE)) RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, PROC_REF(try_toggle)) + attachment_toggle_action = new /datum/action/attachment(parent) RegisterSignal(parent, COMSIG_ATTACHMENT_PRE_ATTACK, PROC_REF(relay_pre_attack)) RegisterSignal(parent, COMSIG_ATTACHMENT_UPDATE_OVERLAY, PROC_REF(update_overlays)) RegisterSignal(parent, COMSIG_ATTACHMENT_GET_SLOT, PROC_REF(send_slot)) @@ -45,9 +46,6 @@ for(var/signal in signals) RegisterSignal(parent, signal, signals[signal]) - if(has_toggle) - attachment_toggle_action = new /datum/action/attachment(parent) - /datum/component/attachment/Destroy(force, silent) REMOVE_TRAIT(parent, TRAIT_ATTACHABLE, "attachable") if(actions && length(actions)) @@ -58,8 +56,8 @@ /datum/component/attachment/proc/try_toggle(obj/item/parent, obj/item/holder, mob/user) SIGNAL_HANDLER - - INVOKE_ASYNC(src, PROC_REF(do_toggle), parent, holder, user) + if(CHECK_BITFIELD(attach_features_flags, ATTACH_TOGGLE)) + INVOKE_ASYNC(src, PROC_REF(do_toggle), parent, holder, user) /datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user) @@ -84,7 +82,7 @@ parent.forceMove(holder) - if(has_toggle) + iif(CHECK_BITFIELD(attach_features_flags, ATTACH_TOGGLE)) holder.actions += list(attachment_toggle_action) attachment_toggle_action.gun = holder attachment_toggle_action.Grant(user) @@ -100,7 +98,7 @@ if(on_attach && !on_detach.Invoke(holder, user)) return FALSE - if(has_toggle) + if(CHECK_BITFIELD(attach_features_flags, ATTACH_TOGGLE)) holder.actions -= list(attachment_toggle_action) attachment_toggle_action.gun = null attachment_toggle_action.Remove(user) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index ddb68204d2eb..6ad14fd71d20 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -63,7 +63,7 @@ if(attach.name in .) stack_trace("two attachments with same name; this shouldn't happen and will cause failures") continue - if(only_toggles && !attach.has_toggle) + if(only_toggles && !CHECK_BITFIELD(attach.attach_features_flags, ATTACH_TOGGLE)) continue .[attach.name] = attach @@ -128,7 +128,8 @@ /datum/component/attachment_holder/proc/handle_detach(obj/item/parent, obj/item/tool, mob/user) var/list/list = list() for(var/obj/item/attach as anything in attachments) - list[attach.name] = attach + if(CHECK_BITFIELD(attach.attach_features_flags, ATTACH_REMOVABLE)) + list[attach.name] = attach var/selected = tgui_input_list(user, "Select Attachment", "Detach", list) if(!parent.Adjacent(user) || !selected || !tool || !tool.use_tool(parent, user, 2 SECONDS * tool.toolspeed)) return diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index 1a829a428d33..36f4b7fe4459 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -4,14 +4,13 @@ icon = 'icons/obj/guns/attachments.dmi' var/slot = ATTACHMENT_SLOT_RAIL + ///various yes no flags associated with attachments. See defines for these: [ATTACH_REMOVABLE] + var/attach_features_flags = ATTACH_REMOVABLE var/list/valid_parents = list() var/list/signals = list() - - var/has_toggle = FALSE - var/toggled = FALSE - var/datum/component/attachment/attachment_comp + var/toggled = FALSE var/toggle_on_sound = 'sound/items/flashlight_on.ogg' var/toggle_off_sound = 'sound/items/flashlight_off.ogg' @@ -25,7 +24,7 @@ attachment_comp = AddComponent( \ /datum/component/attachment, \ slot, \ - has_toggle, \ + attach_features_flags, \ valid_parents, \ CALLBACK(src, PROC_REF(Attach)), \ CALLBACK(src, PROC_REF(Detach)), \ diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 5726e456fcbd..0ecad1f91da0 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -5,7 +5,7 @@ icon_state = "ebayonet" force = 2 - has_toggle = TRUE + attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE var/force_on = 20 var/extended = FALSE var/reach_extended = 2 diff --git a/code/game/objects/items/attachments/bipod.dm b/code/game/objects/items/attachments/bipod.dm index e85438eeba80..8397e036c85c 100644 --- a/code/game/objects/items/attachments/bipod.dm +++ b/code/game/objects/items/attachments/bipod.dm @@ -3,7 +3,7 @@ name = "bipod" desc = "A bipod that can be attached to a weapon to improve stability." icon_state = "laserpointer" - has_toggle = TRUE + attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE /obj/item/attachment/bipod/Attach(obj/item/gun/gun, mob/user) gun.has_bipod = TRUE @@ -15,7 +15,7 @@ name = "foldable stock" desc = "A foldable stock that can be attached to a weapon to improve stability." icon_state = "laserpointer" - has_toggle = TRUE + attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE /obj/item/attachment/foldable_stock/Attach(obj/item/gun/gun, mob/user) gun.w_class = WEIGHT_CLASS_NORMAL diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm index ffb03d39610d..226ae8b6deb2 100644 --- a/code/game/objects/items/attachments/laser_sight.dm +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -2,7 +2,7 @@ name = "Laser Sight" desc = "This laser sight is designed to be rail-mounted on a compatible firearm to provide increased accuracy." icon_state = "laserpointer" - has_toggle = TRUE + attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE pixel_shift_x = 1 pixel_shift_y = 4 diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm index c2f10622f717..d782e23123ac 100644 --- a/code/game/objects/items/attachments/rail_light.dm +++ b/code/game/objects/items/attachments/rail_light.dm @@ -2,7 +2,7 @@ name = "rail light" desc = "Rail mounted gun light for better visibility down range." icon_state = "raillight" - has_toggle = TRUE + attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE pixel_shift_x = 1 pixel_shift_y = 4 diff --git a/code/game/objects/items/attachments/scope.dm b/code/game/objects/items/attachments/scope.dm index 8afdf8112152..ea29f2272e00 100644 --- a/code/game/objects/items/attachments/scope.dm +++ b/code/game/objects/items/attachments/scope.dm @@ -5,8 +5,6 @@ slot = ATTACHMENT_SLOT_SCOPE var/zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. var/zoom_out_amt = 5 - has_toggle = FALSE - /obj/item/attachment/scope/Attach(obj/item/gun/gun, mob/user) . = ..() diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index c6c25a407277..2612a39be005 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -3,7 +3,6 @@ desc = "For when you need to kill someone but not be seen killing someone!" icon_state = "silencer" slot = ATTACHMENT_SLOT_MUZZLE - has_toggle = FALSE pixel_shift_x = 1 pixel_shift_y = 1 From 62f651cbd0d195e06c896383ca3a16325fa35304 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 1 May 2024 09:59:13 -0500 Subject: [PATCH 158/206] sound and var orginization --- .../objects/items/attachments/_attachment.dm | 3 + code/modules/projectiles/gun.dm | 184 +++++++++++------- .../projectiles/guns/energy/energy_gun.dm | 2 +- .../projectiles/guns/energy/special.dm | 2 +- 4 files changed, 116 insertions(+), 75 deletions(-) diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index 36f4b7fe4459..8f0a3a360159 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -52,6 +52,7 @@ to_chat(user, "You cannot attach [src] while it is active!") return FALSE + playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1) return TRUE /obj/item/attachment/proc/Detach(obj/item/gun/gun, mob/user) @@ -59,6 +60,8 @@ if(toggled) Toggle(gun, user) + + playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1) return TRUE /obj/item/attachment/proc/PreAttack(obj/item/gun/gun, atom/target, mob/user, list/params) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index dc9e00926352..0656c8aa515f 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -50,6 +50,10 @@ * Reloading */ var/obj/item/ammo_casing/chambered = null + ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it + var/tac_reloads = TRUE + ///If we have the 'snowflake mechanic,' how long should it take to reload? + var/tactical_reload_delay = 1 SECONDS /* * Operation @@ -58,9 +62,6 @@ var/suppressed = null var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' var/suppressed_volume = 60 - //description change if weapon is sawn-off - var/sawn_desc = null - var/sawn_off = FALSE //true if the gun is wielded via twohanded component, shouldnt affect anything else var/wielded = FALSE @@ -120,8 +121,6 @@ /* * Attachment */ - ///Attachments spawned on initialization. Should also be in valid attachments or it SHOULD(once i add that) fail - var/list/default_attachments = list() ///The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED var/list/valid_attachments = list() ///Reference to our attachment holder to prevent subtypes having to call GetComponent @@ -154,8 +153,48 @@ var/safety_wording = "safety" /* + * Spawn Info (Stuff that becomes useless onces the gun is spawned) +*/ + ///Attachments spawned on initialization. Should also be in valid attachments or it SHOULD(once i add that) fail + var/list/default_attachments = list() + + +/* + * * Ballistic... For now + * */ + +/* + * Reloading +*/ + ///Compatible magazines with the gun + var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info + ///Whether the sprite has a visible magazine or not + var/mag_display = FALSE + ///Whether the sprite has a visible ammo display or not + var/mag_display_ammo = FALSE + ///Whether the sprite has a visible indicator for being empty or not. + var/empty_indicator = FALSE + ///Whether the gun alarms when empty or not. + var/empty_alarm = FALSE + ///Do we eject the magazine upon runing out of ammo? + var/empty_autoeject = FALSE + ///Whether the gun supports multiple special mag types + var/special_mags = FALSE + + ///Actual magazine currently contained within the gun + var/obj/item/ammo_box/magazine/magazine + ///whether the gun ejects the chambered casing + var/casing_ejector = TRUE + ///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT. + var/internal_magazine = FALSE + + ///Phrasing of the magazine in examine and notification messages; ex: magazine, box, etx + var/magazine_wording = "magazine" + ///Phrasing of the cartridge in examine and notification messages; ex: bullet, shell, dart, etc. + var/cartridge_wording = "bullet" + ///sound when inserting magazine var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' ///sound when inserting an empty magazine @@ -164,6 +203,37 @@ var/load_sound_volume = 40 ///whether loading sound should vary var/load_sound_vary = TRUE + ///Sound of ejecting a magazine + var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' + ///sound of ejecting an empty magazine + var/eject_empty_sound = 'sound/weapons/gun/general/magazine_remove_empty.ogg' + ///volume of ejecting a magazine + var/eject_sound_volume = 40 + ///whether eject sound should vary + var/eject_sound_vary = TRUE + +/* + * Operation +*/ + ///Whether the gun has to be racked each shot or not. + var/semi_auto = TRUE + ///The bolt type of the gun, affects quite a bit of functionality, see gun.dm in defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT + var/bolt_type = BOLT_TYPE_STANDARD + ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both. + var/bolt_locked = FALSE + ///Phrasing of the bolt in examine and notification messages; ex: bolt, slide, etc. + var/bolt_wording = "bolt" + ///length between individual racks + var/rack_delay = 5 + ///time of the most recent rack, used for cooldown purposes + var/recent_rack = 0 + + ///Whether the gun can be sawn off by sawing tools + var/can_be_sawn_off = FALSE + //description change if weapon is sawn-off + var/sawn_desc = null + var/sawn_off = FALSE + ///sound of racking var/rack_sound = 'sound/weapons/gun/general/bolt_rack.ogg' ///volume of racking @@ -176,14 +246,7 @@ var/lock_back_sound_volume = 60 ///whether lock back varies var/lock_back_sound_vary = TRUE - ///Sound of ejecting a magazine - var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' - ///sound of ejecting an empty magazine - var/eject_empty_sound = 'sound/weapons/gun/general/magazine_remove_empty.ogg' - ///volume of ejecting a magazine - var/eject_sound_volume = 40 - ///whether eject sound should vary - var/eject_sound_vary = TRUE + ///sound of dropping the bolt or releasing a slide var/bolt_drop_sound = 'sound/weapons/gun/general/bolt_drop.ogg' ///volume of bolt drop/slide release @@ -195,83 +258,32 @@ ///whether empty alarm sound varies var/empty_alarm_vary = TRUE +/* + * Spawn Info (Stuff that becomes useless onces the gun is spawned) +*/ ///Whether the gun will spawn loaded with a magazine var/spawnwithmagazine = TRUE - ///Compatible magazines with the gun - var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info - ///Whether the sprite has a visible magazine or not - var/mag_display = FALSE - ///Whether the sprite has a visible ammo display or not - var/mag_display_ammo = FALSE - ///Whether the sprite has a visible indicator for being empty or not. - var/empty_indicator = FALSE - ///Whether the gun alarms when empty or not. - var/empty_alarm = FALSE - ///Do we eject the magazine upon runing out of ammo? - var/empty_autoeject = FALSE - ///Whether the gun supports multiple special mag types - var/special_mags = FALSE - ///The bolt type of the gun, affects quite a bit of functionality, see gun.dm in defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT - var/bolt_type = BOLT_TYPE_STANDARD - ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both. - var/bolt_locked = FALSE - ///Whether the gun has to be racked each shot or not. - var/semi_auto = TRUE - ///Actual magazine currently contained within the gun - var/obj/item/ammo_box/magazine/magazine - ///whether the gun ejects the chambered casing - var/casing_ejector = TRUE - ///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT. - var/internal_magazine = FALSE - ///Phrasing of the bolt in examine and notification messages; ex: bolt, slide, etc. - var/bolt_wording = "bolt" - ///Phrasing of the magazine in examine and notification messages; ex: magazine, box, etx - var/magazine_wording = "magazine" - ///Phrasing of the cartridge in examine and notification messages; ex: bullet, shell, dart, etc. - var/cartridge_wording = "bullet" - ///length between individual racks - var/rack_delay = 5 - ///time of the most recent rack, used for cooldown purposes - var/recent_rack = 0 - ///Whether the gun can be sawn off by sawing tools - var/can_be_sawn_off = FALSE - ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it - var/tac_reloads = TRUE - ///If we have the 'snowflake mechanic,' how long should it take to reload? - var/tactical_reload_delay = 1 SECONDS /* + * * Enegry and powered... For now + * +*/ + +/* + * Reloading */ //What type of power cell this uses var/obj/item/stock_parts/cell/gun/cell var/cell_type = /obj/item/stock_parts/cell/gun - var/modifystate = 0 - var/list/ammo_type = list(/obj/item/ammo_casing/energy) - //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. - var/select = 1 //Can it be charged in a recharger? var/can_charge = TRUE - //Do we handle overlays with base update_appearance()? - var/automatic_charge_overlays = TRUE - var/charge_sections = 4 - - //if this gun uses a stateful charge bar for more detail - var/shaded_charge = FALSE var/selfcharge = 0 var/charge_tick = 0 var/charge_delay = 4 //whether the gun's cell drains the cyborg user's cell to recharge var/use_cyborg_cell = FALSE - //set to true so the gun is given an empty cell - var/dead_cell = FALSE - - //play empty alarm if no battery - var/empty_battery_sound = FALSE - ///if the gun's cell cannot be replaced - var/internal_cell = FALSE - ///Used for large and small cells var/mag_size = MAG_SIZE_MEDIUM //Time it takes to unscrew the cell @@ -279,6 +291,32 @@ //Volume of loading/unloading cell sounds var/sound_volume = 40 + //play empty alarm if no battery + var/empty_battery_sound = FALSE + ///if the gun's cell cannot be replaced + var/internal_cell = FALSE + + var/list/ammo_type = list(/obj/item/ammo_casing/energy) + //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. + var/select = 1 + +/* + * Overlay +*/ + //Do we handle overlays with base update_appearance()? + var/automatic_charge_overlays = TRUE + var/charge_sections = 4 + //if this gun uses a stateful charge bar for more detail + var/shaded_charge = FALSE + //Modifies WHOS state //im SOMEWHAT this is wether or not the overlay changes based on the ammo type selected + var/modifystate = TRUE + +/* + * Spawn Info +*/ + //set to true so the gun is given an empty cell + var/dead_cell = FALSE + /obj/item/gun/Initialize() . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 972a0a083893..33a55d182851 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -4,7 +4,7 @@ icon_state = "energy" item_state = null //so the human update icon uses the icon_state instead. ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser) - modifystate = 1 + modifystate = TRUE ammo_x_offset = 2 dual_wield_spread = 60 manufacturer = MANUFACTURER_SHARPLITE_NEW diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index af094d2410b3..b1fff0a4eaaa 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -44,7 +44,7 @@ icon_state = "flora" item_state = "gun" ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut, /obj/item/ammo_casing/energy/flora/revolution) - modifystate = 1 + modifystate = TRUE ammo_x_offset = 1 selfcharge = 1 shaded_charge = 1 From 3a448a91dff8b94cea3486ba85dee51cd47a3402 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 1 May 2024 10:04:27 -0500 Subject: [PATCH 159/206] these do the same thing --- code/modules/projectiles/gun.dm | 2 -- code/modules/projectiles/guns/energy.dm | 4 ++-- code/modules/projectiles/guns/powered.dm | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 0656c8aa515f..5d510f8487d7 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -288,8 +288,6 @@ var/mag_size = MAG_SIZE_MEDIUM //Time it takes to unscrew the cell var/unscrewing_time = 2 SECONDS - //Volume of loading/unloading cell sounds - var/sound_volume = 40 //play empty alarm if no battery var/empty_battery_sound = FALSE diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 2cd7c756d9ed..fbcb1523b665 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -110,7 +110,7 @@ if(user.transferItemToLoc(C, src)) cell = C to_chat(user, "You load the [C] into \the [src].") - playsound(src, load_sound, sound_volume, load_sound_vary) + playsound(src, load_sound, load_sound_volume, load_sound_vary) update_appearance() return TRUE else @@ -118,7 +118,7 @@ return FALSE /obj/item/gun/energy/proc/eject_cell(mob/user, obj/item/stock_parts/cell/gun/tac_load = null) - playsound(src, load_sound, sound_volume, load_sound_vary) + playsound(src, load_sound, load_sound_volume, load_sound_vary) cell.forceMove(drop_location()) var/obj/item/stock_parts/cell/gun/old_cell = cell old_cell.update_appearance() diff --git a/code/modules/projectiles/guns/powered.dm b/code/modules/projectiles/guns/powered.dm index 85c4566060dc..a9ab2f6365f4 100644 --- a/code/modules/projectiles/guns/powered.dm +++ b/code/modules/projectiles/guns/powered.dm @@ -55,7 +55,7 @@ if(user.transferItemToLoc(C, src)) cell = C to_chat(user, "You load the [C] into \the [src].") - playsound(src, load_sound, sound_volume, load_sound_vary) + playsound(src, load_sound, load_sound_volume, load_sound_vary) update_appearance() return TRUE else @@ -63,7 +63,7 @@ return FALSE /obj/item/gun/ballistic/automatic/powered/proc/eject_cell(mob/user, obj/item/stock_parts/cell/gun/tac_load = null) - playsound(src, load_sound, sound_volume, load_sound_vary) + playsound(src, load_sound, load_sound_volume, load_sound_vary) cell.forceMove(drop_location()) var/obj/item/stock_parts/cell/gun/old_cell = cell cell = null From d1e6134db7867cd47f4d9fc69895553c1e27f3d4 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 1 May 2024 10:23:09 -0500 Subject: [PATCH 160/206] true false --- .../whitesands_surface_starfurycrash.dmm | 2 +- _maps/RandomRuins/SpaceRuins/bigderelict1.dmm | 6 +- _maps/RandomRuins/SpaceRuins/ntfacility.dmm | 2 +- _maps/shuttles/inteq/inteq_talos.dmm | 4 +- _maps/shuttles/inteq/inteq_vaquero.dmm | 2 +- _maps/shuttles/minutemen/minutemen_vela.dmm | 2 +- .../syndicate/syndicate_twinkleshine.dmm | 16 +- code/game/mecha/equipment/weapons/weapons.dm | 4 +- .../projectiles/ammunition/_ammunition.dm | 2 +- code/modules/projectiles/gun.dm | 280 ++++++++---------- .../projectiles/guns/energy/energy_gun.dm | 2 +- code/modules/projectiles/guns/energy/laser.dm | 2 +- .../projectiles/guns/energy/special.dm | 4 +- 13 files changed, 151 insertions(+), 177 deletions(-) diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm index bc8616028058..cca785f97444 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm @@ -35,7 +35,7 @@ /area/overmap_encounter/planetoid/cave/explored) "dX" = ( /obj/item/gun/ballistic/automatic/pistol{ - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /turf/open/floor/plating/asteroid/whitesands, /area/overmap_encounter/planetoid/cave/explored) diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index a4f6006bf88b..6c06010bbd58 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -523,7 +523,7 @@ /area/ruin/space/has_grav/derelictoutpost/powerstorage) "bI" = ( /obj/item/gun/ballistic/automatic/pistol/candor{ - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/derelictoutpost/powerstorage) @@ -1334,7 +1334,7 @@ name = "gelatinous floor" }, /obj/item/gun/ballistic/automatic/pistol/candor{ - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/item/ammo_box/magazine/m45, /turf/open/floor/plating/asteroid, @@ -1494,7 +1494,7 @@ /area/ruin/space/has_grav/derelictoutpost) "dJ" = ( /obj/item/gun/ballistic/automatic/pistol/candor{ - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/structure/alien/weeds{ color = "#4BAE56"; diff --git a/_maps/RandomRuins/SpaceRuins/ntfacility.dmm b/_maps/RandomRuins/SpaceRuins/ntfacility.dmm index d17fe7601d26..dc1ecbdcfa59 100644 --- a/_maps/RandomRuins/SpaceRuins/ntfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/ntfacility.dmm @@ -1620,7 +1620,7 @@ /area/ruin/powered) "KJ" = ( /obj/item/gun/ballistic/revolver/detective{ - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/effect/decal/cleanable/blood, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/inteq/inteq_talos.dmm b/_maps/shuttles/inteq/inteq_talos.dmm index 45ecbf33d0a7..6b13af4e6089 100644 --- a/_maps/shuttles/inteq/inteq_talos.dmm +++ b/_maps/shuttles/inteq/inteq_talos.dmm @@ -3420,11 +3420,11 @@ /obj/item/gun/ballistic/shotgun/bulldog/inteq{ pixel_x = -8; pixel_y = 8; - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/item/gun/ballistic/shotgun/bulldog/inteq{ pixel_x = -12; - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /turf/open/floor/plasteel/tech/grid, /area/ship/security/armory) diff --git a/_maps/shuttles/inteq/inteq_vaquero.dmm b/_maps/shuttles/inteq/inteq_vaquero.dmm index 927f372ab3c5..073ca9cc770e 100644 --- a/_maps/shuttles/inteq/inteq_vaquero.dmm +++ b/_maps/shuttles/inteq/inteq_vaquero.dmm @@ -266,7 +266,7 @@ /obj/item/gun/ballistic/shotgun/bulldog/inteq{ pixel_x = -4; pixel_y = 5; - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/item/gun/ballistic/automatic/pistol/commander/inteq, /obj/item/gun/ballistic/automatic/pistol/commander/inteq{ diff --git a/_maps/shuttles/minutemen/minutemen_vela.dmm b/_maps/shuttles/minutemen/minutemen_vela.dmm index d4ae92298e58..4fb439e0de16 100644 --- a/_maps/shuttles/minutemen/minutemen_vela.dmm +++ b/_maps/shuttles/minutemen/minutemen_vela.dmm @@ -8278,7 +8278,7 @@ /obj/item/gun/ballistic/automatic/pistol/commander, /obj/item/gun/ballistic/automatic/pistol/commander, /obj/item/gun/ballistic/automatic/smg/cm5{ - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/machinery/light/small/directional/south, /turf/open/floor/plasteel/tech, diff --git a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm index 5878f667db1e..4f1a3d9a5fdf 100644 --- a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm +++ b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm @@ -4676,7 +4676,7 @@ pixel_y = 1 }, /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate{ - spawnwithmagazine = 0; + spawnwithmagazine = FALSE; pixel_x = -3; pixel_y = 6 }, @@ -5615,12 +5615,12 @@ /obj/item/gun/ballistic/automatic/ebr{ pixel_x = -16; pixel_y = 7; - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/item/gun/ballistic/automatic/ebr{ pixel_x = -9; pixel_y = 2; - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/item/ammo_box/magazine/ebr{ pixel_x = 10; @@ -7512,12 +7512,12 @@ /obj/item/gun/ballistic/shotgun/bulldog{ pixel_x = -7; pixel_y = 7; - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/item/gun/ballistic/shotgun/bulldog{ pixel_y = -3; pixel_x = 2; - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/machinery/light/directional/north, /obj/item/ammo_box/magazine/m12g{ @@ -8851,16 +8851,16 @@ /obj/item/gun/ballistic/automatic/smg/c20r{ pixel_x = 2; pixel_y = 8; - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/item/gun/ballistic/automatic/smg/c20r{ pixel_y = 3; - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/item/gun/ballistic/automatic/smg/c20r{ pixel_y = -2; pixel_x = 3; - spawnwithmagazine = 0 + spawnwithmagazine = FALSE }, /obj/item/ammo_box/magazine/smgm45, /obj/item/ammo_box/magazine/smgm45, diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 4a16a6f9b249..90b1a91bb20c 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -6,7 +6,7 @@ var/fire_sound var/projectiles_per_shot = 1 var/variance = 0 - var/randomspread = 0 //use random spread for machineguns, instead of shotgun scatter + var/randomspread = FALSE //use random spread for machineguns, instead of shotgun scatter var/projectile_delay = 0 var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired. var/kickback = TRUE //Will using this weapon in no grav push mecha back. @@ -347,7 +347,7 @@ projectiles_cache_max = 1200 projectiles_per_shot = 3 variance = 6 - randomspread = 1 + randomspread = TRUE projectile_delay = 2 harmful = TRUE ammo_type = "lmg" diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 5b7317972175..7325f9e4ab91 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -32,7 +32,7 @@ var/pellets = 1 //Pellets for spreadshot var/variance = 0 //Variance for inaccuracy fundamental to the casing - var/randomspread = 0 //Randomspread for automatics + var/randomspread = FALSE //Randomspread for automatics var/delay = 0 //Delay for energy weapons var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown. diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 5d510f8487d7..2937c32e5982 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -55,127 +55,9 @@ ///If we have the 'snowflake mechanic,' how long should it take to reload? var/tactical_reload_delay = 1 SECONDS -/* - * Operation -*/ - //whether or not a message is displayed when fired - var/suppressed = null - var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - var/suppressed_volume = 60 - - //true if the gun is wielded via twohanded component, shouldnt affect anything else - var/wielded = FALSE - //true if the gun is wielded after delay, should affects accuracy - var/wielded_fully = FALSE - ///Slowdown for wielding - var/wield_slowdown = 0.1 - ///How long between wielding and firing in tenths of seconds - var/wield_delay = 0.4 SECONDS - ///Storing value for above - var/wield_time = 0 - -/* - * Stats -*/ - var/weapon_weight = WEAPON_LIGHT - //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. - var/projectile_damage_multiplier = 1 - //Speed someone can be flung if its point blank - var/pb_knockback = 0 - - //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. - var/randomspread = 1 - ///How much the bullet scatters when fired while wielded. - var/spread = 4 - ///How much the bullet scatters when fired while unwielded. - var/spread_unwielded = 12 - //additional spread when dual wielding - var/dual_wield_spread = 24 - - - ///Screen shake when the weapon is fired while wielded. - var/recoil = 0 - ///Screen shake when the weapon is fired while unwielded. - var/recoil_unwielded = 0 - ///a multiplier of the duration the recoil takes to go back to normal view, this is (recoil*recoil_backtime_multiplier)+1 - var/recoil_backtime_multiplier = 2 - ///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max. - var/recoil_deviation = 22.5 - - //how large a burst is - var/burst_size = 1 - //rate of fire for burst firing and semi auto - var/fire_delay = 0 - //Prevent the weapon from firing again while already firing - var/firing_burst = 0 - //cooldown handler - var/semicd = 0 - -/* - * Overlay -*/ - ///Used for positioning ammo count overlay on sprite - var/ammo_x_offset = 0 - var/ammo_y_offset = 0 - -/* - * Attachment -*/ - ///The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED - var/list/valid_attachments = list() - ///Reference to our attachment holder to prevent subtypes having to call GetComponent - var/datum/component/attachment_holder/attachment_holder - ///Number of attachments that can fit on a given slot - var/list/slot_available = ATTACHMENT_DEFAULT_SLOT_AVAILABLE - ///Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y - var/list/slot_offsets = list() - -/* - * Zooming -*/ - ///Whether the gun generates a Zoom action on creation - var/zoomable = FALSE - //Zoom toggle - var/zoomed = FALSE - ///Distance in TURFs to move the user's screen forward (the "zoom" effect) - var/zoom_amt = 3 - var/zoom_out_amt = 0 - var/datum/action/toggle_scope_zoom/azoom - -/* - * Saftey -*/ - ///Does this gun have a saftey and thus can toggle it? - var/has_safety = FALSE - ///If the saftey on? If so, we can't fire the weapon - var/safety = FALSE - ///The wording of safety. Useful for guns that have a non-standard safety system, like a revolver - var/safety_wording = "safety" - -/* - * Spawn Info (Stuff that becomes useless onces the gun is spawned) -*/ - ///Attachments spawned on initialization. Should also be in valid attachments or it SHOULD(once i add that) fail - var/list/default_attachments = list() - - -/* - * - * Ballistic... For now - * -*/ - -/* - * Reloading -*/ +//BALLISTIC ///Compatible magazines with the gun var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info - ///Whether the sprite has a visible magazine or not - var/mag_display = FALSE - ///Whether the sprite has a visible ammo display or not - var/mag_display_ammo = FALSE - ///Whether the sprite has a visible indicator for being empty or not. - var/empty_indicator = FALSE ///Whether the gun alarms when empty or not. var/empty_alarm = FALSE ///Do we eject the magazine upon runing out of ammo? @@ -212,9 +94,49 @@ ///whether eject sound should vary var/eject_sound_vary = TRUE +//ENERGY + //What type of power cell this uses + var/obj/item/stock_parts/cell/gun/cell + var/cell_type = /obj/item/stock_parts/cell/gun + //Can it be charged in a recharger? + var/can_charge = TRUE + var/selfcharge = FALSE + var/charge_tick = 0 + var/charge_delay = 4 + //whether the gun's cell drains the cyborg user's cell to recharge + var/use_cyborg_cell = FALSE + ///Used for large and small cells + var/mag_size = MAG_SIZE_MEDIUM + //Time it takes to unscrew the cell + var/unscrewing_time = 2 SECONDS + + ///if the gun's cell cannot be replaced + var/internal_cell = FALSE + + var/list/ammo_type = list(/obj/item/ammo_casing/energy) + //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. + var/select = 1 + /* * Operation */ + //whether or not a message is displayed when fired + var/suppressed = FALSE + var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' + var/suppressed_volume = 60 + + //true if the gun is wielded via twohanded component, shouldnt affect anything else + var/wielded = FALSE + //true if the gun is wielded after delay, should affects accuracy + var/wielded_fully = FALSE + ///Slowdown for wielding + var/wield_slowdown = 0.1 + ///How long between wielding and firing in tenths of seconds + var/wield_delay = 0.4 SECONDS + ///Storing value for above + var/wield_time = 0 + +// BALLISTIC ///Whether the gun has to be racked each shot or not. var/semi_auto = TRUE ///The bolt type of the gun, affects quite a bit of functionality, see gun.dm in defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT @@ -259,48 +181,58 @@ var/empty_alarm_vary = TRUE /* - * Spawn Info (Stuff that becomes useless onces the gun is spawned) + * Stats */ - ///Whether the gun will spawn loaded with a magazine - var/spawnwithmagazine = TRUE - + var/weapon_weight = WEAPON_LIGHT + //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. + var/projectile_damage_multiplier = 1 + //Speed someone can be flung if its point blank + var/pb_knockback = 0 -/* - * - * Enegry and powered... For now - * -*/ + //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. + var/randomspread = TRUE + ///How much the bullet scatters when fired while wielded. + var/spread = 4 + ///How much the bullet scatters when fired while unwielded. + var/spread_unwielded = 12 + //additional spread when dual wielding + var/dual_wield_spread = 24 -/* - * Reloading -*/ - //What type of power cell this uses - var/obj/item/stock_parts/cell/gun/cell - var/cell_type = /obj/item/stock_parts/cell/gun - //Can it be charged in a recharger? - var/can_charge = TRUE - var/selfcharge = 0 - var/charge_tick = 0 - var/charge_delay = 4 - //whether the gun's cell drains the cyborg user's cell to recharge - var/use_cyborg_cell = FALSE - ///Used for large and small cells - var/mag_size = MAG_SIZE_MEDIUM - //Time it takes to unscrew the cell - var/unscrewing_time = 2 SECONDS - //play empty alarm if no battery - var/empty_battery_sound = FALSE - ///if the gun's cell cannot be replaced - var/internal_cell = FALSE + ///Screen shake when the weapon is fired while wielded. + var/recoil = 0 + ///Screen shake when the weapon is fired while unwielded. + var/recoil_unwielded = 0 + ///a multiplier of the duration the recoil takes to go back to normal view, this is (recoil*recoil_backtime_multiplier)+1 + var/recoil_backtime_multiplier = 2 + ///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max. + var/recoil_deviation = 22.5 - var/list/ammo_type = list(/obj/item/ammo_casing/energy) - //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. - var/select = 1 + //how large a burst is + var/burst_size = 1 + //rate of fire for burst firing and semi auto + var/fire_delay = 0 + //Prevent the weapon from firing again while already firing + var/firing_burst = 0 + //cooldown handler + var/semicd = 0 /* * Overlay */ + ///Used for positioning ammo count overlay on sprite + var/ammo_x_offset = 0 + var/ammo_y_offset = 0 + +//BALLISTIC + ///Whether the sprite has a visible magazine or not + var/mag_display = FALSE + ///Whether the sprite has a visible ammo display or not + var/mag_display_ammo = FALSE + ///Whether the sprite has a visible indicator for being empty or not. + var/empty_indicator = FALSE + +//ENERGY //Do we handle overlays with base update_appearance()? var/automatic_charge_overlays = TRUE var/charge_sections = 4 @@ -310,8 +242,50 @@ var/modifystate = TRUE /* - * Spawn Info + * Attachment +*/ + ///The types of attachments allowed, a list of types. SUBTYPES OF AN ALLOWED TYPE ARE ALSO ALLOWED + var/list/valid_attachments = list() + ///Reference to our attachment holder to prevent subtypes having to call GetComponent + var/datum/component/attachment_holder/attachment_holder + ///Number of attachments that can fit on a given slot + var/list/slot_available = ATTACHMENT_DEFAULT_SLOT_AVAILABLE + ///Offsets for the slots on this gun. should be indexed by SLOT and then by X/Y + var/list/slot_offsets = list() + +/* + * Zooming +*/ + ///Whether the gun generates a Zoom action on creation + var/zoomable = FALSE + //Zoom toggle + var/zoomed = FALSE + ///Distance in TURFs to move the user's screen forward (the "zoom" effect) + var/zoom_amt = 3 + var/zoom_out_amt = 0 + var/datum/action/toggle_scope_zoom/azoom + +/* + * Saftey +*/ + ///Does this gun have a saftey and thus can toggle it? + var/has_safety = FALSE + ///If the saftey on? If so, we can't fire the weapon + var/safety = FALSE + ///The wording of safety. Useful for guns that have a non-standard safety system, like a revolver + var/safety_wording = "safety" + +/* + * Spawn Info (Stuff that becomes useless onces the gun is spawned) */ + ///Attachments spawned on initialization. Should also be in valid attachments or it SHOULD(once i add that) fail + var/list/default_attachments = list() + +//BALLISTIC + ///Whether the gun will spawn loaded with a magazine + var/spawnwithmagazine = TRUE + +//ENERGY //set to true so the gun is given an empty cell var/dead_cell = FALSE diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 33a55d182851..f0331de6045a 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -223,7 +223,7 @@ inhand_y_dimension = 64 icon_state = "iotshotgun" item_state = "shotgun_combat" - shaded_charge = 1 + shaded_charge = TRUE w_class = WEIGHT_CLASS_BULKY ammo_type = list(/obj/item/ammo_casing/energy/disabler/scatter/ultima, /obj/item/ammo_casing/energy/laser/ultima) var/obj/item/modular_computer/integratedNTOS diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 7d1cf3bc3892..fcfc0754ee1a 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -73,7 +73,7 @@ icon_state = "cshotgun" item_state = "shotgun" desc = "A combat shotgun gutted and refitted with an internal laser system. Can switch between taser and scattered disabler shots." - shaded_charge = 0 + shaded_charge = FALSE ammo_type = list(/obj/item/ammo_casing/energy/disabler/scatter, /obj/item/ammo_casing/energy/electrode) manufacturer = MANUFACTURER_NONE diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index b1fff0a4eaaa..02d0ca021306 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -47,7 +47,7 @@ modifystate = TRUE ammo_x_offset = 1 selfcharge = 1 - shaded_charge = 1 + shaded_charge = TRUE /obj/item/gun/energy/meteorgun name = "meteor gun" @@ -107,7 +107,7 @@ icon_state = "crossbowlarge" w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron=4000) - suppressed = null + suppressed = FALSE ammo_type = list(/obj/item/ammo_casing/energy/bolt/large) manufacturer = MANUFACTURER_NONE From 0b3d1cd366d8de19d144c21618359ba5aac02374 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 1 May 2024 10:33:36 -0500 Subject: [PATCH 161/206] dumps some attachments to a do later folder --- code/__DEFINES/gun.dm | 24 ++-- .../game/objects/items/attachments/bayonet.dm | 41 ------- code/game/objects/items/attachments/bipod.dm | 49 -------- code/game/objects/items/attachments/scope.dm | 24 ---- code/game/objects/items/attachments/wip.dm | 113 ++++++++++++++++++ code/modules/projectiles/gun.dm | 5 +- code/modules/projectiles/guns/energy.dm | 2 +- shiptest.dme | 3 +- 8 files changed, 130 insertions(+), 131 deletions(-) delete mode 100644 code/game/objects/items/attachments/bipod.dm delete mode 100644 code/game/objects/items/attachments/scope.dm create mode 100644 code/game/objects/items/attachments/wip.dm diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/gun.dm index a43499e5c8f1..2005c3c9869a 100644 --- a/code/__DEFINES/gun.dm +++ b/code/__DEFINES/gun.dm @@ -93,6 +93,8 @@ ///////////////// // ATTACHMENTS // ///////////////// +#define TRAIT_ATTACHABLE "attachable" + #define COMSIG_ATTACHMENT_ATTACH "attach-attach" #define COMSIG_ATTACHMENT_DETACH "attach-detach" #define COMSIG_ATTACHMENT_EXAMINE "attach-examine" @@ -101,12 +103,15 @@ #define COMSIG_ATTACHMENT_ATTACK "attach-attacked" #define COMSIG_ATTACHMENT_UPDATE_OVERLAY "attach-overlay" +#define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" + #define COMSIG_ATTACHMENT_GET_SLOT "attach-slot-who" #define ATTACHMENT_SLOT_MUZZLE "attach-slot-muzzle" #define ATTACHMENT_SLOT_SCOPE "attach-slot-scope" #define ATTACHMENT_SLOT_GRIP "attach-slot-grip" #define ATTACHMENT_SLOT_RAIL "attach-slot-rail" +/* #define BIT_ATTACHMENT_SLOT_MUZZLE (1<<0) #define BIT_ATTACHMENT_SLOT_SCOPE (1<<1) #define BIT_ATTACHMENT_SLOT_GRIP (1<<2) @@ -118,17 +123,7 @@ DEFINE_BITFIELD(attach_slots, list( ATTACHMENT_SLOT_GRIP = BIT_ATTACHMENT_SLOT_GRIP, ATTACHMENT_SLOT_RAIL = BIT_ATTACHMENT_SLOT_RAIL )) - -#define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" - -#define TRAIT_ATTACHABLE "attachable" - -#define ATTACHMENT_DEFAULT_SLOT_AVAILABLE list( \ - ATTACHMENT_SLOT_MUZZLE = 1, \ - ATTACHMENT_SLOT_SCOPE = 1, \ - ATTACHMENT_SLOT_GRIP = 1, \ - ATTACHMENT_SLOT_RAIL = 1, \ -) +*/ /proc/attachment_slot_to_bflag(slot) switch(slot) @@ -152,6 +147,13 @@ DEFINE_BITFIELD(attach_slots, list( if(1<<3) return ATTACHMENT_SLOT_RAIL +#define ATTACHMENT_DEFAULT_SLOT_AVAILABLE list( \ + ATTACHMENT_SLOT_MUZZLE = 1, \ + ATTACHMENT_SLOT_SCOPE = 1, \ + ATTACHMENT_SLOT_GRIP = 1, \ + ATTACHMENT_SLOT_RAIL = 1, \ +) + //attach_features_flags #define ATTACH_REMOVABLE (1<<0) #define ATTACH_TOGGLE (1<<1) diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 0ecad1f91da0..33c5c0ee9d7a 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -1,44 +1,3 @@ -/* -/obj/item/attachment/e_bayonet - name = "bayonet" - desc = "Stabby-Stabby" - icon_state = "ebayonet" - force = 2 - - attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE - var/force_on = 20 - var/extended = FALSE - var/reach_extended = 2 - var/force_extended = 10 - -/obj/item/attachment/e_bayonet/Toggle(obj/item/gun/gun, mob/user) - . = ..() - - reach = toggled ? reach : initial(reach) - force = toggled ? force : initial(force) - - playsound(gun, 'sound/weapons/batonextend.ogg', 30) - user.visible_message("[user] [toggled ? "expands" : "retracts"] [user.p_their()] [src].", "You [toggled ? "expand" : "retract"] \the [src].") - -/obj/item/attachment/e_bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) - // Call our melee chain if they are are trying to melee attack something they can reach - if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) - if(target == user && toggled) - extended = !extended - reach = extended ? reach_extended : initial(reach) - gun.reach = reach // Even if your gun has a longer reach you default to the bayonets because STAB STAB STAB - force = extended ? force_extended : force_on - // Hey, I just met you - if(extended) // And this is crazy - icon_state += "-long" // But heres my number - else // Call me never - icon_state = replacetext(icon_state, "-long", "") // Because why is this so ugly - user.visible_message("[user] [extended ? "increased" : "decreased"] the length of [src].") - return COMPONENT_NO_ATTACK - melee_attack_chain(user, target, params) - return COMPONENT_NO_ATTACK -*/ - /obj/item/attachment/bayonet name = "bayonet" desc = "Stabby-Stabby" diff --git a/code/game/objects/items/attachments/bipod.dm b/code/game/objects/items/attachments/bipod.dm deleted file mode 100644 index 8397e036c85c..000000000000 --- a/code/game/objects/items/attachments/bipod.dm +++ /dev/null @@ -1,49 +0,0 @@ -/* -/obj/item/attachment/bipod - name = "bipod" - desc = "A bipod that can be attached to a weapon to improve stability." - icon_state = "laserpointer" - attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE - -/obj/item/attachment/bipod/Attach(obj/item/gun/gun, mob/user) - gun.has_bipod = TRUE - -/obj/item/attachment/bipod/Detach(obj/item/gun/gun, mob/user) - gun.has_bipod = FALSE - -/obj/item/attachment/foldable_stock - name = "foldable stock" - desc = "A foldable stock that can be attached to a weapon to improve stability." - icon_state = "laserpointer" - attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE - -/obj/item/attachment/foldable_stock/Attach(obj/item/gun/gun, mob/user) - gun.w_class = WEIGHT_CLASS_NORMAL - gun.wield_delay = gun.unfolded_wield_delay - gun.wield_slowdown = gun.unfolded_slowdown - -/obj/item/attachment/foldable_stock/Toggle(obj/item/gun/gun, mob/user) - . = ..() - if(toggled) - to_chat(user, "You unfold the stock on the [src].") - gun.w_class = WEIGHT_CLASS_BULKY - gun.wield_delay = gun.folded_wield_delay - gun.wield_slowdown = gun.folded_slowdown - else - to_chat(user, "You fold the stock on the [src].") - gun.w_class = WEIGHT_CLASS_NORMAL - gun.wield_delay = gun.unfolded_wield_delay - gun.wield_slowdown = gun.unfolded_slowdown - - if(wielded) - user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown) - - toggled = !toggled - playsound(src, 'sound/weapons/empty.ogg', 100, 1) - -/obj/item/attachment/foldable_stock/Detach(obj/item/gun/gun, mob/user) - . = ..() - gun.w_class = initial(gun.w_class) - gun.wield_delay = initial(gun.unfolded_wield_delay) - gun.wield_slowdown = initial(gun.unfolded_slowdown) -*/ diff --git a/code/game/objects/items/attachments/scope.dm b/code/game/objects/items/attachments/scope.dm deleted file mode 100644 index ea29f2272e00..000000000000 --- a/code/game/objects/items/attachments/scope.dm +++ /dev/null @@ -1,24 +0,0 @@ -/* -/obj/item/attachment/scope - name = "scope" - icon_state = "scope" - slot = ATTACHMENT_SLOT_SCOPE - var/zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. - var/zoom_out_amt = 5 - -/obj/item/attachment/scope/Attach(obj/item/gun/gun, mob/user) - . = ..() - gun.zoomable = TRUE - gun.zoom_amt = zoom_amt - gun.zoom_out_amt = zoom_out_amt - gun.build_zooming() - -/obj/item/attachment/scope/Detach(obj/item/gun/gun, mob/user) - . = ..() - gun.zoomable = FALSE - gun.zoom_amt = initial(gun.zoom_amt) - gun.zoom_out_amt = initial(gun.zoom_out_amt) - gun.actions -= gun.azoom - qdel(gun.azoom) - return TRUE -*/ diff --git a/code/game/objects/items/attachments/wip.dm b/code/game/objects/items/attachments/wip.dm new file mode 100644 index 000000000000..9a6ff5bb1360 --- /dev/null +++ b/code/game/objects/items/attachments/wip.dm @@ -0,0 +1,113 @@ +/* +/obj/item/attachment/bipod + name = "bipod" + desc = "A bipod that can be attached to a weapon to improve stability." + icon_state = "laserpointer" + attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE + +/obj/item/attachment/bipod/Attach(obj/item/gun/gun, mob/user) + gun.has_bipod = TRUE + +/obj/item/attachment/bipod/Detach(obj/item/gun/gun, mob/user) + gun.has_bipod = FALSE + +/obj/item/attachment/foldable_stock + name = "foldable stock" + desc = "A foldable stock that can be attached to a weapon to improve stability." + icon_state = "laserpointer" + attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE + +/obj/item/attachment/foldable_stock/Attach(obj/item/gun/gun, mob/user) + gun.w_class = WEIGHT_CLASS_NORMAL + gun.wield_delay = gun.unfolded_wield_delay + gun.wield_slowdown = gun.unfolded_slowdown + +/obj/item/attachment/foldable_stock/Toggle(obj/item/gun/gun, mob/user) + . = ..() + if(toggled) + to_chat(user, "You unfold the stock on the [src].") + gun.w_class = WEIGHT_CLASS_BULKY + gun.wield_delay = gun.folded_wield_delay + gun.wield_slowdown = gun.folded_slowdown + else + to_chat(user, "You fold the stock on the [src].") + gun.w_class = WEIGHT_CLASS_NORMAL + gun.wield_delay = gun.unfolded_wield_delay + gun.wield_slowdown = gun.unfolded_slowdown + + if(wielded) + user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown) + + toggled = !toggled + playsound(src, 'sound/weapons/empty.ogg', 100, 1) + +/obj/item/attachment/foldable_stock/Detach(obj/item/gun/gun, mob/user) + . = ..() + gun.w_class = initial(gun.w_class) + gun.wield_delay = initial(gun.unfolded_wield_delay) + gun.wield_slowdown = initial(gun.unfolded_slowdown) + +/obj/item/attachment/scope + name = "scope" + icon_state = "scope" + slot = ATTACHMENT_SLOT_SCOPE + var/zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. + var/zoom_out_amt = 5 + +/obj/item/attachment/scope/Attach(obj/item/gun/gun, mob/user) + . = ..() + gun.zoomable = TRUE + gun.zoom_amt = zoom_amt + gun.zoom_out_amt = zoom_out_amt + gun.build_zooming() + +/obj/item/attachment/scope/Detach(obj/item/gun/gun, mob/user) + . = ..() + gun.zoomable = FALSE + gun.zoom_amt = initial(gun.zoom_amt) + gun.zoom_out_amt = initial(gun.zoom_out_amt) + gun.actions -= gun.azoom + qdel(gun.azoom) + return TRUE +*/ + +/* +/obj/item/attachment/e_bayonet + name = "bayonet" + desc = "Stabby-Stabby" + icon_state = "ebayonet" + force = 2 + + attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE + var/force_on = 20 + var/extended = FALSE + var/reach_extended = 2 + var/force_extended = 10 + +/obj/item/attachment/e_bayonet/Toggle(obj/item/gun/gun, mob/user) + . = ..() + + reach = toggled ? reach : initial(reach) + force = toggled ? force : initial(force) + + playsound(gun, 'sound/weapons/batonextend.ogg', 30) + user.visible_message("[user] [toggled ? "expands" : "retracts"] [user.p_their()] [src].", "You [toggled ? "expand" : "retract"] \the [src].") + +/obj/item/attachment/e_bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) + // Call our melee chain if they are are trying to melee attack something they can reach + if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) + if(target == user && toggled) + extended = !extended + reach = extended ? reach_extended : initial(reach) + gun.reach = reach // Even if your gun has a longer reach you default to the bayonets because STAB STAB STAB + force = extended ? force_extended : force_on + // Hey, I just met you + if(extended) // And this is crazy + icon_state += "-long" // But heres my number + else // Call me never + icon_state = replacetext(icon_state, "-long", "") // Because why is this so ugly + user.visible_message("[user] [extended ? "increased" : "decreased"] the length of [src].") + return COMPONENT_NO_ATTACK + melee_attack_chain(user, target, params) + return COMPONENT_NO_ATTACK +*/ diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 2937c32e5982..29305233f4f2 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -43,7 +43,6 @@ var/vary_fire_sound = TRUE var/fire_sound_volume = 50 var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg' - //change this on non-gun things var/dry_fire_text = "click" /* @@ -53,7 +52,7 @@ ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it var/tac_reloads = TRUE ///If we have the 'snowflake mechanic,' how long should it take to reload? - var/tactical_reload_delay = 1 SECONDS + var/tactical_reload_delay = 1 SECONDS //BALLISTIC ///Compatible magazines with the gun @@ -276,7 +275,7 @@ var/safety_wording = "safety" /* - * Spawn Info (Stuff that becomes useless onces the gun is spawned) + * Spawn Info (Stuff that becomes useless onces the gun is spawned, mostly here for mappers) */ ///Attachments spawned on initialization. Should also be in valid attachments or it SHOULD(once i add that) fail var/list/default_attachments = list() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index fbcb1523b665..d613eaa129a3 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -12,7 +12,7 @@ ammo_x_offset = 2 tac_reloads = FALSE - tactical_reload_delay = 1.2 SECONDS + tactical_reload_delay = 1.2 SECONDS /obj/item/gun/energy/emp_act(severity) . = ..() diff --git a/shiptest.dme b/shiptest.dme index a57c3b5fa62f..8247e15326df 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1190,11 +1190,10 @@ #include "code\game\objects\items\weaponry.dm" #include "code\game\objects\items\attachments\_attachment.dm" #include "code\game\objects\items\attachments\bayonet.dm" -#include "code\game\objects\items\attachments\bipod.dm" #include "code\game\objects\items\attachments\laser_sight.dm" #include "code\game\objects\items\attachments\rail_light.dm" -#include "code\game\objects\items\attachments\scope.dm" #include "code\game\objects\items\attachments\silencer.dm" +#include "code\game\objects\items\attachments\wip.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" #include "code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "code\game\objects\items\circuitboards\machine_circuitboards.dm" From c8eb226e5eb478ef9c8ae8e5c725001093b50f20 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 1 May 2024 16:47:24 -0500 Subject: [PATCH 162/206] bitflag yo --- code/datums/components/attachment.dm | 8 ++++---- code/datums/components/attachment_holder.dm | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 8fb5c9f5c949..2e34195b4c78 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -36,7 +36,7 @@ RegisterSignal(parent, COMSIG_ATTACHMENT_DETACH, PROC_REF(try_detach)) RegisterSignal(parent, COMSIG_ATTACHMENT_EXAMINE, PROC_REF(handle_examine)) RegisterSignal(parent, COMSIG_ATTACHMENT_EXAMINE_MORE, PROC_REF(handle_examine_more)) - if(CHECK_BITFIELD(attach_features_flags, ATTACH_TOGGLE)) + if(attach_features_flags & ATTACH_TOGGLE) RegisterSignal(parent, COMSIG_ATTACHMENT_TOGGLE, PROC_REF(try_toggle)) attachment_toggle_action = new /datum/action/attachment(parent) RegisterSignal(parent, COMSIG_ATTACHMENT_PRE_ATTACK, PROC_REF(relay_pre_attack)) @@ -56,7 +56,7 @@ /datum/component/attachment/proc/try_toggle(obj/item/parent, obj/item/holder, mob/user) SIGNAL_HANDLER - if(CHECK_BITFIELD(attach_features_flags, ATTACH_TOGGLE)) + if(attach_features_flags & ATTACH_TOGGLE) INVOKE_ASYNC(src, PROC_REF(do_toggle), parent, holder, user) @@ -82,7 +82,7 @@ parent.forceMove(holder) - iif(CHECK_BITFIELD(attach_features_flags, ATTACH_TOGGLE)) + if(attach_features_flags & ATTACH_TOGGLE) holder.actions += list(attachment_toggle_action) attachment_toggle_action.gun = holder attachment_toggle_action.Grant(user) @@ -98,7 +98,7 @@ if(on_attach && !on_detach.Invoke(holder, user)) return FALSE - if(CHECK_BITFIELD(attach_features_flags, ATTACH_TOGGLE)) + if(attach_features_flags & ATTACH_TOGGLE) holder.actions -= list(attachment_toggle_action) attachment_toggle_action.gun = null attachment_toggle_action.Remove(user) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 6ad14fd71d20..aae39bc461a6 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -63,7 +63,7 @@ if(attach.name in .) stack_trace("two attachments with same name; this shouldn't happen and will cause failures") continue - if(only_toggles && !CHECK_BITFIELD(attach.attach_features_flags, ATTACH_TOGGLE)) + if(only_toggles && !(attach.attach_features_flags & ATTACH_TOGGLE)) continue .[attach.name] = attach @@ -127,8 +127,8 @@ /datum/component/attachment_holder/proc/handle_detach(obj/item/parent, obj/item/tool, mob/user) var/list/list = list() - for(var/obj/item/attach as anything in attachments) - if(CHECK_BITFIELD(attach.attach_features_flags, ATTACH_REMOVABLE)) + for(var/obj/item/attachment/attach as anything in attachments) + if(attach.attach_features_flags & ATTACH_REMOVABLE) list[attach.name] = attach var/selected = tgui_input_list(user, "Select Attachment", "Detach", list) if(!parent.Adjacent(user) || !selected || !tool || !tool.use_tool(parent, user, 2 SECONDS * tool.toolspeed)) From 747c17f606f226db28403da52b36ef14958000cd Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 5 May 2024 23:30:53 -0500 Subject: [PATCH 163/206] bayonet examine and FALSE --- .../whitesands_surface_starfurycrash.dmm | 2 +- _maps/RandomRuins/SpaceRuins/bigderelict1.dmm | 6 +++--- _maps/RandomRuins/SpaceRuins/ntfacility.dmm | 2 +- _maps/shuttles/inteq/inteq_talos.dmm | 4 ++-- _maps/shuttles/inteq/inteq_vaquero.dmm | 2 +- _maps/shuttles/minutemen/minutemen_vela.dmm | 2 +- .../syndicate/syndicate_twinkleshine.dmm | 16 +++++++------- code/datums/components/attachment_holder.dm | 20 +++++++++--------- .../game/objects/items/attachments/bayonet.dm | 21 ++++++++++--------- 9 files changed, 38 insertions(+), 37 deletions(-) diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm index cca785f97444..bc8616028058 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm @@ -35,7 +35,7 @@ /area/overmap_encounter/planetoid/cave/explored) "dX" = ( /obj/item/gun/ballistic/automatic/pistol{ - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /turf/open/floor/plating/asteroid/whitesands, /area/overmap_encounter/planetoid/cave/explored) diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index 6c06010bbd58..a4f6006bf88b 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -523,7 +523,7 @@ /area/ruin/space/has_grav/derelictoutpost/powerstorage) "bI" = ( /obj/item/gun/ballistic/automatic/pistol/candor{ - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/derelictoutpost/powerstorage) @@ -1334,7 +1334,7 @@ name = "gelatinous floor" }, /obj/item/gun/ballistic/automatic/pistol/candor{ - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/item/ammo_box/magazine/m45, /turf/open/floor/plating/asteroid, @@ -1494,7 +1494,7 @@ /area/ruin/space/has_grav/derelictoutpost) "dJ" = ( /obj/item/gun/ballistic/automatic/pistol/candor{ - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/structure/alien/weeds{ color = "#4BAE56"; diff --git a/_maps/RandomRuins/SpaceRuins/ntfacility.dmm b/_maps/RandomRuins/SpaceRuins/ntfacility.dmm index dc1ecbdcfa59..d17fe7601d26 100644 --- a/_maps/RandomRuins/SpaceRuins/ntfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/ntfacility.dmm @@ -1620,7 +1620,7 @@ /area/ruin/powered) "KJ" = ( /obj/item/gun/ballistic/revolver/detective{ - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/effect/decal/cleanable/blood, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/shuttles/inteq/inteq_talos.dmm b/_maps/shuttles/inteq/inteq_talos.dmm index 6b13af4e6089..45ecbf33d0a7 100644 --- a/_maps/shuttles/inteq/inteq_talos.dmm +++ b/_maps/shuttles/inteq/inteq_talos.dmm @@ -3420,11 +3420,11 @@ /obj/item/gun/ballistic/shotgun/bulldog/inteq{ pixel_x = -8; pixel_y = 8; - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/item/gun/ballistic/shotgun/bulldog/inteq{ pixel_x = -12; - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /turf/open/floor/plasteel/tech/grid, /area/ship/security/armory) diff --git a/_maps/shuttles/inteq/inteq_vaquero.dmm b/_maps/shuttles/inteq/inteq_vaquero.dmm index 073ca9cc770e..927f372ab3c5 100644 --- a/_maps/shuttles/inteq/inteq_vaquero.dmm +++ b/_maps/shuttles/inteq/inteq_vaquero.dmm @@ -266,7 +266,7 @@ /obj/item/gun/ballistic/shotgun/bulldog/inteq{ pixel_x = -4; pixel_y = 5; - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/item/gun/ballistic/automatic/pistol/commander/inteq, /obj/item/gun/ballistic/automatic/pistol/commander/inteq{ diff --git a/_maps/shuttles/minutemen/minutemen_vela.dmm b/_maps/shuttles/minutemen/minutemen_vela.dmm index 4fb439e0de16..d4ae92298e58 100644 --- a/_maps/shuttles/minutemen/minutemen_vela.dmm +++ b/_maps/shuttles/minutemen/minutemen_vela.dmm @@ -8278,7 +8278,7 @@ /obj/item/gun/ballistic/automatic/pistol/commander, /obj/item/gun/ballistic/automatic/pistol/commander, /obj/item/gun/ballistic/automatic/smg/cm5{ - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/machinery/light/small/directional/south, /turf/open/floor/plasteel/tech, diff --git a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm index 4f1a3d9a5fdf..5878f667db1e 100644 --- a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm +++ b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm @@ -4676,7 +4676,7 @@ pixel_y = 1 }, /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate{ - spawnwithmagazine = FALSE; + spawnwithmagazine = 0; pixel_x = -3; pixel_y = 6 }, @@ -5615,12 +5615,12 @@ /obj/item/gun/ballistic/automatic/ebr{ pixel_x = -16; pixel_y = 7; - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/item/gun/ballistic/automatic/ebr{ pixel_x = -9; pixel_y = 2; - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/item/ammo_box/magazine/ebr{ pixel_x = 10; @@ -7512,12 +7512,12 @@ /obj/item/gun/ballistic/shotgun/bulldog{ pixel_x = -7; pixel_y = 7; - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/item/gun/ballistic/shotgun/bulldog{ pixel_y = -3; pixel_x = 2; - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/machinery/light/directional/north, /obj/item/ammo_box/magazine/m12g{ @@ -8851,16 +8851,16 @@ /obj/item/gun/ballistic/automatic/smg/c20r{ pixel_x = 2; pixel_y = 8; - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/item/gun/ballistic/automatic/smg/c20r{ pixel_y = 3; - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/item/gun/ballistic/automatic/smg/c20r{ pixel_y = -2; pixel_x = 3; - spawnwithmagazine = FALSE + spawnwithmagazine = 0 }, /obj/item/ammo_box/magazine/smgm45, /obj/item/ammo_box/magazine/smgm45, diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index aae39bc461a6..d4c784b46190 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -83,18 +83,20 @@ /datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) if(length(attachments)) - examine_list += "It has [length(attachments)] attachments." - + examine_list += "It has [length(attachments)] attachment\s." for(var/obj/item/attach as anything in attachments) SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE, user, examine_list) /datum/component/attachment_holder/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list) - if(!length(attachments)) - return - examine_list += "It has the following attachments:" - for(var/obj/item/attach as anything in attachments) - examine_list += "\t- [attach.name]" - examine_list += "\tThey can be removed with a crowbar" + for(var/key in slot_room) + examine_list += "It has [slot_room[key]] slot\s for [key] attachments." + if(length(attachments)) + examine_list += "It has the following attachments:" + for(var/obj/item/attach as anything in attachments) + examine_list += "\t- [attach.name]" + examine_list += "\tThey can be removed with a crowbar" + for(var/attach_type in valid_types) + examine_list += "It can accept [attach_type]" for(var/obj/item/attach as anything in attachments) SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE_MORE, user, examine_list) @@ -159,6 +161,4 @@ for(var/obj/item/attach as anything in attachments) if(SEND_SIGNAL(attach, COMSIG_ATTACHMENT_PRE_ATTACK, parent, target_atom, user, params)) - user.do_attack_animation(target_atom) - parent.update_icon() return TRUE diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 33c5c0ee9d7a..c2022ea344d1 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -2,17 +2,18 @@ name = "bayonet" desc = "Stabby-Stabby" icon_state = "bayonet" - var/extra_force = 10 + force = 15 + throwforce = 10 pixel_shift_x = 1 pixel_shift_y = 4 + pickup_sound = 'sound/items/handling/knife1_pickup.ogg' + drop_sound = 'sound/items/handling/knife3_drop.ogg' + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + sharpness = IS_SHARP_ACCURATE -/obj/item/attachment/bayonet/Attach(obj/item/gun/gun, mob/user) - . = ..() - gun.force += extra_force - gun.hitsound = 'sound/weapons/bladeslice.ogg' +/obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) + if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) + melee_attack_chain(user, target, params) + return COMPONENT_NO_ATTACK -/obj/item/attachment/bayonet/Detach(obj/item/gun/gun, mob/user) - . = ..() - gun.force -= extra_force - gun.hitsound = initial(gun.hitsound) - return TRUE From 659febce1ec411c13344601c9608a74efa6de5da Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 6 May 2024 01:57:03 -0500 Subject: [PATCH 164/206] stuff --- code/datums/components/attachment.dm | 7 +++++++ code/datums/components/attachment_holder.dm | 19 +++++++++---------- .../objects/items/attachments/laser_sight.dm | 2 +- .../objects/items/attachments/silencer.dm | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 2e34195b4c78..9904372f1186 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -58,6 +58,8 @@ SIGNAL_HANDLER if(attach_features_flags & ATTACH_TOGGLE) INVOKE_ASYNC(src, PROC_REF(do_toggle), parent, holder, user) + holder.update_icon() + attachment_toggle_action.UpdateButtonIcon() /datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user) @@ -143,6 +145,11 @@ ..() SEND_SIGNAL(target, COMSIG_ATTACHMENT_TOGGLE, gun, owner) +/datum/action/attachment/UpdateButtonIcon() + icon_icon = target.icon + button_icon_state = target.icon_state + ..() + /datum/action/attachment/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) if(button_icon && button_icon_state) // If set, use the custom icon that we set instead diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index d4c784b46190..c047546c44e8 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -79,24 +79,23 @@ if(!attach) return SEND_SIGNAL(attach, COMSIG_ATTACHMENT_TOGGLE, parent, user) - parent.update_icon() /datum/component/attachment_holder/proc/handle_examine(obj/item/parent, mob/user, list/examine_list) if(length(attachments)) - examine_list += "It has [length(attachments)] attachment\s." + examine_list += span_notice("It has [length(attachments)] attachment\s.") for(var/obj/item/attach as anything in attachments) SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE, user, examine_list) /datum/component/attachment_holder/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list) for(var/key in slot_room) - examine_list += "It has [slot_room[key]] slot\s for [key] attachments." + examine_list += span_notice("It has [slot_room[key]] slot\s for [key] attachments.") if(length(attachments)) - examine_list += "It has the following attachments:" + examine_list += span_notice("It has the following attachments:") for(var/obj/item/attach as anything in attachments) - examine_list += "\t- [attach.name]" - examine_list += "\tThey can be removed with a crowbar" - for(var/attach_type in valid_types) - examine_list += "It can accept [attach_type]" + examine_list += span_notice("\t- [attach.name]") + examine_list += span_notice("\tThey can be removed with a crowbar") + for(var/obj/attach_type as anything in valid_types) + examine_list += span_notice("It can accept [initial(attach_type.name)]") for(var/obj/item/attach as anything in attachments) SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE_MORE, user, examine_list) @@ -104,10 +103,10 @@ var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) slot = attachment_slot_from_bflag(slot) if(!(attachment.type in valid_types)) - to_chat(user, "[attachment] is not a valid attachment for this [parent]!") + to_chat(user, span_notice("[attachment] is not a valid attachment for this [parent]!")) return if(!slot_room[slot]) - to_chat(user, "[parent] does not contain room for [attachment]!") + to_chat(user, span_notice("[parent] does not contain room for [attachment]!")) return slot_room[slot]-- . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_ATTACH, parent, user) diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm index 226ae8b6deb2..43af9b310c93 100644 --- a/code/game/objects/items/attachments/laser_sight.dm +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -1,5 +1,5 @@ /obj/item/attachment/laser_sight - name = "Laser Sight" + name = "laser sight" desc = "This laser sight is designed to be rail-mounted on a compatible firearm to provide increased accuracy." icon_state = "laserpointer" attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index 2612a39be005..19d3f16a82c1 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -4,7 +4,7 @@ icon_state = "silencer" slot = ATTACHMENT_SLOT_MUZZLE pixel_shift_x = 1 - pixel_shift_y = 1 + pixel_shift_y = 2 /obj/item/attachment/silencer/Attach(obj/item/gun/gun, mob/user) . = ..() From 1669b24fe306a93c40206c2e0695bd215e9fb3a7 Mon Sep 17 00:00:00 2001 From: fallcon Date: Wed, 8 May 2024 12:15:29 -0500 Subject: [PATCH 165/206] attach vars for ballistic and energy --- code/modules/projectiles/guns/ballistic.dm | 21 +++++++++++++++++++ .../projectiles/guns/ballistic/pistol.dm | 10 --------- code/modules/projectiles/guns/energy.dm | 15 +++++++++++++ .../guns/energy/kinetic_accelerator.dm | 8 ------- 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 1c1c39325ae0..1d9444747292 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -9,6 +9,27 @@ has_safety = TRUE safety = TRUE + valid_attachments = list( + /obj/item/attachment/silencer, + /obj/item/attachment/laser_sight, + /obj/item/attachment/rail_light, + /obj/item/attachment/bayonet + ) + slot_available = list( + ATTACHMENT_SLOT_MUZZLE = 1, + ATTACHMENT_SLOT_RAIL = 1 + ) + slot_offsets = list( + ATTACHMENT_SLOT_MUZZLE = list( + "x" = 26, + "y" = 20, + ), + ATTACHMENT_SLOT_RAIL = list( + "x" = 19, + "y" = 18, + ) + ) + /obj/item/gun/ballistic/Initialize() . = ..() if (!spawnwithmagazine) diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index bb51dcfa3d40..88a085694677 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -33,16 +33,6 @@ muzzleflash_iconstate = "muzzle_flash_light" - valid_attachments = list( - /obj/item/attachment/silencer, - /obj/item/attachment/laser_sight, - /obj/item/attachment/rail_light, - /obj/item/attachment/bayonet - ) - slot_available = list( - ATTACHMENT_SLOT_MUZZLE = 1, - ATTACHMENT_SLOT_RAIL = 1 - ) slot_offsets = list( ATTACHMENT_SLOT_MUZZLE = list( "x" = 26, diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index d613eaa129a3..eb06b6a65610 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -14,6 +14,21 @@ tac_reloads = FALSE tactical_reload_delay = 1.2 SECONDS + valid_attachments = list( + /obj/item/attachment/laser_sight, + /obj/item/attachment/rail_light, + /obj/item/attachment/bayonet + ) + slot_available = list( + ATTACHMENT_SLOT_RAIL = 1 + ) + slot_offsets = list( + ATTACHMENT_SLOT_RAIL = list( + "x" = 19, + "y" = 18, + ) + ) + /obj/item/gun/energy/emp_act(severity) . = ..() if(!(. & EMP_PROTECT_CONTENTS)) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 9de975a8afa0..2ca71649a6f7 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -22,19 +22,11 @@ var/overheat = FALSE var/mob/holder - var/max_mod_capacity = 100 var/list/modkits = list() var/recharge_timerid - valid_attachments = list( - /obj/item/attachment/bayonet, - /obj/item/attachment/rail_light - ) - slot_available = list( - ATTACHMENT_SLOT_RAIL = 1 - ) slot_offsets = list( ATTACHMENT_SLOT_RAIL = list( "x" = 24, From 584767e481eb2db8c87224bbfff84639e6621dc4 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 15 May 2024 16:15:45 -0500 Subject: [PATCH 166/206] ? --- code/datums/action.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/action.dm b/code/datums/action.dm index ff03b689085d..f7922eb2398d 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -36,6 +36,7 @@ /datum/action/Destroy() if(owner) Remove(owner) + owner = null target = null QDEL_NULL(button) return ..() From 6dc682617f1dce0d52d2bc6abf04c80610160c17 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 15 May 2024 16:22:12 -0500 Subject: [PATCH 167/206] this? --- code/datums/components/attachment.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 9904372f1186..c95db361d1f1 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -52,6 +52,7 @@ var/obj/item/gun/parent = src.parent parent.actions -= actions QDEL_LIST(actions) + qdel(attachment_toggle_action) return ..() /datum/component/attachment/proc/try_toggle(obj/item/parent, obj/item/holder, mob/user) From 9181588c62318ee4871155dc0757be0987147434 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 15 May 2024 16:23:29 -0500 Subject: [PATCH 168/206] wrong --- code/datums/action.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/datums/action.dm b/code/datums/action.dm index f7922eb2398d..ff03b689085d 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -36,7 +36,6 @@ /datum/action/Destroy() if(owner) Remove(owner) - owner = null target = null QDEL_NULL(button) return ..() From 9e09fac414af90eab28a81ba251b3a5912e6ecd1 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 15 May 2024 16:38:27 -0500 Subject: [PATCH 169/206] stop tests failing i think --- code/modules/mob/living/carbon/human/human_defense.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 123ecf6d4fba..95306068c9dc 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -498,8 +498,10 @@ else if(!(flags & SHOCK_NOGLOVES)) //This gets the siemens_coeff for all non tesla shocks if(gloves) siemens_coeff *= gloves.siemens_coefficient - siemens_coeff *= physiology.siemens_coeff - siemens_coeff *= dna.species.siemens_coeff + if(physiology.siemens_coeff) + siemens_coeff *= physiology.siemens_coeff + if(dna.species.siemens_coeff) + siemens_coeff *= dna.species.siemens_coeff . = ..() //Don't go further if the shock was blocked/too weak. if(!.) From 2ca32389d245c4bd41acf44b0ea4be2aa50ecb54 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 17 May 2024 19:32:43 -0500 Subject: [PATCH 170/206] better fix for the create and destroy fail --- code/modules/mob/living/carbon/human/human_defense.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 95306068c9dc..7898509dacb3 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -498,10 +498,12 @@ else if(!(flags & SHOCK_NOGLOVES)) //This gets the siemens_coeff for all non tesla shocks if(gloves) siemens_coeff *= gloves.siemens_coefficient - if(physiology.siemens_coeff) - siemens_coeff *= physiology.siemens_coeff - if(dna.species.siemens_coeff) - siemens_coeff *= dna.species.siemens_coeff + //If it doesnt have physiology its prob still initializing. + if(!physiology) + . = ..() + return + siemens_coeff *= physiology.siemens_coeff + siemens_coeff *= dna.species.siemens_coeff . = ..() //Don't go further if the shock was blocked/too weak. if(!.) From 5f7b9453742aeb84aee485691beb8487e8900685 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 7 Jun 2024 02:00:06 -0500 Subject: [PATCH 171/206] ytea --- code/modules/projectiles/guns/ballistic/pistol.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 59a05d637925..a5ed95df5606 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -138,10 +138,6 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory) gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST) default_firemode = FIREMODE_SEMIAUTO -<<<<<<< HEAD -======= - ->>>>>>> 5474eac08b7d035bbd28a1bf8ceb8abf780d0c1a /obj/item/gun/ballistic/automatic/pistol/commander name = "\improper Commander" desc = "A classic handgun in a tasteful black and stainless steel color scheme. An enamel Nanotrasen logo is set into the grips. Chambered in 9mm." From 992549ef9dc515bbfc7f59115054166f29b5d4f3 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 7 Jun 2024 02:02:22 -0500 Subject: [PATCH 172/206] dont rename that --- code/__DEFINES/{gun.dm => guns.dm} | 0 shiptest.dme | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename code/__DEFINES/{gun.dm => guns.dm} (100%) diff --git a/code/__DEFINES/gun.dm b/code/__DEFINES/guns.dm similarity index 100% rename from code/__DEFINES/gun.dm rename to code/__DEFINES/guns.dm diff --git a/shiptest.dme b/shiptest.dme index 3dfeee5c1549..f95279adfe5c 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -66,7 +66,7 @@ #include "code\__DEFINES\food.dm" #include "code\__DEFINES\footsteps.dm" #include "code\__DEFINES\forensics.dm" -#include "code\__DEFINES\gun.dm" +#include "code\__DEFINES\guns.dm" #include "code\__DEFINES\hud.dm" #include "code\__DEFINES\icon_smoothing.dm" #include "code\__DEFINES\important_recursive_contents.dm" From 0d24ffd2e80c81f4c34dc51f55d25fef284f1b03 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 7 Jun 2024 02:27:19 -0500 Subject: [PATCH 173/206] conflict merges where kinda a bitch --- code/__DEFINES/guns.dm | 19 ++- .../blackmarket/blackmarket_items/tools.dm | 2 +- code/modules/projectiles/gun.dm | 114 +++++------------- .../projectiles/guns/ballistic/automatic.dm | 1 - .../projectiles/guns/ballistic/pistol.dm | 1 - 5 files changed, 49 insertions(+), 88 deletions(-) diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index 2005c3c9869a..6f702fadb7d8 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -5,6 +5,8 @@ #define WEAPON_MEDIUM 2 /// You must wield the gun to fire this gun #define WEAPON_HEAVY 3 +/// You must FULLY wield (wait the full wield delay) the gun to fire this gun +#define WEAPON_VERY_HEAVY 4 //Gun trigger guards #define TRIGGER_GUARD_ALLOW_ALL -1 #define TRIGGER_GUARD_NONE 0 @@ -28,6 +30,13 @@ ///added recoil of sawn off guns #define SAWN_OFF_RECOIL 1 +//ammo box sprite defines +///ammo box will always use provided icon state +#define AMMO_BOX_ONE_SPRITE 0 +///ammo box will have a different state for each bullet; - +#define AMMO_BOX_PER_BULLET 1 +///ammo box will have a different state for full and empty; -max_ammo and -0 +#define AMMO_BOX_FULL_EMPTY 2 /* Stolen from tgmc.. Will use soon //Gun defines for gun related thing. More in the projectile folder. //gun_features_flags @@ -49,10 +58,6 @@ #define GUN_SHOWS_LOADED (1<<15) //Whether the mob sprite as loaded or unloaded, a binary version of the above #define GUN_SMOKE_PARTICLES (1<<16) //Whether the gun has smoke particles -#define GUN_FIREMODE_SEMIAUTO "semi-auto fire mode" -#define GUN_FIREMODE_BURSTFIRE "burst-fire mode" -#define GUN_FIREMODE_AUTOMATIC "automatic fire mode" -#define GUN_FIREMODE_AUTOBURST "auto-burst-fire mode" */ //Autofire component @@ -214,3 +219,9 @@ DEFINE_BITFIELD(attach_slots, list( #define MOVES_HITSCAN -1 //Not actually hitscan but close as we get without actual hitscan. #define MUZZLE_EFFECT_PIXEL_INCREMENT 17 //How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers. + +#define FIREMODE_SEMIAUTO "single" +#define FIREMODE_BURST "burst" +#define FIREMODE_FULLAUTO "auto" +#define FIREMODE_OTHER "other" +#define FIREMODE_OTHER_TWO "other2" diff --git a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm index 0c86f608e51c..4dc4dfa2f95a 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm @@ -165,7 +165,7 @@ /datum/blackmarket_item/tool/suppressor name = "Suppressor" desc = "A suppressor, for when you to keep your murder on the down low." - item = /obj/item/suppressor + item = /obj/item/attachment/silencer price_min = 100 price_max = 700 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index a4d42d903261..438f140eb5c4 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -186,83 +186,6 @@ //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. var/projectile_damage_multiplier = 1 //Speed someone can be flung if its point blank - ///Text showed when attempting to fire with no round or empty round. - var/dry_fire_text = "click" - ///whether or not a message is displayed when fired - var/suppressed = null - var/can_suppress = FALSE - var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - var/suppressed_volume = 60 - var/can_unsuppress = TRUE - var/obj/item/ammo_casing/chambered = null - ///trigger guard on the weapon. Used for hulk mutations and ashies. I honestly dont know how usefult his is, id avoid touching it - trigger_guard = TRIGGER_GUARD_NORMAL - ///Set the description of the gun to this when sawed off - var/sawn_desc = null - ///This triggers some sprite behavior in shotguns and prevents further sawoff, note that can_be_sawn_off is on gun/ballistic and not here, wtf. - var/sawn_off = FALSE - - /// how many shots per burst, Ex: most machine pistols, M90, some ARs are 3rnd burst, while others like the GAR and laser minigun are 2 round burst. - var/burst_size = 3 - ///The rate of fire when firing in a burst. Not the delay between bursts - var/burst_delay = 0.15 SECONDS - ///The rate of fire when firing full auto and semi auto, and between bursts; for bursts its fire delay + burst_delay after every burst - var/fire_delay = 0.2 SECONDS - - /// after initializing, we set the firemode to this - var/default_firemode = FIREMODE_SEMIAUTO - ///Firemode index, due to code shit this is the currently selected firemode - var/firemode_index - /// Our firemodes, subtract and add to this list as needed. NOTE that the autofire component is given on init when FIREMODE_FULLAUTO is here. - var/list/gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER, FIREMODE_OTHER_TWO) - /// A acoc list that determines the names of firemodes. Use if you wanna be weird and set the name of say, FIREMODE_OTHER to "Underbarrel grenade launcher" for example. - var/list/gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "misc. fire", FIREMODE_OTHER_TWO = "very misc. fire") - ///BASICALLY: the little button you select firing modes from? this is jsut the prefix of the icon state of that. For example, if we set it as "laser", the fire select will use "laser_single" and so on. - var/fire_select_icon_state_prefix = "" - ///If true, we put "safety_" before fire_select_icon_state_prefix's prefix. ex. "safety_laser_single" - var/adjust_fire_select_icon_state_on_safety = FALSE - - ///Are we firing a burst? If so, dont fire again until burst is done - var/currently_firing_burst = FALSE - ///This prevents gun from firing until the coodown is done, affected by lag - var/current_cooldown = 0 - ///affects if you can fire it unwielded or even dual wield it. LIGHT means dual wield allowed, HEAVY and higher means you have to wield to fire - var/weapon_weight = WEAPON_LIGHT - ///If dual wielding, add this to the spread - var/dual_wield_spread = 24 - /// ???, no clue what this is. Original desc: //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. - var/randomspread = 1 - - ///Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo. - var/projectile_damage_multiplier = 1 - - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - - var/list/attachment_options = list() //This.. works for now.. gun refactor soon - - var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one. - var/obj/item/flashlight/seclite/gun_light - var/datum/action/item_action/toggle_gunlight/alight - var/gunlight_state = "flight" - - var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one. - var/obj/item/kitchen/knife/bayonet - var/knife_x_offset = 0 - var/knife_y_offset = 0 - - var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite - var/ammo_y_offset = 0 - var/flight_x_offset = 0 - var/flight_y_offset = 0 - - //Zooming - var/zoomable = FALSE //whether the gun generates a Zoom action on creation - var/zoomed = FALSE //Zoom toggle - var/zoom_amt = 3 //Distance in TURFs to move the user's screen forward (the "zoom" effect) - var/zoom_out_amt = 0 - var/datum/action/toggle_scope_zoom/azoom - var/pb_knockback = 0 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. @@ -284,10 +207,12 @@ ///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max. var/recoil_deviation = 22.5 - //how large a burst is - var/burst_size = 1 - //rate of fire for burst firing and semi auto - var/fire_delay = 0 + /// how many shots per burst, Ex: most machine pistols, M90, some ARs are 3rnd burst, while others like the GAR and laser minigun are 2 round burst. + var/burst_size = 3 + ///The rate of fire when firing in a burst. Not the delay between bursts + var/burst_delay = 0.15 SECONDS + ///The rate of fire when firing full auto and semi auto, and between bursts; for bursts its fire delay + burst_delay after every burst + var/fire_delay = 0.2 SECONDS //Prevent the weapon from firing again while already firing var/firing_burst = 0 //cooldown handler @@ -307,6 +232,12 @@ var/mag_display_ammo = FALSE ///Whether the sprite has a visible indicator for being empty or not. var/empty_indicator = FALSE + ///Whether the sprite has a visible magazine or not + var/show_magazine_on_sprite = FALSE + ///Whether the sprite has a visible ammo display or not + var/show_magazine_on_sprite_ammo = FALSE + ///Whether the gun supports multiple special mag types + var/unique_mag_sprites_for_variants = FALSE //ENERGY //Do we handle overlays with base update_appearance()? @@ -365,6 +296,27 @@ //set to true so the gun is given an empty cell var/dead_cell = FALSE + ///trigger guard on the weapon. Used for hulk mutations and ashies. I honestly dont know how usefult his is, id avoid touching it + trigger_guard = TRIGGER_GUARD_NORMAL + + /// after initializing, we set the firemode to this + var/default_firemode = FIREMODE_SEMIAUTO + ///Firemode index, due to code shit this is the currently selected firemode + var/firemode_index + /// Our firemodes, subtract and add to this list as needed. NOTE that the autofire component is given on init when FIREMODE_FULLAUTO is here. + var/list/gun_firemodes = list(FIREMODE_SEMIAUTO, FIREMODE_BURST, FIREMODE_FULLAUTO, FIREMODE_OTHER, FIREMODE_OTHER_TWO) + /// A acoc list that determines the names of firemodes. Use if you wanna be weird and set the name of say, FIREMODE_OTHER to "Underbarrel grenade launcher" for example. + var/list/gun_firenames = list(FIREMODE_SEMIAUTO = "single", FIREMODE_BURST = "burst fire", FIREMODE_FULLAUTO = "full auto", FIREMODE_OTHER = "misc. fire", FIREMODE_OTHER_TWO = "very misc. fire") + ///BASICALLY: the little button you select firing modes from? this is jsut the prefix of the icon state of that. For example, if we set it as "laser", the fire select will use "laser_single" and so on. + var/fire_select_icon_state_prefix = "" + ///If true, we put "safety_" before fire_select_icon_state_prefix's prefix. ex. "safety_laser_single" + var/adjust_fire_select_icon_state_on_safety = FALSE + + ///Are we firing a burst? If so, dont fire again until burst is done + var/currently_firing_burst = FALSE + ///This prevents gun from firing until the coodown is done, affected by lag + var/current_cooldown = 0 + /obj/item/gun/Initialize() . = ..() RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index d9d9bfc122ac..3ef7d44f1e17 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -1,7 +1,6 @@ /obj/item/gun/ballistic/automatic w_class = WEIGHT_CLASS_NORMAL - can_suppress = TRUE gun_firemodes = list(FIREMODE_SEMIAUTO) default_firemode = FIREMODE_SEMIAUTO diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index a5ed95df5606..3b27175b56d2 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -4,7 +4,6 @@ icon_state = "pistol" w_class = WEIGHT_CLASS_SMALL mag_type = /obj/item/ammo_box/magazine/m10mm - can_suppress = TRUE actions_types = list() bolt_type = BOLT_TYPE_LOCKING fire_sound = 'sound/weapons/gun/pistol/shot.ogg' From 95de68017fbf7ca4878d7072b34c82f21d42e189 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 7 Jun 2024 02:40:55 -0500 Subject: [PATCH 174/206] yea --- code/__DEFINES/guns.dm | 11 ----------- code/modules/projectiles/gun.dm | 1 + 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index 6f702fadb7d8..94fd74c580f3 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -30,13 +30,6 @@ ///added recoil of sawn off guns #define SAWN_OFF_RECOIL 1 -//ammo box sprite defines -///ammo box will always use provided icon state -#define AMMO_BOX_ONE_SPRITE 0 -///ammo box will have a different state for each bullet; - -#define AMMO_BOX_PER_BULLET 1 -///ammo box will have a different state for full and empty; -max_ammo and -0 -#define AMMO_BOX_FULL_EMPTY 2 /* Stolen from tgmc.. Will use soon //Gun defines for gun related thing. More in the projectile folder. //gun_features_flags @@ -174,10 +167,6 @@ DEFINE_BITFIELD(attach_slots, list( #define NICE_SHOT_RICOCHET_BONUS 10 //if the shooter has the NICE_SHOT trait and they fire a ricocheting projectile, add this to the ricochet chance and auto aim angle -//Projectile Reflect -#define REFLECT_NORMAL (1<<0) -#define REFLECT_FAKEPROJECTILE (1<<1) - //ammo box sprite defines ///ammo box will always use provided icon state #define AMMO_BOX_ONE_SPRITE 0 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 438f140eb5c4..54283e39b1be 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -296,6 +296,7 @@ //set to true so the gun is given an empty cell var/dead_cell = FALSE +// Need to sort ///trigger guard on the weapon. Used for hulk mutations and ashies. I honestly dont know how usefult his is, id avoid touching it trigger_guard = TRIGGER_GUARD_NORMAL From 586540be91c9e14956dece5c42a83e56f0f77f66 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 7 Jun 2024 19:11:33 -0500 Subject: [PATCH 175/206] removes replaced var --- code/modules/projectiles/gun.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 54283e39b1be..1d5415339260 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -215,8 +215,6 @@ var/fire_delay = 0.2 SECONDS //Prevent the weapon from firing again while already firing var/firing_burst = 0 - //cooldown handler - var/semicd = 0 /* * Overlay From 08fa2f6a97da980f9d1a234c755fce1446b0ff70 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 9 Jun 2024 02:24:49 -0500 Subject: [PATCH 176/206] changes to attachment removal, moves it to alt click --- code/__DEFINES/guns.dm | 13 ++++--- code/datums/components/attachment.dm | 2 +- code/datums/components/attachment_holder.dm | 38 ++++++++++++++----- .../objects/items/attachments/_attachment.dm | 18 ++++++++- .../game/objects/items/attachments/bayonet.dm | 2 + .../objects/items/attachments/laser_sight.dm | 10 ++--- .../objects/items/attachments/rail_light.dm | 2 +- .../objects/items/attachments/silencer.dm | 2 + code/modules/projectiles/gun.dm | 1 + code/modules/projectiles/guns/ballistic.dm | 5 --- .../projectiles/guns/ballistic/pistol.dm | 1 + 11 files changed, 62 insertions(+), 32 deletions(-) diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index 94fd74c580f3..ba5c94562f82 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -104,10 +104,10 @@ #define COMSIG_ATTACHMENT_TOGGLE "attach-toggle" #define COMSIG_ATTACHMENT_GET_SLOT "attach-slot-who" -#define ATTACHMENT_SLOT_MUZZLE "attach-slot-muzzle" -#define ATTACHMENT_SLOT_SCOPE "attach-slot-scope" -#define ATTACHMENT_SLOT_GRIP "attach-slot-grip" -#define ATTACHMENT_SLOT_RAIL "attach-slot-rail" +#define ATTACHMENT_SLOT_MUZZLE "muzzle" +#define ATTACHMENT_SLOT_SCOPE "scope" +#define ATTACHMENT_SLOT_GRIP "grip" +#define ATTACHMENT_SLOT_RAIL "rail" /* #define BIT_ATTACHMENT_SLOT_MUZZLE (1<<0) @@ -153,8 +153,9 @@ DEFINE_BITFIELD(attach_slots, list( ) //attach_features_flags -#define ATTACH_REMOVABLE (1<<0) -#define ATTACH_TOGGLE (1<<1) +#define ATTACH_REMOVABLE_HAND (1<<0) +#define ATTACH_REMOVABLE_TOOL (1<<1) +#define ATTACH_TOGGLE (1<<2) ///////////////// // PROJECTILES // diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index c95db361d1f1..34f053e4d601 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -11,7 +11,7 @@ /datum/component/attachment/Initialize( slot = ATTACHMENT_SLOT_RAIL, - attach_features_flags = ATTACH_REMOVABLE, + attach_features_flags = ATTACH_REMOVABLE_HAND, valid_parent_types = list(/obj/item/gun), datum/callback/on_attach = null, datum/callback/on_detach = null, diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index c047546c44e8..9edae8c8063b 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -26,6 +26,7 @@ RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(handle_qdel)) RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(handle_item_pre_attack)) RegisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT, PROC_REF(handle_ctrl_shift_click)) + RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(handle_alt_click)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(handle_overlays)) if(length(default_attachments)) @@ -72,6 +73,11 @@ INVOKE_ASYNC(src, PROC_REF(do_attachment_radial), parent, user) +/datum/component/attachment_holder/proc/handle_alt_click(obj/item/parent, mob/user) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(handle_detach), parent, user) + /datum/component/attachment_holder/proc/do_attachment_radial(obj/item/parent, mob/user) var/list/attachments_as_list = attachments_to_list(TRUE) var/selection = show_radial_menu(user, parent, attachments_as_list) @@ -93,7 +99,6 @@ examine_list += span_notice("It has the following attachments:") for(var/obj/item/attach as anything in attachments) examine_list += span_notice("\t- [attach.name]") - examine_list += span_notice("\tThey can be removed with a crowbar") for(var/obj/attach_type as anything in valid_types) examine_list += span_notice("It can accept [initial(attach_type.name)]") for(var/obj/item/attach as anything in attachments) @@ -126,15 +131,28 @@ var/atom/parent = src.parent parent.update_icon() -/datum/component/attachment_holder/proc/handle_detach(obj/item/parent, obj/item/tool, mob/user) - var/list/list = list() +/datum/component/attachment_holder/proc/handle_detach(obj/item/parent, mob/user, obj/item/tool) + var/list/tool_list = list() + var/list/hand_list = list() for(var/obj/item/attachment/attach as anything in attachments) - if(attach.attach_features_flags & ATTACH_REMOVABLE) - list[attach.name] = attach - var/selected = tgui_input_list(user, "Select Attachment", "Detach", list) - if(!parent.Adjacent(user) || !selected || !tool || !tool.use_tool(parent, user, 2 SECONDS * tool.toolspeed)) - return - do_detach(list[selected], user) + if(attach.attach_features_flags & ATTACH_REMOVABLE_TOOL) + tool_list[attach.name] = attach + if(attach.attach_features_flags & ATTACH_REMOVABLE_HAND) + hand_list[attach.name] = attach + if(tool) + if(!length(tool_list)) + return + var/selected = tgui_input_list(user, "Select Attachment", "Detach", tool_list) + if(!parent.Adjacent(user) || !selected || !tool || !tool.use_tool(parent, user, 2 SECONDS * tool.toolspeed)) + return + do_detach(tool_list[selected], user) + else + if(!length(hand_list)) + return + var/selected = tgui_input_list(user, "Select Attachment", "Detach", hand_list) + if(do_after(user, 2 SECONDS, parent)) + do_detach(hand_list[selected], user) + /datum/component/attachment_holder/proc/handle_attack(obj/item/parent, obj/item/item, mob/user) SIGNAL_HANDLER @@ -143,7 +161,7 @@ return if(item.tool_behaviour == TOOL_CROWBAR && length(attachments)) - INVOKE_ASYNC(src, PROC_REF(handle_detach), parent, item, user) + INVOKE_ASYNC(src, PROC_REF(handle_detach), parent, user, item) return TRUE if(HAS_TRAIT(item, TRAIT_ATTACHABLE)) diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index 8f0a3a360159..a78fc06d299d 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -4,8 +4,8 @@ icon = 'icons/obj/guns/attachments.dmi' var/slot = ATTACHMENT_SLOT_RAIL - ///various yes no flags associated with attachments. See defines for these: [ATTACH_REMOVABLE] - var/attach_features_flags = ATTACH_REMOVABLE + ///various yes no flags associated with attachments. See defines for these: [ATTACH_REMOVABLE_HAND] + var/attach_features_flags = ATTACH_REMOVABLE_HAND var/list/valid_parents = list() var/list/signals = list() var/datum/component/attachment/attachment_comp @@ -19,6 +19,8 @@ ///Determines the amount of pixels to move the icon state for the overlay. in the y direction var/pixel_shift_y = 16 + var/spread_mod = 0 + /obj/item/attachment/Initialize() . = ..() attachment_comp = AddComponent( \ @@ -52,6 +54,7 @@ to_chat(user, "You cannot attach [src] while it is active!") return FALSE + apply_modifiers(gun, user, TRUE) playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1) return TRUE @@ -61,8 +64,19 @@ if(toggled) Toggle(gun, user) + apply_modifiers(gun, user, FALSE) playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1) return TRUE /obj/item/attachment/proc/PreAttack(obj/item/gun/gun, atom/target, mob/user, list/params) return FALSE + +///Handles the modifiers to the parent gun +/obj/item/attachment/proc/apply_modifiers(obj/item/gun/gun, mob/user, attaching) + if(attaching) + gun.spread += spread_mod + gun.spread_unwielded += spread_mod + else + gun.spread -= spread_mod + gun.spread_unwielded -= spread_mod + diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index c2022ea344d1..0bfac65b33c9 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -12,6 +12,8 @@ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = IS_SHARP_ACCURATE + spread_mod = 1 + /obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) melee_attack_chain(user, target, params) diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm index 43af9b310c93..8f76ec51339f 100644 --- a/code/game/objects/items/attachments/laser_sight.dm +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -2,17 +2,13 @@ name = "laser sight" desc = "This laser sight is designed to be rail-mounted on a compatible firearm to provide increased accuracy." icon_state = "laserpointer" - attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE + attach_features_flags = ATTACH_REMOVABLE_HAND|ATTACH_TOGGLE pixel_shift_x = 1 pixel_shift_y = 4 + spread_mod = -1 + /obj/item/attachment/laser_sight/Toggle(obj/item/gun/gun, mob/user) . = ..() playsound(user, toggled ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE) - - if(toggled) - gun.spread *= 0.6 - return - - gun.spread = initial(gun.spread) diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm index d782e23123ac..9850a9f94ea6 100644 --- a/code/game/objects/items/attachments/rail_light.dm +++ b/code/game/objects/items/attachments/rail_light.dm @@ -2,7 +2,7 @@ name = "rail light" desc = "Rail mounted gun light for better visibility down range." icon_state = "raillight" - attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE + attach_features_flags = ATTACH_REMOVABLE_HAND|ATTACH_TOGGLE pixel_shift_x = 1 pixel_shift_y = 4 diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index 19d3f16a82c1..a97ba1ea0375 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -6,6 +6,8 @@ pixel_shift_x = 1 pixel_shift_y = 2 + spread_mod = -1 + /obj/item/attachment/silencer/Attach(obj/item/gun/gun, mob/user) . = ..() gun.suppressed = TRUE diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 1d5415339260..3188bb0a33f6 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -616,6 +616,7 @@ /obj/item/gun/proc/reset_current_cooldown() current_cooldown = FALSE + /obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) if(!safety) to_chat(user, "*[dry_fire_text]*") diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index c338c8172c71..6401b9228317 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -226,11 +226,6 @@ return return FALSE -/obj/item/gun/ballistic/AltClick(mob/user) - if (unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) - reskin_obj(user) - return - ///Prefire empty checks for the bolt drop /obj/item/gun/ballistic/proc/prefire_empty_checks() if (!chambered && !get_ammo()) diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 3b27175b56d2..3b05d764aa23 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -202,6 +202,7 @@ EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) to_chat(user, "You toggle [src]'s vox audio functions.") /obj/item/gun/ballistic/automatic/pistol/commissar/AltClick(mob/user) + . = ..() if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return if((cooldown < world.time - 200) && funnysounds) From 1ac82439d11868d8187e6093e1d22a2a041b58c1 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 10 Jun 2024 03:35:29 -0500 Subject: [PATCH 177/206] small improvments to attachment code, default attachs work, better gun stat handling --- code/__DEFINES/guns.dm | 1 + code/datums/components/attachment.dm | 10 ++++++---- code/datums/components/attachment_holder.dm | 11 ++++++----- code/game/objects/items/attachments/_attachment.dm | 12 +++++++++--- code/game/objects/items/attachments/bayonet.dm | 5 +++-- code/game/objects/items/attachments/laser_sight.dm | 13 +++++++++++-- code/game/objects/items/attachments/rail_light.dm | 9 +++++---- code/game/objects/items/attachments/silencer.dm | 3 ++- 8 files changed, 43 insertions(+), 21 deletions(-) diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index ba5c94562f82..c2296a53834e 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -156,6 +156,7 @@ DEFINE_BITFIELD(attach_slots, list( #define ATTACH_REMOVABLE_HAND (1<<0) #define ATTACH_REMOVABLE_TOOL (1<<1) #define ATTACH_TOGGLE (1<<2) +#define ATTACH_NO_SPRITE (1<<3) ///////////////// // PROJECTILES // diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 34f053e4d601..219e48670bfa 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -72,13 +72,15 @@ return TRUE /datum/component/attachment/proc/update_overlays(obj/item/parent, list/overlays, list/offset) - overlays += mutable_appearance(parent.icon, "[parent.icon_state]-attached") + if(!(attach_features_flags & ATTACH_NO_SPRITE)) + overlays += mutable_appearance(parent.icon, "[parent.icon_state]-attached") -/datum/component/attachment/proc/try_attach(obj/item/parent, obj/item/holder, mob/user) +/datum/component/attachment/proc/try_attach(obj/item/parent, obj/item/holder, mob/user, bypass_checks) SIGNAL_HANDLER - if(!parent.Adjacent(user) || (length(valid_parent_types) && (holder.type in valid_parent_types))) - return FALSE + if(!bypass_checks) + if(!parent.Adjacent(user) || (length(valid_parent_types) && (holder.type in valid_parent_types))) + return FALSE if(on_attach && !on_attach.Invoke(holder, user)) return FALSE diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 9edae8c8063b..6b57447f40b8 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -15,6 +15,7 @@ if(!isgun(parent)) return COMPONENT_INCOMPATIBLE + var/obj/item/gun/parent_gun = parent src.slot_room = slot_room src.valid_types = valid_types @@ -30,9 +31,9 @@ RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(handle_overlays)) if(length(default_attachments)) - for(var/obj/item/attachment/attachment in default_attachments) - var/obj/item/attachment/new_attachment = new(attachment) - INVOKE_ASYNC(src, PROC_REF(do_attach), new_attachment, null) + for(var/attachment in default_attachments) + var/obj/item/attachment/new_attachment = new attachment(parent_gun.loc) + INVOKE_ASYNC(src, PROC_REF(do_attach), new_attachment, null, TRUE) /datum/component/attachment_holder/proc/handle_overlays(obj/item/parent, list/overlays) SIGNAL_HANDLER @@ -104,7 +105,7 @@ for(var/obj/item/attach as anything in attachments) SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE_MORE, user, examine_list) -/datum/component/attachment_holder/proc/do_attach(obj/item/attachment, mob/user) +/datum/component/attachment_holder/proc/do_attach(obj/item/attachment, mob/user, bypass_checks) var/slot = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_GET_SLOT) slot = attachment_slot_from_bflag(slot) if(!(attachment.type in valid_types)) @@ -114,7 +115,7 @@ to_chat(user, span_notice("[parent] does not contain room for [attachment]!")) return slot_room[slot]-- - . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_ATTACH, parent, user) + . = SEND_SIGNAL(attachment, COMSIG_ATTACHMENT_ATTACH, parent, user, bypass_checks) if(.) attachments += attachment var/atom/parent = src.parent diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index a78fc06d299d..48a17c15af03 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -20,6 +20,9 @@ var/pixel_shift_y = 16 var/spread_mod = 0 + var/spread_unwielded_mod = 0 + var/wield_delay = 0 + var/size_mod = 0 /obj/item/attachment/Initialize() . = ..() @@ -75,8 +78,11 @@ /obj/item/attachment/proc/apply_modifiers(obj/item/gun/gun, mob/user, attaching) if(attaching) gun.spread += spread_mod - gun.spread_unwielded += spread_mod + gun.spread_unwielded += spread_unwielded_mod + gun.wield_delay += wield_delay + gun.w_class += size_mod else gun.spread -= spread_mod - gun.spread_unwielded -= spread_mod - + gun.spread_unwielded -= spread_unwielded_mod + gun.wield_delay -= wield_delay + gun.w_class -= size_mod diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 0bfac65b33c9..06fbb7982293 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -4,15 +4,16 @@ icon_state = "bayonet" force = 15 throwforce = 10 - pixel_shift_x = 1 - pixel_shift_y = 4 pickup_sound = 'sound/items/handling/knife1_pickup.ogg' drop_sound = 'sound/items/handling/knife3_drop.ogg' hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = IS_SHARP_ACCURATE + pixel_shift_x = 1 + pixel_shift_y = 4 spread_mod = 1 + wield_delay = 0.1 SECONDS /obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm index 8f76ec51339f..8d493d2b86c8 100644 --- a/code/game/objects/items/attachments/laser_sight.dm +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -2,13 +2,22 @@ name = "laser sight" desc = "This laser sight is designed to be rail-mounted on a compatible firearm to provide increased accuracy." icon_state = "laserpointer" + attach_features_flags = ATTACH_REMOVABLE_HAND|ATTACH_TOGGLE pixel_shift_x = 1 pixel_shift_y = 4 - - spread_mod = -1 + wield_delay = 0.1 SECONDS /obj/item/attachment/laser_sight/Toggle(obj/item/gun/gun, mob/user) . = ..() + if(toggled) + gun.spread -= 3 + gun.spread_unwielded -= 3 + gun.wield_delay -= 0.3 SECONDS + else + gun.spread += 3 + gun.spread_unwielded += 3 + gun.wield_delay += 0.3 SECONDS + playsound(user, toggled ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE) diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm index 9850a9f94ea6..155c6d485873 100644 --- a/code/game/objects/items/attachments/rail_light.dm +++ b/code/game/objects/items/attachments/rail_light.dm @@ -2,16 +2,17 @@ name = "rail light" desc = "Rail mounted gun light for better visibility down range." icon_state = "raillight" - attach_features_flags = ATTACH_REMOVABLE_HAND|ATTACH_TOGGLE - pixel_shift_x = 1 - pixel_shift_y = 4 - light_color = "#FFCC66" light_system = MOVABLE_LIGHT_DIRECTIONAL light_range = 4 light_power = 0.8 light_on = FALSE + attach_features_flags = ATTACH_REMOVABLE_HAND|ATTACH_TOGGLE + pixel_shift_x = 1 + pixel_shift_y = 4 + wield_delay = 0.1 SECONDS + /obj/item/attachment/rail_light/Toggle(obj/item/gun/gun, mob/user) . = ..() set_light_on(toggled) diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index a97ba1ea0375..ff601407632d 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -2,11 +2,12 @@ name = "silencer" desc = "For when you need to kill someone but not be seen killing someone!" icon_state = "silencer" + slot = ATTACHMENT_SLOT_MUZZLE pixel_shift_x = 1 pixel_shift_y = 2 - spread_mod = -1 + size_mod = 1 /obj/item/attachment/silencer/Attach(obj/item/gun/gun, mob/user) . = ..() From 7cf26b53d0a3e490ebee65361e055bef096c8ba8 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 10 Jun 2024 03:46:52 -0500 Subject: [PATCH 178/206] improvments to attachment holder examine more --- code/datums/components/attachment_holder.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index 6b57447f40b8..fa1e37394272 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -95,13 +95,16 @@ /datum/component/attachment_holder/proc/handle_examine_more(obj/item/parent, mob/user, list/examine_list) for(var/key in slot_room) - examine_list += span_notice("It has [slot_room[key]] slot\s for [key] attachments.") + if(slot_room[key]) + examine_list += span_notice("It has [slot_room[key]] slot\s free for [key] attachments.") if(length(attachments)) examine_list += span_notice("It has the following attachments:") for(var/obj/item/attach as anything in attachments) examine_list += span_notice("\t- [attach.name]") - for(var/obj/attach_type as anything in valid_types) - examine_list += span_notice("It can accept [initial(attach_type.name)]") + if(length(attachments)) + examine_list += span_notice("It can accept:") + for(var/obj/attach_type as anything in valid_types) + examine_list += span_notice("\t- [initial(attach_type.name)]") for(var/obj/item/attach as anything in attachments) SEND_SIGNAL(attach, COMSIG_ATTACHMENT_EXAMINE_MORE, user, examine_list) From dd097fe0aa5ce61673dfab8c2c98cd19e7700938 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 10 Jun 2024 05:28:35 -0500 Subject: [PATCH 179/206] stocks working! --- code/__DEFINES/guns.dm | 6 + code/datums/components/attachment_holder.dm | 2 +- code/game/objects/items/attachments/stock.dm | 40 ++++++ .../modules/projectiles/guns/ballistic/smg.dm | 118 ++++++------------ icons/obj/guns/48x32guns.dmi | Bin 44539 -> 37968 bytes icons/obj/guns/attachments.dmi | Bin 3815 -> 4332 bytes shiptest.dme | 1 + 7 files changed, 86 insertions(+), 81 deletions(-) create mode 100644 code/game/objects/items/attachments/stock.dm diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index c2296a53834e..44e7515726d4 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -108,6 +108,7 @@ #define ATTACHMENT_SLOT_SCOPE "scope" #define ATTACHMENT_SLOT_GRIP "grip" #define ATTACHMENT_SLOT_RAIL "rail" +#define ATTACHMENT_SLOT_STOCK "stock" /* #define BIT_ATTACHMENT_SLOT_MUZZLE (1<<0) @@ -133,6 +134,8 @@ DEFINE_BITFIELD(attach_slots, list( return (1<<2) if(ATTACHMENT_SLOT_RAIL) return (1<<3) + if(ATTACHMENT_SLOT_STOCK) + return (1<<4) /proc/attachment_slot_from_bflag(slot) switch(slot) @@ -144,12 +147,15 @@ DEFINE_BITFIELD(attach_slots, list( return ATTACHMENT_SLOT_GRIP if(1<<3) return ATTACHMENT_SLOT_RAIL + if(1<<4) + return ATTACHMENT_SLOT_STOCK #define ATTACHMENT_DEFAULT_SLOT_AVAILABLE list( \ ATTACHMENT_SLOT_MUZZLE = 1, \ ATTACHMENT_SLOT_SCOPE = 1, \ ATTACHMENT_SLOT_GRIP = 1, \ ATTACHMENT_SLOT_RAIL = 1, \ + ATTACHMENT_SLOT_STOCK = 1, \ ) //attach_features_flags diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index fa1e37394272..d37a7053255d 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -101,7 +101,7 @@ examine_list += span_notice("It has the following attachments:") for(var/obj/item/attach as anything in attachments) examine_list += span_notice("\t- [attach.name]") - if(length(attachments)) + if(length(valid_types)) examine_list += span_notice("It can accept:") for(var/obj/attach_type as anything in valid_types) examine_list += span_notice("\t- [initial(attach_type.name)]") diff --git a/code/game/objects/items/attachments/stock.dm b/code/game/objects/items/attachments/stock.dm new file mode 100644 index 000000000000..0aa9b697ec7f --- /dev/null +++ b/code/game/objects/items/attachments/stock.dm @@ -0,0 +1,40 @@ +/obj/item/attachment/foldable_stock + name = "foldable stock" + desc = "A foldable stock that can be attached to a weapon to improve stability." + icon_state = "skm-carbine-stock" + slot = ATTACHMENT_SLOT_STOCK + attach_features_flags = ATTACH_TOGGLE + + pixel_shift_x = 17 + pixel_shift_y = 18 + + var/toggled_slowdown = 0.10 + var/toggled_wield_delay = -0.4 SECONDS + var/toggled_recoil_bonus = -2 + var/toggled_spread_bonus = -5 + +/obj/item/attachment/foldable_stock/Toggle(obj/item/gun/gun, mob/user) + . = ..() + + if(toggled) + to_chat(user, span_notice("You unfold the stock on the [src].")) + gun.w_class += 1 + gun.wield_delay += toggled_wield_delay + gun.wield_slowdown += toggled_slowdown + gun.recoil += toggled_recoil_bonus + gun.spread += toggled_spread_bonus + else + to_chat(user, span_notice("You fold the stock on the [src].")) + gun.w_class -= 1 + gun.wield_delay -= toggled_wield_delay + gun.wield_slowdown -= toggled_slowdown + gun.recoil -= toggled_recoil_bonus + gun.spread -= toggled_spread_bonus + + if(gun.wielded) + user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = gun.wield_slowdown) + + playsound(src, 'sound/weapons/empty.ogg', 100, 1) + +/obj/item/attachment/foldable_stock/inteq + icon_state = "skm-inteqsmg-stock" diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index 4656f383940e..4b19c98729ff 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -275,11 +275,9 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) eject_empty_sound = 'sound/weapons/gun/rifle/skm_unload.ogg' weapon_weight = WEAPON_MEDIUM - w_class = WEIGHT_CLASS_BULKY + w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/skm_545_39 - actions_types = list(/datum/action/item_action/fold_stock) //once again, ideally an attatchment in the future - recoil = 2 recoil_unwielded = 6 @@ -289,76 +287,35 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) wield_delay = 0.6 SECONDS wield_slowdown = 0.35 - ///is the bipod deployed? - var/stock_folded = FALSE - - ///we add these two values to recoi/spread when we have the bipod deployed - var/stock_recoil_bonus = -2 - var/stock_spread_bonus = -5 - - var/folded_slowdown = 0.6 - var/folded_wield_delay = 0.6 SECONDS - - var/unfolded_slowdown = 0.35 - var/unfolded_wield_delay = 0.2 SECONDS - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - -/datum/action/item_action/fold_stock - name = "Fold/Unfold stock" - desc = "Fold or unfold the stock for easier storage." - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/ui_action_click(mob/user, action) - if(!istype(action, /datum/action/item_action/fold_stock)) - return ..() - fold(user) - - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/proc/fold(mob/user) - if(stock_folded) - to_chat(user, "You unfold the stock on the [src].") - w_class = WEIGHT_CLASS_BULKY - wield_delay = folded_wield_delay - wield_slowdown = folded_slowdown - else - to_chat(user, "You fold the stock on the [src].") - w_class = WEIGHT_CLASS_NORMAL - wield_delay = unfolded_wield_delay - wield_slowdown = unfolded_slowdown - - if(wielded) - user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown) - - stock_folded = !stock_folded - playsound(src, 'sound/weapons/empty.ogg', 100, 1) - update_appearance() - - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_recoil(mob/user, recoil_bonus = 0) - var/total_recoil = recoil_bonus - if(!stock_folded) - total_recoil += stock_recoil_bonus - - return ..(user, total_recoil) - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/calculate_spread(mob/user, bonus_spread) - var/total_spread = bonus_spread - - if(!stock_folded) - total_spread += stock_spread_bonus - - return ..(user, total_spread) - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/update_icon_state() - . = ..() - item_state = "[initial(item_state)][stock_folded ? "_nostock" : ""]" - mob_overlay_state = "[initial(item_state)][stock_folded ? "_nostock" : ""]" - -/obj/item/gun/ballistic/automatic/smg/skm_carbine/update_overlays() - . = ..() - . += "[base_icon_state || initial(icon_state)][stock_folded ? "_nostock" : "_stock"]" + valid_attachments = list( + /obj/item/attachment/silencer, + /obj/item/attachment/laser_sight, + /obj/item/attachment/rail_light, + /obj/item/attachment/bayonet, + /obj/item/attachment/foldable_stock + ) + + slot_available = list( + ATTACHMENT_SLOT_MUZZLE = 1, + ATTACHMENT_SLOT_RAIL = 1, + ATTACHMENT_SLOT_STOCK = 1 + ) + slot_offsets = list( + ATTACHMENT_SLOT_MUZZLE = list( + "x" = 26, + "y" = 20, + ), + ATTACHMENT_SLOT_RAIL = list( + "x" = 19, + "y" = 18, + ), + ATTACHMENT_SLOT_STOCK = list( + "x" = 11, + "y" = 20, + ) + ) + + default_attachments = list(/obj/item/attachment/foldable_stock) /obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq name = "\improper SKM-44v Mongrel" @@ -382,13 +339,14 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) recoil = 0 recoil_unwielded = 4 - stock_spread_bonus = -4 - stock_recoil_bonus = -1 - wield_delay = 0.4 SECONDS - folded_slowdown = 0.15 - folded_wield_delay = 0.2 SECONDS + valid_attachments = list( + /obj/item/attachment/silencer, + /obj/item/attachment/laser_sight, + /obj/item/attachment/rail_light, + /obj/item/attachment/bayonet, + /obj/item/attachment/foldable_stock/inteq + ) - unfolded_slowdown = 0.35 - unfolded_wield_delay = 0.4 SECONDS + default_attachments = list(/obj/item/attachment/foldable_stock/inteq) diff --git a/icons/obj/guns/48x32guns.dmi b/icons/obj/guns/48x32guns.dmi index 232ecdb35e02415c0ae78a6bb913b212af6f80ad..d4ac9b0e04c92e9c1f9c74d1b411c7fd247185cf 100644 GIT binary patch literal 37968 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 literal 44539 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 U(W4d>2>er)SCcD|F@NJ4q>LqdmMF?P z#27A^SX&*ml7-QhmA^yL%u~b5r{R6`Z)?kbYo#xxw#MhI`PbeHpGXSj$Y_Bb8cdhH z5NVymY`ux)#zl{D`c8E}5X4uk<;^G%xP-T}M$$oQ0JV`zoN$WmPm)ApQaH zE;3LF_0h9dkj^>x;9DIlkG|GyitzQ_2fSGpGOQw6BO^R57#(EUVOnqg9*pQ3(kxor zth_O>zPF$0<>lQ#YN_4RB(;$!ZBMha`MF9?hpIUOy@GfM{CpSSDsu%%BZ|PlR}hq_ zaDWSW+?E0z0b^|~db}h&eZSgRH4?Wec}uLS3VRI}t#vo_+%MQ3M!{E|4ZpEwYCNX;)f%aw}Z(;J7W&`)!#~GtZJ) z)_&u?_z_Sd^adBj7OfQ%dKHz$^?~^P3D#7uk{yeKEXHx!0&$uQbY7`aAMSw4=8kbt zP4`KIj58B`BO8LkZc>;DJ0}WfFcMMPfTU|81EBNiP^JS#n~f(0Bb?p_#fZ;H$B8=G z{p1y-iprSa#3g(CcZ8Qp>Zxc<=@tYYg_%~>xmclVh{u1`&PwK>#oap^7L7ML7N57# zJ} zHZCc1R^WJIP4~5@%h)-j+WWKrTl45ijaea)7RYS&R%fngBSlMaa0&k^Pz41v)dGZD z>_c(T=)omYLLLemV!~H-7Ui;)H9Nf@TXgot^}m#>#bwVON2TN?s$a>MS1r3rgNA$;k|nDYZYBf|CQQX|0mv- zIIquXa08{et**~%!_#hc1-_9IJv|TSl;PPGZpwXUNU)pZ;DevqSQ0HVGRbquBiZ(# zuln{$Zl?KnZk3;u)WTrWY4t9P?m-Y8WE2_`v*zuQLUkbSUK+Yv;oyJ>CM}vWT!YLL zO}Ykql$GuOjjfs2V5DJmUnjOfk2S?xCdJ#4pTVHyIOMrxTjzNAq=Ni4^;;x%^2A#! zk}qna1fceb4d%JWx?XP!Zo4l5A_Oa+J4B?wFJXE}x zw&Z4K^g%HAHdcaxhNXxgJMG&G&Y7z&4|gHsz}KwtzO$E}wawM)WPf!A0UkK=_Kkak z5y9GW0m0AGma?!1{7`AK5GX+g>3tRm7tM6^rWTAXDZgimi$gxhcaE-33-RzsIjkh= zQn*DZ8jN#^{liA_Tm=F}2ta4IU-7+MCJ9E%9P$4*BX31~iv-)ux`M># z#7FaZPDNI_{aklG!Q1b3@ca999ZRmu zh^WSsH9}1OCTd`HDQjRPRkS=Rq&coAb~k1Y7RM^cuslEfEFWdwF0bSVt_-~Pr;RPW zxT(p6;QK7WEQa`24ROmQqDe2jFmS350y@r`%xw#NFy4dP-E4Z52ajeR#y)hsQqEHj z(;+o4UG{E-3*Iy5iTeQ&F;U(k>RQE<;a^uZqqDPz}!Ls_OV0`~=U^j+HcNXAH7-L>&AKDQ?ofnZ_MGMeAzT zC7Pyi;=#~s$$r0WL;SnGotX_Ty_egZ8_bc?AD=uHAWNfb9^O8rF5zxIRA?u~P7~C@ z(dP&y8)rT8tW~u1E0kEn;UAW@3RkF>E-gWq;g+DUBWy46ama0~+2|4wGVmQKaX6;O zlko2s&>xZ>f$2O-{6Cmy-So~?m$gw8f$7kngu6sdE$uiL!$y^Gi|W4f>3n~kZ`*R% z?KMAR>bjh){6wBZn?VpM2fvSL7X_zfWgBd5Y|t#|L%IVFrnXC-m9|0+^tm3~@qvi# zWUG)C^gTND&VOnLBF+xa)oMPhFb~2;g&|Ixt#@k%-*!5Ac5P#|ONAI*pf=@Zwp8au zK4_W`w8PFKLG(jutEb1r6cZsPnykY{g&CCN2H_j`E{vMLDm^n~ljFl$HDndc(ab&f zGIu)pjv7)8VhjdeOkFoUSH-XkG*#XC5w6@)Dv@Vp!zW@Eb6bAounAlhx^-qEb%F&4WdBu>6Mty!w({DB>P-@SGztNTQ3l10(o#H(*uIx-wr zqPn3Ny5{6kb5my4K(tV?FXS9ZV_dGMry z7xh+fQ&fZmA0MAEP&s>6V+7@EXqYe_@&*F@+IPoEIl1YUW0w1sqolQl1Is2&S=;I{ zXiP`V0);}kSg%?@f430|MFmtonPMoa?B}%Fz&+xQ)VcTuj^OLuVmI_q{={(}g!6?9 z#S04yVhReJISS6>6(4q6S~MfJdU|U*ZxlZs4s8Akju>vvLS2dx+42tMcUqm8pb$AB zRW=KK{mt;!os~+ffJqx=>QWogx4%Bo-Jps-nM2;m`C3vi-^JkHPI@RAAx+M|6|q;l z9U!0Vpdh=#jA`e-- zsC=gOz5(UcbtoiyVimUpivi{4caAX*X;Y#1vDZ66SY{1FtvxLsPfjQ%xZ>se+={HVZj@#>y&P|zNnx+q;OwL&OL zejAQ6TANA!{q03X;Tv~Kyj@}$B&_(Y&G9=+gNWNJm(B0^Xf!pQng94s+jjbsj)|I_ zKlCuk_VSgv^Gkf+7k|0(f5XVVfH*y`!fE?_U9@lYD-EHJof_Lm8=l{w*;ZXEg>*D- z%@5-Vsi8znKZz>Z-~(#repgZgrbt_2N5Cgca|bUq3Mekq#eojKhh6u;cv^o1+0|-o zUkQo!p=wgd%BKP_VCODgB*0@;m_|u?`N{$5BWupAjM zzzMw5&K$bY{}oub`!^e_1a?Qb4u3B?5JF-!&p4{3$Iw^%2Aa&Ay{@HawX_HA)okqc zEU4-xG9+cjCKZpzXJjCx&=#@?heQvC3hp;^9@GB1*Jk_}g~RU`$NN_&dG^2b!*-T@ zYz&@jp*y(_dyqpyOEEchC`*;@nc>EJoT|OGW@ZnSyj5y@{MhUha+OT{p<1>Vswiu~ck3EyKJf=$`L8{76dYL+p^_brORc^`AUzEJj~mdwKE0+MME4IW zJsw$5)@);*Lw+o;C2Y`Nfatu1*FG~h)%ym>P{7O#WhHL|P`?pjOyzWu%jY=4*Wi4} zTs5Ye914r3&l7K_3*_cHUE65&bN*;9{z*z-AGc=Z?WWD?vLDOB3jgWA)r%o$jR-g^*u@4g=Zgy!aDXo1@lAiCo{k_^*`>Qyy? zQhlC%FvrFOOL2mj*7m+!BKS?xvsqvXt zAq<_t~lLXWJTvBZk~$gD!1n{7d!% zX5=>ZfU8=;ojnpeuBU{{gqpllKs>t^-+MH)(GXET$Qsl3t z&$-0%Bi>#465Z0rY9EEZU|n9tA0TC~swXbuU=ImfUi%wpJ-Fvei3BB85Pq;xy}+zw)O=LWn)q%g z3Eh_^l!*$`tG(^07fA19P4c=Z?s4wn?hXLBii!di%+Yvqc^OJ-BtH4Iq@y9v<@!c*PmoKvHIMreHRo-2PTKW*#M-76A#Q7aGeF8S+!UN@ues zt|aoH<~RGOV#~zL6owd>T5)gk4S&?u$!#+(3?0?l0*rzkmjJVl$-^Gv4SPj=w>)1Q zXTJa9{sd}$0u!ooXb@~BG>^P@{U|U>LCn*_h7G4L!VuGiZ#FTQ0z?8g`RQ4~KoB-r zB3{K2S1m`XUtCg?(0d|ecf$5(JA_m}(%6`YTbcp^txgKd2ge}{G>=J>CG1`9j0ydf zSk|=tCkoEm05AVn-u(%1Z5Wbs*LVaPcv!eLG#m3FAz=;h>3UerhZa-Sw_ysyF$)2hq31 z4oB~|c~?5&+pXQZFO>+UI4SVb0nTJ&*2jE{jDd8ph^;vmu9WI@c1v7K&nn?MKB=g| zF;Mn?guSBZnQG%uioST*)rRCuBZQ-ootu&0YyXI$Rq#<$-o0^-rF zPUhZ`LcvVt@Y|K~((AzxBZBcRt>iDT@X)@wXSlr$6?C2X0pq>ZBuMcwT36$&*)R>M zdUQJd__WUP=+@m5@?ki0qG^24Eqac%YW|KnUiU6?t8(Kx zqPwM1a7()hQfYNu`adqNzJTnR^vB>A8O7LOb?NUt#PMsORHjz^2v#lIDG~*Z?~$sF zOI5+}%1#BNs>oSpukRcoBp}9MkMNw0%C-cD@Tdl2j>A^x_4&M;8=oiK0%*Jjv5XsKi z37ew=&X*`vt+a2HVZ9c2NV4z(;Nx)163q|oJzRHZ)MD7BwG?MyS2)v|X2Gqm8uh~e zc7+7UO|iL*wDIcQTOt9Q0`Q zP{Z>Et%GPO<%D8d*sjLAa%BXh*78znMP){zfo`K(%&od*rX(fyEarRIEf2;o9ju#CPmj#9mcxw?CE zgfZ7UQg-;#+2KJr%!Sj2{(CAo!faWuWOOuNA6Z_0J-tZ8Bl<|Rl$y7-9!RygdF2w; zG|!0Onl*~{DIDH3;(Rj?n%L9$#DM~G8=jv zAExeEyN$;vM9Cnf!^2%xMkx567gA|H^X(cY1-3@EOpq&@8i0`pINiR$7N;U~w2dFo z4o12NjsW#tPeY=c@;sw_Xkm@deXKvp|LXach&xde7F#>qG9AKlnxWO#&3-z0jB@|Z z&9!rma>=oN?+e&b{Suo-s=mj*S>>y*jjj^xm_ROO*b~myhNOaZ7*X7w_X&_bbZb)P zNOV-+f4uxaA)R*If)L7!QaM9Mvo`RvIrv zVlHdKj4EUno42F0B8Of2Ch~$lkqkY?yO!4}p*IzHS!hrMB4LHf)HLcbLSrdz%R3i~ zLP~F+{*|Pjuls*B$t&*9UuNj}sy4b(bEhP!*Y~`jLx1m_L+v5{o~ z6DCPE{h{E-<(yYfi-5lju7ABk^#_5!9uu&G5dW#{nvE+Hxt#u|ZEmh={5V3hVBg=- zkwDbt-4ijy+RiHH#FEo37doB1hkG#?@9e-VI=z(;9?bfOJGY87=oHIgA!hq7@+d07 ztNdo!(@*xLhF}#kJ;(g)PWJg&9r6h+t%PJf9Eq&uD6FWESx|dCww`Vz9bfKPt5k|C zwxr=j7kDwvd?|Oz$9%i5bh(rj;DwWhH=~G6*FV@Ax&G4iBI8U4b1fd;6wOnET{{Wa zR+q}a-|Y1T2H9Y4anptW(`@|5i2h@%@=x9!tSFZGcFy_)0f4XbDK0Qmt}#nIK_y-T zipt-{lb-k6rUpNIR#}2ZYk^Sv`@y$6#eF?J&B^j~K;cmh&OXX^-wFMF7uWXz2R(&P zcGdXL>s{mmo8W(qjk))Pr@SQ`EKIdviKE88)NTs?a~mH*sVr<~nf0BInbJA4K7^ZY zZq%z#S5c90sN|tOS#tIkS(8DP<4Mmn!+7*~<(|9k9m~@d7ShS(GP0<2ehFIR!cL`_ zOT>Osb}w{&$l-?-D2Ui;k|e6~oixc4)D{}`ToG@!@#79mA5?X(5S|W5du`o6==amu z)7U{WKBV$>!d*=a(}0-$Nr@5BI$6o9>vu7GLyyGCJs4#hPc?d*2~aVvTTbFAY;2sq zSf-x7IO3Ag8pf?Bg+{IF6_7|MZdn4Nm7C5HZ31djQc< z{fZwIKwG2&^;hvHGMK!~G?ACyWnP*e?z*7vdJxMShX#dC5-N zMu+|{aqL(n2nTC>8LW-Mnv!z3x&z+|J#;-c7r`P4%HLO)j$&GW@X064?h101YwR@Q zhF-ymx=#cZ;Cg!c&sVP{V}C`olU6ISl0el$mh5WymHmwCc7IKR48 zMUGGj`|@lKqfUq?KiYD?9Bxof2l4px_U+P3A4Mo&oL`^Z%De;u;7^|_Y6hFAk`E_T z_W}j2vw*g-Z}Pq@K|!Is zz))TIJ7yr!$WRem2m~;L6*LY^`(-6ssQdjjEpKm!R5JQ8#9q#LQ3k{P_+$JioKRrj zMtSY9G~WKDlVs>`AjvRTV2S0;{76mKXOu08=;8J8%P0&-6&*<;O-93 zTunya;ZBmJyP%-(+vimRRN)hGV?Ra3I&|hTf$e@ar(RcW zrIc5o(2r;bNl8h1)cZwoF@bnKRLJDP=f8f`v$6}^Wc{ZA70sUD!yKpox}NY`Msk!g zibkp5L0o%kt@eg_iuS=wUT|`1s>{?q{ElpngN^pQ@Mn((SIvB757UWLsQE3>vo53E zj2BhNz-6|E=-!@rCJ!SEzVqjGJ+H-1zT>ZHJN(Kw=-?v{GQ9vzeVjz=?`U~!RrEzJ h(mQvhQ+#md^xM7BNm)ZpH1*~R80ebne9(4^{x?6qD<1#= diff --git a/shiptest.dme b/shiptest.dme index 298e81d4d970..c3ab20df1a93 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1206,6 +1206,7 @@ #include "code\game\objects\items\attachments\laser_sight.dm" #include "code\game\objects\items\attachments\rail_light.dm" #include "code\game\objects\items\attachments\silencer.dm" +#include "code\game\objects\items\attachments\stock.dm" #include "code\game\objects\items\attachments\wip.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" #include "code\game\objects\items\circuitboards\computer_circuitboards.dm" From 48795175618f729f1042f1175e9a60d41dec93f0 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Mon, 10 Jun 2024 08:52:46 -0500 Subject: [PATCH 180/206] linters --- code/datums/components/attachment.dm | 2 +- code/modules/projectiles/guns/energy.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 219e48670bfa..922e79ce0c21 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -65,7 +65,7 @@ /datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user) if(on_toggle) - on_toggle.Invoke( holder, user) + on_toggle.Invoke(holder, user) return TRUE parent.attack_self(user) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 3cc743a9a019..8049424d5c75 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -15,7 +15,7 @@ default_firemode = FIREMODE_SEMIAUTO fire_select_icon_state_prefix = "laser_" - + tac_reloads = FALSE tactical_reload_delay = 1.2 SECONDS From 53c23deec48b7b58a9e702e550a208ada6a581ac Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 19 Jun 2024 20:41:48 -0500 Subject: [PATCH 181/206] oops i need that --- code/modules/projectiles/guns/energy.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 978f2d31e509..81346f667ecc 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -120,6 +120,7 @@ return ..() +/obj/item/gun/energy/proc/insert_cell(mob/user, obj/item/stock_parts/cell/gun/C) if(mag_size == MAG_SIZE_SMALL && !istype(C, /obj/item/stock_parts/cell/gun/mini)) to_chat(user, span_warning("\The [C] doesn't seem to fit into \the [src]...")) return FALSE From b86528f6b34dc23afa461cc7e8d6b8185a3deeef Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 23 Jun 2024 16:26:40 -0500 Subject: [PATCH 182/206] oops merge broke a var name --- code/modules/projectiles/guns/energy.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 81346f667ecc..8fed4fa95731 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -130,7 +130,7 @@ if(user.transferItemToLoc(C, src)) cell = C to_chat(user, span_notice("You load the [C] into \the [src].")) - playsound(src, load_sound, sound_volume, load_sound_vary) + playsound(src, load_sound, load_sound_volume, load_sound_vary) update_appearance() return TRUE else From fe272e4253eeb8befb7f333fbbc94be226e731e7 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 23 Jun 2024 16:38:09 -0500 Subject: [PATCH 183/206] testing why this fails --- code/modules/projectiles/guns/ballistic/smg.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index 4b19c98729ff..0f8b90718a18 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -315,7 +315,7 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) ) ) - default_attachments = list(/obj/item/attachment/foldable_stock) + //default_attachments = list(/obj/item/attachment/foldable_stock) /obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq name = "\improper SKM-44v Mongrel" @@ -349,4 +349,4 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) /obj/item/attachment/foldable_stock/inteq ) - default_attachments = list(/obj/item/attachment/foldable_stock/inteq) + //default_attachments = list(/obj/item/attachment/foldable_stock/inteq) From 96e1285686b7d959bf2c820df4186d7d0adb81e8 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 23 Jun 2024 16:59:31 -0500 Subject: [PATCH 184/206] issue with button cleanup.. --- code/datums/action.dm | 7 ++++--- code/modules/projectiles/guns/ballistic/smg.dm | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/datums/action.dm b/code/datums/action.dm index de13fc002dde..cdca8729984f 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -86,9 +86,10 @@ if(owner) UnregisterSignal(owner, COMSIG_PARENT_QDELETING) owner = null - button.moved = FALSE //so the button appears in its normal position when given to another owner. - button.locked = FALSE - button.id = null + if(button) + button.moved = FALSE //so the button appears in its normal position when given to another owner. + button.locked = FALSE + button.id = null /datum/action/proc/Trigger() if(!IsAvailable()) diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index 0f8b90718a18..4b19c98729ff 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -315,7 +315,7 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) ) ) - //default_attachments = list(/obj/item/attachment/foldable_stock) + default_attachments = list(/obj/item/attachment/foldable_stock) /obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq name = "\improper SKM-44v Mongrel" @@ -349,4 +349,4 @@ EMPTY_GUN_HELPER(automatic/smg/cm5) /obj/item/attachment/foldable_stock/inteq ) - //default_attachments = list(/obj/item/attachment/foldable_stock/inteq) + default_attachments = list(/obj/item/attachment/foldable_stock/inteq) From 28bb45c3313863ce63f128b0fd396a648202c77a Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 23 Jun 2024 17:09:50 -0500 Subject: [PATCH 185/206] ough gun --- code/datums/components/attachment.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 922e79ce0c21..73abc0bd7925 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -144,6 +144,10 @@ icon_icon = target.icon button_icon_state = target.icon_state +/datum/action/attachment/Destroy() + . = ..() + gun = null + /datum/action/attachment/Trigger() ..() SEND_SIGNAL(target, COMSIG_ATTACHMENT_TOGGLE, gun, owner) From cf1bcff3298fe86cd73b820384879e2aa0db425e Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 3 Jul 2024 19:00:52 -0500 Subject: [PATCH 186/206] removes some comments --- code/__DEFINES/guns.dm | 60 ------------------------------------------ 1 file changed, 60 deletions(-) diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index 44e7515726d4..1580c4629d88 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -30,29 +30,6 @@ ///added recoil of sawn off guns #define SAWN_OFF_RECOIL 1 -/* Stolen from tgmc.. Will use soon -//Gun defines for gun related thing. More in the projectile folder. -//gun_features_flags -#define GUN_CAN_POINTBLANK (1<<0) -#define GUN_UNUSUAL_DESIGN (1<<1) -#define GUN_AMMO_COUNTER (1<<2) -#define GUN_WIELDED_FIRING_ONLY (1<<3) -#define GUN_ALLOW_SYNTHETIC (1<<4) -#define GUN_WIELDED_STABLE_FIRING_ONLY (1<<5) -#define GUN_IFF (1<<6) -#define GUN_DEPLOYED_FIRE_ONLY (1<<7) -#define GUN_IS_ATTACHMENT (1<<8) -#define GUN_ATTACHMENT_FIRE_ONLY (1<<9) -#define GUN_ENERGY (1<<10) -#define GUN_AMMO_COUNT_BY_PERCENTAGE (1<<11) -#define GUN_AMMO_COUNT_BY_SHOTS_REMAINING (1<<12) -#define GUN_NO_PITCH_SHIFT_NEAR_EMPTY (1<<13) -#define GUN_SHOWS_AMMO_REMAINING (1<<14) //Whether the mob sprite reflects the ammo level -#define GUN_SHOWS_LOADED (1<<15) //Whether the mob sprite as loaded or unloaded, a binary version of the above -#define GUN_SMOKE_PARTICLES (1<<16) //Whether the gun has smoke particles - -*/ - //Autofire component /// Compatible firemode is in the gun. Wait until it's held in the user hands. #define AUTOFIRE_STAT_IDLE (1<<0) @@ -110,20 +87,6 @@ #define ATTACHMENT_SLOT_RAIL "rail" #define ATTACHMENT_SLOT_STOCK "stock" -/* -#define BIT_ATTACHMENT_SLOT_MUZZLE (1<<0) -#define BIT_ATTACHMENT_SLOT_SCOPE (1<<1) -#define BIT_ATTACHMENT_SLOT_GRIP (1<<2) -#define BIT_ATTACHMENT_SLOT_RAIL (1<<3) - -DEFINE_BITFIELD(attach_slots, list( - ATTACHMENT_SLOT_MUZZLE = BIT_ATTACHMENT_SLOT_MUZZLE, - ATTACHMENT_SLOT_SCOPE = BIT_ATTACHMENT_SLOT_SCOPE, - ATTACHMENT_SLOT_GRIP = BIT_ATTACHMENT_SLOT_GRIP, - ATTACHMENT_SLOT_RAIL = BIT_ATTACHMENT_SLOT_RAIL -)) -*/ - /proc/attachment_slot_to_bflag(slot) switch(slot) if(ATTACHMENT_SLOT_MUZZLE) @@ -183,29 +146,6 @@ DEFINE_BITFIELD(attach_slots, list( ///ammo box will have a different state for full and empty; -max_ammo and -0 #define AMMO_BOX_FULL_EMPTY 2 -/* Stolen from tgmc.. Will use soon -//Ammo magazine defines, for magazine_flags -#define MAGAZINE_REFILLABLE (1<<0) -#define MAGAZINE_HANDFUL (1<<1) -#define MAGAZINE_WORN (1<<2) -#define MAGAZINE_REFUND_IN_CHAMBER (1<<3) - -//reciever_flags. Used to determin how the gun cycles, what kind of ammo it uses, etc. -#define AMMO_RECIEVER_REQUIRES_UNIQUE_ACTION (1<<0) - #define AMMO_RECIEVER_UNIQUE_ACTION_LOCKS (1<<1) -#define AMMO_RECIEVER_MAGAZINES (1<<2) - #define AMMO_RECIEVER_AUTO_EJECT (1<<3) -#define AMMO_RECIEVER_HANDFULS (1<<4) -#define AMMO_RECIEVER_TOGGLES_OPEN (1<<5) - #define AMMO_RECIEVER_TOGGLES_OPEN_EJECTS (1<<6) -#define AMMO_RECIEVER_CLOSED (1<<7) -#define AMMO_RECIEVER_ROTATES_CHAMBER (1<<8) -#define AMMO_RECIEVER_DO_NOT_EJECT_HANDFULS (1<<9) -#define AMMO_RECIEVER_DO_NOT_EMPTY_ROUNDS_AFTER_FIRE (1<<10) -#define AMMO_RECIEVER_CYCLE_ONLY_BEFORE_FIRE (1<<11) //The ammo stay in the magazine until the last moment -#define AMMO_RECIEVER_AUTO_EJECT_LOCKED (1<<12) //Not allowed to turn automatic unloading off -*/ - #define MAG_SIZE_SMALL 1 #define MAG_SIZE_MEDIUM 2 #define MAG_SIZE_LARGE 3 From 9bbf028bf9be79b2ce403b5c554f2538a838ffc4 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 6 Jul 2024 18:49:34 -0500 Subject: [PATCH 187/206] merge conflict fail --- code/modules/projectiles/guns/ballistic/pistol.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index d0aac207abf8..b2416462da39 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -1,5 +1,4 @@ /obj/item/gun/ballistic/automatic/pistol - can_suppress = TRUE bolt_type = BOLT_TYPE_LOCKING vary_fire_sound = FALSE From bce4c124058d79efe7086e6d9beaadc549c8b8b8 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 6 Jul 2024 18:52:26 -0500 Subject: [PATCH 188/206] removes wip file --- code/game/objects/items/attachments/wip.dm | 113 --------------------- 1 file changed, 113 deletions(-) delete mode 100644 code/game/objects/items/attachments/wip.dm diff --git a/code/game/objects/items/attachments/wip.dm b/code/game/objects/items/attachments/wip.dm deleted file mode 100644 index 9a6ff5bb1360..000000000000 --- a/code/game/objects/items/attachments/wip.dm +++ /dev/null @@ -1,113 +0,0 @@ -/* -/obj/item/attachment/bipod - name = "bipod" - desc = "A bipod that can be attached to a weapon to improve stability." - icon_state = "laserpointer" - attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE - -/obj/item/attachment/bipod/Attach(obj/item/gun/gun, mob/user) - gun.has_bipod = TRUE - -/obj/item/attachment/bipod/Detach(obj/item/gun/gun, mob/user) - gun.has_bipod = FALSE - -/obj/item/attachment/foldable_stock - name = "foldable stock" - desc = "A foldable stock that can be attached to a weapon to improve stability." - icon_state = "laserpointer" - attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE - -/obj/item/attachment/foldable_stock/Attach(obj/item/gun/gun, mob/user) - gun.w_class = WEIGHT_CLASS_NORMAL - gun.wield_delay = gun.unfolded_wield_delay - gun.wield_slowdown = gun.unfolded_slowdown - -/obj/item/attachment/foldable_stock/Toggle(obj/item/gun/gun, mob/user) - . = ..() - if(toggled) - to_chat(user, "You unfold the stock on the [src].") - gun.w_class = WEIGHT_CLASS_BULKY - gun.wield_delay = gun.folded_wield_delay - gun.wield_slowdown = gun.folded_slowdown - else - to_chat(user, "You fold the stock on the [src].") - gun.w_class = WEIGHT_CLASS_NORMAL - gun.wield_delay = gun.unfolded_wield_delay - gun.wield_slowdown = gun.unfolded_slowdown - - if(wielded) - user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown) - - toggled = !toggled - playsound(src, 'sound/weapons/empty.ogg', 100, 1) - -/obj/item/attachment/foldable_stock/Detach(obj/item/gun/gun, mob/user) - . = ..() - gun.w_class = initial(gun.w_class) - gun.wield_delay = initial(gun.unfolded_wield_delay) - gun.wield_slowdown = initial(gun.unfolded_slowdown) - -/obj/item/attachment/scope - name = "scope" - icon_state = "scope" - slot = ATTACHMENT_SLOT_SCOPE - var/zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. - var/zoom_out_amt = 5 - -/obj/item/attachment/scope/Attach(obj/item/gun/gun, mob/user) - . = ..() - gun.zoomable = TRUE - gun.zoom_amt = zoom_amt - gun.zoom_out_amt = zoom_out_amt - gun.build_zooming() - -/obj/item/attachment/scope/Detach(obj/item/gun/gun, mob/user) - . = ..() - gun.zoomable = FALSE - gun.zoom_amt = initial(gun.zoom_amt) - gun.zoom_out_amt = initial(gun.zoom_out_amt) - gun.actions -= gun.azoom - qdel(gun.azoom) - return TRUE -*/ - -/* -/obj/item/attachment/e_bayonet - name = "bayonet" - desc = "Stabby-Stabby" - icon_state = "ebayonet" - force = 2 - - attach_features_flags = ATTACH_REMOVABLE|ATTACH_TOGGLE - var/force_on = 20 - var/extended = FALSE - var/reach_extended = 2 - var/force_extended = 10 - -/obj/item/attachment/e_bayonet/Toggle(obj/item/gun/gun, mob/user) - . = ..() - - reach = toggled ? reach : initial(reach) - force = toggled ? force : initial(force) - - playsound(gun, 'sound/weapons/batonextend.ogg', 30) - user.visible_message("[user] [toggled ? "expands" : "retracts"] [user.p_their()] [src].", "You [toggled ? "expand" : "retract"] \the [src].") - -/obj/item/attachment/e_bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) - // Call our melee chain if they are are trying to melee attack something they can reach - if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) - if(target == user && toggled) - extended = !extended - reach = extended ? reach_extended : initial(reach) - gun.reach = reach // Even if your gun has a longer reach you default to the bayonets because STAB STAB STAB - force = extended ? force_extended : force_on - // Hey, I just met you - if(extended) // And this is crazy - icon_state += "-long" // But heres my number - else // Call me never - icon_state = replacetext(icon_state, "-long", "") // Because why is this so ugly - user.visible_message("[user] [extended ? "increased" : "decreased"] the length of [src].") - return COMPONENT_NO_ATTACK - melee_attack_chain(user, target, params) - return COMPONENT_NO_ATTACK -*/ From e290b9647891434dc7a5e907aa6399214d68f32f Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:24:53 -0500 Subject: [PATCH 189/206] Update code/modules/projectiles/gun.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/modules/projectiles/gun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 953ede7009f0..e59a02adfa91 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -271,7 +271,7 @@ var/datum/action/toggle_scope_zoom/azoom /* - * Saftey + * Safety */ ///Does this gun have a saftey and thus can toggle it? var/has_safety = FALSE From 6cc31969da6cd416cd32afe6f54174520e31f899 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:25:02 -0500 Subject: [PATCH 190/206] Update code/modules/cargo/packs/gun.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/modules/cargo/packs/gun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 017815fc682c..5bf8bf35550f 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -213,7 +213,7 @@ /datum/supply_pack/gun/attachment/silencer name = "Silencer Crate" - desc = "Silencer for stealthy operations." + desc = "Contains a single suppressor to be mounted on a firearm." cost = 250 contains = list(/obj/item/attachment/silencer) crate_name = "silencer crate" From ab923f39381eae5c2841d4c188f2b39d5a257dc0 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:25:11 -0500 Subject: [PATCH 191/206] Update code/modules/cargo/packs/gun.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/modules/cargo/packs/gun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 5bf8bf35550f..df272fa3da0f 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -212,7 +212,7 @@ crate_name = "bayonet crate" /datum/supply_pack/gun/attachment/silencer - name = "Silencer Crate" + name = "Suppressor Crate" desc = "Contains a single suppressor to be mounted on a firearm." cost = 250 contains = list(/obj/item/attachment/silencer) From af0aff1dcb4a3b085c76aa1e838dd138c6904098 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:25:25 -0500 Subject: [PATCH 192/206] Update code/game/objects/items/attachments/laser_sight.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/game/objects/items/attachments/laser_sight.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm index 8d493d2b86c8..7fd8a7b8c6ca 100644 --- a/code/game/objects/items/attachments/laser_sight.dm +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -1,6 +1,6 @@ /obj/item/attachment/laser_sight name = "laser sight" - desc = "This laser sight is designed to be rail-mounted on a compatible firearm to provide increased accuracy." + desc = "Designed to be rail-mounted on a compatible firearm to provide increased accuracy and decreased spread." icon_state = "laserpointer" attach_features_flags = ATTACH_REMOVABLE_HAND|ATTACH_TOGGLE From d7293cb17df2cdd4846a61c37d515c2c7eae7820 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:25:41 -0500 Subject: [PATCH 193/206] Update code/game/objects/items/attachments/rail_light.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/game/objects/items/attachments/rail_light.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm index 155c6d485873..0ad7ad656919 100644 --- a/code/game/objects/items/attachments/rail_light.dm +++ b/code/game/objects/items/attachments/rail_light.dm @@ -1,6 +1,6 @@ /obj/item/attachment/rail_light name = "rail light" - desc = "Rail mounted gun light for better visibility down range." + desc = "A flashlight made to be mounted on a firearm." icon_state = "raillight" light_color = "#FFCC66" light_system = MOVABLE_LIGHT_DIRECTIONAL From 51d3bbf15b54dbae8ead2f5e9d0b5fd5cd820aac Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:25:57 -0500 Subject: [PATCH 194/206] Update code/game/objects/items/attachments/silencer.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/game/objects/items/attachments/silencer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index ff601407632d..59d897f98330 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -1,6 +1,6 @@ /obj/item/attachment/silencer name = "silencer" - desc = "For when you need to kill someone but not be seen killing someone!" + desc = "An attachment for the barrel of a firearm. Muffles the gunshot and muzzle flash." icon_state = "silencer" slot = ATTACHMENT_SLOT_MUZZLE From 459d814855705ff7b2a3c83fb3471790ea3977d1 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:26:15 -0500 Subject: [PATCH 195/206] Update code/game/objects/items/attachments/silencer.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/game/objects/items/attachments/silencer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index 59d897f98330..cd7014348cf7 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -1,5 +1,5 @@ /obj/item/attachment/silencer - name = "silencer" + name = "suppressor" desc = "An attachment for the barrel of a firearm. Muffles the gunshot and muzzle flash." icon_state = "silencer" From b3db3079f8e49d984817a632d14b61baaac036e7 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:26:35 -0500 Subject: [PATCH 196/206] Update code/game/objects/items/attachments/stock.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/game/objects/items/attachments/stock.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/stock.dm b/code/game/objects/items/attachments/stock.dm index 0aa9b697ec7f..4486334348ca 100644 --- a/code/game/objects/items/attachments/stock.dm +++ b/code/game/objects/items/attachments/stock.dm @@ -1,5 +1,5 @@ /obj/item/attachment/foldable_stock - name = "foldable stock" + name = "folding stock" desc = "A foldable stock that can be attached to a weapon to improve stability." icon_state = "skm-carbine-stock" slot = ATTACHMENT_SLOT_STOCK From dfd91505282863cee748ab333f1b0a3f7b91b606 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:26:47 -0500 Subject: [PATCH 197/206] Update code/game/objects/items/attachments/stock.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/game/objects/items/attachments/stock.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/attachments/stock.dm b/code/game/objects/items/attachments/stock.dm index 4486334348ca..a3f241bd2eab 100644 --- a/code/game/objects/items/attachments/stock.dm +++ b/code/game/objects/items/attachments/stock.dm @@ -1,6 +1,6 @@ /obj/item/attachment/foldable_stock name = "folding stock" - desc = "A foldable stock that can be attached to a weapon to improve stability." + desc = "A folding stock that can be attached to certain weapons to improve stability and decreases recoil." icon_state = "skm-carbine-stock" slot = ATTACHMENT_SLOT_STOCK attach_features_flags = ATTACH_TOGGLE From 657438db0be3f386a04b960abd30e458596814c8 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:27:37 -0500 Subject: [PATCH 198/206] Update code/modules/cargo/packs/gun.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/modules/cargo/packs/gun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index df272fa3da0f..6224ea4be831 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -192,7 +192,7 @@ /datum/supply_pack/gun/attachment/rail_light name = "Tactical Rail Light Crate" - desc = "Rail mounted gun light for better visibility down range." + desc = "Contains a single rail light to be mounted on a firearm." cost = 250 contains = list(/obj/item/attachment/rail_light) crate_name = "rail light crate" From 227aadb4292a11caebc96e0a0de96a060442d88d Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:28:00 -0500 Subject: [PATCH 199/206] Update code/modules/cargo/packs/gun.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/modules/cargo/packs/gun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 6224ea4be831..1c70bc3e8beb 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -206,7 +206,7 @@ /datum/supply_pack/gun/attachment/bayonet name = "Bayonet Crate" - desc = "Bayonet for close quarters combat." + desc = "Contains a single bayonet to be mounted on a firearm." cost = 250 contains = list(/obj/item/attachment/bayonet) crate_name = "bayonet crate" From b591114df38598ed5f066f4b994048095ebbea83 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:28:14 -0500 Subject: [PATCH 200/206] Update code/modules/cargo/packs/gun.dm Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/modules/cargo/packs/gun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 1c70bc3e8beb..4f42e6d6b4a4 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -199,7 +199,7 @@ /datum/supply_pack/gun/attachment/laser_sight name = "Laser Sight Crate" - desc = "Laser sight for better accuracy down range." + desc = "Contains a single rail light to be mounted on a firearm." cost = 250 contains = list(/obj/item/attachment/laser_sight) crate_name = "laser sight crate" From c17adc92579679cdeee2d4e8db8cc67fe381eb18 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 6 Jul 2024 19:37:56 -0500 Subject: [PATCH 201/206] Addresing some of the review --- code/datums/components/attachment.dm | 1 - .../objects/items/attachments/_attachment.dm | 20 +++++++++---------- .../game/objects/items/attachments/bayonet.dm | 2 +- .../objects/items/attachments/laser_sight.dm | 2 +- .../objects/items/attachments/rail_light.dm | 8 ++++---- .../objects/items/attachments/silencer.dm | 4 ++-- code/game/objects/items/attachments/stock.dm | 2 +- .../hostile/megafauna/codename_claw.dm | 15 ++++++++++++-- shiptest.dme | 1 - 9 files changed, 32 insertions(+), 23 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 73abc0bd7925..b7fcfd67dd64 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -62,7 +62,6 @@ holder.update_icon() attachment_toggle_action.UpdateButtonIcon() - /datum/component/attachment/proc/do_toggle(obj/item/parent, obj/item/holder, mob/user) if(on_toggle) on_toggle.Invoke(holder, user) diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index 48a17c15af03..8fc0c2ab73d6 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -31,10 +31,10 @@ slot, \ attach_features_flags, \ valid_parents, \ - CALLBACK(src, PROC_REF(Attach)), \ - CALLBACK(src, PROC_REF(Detach)), \ - CALLBACK(src, PROC_REF(Toggle)), \ - CALLBACK(src, PROC_REF(PreAttack)), \ + CALLBACK(src, PROC_REF(apply_attachment)), \ + CALLBACK(src, PROC_REF(remove_attachment)), \ + CALLBACK(src, PROC_REF(toggle_attachment)), \ + CALLBACK(src, PROC_REF(on_preattack)), \ signals) /obj/item/attachment/Destroy() @@ -42,7 +42,7 @@ attachment_comp = null . = ..() -/obj/item/attachment/proc/Toggle(obj/item/gun/gun, mob/user) +/obj/item/attachment/proc/toggle_attachment(obj/item/gun/gun, mob/user) SHOULD_CALL_PARENT(TRUE) playsound(user, toggled ? toggle_on_sound : toggle_off_sound, 40, TRUE) @@ -50,28 +50,28 @@ icon_state = "[initial(icon_state)][toggled ? "-on" : ""]" /// Checks if a user should be allowed to attach this attachment to the given parent -/obj/item/attachment/proc/Attach(obj/item/gun/gun, mob/user) +/obj/item/attachment/proc/apply_attachment(obj/item/gun/gun, mob/user) SHOULD_CALL_PARENT(TRUE) if(toggled) - to_chat(user, "You cannot attach [src] while it is active!") + to_chat(user, span_warning("You cannot attach [src] while it is active!")) return FALSE apply_modifiers(gun, user, TRUE) playsound(src.loc, 'sound/weapons/gun/pistol/mag_insert_alt.ogg', 75, 1) return TRUE -/obj/item/attachment/proc/Detach(obj/item/gun/gun, mob/user) +/obj/item/attachment/proc/remove_attachment(obj/item/gun/gun, mob/user) SHOULD_CALL_PARENT(TRUE) if(toggled) - Toggle(gun, user) + toggle_attachment(gun, user) apply_modifiers(gun, user, FALSE) playsound(src.loc, 'sound/weapons/gun/pistol/mag_release_alt.ogg', 75, 1) return TRUE -/obj/item/attachment/proc/PreAttack(obj/item/gun/gun, atom/target, mob/user, list/params) +/obj/item/attachment/proc/on_preattack(obj/item/gun/gun, atom/target, mob/user, list/params) return FALSE ///Handles the modifiers to the parent gun diff --git a/code/game/objects/items/attachments/bayonet.dm b/code/game/objects/items/attachments/bayonet.dm index 06fbb7982293..6b1961f4b693 100644 --- a/code/game/objects/items/attachments/bayonet.dm +++ b/code/game/objects/items/attachments/bayonet.dm @@ -15,7 +15,7 @@ spread_mod = 1 wield_delay = 0.1 SECONDS -/obj/item/attachment/bayonet/PreAttack(obj/item/gun/gun, atom/target, mob/living/user, list/params) +/obj/item/attachment/bayonet/on_preattack(obj/item/gun/gun, atom/target, mob/living/user, list/params) if(user.a_intent == INTENT_HARM && user.CanReach(target, src, TRUE)) melee_attack_chain(user, target, params) return COMPONENT_NO_ATTACK diff --git a/code/game/objects/items/attachments/laser_sight.dm b/code/game/objects/items/attachments/laser_sight.dm index 7fd8a7b8c6ca..082da1153de5 100644 --- a/code/game/objects/items/attachments/laser_sight.dm +++ b/code/game/objects/items/attachments/laser_sight.dm @@ -8,7 +8,7 @@ pixel_shift_y = 4 wield_delay = 0.1 SECONDS -/obj/item/attachment/laser_sight/Toggle(obj/item/gun/gun, mob/user) +/obj/item/attachment/laser_sight/toggle_attachment(obj/item/gun/gun, mob/user) . = ..() if(toggled) diff --git a/code/game/objects/items/attachments/rail_light.dm b/code/game/objects/items/attachments/rail_light.dm index 0ad7ad656919..0cfbe9661e9e 100644 --- a/code/game/objects/items/attachments/rail_light.dm +++ b/code/game/objects/items/attachments/rail_light.dm @@ -2,7 +2,7 @@ name = "rail light" desc = "A flashlight made to be mounted on a firearm." icon_state = "raillight" - light_color = "#FFCC66" + light_color = COLOR_LIGHT_ORANGE light_system = MOVABLE_LIGHT_DIRECTIONAL light_range = 4 light_power = 0.8 @@ -13,19 +13,19 @@ pixel_shift_y = 4 wield_delay = 0.1 SECONDS -/obj/item/attachment/rail_light/Toggle(obj/item/gun/gun, mob/user) +/obj/item/attachment/rail_light/toggle_attachment(obj/item/gun/gun, mob/user) . = ..() set_light_on(toggled) update_icon() -/obj/item/attachment/rail_light/Attach(obj/item/gun/gun, mob/user) +/obj/item/attachment/rail_light/apply_attachment(obj/item/gun/gun, mob/user) . = ..() if(!.) return set_light_flags(light_flags | LIGHT_ATTACHED) -/obj/item/attachment/rail_light/Detach(obj/item/gun/gun, mob/user) +/obj/item/attachment/rail_light/remove_attachment(obj/item/gun/gun, mob/user) . = ..() if(!.) return diff --git a/code/game/objects/items/attachments/silencer.dm b/code/game/objects/items/attachments/silencer.dm index cd7014348cf7..31cf3fc15b36 100644 --- a/code/game/objects/items/attachments/silencer.dm +++ b/code/game/objects/items/attachments/silencer.dm @@ -9,11 +9,11 @@ spread_mod = -1 size_mod = 1 -/obj/item/attachment/silencer/Attach(obj/item/gun/gun, mob/user) +/obj/item/attachment/silencer/apply_attachment(obj/item/gun/gun, mob/user) . = ..() gun.suppressed = TRUE -/obj/item/attachment/silencer/Detach(obj/item/gun/gun, mob/user) +/obj/item/attachment/silencer/remove_attachment(obj/item/gun/gun, mob/user) . = ..() gun.suppressed = FALSE return TRUE diff --git a/code/game/objects/items/attachments/stock.dm b/code/game/objects/items/attachments/stock.dm index a3f241bd2eab..72a69acb5965 100644 --- a/code/game/objects/items/attachments/stock.dm +++ b/code/game/objects/items/attachments/stock.dm @@ -13,7 +13,7 @@ var/toggled_recoil_bonus = -2 var/toggled_spread_bonus = -5 -/obj/item/attachment/foldable_stock/Toggle(obj/item/gun/gun, mob/user) +/obj/item/attachment/foldable_stock/toggle_attachment(obj/item/gun/gun, mob/user) . = ..() if(toggled) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm index 9148b62f0563..a762a9298279 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/codename_claw.dm @@ -142,7 +142,7 @@ if(3) //only should fire duing phase 2 emp_pulse() if(4) - sting_attack(target) + tentacle(target) if(5) summon_creatures() if(6) @@ -157,7 +157,10 @@ swift_dash(target, dash_num_long, 15) else if((get_dist(src, target) >= 4) && ((get_dist(src, target)) <= 8) && !shouldnt_move) - if(prob(40)) + if(prob(60)) + tentacle(target) + return + else if(prob(40)) sting_attack(target) return else @@ -223,6 +226,14 @@ empulse(src, 2, 4) shouldnt_move = FALSE +/////TENTACLE +/mob/living/simple_animal/hostile/megafauna/claw/proc/tentacle(target) + shake_animation(2) + projectiletype = /obj/projectile/tentacle + projectilesound = 'sound/effects/splat.ogg' + Shoot(target) +/////TENTACLE END + /////STING ATTACK /mob/living/simple_animal/hostile/megafauna/claw/proc/sting_attack(target) shouldnt_move = TRUE diff --git a/shiptest.dme b/shiptest.dme index deca0e20d988..9a765c645be6 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1209,7 +1209,6 @@ #include "code\game\objects\items\attachments\rail_light.dm" #include "code\game\objects\items\attachments\silencer.dm" #include "code\game\objects\items\attachments\stock.dm" -#include "code\game\objects\items\attachments\wip.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" #include "code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "code\game\objects\items\circuitboards\machine_circuitboards.dm" From 33c64d8024bc0d991eedf6a309a1b729602566ce Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 6 Jul 2024 20:30:20 -0500 Subject: [PATCH 202/206] Autodoc --- code/__DEFINES/guns.dm | 2 ++ code/datums/components/attachment.dm | 6 ++++++ code/datums/components/attachment_holder.dm | 3 +++ code/game/objects/items/attachments/_attachment.dm | 13 ++++++++++++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index 1580c4629d88..bf1e7cee8504 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -122,7 +122,9 @@ ) //attach_features_flags +/// Removable by hand #define ATTACH_REMOVABLE_HAND (1<<0) +/// Removable via crowbar #define ATTACH_REMOVABLE_TOOL (1<<1) #define ATTACH_TOGGLE (1<<2) #define ATTACH_NO_SPRITE (1<<3) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index b7fcfd67dd64..51ee9e888765 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -1,12 +1,18 @@ /datum/component/attachment + //Slot the attachment goes on, also used in descriptions so should be player readable var/slot + ///various yes no flags associated with attachments. See defines for these: [_DEFINES/guns.dm] var/attach_features_flags + //Unused so far, should probally handle it in the parent unless you have a specific reason var/list/valid_parent_types var/datum/callback/on_attach var/datum/callback/on_detach var/datum/callback/on_toggle + //Called on the parents preattack var/datum/callback/on_preattack + //Unused... Also a little broken.. var/list/datum/action/actions + ///Generated if the attachment can toggle, sends COMSIG_ATTACHMENT_TOGGLE var/datum/action/attachment/attachment_toggle_action /datum/component/attachment/Initialize( diff --git a/code/datums/components/attachment_holder.dm b/code/datums/components/attachment_holder.dm index d37a7053255d..82968a17604b 100644 --- a/code/datums/components/attachment_holder.dm +++ b/code/datums/components/attachment_holder.dm @@ -1,8 +1,11 @@ /datum/component/attachment_holder dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + ///List of things you can attach to the parent var/list/valid_types = null + ///How many slots a parent can hold of any one slot var/list/slot_room = null + ///Icon offsets, should match the sprite itself so just find the position where it should attach var/list/slot_offsets = null var/list/obj/item/attachments = list() diff --git a/code/game/objects/items/attachments/_attachment.dm b/code/game/objects/items/attachments/_attachment.dm index 8fc0c2ab73d6..a6c25ec8cdf3 100644 --- a/code/game/objects/items/attachments/_attachment.dm +++ b/code/game/objects/items/attachments/_attachment.dm @@ -1,15 +1,21 @@ +///Most of the logic of attachments is held within the component which allows you to add other items as attachments in theory /obj/item/attachment name = "broken attachment" desc = "alert coders" icon = 'icons/obj/guns/attachments.dmi' + //Slot the attachment goes on, also used in descriptions so should be player readable var/slot = ATTACHMENT_SLOT_RAIL - ///various yes no flags associated with attachments. See defines for these: [ATTACH_REMOVABLE_HAND] + ///various yes no flags associated with attachments. See defines for these: [_DEFINES/guns.dm] var/attach_features_flags = ATTACH_REMOVABLE_HAND + ///See attachment component var/list/valid_parents = list() + ///Unused.. but could hold extra callbacks I assume? var/list/signals = list() + ///Component that handles most of the logic of attachments var/datum/component/attachment/attachment_comp + ///If the attachment is on or off var/toggled = FALSE var/toggle_on_sound = 'sound/items/flashlight_on.ogg' var/toggle_off_sound = 'sound/items/flashlight_off.ogg' @@ -19,9 +25,14 @@ ///Determines the amount of pixels to move the icon state for the overlay. in the y direction var/pixel_shift_y = 16 + //Toggle modifers are handled seperatly + ///Modifier applied to the parent var/spread_mod = 0 + ///Modifier applied to the parent var/spread_unwielded_mod = 0 + ///Modifier applied to the parent, deciseconds var/wield_delay = 0 + ///Modifier applied to the parent var/size_mod = 0 /obj/item/attachment/Initialize() From 8e1005aef917e0b83a2f2551a804dc0b36761717 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 6 Jul 2024 20:48:19 -0500 Subject: [PATCH 203/206] comments --- code/datums/components/attachment.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index 51ee9e888765..e72a5938b731 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -10,7 +10,7 @@ var/datum/callback/on_toggle //Called on the parents preattack var/datum/callback/on_preattack - //Unused... Also a little broken.. + //Unused... Also a little broken.. var/list/datum/action/actions ///Generated if the attachment can toggle, sends COMSIG_ATTACHMENT_TOGGLE var/datum/action/attachment/attachment_toggle_action @@ -140,6 +140,7 @@ name = "Toggle Attachment" check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS button_icon_state = null + ///Decides where we send our toggle signal for when pressed var/obj/item/gun/gun = null /datum/action/attachment/New(Target) @@ -162,6 +163,7 @@ button_icon_state = target.icon_state ..() +//Copied from item action.. /datum/action/attachment/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) if(button_icon && button_icon_state) // If set, use the custom icon that we set instead From 47d30009fddd26a46e5dc1ecd9975df1da8b40d7 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 6 Jul 2024 20:49:38 -0500 Subject: [PATCH 204/206] forgot to make these 3 not 2 --- code/datums/components/attachment.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/components/attachment.dm b/code/datums/components/attachment.dm index e72a5938b731..01e3abedd80b 100644 --- a/code/datums/components/attachment.dm +++ b/code/datums/components/attachment.dm @@ -1,16 +1,16 @@ /datum/component/attachment - //Slot the attachment goes on, also used in descriptions so should be player readable + ///Slot the attachment goes on, also used in descriptions so should be player readable var/slot ///various yes no flags associated with attachments. See defines for these: [_DEFINES/guns.dm] var/attach_features_flags - //Unused so far, should probally handle it in the parent unless you have a specific reason + ///Unused so far, should probally handle it in the parent unless you have a specific reason var/list/valid_parent_types var/datum/callback/on_attach var/datum/callback/on_detach var/datum/callback/on_toggle - //Called on the parents preattack + ///Called on the parents preattack var/datum/callback/on_preattack - //Unused... Also a little broken.. + ///Unused...Also a little broken.. var/list/datum/action/actions ///Generated if the attachment can toggle, sends COMSIG_ATTACHMENT_TOGGLE var/datum/action/attachment/attachment_toggle_action From 53b69d1013d3d968caae6c886ce9b8445a03bd9b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 14 Jul 2024 03:38:20 -0500 Subject: [PATCH 205/206] defines for few gun things --- code/__DEFINES/guns.dm | 3 +++ code/__DEFINES/sound.dm | 2 ++ code/datums/wires/mines.dm | 4 ++-- code/game/mecha/equipment/weapons/weapons.dm | 4 ++-- code/game/objects/items/attachments/stock.dm | 2 +- code/game/objects/items/devices/multitool.dm | 2 +- code/game/objects/items/pneumaticCannon.dm | 4 ++-- code/game/objects/items/toys.dm | 4 ++-- code/modules/flufftext/Hallucination.dm | 8 ++++---- code/modules/mining/equipment/kinetic_crusher.dm | 2 +- code/modules/mining/lavaland/necropolis_chests.dm | 4 ++-- code/modules/projectiles/gun.dm | 4 ++-- code/modules/projectiles/guns/ballistic/shotgun.dm | 4 ++-- code/modules/projectiles/guns/energy/energy_gun.dm | 4 ++-- code/modules/reagents/reagent_containers/hypospray.dm | 2 +- code/modules/reagents/reagent_containers/spray.dm | 8 ++++---- 16 files changed, 33 insertions(+), 28 deletions(-) diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index bf1e7cee8504..17cbab5683d8 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -164,3 +164,6 @@ #define FIREMODE_FULLAUTO "auto" #define FIREMODE_OTHER "other" #define FIREMODE_OTHER_TWO "other2" + +#define GUN_LEFTHAND_ICON 'icons/mob/inhands/weapons/guns_lefthand.dmi' +#define GUN_RIGHTHAND_ICON 'icons/mob/inhands/weapons/guns_righthand.dmi' diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index d4d9807ec0af..1bd23038c600 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -173,3 +173,5 @@ #define SOUND_AREA_LAVALAND SOUND_ENVIRONMENT_MOUNTAINS #define SOUND_AREA_ICEMOON SOUND_ENVIRONMENT_CAVE #define SOUND_AREA_WOODFLOOR SOUND_ENVIRONMENT_CITY + +#define SOUND_EMPTY_MAG 'sound/weapons/empty.ogg' diff --git a/code/datums/wires/mines.dm b/code/datums/wires/mines.dm index 4c856cf99d3f..91e0ac816189 100644 --- a/code/datums/wires/mines.dm +++ b/code/datums/wires/mines.dm @@ -28,7 +28,7 @@ if(WIRE_PIN) if(ourmine.clicked == TRUE) holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] You hear something inside \the [ourmine] click softly.")) - playsound(ourmine, 'sound/weapons/empty.ogg', 30, TRUE) + playsound(ourmine, SOUND_EMPTY_MAG, 30, TRUE) ourmine.clicked = FALSE else holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s detonation pad shifts slightly. Nothing happens.")) @@ -61,7 +61,7 @@ ourmine.dud = TRUE if(ourmine.clicked == TRUE) holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] You hear something inside \the [ourmine] shift out of place.")) - playsound(ourmine, 'sound/weapons/empty.ogg', 30, TRUE) + playsound(ourmine, SOUND_EMPTY_MAG, 30, TRUE) ourmine.clicked = FALSE else holder.visible_message(span_notice("[icon2html(ourmine, viewers(holder))] \The [ourmine]'s detonation pad goes loose.")) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 90b1a91bb20c..b0b40ea0877e 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -137,8 +137,8 @@ desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles." icon_state = "mecha_plasmacutter" item_state = "plasmacutter" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON energy_drain = 30 projectile = /obj/projectile/plasma/adv/mech fire_sound = 'sound/weapons/plasma_cutter.ogg' diff --git a/code/game/objects/items/attachments/stock.dm b/code/game/objects/items/attachments/stock.dm index 72a69acb5965..1fe286c14296 100644 --- a/code/game/objects/items/attachments/stock.dm +++ b/code/game/objects/items/attachments/stock.dm @@ -34,7 +34,7 @@ if(gun.wielded) user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = gun.wield_slowdown) - playsound(src, 'sound/weapons/empty.ogg', 100, 1) + playsound(src, SOUND_EMPTY_MAG, 100, 1) /obj/item/attachment/foldable_stock/inteq icon_state = "skm-inteqsmg-stock" diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index dca088c1be2e..204371ca0e51 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -28,7 +28,7 @@ custom_materials = list(/datum/material/iron=50, /datum/material/glass=20) custom_premium_price = 450 toolspeed = 1 - usesound = 'sound/weapons/empty.ogg' + usesound = SOUND_EMPTY_MAG var/obj/machinery/buffer // simple machine buffer for device linkage var/mode = 0 diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 060e59f0f5de..5108a8713633 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -11,8 +11,8 @@ icon = 'icons/obj/pneumaticCannon.dmi' icon_state = "pneumaticCannon" item_state = "bulldog" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50) var/maxWeightClass = 20 //The max weight of items that can fit into the cannon var/loadedWeightClass = 0 //The weight of items currently in the cannon diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index b1dfb479b66c..5ce082d79dc9 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -187,8 +187,8 @@ icon = 'icons/obj/guns/projectile.dmi' icon_state = "revolver" item_state = "gun" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_NORMAL diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index ced086e1dfc6..4774ea852424 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -476,15 +476,15 @@ GLOBAL_LIST_INIT(hallucination_list, list( A = image(image_file,H,"dualsaberred1", layer=ABOVE_MOB_LAYER) if("taser") if(side == "right") - image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + image_file = GUN_RIGHTHAND_ICON else - image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + image_file = GUN_LEFTHAND_ICON A = image(image_file,H,"advtaserstun4", layer=ABOVE_MOB_LAYER) if("ebow") if(side == "right") - image_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + image_file = GUN_RIGHTHAND_ICON else - image_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + image_file = GUN_LEFTHAND_ICON A = image(image_file,H,"crossbow", layer=ABOVE_MOB_LAYER) if("baton") if(side == "right") diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 030e592d80cd..b6073d4c86a2 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -113,7 +113,7 @@ /obj/item/kinetic_crusher/ui_action_click(mob/user, actiontype) set_light_on(!light_on) - playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) + playsound(user, SOUND_EMPTY_MAG, 100, TRUE) update_appearance() diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 268413ef203c..e48f4d5af5aa 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -869,8 +869,8 @@ name = "Slowpoke" desc = "The work of a truly genius gunsmith, altered and \"improved\" by a truly deranged Nanotrasen scientist, using components from a kinetic accelerator and beam rifle. Draw, partner!" icon = 'icons/obj/guns/energy.dmi' - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON icon_state = "spur" item_state = "spur" selfcharge = 1 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index e59a02adfa91..707f4805afe3 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -4,8 +4,8 @@ icon = 'icons/obj/guns/projectile.dmi' icon_state = "flatgun" item_state = "gun" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron=2000) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index abcafe6bc710..02122f983a48 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -449,8 +449,8 @@ EMPTY_GUN_HELPER(shotgun/bulldog/inteq) name = "improvised shotgun" desc = "A length of pipe and miscellaneous bits of scrap fashioned into a rudimentary single-shot shotgun." icon = 'icons/obj/guns/projectile.dmi' - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON mob_overlay_icon = null base_icon_state = "ishotgun" diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 715644e6ce9b..90bfa9a8ead1 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -96,8 +96,8 @@ desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology." icon_state = "dragnet" item_state = "dragnet" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap) ammo_x_offset = 1 diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 11cbd03c9787..78326279b6f9 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -395,7 +395,7 @@ to_chat(user, "You remove [vial] from [src].") vial = null update_appearance() - playsound(loc, 'sound/weapons/empty.ogg', 50, 1) + playsound(loc, SOUND_EMPTY_MAG, 50, 1) else to_chat(user, "This hypo isn't loaded!") return diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 05f68682083c..b4f46e6e4c19 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -260,8 +260,8 @@ icon = 'icons/obj/guns/projectile.dmi' icon_state = "chemsprayer" item_state = "chemsprayer" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON throwforce = 0 w_class = WEIGHT_CLASS_NORMAL stream_mode = 1 @@ -298,8 +298,8 @@ desc = "A utility used to spray large amounts of cleaning reagents in a given area. It regenerates space cleaner by itself but it's unable to be fueled by normal means." icon_state = "chemsprayer_janitor" item_state = "chemsprayer_janitor" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + lefthand_file = GUN_LEFTHAND_ICON + righthand_file = GUN_RIGHTHAND_ICON reagent_flags = NONE list_reagents = list(/datum/reagent/space_cleaner = 1000) volume = 1000 From 1d4621a900bb27a096d644dc38ac174964047b6b Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sun, 14 Jul 2024 05:45:56 -0500 Subject: [PATCH 206/206] fixes e weapons being broken --- code/modules/projectiles/guns/energy.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index ed9eb5317a35..8ac13c8b6036 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -9,6 +9,8 @@ has_safety = TRUE safety = TRUE + + modifystate = FALSE ammo_x_offset = 2 gun_firemodes = list(FIREMODE_SEMIAUTO) @@ -158,6 +160,14 @@ user.put_in_hands(old_cell) update_appearance() +/obj/item/gun/energy/screwdriver_act(mob/living/user, obj/item/I) + if(cell && !internal_cell) + to_chat(user, span_notice("You begin unscrewing and pulling out the cell...")) + if(I.use_tool(src, user, unscrewing_time, volume = 100)) + to_chat(user, span_notice("You remove the power cell.")) + eject_cell(user) + return ..() + /obj/item/gun/energy/can_shoot(visuals) if(safety && !visuals) return FALSE