From fcec389d5711190995df6ef7797a724abfb038e7 Mon Sep 17 00:00:00 2001 From: private-tristan Date: Sun, 22 Sep 2024 01:54:50 -0400 Subject: [PATCH 1/5] Solar Devils Changes, Alt IFF Component --- .../__DEFINES/dcs/signals/atom/signals_gun.dm | 34 +++++ .../dcs/signals/atom/signals_item.dm | 27 ---- code/_onclick/hud/fullscreen.dm | 7 + code/datums/components/iff_fire_prevention.dm | 105 ++++++++++++++ code/datums/skills/uscm.dm | 4 + code/game/objects/items/storage/toolkit.dm | 4 +- .../objects/items/tools/maintenance_tools.dm | 5 + code/modules/gear_presets/uscm.dm | 60 ++++---- code/modules/projectiles/gun.dm | 131 ++++++++++++------ code/modules/projectiles/guns/rifles.dm | 3 + code/modules/projectiles/guns/smartgun.dm | 15 ++ code/modules/projectiles/magazines/rifles.dm | 8 ++ colonialmarines.dme | 2 + sound/weapons/smartgun_fail.ogg | Bin 0 -> 15723 bytes 14 files changed, 303 insertions(+), 102 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/atom/signals_gun.dm create mode 100644 code/datums/components/iff_fire_prevention.dm create mode 100644 sound/weapons/smartgun_fail.ogg diff --git a/code/__DEFINES/dcs/signals/atom/signals_gun.dm b/code/__DEFINES/dcs/signals/atom/signals_gun.dm new file mode 100644 index 000000000000..e09b96503bc9 --- /dev/null +++ b/code/__DEFINES/dcs/signals/atom/signals_gun.dm @@ -0,0 +1,34 @@ +#define COMSIG_GUN_FIRE "gun_fire" +#define COMSIG_GUN_STOP_FIRE "gun_stop_fire" +#define COMSIG_GUN_FIRE_MODE_TOGGLE "gun_fire_mode_toggle" +#define COMSIG_GUN_AUTOFIREDELAY_MODIFIED "gun_autofiredelay_modified" +#define COMSIG_GUN_BURST_SHOTS_TO_FIRE_MODIFIED "gun_burst_shots_to_fire_modified" +#define COMSIG_GUN_BURST_SHOT_DELAY_MODIFIED "gun_burst_shot_delay_modified" + +#define COMSIG_GUN_VULTURE_FIRED_ONEHAND "gun_vulture_fired_onehand" +#define COMSIG_VULTURE_SCOPE_MOVED "vulture_scope_moved" +#define COMSIG_VULTURE_SCOPE_SCOPED "vulture_scope_scoped" +#define COMSIG_VULTURE_SCOPE_UNSCOPED "vulture_scope_unscoped" + +/// from /obj/item/weapon/gun/proc/recalculate_attachment_bonuses() : () +#define COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES "gun_recalculate_attachment_bonuses" + +/// from /obj/item/weapon/gun/proc/load_into_chamber() : () +#define COMSIG_GUN_INTERRUPT_FIRE "gun_interrupt_fire" + +//Signals for automatic fire at component +#define COMSIG_AUTOMATIC_SHOOTER_START_SHOOTING_AT "start_shooting_at" +#define COMSIG_AUTOMATIC_SHOOTER_STOP_SHOOTING_AT "stop_shooting_at" +#define COMSIG_AUTOMATIC_SHOOTER_SHOOT "shoot" + +//Signals for gun auto fire component +#define COMSIG_GET_BURST_FIRE "get_burst_fire" + #define BURST_FIRING (1<<0) + +/// Called before a gun fires a projectile, note NOT point blanks, /obj/item/weapon/gun/proc/handle_fire() +#define COMSIG_GUN_BEFORE_FIRE "gun_before_fire" + #define COMPONENT_CANCEL_GUN_BEFORE_FIRE (1<<0) //continue full-auto/burst attempts + #define COMPONENT_HARD_CANCEL_GUN_BEFORE_FIRE (1<<1) //hard stop firing + +/// Called when IFF is toggled on or off +#define COMSIG_GUN_IFF_TOGGLED "gun_iff_toggled" diff --git a/code/__DEFINES/dcs/signals/atom/signals_item.dm b/code/__DEFINES/dcs/signals/atom/signals_item.dm index 88f99bbff578..a70d1b8946f4 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_item.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_item.dm @@ -44,33 +44,6 @@ /// from /obj/item/proc/unzoom() : (mob/user) #define COMSIG_ITEM_UNZOOM "item_unzoom" -//Signals for automatic fire at component -#define COMSIG_AUTOMATIC_SHOOTER_START_SHOOTING_AT "start_shooting_at" -#define COMSIG_AUTOMATIC_SHOOTER_STOP_SHOOTING_AT "stop_shooting_at" -#define COMSIG_AUTOMATIC_SHOOTER_SHOOT "shoot" - -//Signals for gun auto fire component -#define COMSIG_GET_BURST_FIRE "get_burst_fire" - #define BURST_FIRING (1<<0) - -#define COMSIG_GUN_FIRE "gun_fire" -#define COMSIG_GUN_STOP_FIRE "gun_stop_fire" -#define COMSIG_GUN_FIRE_MODE_TOGGLE "gun_fire_mode_toggle" -#define COMSIG_GUN_AUTOFIREDELAY_MODIFIED "gun_autofiredelay_modified" -#define COMSIG_GUN_BURST_SHOTS_TO_FIRE_MODIFIED "gun_burst_shots_to_fire_modified" -#define COMSIG_GUN_BURST_SHOT_DELAY_MODIFIED "gun_burst_shot_delay_modified" - -#define COMSIG_GUN_VULTURE_FIRED_ONEHAND "gun_vulture_fired_onehand" -#define COMSIG_VULTURE_SCOPE_MOVED "vulture_scope_moved" -#define COMSIG_VULTURE_SCOPE_SCOPED "vulture_scope_scoped" -#define COMSIG_VULTURE_SCOPE_UNSCOPED "vulture_scope_unscoped" - -/// from /obj/item/weapon/gun/proc/recalculate_attachment_bonuses() : () -#define COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES "gun_recalculate_attachment_bonuses" - -/// from /obj/item/weapon/gun/proc/load_into_chamber() : () -#define COMSIG_GUN_INTERRUPT_FIRE "gun_interrupt_fire" - //from /datum/authority/branch/role/proc/equip_role() #define COMSIG_POST_SPAWN_UPDATE "post_spawn_update" diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 505b1876e3af..dd3b9a2599ef 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -61,6 +61,13 @@ else client.remove_from_screen(screen) +/mob/proc/get_maximum_view_range() + if(!client) + return world.view + + + var/offset = max(abs(client.pixel_x), abs(client.pixel_y)) + return client.view + offset / 32 /atom/movable/screen/fullscreen icon = 'icons/mob/hud/screen1_full.dmi' diff --git a/code/datums/components/iff_fire_prevention.dm b/code/datums/components/iff_fire_prevention.dm new file mode 100644 index 000000000000..9a50c7878156 --- /dev/null +++ b/code/datums/components/iff_fire_prevention.dm @@ -0,0 +1,105 @@ +#define IFF_HALT_COOLDOWN 0.5 SECONDS + +/// A component that prevents gun (although you can attach it to anything else that shoot projectiles) from shooting when mob from the same faction stands in the way. +/// You can also pass number of ticks, to make gun have an additional delay if firing prevention comes into play, but it is not neccesary. +/datum/component/iff_fire_prevention + var/iff_additional_fire_delay + COOLDOWN_DECLARE(iff_halt_cooldown) + +/datum/component/iff_fire_prevention/Initialize(additional_fire_delay = 0) + . = ..() + iff_additional_fire_delay = additional_fire_delay + + +/datum/component/iff_fire_prevention/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_GUN_BEFORE_FIRE, PROC_REF(check_firing_lane)) + RegisterSignal(parent, COMSIG_GUN_IFF_TOGGLED, PROC_REF(handle_iff_toggle)) + +/datum/component/iff_fire_prevention/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list( + COMSIG_GUN_BEFORE_FIRE, + COMSIG_GUN_IFF_TOGGLED + )) + +/datum/component/iff_fire_prevention/proc/check_firing_lane(obj/firing_weapon, obj/projectile/projectile_to_fire, atom/target, mob/living/user) + SIGNAL_HANDLER + + var/angle = Get_Angle(user, target) + + var/range_to_check = user.get_maximum_view_range() + + var/extended_target_turf = get_angle_target_turf(user, angle, range_to_check) + + var/turf/starting_turf = get_turf(user) + + if(!starting_turf || !extended_target_turf) + return COMPONENT_CANCEL_GUN_BEFORE_FIRE + + var/list/checked_turfs = get_line(starting_turf, extended_target_turf) + + //Don't shoot yourself, thanks + if(target == user) + if(COOLDOWN_FINISHED(src, iff_halt_cooldown) && user.client) + playsound_client(user.client, 'sound/weapons/smartgun_fail.ogg', src, 25) + to_chat(user, SPAN_WARNING("[firing_weapon] halts firing as an IFF marked target crosses your field of fire!")) + COOLDOWN_START(src, iff_halt_cooldown, IFF_HALT_COOLDOWN) + if(iff_additional_fire_delay) + var/obj/item/weapon/gun/gun = firing_weapon + if(istype(gun)) + LAZYSET(user.fire_delay_next_fire, gun, world.time + iff_additional_fire_delay) + return COMPONENT_CANCEL_GUN_BEFORE_FIRE + + //At some angles (scatter or otherwise) the original target is not in checked_turfs so we put it in there in order based on distance from user + //If we are literally clicking on someone with IFF then we don't want to fire, feels funny as a user otherwise + if(projectile_to_fire.original) + var/turf/original_target_turf = get_turf(projectile_to_fire.original) + + if(original_target_turf && !(original_target_turf in checked_turfs)) + var/user_to_target_dist = get_dist(starting_turf, original_target_turf) + var/list/temp_checked_turfs = checked_turfs.Copy() + checked_turfs = list() + + for(var/turf/checked_turf as anything in temp_checked_turfs) + if(!(original_target_turf in checked_turfs) && user_to_target_dist < get_dist(starting_turf, checked_turf)) + checked_turfs += original_target_turf + + checked_turfs += checked_turf + + for(var/turf/checked_turf as anything in checked_turfs) + + //Wall, should block the bullet so we're good to stop checking. + if(istype(checked_turf, /turf/closed)) + return + + for(var/mob/living/checked_living in checked_turf) + if(checked_living == user) // sometimes it still happens + continue + if(checked_living.body_position == LYING_DOWN && projectile_to_fire.original != checked_living) + continue + + if(checked_living.get_target_lock(user.faction_group)) + if(HAS_TRAIT(checked_living, TRAIT_CLOAKED)) + continue + if(COOLDOWN_FINISHED(src, iff_halt_cooldown) && user.client) + playsound_client(user.client, 'sound/weapons/smartgun_fail.ogg', src, 25) + to_chat(user, SPAN_WARNING("[firing_weapon] halts firing as an IFF marked target crosses your field of fire!")) + COOLDOWN_START(src, iff_halt_cooldown, IFF_HALT_COOLDOWN) + if(iff_additional_fire_delay) + var/obj/item/weapon/gun/gun = firing_weapon + if(istype(gun)) + LAZYSET(user.fire_delay_next_fire, gun, world.time + iff_additional_fire_delay) + return COMPONENT_CANCEL_GUN_BEFORE_FIRE + + return //if we have a target we *can* hit and find it before any IFF targets we want to fire + +/// Disable fire prevention when IFF is toggled off and other way around +/datum/component/iff_fire_prevention/proc/handle_iff_toggle(obj/gun, iff_enabled) + SIGNAL_HANDLER + if(iff_enabled) + RegisterSignal(parent, COMSIG_GUN_BEFORE_FIRE, PROC_REF(check_firing_lane)) + else + UnregisterSignal(parent, COMSIG_GUN_BEFORE_FIRE) + +#undef IFF_HALT_COOLDOWN diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm index 9df0ec3bb321..6a09c2918aaa 100644 --- a/code/datums/skills/uscm.dm +++ b/code/datums/skills/uscm.dm @@ -443,6 +443,7 @@ SOLAR DEVILS (PvE Marines) SKILL_VEHICLE = SKILL_VEHICLE_SMALL, SKILL_JTAC = SKILL_JTAC_BEGINNER, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, ) /datum/skills/combat_medic_pve @@ -457,6 +458,7 @@ SOLAR DEVILS (PvE Marines) SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, ) /datum/skills/smartgunner_pve @@ -484,6 +486,7 @@ SOLAR DEVILS (PvE Marines) SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, SKILL_PILOT = SKILL_PILOT_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, ) /datum/skills/sl_pve @@ -502,4 +505,5 @@ SOLAR DEVILS (PvE Marines) SKILL_JTAC = SKILL_JTAC_TRAINED, SKILL_INTEL = SKILL_INTEL_TRAINED, SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, ) diff --git a/code/game/objects/items/storage/toolkit.dm b/code/game/objects/items/storage/toolkit.dm index d54201f73650..c6e95fbcae5e 100644 --- a/code/game/objects/items/storage/toolkit.dm +++ b/code/game/objects/items/storage/toolkit.dm @@ -48,8 +48,8 @@ new /obj/item/circuitboard/apc(src) new /obj/item/circuitboard/apc(src) new /obj/item/cell/high(src) - new /obj/item/cell/high(src) - new /obj/item/clothing/glasses/welding(src) + new /obj/item/explosive/plastic/breaching_charge(src) + new /obj/item/explosive/plastic/breaching_charge(src) /obj/item/storage/toolkit/empty/fill_preset_inventory() diff --git a/code/game/objects/items/tools/maintenance_tools.dm b/code/game/objects/items/tools/maintenance_tools.dm index f45953040a07..a25a8979f006 100644 --- a/code/game/objects/items/tools/maintenance_tools.dm +++ b/code/game/objects/items/tools/maintenance_tools.dm @@ -417,6 +417,11 @@ to_chat(H, SPAN_WARNING("Your eyes are really starting to hurt. This can't be good for you!")) return FALSE +/obj/item/tool/weldingtool/screen + name = "shielded blowtorch" + desc = "A blowtorch, this one has a welding screen installed to prevent eye damage." + has_welding_screen = TRUE + /obj/item/tool/weldingtool/largetank name = "industrial blowtorch" max_fuel = 60 diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index eedd0f79f4a7..726e620f182e 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -134,6 +134,7 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smartgun(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/specrag(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/smartgunner/full(new_human), WEAR_WAIST) + new_human.equip_to_slot_or_del(new /obj/item/storage/large_holster/machete/smartgunner/full(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m56_goggles(new_human), WEAR_EYES) @@ -968,7 +969,7 @@ /datum/equipment_preset/uscm/proc/spawn_marine_fluff_items(mob/living/carbon/human/new_human) var/obj/item/helmet_accessory = pick(GLOB.allowed_helmet_items) new_human.equip_to_slot_or_del(new helmet_accessory, WEAR_IN_HELMET) - if(prob(50)) + if(prob(75)) var/obj/item/helmet_accessory_two = pick(GLOB.allowed_helmet_items) new_human.equip_to_slot_or_del(new helmet_accessory_two, WEAR_IN_HELMET) var/list/possible_masks = list(/obj/item/clothing/mask/gas) + subtypesof(/obj/item/clothing/mask/rebreather) + subtypesof(/obj/item/clothing/mask/tornscarf) @@ -1013,7 +1014,7 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/tool/wrench(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/device/multitool(new_human), WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/screen(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/intel/chestrig(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE) @@ -1028,13 +1029,13 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/medium_stack(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/pve(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) spawn_marine_fluff_items(new_human) //## Corpsman ##// @@ -1076,15 +1077,15 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/tool/wrench(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/device/multitool(new_human), WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/screen(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/intel/chestrig(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/large(new_human), WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated/black(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) @@ -1134,13 +1135,14 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/tool/wrench(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/device/multitool(new_human), WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/simple(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/screen(new_human), WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smartgun(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smartgun/pve(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/smartgunner/full(new_human), WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated/black(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/m56_goggles(new_human), WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/storage/large_holster/machete/smartgunner/full(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full/alternate(new_human), WEAR_R_STORE) spawn_marine_fluff_items(new_human) @@ -1182,7 +1184,7 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/tool/wrench(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/device/multitool(new_human), WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/screen(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/rto(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE) @@ -1195,13 +1197,13 @@ new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/pve(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) spawn_marine_fluff_items(new_human) //## Squad Leader ##// @@ -1239,7 +1241,7 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/tool/wrench(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/device/multitool(new_human), WEAR_IN_ACCESSORY) - new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/largetank(new_human), WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/screen(new_human), WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/intel/chestrig(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE) @@ -1255,11 +1257,11 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/pve(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) spawn_marine_fluff_items(new_human) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 80fce329e8cf..50e735b9181b 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -236,7 +236,6 @@ /// The multiplier for how much slower this should fire in automatic mode. 1 is normal, 1.2 is 20% slower, 2 is 100% slower, etc. Protected due to it never needing to be edited. VAR_PROTECTED/autofire_slow_mult = 1 - /** * An assoc list where the keys are fire delay group string defines * and the keys are when the guns of the group can be fired again @@ -1143,8 +1142,9 @@ and you're good to go. flags_gun_features &= ~GUN_BURST_FIRING return NONE - apply_bullet_effects(projectile_to_fire, user, reflex, dual_wield) //User can be passed as null. - SEND_SIGNAL(projectile_to_fire, COMSIG_BULLET_USER_EFFECTS, user) + var/original_scatter = projectile_to_fire.scatter + var/original_accuracy = projectile_to_fire.accuracy + apply_bullet_scatter(projectile_to_fire, user, reflex, dual_wield) //User can be passed as null. curloc = get_turf(user) if(QDELETED(original_target)) //If the target's destroyed, shoot at where it was last. @@ -1192,6 +1192,28 @@ and you're good to go. click_empty(user) return NONE + var/before_fire_cancel = SEND_SIGNAL(src, COMSIG_GUN_BEFORE_FIRE, projectile_to_fire, target, user) + if(before_fire_cancel) + + //yeah we revert these since we are not going to shoot anyway + projectile_to_fire.scatter = original_scatter + projectile_to_fire.accuracy = original_accuracy + + if(before_fire_cancel & COMPONENT_CANCEL_GUN_BEFORE_FIRE) + return TRUE + + if(before_fire_cancel & COMPONENT_HARD_CANCEL_GUN_BEFORE_FIRE) + return NONE + + apply_bullet_effects(projectile_to_fire, user, reflex, dual_wield) //User can be passed as null. + SEND_SIGNAL(projectile_to_fire, COMSIG_BULLET_USER_EFFECTS, user) + + projectile_to_fire.firer = user + if(isliving(user)) + projectile_to_fire.def_zone = user.zone_selected + + play_firing_sounds(projectile_to_fire, user) + if(targloc != curloc) simulate_recoil(dual_wield, user, target) @@ -1392,6 +1414,15 @@ and you're good to go. click_empty(user) break + //Checking if we even can PB the mob, only for the first projectile because why check the rest + if(bullets_fired == 1) + var/before_fire_cancel = SEND_SIGNAL(src, COMSIG_GUN_BEFORE_FIRE, projectile_to_fire, attacked_mob, user) + if(before_fire_cancel) + if(before_fire_cancel & COMPONENT_CANCEL_GUN_BEFORE_FIRE) + return TRUE + if(before_fire_cancel & COMPONENT_HARD_CANCEL_GUN_BEFORE_FIRE) + return NONE + if(SEND_SIGNAL(projectile_to_fire.ammo, COMSIG_AMMO_POINT_BLANK, attacked_mob, projectile_to_fire, user, src) & COMPONENT_CANCEL_AMMO_POINT_BLANK) flags_gun_features &= ~GUN_BURST_FIRING return TRUE @@ -1413,6 +1444,12 @@ and you're good to go. user.track_shot(initial(name)) apply_bullet_effects(projectile_to_fire, user, bullets_fired, dual_wield) //We add any damage effects that we need. + projectile_to_fire.firer = user + if(isliving(user)) + projectile_to_fire.def_zone = user.zone_selected + + play_firing_sounds(projectile_to_fire, user) + SEND_SIGNAL(projectile_to_fire, COMSIG_BULLET_USER_EFFECTS, user) SEND_SIGNAL(user, COMSIG_BULLET_DIRECT_HIT, attacked_mob) simulate_recoil(1, user) @@ -1621,12 +1658,32 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed //This proc applies some bonus effects to the shot/makes the message when a bullet is actually fired. /obj/item/weapon/gun/proc/apply_bullet_effects(obj/projectile/projectile_to_fire, mob/user, reflex = 0, dual_wield = 0) - var/actual_sound = fire_sound - if(isnull(fire_sound)) - actual_sound = pick(fire_sounds) - if(projectile_to_fire.ammo && projectile_to_fire.ammo.sound_override) - actual_sound = projectile_to_fire.ammo.sound_override + if(wield_delay > 0 && (world.time < wield_time || world.time < pull_time)) + var/old_time = max(wield_time, pull_time) - wield_delay + var/new_time = world.time + var/pct_settled = 1 - (new_time-old_time + 1)/wield_delay + if(delay_style & WEAPON_DELAY_ACCURACY) + var/accuracy_debuff = 1 + (SETTLE_ACCURACY_MULTIPLIER - 1) * pct_settled + projectile_to_fire.accuracy /=accuracy_debuff + if(delay_style & WEAPON_DELAY_SCATTER) + var/scatter_debuff = 1 + (SETTLE_SCATTER_MULTIPLIER - 1) * pct_settled + projectile_to_fire.scatter *= scatter_debuff + + projectile_to_fire.damage = round(projectile_to_fire.damage * damage_mult) // Apply gun damage multiplier to projectile damage + + // Apply effective range and falloffs/buildups + projectile_to_fire.damage_falloff = damage_falloff_mult * projectile_to_fire.ammo.damage_falloff + projectile_to_fire.damage_buildup = damage_buildup_mult * projectile_to_fire.ammo.damage_buildup + projectile_to_fire.effective_range_min = effective_range_min + projectile_to_fire.ammo.effective_range_min //Add on ammo-level value, if specified. + projectile_to_fire.effective_range_max = effective_range_max + projectile_to_fire.ammo.effective_range_max //Add on ammo-level value, if specified. + + projectile_to_fire.shot_from = src + + return 1 + +//This proc calculates scatter and accuracy +/obj/item/weapon/gun/proc/apply_bullet_scatter(obj/projectile/projectile_to_fire, mob/user, reflex = 0, dual_wield = 0) var/gun_accuracy_mult = accuracy_mult_unwielded var/gun_scatter = scatter_unwielded @@ -1655,47 +1712,33 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed projectile_to_fire.accuracy = floor(projectile_to_fire.accuracy * gun_accuracy_mult) // Apply gun accuracy multiplier to projectile accuracy projectile_to_fire.scatter += gun_scatter - if(wield_delay > 0 && (world.time < wield_time || world.time < pull_time)) - var/old_time = max(wield_time, pull_time) - wield_delay - var/new_time = world.time - var/pct_settled = 1 - (new_time-old_time + 1)/wield_delay - if(delay_style & WEAPON_DELAY_ACCURACY) - var/accuracy_debuff = 1 + (SETTLE_ACCURACY_MULTIPLIER - 1) * pct_settled - projectile_to_fire.accuracy /=accuracy_debuff - if(delay_style & WEAPON_DELAY_SCATTER) - var/scatter_debuff = 1 + (SETTLE_SCATTER_MULTIPLIER - 1) * pct_settled - projectile_to_fire.scatter *= scatter_debuff - - projectile_to_fire.damage = floor(projectile_to_fire.damage * damage_mult) // Apply gun damage multiplier to projectile damage +/// When the gun is about to shoot this is called to play the specific gun's firing sound. Requires the firing projectile and the gun's user as the first and second argument +/obj/item/weapon/gun/proc/play_firing_sounds(obj/projectile/projectile_to_fire, mob/user) + if(!user) //The gun only messages when fired by a user. + return - // Apply effective range and falloffs/buildups - projectile_to_fire.damage_falloff = damage_falloff_mult * projectile_to_fire.ammo.damage_falloff - projectile_to_fire.damage_buildup = damage_buildup_mult * projectile_to_fire.ammo.damage_buildup + var/actual_sound = fire_sound + if(isnull(fire_sound)) + actual_sound = pick(fire_sounds) - projectile_to_fire.effective_range_min = effective_range_min + projectile_to_fire.ammo.effective_range_min //Add on ammo-level value, if specified. - projectile_to_fire.effective_range_max = effective_range_max + projectile_to_fire.ammo.effective_range_max //Add on ammo-level value, if specified. + if(projectile_to_fire.ammo && projectile_to_fire.ammo.sound_override) + actual_sound = projectile_to_fire.ammo.sound_override - projectile_to_fire.shot_from = src + //Guns with low ammo have their firing sound + var/firing_sndfreq = (current_mag && (current_mag.current_rounds / current_mag.max_rounds) > GUN_LOW_AMMO_PERCENTAGE) ? FALSE : SOUND_FREQ_HIGH - if(user) //The gun only messages when fired by a user. - projectile_to_fire.firer = user - if(isliving(user)) projectile_to_fire.def_zone = user.zone_selected - //Guns with low ammo have their firing sound - var/firing_sndfreq = (current_mag && (current_mag.current_rounds / current_mag.max_rounds) > GUN_LOW_AMMO_PERCENTAGE) ? FALSE : SOUND_FREQ_HIGH - //firing from an attachment - if(active_attachable && active_attachable.flags_attach_features & ATTACH_PROJECTILE) - if(active_attachable.fire_sound) //If we're firing from an attachment, use that noise instead. - playsound(user, active_attachable.fire_sound, 50) - else - if(!(flags_gun_features & GUN_SILENCED)) - if (firing_sndfreq && fire_rattle) - playsound(user, fire_rattle, firesound_volume, FALSE)//if the gun has a unique 'mag rattle' SFX play that instead of pitch shifting. - else - playsound(user, actual_sound, firesound_volume, firing_sndfreq) + //firing from an attachment + if(active_attachable && active_attachable.flags_attach_features & ATTACH_PROJECTILE) + if(active_attachable.fire_sound) //If we're firing from an attachment, use that noise instead. + playsound(user, active_attachable.fire_sound, 50) + else + if(!(flags_gun_features & GUN_SILENCED)) + if (firing_sndfreq && fire_rattle) + playsound(user, fire_rattle, firesound_volume, FALSE)//if the gun has a unique 'mag rattle' SFX play that instead of pitch shifting. else - playsound(user, actual_sound, 25, firing_sndfreq) - - return 1 + playsound(user, actual_sound, firesound_volume, firing_sndfreq) + else + playsound(user, actual_sound, 25, firing_sndfreq) /obj/item/weapon/gun/proc/simulate_scatter(obj/projectile/projectile_to_fire, atom/target, turf/curloc, turf/targloc, mob/user, bullets_fired = 1) var/fire_angle = Get_Angle(curloc, targloc) diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm index e514a68879fb..97e86f5b245d 100644 --- a/code/modules/projectiles/guns/rifles.dm +++ b/code/modules/projectiles/guns/rifles.dm @@ -421,6 +421,9 @@ /obj/item/weapon/gun/rifle/m41aMK1/anchorpoint/gl desc = "A classic M41 MK1 Pulse Rifle painted in a fresh coat of the classic Humbrol 170 camoflauge. This one appears to be used by the Colonial Marine contingent aboard Anchorpoint Station, and is equipped with an underbarrel grenade launcher. Uses 10x24mm caseless ammunition." starting_attachment_types = list(/obj/item/attachable/stock/rifle/collapsible, /obj/item/attachable/attached_gun/grenade/mk1) + +/obj/item/weapon/gun/rifle/m41aMK1/pve + current_mag = /obj/item/ammo_magazine/rifle/m41aMK1/pve //---------------------------------------------- //Special gun for the CO to replace the smartgun diff --git a/code/modules/projectiles/guns/smartgun.dm b/code/modules/projectiles/guns/smartgun.dm index b2d228e27a26..c8a574adabb4 100644 --- a/code/modules/projectiles/guns/smartgun.dm +++ b/code/modules/projectiles/guns/smartgun.dm @@ -363,6 +363,7 @@ remove_bullet_trait("iff") drain -= 10 MD.iff_signal = null + SEND_SIGNAL(src, COMSIG_GUN_IFF_TOGGLED, iff_enabled) /obj/item/weapon/gun/smartgun/Fire(atom/target, mob/living/user, params, reflex = 0, dual_wield) if(!requires_battery) @@ -757,3 +758,17 @@ /obj/item/weapon/gun/smartgun/rmc/Initialize(mapload, ...) . = ..() MD.iff_signal = FACTION_TWE + +/obj/item/weapon/gun/smartgun/pve + name = "\improper Solar Devils M56B smartgun" + desc = "The actual firearm in the 4-piece M56B Smartgun System. This is a variant used by the Solar Devils Batallion, utilizing a unique IFF system that refuses to fire if a friendly would be hit.\nYou may toggle firing restrictions by using a special action.\nAlt-click it to open the feed cover and allow for reloading." + +/obj/item/weapon/gun/smartgun/pve/set_bullet_traits() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY_ID("iff", /datum/element/bullet_trait_iff) + )) + AddComponent(/datum/component/iff_fire_prevention) + +/obj/item/weapon/gun/smartgun/pve/set_gun_config_values() + ..() + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_5 diff --git a/code/modules/projectiles/magazines/rifles.dm b/code/modules/projectiles/magazines/rifles.dm index 60be8ed6c1ad..797dad21ed42 100644 --- a/code/modules/projectiles/magazines/rifles.dm +++ b/code/modules/projectiles/magazines/rifles.dm @@ -116,6 +116,14 @@ desc = "A long rectangular box of rounds that is only compatible with the older M41A MK1. Holds up to 95 rounds. This one contains wall-penetrating bullets." default_ammo = /datum/ammo/bullet/rifle/ap/penetrating ammo_band_color = AMMO_BAND_COLOR_PENETRATING + +/obj/item/ammo_magazine/rifle/m41aMK1/pve + desc = "A long rectangular box of rounds that is only compatible with the older M41A MK1. Holds up to 99 rounds." + max_rounds = 99 + +/obj/item/ammo_magazine/rifle/m41aMK1/ap/pve + desc = "A long rectangular box of rounds that is only compatible with the older M41A MK1. Holds up to 99 rounds. This one contains AP bullets." + max_rounds = 99 //------------------------------------------------------- //M4RA, l42 reskin, same stats as before but different, lore friendly, shell. diff --git a/colonialmarines.dme b/colonialmarines.dme index 9fff0d7db91b..e29b6ee44fdf 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -133,6 +133,7 @@ #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" #include "code\__DEFINES\dcs\signals\atom\signals_atom.dm" #include "code\__DEFINES\dcs\signals\atom\signals_cell.dm" +#include "code\__DEFINES\dcs\signals\atom\signals_gun.dm" #include "code\__DEFINES\dcs\signals\atom\signals_item.dm" #include "code\__DEFINES\dcs\signals\atom\signals_movable.dm" #include "code\__DEFINES\dcs\signals\atom\signals_obj.dm" @@ -413,6 +414,7 @@ #include "code\datums\components\footstep.dm" #include "code\datums\components\healing_reduction.dm" #include "code\datums\components\id_lock.dm" +#include "code\datums\components\iff_fire_prevention.dm" #include "code\datums\components\label.dm" #include "code\datums\components\orbiter.dm" #include "code\datums\components\overlay_lighting.dm" diff --git a/sound/weapons/smartgun_fail.ogg b/sound/weapons/smartgun_fail.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2d33cf7d132495ed7117405b7ac498e652dad5b5 GIT binary patch literal 15723 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�Nq-Y5Tc=f6bAD8^NdNSq} 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 Date: Sun, 22 Sep 2024 02:32:17 -0400 Subject: [PATCH 2/5] Minor cleanup before I go to sleep --- code/modules/gear_presets/uscm.dm | 3 ++- code/modules/projectiles/guns/rifles.dm | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index 726e620f182e..baa33135368a 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -1098,7 +1098,7 @@ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/pve(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full(new_human), WEAR_WAIST) spawn_marine_fluff_items(new_human) @@ -1248,6 +1248,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/full(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated/black(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) + new_human.equip_to_slot_or_del(new /obj/item/storage/toolkit/full(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK) diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm index 97e86f5b245d..cd0a15f5a09e 100644 --- a/code/modules/projectiles/guns/rifles.dm +++ b/code/modules/projectiles/guns/rifles.dm @@ -424,6 +424,7 @@ /obj/item/weapon/gun/rifle/m41aMK1/pve current_mag = /obj/item/ammo_magazine/rifle/m41aMK1/pve + //---------------------------------------------- //Special gun for the CO to replace the smartgun From c15ca419283176b22b4fd59422a0c9cb74c942e5 Mon Sep 17 00:00:00 2001 From: private-tristan Date: Sun, 22 Sep 2024 14:50:40 -0400 Subject: [PATCH 3/5] Gives the Platoon Leader enough med skill To actually get the medkits that they're supposed to get. --- code/datums/skills/uscm.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm index 6a09c2918aaa..1bfa6d90f5fc 100644 --- a/code/datums/skills/uscm.dm +++ b/code/datums/skills/uscm.dm @@ -499,7 +499,7 @@ SOLAR DEVILS (PvE Marines) SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, SKILL_CQC = SKILL_CQC_TRAINED, SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, SKILL_SURGERY = SKILL_SURGERY_NOVICE, SKILL_VEHICLE = SKILL_VEHICLE_SMALL, SKILL_JTAC = SKILL_JTAC_TRAINED, From e1e92f99326563203749f8d0dcdb6356a6462f09 Mon Sep 17 00:00:00 2001 From: private-tristan Date: Thu, 31 Oct 2024 23:17:28 -0400 Subject: [PATCH 4/5] Balance changes, remove 99 mags, starting AP mag --- code/modules/gear_presets/uscm.dm | 46 ++++++++++---------- code/modules/projectiles/guns/rifles.dm | 3 -- code/modules/projectiles/guns/smartgun.dm | 2 +- code/modules/projectiles/magazines/rifles.dm | 7 --- 4 files changed, 24 insertions(+), 34 deletions(-) diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index baa33135368a..6ac04fc0086c 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -1029,13 +1029,13 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/medium_stack(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/pve(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/ap(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) spawn_marine_fluff_items(new_human) //## Corpsman ##// @@ -1082,10 +1082,10 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/intel/chestrig(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/flare/full(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/magazine/large(new_human), WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_L_STORE) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/insulated/black(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) @@ -1098,7 +1098,7 @@ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/pve(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/ap(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full(new_human), WEAR_WAIST) spawn_marine_fluff_items(new_human) @@ -1197,13 +1197,13 @@ new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/pve(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/ap(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) spawn_marine_fluff_items(new_human) //## Squad Leader ##// @@ -1258,11 +1258,11 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/patch/devils(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/pve(new_human), WEAR_J_STORE) + new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/m41aMK1/ap(new_human), WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap/pve(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rifle/m41aMK1/ap(new_human.back), WEAR_IN_BELT) spawn_marine_fluff_items(new_human) diff --git a/code/modules/projectiles/guns/rifles.dm b/code/modules/projectiles/guns/rifles.dm index cd0a15f5a09e..7de291d26fbc 100644 --- a/code/modules/projectiles/guns/rifles.dm +++ b/code/modules/projectiles/guns/rifles.dm @@ -422,9 +422,6 @@ desc = "A classic M41 MK1 Pulse Rifle painted in a fresh coat of the classic Humbrol 170 camoflauge. This one appears to be used by the Colonial Marine contingent aboard Anchorpoint Station, and is equipped with an underbarrel grenade launcher. Uses 10x24mm caseless ammunition." starting_attachment_types = list(/obj/item/attachable/stock/rifle/collapsible, /obj/item/attachable/attached_gun/grenade/mk1) -/obj/item/weapon/gun/rifle/m41aMK1/pve - current_mag = /obj/item/ammo_magazine/rifle/m41aMK1/pve - //---------------------------------------------- //Special gun for the CO to replace the smartgun diff --git a/code/modules/projectiles/guns/smartgun.dm b/code/modules/projectiles/guns/smartgun.dm index c8a574adabb4..5138065f491e 100644 --- a/code/modules/projectiles/guns/smartgun.dm +++ b/code/modules/projectiles/guns/smartgun.dm @@ -771,4 +771,4 @@ /obj/item/weapon/gun/smartgun/pve/set_gun_config_values() ..() - damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_5 + damage_mult = BASE_BULLET_DAMAGE_MULT + BULLET_DAMAGE_MULT_TIER_3 diff --git a/code/modules/projectiles/magazines/rifles.dm b/code/modules/projectiles/magazines/rifles.dm index 797dad21ed42..e1fc8b917a1d 100644 --- a/code/modules/projectiles/magazines/rifles.dm +++ b/code/modules/projectiles/magazines/rifles.dm @@ -117,13 +117,6 @@ default_ammo = /datum/ammo/bullet/rifle/ap/penetrating ammo_band_color = AMMO_BAND_COLOR_PENETRATING -/obj/item/ammo_magazine/rifle/m41aMK1/pve - desc = "A long rectangular box of rounds that is only compatible with the older M41A MK1. Holds up to 99 rounds." - max_rounds = 99 - -/obj/item/ammo_magazine/rifle/m41aMK1/ap/pve - desc = "A long rectangular box of rounds that is only compatible with the older M41A MK1. Holds up to 99 rounds. This one contains AP bullets." - max_rounds = 99 //------------------------------------------------------- //M4RA, l42 reskin, same stats as before but different, lore friendly, shell. From e85c237da673112c2399b6eb594865d4c6d5936b Mon Sep 17 00:00:00 2001 From: private-tristan Date: Thu, 31 Oct 2024 23:19:11 -0400 Subject: [PATCH 5/5] Merge branch 'pve-SG-real' of https://github.com/private-tristan/cmss13 into pve-SG-real