diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 711bb769f8..6926d196ad 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -83,23 +83,34 @@ traitor.objectives += block_objective else + var/list/target = traitor.objectives for(var/i = 1, i <= rand(1,3), i++) + var/datum/objective/objective switch(rand(1,100)) if(1 to 30) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = traitor kill_objective.find_target() - traitor.objectives += kill_objective + objective = kill_objective if(31 to 40) var/datum/objective/protect/protect_objective = new protect_objective.owner = traitor protect_objective.find_target() - traitor.objectives += protect_objective + objective = protect_objective else var/datum/objective/steal/steal_objective = new steal_objective.owner = traitor steal_objective.find_target() - traitor.objectives += steal_objective + objective = steal_objective + var/inthere = 0 + for(var/j, j<= target.len, j++) + if(target[j] == objective) + inthere = 1 + break + if(!inthere) + traitor.objectives += objective + else + i -= 1 if (!(locate(/datum/objective/escape) in traitor.objectives)) var/datum/objective/escape/escape_objective = new escape_objective.owner = traitor diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index b4b2830cbf..175ecc4c7a 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -119,6 +119,8 @@ Junction
Y-Junction
Trunk
+Sort Junction 1
+Sort Junction 2
"} user << browse("[src][dat]", "window=pipedispenser") @@ -147,6 +149,10 @@ C.ptype = 4 if(4) C.ptype = 5 + if(5) + C.ptype = 6 + if(6) + C.ptype = 7 C.update() wait = 1 diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm index ffbcc99a8c..eb7d0d12f7 100644 --- a/code/game/magic/cultist/runes.dm +++ b/code/game/magic/cultist/runes.dm @@ -5,6 +5,13 @@ var/list/sacrificed = list() proc teleport(var/key) var/mob/living/user = usr + var/mob/living/grabbed + if (istype(user.get_active_hand(), /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = user.get_active_hand() + grabbed = G.affecting + else if (istype(user.get_inactive_hand(), /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = user.get_inactive_hand() + grabbed = G.affecting var/allrunesloc[] allrunesloc = new/list() var/index = 0 @@ -17,7 +24,7 @@ var/list/sacrificed = list() allrunesloc.len = index allrunesloc[index] = R.loc if(index >= 5) - user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" + user << "\red You feel pain, as the rune disappears into a reality shift caused by too much wear on the fabric of space-time." if (istype(user, /mob/living)) user.take_overall_damage(5, 0) del(src) @@ -29,7 +36,10 @@ var/list/sacrificed = list() user.visible_message("\red [user] disappears in a flash of red light!", \ "\red You feel as your body gets dragged through the dimension of Nar-Sie!", \ "\red You hear a sickening crunch and sloshing of viscera.") - user.loc = allrunesloc[rand(1,index)] + var/target = rand(1,index) + user.loc = allrunesloc[target] + if(grabbed) + grabbed.loc = allrunesloc[target] return if(istype(src,/obj/effect/rune)) return fizzle() //Use friggin manuals, Dorf, your list was of zero length. diff --git a/code/game/objects/closets.dm b/code/game/objects/closets.dm index 31a405f034..e28a78355f 100644 --- a/code/game/objects/closets.dm +++ b/code/game/objects/closets.dm @@ -123,6 +123,7 @@ var/obj/effect/bigDelivery/P = new /obj/effect/bigDelivery(get_turf(src.loc)) P.wrapped = src src.close() + P.waswelded = welded src.welded = 1 src.loc = P O.amount -= 3 @@ -185,13 +186,26 @@ return if(!src.open()) - user << "\blue It won't budge!" - if(!lastbang) - lastbang = 1 - for (var/mob/M in hearers(src, null)) - M << text("BANG, bang!", max(0, 5 - get_dist(src, M))) - spawn(30) - lastbang = 0 + if(istype(src.loc,/obj/effect/bigDelivery) && lastbang == 0) + var/obj/effect/bigDelivery/Pack = src.loc + if(istype(Pack.loc,/turf) && Pack.waswelded == 0) + for (var/mob/M in hearers(src.loc, null)) + M << text("BANG, bang, rrrrrip!", max(0, 5 - get_dist(src, M))) + lastbang = 1 + sleep(10) + src.welded = 0 + Pack.unwrap() + src.open() + spawn(30) + lastbang = 0 + else if(!istype(src.loc,/obj/effect/bigDelivery)) + user << "\blue It won't budge!" + if(!lastbang) + lastbang = 1 + for (var/mob/M in hearers(src, null)) + M << text("BANG, bang!", max(0, 5 - get_dist(src, M))) + spawn(30) + lastbang = 0 /obj/structure/closet/Move() ..() diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index 05ff3cba25..aab9354030 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -675,6 +675,21 @@ R.my_atom = src attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/packageWrap)) + if(istype(src.loc,/obj/item/weapon/storage) || istype(src.loc,/obj/item/clothing/suit/storage/)) //Taking stuff out of storage duplicates it. + user << "\blue Do not do this, it is broken as all hell. Take it out of the container first." + return + for(var/obj/item/T in user) //Lets remove it from their inventory + if(T == src) + user.remove_from_mob(T) + break + var/obj/item/weapon/packageWrap/O = W + if (O.amount > 1) + var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(src.loc)) + P.wrapped = src + + src.loc = P + O.amount -= 1 return attack_self(mob/user as mob) return diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 366cc0d1e9..0b79efc362 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -150,6 +150,15 @@ var/obj/structure/disposalpipe/P = new pipetype(src.loc) P.base_icon_state = base_state P.dir = dir + if(ptype >= 6) + var/obj/structure/disposalpipe/sortjunction/V = P + V.posdir = dir + if(ptype == 6) + V.sortdir = turn(dir, -90) + V.negdir = turn(dir, 180) + else + V.sortdir = turn(dir, 90) + V.negdir = turn(dir, 180) P.dpdir = dpdir P.updateicon() del(src) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 4b0b19bacf..2a7d8813eb 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -20,6 +20,7 @@ var/obj/structure/disposalpipe/trunk/trunk = null // the attached pipe trunk var/flushing = 0 // true if flushing in progress var/timeleft = 0 //used to give a delay after the last item was put in before flushing + var/islarge = 0 //If there is a crate, lets not add a second. // create a new disposal // find the attached trunk (if present) and init gas resvr. @@ -112,41 +113,83 @@ // mouse drop another mob or self // - MouseDrop_T(mob/target, mob/user) - if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) + MouseDrop_T(var/atom/movable/T, mob/user) + if (istype(T,/mob)) + var/mob/target = T + if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) + return + + if(src.islarge == 1) + user << "They won't fit with that crate in there!" + return + + var/msg + for (var/mob/V in viewers(usr)) + if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + V.show_message("[usr] starts climbing into the disposal.", 3) + if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + if(target.anchored) return + V.show_message("[usr] starts stuffing [target.name] into the disposal.", 3) + if(!do_after(usr, 20)) + return + if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) // if drop self, then climbed in // must be awake, not stunned or whatever + msg = "[user.name] climbs into the [src]." + user << "You climb into the [src]." + else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + msg = "[user.name] stuffs [target.name] into the [src]!" + user << "You stuff [target.name] into the [src]!" + else + return + if (target.client) + target.client.perspective = EYE_PERSPECTIVE + target.client.eye = src + target.loc = src + + for (var/mob/C in viewers(src)) + if(C == user) + continue + C.show_message(msg, 3) + + timeleft = 5 + update() + return + if(istype(T,/obj/effect/bigDelivery)) + if (T.anchored || get_dist(user, src) > 1 || get_dist(src,T) > 2 ) + return + + if(src.islarge == 1) + user << "[T] won't fit with that crate in there!" + return + + for(var/mob/M in viewers(src)) + if(M == user) + user << "You start to shove \the [T] into the [src]." + continue + M.show_message("[user.name] looks like they're trying to place \the [T] into the [src].", 5) + + if(!do_after(usr, 20)) + return + + user << "Your back is starting to hurt!" + sleep(5) + if(prob(50)) + user << "No way can you get this thing in there." + return + + if(!do_after(usr, 20)) + return + + T.loc = src + src.islarge = 1 + for(var/mob/M in viewers(src)) + if(M == user) + user << "You shove \the [T] into the [src]." + continue + M.show_message("[user.name] manages to stuff \the [T] into the [src]. Impressive!", 5) return - var/msg - for (var/mob/V in viewers(usr)) - if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) - V.show_message("[usr] starts climbing into the disposal.", 3) - if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) - if(target.anchored) return - V.show_message("[usr] starts stuffing [target.name] into the disposal.", 3) - if(!do_after(usr, 20)) - return - if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) // if drop self, then climbed in - // must be awake, not stunned or whatever - msg = "[user.name] climbs into the [src]." - user << "You climb into the [src]." - else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) - msg = "[user.name] stuffs [target.name] into the [src]!" - user << "You stuff [target.name] into the [src]!" else return - if (target.client) - target.client.perspective = EYE_PERSPECTIVE - target.client.eye = src - target.loc = src - - for (var/mob/C in viewers(src)) - if(C == user) - continue - C.show_message(msg, 3) - - timeleft = 5 - update() - return // can breath normally in the disposal alter_health() @@ -364,6 +407,8 @@ flush = 0 if(mode == 2) // if was ready, mode = 1 // switch to charging + if(islarge) + islarge = 0 update() return @@ -517,10 +562,6 @@ src.destinationTag = T.sortTag else if (!src.destinationTag) src.destinationTag = null - else if (istype(AM, /mob)) //If there is a mob somewhere in there.... - if(prob(10)) - src.destinationTag = "Mail Office" - // start the movement process // argument is the disposal unit the holder started in @@ -945,7 +986,6 @@ service = 0 screen = 0 icon_state_old = null -// mob/living/lastuser New() @@ -1034,9 +1074,8 @@ proc interact(var/mob/user) -// lastuser = user var/dat = "Sorting Mechanism
" - if (!sortType) + if (sortType.len == 0) dat += "
Currently Filtering: None
" else dat += "
Currently Filtering:" @@ -1045,7 +1084,7 @@ dat += "
" if (!backsort) dat += "Backwards Sorting Disabled Toggle
" - else if(!backType && backsort) + else if(backType.len == 0 && backsort) dat += "Backwards Sorting Active. Sorting: None. Toggle
" else dat += "Backwards Sorting Active. Sorting:" @@ -1084,7 +1123,6 @@ sortType |= var_value else sortType -= variable -// interact(lastuser) updateUsrDialog() //a trunk joining to a disposal bin or outlet on the same turf diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 9cd1e772ec..051e5aa889 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -9,6 +9,7 @@ flags = FPRINT mouse_drag_pointer = MOUSE_ACTIVE_POINTER var/examtext = null + var/waswelded = 0 attack_hand(mob/user as mob) @@ -19,7 +20,7 @@ src.wrapped.loc = (get_turf(src.loc)) if (istype(src.wrapped,/obj/structure/closet)) var/obj/structure/closet/O = src.wrapped - O.welded = 0 + O.welded = waswelded del(src) return @@ -207,7 +208,6 @@ flags = FPRINT | TABLEPASS | ONBELT | CONDUCT attack_self(mob/user as mob) - user.machine = src interact(user) proc/interact(mob/user as mob) @@ -216,6 +216,7 @@ dat += "
Current Selection: None
" else dat += "
Current Selection: [currTag]

" + dat += "Set Custom Destination

" for (var/i = 1, i <= locationList.len, i++) if(spaceList[i]) dat += "
" @@ -223,14 +224,19 @@ dat += "
" user << browse(dat, "window=destTagScreen") onclose(user, "destTagScreen") - usr.machine = null return Topic(href, href_list) + usr.machine = src src.add_fingerprint(usr) if(href_list["nextTag"]) var/n = text2num(href_list["nextTag"]) - src.currTag = locationList[n] + if(n > locationList.len) + var/t1 = input("Which tag?","Tag") as null|text + if(t1) + src.currTag = t1 + else + src.currTag = locationList[n] if(istype(loc,/mob)) interact(loc) else