Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The big ayylmao improvement PR #1621

Merged
merged 23 commits into from
Apr 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
cfc2cd5
Abductor improvements
Absolucy Apr 9, 2024
037dcf4
Makes abductor organ surgery consistent with other surgeries (#76124)
DaydreamIQ Jun 19, 2023
7232288
Abductees strapped to the abductor operating table are now properly l…
Rhials May 22, 2023
d0301a5
Abductors can now use batons in general. (not just their specialized …
Singul0 May 31, 2023
29385d9
Gives abductors three new equipment shop purchase options, splits up …
Rhials Jun 28, 2023
2df1f48
Blacklist abductor posters from spawning (#76876)
E231kei500bandai Jul 17, 2023
5be547e
Abductor / general "Summon Item" spell QoL (#77419)
MrMelbert Aug 8, 2023
5365962
Use stamina containers
Absolucy Apr 9, 2024
915f60d
Posters return to your hand when cut down/not hung up, abductor poste…
Rhials Mar 16, 2024
a901671
better abductor vendor; give abductors defibs
Absolucy Apr 9, 2024
bcefc64
More fixups/improvements
Absolucy Apr 9, 2024
084eccd
remove batong recall
Absolucy Apr 10, 2024
dc454ff
make slimes non-passive
Absolucy Apr 10, 2024
0b443f0
Update screenshot test
Absolucy Apr 10, 2024
1caef55
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Apr 12, 2024
33c127c
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Apr 15, 2024
f957fda
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Apr 17, 2024
f9fda03
Allow abductors to brainwash once they've done all their objectives
Absolucy Apr 17, 2024
43f774b
Eh, they can do it once they've passed 3 abductions
Absolucy Apr 17, 2024
d2f3f3e
Improve code
Absolucy Apr 17, 2024
a9efa74
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Apr 18, 2024
2763b5a
Merge branch 'master' of https://github.com/Monkestation/Monkestation…
Absolucy Apr 23, 2024
116d9dd
I'm an idiot
Absolucy Apr 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion _maps/templates/lazy_templates/abductor_ships.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@
},
/area/centcom/abductor_ship)
"Bh" = (
/obj/machinery/abductor/gland_dispenser,
/obj/machinery/smartfridge/abductor,
/turf/open/floor/plating/abductor,
/area/centcom/abductor_ship)
"BX" = (
Expand Down
20 changes: 20 additions & 0 deletions code/__DEFINES/antagonists.dm
Original file line number Diff line number Diff line change
Expand Up @@ -340,3 +340,23 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list(

/// For changelings, this is how many recent say lines are retained when absorbing a mob
#define LING_ABSORB_RECENT_SPEECH 8

// Various abductor equipment modes.

#define VEST_STEALTH 1
#define VEST_COMBAT 2

#define GIZMO_SCAN 1
#define GIZMO_MARK 2

#define MIND_DEVICE_MESSAGE 1
#define MIND_DEVICE_CONTROL 2

#define TOOLSET_MEDICAL 1
#define TOOLSET_HACKING 2

#define BATON_STUN 0
#define BATON_SLEEP 1
#define BATON_CUFF 2
#define BATON_PROBE 3
#define BATON_MODES 4
1 change: 1 addition & 0 deletions code/__DEFINES/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_FENCE_CLIMBER "can_climb_fences"
/// means that you can't use weapons with normal trigger guards.
#define TRAIT_CHUNKYFINGERS "chunkyfingers"
#define TRAIT_CHUNKYFINGERS_IGNORE_BATON "chunkyfingers_ignore_baton"
#define TRAIT_DUMB "dumb"
/// Whether a mob is dexterous enough to use machines and certain items or not.
#define TRAIT_ADVANCEDTOOLUSER "advancedtooluser"
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/~monkestation/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@
// /obj/item
/// Whether a storage item can be compressed by the bluespace compression kit, without the usual storage limitation.
#define TRAIT_BYPASS_COMPRESS_CHECK "can_compress_anyways"

#define ABDUCTOR_GLAND_VENTCRAWLING_TRAIT "abductor_gland_ventcrawling"
1 change: 1 addition & 0 deletions code/_globalvars/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_BADDNA" = TRAIT_BADDNA,
"TRAIT_CLUMSY" = TRAIT_CLUMSY,
"TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS,
"TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON,
"TRAIT_DUMB" = TRAIT_DUMB,
"TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER,
"TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER,
Expand Down
44 changes: 25 additions & 19 deletions code/game/objects/effects/posters/poster.dm
Original file line number Diff line number Diff line change
Expand Up @@ -185,24 +185,15 @@
qdel(src)
else
to_chat(user, span_notice("You carefully remove the poster from the wall."))
roll_and_drop(Adjacent(user) ? get_turf(user) : loc)
roll_and_drop(Adjacent(user) ? get_turf(user) : loc, user)

/obj/structure/sign/poster/attack_hand(mob/user, list/modifiers)
. = ..()
if(.)
return
if(ruined)
return

visible_message(span_notice("[user] rips [src] in a single, decisive motion!") )
playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, TRUE)
spring_trap(user)

var/obj/structure/sign/poster/ripped/R = new(loc)
R.pixel_y = pixel_y
R.pixel_x = pixel_x
R.add_fingerprint(user)
qdel(src)
tear_poster(user)

/obj/structure/sign/poster/proc/spring_trap(mob/user)
var/obj/item/shard/payload = trap?.resolve()
Expand All @@ -221,15 +212,16 @@
return FALSE
return !user.gloves || !(user.gloves.body_parts_covered & HANDS) || HAS_TRAIT(user, TRAIT_FINGERPRINT_PASSTHROUGH) || HAS_TRAIT(user.gloves, TRAIT_FINGERPRINT_PASSTHROUGH)

/obj/structure/sign/poster/proc/roll_and_drop(atom/location)
/obj/structure/sign/poster/proc/roll_and_drop(atom/location, mob/user)
pixel_x = 0
pixel_y = 0
var/obj/item/poster/rolled_poster = new poster_item_type(location, src) // /obj/structure/sign/poster/wanted/roll_and_drop() has some snowflake handling due to icon memes, if you make a major change to this, don't forget to update it too. <3
forceMove(rolled_poster)
if(!user?.put_in_hands(rolled_poster))
forceMove(rolled_poster)
return rolled_poster

//separated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby()
/turf/closed/wall/proc/place_poster(obj/item/poster/rolled_poster, mob/user)
/turf/closed/proc/place_poster(obj/item/poster/rolled_poster, mob/user)
if(!rolled_poster.poster_structure)
to_chat(user, span_warning("[rolled_poster] has no poster... inside it? Inform a coder!"))
return
Expand Down Expand Up @@ -259,19 +251,30 @@
playsound(src, 'sound/items/poster_being_created.ogg', 100, TRUE)

var/turf/user_drop_location = get_turf(user) //cache this so it just falls to the ground if they move. also no tk memes allowed.
if(!do_after(user, PLACE_SPEED, placed_poster, extra_checks = CALLBACK(placed_poster, TYPE_PROC_REF(/obj/structure/sign/poster, snowflake_wall_turf_check), src)))
placed_poster.roll_and_drop(user_drop_location)
if(!do_after(user, PLACE_SPEED, placed_poster, extra_checks = CALLBACK(placed_poster, TYPE_PROC_REF(/obj/structure/sign/poster, snowflake_closed_turf_check), src)))
placed_poster.roll_and_drop(user_drop_location, user)
return

placed_poster.on_placed_poster(user)
return TRUE

/obj/structure/sign/poster/proc/snowflake_wall_turf_check(atom/hopefully_still_a_wall_turf) //since turfs never get deleted but instead change type, make sure we're still being placed on a wall.
return iswallturf(hopefully_still_a_wall_turf)
/obj/structure/sign/poster/proc/snowflake_closed_turf_check(atom/hopefully_still_a_closed_turf) //since turfs never get deleted but instead change type, make sure we're still being placed on a wall.
return isclosedturf(hopefully_still_a_closed_turf)

/obj/structure/sign/poster/proc/on_placed_poster(mob/user)
to_chat(user, span_notice("You place the poster!"))

/obj/structure/sign/poster/proc/tear_poster(mob/user)
visible_message(span_notice("[user] rips [src] in a single, decisive motion!") )
playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, TRUE)
spring_trap(user)

var/obj/structure/sign/poster/ripped/R = new(loc)
R.pixel_y = pixel_y
R.pixel_x = pixel_x
R.add_fingerprint(user)
qdel(src)

// Various possible posters follow

/obj/structure/sign/poster/ripped
Expand All @@ -287,7 +290,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/ripped, 32)
icon_state = "random_anything"
never_random = TRUE
random_basetype = /obj/structure/sign/poster
blacklisted_types = list(/obj/structure/sign/poster/traitor)
blacklisted_types = list(
/obj/structure/sign/poster/traitor,
/obj/structure/sign/poster/abductor,
)

MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/random, 32)

Expand Down
4 changes: 2 additions & 2 deletions code/game/objects/effects/spawners/random/medical.dm
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
/obj/item/organ/internal/heart/gland/plasma = 7,
/obj/item/organ/internal/heart/gland/chem = 5,
/obj/item/organ/internal/heart/gland/mindshock = 5,
/obj/item/organ/internal/heart/gland/transform = 5,
/obj/item/organ/internal/heart/gland/spiderman = 5,
// /obj/item/organ/internal/heart/gland/transform = 5, /* monkestation: removed */
// /obj/item/organ/internal/heart/gland/spiderman = 5, /* monkestation: removed */
/obj/item/organ/internal/heart/gland/slime = 4,
/obj/item/organ/internal/heart/gland/trauma = 4,
/obj/item/organ/internal/heart/gland/electric = 3,
Expand Down
5 changes: 3 additions & 2 deletions code/game/objects/effects/wanted_poster.dm
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,10 @@
poster_icon.Blend(letter_icon, ICON_OVERLAY)
startX = startX + 4

/obj/structure/sign/poster/wanted/roll_and_drop(atom/location)
/obj/structure/sign/poster/wanted/roll_and_drop(atom/location, mob/user)
pixel_x = 0
pixel_y = 0
var/obj/item/poster/rolled_poster = new poster_item_type(location, original_icon, wanted_name, desc, posterHeaderText, posterHeaderColor)
forceMove(rolled_poster)
if(!user?.put_in_hands(rolled_poster))
forceMove(rolled_poster)
return rolled_poster
2 changes: 1 addition & 1 deletion code/game/objects/items/melee/baton.dm
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@

if(!chunky_finger_usable && ishuman(user))
var/mob/living/carbon/human/potential_chunky_finger_human = user
if(potential_chunky_finger_human.check_chunky_fingers() && user.is_holding(src))
if(potential_chunky_finger_human.check_chunky_fingers() && user.is_holding(src) && !HAS_MIND_TRAIT(user, TRAIT_CHUNKYFINGERS_IGNORE_BATON))
balloon_alert(potential_chunky_finger_human, "fingers are too big!")
return BATON_ATTACK_DONE

Expand Down
6 changes: 6 additions & 0 deletions code/game/turfs/closed/_closed.dm
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@
/turf/closed/indestructible/singularity_act()
return

/turf/closed/indestructible/attackby(obj/item/attacking_item, mob/user, params)
if(istype(attacking_item, /obj/item/poster) && Adjacent(user))
return place_poster(attacking_item, user)

return ..()

/turf/closed/indestructible/oldshuttle
name = "strange shuttle wall"
icon = 'icons/turf/shuttleold.dmi'
Expand Down
2 changes: 1 addition & 1 deletion code/game/turfs/closed/walls.dm
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@
for(var/obj/O in src.contents) //Eject contents!
if(istype(O, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = O
P.roll_and_drop(src)
INVOKE_ASYNC(P, TYPE_PROC_REF(/obj/structure/sign/poster, roll_and_drop), src)
if(decon_type)
ChangeTurf(decon_type, flags = CHANGETURF_INHERIT_AIR)
else
Expand Down
124 changes: 124 additions & 0 deletions code/modules/antagonists/abductor/abductor_structures.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@

// Operating Table / Beds / Lockers

/obj/structure/bed/abductor
name = "resting contraption"
desc = "This looks similar to contraptions from Earth. Could aliens be stealing our technology?"
icon = 'icons/obj/abductor.dmi'
buildstacktype = /obj/item/stack/sheet/mineral/abductor
icon_state = "bed"

/obj/structure/table_frame/abductor
name = "alien table frame"
desc = "A sturdy table frame made from alien alloy."
icon_state = "alien_frame"
framestack = /obj/item/stack/sheet/mineral/abductor
framestackamount = 1

/obj/structure/table_frame/abductor/attackby(obj/item/attacking_item, mob/user, params)
if(attacking_item.tool_behaviour == TOOL_WRENCH)
to_chat(user, span_notice("You start disassembling [src]..."))
attacking_item.play_tool_sound(src)
if(attacking_item.use_tool(src, user, 30))
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
for(var/i in 0 to framestackamount)
new framestack(get_turf(src))
qdel(src)
return
if(istype(attacking_item, /obj/item/stack/sheet/mineral/abductor))
var/obj/item/stack/sheet/stacked_sheets = attacking_item
if(stacked_sheets.get_amount() < 1)
to_chat(user, span_warning("You need one alien alloy sheet to do this!"))
return
to_chat(user, span_notice("You start adding [stacked_sheets] to [src]..."))
if(do_after(user, 50, target = src))
stacked_sheets.use(1)
new /obj/structure/table/abductor(src.loc)
qdel(src)
return
if(istype(attacking_item, /obj/item/stack/sheet/mineral/silver))
var/obj/item/stack/sheet/stacked_sheets = attacking_item
if(stacked_sheets.get_amount() < 1)
to_chat(user, span_warning("You need one sheet of silver to do this!"))
return
to_chat(user, span_notice("You start adding [stacked_sheets] to [src]..."))
if(do_after(user, 50, target = src))
stacked_sheets.use(1)
new /obj/structure/table/optable/abductor(src.loc)
qdel(src)

/obj/structure/table/abductor
name = "alien table"
desc = "Advanced flat surface technology at work!"
icon = 'icons/obj/smooth_structures/alien_table.dmi'
icon_state = "alien_table-0"
base_icon_state = "alien_table"
buildstack = /obj/item/stack/sheet/mineral/abductor
framestack = /obj/item/stack/sheet/mineral/abductor
buildstackamount = 1
framestackamount = 1
smoothing_groups = SMOOTH_GROUP_ABDUCTOR_TABLES
canSmoothWith = SMOOTH_GROUP_ABDUCTOR_TABLES
frame = /obj/structure/table_frame/abductor
custom_materials = list(/datum/material/silver =SHEET_MATERIAL_AMOUNT)

/obj/structure/table/optable/abductor
name = "alien operating table"
desc = "Used for alien medical procedures. The surface is covered in tiny spines."
frame = /obj/structure/table_frame/abductor
buildstack = /obj/item/stack/sheet/mineral/silver
framestack = /obj/item/stack/sheet/mineral/abductor
buildstackamount = 1
framestackamount = 1
icon = 'icons/obj/abductor.dmi'
icon_state = "bed"
can_buckle = TRUE
buckle_lying = 90
/// Amount to inject per second
var/inject_amount = 0.5

var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico)

/obj/structure/table/optable/abductor/Initialize(mapload)
. = ..()
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)

/obj/structure/table/optable/abductor/proc/on_entered(datum/source, atom/movable/AM)
SIGNAL_HANDLER
if(iscarbon(AM))
START_PROCESSING(SSobj, src)
to_chat(AM, span_danger("You feel a series of tiny pricks!"))

/obj/structure/table/optable/abductor/process(seconds_per_tick)
. = PROCESS_KILL
for(var/mob/living/carbon/victim in get_turf(src))
. = TRUE
for(var/chemical in injected_reagents)
if(victim.reagents.get_reagent_amount(chemical) < inject_amount * seconds_per_tick)
victim.reagents.add_reagent(chemical, inject_amount * seconds_per_tick)
return .

/obj/structure/table/optable/abductor/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()

/obj/structure/closet/abductor
name = "alien locker"
desc = "Contains secrets of the universe."
icon_state = "abductor"
icon_door = "abductor"
can_weld_shut = FALSE
door_anim_time = 0
material_drop = /obj/item/stack/sheet/mineral/abductor

/obj/structure/door_assembly/door_assembly_abductor
name = "alien airlock assembly"
icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi'
base_name = "alien airlock"
overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi'
airlock_type = /obj/machinery/door/airlock/abductor
material_type = /obj/item/stack/sheet/mineral/abductor
noglass = TRUE
42 changes: 26 additions & 16 deletions code/modules/antagonists/abductor/equipment/abduction_outfits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,21 @@
for(var/obj/item/abductor/gizmo/G in B.contents)
console.AddGizmo(G)

/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(!visualsOnly)
link_to_console(H)
/datum/outfit/abductor/post_equip(mob/living/carbon/human/user, visualsOnly = FALSE)
. = ..()
if(visualsOnly)
return

if(!isnull(user.mind))
link_to_console(user)

/* monkestation removal: get rid of the abductor batong recall
var/obj/item/melee/baton/abductor/batong = locate() in user
if(!isnull(batong))
var/datum/action/cooldown/spell/summonitem/abductor/ayy_summon = new(user.mind || user)
ayy_summon.mark_item(batong)
ayy_summon.Grant(user)
*/

/datum/outfit/abductor/agent
name = "Abductor Agent"
Expand All @@ -40,20 +50,19 @@
backpack_contents = list(
/obj/item/gun/energy/alien = 1,
/obj/item/abductor/silencer = 1
)
)

/datum/outfit/abductor/scientist
name = "Abductor Scientist"

backpack_contents = list(
/obj/item/abductor/gizmo = 1
)
belt = /obj/item/defibrillator/compact/combat/loaded // monke edit: give abductors defibs
backpack_contents = list(/obj/item/abductor/gizmo = 1)

/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(!visualsOnly)
var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H)
beamplant.implant(H)
/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/user, visualsOnly = FALSE)
. = ..()
if(!visualsOnly && !isnull(user.mind))
var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(user)
beamplant.implant(user)

/datum/outfit/abductor/scientist/onemanteam
name = "Abductor Scientist (w/ agent gear)"
Expand All @@ -63,7 +72,8 @@
belt = /obj/item/storage/belt/military/abductor/full

backpack_contents = list(
/obj/item/abductor/gizmo = 1,
/obj/item/gun/energy/alien = 1,
/obj/item/abductor/silencer = 1
/obj/item/abductor/gizmo = 1,
/obj/item/gun/energy/alien = 1,
/obj/item/abductor/silencer = 1,
/obj/item/defibrillator/compact/combat/loaded = 1 // monke edit: give abductors defibs
)
Loading
Loading