Merge branch 'master' into upstream-merge-36442
This commit is contained in:
@@ -45,7 +45,7 @@ Credit where due:
|
||||
///////////
|
||||
|
||||
/proc/is_servant_of_ratvar(mob/M)
|
||||
return istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/clockcult)
|
||||
return isliving(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/clockcult)
|
||||
|
||||
/proc/is_eligible_servant(mob/M)
|
||||
if(!istype(M))
|
||||
|
||||
@@ -675,7 +675,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
//Picks as many people as it can from a department (Security,Engineer,Medical,Science)
|
||||
//and tasks the lings with killing and replacing them
|
||||
/datum/objective/changeling_team_objective/impersonate_department
|
||||
explanation_text = "Ensure X derpartment are killed, impersonated, and replaced by Changelings"
|
||||
explanation_text = "Ensure X department are killed, impersonated, and replaced by Changelings"
|
||||
var/command_staff_only = FALSE //if this is true, it picks command staff instead
|
||||
var/list/department_minds = list()
|
||||
var/list/department_real_names = list()
|
||||
@@ -823,7 +823,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
|
||||
|
||||
|
||||
//A subtype of impersonate_derpartment
|
||||
//A subtype of impersonate_department
|
||||
//This subtype always picks as many command staff as it can (HoS,HoP,Cap,CE,CMO,RD)
|
||||
//and tasks the lings with killing and replacing them
|
||||
/datum/objective/changeling_team_objective/impersonate_department/impersonate_heads
|
||||
|
||||
@@ -58,8 +58,13 @@
|
||||
"<span class='notice'>You climb out of [src]!</span>")
|
||||
open_machine()
|
||||
|
||||
/obj/machinery/sleeper/Exited(atom/movable/user)
|
||||
if (!state_open && user == occupant)
|
||||
container_resist(user)
|
||||
|
||||
/obj/machinery/sleeper/relaymove(mob/user)
|
||||
container_resist(user)
|
||||
if (!state_open)
|
||||
container_resist(user)
|
||||
|
||||
/obj/machinery/sleeper/open_machine()
|
||||
if(!state_open && !panel_open)
|
||||
|
||||
@@ -84,7 +84,6 @@
|
||||
occupier.adjustToxLoss(-1, 0)
|
||||
occupier.adjustBruteLoss(-1, 0)
|
||||
occupier.updatehealth()
|
||||
occupier.updatehealth()
|
||||
if(occupier.health >= 0 && occupier.stat == DEAD)
|
||||
occupier.revive()
|
||||
return occupier.health < 100
|
||||
@@ -92,9 +91,11 @@
|
||||
/obj/machinery/computer/aifixer/process()
|
||||
if(..())
|
||||
if(active)
|
||||
var/oldstat = occupier.stat
|
||||
active = Fix()
|
||||
if(oldstat != occupier.stat)
|
||||
update_icon()
|
||||
updateDialog()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/aifixer/Topic(href, href_list)
|
||||
if(..())
|
||||
|
||||
@@ -64,6 +64,22 @@
|
||||
material = WOOD
|
||||
var/drop_amount = 3
|
||||
|
||||
/obj/structure/barricade/wooden/attackby(obj/item/I, mob/user)
|
||||
if(istype(I,/obj/item/stack/sheet/mineral/wood))
|
||||
var/obj/item/stack/sheet/mineral/wood/W = I
|
||||
if(W.amount < 5)
|
||||
to_chat(user, "<span class='warning'>You need at least five wooden planks to make a wall!</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You start adding [I] to [src]...</span>")
|
||||
if(do_after(user, 50, target=src))
|
||||
W.use(5)
|
||||
new /turf/closed/wall/mineral/wood/nonmetal(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/barricade/wooden/crude
|
||||
name = "crude plank barricade"
|
||||
desc = "This space is blocked off by a crude assortment of planks."
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
icon_state = "blueprints"
|
||||
attack_verb = list("attacked", "bapped", "hit")
|
||||
var/fluffnotice = "Nobody's gonna read this stuff!"
|
||||
var/in_use = FALSE
|
||||
|
||||
/obj/item/areaeditor/attack_self(mob/user)
|
||||
add_fingerprint(user)
|
||||
@@ -25,12 +26,16 @@
|
||||
|
||||
/obj/item/areaeditor/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
return TRUE
|
||||
if(!usr.canUseTopic(src))
|
||||
usr << browse(null, "window=blueprints")
|
||||
return
|
||||
return TRUE
|
||||
if(href_list["create_area"])
|
||||
if(in_use)
|
||||
return
|
||||
in_use = TRUE
|
||||
create_area(usr)
|
||||
in_use = FALSE
|
||||
updateUsrDialog()
|
||||
|
||||
//Station blueprints!!!
|
||||
@@ -79,11 +84,16 @@
|
||||
|
||||
|
||||
/obj/item/areaeditor/blueprints/Topic(href, href_list)
|
||||
..()
|
||||
if(..())
|
||||
return
|
||||
if(href_list["edit_area"])
|
||||
if(get_area_type()!=AREA_STATION)
|
||||
return
|
||||
if(in_use)
|
||||
return
|
||||
in_use = TRUE
|
||||
edit_area()
|
||||
in_use = FALSE
|
||||
if(href_list["exit_legend"])
|
||||
legend = FALSE;
|
||||
if(href_list["view_legend"])
|
||||
|
||||
@@ -28,7 +28,10 @@
|
||||
disrupt()
|
||||
|
||||
/obj/item/device/chameleon/attack_self(mob/user)
|
||||
toggle(user)
|
||||
if (isturf(user.loc) || istype(user.loc, /obj/structure) || active_dummy)
|
||||
toggle(user)
|
||||
else
|
||||
to_chat(user, "<span class='userwarning'>You can't use [src] while inside something.</span>")
|
||||
|
||||
/obj/item/device/chameleon/afterattack(atom/target, mob/user , proximity)
|
||||
if(!proximity)
|
||||
|
||||
@@ -27,6 +27,18 @@
|
||||
/obj/item/grenade/chem_grenade/examine(mob/user)
|
||||
display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state
|
||||
..()
|
||||
if(user.can_see_reagents())
|
||||
var/count = 0
|
||||
if(beakers.len)
|
||||
to_chat(user, "<span class='notice'>You scan the grenade and detect the following reagents:</span>")
|
||||
for(var/obj/item/reagent_containers/glass/G in beakers)
|
||||
var/textcount = thtotext(++count)
|
||||
for(var/datum/reagent/R in G.reagents.reagent_list)
|
||||
to_chat(user, "<span class='notice'>[R.volume] units of [R.name] in the [textcount] beaker.</span>")
|
||||
if(beakers.len == 1)
|
||||
to_chat(user, "<span class='notice'>You detect no second beaker in the grenade.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You scan the grenade, but detect nothing.</span>")
|
||||
|
||||
|
||||
/obj/item/grenade/chem_grenade/attack_self(mob/user)
|
||||
|
||||
@@ -23,8 +23,31 @@
|
||||
var/detonate_flash_range = 5
|
||||
var/detonate_fire_range = 5
|
||||
|
||||
var/active = FALSE
|
||||
|
||||
var/color_val = FALSE
|
||||
|
||||
var/datum/weakref/current
|
||||
|
||||
/obj/item/hot_potato/Destroy()
|
||||
if(active)
|
||||
deactivate()
|
||||
return ..()
|
||||
|
||||
/obj/item/hot_potato/proc/colorize(mob/target)
|
||||
//Clear color from old target
|
||||
if(current)
|
||||
var/mob/M = current.resolve()
|
||||
if(istype(M))
|
||||
M.remove_atom_colour(FIXED_COLOUR_PRIORITY)
|
||||
//Give to new target
|
||||
current = null
|
||||
//Swap colors
|
||||
color_val = !color_val
|
||||
if(istype(target))
|
||||
current = WEAKREF(target)
|
||||
target.add_atom_colour(color_val? "#ffff00" : "#00ffff", FIXED_COLOUR_PRIORITY)
|
||||
|
||||
/obj/item/hot_potato/proc/detonate()
|
||||
var/atom/location = loc
|
||||
location.visible_message("<span class='userdanger'>[src] [detonate_explosion? "explodes" : "activates"]!</span>", "<span class='userdanger'>[src] activates! You've ran out of time!</span>")
|
||||
@@ -37,9 +60,6 @@
|
||||
M.dropItemToGround(src, TRUE)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/hot_potato/proc/is_active()
|
||||
return isnull(detonation_timerid)? FALSE : TRUE
|
||||
|
||||
/obj/item/hot_potato/attack_self(mob/user)
|
||||
if(activate(timer, user))
|
||||
user.visible_message("<span class='boldwarning'>[user] squeezes [src], which promptly starts to flash red-hot colors!</span>", "<span class='boldwarning'>You squeeze [src], activating its countdown and attachment mechanism!</span>",
|
||||
@@ -56,19 +76,18 @@
|
||||
L.SetSleeping(0)
|
||||
L.SetUnconscious(0)
|
||||
L.reagents.add_reagent("muscle_stimulant", CLAMP(5 - L.reagents.get_reagent_amount("muscle_stimulant"), 0, 5)) //If you don't have legs or get bola'd, tough luck!
|
||||
color_val = !color_val
|
||||
L.add_atom_colour(color_val? "#ffff00" : "#00ffff", FIXED_COLOUR_PRIORITY)
|
||||
colorize(L)
|
||||
|
||||
/obj/item/hot_potato/examine(mob/user)
|
||||
. = ..()
|
||||
if(is_active())
|
||||
if(active)
|
||||
to_chat(user, "<span class='warning'>[src] is flashing red-hot! You should probably get rid of it!</span>")
|
||||
if(show_timer)
|
||||
to_chat(user, "<span class='warning'>[src]'s timer looks to be at [DisplayTimeText(activation_time - world.time)]!</span>")
|
||||
|
||||
/obj/item/hot_potato/equipped(mob/user)
|
||||
. = ..()
|
||||
if(is_active())
|
||||
if(active)
|
||||
to_chat(user, "<span class='userdanger'>You have a really bad feeling about [src]!</span>")
|
||||
|
||||
/obj/item/hot_potato/afterattack(atom/target, mob/user, adjacent, params)
|
||||
@@ -99,7 +118,7 @@
|
||||
if(.)
|
||||
add_logs(user, victim, "forced a hot potato with explosive variables ([detonate_explosion]-[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_flash_range]/[detonate_fire_range]) onto")
|
||||
user.visible_message("<span class='userdanger'>[user] forces [src] onto [victim]!</span>", "<span class='userdanger'>You force [src] onto [victim]!</span>", "<span class='boldwarning'>You hear a mechanical click and a beep.</span>")
|
||||
user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY)
|
||||
colorize(null)
|
||||
else
|
||||
add_logs(user, victim, "tried to force a hot potato with explosive variables ([detonate_explosion]-[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_flash_range]/[detonate_fire_range]) onto")
|
||||
user.visible_message("<span class='boldwarning'>[user] tried to force [src] onto [victim], but it could not attach!</span>", "<span class='boldwarning'>You try to force [src] onto [victim], but it is unable to attach!</span>", "<span class='boldwarning'>You hear a mechanical click and two buzzes.</span>")
|
||||
@@ -107,10 +126,10 @@
|
||||
|
||||
/obj/item/hot_potato/dropped(mob/user)
|
||||
. = ..()
|
||||
user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY)
|
||||
colorize(null)
|
||||
|
||||
/obj/item/hot_potato/proc/activate(delay, mob/user)
|
||||
if(is_active())
|
||||
if(active)
|
||||
return
|
||||
update_icon()
|
||||
if(sticky)
|
||||
@@ -122,6 +141,7 @@
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("[user? "[ADMIN_LOOKUPFLW(user)] has primed [src]" : "A [src] has been primed"] (Timer:[delay],Explosive:[detonate_explosion],Range:[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range]) for detonation at [COORD(T)]([T.loc])")
|
||||
log_game("[user? "[user] has primed [src]" : "A [src] has been primed"] ([detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range]) for detonation at [COORD(T)]([T.loc])")
|
||||
active = TRUE
|
||||
|
||||
/obj/item/hot_potato/proc/deactivate()
|
||||
update_icon()
|
||||
@@ -130,12 +150,11 @@
|
||||
deltimer(detonation_timerid)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
detonation_timerid = null
|
||||
if(ismob(loc))
|
||||
var/mob/user = loc
|
||||
user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY)
|
||||
colorize(null)
|
||||
active = FALSE
|
||||
|
||||
/obj/item/hot_potato/update_icon()
|
||||
icon_state = is_active()? icon_on : icon_off
|
||||
icon_state = active? icon_on : icon_off
|
||||
|
||||
/obj/item/hot_potato/syndicate
|
||||
detonate_light_range = 4
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
H.sec_hud_set_implants()
|
||||
|
||||
if(user)
|
||||
add_logs(user, target, "implanted", object="[name]")
|
||||
add_logs(user, target, "implanted", "\a [name]")
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
icon = 'icons/obj/telescience.dmi'
|
||||
icon_state = "polycrystal"
|
||||
item_state = "sheet-polycrystal"
|
||||
singular_name = "bluespace polycrystal"
|
||||
desc = "A stable polycrystal, made of fused-together bluespace crystals. You could probably break one off."
|
||||
materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT)
|
||||
attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed")
|
||||
|
||||
@@ -78,6 +78,15 @@
|
||||
icon_state = "toolbox_blue_old"
|
||||
has_latches = FALSE
|
||||
|
||||
/obj/item/storage/toolbox/mechanical/old/heirloom
|
||||
name = "toolbox" //this will be named "X family toolbox"
|
||||
desc = "It's seen better days."
|
||||
force = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/storage/toolbox/mechanical/old/heirloom/PopulateContents()
|
||||
return
|
||||
|
||||
/obj/item/storage/toolbox/electrical
|
||||
name = "electrical toolbox"
|
||||
icon_state = "yellow"
|
||||
|
||||
@@ -415,7 +415,7 @@
|
||||
icon_state = "plasmawindow"
|
||||
reinf = FALSE
|
||||
heat_resistance = 25000
|
||||
armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 00, "acid" = 100)
|
||||
armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100)
|
||||
max_integrity = 150
|
||||
explosion_block = 1
|
||||
glass_type = /obj/item/stack/sheet/plasmaglass
|
||||
|
||||
@@ -199,8 +199,6 @@
|
||||
return 0
|
||||
if(!(lube&SLIDE_ICE))
|
||||
to_chat(C, "<span class='notice'>You slipped[ O ? " on the [O.name]" : ""]!</span>")
|
||||
C.log_message("<font color='orange'>Slipped[O ? " on the [O.name]" : ""][(lube&SLIDE)? " (LUBE)" : ""]!</font>", INDIVIDUAL_ATTACK_LOG)
|
||||
if(!(lube&SLIDE_ICE))
|
||||
playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3)
|
||||
|
||||
C.SendSignal(COMSIG_ADD_MOOD_EVENT, "slipped", /datum/mood_event/slipped)
|
||||
|
||||
@@ -130,7 +130,23 @@
|
||||
sheet_type = /obj/item/stack/sheet/mineral/wood
|
||||
hardness = 70
|
||||
explosion_block = 0
|
||||
canSmoothWith = list(/turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood)
|
||||
canSmoothWith = list(/turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood/nonmetal)
|
||||
|
||||
/turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user)
|
||||
var/duration = (48/W.force) * 2 //In seconds, for now.
|
||||
if(W.sharpness)
|
||||
if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/twohanded/fireaxe))
|
||||
duration /= 4 //Much better with hatchets and axes.
|
||||
if(do_after(user, duration*10, target=src)) //Into deciseconds.
|
||||
dismantle_wall(FALSE,FALSE)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/turf/closed/wall/mineral/wood/nonmetal
|
||||
desc = "A solidly wooden wall. It's a bit weaker than a wall made with metal."
|
||||
girder_type = /obj/structure/barricade/wooden
|
||||
hardness = 50
|
||||
canSmoothWith = list(/turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood/nonmetal)
|
||||
|
||||
/turf/closed/wall/mineral/iron
|
||||
name = "rough metal wall"
|
||||
@@ -250,7 +266,7 @@
|
||||
/turf/closed/wall/mineral/plastitanium/overspace
|
||||
icon_state = "map-overspace"
|
||||
fixed_underlay = list("space"=1)
|
||||
|
||||
|
||||
/turf/closed/wall/mineral/plastitanium/explosive/ex_act(severity)
|
||||
var/datum/explosion/acted_explosion = null
|
||||
for(var/datum/explosion/E in GLOB.explosions)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "water"
|
||||
desc = "Shallow water."
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "riverwater"
|
||||
icon_state = "riverwater_motion"
|
||||
baseturfs = /turf/open/chasm/lavaland
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
planetary_atmos = TRUE
|
||||
|
||||
Reference in New Issue
Block a user