Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into upstream-merge-27442

This commit is contained in:
LetterJay
2017-05-24 08:06:53 -05:00
271 changed files with 4311 additions and 3609 deletions
+11 -6
View File
@@ -419,13 +419,18 @@
set desc="Restarts the world immediately"
if (!usr.client.holder)
return
var/confirm = alert("Restart the game world?", "Restart", "Yes", "Cancel")
if(confirm == "Cancel")
return
if(confirm == "Yes")
SSticker.delay_end = 0
var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)")
var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options
if(result)
SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
switch(result)
if("Regular Restart")
SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10)
if("Hard Restart (No Delay, No Feeback Reason)")
world.Reboot()
if("Hardest Restart (No actions, just reboot)")
world.Reboot(fast_track = TRUE)
/datum/admins/proc/end_round()
set category = "Server"
+2 -2
View File
@@ -60,7 +60,7 @@
message_admins("[key_name_admin(ghost)] has taken control of ([key_name_admin(body)])")
body.ghostize(0)
body.key = ghost.key
new /obj/effect/overlay/temp/gravpush(get_turf(body))
new /obj/effect/temp_visual/gravpush(get_turf(body))
/obj/effect/fun_balloon/sentience/emergency_shuttle
name = "shuttle sentience fun balloon"
@@ -79,7 +79,7 @@
/obj/effect/fun_balloon/scatter/effect()
for(var/mob/living/M in range(effect_range, get_turf(src)))
var/turf/T = find_safe_turf()
new /obj/effect/overlay/temp/gravpush(get_turf(M))
new /obj/effect/temp_visual/gravpush(get_turf(M))
M.forceMove(T)
to_chat(M, "<span class='notice'>Pop!</span>")
+1 -1
View File
@@ -442,7 +442,7 @@
dat += "</table>"
for(var/datum/gang/G in SSticker.mode.gangs)
dat += "<br><table cellspacing=5><tr><td><B>[G.name] Gang: <a href='?_src_=holder;gangpoints=\ref[G]'>[G.points] Influence</a> | [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control</B></td><td></td></tr>"
dat += "<br><table cellspacing=5><tr><td><B>[G.name] Gang: [round((G.territory.len/GLOB.start_state.num_territories)*100, 1)]% Control</B></td><td></td></tr>"
for(var/datum/mind/N in G.bosses)
var/mob/M = N.current
if(!M)
+34 -40
View File
@@ -282,6 +282,11 @@
message_admins("<span class='adminnotice'>[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds.</span>")
href_list["secrets"] = "check_antagonist"
else if(href_list["trigger_centcom_recall"])
if(!check_rights(R_ADMIN))
return
usr.client.trigger_centcom_recall()
else if(href_list["toggle_continuous"])
if(!check_rights(R_ADMIN))
return
@@ -1170,7 +1175,7 @@
if(!check_rights(R_ADMIN))
return
if(SSticker.HasRoundStarted())
if(SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
var/dat = {"<B>What mode do you wish to play?</B><HR>"}
for(var/mode in config.modes)
@@ -1184,7 +1189,7 @@
if(!check_rights(R_ADMIN))
return
if(SSticker.HasRoundStarted())
if(SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
if(GLOB.master_mode != "secret")
return alert(usr, "The game mode has to be secret!", null, null, null, null)
@@ -1199,21 +1204,21 @@
if(!check_rights(R_ADMIN|R_SERVER))
return
if (SSticker.HasRoundStarted())
if (SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
GLOB.master_mode = href_list["c_mode2"]
log_admin("[key_name(usr)] set the mode as [GLOB.master_mode].")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] set the mode as [GLOB.master_mode].</span>")
to_chat(world, "<span class='adminnotice'><b>The mode is now: [GLOB.master_mode]</b></span>")
Game() // updates the main game menu
world.save_mode(GLOB.master_mode)
SSticker.save_mode(GLOB.master_mode)
.(href, list("c_mode"=1))
else if(href_list["f_secret2"])
if(!check_rights(R_ADMIN|R_SERVER))
return
if(SSticker.HasRoundStarted())
if(SSticker.HasRoundStarted())
return alert(usr, "The game has already started.", null, null, null, null)
if(GLOB.master_mode != "secret")
return alert(usr, "The game mode has to be secret!", null, null, null, null)
@@ -1511,17 +1516,6 @@
usr.client.cmd_admin_animalize(M)
else if(href_list["gangpoints"])
var/datum/gang/G = locate(href_list["gangpoints"]) in SSticker.mode.gangs
if(G)
var/newpoints = input("Set [G.name ] Gang's influence.","Set Influence",G.points) as null|num
if(!newpoints)
return
message_admins("[key_name_admin(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].</span>")
log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].</span>")
G.points = newpoints
G.message_gangtools("Your gang now has [G.points] influence.")
else if(href_list["adminplayeropts"])
var/mob/M = locate(href_list["adminplayeropts"])
show_player_panel(M)
@@ -1799,18 +1793,18 @@
if(!check_rights(R_ADMIN))
return
var/mob/M = locate(href_list["languagemenu"]) in GLOB.mob_list
if(!ismob(M))
to_chat(usr, "This can only be used on instances of type /mob.")
var/mob/M = locate(href_list["languagemenu"]) in GLOB.mob_list
if(!ismob(M))
to_chat(usr, "This can only be used on instances of type /mob.")
return
var/datum/language_holder/H = M.get_language_holder()
H.open_language_menu(usr)
var/datum/language_holder/H = M.get_language_holder()
H.open_language_menu(usr)
else if(href_list["traitor"])
if(!check_rights(R_ADMIN))
return
if(!SSticker.HasRoundStarted())
if(!SSticker.HasRoundStarted())
alert("The game hasn't started yet!")
return
@@ -2161,7 +2155,7 @@
else if(href_list["kick_all_from_lobby"])
if(!check_rights(R_ADMIN))
return
if(SSticker.IsRoundInProgress())
if(SSticker.IsRoundInProgress())
var/afkonly = text2num(href_list["afkonly"])
if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes")
to_chat(usr, "Kick clients from lobby aborted")
@@ -2242,20 +2236,20 @@
if(href_list["viewruntime_backto"])
error_viewer.show_to(owner, locate(href_list["viewruntime_backto"]), href_list["viewruntime_linear"])
else
error_viewer.show_to(owner, null, href_list["viewruntime_linear"])
else if(href_list["showrelatedacc"])
var/client/C = locate(href_list["client"]) in GLOB.clients
var/list/thing_to_check
if(href_list["showrelatedacc"] == "cid")
thing_to_check = C.related_accounts_cid
else
thing_to_check = C.related_accounts_ip
thing_to_check = splittext(thing_to_check, ", ")
var/dat = "Related accounts by [uppertext(href_list["showrelatedacc"])]:<br>"
for(var/thing in thing_to_check)
dat += "[thing]<br>"
usr << browse(dat, "size=420x300")
error_viewer.show_to(owner, null, href_list["viewruntime_linear"])
else if(href_list["showrelatedacc"])
var/client/C = locate(href_list["client"]) in GLOB.clients
var/list/thing_to_check
if(href_list["showrelatedacc"] == "cid")
thing_to_check = C.related_accounts_cid
else
thing_to_check = C.related_accounts_ip
thing_to_check = splittext(thing_to_check, ", ")
var/dat = "Related accounts by [uppertext(href_list["showrelatedacc"])]:<br>"
for(var/thing in thing_to_check)
dat += "[thing]<br>"
usr << browse(dat, "size=420x300")
+1 -4
View File
@@ -52,10 +52,7 @@
if(!check_rights(R_SOUNDS))
return
if(SSticker)
SSticker.round_end_sound = fcopy_rsc(S)
else
return
SSticker.SetRoundEndSound(S)
log_admin("[key_name(src)] set the round end sound to [S]")
message_admins("[key_name_admin(src)] set the round end sound to [S]")
+13
View File
@@ -1194,3 +1194,16 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
message_admins(msg)
admin_ticket_log(target, msg)
log_admin("[key_name(usr)] punished [key_name(target)] with [punishment].")
/client/proc/trigger_centcom_recall()
if(!holder)
return
var/message = pick(GLOB.admiral_messages)
message = input("Enter message from the on-call admiral to be put in the recall report.", "Admiral Message", message) as text|null
if(!message)
return
message_admins("[key_name_admin(usr)] triggered a Centcom recall, with the admiral message of: [message]")
log_game("[key_name(usr)] triggered a Centcom recall, with the message of: [message]")
+2 -2
View File
@@ -172,11 +172,11 @@
/obj/item/device/assembly/flash/cyborg/attack(mob/living/M, mob/user)
..()
new /obj/effect/overlay/temp/borgflash(get_turf(src))
new /obj/effect/temp_visual/borgflash(get_turf(src))
/obj/item/device/assembly/flash/cyborg/attack_self(mob/user)
..()
new /obj/effect/overlay/temp/borgflash(get_turf(src))
new /obj/effect/temp_visual/borgflash(get_turf(src))
/obj/item/device/assembly/flash/cyborg/attackby(obj/item/weapon/W, mob/user, params)
return
@@ -19,7 +19,7 @@
/obj/machinery/meter/Initialize(mapload)
. = ..()
SSair.atmos_machinery += src
if (mapload && !target)
if (!target)
target = locate(/obj/machinery/atmospherics/pipe) in loc
/obj/machinery/meter/Destroy()
@@ -433,7 +433,7 @@
/obj/item/projectile/beam/ctf/red
icon_state = "laser"
impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
// BLUE TEAM GUNS
@@ -448,7 +448,7 @@
/obj/item/projectile/beam/ctf/blue
icon_state = "bluelaser"
impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
/datum/outfit/ctf
name = "CTF"
+4
View File
@@ -672,3 +672,7 @@ GLOBAL_LIST(external_rsc_urls)
CRASH("change_view called without argument.")
view = new_size
/client/proc/AnnouncePR(announcement)
if(prefs && prefs.chat_toggles & CHAT_PULLR)
to_chat(src, announcement)
+2
View File
@@ -271,6 +271,8 @@ BLIND // can't see anything
/obj/item/clothing/head
name = "head"
icon = 'icons/obj/clothing/hats.dmi'
icon_state = "top_hat"
item_state = "that"
body_parts_covered = HEAD
slot_flags = SLOT_HEAD
var/blockTracking = 0 //For AI tracking
+29 -16
View File
@@ -7,25 +7,34 @@
actions_types = list(/datum/action/item_action/toggle_mode)
origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3"
var/mode = 0 //0 - regular mesons mode 1 - t-ray mode
mode = FALSE //FALSE - regular mesons mode TRUE - t-ray mode
var/range = 1
/obj/item/clothing/glasses/meson/engine/attack_self(mob/user)
/obj/item/clothing/glasses/meson/engine/toggle_mode(mob/user, voluntary)
var/turf/T = get_turf(src)
if(T && T.z == ZLEVEL_MINING && mode)
if(picked_excuse)
to_chat(user, "<span class='warning'>Due to [picked_excuse], the [name] cannot currently be swapped to \[Meson] mode.</span>")
return
mode = !mode
if(mode)
START_PROCESSING(SSobj, src)
vision_flags = 0
darkness_view = 2
invis_view = SEE_INVISIBLE_LIVING
lighting_alpha = null
to_chat(user, "<span class='notice'>You toggle the goggles' scanning mode to \[T-Ray].</span>")
if(voluntary)
to_chat(user, "<span class='notice'>You toggle the goggles' scanning mode to \[T-Ray].</span>")
else
to_chat(user, "<span class='warning'>The goggles abruptly toggle to \[T-Ray] mode!</span>")
else
STOP_PROCESSING(SSobj, src)
vision_flags = SEE_TURFS
darkness_view = 1
lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
to_chat(loc, "<span class='notice'>You toggle the goggles' scanning mode to \[Meson].</span>")
if(voluntary)
to_chat(user, "<span class='notice'>You toggle the goggles' scanning mode to \[Meson].</span>")
else
to_chat(user, "<span class='warning'>The goggles abruptly toggle to \[Meson] mode!</span>")
if(ishuman(user))
var/mob/living/carbon/human/H = user
@@ -37,8 +46,14 @@
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/clothing/glasses/meson/engine/attack_self(mob/user)
toggle_mode(user, TRUE)
/obj/item/clothing/glasses/meson/engine/process()
if(!mode)
var/turf/T = get_turf(src)
if(T && T.z == ZLEVEL_MINING)
toggle_mode(loc)
return
if(!ishuman(loc))
@@ -47,7 +62,6 @@
var/mob/living/carbon/human/user = loc
if(user.glasses != src)
return
scan()
/obj/item/clothing/glasses/meson/engine/proc/scan()
@@ -89,13 +103,17 @@
icon_state = "trayson-tray_off"
origin_tech = "materials=3;magnets=2;engineering=2"
mode = 1
var/on = 0
mode = TRUE
var/on = FALSE
vision_flags = 0
darkness_view = 2
invis_view = SEE_INVISIBLE_LIVING
range = 2
/obj/item/clothing/glasses/meson/engine/tray/Initialize()
. = ..()
picked_excuse = null
/obj/item/clothing/glasses/meson/engine/tray/process()
if(!on)
return
@@ -108,15 +126,10 @@
if(user.glasses == src)
user.update_inv_glasses()
/obj/item/clothing/glasses/meson/engine/tray/attack_self(mob/user)
/obj/item/clothing/glasses/meson/engine/tray/toggle_mode(mob/user, voluntary)
on = !on
if(on)
START_PROCESSING(SSobj, src)
to_chat(user, "<span class='notice'>You turn the goggles on.</span>")
else
STOP_PROCESSING(SSobj, src)
to_chat(user, "<span class='notice'>You turn the goggles off.</span>")
to_chat(user, "<span class='[voluntary ? "notice":"warning"]'>[voluntary ? "You turn the goggles":"The goggles turn"] [on ? "on":"off"][voluntary ? ".":"!"]</span>")
update_icon()
for(var/X in actions)
+49 -3
View File
@@ -31,14 +31,60 @@
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions."
icon_state = "meson"
item_state = "meson"
origin_tech = "magnets=1;engineering=2"
darkness_view = 2
vision_flags = SEE_TURFS
lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/lightgreen
var/static/list/meson_mining_failure_excuses = list("seismic activity", "excessive lava", "ambient radiation", "electromagnetic storms", "bluespace disruption", \
"gravity", "dust", "dense rock", "ash", "badly understood science", "radiant heat")
var/picked_excuse
var/mode = FALSE //if FALSE, is in normal meson mode.
/obj/item/clothing/glasses/meson/Initialize()
. = ..()
picked_excuse = pick(meson_mining_failure_excuses)
START_PROCESSING(SSobj, src)
/obj/item/clothing/glasses/meson/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/glasses/meson/examine(mob/user)
..()
var/turf/T = get_turf(src)
if(T && T.z == ZLEVEL_MINING && mode && picked_excuse)
to_chat(user, "<span class='warning'>Due to [picked_excuse], these Meson Scanners will not be able to display terrain layouts in this area.</span>")
/obj/item/clothing/glasses/meson/proc/toggle_mode(mob/user)
if(vision_flags & SEE_TURFS)
mode = TRUE
vision_flags &= ~SEE_TURFS
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(picked_excuse)
to_chat(H, "<span class='warning'>Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.</span>")
if(H.glasses == src)
H.update_sight()
else if(!(vision_flags & SEE_TURFS))
mode = FALSE
vision_flags |= SEE_TURFS
if(ishuman(user))
var/mob/living/carbon/human/H = user
to_chat(H, "<span class='notice'>Your Meson Scanners have reactivated.</span>")
if(H.glasses == src)
H.update_sight()
/obj/item/clothing/glasses/meson/process()
var/turf/T = get_turf(src)
if(T && T.z == ZLEVEL_MINING)
if(!mode)
toggle_mode(loc)
else if(mode)
toggle_mode(loc)
/obj/item/clothing/glasses/meson/night
name = "Night Vision Optical Meson Scanner"
@@ -47,7 +93,7 @@
item_state = "nvgmeson"
origin_tech = "magnets=4;engineering=5;plasmatech=4"
darkness_view = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
/obj/item/clothing/glasses/meson/gar
+6 -6
View File
@@ -14,14 +14,14 @@
/obj/item/clothing/suit/armor/vest
name = "armor vest"
desc = "A slim armored vest that protects against most types of damage."
desc = "A slim Type I armored vest that provides decent protection against most types of damage."
icon_state = "armoralt"
item_state = "armoralt"
blood_overlay_type = "armor"
dog_fashion = /datum/dog_fashion/back
/obj/item/clothing/suit/armor/vest/alt
desc = "An armored vest that protects against most types of damage."
desc = "A Type I armored vest that provides decent protection against most types of damage."
icon_state = "armor"
item_state = "armor"
@@ -31,7 +31,7 @@
/obj/item/clothing/suit/armor/hos
name = "armored greatcoat"
desc = "A greatcoat enchanced with a special alloy for some protection and style for those with a commanding presence."
desc = "A greatcoat enhanced with a special alloy for some extra protection and style for those with a commanding presence."
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
@@ -77,7 +77,7 @@
/obj/item/clothing/suit/armor/vest/capcarapace
name = "captain's carapace"
desc = "An armored vest reinforced with ceramic plates and pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples."
desc = "An fireproof armored chestpiece reinforced with ceramic plates and plasteel pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples."
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = CHEST|GROIN
@@ -93,7 +93,7 @@
/obj/item/clothing/suit/armor/riot
name = "riot suit"
desc = "A suit of armor with heavy padding to protect against melee attacks."
desc = "A suit of semi-flexible polycarbonate body armor with heavy padding to protect against melee attacks."
icon_state = "riot"
item_state = "swat_suit"
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -115,7 +115,7 @@
/obj/item/clothing/suit/armor/bulletproof
name = "bulletproof armor"
desc = "A bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
desc = "A Type III heavy bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "bulletproof"
item_state = "armor"
blood_overlay_type = "armor"
@@ -211,6 +211,14 @@
item_state = "black_suit_fem"
item_color = "black_suit_fem"
/obj/item/clothing/under/suit_jacket/green
name = "green suit"
desc = "A green suit and yellow necktie. Baller."
icon_state = "green_suit"
item_state = "dg_suit"
item_color = "green_suit"
can_adjust = 0
/obj/item/clothing/under/suit_jacket/red
name = "red suit"
desc = "A red suit and blue tie. Somewhat formal."
-5
View File
@@ -28,7 +28,6 @@
var/square_depth_up = 0
var/square_depth_down = 0
//Processing
var/requires_processing = FALSE
var/process_inner_turfs = FALSE //Don't do this unless it's absolutely necessary
var/process_edge_turfs = FALSE //Don't do this either unless it's absolutely necessary, you can just track what things are inside manually or on the initial setup.
var/setup_edge_turfs = FALSE //Setup edge turfs/all field turfs. Set either or both to ON when you need it, it's defaulting to off unless you do to save CPU.
@@ -40,11 +39,7 @@
var/list/turf/field_turfs_new = list()
var/list/turf/edge_turfs_new = list()
/datum/proximity_monitor/advanced/New()
SSfields.register_new_field(src)
/datum/proximity_monitor/advanced/Destroy()
SSfields.unregister_field(src)
full_cleanup()
return ..()
+5 -1
View File
@@ -3,7 +3,6 @@
//Only use square radius for this!
/datum/proximity_monitor/advanced/peaceborg_dampener
name = "\improper Hyperkinetic Dampener Field"
requires_processing = TRUE
setup_edge_turfs = TRUE
setup_field_turfs = TRUE
field_shape = FIELD_SHAPE_RADIUS_SQUARE
@@ -22,10 +21,15 @@
use_host_turf = TRUE
/datum/proximity_monitor/advanced/peaceborg_dampener/New()
START_PROCESSING(SSfields, src)
tracked = list()
staging = list()
..()
/datum/proximity_monitor/advanced/peaceborg_dampener/Destroy()
STOP_PROCESSING(SSfields, src)
return ..()
/datum/proximity_monitor/advanced/peaceborg_dampener/process()
if(!istype(projector))
qdel(src)
+1 -1
View File
@@ -125,7 +125,7 @@
/datum/language_holder/synthetic
languages = list(/datum/language/common)
shadow_languages = list(/datum/language/machine, /datum/language/draconic)
shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic)
/datum/language_holder/universal/New()
..()
+2 -2
View File
@@ -270,7 +270,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
if(5)
dat += "<H3>Upload a New Title</H3>"
if(!scanner)
findscanner(9)
scanner = findscanner(9)
if(!scanner)
dat += "<FONT color=red>No scanner found within wireless network range.</FONT><BR>"
else if(!scanner.cache)
@@ -314,7 +314,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
popup.open()
/obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange)
for(var/obj/machinery/libraryscanner/S in range(viewrange))
for(var/obj/machinery/libraryscanner/S in range(viewrange, get_turf(src)))
return S
return null
+114 -145
View File
@@ -169,7 +169,7 @@
icon = 'icons/obj/mining.dmi'
icon_state = "resonator"
item_state = "resonator"
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vacuum."
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It's more effective in a vacuum."
w_class = WEIGHT_CLASS_NORMAL
force = 15
throwforce = 10
@@ -188,18 +188,6 @@
fieldlimit = 6
quick_burst_mod = 1
/obj/item/weapon/resonator/proc/CreateResonance(target, creator)
var/turf/T = get_turf(target)
var/obj/effect/resonance/R = locate(/obj/effect/resonance) in T
if(R)
R.resonance_damage *= quick_burst_mod
R.burst()
return
if(fields.len < fieldlimit)
playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
var/obj/effect/resonance/RE = new(T, creator, burst_time, src)
fields += RE
/obj/item/weapon/resonator/attack_self(mob/user)
if(burst_time == 50)
burst_time = 30
@@ -208,57 +196,76 @@
burst_time = 50
to_chat(user, "<span class='info'>You set the resonator's fields to detonate after 5 seconds.</span>")
/obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
if(!check_allowed_items(target, 1))
return
/obj/item/weapon/resonator/proc/CreateResonance(target, mob/user)
var/turf/T = get_turf(target)
var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in T
if(R)
R.damage_multiplier = quick_burst_mod
R.burst()
return
if(LAZYLEN(fields) < fieldlimit)
new /obj/effect/temp_visual/resonance(T, user, src, burst_time)
user.changeNext_move(CLICK_CD_MELEE)
CreateResonance(target, user)
/obj/effect/resonance
/obj/item/weapon/resonator/pre_attackby(atom/target, mob/user, params)
if(check_allowed_items(target, 1))
CreateResonance(target, user)
return TRUE
/obj/effect/temp_visual/resonance
name = "resonance field"
desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures. More damaging in low pressure environments."
icon = 'icons/effects/effects.dmi'
icon_state = "shield1"
layer = ABOVE_ALL_MOB_LAYER
anchored = TRUE
mouse_opacity = 0
duration = 50
var/resonance_damage = 20
var/damage_multiplier = 1
var/creator
var/obj/item/weapon/resonator/res
/obj/effect/resonance/New(loc, set_creator, timetoburst, set_resonator)
..()
/obj/effect/temp_visual/resonance/Initialize(mapload, set_creator, set_resonator, set_duration)
duration = set_duration
. = ..()
creator = set_creator
res = set_resonator
check_pressure()
addtimer(CALLBACK(src, .proc/burst), timetoburst)
if(res)
res.fields += src
playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
transform = matrix()*0.75
animate(src, transform = matrix()*1.5, time = duration)
deltimer(timerid)
timerid = addtimer(CALLBACK(src, .proc/burst), duration, TIMER_STOPPABLE)
/obj/effect/resonance/Destroy()
/obj/effect/temp_visual/resonance/Destroy()
if(res)
res.fields -= src
res = null
creator = null
. = ..()
/obj/effect/resonance/proc/check_pressure()
var/turf/proj_turf = get_turf(src)
/obj/effect/temp_visual/resonance/proc/check_pressure(turf/proj_turf)
if(!proj_turf)
proj_turf = get_turf(src)
if(!istype(proj_turf))
return
var/datum/gas_mixture/environment = proj_turf.return_air()
var/pressure = environment.return_pressure()
resonance_damage = initial(resonance_damage)
if(pressure < 50)
name = "strong [initial(name)]"
resonance_damage = 60
resonance_damage *= 3
else
name = initial(name)
resonance_damage = initial(resonance_damage)
resonance_damage *= damage_multiplier
/obj/effect/resonance/proc/burst()
check_pressure()
/obj/effect/temp_visual/resonance/proc/burst()
var/turf/T = get_turf(src)
playsound(src,'sound/weapons/resonator_blast.ogg',50,1)
new /obj/effect/temp_visual/resonance_crush(T)
if(ismineralturf(T))
var/turf/closed/mineral/M = T
M.gets_drilled(creator)
check_pressure(T)
playsound(T,'sound/weapons/resonator_blast.ogg',50,1)
for(var/mob/living/L in T)
if(creator)
add_logs(creator, L, "used a resonator field on", "resonator")
@@ -266,6 +273,16 @@
L.apply_damage(resonance_damage, BRUTE)
qdel(src)
/obj/effect/temp_visual/resonance_crush
icon_state = "shield1"
layer = ABOVE_ALL_MOB_LAYER
duration = 4
/obj/effect/temp_visual/resonance_crush/Initialize()
. = ..()
transform = matrix()*1.5
animate(src, transform = matrix()*0.1, alpha = 50, time = 4)
/**********************Facehugger toy**********************/
/obj/item/clothing/mask/facehugger/toy
@@ -345,28 +362,23 @@
/**********************Mining Scanners**********************/
/obj/item/device/mining_scanner
desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
name = "manual mining scanner"
icon_state = "mining1"
item_state = "analyzer"
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 0
var/cooldown = 35
var/current_cooldown = 0
origin_tech = "engineering=1;magnets=1"
/obj/item/device/mining_scanner/attack_self(mob/user)
if(!user.client)
return
if(!cooldown)
cooldown = TRUE
addtimer(CALLBACK(src, .proc/clear_cooldown), 40)
var/list/mobs = list()
mobs |= user
mineral_scan_pulse(mobs, get_turf(user))
/obj/item/device/mining_scanner/proc/clear_cooldown()
cooldown = FALSE
if(current_cooldown <= world.time)
current_cooldown = world.time + cooldown
mineral_scan_pulse(get_turf(user))
//Debug item to identify all ore spread quickly
@@ -379,7 +391,7 @@
qdel(src)
/obj/item/device/t_scanner/adv_mining_scanner
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results. This one has an extended range."
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. This one has an extended range."
name = "advanced automatic mining scanner"
icon_state = "mining0"
item_state = "analyzer"
@@ -387,77 +399,47 @@
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 35
var/on_cooldown = 0
var/current_cooldown = 0
var/range = 7
var/meson = TRUE
origin_tech = "engineering=3;magnets=3"
/obj/item/device/t_scanner/adv_mining_scanner/material
meson = FALSE
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results. This one has an extended range."
/obj/item/device/t_scanner/adv_mining_scanner/lesser
name = "automatic mining scanner"
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results."
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations."
range = 4
cooldown = 50
/obj/item/device/t_scanner/adv_mining_scanner/lesser/material
desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
meson = FALSE
/obj/item/device/t_scanner/adv_mining_scanner/scan()
if(!on_cooldown)
on_cooldown = 1
spawn(cooldown)
on_cooldown = 0
if(current_cooldown <= world.time)
current_cooldown = world.time + cooldown
var/turf/t = get_turf(src)
var/list/mobs = recursive_mob_check(t, 1,0,0)
if(!mobs.len)
return
if(meson)
mineral_scan_pulse(mobs, t, range)
else
mineral_scan_pulse_material(mobs, t, range)
mineral_scan_pulse(t, range)
//For use with mesons
/proc/mineral_scan_pulse(list/mobs, turf/T, range = world.view)
/proc/mineral_scan_pulse(turf/T, range = world.view)
var/list/minerals = list()
for(var/turf/closed/mineral/M in range(range, T))
if(M.scan_state)
minerals += M
if(minerals.len)
for(var/mob/user in mobs)
if(user.client)
var/client/C = user.client
for(var/turf/closed/mineral/M in minerals)
var/turf/F = get_turf(M)
var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = FLASH_LAYER)
I.plane = FULLSCREEN_PLANE
C.images += I
spawn(30)
if(C)
C.images -= I
//For use with material scanners
/proc/mineral_scan_pulse_material(list/mobs, turf/T, range = world.view)
var/list/minerals = list()
for(var/turf/closed/mineral/M in range(range, T))
if(M.scan_state)
minerals += M
if(minerals.len)
if(LAZYLEN(minerals))
for(var/turf/closed/mineral/M in minerals)
var/obj/effect/overlay/temp/mining_overlay/C = new /obj/effect/overlay/temp/mining_overlay(M)
var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M
if(oldC)
qdel(oldC)
var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M)
C.icon_state = M.scan_state
/obj/effect/overlay/temp/mining_overlay
/obj/effect/temp_visual/mining_overlay
plane = FULLSCREEN_PLANE
layer = FLASH_LAYER
icon = 'icons/turf/smoothrocks.dmi'
anchored = 1
mouse_opacity = 0
duration = 30
pixel_x = -4
pixel_y = -4
icon = 'icons/effects/ore_visuals.dmi'
appearance_flags = 0 //to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are
duration = 35
pixel_x = -224
pixel_y = -224
/obj/effect/temp_visual/mining_overlay/Initialize()
. = ..()
animate(src, alpha = 0, time = duration, easing = EASE_IN)
/**********************Xeno Warning Sign**********************/
@@ -510,79 +492,66 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
sharpness = IS_SHARP
var/charged = 1
var/charge_time = 16
var/atom/mark = null
var/mutable_appearance/marked_underlay
var/charged = TRUE
var/charge_time = 14
/obj/item/projectile/destabilizer
name = "destabilizing force"
icon_state = "pulse1"
nodamage = TRUE
damage = 0 //We're just here to mark people. This is still a melee weapon.
damage_type = BRUTE
flag = "bomb"
range = 6
var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced = null
log_override = TRUE
var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced
/obj/item/projectile/destabilizer/Destroy()
hammer_synced = null
return ..()
/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0)
if(hammer_synced)
if(hammer_synced.mark == target)
return ..()
if(isliving(target))
if(hammer_synced.mark && hammer_synced.marked_underlay)
hammer_synced.mark.underlays -= hammer_synced.marked_underlay
hammer_synced.marked_underlay = null
var/mob/living/L = target
if(L.mob_size >= MOB_SIZE_LARGE)
hammer_synced.mark = L
hammer_synced.marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2")
hammer_synced.marked_underlay.pixel_x = -L.pixel_x
hammer_synced.marked_underlay.pixel_y = -L.pixel_y
L.underlays += hammer_synced.marked_underlay
var/target_turf = get_turf(target)
if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
new /obj/effect/overlay/temp/kinetic_blast(M)
M.gets_drilled(firer)
if(isliving(target))
var/mob/living/L = target
var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK)
CM.hammer_synced = hammer_synced
var/target_turf = get_turf(target)
if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
new /obj/effect/temp_visual/kinetic_blast(M)
M.gets_drilled(firer)
..()
/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag)
if(!proximity_flag && charged)//Mark a target, or mine a tile.
var/turf/proj_turf = get_turf(src)
var/turf/proj_turf = user.loc
if(!isturf(proj_turf))
return
var/datum/gas_mixture/environment = proj_turf.return_air()
var/pressure = environment.return_pressure()
if(pressure > 50)
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
return
var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(user.loc)
D.preparePixelProjectile(target,get_turf(target), user)
var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
D.preparePixelProjectile(target, get_turf(target), user)
D.hammer_synced = src
playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
D.fire()
charged = 0
charged = FALSE
icon_state = "mining_hammer1_uncharged"
addtimer(CALLBACK(src, .proc/Recharge), charge_time)
return
if(proximity_flag && target == mark && isliving(target))
if(proximity_flag && isliving(target))
var/mob/living/L = target
new /obj/effect/overlay/temp/kinetic_blast(get_turf(L))
mark = 0
if(L.mob_size >= MOB_SIZE_LARGE)
L.underlays -= marked_underlay
QDEL_NULL(marked_underlay)
var/backstab_dir = get_dir(user, L)
var/def_check = L.getarmor(type = "bomb")
if((user.dir & backstab_dir) && (L.dir & backstab_dir))
L.apply_damage(80, BRUTE, blocked = def_check)
playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
else
L.apply_damage(50, BRUTE, blocked = def_check)
var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)
if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK))
return
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
var/backstab_dir = get_dir(user, L)
var/def_check = L.getarmor(type = "bomb")
if((user.dir & backstab_dir) && (L.dir & backstab_dir))
L.apply_damage(80, BRUTE, blocked = def_check)
playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
else
L.apply_damage(50, BRUTE, blocked = def_check)
/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge()
if(!charged)
charged = 1
charged = TRUE
icon_state = "mining_hammer1"
playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
@@ -673,7 +673,7 @@
if(!istype(T))
return
if(!istype(T, turf_type))
var/obj/effect/overlay/temp/lavastaff/L = new /obj/effect/overlay/temp/lavastaff(T)
var/obj/effect/temp_visual/lavastaff/L = new /obj/effect/temp_visual/lavastaff(T)
L.alpha = 0
animate(L, alpha = 255, time = create_delay)
user.visible_message("<span class='danger'>[user] points [src] at [T]!</span>")
@@ -696,7 +696,7 @@
timer = world.time + reset_cooldown
playsound(T,'sound/magic/Fireball.ogg', 200, 1)
/obj/effect/overlay/temp/lavastaff
/obj/effect/temp_visual/lavastaff
icon_state = "lavastaff_warn"
duration = 50
@@ -821,7 +821,7 @@
timer = world.time + cooldown_time
if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one!
chaser_timer = world.time + chaser_cooldown
var/obj/effect/overlay/temp/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check)
var/obj/effect/temp_visual/hierophant/chaser/C = new(get_turf(user), user, target, chaser_speed, friendly_fire_check)
C.damage = 30
C.monster_damage_boost = FALSE
add_logs(user, target, "fired a chaser at", src)
@@ -878,7 +878,7 @@
if(do_after(user, 50, target = user) && !beacon)
var/turf/T = get_turf(user)
playsound(T,'sound/magic/Blind.ogg', 200, 1, -4)
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
beacon = new/obj/effect/hierophant(T)
user.update_action_buttons_icon()
user.visible_message("<span class='hierophant_warning'>[user] places a strange machine beneath [user.p_their()] feet!</span>", \
@@ -905,8 +905,8 @@
timer = world.time + 50
INVOKE_ASYNC(src, .proc/prepare_icon_update)
beacon.icon_state = "hierophant_tele_on"
var/obj/effect/overlay/temp/hierophant/telegraph/edge/TE1 = new /obj/effect/overlay/temp/hierophant/telegraph/edge(user.loc)
var/obj/effect/overlay/temp/hierophant/telegraph/edge/TE2 = new /obj/effect/overlay/temp/hierophant/telegraph/edge(beacon.loc)
var/obj/effect/temp_visual/hierophant/telegraph/edge/TE1 = new /obj/effect/temp_visual/hierophant/telegraph/edge(user.loc)
var/obj/effect/temp_visual/hierophant/telegraph/edge/TE2 = new /obj/effect/temp_visual/hierophant/telegraph/edge(beacon.loc)
if(do_after(user, 40, target = user) && user && beacon)
var/turf/T = get_turf(beacon)
var/turf/source = get_turf(user)
@@ -918,8 +918,8 @@
INVOKE_ASYNC(src, .proc/prepare_icon_update)
beacon.icon_state = "hierophant_tele_off"
return
new /obj/effect/overlay/temp/hierophant/telegraph(T, user)
new /obj/effect/overlay/temp/hierophant/telegraph(source, user)
new /obj/effect/temp_visual/hierophant/telegraph(T, user)
new /obj/effect/temp_visual/hierophant/telegraph(source, user)
playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
if(!do_after(user, 3, target = user) || !user || !beacon || QDELETED(beacon)) //no walking away shitlord
@@ -940,13 +940,13 @@
beacon.icon_state = "hierophant_tele_off"
return
add_logs(user, beacon, "teleported self from ([source.x],[source.y],[source.z]) to")
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user)
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, user)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user)
for(var/t in RANGE_TURFS(1, T))
var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //No friendly fire, this is a utility tool
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies
B.damage = 30
for(var/t in RANGE_TURFS(1, source))
var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE)
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies
B.damage = 30
for(var/mob/living/L in range(1, source))
INVOKE_ASYNC(src, .proc/teleport_mob, source, L, T, user) //regardless, take all mobs near us along
@@ -991,10 +991,10 @@
/obj/item/weapon/hierophant_club/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay
if(!T)
return
new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, user)
new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, user)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
new /obj/effect/overlay/temp/hierophant/blast(T, user, friendly_fire_check)
new /obj/effect/temp_visual/hierophant/blast(T, user, friendly_fire_check)
for(var/d in GLOB.cardinal)
INVOKE_ASYNC(src, .proc/blast_wall, T, d, user)
@@ -1007,18 +1007,15 @@
for(var/i in 1 to range)
if(!J)
return
var/obj/effect/overlay/temp/hierophant/blast/B = new(J, user, friendly_fire_check)
B.damage = 30
B.monster_damage_boost = FALSE
new /obj/effect/temp_visual/hierophant/blast(J, user, friendly_fire_check)
previousturf = J
J = get_step(previousturf, dir)
/obj/item/weapon/hierophant_club/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target
if(!T)
return
new /obj/effect/overlay/temp/hierophant/telegraph(T, user)
new /obj/effect/temp_visual/hierophant/telegraph(T, user)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
for(var/t in RANGE_TURFS(1, T))
var/obj/effect/overlay/temp/hierophant/blast/B = new(t, user, friendly_fire_check)
B.damage = 15 //keeps monster damage boost due to lower damage
new /obj/effect/temp_visual/hierophant/blast(t, user, friendly_fire_check)
+1 -1
View File
@@ -19,7 +19,7 @@
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/weapon/hivelordstabilizer, 400),
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule, 400),
new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/weapon/storage/belt/mining, 500),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/medipen/survival, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
+1 -21
View File
@@ -24,7 +24,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
check_friendly_fire = 1
stop_automated_movement_when_pulled = 1
attacktext = "drills"
@@ -44,7 +44,6 @@
var/light_on = 0
var/datum/action/innate/minedrone/toggle_light/toggle_light_action
var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action
var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action
var/datum/action/innate/minedrone/dump_ore/dump_ore_action
@@ -52,8 +51,6 @@
..()
toggle_light_action = new()
toggle_light_action.Grant(src)
toggle_meson_vision_action = new()
toggle_meson_vision_action.Grant(src)
toggle_mode_action = new()
toggle_mode_action.Grant(src)
dump_ore_action = new()
@@ -189,23 +186,6 @@
user.light_on = !user.light_on
to_chat(user, "<span class='notice'>You toggle your light [user.light_on ? "on" : "off"].</span>")
/datum/action/innate/minedrone/toggle_meson_vision
name = "Toggle Meson Vision"
button_icon_state = "meson"
/datum/action/innate/minedrone/toggle_meson_vision/Activate()
var/mob/living/simple_animal/hostile/mining_drone/user = owner
if(user.sight & SEE_TURFS)
user.sight &= ~SEE_TURFS
user.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
else
user.sight |= SEE_TURFS
user.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
user.sync_lighting_plane_alpha()
to_chat(user, "<span class='notice'>You toggle your meson vision [(user.sight & SEE_TURFS) ? "on" : "off"].</span>")
/datum/action/innate/minedrone/toggle_mode
name = "Toggle Mode"
button_icon_state = "mech_cycle_equip_off"
@@ -5,10 +5,10 @@
new /obj/effect/gibspawner/xenobodypartless(loc,viruses)
/mob/living/carbon/alien/gib_animation()
new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-a")
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
/mob/living/carbon/alien/spawn_dust()
new /obj/effect/decal/remains/xeno(loc)
/mob/living/carbon/alien/dust_animation()
new /obj/effect/overlay/temp/dust_animation(loc, "dust-a")
new /obj/effect/temp_visual/dust_animation(loc, "dust-a")
@@ -13,10 +13,10 @@
new /obj/effect/gibspawner/larvabodypartless(loc,viruses)
/mob/living/carbon/alien/larva/gib_animation()
new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-l")
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l")
/mob/living/carbon/alien/larva/spawn_dust()
new /obj/effect/decal/remains/xeno(loc)
/mob/living/carbon/alien/larva/dust_animation()
new /obj/effect/overlay/temp/dust_animation(loc, "dust-l")
new /obj/effect/temp_visual/dust_animation(loc, "dust-l")
@@ -1,8 +1,8 @@
/mob/living/carbon/human/gib_animation()
new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-h")
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h")
/mob/living/carbon/human/dust_animation()
new /obj/effect/overlay/temp/dust_animation(loc, "dust-h")
new /obj/effect/temp_visual/dust_animation(loc, "dust-h")
/mob/living/carbon/human/spawn_gibs(with_bodyparts)
if(with_bodyparts)
@@ -36,7 +36,8 @@
//initialise organs
create_internal_organs()
martial_art = default_martial_art
if(mind)
mind.martial_art = mind.default_martial_art
handcrafting = new()
@@ -40,12 +40,13 @@
if(spec_return)
return spec_return
if(martial_art && martial_art.deflection_chance) //Some martial arts users can deflect projectiles!
if(prob(martial_art.deflection_chance))
if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it
visible_message("<span class='danger'>[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!</span>", "<span class='userdanger'>You deflect the projectile!</span>")
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
return 0
if(mind)
if(mind.martial_art && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles!
if(prob(mind.martial_art.deflection_chance))
if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it
visible_message("<span class='danger'>[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!</span>", "<span class='userdanger'>You deflect the projectile!</span>")
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
return 0
if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
@@ -103,10 +104,11 @@
return 0
/mob/living/carbon/human/proc/check_block()
if(martial_art && martial_art.block_chance \
&& prob(martial_art.block_chance) && in_throw_mode \
&& !stat && !weakened && !stunned)
return TRUE
if(mind)
if(mind.martial_art && mind.martial_art.block_chance \
&& prob(mind.martial_art.block_chance) && in_throw_mode \
&& !stat && !weakened && !stunned)
return TRUE
return FALSE
/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0)
@@ -39,9 +39,6 @@
var/bleed_rate = 0 //how much are we bleeding
var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
var/datum/martial_art/martial_art = null
var/static/default_martial_art = new/datum/martial_art
var/name_override //For temporary visible name changes
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
@@ -144,9 +144,9 @@
if(NOGUNS in src.dna.species.species_traits)
to_chat(src, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
return 0
if(martial_art && martial_art.no_guns) //great dishonor to famiry
to_chat(src, "<span class='warning'>Use of ranged weaponry would bring dishonor to the clan.</span>")
return 0
if(mind)
if(mind.martial_art && mind.martial_art.no_guns) //great dishonor to famiry
to_chat(src, "<span class='warning'>Use of ranged weaponry would bring dishonor to the clan.</span>")
return 0
return .
@@ -0,0 +1,9 @@
/mob/living/carbon/human/Login()
..()
if(src.martial_art == default_martial_art && mind.stored_martial_art) //If the mind has a martial art stored and the body has the default one.
src.mind.stored_martial_art.teach(src) //Running teach so that it deals with help verbs.
else if(src.martial_art != default_martial_art && src.martial_art != mind.stored_martial_art) //If the body has a martial art which is not the default one and is not stored in the mind.
if(src.martial_art_owner != mind)
src.martial_art.remove(src)
else
src.mind.stored_martial_art = src.martial_art
@@ -1304,7 +1304,7 @@
/datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
return
/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art)
/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
if(!istype(M))
return
CHECK_DNA_AND_SPECIES(M)
@@ -1312,6 +1312,8 @@
if(!istype(M)) //sanity check for drones.
return
if(M.mind)
attacker_style = M.mind.martial_art
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(0, M.name, attack_type = UNARMED_ATTACK))
add_logs(M, H, "attempted to touch")
H.visible_message("<span class='warning'>[M] attempted to touch [H]!</span>")
@@ -406,7 +406,7 @@
else
reactive_teleport(H)
/datum/species/golem/bluespace/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art)
/datum/species/golem/bluespace/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
..()
if(world.time > last_teleport + teleport_cooldown && M != H && M.a_intent != INTENT_HELP)
reactive_teleport(H)
@@ -490,7 +490,7 @@
var/golem_name = "[uppertext(clown_name)]"
return golem_name
/datum/species/golem/bananium/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art)
/datum/species/golem/bananium/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
..()
if(world.time > last_banana + banana_cooldown && M != H && M.a_intent != INTENT_HELP)
new/obj/item/weapon/grown/bananapeel/specialpeel(get_turf(H))
@@ -664,7 +664,7 @@
return
invisibility = INVISIBILITY_MAXIMUM //disappear before the animation
new /obj/effect/overlay/temp/mummy_animation(get_turf(src))
new /obj/effect/temp_visual/mummy_animation(get_turf(src))
if(cloth_golem.revive(full_heal = TRUE, admin_revive = TRUE))
cloth_golem.grab_ghost() //won't pull if it's a suicide
sleep(20)
@@ -1,5 +1,5 @@
/mob/living/carbon/monkey/gib_animation()
new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-m")
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-m")
/mob/living/carbon/monkey/dust_animation()
new /obj/effect/overlay/temp/dust_animation(loc, "dust-m")
new /obj/effect/temp_visual/dust_animation(loc, "dust-m")
@@ -1,6 +1,6 @@
/mob/living/silicon/robot/gib_animation()
new /obj/effect/overlay/temp/gib_animation(loc, "gibbed-r")
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-r")
/mob/living/silicon/robot/dust()
if(mmi)
@@ -11,7 +11,7 @@
new /obj/effect/decal/remains/robot(loc)
/mob/living/silicon/robot/dust_animation()
new /obj/effect/overlay/temp/dust_animation(loc, "dust-r")
new /obj/effect/temp_visual/dust_animation(loc, "dust-r")
/mob/living/silicon/robot/death(gibbed)
if(stat == DEAD)
@@ -198,9 +198,9 @@
/obj/item/weapon/robot_module/proc/do_transform_animation()
var/mob/living/silicon/robot/R = loc
R.notransform = TRUE
var/obj/effect/overlay/temp/decoy/fading/fivesecond/ANM = new /obj/effect/overlay/temp/decoy/fading/fivesecond(R.loc, R)
var/obj/effect/temp_visual/decoy/fading/fivesecond/ANM = new /obj/effect/temp_visual/decoy/fading/fivesecond(R.loc, R)
ANM.layer = R.layer - 0.01
new /obj/effect/overlay/temp/small_smoke(R.loc)
new /obj/effect/temp_visual/small_smoke(R.loc)
if(R.hat)
R.hat.forceMove(get_turf(R))
R.hat = null
@@ -526,7 +526,6 @@
name = "Miner"
basic_modules = list(
/obj/item/device/assembly/flash/cyborg,
/obj/item/borg/sight/meson,
/obj/item/weapon/storage/bag/ore/cyborg,
/obj/item/weapon/pickaxe/drill/cyborg,
/obj/item/weapon/shovel,
@@ -299,7 +299,7 @@
/mob/living/simple_animal/bot/emp_act(severity)
var/was_on = on
stat |= EMPED
new /obj/effect/overlay/temp/emp(loc)
new /obj/effect/temp_visual/emp(loc)
if(paicard)
paicard.emp_act(severity)
src.visible_message("[paicard] is flies out of [bot_name]!","<span class='warning'>You are forcefully ejected from [bot_name]!</span>")
@@ -9,7 +9,7 @@
maxHealth = 100
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
obj_damage = 60
environment_smash = 2 //Walls can't stop THE LAW
environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW
mob_size = MOB_SIZE_LARGE
radio_key = /obj/item/device/encryptionkey/headset_sec
@@ -444,7 +444,7 @@ Auto Patrol[]"},
if(severity==2 && prob(70))
..(severity-1)
else
new /obj/effect/overlay/temp/emp(loc)
new /obj/effect/temp_visual/emp(loc)
var/list/mob/living/carbon/targets = new
for(var/mob/living/carbon/C in view(12,src))
if(C.stat==2)
@@ -115,7 +115,7 @@
melee_damage_upper = 30
attacktext = "smashes their armored gauntlet into"
speed = 3
environment_smash = 2
environment_smash = ENVIRONMENT_SMASH_WALLS
attack_sound = 'sound/weapons/punch3.ogg'
status_flags = 0
mob_size = MOB_SIZE_LARGE
@@ -126,7 +126,7 @@
/mob/living/simple_animal/hostile/construct/armored/hostile //actually hostile, will move around, hit things
AIStatus = AI_ON
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP
/mob/living/simple_animal/hostile/construct/armored/bullet_act(obj/item/projectile/P)
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
@@ -218,7 +218,7 @@
retreat_distance = 10
minimum_distance = 10 //AI artificers will flee like fuck
attacktext = "rams"
environment_smash = 2
environment_smash = ENVIRONMENT_SMASH_WALLS
attack_sound = 'sound/weapons/punch2.ogg'
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
/obj/effect/proc_holder/spell/aoe_turf/conjure/floor,
@@ -272,7 +272,7 @@
/mob/living/simple_animal/hostile/construct/builder/hostile //actually hostile, will move around, hit things, heal other constructs
AIStatus = AI_ON
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP
/////////////////////////////Non-cult Artificer/////////////////////////
/mob/living/simple_animal/hostile/construct/builder/noncult
@@ -216,7 +216,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD)
new /obj/effect/overlay/temp/heart(loc)
new /obj/effect/temp_visual/heart(loc)
emote("me", 1, "purrs!")
else
if(M && stat != DEAD)
@@ -553,7 +553,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454
new /obj/effect/overlay/temp/heart(loc)
new /obj/effect/temp_visual/heart(loc)
emote("me", 1, "yaps happily!")
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
@@ -24,7 +24,7 @@
maxHealth = 40
melee_damage_lower = 1
melee_damage_upper = 2
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
stop_automated_movement_when_pulled = 1
blood_volume = BLOOD_VOLUME_NORMAL
var/obj/item/udder/udder = null
@@ -20,7 +20,7 @@
mob_size = MOB_SIZE_SMALL
gold_core_spawnable = 2
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
var/list/edibles = list(/mob/living/simple_animal/butterfly,/mob/living/simple_animal/cockroach) //list of atoms, however turfs won't affect AI, but will affect consumption.
/mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target?
@@ -31,7 +31,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
health = INFINITY
healable = FALSE //don't brusepack the guardian
damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) //how much damage from each damage type we transfer to the owner
environment_smash = 1
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
obj_damage = 40
melee_damage_lower = 15
melee_damage_upper = 15
@@ -175,9 +175,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
if(istype(summoner.loc, /obj/effect))
Recall(TRUE)
else
new /obj/effect/overlay/temp/guardian/phase/out(loc)
new /obj/effect/temp_visual/guardian/phase/out(loc)
forceMove(summoner.loc)
new /obj/effect/overlay/temp/guardian/phase(loc)
new /obj/effect/temp_visual/guardian/phase(loc)
/mob/living/simple_animal/hostile/guardian/canSuicide()
return 0
@@ -315,7 +315,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
return FALSE
if(loc == summoner)
forceMove(summoner.loc)
new /obj/effect/overlay/temp/guardian/phase(loc)
new /obj/effect/temp_visual/guardian/phase(loc)
cooldown = world.time + 10
return TRUE
return FALSE
@@ -323,7 +323,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
/mob/living/simple_animal/hostile/guardian/proc/Recall(forced)
if(!summoner || loc == summoner || (cooldown > world.time && !forced))
return FALSE
new /obj/effect/overlay/temp/guardian/phase/out(loc)
new /obj/effect/temp_visual/guardian/phase/out(loc)
forceMove(summoner)
cooldown = world.time + 10
@@ -71,8 +71,11 @@
melee_damage_upper = 50
armour_penetration = 100
obj_damage = 0
environment_smash = 0
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(src))
environment_smash = ENVIRONMENT_SMASH_NONE
new /obj/effect/temp_visual/guardian/phase/out(get_turf(src))
alpha = 15
if(!forced)
to_chat(src, "<span class='danger'><B>You enter stealth, empowering your next attack.</span></B>")
@@ -40,7 +40,7 @@
/mob/living/simple_animal/hostile/guardian/charger/Move()
if(charging)
new /obj/effect/overlay/temp/decoy/fading(loc,src)
new /obj/effect/temp_visual/decoy/fading(loc,src)
. = ..()
/mob/living/simple_animal/hostile/guardian/charger/snapback()
@@ -21,14 +21,14 @@
if(. && prob(40) && isliving(target))
var/mob/living/M = target
if(!M.anchored && M != summoner && !hasmatchingsummoner(M))
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
new /obj/effect/temp_visual/guardian/phase/out(get_turf(M))
do_teleport(M, M, 10)
for(var/mob/living/L in range(1, M))
if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
continue
if(L != src && L != summoner)
L.apply_damage(15, BRUTE)
new /obj/effect/overlay/temp/explosion(get_turf(M))
new /obj/effect/temp_visual/explosion(get_turf(M))
/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A)
if(!istype(A))
@@ -75,7 +75,7 @@
var/turf/T = get_turf(src)
stored_obj.forceMove(T)
playsound(T,'sound/effects/Explosion2.ogg', 200, 1)
new /obj/effect/overlay/temp/explosion(T)
new /obj/effect/temp_visual/explosion(T)
user.ex_act(2)
qdel(src)
else
@@ -63,6 +63,6 @@
else
to_chat(summoner, "<span class='holoparasite'>You moved out of range, and were pulled back! You can only move [range] meters from <font color=\"[namedatum.colour]\"><b>[real_name]</b></font>!</span>")
summoner.visible_message("<span class='danger'>\The [summoner] jumps back to [summoner.p_their()] protector.</span>")
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(summoner))
new /obj/effect/temp_visual/guardian/phase/out(get_turf(summoner))
summoner.forceMove(get_turf(src))
new /obj/effect/overlay/temp/guardian/phase(get_turf(summoner))
new /obj/effect/temp_visual/guardian/phase(get_turf(summoner))
@@ -45,7 +45,7 @@
melee_damage_lower = 0
melee_damage_upper = 0
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
alpha = 45
range = 255
incorporeal_move = 1
@@ -4,7 +4,7 @@
melee_damage_upper = 20
obj_damage = 80
next_move_modifier = 0.8 //attacks 20% faster
environment_smash = 2
environment_smash = ENVIRONMENT_SMASH_WALLS
playstyle_string = "<span class='holoparasite'>As a <b>standard</b> type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls.</span>"
magic_fluff_string = "<span class='holoparasite'>..And draw the Assistant, faceless and generic, but never to be underestimated.</span>"
tech_fluff_string = "<span class='holoparasite'>Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online.</span>"
@@ -34,7 +34,7 @@
C.adjustFireLoss(-5)
C.adjustOxyLoss(-5)
C.adjustToxLoss(-5)
var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(C))
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(C))
if(namedatum)
H.color = namedatum.colour
if(C == summoner)
@@ -136,11 +136,11 @@
to_chat(src, "<span class='danger'><B>You need to hold still!</span></B>")
return
new /obj/effect/overlay/temp/guardian/phase/out(T)
new /obj/effect/temp_visual/guardian/phase/out(T)
if(isliving(A))
var/mob/living/L = A
L.flash_act()
A.visible_message("<span class='danger'>[A] disappears in a flash of light!</span>", \
"<span class='userdanger'>Your vision is obscured by a flash of light!</span>")
do_teleport(A, beacon, 0)
new /obj/effect/overlay/temp/guardian/phase(get_turf(A))
new /obj/effect/temp_visual/guardian/phase(get_turf(A))
@@ -158,7 +158,7 @@
a_intent = INTENT_HELP
friendly = "caresses"
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
gold_core_spawnable = 1
icon_state = "maid"
icon_living = "maid"
@@ -31,7 +31,7 @@
faction = list("hostile")
move_to_delay = 0
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
mouse_opacity = 2
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
mob_size = MOB_SIZE_TINY
@@ -8,7 +8,7 @@
icon = 'icons/mob/simple_human.dmi'
icon_state = "paperwizard"
ranged = 1
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
minimum_distance = 3
retreat_distance = 3
obj_damage = 0
@@ -16,7 +16,7 @@
melee_damage_upper = 20
health = 1000
maxHealth = 1000
loot = list(/obj/effect/overlay/temp/paperwiz_dying)
loot = list(/obj/effect/temp_visual/paperwiz_dying)
projectiletype = /obj/item/projectile/temp
projectilesound = 'sound/weapons/emitter.ogg'
attack_sound = 'sound/hallucinations/growl1.ogg'
@@ -129,7 +129,7 @@
qdel(src) //I see through your ruse!
//fancy effects
/obj/effect/overlay/temp/paper_scatter
/obj/effect/temp_visual/paper_scatter
name = "scattering paper"
desc = "Pieces of paper scattering to the wind."
layer = ABOVE_OPEN_TURF_LAYER
@@ -139,7 +139,7 @@
duration = 5
randomdir = FALSE
/obj/effect/overlay/temp/paperwiz_dying
/obj/effect/temp_visual/paperwiz_dying
name = "craft portal"
desc = "A wormhole sucking the wizard into the void. Neat."
layer = ABOVE_OPEN_TURF_LAYER
@@ -149,18 +149,18 @@
duration = 18
randomdir = FALSE
/obj/effect/overlay/temp/paperwiz_dying/Initialize()
/obj/effect/temp_visual/paperwiz_dying/Initialize()
. = ..()
visible_message("<span class='boldannounce'>The wizard cries out in pain as a gate appears behind him, sucking him in!</span>")
playsound(get_turf(src),'sound/magic/MandSwap.ogg', 50, 1, 1)
playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, 1, 1)
/obj/effect/overlay/temp/paperwiz_dying/Destroy()
/obj/effect/temp_visual/paperwiz_dying/Destroy()
for(var/mob/M in range(7,src))
shake_camera(M, 7, 1)
var/turf/T = get_turf(src)
playsound(T,'sound/magic/Summon_Magic.ogg', 50, 1, 1)
new /obj/effect/overlay/temp/paper_scatter(T)
new /obj/effect/temp_visual/paper_scatter(T)
new /obj/item/clothing/suit/wizrobe/paper(T)
new /obj/item/clothing/head/collectable/paper(T)
return ..()
@@ -8,7 +8,7 @@
icon_living = "flan"
icon_dead = "flan_dead"
turns_per_move = 5
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
speed = -2
maxHealth = 50
health = 50
@@ -17,7 +17,7 @@
robust_searching = 1
stat_attack = 2
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
speak_emote = list("squeaks")
ventcrawler = VENTCRAWLER_ALWAYS
var/datum/mind/origin
@@ -2,7 +2,7 @@
faction = list("hostile")
stop_automated_movement_when_pulled = 0
obj_damage = 40
environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
var/atom/target
var/ranged = 0
var/rapid = 0
@@ -67,7 +67,7 @@
melee_damage_upper = 0
speed = -1
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
/mob/living/simple_animal/hostile/illusion/escape/AttackingTarget()
@@ -4,7 +4,7 @@
faction = list("jungle")
weather_immunities = list("acid")
obj_damage = 30
environment_smash = 2
environment_smash = ENVIRONMENT_SMASH_WALLS
minbodytemp = 0
maxbodytemp = 450
response_help = "pokes"
@@ -134,7 +134,7 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/Move()
if(charging)
new /obj/effect/overlay/temp/decoy/fading(loc,src)
new /obj/effect/temp_visual/decoy/fading(loc,src)
DestroySurroundings()
. = ..()
if(!stat && .)
@@ -150,12 +150,12 @@ Difficulty: Hard
var/turf/T = get_turf(target)
if(!T || T == loc)
return
new /obj/effect/overlay/temp/dragon_swoop/bubblegum(T)
new /obj/effect/temp_visual/dragon_swoop/bubblegum(T)
charging = TRUE
DestroySurroundings()
walk(src, 0)
setDir(get_dir(src, T))
var/obj/effect/overlay/temp/decoy/D = new /obj/effect/overlay/temp/decoy(loc,src)
var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src)
animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3)
sleep(3)
throw_at(T, get_dist(src, T), 1, src, 0, callback = CALLBACK(src, .charge_end, bonus_charges))
@@ -245,9 +245,9 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness)
if(handedness)
new /obj/effect/overlay/temp/bubblegum_hands/rightsmack(T)
new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T)
else
new /obj/effect/overlay/temp/bubblegum_hands/leftsmack(T)
new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T)
sleep(2.5)
for(var/mob/living/L in T)
if(!faction_check_mob(L))
@@ -259,11 +259,11 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness)
if(handedness)
new /obj/effect/overlay/temp/bubblegum_hands/rightpaw(T)
new /obj/effect/overlay/temp/bubblegum_hands/rightthumb(T)
new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T)
new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T)
else
new /obj/effect/overlay/temp/bubblegum_hands/leftpaw(T)
new /obj/effect/overlay/temp/bubblegum_hands/leftthumb(T)
new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T)
new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T)
sleep(6)
for(var/mob/living/L in T)
if(!faction_check_mob(L))
@@ -276,31 +276,31 @@ Difficulty: Hard
addtimer(CALLBACK(src, .proc/devour, L), 2)
sleep(1)
/obj/effect/overlay/temp/dragon_swoop/bubblegum
/obj/effect/temp_visual/dragon_swoop/bubblegum
duration = 10
/obj/effect/overlay/temp/bubblegum_hands
/obj/effect/temp_visual/bubblegum_hands
icon = 'icons/effects/bubblegum.dmi'
duration = 9
/obj/effect/overlay/temp/bubblegum_hands/rightthumb
/obj/effect/temp_visual/bubblegum_hands/rightthumb
icon_state = "rightthumbgrab"
/obj/effect/overlay/temp/bubblegum_hands/leftthumb
/obj/effect/temp_visual/bubblegum_hands/leftthumb
icon_state = "leftthumbgrab"
/obj/effect/overlay/temp/bubblegum_hands/rightpaw
/obj/effect/temp_visual/bubblegum_hands/rightpaw
icon_state = "rightpawgrab"
layer = BELOW_MOB_LAYER
/obj/effect/overlay/temp/bubblegum_hands/leftpaw
/obj/effect/temp_visual/bubblegum_hands/leftpaw
icon_state = "leftpawgrab"
layer = BELOW_MOB_LAYER
/obj/effect/overlay/temp/bubblegum_hands/rightsmack
/obj/effect/temp_visual/bubblegum_hands/rightsmack
icon_state = "rightsmack"
/obj/effect/overlay/temp/bubblegum_hands/leftsmack
/obj/effect/temp_visual/bubblegum_hands/leftsmack
icon_state = "leftsmack"
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp()
@@ -316,7 +316,7 @@ Difficulty: Hard
if(!pools.len)
return FALSE
var/obj/effect/overlay/temp/decoy/DA = new /obj/effect/overlay/temp/decoy(loc,src)
var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc,src)
DA.color = "#FF0000"
var/oldtransform = DA.transform
DA.transform = matrix()*2
@@ -358,7 +358,7 @@ Difficulty: Hard
new /obj/effect/decal/cleanable/blood/bubblegum(J)
for(var/i in 1 to range)
J = get_step(previousturf, targetdir)
new /obj/effect/overlay/temp/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J))
playsound(previousturf,'sound/effects/splat.ogg', 100, 1, -1)
if(!J || !previousturf.atmos_adjacent_turfs || !previousturf.atmos_adjacent_turfs[J])
break
@@ -95,7 +95,7 @@ Difficulty: Very Hard
..()
internal = new/obj/item/device/gps/internal/colossus(src)
/obj/effect/overlay/temp/at_shield
/obj/effect/temp_visual/at_shield
name = "anti-toolbox field"
desc = "A shimmering forcefield protecting the colossus."
icon = 'icons/effects/effects.dmi'
@@ -105,14 +105,14 @@ Difficulty: Very Hard
duration = 8
var/target
/obj/effect/overlay/temp/at_shield/Initialize(mapload, new_target)
/obj/effect/temp_visual/at_shield/Initialize(mapload, new_target)
. = ..()
target = new_target
INVOKE_ASYNC(src, /atom/movable/proc/orbit, target, 0, FALSE, 0, 0, FALSE, TRUE)
/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P)
if(!stat)
var/obj/effect/overlay/temp/at_shield/AT = new /obj/effect/overlay/temp/at_shield(src.loc, src)
var/obj/effect/temp_visual/at_shield/AT = new /obj/effect/temp_visual/at_shield(src.loc, src)
var/random_x = rand(-32, 32)
AT.pixel_x += random_x
@@ -123,8 +123,9 @@ Difficulty: Very Hard
/mob/living/simple_animal/hostile/megafauna/colossus/proc/enrage(mob/living/L)
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.martial_art && prob(H.martial_art.deflection_chance))
. = TRUE
if(H.mind)
if(H.mind.martial_art && prob(H.mind.martial_art.deflection_chance))
. = TRUE
/mob/living/simple_animal/hostile/megafauna/colossus/proc/alternating_dir_shots()
dir_shots(GLOB.diagonals)
@@ -581,7 +582,7 @@ Difficulty: Very Hard
if(..())
for(var/i in range(1, src))
if(isturf(i))
new /obj/effect/overlay/temp/cult/sparks(i)
new /obj/effect/temp_visual/cult/sparks(i)
continue
if(ishuman(i))
var/mob/living/carbon/human/H = i
@@ -657,7 +658,7 @@ Difficulty: Very Hard
minbodytemp = 0
maxbodytemp = 1500
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
AIStatus = AI_OFF
stop_automated_movement = 1
var/heal_power = 5
@@ -675,7 +676,7 @@ Difficulty: Very Hard
var/mob/living/L = target
if(L.stat != DEAD)
L.heal_overall_damage(heal_power, heal_power)
new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF")
new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
/mob/living/simple_animal/hostile/lightgeist/ghostize()
. = ..()
@@ -699,7 +700,7 @@ Difficulty: Very Hard
if(..())
var/list/L = list()
var/turf/T = get_step(src, dir)
new /obj/effect/overlay/temp/emp/pulse(T)
new /obj/effect/temp_visual/emp/pulse(T)
for(var/i in T)
if(istype(i, /obj/item) && !is_type_in_typecache(i, banned_items_typecache))
var/obj/item/W = i
@@ -124,7 +124,7 @@ Difficulty: Medium
target.visible_message("<span class='boldwarning'>Fire rains from the sky!</span>")
for(var/turf/turf in range(9,get_turf(target)))
if(prob(11))
new /obj/effect/overlay/temp/target(turf)
new /obj/effect/temp_visual/target(turf)
/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls()
playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
@@ -179,7 +179,7 @@ Difficulty: Medium
negative = FALSE
else if(target.x == initial_x) //if their x is the same, pick a direction
negative = prob(50)
var/obj/effect/overlay/temp/dragon_flight/F = new /obj/effect/overlay/temp/dragon_flight(loc, negative)
var/obj/effect/temp_visual/dragon_flight/F = new /obj/effect/temp_visual/dragon_flight(loc, negative)
negative = !negative //invert it for the swoop down later
@@ -208,7 +208,7 @@ Difficulty: Medium
if(L.stat == DEAD)
break //target is dead and we're on em, slam they
if(fire_rain)
new /obj/effect/overlay/temp/target(loc, flame_hit)
new /obj/effect/temp_visual/target(loc, flame_hit)
forceMove(get_step(src, get_dir(src, target)))
if(loc == get_turf(target))
if(!fire_rain)
@@ -228,8 +228,8 @@ Difficulty: Medium
else
if(IsInRange(x, initial_x - DRAKE_SWOOP_DIRECTION_CHANGE_RANGE, initial_x - 1))
negative = TRUE
new /obj/effect/overlay/temp/dragon_flight/end(loc, negative)
new /obj/effect/overlay/temp/dragon_swoop(loc)
new /obj/effect/temp_visual/dragon_flight/end(loc, negative)
new /obj/effect/temp_visual/dragon_swoop(loc)
animate(src, transform = oldtransform, time = 5)
sleep(5)
swooping &= ~SWOOP_INVULNERABLE
@@ -271,7 +271,7 @@ Difficulty: Medium
invisibility = 100
/obj/effect/overlay/temp/fireball
/obj/effect/temp_visual/fireball
icon = 'icons/obj/wizard.dmi'
icon_state = "fireball"
name = "fireball"
@@ -281,28 +281,28 @@ Difficulty: Medium
duration = 9
pixel_z = DRAKE_SWOOP_HEIGHT
/obj/effect/overlay/temp/fireball/Initialize()
/obj/effect/temp_visual/fireball/Initialize()
. = ..()
animate(src, pixel_z = 0, time = duration)
/obj/effect/overlay/temp/target
/obj/effect/temp_visual/target
icon = 'icons/mob/actions.dmi'
icon_state = "sniper_zoom"
layer = BELOW_MOB_LAYER
light_range = 2
duration = 9
/obj/effect/overlay/temp/target/ex_act()
/obj/effect/temp_visual/target/ex_act()
return
/obj/effect/overlay/temp/target/Initialize(mapload, list/flame_hit)
/obj/effect/temp_visual/target/Initialize(mapload, list/flame_hit)
. = ..()
INVOKE_ASYNC(src, .proc/fall, flame_hit)
/obj/effect/overlay/temp/target/proc/fall(list/flame_hit)
/obj/effect/temp_visual/target/proc/fall(list/flame_hit)
var/turf/T = get_turf(src)
playsound(T,'sound/magic/Fireball.ogg', 80, 1)
new /obj/effect/overlay/temp/fireball(T)
new /obj/effect/temp_visual/fireball(T)
sleep(duration)
if(ismineralturf(T))
var/turf/closed/mineral/M = T
@@ -320,7 +320,7 @@ Difficulty: Medium
else
L.adjustFireLoss(10) //if we've already hit them, do way less damage
/obj/effect/overlay/temp/dragon_swoop
/obj/effect/temp_visual/dragon_swoop
name = "certain death"
desc = "Don't just stand there, move!"
icon = 'icons/effects/96x96.dmi'
@@ -331,7 +331,7 @@ Difficulty: Medium
color = "#FF0000"
duration = 5
/obj/effect/overlay/temp/dragon_flight
/obj/effect/temp_visual/dragon_flight
icon = 'icons/mob/lavaland/dragon.dmi'
icon_state = "dragon"
layer = ABOVE_ALL_MOB_LAYER
@@ -339,11 +339,11 @@ Difficulty: Medium
duration = 10
randomdir = FALSE
/obj/effect/overlay/temp/dragon_flight/Initialize(mapload, negative)
/obj/effect/temp_visual/dragon_flight/Initialize(mapload, negative)
. = ..()
INVOKE_ASYNC(src, .proc/flight, negative)
/obj/effect/overlay/temp/dragon_flight/proc/flight(negative)
/obj/effect/temp_visual/dragon_flight/proc/flight(negative)
if(negative)
animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT*0.10, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING)
else
@@ -355,12 +355,12 @@ Difficulty: Medium
else
animate(src, pixel_x = DRAKE_SWOOP_HEIGHT, pixel_z = DRAKE_SWOOP_HEIGHT, time = 7)
/obj/effect/overlay/temp/dragon_flight/end
/obj/effect/temp_visual/dragon_flight/end
pixel_x = DRAKE_SWOOP_HEIGHT
pixel_z = DRAKE_SWOOP_HEIGHT
duration = 5
/obj/effect/overlay/temp/dragon_flight/end/flight(negative)
/obj/effect/temp_visual/dragon_flight/end/flight(negative)
if(negative)
pixel_x = -DRAKE_SWOOP_HEIGHT
animate(src, pixel_x = -16, pixel_z = 0, time = 5)
@@ -150,7 +150,7 @@ Difficulty: Hard
var/prevloc = loc
. = ..()
if(!stat && .)
var/obj/effect/overlay/temp/hierophant/squares/HS = new /obj/effect/overlay/temp/hierophant/squares(prevloc)
var/obj/effect/temp_visual/hierophant/squares/HS = new /obj/effect/temp_visual/hierophant/squares(prevloc)
HS.dir = dir
playsound(loc, 'sound/mecha/mechmove04.ogg', 150, 1, -4)
if(target)
@@ -250,7 +250,7 @@ Difficulty: Hard
pickedtarget = pick_n_take(targets)
if(!istype(pickedtarget) || pickedtarget.stat == DEAD)
pickedtarget = target
var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE)
var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE)
C.moving = 3
C.moving_dir = pick_n_take(cardinal_copy)
sleep(10)
@@ -280,10 +280,10 @@ Difficulty: Hard
else
INVOKE_ASYNC(src, .proc/diagonal_blasts, target)
else if(chaser_cooldown < world.time) //if chasers are off cooldown, fire some!
var/obj/effect/overlay/temp/hierophant/chaser/C = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, chaser_speed, FALSE)
var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, chaser_speed, FALSE)
chaser_cooldown = world.time + initial(chaser_cooldown)
if((prob(anger_modifier) || target.Adjacent(src)) && target != src)
var/obj/effect/overlay/temp/hierophant/chaser/OC = new /obj/effect/overlay/temp/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE)
var/obj/effect/temp_visual/hierophant/chaser/OC = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE)
OC.moving = 4
OC.moving_dir = pick(GLOB.cardinal - C.moving_dir)
else //just release a burst of power
@@ -293,10 +293,10 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
new /obj/effect/overlay/temp/hierophant/telegraph/diagonal(T, src)
new /obj/effect/temp_visual/hierophant/telegraph/diagonal(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in GLOB.diagonals)
INVOKE_ASYNC(src, .proc/blast_wall, T, d)
@@ -304,10 +304,10 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, src)
new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in GLOB.cardinal)
INVOKE_ASYNC(src, .proc/blast_wall, T, d)
@@ -315,10 +315,10 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
new /obj/effect/temp_visual/hierophant/telegraph(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
for(var/d in GLOB.alldirs)
INVOKE_ASYNC(src, .proc/blast_wall, T, d)
@@ -327,7 +327,7 @@ Difficulty: Hard
var/turf/previousturf = T
var/turf/J = get_step(previousturf, set_dir)
for(var/i in 1 to range)
new /obj/effect/overlay/temp/hierophant/blast(J, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(J, src, FALSE)
previousturf = J
J = get_step(previousturf, set_dir)
@@ -342,8 +342,8 @@ Difficulty: Hard
INVOKE_ASYNC(src, .proc/arena_squares, T, d)
for(var/t in RANGE_TURFS(11, T))
if(t && get_dist(t, T) == 11)
new /obj/effect/overlay/temp/hierophant/wall(t)
new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
new /obj/effect/temp_visual/hierophant/wall(t)
new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
if(get_dist(src, T) >= 11) //hey you're out of range I need to get closer to you!
INVOKE_ASYNC(src, .proc/blink, T)
@@ -351,7 +351,7 @@ Difficulty: Hard
var/turf/previousturf = T
var/turf/J = get_step(previousturf, set_dir)
for(var/i in 1 to 10)
var/obj/effect/overlay/temp/hierophant/squares/HS = new /obj/effect/overlay/temp/hierophant/squares(J)
var/obj/effect/temp_visual/hierophant/squares/HS = new /obj/effect/temp_visual/hierophant/squares(J)
HS.dir = set_dir
previousturf = J
J = get_step(previousturf, set_dir)
@@ -362,19 +362,19 @@ Difficulty: Hard
return
var/turf/T = get_turf(victim)
var/turf/source = get_turf(src)
new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
new /obj/effect/overlay/temp/hierophant/telegraph(source, src)
new /obj/effect/temp_visual/hierophant/telegraph(T, src)
new /obj/effect/temp_visual/hierophant/telegraph(source, src)
playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
blinking = TRUE
sleep(2) //short delay before we start...
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, src)
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, src)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src)
for(var/t in RANGE_TURFS(1, T))
var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
B.damage = 30
for(var/t in RANGE_TURFS(1, source))
var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
B.damage = 30
animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out
sleep(1)
@@ -396,11 +396,11 @@ Difficulty: Hard
var/turf/T = get_turf(victim)
if(!T)
return
new /obj/effect/overlay/temp/hierophant/telegraph(T, src)
new /obj/effect/temp_visual/hierophant/telegraph(T, src)
playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
for(var/t in RANGE_TURFS(1, T))
new /obj/effect/overlay/temp/hierophant/blast(t, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(t, src, FALSE)
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original) //release a wave of blasts
playsound(original,'sound/machines/AirlockOpen.ogg', 200, 1)
@@ -413,7 +413,7 @@ Difficulty: Hard
if(dist > last_dist)
last_dist = dist
sleep(1 + min(burst_range - last_dist, 12) * 0.5) //gets faster as it gets further out
new /obj/effect/overlay/temp/hierophant/blast(T, src, FALSE)
new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
/mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck)
if(!istype(A) || get_dist(A, src) <= 2)
@@ -421,29 +421,29 @@ Difficulty: Hard
blink(A)
//Hierophant overlays
/obj/effect/overlay/temp/hierophant
/obj/effect/temp_visual/hierophant
name = "vortex energy"
layer = BELOW_MOB_LAYER
var/mob/living/caster //who made this, anyway
/obj/effect/overlay/temp/hierophant/Initialize(mapload, new_caster)
/obj/effect/temp_visual/hierophant/Initialize(mapload, new_caster)
. = ..()
if(new_caster)
caster = new_caster
/obj/effect/overlay/temp/hierophant/squares
/obj/effect/temp_visual/hierophant/squares
icon_state = "hierophant_squares"
duration = 3
light_range = 1
randomdir = FALSE
/obj/effect/overlay/temp/hierophant/squares/Initialize(mapload, new_caster)
/obj/effect/temp_visual/hierophant/squares/Initialize(mapload, new_caster)
. = ..()
if(ismineralturf(loc))
var/turf/closed/mineral/M = loc
M.gets_drilled(caster)
/obj/effect/overlay/temp/hierophant/wall //smoothing and pooling were not friends, but pooling is dead.
/obj/effect/temp_visual/hierophant/wall //smoothing and pooling were not friends, but pooling is dead.
name = "vortex wall"
icon = 'icons/turf/walls/hierophant_wall_temp.dmi'
icon_state = "wall"
@@ -451,21 +451,21 @@ Difficulty: Hard
duration = 100
smooth = SMOOTH_TRUE
/obj/effect/overlay/temp/hierophant/wall/Initialize(mapload, new_caster)
/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster)
. = ..()
queue_smooth_neighbors(src)
queue_smooth(src)
/obj/effect/overlay/temp/hierophant/wall/Destroy()
/obj/effect/temp_visual/hierophant/wall/Destroy()
queue_smooth_neighbors(src)
return ..()
/obj/effect/overlay/temp/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0)
/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0)
if(mover == caster)
return TRUE
return FALSE
/obj/effect/overlay/temp/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds.
/obj/effect/temp_visual/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds.
duration = 98
var/mob/living/target //what it's following
var/turf/targetturf //what turf the target is actually on
@@ -479,9 +479,9 @@ Difficulty: Hard
var/currently_seeking = FALSE
var/friendly_fire_check = FALSE //if blasts produced apply friendly fire
var/monster_damage_boost = TRUE
var/damage = 10
var/damage = 10
/obj/effect/overlay/temp/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire)
/obj/effect/temp_visual/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire)
. = ..()
target = new_target
friendly_fire_check = is_friendly_fire
@@ -489,14 +489,14 @@ Difficulty: Hard
speed = new_speed
addtimer(CALLBACK(src, .proc/seek_target), 1)
/obj/effect/overlay/temp/hierophant/chaser/proc/get_target_dir()
/obj/effect/temp_visual/hierophant/chaser/proc/get_target_dir()
. = get_cardinal_dir(src, targetturf)
if((. != previous_moving_dir && . == more_previouser_moving_dir) || . == 0) //we're alternating, recalculate
var/list/cardinal_copy = GLOB.cardinal.Copy()
cardinal_copy -= more_previouser_moving_dir
. = pick(cardinal_copy)
/obj/effect/overlay/temp/hierophant/chaser/proc/seek_target()
/obj/effect/temp_visual/hierophant/chaser/proc/seek_target()
if(!currently_seeking)
currently_seeking = TRUE
targetturf = get_turf(target)
@@ -523,33 +523,34 @@ Difficulty: Hard
moving--
sleep(speed)
targetturf = get_turf(target)
/obj/effect/overlay/temp/hierophant/chaser/proc/make_blast()
var/obj/effect/overlay/temp/hierophant/blast/B = new(loc, caster, friendly_fire_check)
/obj/effect/temp_visual/hierophant/chaser/proc/make_blast()
var/obj/effect/temp_visual/hierophant/blast/B = new(loc, caster, friendly_fire_check)
B.damage = damage
B.monster_damage_boost = monster_damage_boost
/obj/effect/overlay/temp/hierophant/telegraph
/obj/effect/temp_visual/hierophant/telegraph
icon = 'icons/effects/96x96.dmi'
icon_state = "hierophant_telegraph"
pixel_x = -32
pixel_y = -32
duration = 3
/obj/effect/overlay/temp/hierophant/telegraph/diagonal
/obj/effect/temp_visual/hierophant/telegraph/diagonal
icon_state = "hierophant_telegraph_diagonal"
/obj/effect/overlay/temp/hierophant/telegraph/cardinal
/obj/effect/temp_visual/hierophant/telegraph/cardinal
icon_state = "hierophant_telegraph_cardinal"
/obj/effect/overlay/temp/hierophant/telegraph/teleport
/obj/effect/temp_visual/hierophant/telegraph/teleport
icon_state = "hierophant_telegraph_teleport"
duration = 9
/obj/effect/overlay/temp/hierophant/telegraph/edge
/obj/effect/temp_visual/hierophant/telegraph/edge
icon_state = "hierophant_telegraph_edge"
duration = 40
/obj/effect/overlay/temp/hierophant/blast
/obj/effect/temp_visual/hierophant/blast
icon_state = "hierophant_blast"
name = "vortex blast"
light_range = 1
@@ -561,7 +562,7 @@ Difficulty: Hard
var/friendly_fire_check = FALSE
var/bursting = FALSE //if we're bursting and need to hit anyone crossing us
/obj/effect/overlay/temp/hierophant/blast/Initialize(mapload, new_caster, friendly_fire)
/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire)
. = ..()
friendly_fire_check = friendly_fire
if(new_caster)
@@ -571,7 +572,7 @@ Difficulty: Hard
M.gets_drilled(caster)
INVOKE_ASYNC(src, .proc/blast)
/obj/effect/overlay/temp/hierophant/blast/proc/blast()
/obj/effect/temp_visual/hierophant/blast/proc/blast()
var/turf/T = get_turf(src)
if(!T)
return
@@ -582,12 +583,12 @@ Difficulty: Hard
sleep(1.3) //slightly forgiving; the burst animation is 1.5 deciseconds
bursting = FALSE //we no longer damage crossers
/obj/effect/overlay/temp/hierophant/blast/Crossed(atom/movable/AM)
/obj/effect/temp_visual/hierophant/blast/Crossed(atom/movable/AM)
..()
if(bursting)
do_damage(get_turf(src))
/obj/effect/overlay/temp/hierophant/blast/proc/do_damage(turf/T)
/obj/effect/temp_visual/hierophant/blast/proc/do_damage(turf/T)
for(var/mob/living/L in T.contents - hit_things) //find and damage mobs...
hit_things += L
if((friendly_fire_check && caster && caster.faction_check_mob(L)) || L.stat == DEAD)
@@ -634,7 +635,7 @@ Difficulty: Hard
INVOKE_ASYNC(H, /obj/item/weapon/hierophant_club.proc/prepare_icon_update)
if(do_after(user, 50, target = src))
playsound(src,'sound/magic/Blind.ogg', 200, 1, -4)
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(get_turf(src), user)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(get_turf(src), user)
to_chat(user, "<span class='hierophant_warning'>You collect [src], reattaching it to the club!</span>")
H.beacon = null
user.update_action_buttons_icon()
@@ -8,7 +8,7 @@
maxHealth = 1000
a_intent = INTENT_HARM
sentience_type = SENTIENCE_BOSS
environment_smash = 3
environment_smash = ENVIRONMENT_SMASH_RWALLS
obj_damage = 400
light_range = 3
faction = list("mining", "boss")
@@ -203,7 +203,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
if(..())
emote_see = list("aims menacingly")
obj_damage = 0
environment_smash = 0 //needed? seems weird for them to do so
environment_smash = ENVIRONMENT_SMASH_NONE //needed? seems weird for them to do so
ranged = 1
retreat_distance = 1 //just enough to shoot
minimum_distance = 6
@@ -4,7 +4,7 @@
faction = list("mining")
weather_immunities = list("lava","ash")
obj_damage = 30
environment_smash = 2
environment_smash = ENVIRONMENT_SMASH_WALLS
minbodytemp = 0
maxbodytemp = INFINITY
response_help = "pokes"
@@ -215,7 +215,7 @@
ranged_cooldown = 0
ranged_cooldown_time = 20
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
retreat_distance = 3
minimum_distance = 3
pass_flags = PASSTABLE
@@ -334,7 +334,7 @@
attack_sound = 'sound/weapons/pierce.ogg'
throw_message = "falls right through the strange body of the"
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
pass_flags = PASSTABLE
del_on_death = 1
@@ -595,7 +595,7 @@
aggro_vision_range = 9
idle_vision_range = 5
mob_size = MOB_SIZE_SMALL
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
var/wumbo = 0
var/inflate_cooldown = 0
loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER})
@@ -640,7 +640,7 @@
minimum_distance = 1
move_to_delay = 6
transform *= 2
environment_smash = 2
environment_smash = ENVIRONMENT_SMASH_WALLS
mob_size = MOB_SIZE_LARGE
speed = 1
addtimer(CALLBACK(src, .proc/Deflate), 100)
@@ -660,7 +660,7 @@
move_to_delay = 2
transform /= 2
inflate_cooldown = 4
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
mob_size = MOB_SIZE_SMALL
speed = 0
@@ -800,11 +800,12 @@
del_on_death = 1
stat_attack = 1
robust_searching = 1
var/can_infest_dead = FALSE
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life()
if(isturf(loc))
for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile
if(H.stat == UNCONSCIOUS)
if(H.stat == UNCONSCIOUS || (can_infest_dead && H.stat == DEAD))
infest(H)
..()
@@ -818,6 +819,58 @@
H.forceMove(L)
qdel(src)
//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions)
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced
stat_attack = 2
maxHealth = 120
health = 120
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
icon_state = "dwarf_legion"
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
stat_attack = 2
can_infest_dead = TRUE
//Legion that spawns Legions
/mob/living/simple_animal/hostile/spawner/legion
name = "legion"
desc = "One of many."
icon = 'icons/mob/lavaland/dragon.dmi'
icon_state = "legion"
icon_living = "legion"
icon_dead = "legion"
health = 450
maxHealth = 450
max_mobs = 3
spawn_time = 200
spawn_text = "peels itself off from"
melee_damage_lower = 20
melee_damage_upper = 20
anchored = FALSE
AIStatus = AI_ON
stop_automated_movement = FALSE
wander = TRUE
maxbodytemp = INFINITY
layer = MOB_LAYER
del_on_death = TRUE
sentience_type = SENTIENCE_BOSS
loot = list(/obj/item/organ/hivelord_core/legion = 3, /obj/effect/mob_spawn/human/corpse/damaged = 5)
move_to_delay = 14
vision_range = 5
aggro_vision_range = 9
idle_vision_range = 5
speed = 3
faction = list("mining")
weather_immunities = list("lava","ash")
obj_damage = 30
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
//Organ
/obj/item/organ/hivelord_core/legion
name = "legion's soul"
desc = "A strange rock that still crackles with power... its \
@@ -871,7 +924,7 @@
speak_chance = 1
turns_per_move = 8
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
move_to_delay = 15
response_help = "pets"
response_disarm = "gently pushes aside"
@@ -20,7 +20,7 @@
attacktext = "chomps"
attack_sound = 'sound/weapons/bite.ogg'
faction = list("mushroom")
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
stat_attack = 2
mouse_opacity = 1
speed = 1
@@ -22,7 +22,7 @@
faction = list("hostile")
attack_sound = 'sound/weapons/bite.ogg'
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
movement_type = FLYING
@@ -23,7 +23,7 @@
attacktext = "attacks"
attack_sound = 'sound/items/bikehorn.ogg'
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
del_on_death = 1
loot = list(/obj/effect/mob_spawn/human/clown/corpse)
@@ -20,6 +20,6 @@
attacktext = "hits"
attack_sound = 'sound/weapons/punch1.ogg'
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
del_on_death = 0
@@ -14,7 +14,7 @@
speed = 0
stat_attack = 1
robust_searching = 1
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
maxHealth = 100
health = 100
harm_intent_damage = 5
@@ -52,7 +52,7 @@
/mob/living/simple_animal/hostile/stickman/Initialize(mapload, var/wizard_summoned)
..()
new /obj/effect/overlay/temp/paper_scatter(src)
new /obj/effect/temp_visual/paper_scatter(src)
summoned_by_wizard = wizard_summoned
/mob/living/simple_animal/hostile/stickman/death()
@@ -131,7 +131,7 @@
minimum_distance = 10
retreat_distance = 10
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
/mob/living/simple_animal/hostile/syndicate/civilian/Aggro()
..()
@@ -150,7 +150,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
obj_damage = 0
environment_smash = 0
environment_smash = ENVIRONMENT_SMASH_NONE
attacktext = "cuts"
attack_sound = 'sound/weapons/bladeslice.ogg'
faction = list("syndicate")
@@ -51,7 +51,7 @@
var/attacktext = "attacks"
var/attack_sound = null
var/friendly = "nuzzles" //If the mob does no damage with it's attack
var/environment_smash = 0 //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls
var/environment_smash = ENVIRONMENT_SMASH_NONE //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls
var/speed = 1 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
@@ -249,7 +249,7 @@
/mob/living/simple_animal/gib_animation()
if(icon_gib)
new /obj/effect/overlay/temp/gib_animation/animal(loc, icon_gib)
new /obj/effect/temp_visual/gib_animation/animal(loc, icon_gib)
/mob/living/simple_animal/say_mod(input, message_mode)
if(speak_emote && speak_emote.len)
+2 -2
View File
@@ -293,14 +293,14 @@
if(!src || !isturf(src.loc) || !(A in view(src.loc)))
return 0
if(istype(A, /obj/effect/overlay/temp/point))
if(istype(A, /obj/effect/temp_visual/point))
return 0
var/tile = get_turf(A)
if (!tile)
return 0
new /obj/effect/overlay/temp/point(A,invisibility)
new /obj/effect/temp_visual/point(A,invisibility)
return 1
+7 -3
View File
@@ -242,12 +242,12 @@
L.loc = locate(locx,locy,mobloc.z)
var/limit = 2//For only two trailing shadows.
for(var/turf/T in getline(mobloc, L.loc))
new /obj/effect/overlay/temp/dir_setting/ninja/shadow(T, L.dir)
new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir)
limit--
if(limit<=0)
break
else
new /obj/effect/overlay/temp/dir_setting/ninja/shadow(mobloc, L.dir)
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
L.loc = get_step(L, direct)
L.setDir(direct)
if(3) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
@@ -295,8 +295,12 @@
return A
else
var/atom/movable/AM = A
if(AM == buckled) //Kind of unnecessary but let's just be sure
if(AM == buckled)
continue
if(ismob(AM))
var/mob/M = AM
if(M.buckled)
continue
if(!AM.CanPass(src) || AM.density)
if(AM.anchored)
return AM
+2 -2
View File
@@ -36,7 +36,7 @@
cut_overlays()
invisibility = INVISIBILITY_MAXIMUM
new /obj/effect/overlay/temp/monkeyify(loc)
new /obj/effect/temp_visual/monkeyify(loc)
sleep(22)
var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc )
@@ -186,7 +186,7 @@
icon = null
cut_overlays()
invisibility = INVISIBILITY_MAXIMUM
new /obj/effect/overlay/temp/monkeyify/humanify(loc)
new /obj/effect/temp_visual/monkeyify/humanify(loc)
sleep(22)
var/mob/living/carbon/human/O = new( loc )
for(var/obj/item/C in O.loc)
@@ -72,7 +72,7 @@ It is possible to destroy the net by the occupant or someone else.
M.dropItemToGround(W)
playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1)
new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(M), M.dir)
new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(M), M.dir)
visible_message("[M] suddenly vanishes!")
M.forceMove(pick(GLOB.holdingfacility)) //Throw mob in to the holding facility.
@@ -86,7 +86,7 @@ It is possible to destroy the net by the occupant or someone else.
spark_system.start()
playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1)
new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(M), M.dir)
new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(M), M.dir)
qdel(src)
else//And they are free.
@@ -27,7 +27,7 @@ Contents:
if(destination && isturf(mobloc))//So we don't teleport out of containers
playsound(H.loc, "sparks", 50, 1)
new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(H), H.dir)
new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir)
handle_teleport_grab(destination, H)
H.loc = destination
@@ -35,7 +35,7 @@ Contents:
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, "sparks", 50, 1)
new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(H), H.dir)
new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir)
destination.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
s_coold = 1
@@ -55,7 +55,7 @@ Contents:
var/turf/mobloc = get_turf(H.loc)//To make sure that certain things work properly below.
if(!T.density && isturf(mobloc))
playsound(H.loc, "sparks", 50, 1)
new /obj/effect/overlay/temp/dir_setting/ninja/phase/out(get_turf(H), H.dir)
new /obj/effect/temp_visual/dir_setting/ninja/phase/out(get_turf(H), H.dir)
handle_teleport_grab(T, H)
H.forceMove(T)
@@ -63,7 +63,7 @@ Contents:
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, "sparks", 50, 1)
new /obj/effect/overlay/temp/dir_setting/ninja/phase(get_turf(H), H.dir)
new /obj/effect/temp_visual/dir_setting/ninja/phase(get_turf(H), H.dir)
T.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
s_coold = 1
+2 -2
View File
@@ -44,8 +44,8 @@
..()
/obj/item/weapon/paper/New()
..()
/obj/item/weapon/paper/Initialize()
. = ..()
pixel_y = rand(-8, 8)
pixel_x = rand(-9, 9)
update_icon()
+1 -1
View File
@@ -110,7 +110,7 @@
papers.Add(P)
total_paper++
update_icon()
else if(istype(I, /obj/item/weapon/pen))
else if(istype(I, /obj/item/weapon/pen) && !bin_pen)
var/obj/item/weapon/pen/P = I
if(!user.transferItemToLoc(P, src))
return
+17 -17
View File
@@ -53,8 +53,8 @@
desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure."
icon = 'icons/obj/supermatter.dmi'
icon_state = "darkmatter_shard"
density = 1
anchored = 0
density = TRUE
anchored = FALSE
light_range = 4
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
@@ -74,7 +74,7 @@
var/emergency_alert = "CRYSTAL DELAMINATION IMMINENT."
var/explosion_point = 900
var/emergency_issued = 0
var/emergency_issued = FALSE
var/explosion_power = 12
var/temp_factor = 30
@@ -116,12 +116,12 @@
var/common_channel = null
//for logging
var/has_been_powered = 0
var/has_reached_emergency = 0
var/has_been_powered = FALSE
var/has_reached_emergency = FALSE
// For making hugbox supermatter
var/takes_damage = 1
var/produces_gas = 1
var/takes_damage = TRUE
var/produces_gas = TRUE
var/obj/effect/countdown/supermatter/countdown
/obj/machinery/power/supermatter_shard/make_frozen_visual()
@@ -385,7 +385,7 @@
/obj/machinery/power/supermatter_shard/bullet_act(obj/item/projectile/Proj)
var/turf/L = loc
if(!istype(L)) // We don't run process() when we are in space
return 0 // This stops people from being able to really power up the supermatter
return FALSE // This stops people from being able to really power up the supermatter
// Then bring it inside to explode instantly upon landing on a valid turf.
if(!istype(Proj.firer, /obj/machinery/power/emitter))
investigate_log("has been hit by [Proj] fired by [Proj.firer]", "supermatter")
@@ -394,10 +394,10 @@
if(!has_been_powered)
investigate_log("has been powered for the first time.", "supermatter")
message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].")
has_been_powered = 1
has_been_powered = TRUE
else if(takes_damage)
damage += Proj.damage * config_bullet_energy
return 0
return FALSE
/obj/machinery/power/supermatter_shard/singularity_act()
var/gain = 100
@@ -409,7 +409,7 @@
M << 'sound/effects/supermatter.ogg' //everyone goan know bout this
to_chat(M, "<span class='boldannounce'>A horrible screeching fills your ears, and a wave of dread washes over you...</span>")
qdel(src)
return(gain)
return gain
/obj/machinery/power/supermatter_shard/blob_act(obj/structure/blob/B)
if(B && !isspaceturf(loc)) //does nothing in space
@@ -450,7 +450,7 @@
user.visible_message("<span class='danger'>\The [user] reaches out and touches \the [src], inducing a resonance... [user.p_their()] body starts to glow and bursts into flames before flashing into ash.</span>",\
"<span class='userdanger'>You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"</span>",\
"<span class='italics'>You hear an unearthly noise as a wave of heat washes over you.</span>")
investigate_log("has been attacked (hand) by [user]", "supermatter")
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
Consume(user)
@@ -464,11 +464,11 @@
if(!istype(W) || (W.flags & ABSTRACT) || !istype(user))
return
if(user.drop_item(W))
Consume(W)
user.visible_message("<span class='danger'>As [user] touches \the [src] with \a [W], silence fills the room...</span>",\
"<span class='userdanger'>You touch \the [src] with \the [W], and everything suddenly goes silent.</span>\n<span class='notice'>\The [W] flashes into dust as you flinch away from \the [src].</span>",\
"<span class='italics'>Everything suddenly goes silent.</span>")
investigate_log("has been attacked ([W]) by [user]", "supermatter")
Consume(W)
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
radiation_pulse(get_turf(src), 1, 1, 150, 1)
@@ -517,15 +517,15 @@
// When you wanna make a supermatter shard for the dramatic effect, but
// don't want it exploding suddenly
/obj/machinery/power/supermatter_shard/hugbox
takes_damage = 0
produces_gas = 0
takes_damage = FALSE
produces_gas = FALSE
/obj/machinery/power/supermatter_shard/crystal
name = "supermatter crystal"
desc = "A strangely translucent and iridescent crystal."
base_icon_state = "darkmatter"
icon_state = "darkmatter"
anchored = 1
anchored = TRUE
gasefficency = 0.15
explosion_power = 35
+1 -1
View File
@@ -16,7 +16,7 @@
var/randomspread = 0 //Randomspread for automatics
var/delay = 0 //Delay for energy weapons
var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
var/firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect //the visual effect appearing when the ammo is fired.
var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the ammo is fired.
/obj/item/ammo_casing/New()
@@ -45,7 +45,7 @@
icon_state = "s-casing-live"
projectile_type = /obj/item/projectile/beam
fire_sound = 'sound/weapons/Laser.ogg'
firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy
firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
/obj/item/ammo_casing/caseless/laser/gatling
projectile_type = /obj/item/projectile/beam/weak
@@ -6,7 +6,7 @@
var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
var/select_name = "energy"
fire_sound = 'sound/weapons/Laser.ogg'
firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/energy
firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy
/obj/item/ammo_casing/energy/chameleon
projectile_type = /obj/item/projectile/energy/chameleon
@@ -2,7 +2,7 @@
name = "magic casing"
desc = "I didn't even know magic needed ammo..."
projectile_type = /obj/item/projectile/magic
firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect/magic
firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic
/obj/item/ammo_casing/magic/change
projectile_type = /obj/item/projectile/magic/change
@@ -89,4 +89,4 @@
select_name = "spraydown"
fire_sound = 'sound/weapons/gunshot_smg.ogg'
e_cost = 20
firing_effect_type = /obj/effect/overlay/temp/dir_setting/firing_effect
firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect
@@ -13,6 +13,21 @@
max_ammo = 8
multiple_sprites = 2
/obj/item/ammo_box/magazine/m10mm/rifle
name = "rifle magazine (10mm)"
desc = "A well-worn magazine fitted for the surplus rifle."
icon_state = "75-8"
origin_tech = "combat=2"
ammo_type = /obj/item/ammo_casing/c10mm
caliber = "10mm"
max_ammo = 10
/obj/item/ammo_box/magazine/m10mm/rifle/update_icon()
if(ammo_count())
icon_state = "75-8"
else
icon_state = "75-0"
/obj/item/ammo_box/magazine/m10mm/fire
name = "pistol magazine (10mm incendiary)"
desc = "A gun magazine. Loaded with rounds which ignite the target."
@@ -52,16 +67,31 @@
/obj/item/ammo_box/magazine/wt550m9/wtap
name = "wt550 magazine (Armour Piercing 4.6x30mm)"
icon_state = "46x30mmtA-20"
ammo_type = /obj/item/ammo_casing/c46x30mmap
/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon()
..()
icon_state = "46x30mmtA-[round(ammo_count(),4)]"
/obj/item/ammo_box/magazine/wt550m9/wttx
name = "wt550 magazine (Toxin Tipped 4.6x30mm)"
icon_state = "46x30mmtT-20"
ammo_type = /obj/item/ammo_casing/c46x30mmtox
/obj/item/ammo_box/magazine/wt550m9/wttx/update_icon()
..()
icon_state = "46x30mmtT-[round(ammo_count(),4)]"
/obj/item/ammo_box/magazine/wt550m9/wtic
name = "wt550 magazine (Incindiary 4.6x30mm)"
icon_state = "46x30mmtI-20"
ammo_type = /obj/item/ammo_casing/c46x30mminc
/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon()
..()
icon_state = "46x30mmtI-[round(ammo_count(),4)]"
/obj/item/ammo_box/magazine/uzim9mm
name = "uzi magazine (9mm)"
icon_state = "uzi9mm-32"
@@ -109,6 +109,11 @@
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
max_ammo = 6
/obj/item/ammo_box/magazine/internal/shot/com/compact
name = "compact combat shotgun internal magazine"
ammo_type = /obj/item/ammo_casing/shotgun/buckshot
max_ammo = 4
/obj/item/ammo_box/magazine/internal/shot/dual
name = "double-barrel shotgun internal magazine"
max_ammo = 2
@@ -375,8 +375,29 @@
pin = /obj/item/device/firing_pin/implant/pindicate
origin_tech = "combat=7;syndicate=6"
// Old Semi-Auto Rifle //
/obj/item/weapon/gun/ballistic/automatic/surplus
name = "Surplus Rifle"
desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing."
origin_tech = "combat=3;materials=2"
icon_state = "surplus"
item_state = "moistnugget"
weapon_weight = WEAPON_HEAVY
mag_type = /obj/item/ammo_box/magazine/m10mm/rifle
fire_delay = 30
burst_size = 1
can_unsuppress = 1
can_suppress = 1
w_class = WEIGHT_CLASS_HUGE
slot_flags = SLOT_BACK
actions_types = list()
/obj/item/weapon/gun/ballistic/automatic/surplus/update_icon()
if(magazine)
icon_state = "surplus"
else
icon_state = "surplus-e"
// Laser rifle (rechargeable magazine) //
@@ -344,6 +344,15 @@
slung = 0
update_icon()
/obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised/sawn
name = "sawn-off improvised shotgun"
desc = "A single-shot shotgun, better not miss"
icon_state = "ishotgun"
item_state = "gun"
w_class = WEIGHT_CLASS_NORMAL
sawn_state = SAWN_OFF
slot_flags = SLOT_BELT
/obj/item/weapon/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course.
clumsy_check = 0
@@ -192,6 +192,14 @@
mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_HUGE
/obj/item/weapon/gun/ballistic/shotgun/automatic/combat/compact
name = "compact combat shotgun"
desc = "A compact version of the semi automatic combat shotgun. For close encounters."
icon_state = "cshotgunc"
origin_tech = "combat=4;materials=2"
mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact
w_class = WEIGHT_CLASS_BULKY
//Dual Feed Shotgun
/obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube
@@ -198,7 +198,7 @@
if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
M.gets_drilled(firer)
var/obj/effect/overlay/temp/kinetic_blast/K = new /obj/effect/overlay/temp/kinetic_blast(target_turf)
var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf)
K.color = color
for(var/obj/item/borg/upgrade/modkit/M in kinetic_modules)
if(QDELETED(M)) //whoever shot this was very, very unfortunate.
@@ -358,7 +358,7 @@
/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target)
if(stats_stolen)
return
new /obj/effect/overlay/temp/explosion/fast(target_turf)
new /obj/effect/temp_visual/explosion/fast(target_turf)
if(turf_aoe)
for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
if(ismineralturf(T))
@@ -370,7 +370,6 @@
L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor)
to_chat(L, "<span class='userdanger'>You're struck by a [K.name]!</span>")
/obj/item/borg/upgrade/modkit/aoe/turfs
name = "mining explosion"
desc = "Causes the kinetic accelerator to destroy rock in an AoE."
@@ -392,11 +391,11 @@
//Indoors
/obj/item/borg/upgrade/modkit/indoors
name = "decrease pressure penalty"
desc = "Increases the damage a kinetic accelerator does in a high pressure environment."
desc = "A syndicate modification kit that increases the damage a kinetic accelerator does in a high pressure environment."
modifier = 2
denied_type = /obj/item/borg/upgrade/modkit/indoors
maximum_of_type = 2
cost = 40
cost = 35
/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K)
K.pressure_decrease *= modifier
@@ -5,7 +5,7 @@
item_state = null
w_class = WEIGHT_CLASS_BULKY
force = 10
modifystate = TRUE
modifystate = TRUE
flags = CONDUCT
slot_flags = SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
@@ -40,7 +40,7 @@
w_class = WEIGHT_CLASS_NORMAL
slot_flags = SLOT_BELT
icon_state = "pulse_carbine"
item_state = null
item_state = null
cell_type = "/obj/item/weapon/stock_parts/cell/pulse/carbine"
can_flashlight = 1
flight_x_offset = 18
+1 -1
View File
@@ -113,7 +113,7 @@
/obj/item/weapon/gun/medbeam/proc/on_beam_tick(var/mob/living/target)
if(target.health != target.maxHealth)
new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF")
new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
target.adjustBruteLoss(-4)
target.adjustFireLoss(-4)
return
+4 -4
View File
@@ -90,9 +90,9 @@
if(starting)
splatter_dir = get_dir(starting, target_loca)
if(isalien(L))
new /obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir)
new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir)
else
new /obj/effect/overlay/temp/dir_setting/bloodsplatter(target_loca, splatter_dir)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir)
if(prob(33))
L.add_splatter_floor(target_loca)
else if(impact_effect_type)
@@ -224,7 +224,7 @@
pixel_y_offset += 32
old_pixel_y += 32
new_y--
pixel_x = old_pixel_x
pixel_y = old_pixel_y
step_towards(src, locate(new_x, new_y, z))
@@ -237,7 +237,7 @@
animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW)
old_pixel_x = pixel_x_offset
old_pixel_y = pixel_y_offset
if(original && (original.layer>=2.75) || ismob(original))
if(loc == get_turf(original))
if(!(original in permutated))
+11 -11
View File
@@ -9,7 +9,7 @@
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
flag = "laser"
eyeblur = 2
impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/laser
@@ -25,7 +25,7 @@
var/mob/living/carbon/M = target
M.IgniteMob()
else if(isturf(target))
impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser/wall
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser/wall
/obj/item/projectile/beam/weak
damage = 15
@@ -48,7 +48,7 @@
irradiate = 30
range = 15
forcedodge = 1
impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
light_color = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/disabler
@@ -59,14 +59,14 @@
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
eyeblur = 0
impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/pulse
name = "pulse"
icon_state = "u_laser"
damage = 50
impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/pulse/on_hit(atom/target, blocked = 0)
@@ -94,7 +94,7 @@
damage = 30
legacy = 1
animate_movement = SLIDE_STEPS
impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
light_color = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/emitter/singularity_pull()
@@ -108,7 +108,7 @@
damage_type = STAMINA
flag = "laser"
var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0)
@@ -122,7 +122,7 @@
/obj/item/projectile/beam/lasertag/redtag
icon_state = "laser"
suit_types = list(/obj/item/clothing/suit/bluetag)
impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/lasertag/bluetag
@@ -134,17 +134,17 @@
icon_state = "purple_laser"
damage = 200
damage_type = BURN
impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
light_color = LIGHT_COLOR_PURPLE
/obj/item/projectile/beam/instakill/blue
icon_state = "blue_laser"
impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/instakill/red
icon_state = "red_laser"
impact_effect_type = /obj/effect/overlay/temp/impact_effect/red_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/instakill/on_hit(atom/target)
+28 -28
View File
@@ -6,7 +6,7 @@
nodamage = 0
flag = "bullet"
hitsound_wall = "ricochet"
impact_effect_type = /obj/effect/overlay/temp/impact_effect
impact_effect_type = /obj/effect/temp_visual/impact_effect
/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage
damage = 5
@@ -190,7 +190,7 @@
name = "dart"
icon_state = "cbbolt"
damage = 6
var/piercing = FALSE
var/piercing = FALSE
/obj/item/projectile/bullet/dart/New()
..()
@@ -201,15 +201,15 @@
if(iscarbon(target))
var/mob/living/carbon/M = target
if(blocked != 100) // not completely blocked
if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
if(M.can_inject(null, FALSE, def_zone, piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
..()
reagents.reaction(M, INJECT)
reagents.trans_to(M, reagents.total_volume)
return TRUE
return TRUE
else
blocked = 100
target.visible_message("<span class='danger'>\The [src] was deflected!</span>", \
"<span class='userdanger'>You were protected against \the [src]!</span>")
target.visible_message("<span class='danger'>\The [src] was deflected!</span>", \
"<span class='userdanger'>You were protected against \the [src]!</span>")
..(target, blocked)
reagents.set_reacting(TRUE)
@@ -240,28 +240,28 @@
nodamage = 1
. = ..() // Execute the rest of the code.
/obj/item/projectile/bullet/dnainjector
name = "\improper DNA injector"
icon_state = "syringeproj"
var/obj/item/weapon/dnainjector/injector
/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0)
if(iscarbon(target))
var/mob/living/carbon/M = target
if(blocked != 100)
if(M.can_inject(null, FALSE, def_zone, FALSE))
if(injector.inject(M, firer))
QDEL_NULL(injector)
return TRUE
else
blocked = 100
target.visible_message("<span class='danger'>\The [src] was deflected!</span>", \
"<span class='userdanger'>You were protected against \the [src]!</span>")
return ..()
/obj/item/projectile/bullet/dnainjector/Destroy()
QDEL_NULL(injector)
return ..()
/obj/item/projectile/bullet/dnainjector
name = "\improper DNA injector"
icon_state = "syringeproj"
var/obj/item/weapon/dnainjector/injector
/obj/item/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0)
if(iscarbon(target))
var/mob/living/carbon/M = target
if(blocked != 100)
if(M.can_inject(null, FALSE, def_zone, FALSE))
if(injector.inject(M, firer))
QDEL_NULL(injector)
return TRUE
else
blocked = 100
target.visible_message("<span class='danger'>\The [src] was deflected!</span>", \
"<span class='userdanger'>You were protected against \the [src]!</span>")
return ..()
/obj/item/projectile/bullet/dnainjector/Destroy()
QDEL_NULL(injector)
return ..()
//// SNIPER BULLETS
@@ -135,7 +135,7 @@
damage = 20
damage_type = CLONE
irradiate = 10
impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
/obj/item/projectile/energy/dart //ninja throwing dart
name = "dart"
@@ -164,7 +164,7 @@
/obj/item/projectile/energy/tesla
name = "tesla bolt"
icon_state = "tesla_projectile"
impact_effect_type = /obj/effect/overlay/temp/impact_effect/blue_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
var/chain
/obj/item/projectile/energy/tesla/fire(setAngle)
@@ -7,7 +7,6 @@ obj/item/projectile/energy/plasmabolt
damage_type = BURN
hitsound = 'sound/weapons/sear.ogg'
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
impact_effect_type = /obj/effect/overlay/temp/impact_effect/green_laser
light_range = 3
light_color = LIGHT_COLOR_GREEN
+12 -8
View File
@@ -5,7 +5,7 @@
damage_type = BURN
nodamage = 1
flag = "energy"
impact_effect_type = /obj/effect/overlay/temp/impact_effect/ion
impact_effect_type = /obj/effect/temp_visual/impact_effect/ion
/obj/item/projectile/ion/on_hit(atom/target, blocked = 0)
@@ -202,7 +202,8 @@
damage = 5
range = 3.5 //works as 4, but doubles to 7
dismemberment = 20
impact_effect_type = /obj/effect/overlay/temp/impact_effect/purple_laser
impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
var/mine_range = 3 //mines this many additional tiles
/obj/item/projectile/plasma/Initialize()
. = ..()
@@ -215,24 +216,27 @@
if(pressure < 60)
name = "full strength [name]"
damage *= 4
range *= 2
/obj/item/projectile/plasma/on_hit(atom/target)
. = ..()
if(ismineralturf(target))
var/turf/closed/mineral/M = target
M.gets_drilled(firer)
Range()
if(mine_range)
mine_range--
range++
if(range > 0)
return -1
/obj/item/projectile/plasma/adv
damage = 7
range = 5
mine_range = 5
/obj/item/projectile/plasma/adv/mech
damage = 10
range = 6
range = 9
mine_range = 3
/obj/item/projectile/plasma/turret
//Between normal and advanced for damage, made a beam so not the turret does not destroy glass
@@ -270,7 +274,7 @@
A.throw_at(throwtarget,power+1,1)
thrown_items[A] = A
for(var/turf/F in range(T,power))
new /obj/effect/overlay/temp/gravpush(F)
new /obj/effect/temp_visual/gravpush(F)
/obj/item/projectile/gravityattract
name = "attraction bolt"
@@ -300,7 +304,7 @@
A.throw_at(T, power+1, 1)
thrown_items[A] = A
for(var/turf/F in range(T,power))
new /obj/effect/overlay/temp/gravpush(F)
new /obj/effect/temp_visual/gravpush(F)
/obj/item/projectile/gravitychaos
name = "gravitational blast"
@@ -330,5 +334,5 @@
A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinal)), power+1, 1)
thrown_items[A] = A
for(var/turf/Z in range(T,power))
new /obj/effect/overlay/temp/gravpush(Z)
new /obj/effect/temp_visual/gravpush(Z)
+2 -2
View File
@@ -453,14 +453,14 @@
/datum/reagents/proc/check_ignoreslow(mob/M)
if(istype(M, /mob))
if(M.reagents.has_reagent("morphine")||M.reagents.has_reagent("ephedrine"))
if(M.reagents.has_reagent("morphine"))
return 1
else
M.status_flags &= ~IGNORESLOWDOWN
/datum/reagents/proc/check_gofast(mob/M)
if(istype(M, /mob))
if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulants"))
if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulants")||M.reagents.has_reagent("ephedrine"))
return 1
else
M.status_flags &= ~GOTTAGOFAST

Some files were not shown because too many files have changed in this diff Show More