Merge remote-tracking branch 'upstream/master' into Memes

This commit is contained in:
Unknown
2018-08-29 19:23:06 +02:00
111 changed files with 983 additions and 987 deletions
@@ -108,6 +108,9 @@
qdel(src)
/obj/structure/sign/poster/proc/roll_and_drop(loc)
if(ruined)
qdel(src)
return
pixel_x = 0
pixel_y = 0
var/obj/item/poster/P = new(loc, src)
+11 -8
View File
@@ -14,14 +14,12 @@
/obj/effect/mine/Crossed(AM as mob|obj)
if(!isliving(AM))
return
if(isanimal(AM))
var/mob/living/simple_animal/SA = AM
if(faction && (faction in SA.faction))
return
if(!SA.flying)
triggermine(SA)
else
triggermine(AM)
var/mob/living/M = AM
if(faction && (faction in M.faction))
return
if(M.flying)
return
triggermine(M)
/obj/effect/mine/proc/triggermine(mob/living/victim)
if(triggered)
@@ -34,6 +32,11 @@
triggered = 1
qdel(src)
/obj/effect/mine/ex_act(severity)
// Necessary because, as effects, they have infinite health, and wouldn't be destroyed otherwise.
// Also, they're pressure-sensitive mines, it makes sense that an explosion (wave of pressure) triggers/destroys them.
qdel(src)
/obj/effect/mine/explosive
name = "explosive mine"
var/range_devastation = 0
+22 -4
View File
@@ -11,6 +11,7 @@
anchored = 1
var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent
var/can_multitool_to_remove = 0
var/ignore_tele_proof_area_setting = FALSE
/obj/effect/portal/Bumped(mob/M as mob|obj)
teleport(M)
@@ -42,12 +43,29 @@
qdel(src)
return
if(istype(M, /atom/movable))
if(prob(failchance)) //oh dear a problem, put em in deep space
if(prob(failchance))
src.icon_state = "portal1"
do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0)
if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space.
invalid_teleport()
else
do_teleport(M, target, precision) ///You will appear adjacent to the beacon
if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target.
invalid_teleport()
/obj/effect/portal/attackby(obj/item/A, mob/user)
if(istype(A, /obj/item/multitool) && can_multitool_to_remove)
qdel(src)
qdel(src)
/obj/effect/portal/proc/invalid_teleport()
visible_message("<span class='warning'>[src] flickers and fails due to bluespace interference!</span>")
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, loc)
spark_system.start()
qdel(src)
/obj/effect/portal/redspace
name = "redspace portal"
desc = "A portal capable of bypassing bluespace interference."
icon_state = "portal1"
failchance = 0
ignore_tele_proof_area_setting = TRUE
@@ -264,6 +264,7 @@
/obj/effect/spawner/random_spawners/syndicate/loot/level4
name = "armory loot"
spawn_inside = /obj/structure/closet/secure_closet/syndicate/depot/armory
// Loot schema: high-power weapons (m90, esword, ebow, revolver), devices that negate depot challenges (thermal glasses, chameleon device), explosives
result = list(/obj/item/gun/projectile/automatic/c20r = 1,
/obj/item/gun/projectile/automatic/m90 = 1,
@@ -299,10 +300,9 @@
/obj/structure/falsewall/reinforced = 1)
/obj/effect/spawner/random_spawners/syndicate/layout/door/vault
name = "60pc vaultdoor 20pc falsewall 20pc wall"
result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 6,
/turf/simulated/wall/r_wall = 2,
/obj/structure/falsewall/reinforced = 2)
name = "80pc vaultdoor 20pc wall"
result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 4,
/turf/simulated/wall/r_wall = 1)
/obj/effect/spawner/random_spawners/syndicate/layout/spacepod
+20 -3
View File
@@ -29,16 +29,33 @@
visible_message("<span class='danger'>[user] has [pick(W.attack_verb)] [src] with [W]!</span>")
else
visible_message("<span class='danger'>[user] has attacked [src] with [W]!</span>")
var/damage = W.force / 4
if(iswelder(W))
var/obj/item/weldingtool/WT = W
if(WT.remove_fuel(0, user))
damage = 15
playsound(loc, WT.usesound, 100, 1)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
health -= damage
healthcheck()
/obj/structure/spider/attack_animal(mob/living/simple_animal/M)
if(M.melee_damage_upper == 0)
return
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
visible_message("<span class='danger'>\The [M] [M.attacktext] [src]!</span>")
health -= damage
healthcheck()
/obj/structure/spider/attack_alien(mob/living/carbon/alien/humanoid/M)
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] has slashed at [src]!</span>", "<span class='userdanger'>[M] has slashed at [src]!</span>")
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
var/damage = rand(10, 20)
health -= damage
healthcheck()
@@ -7,6 +7,7 @@
origin_tech = "bluespace=1"
var/emagged = 0
var/syndicate = 0
var/area_bypass = FALSE
/obj/item/radio/beacon/New()
..()
+25 -17
View File
@@ -12,7 +12,7 @@ var/list/world_uplinks = list()
var/welcome // Welcoming menu message
var/uses // Numbers of crystals
var/hidden_crystals = 0
var/list/ItemsCategory // List of categories with lists of items
var/list/uplink_items // List of categories with lists of items
var/list/ItemsReference // List of references with an associated item
var/list/nanoui_items // List of items for NanoUI use
var/nanoui_menu = 0 // The current menu we are in
@@ -32,7 +32,7 @@ var/list/world_uplinks = list()
..()
welcome = ticker.mode.uplink_welcome
uses = ticker.mode.uplink_uses
ItemsCategory = get_uplink_items()
uplink_items = get_uplink_items()
world_uplinks += src
@@ -57,14 +57,14 @@ var/list/world_uplinks = list()
dat += "<I>Each item costs a number of telecrystals as indicated by the number following its name.</I><br>"
var/category_items = 1
for(var/category in ItemsCategory)
for(var/category in uplink_items)
if(category_items < 1)
dat += "<i>We apologize, as you could not afford anything from this category.</i><br>"
dat += "<br>"
dat += "<b>[category]</b><br>"
category_items = 0
for(var/datum/uplink_item/I in ItemsCategory[category])
for(var/datum/uplink_item/I in uplink_items[category])
if(I.cost > uses)
continue
if(I.job && I.job.len)
@@ -87,9 +87,9 @@ var/list/world_uplinks = list()
var/list/nano = new
var/list/reference = new
for(var/category in ItemsCategory)
for(var/category in uplink_items)
nano[++nano.len] = list("Category" = category, "items" = list())
for(var/datum/uplink_item/I in ItemsCategory[category])
for(var/datum/uplink_item/I in uplink_items[category])
if(I.job && I.job.len)
if(!(I.job.Find(job)))
continue
@@ -117,6 +117,9 @@ var/list/world_uplinks = list()
if(..())
return 1
if(href_list["refund"])
refund(usr)
if(href_list["buy_item"] == "random")
var/datum/uplink_item/UI = chooseRandomItem()
href_list["buy_item"] = UI.reference
@@ -142,6 +145,22 @@ var/list/world_uplinks = list()
return 1
/obj/item/uplink/proc/refund(mob/user as mob)
var/obj/item/I = user.get_active_hand()
if(I) // Make sure there's actually something in the hand before even bothering to check
for(var/category in uplink_items)
for(var/item in uplink_items[category])
var/datum/uplink_item/UI = item
var/path = UI.refund_path || UI.item
var/cost = UI.refund_amount || UI.cost
if(I.type == path && UI.refundable && I.check_uplink_validity())
uses += cost
used_TC -= cost
to_chat(user, "<span class='notice'>[I] refunded.</span>")
qdel(I)
return
..()
// HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it.
/* How to create an uplink in 3 easy steps!
@@ -287,17 +306,6 @@ var/list/world_uplinks = list()
return 1
return 0
//Refund proc for the borg teleporter (later I'll make a general refund proc if there is demand for it)
/obj/item/radio/uplink/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/antag_spawner/borg_tele))
var/obj/item/antag_spawner/borg_tele/S = W
if(!S.used && !S.checking)
hidden_uplink.uses += S.TC_cost
qdel(S)
to_chat(user, "<span class='notice'>Teleporter refunded.</span>")
else
to_chat(user, "<span class='notice'>This teleporter is already used, or is currently being used.</span>")
// PRESET UPLINKS
// A collection of preset uplinks.
//
@@ -205,6 +205,7 @@
icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "tea_aspera_leaves"
color = "#378C61"
stop_bleeding = 0
heal_brute = 12
+4
View File
@@ -293,6 +293,10 @@
update_icon()
return unwield(user)
/obj/item/twohanded/shockpaddles/on_mob_move(dir, mob/user)
if(defib && !(defib.Adjacent(user)))
defib.remove_paddles(user)
/obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, var/mob/living/carbon/human/M, var/obj/O)
if(!mainunit || !istype(mainunit, /obj/item/defibrillator)) //To avoid weird issues from admin spawns
M.unEquip(O)
@@ -16,7 +16,7 @@
if(imp)
icon_state = "implantcase-[imp.item_color]"
origin_tech = imp.origin_tech
flags = imp.flags
flags = imp.flags & ~DROPDEL
reagents = imp.reagents
else
icon_state = "implantcase-0"
+1 -1
View File
@@ -160,7 +160,7 @@
if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
return//abort
var/mob/living/carbon/C = hit_atom
if(!C.legcuffed)
if(!C.legcuffed && C.get_num_legs() >= 2)
visible_message("<span class='danger'>[src] ensnares [C]!</span>")
C.legcuffed = src
forceMove(C)
+21 -1
View File
@@ -192,7 +192,27 @@ var/list/pipemenu = list(
return
if(world.time < lastused + spawndelay)
return
target.rpd_act(user, src) //Handle RPD effects in separate procs
var/turf/T = get_turf(target)
if(target != T)
// We only check the rpd_act of the target if it isn't the turf, because otherwise
// (A) blocked turfs can be acted on, and (B) unblocked turfs get acted on twice.
if(target.rpd_act(user, src) == TRUE)
// If the object we are clicking on has a valid RPD interaction for just that specific object, do that and nothing else.
// Example: clicking on a pipe with a RPD in rotate mode should rotate that pipe and ignore everything else on the tile.
return
// If we get this far, we have to check every object in the tile, to make sure that none of them block RPD usage on this tile.
// This is done by calling rpd_blocksusage on every /obj in the tile. If any block usage, fail at this point.
for(var/obj/O in T)
if(O.rpd_blocksusage() == TRUE)
to_chat(user, "<span class='warning'>[O] blocks the [src]!</span>")
return
// If we get here, then we're effectively acting on the turf, probably placing a pipe.
T.rpd_act(user, src)
#undef RPD_COOLDOWN_TIME
#undef RPD_WALLBUILD_TIME
@@ -352,6 +352,10 @@
W.fire_act()
return 1
/obj/item/storage/Exited(atom/A, loc)
remove_from_storage(A, loc) //worry not, comrade; this only gets called once
..()
/obj/item/storage/empty_object_contents(burn, loc)
for(var/obj/item/Item in contents)
remove_from_storage(Item, loc, burn)
+42 -17
View File
@@ -1,3 +1,5 @@
#define HEALPERWELD 15
/* Tools!
* Note: Multitools are in devices
*
@@ -407,24 +409,47 @@
to_chat(user, "<span class='warning'>Turn on [src] before attempting repairs!</span>")
return 1
if(S.brute_dam)
if(S.brute_dam < ROBOLIMB_SELF_REPAIR_CAP)
if(get_fuel() >= 1)
if(H == user)
if(!do_mob(user, H, 10))
return 1
if(remove_fuel(1,null))
playsound(src.loc, usesound, 50, 1)
S.heal_damage(15,0,0,1)
user.visible_message("<span class='alert'>\The [user] patches some dents on \the [M]'s [S.name] with \the [src].</span>")
else if(S.open != 2)
to_chat(user, "<span class='warning'>Need more welding fuel!</span>")
return 1
else
to_chat(user, "<span class='danger'>The damage is far too severe to patch over externally.</span>")
return 1
else if(S.open != 2)
if(S.brute_dam > ROBOLIMB_SELF_REPAIR_CAP)
to_chat(user, "<span class='danger'>The damage is far too severe to patch over externally.</span>")
return
if(!S.brute_dam)
to_chat(user, "<span class='notice'>Nothing to fix!</span>")
return
if(get_fuel() >= 1)
if(H == user)
if(!do_mob(user, H, 10))
return 1
if(!remove_fuel(1,null))
to_chat(user, "<span class='warning'>Need more welding fuel!</span>")
var/rembrute = HEALPERWELD
var/nrembrute = 0
var/childlist
if(!isnull(S.children))
childlist = S.children.Copy()
var/parenthealed = FALSE
while(rembrute > 0)
var/obj/item/organ/external/E
if(S.brute_dam)
E = S
else if(LAZYLEN(childlist))
E = pick_n_take(childlist)
if(!E.brute_dam || !E.is_robotic())
continue
else if(S.parent && !parenthealed)
E = S.parent
parenthealed = TRUE
if(!E.brute_dam || !E.is_robotic())
break
else
break
playsound(src.loc, usesound, 50, 1)
nrembrute = max(rembrute - E.brute_dam, 0)
E.heal_damage(rembrute,0,0,1)
rembrute = nrembrute
user.visible_message("<span class='alert'>\The [user] patches some dents on \the [M]'s [E.name] with \the [src].</span>")
return 1
else
return ..()
+3 -4
View File
@@ -71,10 +71,6 @@
SSnanoui.close_uis(src)
return ..()
/obj/rpd_act(mob/user, obj/item/rpd/our_rpd)
var/turf/T = get_turf(src) //This preserves RPD behaviour on specific turfs
T.rpd_act(user, our_rpd)
/obj/proc/process()
set waitfor = 0
processing_objects.Remove(src)
@@ -307,3 +303,6 @@ a {
.["Make speed process"] = "?_src_=vars;makespeedy=[UID()]"
else
.["Make normal process"] = "?_src_=vars;makenormalspeed=[UID()]"
/obj/proc/check_uplink_validity()
return 1
@@ -6,6 +6,8 @@
anchored = 1
health = 200
req_access = list()
var/is_armory = FALSE
var/ignore_use = FALSE
/obj/structure/closet/secure_closet/syndicate/depot/New()
@@ -26,9 +28,12 @@
. = ..()
/obj/structure/closet/secure_closet/syndicate/depot/proc/loot_pickup()
var/area/syndicate_depot/core/depotarea = areaMaster
if(depotarea)
depotarea.locker_looted()
if(!ignore_use)
var/area/syndicate_depot/core/depotarea = areaMaster
if(istype(depotarea))
depotarea.locker_looted()
if(is_armory)
depotarea.armory_locker_looted()
/obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M)
if(isanimal(M) && "syndicate" in M.faction)
@@ -36,10 +41,26 @@
return
return ..(M)
/obj/structure/closet/secure_closet/syndicate/depot/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/rcs))
to_chat(user, "<span class='warning'>Bluespace interference prevents the [W] from locking onto [src]!</span>")
return
return ..()
/obj/structure/closet/secure_closet/syndicate/depot/emp_act(severity)
return
/obj/structure/closet/secure_closet/syndicate/depot/togglelock(mob/user)
. = ..()
if(!locked)
loot_pickup()
loot_pickup()
/obj/structure/closet/secure_closet/syndicate/depot/attack_ghost(mob/user)
if(user.can_advanced_admin_interact())
ignore_use = TRUE
toggle(user)
ignore_use = FALSE
/obj/structure/closet/secure_closet/syndicate/depot/armory
req_access = list(access_syndicate)
is_armory = TRUE
+22 -6
View File
@@ -7,15 +7,24 @@
anchored = 1
max_integrity = 50
var/area/syndicate_depot/core/depotarea
var/has_overloaded = FALSE
/obj/structure/fusionreactor/Initialize()
. = ..()
..()
depotarea = areaMaster
if(depotarea)
if(istype(depotarea))
depotarea.reactor = src
return INITIALIZE_HINT_LATELOAD
/obj/structure/fusionreactor/LateInitialize()
for(var/obj/machinery/porta_turret/syndicate/T in range(50, loc))
if(!istype(T.depotarea))
T.depotarea = depotarea
/obj/structure/fusionreactor/Destroy()
if(depotarea)
if(istype(depotarea))
if(!has_overloaded)
overload(TRUE, TRUE)
depotarea.reactor = null
..()
@@ -30,7 +39,7 @@
healthcheck()
/obj/structure/fusionreactor/proc/healthcheck()
if(obj_integrity <= 0)
if(obj_integrity <= 0 && istype(depotarea))
overload(TRUE)
/obj/structure/fusionreactor/attackby(obj/item/I, mob/user, params)
@@ -47,13 +56,20 @@
else
return ..()
/obj/structure/fusionreactor/proc/overload(containment_failure)
/obj/structure/fusionreactor/proc/overload(containment_failure = FALSE, skip_qdel = FALSE)
if(has_overloaded)
return
has_overloaded = TRUE
if(istype(depotarea) && !depotarea.used_self_destruct)
depotarea.activate_self_destruct("Fusion reactor cracked open. Core loose!", TRUE)
var/obj/effect/overload/O = new /obj/effect/overload(get_turf(src))
if(containment_failure)
playsound(loc, 'sound/machines/Alarm.ogg', 100, 0, 0)
O.deliberate = TRUE
O.max_cycles = 6
qdel(src)
if(!skip_qdel)
qdel(src)
/obj/effect/overload
icon = 'icons/obj/tesla_engine/energy_ball.dmi'
+5
View File
@@ -47,6 +47,11 @@
new /obj/item/stack/sheet/metal(get_turf(src))
qdel(src)
/obj/structure/girder/temperature_expose(datum/gas_mixture/air, exposed_temperature)
var/temp_check = exposed_temperature
if(temp_check >= GIRDER_MELTING_TEMP)
take_damage(10)
/obj/structure/girder/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
if(isscrewdriver(W))