Revert "Revert "Merge branch 'master' into robotic-limbs-PT2""
This reverts commit 27a099c6bf.
This commit is contained in:
@@ -25,41 +25,32 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/binoculars/proc/on_wield(obj/item/source, mob/user)
|
||||
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/unwield)
|
||||
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_walk)
|
||||
RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, .proc/rotate)
|
||||
listeningTo = user
|
||||
user.visible_message("<span class='notice'>[user] holds [src] up to [user.p_their()] eyes.</span>", "<span class='notice'>You hold [src] up to your eyes.</span>")
|
||||
item_state = "binoculars_wielded"
|
||||
user.regenerate_icons()
|
||||
if(!user?.client)
|
||||
return
|
||||
var/client/C = user.client
|
||||
var/_x = 0
|
||||
var/_y = 0
|
||||
switch(user.dir)
|
||||
if(NORTH)
|
||||
_y = zoom_amt
|
||||
if(EAST)
|
||||
_x = zoom_amt
|
||||
if(SOUTH)
|
||||
_y = -zoom_amt
|
||||
if(WEST)
|
||||
_x = -zoom_amt
|
||||
C.change_view(world.view + zoom_out_amt)
|
||||
C.pixel_x = world.icon_size*_x
|
||||
C.pixel_y = world.icon_size*_y
|
||||
user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, user.dir)
|
||||
|
||||
/obj/item/binoculars/proc/rotate(atom/thing, old_dir, new_dir)
|
||||
if(ismob(thing))
|
||||
var/mob/lad = thing
|
||||
lad.regenerate_icons()
|
||||
lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir)
|
||||
|
||||
/obj/item/binoculars/proc/on_walk()
|
||||
attack_self(listeningTo) //Yes I have sinned, why do you ask?
|
||||
|
||||
/obj/item/binoculars/proc/on_unwield(obj/item/source, mob/user)
|
||||
unwield(user)
|
||||
|
||||
/obj/item/binoculars/proc/unwield(mob/user)
|
||||
if(listeningTo)
|
||||
UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
|
||||
UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
|
||||
UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE)
|
||||
listeningTo = null
|
||||
user.visible_message("<span class='notice'>[user] lowers [src].</span>", "<span class='notice'>You lower [src].</span>")
|
||||
item_state = "binoculars"
|
||||
user.regenerate_icons()
|
||||
if(user && user.client)
|
||||
user.regenerate_icons()
|
||||
var/client/C = user.client
|
||||
C.change_view(CONFIG_GET(string/default_view))
|
||||
user.client.pixel_x = 0
|
||||
user.client.pixel_y = 0
|
||||
user.client.view_size.zoomIn()
|
||||
|
||||
@@ -366,6 +366,11 @@
|
||||
flashlight_power = 0.8
|
||||
custom_price = PRICE_CHEAP
|
||||
|
||||
/obj/item/flashlight/lantern/heirloom_moth
|
||||
name = "old lantern"
|
||||
desc = "An old lantern that has seen plenty of use."
|
||||
light_range = 4
|
||||
|
||||
/obj/item/flashlight/lantern/jade
|
||||
name = "jade lantern"
|
||||
desc = "An ornate, green lantern."
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
var/starting_tape_type = /obj/item/tape/random
|
||||
var/open_panel = 0
|
||||
var/canprint = 1
|
||||
|
||||
var/list/icons_available = list()
|
||||
var/icon_directory = 'icons/radials/taperecorder.dmi'
|
||||
|
||||
/obj/item/taperecorder/Initialize(mapload)
|
||||
. = ..()
|
||||
@@ -32,6 +33,29 @@
|
||||
. = ..()
|
||||
. += "The wire panel is [open_panel ? "opened" : "closed"]."
|
||||
|
||||
/obj/item/taperecorder/AltClick(mob/user)
|
||||
. = ..()
|
||||
play()
|
||||
|
||||
/obj/item/taperecorder/proc/update_available_icons()
|
||||
icons_available = list()
|
||||
|
||||
if(recording)
|
||||
icons_available += list("Stop Recording" = image(icon = icon_directory, icon_state = "record_stop"))
|
||||
else
|
||||
if(!playing)
|
||||
icons_available += list("Record" = image(icon = icon_directory, icon_state = "record"))
|
||||
|
||||
if(playing)
|
||||
icons_available += list("Pause" = image(icon = icon_directory, icon_state = "pause"))
|
||||
else
|
||||
if(!recording)
|
||||
icons_available += list("Play" = image(icon = icon_directory, icon_state = "play"))
|
||||
|
||||
if(canprint && !recording && !playing)
|
||||
icons_available += list("Print Transcript" = image(icon = icon_directory, icon_state = "print"))
|
||||
if(mytape)
|
||||
icons_available += list("Eject" = image(icon = icon_directory, icon_state = "eject"))
|
||||
|
||||
/obj/item/taperecorder/attackby(obj/item/I, mob/user, params)
|
||||
if(!mytape && istype(I, /obj/item/tape))
|
||||
@@ -69,7 +93,6 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/item/taperecorder/verb/ejectverb()
|
||||
set name = "Eject Tape"
|
||||
set category = "Object"
|
||||
@@ -81,7 +104,6 @@
|
||||
|
||||
eject(usr)
|
||||
|
||||
|
||||
/obj/item/taperecorder/update_icon_state()
|
||||
if(!mytape)
|
||||
icon_state = "taperecorder_empty"
|
||||
@@ -92,7 +114,6 @@
|
||||
else
|
||||
icon_state = "taperecorder_idle"
|
||||
|
||||
|
||||
/obj/item/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source)
|
||||
. = ..()
|
||||
if(mytape && recording)
|
||||
@@ -193,13 +214,31 @@
|
||||
|
||||
|
||||
/obj/item/taperecorder/attack_self(mob/user)
|
||||
if(!mytape || mytape.ruined)
|
||||
if(!mytape)
|
||||
to_chat(user, "<span class='notice'>The [src] does not have a tape inside.</span>")
|
||||
return
|
||||
if(mytape.ruined)
|
||||
to_chat(user, "<span class='notice'>The tape inside the [src] appears to be broken.</span>")
|
||||
return
|
||||
if(recording)
|
||||
stop()
|
||||
else
|
||||
record()
|
||||
|
||||
update_available_icons()
|
||||
if(icons_available)
|
||||
var/selection = show_radial_menu(user, src, icons_available, radius = 38, require_near = TRUE, tooltips = TRUE)
|
||||
if(!selection)
|
||||
return
|
||||
switch(selection)
|
||||
if("Pause")
|
||||
stop()
|
||||
if("Stop Recording") // yes we actually need 2 seperate stops for the same proc- Hopek
|
||||
stop()
|
||||
if("Record")
|
||||
record()
|
||||
if("Play")
|
||||
play()
|
||||
if("Print Transcript")
|
||||
print_transcript()
|
||||
if("Eject")
|
||||
eject(user)
|
||||
|
||||
/obj/item/taperecorder/verb/print_transcript()
|
||||
set name = "Print Transcript"
|
||||
|
||||
@@ -40,11 +40,11 @@
|
||||
//What does the implant do upon injection?
|
||||
//return 1 if the implant injects
|
||||
//return 0 if there is no room for implant / it fails
|
||||
/obj/item/implant/proc/implant(mob/living/target, mob/user, silent = FALSE)
|
||||
/obj/item/implant/proc/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE)
|
||||
if(SEND_SIGNAL(src, COMSIG_IMPLANT_IMPLANTING, args) & COMPONENT_STOP_IMPLANTING)
|
||||
return
|
||||
LAZYINITLIST(target.implants)
|
||||
if(!target.can_be_implanted() || !can_be_implanted_in(target))
|
||||
if(!force && (!target.can_be_implanted() || !can_be_implanted_in(target)))
|
||||
return FALSE
|
||||
for(var/X in target.implants)
|
||||
var/obj/item/implant/imp_e = X
|
||||
|
||||
@@ -40,17 +40,80 @@
|
||||
|
||||
/obj/item/implant/warp
|
||||
name = "warp implant"
|
||||
desc = "Saves your position somewhere, and then warps you back to it after five seconds."
|
||||
desc = "Warps you to where you were 10 seconds before when activated."
|
||||
icon_state = "warp"
|
||||
uses = 15
|
||||
uses = -1
|
||||
var/total_delay = 10 SECONDS
|
||||
var/cooldown = 10 SECONDS
|
||||
var/last_use = 0
|
||||
var/list/positions = list()
|
||||
var/next_prune = 0
|
||||
|
||||
/obj/item/implant/warp/Destroy()
|
||||
positions = null
|
||||
return ..()
|
||||
|
||||
/obj/item/implant/warp/implant(mob/living/target, mob/user, silent, force)
|
||||
. = ..()
|
||||
if(.)
|
||||
update_position()
|
||||
RegisterSignal(imp_in, COMSIG_MOVABLE_MOVED, .proc/update_position)
|
||||
|
||||
/obj/item/implant/warp/removed(mob/living/source, silent, special)
|
||||
. = ..()
|
||||
clear_positions()
|
||||
|
||||
/obj/item/implant/warp/proc/update_position(datum/source)
|
||||
if(!isatom(imp_in.loc))
|
||||
return
|
||||
positions[num2text(world.time)] = imp_in.loc
|
||||
if(!((++next_prune) % 10))
|
||||
prune()
|
||||
|
||||
/obj/item/implant/warp/proc/clear_positions()
|
||||
positions = list()
|
||||
|
||||
/obj/item/implant/warp/proc/get_tele_position()
|
||||
prune()
|
||||
return positions[positions[1]]
|
||||
|
||||
/obj/item/implant/warp/proc/do_teleport_effects()
|
||||
var/safety = 100
|
||||
var/list/done = list()
|
||||
var/time
|
||||
var/turf/target
|
||||
for(var/i in 1 to positions.len)
|
||||
if(!--safety)
|
||||
break
|
||||
time = positions[i]
|
||||
target = positions[time]
|
||||
if(done[target])
|
||||
continue
|
||||
done[target] = TRUE
|
||||
if(!istype(target))
|
||||
continue
|
||||
new /obj/effect/temp_visual/dir_setting/ninja(target)
|
||||
|
||||
/obj/item/implant/warp/activate()
|
||||
. = ..()
|
||||
uses--
|
||||
imp_in.do_adrenaline(20, TRUE, 0, 0, TRUE, list(/datum/reagent/fermi/eigenstate = 1.2), "<span class='boldnotice'>You feel an internal prick as as the bluespace starts ramping up!</span>")
|
||||
to_chat(imp_in, "<span class='notice'>You feel an internal prick as as the bluespace starts ramping up!</span>")
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
if(last_use + cooldown > world.time)
|
||||
to_chat(imp_in, "<span class=warning'>[src] is still recharging!</span>")
|
||||
return
|
||||
last_use = world.time
|
||||
prune()
|
||||
do_teleport_effects() //first.
|
||||
do_teleport(imp_in, get_tele_position(), 0, TRUE, null, null, null, null, null, TELEPORT_CHANNEL_QUANTUM, TRUE)
|
||||
|
||||
/obj/item/implant/warp/proc/prune()
|
||||
var/minimum_time = world.time - total_delay
|
||||
var/remove = 0
|
||||
for(var/i in 1 to length(positions))
|
||||
if(text2num(positions[i]) < minimum_time)
|
||||
remove++
|
||||
else
|
||||
break
|
||||
if(remove)
|
||||
positions.Cut(1, remove + 1)
|
||||
|
||||
/obj/item/implanter/warp
|
||||
name = "implanter (warp)"
|
||||
|
||||
@@ -165,6 +165,30 @@
|
||||
throwforce = 15
|
||||
bayonet = TRUE
|
||||
|
||||
/obj/item/kitchen/knife/combat/survival/knuckledagger
|
||||
name = "survival dagger"
|
||||
icon_state = "glaive-dagger"
|
||||
desc = "An enhanced hunting grade survival dagger, with a bright light and a handguard that makes it better for efficient butchery."
|
||||
actions_types = list(/datum/action/item_action/toggle_light)
|
||||
var/light_on = FALSE
|
||||
var/brightness_on = 7
|
||||
|
||||
/obj/item/kitchen/knife/combat/survival/knuckledagger/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/butchering, 50, 120, 5) // it's good for butchering stuff
|
||||
|
||||
/obj/item/kitchen/knife/combat/survival/knuckledagger/ui_action_click(mob/user, actiontype)
|
||||
light_on = !light_on
|
||||
playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
|
||||
update_brightness(user)
|
||||
update_icon()
|
||||
|
||||
/obj/item/kitchen/knife/combat/survival/knuckledagger/proc/update_brightness(mob/user = null)
|
||||
if(light_on)
|
||||
set_light(brightness_on)
|
||||
else
|
||||
set_light(0)
|
||||
|
||||
/obj/item/kitchen/knife/combat/bone
|
||||
name = "bone dagger"
|
||||
item_state = "bone_dagger"
|
||||
@@ -222,10 +246,10 @@
|
||||
/* Trays moved to /obj/item/storage/bag */
|
||||
|
||||
/obj/item/kitchen/knife/scimitar
|
||||
name = "Scimitar knife"
|
||||
name = "scimitar knife"
|
||||
desc = "A knife used to cleanly butcher. Its razor-sharp edge has been honed for butchering, but has been poorly maintained over the years."
|
||||
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/kitchen/knife/scimiar/Initialize()
|
||||
/obj/item/kitchen/knife/scimitar/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/butchering, 90 - force, 100, force - 60) //bonus chance increases depending on force
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
msg = "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows: <span class='bold'>Item request received. Your package is inbound, please stand back from the landing site.</span> Message ends.\""
|
||||
to_chat(M, msg)
|
||||
|
||||
new /obj/effect/abstract/DPtarget(get_turf(src), pod)
|
||||
new /obj/effect/pod_landingzone(get_turf(src), pod)
|
||||
|
||||
/obj/item/choice_beacon/ingredients
|
||||
name = "ingredient box delivery beacon"
|
||||
|
||||
@@ -199,4 +199,12 @@
|
||||
|
||||
/obj/item/pinpointer/shuttle/Destroy()
|
||||
shuttleport = null
|
||||
. = ..()
|
||||
. = ..()
|
||||
|
||||
/obj/item/pinpointer/ian
|
||||
name = "ian pinpointer"
|
||||
desc = "A handheld tracking device that locates Ian. Made with real corgis!"
|
||||
icon_state = "pinpointer_ian"
|
||||
|
||||
/obj/item/pinpointer/ian/scan_for_target()
|
||||
target = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
/obj/item/stack/tile/carpet/arcade
|
||||
name = "arcade carpet"
|
||||
icon_state = "tile-carpet-arcade"
|
||||
turf_type = /turf/open/floor
|
||||
turf_type = /turf/open/floor/carpet/arcade
|
||||
tableVariant = null
|
||||
|
||||
/obj/item/stack/tile/carpet/blackred
|
||||
|
||||
@@ -37,6 +37,9 @@
|
||||
icon_state = "crowbar_clock"
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/crowbar/brass/family
|
||||
toolspeed = 1
|
||||
|
||||
/obj/item/crowbar/bronze
|
||||
name = "bronze plated crowbar"
|
||||
desc = "A bronze plated crowbar."
|
||||
|
||||
@@ -89,6 +89,9 @@
|
||||
toolspeed = 0.5
|
||||
random_color = FALSE
|
||||
|
||||
/obj/item/screwdriver/brass/family
|
||||
toolspeed = 1
|
||||
|
||||
/obj/item/screwdriver/bronze
|
||||
name = "bronze screwdriver"
|
||||
desc = "A screwdriver plated with bronze."
|
||||
|
||||
@@ -69,6 +69,9 @@
|
||||
random_color = FALSE
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/wirecutters/brass/family
|
||||
toolspeed = 1
|
||||
|
||||
/obj/item/wirecutters/bronze
|
||||
name = "bronze plated wirecutters"
|
||||
desc = "A pair of wirecutters plated with bronze."
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
icon_state = "wrench_clock"
|
||||
toolspeed = 0.5
|
||||
|
||||
/obj/item/wrench/brass/family
|
||||
toolspeed = 1
|
||||
|
||||
/obj/item/wrench/bronze
|
||||
name = "bronze plated wrench"
|
||||
desc = "A bronze plated wrench."
|
||||
|
||||
Reference in New Issue
Block a user