* Explosive implant

* Package wrapper

* Venus human trap sprites

* Vine damage

* Wisp vision

* Display case

* Storage viewing

* Ghost poll nullspacing

* Inflatable barrier piercing

* Pneumatic cannon

* Cow grammar

* Centcom jaunting

* Consistency

Not actually a lazy list, as far as I can tell

* Review 1

Co-Authored-By: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>

* Review 2

Co-Authored-By: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>

* length()

Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>
This commit is contained in:
SabreML
2021-08-05 11:04:27 +01:00
committed by GitHub
co-authored by SteelSlayer
parent e75d8357eb
commit 02fe0876f5
28 changed files with 152 additions and 95 deletions
@@ -74,7 +74,7 @@ GLOBAL_LIST_EMPTY(antagonists)
set waitfor = FALSE
var/list/mob/dead/observer/candidates = SSghost_spawns.poll_candidates("Do you want to play as a [name]?", job_rank, TRUE, 5 SECONDS)
if(LAZYLEN(candidates))
if(length(candidates))
var/mob/dead/observer/C = pick(candidates)
to_chat(owner, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!")
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner.current)]) to replace a jobbaned player.")
@@ -48,7 +48,7 @@
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
var/image/I = new('icons/mob/simple_human.dmi', "syndicate_space_sword")
var/list/nuke_candidates = SSghost_spawns.poll_candidates("Do you want to play as a [rolename]?", ROLE_OPERATIVE, TRUE, 15 SECONDS, source = I)
if(LAZYLEN(nuke_candidates))
if(length(nuke_candidates))
checking = FALSE
if(QDELETED(src) || !check_usability(user))
return
@@ -194,7 +194,7 @@
servant_mind.transfer_to(H)
var/list/mob/dead/observer/candidates = SSghost_spawns.poll_candidates("Do you want to play as the servant of [user.real_name]?", ROLE_WIZARD, poll_time = 30 SECONDS, source = H)
if(LAZYLEN(candidates))
if(length(candidates) && !QDELETED(H))
var/mob/dead/observer/C = pick(candidates)
message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant")
H.key = C.key
+5 -3
View File
@@ -274,7 +274,7 @@
// Bust through windows or other stuff blocking the way
if(!target.Enter(holder))
for(var/atom/movable/AM in target)
if(istype(AM, /obj/structure/spacevine) || !AM.density)
if(!AM.density || isvineimmune(AM))
continue
AM.ex_act(severity)
target.ex_act(severity) // vine immunity handled at /mob/ex_act
@@ -697,8 +697,10 @@
. = ..()
/proc/isvineimmune(atom/A)
. = FALSE
if(isliving(A))
var/mob/living/M = A
if(("vines" in M.faction) || ("plants" in M.faction))
. = TRUE
return TRUE
else if(istype(A, /obj/structure/spacevine) || istype(A, /obj/structure/alien/resin/flower_bud_enemy))
return TRUE
return FALSE
+1 -1
View File
@@ -139,7 +139,7 @@
playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1)
return BRUTELOSS
/obj/item/scythe/pre_attackby(atom/A, mob/living/user, params)
/obj/item/scythe/pre_attack(atom/A, mob/living/user, params)
if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user))
return ..()
else
+1 -1
View File
@@ -41,7 +41,7 @@
new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
user.changeNext_move(CLICK_CD_MELEE)
/obj/item/resonator/pre_attackby(atom/target, mob/user, params)
/obj/item/resonator/pre_attack(atom/target, mob/user, params)
if(check_allowed_items(target, 1))
CreateResonance(target, user)
return TRUE
@@ -247,7 +247,7 @@
to_chat(user, "<span class='notice'>You release the wisp. It begins to bob around your head.</span>")
icon_state = "lantern"
wisp.orbit(user, 20)
INVOKE_ASYNC(wisp, /atom/movable/.proc/orbit, user, 20)
set_light(0)
user.update_sight()
@@ -115,7 +115,7 @@
icon_living = "cow"
icon_dead = "cow_dead"
icon_gib = "cow_gib"
speak = list("moo?","moo","MOOOOOO")
speak = list("Moo?","Moo","MOOOOOO")
speak_emote = list("moos","moos hauntingly")
emote_hear = list("brays")
emote_see = list("shakes its head")
@@ -408,7 +408,7 @@ Difficulty: Hard
/obj/effect/decal/cleanable/blood/gibs/bubblegum/can_bloodcrawl_in()
return TRUE
/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon)
/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
if(!charging)
..()
@@ -49,6 +49,7 @@
name = "venus human trap"
desc = "Now you know how the fly feels."
icon_state = "venus_human_trap"
icon_living = "venus_human_trap"
mob_biotypes = MOB_ORGANIC | MOB_PLANT
layer = MOB_LAYER + 0.9
health = 50
+3 -1
View File
@@ -116,7 +116,9 @@
var/list/mob/dead/observer/candidates = SSghost_spawns.poll_candidates("[question]?", poll_time = 10 SECONDS, min_hours = minhours, source = M)
var/mob/dead/observer/theghost = null
if(LAZYLEN(candidates))
if(length(candidates))
if(QDELETED(M))
return
theghost = pick(candidates)
to_chat(M, "Your mob has been taken over by a ghost!")
message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)])")
+54 -51
View File
@@ -153,10 +153,14 @@
resistance_flags = FLAMMABLE
var/static/list/no_wrap = list(/obj/item/smallDelivery, /obj/structure/bigDelivery, /obj/item/evidencebag, /obj/structure/closet/body_bag, /obj/item/twohanded/required)
/obj/item/stack/packageWrap/afterattack(obj/target as obj, mob/user as mob, proximity)
if(!proximity) return
if(!istype(target)) //this really shouldn't be necessary (but it is). -Pete
/obj/item/stack/packageWrap/pre_attack(atom/A, mob/living/user, params)
. = ..()
if(!in_range(A, user))
return
if(!isobj(A))
return
var/obj/target = A
if(is_type_in_list(target, no_wrap))
return
if(target.anchored)
@@ -166,62 +170,61 @@
if(istype(target, /obj/item) && !(istype(target, /obj/item/storage) && !istype(target,/obj/item/storage/box) && !istype(target, /obj/item/shippingPackage)))
var/obj/item/O = target
if(use(1))
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up!
if(!istype(O.loc, /turf))
if(user.client)
user.client.screen -= O
P.wrapped = O
O.loc = P
var/i = round(O.w_class)
if(i in list(1,2,3,4,5))
P.icon_state = "deliverycrate[i]"
P.w_class = i
P.add_fingerprint(usr)
O.add_fingerprint(usr)
add_fingerprint(usr)
else
return
if(!use(1))
return FALSE
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up!
if(!isturf(O.loc))
if(user.client)
user.client.screen -= O
P.wrapped = O
O.loc = P
var/i = round(O.w_class)
if(i in list(1,2,3,4,5))
P.icon_state = "deliverycrate[i]"
P.w_class = i
P.add_fingerprint(user)
O.add_fingerprint(user)
add_fingerprint(user)
else if(istype(target, /obj/structure/closet/crate))
var/obj/structure/closet/crate/O = target
if(O.opened)
return
if(amount >= 3 && do_after_once(user, 15, target = target))
if(O.opened || !use(3))
return
var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
P.icon_state = "deliverycrate"
P.wrapped = O
O.loc = P
else
to_chat(user, "<span class='notice'>You need more paper.</span>")
return
else if(istype (target, /obj/structure/closet))
var/obj/structure/closet/O = target
if(O.opened)
return
if(amount >= 3 && do_after_once(user, 15, target = target))
if(O.opened || !use(3))
return
var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
P.wrapped = O
P.init_welded = O.welded
O.welded = 1
O.loc = P
else
to_chat(user, "<span class='notice'>You need more paper.</span>")
return
var/obj/structure/bigDelivery/D = wrap_closet(target, user)
if(!D)
return FALSE
D.icon_state = "deliverycrate"
else if(istype(target, /obj/structure/closet))
var/obj/structure/closet/C = target
var/obj/structure/bigDelivery/D = wrap_closet(target, user)
if(!D)
return FALSE
D.init_welded = C.welded
C.welded = TRUE
else
to_chat(user, "<span class='notice'>The object you are trying to wrap is unsuitable for the sorting machinery.</span>")
return
return FALSE
user.visible_message("<span class='notice'>[user] wraps [target].</span>")
user.create_attack_log("<font color='blue'>Has used [name] on [target]</font>")
add_attack_logs(user, target, "used [name]", ATKLOG_ALL)
if(amount <= 0 && !src.loc) //if we used our last wrapping paper, drop a cardboard tube
new /obj/item/c_tube( get_turf(user) )
return
if(amount <= 0 && QDELETED(src)) //if we used our last wrapping paper, drop a cardboard tube
var/obj/item/c_tube/T = new(get_turf(user))
user.put_in_active_hand(T)
return FALSE
// Separate proc to avoid copy pasting the code twice
/obj/item/stack/packageWrap/proc/wrap_closet(obj/structure/closet/C, mob/user)
if(C.opened)
return
if(amount < 3)
to_chat(user, "<span class='warning'>You need more paper.</span>")
return
if(!do_after_once(user, 1.5 SECONDS, target = C) || C.opened || !use(3)) // Checking these again since it's after a delay
return
var/obj/structure/bigDelivery/P = new(get_turf(C))
P.wrapped = C
C.loc = P
return P
/obj/item/destTagger
name = "destination tagger"
@@ -205,7 +205,7 @@
var/ghostmsg = "Play as [SM.name], pet of [user.name]?"
var/list/candidates = SSghost_spawns.poll_candidates(ghostmsg, ROLE_SENTIENT, FALSE, 10 SECONDS, source = M)
if(!src)
if(QDELETED(src) || QDELETED(SM))
return
if(candidates.len)