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

Pred QOL updates #3271

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions code/__DEFINES/access.dm
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,7 @@ most of them are tied into map-placed objects. This should be reworked in the fu
#define ACCESS_WY_CORPORATE_DS 202
#define ACCESS_PRESS 203
//=================================================

#define ACCESS_YAUTJA_SECURE 250
#define ACCESS_YAUTJA_ELDER 251
#define ACCESS_YAUTJA_ANCIENT 252
16 changes: 8 additions & 8 deletions code/__DEFINES/clans.dm
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,14 @@
/// Scales with clan size
#define CLAN_LIMIT_SIZE 2

var/global/list/datum/rank/clan_ranks = list(
CLAN_RANK_UNBLOODED = new /datum/rank/unblooded(),
CLAN_RANK_YOUNG = new /datum/rank/young(),
CLAN_RANK_BLOODED = new /datum/rank/blooded(),
CLAN_RANK_ELITE = new /datum/rank/elite(),
CLAN_RANK_ELDER = new /datum/rank/elder(),
CLAN_RANK_LEADER = new /datum/rank/leader(),
CLAN_RANK_ADMIN = new /datum/rank/ancient()
var/global/list/datum/yautja_rank/clan_ranks = list(
CLAN_RANK_UNBLOODED = new /datum/yautja_rank/unblooded(),
CLAN_RANK_YOUNG = new /datum/yautja_rank/young(),
CLAN_RANK_BLOODED = new /datum/yautja_rank/blooded(),
CLAN_RANK_ELITE = new /datum/yautja_rank/elite(),
CLAN_RANK_ELDER = new /datum/yautja_rank/elder(),
CLAN_RANK_LEADER = new /datum/yautja_rank/leader(),
CLAN_RANK_ADMIN = new /datum/yautja_rank/ancient()
)

var/global/list/clan_ranks_ordered = list(
Expand Down
15 changes: 15 additions & 0 deletions code/__DEFINES/combat.dm
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,18 @@
//the define for visible message range in combat
#define COMBAT_MESSAGE_RANGE 3
#define DEFAULT_MESSAGE_RANGE 7

//Predator decloak multpliers based on the standard.
#define DECLOAK_STANDARD 10 SECONDS
/// Forced for any unspecified reason.
#define DECLOAK_FORCED 1
/// Caused by being worn by non humans.
#define DECLOAK_SPECIES 0.75
/// Caused by fire extinguisher.
#define DECLOAK_EXTINGUISHER 1.5
/// Caused by predalien screech.
#define DECLOAK_PREDALIEN 2
/// Caused by being in a body of water.
#define DECLOAK_SUBMERGED 2
/// Caused by an EMP.
#define DECLOAK_EMP 3
2 changes: 2 additions & 0 deletions code/__DEFINES/equipment.dm
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@
#define NOTABLEMERGE (1<<13)
/// Has heat source but isn't 'on fire' and thus can be stored
#define IGNITING_ITEM (1<<14)
/// Is in the process of falling apart.
#define ITEM_DISSOLVING (1<<15)

//==========================================================================================

Expand Down
29 changes: 29 additions & 0 deletions code/game/machinery/doors/airlock_types.dm
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,35 @@
/obj/structure/machinery/door/airlock/strata/mining/autoname
autoname = TRUE

//YAUTJA SHIP - CURRENTLY USES STRATA DOORS
/obj/structure/machinery/door/airlock/yautja
name = "\improper Airlock"
icon = 'icons/obj/structures/doors/strata/strata_doors.dmi'
openspeed = 5
req_access = null
req_one_access = null
tiles_with = list(
/obj/structure/window/framed/strata,
/obj/structure/machinery/door/airlock,
)
heavy = TRUE
masterkey_resist = TRUE
no_panel = TRUE
not_weldable = TRUE
unacidable = TRUE

/obj/structure/machinery/door/airlock/yautja/autoname
autoname = TRUE

/obj/structure/machinery/door/airlock/yautja/secure
req_one_access = list(ACCESS_YAUTJA_SECURE, ACCESS_YAUTJA_ELDER, ACCESS_YAUTJA_ANCIENT)

/obj/structure/machinery/door/airlock/yautja/elder
req_one_access = list(ACCESS_YAUTJA_ELDER, ACCESS_YAUTJA_ANCIENT)

/obj/structure/machinery/door/airlock/yautja/ancient
req_one_access = list(ACCESS_YAUTJA_ANCIENT)
unslashable = TRUE
//FIORINA PENITENTIARY (PRISON_FOP) MAINTENANCE HATCHES

/obj/structure/machinery/door/airlock/prison_hatch
Expand Down
48 changes: 48 additions & 0 deletions code/game/objects/items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,8 @@ cases. Override_icon_state should be a list.*/
. += desc
if(desc_lore)
. += SPAN_NOTICE("This has an <a href='byond://?src=\ref[src];desc_lore=1'>extended lore description</a>.")
if(flags_item & ITEM_DISSOLVING)
. += SPAN_WARNING("It is currently dissolving into bits!")

/obj/item/attack_hand(mob/user)
if (!user)
Expand Down Expand Up @@ -310,6 +312,10 @@ cases. Override_icon_state should be a list.*/
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACKED, W, user) & COMPONENT_CANCEL_ITEM_ATTACK)
return

if((flags_item & ITEM_PREDATOR) && (istype(W, /obj/item/tool/yautja_cleaner)))
if(handle_dissolve())
return

if(istype(W,/obj/item/storage))
var/obj/item/storage/S = W
if(S.storage_flags & STORAGE_CLICK_GATHER && isturf(loc))
Expand Down Expand Up @@ -1064,3 +1070,45 @@ cases. Override_icon_state should be a list.*/
animate(attack_image, alpha = 175, transform = copy_transform.Scale(0.75), pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3)
animate(time = 1)
animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT)

/obj/item/proc/handle_dissolve()
if(!(flags_item & ITEM_PREDATOR))
return FALSE
if(!HAS_TRAIT(usr, TRAIT_YAUTJA_TECH))
to_chat(usr, SPAN_WARNING("You have no idea what this even does..."))
return FALSE
if(istype(src, /obj/item/tool/yautja_cleaner))
to_chat(usr, SPAN_WARNING("You cannot dissolve more dissolving fluid..."))
return FALSE
if(usr.alpha < 255)
to_chat(usr, SPAN_BOLDWARNING("It would not be safe to attempt this while cloaked!"))
return FALSE
if(anchored)
to_chat(usr, SPAN_WARNING("\The [src] cannot be moved by any means, why dissolve it?"))
return FALSE

var/mob/living/location = loc
var/mob/living/loc_loc = loc.loc
if(istype(location) || istype(loc_loc))
to_chat(usr, SPAN_WARNING("You cannot dissolve this while it is being held!"))
return FALSE

dissolve()
return TRUE

/obj/item/proc/dissolve()
usr.visible_message(SPAN_DANGER("[usr] uncaps a vial and begins to pour out a vibrant blue liquid over \the [src]!"), \
SPAN_NOTICE("You begin to spread dissolving gel onto \the [src]!"))
if(do_after(usr, 5 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE))
usr.visible_message(SPAN_DANGER("[usr] pours blue liquid all over \the [src]!"), \
SPAN_NOTICE("You cover \the [src] with dissolving gel!"))
add_filter("dissolve_gel", 1, list("type" = "outline", "color" = "#3333FFff", "size" = 1))
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 15 SECONDS)
addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, visible_message), SPAN_WARNING("[src] crumbles into pieces!")), 15 SECONDS)
flags_item |= ITEM_DISSOLVING
log_attack("[key_name(usr)] dissolved [src] with Yautja Cleaner!")
return TRUE
else
usr.visible_message(SPAN_WARNING("[usr] stops pouring liquid on to \the [src]!"), \
SPAN_WARNING("You decide not to cover \the [src] with dissolving gel."))
return FALSE
91 changes: 67 additions & 24 deletions code/game/objects/items/explosives/plastic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -213,23 +213,6 @@

return TRUE

/obj/item/explosive/plastic/breaching_charge/can_place(mob/user, atom/target)
if(!is_type_in_list(target, breachable))//only items on the list are allowed
to_chat(user, SPAN_WARNING("You cannot plant \the [name] on \the [target]!"))
return FALSE

if(SSinterior.in_interior(target))// vehicle checks again JUST IN CASE
to_chat(user, SPAN_WARNING("It's too cramped in here to deploy \the [src]."))
return FALSE

if(istype(target, /obj/structure/window))//no breaching charges on the briefing windows / brig / CIC e.e
var/obj/structure/window/W = target
if(W.not_damageable)
to_chat(user, SPAN_WARNING("[W] is much too tough for you to do anything to it with [src].")) //On purpose to mimic wall message
return FALSE

return TRUE

/obj/item/explosive/plastic/proc/calculate_pixel_offset(mob/user, atom/target)
switch(get_dir(user, target))
if(NORTH)
Expand Down Expand Up @@ -312,13 +295,6 @@
cell_explosion(target_turf, 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, cause_data)
qdel(src)

/obj/item/explosive/plastic/breaching_charge/handle_explosion(turf/target_turf, dir, cause_data)
var/explosion_target = get_step(target_turf, dir)
create_shrapnel(explosion_target, 40, dir, angle,/datum/ammo/bullet/shrapnel/metal, cause_data)
sleep(1)// prevents explosion from eating shrapnel
cell_explosion(target_turf, 60, 60, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, dir, cause_data)
qdel(src)

/obj/item/explosive/plastic/proc/delayed_prime(turf/target_turf)
prime(TRUE)

Expand All @@ -342,3 +318,70 @@
min_timer = 3
penetration = 0.60
deploying_time = 10
var/shrapnel_volume = 40

/obj/item/explosive/plastic/breaching_charge/can_place(mob/user, atom/target)
if(!is_type_in_list(target, breachable))//only items on the list are allowed
to_chat(user, SPAN_WARNING("You cannot plant \the [name] on \the [target]!"))
return FALSE

if(SSinterior.in_interior(target))// vehicle checks again JUST IN CASE
to_chat(user, SPAN_WARNING("It's too cramped in here to deploy \the [src]."))
return FALSE

if(istype(target, /obj/structure/window))//no breaching charges on the briefing windows / brig / CIC e.e
var/obj/structure/window/W = target
if(W.not_damageable)
to_chat(user, SPAN_WARNING("[W] is much too tough for you to do anything to it with [src].")) //On purpose to mimic wall message
return FALSE

return TRUE

/obj/item/explosive/plastic/breaching_charge/handle_explosion(turf/target_turf, dir, cause_data)
var/explosion_target = get_step(target_turf, dir)
create_shrapnel(explosion_target, shrapnel_volume, dir, angle,/datum/ammo/bullet/shrapnel/metal, cause_data)
sleep(1)// prevents explosion from eating shrapnel
cell_explosion(target_turf, 60, 60, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, dir, cause_data)
qdel(src)

/obj/item/explosive/plastic/breaching_charge/plasma
name = "plasma charge"
desc = "An alien explosive device. Who knows what it might do."
icon_state = "plasma-charge"
overlay_image = "plasma-active"
w_class = SIZE_SMALL
angle = 55
timer = 5
min_timer = 5
penetration = 0.60
deploying_time = 10
flags_item = NOBLUDGEON|ITEM_PREDATOR
shrapnel_volume = 10

/obj/item/explosive/plastic/breaching_charge/plasma/can_place(mob/user, atom/target)
if(!HAS_TRAIT(user, TRAIT_YAUTJA_TECH))
to_chat(user, SPAN_WARNING("You don't quite understand how the device works..."))
return FALSE

if(!is_type_in_list(target, breachable))//only items on the list are allowed
to_chat(user, SPAN_WARNING("You cannot plant \the [name] on \the [target]!"))
return FALSE

if(SSinterior.in_interior(target))// vehicle checks again JUST IN CASE
to_chat(user, SPAN_WARNING("It's too cramped in here to deploy \the [src]."))
return FALSE

if(istype(target, /obj/structure/window))//no breaching charges on the briefing windows / brig / CIC e.e
var/obj/structure/window/W = target
if(W.not_damageable)
to_chat(user, SPAN_WARNING("[W] is much too tough for you to do anything to it with [src].")) //On purpose to mimic wall message
return FALSE

return TRUE

/obj/item/explosive/plastic/breaching_charge/plasma/handle_explosion(turf/target_turf, dir, cause_data)
var/explosion_target = get_step(target_turf, dir)
create_shrapnel(explosion_target, shrapnel_volume, dir, angle,/datum/ammo/bullet/shrapnel/plasma, cause_data)
sleep(1)// prevents explosion from eating shrapnel
cell_explosion(target_turf, 90, 90, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, dir, cause_data)
qdel(src)
2 changes: 1 addition & 1 deletion code/game/turfs/open.dm
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,7 @@
var/obj/item/clothing/gloves/yautja/hunter/Y = H.gloves
if(Y && istype(Y) && Y.cloaked)
to_chat(H, SPAN_WARNING(" Your bracers hiss and spark as they short out!"))
Y.decloak(H, TRUE)
Y.decloak(H, TRUE, DECLOAK_SUBMERGED)

else if(isxeno(C))
river_slowdown -= 0.7
Expand Down
4 changes: 2 additions & 2 deletions code/modules/clans/client.dm
Original file line number Diff line number Diff line change
Expand Up @@ -405,10 +405,10 @@
to_chat(src, SPAN_WARNING("This player doesn't belong to a clan!"))
return

var/list/datum/rank/ranks = clan_ranks.Copy()
var/list/datum/yautja_rank/ranks = clan_ranks.Copy()
ranks -= CLAN_RANK_ADMIN // Admin rank should not and cannot be obtained from here

var/datum/rank/chosen_rank
var/datum/yautja_rank/chosen_rank
if(has_clan_permission(CLAN_PERMISSION_ADMIN_MODIFY, warn = FALSE))
var/input = tgui_input_list(src, "Select the rank to change this user to.", "Select Rank", ranks)

Expand Down
16 changes: 8 additions & 8 deletions code/modules/clans/rank.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/datum/rank
/datum/yautja_rank
var/name

var/limit_type
Expand All @@ -7,37 +7,37 @@
var/permissions = CLAN_PERMISSION_USER_VIEW
var/permission_required = CLAN_PERMISSION_USER_MODIFY

/datum/rank/unblooded
/datum/yautja_rank/unblooded
name = CLAN_RANK_UNBLOODED
permission_required = CLAN_PERMISSION_ADMIN_MODIFY

/datum/rank/young
/datum/yautja_rank/young
name = CLAN_RANK_YOUNG

/datum/rank/blooded
/datum/yautja_rank/blooded
name = CLAN_RANK_BLOODED

/datum/rank/elite
/datum/yautja_rank/elite
name = CLAN_RANK_ELITE

limit_type = CLAN_LIMIT_SIZE
limit = 5

/datum/rank/elder
/datum/yautja_rank/elder
name = CLAN_RANK_ELDER

limit_type = CLAN_LIMIT_SIZE
limit = 12

/datum/rank/leader
/datum/yautja_rank/leader
name = CLAN_RANK_LEADER

permissions = CLAN_PERMISSION_USER_ALL
permission_required = CLAN_PERMISSION_ADMIN_MODIFY
limit_type = CLAN_LIMIT_NUMBER
limit = 1

/datum/rank/ancient
/datum/yautja_rank/ancient
name = CLAN_RANK_ADMIN

permission_required = CLAN_PERMISSION_ADMIN_MANAGER
Expand Down
6 changes: 6 additions & 0 deletions code/modules/cm_preds/smartdisc.dm
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@
var/list/L = hearers(src, dist)
return L

/obj/item/explosive/grenade/spawnergrenade/smartdisc/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/tool/yautja_cleaner))
if(handle_dissolve())
return
..()

/obj/item/explosive/grenade/spawnergrenade/smartdisc/attack_self(mob/user)
..()

Expand Down
Loading
Loading