diff --git a/code/WorkInProgress/Cameras.dm b/code/WorkInProgress/Cameras.dm
index 30eff37eabe..93ec9fa418c 100644
--- a/code/WorkInProgress/Cameras.dm
+++ b/code/WorkInProgress/Cameras.dm
@@ -57,13 +57,7 @@
item_state = "clipboard"
w_class = 1.0
-//////////////////////////////////////////////////////////////////////////////////////////////////
-/obj/item/weapon/camera_test/proc/build_composite_icon(var/atom/C)
- var/icon/composite = icon(C.icon, C.icon_state, C.dir, 1)
- for(var/O in C.overlays)
- var/image/I = O
- composite.Blend(icon(I.icon, I.icon_state, I.dir, 1), ICON_OVERLAY)
- return composite
+
//////////////////////////////////////////////////////////////////////////////////////////////////
/obj/item/weapon/camera_test/attack(mob/living/carbon/human/M as mob, mob/user as mob)
return
diff --git a/code/defines/mob/living/silicon/ai.dm b/code/defines/mob/living/silicon/ai.dm
index 1185ba63d99..92a7c97856c 100644
--- a/code/defines/mob/living/silicon/ai.dm
+++ b/code/defines/mob/living/silicon/ai.dm
@@ -1,6 +1,6 @@
/mob/living/silicon/ai
name = "AI"
- icon = 'mob.dmi'//
+ icon = 'AI.dmi'//
icon_state = "ai"
anchored = 1 // -- TLE
density = 1
@@ -13,8 +13,9 @@
var/viewalerts = 0
var/lawcheck[1]
var/ioncheck[1]
+ var/icon/holo_icon//Default is assigned when AI is created.
-
+ //MALFUNCTION
var/datum/AI_Module/module_picker/malf_picker
var/processing_time = 100
var/list/datum/AI_Module/current_modules = list()
@@ -22,5 +23,4 @@
var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click() -- TLE
var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite
-
- var/obj/machinery/power/apc/malfhack = null
+ var/obj/machinery/power/apc/malfhack = null
\ No newline at end of file
diff --git a/code/defines/obj/clothing/shoes.dm b/code/defines/obj/clothing/shoes.dm
index 3be0687d5d2..4e7aaa4ca1c 100644
--- a/code/defines/obj/clothing/shoes.dm
+++ b/code/defines/obj/clothing/shoes.dm
@@ -29,14 +29,12 @@
name = "SWAT shoes"
desc = "When you want to turn up the heat."
icon_state = "swat"
- slowdown = 0
armor = list(melee = 80, bullet = 60, laser = 50, taser = 25, bomb = 50, bio = 10, rad = 0)
/obj/item/clothing/shoes/space_ninja
name = "ninja shoes"
desc = "A pair of running shoes. Excellent for running and even better for smashing skulls."
icon_state = "s-ninja"
- slowdown = 0
protective_temperature = 700
permeability_coefficient = 0.01
flags = NOSLIP
@@ -63,7 +61,7 @@
icon_state = "galoshes"
permeability_coefficient = 0.05
flags = NOSLIP
- slowdown = 0
+ slowdown = SHOES_SLOWDOWN+1
/obj/item/clothing/shoes/magboots
desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle."
@@ -79,7 +77,7 @@
name = "clown shoes"
icon_state = "clown"
item_state = "clown_shoes"
- slowdown = 0
+ slowdown = SHOES_SLOWDOWN+1
/obj/item/clothing/shoes/jackboots
name = "Jackboots"
diff --git a/code/defines/obj/clothing/suit.dm b/code/defines/obj/clothing/suit.dm
index 66363fe6774..25012b98b5e 100644
--- a/code/defines/obj/clothing/suit.dm
+++ b/code/defines/obj/clothing/suit.dm
@@ -541,7 +541,7 @@
a_boost = 3.0//Number of adrenaline boosters.
//Onboard AI related variables.
- mob/living/silicon/AI//If there is an AI inside the suit.
+ mob/living/silicon/ai/AI//If there is an AI inside the suit.
obj/item/device/paicard/pai//A slot for a pAI device
obj/overlay/hologram//Is the AI hologram on or off? Visible only to the wearer of the suit. This works by attaching an image to a blank overlay.
flush = 0//If an AI purge is in progress.
diff --git a/code/defines/obj/computer.dm b/code/defines/obj/computer.dm
index fe73135cc22..ab4c3ed252b 100644
--- a/code/defines/obj/computer.dm
+++ b/code/defines/obj/computer.dm
@@ -155,7 +155,7 @@
desc = "Rumoured to control holograms."
icon = 'stationobjs.dmi'
icon_state = "holo_console0"
- var/obj/machinery/hologram_proj/projector = null
+ var/obj/machinery/hologram/projector/projector = null
var/temp = null
var/lumens = 0.0
var/h_r = 245.0
diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm
index cb67320ee16..4fa0a665a04 100644
--- a/code/defines/obj/machinery.dm
+++ b/code/defines/obj/machinery.dm
@@ -131,35 +131,6 @@
active_power_usage = 6
-/obj/machinery/hologram_proj
- name = "Hologram Projector"
- desc = "Makes a hologram appear...somehow..."
- icon = 'stationobjs.dmi'
- icon_state = "hologram0"
- var/atom/projection = null
- anchored = 1.0
- use_power = 1
- idle_power_usage = 2
- active_power_usage = 5
-
-
-/obj/machinery/hologram_ai
- name = "Hologram Projector Platform"
- desc = "Used for the fun of the diabolical AI."
- icon = 'stationobjs.dmi'
- icon_state = "hologram0"
- var/atom/projection = null
- var/temp = null
- var/lumens = 0.0
- var/h_r = 245.0
- var/h_g = 245.0
- var/h_b = 245.0
- anchored = 1.0
- use_power = 1
- idle_power_usage = 5
- active_power_usage = 10
-
-
/obj/machinery/igniter
name = "igniter"
desc = "Fun for igniting plasma."
@@ -611,15 +582,35 @@
var/otherarea = null
var/id = 1
-/obj/machinery/holopad
- name = "holopad"
- desc = "A floor-mounted device for projecting a holographic image. It will activate remotely."
- icon_state = "holopad0"
+/obj/machinery/hologram
anchored = 1
use_power = 1
idle_power_usage = 5
active_power_usage = 100
-
var
obj/overlay/hologram//The projection itself. If there is one, the instrument is on, off otherwise.
+
+/obj/machinery/hologram/holopad
+ name = "AI holopad"
+ desc = "A floor-mounted device for projecting a holographic image. It will activate remotely."
+ icon_state = "holopad0"
+ var
mob/living/silicon/ai/master//Which AI, if any, is controlling the object? Only one AI may control a hologram at any time.
+
+/obj/machinery/hologram/projector
+ name = "Hologram Projector"
+ desc = "Makes a hologram appear...somehow..."
+ icon = 'stationobjs.dmi'
+ icon_state = "hologram0"
+
+/obj/machinery/hologram/proj_ai
+ name = "Hologram Projector Platform"
+ desc = "Used for the fun of the diabolical AI."
+ icon = 'stationobjs.dmi'
+ icon_state = "hologram0"
+ var
+ temp = null
+ lumens = 0.0
+ h_r = 245.0
+ h_g = 245.0
+ h_b = 245.0
diff --git a/code/defines/procs/icon_procs.dm b/code/defines/procs/icon_procs.dm
index 00b5e9a4fb2..3069645c828 100644
--- a/code/defines/procs/icon_procs.dm
+++ b/code/defines/procs/icon_procs.dm
@@ -502,17 +502,17 @@ proc
if(I:icon)
if(I:icon_state)
// Has icon and state set
- add = icon(I:icon, I:icon_state, dir, 1, 0)
+ add = icon(I:icon, I:icon_state)
else
if(A.icon_state in icon_states(I:icon))
// Inherits icon_state from atom
- add = icon(I:icon, A.icon_state, dir, 1, 0)
+ add = icon(I:icon, A.icon_state)
else
// Uses default state ("")
- add = icon(I:icon, null, dir, 1, 0)
+ add = icon(I:icon)
else if(I:icon_state)
// Inherits icon from atom
- add = icon(A.icon, I:icon_state, dir, 1, 0)
+ add = icon(A.icon, I:icon_state)
else
// Unknown
continue
@@ -565,4 +565,20 @@ proc
I.pixel_y -= 1
if(4)
I.pixel_y += 1
- overlays += I//And finally add the overlay.
\ No newline at end of file
+ overlays += I//And finally add the overlay.
+
+/proc/getHologramIcon(icon/A, safety=1)//If safety is on, a new icon is not created.
+ var/icon/flat_icon = safety ? A : new(A)//Has to be a new icon to not constantly change the same icon.
+ flat_icon.ColorTone(rgb(125,180,225))//Let's make it bluish.
+ flat_icon.ChangeOpacity(0.5)//Make it half transparent.
+ var/icon/alpha_mask = new('effects.dmi', "scanline")//Scanline effect.
+ flat_icon.AddAlphaMask(alpha_mask)//Finally, let's mix in a distortion effect.
+ return flat_icon
+
+//For photo camera.
+/proc/build_composite_icon(atom/A)
+ var/icon/composite = icon(A.icon, A.icon_state, A.dir, 1)
+ for(var/O in A.overlays)
+ var/image/I = O
+ composite.Blend(icon(I.icon, I.icon_state, I.dir, 1), ICON_OVERLAY)
+ return composite
\ No newline at end of file
diff --git a/code/game/gamemodes/events/ninja_abilities.dm b/code/game/gamemodes/events/ninja_abilities.dm
index 0ea4bf3448c..a41d9e5c486 100644
--- a/code/game/gamemodes/events/ninja_abilities.dm
+++ b/code/game/gamemodes/events/ninja_abilities.dm
@@ -272,7 +272,14 @@ Movement impairing would indicate drugs and the like.*/
U.paralysis = 0
U.stunned = 0
U.weakened = 0
- spawn(30)
+ /*
+ Due to lag, it was possible to adrenaline boost but remain helpless while life.dm resets player stat.
+ This lead to me and others spamming adrenaline boosters because they failed to kick in on time.
+ It's technically possible to come back from crit with this but it is very temporary.
+ Life.dm will kick the player back into unconsciosness the next process loop.
+ */
+ U.stat = 0//At least now you should be able to teleport away or shoot ninja stars.
+ spawn(30)//Slight delay so the enemy does not immedietly know the ability was used. Due to lag, this often came before waking up.
U.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"))
spawn(70)
reagents.reaction(U, 2)
diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm
index d179e9f2702..f8175f98c01 100644
--- a/code/game/gamemodes/events/ninja_equipment.dm
+++ b/code/game/gamemodes/events/ninja_equipment.dm
@@ -54,7 +54,7 @@ ________________________________________________________________________________
del(n_shoes)
del(src)
-/obj/item/clothing/suit/space/space_ninja/proc/killai(var/mob/living/silicon/ai/A = AI)
+/obj/item/clothing/suit/space/space_ninja/proc/killai(mob/living/silicon/ai/A = AI)
if(A.client)
A << "\red Self-erase protocol dete-- *bzzzzz*"
A << browse(null, "window=hack spideros")
@@ -109,7 +109,7 @@ ________________________________________________________________________________
//=======//PROCESS PROCS//=======//
-/obj/item/clothing/suit/space/space_ninja/proc/ntick(var/mob/living/carbon/human/U as mob)
+/obj/item/clothing/suit/space/space_ninja/proc/ntick(mob/living/carbon/human/U = affecting)
set background = 1
//Runs in the background while the suit is initialized.
@@ -177,7 +177,7 @@ ________________________________________________________________________________
U << "\blue All systems operational. Welcome to SpiderOS, [U.real_name]."
grant_ninja_verbs()
grant_equip_verbs()
- ntick(U)
+ ntick()
sleep(delay)
s_busy = 0
else
@@ -720,7 +720,7 @@ ________________________________________________________________________________
hologram.invisibility = 101//So that it doesn't show up, ever. This also means one could attach a number of images to a single obj and display them differently to differnet people.
hologram.anchored = 1//So it cannot be dragged by space wind and the like.
hologram.dir = get_dir(T,affecting.loc)
- var/image/I = image('mob.dmi',hologram,"ai-holo")//Attach an image to object.
+ var/image/I = image(AI.holo_icon,hologram)//Attach an image to object.
hologram.i_attached = I//To attach the image in order to later reference.
AI << I
affecting << I
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 101fa269593..52749156d95 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -88,8 +88,8 @@ var/global/datum/controller/gameticker/ticker
distribute_jobs() //Distribute jobs and announce the captain
create_characters() //Create player characters and transfer them
collect_minds()
- equip_characters()
data_core.manifest()
+ equip_characters()
current_state = GAME_STATE_PLAYING
mode.post_setup()
diff --git a/code/game/machinery/computer/AIcore.dm b/code/game/machinery/computer/AIcore.dm
index ed0f13110af..6747055111d 100644
--- a/code/game/machinery/computer/AIcore.dm
+++ b/code/game/machinery/computer/AIcore.dm
@@ -2,7 +2,7 @@
density = 1
anchored = 0
name = "AI core"
- icon = 'AIcore.dmi'
+ icon = 'AI.dmi'
icon_state = "0"
var/state = 0
var/datum/ai_laws/laws = new /datum/ai_laws/asimov
@@ -146,7 +146,7 @@
/obj/AIcore/deactivated
name = "Inactive AI"
- icon = 'mob.dmi'
+ icon = 'AI.dmi'
icon_state = "ai-empty"
anchored = 1
state = 20//So it doesn't interact based on the above. Not really necessary.
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index bff8bc932e3..aeb66c5c3df 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -381,6 +381,7 @@ Pod/Blast Doors computer
L.fields["b_dna"] = H.dna.unique_enzymes
L.fields["enzymes"] = H.dna.struc_enzymes
L.fields["identity"] = H.dna.uni_identity
+ L.fields["image"] = getFlatIcon(H,0)
//End locked reporting
general += G
diff --git a/code/game/machinery/computer/hologram.dm b/code/game/machinery/computer/hologram.dm
index a48c6839474..5539a616f49 100644
--- a/code/game/machinery/computer/hologram.dm
+++ b/code/game/machinery/computer/hologram.dm
@@ -1,7 +1,7 @@
/obj/machinery/computer/hologram_comp/New()
..()
spawn( 10 )
- src.projector = locate(/obj/machinery/hologram_proj, get_step(src.loc, NORTH))
+ src.projector = locate(/obj/machinery/hologram/projector, get_step(src.loc, NORTH))
return
return
@@ -27,7 +27,7 @@
I.Blend(U, ICON_OVERLAY)
- src.projector.projection.icon = I
+ src.projector.hologram.icon = I
/obj/machinery/computer/hologram_comp/proc/show_console(var/mob/user as mob)
var/dat
@@ -35,7 +35,7 @@
if (src.temp)
dat = text("[]
Clear", src.temp, src)
else
- dat = text("Hologram Status:
\nPower: []
\nHologram Control:
\nColor Luminosity: []/220 \[Reset\]
\nLighten: 1 10
\nDarken: 1 10
\n
\nHair Color: ([],[],[]) \[Reset\]
\nRed (0-255): \[0\] -10 -1 [] 1 10 \[255\]
\nGreen (0-255): \[0\] -10 -1 [] 1 10 \[255\]
\nBlue (0-255): \[0\] -10 -1 [] 1 10 \[255\]
", src, (src.projector.projection ? "On" : "Off"), -src.lumens + 35, src, src, src, src, src, src.h_r, src.h_g, src.h_b, src, src, src, src, src.h_r, src, src, src, src, src, src, src.h_g, src, src, src, src, src, src, src.h_b, src, src, src)
+ dat = text("Hologram Status:
\nPower: []
\nHologram Control:
\nColor Luminosity: []/220 \[Reset\]
\nLighten: 1 10
\nDarken: 1 10
\n
\nHair Color: ([],[],[]) \[Reset\]
\nRed (0-255): \[0\] -10 -1 [] 1 10 \[255\]
\nGreen (0-255): \[0\] -10 -1 [] 1 10 \[255\]
\nBlue (0-255): \[0\] -10 -1 [] 1 10 \[255\]
", src, (src.projector.hologram ? "On" : "Off"), -src.lumens + 35, src, src, src, src, src, src.h_r, src.h_g, src.h_b, src, src, src, src, src.h_r, src, src, src, src, src, src, src.h_g, src, src, src, src, src, src, src.h_b, src, src, src)
user << browse(dat, "window=hologram_console")
onclose(user, "hologram_console")
return
@@ -46,43 +46,43 @@
if (in_range(src, usr))
flick("holo_console1", src)
if (href_list["power"])
- if (src.projector.projection)
+ if (src.projector.hologram)
src.projector.icon_state = "hologram0"
- //src.projector.projection = null
- del(src.projector.projection)
+ //src.projector.hologram = null
+ del(src.projector.hologram)
else
- src.projector.projection = new /obj/projection(src.projector.loc)
- src.projector.projection.icon = 'human.dmi'
- src.projector.projection.icon_state = "body_m_s"
+ src.projector.hologram = new(src.projector.loc)
+ src.projector.hologram.icon = 'human.dmi'
+ src.projector.hologram.icon_state = "body_m_s"
src.projector.icon_state = "hologram1"
src.render()
else
if (href_list["h_r"])
- if (src.projector.projection)
+ if (src.projector.hologram)
src.h_r += text2num(href_list["h_r"])
src.h_r = min(max(src.h_r, 0), 255)
render()
else
if (href_list["h_g"])
- if (src.projector.projection)
+ if (src.projector.hologram)
src.h_g += text2num(href_list["h_g"])
src.h_g = min(max(src.h_g, 0), 255)
render()
else
if (href_list["h_b"])
- if (src.projector.projection)
+ if (src.projector.hologram)
src.h_b += text2num(href_list["h_b"])
src.h_b = min(max(src.h_b, 0), 255)
render()
else
if (href_list["light"])
- if (src.projector.projection)
+ if (src.projector.hologram)
src.lumens += text2num(href_list["light"])
src.lumens = min(max(src.lumens, -185.0), 35)
render()
else
if (href_list["reset"])
- if (src.projector.projection)
+ if (src.projector.hologram)
src.lumens = 0
render()
else
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index be7dca256b4..0b1088878d6 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -11,7 +11,7 @@ Possible to do for anyone motivated enough:
Give an AI variable for different hologram icons.
Itegrate EMP effects to disable the unit.
*/
-/obj/machinery/holopad/attack_ai(mob/living/silicon/ai/user)
+/obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai/user)
if (!istype(user))
return
/*There are pretty much only three ways to interact here.
@@ -26,7 +26,7 @@ Possible to do for anyone motivated enough:
clear_holo()
return
-/obj/machinery/holopad/proc/activate_holo(mob/living/silicon/ai/user)
+/obj/machinery/hologram/holopad/proc/activate_holo(mob/living/silicon/ai/user)
if(!(stat & NOPOWER)&&user.client.eye==src)//If the projector has power and client eye is on it.
if(!hologram)//If there is not already a hologram.
create_holo(user)//Create one.
@@ -40,7 +40,7 @@ Possible to do for anyone motivated enough:
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
-/obj/machinery/holopad/hear_talk(mob/M, text)
+/obj/machinery/hologram/holopad/hear_talk(mob/M, text)
if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
if(!master.say_understands(M))//The AI will be able to understand most mobs talking through the holopad.
text = stars(text)
@@ -52,21 +52,21 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
master.show_message(rendered, 2)
return
-/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc)
+/obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc)
hologram = new(T)//Spawn a blank effect at the location.
- hologram.icon = 'mob.dmi'
- hologram.icon_state = "ai-holo"
+ hologram.icon = A.holo_icon
hologram.mouse_opacity = 0//So you can't click on it.
hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
hologram.sd_SetLuminosity(1)//To make it glowy.
hologram.anchored = 1//So space wind cannot drag it.
+ hologram.name = "AI hologram"//If someone decides to right click.
sd_SetLuminosity(1)//To make the pad glowy.
icon_state = "holopad1"
master = A//AI is the master.
use_power = 2//Active power usage.
return 1
-/obj/machinery/holopad/proc/clear_holo()
+/obj/machinery/hologram/holopad/proc/clear_holo()
hologram.sd_SetLuminosity(0)//Clear lighting.
del(hologram)//Get rid of hologram.
master = null//Null the master, since no-one is using it now.
@@ -75,7 +75,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
use_power = 1//Passive power usage.
return 1
-/obj/machinery/holopad/process()
+/obj/machinery/hologram/holopad/process()
if(hologram)//If there is a hologram.
if(master&&!master.stat&&master.client&&master.client.eye==src)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector.
if( !(get_dist(src,hologram.loc)>3||stat & NOPOWER) )//If the hologram is not out of bounds and the machine has power.
@@ -83,14 +83,14 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
clear_holo()//If not, we want to get rid of the hologram.
return 1
-/obj/machinery/holopad/power_change()
+/obj/machinery/hologram/power_change()
if (powered())
stat &= ~NOPOWER
else
stat |= ~NOPOWER
//Destruction procs.
-/obj/machinery/holopad/ex_act(severity)
+/obj/machinery/hologram/ex_act(severity)
switch(severity)
if(1.0)
del(src)
@@ -102,38 +102,36 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
del(src)
return
-/obj/machinery/holopad/blob_act()
+/obj/machinery/hologram/blob_act()
del(src)
return
-/obj/machinery/holopad/meteorhit()
+/obj/machinery/hologram/meteorhit()
del(src)
return
-/obj/machinery/holopad/Del()
+/obj/machinery/hologram/Del()
if(hologram)
- clear_holo()
+ src:clear_holo()
..()
/*
Holographic project of everything else.
+/mob/verb/hologram_test()
+ set name = "Hologram Debug New"
+ set category = "CURRENT DEBUG"
-/obj/machinery/holoprojector/attack_hand()
+ var/obj/overlay/hologram = new(loc)//Spawn a blank effect at the location.
+ var/icon/flat_icon = icon(getFlatIcon(src,0))//Need to make sure it's a new icon so the old one is not reused.
+ flat_icon.ColorTone(rgb(125,180,225))//Let's make it bluish.
+ flat_icon.ChangeOpacity(0.5)//Make it half transparent.
+ var/input = input("Select what icon state to use in effects.",,"")
+ if(input)
+ var/icon/alpha_mask = new('effects.dmi', "[input]")
+ flat_icon.AddAlphaMask(alpha_mask)//Finally, let's mix in a distortion effect.
+ hologram.icon = flat_icon
-/obj/machinery/holoprojector/create_holo(turf/T = loc, mob/living/M)
- hologram = new(T)//Spawn a blank effect at the location.
- //Here we don't want to actually change icon directly. We're looking to create an image.
- var/flat_image = getFlatIcon(M,2)//Get the flat icon facing south. Respect cache.
-
- hologram.overlay += flat_image
- hologram.mouse_opacity = 0//So you can't click on it.
- hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
- hologram.sd_SetLuminosity(1)//To make it glowy.
- sd_SetLuminosity(1)//To make the pad glowy.
- icon_state = "holopad1"
- use_power = 2//Active power usage.
- return 1
-
-/obj/machinery/holoprojector/clear_holo()
+ world << "Your icon should appear now."
+ return
*/
\ No newline at end of file
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index 8e375c03d4e..4944d3209ab 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -1,5 +1,5 @@
/obj/mecha/combat/durand
- desc = "Combat exosuit."
+ desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms."
name = "Durand"
icon_state = "durand"
step_in = 4
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 4702aac66eb..a37af9c76a8 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -1,5 +1,5 @@
/obj/mecha/combat/gygax
- desc = "Security exosuit."
+ desc = "A lightweight, security exosuit. Popular among private and corporate security."
name = "Gygax"
icon_state = "gygax"
step_in = 3
diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm
index f79ae49cc1b..a42b2628627 100644
--- a/code/game/mecha/combat/honker.dm
+++ b/code/game/mecha/combat/honker.dm
@@ -9,6 +9,7 @@
max_temperature = 3500
infra_luminosity = 5
operation_req_access = list(access_clown)
+ wreckage = "/obj/decal/mecha_wreckage/honker"
add_req_access = 0
max_equip = 3
var/squeak = 0
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 3faa182c279..24f9bb2f653 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -1,5 +1,5 @@
/obj/mecha/combat/marauder
- desc = "Heavy-duty, combat exosuit."
+ desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
name = "Marauder"
icon_state = "marauder"
step_in = 5
@@ -20,7 +20,7 @@
force = 45
/obj/mecha/combat/marauder/seraph
- desc = "Heavy-duty, command-type exosuit."
+ desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
name = "Seraph"
icon_state = "seraph"
operation_req_access = list(access_cent_creed)
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index cd41d524dcb..4e3f2ce20e1 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -91,7 +91,6 @@
return
-
/obj/decal/mecha_wreckage/marauder
name = "Marauder wreckage"
icon_state = "marauder-broken"
@@ -119,6 +118,26 @@
parts -= part
return
+/obj/decal/mecha_wreckage/honker
+ name = "Honker wreckage"
+ icon_state = "honker-broken"
+
+ New()
+ ..()
+ var/list/parts = list(
+ /obj/item/mecha_parts/chassis/honker,
+ /obj/item/mecha_parts/part/honker_torso,
+ /obj/item/mecha_parts/part/honker_head,
+ /obj/item/mecha_parts/part/honker_left_arm,
+ /obj/item/mecha_parts/part/honker_right_arm,
+ /obj/item/mecha_parts/part/honker_left_leg,
+ /obj/item/mecha_parts/part/honker_right_leg)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
/obj/decal/mecha_wreckage/durand
name = "Durand wreckage"
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 6774306471d..bef639e5838 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -1,5 +1,5 @@
/obj/mecha/working/ripley
- desc = "Autonomous Power Loader Unit."
+ desc = "Autonomous Power Loader Unit. The workhorse of the exosuit world."
name = "APLU \"Ripley\""
icon_state = "ripley"
step_in = 6
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 25f5f3ff9e1..3a56c98fadb 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -498,8 +498,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("assassin")
M.equip_if_possible(new /obj/item/clothing/under/suit_jacket(M), M.slot_w_uniform)
- M.equip_if_possible(new /obj/item/clothing/shoes/swat(M), M.slot_shoes)
- M.equip_if_possible(new /obj/item/clothing/gloves/swat(M), M.slot_gloves)
+ M.equip_if_possible(new /obj/item/clothing/shoes/black(M), M.slot_shoes)
+ M.equip_if_possible(new /obj/item/clothing/gloves/black(M), M.slot_gloves)
M.equip_if_possible(new /obj/item/device/radio/headset(M), M.slot_ears)
M.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(M), M.slot_glasses)
M.equip_if_possible(new /obj/item/clothing/suit/wcoat(M), M.slot_wear_suit)
@@ -563,6 +563,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("centcom commander")
M.equip_if_possible(new /obj/item/clothing/under/rank/centcom_commander(M), M.slot_w_uniform)
+ M.equip_if_possible(new /obj/item/clothing/suit/armor/bulletproof(M), M.slot_wear_suit)
M.equip_if_possible(new /obj/item/clothing/shoes/swat(M), M.slot_shoes)
M.equip_if_possible(new /obj/item/clothing/gloves/swat(M), M.slot_gloves)
M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), M.slot_ears)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 52a7de461bd..a269296bcea 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -14,6 +14,7 @@
anchored = 1
canmove = 0
loc = loc
+ holo_icon = getHologramIcon(icon('AI.dmi',"holo1"))
proc_holder_list = new()
@@ -34,6 +35,9 @@
verbs += /mob/living/silicon/ai/proc/lockdown
verbs += /mob/living/silicon/ai/proc/disablelockdown
verbs += /mob/living/silicon/ai/proc/ai_statuschange
+ //Hologram verb./N
+ verbs += /mob/living/silicon/ai/proc/ai_hologram_change
+
if(!safety)//Only used by AIize() to successfully spawn an AI.
if (!B)//If there is no player/brain inside.
new/obj/AIcore/deactivated(loc)//New empty terminal.
@@ -417,6 +421,44 @@
malf_picker.use(src)
+//I am the icon meister. Bow fefore me.
+/mob/living/silicon/ai/proc/ai_hologram_change()
+ set name = "Change Hologram"
+ set desc = "Change the default hologram available to AI to something else."
+ set category = "AI Commands"
+
+ var/input
+ if(alert("Would you like to select a hologram based on a crew member or switch to unique avatar?",,"Crew Member","Unique")=="Crew Member")
+
+ var/personnel_list[] = list()
+
+ for(var/datum/data/record/t in data_core.locked)//Look in data core locked.
+ personnel_list["[t.fields["name"]]: [t.fields["rank"]]"] = t.fields["image"]//Pull names, rank, and image.
+
+ if(personnel_list.len)
+ input = input("Select a crew member:") as null|anything in personnel_list
+ var/icon/character_icon = personnel_list[input]
+ if(character_icon)
+ del(holo_icon)//Clear old icon so we're not storing it in memory.
+ holo_icon = getHologramIcon(icon(character_icon))
+ else
+ alert("No suitable records found. Aborting.")
+
+ else
+ var/icon_list[] = list(
+ "default",
+ "floating face"
+ )
+ input = input("Please select a hologram:") as null|anything in icon_list
+ if(input)
+ del(holo_icon)
+ switch(input)
+ if("default")
+ holo_icon = getHologramIcon(icon('AI.dmi',"holo1"))
+ if("floating face")
+ holo_icon = getHologramIcon(icon('AI.dmi',"holo2"))
+ return
+
diff --git a/code/modules/mob/living/silicon/ai/move.dm b/code/modules/mob/living/silicon/ai/move.dm
index e15e470ca09..c9ecb3fe792 100644
--- a/code/modules/mob/living/silicon/ai/move.dm
+++ b/code/modules/mob/living/silicon/ai/move.dm
@@ -20,7 +20,7 @@
return//Whatever the case, return since you can't move anyway.
if(user.client)//To make AI holograms work. They will relay directions as long as they are centered on the object.
- var/obj/machinery/holopad/T = user.client.eye//Client eye centers on an object.
+ var/obj/machinery/hologram/holopad/T = user.client.eye//Client eye centers on an object.
if(istype(T)&&T.hologram&&T.master==user)//If there is a hologram and its master is the user.
T.hologram.loc = get_step(T.hologram, direct)
T.hologram.dir = direct
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 135b834152c..dac3fc0413d 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -43,7 +43,7 @@
if (!message)
return
- var/obj/machinery/holopad/T = client.eye//Client eye centers on an object.
+ var/obj/machinery/hologram/holopad/T = client.eye//Client eye centers on an object.
if(istype(T)&&T.hologram&&T.master==src)//If there is a hologram and its master is the user.
var/message_a = say_quote(message)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 1026c51602d..a5fe5a1b991 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -268,6 +268,7 @@ mob/new_player
proc/AttemptLateSpawn(rank, maxAllowed)
if(IsJobAvailable(rank, maxAllowed))
var/mob/living/carbon/human/character = create_character()
+ var/icon/char_icon = getFlatIcon(character,0)//We're creating out own cache so it's not needed.
if (character)
character.Equip_Rank(rank, joined_late=1)
@@ -276,7 +277,7 @@ mob/new_player
// if((t.fields["name"] == character.real_name) && (t.fields["rank"] == "Unassigned"))
// t.fields["rank"] = rank
if(character.mind.assigned_role != "Cyborg")
- ManifestLateSpawn(character)
+ ManifestLateSpawn(character,char_icon)
if(ticker)
character.loc = pick(latejoin)
AnnounceArrival(character, rank)
@@ -300,7 +301,7 @@ mob/new_player
if(character.mind.assigned_role != "Cyborg"&&character.mind.special_role != "MODE")
announcer.say("[character.real_name], the [rank], has awoken from cryo sleep.")
- proc/ManifestLateSpawn(var/mob/living/carbon/human/H) // Attempted fix to add late joiners to various databases -- TLE
+ proc/ManifestLateSpawn(var/mob/living/carbon/human/H, icon/H_icon) // Attempted fix to add late joiners to various databases -- TLE
// This is basically ripped wholesale from the normal code for adding people to the databases during a fresh round
if (!isnull(H.mind) && (H.mind.assigned_role != "MODE"))
var/datum/data/record/G = new()
@@ -354,6 +355,7 @@ mob/new_player
L.fields["b_dna"] = H.dna.unique_enzymes
L.fields["enzymes"] = H.dna.struc_enzymes
L.fields["identity"] = H.dna.uni_identity
+ L.fields["image"] = H_icon//What the person looks like. Naked, in this case.
//End locked reporting
data_core.general += G
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 859b437c54e..a6c994d7d96 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi
new file mode 100644
index 00000000000..ad793eb68c6
Binary files /dev/null and b/icons/mob/AI.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 50147e00b49..d68dcfbe926 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index f903b83316e..ae1e71a08c5 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 81c5ee22555..ba5a1d92988 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/mob/mecha.dmi b/icons/mob/mecha.dmi
index ffc554e28e3..3cc44c6defc 100644
Binary files a/icons/mob/mecha.dmi and b/icons/mob/mecha.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index a2b941b8d71..af774d69079 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index eb05058426b..f3e5c2cc0ad 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/AIcore.dmi b/icons/obj/AIcore.dmi
deleted file mode 100644
index 15e0ffc1efa..00000000000
Binary files a/icons/obj/AIcore.dmi and /dev/null differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 3e8e9a12df5..c55784f176c 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index a738ec4b01b..3964ba50269 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index fe4a90283cb..fb7514eae01 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/maps/tgstation.2.0.7.dmm b/maps/tgstation.2.0.7.dmm
index 10693db7ca1..e722a67eafc 100644
--- a/maps/tgstation.2.0.7.dmm
+++ b/maps/tgstation.2.0.7.dmm
@@ -669,7 +669,7 @@
"amS" = (/obj/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig)
"amT" = (/obj/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = "90Curve"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig)
"amU" = (/turf/simulated/floor{icon_state = "red"; dir = 9},/area/security/brig)
-"amV" = (/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/holopad,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig)
+"amV" = (/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig)
"amW" = (/obj/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/brig)
"amX" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple,/obj/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig)
"amY" = (/obj/machinery/door_timer{name = "Cell 5 Control"; pixel_x = 0; pixel_y = 30; id = "cell5"},/obj/machinery/camera{c_tag = "Brig Cells East"},/obj/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = "90Curve"},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/brig)
@@ -737,7 +737,7 @@
"aoi" = (/obj/stool/chair{dir = 4; name = "Defense"},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/crew_quarters/courtroom)
"aoj" = (/obj/table/woodentable,/turf/simulated/floor{icon_state = "neutral"; dir = 9},/area/crew_quarters/courtroom)
"aok" = (/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/courtroom)
-"aol" = (/obj/machinery/holopad,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/courtroom)
+"aol" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/courtroom)
"aom" = (/obj/table/woodentable,/turf/simulated/floor{icon_state = "neutral"; dir = 5},/area/crew_quarters/courtroom)
"aon" = (/obj/stool/chair{dir = 8; name = "Prosecution"},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/crew_quarters/courtroom)
"aoo" = (/obj/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -1977,7 +1977,7 @@
"aMa" = (/obj/grille,/obj/window/reinforced,/obj/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/exit)
"aMb" = (/obj/grille,/obj/window/reinforced{dir = 4},/obj/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/exit)
"aMc" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry)
-"aMd" = (/obj/machinery/holopad,/turf/simulated/floor,/area/hallway/secondary/entry)
+"aMd" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/hallway/secondary/entry)
"aMe" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/hallway/secondary/entry)
"aMf" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/hallway/secondary/entry)
"aMg" = (/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/hallway/secondary/entry)
@@ -2210,7 +2210,7 @@
"aQz" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/bridge)
"aQA" = (/obj/stool/chair{dir = 1; name = "Security Station"},/turf/simulated/floor,/area/bridge)
"aQB" = (/obj/item/device/radio/beacon,/turf/simulated/floor,/area/bridge)
-"aQC" = (/obj/machinery/holopad,/turf/simulated/floor,/area/bridge)
+"aQC" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/bridge)
"aQD" = (/obj/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor,/area/bridge)
"aQE" = (/obj/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/turf/simulated/floor,/area/bridge)
"aQF" = (/obj/stool/chair{dir = 1; name = "Medical Station"},/obj/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = "90Curve"},/turf/simulated/floor,/area/bridge)
@@ -2297,7 +2297,7 @@
"aSi" = (/obj/stool/chair{dir = 4},/turf/simulated/floor,/area/library)
"aSj" = (/obj/table/reinforced,/obj/item/weapon/dice/d20,/turf/simulated/floor{icon_state = "dark"},/area/library)
"aSk" = (/obj/stool/chair{dir = 8},/turf/simulated/floor,/area/library)
-"aSl" = (/obj/machinery/holopad,/turf/simulated/floor{icon_state = "dark"},/area/library)
+"aSl" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/library)
"aSm" = (/obj/table/reinforced,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/library)
"aSn" = (/obj/stool/chair{dir = 8},/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor,/area/library)
"aSo" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "wood"},/area/library)
@@ -2387,7 +2387,7 @@
"aTU" = (/obj/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main)
"aTV" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Chapel"},/obj/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main)
"aTW" = (/obj/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = "90Curve"},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
-"aTX" = (/obj/machinery/holopad,/turf/simulated/floor,/area/hallway/secondary/exit)
+"aTX" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/hallway/secondary/exit)
"aTY" = (/obj/machinery/camera{c_tag = "Escape Arm Airlocks"; dir = 8; network = "SS13"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit)
"aTZ" = (/obj/grille,/obj/window/reinforced{dir = 4},/obj/window/reinforced{dir = 8},/obj/machinery/status_display,/turf/simulated/floor/plating,/area/hallway/secondary/exit)
"aUa" = (/obj/lattice,/obj/lattice,/turf/space,/area)
@@ -2614,7 +2614,7 @@
"aYn" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor,/area/crew_quarters/captain)
"aYo" = (/turf/simulated/floor{dir = 10; icon_state = "carpetside"},/area/crew_quarters/captain)
"aYp" = (/turf/simulated/floor{icon_state = "carpetside"},/area/crew_quarters/captain)
-"aYq" = (/obj/machinery/holopad,/turf/simulated/floor{icon_state = "carpetside"},/area/crew_quarters/captain)
+"aYq" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "carpetside"},/area/crew_quarters/captain)
"aYr" = (/mob/living/carbon/monkey{name = "Pun Pun"},/turf/simulated/floor{icon_state = "carpetside"},/area/crew_quarters/captain)
"aYs" = (/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/floor{dir = 6; icon_state = "carpetside"},/area/crew_quarters/captain)
"aYt" = (/obj/machinery/vending/coffee,/turf/simulated/floor,/area/crew_quarters/captain)
@@ -3251,7 +3251,7 @@
"bkA" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor/plating,/area/teleporter)
"bkB" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"bkC" = (/obj/table,/obj/item/weapon/aiModule/reset,/obj/machinery/camera{c_tag = "AI Upload Chamber"; dir = 4; network = "SS13"},/turf/simulated/floor/grid,/area/turret_protected/ai_upload)
-"bkD" = (/obj/machinery/holopad,/turf/simulated/floor,/area/turret_protected/ai_upload)
+"bkD" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/turret_protected/ai_upload)
"bkE" = (/obj/table,/obj/item/weapon/aiModule/protectStation,/turf/simulated/floor/grid,/area/turret_protected/ai_upload)
"bkF" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8},/turf/simulated/wall/r_wall,/area/security/nuke_storage)
"bkG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/nuke_storage)
@@ -3421,7 +3421,7 @@
"bnO" = (/obj/disposalpipe/segment,/turf/simulated/wall,/area/crew_quarters/kitchen)
"bnP" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/kitchen)
"bnQ" = (/obj/machinery/camera{c_tag = "Bar Center"; dir = 4; network = "SS13"},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
-"bnR" = (/obj/machinery/holopad,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
+"bnR" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
"bnS" = (/obj/stool{pixel_y = 5},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
"bnT" = (/obj/machinery/vending/cigarette{pixel_x = -3; pixel_y = 2},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/bar)
"bnU" = (/obj/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple{color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = "90Curve"},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
@@ -4544,7 +4544,7 @@
"bJt" = (/obj/table,/obj/item/weapon/hand_labeler,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bJu" = (/obj/table,/obj/machinery/light,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bJv" = (/obj/table,/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
-"bJw" = (/obj/machinery/holopad,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
+"bJw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bJx" = (/obj/machinery/door/window{dir = 8; icon = 'windoor.dmi'; name = "Server Room"; req_access_txt = "30"},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bJy" = (/obj/machinery/power/apc{dir = 2; name = "Server APC"; pixel_y = -25},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bJz" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/window{dir = 8; icon = 'windoor.dmi'; name = "Server Room"; req_access_txt = "30"},/obj/machinery/door/window{base_state = "right"; dir = 4; icon = 'windoor.dmi'; icon_state = "right"; name = "Server Room"; req_access_txt = "30"},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
@@ -5098,7 +5098,7 @@
"bUb" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/wall,/area/maintenance/aft)
"bUc" = (/obj/machinery/camera{c_tag = "Aft Primary Hallway South"; dir = 4; network = "SS13"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"bUd" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"bUe" = (/obj/machinery/holopad,/turf/simulated/floor,/area/atmos)
+"bUe" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/atmos)
"bUf" = (/obj/grille,/obj/window/reinforced{dir = 4},/obj/window/reinforced,/obj/window/reinforced{dir = 1},/obj/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/atmos)
"bUg" = (/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 5; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/atmos)
"bUh" = (/obj/machinery/atmospherics/pipe/simple{color = "cyan"; icon_state = "intact-c"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "red"; dir = 4; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/atmos)
@@ -5122,7 +5122,7 @@
"bUz" = (/obj/table,/obj/item/weapon/circular_saw,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"bUA" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"bUB" = (/obj/landmark/start{name = "Xenobiologist"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
-"bUC" = (/obj/machinery/holopad,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
+"bUC" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"bUD" = (/obj/item/weapon/paper{name = "Work in Progress"},/obj/machinery/door/window{dir = 8; icon = 'windoor.dmi'; name = "Containment Exterior"; req_access_txt = "55"},/obj/machinery/light,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
"bUE" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "containment"; name = "Xenobiology Blast Doors"; opacity = 0},/obj/machinery/door/window{base_state = "right"; dir = 4; icon = 'windoor.dmi'; icon_state = "right"; name = "Containment Interior"; req_access_txt = "55"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/xenobiology)
"bUF" = (/obj/landmark{name = "xeno_spawn"; pixel_x = -1},/mob/living/carbon/metroid,/turf/simulated/floor{icon_state = "dark"},/area/toxins/xenobiology)
@@ -6827,7 +6827,7 @@
"cBo" = (/obj/machinery/turret,/obj/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
"cBp" = (/obj/machinery/turret,/obj/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
"cBq" = (/obj/machinery/ai_slipper,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
-"cBr" = (/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/obj/machinery/holopad,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
+"cBr" = (/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)
"cBs" = (/obj/cable,/obj/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area)
"cBt" = (/obj/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = "90Curve"},/turf/simulated/wall,/area/turret_protected/aisat_interior)
"cBu" = (/obj/machinery/power/terminal{dir = 8},/obj/machinery/light,/obj/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/aisat_interior)