Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into MOREDOTS

This commit is contained in:
Aurorablade
2018-02-02 01:26:12 -05:00
317 changed files with 5139 additions and 3656 deletions
+7 -1
View File
@@ -32,7 +32,13 @@
for(var/client/C in admins)
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob))
to_chat(C, "<span class='[check_rights(R_ADMIN, 0) ? "mentor_channel_admin" : "mentor_channel"]'>MENTOR: <span class='name'>[key_name(usr, 1)]</span> ([admin_jump_link(mob)]): <span class='message'>[msg]</span></span>")
var/display_name = key
if(holder.fakekey)
if(C.holder && C.holder.rights & R_ADMIN)
display_name = "[holder.fakekey]/([key])"
else
display_name = holder.fakekey
to_chat(C, "<span class='[check_rights(R_ADMIN, 0) ? "mentor_channel_admin" : "mentor_channel"]'>MENTOR: <span class='name'>[display_name]</span> ([admin_jump_link(mob)]): <span class='message'>[msg]</span></span>")
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+10 -2
View File
@@ -577,7 +577,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/list/choices = list(
"strip",
"as job...",
"emergency response team member",
"emergency response team member",
"emergency response team leader"
)
@@ -642,7 +642,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(dresscode == "emergency response team leader")
equip_team.equip_officer("Commander", M)
else
switch(alert("Loadout Type", "Emergency Response Team", "Security", "Engineer", "Medic"))
var/list/ert_outfits = list("Security", "Engineer", "Medic", "Janitor", "Paranormal")
var/echoice = input("Loadout Type", "Emergency Response Team") as null|anything in ert_outfits
if(!echoice)
return
switch(echoice)
if("Commander")
equip_team.equip_officer("Commander", M)
if("Security")
@@ -651,6 +655,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
equip_team.equip_officer("Engineer", M)
if("Medic")
equip_team.equip_officer("Medic", M)
if("Janitor")
equip_team.equip_officer("Janitor", M)
if("Paranormal")
equip_team.equip_officer("Paranormal", M)
else
to_chat(src, "Invalid ERT Loadout selected")
+2 -2
View File
@@ -1,7 +1,7 @@
var/list/VVlocked = list("vars", "var_edited", "client", "firemut", "ishulk", "telekinesis", "xray", "ka", "virus", "viruses", "cuffed", "last_eaten", "unlock_content") // R_DEBUG
var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays", "resize") // R_EVENT | R_DEBUG
var/list/VVckey_edit = list("key", "ckey") // R_EVENT | R_DEBUG
var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width", "bound_x", "bound_y") // R_DEBUG + warning
var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height", "bound_width", "bound_x", "bound_y") // R_DEBUG + warning
/client/proc/vv_get_class(var/var_value)
if(isnull(var_value))
. = VV_NULL
@@ -615,4 +615,4 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
log_to_dd("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_new]")
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [var_new]"
message_admins(msg)
message_admins(msg)
+18 -2
View File
@@ -576,7 +576,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
command_announcement.Announce(input, customname, MsgSound[beepsound], , , type)
print_command_report(input, "[command_name()] Update")
else if("No")
if("No")
//same thing as the blob stuff - it's not public, so it's classified, dammit
command_announcer.autosay("A classified message has been printed out at all communication consoles.");
print_command_report(input, "Classified [command_name()] Update")
@@ -763,6 +763,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm != "Yes") return
if(alert("Set Shuttle Recallable (Select Yes unless you know what this does)", "Recallable?", "Yes", "No") == "Yes")
shuttle_master.emergency.canRecall = TRUE
else
shuttle_master.emergency.canRecall = FALSE
shuttle_master.emergency.request()
feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -781,7 +786,18 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(shuttle_master.emergency.mode >= SHUTTLE_DOCKED)
return
shuttle_master.emergency.cancel()
if(shuttle_master.emergency.canRecall == FALSE)
if(alert("Shuttle is currently set to be nonrecallable. Recalling may break things. Respect Recall Status?", "Override Recall Status?", "Yes", "No") == "Yes")
return
else
var/keepStatus = alert("Maintain recall status on future shuttle calls?", "Maintain Status?", "Yes", "No") == "Yes" //Keeps or drops recallability
shuttle_master.emergency.canRecall = TRUE // must be true for cancel proc to work
shuttle_master.emergency.cancel()
if(keepStatus)
shuttle_master.emergency.canRecall = FALSE // restores original status
else
shuttle_master.emergency.cancel()
feedback_add_details("admin_verb","CCSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] admin-recalled the emergency shuttle.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] admin-recalled the emergency shuttle.</span>")
+2
View File
@@ -418,6 +418,8 @@
preferences_datums[ckey] = prefs
prefs.last_ip = address //these are gonna be used for banning
prefs.last_id = computer_id //these are gonna be used for banning
if(world.byond_version >= 511 && byond_version >= 511 && prefs.clientfps)
fps = prefs.clientfps
spawn() // Goonchat does some non-instant checks in start()
chatOutput.start()
@@ -17,12 +17,12 @@
/datum/gear/shoes/fancysandals
display_name = "sandals, fancy"
cost = 5
cost = 2
path = /obj/item/clothing/shoes/sandal/fancy
/datum/gear/shoes/dressshoes
display_name = "dress shoes"
cost = 5
cost = 2
path = /obj/item/clothing/shoes/centcom
/datum/gear/shoes/cowboyboots
+19 -5
View File
@@ -68,6 +68,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
#define TAB_GEAR 2
/datum/preferences
var/client/parent
//doohickeys for savefiles
// var/path
var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
@@ -94,6 +95,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255
var/windowflashing = TRUE
var/clientfps = 0
//ghostly preferences
var/ghost_anonsay = 0
@@ -203,6 +205,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/gear_tab = "General"
/datum/preferences/New(client/C)
parent = C
b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
max_gear_slots = config.max_loadout_points
@@ -444,11 +447,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "<b>Donator Publicity:</b> <a href='?_src_=prefs;preference=donor_public'><b>[(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
dat += "<b>Randomized character slot:</b> <a href='?_src_=prefs;preference=randomslot'><b>[randomslot ? "Yes" : "No"]</b></a><br>"
dat += "<b>Ghost ears:</b> <a href='?_src_=prefs;preference=ghost_ears'><b>[(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]</b></a><br>"
dat += "<b>Ghost sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]</b></a><br>"
dat += "<b>Ghost radio:</b> <a href='?_src_=prefs;preference=ghost_radio'><b>[(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]</b></a><br>"
dat += "<b>Ghost ears:</b> <a href='?_src_=prefs;preference=ghost_ears'><b>[(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</b></a><br>"
dat += "<b>Ghost sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]</b></a><br>"
dat += "<b>Ghost radio:</b> <a href='?_src_=prefs;preference=ghost_radio'><b>[(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]</b></a><br>"
dat += "<b>Deadchat anonymity:</b> <a href='?_src_=prefs;preference=ghost_anonsay'><b>[ghost_anonsay ? "Anonymous" : "Not Anonymous"]</b></a><br>"
dat += "<b>FPS:</b> <a href='?_src_=prefs;preference=clientfps;task=input'>[clientfps]</a><br>"
dat += "</td><td width='300px' height='300px' valign='top'>"
dat += "<h2>Special Role Settings</h2>"
if(jobban_isbanned(user, "Syndicate"))
@@ -1887,6 +1890,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("Mechanical")
organ_data[organ] = "mechanical"
if("clientfps")
var/version_message
if(user.client && user.client.byond_version < 511)
version_message = "\nYou need to be using byond version 511 or later to take advantage of this feature, your version of [user.client.byond_version] is too low"
if(world.byond_version < 511)
version_message += "\nThis server does not currently support client side fps. You can set now for when it does."
var/desiredfps = input(user, "Choose your desired fps.[version_message]\n(0 = synced with server tick rate (currently:[world.fps]))", "Character Preference", clientfps) as null|num
if(!isnull(desiredfps))
clientfps = desiredfps
if(world.byond_version >= 511 && user.client && user.client.byond_version >= 511)
parent.fps = clientfps
/*
if("skin_style")
var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3")
@@ -1932,7 +1947,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("hear_adminhelps")
sound ^= SOUND_ADMINHELP
if("ui")
switch(UI_style)
if("Midnight")
@@ -16,7 +16,8 @@
lastchangelog,
windowflashing,
ghost_anonsay,
exp
exp,
clientfps
FROM [format_table_name("player")]
WHERE ckey='[C.ckey]'"}
)
@@ -46,6 +47,7 @@
windowflashing = text2num(query.item[14])
ghost_anonsay = text2num(query.item[15])
exp = query.item[16]
clientfps = text2num(query.item[17])
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
@@ -63,6 +65,7 @@
windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing))
ghost_anonsay = sanitize_integer(ghost_anonsay, 0, 1, initial(ghost_anonsay))
exp = sanitize_text(exp, initial(exp))
clientfps = sanitize_integer(clientfps, 0, 1000, initial(clientfps))
return 1
/datum/preferences/proc/save_preferences(client/C)
@@ -89,7 +92,8 @@
show_ghostitem_attack='[show_ghostitem_attack]',
lastchangelog='[lastchangelog]',
windowflashing='[windowflashing]',
ghost_anonsay='[ghost_anonsay]'
ghost_anonsay='[ghost_anonsay]',
clientfps='[clientfps]'
WHERE ckey='[C.ckey]'"}
)
@@ -40,8 +40,6 @@
to_chat(H, "<font color='blue'><b>You are now invisible to normal detection.</b></font>")
H.invisibility = INVISIBILITY_LEVEL_TWO
anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null)
H.visible_message("[H.name] vanishes into thin air!",1)
/obj/item/rig_module/stealth_field/deactivate()
@@ -54,8 +52,7 @@
to_chat(H, "<span class='danger'>You are now visible.</span>")
H.invisibility = 0
anim(get_turf(H), H,'icons/mob/mob.dmi',,"uncloak",,H.dir)
anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null)
new /obj/effect/temp_visual/dir_setting/ninja(get_turf(H), H.dir)
for(var/mob/O in oviewers(H))
O.show_message("[H.name] appears from thin air!",1)
@@ -85,7 +82,7 @@
holder.spark_system.start()
playsound(T, 'sound/effects/phasein.ogg', 25, 1)
playsound(T, 'sound/effects/sparks2.ogg', 50, 1)
anim(T,M,'icons/mob/mob.dmi',,"phasein",,M.dir)
new /obj/effect/temp_visual/dir_setting/ninja/phase(T, M.dir)
/obj/item/rig_module/teleporter/proc/phase_out(var/mob/M,var/turf/T)
@@ -93,7 +90,7 @@
return
playsound(T, "sparks", 50, 1)
anim(T,M,'icons/mob/mob.dmi',,"phaseout",,M.dir)
new /obj/effect/temp_visual/dir_setting/ninja/phase/out(T, M.dir)
/obj/item/rig_module/teleporter/engage(var/atom/target, var/notify_ai)
+16
View File
@@ -1246,3 +1246,19 @@
icon_state = "sheetcosmos"
item_state = "sheetcosmos"
item_color = "sheetcosmos"
/obj/item/clothing/head/fluff/lfbowler //Lightfire: Hyperion
name = "Classy bowler hat"
desc = "a very classy looking bowler hat"
icon = 'icons/obj/custom_items.dmi'
icon_state = "bowler_lightfire"
/obj/item/clothing/under/fluff/lfvicsuit //Lightfire: Hyperion
name = "Classy victorian suit"
desc = "A blue and black victorian suit with silver buttons, very fancy!"
icon = 'icons/obj/custom_items.dmi'
icon_state = "victorianlightfire"
item_state = "victorianvest"
item_color = "victorianlightfire"
displays_id = FALSE
+2 -2
View File
@@ -72,8 +72,8 @@ var/global/list/all_money_accounts = list()
T.amount = starting_funds
if(!source_db)
//set a random date, time and location some time over the past few decades
T.date = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 25[rand(10,56)]"
T.time = "[rand(0,24)]:[rand(11,59)]"
T.date = "[num2text(rand(1,31))] [pick(month_names)], [rand(game_year - 20,game_year - 1)]"
T.time = "[rand(0,23)]:[rand(0,59)]"
T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]"
M.account_number = rand(111111, 999999)
+1 -1
View File
@@ -55,7 +55,7 @@
vendor_account = department_accounts["Vendor"]
if(!current_date_string)
current_date_string = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 2557"
current_date_string = "[time2text(world.timeofday, "DD MM")], [game_year]"
machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]"
..()
@@ -429,9 +429,9 @@
component_parts.Cut()
component_parts = null
/obj/machinery/smartfridge/drying_rack/Destroy()
/obj/machinery/smartfridge/drying_rack/on_deconstruction()
new /obj/item/stack/sheet/wood(loc, 10)
return ..()
..()
/obj/machinery/smartfridge/drying_rack/RefreshParts()
return
+1 -1
View File
@@ -704,7 +704,7 @@
adjustPests(rand(2,4))
// FEED ME SEYMOUR
if(S.has_reagent("strangereagent", 1))
if(S.has_reagent("strange_reagent", 1))
spawnplant()
// The best stuff there is. For testing/debugging.
+5 -5
View File
@@ -562,7 +562,7 @@
/obj/item/device/wormhole_jaunter/attack_self(mob/user)
var/turf/device_turf = get_turf(user)
if(!device_turf||is_teleport_allowed(device_turf.z))
if(!device_turf || !is_teleport_allowed(device_turf.z))
to_chat(user, "<span class='notice'>You're having difficulties getting the [src.name] to work.</span>")
return
else
@@ -906,10 +906,10 @@
minerals += M
if(minerals.len)
for(var/turf/simulated/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/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
layer = 18
icon = 'icons/turf/mining.dmi'
anchored = 1
@@ -1009,7 +1009,7 @@
var/target_turf = get_turf(target)
if(istype(target_turf, /turf/simulated/mineral))
var/turf/simulated/mineral/M = target_turf
new /obj/effect/overlay/temp/kinetic_blast(M)
new /obj/effect/temp_visual/kinetic_blast(M)
M.gets_drilled(firer)
..()
@@ -1035,7 +1035,7 @@
return
if(proximity_flag && target == mark && isliving(target))
var/mob/living/L = target
new /obj/effect/overlay/temp/kinetic_blast(get_turf(L))
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
mark = 0
if(L.mob_size >= MOB_SIZE_LARGE)
L.underlays -= marked_image
@@ -189,7 +189,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>")
@@ -211,6 +211,6 @@
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
@@ -203,7 +203,7 @@
NewTerrainFloors = /turf/simulated/floor/grass
NewTerrainWalls = /turf/simulated/wall/mineral/sandstone
NewTerrainChairs = /obj/structure/stool/bed/chair/wood/normal
NewTerrainTables = /obj/structure/table/woodentable
NewTerrainTables = /obj/structure/table/wood
NewFlora = list(/obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/fernybush, /obj/structure/flora/ausbushes/leafybush,
/obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/sunnybush, /obj/structure/flora/tree/palm, /mob/living/carbon/human/monkey,
/obj/item/weapon/gun/projectile/bow, /obj/item/weapon/storage/backpack/quiver/full)
@@ -284,7 +284,7 @@
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
@@ -367,7 +367,7 @@
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()
if(..())
@@ -388,7 +388,7 @@
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
@@ -38,7 +38,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
new /obj/effect/overlay/temp/hierophant/chaser(get_turf(user), user, target, 1.5, friendly_fire_check)
new /obj/effect/temp_visual/hierophant/chaser(get_turf(user), user, target, 1.5, friendly_fire_check)
add_logs(user, target, "fired a chaser at", src)
else
spawn(0)
@@ -63,7 +63,7 @@
if(do_after(user, 50, target = user))
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)
var/obj/effect/hierophant/H = new/obj/effect/hierophant(T)
rune = H
user.update_action_buttons_icon()
@@ -93,8 +93,8 @@
to_chat(user, "<span class='warning'>The rune is blocked by something, preventing teleportation!</span>")
user.update_action_buttons_icon()
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/blink.ogg', 200, 1)
//playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
playsound(source,'sound/magic/blink.ogg', 200, 1)
@@ -110,13 +110,13 @@
user.update_action_buttons_icon()
return
add_logs(user, rune, "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) //blasts produced will not hurt allies
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) //but absolutely will hurt enemies
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))
spawn(0)
@@ -155,11 +155,11 @@
/obj/item/weapon/hierophant_staff/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/magic/blink.ogg', 200, 1)
//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 cardinal)
spawn(0)
blast_wall(T, d, user)
@@ -173,16 +173,16 @@
for(var/i in 1 to range)
if(!J)
return
new /obj/effect/overlay/temp/hierophant/blast(J, user, friendly_fire_check)
new /obj/effect/temp_visual/hierophant/blast(J, user, friendly_fire_check)
previousturf = J
J = get_step(previousturf, dir)
/obj/item/weapon/hierophant_staff/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/magic/blink.ogg', 200, 1)
//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, user, friendly_fire_check)
new /obj/effect/temp_visual/hierophant/blast(t, user, friendly_fire_check)
+12 -5
View File
@@ -373,14 +373,21 @@
//Door
/obj/machinery/door/airlock/survival_pod
icon = 'icons/obj/doors/survival.dmi'
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_pod
opacity = 0
glass = 1
/obj/machinery/door/airlock/survival_pod/glass
opacity = FALSE
glass = TRUE
/obj/structure/door_assembly/door_assembly_pod
base_icon_state = "survival_pod"
glass_type = "/survival_pod"
name = "pod airlock assembly"
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
base_name = "pod airlock"
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
airlock_type = /obj/machinery/door/airlock/survival_pod
glass_type = /obj/machinery/door/airlock/survival_pod/glass
//Windoor
/obj/machinery/door/window/survival_pod
+20 -21
View File
@@ -2,20 +2,6 @@
var/canEnterVentWith = "/obj/item/weapon/implant=0&/obj/item/clothing/mask/facehugger=0&/obj/item/device/radio/borg=0&/obj/machinery/camera=0"
var/datum/middleClickOverride/middleClickOverride = null
/mob/living/carbon/prepare_huds()
..()
prepare_data_huds()
/mob/living/carbon/proc/prepare_data_huds()
..()
med_hud_set_health()
med_hud_set_status()
/mob/living/carbon/updatehealth()
..()
med_hud_set_health()
med_hud_set_status()
/mob/living/carbon/Destroy()
QDEL_LIST(internal_organs)
QDEL_LIST(stomach_contents)
@@ -23,7 +9,6 @@
if(B)
B.leave_host()
qdel(B)
remove_from_all_data_huds()
return ..()
/mob/living/carbon/blob_act()
@@ -313,6 +298,7 @@
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
. = ..()
var/damage = intensity - check_eye_prot()
var/extra_damage = 0
if(.)
if(visual)
return
@@ -323,19 +309,32 @@
if(!E || (E && E.weld_proof))
return
var/extra_darkview = 0
if(E.dark_view)
extra_darkview = max(E.dark_view - 2, 0)
extra_damage = extra_darkview
var/light_amount = 10 // assume full brightness
if(isturf(src.loc))
var/turf/T = src.loc
light_amount = round(T.get_lumcount() * 10)
// a dark view of 8, in full darkness, will result in maximum 1st tier damage
var/extra_prob = (10 - light_amount) * extra_darkview
switch(damage)
if(1)
to_chat(src, "<span class='warning'>Your eyes sting a little.</span>")
if(prob(40)) //waiting on carbon organs
E.receive_damage(1, 1)
var/minor_damage_multiplier = min(40 + extra_prob, 100) / 100
var/minor_damage = minor_damage_multiplier * (1 + extra_damage)
E.receive_damage(minor_damage, 1)
if(2)
to_chat(src, "<span class='warning'>Your eyes burn.</span>")
E.receive_damage(rand(2, 4), 1)
E.receive_damage(rand(2, 4) + extra_damage, 1)
else
to_chat(src, "Your eyes itch and burn severely!</span>")
E.receive_damage(rand(12, 16), 1)
E.receive_damage(rand(12, 16) + extra_damage, 1)
if(E.damage > E.min_bruised_damage)
AdjustEyeBlind(damage)
@@ -1105,4 +1104,4 @@ so that different stomachs can handle things in different ways VB*/
update_tint()
if(I.flags_inv & HIDEMASK || forced)
update_inv_wear_mask()
update_inv_head()
update_inv_head()
@@ -1,6 +1,5 @@
/mob/living/carbon
gender = MALE
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
var/list/stomach_contents = list()
var/list/internal_organs = list()
var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
@@ -618,7 +618,7 @@
if(istype(D,/obj/machinery/door/airlock))
var/obj/machinery/door/airlock/AL = D
if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through
AL.p_open = 1
AL.panel_open = 1
AL.update_icon()
AL.shock(src, mistake_chance)
sleep(5)
@@ -638,7 +638,7 @@
if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_ELECTRIFY))
AL.wires.CutWireIndex(AIRLOCK_WIRE_ELECTRIFY)
sleep(5)
AL.p_open = 0
AL.panel_open = 0
AL.update_icon()
D.open()
@@ -565,7 +565,5 @@ It'll return null if the organ doesn't correspond, so include null checks when u
H.see_invisible = H.see_override
/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source)
if(temperature >= 330)
M.bodytemperature = M.bodytemperature + (temperature - M.bodytemperature)
if(temperature <= 280)
M.bodytemperature = M.bodytemperature - (M.bodytemperature - temperature)
if(abs(temperature - M.bodytemperature) > 10) //If our water and mob temperature varies by more than 10K, cool or/ heat them appropriately
M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling
+3
View File
@@ -14,4 +14,7 @@
var/datum/soullink/S = s
S.sharerDies(gibbed, src)
med_hud_set_health()
med_hud_set_status()
..(gibbed)
+17
View File
@@ -1,7 +1,23 @@
/mob/living/New()
. = ..()
var/datum/atom_hud/data/human/medical/advanced/medhud = huds[DATA_HUD_MEDICAL_ADVANCED]
medhud.add_to_hud(src)
/mob/living/prepare_huds()
..()
prepare_data_huds()
/mob/living/proc/prepare_data_huds()
..()
med_hud_set_health()
med_hud_set_status()
/mob/living/Destroy()
if(ranged_ability)
ranged_ability.remove_ranged_ability(src)
remove_from_all_data_huds()
if(LAZYLEN(status_effects))
for(var/s in status_effects)
var/datum/status_effect/S = s
@@ -221,6 +237,7 @@
stat = CONSCIOUS
return
health = maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss()
med_hud_set_health()
//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually
@@ -64,6 +64,7 @@
var/list/recent_tastes = list()
var/blood_volume = 0 //how much blood the mob has
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
var/list/status_effects //a list of all status effects the mob has
@@ -1,3 +1,4 @@
#define EMAG_TIMER 3000
/mob/living/silicon/robot/drone
name = "drone"
real_name = "drone"
@@ -30,6 +31,7 @@
var/mail_destination = 0
var/reboot_cooldown = 60 // one minute
var/last_reboot
var/emagged_time
holder_type = /obj/item/weapon/holder/drone
// var/sprite[0]
@@ -180,14 +182,21 @@
return
to_chat(user, "<span class='warning'>You swipe the sequencer across [src]'s interface and watch its eyes flicker.</span>")
to_chat(src, "<span class='warning'>You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script.</span>")
if(jobban_isbanned(src, ROLE_SYNDICATE))
ticker.mode.replace_jobbanned_player(src, ROLE_SYNDICATE)
to_chat(src, "<span class='warning'>You feel a sudden burst of malware loaded into your execute-as-root buffer. Your tiny brain methodically parses, loads and executes the script. You sense you have five minutes before the drone server detects this and automatically shuts you down.</span>")
message_admins("[key_name_admin(user)] emagged drone [key_name_admin(src)]. Laws overridden.")
log_game("[key_name(user)] emagged drone [key_name(src)]. Laws overridden.")
var/time = time2text(world.realtime,"hh:mm:ss")
lawchanges.Add("[time] <B>:</B> [H.name]([H.key]) emagged [name]([key])")
emagged_time = world.time
emagged = 1
density = 1
pass_flags = 0
icon_state = "repairbot-emagged"
holder_type = /obj/item/weapon/holder/drone/emagged
update_icons()
@@ -196,11 +205,11 @@
clear_supplied_laws()
clear_inherent_laws()
laws = new /datum/ai_laws/syndicate_override
set_zeroth_law("Only [H.real_name] and people he designates as being such are Syndicate Agents.")
set_zeroth_law("Only [H.real_name] and people [H.real_name] designates as being such are Syndicate Agents.")
to_chat(src, "<b>Obey these laws:</b>")
laws.show_laws(src)
to_chat(src, "<span class='boldwarning'>ALERT: [H.real_name] is your new master. Obey your new laws and his commands.</span>")
to_chat(src, "<span class='boldwarning'>ALERT: [H.real_name] is your new master. Obey your new laws and [H.real_name]'s commands.</span>")
return
//DRONE LIFE/DEATH
@@ -245,13 +254,16 @@
full_law_reset()
show_laws()
/mob/living/silicon/robot/drone/proc/shut_down()
if(stat != 2)
if(emagged)
to_chat(src, "<span class='warning'>You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you.</span>")
else
to_chat(src, "<span class='warning'>You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself.</span>")
death()
/mob/living/silicon/robot/drone/proc/shut_down(force=FALSE)
if(stat == 2)
return
if(emagged && !force)
to_chat(src, "<span class='warning'>You feel a system kill order percolate through your tiny brain, but it doesn't seem like a good idea to you.</span>")
return
to_chat(src, "<span class='warning'>You feel a system kill order percolate through your tiny brain, and you obediently destroy yourself.</span>")
death()
/mob/living/silicon/robot/drone/proc/full_law_reset()
clear_supplied_laws()
@@ -347,6 +359,11 @@
/mob/living/silicon/robot/drone/update_canmove(delay_action_updates = 0)
. = ..()
if(emagged)
density = 1
if(world.time - emagged_time > EMAG_TIMER)
shut_down(TRUE)
return
density = 0 //this is reset every canmove update otherwise
/mob/living/simple_animal/drone/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
@@ -24,7 +24,6 @@
/obj/item/mounted/frame/firealarm,
/obj/item/mounted/frame/newscaster_frame,
/obj/item/mounted/frame/intercom,
/obj/item/weapon/table_parts,
/obj/item/weapon/rack_parts,
/obj/item/weapon/camera_assembly,
/obj/item/weapon/tank,
+20 -2
View File
@@ -1481,10 +1481,28 @@ var/list/robot_verbs_default = list(
radio.recalculateChannels()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
/mob/living/silicon/robot/ert/New(loc)
..()
/mob/living/silicon/robot/ert/New(loc, cyborg_unlock)
..(loc)
cell.maxcharge = 25000
cell.charge = 25000
var/rnum = rand(1,1000)
var/borgname = "ERT [rnum]"
name = borgname
custom_name = borgname
real_name = name
mind = new
mind.current = src
mind.original = src
mind.assigned_role = "MODE"
mind.special_role = SPECIAL_ROLE_ERT
if(cyborg_unlock)
crisis = 1
if(!(mind in ticker.minds))
ticker.minds += mind
ticker.mode.ert += mind
/mob/living/silicon/robot/ert/gamma
crisis = 1
/mob/living/silicon/robot/nations
base_icon = "droidpeace"
@@ -502,8 +502,6 @@
modules += new /obj/item/device/t_scanner(src)
modules += new /obj/item/weapon/rpd(src)
emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src)
for(var/T in stacktypes)
var/obj/item/stack/sheet/W = new T(src)
W.amount = stacktypes[T]
+9 -3
View File
@@ -30,7 +30,7 @@
var/med_hud = DATA_HUD_MEDICAL_ADVANCED //Determines the med hud to use
var/sec_hud = DATA_HUD_SECURITY_ADVANCED //Determines the sec hud to use
var/d_hud = DATA_HUD_DIAGNOSTIC //There is only one kind of diag hud
var/d_hud = DATA_HUD_DIAGNOSTIC_ADVANCED //There is only one kind of diag hud
var/obj/item/device/radio/common_radio
@@ -44,6 +44,12 @@
add_language("Galactic Common")
init_subsystems()
/mob/living/silicon/med_hud_set_health()
return //we use a different hud
/mob/living/silicon/med_hud_set_status()
return //we use a different hud
/mob/living/silicon/Destroy()
silicon_mob_list -= src
for(var/datum/alarm_handler/AH in alarm_handlers)
@@ -232,8 +238,8 @@
medsensor.add_hud_to(src)
/mob/living/silicon/proc/add_diag_hud()
var/datum/atom_hud/diagsensor = huds[d_hud]
diagsensor.add_hud_to(src)
for(var/datum/atom_hud/data/diagnostic/diagsensor in huds)
diagsensor.add_hud_to(src)
/mob/living/silicon/proc/toggle_sensor_mode()
+106 -17
View File
@@ -47,7 +47,7 @@
var/frustration = 0 //Used by some bots for tracking failures to reach their target.
var/base_speed = 2 //The speed at which the bot moves, or the number of times it moves per process() tick.
var/turf/ai_waypoint //The end point of a bot's path, or the target location.
var/list/path = list() //List of turfs through which a bot 'steps' to reach the waypoint.
var/list/path = list() //List of turfs through which a bot 'steps' to reach the waypoint, associated with the path image, if there is one.
var/pathset = 0
var/list/ignore_list = list() //List of unreachable targets for an ignore-list enabled bot to ignore.
var/mode = BOT_IDLE //Standardizes the vars that indicate the bot is busy with its function.
@@ -75,6 +75,7 @@
var/control_freq = BOT_FREQ // bot control frequency
var/bot_filter // The radio filter the bot uses to identify itself on the network.
var/bot_type = 0 //The type of bot it is, for radio control.
var/data_hud_type = DATA_HUD_DIAGNOSTIC //The type of data HUD the bot uses. Diagnostic by default.
//This holds text for what the bot is mode doing, reported on the remote bot control interface.
var/list/mode_name = list("In Pursuit","Preparing to Arrest", "Arresting", \
"Beginning Patrol", "Patrolling", "Summoned by PDA", \
@@ -82,7 +83,13 @@
"Responding", "Navigating to Delivery Location", "Navigating to Home", \
"Waiting for clear path", "Calculating navigation path", "Pinging beacon network", "Unable to reach destination")
hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD) //Diagnostic HUD views
var/datum/atom_hud/data/bot_path/path_hud = new /datum/atom_hud/data/bot_path()
var/path_image_icon = 'icons/obj/aibots.dmi'
var/path_image_icon_state = "path_indicator"
var/path_image_color = "#FFFFFF"
var/reset_access_timer_id
hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_PATH_HUD = HUD_LIST_LIST)//Diagnostic HUD views
/obj/item/device/radio/headset/bot
subspace_transmission = 1
@@ -130,6 +137,7 @@
/mob/living/simple_animal/bot/New()
..()
bots_list += src
icon_living = icon_state
icon_dead = icon_state
access_card = new /obj/item/weapon/card/id(src)
@@ -151,14 +159,24 @@
radio_controller.add_object(bot_core, control_freq, bot_filter)
prepare_huds()
var/datum/atom_hud/data/diagnostic/diag_hud = huds[DATA_HUD_DIAGNOSTIC]
diag_hud.add_to_hud(src)
for(var/datum/atom_hud/data/diagnostic/diag_hud in huds)
diag_hud.add_to_hud(src)
diag_hud.add_hud_to(src)
permanent_huds |= diag_hud
diag_hud_set_bothealth()
diag_hud_set_botstat()
diag_hud_set_botmode()
// give us the hud too!
diag_hud.add_hud_to(src)
permanent_huds |= diag_hud
if(path_hud)
path_hud.add_to_hud(src)
path_hud.add_hud_to(src)
/mob/living/simple_animal/bot/med_hud_set_health()
return //we use a different hud
/mob/living/simple_animal/bot/med_hud_set_status()
return //we use a different hud
/mob/living/simple_animal/bot/update_canmove(delay_action_updates = 0)
. = ..()
@@ -169,6 +187,10 @@
/mob/living/simple_animal/bot/Destroy()
if(paicard)
ejectpai()
if(path_hud)
QDEL_NULL(path_hud)
path_hud = null
bots_list -= src
QDEL_NULL(Radio)
QDEL_NULL(access_card)
if(radio_controller && bot_filter)
@@ -446,14 +468,14 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/proc/bot_move(dest, move_speed)
if(!dest || !path || path.len == 0) //A-star failed or a path/destination was not set.
path = list()
set_path(null)
return 0
dest = get_turf(dest) //We must always compare turfs, so get the turf of the dest var if dest was originally something else.
var/turf/last_node = get_turf(path[path.len]) //This is the turf at the end of the path, it should be equal to dest.
if(get_turf(src) == dest) //We have arrived, no need to move again.
return 1
else if(dest != last_node) //The path should lead us to our given destination. If this is not true, we must stop.
path = list()
set_path(null)
return 0
var/step_count = move_speed ? move_speed : base_speed //If a value is passed into move_speed, use that instead of the default speed var.
@@ -472,14 +494,14 @@ Pass a positive integer as an argument to override a bot's default speed.
if(path.len > 1)
step_towards(src, path[1])
if(get_turf(src) == path[1]) //Successful move
path -= path[1]
increment_path()
tries = 0
else
tries++
return 0
else if(path.len == 1)
step_to(src, dest)
path = list()
set_path(null)
return 1
@@ -496,7 +518,7 @@ Pass a positive integer as an argument to override a bot's default speed.
var/datum/job/captain/All = new/datum/job/captain
all_access.access = All.get_access()
path = get_path_to(src, waypoint, /turf/proc/Distance_cardinal, 0, 200, id=all_access)
set_path(get_path_to(src, waypoint, /turf/proc/Distance_cardinal, 0, 200, id=all_access))
calling_ai = caller //Link the AI to the bot!
ai_waypoint = waypoint
@@ -504,6 +526,9 @@ Pass a positive integer as an argument to override a bot's default speed.
if(!on)
turn_on() //Saves the AI the hassle of having to activate a bot manually.
access_card = all_access //Give the bot all-access while under the AI's command.
if(client)
reset_access_timer_id = addtimer(src, "bot_reset", 600) //if the bot is player controlled, they get the extra access for a limited time
to_chat(src, "<span class='notice'><span class='big'>Priority waypoint set by [calling_ai] <b>[caller]</b>. Proceed to <b>[end_area.name]</b>.</span><br>[path.len-1] meters to destination. You have been granted additional door access for 60 seconds.</span>")
if(message)
to_chat(calling_ai, "<span class='notice'>[bicon(src)] [name] called to [end_area.name]. [path.len-1] meters to destination.</span>")
pathset = 1
@@ -513,7 +538,7 @@ Pass a positive integer as an argument to override a bot's default speed.
if(message)
to_chat(calling_ai, "<span class='danger'>Failed to calculate a valid route. Ensure destination is clear of obstructions and within range.</span>")
calling_ai = null
path = list()
set_path(null)
/mob/living/simple_animal/bot/proc/call_mode() //Handles preparing a bot for a call, as well as calling the move proc.
//Handles the bot's movement during a call.
@@ -528,7 +553,10 @@ Pass a positive integer as an argument to override a bot's default speed.
if(calling_ai) //Simple notification to the AI if it called a bot. It will not know the cause or identity of the bot.
to_chat(calling_ai, "<span class='danger'>Call command to a bot has been reset.</span>")
calling_ai = null
path = list()
if(reset_access_timer_id)
deltimer(reset_access_timer_id)
reset_access_timer_id = null
set_path(null)
summon_target = null
pathset = 0
access_card.access = prev_access
@@ -593,7 +621,7 @@ Pass a positive integer as an argument to override a bot's default speed.
else if(path.len > 0 && patrol_target) // valid path
var/turf/next = path[1]
if(next == loc)
path -= next
increment_path()
return
@@ -749,12 +777,12 @@ Pass a positive integer as an argument to override a bot's default speed.
// given an optional turf to avoid
/mob/living/simple_animal/bot/proc/calc_path(turf/avoid)
check_bot_access()
path = get_path_to(src, patrol_target, /turf/proc/Distance_cardinal, 0, 120, id=access_card, exclude=avoid)
set_path(get_path_to(src, patrol_target, /turf/proc/Distance_cardinal, 0, 120, id=access_card, exclude=avoid))
/mob/living/simple_animal/bot/proc/calc_summon_path(turf/avoid)
check_bot_access()
spawn()
path = get_path_to(src, summon_target, /turf/proc/Distance_cardinal, 0, 150, id=access_card, exclude=avoid)
set_path(get_path_to(src, summon_target, /turf/proc/Distance_cardinal, 0, 150, id=access_card, exclude=avoid))
if(!path.len) //Cannot reach target. Give up and announce the issue.
speak("Summon command failed, destination unreachable.",radio_channel)
bot_reset()
@@ -771,7 +799,7 @@ Pass a positive integer as an argument to override a bot's default speed.
else if(path.len > 0 && summon_target) //Proper path acquired!
var/turf/next = path[1]
if(next == loc)
path -= next
increment_path()
return
var/moved = bot_move(summon_target, 3) // Move attempt
@@ -1015,3 +1043,64 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/is_mechanical()
return 1
/mob/living/simple_animal/bot/proc/set_path(list/newpath)
path = newpath ? newpath : list()
if(!path_hud)
return
var/list/path_huds_watching_me = list(huds[DATA_HUD_DIAGNOSTIC_ADVANCED])
if(path_hud)
path_huds_watching_me += path_hud
for(var/V in path_huds_watching_me)
var/datum/atom_hud/H = V
H.remove_from_hud(src)
var/list/path_images = hud_list[DIAG_PATH_HUD]
QDEL_LIST(path_images)
if(newpath)
for(var/i in 1 to newpath.len)
var/turf/T = newpath[i]
var/direction = NORTH
if(i > 1)
var/turf/prevT = path[i - 1]
var/image/prevI = path[prevT]
direction = get_dir(prevT, T)
if(i > 2)
var/turf/prevprevT = path[i - 2]
var/prevDir = get_dir(prevprevT, prevT)
var/mixDir = direction|prevDir
if(mixDir in diagonals)
prevI.dir = mixDir
if(prevDir & (NORTH|SOUTH))
var/matrix/ntransform = matrix()
ntransform.Turn(90)
if((mixDir == NORTHWEST) || (mixDir == SOUTHEAST))
ntransform.Scale(-1, 1)
else
ntransform.Scale(1, -1)
prevI.transform = ntransform
var/mutable_appearance/MA = new /mutable_appearance()
MA.icon = path_image_icon
MA.icon_state = path_image_icon_state
MA.layer = ABOVE_OPEN_TURF_LAYER
MA.plane = 0
MA.appearance_flags = RESET_COLOR|RESET_TRANSFORM
MA.color = path_image_color
MA.dir = direction
var/image/I = image(loc = T)
I.appearance = MA
path[T] = I
path_images += I
for(var/V in path_huds_watching_me)
var/datum/atom_hud/H = V
H.add_to_hud(src)
/mob/living/simple_animal/bot/proc/increment_path()
if(!path || !path.len)
return
var/image/I = path[path[1]]
if(I)
I.icon = null
path.Cut(1, 2)
@@ -17,6 +17,8 @@
window_id = "autoclean"
window_name = "Automatic Station Cleaner v1.1"
pass_flags = PASSMOB
path_image_color = "#993299"
var/blood = 1
var/list/target_types = list()
@@ -20,6 +20,8 @@
bot_core = /obj/machinery/bot_core/secbot
window_id = "autoed209"
window_name = "Automatic Security Unit v2.6"
path_image_color = "#FF0000"
data_hud_type = DATA_HUD_SECURITY_ADVANCED
var/lastfired = 0
var/shot_delay = 3 //.3 seconds between shots
@@ -17,6 +17,7 @@
bot_core = /obj/machinery/bot_core/floorbot
window_id = "autofloor"
window_name = "Automatic Station Floor Repairer v1.1"
path_image_color = "#FFA500"
var/process_type //Determines what to do when process_scan() recieves a target. See process_scan() for details.
var/targetdirection
@@ -19,6 +19,8 @@
bot_core_type = /obj/machinery/bot_core/medbot
window_id = "automed"
window_name = "Automatic Medical Unit v1.1"
path_image_color = "#DDDDFF"
data_hud_type = DATA_HUD_MEDICAL_ADVANCED
var/obj/item/weapon/reagent_containers/glass/reagent_glass = null //Can be set to draw from this for reagents.
var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits.
@@ -26,6 +26,8 @@
model = "MULE"
bot_purpose = "deliver crates and other packages between departments, as requested"
bot_core_type = /obj/machinery/bot_core/mulebot
path_image_color = "#7F5200"
suffix = ""
@@ -502,7 +504,7 @@
var/turf/next = path[1]
reached_target = 0
if(next == loc)
path -= next
increment_path()
return
if(istype(next, /turf/simulated))
// to_chat(world, "at ([x],[y]) moving to ([next.x],[next.y])")
@@ -513,7 +515,7 @@
if(moved && oldloc!=loc) // successful move
// to_chat(world, "Successful move.")
blockcount = 0
path -= loc
increment_path()
if(destination == home_destination)
mode = BOT_GO_HOME
@@ -570,7 +572,7 @@
// given an optional turf to avoid
/mob/living/simple_animal/bot/mulebot/calc_path(turf/avoid = null)
check_bot_access()
path = get_path_to(src, target, /turf/proc/Distance_cardinal, 0, 250, id=access_card, exclude=avoid)
set_path(get_path_to(src, target, /turf/proc/Distance_cardinal, 0, 250, id=access_card, exclude=avoid))
// sets the current destination
// signals all beacons matching the delivery code
@@ -18,6 +18,8 @@
bot_core_type = /obj/machinery/bot_core/secbot
window_id = "autosec"
window_name = "Automatic Security Unit v1.6"
path_image_color = "#FF0000"
data_hud_type = DATA_HUD_SECURITY_ADVANCED
var/base_icon = "secbot"
var/mob/living/carbon/target
@@ -67,7 +67,7 @@
if(health < maxHealth)
adjustBruteLoss(-5)
if(src != M)
Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4)
Beam(M,icon_state="sendbeam",time=4)
M.visible_message("<span class='danger'>[M] repairs some of \the <b>[src]'s</b> dents.</span>", \
"<span class='cult'>You repair some of <b>[src]'s</b> dents, leaving <b>[src]</b> at <b>[health]/[maxHealth]</b> health.</span>")
else
@@ -563,7 +563,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD) // Added check to see if this mob (the corgi) is dead to fix issue 2454
flick_overlay(image('icons/mob/animal.dmi',src,"heart-ani2",MOB_LAYER+1), list(M.client), 20)
new /obj/effect/temp_visual/heart(loc)
custom_emote(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)
@@ -0,0 +1,49 @@
/mob/living/simple_animal/hostile/deathsquid
name = "death squid"
desc = "A large, floating eldritch horror. Its body glows with an evil red light, and its tentacles look to have been dipped in alien blood."
speed = 1
speak_emote = list("telepathically thunders", "telepathically booms")
maxHealth = 2500 // same as megafauna
health = 2500
icon = 'icons/mob/deathsquid_large.dmi' // Credit: FullofSkittles
icon_state = "deathsquid"
icon_living = "deathsquid"
icon_dead = "deathsquiddead"
attacktext = "slices"
attack_sound = 'sound/weapons/bladeslice.ogg'
armour_penetration = 25
melee_damage_lower = 10
melee_damage_upper = 100
environment_smash = 3
force_threshold = 15
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 0
heat_damage_per_tick = 0
see_in_dark = 8
mob_size = MOB_SIZE_LARGE
ventcrawler = 0
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
/mob/living/simple_animal/hostile/deathsquid/Process_Spacemove(var/movement_dir = 0)
return 1 //copypasta from carp code
/mob/living/simple_animal/hostile/deathsquid/ex_act(severity)
return
/mob/living/simple_animal/hostile/deathsquid/joke
name = "deaf squid"
desc = "An elderly, hard-of-hearing eldrich horror."
maxHealth = 200
health = 200
speed = 3
armour_penetration = 5
melee_damage_lower = 10
melee_damage_upper = 20
environment_smash = 2
@@ -131,7 +131,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 && .)
@@ -152,12 +152,12 @@ Difficulty: Hard
var/turf/T = get_turf(target)
if(!T || T == loc)
return
new /obj/effect/overlay/temp/dragon_swoop(T)
new /obj/effect/temp_visual/dragon_swoop(T)
charging = 1
DestroySurroundings()
walk(src, 0)
dir = 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 = 5)
sleep(5)
throw_at(T, get_dist(src, T), 1, src, 0)
@@ -242,9 +242,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(L))
@@ -256,11 +256,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(L))
@@ -274,28 +274,28 @@ Difficulty: Hard
devour(L)
sleep(1)
/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 = MOB_LAYER - 0.1
/obj/effect/overlay/temp/bubblegum_hands/leftpaw
/obj/effect/temp_visual/bubblegum_hands/leftpaw
icon_state = "leftpawgrab"
layer = MOB_LAYER - 0.1
/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()
@@ -311,7 +311,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
@@ -353,7 +353,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.CanAtmosPass(J))
break
@@ -97,7 +97,7 @@ Difficulty: Very Hard
..()
internal_gps = 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'
@@ -107,7 +107,7 @@ Difficulty: Very Hard
duration = 8
var/target
/obj/effect/overlay/temp/at_shield/New(new_loc, new_target)
/obj/effect/temp_visual/at_shield/New(new_loc, new_target)
..()
target = new_target
spawn(0)
@@ -115,7 +115,7 @@ Difficulty: Very Hard
/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(loc, src)
var/obj/effect/temp_visual/at_shield/AT = new /obj/effect/temp_visual/at_shield(loc, src)
var/random_x = rand(-32, 32)
AT.pixel_x += random_x
@@ -86,7 +86,7 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
return 1
/obj/effect/overlay/temp/fireball
/obj/effect/temp_visual/fireball
icon = 'icons/obj/wizard.dmi'
icon_state = "fireball"
name = "fireball"
@@ -96,18 +96,18 @@ Difficulty: Medium
duration = 12
pixel_z = 500
/obj/effect/overlay/temp/fireball/New(loc)
/obj/effect/temp_visual/fireball/New(loc)
..()
animate(src, pixel_z = 0, time = 12)
/obj/effect/overlay/temp/target
/obj/effect/temp_visual/target
icon = 'icons/mob/actions.dmi'
icon_state = "sniper_zoom"
layer = MOB_LAYER - 0.1
luminosity = 2
duration = 12
/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'
@@ -118,18 +118,18 @@ Difficulty: Medium
color = "#FF0000"
duration = 10
/obj/effect/overlay/temp/target/ex_act()
/obj/effect/temp_visual/target/ex_act()
return
/obj/effect/overlay/temp/target/New(loc)
/obj/effect/temp_visual/target/New(loc)
..()
spawn(0)
fall()
/obj/effect/overlay/temp/target/proc/fall()
/obj/effect/temp_visual/target/proc/fall()
var/turf/T = get_turf(src)
playsound(T,'sound/magic/Fireball.ogg', 200, 1)
new /obj/effect/overlay/temp/fireball(T)
new /obj/effect/temp_visual/fireball(T)
sleep(12)
explosion(T, 0, 0, 1, 0, 0, 0, 1)
@@ -161,7 +161,7 @@ Difficulty: Medium
visible_message("<span class='boldwarning'>Fire rains from the sky!</span>")
for(var/turf/turf in range(12,get_turf(src)))
if(prob(10))
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)
@@ -223,7 +223,7 @@ Difficulty: Medium
else
tturf = get_turf(src)
forceMove(tturf)
new /obj/effect/overlay/temp/dragon_swoop(tturf)
new /obj/effect/temp_visual/dragon_swoop(tturf)
animate(src, pixel_x = initial(pixel_x), pixel_z = 0, time = 10)
sleep(10)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
@@ -242,7 +242,7 @@ Difficulty: Hard
pickedtarget = pick_n_take(targets)
if(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)
@@ -277,10 +277,10 @@ Difficulty: Hard
spawn(0)
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(cardinal - C.moving_dir)
else //just release a burst of power
@@ -291,11 +291,11 @@ 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/magic/blink.ogg', 200, 1)
//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 diagonals)
spawn(0)
blast_wall(T, d)
@@ -304,11 +304,11 @@ 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/magic/blink.ogg', 200, 1)
//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 cardinal)
spawn(0)
blast_wall(T, d)
@@ -317,11 +317,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/magic/blink.ogg', 200, 1)
//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 alldirs)
spawn(0)
blast_wall(T, d)
@@ -331,7 +331,7 @@ Difficulty: Hard
var/turf/previousturf = T
var/turf/J = get_step(previousturf, 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, dir)
@@ -340,21 +340,21 @@ 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/blink.ogg', 200, 1)
//playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
playsound(source,'sound/magic/blink.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)
@@ -376,12 +376,12 @@ 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/magic/blink.ogg', 200, 1)
//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/magic/blink.ogg', 200, 1)
@@ -395,7 +395,7 @@ Difficulty: Hard
if(dist > last_dist)
last_dist = dist
sleep(1 + (burst_range - last_dist) * 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)
@@ -403,16 +403,16 @@ Difficulty: Hard
blink(A)
//Hierophant overlays
/obj/effect/overlay/temp/hierophant
/obj/effect/temp_visual/hierophant
layer = MOB_LAYER - 0.1
var/mob/living/caster //who made this, anyway
/obj/effect/overlay/temp/hierophant/New(loc, new_caster)
/obj/effect/temp_visual/hierophant/New(loc, new_caster)
..()
if(new_caster)
caster = new_caster
/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
@@ -426,7 +426,7 @@ Difficulty: Hard
var/currently_seeking = FALSE
var/friendly_fire_check = FALSE //if blasts produced apply friendly fire
/obj/effect/overlay/temp/hierophant/chaser/New(loc, new_caster, new_target, new_speed, is_friendly_fire)
/obj/effect/temp_visual/hierophant/chaser/New(loc, new_caster, new_target, new_speed, is_friendly_fire)
..()
target = new_target
friendly_fire_check = is_friendly_fire
@@ -435,14 +435,14 @@ Difficulty: Hard
spawn(0)
seek_target()
/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 = 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)
@@ -470,27 +470,27 @@ Difficulty: Hard
sleep(speed)
targetturf = get_turf(target)
/obj/effect/overlay/temp/hierophant/chaser/proc/make_blast()
new /obj/effect/overlay/temp/hierophant/blast(loc, caster, friendly_fire_check)
/obj/effect/temp_visual/hierophant/chaser/proc/make_blast()
new /obj/effect/temp_visual/hierophant/blast(loc, caster, friendly_fire_check)
/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/blast
/obj/effect/temp_visual/hierophant/blast
icon = 'icons/effects/effects.dmi'
icon_state = "hierophant_blast"
name = "vortex blast"
@@ -502,7 +502,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/New(loc, new_caster, friendly_fire)
/obj/effect/temp_visual/hierophant/blast/New(loc, new_caster, friendly_fire)
..()
friendly_fire_check = friendly_fire
if(new_caster)
@@ -513,7 +513,7 @@ Difficulty: Hard
spawn(0)
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
@@ -524,12 +524,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(L)) || L.stat == DEAD)
@@ -570,7 +570,7 @@ Difficulty: Hard
H.timer = world.time + 51
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 touch the rune with the staff, dispelling it!</span>")
H.rune = null
user.update_action_buttons_icon()
@@ -106,6 +106,7 @@
/mob/living/simple_animal/updatehealth()
..()
health = Clamp(health, 0, maxHealth)
med_hud_set_status()
/mob/living/simple_animal/handle_hud_icons_health()
..()
+8 -1
View File
@@ -34,8 +34,15 @@
..()
/atom/proc/prepare_huds()
hud_list = list()
for(var/hud in hud_possible)
hud_list[hud] = image('icons/mob/hud.dmi', src, "")
var/hint = hud_possible[hud]
switch(hint)
if(HUD_LIST_LIST)
hud_list[hud] = list()
else
var/image/I = image('icons/mob/hud.dmi', src, "")
hud_list[hud] = I
/mob/proc/generate_name()
return name
+15 -11
View File
@@ -147,11 +147,12 @@
mob.control_object.forceMove(get_step(mob.control_object, direct))
return
#define MOVEMENT_DELAY_BUFFER 0.75
#define MOVEMENT_DELAY_BUFFER_DELTA 1.25
/client/Move(n, direct)
if(world.time < move_delay)
return
var/old_move_delay = move_delay
move_delay = world.time + world.tick_lag //this is here because Move() can now be called multiple times per tick
if(!mob || !mob.loc)
return 0
@@ -203,9 +204,9 @@
if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved
var/atom/O = mob.loc
return O.relaymove(mob, direct)
if(!mob.Process_Spacemove(direct))
return 0
return 0
if(mob.restrained()) // Why being pulled while cuffed prevents you from moving
for(var/mob/M in orange(1, mob))
@@ -220,7 +221,11 @@
//We are now going to move
moving = 1
move_delay = mob.movement_delay() + world.time
var/delay = mob.movement_delay()
if(old_move_delay + (delay * MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time)
move_delay = old_move_delay + delay
else
move_delay = delay + world.time
mob.last_movement = world.time
if(locate(/obj/item/weapon/grab, mob))
@@ -252,7 +257,7 @@
return
spawn(1)
M.other_mobs = null
M.animate_movement = 2
M.animate_movement = 2
return
else if(mob.confused)
@@ -361,13 +366,12 @@
spawn(0)
var/limit = 2//For only two trailing shadows.
for(var/turf/T in getline(mobloc, L.loc))
spawn(0)
anim(T,L,'icons/mob/mob.dmi',,"shadow",,L.dir)
new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir)
limit--
if(limit<=0) break
if(limit<=0)
break
else
spawn(0)
anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,L.dir)
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
L.forceMove(get_step(L, direct))
L.dir = direct
if(3) //Incorporeal move, but blocked by holy-watered tiles
+2 -1
View File
@@ -31,13 +31,14 @@
var/area/A = get_area(src)
if(A)
var/image/alert_overlay = image('icons/effects/effects.dmi', "ghostalertsie")
var/image/alert_overlay = image('icons/effects/cult_effects.dmi', "ghostalertsie")
notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, action=NOTIFY_ATTACK)
narsie_spawn_animation()
sleep(70)
shuttle_master.emergency.request(null, 0.3) // Cannot recall
shuttle_master.emergency.canRecall = FALSE
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, null, 1)
@@ -205,7 +205,7 @@
if(ismineralturf(target_turf))
var/turf/simulated/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/type in hit_overlays)
new type(target_turf)
@@ -328,7 +328,7 @@
/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K)
K.name = "kinetic explosion"
if(!K.turf_aoe && !K.mob_aoe)
K.hit_overlays += /obj/effect/overlay/temp/explosion/fast
K.hit_overlays += /obj/effect/temp_visual/explosion/fast
K.mob_aoe += modifier
/obj/item/borg/upgrade/modkit/aoe/turfs
+2 -2
View File
@@ -78,13 +78,13 @@
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
var/blood_color = "#C80000"
if(ishuman(target))
H = target
blood_color = H.species.blood_color
new /obj/effect/overlay/temp/dir_setting/bloodsplatter(target_loca, splatter_dir, blood_color)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, blood_color)
if(prob(33))
var/list/shift = list("x" = 0, "y" = 0)
var/turf/step_over = get_step(target_loca, splatter_dir)
@@ -9,6 +9,8 @@
flag = "laser"
eyeblur = 2
is_reflectable = TRUE
light_range = 2
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/laser
@@ -35,6 +37,7 @@
irradiate = 30
forcedodge = 1
range = 15
light_color = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/disabler
name = "disabler beam"
@@ -44,11 +47,13 @@
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
eyeblur = 0
light_color = LIGHT_COLOR_CYAN
/obj/item/projectile/beam/pulse
name = "pulse"
icon_state = "u_laser"
damage = 50
light_color = LIGHT_COLOR_DARKBLUE
/obj/item/projectile/beam/pulse/on_hit(var/atom/target, var/blocked = 0)
if(istype(target,/turf/)||istype(target,/obj/structure/))
@@ -64,6 +69,7 @@
damage = 30
legacy = 1
animate_movement = SLIDE_STEPS
light_color = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/emitter/singularity_pull()
return //don't want the emitters to miss
@@ -77,6 +83,7 @@
flag = "laser"
var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
log_override = TRUE
light_color = LIGHT_COLOR_DARKBLUE
/obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0)
. = ..()
@@ -94,6 +101,7 @@
/obj/item/projectile/beam/lasertag/redtag
icon_state = "laser"
suit_types = list(/obj/item/clothing/suit/bluetag)
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/lasertag/bluetag
icon_state = "bluelaser"
@@ -106,6 +114,7 @@
stun = 5
weaken = 5
stutter = 5
light_color = LIGHT_COLOR_PINK
/obj/item/projectile/beam/immolator
name = "immolation beam"
@@ -122,12 +131,15 @@
icon_state = "purple_laser"
damage = 200
damage_type = BURN
light_color = LIGHT_COLOR_PURPLE
/obj/item/projectile/beam/instakill/blue
icon_state = "blue_laser"
light_color = LIGHT_COLOR_DARKBLUE
/obj/item/projectile/beam/instakill/red
icon_state = "red_laser"
light_color = LIGHT_COLOR_RED
/obj/item/projectile/beam/instakill/on_hit(atom/target)
. = ..()
@@ -137,17 +137,6 @@
if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in T) //let's not have hundreds of decals of black powder on the same turf
new /obj/effect/decal/cleanable/dirt/blackpowder(T)
/*
/datum/reagent/blackpowder/on_ex_act()
var/location = get_turf(holder.my_atom)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(2, 1, location)
s.start()
sleep(rand(10,15))
blackpowder_detonate(holder, volume)
holder.remove_reagent("blackpowder", volume)
return */
/datum/reagent/flash_powder
name = "Flash Powder"
id = "flash_powder"
@@ -12,7 +12,7 @@
/mob/camera/aiEye/remote/xenobio/setLoc(t)
var/area/new_area = get_area(t)
if(new_area && new_area.name == allowed_area || istype(new_area, /area/toxins/xenobiology ))
if(new_area && new_area.name == allowed_area || new_area && new_area.xenobiology_compatible)
return ..()
else
return
@@ -589,16 +589,16 @@
/obj/item/areaeditor/blueprints/slime
name = "cerulean prints"
desc = "A one use set of blueprints made of jelly like organic material. Renaming an area to 'Xenobiology Lab' will extend the reach of the management console."
desc = "A one use set of blueprints made of jelly like organic material. Extends the reach of the management console."
color = "#2956B2"
/obj/item/areaeditor/blueprints/slime/edit_area()
. = ..()
..()
var/area/A = get_area(src)
if(.)
for(var/turf/T in A)
T.color = "#2956B2"
qdel(src)
for(var/turf/T in A)
T.color = "#2956B2"
A.xenobiology_compatible = TRUE
qdel(src)
/turf/simulated/floor/sepia
slowdown = 2
+2 -2
View File
@@ -1,4 +1,4 @@
/obj/effect/overlay/temp/ripple
/obj/effect/temp_visual/ripple
name = "hyperspace ripple"
desc = "Something is coming through hyperspace, you can see the \
visual disturbances. It's probably best not to be on top of these \
@@ -13,7 +13,7 @@
duration = 3 * SHUTTLE_RIPPLE_TIME
mouse_opacity = 1
/obj/effect/overlay/temp/ripple/New()
/obj/effect/temp_visual/ripple/New()
. = ..()
smooth_icon(src)
animate(src, alpha=255, time=SHUTTLE_RIPPLE_TIME)
+1 -1
View File
@@ -383,7 +383,7 @@
/obj/docking_port/mobile/proc/create_ripples(obj/docking_port/stationary/S1)
var/list/turfs = ripple_area(S1)
for(var/i in turfs)
ripples += new /obj/effect/overlay/temp/ripple(i)
ripples += new /obj/effect/temp_visual/ripple(i)
/obj/docking_port/mobile/proc/remove_ripples()
if(ripples.len)
+29 -18
View File
@@ -260,11 +260,14 @@
return
// Find a blood decal or create a new one.
var/obj/effect/decal/cleanable/blood/B
if(!(locate(B) in T) || pixel_x || pixel_y)
B = new /obj/effect/decal/cleanable/blood/splatter(T)
else
B = locate() in T
var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T
var/list/bloods = get_atoms_of_type(T, B, TRUE, 0, 0) //Get all the non-projectile-splattered blood on this turf (not pixel-shifted).
if(shift_x || shift_y)
bloods = get_atoms_of_type(T, B, TRUE, shift_x, shift_y) //Get all the projectile-splattered blood at these pixels on this turf (pixel-shifted).
B = locate() in bloods
if(!B)
B = new(T)
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
if(temp_blood_DNA)
B.blood_DNA |= temp_blood_DNA
@@ -282,11 +285,15 @@
/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
if(!T)
T = get_turf(src)
var/obj/effect/decal/cleanable/blood/xeno/B
if(!(locate(B) in T) || pixel_x || pixel_y)
var/obj/effect/decal/cleanable/blood/xeno/splatter/B = locate() in T
var/list/bloods = get_atoms_of_type(T, B, TRUE, 0, 0) //The more the better.
if(shift_x || shift_y)
bloods = get_atoms_of_type(T, B, TRUE, shift_x, shift_y)
B = locate() in bloods
if(!B)
B = new(T)
else
B = locate() in T
B.blood_DNA["UNKNOWN DNA"] = "X*"
B.pixel_x = (shift_x)
B.pixel_y = (shift_y)
@@ -297,13 +304,17 @@
/mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
if(!T)
T = get_turf(src)
var/obj/effect/decal/cleanable/blood/oil/B
if(!(locate(B) in T) || pixel_x || pixel_y)
B = new(T)
else
B = locate() in T
B.pixel_x = (shift_x)
B.pixel_y = (shift_y)
var/obj/effect/decal/cleanable/blood/oil/streak/O = locate() in T
var/list/oils = get_atoms_of_type(T, O, TRUE, 0, 0) //Don't let OSHA catch wind of this.
if(shift_x || shift_y)
B.off_floor = TRUE
B.layer = BELOW_MOB_LAYER
oils = get_atoms_of_type(T, O, TRUE, shift_x, shift_y)
O = locate() in oils
if(!O)
O = new(T)
O.pixel_x = (shift_x)
O.pixel_y = (shift_y)
if(shift_x || shift_y)
O.off_floor = TRUE
O.layer = BELOW_MOB_LAYER
+1 -13
View File
@@ -14,21 +14,9 @@
overlay.layer = MOB_LAYER + 0.1
overlays += overlay
/obj/effect/overlay/temp/speedbike_trail
name = "speedbike trails"
icon = 'icons/effects/effects.dmi'
icon_state = "ion_fade"
duration = 10
randomdir = 0
layer = MOB_LAYER - 0.2
/obj/effect/overlay/temp/speedbike_trail/New(loc,move_dir)
..()
dir = move_dir
/obj/vehicle/space/speedbike/Move(newloc,move_dir)
if(buckled_mob)
new /obj/effect/overlay/temp/speedbike_trail(loc)
new /obj/effect/temp_visual/dir_setting/speedbike_trail(loc)
. = ..()
/obj/vehicle/space/speedbike/handle_vehicle_layer()