Job Perks - True Professionals (#29478)

* ddsadsa

ddsadsa

* moderate again

* revert

* medical first steps

* more work

* lots more work done

* more progress

* finished up

* attack chain linter

* attack chain update

* attack chain work

* fixes + chemist update

* gives comments
This commit is contained in:
Kyani
2025-06-13 19:40:29 +00:00
committed by GitHub
parent 341058c682
commit 586e2e6c4d
31 changed files with 553 additions and 56 deletions
+13 -9
View File
@@ -21,21 +21,27 @@
'sound/effects/pageturn3.ogg'
)
/obj/item/book/granter/attack_self__legacy__attackchain(mob/living/user)
/obj/item/book/granter/Initialize(mapload, datum/cachedbook/CB, _copyright, _protected)
. = ..()
RegisterSignal(src, COMSIG_ACTIVATE_SELF, TYPE_PROC_REF(/datum, signal_cancel_activate_self))
/obj/item/book/granter/activate_self(mob/user)
if(..())
return
if(reading)
to_chat(user, "<span class='warning'>You're already reading this!</span>")
return FALSE
return FINISH_ATTACK
if(!user.has_vision())
to_chat(user, "<span class='warning'>You are blind and can't read anything!</span>")
return FALSE
return FINISH_ATTACK
if(!isliving(user))
return FALSE
return FINISH_ATTACK
if(!can_learn(user))
return FALSE
return FINISH_ATTACK
if(uses <= 0)
recoil(user)
return FALSE
return FINISH_ATTACK
on_reading_start(user)
reading = TRUE
@@ -43,14 +49,12 @@
if(!turn_page(user))
on_reading_stopped(user)
reading = FALSE
return
return CONTINUE_ATTACK
if(do_after(user, reading_time, src))
uses--
on_reading_finished(user)
reading = FALSE
return TRUE
/// Called when the user starts to read the granter.
/obj/item/book/granter/proc/on_reading_start(mob/living/user)
to_chat(user, "<span class='notice'>You start reading [name]...</span>")
@@ -143,7 +143,8 @@
INVOKE_ASYNC(src, PROC_REF(buckled_speed_move), user.buckled, direction)
else
user.newtonian_move(turn(direction, 180))
if(user.mind && HAS_TRAIT(user.mind, TRAIT_FIRE_FIGHTER))
precision = TRUE
var/turf/T = get_turf(A)
var/turf/T1 = get_step(T, turn(direction, 90))
var/turf/T2 = get_step(T, turn(direction, -90))
@@ -928,6 +928,17 @@
title = "Space Law"
wiki_article_title = "Space_law"
/obj/item/book/manual/wiki/security_space_law/imaginary
name = "Imaginary Space Law Manual"
desc = "A set of memorized Nanotrasen guidelines for keeping law and order on their space stations."
flags = DROPDEL | ABSTRACT | NOBLUDGEON
imaginary = TRUE
/obj/item/book/manual/wiki/security_space_law/imaginary/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SKIP_EXAMINE, INNATE_TRAIT)
ADD_TRAIT(src, TRAIT_NO_STRIP, INNATE_TRAIT)
/obj/item/book/manual/wiki/security_space_law/black
name = "Space Law - Limited Edition"
desc = "A leather-bound, immaculately-written copy of JUSTICE."
@@ -958,6 +969,17 @@
title = "Legal Standard Operating Procedures"
wiki_article_title = "Legal_Standard_Operating_Procedure"
/obj/item/book/manual/wiki/sop_legal/imaginary
name = "Imaginary Legal SOP Manual"
desc = "A set of memorized Nanotrasen guidelines aiming at the safe conduct of all legal activities."
flags = DROPDEL | ABSTRACT | NOBLUDGEON
imaginary = TRUE
/obj/item/book/manual/wiki/sop_legal/imaginary/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SKIP_EXAMINE, INNATE_TRAIT)
ADD_TRAIT(src, TRAIT_NO_STRIP, INNATE_TRAIT)
/obj/item/book/manual/wiki/sop_supply
name = "Supply Standard Operating Procedures"
desc = "A set of guidelines aiming at the safe conduct of all supply activities."
+4 -1
View File
@@ -71,7 +71,10 @@
if(world.time > mop_sound_cooldown)
playsound(loc, pick('sound/weapons/mopping1.ogg', 'sound/weapons/mopping2.ogg'), 30, TRUE, -1)
mop_sound_cooldown = world.time + MOP_SOUND_CD
target.cleaning_act(user, src, mopspeed, text_verb = "mop", text_description = ".")
if(user.mind && HAS_TRAIT(user, TRAIT_JANITOR))
target.cleaning_act(user, src, mopspeed / 2, text_verb = "mop", text_description = ".")
else
target.cleaning_act(user, src, mopspeed, text_verb = "mop", text_description = ".")
return ITEM_INTERACT_COMPLETE
/obj/item/mop/can_clean()
@@ -218,30 +218,32 @@
update_appearance()
return TRUE
/obj/structure/closet/proc/close()
/obj/structure/closet/proc/close(mob/user)
if(!opened)
return FALSE
if(!can_close())
return FALSE
var/itemcount = 0
var/temp_capacity = storage_capacity
if(user && user.mind && HAS_TRAIT(user.mind, TRAIT_PACK_RAT))
temp_capacity *= 1.5
//Cham Projector Exception
for(var/obj/effect/dummy/chameleon/AD in loc)
if(itemcount >= storage_capacity)
if(itemcount >= temp_capacity)
break
AD.forceMove(src)
itemcount++
for(var/obj/item/I in loc)
if(itemcount >= storage_capacity)
if(itemcount >= temp_capacity)
break
if(!I.anchored)
I.forceMove(src)
itemcount++
for(var/mob/M in loc)
if(itemcount >= storage_capacity)
if(itemcount >= temp_capacity)
break
if(isobserver(M))
continue
@@ -264,7 +266,7 @@
return TRUE
/obj/structure/closet/proc/toggle(mob/user)
if(!(opened ? close() : open()))
if(!(opened ? close(user) : open()))
to_chat(user, "<span class='notice'>It won't budge!</span>")
/obj/structure/closet/proc/bust_open()
@@ -498,7 +500,7 @@
if(opened && can_close())
target.forceMove(src)
visible_message("<span class='danger'>[attacker] shoves [target] inside [src]!</span>", "<span class='warning'>You hear a thud, and something clangs shut.</span>")
close()
close(attacker)
add_attack_logs(attacker, target, "shoved into [src]")
return TRUE