Files
CHOMPStation2/code/modules/holodeck/HolodeckObjects.dm
CHOMPStation2StaffMirrorBot 5e918deded [MIRROR] Removes Armorsoak (#11879)
Co-authored-by: Reo Lozzot <84661000+ReoDaProtovali@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2025-11-02 20:00:44 -05:00

533 lines
15 KiB
Plaintext

// Holographic Items!
// Holographic tables are in code/modules/tables/presets.dm
// Holographic racks are in code/modules/tables/rack.dm
/turf/simulated/floor/holofloor
desc = "A convincing simulation."
thermal_conductivity = 0
flags = TURF_ACID_IMMUNE
/turf/simulated/floor/holofloor/attackby(obj/item/W as obj, mob/user as mob)
return
// HOLOFLOOR DOES NOT GIVE A FUCK
/turf/simulated/floor/holofloor/set_flooring()
return
/turf/simulated/floor/holofloor/carpet
name = "carpet"
icon = 'icons/turf/flooring/carpet.dmi'
icon_state = "carpet"
initial_flooring = /decl/flooring/carpet
/turf/simulated/floor/holofloor/tiled
name = "floor"
icon = 'icons/turf/flooring/tiles.dmi'
icon_state = "steel"
initial_flooring = /decl/flooring/tiling
/turf/simulated/floor/holofloor/tiled/dark
name = "dark floor"
icon_state = "dark"
initial_flooring = /decl/flooring/tiling/dark
/turf/simulated/floor/holofloor/lino
name = "lino"
icon = 'icons/turf/flooring/linoleum.dmi'
icon_state = "lino"
initial_flooring = /decl/flooring/linoleum
/turf/simulated/floor/holofloor/wood
name = "wooden floor"
icon = 'icons/turf/flooring/wood.dmi'
icon_state = "wood"
initial_flooring = /decl/flooring/wood
/turf/simulated/floor/holofloor/grass
name = "lush grass"
icon = 'icons/turf/flooring/grass.dmi'
icon_state = "grass0"
initial_flooring = /decl/flooring/grass
/turf/simulated/floor/holofloor/grass/jungle
icon = 'icons/jungle.dmi'
icon_state = "grass2"
/turf/simulated/floor/holofloor/grass/hive
icon = 'icons/turf/flooring/misc_vr.dmi'
icon_state = "hive"
name = "giant honeycomb"
/turf/simulated/floor/holofloor/wood/diona
icon = 'icons/turf/floors.dmi'
icon_state = "diona"
/turf/simulated/floor/holofloor/snow
name = "snow"
base_name = "snow"
icon = 'icons/turf/floors.dmi'
base_icon = 'icons/turf/floors.dmi'
icon_state = "snow"
base_icon_state = "snow"
/turf/simulated/floor/holofloor/space
icon = 'icons/turf/space.dmi'
plane = SPACE_PLANE
name = "\proper space"
icon_state = "white"
/turf/simulated/floor/holofloor/space/update_icon()
. = ..()
add_overlay(SSskybox.dust_cache["[((x + y) ^ ~(x * y) + z) % 25]"])
/turf/simulated/floor/holofloor/reinforced
icon = 'icons/turf/flooring/tiles.dmi'
initial_flooring = /decl/flooring/reinforced
name = "reinforced holofloor"
icon_state = "reinforced"
/turf/simulated/floor/holofloor/beach
desc = "Uncomfortably gritty for a hologram."
base_desc = "Uncomfortably gritty for a hologram."
icon = 'icons/misc/beach.dmi'
base_icon = 'icons/misc/beach.dmi'
initial_flooring = null
/turf/simulated/floor/holofloor/beach/sand
name = "sand"
icon_state = "desert"
base_icon_state = "desert"
/turf/simulated/floor/holofloor/beach/coastline
name = "coastline"
icon = 'icons/misc/beach2.dmi'
icon_state = "sandwater"
base_icon_state = "sandwater"
/turf/simulated/floor/holofloor/beach/water
name = "water"
icon_state = "seashallow"
base_icon_state = "seashallow"
/turf/simulated/floor/holofloor/desert
name = "desert sand"
base_name = "desert sand"
desc = "Uncomfortably gritty for a hologram."
base_desc = "Uncomfortably gritty for a hologram."
icon_state = "asteroid"
base_icon_state = "asteroid"
icon = 'icons/turf/flooring/asteroid.dmi'
base_icon = 'icons/turf/flooring/asteroid.dmi'
initial_flooring = null
/turf/simulated/floor/holofloor/desert/Initialize(mapload)
. = ..()
if(prob(10))
add_overlay("asteroid[rand(0,9)]")
/turf/simulated/floor/holofloor/bmarble
name = "marble"
icon = 'icons/turf/flooring/misc.dmi'
icon_state = "darkmarble"
initial_flooring = /decl/flooring/bmarble
/turf/simulated/floor/holofloor/wmarble
name = "marble"
icon = 'icons/turf/flooring/misc.dmi'
icon_state = "lightmarble"
initial_flooring = /decl/flooring/wmarble
/obj/structure/holostool
name = "stool"
desc = "Apply butt."
icon = 'icons/obj/furniture.dmi'
icon_state = "stool_padded_preview"
anchored = TRUE
unacidable = TRUE
pressure_resistance = 15
/obj/item/clothing/gloves/boxing/hologlove
name = "boxing gloves"
desc = "Because you really needed another excuse to punch your crewmates."
icon_state = "boxing"
unacidable = TRUE
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi',
)
item_state = "boxing"
special_attack_type = /datum/unarmed_attack/holopugilism
/datum/unarmed_attack/holopugilism
sparring_variant_type = /datum/unarmed_attack/holopugilism
is_punch = TRUE
/datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone)
user.do_attack_animation(src)
var/damage = rand(0, 9)
if(!damage)
playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
target.visible_message(span_danger("[user] has attempted to punch [target]!"))
return TRUE
var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting))
var/armor_block = target.run_armor_check(affecting, "melee")
if(HULK in user.mutations)
damage += 5
playsound(target, "punch", 25, 1, -1)
target.visible_message(span_bolddanger("[user] has punched [target]!"))
target.apply_damage(damage, HALLOSS, affecting, armor_block)
if(damage >= 9)
target.visible_message(span_bolddanger("[user] has weakened [target]!"))
target.apply_effect(4, WEAKEN, armor_block)
return TRUE
/obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob)
if(!istype(W))
return//I really wish I did not need this
if (istype(W, /obj/item/grab) && get_dist(src,user)<2)
var/obj/item/grab/G = W
if(isliving(G.affecting))
var/mob/living/M = G.affecting
var/state = G.state
qdel(W) //gotta delete it here because if window breaks, it won't get deleted
switch (state)
if(1)
M.visible_message(span_warning("[user] slams [M] against \the [src]!"))
M.apply_damage(7)
hit(10)
if(2)
M.visible_message(span_danger("[user] bashes [M] against \the [src]!"))
if (prob(50))
M.Weaken(1)
M.apply_damage(10)
hit(25)
if(3)
M.visible_message(span_danger("<big>[user] crushes [M] against \the [src]!</big>"))
M.Weaken(5)
M.apply_damage(20)
hit(50)
return
if(W.flags & NOBLUDGEON) return
if(W.has_tool_quality(TOOL_SCREWDRIVER))
to_chat(user, span_notice("It's a holowindow, you can't unfasten it!"))
else if(W.has_tool_quality(TOOL_CROWBAR) && reinf && state <= 1)
to_chat(user, span_notice("It's a holowindow, you can't pry it!"))
else if(W.has_tool_quality(TOOL_WRENCH) && !anchored && (!state || !reinf))
to_chat(user, span_notice("It's a holowindow, you can't dismantle it!"))
else
if(W.damtype == BRUTE || W.damtype == BURN)
hit(W.force)
if(health <= 7)
anchored = FALSE
update_nearby_icons()
step(src, get_dir(user, src))
else
playsound(src, 'sound/effects/Glasshit.ogg', 75, 1)
..()
return
/obj/structure/window/reinforced/holowindow/shatter(var/display_message = 1)
playsound(src, "shatter", 70, 1)
if(display_message)
visible_message("[src] fades away as it shatters!")
qdel(src)
return
/obj/machinery/door/window/holowindoor/attackby(obj/item/I as obj, mob/user as mob)
if (src.operating == 1)
return
if(src.density && istype(I, /obj/item) && !istype(I, /obj/item/card))
var/aforce = I.force
playsound(src, 'sound/effects/Glasshit.ogg', 75, 1)
visible_message(span_bolddanger("[src] was hit by [I]."))
if(I.damtype == BRUTE || I.damtype == BURN)
take_damage(aforce)
return
src.add_fingerprint(user)
if (!src.requiresID())
user = null
if (src.allowed(user))
if (src.density)
open()
else
close()
else if (src.density)
flick(text("[]deny", src.base_state), src)
return
/obj/machinery/door/window/holowindoor/shatter(var/display_message = 1)
src.density = FALSE
playsound(src, "shatter", 70, 1)
if(display_message)
visible_message("[src] fades away as it shatters!")
qdel(src)
/obj/structure/bed/chair/holochair/attackby(obj/item/W as obj, mob/user as mob)
if(W.has_tool_quality(TOOL_WRENCH))
to_chat(user, span_notice("It's a holochair, you can't dismantle it!"))
return
//VOREStation Add
/obj/structure/bed/holobed/attackby(obj/item/W as obj, mob/user as mob)
if(W.has_tool_quality(TOOL_WRENCH))
to_chat(user, span_notice("It's a holochair, you can't dismantle it!"))
return
//VOREStation Add End
/obj/item/holo
damtype = HALLOSS
no_attack_log = 1
no_random_knockdown = TRUE
/obj/item/holo/esword
name = "holographic energy sword"
desc = "May the force be within you. Sorta."
icon_state = "esword"
var/lcolor
var/rainbow = FALSE
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
)
force = 3.0
throw_speed = 1
throw_range = 5
throwforce = 0
w_class = ITEMSIZE_SMALL
flags = NOBLOODY
unacidable = TRUE
var/active = 0
/obj/item/holo/esword/green
lcolor = "#008000"
/obj/item/holo/esword/red
lcolor = "#FF0000"
/obj/item/holo/esword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(active && default_parry_check(user, attacker, damage_source) && prob(50))
user.visible_message(span_danger("\The [user] parries [attack_text] with \the [src]!"))
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, user.loc)
spark_system.start()
playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
return TRUE
return FALSE
/obj/item/holo/esword/attack_self(mob/living/user as mob)
active = !active
if (active)
force = 30
item_state = "[icon_state]_blade"
w_class = ITEMSIZE_LARGE
playsound(src, 'sound/weapons/saberon.ogg', 50, 1)
to_chat(user, span_notice("[src] is now active."))
else
force = 3
item_state = "[icon_state]"
w_class = ITEMSIZE_SMALL
playsound(src, 'sound/weapons/saberoff.ogg', 50, 1)
to_chat(user, span_notice("[src] can now be concealed."))
update_icon()
add_fingerprint(user)
return
/obj/item/holo/esword/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/multitool) && !active)
if(!rainbow)
rainbow = TRUE
else
rainbow = FALSE
to_chat(user, span_notice("You manipulate the color controller in [src]."))
update_icon()
return ..()
/obj/item/holo/esword/update_icon()
. = ..()
var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
blade_overlay.color = lcolor
cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
if(active)
add_overlay(blade_overlay)
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
H.update_inv_l_hand()
H.update_inv_r_hand()
//BASKETBALL OBJECTS
/obj/item/beach_ball/holoball
icon = 'icons/obj/balls_vr.dmi'
icon_state = "basketball"
name = "basketball"
desc = "Here's your chance, do your dance at the Space Jam."
w_class = ITEMSIZE_LARGE //Stops people from hiding it in their bags/pockets
unacidable = TRUE
drop_sound = 'sound/items/drop/basketball.ogg'
pickup_sound = 'sound/items/pickup/basketball.ogg'
/obj/structure/holohoop
name = "basketball hoop"
desc = "Boom, Shakalaka!"
icon = 'icons/obj/32x64.dmi'
icon_state = "hoop"
anchored = TRUE
density = TRUE
unacidable = TRUE
throwpass = 1
/obj/structure/holohoop/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/grab) && get_dist(src,user)<2)
var/obj/item/grab/G = W
if(G.state<2)
to_chat(user, span_warning("You need a better grip to do that!"))
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
visible_message(span_warning("[G.assailant] dunks [G.affecting] into the [src]!"), 3)
qdel(W)
return
else if (istype(W, /obj/item) && get_dist(src,user)<2)
user.drop_item(src.loc)
visible_message(span_notice("[user] dunks [W] into the [src]!"), 3)
return
/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target)
if (istype(mover,/obj/item) && mover.throwing)
var/obj/item/I = mover
if(istype(I, /obj/item/projectile))
return TRUE
if(prob(50))
I.forceMove(loc)
visible_message(span_notice("Swish! \the [I] lands in \the [src]."), 3)
else
visible_message(span_warning("\The [I] bounces off of \the [src]'s rim!"), 3)
return FALSE
return ..()
/obj/machinery/readybutton
name = "Ready Declaration Device"
desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!"
icon = 'icons/obj/monitors.dmi'
icon_state = "auth_off"
layer = ABOVE_WINDOW_LAYER
var/ready = 0
var/area/currentarea = null
var/eventstarted = 0
unacidable = TRUE
anchored = TRUE
use_power = USE_POWER_IDLE
idle_power_usage = 2
active_power_usage = 6
power_channel = ENVIRON
/obj/machinery/readybutton/attack_ai(mob/user)
to_chat(user, "The station AI is not to interact with these devices!")
return
/obj/machinery/readybutton/attackby(obj/item/W, mob/user)
to_chat(user, "The device is a solid button, there's nothing you can do with it!")
/obj/machinery/readybutton/attack_hand(mob/user)
if(user.stat || stat & (NOPOWER|BROKEN))
to_chat(user, "This device is not powered.")
return
if(!user.IsAdvancedToolUser())
return 0
currentarea = get_area(src.loc)
if(!currentarea)
qdel(src)
if(eventstarted)
to_chat(user, "The event has already begun!")
return
ready = !ready
update_icon()
var/numbuttons = 0
var/numready = 0
for(var/obj/machinery/readybutton/button in currentarea)
numbuttons++
if (button.ready)
numready++
if(numbuttons == numready)
begin_event()
/obj/machinery/readybutton/update_icon()
if(ready)
icon_state = "auth_on"
else
icon_state = "auth_off"
/obj/machinery/readybutton/proc/begin_event()
eventstarted = 1
for(var/obj/structure/window/reinforced/holowindow/disappearing/W in currentarea)
qdel(W)
for(var/mob/M in currentarea)
to_chat(M, "FIGHT!")
// A window that disappears when the ready button is pressed
/obj/structure/window/reinforced/holowindow/disappearing
name = "Event Window"
//Holocarp
/mob/living/simple_mob/animal/space/carp/holodeck
icon = 'icons/mob/AI.dmi'
icon_state = "holo4"
icon_living = "holo4"
icon_dead = "holo4"
alpha = 127
icon_gib = null
meat_amount = 0
meat_type = null
/mob/living/simple_mob/animal/space/carp/holodeck/Initialize(mapload)
. = ..()
set_light(2) //hologram lighting
/mob/living/simple_mob/animal/space/carp/holodeck/proc/set_safety(var/safe)
if (safe)
faction = FACTION_NEUTRAL
melee_damage_lower = 0
melee_damage_upper = 0
else
faction = FACTION_CARP
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)
/mob/living/simple_mob/animal/space/carp/holodeck/gib()
derez() //holograms can't gib
/mob/living/simple_mob/animal/space/carp/holodeck/death()
..()
derez()
/mob/living/simple_mob/animal/space/carp/holodeck/proc/derez()
visible_message(span_infoplain(span_bold("\The [src]") + " fades away!"))
qdel(src)