Merge branch 'master' into more-contractor-stuff

This commit is contained in:
Joshie
2020-04-10 00:20:36 +10:00
15 changed files with 179 additions and 82 deletions

View File

@@ -269,9 +269,9 @@
// At this point in client Click() code we have passed the 1/10 sec check and little else
// We don't even know if it's a middle click
if(!usr.canClick())
return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1
return TRUE
if(use_check_and_message(usr, USE_ALLOW_NON_ADJACENT|USE_ALLOW_NON_ADV_TOOL_USR)) //You're always adjacent to your inventory in practice.
return TRUE
switch(name)
if(BP_R_HAND)
if(iscarbon(usr))

View File

@@ -61,6 +61,7 @@
"Anomalist" = /datum/outfit/job/scientist/hephaestus,
"Roboticist" = /datum/outfit/job/roboticist/hephaestus,
"Shaft Miner" = /datum/outfit/job/mining/hephaestus,
"Drill Technician" = /datum/outfit/job/mining/drill/hephaestus,
"Quartermaster" = /datum/outfit/job/qm/hephaestus,
"Cargo Technician" = /datum/outfit/job/cargo_tech/hephaestus,
"Corporate Liaison" = /datum/outfit/job/representative/hephaestus
@@ -91,6 +92,11 @@
uniform = /obj/item/clothing/under/rank/hephaestus/tech
id = /obj/item/card/id/hephaestus
/datum/outfit/job/mining/drill/hephaestus
name = "Drill Technician - Hephaestus"
uniform = /obj/item/clothing/under/rank/hephaestus/tech
id = /obj/item/card/id/hephaestus
/datum/outfit/job/qm/hephaestus
name = "Quartermaster - Hephaestus"
uniform = /obj/item/clothing/under/rank/hephaestus/tech

View File

@@ -424,7 +424,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/MouseDrop(obj/over_object as obj, src_location, over_location)
var/mob/M = usr
if((!istype(over_object, /obj/screen)) && !use_check(M))
if(!istype(over_object, /obj/screen) && !use_check(M) && !(over_object == src))
return attack_self(M)
/obj/item/device/pda/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)

View File

@@ -1,8 +1,8 @@
var/global/list/datum/stack_recipe/rod_recipes = list(
new /datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("floor-mounted catwalk", /obj/structure/lattice/catwalk/indoor, 4, time = 10, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("grate, dark", /obj/structure/lattice/catwalk/indoor/grate, 4, time = 10, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("grate, light", /obj/structure/lattice/catwalk/indoor/grate/light, 4, time = 10, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("grate, dark", /obj/structure/lattice/catwalk/indoor/grate, 1, time = 10, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("grate, light", /obj/structure/lattice/catwalk/indoor/grate/light, 1, time = 10, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("mine track", /obj/structure/track, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("cane", /obj/item/cane, 1, time = 6),
new /datum/stack_recipe("crowbar", /obj/item/crowbar, 1, time = 6),

View File

@@ -153,13 +153,12 @@ Implant Specifics:<BR>"}
desc = "A military grade micro bio-explosive. Highly dangerous."
var/elevel = "Localized Limb"
var/phrase
var/fallback_phrase = "supercalifragilisticexpialidocious"
var/setup_done = FALSE //Have we set this yet?
icon_state = "implant_evil"
/obj/item/implant/explosive/Initialize()
. = ..()
fallback_phrase = pick(adjectives)
phrase = "You are [pick(adjectives)]"
/obj/item/implant/explosive/get_data()
. = {"
@@ -179,12 +178,10 @@ Implant Specifics:<BR>"}
if(implanter.imp)
to_chat(user, SPAN_NOTICE("\The [implanter] already has an implant loaded."))
return // It's full.
if(!phrase)
var/choice = alert("\The [src]'s default phrase has not been changed. Continue?", "Ready for Implantation?", "Yes", "Cancel")
if(!setup_done)
var/choice = alert("\The [src]'s default settings have not been changed. Continue?", "Ready for Implantation?", "Yes", "Cancel")
if(choice == "Cancel")
return
else
phrase = fallback_phrase
to_chat(user, "<B>You load \the [src] into \the [I]. The current setting is \"[elevel]\" and the current phrase is \"[phrase]\".</B>")
user.drop_from_inventory(src)
forceMove(implanter)
@@ -272,8 +269,6 @@ Implant Specifics:<BR>"}
SSexplosives.queue(data)
/obj/item/implant/explosive/implanted(mob/source, mob/user)
if(!phrase)
phrase = fallback_phrase
if(user.mind)
user.mind.store_memory("\The [src] in [source] can be activated by saying something containing the phrase ''[phrase]'', <B>say [phrase]</B> to attempt to activate.", 0, 0)
to_chat(usr, "\The [src] in [source] can be activated by saying something containing the phrase ''[phrase]'', <B>say [phrase]</B> to attempt to activate.")
@@ -284,8 +279,6 @@ Implant Specifics:<BR>"}
phrase = input("Choose activation phrase:") as text
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
phrase = replace_characters(phrase, replacechars)
if(!phrase)
phrase = fallback_phrase
user.mind.store_memory("\The [src] can be activated by saying something containing the phrase ''[phrase]'', <B>say [phrase]</B> to attempt to activate.", 0, 0)
to_chat(user, "\The [src] can be activated by saying something containing the phrase ''[phrase]'', <B>say [phrase]</B> to attempt to activate.")
setup_done = TRUE

View File

@@ -52,29 +52,29 @@
QDEL_NULL(closer)
return ..()
/obj/item/storage/MouseDrop(obj/over_object as obj)
/obj/item/storage/MouseDrop(obj/over_object)
if(!canremove)
return
if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
if(!over_object || over_object == src)
return
if(istype(over_object, /obj/screen/inventory))
var/obj/screen/inventory/S = over_object
if(S.slot_id == src.equip_slot)
return
if(ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
if(over_object == usr && Adjacent(usr)) // this must come before the screen objects only block
src.open(usr)
return
if (!( istype(over_object, /obj/screen) ))
if(!(istype(over_object, /obj/screen)))
return ..()
//makes sure that the storage is equipped, so that we can't drag it into our hand from miles away.
//there's got to be a better way of doing this.
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
if(!(src.loc == usr) || (src.loc && src.loc.loc == usr))
return
if (( usr.restrained() ) || ( usr.stat ))
if(use_check_and_message(usr))
return
if ((src.loc == usr) && !usr.unEquip(src))
if((src.loc == usr) && !usr.unEquip(src))
return
switch(over_object.name)
@@ -86,7 +86,6 @@
usr.put_in_l_hand(src,FALSE)
src.add_fingerprint(usr)
/obj/item/storage/proc/return_inv()
. = contents.Copy()

View File

@@ -66,6 +66,7 @@
icon_state = "catwalk"
smooth = TRUE
canSmoothWith = null
var/return_amount = 3
// Special catwalk that can be placed on regular flooring.
/obj/structure/lattice/catwalk/indoor
@@ -80,7 +81,9 @@
if (do_after(user, 5/C.toolspeed, act_target = src) && WT.remove_fuel(1, user))
to_chat(user, "<span class='notice'>You slice apart [src].</span>")
playsound(src, 'sound/items/Welder.ogg', 50, 1)
new /obj/item/stack/rods{amount = 3}(loc)
var/obj/item/stack/rods/R = new /obj/item/stack/rods(get_turf(src))
R.amount = return_amount
R.update_icon()
qdel(src)
/obj/structure/lattice/catwalk/indoor/attackby(obj/item/C, mob/user)
@@ -104,6 +107,7 @@
desc = "A metal grate."
icon = 'icons/obj/grate.dmi'
icon_state = "grate_dark"
return_amount = 1
smooth = null
var/base_icon_state = "grate_dark"
var/damaged = FALSE
@@ -122,6 +126,7 @@
/obj/structure/lattice/catwalk/indoor/grate/light
icon_state = "grate_light"
base_icon_state = "grate_light"
return_amount = 1
/obj/structure/lattice/catwalk/indoor/grate/light/old
icon_state = "grate_light_old"

View File

@@ -40,22 +40,26 @@
return ..()
/obj/item/clothing/MouseDrop(var/obj/over_object)
if (ishuman(usr) || issmall(usr))
if(ishuman(usr) || issmall(usr))
//makes sure that the clothing is equipped so that we can't drag it into our hand from miles away.
if (!(src.loc == usr))
if(!(src.loc == usr))
return
if(!over_object)
if(!over_object || over_object == src)
return
if (( usr.restrained() ) || ( usr.stat ))
if(istype(over_object, /obj/screen/inventory))
var/obj/screen/inventory/S = over_object
if(S.slot_id == src.equip_slot)
return
if(use_check_and_message(usr))
return
if (!usr.canUnEquip(src))
if(!usr.canUnEquip(src))
return
var/obj/item/clothing/C = src
usr.unEquip(C)
switch(over_object.name)

View File

@@ -240,7 +240,6 @@
if(ispath(installed_barrel.projectile_type, /obj/item/projectile/kinetic))
var/obj/item/projectile/kinetic/shot_projectile = new installed_barrel.projectile_type(get_turf(src))
new installed_barrel.projectile_type(get_turf(src))
shot_projectile.damage = damage_increase
shot_projectile.range = range_increase
shot_projectile.aoe = aoe_increase

View File

@@ -18,20 +18,6 @@
/obj/item/projectile/kinetic/mech/burst
damage = 25
/obj/item/projectile/kinetic/Collide(var/atom/A)
var/turf/target_turf = get_turf(A)
if(!target_turf)
target_turf = get_turf(src)
if(istype(target_turf))
var/datum/gas_mixture/environment = target_turf.return_air()
damage *= max(1 - (environment.return_pressure()/100)*0.75,0)
if(isliving(A)) //Never do more than 50 damage to a living being per shot.
damage = min(damage, 50)
if(istype(target_turf, /turf/simulated/mineral))
var/turf/simulated/mineral/M = target_turf
M.kinetic_hit(base_damage, dir)
. = ..()
/obj/item/projectile/kinetic/on_impact(var/atom/A)
var/turf/target_turf = get_turf(A)
if(!target_turf)
@@ -40,6 +26,19 @@
aoe_shot = TRUE
strike_thing(A)
/obj/item/projectile/kinetic/proc/do_damage(var/atom/A)
var/turf/target_turf = get_turf(A)
if(!target_turf)
target_turf = get_turf(src)
if(istype(target_turf))
var/datum/gas_mixture/environment = target_turf.return_air()
damage *= max(1 - (environment.return_pressure() / 100) * 0.75, 0)
if(isliving(A)) //Never do more than 50 damage to a living being per shot.
damage = min(damage, 50)
if(istype(target_turf, /turf/simulated/mineral))
var/turf/simulated/mineral/M = target_turf
M.kinetic_hit(base_damage, dir)
/obj/item/projectile/kinetic/proc/strike_thing(atom/target)
var/turf/target_turf = get_turf(target)
@@ -50,7 +49,10 @@
new /obj/effect/overlay/temp/kinetic_blast(target_turf)
for(var/new_target in orange(aoe, target_turf))
damage = max(base_damage - base_damage * get_dist(new_target, target_turf) * 0.25, 0)
new /obj/effect/overlay/temp/kinetic_blast(get_turf(new_target))
src.Collide(new_target)
var/obj/item/projectile/kinetic/spread = new /obj/item/projectile/kinetic
spread.aoe_shot = TRUE
spread.damage = max(base_damage - base_damage * get_dist(new_target, target_turf) * 0.25, 0)
spread.do_damage(new_target)
spread.Collide(new_target)
CHECK_TICK

View File

@@ -18,6 +18,8 @@
var/list/supports = list()
var/supported = FALSE
var/active = FALSE
var/current_error
var/list/resource_field = list()
var/ore_types = list(
@@ -153,6 +155,7 @@
else
active = FALSE
need_player_check = TRUE
system_error("Resource field depleted.")
update_icon()
/obj/machinery/mining/drill/examine(mob/user)
@@ -163,9 +166,12 @@
to_chat(user, "The drill is [active ? "active" : "inactive"] and the cell panel is [panel_open ? "open" : "closed"].")
if(panel_open)
to_chat(user, "The power cell is [cell ? "installed" : "missing"].")
to_chat(user, "The cell charge meter reads [cell ? round(cell.percent(),1) : 0]%")
if(attached_satchel && user.Adjacent(src))
to_chat(user, FONT_SMALL(SPAN_NOTICE("It has a [attached_satchel] attached to it.")))
to_chat(user, "The cell charge meter reads [cell ? round(cell.percent(),1) : 0]%.")
if(user.Adjacent(src))
if(attached_satchel)
to_chat(user, FONT_SMALL(SPAN_NOTICE("It has a [attached_satchel] attached to it.")))
if(current_error)
to_chat(user, FONT_SMALL(SPAN_WARNING("The error display reads \"[current_error]\".")))
return
/obj/machinery/mining/drill/proc/activate_light(var/lights = DRILL_LIGHT_IDLE)
@@ -206,16 +212,22 @@
user.drop_from_inventory(S, src)
attached_satchel = S
to_chat(user, SPAN_NOTICE("You attach \the [S] to \the [src]."))
for(var/obj/item/ore/ore in src) // takes ore currently in the drill and beams it away
attached_satchel.insert_into_storage(ore)
return
if(O.iswrench())
if(!attached_satchel)
to_chat(user, SPAN_WARNING("\The [src] doesn't have a satchel attached to it!"))
return
attached_satchel.forceMove(get_turf(user))
user.put_in_hands(attached_satchel)
to_chat(user, SPAN_NOTICE("You detach \the [attached_satchel]."))
attached_satchel = null
user.visible_message(SPAN_NOTICE("\The [user] starts detaching \the [attached_satchel]."), SPAN_NOTICE("You start detaching \the [attached_satchel]."))
if(do_after(user, 30, TRUE, src))
if(!attached_satchel)
return
attached_satchel.forceMove(get_turf(user))
user.put_in_hands(attached_satchel)
user.visible_message(SPAN_NOTICE("\The [user] detaches \the [attached_satchel]."), SPAN_NOTICE("You detach \the [attached_satchel]."))
attached_satchel = null
return
if(O.iscrowbar())
@@ -256,6 +268,7 @@
if(need_player_check)
to_chat(user, SPAN_NOTICE("You hit the manual override and reset the drill's error checking."))
current_error = null
need_player_check = FALSE
if(anchored)
get_resource_field()
@@ -324,7 +337,7 @@
..()
harvest_speed = 0
capacity = 0
charge_use = 50
charge_use = 25
for(var/obj/item/stock_parts/P in component_parts)
if(ismicrolaser(P))
@@ -332,7 +345,7 @@
else if(ismatterbin(P))
capacity = 200 * P.rating
else if(iscapacitor(P))
charge_use -= 10 * P.rating
charge_use -= 5 * P.rating
cell = locate(/obj/item/cell) in component_parts
/obj/machinery/mining/drill/proc/check_supports()
@@ -352,35 +365,30 @@
/obj/machinery/mining/drill/proc/system_error(var/error)
if(error)
visible_message(SPAN_WARNING("\icon[src] [src.name] flashes a system warning: [error]"))
visible_message(SPAN_WARNING("\icon[src] <b>[capitalize_first_letters(src.name)]</b> flashes a system warning: \"[error]\"."))
current_error = error
playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 100, 1)
need_player_check = TRUE
active = FALSE
update_icon()
/obj/machinery/mining/drill/proc/get_resource_field()
resource_field = list()
need_update_field = FALSE
var/turf/T = get_turf(src)
if(!istype(T))
if(!istype(T))
return
var/tx = T.x - 2
var/ty = T.y - 2
var/turf/mine_turf
for(var/iy = 0,iy < 5, iy++)
for(var/ix = 0, ix < 5, ix++)
mine_turf = locate(tx + ix, ty + iy, T.z)
if(mine_turf && mine_turf.has_resources)
resource_field += mine_turf
for(var/turf/mine_turf in block(locate(src.x + 2, src.y + 2, src.z), locate(src.x - 2, src.y - 2, src.z)))
if(mine_turf?.has_resources)
resource_field += mine_turf
if(!length(resource_field))
system_error("Resources depleted.")
/obj/machinery/mining/drill/proc/use_cell_power()
if(!cell)
if(!cell)
return FALSE
if(cell.charge >= charge_use)
cell.use(charge_use)
@@ -403,7 +411,7 @@
else
for(var/obj/item/ore/O in contents)
O.forceMove(get_turf(src))
to_chat(usr, SPAN_NOTICE("You spill the contents of \the [src]'s storage box all over the ground"))
to_chat(usr, SPAN_NOTICE("You spill the contents of \the [src]'s storage box all over the ground."))
/obj/machinery/mining/brace
@@ -472,6 +480,11 @@
playsound(get_turf(src), W.usesound, 100, 1)
to_chat(user, SPAN_NOTICE("You [anchored ? "un" : ""]anchor the brace."))
for(var/angle in cardinal) // make it face any drill in cardinal direction from it
if(locate(/obj/machinery/mining/drill) in get_step(src, angle))
src.dir = angle
break
anchored = !anchored
if(anchored)
connect()
@@ -508,4 +521,4 @@
connected.supports -= src
connected.check_supports()
connected = null
connected = null

View File

@@ -258,10 +258,11 @@
return
/obj/item/gripper/no_use/loader //This is used to disallow building with metal.
name = "sheet loader"
desc = "A specialized loading device, designed to pick up and insert sheets of materials inside machines."
name = "sheet holder"
desc = "A specialized holding device, designed to hold sheets of material or tiling."
icon_state = "gripper-sheet"
can_hold = list(
/obj/item/stack/material
/obj/item/stack/material,
/obj/item/stack/tile
)

View File

@@ -79,9 +79,14 @@
T.resources["phoron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
T.resources["osmium"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX)
T.resources["hydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX)
T.resources["iron"] = 0
T.resources["gold"] = 0
T.resources["silver"] = 0
if(prob(40)) // A medium chance for these useful mats to appear in very small quantities
T.resources["iron"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
T.resources["gold"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
T.resources["silver"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX)
else
T.resources["iron"] = 0
T.resources["gold"] = 0
T.resources["silver"] = 0
return
/datum/random_map/noise/ore/get_map_char(var/value)