Merge remote-tracking branch 'citadel/master' into combat_rework_experimental

This commit is contained in:
silicons
2020-10-10 22:23:22 -07:00
215 changed files with 7532 additions and 2391 deletions
+16 -25
View File
@@ -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()
+6 -6
View File
@@ -4,7 +4,7 @@
/obj/item/defibrillator
name = "defibrillator"
desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients."
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/defibrillators.dmi'
icon_state = "defibunit"
item_state = "defibunit"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
@@ -23,8 +23,8 @@
var/obj/item/stock_parts/cell/cell
var/combat = FALSE //can we revive through space suits?
var/grab_ghost = FALSE // Do we pull the ghost back into their body?
var/healdisk = FALSE // Will we shock people dragging the body?
var/pullshocksafely = FALSE //Dose the unit have the healdisk upgrade?
var/healdisk = FALSE // Does the unit have the healdisk upgrade?
var/pullshocksafely = FALSE // Will we shock people dragging the body?
var/primetime = 0 // is the defib faster
var/timedeath = 10
var/disarm_shock_time = 10
@@ -261,7 +261,7 @@
/obj/item/shockpaddles
name = "defibrillator paddles"
desc = "A pair of plastic-gripped paddles with flat metal surfaces that are used to deliver powerful electric shocks."
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/defibrillators.dmi'
icon_state = "defibpaddles0"
item_state = "defibpaddles0"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
@@ -682,7 +682,7 @@
/obj/item/shockpaddles/cyborg
name = "cyborg defibrillator paddles"
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/defibrillators.dmi'
icon_state = "defibpaddles0"
item_state = "defibpaddles0"
req_defib = FALSE
@@ -703,7 +703,7 @@
name = "syndicate defibrillator paddles"
desc = "A pair of paddles used to revive deceased operatives. It possesses both the ability to penetrate armor and to deliver powerful shocks offensively."
combat = TRUE
icon = 'icons/obj/items_and_weapons.dmi'
icon = 'icons/obj/defibrillators.dmi'
icon_state = "defibpaddles0"
item_state = "defibpaddles0"
req_defib = FALSE
@@ -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"
+2 -2
View File
@@ -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)"
+82 -12
View File
@@ -190,12 +190,53 @@
/obj/item/melee/transforming/energy/sword/saber
possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER)
unique_reskin = list("Sword" = "sword0", "saber" = "esaber0")
var/hacked = FALSE
var/saber = FALSE
/obj/item/melee/transforming/energy/sword/saber/set_sword_color()
if(LAZYLEN(possible_colors))
/obj/item/melee/transforming/energy/sword/saber/transform_weapon(mob/living/user, supress_message_text)
. = ..()
if(.)
if(active)
if(sword_color)
if(saber)
icon_state = "esaber[sword_color]"
else
icon_state = "sword[sword_color]"
else
if(saber)
icon_state = "esaber0"
else
icon_state = "sword0"
/obj/item/melee/transforming/energy/sword/saber/reskin_obj(mob/M)
. = ..()
if(icon_state == "esaber0")
saber = TRUE
if(active)
if(saber)
icon_state = "esaber[sword_color]"
else
icon_state = "sword[sword_color]"
/obj/item/melee/transforming/energy/sword/saber/set_sword_color(var/color_forced)
if(color_forced) // wow i really do not like this at fucking all holy SHIT
if(color_forced == "red")
sword_color = "red"
light_color = LIGHT_COLOR_RED
else if(color_forced == "blue")
sword_color = "blue"
light_color = LIGHT_COLOR_LIGHT_CYAN
else if(color_forced == "green")
sword_color = "green"
light_color = LIGHT_COLOR_GREEN
else if(color_forced == "purple")
sword_color = "purple"
light_color = LIGHT_COLOR_LAVENDER
else if(LAZYLEN(possible_colors))
sword_color = pick(possible_colors)
light_color = possible_colors[sword_color]
return
/obj/item/melee/transforming/energy/sword/saber/process()
. = ..()
@@ -204,30 +245,59 @@
light_color = possible_colors[set_color]
update_light()
/obj/item/melee/transforming/energy/sword/saber/red
possible_colors = list("red" = LIGHT_COLOR_RED)
/obj/item/melee/transforming/energy/sword/saber/red/Initialize(mapload)
. = ..()
set_sword_color("red")
/obj/item/melee/transforming/energy/sword/saber/blue
possible_colors = list("blue" = LIGHT_COLOR_LIGHT_CYAN)
/obj/item/melee/transforming/energy/sword/saber/blue/Initialize(mapload)
. = ..()
set_sword_color("blue")
/obj/item/melee/transforming/energy/sword/saber/green
possible_colors = list("green" = LIGHT_COLOR_GREEN)
/obj/item/melee/transforming/energy/sword/saber/green/Initialize(mapload)
. = ..()
set_sword_color("green")
/obj/item/melee/transforming/energy/sword/saber/purple
possible_colors = list("purple" = LIGHT_COLOR_LAVENDER)
/obj/item/melee/transforming/energy/sword/saber/purple/Initialize(mapload)
. = ..()
set_sword_color("purple")
/obj/item/melee/transforming/energy/sword/saber/proc/select_sword_color(mob/user) /// this is for the radial
if(!istype(user) || user.incapacitated())
return
var/static/list/options = list(
"red" = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "swordred-blade"),
"blue" = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "swordblue-blade"),
"green" = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "swordgreen-blade"),
"purple" = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "swordpurple-blade")
)
var/choice = show_radial_menu(user, src, options, custom_check = FALSE, radius = 36, require_near = TRUE)
if(src && choice && !user.incapacitated() && in_range(user,src))
set_sword_color(choice)
to_chat(user, "<span class='notice'>[src] is now [choice].</span>")
/obj/item/melee/transforming/energy/sword/saber/attackby(obj/item/W, mob/living/user, params)
if(istype(W, /obj/item/multitool))
if(user.a_intent == INTENT_DISARM)
if(!active)
to_chat(user, "<span class='warning'>COLOR_SET</span>")
hacked = FALSE
select_sword_color(user)
return
else
to_chat(user, "<span class='notice'>Turn it off first - getting that close to an active sword is not a great idea.</span>")
return
if(!hacked)
hacked = TRUE
sword_color = "rainbow"
to_chat(user, "<span class='warning'>RNBW_ENGAGE</span>")
if(active)
icon_state = "swordrainbow"
user.update_inv_hands()
else
to_chat(user, "<span class='warning'>It's already fabulous!</span>")
to_chat(user, "<span class='warning'>It's already fabulous!</span> <span class='notice'>If you wanted to reset the color, though, try a disarming intent while it's off.</span>")
else
return ..()
+1 -1
View File
@@ -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"
+9 -1
View File
@@ -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
+1 -1
View File
@@ -234,7 +234,7 @@
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.max_combined_w_class = 100
STR.max_items = 100
STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/seeds, /obj/item/grown, /obj/item/reagent_containers/honeycomb))
STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/seeds, /obj/item/grown, /obj/item/reagent_containers/honeycomb, /obj/item/disk/plantgene))
////////
+25
View File
@@ -830,3 +830,28 @@
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 2
STR.max_w_class = WEIGHT_CLASS_BULKY + WEIGHT_CLASS_NORMAL //katana and waki.
/obj/item/storage/belt/plant
name = "botanical belt"
desc = "A belt used to hold most hydroponics supplies. Suprisingly, not green."
icon_state = "plantbelt"
item_state = "plantbelt"
content_overlays = TRUE
/obj/item/storage/belt/plant/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 6
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.can_hold = typecacheof(list(
/obj/item/reagent_containers/spray/plantbgone,
/obj/item/plant_analyzer,
/obj/item/seeds,
/obj/item/reagent_containers/glass/bottle,
/obj/item/reagent_containers/glass/beaker,
/obj/item/cultivator,
/obj/item/reagent_containers/spray/pestspray,
/obj/item/hatchet,
/obj/item/shovel/spade,
/obj/item/gun/energy/floragun
))
+3
View File
@@ -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."
+3
View File
@@ -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."