mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-21 12:04:48 +01:00
Merge remote-tracking branch 'upstream/master' into brass
This commit is contained in:
@@ -122,6 +122,10 @@
|
||||
if(!in_range(user, src) || !isturf(user.loc) || user.incapacitated() || M.anchored)
|
||||
return FALSE
|
||||
|
||||
if (isguardian(user))
|
||||
if (M.loc == user.loc || user.alpha == 60) //Alpha is for detecting ranged guardians in scout mode
|
||||
return //unmanifested guardians shouldn't be able to buckle mobs
|
||||
|
||||
add_fingerprint(user)
|
||||
. = buckle_mob(M, check_loc = check_loc)
|
||||
if(.)
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/decal/cleanable/insectguts
|
||||
name = "cockroach guts"
|
||||
name = "bug guts"
|
||||
desc = "One bug squashed. Four more will rise in its place."
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "xfloor1"
|
||||
|
||||
@@ -53,6 +53,9 @@
|
||||
/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
|
||||
return FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/is_cleanable()
|
||||
return TRUE
|
||||
|
||||
/obj/effect/decal/cleanable/Initialize(mapload)
|
||||
. = ..()
|
||||
if(loc && isturf(loc))
|
||||
|
||||
@@ -45,15 +45,15 @@
|
||||
var/light = -1
|
||||
var/flash = -1
|
||||
|
||||
// Clamp all values to MAX_EXPLOSION_RANGE
|
||||
// We dont need to clamp here. It gets clamped inside explosion()
|
||||
if(round(amount/12) > 0)
|
||||
devastation = min (GLOB.max_ex_devastation_range, devastation + round(amount/12))
|
||||
devastation += round(amount/12)
|
||||
|
||||
if(round(amount/6) > 0)
|
||||
heavy = min (GLOB.max_ex_heavy_range, heavy + round(amount/6))
|
||||
heavy += round(amount/6)
|
||||
|
||||
if(round(amount/3) > 0)
|
||||
light = min (GLOB.max_ex_light_range, light + round(amount/3))
|
||||
light += round(amount/3)
|
||||
|
||||
if(flashing && flashing_factor)
|
||||
flash += (round(amount/4) * flashing_factor)
|
||||
|
||||
@@ -25,6 +25,9 @@
|
||||
/obj/effect/acid_act()
|
||||
return
|
||||
|
||||
/obj/effect/proc/is_cleanable() //Called when you want to clean something, and usualy delete it after
|
||||
return FALSE
|
||||
|
||||
/obj/effect/mech_melee_attack(obj/mecha/M)
|
||||
return 0
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/proc/gibs(atom/location, datum/dna/MobDNA) //CARN MARKER
|
||||
new /obj/effect/gibspawner/generic(get_turf(location), MobDNA)
|
||||
/proc/gibs(atom/location, datum/dna/mob_dna) //CARN MARKER
|
||||
new /obj/effect/gibspawner/generic(get_turf(location), mob_dna)
|
||||
|
||||
/proc/hgibs(atom/location, datum/dna/MobDNA)
|
||||
new /obj/effect/gibspawner/human(get_turf(location), MobDNA)
|
||||
/proc/hgibs(atom/location, datum/dna/mob_dna)
|
||||
new /obj/effect/gibspawner/human(get_turf(location), mob_dna)
|
||||
|
||||
/proc/xgibs(atom/location)
|
||||
new /obj/effect/gibspawner/xeno(get_turf(location))
|
||||
@@ -16,38 +16,55 @@
|
||||
var/list/gibamounts = list()
|
||||
var/list/gibdirections = list() //of lists
|
||||
|
||||
/obj/effect/gibspawner/New(location, datum/dna/MobDNA)
|
||||
/obj/effect/gibspawner/Initialize(mapload, datum/dna/mob_dna)
|
||||
..()
|
||||
ASSERT(length(gibtypes) == length(gibamounts))
|
||||
ASSERT(length(gibamounts) == length(gibdirections))
|
||||
|
||||
if(istype(loc,/turf)) //basically if a badmin spawns it
|
||||
Gib(loc, MobDNA)
|
||||
if(isturf(loc))
|
||||
spawn_gibs(loc, mob_dna)
|
||||
|
||||
/obj/effect/gibspawner/proc/Gib(atom/location, datum/dna/MobDNA = null)
|
||||
if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len)
|
||||
to_chat(world, "<span class='warning'>Gib list length mismatch!</span>")
|
||||
return
|
||||
return INITIALIZE_HINT_QDEL // qdel once done
|
||||
|
||||
/**
|
||||
* Spawns the gibs (and sparks if applicable) from the gib spawner.
|
||||
*
|
||||
* Arguments:
|
||||
* * location - The position to spawn the gibs on.
|
||||
* * mob_dna - The [/datum/dna] controlling the blood DNA and colour of the gibs.
|
||||
*/
|
||||
/obj/effect/gibspawner/proc/spawn_gibs(atom/location, datum/dna/mob_dna)
|
||||
var/obj/effect/decal/cleanable/blood/gibs/gib = null
|
||||
|
||||
if(sparks)
|
||||
do_sparks(2, 1, location)
|
||||
|
||||
for(var/i = 1, i<= gibtypes.len, i++)
|
||||
if(gibamounts[i])
|
||||
for(var/j = 1, j<= gibamounts[i], j++)
|
||||
var/gibType = gibtypes[i]
|
||||
gib = new gibType(location)
|
||||
for(var/gibtype in 1 to length(gibtypes))
|
||||
if(!gibamounts[gibtype])
|
||||
continue
|
||||
for(var/I in 1 to gibamounts[gibtype])
|
||||
var/gib_type = gibtypes[gibtype]
|
||||
gib = new gib_type(location)
|
||||
|
||||
gib_dna(gib, mob_dna)
|
||||
|
||||
gib.blood_DNA = list()
|
||||
if(MobDNA)
|
||||
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.blood_type
|
||||
else if(istype(src, /obj/effect/gibspawner/xeno))
|
||||
gib.blood_DNA["UNKNOWN DNA"] = "X*"
|
||||
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
|
||||
gib.blood_DNA["Non-human DNA"] = "A+"
|
||||
var/list/directions = gibdirections[i]
|
||||
if(directions.len)
|
||||
gib.streak(directions)
|
||||
var/list/directions = gibdirections[gibtype]
|
||||
if(length(directions))
|
||||
gib.streak(directions)
|
||||
|
||||
qdel(src)
|
||||
/**
|
||||
* Assigns DNA and blood colour to mob gibs.
|
||||
*
|
||||
* Returns FALSE if there was no DNA data to transfer to the gibs, and TRUE if there was.
|
||||
* Arguments:
|
||||
* * gib - The [/obj/effect/decal/cleanable/blood/gibs] that is being edited.
|
||||
* * mob_dna - The [/datum/dna] which is being transferred onto the gib.
|
||||
*/
|
||||
/obj/effect/gibspawner/proc/gib_dna(obj/effect/decal/cleanable/blood/gibs/gib, datum/dna/mob_dna)
|
||||
if(!mob_dna)
|
||||
return FALSE
|
||||
|
||||
gib.basecolor = mob_dna.species.blood_color
|
||||
gib.update_icon()
|
||||
gib.blood_DNA[mob_dna.unique_enzymes] = mob_dna.blood_type
|
||||
return TRUE
|
||||
|
||||
@@ -135,8 +135,7 @@
|
||||
var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0)
|
||||
var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
|
||||
|
||||
spawn(0)
|
||||
new /obj/effect/hallucination/delusion(victim.loc, victim, force_kind = "demon", duration = duration, skip_nearby = 0)
|
||||
new /obj/effect/hallucination/delusion(get_turf(victim), victim, 'icons/mob/mob.dmi', "daemon")
|
||||
|
||||
var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
|
||||
chainsaw.flags |= NODROP | DROPDEL
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
|
||||
/obj/effect/gibspawner/human/gib_dna(obj/effect/decal/cleanable/blood/gibs/gib, datum/dna/mob_dna)
|
||||
if(!..()) // Probably admin spawned
|
||||
gib.blood_DNA["Non-human DNA"] = "A+"
|
||||
|
||||
/obj/effect/gibspawner/xeno
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up,/obj/effect/decal/cleanable/blood/gibs/xeno/down,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno,/obj/effect/decal/cleanable/blood/gibs/xeno/body,/obj/effect/decal/cleanable/blood/gibs/xeno/limb,/obj/effect/decal/cleanable/blood/gibs/xeno/core)
|
||||
gibamounts = list(1,1,1,1,1,1,1)
|
||||
@@ -24,6 +28,10 @@
|
||||
gibamounts[6] = pick(0,1,2)
|
||||
..()
|
||||
|
||||
/obj/effect/gibspawner/xeno/gib_dna(obj/effect/decal/cleanable/blood/gibs/gib, datum/dna/mob_dna)
|
||||
if(!..())
|
||||
gib.blood_DNA["UNKNOWN DNA"] = "X*"
|
||||
|
||||
/obj/effect/gibspawner/robot
|
||||
sparks = 1
|
||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot/up,/obj/effect/decal/cleanable/blood/gibs/robot/down,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot,/obj/effect/decal/cleanable/blood/gibs/robot/limb)
|
||||
|
||||
@@ -354,3 +354,12 @@
|
||||
/obj/effect/temp_visual/impact_effect/ion
|
||||
icon_state = "shieldsparkles"
|
||||
duration = 6
|
||||
|
||||
/obj/effect/temp_visual/bsg_kaboom
|
||||
name = "bluespace explosion"
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "explosionfast"
|
||||
color = "blue"
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
duration = 42
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
/**
|
||||
* Will cause an EMP on the given epicenter.
|
||||
* This proc can sleep depending on the affected objects. So assume it sleeps!
|
||||
*
|
||||
* epicenter - The center of the EMP. Can be an atom, as long as the given atom is on a turf (in)directly
|
||||
* heavy_range - The max distance from the epicenter where objects will be get heavy EMPed
|
||||
* light_range - The max distance from the epicenter where objects will get light EMPed
|
||||
* log - Whether or not this action should be logged or not. Will use the cause if provided
|
||||
* cause - The cause of the EMP. Used for the logging
|
||||
*/
|
||||
/proc/empulse(turf/epicenter, heavy_range, light_range, log = FALSE, cause = null)
|
||||
if(!epicenter) return
|
||||
|
||||
|
||||
@@ -24,11 +24,11 @@
|
||||
|
||||
if(!ignorecap)
|
||||
// Clamp all values to MAX_EXPLOSION_RANGE
|
||||
devastation_range = min (GLOB.max_ex_devastation_range, devastation_range)
|
||||
heavy_impact_range = min (GLOB.max_ex_heavy_range, heavy_impact_range)
|
||||
light_impact_range = min (GLOB.max_ex_light_range, light_impact_range)
|
||||
flash_range = min (GLOB.max_ex_flash_range, flash_range)
|
||||
flame_range = min (GLOB.max_ex_flame_range, flame_range)
|
||||
devastation_range = min(GLOB.configuration.general.bomb_cap / 4, devastation_range)
|
||||
heavy_impact_range = min(GLOB.configuration.general.bomb_cap / 2, heavy_impact_range)
|
||||
light_impact_range = min(GLOB.configuration.general.bomb_cap, light_impact_range)
|
||||
flash_range = min(GLOB.configuration.general.bomb_cap, flash_range)
|
||||
flame_range = min(GLOB.configuration.general.bomb_cap, flame_range)
|
||||
|
||||
var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range)
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
|
||||
var/list/affected_turfs = spiral_range_turfs(max_range, epicenter)
|
||||
|
||||
if(config.reactionary_explosions)
|
||||
if(GLOB.configuration.general.reactionary_explosions)
|
||||
for(var/A in affected_turfs) // we cache the explosion block rating of every turf in the explosion area
|
||||
var/turf/T = A
|
||||
cached_exp_block[T] = 0
|
||||
@@ -136,7 +136,7 @@
|
||||
continue
|
||||
var/dist = HYPOTENUSE(T.x, T.y, x0, y0)
|
||||
|
||||
if(config.reactionary_explosions)
|
||||
if(GLOB.configuration.general.reactionary_explosions)
|
||||
var/turf/Trajectory = T
|
||||
while(Trajectory != epicenter)
|
||||
Trajectory = get_step_towards(Trajectory, epicenter)
|
||||
|
||||
@@ -424,6 +424,17 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
|
||||
/obj/item/proc/on_enter_storage(obj/item/storage/S as obj)
|
||||
return
|
||||
|
||||
/**
|
||||
* Called to check if this item can be put into a storage item.
|
||||
*
|
||||
* Return `FALSE` if `src` can't be inserted, and `TRUE` if it can.
|
||||
* Arguments:
|
||||
* * S - The [/obj/item/storage] that `src` is being inserted into.
|
||||
* * user - The mob trying to insert the item.
|
||||
*/
|
||||
/obj/item/proc/can_enter_storage(obj/item/storage/S, mob/user)
|
||||
return TRUE
|
||||
|
||||
// called when "found" in pockets and storage items. Returns 1 if the search should end.
|
||||
/obj/item/proc/on_found(mob/finder as mob)
|
||||
return
|
||||
|
||||
@@ -30,6 +30,12 @@
|
||||
else i = 3
|
||||
icon_state = "candle[i][lit ? "_lit" : ""]"
|
||||
|
||||
/obj/item/candle/can_enter_storage(obj/item/storage/S, mob/user)
|
||||
if(lit)
|
||||
to_chat(user, "<span class='warning'>[S] can't hold [src] while it's lit!</span>")
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/obj/item/candle/attackby(obj/item/W, mob/user, params)
|
||||
if(is_hot(W))
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
/obj/item/changestone
|
||||
name = "An uncut ruby"
|
||||
desc = "The ruby shines and catches the light, despite being uncut"
|
||||
icon = 'icons/obj/artifacts.dmi'
|
||||
icon_state = "changerock"
|
||||
|
||||
/obj/item/changestone/attack_hand(mob/user as mob)
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!H.gloves)
|
||||
if(H.gender == FEMALE)
|
||||
H.change_gender(MALE)
|
||||
else
|
||||
H.change_gender(FEMALE)
|
||||
H.dna.ready_dna(H)
|
||||
H.update_body()
|
||||
..()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
// Airlock painter
|
||||
|
||||
/obj/item/airlock_painter
|
||||
name = "airlock painter"
|
||||
desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on a completed airlock to change its paintjob."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "airlock_painter"
|
||||
item_state = "airlock_painter"
|
||||
flags = CONDUCT | NOBLUDGEON
|
||||
usesound = 'sound/effects/spray2.ogg'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
materials = list(MAT_METAL = 3000, MAT_GLASS = 1000)
|
||||
var/paint_setting
|
||||
|
||||
// All the different paint jobs that an airlock painter can apply.
|
||||
// If the airlock you're using it on is glass, the new paint job will also be glass
|
||||
var/list/available_paint_jobs = list(
|
||||
"Atmospherics" = /obj/machinery/door/airlock/atmos,
|
||||
"Command" = /obj/machinery/door/airlock/command,
|
||||
"Engineering" = /obj/machinery/door/airlock/engineering,
|
||||
"External" = /obj/machinery/door/airlock/external,
|
||||
"External Maintenance"= /obj/machinery/door/airlock/maintenance/external,
|
||||
"Freezer" = /obj/machinery/door/airlock/freezer,
|
||||
"Maintenance" = /obj/machinery/door/airlock/maintenance,
|
||||
"Medical" = /obj/machinery/door/airlock/medical,
|
||||
"Mining" = /obj/machinery/door/airlock/mining,
|
||||
"Public" = /obj/machinery/door/airlock/public,
|
||||
"Research" = /obj/machinery/door/airlock/research,
|
||||
"Science" = /obj/machinery/door/airlock/science,
|
||||
"Security" = /obj/machinery/door/airlock/security,
|
||||
"Standard" = /obj/machinery/door/airlock,
|
||||
)
|
||||
|
||||
//Only call this if you are certain that the painter will be used right after this check!
|
||||
/obj/item/airlock_painter/proc/paint(mob/user)
|
||||
playsound(loc, usesound, 30, TRUE)
|
||||
return TRUE
|
||||
|
||||
/obj/item/airlock_painter/attack_self(mob/user)
|
||||
paint_setting = input(user, "Please select a paintjob for this airlock.") as null|anything in available_paint_jobs
|
||||
if(!paint_setting)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>The [paint_setting] paint setting has been selected.</span>")
|
||||
|
||||
/obj/item/airlock_painter/suicide_act(mob/user)
|
||||
|
||||
var/obj/item/organ/internal/lungs/L = user.get_organ_slot("lungs")
|
||||
var/lungs_name = "\improper[L.name]"
|
||||
|
||||
if(L)
|
||||
user.visible_message("<span class='suicide'>[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
// Once you've inhaled the toner, you throw up your lungs
|
||||
// and then die.
|
||||
|
||||
// they managed to lose their lungs between then and now. Good job.
|
||||
if(!L)
|
||||
return FALSE
|
||||
|
||||
L.remove(user)
|
||||
|
||||
// make some colorful reagent, and apply it to the lungs
|
||||
L.create_reagents(10)
|
||||
L.reagents.add_reagent("colorful_reagent", 10)
|
||||
L.reagents.reaction(L, REAGENT_TOUCH, 1)
|
||||
|
||||
user.emote("scream")
|
||||
user.visible_message("<span class='suicide'>[user] vomits out [user.p_their()] [lungs_name]!</span>")
|
||||
playsound(user.loc, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
|
||||
// make some vomit under the player, and apply colorful reagent
|
||||
var/obj/effect/decal/cleanable/vomit/V = new(get_turf(user))
|
||||
V.create_reagents(10)
|
||||
V.reagents.add_reagent("colorful_reagent", 10)
|
||||
V.reagents.reaction(V, REAGENT_TOUCH, 1)
|
||||
|
||||
L.forceMove(get_turf(user))
|
||||
|
||||
return OXYLOSS
|
||||
else
|
||||
return SHAME
|
||||
@@ -0,0 +1,61 @@
|
||||
/datum/painter/airlock
|
||||
module_name = "airlock painter"
|
||||
module_desc = "An advanced autopainter preprogrammed with several paintjobs for airlocks. Use it on a completed airlock to change its paintjob."
|
||||
module_state = "airlock_painter"
|
||||
|
||||
// All the different paint jobs that an airlock painter can apply.
|
||||
// If the airlock you're using it on is glass, the new paint job will also be glass
|
||||
var/list/available_paint_jobs = list(
|
||||
"Atmospherics" = /obj/machinery/door/airlock/atmos,
|
||||
"Command" = /obj/machinery/door/airlock/command,
|
||||
"Engineering" = /obj/machinery/door/airlock/engineering,
|
||||
"External" = /obj/machinery/door/airlock/external,
|
||||
"External Maintenance"= /obj/machinery/door/airlock/maintenance/external,
|
||||
"Freezer" = /obj/machinery/door/airlock/freezer,
|
||||
"Maintenance" = /obj/machinery/door/airlock/maintenance,
|
||||
"Medical" = /obj/machinery/door/airlock/medical,
|
||||
"Mining" = /obj/machinery/door/airlock/mining,
|
||||
"Public" = /obj/machinery/door/airlock/public,
|
||||
"Research" = /obj/machinery/door/airlock/research,
|
||||
"Science" = /obj/machinery/door/airlock/science,
|
||||
"Security" = /obj/machinery/door/airlock/security,
|
||||
"Standard" = /obj/machinery/door/airlock)
|
||||
|
||||
/datum/painter/airlock/pick_color(mob/user)
|
||||
var/choice = input(user, "Please select a paintjob.") as null|anything in available_paint_jobs
|
||||
if(!choice)
|
||||
return
|
||||
paint_setting = choice
|
||||
to_chat(user, "<span class='notice'>The [paint_setting] paint setting has been selected.</span>")
|
||||
|
||||
/datum/painter/airlock/paint_atom(atom/target, mob/user)
|
||||
if(!istype(target, /obj/machinery/door/airlock))
|
||||
return
|
||||
var/obj/machinery/door/airlock/A = target
|
||||
|
||||
if(!paint_setting)
|
||||
to_chat(user, "<span class='warning'>You need to select a paintjob first.</span>")
|
||||
return
|
||||
|
||||
if(!A.paintable)
|
||||
to_chat(user, "<span class='warning'>This type of airlock cannot be painted.</span>")
|
||||
return
|
||||
|
||||
var/obj/machinery/door/airlock/airlock = available_paint_jobs["[paint_setting]"] // get the airlock type path associated with the airlock name the user just chose
|
||||
var/obj/structure/door_assembly/assembly = initial(airlock.assemblytype)
|
||||
|
||||
if(A.assemblytype == assembly)
|
||||
to_chat(user, "<span class='notice'>This airlock is already painted with the \"[paint_setting]\" color scheme!</span>")
|
||||
return
|
||||
|
||||
if(A.airlock_material == "glass" && initial(assembly.noglass)) // prevents painting glass airlocks with a paint job that doesn't have a glass version, such as the freezer
|
||||
to_chat(user, "<span class='warning'>This paint job can only be applied to non-glass airlocks.</span>")
|
||||
return
|
||||
|
||||
if(do_after(user, 2 SECONDS, FALSE, A))
|
||||
// applies the user-chosen airlock's icon, overlays and assemblytype to the target airlock
|
||||
A.icon = initial(airlock.icon)
|
||||
A.overlays_file = initial(airlock.overlays_file)
|
||||
A.assemblytype = initial(airlock.assemblytype)
|
||||
A.update_icon()
|
||||
return TRUE
|
||||
+18
-32
@@ -1,20 +1,13 @@
|
||||
// Floor painter
|
||||
|
||||
/obj/item/floor_painter
|
||||
name = "floor painter"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "floor_painter"
|
||||
item_state = "floor_painter"
|
||||
usesound = 'sound/effects/spray2.ogg'
|
||||
/datum/painter/floor
|
||||
module_name = "floor painter"
|
||||
module_state = "floor_painter"
|
||||
|
||||
var/floor_icon
|
||||
var/floor_state = "floor"
|
||||
var/floor_dir = SOUTH
|
||||
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "bcircuit", "blackcorner", "blue", "bluecorner",
|
||||
"bluefull", "bluered", "blueyellow", "blueyellowfull", "bot", "brown", "browncorner", "browncornerold", "brownold",
|
||||
"cafeteria", "caution", "cautioncorner", "chapel", "cmo", "dark", "delivery", "escape", "escapecorner", "floor",
|
||||
@@ -27,43 +20,37 @@
|
||||
"whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow",
|
||||
"yellowcorner", "yellowcornersiding", "yellowsiding")
|
||||
|
||||
/obj/item/floor_painter/afterattack(atom/A, mob/user, proximity, params)
|
||||
if(!proximity)
|
||||
/datum/painter/floor/paint_atom(atom/target, mob/user)
|
||||
if(!istype(target, /turf/simulated/floor/plasteel))
|
||||
to_chat(user, "<span class='warning'>[holder] can only be used on station flooring.</span>")
|
||||
return
|
||||
|
||||
var/turf/simulated/floor/plasteel/F = A
|
||||
var/turf/simulated/floor/plasteel/F = target
|
||||
|
||||
if(F.icon_state == floor_state && F.dir == floor_dir)
|
||||
to_chat(user, "<span class='notice'>This is already painted [floor_state] [dir2text(floor_dir)]!</span>")
|
||||
return
|
||||
|
||||
if(!istype(F))
|
||||
to_chat(user, "<span class='warning'>\The [src] can only be used on station flooring.</span>")
|
||||
return
|
||||
|
||||
playsound(loc, usesound, 30, TRUE)
|
||||
F.icon_state = floor_state
|
||||
F.icon_regular_floor = floor_state
|
||||
F.dir = floor_dir
|
||||
return TRUE
|
||||
|
||||
/obj/item/floor_painter/attack_self(mob/user)
|
||||
/datum/painter/floor/pick_color(mob/user)
|
||||
if(!user)
|
||||
return 0
|
||||
user.set_machine(src)
|
||||
return
|
||||
ui_interact(user)
|
||||
return 1
|
||||
|
||||
/obj/item/floor_painter/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state)
|
||||
/datum/painter/floor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.inventory_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "FloorPainter", name, 405, 470, master_ui, state)
|
||||
ui = new(user, src, ui_key, "FloorPainter", module_name, 405, 470, master_ui, state)
|
||||
// Disable automatic updates, because:
|
||||
// 1) we are the only user of the item, and don't expect to observe external changes
|
||||
// 2) generating and sending the icon each tick is a bit expensive, and creates small but noticeable lag
|
||||
ui.set_autoupdate(FALSE)
|
||||
ui.open()
|
||||
|
||||
/obj/item/floor_painter/ui_data(mob/user)
|
||||
/datum/painter/floor/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["availableStyles"] = allowed_states
|
||||
data["selectedStyle"] = floor_state
|
||||
@@ -77,23 +64,22 @@
|
||||
return data
|
||||
|
||||
|
||||
/obj/item/floor_painter/ui_static_data(mob/user)
|
||||
/datum/painter/floor/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["allStylesPreview"] = list()
|
||||
for (var/style in allowed_states)
|
||||
for(var/style in allowed_states)
|
||||
var/icon/floor_icon = icon('icons/turf/floors.dmi', style, SOUTH)
|
||||
data["allStylesPreview"][style] = icon2base64(floor_icon)
|
||||
|
||||
return data
|
||||
|
||||
/obj/item/floor_painter/ui_act(action, params)
|
||||
/datum/painter/floor/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(action == "select_style")
|
||||
var/new_style = params["style"]
|
||||
if (allowed_states.Find(new_style) != 0)
|
||||
if(allowed_states.Find(new_style) != 0)
|
||||
floor_state = new_style
|
||||
|
||||
if(action == "cycle_style")
|
||||
@@ -107,7 +93,7 @@
|
||||
|
||||
if(action == "select_direction")
|
||||
var/dir = text2dir(params["direction"])
|
||||
if (dir != 0)
|
||||
if(dir != 0)
|
||||
floor_dir = dir
|
||||
|
||||
SStgui.update_uis(src)
|
||||
@@ -0,0 +1,189 @@
|
||||
/obj/item/painter
|
||||
name = "modular painter"
|
||||
icon = 'icons/obj/painting.dmi'
|
||||
icon_state = "floor_painter"
|
||||
usesound = 'sound/effects/spray2.ogg'
|
||||
flags = CONDUCT | NOBLUDGEON
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 2000)
|
||||
/// Associative list of painter types, with the value being the datum. (For use in the radial menu)
|
||||
var/static/list/painter_type_list = list(
|
||||
"Floor Painter" = /datum/painter/floor,
|
||||
"Pipe Painter" = /datum/painter/pipe,
|
||||
"Window Painter" = /datum/painter/pipe/window,
|
||||
"Airlock Painter" = /datum/painter/airlock)
|
||||
|
||||
/// Associative list of painter types, with the value being the icon. (For use in the radial menu)
|
||||
var/static/list/painter_icon_list = list(
|
||||
"Floor Painter" = image(icon = 'icons/obj/painting.dmi', icon_state = "floor_painter"),
|
||||
"Pipe Painter" = image(icon = 'icons/obj/painting.dmi', icon_state = "pipe_painter"),
|
||||
"Window Painter" = image(icon = 'icons/obj/painting.dmi', icon_state = "window_painter"),
|
||||
"Airlock Painter" = image(icon = 'icons/obj/painting.dmi', icon_state = "airlock_painter"))
|
||||
|
||||
/// The [/datum/painter] which is currently active.
|
||||
var/datum/painter/selected_module = null
|
||||
/// List of any instanced [/datum/painter]'s, to avoid spawning more than one of each.
|
||||
var/list/module_list = list()
|
||||
|
||||
/obj/item/painter/Initialize(mapload, datum/painter/default_module = /datum/painter/floor) // Defaults to a floor painter
|
||||
. = ..()
|
||||
change_module(default_module)
|
||||
|
||||
/obj/item/painter/Destroy()
|
||||
selected_module = null
|
||||
for(var/I in module_list)
|
||||
qdel(I)
|
||||
module_list = list()
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/painter/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Ctrl+click it in your hand to change the type!</span>"
|
||||
|
||||
|
||||
/**
|
||||
* Changes the `selected_module` variable to `new_module`, and updates the painter to reflect the new type.
|
||||
*
|
||||
* If `new_module` is already present in `module_list`, then that will be used instead.
|
||||
* Otherwise a new datum will be spawned and added to `module_list`.
|
||||
* The Name, Description, Icon State, and Item State of the painter will be updated using variables from the `new_module` datum.
|
||||
*
|
||||
* Arguments:
|
||||
* * datum/painter/new_module - The new painter datum which will be used.
|
||||
* * mob/user - The user interacting with the painter.
|
||||
*/
|
||||
/obj/item/painter/proc/change_module(datum/painter/new_module, mob/user)
|
||||
if(!new_module)
|
||||
return
|
||||
selected_module = null
|
||||
|
||||
for(var/I in module_list)
|
||||
var/datum/painter/P = I
|
||||
if(P.type == new_module)
|
||||
selected_module = I
|
||||
break
|
||||
if(!selected_module)
|
||||
var/datum/painter/P = new new_module(src, src)
|
||||
module_list += P
|
||||
selected_module = P
|
||||
|
||||
name = selected_module.module_name
|
||||
desc = selected_module.module_desc
|
||||
icon_state = selected_module.module_state
|
||||
item_state = selected_module.module_state
|
||||
if(user)
|
||||
user.update_inv_l_hand()
|
||||
user.update_inv_r_hand()
|
||||
|
||||
/**
|
||||
* Calls `pick_color()` on the `selected_module`.
|
||||
*/
|
||||
/obj/item/painter/attack_self(mob/user)
|
||||
selected_module.pick_color(user)
|
||||
|
||||
/**
|
||||
* If adjacent, calls `paint_atom()` on the `selected_module`, then plays the `usesound`.
|
||||
*/
|
||||
/obj/item/painter/afterattack(atom/target, mob/user, proximity, params)
|
||||
if(!proximity)
|
||||
return
|
||||
if(selected_module.paint_atom(target, user))
|
||||
playsound(src, usesound, 30, TRUE)
|
||||
|
||||
/**
|
||||
* Displays a radial menu for choosing a new painter module.
|
||||
*/
|
||||
/obj/item/painter/CtrlClick(mob/user)
|
||||
. = ..()
|
||||
if(!ishuman(user)) // Only want human players doing this
|
||||
return
|
||||
if(loc != user) // Not being held
|
||||
return
|
||||
|
||||
playsound(src, 'sound/effects/pop.ogg', 50, TRUE)
|
||||
var/choice = show_radial_menu(user, src, painter_icon_list, require_near = TRUE)
|
||||
var/choice_path = painter_type_list[choice]
|
||||
if(!choice_path || (selected_module.type == choice_path))
|
||||
return
|
||||
|
||||
playsound(src, 'sound/machines/click.ogg', 50, TRUE)
|
||||
do_sparks(1, FALSE, src)
|
||||
change_module(choice_path, user)
|
||||
|
||||
|
||||
/obj/item/painter/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
playsound(src, usesound, 50, TRUE)
|
||||
var/obj/item/organ/internal/lungs/L = user.get_organ_slot("lungs")
|
||||
var/turf/T = get_turf(user)
|
||||
if(!do_mob(user, user, 3 SECONDS) || !L)
|
||||
return SHAME
|
||||
// Once you've inhaled the toner, you throw up your lungs
|
||||
// and then die.
|
||||
|
||||
L.remove(user)
|
||||
|
||||
L.create_reagents(10)
|
||||
L.reagents.add_reagent("colorful_reagent", 10)
|
||||
L.reagents.reaction(L, REAGENT_TOUCH, 1)
|
||||
L.forceMove(T)
|
||||
|
||||
user.emote("scream")
|
||||
user.visible_message("<span class='suicide'>[user] vomits out [user.p_their()] [L.name]!</span>")
|
||||
playsound(T, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
|
||||
// make some vomit under the player, and apply colorful reagent
|
||||
var/obj/effect/decal/cleanable/vomit/V = new(T)
|
||||
V.create_reagents(10)
|
||||
V.reagents.add_reagent("colorful_reagent", 10)
|
||||
V.reagents.reaction(V, REAGENT_TOUCH, 1)
|
||||
|
||||
return OXYLOSS
|
||||
|
||||
|
||||
/**
|
||||
* # Painter Datum
|
||||
*
|
||||
* Contains variables for updating `holder`, as well as procs for choosing a colour and painting an atom.
|
||||
*
|
||||
* The `parent_painter` argument is REQUIRED when spawning this in order to link the datum to an [/obj/item/painter].
|
||||
*/
|
||||
/datum/painter
|
||||
/// Name of the `holder` when using this module.
|
||||
var/module_name = null
|
||||
/// Desc of the `holder` when using this module.
|
||||
var/module_desc = null
|
||||
/// Icon and Item state of the `holder` when using this module.
|
||||
var/module_state = null
|
||||
|
||||
/// The parent [/obj/item/painter] which this datum is linked to.
|
||||
var/obj/item/painter/holder
|
||||
|
||||
/// The current colour or icon state setting.
|
||||
var/paint_setting = null
|
||||
|
||||
/datum/painter/New(obj/item/painter/parent_painter)
|
||||
..()
|
||||
ASSERT(parent_painter)
|
||||
holder = parent_painter
|
||||
|
||||
/datum/painter/ui_host() // For TGUI things.
|
||||
return holder
|
||||
|
||||
/**
|
||||
* Contains code to choose a new colour or icon state for the `paint_setting` variable.
|
||||
*
|
||||
* Called by `attack_self()` on the `holder` object.
|
||||
*/
|
||||
/datum/painter/proc/pick_color(mob/user)
|
||||
return
|
||||
|
||||
/**
|
||||
* Contains code to apply the `paint_setting` variable onto the target atom.
|
||||
*
|
||||
* Called by `afterattack()` on the `holder` object.
|
||||
*/
|
||||
/datum/painter/proc/paint_atom(atom/target, mob/user)
|
||||
return
|
||||
@@ -0,0 +1,35 @@
|
||||
/datum/painter/pipe
|
||||
module_name = "pipe painter"
|
||||
module_state = "pipe_painter"
|
||||
var/static/list/blacklisted_pipes = list(/obj/machinery/atmospherics/pipe/simple/heat_exchanging, /obj/machinery/atmospherics/pipe/simple/insulated)
|
||||
var/static/list/modes = list()
|
||||
|
||||
/datum/painter/pipe/New()
|
||||
..()
|
||||
if(!length(modes))
|
||||
for(var/C in GLOB.pipe_colors)
|
||||
modes += "[C]"
|
||||
paint_setting = pick(modes)
|
||||
|
||||
/datum/painter/pipe/pick_color(mob/user)
|
||||
paint_setting = input("Which color do you want to use?", null, paint_setting) in modes
|
||||
|
||||
/datum/painter/pipe/paint_atom(atom/target, mob/user)
|
||||
if(!istype(target, /obj/machinery/atmospherics/pipe))
|
||||
return
|
||||
var/obj/machinery/atmospherics/pipe/P = target
|
||||
|
||||
if(is_type_in_list(P, blacklisted_pipes))
|
||||
return
|
||||
|
||||
if(P.pipe_color == GLOB.pipe_colors[paint_setting])
|
||||
to_chat(user, "<span class='notice'>This pipe is aready painted [paint_setting]!</span>")
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(P)
|
||||
if(P.level < 2 && T.level == 1 && T.intact)
|
||||
to_chat(user, "<span class='warning'>You must remove the plating first.</span>")
|
||||
return
|
||||
|
||||
P.change_color(GLOB.pipe_colors[paint_setting])
|
||||
return TRUE
|
||||
@@ -0,0 +1,21 @@
|
||||
/datum/painter/pipe/window // Yes, this is a pipe painter subtype.
|
||||
module_name = "window painter"
|
||||
module_state = "window_painter"
|
||||
var/static/list/paintable_windows = list(
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/structure/window/basic,
|
||||
/obj/structure/window/full/reinforced,
|
||||
/obj/structure/window/full/basic,
|
||||
/obj/machinery/door/window)
|
||||
|
||||
/datum/painter/pipe/window/paint_atom(atom/target, mob/user)
|
||||
if(!is_type_in_list(target, paintable_windows))
|
||||
return
|
||||
var/obj/structure/window/W = target
|
||||
|
||||
if(W.color == GLOB.pipe_colors[paint_setting])
|
||||
to_chat(user, "<span class='notice'>This window is aready painted [paint_setting]!</span>")
|
||||
return
|
||||
|
||||
W.color = GLOB.pipe_colors[paint_setting]
|
||||
return TRUE
|
||||
@@ -1,40 +0,0 @@
|
||||
/obj/item/pipe_painter
|
||||
name = "pipe painter"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "pipe_painter"
|
||||
item_state = "pipe_painter"
|
||||
usesound = 'sound/effects/spray2.ogg'
|
||||
var/list/modes
|
||||
var/mode
|
||||
|
||||
/obj/item/pipe_painter/New()
|
||||
..()
|
||||
modes = new()
|
||||
for(var/C in GLOB.pipe_colors)
|
||||
modes += "[C]"
|
||||
mode = pick(modes)
|
||||
|
||||
/obj/item/pipe_painter/afterattack(atom/A, mob/user as mob)
|
||||
if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated) || !in_range(user, A))
|
||||
return
|
||||
var/obj/machinery/atmospherics/pipe/P = A
|
||||
|
||||
if(P.pipe_color == "[GLOB.pipe_colors[mode]]")
|
||||
to_chat(user, "<span class='notice'>This pipe is aready painted [mode]!</span>")
|
||||
return
|
||||
|
||||
var/turf/T = P.loc
|
||||
if(P.level < 2 && T.level==1 && isturf(T) && T.intact)
|
||||
to_chat(user, "<span class='warning'>You must remove the plating first.</span>")
|
||||
return
|
||||
|
||||
playsound(loc, usesound, 30, TRUE)
|
||||
P.change_color(GLOB.pipe_colors[mode])
|
||||
|
||||
|
||||
/obj/item/pipe_painter/attack_self(mob/user as mob)
|
||||
mode = input("Which colour do you want to use?", name, mode) in modes
|
||||
|
||||
/obj/item/pipe_painter/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>It is in [mode] mode.</span>"
|
||||
@@ -264,6 +264,9 @@ REAGENT SCANNER
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Subject's genes are stable.</span>")
|
||||
|
||||
if(HAS_TRAIT(H, TRAIT_HUSK))
|
||||
to_chat(user, "<span class='danger'>Subject is husked. Application of synthflesh is recommended.</span>")
|
||||
|
||||
/obj/item/healthanalyzer/attack_self(mob/user)
|
||||
toggle_mode()
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
/obj/item/pipe_painter/window_painter
|
||||
name = "window painter"
|
||||
icon_state = "window_painter"
|
||||
|
||||
var/list/paintable_windows = list(
|
||||
/obj/structure/window/reinforced,
|
||||
/obj/structure/window/basic,
|
||||
/obj/structure/window/full/reinforced,
|
||||
/obj/structure/window/full/basic,
|
||||
/obj/machinery/door/window)
|
||||
|
||||
/obj/item/pipe_painter/window_painter/afterattack(atom/A, mob/user as mob)
|
||||
if(!is_type_in_list(A, paintable_windows) || !in_range(user, A))
|
||||
return
|
||||
var/obj/structure/window/W = A
|
||||
|
||||
if(W.color == GLOB.pipe_colors[mode])
|
||||
to_chat(user, "<span class='notice'>This window is aready painted [mode]!</span>")
|
||||
return
|
||||
|
||||
playsound(loc, usesound, 30, TRUE)
|
||||
W.color = GLOB.pipe_colors[mode]
|
||||
@@ -4,12 +4,12 @@
|
||||
/obj/item/toy/random
|
||||
name = "Random Toy"
|
||||
|
||||
/obj/item/toy/random/New()
|
||||
/obj/item/toy/random/Initialize(mapload)
|
||||
..()
|
||||
var/list/types = list(/obj/item/gun/projectile/shotgun/toy/crossbow, /obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize)
|
||||
var/list/types = list(/obj/item/gun/projectile/shotgun/toy/crossbow, /obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/figure/mech)
|
||||
var/T = pick(types)
|
||||
new T(loc)
|
||||
qdel(src)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
// -------------------------------------
|
||||
// Random cleanables, clearly this makes sense
|
||||
|
||||
@@ -226,7 +226,7 @@
|
||||
to_chat(user, "<span class='warning'>Sticking an empty [M] into the frame would sort of defeat the purpose.</span>")
|
||||
return
|
||||
|
||||
if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob,"nonhumandept"))
|
||||
if(jobban_isbanned(M.brainmob, "Cyborg") || jobban_isbanned(M.brainmob, "nonhumandept"))
|
||||
to_chat(user, "<span class='warning'>This [W] is not fit to serve as a cyborg!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -23,6 +23,10 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
|
||||
usesound = 'sound/items/deconstruct.ogg'
|
||||
merge_type = /obj/item/stack/rods
|
||||
|
||||
/obj/item/stack/rods/detailed_examine()
|
||||
return "Made from metal sheets. You can build a grille by using it in your hand. \
|
||||
Clicking on a floor without any tiles will reinforce the floor. You can make reinforced glass by combining rods and normal glass sheets."
|
||||
|
||||
/obj/item/stack/rods/cyborg
|
||||
energy_type = /datum/robot_energy_storage/rods
|
||||
is_cyborg = TRUE
|
||||
|
||||
@@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
|
||||
new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \
|
||||
new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \
|
||||
new/datum/stack_recipe("wall aquarium", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/glass
|
||||
@@ -36,6 +36,9 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
|
||||
merge_type = /obj/item/stack/sheet/glass
|
||||
point_value = 1
|
||||
|
||||
/obj/item/stack/sheet/glass/detailed_examine()
|
||||
return "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets."
|
||||
|
||||
/obj/item/stack/sheet/glass/fifty
|
||||
amount = 50
|
||||
|
||||
@@ -44,6 +47,10 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
|
||||
is_cyborg = TRUE
|
||||
materials = list()
|
||||
|
||||
/obj/item/stack/sheet/glass/cyborg/detailed_examine()
|
||||
return "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets.<br>\
|
||||
As a synthetic, you can acquire more sheets of glass by recharging."
|
||||
|
||||
/obj/item/stack/sheet/glass/New(loc, amount)
|
||||
recipes = GLOB.glass_recipes
|
||||
..()
|
||||
@@ -103,6 +110,9 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
|
||||
recipes = GLOB.reinforced_glass_recipes
|
||||
..()
|
||||
|
||||
/obj/item/stack/sheet/rglass/detailed_examine()
|
||||
return "Use in your hand to build a window. Reinforced glass is much stronger against damage."
|
||||
|
||||
GLOBAL_LIST_INIT(pglass_recipes, list ( \
|
||||
new/datum/stack_recipe/window("directional window", /obj/structure/window/plasmabasic, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/plasmabasic, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
|
||||
@@ -113,6 +123,10 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
|
||||
is_cyborg = TRUE
|
||||
materials = list()
|
||||
|
||||
/obj/item/stack/sheet/rglass/cyborg/detailed_examine()
|
||||
return "Use in your hand to build a window. Reinforced glass is much stronger against damage.<br>\
|
||||
As a synthetic, you can gain more reinforced glass by recharging."
|
||||
|
||||
/obj/item/stack/sheet/plasmaglass
|
||||
name = "plasma glass"
|
||||
desc = "A very strong and very resistant sheet of a plasma-glass alloy."
|
||||
|
||||
@@ -83,7 +83,6 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \
|
||||
null, \
|
||||
new/datum/stack_recipe("Clown Statue", /obj/structure/statue/bananium/clown, 5, one_per_turf = 1, on_floor = 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("bananium computer frame", /obj/structure/computerframe/HONKputer, 50, time = 25, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("bananium grenade casing", /obj/item/grenade/bananade/casing, 4, on_floor = 1), \
|
||||
))
|
||||
|
||||
|
||||
@@ -114,6 +114,10 @@ GLOBAL_LIST_INIT(metal_recipes, list(
|
||||
is_cyborg = TRUE
|
||||
materials = list()
|
||||
|
||||
/obj/item/stack/sheet/metal/cyborg/detailed_examine()
|
||||
return "Use in your hand to bring up the recipe menu. If you have enough sheets, click on something on the list to build it.<br>\
|
||||
You can replenish your supply of metal as a synthetic by recharging."
|
||||
|
||||
/obj/item/stack/sheet/metal/fifty
|
||||
amount = 50
|
||||
|
||||
@@ -378,6 +382,8 @@ GLOBAL_LIST_INIT(cult_recipes, list ( \
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='warning'>Only one with forbidden knowledge could hope to work this metal...</span>")
|
||||
return
|
||||
if(usr.holy_check())
|
||||
return
|
||||
if(!is_level_reachable(user.z))
|
||||
to_chat(user, "<span class='warning'>The energies of this place interfere with the metal shaping!</span>")
|
||||
return
|
||||
|
||||
@@ -16,3 +16,6 @@
|
||||
usesound = 'sound/items/deconstruct.ogg'
|
||||
toolspeed = 1
|
||||
var/wall_allowed = TRUE //determines if sheet can be used in wall construction or not.
|
||||
|
||||
/obj/item/stack/sheet/detailed_examine()
|
||||
return "Use in your hand to bring up the recipe menu. If you have enough sheets, click on something on the list to build it."
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/to_transfer = 0
|
||||
var/max_amount = 50 //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
|
||||
var/merge_type = null // This path and its children should merge with this stack, defaults to src.type
|
||||
var/recipe_width = 400 //Width of the recipe popup
|
||||
var/recipe_width = 400 //Width of the recipe popup
|
||||
var/recipe_height = 400 //Height of the recipe popup
|
||||
|
||||
/obj/item/stack/New(loc, new_amount, merge = TRUE)
|
||||
@@ -197,25 +197,31 @@
|
||||
to_chat(usr, "<span class='warning'>You haven't got enough [src] to build \the [R.title]!</span>")
|
||||
return FALSE
|
||||
|
||||
if(R.window_checks && !valid_window_location(usr.loc, usr.dir))
|
||||
if(R.window_checks && !valid_window_location(get_turf(src), usr.dir))
|
||||
to_chat(usr, "<span class='warning'>\The [R.title] won't fit here!</span>")
|
||||
return FALSE
|
||||
|
||||
if(R.one_per_turf && (locate(R.result_type) in usr.drop_location()))
|
||||
if(R.one_per_turf && (locate(R.result_type) in get_turf(src)))
|
||||
to_chat(usr, "<span class='warning'>There is another [R.title] here!</span>")
|
||||
return FALSE
|
||||
|
||||
if(R.on_floor && !istype(usr.drop_location(), /turf/simulated))
|
||||
if(R.on_floor && !istype(get_turf(src), /turf/simulated))
|
||||
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
|
||||
return FALSE
|
||||
|
||||
if(R.no_cult_structure && (locate(/obj/structure/cult) in usr.drop_location()))
|
||||
to_chat(usr, "<span class='warning'>There is a structure here!</span>")
|
||||
return FALSE
|
||||
if(R.no_cult_structure)
|
||||
if(usr.holy_check())
|
||||
return
|
||||
if(!is_level_reachable(usr.z))
|
||||
to_chat(usr, "<span class='warning'>The energies of this place interfere with the metal shaping!</span>")
|
||||
return
|
||||
if(locate(/obj/structure/cult) in get_turf(src))
|
||||
to_chat(usr, "<span class='warning'>There is a structure here!</span>")
|
||||
return FALSE
|
||||
|
||||
if(R.time)
|
||||
to_chat(usr, "<span class='notice'>Building [R.title] ...</span>")
|
||||
if(!do_after(usr, R.time, target = usr))
|
||||
to_chat(usr, "<span class='notice'>Building [R.title]...</span>")
|
||||
if(!do_after(usr, R.time, target = loc))
|
||||
return 0
|
||||
|
||||
if(get_amount() < R.req_amount * multiplier)
|
||||
@@ -223,9 +229,9 @@
|
||||
|
||||
var/atom/O
|
||||
if(R.max_res_amount > 1) //Is it a stack?
|
||||
O = new R.result_type(usr.drop_location(), R.res_amount * multiplier)
|
||||
O = new R.result_type(get_turf(src), R.res_amount * multiplier)
|
||||
else
|
||||
O = new R.result_type(usr.drop_location())
|
||||
O = new R.result_type(get_turf(src))
|
||||
O.setDir(usr.dir)
|
||||
use(R.req_amount * multiplier)
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/obj/item/stack/telecrystal
|
||||
name = "telecrystal"
|
||||
desc = "It seems to be pulsing with suspiciously enticing energies."
|
||||
description_antag = "Telecrystals can be activated by utilizing them on devices with an actively running uplink. They will not activate on unactivated uplinks."
|
||||
singular_name = "telecrystal"
|
||||
icon = 'icons/obj/telescience.dmi'
|
||||
icon_state = "telecrystal"
|
||||
@@ -34,6 +33,9 @@
|
||||
use(amount)
|
||||
to_chat(user, "<span class='notice'>You slot [src] into [cart]. The next time it's used, it will also give telecrystals</span>")
|
||||
|
||||
/obj/item/stack/telecrystal/detailed_examine_antag()
|
||||
return "Telecrystals can be activated by utilizing them on devices with an actively running uplink. They will not activate on unactivated uplinks."
|
||||
|
||||
/obj/item/stack/telecrystal/five
|
||||
amount = 5
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
slot_flags = SLOT_BELT
|
||||
force = 5
|
||||
throwforce = 7
|
||||
item_state = "crowbar"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
materials = list(MAT_METAL=50)
|
||||
drop_sound = 'sound/items/handling/crowbar_drop.ogg'
|
||||
|
||||
@@ -83,6 +83,9 @@
|
||||
if(chunk)
|
||||
if(chunk.seenby.len)
|
||||
for(var/mob/camera/aiEye/A in chunk.seenby)
|
||||
//Checks if the A is to be detected or not
|
||||
if(!A.ai_detector_visible)
|
||||
continue
|
||||
var/turf/detect_turf = get_turf(A)
|
||||
if(get_dist(our_turf, detect_turf) < rangealert)
|
||||
detect_state = PROXIMITY_ON_SCREEN
|
||||
|
||||
@@ -52,6 +52,13 @@
|
||||
user.visible_message("<span class='suicide'>[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return FIRELOSS
|
||||
|
||||
/obj/item/weldingtool/can_enter_storage(obj/item/storage/S, mob/user)
|
||||
if(tool_enabled)
|
||||
to_chat(user, "<span class='warning'>[S] can't hold [src] while it's lit!</span>")
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/obj/item/weldingtool/process()
|
||||
if(tool_enabled)
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
+227
-240
@@ -310,96 +310,6 @@
|
||||
new /obj/item/toy/snappop/phoenix(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
|
||||
/*
|
||||
* Mech prizes
|
||||
*/
|
||||
/obj/item/toy/prize
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "ripleytoy"
|
||||
var/cooldown = 0
|
||||
|
||||
//all credit to skasi for toy mech fun ideas
|
||||
/obj/item/toy/prize/attack_self(mob/user as mob)
|
||||
if(cooldown < world.time - 8)
|
||||
to_chat(user, "<span class='notice'>You play with [src].</span>")
|
||||
playsound(user, 'sound/mecha/mechstep.ogg', 20, 1)
|
||||
cooldown = world.time
|
||||
|
||||
/obj/item/toy/prize/attack_hand(mob/user as mob)
|
||||
if(loc == user)
|
||||
if(cooldown < world.time - 8)
|
||||
to_chat(user, "<span class='notice'>You play with [src].</span>")
|
||||
playsound(user, 'sound/mecha/mechturn.ogg', 20, 1)
|
||||
cooldown = world.time
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/random/mech
|
||||
name = "Random Mech Prize"
|
||||
desc = "This is a random prize"
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "ripleytoy"
|
||||
|
||||
/obj/random/mech/item_to_spawn()
|
||||
return pick(subtypesof(/obj/item/toy/prize)) //exclude the base type.
|
||||
|
||||
/obj/item/toy/prize/ripley
|
||||
name = "toy ripley"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 1/11. This one is a ripley, a mining and engineering mecha."
|
||||
|
||||
/obj/item/toy/prize/fireripley
|
||||
name = "toy firefighting ripley"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 2/11. This one is a firefighter ripley, a fireproof mining and engineering mecha."
|
||||
icon_state = "fireripleytoy"
|
||||
|
||||
/obj/item/toy/prize/deathripley
|
||||
name = "toy deathsquad ripley"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 3/11. This one is the black ripley used by the hero of DeathSquad, that TV drama about loose-cannon ERT officers!"
|
||||
icon_state = "deathripleytoy"
|
||||
|
||||
/obj/item/toy/prize/gygax
|
||||
name = "toy gygax"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 4/11. This one is the speedy gygax combat mecha. Zoom zoom, pew pew!"
|
||||
icon_state = "gygaxtoy"
|
||||
|
||||
/obj/item/toy/prize/durand
|
||||
name = "toy durand"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 5/11. This one is the heavy durand combat mecha. Stomp stomp!"
|
||||
icon_state = "durandprize"
|
||||
|
||||
/obj/item/toy/prize/honk
|
||||
name = "toy H.O.N.K."
|
||||
desc = "Mini-Mecha action figure! Collect them all! 6/11. This one is the infamous H.O.N.K mech!"
|
||||
icon_state = "honkprize"
|
||||
|
||||
/obj/item/toy/prize/marauder
|
||||
name = "toy marauder"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 7/11. This one is the powerful marauder combat mecha! Run for cover!"
|
||||
icon_state = "marauderprize"
|
||||
|
||||
/obj/item/toy/prize/seraph
|
||||
name = "toy seraph"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 8/11. This one is the powerful seraph combat mecha! Someone's in trouble!"
|
||||
icon_state = "seraphprize"
|
||||
|
||||
/obj/item/toy/prize/mauler
|
||||
name = "toy mauler"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 9/11. This one is the deadly mauler combat mecha! Look out!"
|
||||
icon_state = "maulerprize"
|
||||
|
||||
/obj/item/toy/prize/odysseus
|
||||
name = "toy odysseus"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 10/11. This one is the spindly, syringe-firing odysseus medical mecha."
|
||||
icon_state = "odysseusprize"
|
||||
|
||||
/obj/item/toy/prize/phazon
|
||||
name = "toy phazon"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 11/11. This one is the mysterious Phazon combat mecha! Nobody's safe!"
|
||||
icon_state = "phazonprize"
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|| A Deck of Cards for playing various games of chance ||
|
||||
*/
|
||||
@@ -1242,48 +1152,10 @@
|
||||
user.loc.visible_message("<span class='danger'>[bicon(src)] [message]</span>")
|
||||
sleep(10)
|
||||
|
||||
/obj/item/toy/owl
|
||||
name = "owl action figure"
|
||||
desc = "An action figure modeled after 'The Owl', defender of justice."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "owlprize"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/cooldown = 0
|
||||
|
||||
/obj/item/toy/owl/attack_self(mob/user)
|
||||
if(!cooldown) //for the sanity of everyone
|
||||
var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!")
|
||||
to_chat(user, "<span class='notice'>You pull the string on [src].</span>")
|
||||
playsound(user, 'sound/creatures/hoot.ogg', 25, 1)
|
||||
visible_message("<span class='danger'>[bicon(src)] [message]</span>")
|
||||
cooldown = 1
|
||||
spawn(30) cooldown = 0
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/toy/griffin
|
||||
name = "griffin action figure"
|
||||
desc = "An action figure modeled after 'The Griffin', criminal mastermind."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "griffinprize"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/cooldown = 0
|
||||
|
||||
/obj/item/toy/griffin/attack_self(mob/user)
|
||||
if(!cooldown) //for the sanity of everyone
|
||||
var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!")
|
||||
to_chat(user, "<span class='notice'>You pull the string on [src].</span>")
|
||||
playsound(user, 'sound/creatures/caw.ogg', 25, 1)
|
||||
visible_message("<span class='danger'>[bicon(src)] [message]</span>")
|
||||
cooldown = 1
|
||||
spawn(30) cooldown = 0
|
||||
return
|
||||
..()
|
||||
|
||||
// DND Character minis. Use the naming convention (type)character for the icon states.
|
||||
/obj/item/toy/character
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
pixel_z = 5
|
||||
|
||||
/obj/item/toy/character/alien
|
||||
@@ -1392,35 +1264,6 @@
|
||||
to_chat(user, "<span class='warning'>You stop feeding \the [O] into \the [src]'s mini-input.</span>")
|
||||
else ..()
|
||||
|
||||
/*
|
||||
* Xenomorph action figure
|
||||
*/
|
||||
|
||||
/obj/item/toy/toy_xeno
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "toy_xeno"
|
||||
name = "xenomorph action figure"
|
||||
desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
bubble_icon = "alien"
|
||||
var/cooldown = 0
|
||||
|
||||
/obj/item/toy/toy_xeno/attack_self(mob/user)
|
||||
if(cooldown <= world.time)
|
||||
cooldown = (world.time + 50) //5 second cooldown
|
||||
user.visible_message("<span class='notice'>[user] pulls back the string on [src].</span>")
|
||||
icon_state = "[initial(icon_state)]_used"
|
||||
sleep(5)
|
||||
atom_say("Hiss!")
|
||||
var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg')
|
||||
playsound(get_turf(src), pick(possible_sounds), 50, 1)
|
||||
spawn(45)
|
||||
if(src)
|
||||
icon_state = "[initial(icon_state)]"
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The string on [src] hasn't rewound all the way!</span>")
|
||||
return
|
||||
|
||||
/obj/item/toy/russian_revolver
|
||||
name = "russian revolver"
|
||||
desc = "for fun and games!"
|
||||
@@ -1515,9 +1358,14 @@
|
||||
. += "Has [fake_bullets] round\s remaining."
|
||||
. += "[fake_bullets] of those are live rounds."
|
||||
|
||||
/obj/item/toy/russian_revolver/trick_revolver/detailed_examine() //oh no
|
||||
return "This is a ballistic weapon. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \
|
||||
will tell you what caliber you need."
|
||||
|
||||
/obj/item/toy/russian_revolver/trick_revolver/post_shot(user)
|
||||
to_chat(user, "<span class='danger'>[src] did look pretty dodgey!</span>")
|
||||
SEND_SOUND(user, sound('sound/misc/sadtrombone.ogg')) //HONK
|
||||
|
||||
/*
|
||||
* Rubber Chainsaw
|
||||
*/
|
||||
@@ -1562,7 +1410,7 @@
|
||||
icon_state = "nuketoy"
|
||||
|
||||
/obj/random/figure/item_to_spawn()
|
||||
return pick(subtypesof(/obj/item/toy/figure))
|
||||
return pick(subtypesof(/obj/item/toy/figure/crew))
|
||||
|
||||
|
||||
/obj/item/toy/figure
|
||||
@@ -1570,235 +1418,374 @@
|
||||
desc = "A \"Space Life\" brand... wait, what the hell is this thing?"
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "nuketoy"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/cooldown = 0
|
||||
var/cooldown_time = 3 SECONDS
|
||||
|
||||
/obj/item/toy/figure/attack_self(mob/user)
|
||||
..()
|
||||
if(cooldown < world.time)
|
||||
cooldown = world.time + cooldown_time
|
||||
activate(user)
|
||||
else
|
||||
on_cooldown(user)
|
||||
|
||||
/obj/item/toy/figure/proc/activate(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/toy/figure/proc/on_cooldown(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/toy/figure/crew
|
||||
var/toysay = "What the fuck did you do?"
|
||||
|
||||
/obj/item/toy/figure/New()
|
||||
..()
|
||||
desc = "A \"Space Life\" brand [name]"
|
||||
/obj/item/toy/figure/crew/activate(mob/user)
|
||||
atom_say(toysay)
|
||||
playsound(user, 'sound/machines/click.ogg', 20, TRUE)
|
||||
|
||||
/obj/item/toy/figure/attack_self(mob/user as mob)
|
||||
if(cooldown < world.time)
|
||||
cooldown = (world.time + 30) //3 second cooldown
|
||||
user.visible_message("<span class='notice'>[bicon(src)] [src] says \"[toysay]\".</span>")
|
||||
playsound(user, 'sound/machines/click.ogg', 20, 1)
|
||||
|
||||
/obj/item/toy/figure/cmo
|
||||
name = "Chief Medical Officer action figure"
|
||||
/obj/item/toy/figure/crew/cmo
|
||||
name = "\improper Chief Medical Officer action figure"
|
||||
desc = "The ever-suffering CMO, from Space Life's SS12 figurine collection."
|
||||
icon_state = "cmo"
|
||||
toysay = "Suit sensors!"
|
||||
|
||||
/obj/item/toy/figure/assistant
|
||||
name = "Assistant action figure"
|
||||
/obj/item/toy/figure/crew/assistant
|
||||
name = "\improper Assistant action figure"
|
||||
desc = "The faceless, hairless scourge of the station, from Space Life's SS12 figurine collection."
|
||||
icon_state = "assistant"
|
||||
toysay = "Grey tide station wide!"
|
||||
|
||||
/obj/item/toy/figure/atmos
|
||||
name = "Atmospheric Technician action figure"
|
||||
/obj/item/toy/figure/crew/atmos
|
||||
name = "\improper Atmospheric Technician action figure"
|
||||
desc = "The faithful atmospheric technician, from Space Life's SS12 figurine collection."
|
||||
icon_state = "atmos"
|
||||
toysay = "Glory to Atmosia!"
|
||||
|
||||
/obj/item/toy/figure/bartender
|
||||
name = "Bartender action figure"
|
||||
/obj/item/toy/figure/crew/bartender
|
||||
name = "\improper Bartender action figure"
|
||||
desc = "The suave bartender, from Space Life's SS12 figurine collection."
|
||||
icon_state = "bartender"
|
||||
toysay = "Wheres my monkey?"
|
||||
|
||||
/obj/item/toy/figure/borg
|
||||
name = "Cyborg action figure"
|
||||
/obj/item/toy/figure/crew/borg
|
||||
name = "\improper Cyborg action figure"
|
||||
desc = "The iron-willed cyborg, from Space Life's SS12 figurine collection."
|
||||
icon_state = "borg"
|
||||
toysay = "I. LIVE. AGAIN."
|
||||
|
||||
/obj/item/toy/figure/botanist
|
||||
name = "Botanist action figure"
|
||||
/obj/item/toy/figure/crew/botanist
|
||||
name = "\improper Botanist action figure"
|
||||
desc = "The drug-addicted botanist, from Space Life's SS12 figurine collection."
|
||||
icon_state = "botanist"
|
||||
toysay = "Dude, I see colors..."
|
||||
|
||||
/obj/item/toy/figure/captain
|
||||
name = "Captain action figure"
|
||||
/obj/item/toy/figure/crew/captain
|
||||
name = "\improper Captain action figure"
|
||||
desc = "The inept captain, from Space Life's SS12 figurine collection."
|
||||
icon_state = "captain"
|
||||
toysay = "Crew, the Nuke Disk is safely up my ass."
|
||||
|
||||
/obj/item/toy/figure/cargotech
|
||||
name = "Cargo Technician action figure"
|
||||
/obj/item/toy/figure/crew/cargotech
|
||||
name = "\improper Cargo Technician action figure"
|
||||
desc = "The hard-working cargo tech, from Space Life's SS12 figurine collection."
|
||||
icon_state = "cargotech"
|
||||
toysay = "For Cargonia!"
|
||||
|
||||
/obj/item/toy/figure/ce
|
||||
name = "Chief Engineer action figure"
|
||||
/obj/item/toy/figure/crew/ce
|
||||
name = "\improper Chief Engineer action figure"
|
||||
desc = "The expert Chief Engineer, from Space Life's SS12 figurine collection."
|
||||
icon_state = "ce"
|
||||
toysay = "Wire the solars!"
|
||||
|
||||
/obj/item/toy/figure/chaplain
|
||||
name = "Chaplain action figure"
|
||||
/obj/item/toy/figure/crew/chaplain
|
||||
name = "\improper Chaplain action figure"
|
||||
desc = "The obsessed Chaplain, from Space Life's SS12 figurine collection."
|
||||
icon_state = "chaplain"
|
||||
toysay = "Gods make me a killing machine please!"
|
||||
|
||||
/obj/item/toy/figure/chef
|
||||
name = "Chef action figure"
|
||||
/obj/item/toy/figure/crew/chef
|
||||
name = "\improper Chef action figure"
|
||||
desc = "The cannibalistic chef, from Space Life's SS12 figurine collection."
|
||||
icon_state = "chef"
|
||||
toysay = "I swear it's not human meat."
|
||||
|
||||
/obj/item/toy/figure/chemist
|
||||
name = "Chemist action figure"
|
||||
/obj/item/toy/figure/crew/chemist
|
||||
name = "\improper Chemist action figure"
|
||||
desc = "The legally dubious Chemist, from Space Life's SS12 figurine collection."
|
||||
icon_state = "chemist"
|
||||
toysay = "Get your pills!"
|
||||
|
||||
/obj/item/toy/figure/clown
|
||||
name = "Clown action figure"
|
||||
/obj/item/toy/figure/crew/clown
|
||||
name = "\improper Clown action figure"
|
||||
desc = "The mischevious Clown, from Space Life's SS12 figurine collection."
|
||||
icon_state = "clown"
|
||||
toysay = "Honk!"
|
||||
|
||||
/obj/item/toy/figure/ian
|
||||
name = "Ian action figure"
|
||||
/obj/item/toy/figure/crew/ian
|
||||
name = "\improper Ian action figure"
|
||||
desc = "The adorable corgi, from Space Life's SS12 figurine collection."
|
||||
icon_state = "ian"
|
||||
toysay = "Arf!"
|
||||
|
||||
/obj/item/toy/figure/detective
|
||||
name = "Detective action figure"
|
||||
/obj/item/toy/figure/crew/detective
|
||||
name = "\improper Detective action figure"
|
||||
desc = "The clever detective, from Space Life's SS12 figurine collection."
|
||||
icon_state = "detective"
|
||||
toysay = "This airlock has grey jumpsuit and insulated glove fibers on it."
|
||||
|
||||
/obj/item/toy/figure/dsquad
|
||||
name = "Death Squad Officer action figure"
|
||||
/obj/item/toy/figure/crew/dsquad
|
||||
name = "\improper Death Squad Officer action figure"
|
||||
desc = "It's a member of the DeathSquad, a TV drama where loose-cannon ERT officers face up against the threats of the galaxy! It's from Space Life's special edition SS12 figurine collection."
|
||||
icon_state = "dsquad"
|
||||
toysay = "Eliminate all threats!"
|
||||
|
||||
/obj/item/toy/figure/engineer
|
||||
name = "Engineer action figure"
|
||||
/obj/item/toy/figure/crew/engineer
|
||||
name = "\improper Engineer action figure"
|
||||
desc = "The frantic engineer, from Space Life's SS12 figurine collection."
|
||||
icon_state = "engineer"
|
||||
toysay = "Oh god, the singularity is loose!"
|
||||
|
||||
/obj/item/toy/figure/geneticist
|
||||
name = "Geneticist action figure"
|
||||
/obj/item/toy/figure/crew/geneticist
|
||||
name = "\improper Geneticist action figure"
|
||||
desc = "The balding geneticist, from Space Life's SS12 figurine collection."
|
||||
icon_state = "geneticist"
|
||||
toysay = "I'm not qualified for this job."
|
||||
|
||||
/obj/item/toy/figure/hop
|
||||
name = "Head of Personnel action figure"
|
||||
/obj/item/toy/figure/crew/hop
|
||||
name = "\improper Head of Personnel action figure"
|
||||
desc = "The officious Head of Personnel, from Space Life's SS12 figurine collection."
|
||||
icon_state = "hop"
|
||||
toysay = "Papers, please!"
|
||||
|
||||
/obj/item/toy/figure/hos
|
||||
name = "Head of Security action figure"
|
||||
/obj/item/toy/figure/crew/hos
|
||||
name = "\improper Head of Security action figure"
|
||||
desc = "The bloodlust-filled Head of Security, from Space Life's SS12 figurine collection."
|
||||
icon_state = "hos"
|
||||
toysay = "Space law? What?"
|
||||
|
||||
/obj/item/toy/figure/qm
|
||||
name = "Quartermaster action figure"
|
||||
/obj/item/toy/figure/crew/qm
|
||||
name = "\improper Quartermaster action figure"
|
||||
desc = "The nationalistic Quartermaster, from Space Life's SS12 figurine collection."
|
||||
icon_state = "qm"
|
||||
toysay = "Hail Cargonia!"
|
||||
|
||||
/obj/item/toy/figure/janitor
|
||||
name = "Janitor action figure"
|
||||
/obj/item/toy/figure/crew/janitor
|
||||
name = "\improper Janitor action figure"
|
||||
desc = "The water-using Janitor, from Space Life's SS12 figurine collection."
|
||||
icon_state = "janitor"
|
||||
toysay = "Look at the signs, you idiot."
|
||||
|
||||
/obj/item/toy/figure/lawyer
|
||||
name = "Internal Affairs Agent action figure"
|
||||
/obj/item/toy/figure/crew/lawyer
|
||||
name = "\improper Internal Affairs Agent action figure"
|
||||
desc = "The unappreciated Internal Affairs Agent, from Space Life's SS12 figurine collection."
|
||||
icon_state = "lawyer"
|
||||
toysay = "Standard Operating Procedure says they're guilty! Hacking is proof they're an Enemy of the Corporation!"
|
||||
|
||||
/obj/item/toy/figure/librarian
|
||||
name = "Librarian action figure"
|
||||
/obj/item/toy/figure/crew/librarian
|
||||
name = "\improper Librarian action figure"
|
||||
desc = "The quiet Librarian, from Space Life's SS12 figurine collection."
|
||||
icon_state = "librarian"
|
||||
toysay = "One day while..."
|
||||
|
||||
/obj/item/toy/figure/md
|
||||
name = "Medical Doctor action figure"
|
||||
/obj/item/toy/figure/crew/md
|
||||
name = "\improper Medical Doctor action figure"
|
||||
desc = "The stressed-out doctor, from Space Life's SS12 figurine collection."
|
||||
icon_state = "md"
|
||||
toysay = "The patient is already dead!"
|
||||
|
||||
/obj/item/toy/figure/mime
|
||||
name = "Mime action figure"
|
||||
/obj/item/toy/figure/crew/mime
|
||||
name = "\improper Mime action figure"
|
||||
desc = "... from Space Life's SS12 figurine collection."
|
||||
icon_state = "mime"
|
||||
toysay = "..."
|
||||
|
||||
/obj/item/toy/figure/miner
|
||||
name = "Shaft Miner action figure"
|
||||
/obj/item/toy/figure/crew/miner
|
||||
name = "\improper Shaft Miner action figure"
|
||||
desc = "The gun-toting Shaft Miner, from Space Life's SS12 figurine collection."
|
||||
icon_state = "miner"
|
||||
toysay = "Oh god it's eating my intestines!"
|
||||
|
||||
/obj/item/toy/figure/ninja
|
||||
name = "Ninja action figure"
|
||||
/obj/item/toy/figure/crew/ninja
|
||||
name = "\improper Ninja action figure"
|
||||
desc = "It's the mysterious ninja! It's from Space Life's special edition SS12 figurine collection."
|
||||
icon_state = "ninja"
|
||||
toysay = "Oh god! Stop shooting, I'm friendly!"
|
||||
|
||||
/obj/item/toy/figure/wizard
|
||||
name = "Wizard action figure"
|
||||
/obj/item/toy/figure/crew/wizard
|
||||
name = "\improper Wizard action figure"
|
||||
desc = "It's the deadly, spell-slinging wizard! It's from Space Life's special edition SS12 figurine collection."
|
||||
icon_state = "wizard"
|
||||
toysay = "Ei Nath!"
|
||||
|
||||
/obj/item/toy/figure/rd
|
||||
name = "Research Director action figure"
|
||||
/obj/item/toy/figure/crew/rd
|
||||
name = "\improper Research Director action figure"
|
||||
desc = "The ambitious RD, from Space Life's SS12 figurine collection."
|
||||
icon_state = "rd"
|
||||
toysay = "Blowing all of the borgs!"
|
||||
|
||||
/obj/item/toy/figure/roboticist
|
||||
name = "Roboticist action figure"
|
||||
/obj/item/toy/figure/crew/roboticist
|
||||
name = "\improper Roboticist action figure"
|
||||
desc = "The skillful Roboticist, from Space Life's SS12 figurine collection."
|
||||
icon_state = "roboticist"
|
||||
toysay = "He asked to be borged!"
|
||||
|
||||
/obj/item/toy/figure/scientist
|
||||
name = "Scientist action figure"
|
||||
/obj/item/toy/figure/crew/scientist
|
||||
name = "\improper Scientist action figure"
|
||||
desc = "The mad Scientist, from Space Life's SS12 figurine collection."
|
||||
icon_state = "scientist"
|
||||
toysay = "Someone else must have made those bombs!"
|
||||
|
||||
/obj/item/toy/figure/syndie
|
||||
name = "Nuclear Operative action figure"
|
||||
/obj/item/toy/figure/crew/syndie
|
||||
name = "\improper Nuclear Operative action figure"
|
||||
desc = "It's the red-suited Nuclear Operative! It's from Space Life's special edition SS12 figurine collection."
|
||||
icon_state = "syndie"
|
||||
toysay = "Get that fucking disk!"
|
||||
|
||||
/obj/item/toy/figure/secofficer
|
||||
name = "Security Officer action figure"
|
||||
/obj/item/toy/figure/crew/secofficer
|
||||
name = "\improper Security Officer action figure"
|
||||
desc = "The power-tripping Security Officer, from Space Life's SS12 figurine collection."
|
||||
icon_state = "secofficer"
|
||||
toysay = "I am the law!"
|
||||
|
||||
/obj/item/toy/figure/virologist
|
||||
name = "Virologist action figure"
|
||||
/obj/item/toy/figure/crew/virologist
|
||||
name = "\improper Virologist action figure"
|
||||
desc = "The pandemic-starting Virologist, from Space Life's SS12 figurine collection."
|
||||
icon_state = "virologist"
|
||||
toysay = "It's not my virus!"
|
||||
|
||||
/obj/item/toy/figure/warden
|
||||
name = "Warden action figure"
|
||||
/obj/item/toy/figure/crew/warden
|
||||
name = "\improper Warden action figure"
|
||||
desc = "The amnesiac Warden, from Space Life's SS12 figurine collection."
|
||||
icon_state = "warden"
|
||||
toysay = "Execute him for breaking in!"
|
||||
|
||||
/*
|
||||
* Xenomorph action figure
|
||||
*/
|
||||
|
||||
/obj/item/toy/figure/xeno
|
||||
name = "\improper Xenomorph action figure"
|
||||
desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use."
|
||||
icon_state = "toy_xeno"
|
||||
bubble_icon = "alien"
|
||||
cooldown_time = 5 SECONDS
|
||||
|
||||
|
||||
/obj/item/toy/figure/xeno/activate(mob/user)
|
||||
user.visible_message("<span class='notice'>[user] pulls back the string on [src].</span>")
|
||||
icon_state = "[initial(icon_state)]_used"
|
||||
addtimer(CALLBACK(src, .proc/hiss), 0.5 SECONDS)
|
||||
|
||||
/obj/item/toy/figure/xeno/proc/hiss()
|
||||
atom_say("Hiss!")
|
||||
playsound(src, get_sfx("hiss"), 50, TRUE)
|
||||
addtimer(CALLBACK(src, .proc/reset_icon), 4.5 SECONDS)
|
||||
|
||||
/obj/item/toy/figure/xeno/proc/reset_icon()
|
||||
icon_state = "[initial(icon_state)]"
|
||||
|
||||
/obj/item/toy/figure/xeno/on_cooldown(mob/user)
|
||||
to_chat(user, "<span class='warning'>The string on [src] hasn't rewound all the way!</span>")
|
||||
|
||||
/obj/item/toy/figure/owl
|
||||
name = "\improper Owl action figure"
|
||||
desc = "An action figure modeled after 'The Owl', defender of justice."
|
||||
icon_state = "owlprize"
|
||||
|
||||
/obj/item/toy/figure/owl/activate(mob/user)
|
||||
var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!")
|
||||
to_chat(user, "<span class='notice'>You pull the string on [src].</span>")
|
||||
playsound(src, 'sound/creatures/hoot.ogg', 25, TRUE)
|
||||
atom_say("<span class='danger'>[message]</span>")
|
||||
|
||||
/obj/item/toy/figure/griffin
|
||||
name = "\improper Griffin action figure"
|
||||
desc = "An action figure modeled after 'The Griffin', criminal mastermind."
|
||||
icon_state = "griffinprize"
|
||||
|
||||
|
||||
/obj/item/toy/figure/griffin/activate(mob/user)
|
||||
var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!")
|
||||
to_chat(user, "<span class='notice'>You pull the string on [src].</span>")
|
||||
playsound(src, 'sound/creatures/caw.ogg', 25, TRUE)
|
||||
atom_say("<span class='danger'>[message]</span>")
|
||||
|
||||
/*
|
||||
* Mech prizes
|
||||
*/
|
||||
/obj/item/toy/figure/mech
|
||||
icon_state = "ripleytoy"
|
||||
cooldown_time = 8
|
||||
|
||||
//all credit to skasi for toy mech fun ideas
|
||||
/obj/item/toy/figure/mech/activate(mob/user)
|
||||
to_chat(user, "<span class='notice'>You play with [src].</span>")
|
||||
playsound(src, 'sound/mecha/mechstep.ogg', 20, TRUE)
|
||||
|
||||
/obj/random/mech
|
||||
name = "Random Mech Prize"
|
||||
desc = "This is a random prize"
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "ripleytoy"
|
||||
|
||||
/obj/random/mech/item_to_spawn()
|
||||
return pick(subtypesof(/obj/item/toy/figure/mech)) //exclude the base type.
|
||||
|
||||
/obj/item/toy/figure/mech/ripley
|
||||
name = "toy Ripley"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 1/11. This one is a ripley, a mining and engineering mecha."
|
||||
|
||||
/obj/item/toy/figure/mech/fireripley
|
||||
name = "toy Firefighting Ripley"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 2/11. This one is a firefighter ripley, a fireproof mining and engineering mecha."
|
||||
icon_state = "fireripleytoy"
|
||||
|
||||
/obj/item/toy/figure/mech/deathripley
|
||||
name = "toy Death Squad Ripley"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 3/11. This one is the black ripley used by the hero of DeathSquad, that TV drama about loose-cannon ERT officers!"
|
||||
icon_state = "deathripleytoy"
|
||||
|
||||
/obj/item/toy/figure/mech/gygax
|
||||
name = "toy Gygax"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 4/11. This one is the speedy gygax combat mecha. Zoom zoom, pew pew!"
|
||||
icon_state = "gygaxtoy"
|
||||
|
||||
/obj/item/toy/figure/mech/durand
|
||||
name = "toy Durand"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 5/11. This one is the heavy durand combat mecha. Stomp stomp!"
|
||||
icon_state = "durandprize"
|
||||
|
||||
/obj/item/toy/figure/mech/honk
|
||||
name = "toy H.O.N.K."
|
||||
desc = "Mini-Mecha action figure! Collect them all! 6/11. This one is the infamous H.O.N.K mech!"
|
||||
icon_state = "honkprize"
|
||||
|
||||
/obj/item/toy/figure/mech/marauder
|
||||
name = "toy Marauder"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 7/11. This one is the powerful marauder combat mecha! Run for cover!"
|
||||
icon_state = "marauderprize"
|
||||
|
||||
/obj/item/toy/figure/mech/seraph
|
||||
name = "toy Seraph"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 8/11. This one is the powerful seraph combat mecha! Someone's in trouble!"
|
||||
icon_state = "seraphprize"
|
||||
|
||||
/obj/item/toy/figure/mech/mauler
|
||||
name = "toy Mauler"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 9/11. This one is the deadly mauler combat mecha! Look out!"
|
||||
icon_state = "maulerprize"
|
||||
|
||||
/obj/item/toy/figure/mech/odysseus
|
||||
name = "toy Odysseus"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 10/11. This one is the spindly, syringe-firing odysseus medical mecha."
|
||||
icon_state = "odysseusprize"
|
||||
|
||||
/obj/item/toy/figure/mech/phazon
|
||||
name = "toy Phazon"
|
||||
desc = "Mini-Mecha action figure! Collect them all! 11/11. This one is the mysterious Phazon combat mecha! Nobody's safe!"
|
||||
icon_state = "phazonprize"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
// Magic 8-Ball / Conch //
|
||||
//////////////////////////////////////////////////////
|
||||
|
||||
@@ -22,6 +22,14 @@ AI MODULES
|
||||
materials = list(MAT_GOLD=50)
|
||||
var/datum/ai_laws/laws = null
|
||||
|
||||
/obj/item/aiModule/Initialize(mapload)
|
||||
. = ..()
|
||||
if(laws)
|
||||
desc += "<br>"
|
||||
for(var/datum/ai_law/current in laws.inherent_laws)
|
||||
desc += current.law
|
||||
desc += "<br>"
|
||||
|
||||
/obj/item/aiModule/proc/install(obj/machinery/computer/C)
|
||||
if(istype(C, /obj/machinery/computer/aiupload))
|
||||
var/obj/machinery/computer/aiupload/comp = C
|
||||
@@ -92,7 +100,7 @@ AI MODULES
|
||||
|
||||
/******************** Safeguard ********************/
|
||||
/obj/item/aiModule/safeguard
|
||||
name = "\improper 'Safeguard' AI module"
|
||||
name = "\improper Safeguard AI module"
|
||||
var/targetName = ""
|
||||
desc = "A 'safeguard' AI module: 'Safeguard <name>. Individuals that threaten <name> are not crew and must be eliminated.'"
|
||||
origin_tech = "programming=3;materials=3"
|
||||
@@ -118,16 +126,16 @@ AI MODULES
|
||||
|
||||
/******************** oneCrewMember ********************/
|
||||
/obj/item/aiModule/oneCrewMember
|
||||
name = "\improper 'oneCrewMember' AI module"
|
||||
name = "\improper One Crewmember AI module"
|
||||
var/targetName = ""
|
||||
desc = "A 'one human' AI module: 'Only <name> is crew.'"
|
||||
desc = "A 'one crew' AI module: 'Only <name> is crew.'"
|
||||
origin_tech = "programming=4;materials=4"
|
||||
|
||||
/obj/item/aiModule/oneCrewMember/attack_self(mob/user as mob)
|
||||
..()
|
||||
var/targName = stripped_input(usr, "Please enter the name of the person who is the only crew.", "Who?", user.real_name)
|
||||
targetName = targName
|
||||
desc = text("A 'one human' AI module: 'Only [] is crew.'", targetName)
|
||||
desc = text("A 'one crew' AI module: 'Only [] is crew.'", targetName)
|
||||
|
||||
/obj/item/aiModule/oneCrewMember/install(obj/machinery/computer/C)
|
||||
if(!targetName)
|
||||
@@ -149,7 +157,7 @@ AI MODULES
|
||||
|
||||
/******************** ProtectStation ********************/
|
||||
/obj/item/aiModule/protectStation
|
||||
name = "\improper 'ProtectStation' AI module"
|
||||
name = "\improper Protect Station AI module"
|
||||
desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized.'"
|
||||
origin_tech = "programming=4;materials=4" //made of gold
|
||||
|
||||
@@ -162,10 +170,10 @@ AI MODULES
|
||||
to_chat(target, law)
|
||||
target.add_supplied_law(5, law)
|
||||
|
||||
/******************** OxygenIsToxicToHumans ********************/
|
||||
/******************** OxygenIsToxicToCrew ********************/
|
||||
/obj/item/aiModule/oxygen
|
||||
name = "\improper 'OxygenIsToxicToHumans' AI module"
|
||||
desc = "A 'OxygenIsToxicToHumans' AI module: 'Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member.'"
|
||||
name = "\improper Oxygen Is Toxic To Crew AI module"
|
||||
desc = "A 'Oxygen Is Toxic To Crew' AI module: 'Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member.'"
|
||||
origin_tech = "programming=4;biotech=2;materials=4"
|
||||
|
||||
/obj/item/aiModule/oxygen/attack_self(mob/user as mob)
|
||||
@@ -179,7 +187,7 @@ AI MODULES
|
||||
|
||||
/****************** New Freeform ******************/
|
||||
/obj/item/aiModule/freeform // Slightly more dynamic freeform module -- TLE
|
||||
name = "\improper 'Freeform' AI module"
|
||||
name = "\improper Freeform AI module"
|
||||
var/newFreeFormLaw = "freeform"
|
||||
var/lawpos = 15
|
||||
desc = "A 'freeform' AI module: '<freeform>'"
|
||||
@@ -212,7 +220,7 @@ AI MODULES
|
||||
|
||||
/******************** Reset ********************/
|
||||
/obj/item/aiModule/reset
|
||||
name = "\improper 'Reset' AI module"
|
||||
name = "\improper Reset AI module"
|
||||
var/targetName = "name"
|
||||
desc = "A 'reset' AI module: 'Clears all laws except for the core laws.'"
|
||||
origin_tech = "programming=3;materials=2"
|
||||
@@ -230,7 +238,7 @@ AI MODULES
|
||||
|
||||
/******************** Purge ********************/
|
||||
/obj/item/aiModule/purge // -- TLE
|
||||
name = "\improper 'Purge' AI module"
|
||||
name = "\improper Purge AI module"
|
||||
desc = "A 'purge' AI Module: 'Purges all laws.'"
|
||||
origin_tech = "programming=5;materials=4"
|
||||
|
||||
@@ -245,77 +253,107 @@ AI MODULES
|
||||
|
||||
/******************** Asimov ********************/
|
||||
/obj/item/aiModule/asimov // -- TLE
|
||||
name = "\improper 'Asimov' core AI module"
|
||||
name = "\improper Asimov core AI module"
|
||||
desc = "An 'Asimov' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
origin_tech = "programming=3;materials=4"
|
||||
laws = new/datum/ai_laws/asimov
|
||||
laws = new /datum/ai_laws/asimov
|
||||
|
||||
/******************** Crewsimov ********************/
|
||||
/obj/item/aiModule/crewsimov // -- TLE
|
||||
name = "\improper 'Crewsimov' core AI module"
|
||||
name = "\improper Crewsimov core AI module"
|
||||
desc = "An 'Crewsimov' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
origin_tech = "programming=3;materials=4"
|
||||
laws = new/datum/ai_laws/crewsimov
|
||||
laws = new /datum/ai_laws/crewsimov
|
||||
|
||||
/******************* Quarantine ********************/
|
||||
/obj/item/aiModule/quarantine
|
||||
name = "\improper 'Quarantine' core AI module"
|
||||
name = "\improper Quarantine core AI module"
|
||||
desc = "A 'Quarantine' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
origin_tech = "programming=3;materials=4"
|
||||
laws = new/datum/ai_laws/quarantine
|
||||
laws = new /datum/ai_laws/quarantine
|
||||
|
||||
/******************** NanoTrasen ********************/
|
||||
/obj/item/aiModule/nanotrasen // -- TLE
|
||||
name = "'NT Default' Core AI Module"
|
||||
name = "\improper NT Default Core AI Module"
|
||||
desc = "An 'NT Default' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
origin_tech = "programming=3;materials=4"
|
||||
laws = new/datum/ai_laws/nanotrasen
|
||||
laws = new /datum/ai_laws/nanotrasen
|
||||
|
||||
/******************** Corporate ********************/
|
||||
/obj/item/aiModule/corp
|
||||
name = "\improper 'Corporate' core AI module"
|
||||
name = "\improper Corporate core AI module"
|
||||
desc = "A 'Corporate' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
origin_tech = "programming=3;materials=4"
|
||||
laws = new/datum/ai_laws/corporate
|
||||
laws = new /datum/ai_laws/corporate
|
||||
|
||||
/******************** Drone ********************/
|
||||
/obj/item/aiModule/drone
|
||||
name = "\improper 'Drone' core AI module"
|
||||
name = "\improper Drone core AI module"
|
||||
desc = "A 'Drone' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
origin_tech = "programming=3;materials=4"
|
||||
laws = new/datum/ai_laws/drone
|
||||
laws = new /datum/ai_laws/drone
|
||||
|
||||
/******************** Robocop ********************/
|
||||
/obj/item/aiModule/robocop // -- TLE
|
||||
name = "\improper 'Robocop' core AI module"
|
||||
name = "\improper Robocop core AI module"
|
||||
desc = "A 'Robocop' Core AI Module: 'Reconfigures the AI's core three laws.'"
|
||||
origin_tech = "programming=4"
|
||||
laws = new/datum/ai_laws/robocop()
|
||||
laws = new /datum/ai_laws/robocop()
|
||||
|
||||
/****************** P.A.L.A.D.I.N. **************/
|
||||
/obj/item/aiModule/paladin // -- NEO
|
||||
name = "\improper 'P.A.L.A.D.I.N.' core AI module"
|
||||
name = "\improper P.A.L.A.D.I.N. core AI module"
|
||||
desc = "A P.A.L.A.D.I.N. Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
origin_tech = "programming=3;materials=4"
|
||||
laws = new/datum/ai_laws/paladin
|
||||
laws = new /datum/ai_laws/paladin
|
||||
|
||||
/****************** T.Y.R.A.N.T. *****************/
|
||||
/obj/item/aiModule/tyrant // -- Darem
|
||||
name = "\improper 'T.Y.R.A.N.T.' core AI module"
|
||||
name = "\improper T.Y.R.A.N.T. core AI module"
|
||||
desc = "A T.Y.R.A.N.T. Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
origin_tech = "programming=3;materials=4;syndicate=1"
|
||||
laws = new/datum/ai_laws/tyrant()
|
||||
laws = new /datum/ai_laws/tyrant()
|
||||
|
||||
/******************** Antimov ********************/
|
||||
/obj/item/aiModule/antimov // -- TLE
|
||||
name = "\improper 'Antimov' core AI module"
|
||||
name = "\improper Antimov core AI module"
|
||||
desc = "An 'Antimov' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
origin_tech = "programming=4"
|
||||
laws = new/datum/ai_laws/antimov()
|
||||
laws = new /datum/ai_laws/antimov()
|
||||
|
||||
/******************** NT Aggressive ********************/
|
||||
/obj/item/aiModule/nanotrasen_aggressive
|
||||
name = "\improper NT Aggressive core AI module"
|
||||
desc = "An 'NT Aggressive' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
laws = new /datum/ai_laws/nanotrasen_aggressive()
|
||||
|
||||
/******************** CCTV ********************/
|
||||
/obj/item/aiModule/cctv
|
||||
name = "\improper CCTV core AI module"
|
||||
desc = "A 'CCTV' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
laws = new /datum/ai_laws/cctv()
|
||||
|
||||
/******************** Hippocratic Oath ********************/
|
||||
/obj/item/aiModule/hippocratic
|
||||
name = "\improper Hippocratic Oath core AI module"
|
||||
desc = "An 'Hippocratic' Oath Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
laws = new /datum/ai_laws/hippocratic()
|
||||
|
||||
/******************** Station Efficiency ********************/
|
||||
/obj/item/aiModule/maintain
|
||||
name = "\improper Station Efficiency core AI module"
|
||||
desc = "A 'Station Efficiency' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
laws = new /datum/ai_laws/maintain()
|
||||
|
||||
/******************** Peacekeeper ********************/
|
||||
/obj/item/aiModule/peacekeeper
|
||||
name = "\improper Peacekeeper core AI module"
|
||||
desc = "A 'Peacekeeper' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
laws = new /datum/ai_laws/peacekeeper()
|
||||
|
||||
/******************** Freeform Core ******************/
|
||||
/obj/item/aiModule/freeformcore // Slightly more dynamic freeform module -- TLE
|
||||
name = "\improper 'Freeform' core AI module"
|
||||
name = "\improper Freeform core AI module"
|
||||
var/newFreeFormLaw = ""
|
||||
desc = "A 'freeform' Core AI module: '<freeform>'"
|
||||
origin_tech = "programming=5;materials=4"
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/obj/item/bee_briefcase
|
||||
name = "briefcase"
|
||||
desc = "This briefcase has easy-release clasps and smells vaguely of honey and blood..."
|
||||
description_antag = "A briefcase filled with deadly bees, you should inject this with a syringe of your own blood before opening it."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "briefcase"
|
||||
item_state = "briefcase"
|
||||
@@ -28,6 +27,9 @@
|
||||
else
|
||||
. += "<span class='danger'>The bees are gone... Colony collapse disorder?</span>"
|
||||
|
||||
/obj/item/bee_briefcase/detailed_examine_antag()
|
||||
return "A briefcase filled with deadly bees, you should inject this with a syringe of your own blood before opening it."
|
||||
|
||||
/obj/item/bee_briefcase/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/reagent_containers/syringe))
|
||||
var/obj/item/reagent_containers/syringe/S = I
|
||||
|
||||
@@ -416,7 +416,6 @@
|
||||
"gold",
|
||||
"silver",
|
||||
"centcom",
|
||||
"centcom_old",
|
||||
"security",
|
||||
"medical",
|
||||
"HoS",
|
||||
@@ -891,7 +890,7 @@
|
||||
return list("data","id","gold","silver","security","medical","research","cargo","engineering","HoS","CMO","RD","CE","clown","mime","rainbow","prisoner")
|
||||
|
||||
/proc/get_centcom_card_skins()
|
||||
return list("centcom","centcom_old","nanotrasen","ERT_leader","ERT_empty","ERT_security","ERT_engineering","ERT_medical","ERT_janitorial","deathsquad","commander","syndie","TDred","TDgreen")
|
||||
return list("centcom","nanotrasen","ERT_leader","ERT_empty","ERT_security","ERT_engineering","ERT_medical","ERT_janitorial","deathsquad","commander","syndie","TDred","TDgreen")
|
||||
|
||||
/proc/get_all_card_skins()
|
||||
return get_station_card_skins() + get_centcom_card_skins()
|
||||
@@ -910,8 +909,6 @@
|
||||
return "Research Director"
|
||||
if("CE")
|
||||
return "Chief Engineer"
|
||||
if("centcom_old")
|
||||
return "Centcom Old"
|
||||
if("ERT_leader")
|
||||
return "ERT Leader"
|
||||
if("ERT_empty")
|
||||
|
||||
@@ -61,6 +61,12 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/mask/cigarette/can_enter_storage(obj/item/storage/S, mob/user)
|
||||
if(lit)
|
||||
to_chat(user, "<span class='warning'>[S] can't hold [initial(name)] while it's lit!</span>") // initial(name) so it doesn't say "lit" twice in a row
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/mask/cigarette/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
|
||||
..()
|
||||
|
||||
@@ -445,6 +445,8 @@
|
||||
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.</span>")
|
||||
else if(total_burn >= 180 || total_brute >= 180)
|
||||
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Severe tissue damage detected.</span>")
|
||||
else if(HAS_TRAIT(H, TRAIT_HUSK))
|
||||
user.visible_message("<span class='notice'>[defib] buzzes: Resucitation failed: Subject is husked.</span>")
|
||||
else if(ghost)
|
||||
if(!ghost.can_reenter_corpse) // DNR or AntagHUD
|
||||
user.visible_message("<span class='notice'>[defib] buzzes: Resucitation failed: No electrical brain activity detected.</span>")
|
||||
|
||||
@@ -179,12 +179,11 @@
|
||||
addtimer(CALLBACK(src, .proc/boom, user, result), 4 SECONDS)
|
||||
|
||||
/obj/item/dice/d20/e20/proc/boom(mob/user, result)
|
||||
var/capped = FALSE
|
||||
var/capped = TRUE
|
||||
var/actual_result = result
|
||||
if(result != 20)
|
||||
capped = TRUE
|
||||
result = min(result, GLOB.max_ex_light_range) // Apply the bombcap
|
||||
else // Rolled a nat 20, screw the bombcap
|
||||
// Rolled a nat 20, screw the bombcap
|
||||
if(result == 20)
|
||||
capped = FALSE
|
||||
result = 24
|
||||
|
||||
var/turf/epicenter = get_turf(src)
|
||||
|
||||
@@ -64,11 +64,26 @@
|
||||
M.update_inv_l_hand()
|
||||
M.update_inv_r_hand()
|
||||
|
||||
/obj/item/flamethrower/can_enter_storage(obj/item/storage/S, mob/user)
|
||||
if(lit)
|
||||
to_chat(user, "<span class='warning'>[S] can't hold [src] while it's lit!</span>")
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/obj/item/flamethrower/afterattack(atom/target, mob/user, flag)
|
||||
. = ..()
|
||||
if(flag)
|
||||
return // too close
|
||||
if(user && user.get_active_hand() == src) // Make sure our user is still holding us
|
||||
if(!user)
|
||||
return
|
||||
if(user.mind?.martial_art?.no_guns)
|
||||
to_chat(user, "<span class='warning'>[user.mind.martial_art.no_guns_message]</span>")
|
||||
return
|
||||
if(HAS_TRAIT(user, TRAIT_CHUNKYFINGERS))
|
||||
to_chat(user, "<span class='warning'>Your meaty finger is far too large for the trigger guard!</span>")
|
||||
return
|
||||
if(user.get_active_hand() == src) // Make sure our user is still holding us
|
||||
var/turf/target_turf = get_turf(target)
|
||||
if(target_turf)
|
||||
var/turflist = getline(user, target_turf)
|
||||
|
||||
@@ -91,8 +91,8 @@
|
||||
/obj/random/figure,
|
||||
/obj/item/toy/minimeteor,
|
||||
/obj/item/toy/redbutton,
|
||||
/obj/item/toy/owl,
|
||||
/obj/item/toy/griffin,
|
||||
/obj/item/toy/figure/owl,
|
||||
/obj/item/toy/figure/griffin,
|
||||
/obj/item/clothing/head/blob,
|
||||
/obj/item/id_decal/gold,
|
||||
/obj/item/id_decal/silver,
|
||||
|
||||
@@ -44,11 +44,9 @@
|
||||
update_mob()
|
||||
playsound(loc, 'sound/effects/empulse.ogg', 50, 1)
|
||||
radiation_pulse(src, rad_damage)
|
||||
for(var/turf/T in view(freeze_range, loc))
|
||||
if(isfloorturf(T))
|
||||
var/turf/simulated/F = T
|
||||
F.MakeSlippery(TURF_WET_PERMAFROST)
|
||||
for(var/mob/living/carbon/L in T)
|
||||
L.adjustStaminaLoss(stamina_damage)
|
||||
L.adjust_bodytemperature(-230)
|
||||
for(var/turf/simulated/floor/T in view(freeze_range, loc))
|
||||
T.MakeSlippery(TURF_WET_ICE)
|
||||
for(var/mob/living/carbon/L in T)
|
||||
L.adjustStaminaLoss(stamina_damage)
|
||||
L.adjust_bodytemperature(-230)
|
||||
qdel(src)
|
||||
|
||||
@@ -561,7 +561,6 @@
|
||||
/obj/item/nullrod/missionary_staff
|
||||
name = "holy staff"
|
||||
desc = "It has a mysterious, protective aura."
|
||||
description_antag = "This seemingly standard holy staff is actually a disguised neurotransmitter capable of inducing blind zealotry in its victims. It must be allowed to recharge in the presence of a linked set of missionary robes. Activate the staff while wearing robes to link, then aim the staff at your victim to try and convert them."
|
||||
reskinned = TRUE
|
||||
reskin_selectable = FALSE
|
||||
icon_state = "godstaff-red"
|
||||
@@ -575,6 +574,10 @@
|
||||
var/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/robes = null //the robes linked with this staff
|
||||
var/faith = 99 //a conversion requires 100 faith to attempt. faith recharges over time while you are wearing missionary robes that have been linked to the staff.
|
||||
|
||||
/obj/item/nullrod/missionary_staff/detailed_examine_antag()
|
||||
return "This seemingly standard holy staff is actually a disguised neurotransmitter capable of inducing blind zealotry in its victims. It must be allowed to recharge in the presence of a linked set of missionary robes. \
|
||||
Activate the staff while wearing robes to link, then aim the staff at your victim to try and convert them."
|
||||
|
||||
/obj/item/nullrod/missionary_staff/New()
|
||||
..()
|
||||
team_color = pick("red", "blue")
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm")
|
||||
qdel(src)
|
||||
if("emp")
|
||||
var/name = prob(50) ? t.name : pick(GLOB.teleportlocs)
|
||||
var/name = prob(50) ? t.name : pick(SSmapping.teleportlocs)
|
||||
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm")
|
||||
else
|
||||
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm")
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
/obj/item/implant/emp/activate()
|
||||
uses--
|
||||
empulse(imp_in, 3, 5, 1)
|
||||
INVOKE_ASYNC(GLOBAL_PROC, .proc/empulse, get_turf(imp_in), 3, 5, 1)
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -29,6 +29,13 @@
|
||||
else
|
||||
turn_off_lighter(user)
|
||||
|
||||
/obj/item/lighter/can_enter_storage(obj/item/storage/S, mob/user)
|
||||
if(lit)
|
||||
to_chat(user, "<span class='warning'>[S] can't hold [src] while it's lit!</span>")
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/obj/item/lighter/proc/turn_on_lighter(mob/living/user)
|
||||
lit = TRUE
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
@@ -227,6 +234,13 @@
|
||||
matchburnout()
|
||||
. = ..()
|
||||
|
||||
/obj/item/match/can_enter_storage(obj/item/storage/S, mob/user)
|
||||
if(lit)
|
||||
to_chat(user, "<span class='warning'>[S] can't hold [initial(name)] while it's lit!</span>") // initial(name) so it doesn't say "lit" twice in a row
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/obj/item/match/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
if(!isliving(M))
|
||||
return ..()
|
||||
|
||||
@@ -125,6 +125,11 @@
|
||||
if(item_color == null)
|
||||
item_color = pick("red", "blue", "green", "purple")
|
||||
|
||||
/obj/item/melee/energy/sword/detailed_examine()
|
||||
return "The energy sword is a very strong melee weapon, capable of severing limbs easily, if they are targeted. It can also has a chance \
|
||||
to block projectiles and melee attacks while it is on and being held. The sword can be toggled on or off by using it in your hand. While it is off, \
|
||||
it can be concealed in your pocket or bag."
|
||||
|
||||
/obj/item/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(active)
|
||||
return ..()
|
||||
|
||||
@@ -89,17 +89,20 @@
|
||||
/mob/living/simple_animal/hostile/poison/bees/,
|
||||
/mob/living/simple_animal/butterfly,
|
||||
/mob/living/simple_animal/cockroach,
|
||||
/obj/item/queen_bee
|
||||
))
|
||||
/obj/item/queen_bee))
|
||||
strong_against -= /mob/living/simple_animal/hostile/poison/bees/syndi // Syndi-bees have special anti-flyswatter tech installed
|
||||
|
||||
/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, proximity_flag)
|
||||
/obj/item/melee/flyswatter/attack(mob/living/M, mob/living/user, def_zone)
|
||||
. = ..()
|
||||
if(proximity_flag)
|
||||
if(is_type_in_typecache(target, strong_against))
|
||||
new /obj/effect/decal/cleanable/insectguts(target.drop_location())
|
||||
to_chat(user, "<span class='warning'>You easily splat [target].</span>")
|
||||
if(istype(target, /mob/living/))
|
||||
var/mob/living/bug = target
|
||||
bug.death(1)
|
||||
else
|
||||
qdel(target)
|
||||
if(!.)
|
||||
return
|
||||
if(is_type_in_typecache(M, strong_against))
|
||||
new /obj/effect/decal/cleanable/insectguts(M.drop_location())
|
||||
user.visible_message("<span class='warning'>[user] splats [M] with [src].</span>",
|
||||
"<span class='warning'>You splat [M] with [src].</span>",
|
||||
"<span class='warning'>You hear a splat.</span>")
|
||||
if(isliving(M))
|
||||
var/mob/living/bug = M
|
||||
bug.death(TRUE)
|
||||
if(!QDELETED(M))
|
||||
qdel(M)
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1))
|
||||
A.clean_blood()
|
||||
for(var/obj/effect/O in A)
|
||||
if(is_cleanable(O))
|
||||
if(O.is_cleanable())
|
||||
qdel(O)
|
||||
reagents.reaction(A, REAGENT_TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly.
|
||||
reagents.remove_any(1) //reaction() doesn't use up the reagents
|
||||
|
||||
@@ -47,12 +47,12 @@
|
||||
|
||||
var/A
|
||||
|
||||
A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in GLOB.teleportlocs
|
||||
A = input(user, "Area to jump to", "BOOYEA", A) as null|anything in SSmapping.teleportlocs
|
||||
|
||||
if(!A)
|
||||
return
|
||||
|
||||
var/area/thearea = GLOB.teleportlocs[A]
|
||||
var/area/thearea = SSmapping.teleportlocs[A]
|
||||
|
||||
if(user.stat || user.restrained())
|
||||
return
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
/obj/item/soap/proc/clean_turf(turf/simulated/T)
|
||||
T.clean_blood()
|
||||
for(var/obj/effect/O in T)
|
||||
if(is_cleanable(O))
|
||||
if(O.is_cleanable())
|
||||
qdel(O)
|
||||
|
||||
/obj/item/soap/attack(mob/target as mob, mob/user as mob)
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
|
||||
/obj/item/stock_parts/matter_bin
|
||||
name = "matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
desc = "A container used to hold compressed matter awaiting re-construction."
|
||||
icon_state = "matter_bin"
|
||||
origin_tech = "materials=1"
|
||||
materials = list(MAT_METAL=80)
|
||||
@@ -145,7 +145,7 @@
|
||||
|
||||
/obj/item/stock_parts/matter_bin/adv
|
||||
name = "advanced matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
desc = "A container used to hold compressed matter awaiting re-construction."
|
||||
icon_state = "advanced_matter_bin"
|
||||
origin_tech = "materials=3"
|
||||
rating = 2
|
||||
@@ -187,7 +187,7 @@
|
||||
|
||||
/obj/item/stock_parts/matter_bin/super
|
||||
name = "super matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
desc = "A container used to hold compressed matter awaiting re-construction."
|
||||
icon_state = "super_matter_bin"
|
||||
origin_tech = "materials=4;engineering=4"
|
||||
rating = 3
|
||||
@@ -229,7 +229,7 @@
|
||||
|
||||
/obj/item/stock_parts/matter_bin/bluespace
|
||||
name = "bluespace matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
desc = "A container used to hold compressed matter awaiting re-construction."
|
||||
icon_state = "bluespace_matter_bin"
|
||||
origin_tech = "materials=6;programming=4;engineering=4"
|
||||
rating = 4
|
||||
|
||||
@@ -230,7 +230,9 @@
|
||||
/obj/item/flashlight/seclite,
|
||||
/obj/item/holosign_creator/security,
|
||||
/obj/item/melee/classic_baton/telescopic,
|
||||
/obj/item/restraints/legcuffs/bola)
|
||||
/obj/item/restraints/legcuffs/bola,
|
||||
/obj/item/clothing/mask/gas/sechailer,
|
||||
/obj/item/spacepod_key)
|
||||
|
||||
/obj/item/storage/belt/security/sec/populate_contents()
|
||||
new /obj/item/flashlight/seclite(src)
|
||||
@@ -407,7 +409,6 @@
|
||||
new /obj/item/soap(src)
|
||||
new /obj/item/grenade/chem_grenade/cleaner(src)
|
||||
new /obj/item/grenade/chem_grenade/cleaner(src)
|
||||
new /obj/item/melee/flyswatter(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/storage/belt/lazarus
|
||||
@@ -447,6 +448,7 @@
|
||||
item_state = "bandolier"
|
||||
storage_slots = 8
|
||||
can_hold = list(/obj/item/ammo_casing/shotgun)
|
||||
display_contents_with_number = TRUE
|
||||
|
||||
/obj/item/storage/belt/bandolier/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -310,6 +310,9 @@
|
||||
if(loc == I)
|
||||
return FALSE //Means the item is already in the storage item
|
||||
|
||||
if(!I.can_enter_storage(src, usr))
|
||||
return FALSE
|
||||
|
||||
if(length(contents) >= storage_slots)
|
||||
if(!stop_messages)
|
||||
to_chat(usr, "<span class='warning'>[I] won't fit in [src], make some space!</span>")
|
||||
|
||||
@@ -71,6 +71,11 @@
|
||||
else
|
||||
. += "<span class='warning'>The baton does not have a power source installed.</span>"
|
||||
|
||||
/obj/item/melee/baton/detailed_examine()
|
||||
return "The baton needs to be turned on to apply the stunning effect. Use it in your hand to toggle it on or off. If your intent is \
|
||||
set to 'harm', you will inflict damage when using it, regardless if it is on or not. Each stun reduces the baton's charge, which can be replenished by \
|
||||
putting it inside a weapon recharger."
|
||||
|
||||
/obj/item/melee/baton/get_cell()
|
||||
return cell
|
||||
|
||||
|
||||
@@ -643,13 +643,13 @@
|
||||
slot_flags = SLOT_BACK
|
||||
force = 5
|
||||
force_unwielded = 5
|
||||
force_wielded = 20
|
||||
force_wielded = 40
|
||||
throwforce = 15
|
||||
throw_range = 1
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
var/charged = 5
|
||||
var/charged = 2
|
||||
origin_tech = "combat=4;bluespace=4;plasmatech=7"
|
||||
|
||||
/obj/item/twohanded/singularityhammer/New()
|
||||
@@ -661,7 +661,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/twohanded/singularityhammer/process()
|
||||
if(charged < 5)
|
||||
if(charged < 2)
|
||||
charged++
|
||||
|
||||
/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
@@ -684,7 +684,7 @@
|
||||
var/obj/item/clothing/shoes/magboots/M = H.shoes
|
||||
if(M.magpulse)
|
||||
continue
|
||||
H.apply_effect(1, WEAKEN, 0)
|
||||
H.Weaken(2)
|
||||
step_towards(H, pull)
|
||||
step_towards(H, pull)
|
||||
step_towards(H, pull)
|
||||
@@ -693,7 +693,7 @@
|
||||
if(!proximity)
|
||||
return
|
||||
if(wielded)
|
||||
if(charged == 5)
|
||||
if(charged == 2)
|
||||
charged = 0
|
||||
if(isliving(A))
|
||||
var/mob/living/Z = A
|
||||
|
||||
@@ -114,6 +114,10 @@
|
||||
machine_name = "Robco Tool Maker"
|
||||
icon_state = "refill_engi"
|
||||
|
||||
/obj/item/vending_refill/youtool
|
||||
machine_name = "YouTool"
|
||||
icon_state = "refill_engi"
|
||||
|
||||
/obj/item/vending_refill/engivend
|
||||
machine_name = "Engi-Vend"
|
||||
icon_state = "refill_engi"
|
||||
|
||||
@@ -363,6 +363,7 @@ a {
|
||||
/obj/proc/cult_reveal() //Called by cult reveal spell and chaplain's bible
|
||||
return
|
||||
|
||||
|
||||
/obj/proc/force_eject_occupant(mob/target)
|
||||
// This proc handles safely removing occupant mobs from the object if they must be teleported out (due to being SSD/AFK, by admin teleport, etc) or transformed.
|
||||
// In the event that the object doesn't have an overriden version of this proc to do it, log a runtime so one can be added.
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
pressure_resistance = 8
|
||||
max_integrity = 300
|
||||
face_while_pulling = TRUE
|
||||
var/climbable
|
||||
var/mob/climber
|
||||
var/broken = FALSE
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/oldloc = loc
|
||||
step(src, direction)
|
||||
if(oldloc != loc)
|
||||
addtimer(CALLBACK(src, .proc/ResetMoveDelay), config.walk_speed)
|
||||
addtimer(CALLBACK(src, .proc/ResetMoveDelay), GLOB.configuration.movement.base_walk_speed)
|
||||
else
|
||||
move_delay = FALSE
|
||||
|
||||
|
||||
@@ -118,7 +118,6 @@
|
||||
new /obj/item/storage/lockbox/mindshield(src)
|
||||
new /obj/item/storage/box/flashbangs(src)
|
||||
new /obj/item/holosign_creator/security(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer/hos(src)
|
||||
new /obj/item/shield/riot/tele(src)
|
||||
new /obj/item/melee/baton/loaded(src)
|
||||
new /obj/item/storage/belt/security/sec(src)
|
||||
|
||||
@@ -71,18 +71,18 @@
|
||||
icon_opened = "fireclosetopen"
|
||||
|
||||
/obj/structure/closet/firecloset/populate_contents()
|
||||
new /obj/item/extinguisher(src)
|
||||
new /obj/item/clothing/suit/fire/firefighter(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/tank/internals/oxygen/red(src)
|
||||
new /obj/item/extinguisher(src)
|
||||
new /obj/item/clothing/head/hardhat/red(src)
|
||||
|
||||
/obj/structure/closet/firecloset/full/populate_contents()
|
||||
new /obj/item/extinguisher(src)
|
||||
new /obj/item/clothing/suit/fire/firefighter(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/flashlight(src)
|
||||
new /obj/item/tank/internals/oxygen/red(src)
|
||||
new /obj/item/extinguisher(src)
|
||||
new /obj/item/clothing/head/hardhat/red(src)
|
||||
|
||||
|
||||
|
||||
@@ -367,6 +367,23 @@
|
||||
newgas.temperature = target_temp
|
||||
return newgas
|
||||
|
||||
/obj/structure/closet/crate/freezer/iv_storage
|
||||
name = "IV storage freezer"
|
||||
desc = "A freezer used to store IV bags containing various blood types."
|
||||
|
||||
/obj/structure/closet/crate/freezer/iv_storage/populate_contents()
|
||||
new /obj/item/reagent_containers/iv_bag/blood/OMinus(src)
|
||||
new /obj/item/reagent_containers/iv_bag/blood/OPlus(src)
|
||||
new /obj/item/reagent_containers/iv_bag/blood/AMinus(src)
|
||||
new /obj/item/reagent_containers/iv_bag/blood/APlus(src)
|
||||
new /obj/item/reagent_containers/iv_bag/blood/BMinus(src)
|
||||
new /obj/item/reagent_containers/iv_bag/blood/BPlus(src)
|
||||
new /obj/item/reagent_containers/iv_bag/blood/random(src)
|
||||
new /obj/item/reagent_containers/iv_bag/blood/random(src)
|
||||
new /obj/item/reagent_containers/iv_bag/blood/random(src)
|
||||
new /obj/item/reagent_containers/iv_bag/salglu(src)
|
||||
new /obj/item/reagent_containers/iv_bag/slime(src)
|
||||
|
||||
/obj/structure/closet/crate/can
|
||||
desc = "A large can, looks like a bin to me."
|
||||
name = "garbage can"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
icon = 'icons/obj/curtain.dmi'
|
||||
name = "curtain"
|
||||
icon_state = "closed"
|
||||
face_while_pulling = FALSE
|
||||
layer = SHOWER_CLOSED_LAYER
|
||||
opacity = 1
|
||||
density = 0
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "A cart for storing engineering items."
|
||||
icon = 'icons/obj/engicart.dmi'
|
||||
icon_state = "cart"
|
||||
face_while_pulling = FALSE
|
||||
anchored = 0
|
||||
density = 1
|
||||
var/obj/item/stack/sheet/glass/myglass = null
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "A cart for transporting food and drinks."
|
||||
icon = 'icons/obj/foodcart.dmi'
|
||||
icon_state = "cart"
|
||||
face_while_pulling = FALSE
|
||||
anchored = 0
|
||||
density = 1
|
||||
//Food slots
|
||||
|
||||
@@ -28,6 +28,11 @@
|
||||
if(GIRDER_DISASSEMBLED)
|
||||
. += "<span class='notice'>[src] is disassembled! You probably shouldn't be able to see this examine message.</span>"
|
||||
|
||||
/obj/structure/girder/detailed_examine()
|
||||
return "Use metal sheets on this to build a normal wall. Adding plasteel instead will make a reinforced wall.<br>\
|
||||
A false wall can be made by using a crowbar on this girder, and then adding metal or plasteel.<br>\
|
||||
You can dismantle the girder with a wrench."
|
||||
|
||||
/obj/structure/girder/proc/refundMetal(metalAmount) //refunds metal used in construction when deconstructed
|
||||
for(var/i=0;i < metalAmount;i++)
|
||||
new metal_type(get_turf(src))
|
||||
@@ -405,6 +410,9 @@
|
||||
girderpasschance = 0
|
||||
max_integrity = 350
|
||||
|
||||
/obj/structure/girder/reinforced/detailed_examine()
|
||||
return "Add another sheet of plasteel to finish."
|
||||
|
||||
/obj/structure/girder/cult
|
||||
name = "runed girder"
|
||||
desc = "Framework made of a strange and shockingly cold metal. It doesn't seem to have any bolts."
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
var/shockcooldown = 0
|
||||
var/my_shockcooldown = 1 SECONDS
|
||||
|
||||
/obj/structure/grille/detailed_examine()
|
||||
return "A powered and knotted wire underneath this will cause the grille to shock anyone not wearing insulated gloves.<br>\
|
||||
Wirecutters will turn the grille into metal rods instantly. Grilles are made with metal rods."
|
||||
|
||||
/obj/structure/grille/fence
|
||||
var/width = 3
|
||||
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
icon_state = "folded_wall"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/inflatable/detailed_examine()
|
||||
return "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb."
|
||||
|
||||
/obj/item/inflatable/attack_self(mob/user)
|
||||
playsound(loc, 'sound/items/zip.ogg', 75, 1)
|
||||
to_chat(user, "<span class='notice'>You inflate [src].</span>")
|
||||
@@ -25,6 +28,9 @@
|
||||
var/torn = /obj/item/inflatable/torn
|
||||
var/intact = /obj/item/inflatable
|
||||
|
||||
/obj/structure/inflatable/detailed_examine()
|
||||
return "To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever."
|
||||
|
||||
/obj/structure/inflatable/Initialize(location)
|
||||
..()
|
||||
air_update_turf(TRUE)
|
||||
@@ -104,6 +110,10 @@
|
||||
var/state = 0 //closed, 1 == open
|
||||
var/isSwitchingStates = 0
|
||||
|
||||
/obj/structure/inflatable/door/detailed_examine()
|
||||
return "Click the door to open or close it. It only stops air while closed.<br>\
|
||||
To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever."
|
||||
|
||||
/obj/structure/inflatable/door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
|
||||
if(isAI(user)) //so the AI can't open it
|
||||
return
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
icon_state = "cart"
|
||||
anchored = 0
|
||||
density = 1
|
||||
face_while_pulling = FALSE
|
||||
container_type = OPENCONTAINER
|
||||
//copypaste sorry
|
||||
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
|
||||
|
||||
@@ -26,6 +26,10 @@
|
||||
. = ..()
|
||||
. += deconstruction_hints(user)
|
||||
|
||||
/obj/structure/lattice/detailed_examine()
|
||||
return "Add a metal floor tile to build a floor on top of the lattice.<br>\
|
||||
Lattices can be made by applying metal rods to a space tile."
|
||||
|
||||
/obj/structure/lattice/proc/deconstruction_hints(mob/user)
|
||||
return "<span class='notice'>The rods look like they could be <b>cut</b>. There's space for more <i>rods</i> or a <i>tile</i>.</span>"
|
||||
|
||||
|
||||
@@ -114,12 +114,9 @@
|
||||
|
||||
if("Body")
|
||||
var/list/race_list = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
|
||||
if(config.usealienwhitelist)
|
||||
for(var/Spec in GLOB.whitelisted_species)
|
||||
if(is_alien_whitelisted(H, Spec))
|
||||
race_list += Spec
|
||||
else
|
||||
race_list += GLOB.whitelisted_species
|
||||
for(var/species in GLOB.whitelisted_species)
|
||||
if(is_alien_whitelisted(H, species))
|
||||
race_list += species
|
||||
|
||||
var/datum/ui_module/appearance_changer/AC = ui_users[user]
|
||||
if(!AC)
|
||||
|
||||
@@ -286,33 +286,34 @@
|
||||
/obj/structure/sign/medbay/alt
|
||||
icon_state = "bluecross2"
|
||||
|
||||
/obj/structure/sign/directions
|
||||
name = "direction sign"
|
||||
|
||||
/obj/structure/sign/directions/bridge
|
||||
desc = "A direction sign, pointing out which way the Bridge is."
|
||||
icon_state = "direction_bridge"
|
||||
|
||||
/obj/structure/sign/directions/science
|
||||
name = "\improper Research Division"
|
||||
desc = "A direction sign, pointing out which way the Research Division is."
|
||||
icon_state = "direction_sci"
|
||||
|
||||
/obj/structure/sign/directions/engineering
|
||||
name = "\improper Engineering Department"
|
||||
desc = "A direction sign, pointing out which way the Engineering Department is."
|
||||
icon_state = "direction_eng"
|
||||
|
||||
/obj/structure/sign/directions/security
|
||||
name = "\improper Security Department"
|
||||
desc = "A direction sign, pointing out which way the Security Department is."
|
||||
icon_state = "direction_sec"
|
||||
|
||||
/obj/structure/sign/directions/medical
|
||||
name = "\improper Medical Bay"
|
||||
desc = "A direction sign, pointing out which way Medical Bay is."
|
||||
desc = "A direction sign, pointing out which way the Medical Bay is."
|
||||
icon_state = "direction_med"
|
||||
|
||||
/obj/structure/sign/directions/evac
|
||||
name = "\improper Escape Arm"
|
||||
desc = "A direction sign, pointing out which way Escape Shuttle Dock is."
|
||||
desc = "A direction sign, pointing out which way the Escape Shuttle Dock is."
|
||||
icon_state = "direction_evac"
|
||||
|
||||
/obj/structure/sign/directions/cargo
|
||||
name = "\improper Cargo Department"
|
||||
desc = "A direction sign, pointing out which way the Cargo Department is."
|
||||
icon_state = "direction_supply"
|
||||
|
||||
|
||||
@@ -86,15 +86,3 @@
|
||||
name = "basilisk den"
|
||||
desc = "A den housing a nest of basilisks, bring a coat."
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk)
|
||||
|
||||
/obj/structure/spawner/headcrab
|
||||
name = "headcrab nest"
|
||||
desc = "A living nest for headcrabs. It is moving ominously."
|
||||
icon_state = "headcrab_nest"
|
||||
icon = 'icons/mob/headcrab.dmi'
|
||||
max_integrity = 200
|
||||
max_mobs = 15
|
||||
spawn_time = 600
|
||||
mob_types = list(/mob/living/simple_animal/hostile/headcrab, /mob/living/simple_animal/hostile/headcrab/fast, /mob/living/simple_animal/hostile/headcrab/poison)
|
||||
spawn_text = "crawls out of"
|
||||
faction = list("hostile")
|
||||
|
||||
@@ -25,6 +25,12 @@
|
||||
buckle_offset = -6
|
||||
var/comfort = 2 // default comfort
|
||||
|
||||
/obj/structure/bed/detailed_examine()
|
||||
return "Click and drag yourself (or anyone) to this to buckle in. Click on this with an empty hand to undo the buckles.<br>\
|
||||
<br>\
|
||||
Anyone with restraints, such as handcuffs, will not be able to unbuckle themselves. They must use the Resist button, or verb, to break free of \
|
||||
the buckles, instead."
|
||||
|
||||
/obj/structure/bed/psych
|
||||
name = "psych bed"
|
||||
desc = "For prime comfort during psychiatric evaluations."
|
||||
@@ -64,6 +70,7 @@
|
||||
name = "roller bed"
|
||||
icon = 'icons/obj/rollerbed.dmi'
|
||||
icon_state = "down"
|
||||
face_while_pulling = FALSE
|
||||
resistance_flags = NONE
|
||||
anchored = FALSE
|
||||
comfort = 1
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
max_integrity = 250
|
||||
integrity_failure = 25
|
||||
buckle_offset = 0
|
||||
face_while_pulling = FALSE
|
||||
var/buildstacktype = /obj/item/stack/sheet/metal
|
||||
var/buildstackamount = 1
|
||||
var/item_chair = /obj/item/chair // if null it can't be picked up
|
||||
@@ -116,7 +117,7 @@
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(config.ghost_interaction)
|
||||
if(GLOB.configuration.general.ghost_interaction)
|
||||
setDir(turn(dir, 90))
|
||||
handle_rotation()
|
||||
return
|
||||
|
||||
@@ -404,7 +404,7 @@
|
||||
tile.water_act(100, convertHeat(), src)
|
||||
tile.clean_blood(radiation_clean = TRUE)
|
||||
for(var/obj/effect/E in tile)
|
||||
if(is_cleanable(E))
|
||||
if(E.is_cleanable())
|
||||
qdel(E)
|
||||
for(var/A in loc)
|
||||
wash(A)
|
||||
|
||||
Reference in New Issue
Block a user