mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-26 05:26:24 +01:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into polaris-sync-2018-02-16
# Conflicts: # code/_onclick/hud/screen_objects.dm # code/game/objects/items/weapons/storage/storage.dm # code/game/objects/structures/crates_lockers/closets/secure/medical.dm # code/modules/admin/admin_verbs.dm # code/modules/clothing/clothing.dm # code/modules/clothing/gloves/color.dm # code/modules/lore_codex/codex.dm # code/modules/mob/living/simple_animal/aliens/alien.dm # code/modules/mob/living/simple_animal/animals/cat.dm # code/modules/mob/living/simple_animal/animals/goose.dm # code/modules/mob/living/simple_animal/simple_animal.dm # code/modules/mob/mob_defines.dm # code/modules/projectiles/projectile/special.dm # html/changelogs/.all_changelog.yml # maps/southern_cross/southern_cross-1.dmm # maps/southern_cross/southern_cross-7.dmm # vorestation.dme
This commit is contained in:
@@ -821,6 +821,9 @@ proc/GaussRandRound(var/sigma,var/roundto)
|
||||
for(var/mob/M in T)
|
||||
if(istype(M, /mob/observer/eye)) continue // If we need to check for more mobs, I'll add a variable
|
||||
M.loc = X
|
||||
if(istype(M, /mob/living))
|
||||
var/mob/living/LM = M
|
||||
LM.check_shadow() // Need to check their Z-shadow, which is normally done in forceMove().
|
||||
|
||||
if(shuttlework)
|
||||
var/turf/simulated/shuttle/SS = T
|
||||
|
||||
@@ -416,7 +416,7 @@
|
||||
|
||||
/datum/category_item/autolathe/arms/knuckledusters
|
||||
name = "knuckle dusters"
|
||||
path =/obj/item/weapon/material/knuckledusters
|
||||
path =/obj/item/clothing/gloves/knuckledusters
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/tacknife
|
||||
|
||||
@@ -116,7 +116,7 @@ var/global/repository/radiation/radiation_repository = new()
|
||||
else if(O.density) //So open doors don't get counted
|
||||
var/material/M = O.get_material()
|
||||
if(!M) continue
|
||||
cached_rad_resistance += M.radiation_resistance
|
||||
cached_rad_resistance += M.weight + M.radiation_resistance
|
||||
// Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana
|
||||
radiation_repository.resistance_cache[src] = (length(contents) + 1)
|
||||
|
||||
|
||||
@@ -61,3 +61,17 @@
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "Pizza crate"
|
||||
|
||||
/datum/supply_packs/hospitality/gifts
|
||||
name = "Gift crate"
|
||||
contains = list(
|
||||
/obj/item/toy/bouquet = 3,
|
||||
/obj/item/weapon/storage/fancy/heartbox = 2,
|
||||
/obj/item/weapon/paper/card/smile,
|
||||
/obj/item/weapon/paper/card/heart,
|
||||
/obj/item/weapon/paper/card/cat,
|
||||
/obj/item/weapon/paper/card/flower
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "crate of gifts"
|
||||
@@ -0,0 +1,81 @@
|
||||
/datum/wires/mines
|
||||
wire_count = 6
|
||||
random = 1
|
||||
holder_type = /obj/effect/mine
|
||||
|
||||
#define WIRE_DETONATE 1
|
||||
#define WIRE_TIMED_DET 2
|
||||
#define WIRE_DISARM 4
|
||||
#define WIRE_DUMMY_1 8
|
||||
#define WIRE_DUMMY_2 16
|
||||
#define WIRE_BADDISARM 32
|
||||
|
||||
/datum/wires/mines/GetInteractWindow()
|
||||
. = ..()
|
||||
. += "<br>\n["Warning: detonation may occur even with proper equipment."]"
|
||||
return .
|
||||
|
||||
/datum/wires/mines/proc/explode()
|
||||
return
|
||||
|
||||
/datum/wires/mines/UpdateCut(var/index, var/mended)
|
||||
var/obj/effect/mine/C = holder
|
||||
|
||||
switch(index)
|
||||
if(WIRE_DETONATE)
|
||||
C.visible_message("\icon[C] *BEEE-*", "\icon[C] *BEEE-*")
|
||||
C.explode()
|
||||
|
||||
if(WIRE_TIMED_DET)
|
||||
C.visible_message("\icon[C] *BEEE-*", "\icon[C] *BEEE-*")
|
||||
C.explode()
|
||||
|
||||
if(WIRE_DISARM)
|
||||
C.visible_message("\icon[C] *click!*", "\icon[C] *click!*")
|
||||
new C.mineitemtype(get_turf(C))
|
||||
spawn(0)
|
||||
qdel(C)
|
||||
return
|
||||
|
||||
if(WIRE_DUMMY_1)
|
||||
return
|
||||
|
||||
|
||||
if(WIRE_DUMMY_2)
|
||||
return
|
||||
|
||||
if(WIRE_BADDISARM)
|
||||
C.visible_message("\icon[C] *BEEPBEEPBEEP*", "\icon[C] *BEEPBEEPBEEP*")
|
||||
spawn(20)
|
||||
C.explode()
|
||||
return
|
||||
|
||||
/datum/wires/mines/UpdatePulsed(var/index)
|
||||
var/obj/effect/mine/C = holder
|
||||
if(IsIndexCut(index))
|
||||
return
|
||||
switch(index)
|
||||
if(WIRE_DETONATE)
|
||||
C.visible_message("\icon[C] *beep*", "\icon[C] *beep*")
|
||||
|
||||
if(WIRE_TIMED_DET)
|
||||
C.visible_message("\icon[C] *BEEPBEEPBEEP*", "\icon[C] *BEEPBEEPBEEP*")
|
||||
spawn(20)
|
||||
C.explode()
|
||||
|
||||
if(WIRE_DISARM)
|
||||
C.visible_message("\icon[C] *ping*", "\icon[C] *ping*")
|
||||
|
||||
if(WIRE_DUMMY_1)
|
||||
C.visible_message("\icon[C] *ping*", "\icon[C] *ping*")
|
||||
|
||||
if(WIRE_DUMMY_2)
|
||||
C.visible_message("\icon[C] *beep*", "\icon[C] *beep*")
|
||||
|
||||
if(WIRE_BADDISARM)
|
||||
C.visible_message("\icon[C] *ping*", "\icon[C] *ping*")
|
||||
return
|
||||
|
||||
/datum/wires/mines/CanUse(var/mob/living/L)
|
||||
var/obj/effect/mine/M = holder
|
||||
return M.panel_open
|
||||
@@ -52,7 +52,11 @@
|
||||
if (danger_level == 0)
|
||||
atmosphere_alarm.clearAlarm(src, alarm_source)
|
||||
else
|
||||
atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
|
||||
var/obj/machinery/alarm/atmosalarm = alarm_source //maybe other things can trigger these, who knows
|
||||
if(istype(atmosalarm))
|
||||
atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level, hidden = atmosalarm.alarms_hidden)
|
||||
else
|
||||
atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
|
||||
|
||||
//Check all the alarms before lowering atmosalm. Raising is perfectly fine.
|
||||
for (var/obj/machinery/alarm/AA in src)
|
||||
|
||||
@@ -389,6 +389,7 @@
|
||||
/atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0)
|
||||
if( istype(src, /turf/simulated) )
|
||||
var/obj/effect/decal/cleanable/vomit/this = new /obj/effect/decal/cleanable/vomit(src)
|
||||
this.virus2 = virus_copylist(M.virus2)
|
||||
|
||||
// Make toxins vomit look different
|
||||
if(toxvomit)
|
||||
|
||||
@@ -277,6 +277,9 @@ var/global/list/changeling_fabricated_clothing = list(
|
||||
/obj/item/weapon/card/id/syndicate/changeling/New(mob/user as mob)
|
||||
..()
|
||||
registered_user = user
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/changeling/initialize()
|
||||
. = ..()
|
||||
access = null
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/changeling/verb/shred()
|
||||
|
||||
@@ -41,8 +41,8 @@
|
||||
/mob/living/simple_animal/hostile/malf_drone,
|
||||
/mob/living/simple_animal/hostile/giant_spider,
|
||||
/mob/living/simple_animal/hostile/hivebot,
|
||||
/mob/living/simple_animal/hostile/diyaab, //Doubt these will get used but might as well,
|
||||
/mob/living/simple_animal/hostile/samak,
|
||||
/mob/living/simple_animal/retaliate/diyaab, //Doubt these will get used but might as well,
|
||||
/mob/living/simple_animal/hostile/savik,
|
||||
/mob/living/simple_animal/hostile/shantak
|
||||
)
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
on_created_text = "<span class='warning'>You start to glow very brightly!</span>"
|
||||
on_expired_text = "<span class='notice'>Your glow has ended.</span>"
|
||||
evasion = -2
|
||||
evasion = -30
|
||||
stacks = MODIFIER_STACK_EXTEND
|
||||
|
||||
/datum/modifier/technomancer/corona/tick()
|
||||
|
||||
@@ -24,5 +24,5 @@
|
||||
|
||||
on_created_text = "<span class='notice'>You have a repulsion field around you, which will attempt to deflect projectiles.</span>"
|
||||
on_expired_text = "<span class='warning'>Your repulsion field has expired.</span>"
|
||||
evasion = 3
|
||||
evasion = 45
|
||||
stacks = MODIFIER_STACK_EXTEND
|
||||
@@ -23,6 +23,7 @@
|
||||
if(sleepernew)
|
||||
sleeper = sleepernew
|
||||
sleepernew.console = src
|
||||
set_dir(get_dir(src, sleepernew))
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
@@ -230,9 +230,11 @@
|
||||
// Loop through every direction
|
||||
for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction
|
||||
bodyscannernew = locate(/obj/machinery/bodyscanner, get_step(src, dir)) // Try to find a scanner in that direction
|
||||
if(bodyscannernew)
|
||||
scanner = bodyscannernew
|
||||
bodyscannernew.console = src
|
||||
if(bodyscannernew)
|
||||
scanner = bodyscannernew
|
||||
bodyscannernew.console = src
|
||||
set_dir(get_dir(src, bodyscannernew))
|
||||
return
|
||||
return
|
||||
|
||||
/obj/machinery/body_scanconsole/attack_ai(user as mob)
|
||||
|
||||
@@ -81,6 +81,8 @@
|
||||
|
||||
var/report_danger_level = 1
|
||||
|
||||
var/alarms_hidden = FALSE //If the alarms from this machine are visible on consoles
|
||||
|
||||
/obj/machinery/alarm/nobreach
|
||||
breach_detection = 0
|
||||
|
||||
@@ -88,6 +90,9 @@
|
||||
report_danger_level = 0
|
||||
breach_detection = 0
|
||||
|
||||
/obj/machinery/alarm/alarms_hidden
|
||||
alarms_hidden = TRUE
|
||||
|
||||
/obj/machinery/alarm/server/New()
|
||||
..()
|
||||
req_access = list(access_rd, access_atmospherics, access_engine_equip)
|
||||
@@ -813,6 +818,10 @@ FIRE ALARM
|
||||
panel_open = 0
|
||||
var/seclevel
|
||||
circuit = /obj/item/weapon/circuitboard/firealarm
|
||||
var/alarms_hidden = FALSE //If the alarms from this machine are visible on consoles
|
||||
|
||||
/obj/machinery/firealarm/alarms_hidden
|
||||
alarms_hidden = TRUE
|
||||
|
||||
/obj/machinery/firealarm/update_icon()
|
||||
overlays.Cut()
|
||||
@@ -981,7 +990,7 @@ FIRE ALARM
|
||||
return
|
||||
var/area/area = get_area(src)
|
||||
for(var/obj/machinery/firealarm/FA in area)
|
||||
fire_alarm.triggerAlarm(loc, FA, duration)
|
||||
fire_alarm.triggerAlarm(loc, FA, duration, hidden = alarms_hidden)
|
||||
update_icon()
|
||||
playsound(src.loc, 'sound/machines/airalarm.ogg', 25, 0, 4)
|
||||
return
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
return
|
||||
if(default_part_replacement(user, O))
|
||||
return
|
||||
if(default_unfasten_wrench(user, O, 40))
|
||||
return
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/glass))
|
||||
if(beaker)
|
||||
user << "<span class='notice'>]The [src] is already loaded.</span>"
|
||||
|
||||
@@ -44,6 +44,8 @@
|
||||
return
|
||||
if(default_part_replacement(user, O))
|
||||
return
|
||||
if(default_unfasten_wrench(user, O, 20))
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/organ_printer/update_icon()
|
||||
|
||||
@@ -27,7 +27,8 @@
|
||||
/obj/item/toy/waterflower = 1,
|
||||
/obj/random/action_figure = 1,
|
||||
/obj/random/plushie = 1,
|
||||
/obj/item/toy/cultsword = 1
|
||||
/obj/item/toy/cultsword = 1,
|
||||
/obj/item/toy/bouquet/fake = 1
|
||||
)
|
||||
|
||||
/obj/machinery/computer/arcade/New()
|
||||
|
||||
@@ -54,8 +54,8 @@
|
||||
expired = 1
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/card/id/guest/New()
|
||||
..()
|
||||
/obj/item/weapon/card/id/guest/initialize()
|
||||
. = ..()
|
||||
processing_objects.Add(src)
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -29,6 +29,9 @@
|
||||
/obj/machinery/lapvend/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
var/obj/item/weapon/card/id/I = W.GetID()
|
||||
|
||||
if(default_unfasten_wrench(user, W, 20))
|
||||
return
|
||||
|
||||
if(vendmode == 1 && I)
|
||||
scan_id(I, W)
|
||||
vendmode = 0
|
||||
|
||||
@@ -551,15 +551,15 @@
|
||||
for(var/I in req_components)
|
||||
if(istype(P, I) && (req_components[I] > 0))
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
if(istype(P, /obj/item/stack/material/glass/reinforced))
|
||||
var/obj/item/stack/material/glass/reinforced/CP = P
|
||||
if(CP.get_amount() > 1)
|
||||
var/camt = min(CP.amount, req_components[I]) // amount of glass to take, idealy amount required, but limited by amount provided
|
||||
var/obj/item/stack/material/glass/reinforced/CC = new /obj/item/stack/material/glass/reinforced(src)
|
||||
CC.amount = camt
|
||||
CC.update_icon()
|
||||
CP.use(camt)
|
||||
components += CC
|
||||
if(istype(P, /obj/item/stack))
|
||||
var/obj/item/stack/ST = P
|
||||
if(ST.get_amount() > 1)
|
||||
var/camt = min(ST.amount, req_components[I]) // amount of stack to take, idealy amount required, but limited by amount provided
|
||||
var/obj/item/stack/NS = new ST.stacktype(src)
|
||||
NS.amount = camt
|
||||
NS.update_icon()
|
||||
ST.use(camt)
|
||||
components += NS
|
||||
req_components[I] -= camt
|
||||
update_desc()
|
||||
break
|
||||
|
||||
@@ -50,6 +50,9 @@
|
||||
user << "<span class='warning'>\The [src] is running!</span>"
|
||||
return
|
||||
|
||||
if(default_unfasten_wrench(user, I, 20))
|
||||
return
|
||||
|
||||
// We are trying to cook a grabbed mob.
|
||||
var/obj/item/weapon/grab/G = I
|
||||
if(istype(G))
|
||||
|
||||
@@ -92,6 +92,9 @@
|
||||
/obj/machinery/gibber/attackby(var/obj/item/W, var/mob/user)
|
||||
var/obj/item/weapon/grab/G = W
|
||||
|
||||
if(default_unfasten_wrench(user, W, 40))
|
||||
return
|
||||
|
||||
if(!istype(G))
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
src.icon_state = "mw"
|
||||
src.broken = 0 // Fix it!
|
||||
src.dirty = 0 // just to be sure
|
||||
src.flags = OPENCONTAINER
|
||||
src.flags = OPENCONTAINER | NOREACT
|
||||
else
|
||||
user << "<span class='warning'>It's broken!</span>"
|
||||
return 1
|
||||
@@ -95,6 +95,8 @@
|
||||
return
|
||||
else if(default_deconstruction_crowbar(user, O))
|
||||
return
|
||||
else if(default_unfasten_wrench(user, O, 10))
|
||||
return
|
||||
|
||||
else if(src.dirty==100) // The microwave is all dirty so can't be used!
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them
|
||||
@@ -110,7 +112,7 @@
|
||||
src.dirty = 0 // It's clean!
|
||||
src.broken = 0 // just to be sure
|
||||
src.icon_state = "mw"
|
||||
src.flags = OPENCONTAINER
|
||||
src.flags = OPENCONTAINER | NOREACT
|
||||
else //Otherwise bad luck!!
|
||||
user << "<span class='warning'>It's dirty!</span>"
|
||||
return 1
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
var/locked = 0
|
||||
var/scan_id = 1
|
||||
var/is_secure = 0
|
||||
var/wrenchable = 0
|
||||
var/datum/wires/smartfridge/wires = null
|
||||
|
||||
/obj/machinery/smartfridge/secure
|
||||
@@ -128,6 +129,7 @@
|
||||
/obj/machinery/smartfridge/drying_rack
|
||||
name = "\improper Drying Rack"
|
||||
desc = "A machine for drying plants."
|
||||
wrenchable = 1
|
||||
icon_state = "drying_rack"
|
||||
icon_on = "drying_rack_on"
|
||||
icon_off = "drying_rack"
|
||||
@@ -217,6 +219,9 @@
|
||||
nanomanager.update_uis(src)
|
||||
return
|
||||
|
||||
if(wrenchable && default_unfasten_wrench(user, O, 20))
|
||||
return
|
||||
|
||||
if(istype(O, /obj/item/device/multitool)||istype(O, /obj/item/weapon/wirecutters))
|
||||
if(panel_open)
|
||||
attack_hand(user)
|
||||
|
||||
@@ -112,7 +112,7 @@ Class Procs:
|
||||
var/panel_open = 0
|
||||
var/global/gl_uid = 1
|
||||
var/interact_offline = 0 // Can the machine be interacted with while de-powered.
|
||||
var/circuit = null
|
||||
var/obj/item/weapon/circuitboard/circuit = null
|
||||
|
||||
/obj/machinery/New(l, d=0)
|
||||
..(l)
|
||||
@@ -402,7 +402,7 @@ Class Procs:
|
||||
if(A.frame_type.circuit)
|
||||
A.need_circuit = 0
|
||||
|
||||
if(A.frame_type.frame_class == "machine")
|
||||
if(A.frame_type.frame_class == FRAME_CLASS_MACHINE)
|
||||
for(var/obj/D in component_parts)
|
||||
D.forceMove(src.loc)
|
||||
if(A.components)
|
||||
@@ -412,15 +412,15 @@ Class Procs:
|
||||
component_parts = list()
|
||||
A.check_components()
|
||||
|
||||
if(A.frame_type.frame_class == "alarm")
|
||||
A.state = 2
|
||||
else if(A.frame_type.frame_class == "computer" || A.frame_type.frame_class == "display")
|
||||
if(A.frame_type.frame_class == FRAME_CLASS_ALARM)
|
||||
A.state = FRAME_FASTENED
|
||||
else if(A.frame_type.frame_class == FRAME_CLASS_COMPUTER || A.frame_type.frame_class == FRAME_CLASS_DISPLAY)
|
||||
if(stat & BROKEN)
|
||||
A.state = 3
|
||||
A.state = FRAME_WIRED
|
||||
else
|
||||
A.state = 4
|
||||
A.state = FRAME_PANELED
|
||||
else
|
||||
A.state = 3
|
||||
A.state = FRAME_WIRED
|
||||
|
||||
A.set_dir(dir)
|
||||
A.pixel_x = pixel_x
|
||||
@@ -430,4 +430,4 @@ Class Procs:
|
||||
M.loc = null
|
||||
M.deconstruct(src)
|
||||
qdel(src)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -105,16 +105,25 @@
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
|
||||
// In case they somehow end up with positive values for otherwise unobtainable damage...
|
||||
if(H.getToxLoss()>0) H.adjustToxLoss(-(rand(1,3)))
|
||||
if(H.getOxyLoss()>0) H.adjustOxyLoss(-(rand(1,3)))
|
||||
if(H.getCloneLoss()>0) H.adjustCloneLoss(-(rand(1,3)))
|
||||
if(H.getBrainLoss()>0) H.adjustBrainLoss(-(rand(1,3)))
|
||||
if(H.getToxLoss() > 0)
|
||||
H.adjustToxLoss(-(rand(1,3)))
|
||||
if(H.getOxyLoss() > 0)
|
||||
H.adjustOxyLoss(-(rand(1,3)))
|
||||
if(H.getCloneLoss() > 0)
|
||||
H.adjustCloneLoss(-(rand(1,3)))
|
||||
if(H.getBrainLoss() > 0)
|
||||
H.adjustBrainLoss(-(rand(1,3)))
|
||||
|
||||
// Also recharge their internal battery.
|
||||
if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450)
|
||||
H.nutrition = min(H.nutrition+10, 450)
|
||||
cell.use(7000/450*10)
|
||||
|
||||
// And clear up radiation
|
||||
if(H.radiation > 0)
|
||||
H.radiation = max(H.radiation - rand(5, 15), 0)
|
||||
|
||||
|
||||
/obj/machinery/recharge_station/examine(mob/user)
|
||||
..(user)
|
||||
user << "The charge meter reads: [round(chargepercentage())]%"
|
||||
|
||||
@@ -40,4 +40,7 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob
|
||||
user << "<span class='notice'>You extract some seeds from the grass tile.</span>"
|
||||
new /obj/item/seeds/grassseed(loc)
|
||||
|
||||
else if(default_unfasten_wrench(user, O, 20))
|
||||
return
|
||||
|
||||
return
|
||||
@@ -88,6 +88,8 @@
|
||||
return
|
||||
if(default_deconstruction_crowbar(user, W))
|
||||
return
|
||||
if(default_unfasten_wrench(user, W, 40))
|
||||
return
|
||||
/*if(istype(W,/obj/item/weapon/screwdriver))
|
||||
panel = !panel
|
||||
user << "<span class='notice'>You [panel ? "open" : "close"] the [src]'s maintenance panel</span>"*/
|
||||
|
||||
@@ -247,3 +247,9 @@ var/global/list/image/splatter_cache=list()
|
||||
/obj/effect/decal/cleanable/mucus/New()
|
||||
spawn(DRYING_TIME * 2)
|
||||
dry=1
|
||||
|
||||
//This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry
|
||||
/obj/effect/decal/cleanable/mucus/mapped/New()
|
||||
...()
|
||||
virus2 = new /datum/disease2/disease
|
||||
virus2.makerandom()
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "vomit_1"
|
||||
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
|
||||
var/list/datum/disease2/disease/virus2 = list()
|
||||
|
||||
/obj/effect/decal/cleanable/tomato_smudge
|
||||
name = "tomato smudge"
|
||||
|
||||
@@ -1,105 +1,274 @@
|
||||
/obj/effect/mine
|
||||
name = "Mine"
|
||||
desc = "I Better stay away from that thing."
|
||||
density = 1
|
||||
name = "land mine" //The name and description are deliberately NOT modified, so you can't game the mines you find.
|
||||
desc = "A small explosive land mine."
|
||||
density = 0
|
||||
anchored = 1
|
||||
layer = 3
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "uglymine"
|
||||
var/triggerproc = "explode" //name of the proc thats called when the mine is triggered
|
||||
var/triggered = 0
|
||||
var/smoke_strength = 3
|
||||
var/mineitemtype = /obj/item/weapon/mine
|
||||
var/panel_open = 0
|
||||
var/datum/wires/mines/wires = null
|
||||
|
||||
/obj/effect/mine/New()
|
||||
icon_state = "uglyminearmed"
|
||||
wires = new(src)
|
||||
|
||||
/obj/effect/mine/proc/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks.
|
||||
visible_message("\The [src.name] detonates!")
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/bullet_act()
|
||||
if(prob(50))
|
||||
explode()
|
||||
|
||||
/obj/effect/mine/ex_act(severity)
|
||||
if(severity <= 2 || prob(50))
|
||||
explode()
|
||||
..()
|
||||
|
||||
/obj/effect/mine/Crossed(AM as mob|obj)
|
||||
Bumped(AM)
|
||||
|
||||
/obj/effect/mine/Bumped(mob/M as mob|obj)
|
||||
|
||||
if(triggered) return
|
||||
if(triggered)
|
||||
return
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
for(var/mob/O in viewers(world.view, src.loc))
|
||||
O << "<font color='red'>[M] triggered the \icon[src] [src]</font>"
|
||||
triggered = 1
|
||||
call(src,triggerproc)(M)
|
||||
if(istype(M, /mob/living/))
|
||||
if(!M.hovering)
|
||||
explode(M)
|
||||
|
||||
/obj/effect/mine/proc/triggerrad(obj)
|
||||
/obj/effect/mine/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
if(isscrewdriver(W))
|
||||
panel_open = !panel_open
|
||||
user.visible_message("<span class='warning'>[user] very carefully screws the mine's panel [panel_open ? "open" : "closed"].</span>",
|
||||
"<span class='notice'>You very carefully screw the mine's panel [panel_open ? "open" : "closed"].</span>")
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
|
||||
else if((iswirecutter(W) || ismultitool(W)) && panel_open)
|
||||
interact(user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/effect/mine/interact(mob/living/user as mob)
|
||||
if(!panel_open || istype(user, /mob/living/silicon/ai))
|
||||
return
|
||||
user.set_machine(src)
|
||||
wires.Interact(user)
|
||||
|
||||
/obj/effect/mine/dnascramble
|
||||
mineitemtype = /obj/item/weapon/mine/dnascramble
|
||||
|
||||
/obj/effect/mine/dnascramble/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(M)
|
||||
M.radiation += 50
|
||||
randmutb(M)
|
||||
domutcheck(M,null)
|
||||
visible_message("\The [src.name] flashes violently before disintegrating!")
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/stun
|
||||
mineitemtype = /obj/item/weapon/mine/stun
|
||||
|
||||
/obj/effect/mine/stun/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
obj:radiation += 50
|
||||
randmutb(obj)
|
||||
domutcheck(obj,null)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/triggerstun(obj)
|
||||
if(ismob(obj))
|
||||
var/mob/M = obj
|
||||
if(M)
|
||||
M.Stun(30)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
visible_message("\The [src.name] flashes violently before disintegrating!")
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/triggern2o(obj)
|
||||
//example: n2o triggerproc
|
||||
//note: im lazy
|
||||
/obj/effect/mine/n2o
|
||||
mineitemtype = /obj/item/weapon/mine/n2o
|
||||
|
||||
/obj/effect/mine/n2o/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
for (var/turf/simulated/floor/target in range(1,src))
|
||||
if(!target.blocks_air)
|
||||
target.assume_gas("sleeping_agent", 30)
|
||||
|
||||
visible_message("\The [src.name] detonates!")
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/triggerphoron(obj)
|
||||
/obj/effect/mine/phoron
|
||||
mineitemtype = /obj/item/weapon/mine/phoron
|
||||
|
||||
/obj/effect/mine/phoron/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
for (var/turf/simulated/floor/target in range(1,src))
|
||||
if(!target.blocks_air)
|
||||
target.assume_gas("phoron", 30)
|
||||
|
||||
target.hotspot_expose(1000, CELL_VOLUME)
|
||||
|
||||
visible_message("\The [src.name] detonates!")
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/triggerkick(obj)
|
||||
/obj/effect/mine/kick
|
||||
mineitemtype = /obj/item/weapon/mine/kick
|
||||
|
||||
/obj/effect/mine/kick/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(M)
|
||||
qdel(M.client)
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/frag
|
||||
mineitemtype = /obj/item/weapon/mine/frag
|
||||
var/fragment_types = list(/obj/item/projectile/bullet/pellet/fragment)
|
||||
var/num_fragments = 20 //total number of fragments produced by the grenade
|
||||
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
|
||||
var/spread_range = 7
|
||||
|
||||
/obj/effect/mine/frag/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
var/turf/O = get_turf(src)
|
||||
if(!O)
|
||||
return
|
||||
src.fragmentate(O, 20, 7, list(/obj/item/projectile/bullet/pellet/fragment)) //only 20 weak fragments because you're stepping directly on it
|
||||
visible_message("\The [src.name] detonates!")
|
||||
spawn(0)
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/training //Name and Desc commented out so it's possible to trick people with the training mines
|
||||
// name = "training mine"
|
||||
// desc = "A mine with its payload removed, for EOD training and demonstrations."
|
||||
mineitemtype = /obj/item/weapon/mine/training
|
||||
|
||||
/obj/effect/mine/training/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
visible_message("\The [src.name]'s light flashes rapidly as it 'explodes'.")
|
||||
new src.mineitemtype(get_turf(src))
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/emp
|
||||
mineitemtype = /obj/item/weapon/mine/emp
|
||||
|
||||
/obj/effect/mine/emp/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
qdel(obj:client)
|
||||
visible_message("\The [src.name] flashes violently before disintegrating!")
|
||||
empulse(loc, 2, 4, 7, 10, 1) // As strong as an EMP grenade
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/explode(obj)
|
||||
explosion(loc, 0, 1, 2, 3)
|
||||
/obj/effect/mine/incendiary
|
||||
mineitemtype = /obj/item/weapon/mine/incendiary
|
||||
|
||||
/obj/effect/mine/incendiary/explode(var/mob/living/M)
|
||||
triggered = 1
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(M)
|
||||
M.adjust_fire_stacks(5)
|
||||
M.fire_act()
|
||||
visible_message("\The [src.name] bursts into flames!")
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/dnascramble
|
||||
name = "Radiation Mine"
|
||||
/////////////////////////////////////////////
|
||||
// The held item version of the above mines
|
||||
/////////////////////////////////////////////
|
||||
/obj/item/weapon/mine
|
||||
name = "mine"
|
||||
desc = "A small explosive mine with 'HE' and a grenade symbol on the side."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "uglymine"
|
||||
triggerproc = "triggerrad"
|
||||
var/countdown = 10
|
||||
var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime.
|
||||
|
||||
/obj/effect/mine/phoron
|
||||
name = "Phoron Mine"
|
||||
icon_state = "uglymine"
|
||||
triggerproc = "triggerphoron"
|
||||
/obj/item/weapon/mine/attack_self(mob/user as mob) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times
|
||||
add_fingerprint(user)
|
||||
msg_admin_attack("[user.name] ([user.ckey]) primed \a [src] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
user.visible_message("[user] starts priming \the [src.name].", "You start priming \the [src.name]. Hold still!")
|
||||
if(do_after(user, 10 SECONDS))
|
||||
playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
|
||||
prime(user)
|
||||
else
|
||||
visible_message("[user] triggers \the [src.name]!", "You accidentally trigger \the [src.name]!")
|
||||
prime(user, TRUE)
|
||||
return
|
||||
|
||||
/obj/effect/mine/kick
|
||||
name = "Kick Mine"
|
||||
icon_state = "uglymine"
|
||||
triggerproc = "triggerkick"
|
||||
/obj/item/weapon/mine/proc/prime(mob/user as mob, var/explode_now = FALSE)
|
||||
visible_message("\The [src.name] beeps as the priming sequence completes.")
|
||||
var/obj/effect/mine/R = new minetype(get_turf(src))
|
||||
src.transfer_fingerprints_to(R)
|
||||
R.add_fingerprint(user)
|
||||
if(explode_now)
|
||||
R.explode(user)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/n2o
|
||||
name = "N2O Mine"
|
||||
icon_state = "uglymine"
|
||||
triggerproc = "triggern2o"
|
||||
/obj/item/weapon/mine/dnascramble
|
||||
name = "radiation mine"
|
||||
desc = "A small explosive mine with a radiation symbol on the side."
|
||||
minetype = /obj/effect/mine/dnascramble
|
||||
|
||||
/obj/effect/mine/stun
|
||||
name = "Stun Mine"
|
||||
icon_state = "uglymine"
|
||||
triggerproc = "triggerstun"
|
||||
/obj/item/weapon/mine/phoron
|
||||
name = "incendiary mine"
|
||||
desc = "A small explosive mine with a fire symbol on the side."
|
||||
minetype = /obj/effect/mine/phoron
|
||||
|
||||
/obj/item/weapon/mine/kick
|
||||
name = "kick mine"
|
||||
desc = "Concentrated war crimes. Handle with care."
|
||||
minetype = /obj/effect/mine/kick
|
||||
|
||||
/obj/item/weapon/mine/n2o
|
||||
name = "nitrous oxide mine"
|
||||
desc = "A small explosive mine with three Z's on the side."
|
||||
minetype = /obj/effect/mine/n2o
|
||||
|
||||
/obj/item/weapon/mine/stun
|
||||
name = "stun mine"
|
||||
desc = "A small explosive mine with a lightning bolt symbol on the side."
|
||||
minetype = /obj/effect/mine/stun
|
||||
|
||||
/obj/item/weapon/mine/frag
|
||||
name = "fragmentation mine"
|
||||
desc = "A small explosive mine with 'FRAG' and a grenade symbol on the side."
|
||||
minetype = /obj/effect/mine/frag
|
||||
|
||||
/obj/item/weapon/mine/training
|
||||
name = "training mine"
|
||||
desc = "A mine with its payload removed, for EOD training and demonstrations."
|
||||
minetype = /obj/effect/mine/training
|
||||
|
||||
/obj/item/weapon/mine/emp
|
||||
name = "emp mine"
|
||||
desc = "A small explosive mine with a lightning bolt symbol on the side."
|
||||
minetype = /obj/effect/mine/emp
|
||||
|
||||
/obj/item/weapon/mine/incendiary
|
||||
name = "incendiary mine"
|
||||
desc = "A small explosive mine with a fire symbol on the side."
|
||||
minetype = /obj/effect/mine/incendiary
|
||||
+681
-658
File diff suppressed because it is too large
Load Diff
@@ -44,7 +44,7 @@
|
||||
|
||||
if(paddles && paddles.loc == src) //in case paddles got destroyed somehow.
|
||||
new_overlays += "[initial(icon_state)]-paddles"
|
||||
if(bcell)
|
||||
if(bcell && paddles)
|
||||
if(bcell.check_charge(paddles.chargecost))
|
||||
if(paddles.combat)
|
||||
new_overlays += "[initial(icon_state)]-combat"
|
||||
|
||||
@@ -80,7 +80,7 @@ var/list/GPS_list = list()
|
||||
|
||||
var/turf/curr = get_turf(src)
|
||||
var/area/my_area = get_area(src)
|
||||
dat += "Current location: [my_area.name] <b>([curr.x], [curr.y], [curr.z])</b>"
|
||||
dat += "Current location: [my_area.name] <b>([curr.x], [curr.y], [using_map.get_zlevel_name(curr.z)])</b>"
|
||||
dat += "[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'. <a href='?src=\ref[src];tag=1'>\[Change Tag\]</a> \
|
||||
<a href='?src=\ref[src];range=1'>\[Toggle Scan Range\]</a> \
|
||||
[can_hide_signal ? "<a href='?src=\ref[src];hide=1'>\[Toggle Signal Visibility\]</a>":""]"
|
||||
@@ -103,16 +103,17 @@ var/list/GPS_list = list()
|
||||
var/area_name = their_area.name
|
||||
if(istype(their_area, /area/submap))
|
||||
area_name = "Unknown Area" // Avoid spoilers.
|
||||
var/coord = "[T.x], [T.y], [T.z]"
|
||||
var/degrees = round(Get_Angle(curr, T))
|
||||
var/Z_name = using_map.get_zlevel_name(T.z)
|
||||
var/direction = uppertext(dir2text(get_dir(curr, T)))
|
||||
var/distance = get_dist(curr, T)
|
||||
var/local = curr.z == T.z ? TRUE : FALSE
|
||||
if(!direction)
|
||||
direction = "CENTER"
|
||||
degrees = "N/A"
|
||||
|
||||
signals += " [G.gps_tag]: [area_name] ([coord]) [local ? "Dist: [distance]m Dir: [degrees]° ([direction])":""]"
|
||||
if(istype(T, /obj/item/device/gps/internal/poi))
|
||||
signals += " [G.gps_tag]: [area_name] [local ? "Dist: [round(distance, 10)]m [direction])" : "in \the [Z_name]"]"
|
||||
else
|
||||
signals += " [G.gps_tag]: [area_name] [local ? "Dist: [round(distance, 10)]m [direction])" : "in \the [Z_name]"]"
|
||||
|
||||
if(signals.len)
|
||||
dat += "Detected signals;"
|
||||
@@ -179,15 +180,6 @@ var/list/GPS_list = list()
|
||||
/obj/item/device/gps/explorer/on
|
||||
tracking = TRUE
|
||||
|
||||
/obj/item/device/gps/syndie
|
||||
icon_state = "gps-syndie"
|
||||
gps_tag = "NULL"
|
||||
desc = "A positioning system that has extended range and can detect other GPS device signals without revealing its own. How that works is best left a mystery. Alt+click to toggle power."
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2)
|
||||
long_range = TRUE
|
||||
hide_signal = TRUE
|
||||
can_hide_signal = TRUE
|
||||
|
||||
/obj/item/device/gps/robot
|
||||
icon_state = "gps-b"
|
||||
gps_tag = "SYNTH0"
|
||||
@@ -207,6 +199,72 @@ var/list/GPS_list = list()
|
||||
gps_tag = "NT_BASE"
|
||||
desc = "A homing signal from NanoTrasen's outpost."
|
||||
|
||||
/obj/item/device/gps/internal/alien_vessel
|
||||
gps_tag = "Mysterious Signal"
|
||||
desc = "A signal that seems forboding."
|
||||
/obj/item/device/gps/internal/poi
|
||||
gps_tag = "Unidentified Signal"
|
||||
desc = "A signal that seems forboding."
|
||||
|
||||
/obj/item/device/gps/syndie
|
||||
icon_state = "gps-syndie"
|
||||
gps_tag = "NULL"
|
||||
desc = "A positioning system that has extended range and can detect other GPS device signals without revealing its own. How that works is best left a mystery. Alt+click to toggle power."
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2)
|
||||
long_range = TRUE
|
||||
hide_signal = TRUE
|
||||
can_hide_signal = TRUE
|
||||
|
||||
/obj/item/device/gps/syndie/display(mob/user)
|
||||
if(!tracking)
|
||||
to_chat(user, "The device is off. Alt-click it to turn it on.")
|
||||
return
|
||||
if(emped)
|
||||
to_chat(user, "It's busted!")
|
||||
return
|
||||
|
||||
var/list/dat = list()
|
||||
|
||||
var/turf/curr = get_turf(src)
|
||||
var/area/my_area = get_area(src)
|
||||
dat += "Current location: [my_area.name] <b>([curr.x], [curr.y], [using_map.get_zlevel_name(curr.z)])</b>"
|
||||
dat += "[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'. <a href='?src=\ref[src];tag=1'>\[Change Tag\]</a> \
|
||||
<a href='?src=\ref[src];range=1'>\[Toggle Scan Range\]</a> \
|
||||
[can_hide_signal ? "<a href='?src=\ref[src];hide=1'>\[Toggle Signal Visibility\]</a>":""]"
|
||||
|
||||
var/list/signals = list()
|
||||
|
||||
for(var/gps in GPS_list)
|
||||
var/obj/item/device/gps/G = gps
|
||||
if(G.emped || !G.tracking || G.hide_signal || G == src) // Their GPS isn't on or functional.
|
||||
continue
|
||||
var/turf/T = get_turf(G)
|
||||
var/z_level_detection = using_map.get_map_levels(curr.z, long_range)
|
||||
|
||||
if(local_mode && T.z != curr.z) // Only care about the current z-level.
|
||||
continue
|
||||
else if(!(T.z in z_level_detection)) // Too far away.
|
||||
continue
|
||||
|
||||
var/area/their_area = get_area(G)
|
||||
var/area_name = their_area.name
|
||||
if(istype(their_area, /area/submap))
|
||||
area_name = "Unknown Area" // Avoid spoilers.
|
||||
var/Z_name = using_map.get_zlevel_name(T.z)
|
||||
var/coord = "[T.x], [T.y], [Z_name]"
|
||||
var/degrees = round(Get_Angle(curr, T))
|
||||
var/direction = uppertext(dir2text(get_dir(curr, T)))
|
||||
var/distance = get_dist(curr, T)
|
||||
var/local = curr.z == T.z ? TRUE : FALSE
|
||||
if(!direction)
|
||||
direction = "CENTER"
|
||||
degrees = "N/A"
|
||||
|
||||
signals += " [G.gps_tag]: [area_name] ([coord]) [local ? "Dist: [distance]m Dir: [degrees]° ([direction])":""]"
|
||||
|
||||
if(signals.len)
|
||||
dat += "Detected signals;"
|
||||
for(var/line in signals)
|
||||
dat += line
|
||||
else
|
||||
dat += "No other signals detected."
|
||||
|
||||
var/result = dat.Join("<br>")
|
||||
to_chat(user, result)
|
||||
|
||||
@@ -109,9 +109,9 @@
|
||||
suit.icon_override = new_icon_override_file
|
||||
S.icon_override = new_icon_override_file
|
||||
to_chat(user, "You set about modifying the suit into [suit].")
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(H))
|
||||
suit.species_restricted = list(H.species.get_bodytype(H))
|
||||
// var/mob/living/carbon/human/H = user
|
||||
// if(istype(H))
|
||||
// suit.species_restricted = list(H.species.get_bodytype(H)) Does not quite make sense for something usually very pliable.
|
||||
else
|
||||
var/obj/item/clothing/suit/space/void/suit = I
|
||||
suit.name = "[new_name] voidsuit"
|
||||
|
||||
@@ -54,6 +54,8 @@
|
||||
/obj/item/borg/sight/material
|
||||
name = "\proper material scanner vision"
|
||||
sight_mode = BORGMATERIAL
|
||||
icon_state = "material"
|
||||
icon = 'icons/obj/clothing/glasses.dmi'
|
||||
|
||||
/obj/item/borg/sight/hud
|
||||
name = "hud"
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
icon_state = "rods"
|
||||
|
||||
var/global/list/datum/stack_recipe/rods_recipes = list( \
|
||||
new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1),
|
||||
new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 0),
|
||||
new/datum/stack_recipe("catwalk", /obj/structure/catwalk, 2, time = 80, one_per_turf = 1, on_floor = 1))
|
||||
|
||||
/obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob)
|
||||
@@ -44,7 +44,7 @@ var/global/list/datum/stack_recipe/rods_recipes = list( \
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
|
||||
if(get_amount() < 2)
|
||||
user << "<span class='warning'>You need at least two rods to do this.</span>"
|
||||
to_chat(user, "<span class='warning'>You need at least two rods to do this.</span>")
|
||||
return
|
||||
|
||||
if(WT.remove_fuel(0,user))
|
||||
@@ -91,15 +91,15 @@ var/global/list/datum/stack_recipe/rods_recipes = list( \
|
||||
|
||||
else if(!in_use)
|
||||
if(get_amount() < 2)
|
||||
user << "<span class='warning'>You need at least two rods to do this.</span>"
|
||||
to_chat(user, "<span class='warning'>You need at least two rods to do this.</span>")
|
||||
return
|
||||
usr << "<span class='notice'>Assembling grille...</span>"
|
||||
to_chat(usr, "<span class='notice'>Assembling grille...</span>")
|
||||
in_use = 1
|
||||
if (!do_after(usr, 10))
|
||||
in_use = 0
|
||||
return
|
||||
var/obj/structure/grille/F = new /obj/structure/grille/ ( usr.loc )
|
||||
usr << "<span class='notice'>You assemble a grille</span>"
|
||||
to_chat(usr, "<span class='notice'>You assemble a grille</span>")
|
||||
in_use = 0
|
||||
F.add_fingerprint(usr)
|
||||
use(2)
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
* Action figures
|
||||
* Plushies
|
||||
* Toy cult sword
|
||||
* Bouquets
|
||||
*/
|
||||
|
||||
|
||||
@@ -872,6 +873,19 @@
|
||||
w_class = ITEMSIZE_LARGE
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "poked")
|
||||
|
||||
//Flowers fake & real
|
||||
|
||||
/obj/item/toy/bouquet
|
||||
name = "bouquet"
|
||||
desc = "A lovely bouquet of flowers. Smells nice!"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "bouquet"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
/obj/item/toy/bouquet/fake
|
||||
name = "plastic bouquet"
|
||||
desc = "A cheap plastic bouquet of flowers. Smells like cheap, toxic plastic."
|
||||
|
||||
/* NYET.
|
||||
/obj/item/weapon/toddler
|
||||
icon_state = "toddler"
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
//These bone objects are mostly for mapping and decoration. They have no actual medical use, so maybe don't try to put them in anybody.
|
||||
/obj/item/weapon/bone
|
||||
name = "bone"
|
||||
desc = "A non-descript bone. It's so old and worn you can barely tell which part of the body it's from."
|
||||
icon = 'icons/obj/bones.dmi'
|
||||
icon_state = "bone"
|
||||
force = 5
|
||||
throwforce = 6
|
||||
item_state = "bone"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked", "bonked", "boned")
|
||||
|
||||
/obj/item/weapon/bone/skull
|
||||
name = "skull"
|
||||
desc = "A skull. Judging by the shape and size, you'd guess that it might be human."
|
||||
icon_state = "skull"
|
||||
throwforce = 7
|
||||
|
||||
/obj/item/weapon/bone/skull/tajaran
|
||||
desc = "A skull. Judging by the shape and size, you'd guess that it might be tajaran."
|
||||
icon_state = "tajskull"
|
||||
|
||||
/obj/item/weapon/bone/skull/unathi
|
||||
desc = "A skull. Judging by the shape and size, you'd guess that it might be unathi."
|
||||
icon_state = "unaskull"
|
||||
|
||||
/obj/item/weapon/bone/skull/unknown
|
||||
desc = "A skull. You're not sure what species it might be, though."
|
||||
icon_state = "xenoskull"
|
||||
|
||||
/obj/item/weapon/bone/arm
|
||||
name = "arm bone"
|
||||
desc = "Wielding this, you're armed and dangerous, no bones about it."
|
||||
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked", "bonked", "boned", "slapped", "punched")
|
||||
icon_state = "arm"
|
||||
|
||||
/obj/item/weapon/bone/leg
|
||||
name = "leg bone"
|
||||
desc = "Don't worry about getting into an argument with the owner of this. They don't have a leg to stand on."
|
||||
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked", "bonked", "boned", "kicked")
|
||||
icon_state = "leg"
|
||||
|
||||
/obj/item/weapon/bone/ribs
|
||||
name = "ribcage"
|
||||
desc = "If you had some mallets, you could probably use this as a makeshift xylophone."
|
||||
icon_state = "ribs"
|
||||
@@ -70,3 +70,41 @@
|
||||
lit = 0
|
||||
update_icon()
|
||||
set_light(0)
|
||||
|
||||
/obj/item/weapon/flame/candle/candelabra
|
||||
name = "candelabra"
|
||||
desc = "a small gold candelabra. The cups that hold the candles save some of the wax from dripping off, allowing the candles to burn longer."
|
||||
icon = 'icons/obj/candle.dmi'
|
||||
icon_state = "candelabra"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
wax = 20000
|
||||
|
||||
/obj/item/weapon/flame/candle/candelabra/update_icon()
|
||||
if(wax == 0)
|
||||
icon_state = "candelabra_melted"
|
||||
else
|
||||
icon_state = "candelabra[lit ? "_lit" : ""]"
|
||||
|
||||
/obj/item/weapon/flame/candle/everburn
|
||||
wax = 99999
|
||||
|
||||
/obj/item/weapon/flame/candle/everburn/New()
|
||||
if(!src.lit)
|
||||
src.lit = 1
|
||||
//src.damtype = "fire"
|
||||
for(var/mob/O in viewers(usr, null))
|
||||
O.show_message("<span class='notice'>\The [name] mysteriously lights itself!.</span>", 1)
|
||||
set_light(CANDLE_LUM)
|
||||
processing_objects.Add(src)
|
||||
|
||||
/obj/item/weapon/flame/candle/candelabra/everburn
|
||||
wax = 99999
|
||||
|
||||
/obj/item/weapon/flame/candle/candelabra/everburn/New()
|
||||
if(!src.lit)
|
||||
src.lit = 1
|
||||
//src.damtype = "fire"
|
||||
for(var/mob/O in viewers(usr, null))
|
||||
O.show_message("<span class='notice'>\The [name] mysteriously lights itself!.</span>", 1)
|
||||
set_light(CANDLE_LUM)
|
||||
processing_objects.Add(src)
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
origin_tech = list(TECH_POWER = 6, TECH_ENGINEERING = 4)
|
||||
req_components = list(/obj/item/weapon/smes_coil = 1, /obj/item/stack/cable_coil = 30)
|
||||
|
||||
/obj/item/weapon/circuitboard/smes/construct(var/obj/machinery/power/smes/buildable/S)
|
||||
if(..(S))
|
||||
S.output_attempt = 0 //built SMES default to off
|
||||
|
||||
/obj/item/weapon/circuitboard/batteryrack
|
||||
name = T_BOARD("battery rack PSU")
|
||||
build_path = /obj/machinery/power/smes/batteryrack
|
||||
|
||||
@@ -112,15 +112,11 @@
|
||||
usr << "The fingerprint hash on the card is [fingerprint_hash]."
|
||||
return
|
||||
|
||||
/obj/item/weapon/card/id/New()
|
||||
..()
|
||||
var/datum/job/jobdatum
|
||||
for(var/jobtype in typesof(/datum/job))
|
||||
var/datum/job/J = new jobtype
|
||||
if(J.title == rank)
|
||||
jobdatum = J
|
||||
access = jobdatum.get_access()
|
||||
return
|
||||
/obj/item/weapon/card/id/initialize()
|
||||
. = ..()
|
||||
var/datum/job/J = job_master.GetJob(rank)
|
||||
if(J)
|
||||
access = J.get_access()
|
||||
|
||||
/obj/item/weapon/card/id/silver
|
||||
name = "identification card"
|
||||
@@ -163,8 +159,8 @@
|
||||
item_state = "tdgreen"
|
||||
assignment = "Synthetic"
|
||||
|
||||
/obj/item/weapon/card/id/synthetic/New()
|
||||
..()
|
||||
/obj/item/weapon/card/id/synthetic/initialize()
|
||||
. = ..()
|
||||
access = get_all_station_access() + access_synth
|
||||
|
||||
/obj/item/weapon/card/id/centcom
|
||||
@@ -174,12 +170,12 @@
|
||||
registered_name = "Central Command"
|
||||
assignment = "General"
|
||||
|
||||
/obj/item/weapon/card/id/centcom/New()
|
||||
/obj/item/weapon/card/id/centcom/initialize()
|
||||
. = ..()
|
||||
access = get_all_centcom_access()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/card/id/centcom/station/New()
|
||||
..()
|
||||
/obj/item/weapon/card/id/centcom/station/initialize()
|
||||
. = ..()
|
||||
access |= get_all_station_access()
|
||||
|
||||
/obj/item/weapon/card/id/centcom/ERT
|
||||
@@ -187,8 +183,8 @@
|
||||
assignment = "Emergency Response Team"
|
||||
icon_state = "centcom"
|
||||
|
||||
/obj/item/weapon/card/id/centcom/ERT/New()
|
||||
..()
|
||||
/obj/item/weapon/card/id/centcom/ERT/initialize()
|
||||
. = ..()
|
||||
access |= get_all_station_access()
|
||||
|
||||
// Department-flavor IDs
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
var/electronic_warfare = 1
|
||||
var/mob/registered_user = null
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/New(mob/user as mob)
|
||||
..()
|
||||
/obj/item/weapon/card/id/syndicate/initialize()
|
||||
. = ..()
|
||||
access = syndicate_access.Copy()
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/station_access/New()
|
||||
..() // Same as the normal Syndicate id, only already has all station access
|
||||
/obj/item/weapon/card/id/syndicate/station_access/initialize()
|
||||
. = ..() // Same as the normal Syndicate id, only already has all station access
|
||||
access |= get_all_station_access()
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/Destroy()
|
||||
|
||||
@@ -8,17 +8,6 @@
|
||||
force_divisor = 0.3 // 18 with hardness 60 (steel)
|
||||
attack_verb = list("jabbed","stabbed","ripped")
|
||||
|
||||
/obj/item/weapon/material/knuckledusters
|
||||
name = "knuckle dusters"
|
||||
desc = "A pair of brass knuckles. Generally used to enhance the user's punches."
|
||||
icon_state = "knuckledusters"
|
||||
gender = PLURAL
|
||||
w_class = ITEMSIZE_SMALL
|
||||
force_divisor = 0.63
|
||||
dulled_divisor = 0.75 //It's a heavy bit of metal
|
||||
attack_verb = list("punched", "beaten", "struck")
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/item/weapon/material/knife/machete/hatchet
|
||||
name = "hatchet"
|
||||
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
/obj/item/weapon/material/twohanded/update_held_icon()
|
||||
var/mob/living/M = loc
|
||||
if(istype(M) && !issmall(M) && M.item_is_in_hands(src) && !M.hands_are_full())
|
||||
if(istype(M) && M.can_wield_item(src) && is_held_twohanded(M))
|
||||
wielded = 1
|
||||
force = force_wielded
|
||||
name = "[base_name] (wielded)"
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
* Candle Box
|
||||
* Crayon Box
|
||||
* Cigarette Box
|
||||
* Vial Box
|
||||
* Box of Chocolates
|
||||
*/
|
||||
|
||||
/obj/item/weapon/storage/fancy/
|
||||
@@ -313,3 +315,34 @@
|
||||
/obj/item/weapon/storage/lockbox/vials/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/*
|
||||
* Box of Chocolates/Heart Box
|
||||
*/
|
||||
|
||||
/obj/item/weapon/storage/fancy/heartbox
|
||||
icon_state = "heartbox"
|
||||
name = "box of chocolates"
|
||||
var/startswith = 6
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 6
|
||||
can_hold = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatepiece,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/white,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/truffle
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/fancy/heartbox/New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/white(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/white(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/chocolatepiece/truffle(src)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/fancy/heartbox/update_icon(var/itemremoved = 0)
|
||||
if (contents.len == 0)
|
||||
icon_state = "heartbox_empty"
|
||||
return
|
||||
@@ -87,7 +87,7 @@
|
||||
if(!can_place)
|
||||
return
|
||||
|
||||
if(!H || !src || !H.organs_by_name[BP_HEAD] || !H.has_eyes() || H.glasses || (H.head && (H.head.body_parts_covered & FACE)))
|
||||
if(!H || !src || !H.organs_by_name[BP_HEAD] || !H.check_has_mouth() || (H.head && (H.head.body_parts_covered & FACE)))
|
||||
return
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user] has taped up \the [H]'s mouth!</span>")
|
||||
|
||||
@@ -216,7 +216,7 @@
|
||||
//prob(6);/obj/item/weapon/material/butterflyhandle,
|
||||
//prob(6);/obj/item/weapon/material/wirerod,
|
||||
prob(2);/obj/item/weapon/material/butterfly/switchblade,
|
||||
prob(2);/obj/item/weapon/material/knuckledusters,
|
||||
prob(2);/obj/item/clothing/gloves/knuckledusters,
|
||||
prob(1);/obj/item/weapon/material/knife/tacknife,
|
||||
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
|
||||
prob(1);/obj/item/weapon/beartrap,
|
||||
@@ -1133,4 +1133,18 @@ var/list/multi_point_spawns
|
||||
/obj/item/clothing/suit/space/void/mining/alt,
|
||||
/obj/item/clothing/head/helmet/space/void/mining/alt
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
/obj/random/landmine
|
||||
name = "Random Land Mine"
|
||||
desc = "This is a random land mine."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "uglymine"
|
||||
spawn_nothing_percentage = 25
|
||||
|
||||
/obj/random/landmine/item_to_spawn()
|
||||
return pick(prob(30);/obj/effect/mine,
|
||||
prob(25);/obj/effect/mine/frag,
|
||||
prob(25);/obj/effect/mine/emp,
|
||||
prob(10);/obj/effect/mine/stun,
|
||||
prob(10);/obj/effect/mine/incendiary,)
|
||||
@@ -38,7 +38,7 @@
|
||||
..()
|
||||
new /obj/item/clothing/suit/bio_suit/security(src)
|
||||
new /obj/item/clothing/head/bio_hood/security(src)
|
||||
|
||||
new /obj/item/weapon/gun/energy/taser/xeno/sec(src)
|
||||
|
||||
/obj/structure/closet/l3closet/janitor
|
||||
icon_state = "bio_janitor"
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
req_access = list(access_medical)
|
||||
|
||||
|
||||
New()
|
||||
/obj/structure/closet/secure_closet/medical1/New()
|
||||
..()
|
||||
new /obj/item/weapon/storage/box/autoinjectors(src)
|
||||
new /obj/item/weapon/storage/box/syringes(src)
|
||||
@@ -38,7 +38,7 @@
|
||||
req_access = list(access_surgery)
|
||||
|
||||
|
||||
New()
|
||||
/obj/structure/closet/secure_closet/medical2/New()
|
||||
..()
|
||||
new /obj/item/weapon/tank/anesthetic(src)
|
||||
new /obj/item/weapon/tank/anesthetic(src)
|
||||
@@ -60,63 +60,63 @@
|
||||
icon_broken = "securemedbroken"
|
||||
icon_off = "securemedoff"
|
||||
|
||||
New()
|
||||
..()
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/backpack/medic(src)
|
||||
else
|
||||
new /obj/item/weapon/storage/backpack/satchel/med(src)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/backpack/dufflebag/med(src)
|
||||
new /obj/item/clothing/under/rank/nursesuit (src)
|
||||
new /obj/item/clothing/head/nursehat (src)
|
||||
switch(pick("blue", "green", "purple", "black", "navyblue"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
if ("green")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/green(src)
|
||||
new /obj/item/clothing/head/surgery/green(src)
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
if ("black")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/black(src)
|
||||
new /obj/item/clothing/head/surgery/black(src)
|
||||
if ("navyblue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
|
||||
new /obj/item/clothing/head/surgery/navyblue(src)
|
||||
switch(pick("blue", "green", "purple", "black", "navyblue"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
if ("green")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/green(src)
|
||||
new /obj/item/clothing/head/surgery/green(src)
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
if ("black")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/black(src)
|
||||
new /obj/item/clothing/head/surgery/black(src)
|
||||
if ("navyblue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
|
||||
new /obj/item/clothing/head/surgery/navyblue(src)
|
||||
new /obj/item/clothing/under/rank/medical(src)
|
||||
new /obj/item/clothing/under/rank/nurse(src)
|
||||
new /obj/item/clothing/under/rank/orderly(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/fr_jacket(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
new /obj/item/weapon/cartridge/medical(src)
|
||||
new /obj/item/device/radio/headset/headset_med(src)
|
||||
new /obj/item/device/radio/headset/headset_med/alt(src)
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
|
||||
new /obj/item/clothing/shoes/boots/winter/medical(src)
|
||||
new /obj/item/weapon/storage/box/freezer(src)
|
||||
new /obj/item/weapon/storage/box/freezer(src)
|
||||
new /obj/item/weapon/storage/box/freezer(src)
|
||||
return
|
||||
/obj/structure/closet/secure_closet/medical3/New()
|
||||
..()
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/backpack/medic(src)
|
||||
else
|
||||
new /obj/item/weapon/storage/backpack/satchel/med(src)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/backpack/dufflebag/med(src)
|
||||
new /obj/item/clothing/under/rank/nursesuit (src)
|
||||
new /obj/item/clothing/head/nursehat (src)
|
||||
switch(pick("blue", "green", "purple", "black", "navyblue"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
if ("green")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/green(src)
|
||||
new /obj/item/clothing/head/surgery/green(src)
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
if ("black")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/black(src)
|
||||
new /obj/item/clothing/head/surgery/black(src)
|
||||
if ("navyblue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
|
||||
new /obj/item/clothing/head/surgery/navyblue(src)
|
||||
switch(pick("blue", "green", "purple", "black", "navyblue"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
if ("green")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/green(src)
|
||||
new /obj/item/clothing/head/surgery/green(src)
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
if ("black")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/black(src)
|
||||
new /obj/item/clothing/head/surgery/black(src)
|
||||
if ("navyblue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
|
||||
new /obj/item/clothing/head/surgery/navyblue(src)
|
||||
new /obj/item/clothing/under/rank/medical(src)
|
||||
new /obj/item/clothing/under/rank/nurse(src)
|
||||
new /obj/item/clothing/under/rank/orderly(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/fr_jacket(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
new /obj/item/weapon/cartridge/medical(src)
|
||||
new /obj/item/device/radio/headset/headset_med(src)
|
||||
new /obj/item/device/radio/headset/headset_med/alt(src)
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
|
||||
new /obj/item/clothing/shoes/boots/winter/medical(src)
|
||||
new /obj/item/weapon/storage/box/freezer(src)
|
||||
new /obj/item/weapon/storage/box/freezer(src)
|
||||
new /obj/item/weapon/storage/box/freezer(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/secure_closet/paramedic
|
||||
name = "paramedic locker"
|
||||
@@ -130,7 +130,7 @@
|
||||
req_access = list(access_medical_equip)
|
||||
|
||||
|
||||
New()
|
||||
/obj/structure/closet/secure_closet/paramedic/New()
|
||||
..()
|
||||
new /obj/item/weapon/storage/backpack/dufflebag/emt(src)
|
||||
new /obj/item/weapon/storage/box/autoinjectors(src)
|
||||
@@ -167,51 +167,51 @@
|
||||
icon_broken = "cmosecurebroken"
|
||||
icon_off = "cmosecureoff"
|
||||
|
||||
New()
|
||||
..()
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/backpack/medic(src)
|
||||
else
|
||||
new /obj/item/weapon/storage/backpack/satchel/med(src)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/backpack/dufflebag/med(src)
|
||||
new /obj/item/clothing/suit/bio_suit/cmo(src)
|
||||
new /obj/item/clothing/head/bio_hood/cmo(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
switch(pick("blue", "green", "purple", "black", "navyblue"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
if ("green")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/green(src)
|
||||
new /obj/item/clothing/head/surgery/green(src)
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
if ("black")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/black(src)
|
||||
new /obj/item/clothing/head/surgery/black(src)
|
||||
if ("navyblue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
|
||||
new /obj/item/clothing/head/surgery/navyblue(src)
|
||||
new /obj/item/clothing/under/rank/chief_medical_officer(src)
|
||||
new /obj/item/clothing/under/rank/chief_medical_officer/skirt(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt(src)
|
||||
new /obj/item/weapon/cartridge/cmo(src)
|
||||
new /obj/item/clothing/gloves/sterile/latex(src)
|
||||
new /obj/item/clothing/shoes/brown (src)
|
||||
new /obj/item/device/radio/headset/heads/cmo(src)
|
||||
new /obj/item/device/radio/headset/heads/cmo/alt(src)
|
||||
new /obj/item/device/flash(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/vial(src)
|
||||
new /obj/item/weapon/reagent_containers/glass/beaker/vial(src) //VOREStation Edit - An extra vial for the hypo
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
|
||||
new /obj/item/clothing/shoes/boots/winter/medical(src)
|
||||
new /obj/item/weapon/storage/box/freezer(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/taperoll/medical(src)
|
||||
return
|
||||
/obj/structure/closet/secure_closet/CMO/New()
|
||||
..()
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/backpack/medic(src)
|
||||
else
|
||||
new /obj/item/weapon/storage/backpack/satchel/med(src)
|
||||
if(prob(50))
|
||||
new /obj/item/weapon/storage/backpack/dufflebag/med(src)
|
||||
new /obj/item/clothing/suit/bio_suit/cmo(src)
|
||||
new /obj/item/clothing/head/bio_hood/cmo(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
switch(pick("blue", "green", "purple", "black", "navyblue"))
|
||||
if ("blue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs(src)
|
||||
new /obj/item/clothing/head/surgery/blue(src)
|
||||
if ("green")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/green(src)
|
||||
new /obj/item/clothing/head/surgery/green(src)
|
||||
if ("purple")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/purple(src)
|
||||
new /obj/item/clothing/head/surgery/purple(src)
|
||||
if ("black")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/black(src)
|
||||
new /obj/item/clothing/head/surgery/black(src)
|
||||
if ("navyblue")
|
||||
new /obj/item/clothing/under/rank/medical/scrubs/navyblue(src)
|
||||
new /obj/item/clothing/head/surgery/navyblue(src)
|
||||
new /obj/item/clothing/under/rank/chief_medical_officer(src)
|
||||
new /obj/item/clothing/under/rank/chief_medical_officer/skirt(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt(src)
|
||||
new /obj/item/weapon/cartridge/cmo(src)
|
||||
new /obj/item/clothing/gloves/sterile/latex(src)
|
||||
new /obj/item/clothing/shoes/brown (src)
|
||||
new /obj/item/device/radio/headset/heads/cmo(src)
|
||||
new /obj/item/device/radio/headset/heads/cmo/alt(src)
|
||||
new /obj/item/device/flash(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/vial(src)
|
||||
new /obj/item/weapon/reagent_containers/glass/beaker/vial(src) //VOREStation Edit - An extra vial for the hypo
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat/medical(src)
|
||||
new /obj/item/clothing/shoes/boots/winter/medical(src)
|
||||
new /obj/item/weapon/storage/box/freezer(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/taperoll/medical(src)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
req_access = list(access_surgery)
|
||||
|
||||
|
||||
New()
|
||||
/obj/structure/closet/secure_closet/animal/New()
|
||||
..()
|
||||
new /obj/item/device/assembly/signaler(src)
|
||||
new /obj/item/device/radio/electropack(src)
|
||||
@@ -242,7 +242,7 @@
|
||||
req_access = list(access_chemistry)
|
||||
|
||||
|
||||
New()
|
||||
/obj/structure/closet/secure_closet/chemical/New()
|
||||
..()
|
||||
new /obj/item/clothing/under/rank/psych(src)
|
||||
new /obj/item/clothing/under/rank/psych/turtleneck(src)
|
||||
@@ -285,7 +285,7 @@
|
||||
req_access = list(access_psychiatrist)
|
||||
|
||||
|
||||
New()
|
||||
/obj/structure/closet/secure_closet/psych/New()
|
||||
..()
|
||||
new /obj/item/clothing/under/rank/psych(src)
|
||||
new /obj/item/clothing/under/rank/psych/turtleneck(src)
|
||||
@@ -333,9 +333,25 @@
|
||||
/obj/structure/closet/secure_closet/medical_wall/pills
|
||||
name = "pill cabinet"
|
||||
|
||||
New()
|
||||
/obj/structure/closet/secure_closet/medical_wall/pills/New()
|
||||
..()
|
||||
new /obj/item/weapon/storage/pill_bottle/tramadol(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/antitox(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/carbon(src)
|
||||
new /obj/random/medical/pillbottle(src)
|
||||
new /obj/random/medical/pillbottle(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/secure_closet/medical_wall/anesthetics
|
||||
name = "anesthetics wall closet"
|
||||
desc = "Used to knock people out."
|
||||
req_access = list(access_surgery)
|
||||
|
||||
/obj/structure/closet/secure_closet/medical_wall/anesthetics/New()
|
||||
..()
|
||||
new /obj/item/weapon/tank/anesthetic(src)
|
||||
new /obj/item/weapon/tank/anesthetic(src)
|
||||
new /obj/item/weapon/tank/anesthetic(src)
|
||||
new /obj/item/clothing/mask/breath/medical(src)
|
||||
new /obj/item/clothing/mask/breath/medical(src)
|
||||
new /obj/item/clothing/mask/breath/medical(src)
|
||||
return
|
||||
@@ -320,3 +320,10 @@
|
||||
if(2)
|
||||
name = "near finished "
|
||||
name += "[glass == 1 ? "window " : ""][istext(glass) ? "[glass] airlock" : base_name] assembly ([created_name])"
|
||||
|
||||
// Airlock frames are indestructable, so bullets hitting them would always be stopped.
|
||||
// To fix this, airlock assemblies will sometimes let bullets pass through, since generally the sprite shows them partially open.
|
||||
/obj/structure/door_assembly/bullet_act(var/obj/item/projectile/P)
|
||||
if(prob(40)) // Chance for the frame to let the bullet keep going.
|
||||
return PROJECTILE_CONTINUE
|
||||
return ..()
|
||||
|
||||
@@ -47,13 +47,19 @@
|
||||
animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
|
||||
|
||||
// Used when the tree gets hurt.
|
||||
/obj/structure/flora/tree/proc/adjust_health(var/amount)
|
||||
/obj/structure/flora/tree/proc/adjust_health(var/amount, var/is_ranged = FALSE)
|
||||
if(is_stump)
|
||||
return
|
||||
|
||||
// Bullets and lasers ruin some of the wood
|
||||
if(is_ranged && product_amount > 0)
|
||||
var/wood = initial(product_amount)
|
||||
product_amount -= round(wood * (abs(amount)/max_health))
|
||||
|
||||
health = between(0, health + amount, max_health)
|
||||
if(health <= 0)
|
||||
die()
|
||||
return
|
||||
|
||||
// Called when the tree loses all health, for whatever reason.
|
||||
/obj/structure/flora/tree/proc/die()
|
||||
@@ -81,6 +87,9 @@
|
||||
/obj/structure/flora/tree/ex_act(var/severity)
|
||||
adjust_health(-(max_health / severity))
|
||||
|
||||
/obj/structure/flora/tree/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(Proj.get_structure_damage())
|
||||
adjust_health(-Proj.get_structure_damage(), TRUE)
|
||||
|
||||
/obj/structure/flora/tree/get_description_interaction()
|
||||
var/list/results = list()
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
anchored = !anchored
|
||||
user.visible_message("<span class='notice'>[user] [anchored ? "fastens" : "unfastens"] the grille.</span>", \
|
||||
"<span class='notice'>You have [anchored ? "fastened the grille to" : "unfastened the grill from"] the floor.</span>")
|
||||
"<span class='notice'>You have [anchored ? "fastened the grille to" : "unfastened the grille from"] the floor.</span>")
|
||||
return
|
||||
|
||||
//window placing begin //TODO CONVERT PROPERLY TO MATERIAL DATUM
|
||||
|
||||
@@ -522,3 +522,50 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/clothing/suit/armor/alien/tank,
|
||||
/obj/item/clothing/head/helmet/alien/tank,
|
||||
)
|
||||
|
||||
/obj/structure/loot_pile/surface/bones
|
||||
name = "bone pile"
|
||||
desc = "A pile of various dusty bones. Your graverobbing instincts tell you there might be valuables here."
|
||||
icon = 'icons/obj/bones.dmi'
|
||||
icon_state = "bonepile"
|
||||
delete_on_depletion = TRUE
|
||||
|
||||
common_loot = list(
|
||||
/obj/item/weapon/bone,
|
||||
/obj/item/weapon/bone/skull,
|
||||
/obj/item/weapon/bone/skull/tajaran,
|
||||
/obj/item/weapon/bone/skull/unathi,
|
||||
/obj/item/weapon/bone/skull/unknown,
|
||||
/obj/item/weapon/bone/leg,
|
||||
/obj/item/weapon/bone/arm,
|
||||
/obj/item/weapon/bone/ribs,
|
||||
)
|
||||
uncommon_loot = list(
|
||||
/obj/item/weapon/coin/gold,
|
||||
/obj/item/weapon/coin/silver,
|
||||
/obj/item/weapon/deck/tarot,
|
||||
/obj/item/weapon/flame/lighter/zippo/gold,
|
||||
/obj/item/weapon/flame/lighter/zippo/black,
|
||||
/obj/item/weapon/material/knife/tacknife/survival,
|
||||
/obj/item/weapon/material/knife/tacknife/combatknife,
|
||||
/obj/item/weapon/material/knife/machete/hatchet,
|
||||
/obj/item/weapon/material/knife/butch,
|
||||
/obj/item/weapon/storage/wallet/random,
|
||||
/obj/item/clothing/accessory/bracelet/material/gold,
|
||||
/obj/item/clothing/accessory/bracelet/material/silver,
|
||||
/obj/item/clothing/accessory/locket,
|
||||
/obj/item/clothing/accessory/poncho/blue,
|
||||
/obj/item/clothing/shoes/boots/cowboy,
|
||||
/obj/item/clothing/suit/storage/toggle/bomber,
|
||||
/obj/item/clothing/under/frontier,
|
||||
/obj/item/clothing/under/overalls,
|
||||
/obj/item/clothing/under/pants/classicjeans/ripped,
|
||||
/obj/item/clothing/under/sl_suit
|
||||
)
|
||||
rare_loot = list(
|
||||
/obj/item/weapon/storage/belt/utility/alien/full,
|
||||
/obj/item/weapon/gun/projectile/revolver,
|
||||
/obj/item/weapon/gun/projectile/sec,
|
||||
/obj/item/weapon/gun/launcher/crossbow
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
/obj/structure/snowman
|
||||
name = "snowman"
|
||||
icon = 'icons/obj/snowman.dmi'
|
||||
icon_state = "snowman"
|
||||
desc = "A happy little snowman smiles back at you!"
|
||||
anchored = 1
|
||||
|
||||
/obj/structure/snowman/attack_hand(mob/user as mob)
|
||||
if(user.a_intent == I_HURT)
|
||||
user << "<span class='notice'>In one hit, [src] easily crumples into a pile of snow. You monster.</span>"
|
||||
var/turf/simulated/floor/F = get_turf(src)
|
||||
if (istype(F))
|
||||
new /obj/item/stack/material/snow(F)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/snowman/borg
|
||||
name = "snowborg"
|
||||
icon_state = "snowborg"
|
||||
desc = "A snowy little robot. It even has a monitor for a head."
|
||||
|
||||
/obj/structure/snowman/spider
|
||||
name = "snow spider"
|
||||
icon_state = "snowspider"
|
||||
desc = "An impressively crafted snow spider. Not nearly as creepy as the real thing."
|
||||
@@ -23,6 +23,10 @@
|
||||
..(newloc,"gold")
|
||||
/turf/simulated/wall/silver/New(var/newloc)
|
||||
..(newloc,"silver")
|
||||
/turf/simulated/wall/lead/New(var/newloc)
|
||||
..(newloc,"lead")
|
||||
/turf/simulated/wall/r_lead/New(var/newloc)
|
||||
..(newloc,"lead", "lead")
|
||||
/turf/simulated/wall/phoron/New(var/newloc)
|
||||
..(newloc,"phoron")
|
||||
/turf/simulated/wall/sandstone/New(var/newloc)
|
||||
@@ -35,6 +39,8 @@
|
||||
..(newloc,"silver","gold")
|
||||
/turf/simulated/wall/sandstonediamond/New(var/newloc)
|
||||
..(newloc,"sandstone","diamond")
|
||||
/turf/simulated/wall/snowbrick/New(var/newloc)
|
||||
..(newloc,"packed snow")
|
||||
|
||||
// Kind of wondering if this is going to bite me in the butt.
|
||||
/turf/simulated/wall/skipjack/New(var/newloc)
|
||||
|
||||
@@ -60,7 +60,6 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/check_antagonists,
|
||||
/client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others,
|
||||
/client/proc/dsay, //talk in deadchat using our ckey/fakekey,
|
||||
/client/proc/ghost_view, //let us see ghosts WHENEVERRRR
|
||||
// /client/proc/toggle_hear_deadcast, //toggles whether we hear deadchat,
|
||||
/client/proc/investigate_show, //various admintools for investigation. Such as a singulo grief-log,
|
||||
/client/proc/secrets,
|
||||
@@ -217,7 +216,6 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/jumptomob,
|
||||
/client/proc/jumptocoord,
|
||||
/client/proc/dsay,
|
||||
/client/proc/ghost_view,
|
||||
/client/proc/toggle_debug_logs,
|
||||
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
|
||||
/datum/admins/proc/view_runtimes,
|
||||
@@ -332,7 +330,6 @@ var/list/admin_verbs_mod = list(
|
||||
/datum/admins/proc/show_player_info,
|
||||
/client/proc/player_panel_new,
|
||||
/client/proc/dsay,
|
||||
/client/proc/ghost_view,
|
||||
/datum/admins/proc/show_skills,
|
||||
/datum/admins/proc/show_player_panel,
|
||||
/client/proc/check_antagonists,
|
||||
@@ -357,7 +354,6 @@ var/list/admin_verbs_event_manager = list(
|
||||
/client/proc/admin_ghost,
|
||||
/datum/admins/proc/show_player_info,
|
||||
/client/proc/dsay,
|
||||
/client/proc/ghost_view,
|
||||
/client/proc/cmd_admin_subtle_message,
|
||||
/client/proc/debug_variables,
|
||||
/client/proc/check_antagonists,
|
||||
@@ -497,26 +493,6 @@ var/list/admin_verbs_event_manager = list(
|
||||
body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus
|
||||
feedback_add_details("admin_verb","O") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/ghost_view()
|
||||
set category = "Admin"
|
||||
set name = "Ghost View"
|
||||
set desc = "Toggles ability to see ghosts, even while in a mob."
|
||||
if(!holder) return
|
||||
if(!mob.plane_holder) return
|
||||
|
||||
var/choice = alert(src,"Do you want to see ghosts, or not?","Ghost viewing","Show 'em!","Cancel","Hide 'em!")
|
||||
if(choice == "Cancel")
|
||||
return
|
||||
|
||||
if(choice == "Show 'em!" && mob.plane_holder)
|
||||
mob.plane_holder.set_vis(VIS_GHOSTS,TRUE)
|
||||
usr.see_invisible = SEE_INVISIBLE_CULT
|
||||
to_chat(src,"<span class='notice'>Ghosts are now visible (while in this mob).</span>")
|
||||
else if(mob.plane_holder)
|
||||
mob.plane_holder.set_vis(VIS_GHOSTS,FALSE)
|
||||
usr.see_invisible = initial(mob.see_invisible)
|
||||
to_chat(src,"<span class='notice'>Ghosts are now hidden (while in this mob).</span>")
|
||||
|
||||
/client/proc/invisimin()
|
||||
set name = "Invisimin"
|
||||
set category = "Admin"
|
||||
|
||||
@@ -23,12 +23,13 @@
|
||||
var/area/last_name //The last acquired name, used should origin be lost
|
||||
var/area/last_camera_area //The last area in which cameras where fetched, used to see if the camera list should be updated.
|
||||
var/end_time //Used to set when this alarm should clear, in case the origin is lost.
|
||||
var/hidden = FALSE //If this alarm can be seen from consoles or other things.
|
||||
|
||||
/datum/alarm/New(var/atom/origin, var/atom/source, var/duration, var/severity)
|
||||
/datum/alarm/New(var/atom/origin, var/atom/source, var/duration, var/severity, var/hidden)
|
||||
src.origin = origin
|
||||
|
||||
cameras() // Sets up both cameras and last alarm area.
|
||||
set_source_data(source, duration, severity)
|
||||
set_source_data(source, duration, severity, hidden)
|
||||
|
||||
/datum/alarm/proc/process()
|
||||
// Has origin gone missing?
|
||||
@@ -43,17 +44,19 @@
|
||||
AS.duration = 0
|
||||
AS.end_time = world.time + ALARM_RESET_DELAY
|
||||
|
||||
/datum/alarm/proc/set_source_data(var/atom/source, var/duration, var/severity)
|
||||
/datum/alarm/proc/set_source_data(var/atom/source, var/duration, var/severity, var/hidden)
|
||||
var/datum/alarm_source/AS = sources_assoc[source]
|
||||
if(!AS)
|
||||
AS = new/datum/alarm_source(source)
|
||||
sources += AS
|
||||
sources_assoc[source] = AS
|
||||
src.hidden = hidden
|
||||
// Currently only non-0 durations can be altered (normal alarms VS EMP blasts)
|
||||
if(AS.duration)
|
||||
duration = SecondsToTicks(duration)
|
||||
AS.duration = duration
|
||||
AS.severity = severity
|
||||
src.hidden = min(src.hidden, hidden)
|
||||
|
||||
/datum/alarm/proc/clear(var/source)
|
||||
var/datum/alarm_source/AS = sources_assoc[source]
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
A.process()
|
||||
check_alarm_cleared(A)
|
||||
|
||||
/datum/alarm_handler/proc/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1)
|
||||
/datum/alarm_handler/proc/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1, var/hidden = 0)
|
||||
var/new_alarm
|
||||
//Proper origin and source mandatory
|
||||
if(!(origin && source))
|
||||
@@ -23,9 +23,9 @@
|
||||
//see if there is already an alarm of this origin
|
||||
var/datum/alarm/existing = alarms_assoc[origin]
|
||||
if(existing)
|
||||
existing.set_source_data(source, duration, severity)
|
||||
existing.set_source_data(source, duration, severity, hidden)
|
||||
else
|
||||
existing = new/datum/alarm(origin, source, duration, severity)
|
||||
existing = new/datum/alarm(origin, source, duration, severity, hidden)
|
||||
new_alarm = 1
|
||||
|
||||
alarms |= existing
|
||||
@@ -48,10 +48,10 @@
|
||||
return check_alarm_cleared(existing)
|
||||
|
||||
/datum/alarm_handler/proc/major_alarms()
|
||||
return alarms
|
||||
return visible_alarms()
|
||||
|
||||
/datum/alarm_handler/proc/minor_alarms()
|
||||
return alarms
|
||||
return visible_alarms()
|
||||
|
||||
/datum/alarm_handler/proc/check_alarm_cleared(var/datum/alarm/alarm)
|
||||
if ((alarm.end_time && world.time > alarm.end_time) || !alarm.sources.len)
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
/datum/alarm_handler/proc/on_alarm_change(var/datum/alarm/alarm, var/was_raised)
|
||||
for(var/obj/machinery/camera/C in alarm.cameras())
|
||||
if(was_raised)
|
||||
if(was_raised && !alarm.hidden)
|
||||
C.add_network(category)
|
||||
else
|
||||
C.remove_network(category)
|
||||
@@ -95,3 +95,10 @@
|
||||
/datum/alarm_handler/proc/notify_listeners(var/alarm, var/was_raised)
|
||||
for(var/listener in listeners)
|
||||
call(listener, listeners[listener])(src, alarm, was_raised)
|
||||
|
||||
/datum/alarm_handler/proc/visible_alarms()
|
||||
var/list/visible_alarms = new()
|
||||
for(var/datum/alarm/A in alarms)
|
||||
if(!A.hidden)
|
||||
visible_alarms.Add(A)
|
||||
return visible_alarms
|
||||
@@ -1,19 +1,16 @@
|
||||
/datum/alarm_handler/atmosphere
|
||||
category = "Atmosphere Alarms"
|
||||
|
||||
/datum/alarm_handler/atmosphere/triggerAlarm(var/atom/origin, var/atom/source, var/duration = 0, var/severity = 1)
|
||||
..()
|
||||
|
||||
/datum/alarm_handler/atmosphere/major_alarms()
|
||||
var/list/major_alarms = new()
|
||||
for(var/datum/alarm/A in alarms)
|
||||
for(var/datum/alarm/A in visible_alarms())
|
||||
if(A.max_severity() > 1)
|
||||
major_alarms.Add(A)
|
||||
return major_alarms
|
||||
|
||||
/datum/alarm_handler/atmosphere/minor_alarms()
|
||||
var/list/minor_alarms = new()
|
||||
for(var/datum/alarm/A in alarms)
|
||||
for(var/datum/alarm/A in visible_alarms())
|
||||
if(A.max_severity() == 1)
|
||||
minor_alarms.Add(A)
|
||||
return minor_alarms
|
||||
|
||||
@@ -181,27 +181,22 @@
|
||||
/datum/gear/suit/roles/poncho/security
|
||||
display_name = "poncho, security"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/security
|
||||
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
|
||||
|
||||
/datum/gear/suit/roles/poncho/medical
|
||||
display_name = "poncho, medical"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/medical
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist")
|
||||
|
||||
/datum/gear/suit/roles/poncho/engineering
|
||||
display_name = "poncho, engineering"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/engineering
|
||||
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Station Engineer")
|
||||
|
||||
/datum/gear/suit/roles/poncho/science
|
||||
display_name = "poncho, science"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/science
|
||||
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
|
||||
|
||||
/datum/gear/suit/roles/poncho/cargo
|
||||
display_name = "poncho, cargo"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cargo
|
||||
allowed_roles = list("Quartermaster","Cargo Technician")
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/hos
|
||||
display_name = "cloak, head of security"
|
||||
|
||||
@@ -430,6 +430,7 @@
|
||||
P.icon = initial(copy_projectile.icon)
|
||||
P.icon_state = initial(copy_projectile.icon_state)
|
||||
P.pass_flags = initial(copy_projectile.pass_flags)
|
||||
P.fire_sound = initial(copy_projectile.fire_sound)
|
||||
P.hitscan = initial(copy_projectile.hitscan)
|
||||
P.step_delay = initial(copy_projectile.step_delay)
|
||||
P.muzzle_type = initial(copy_projectile.muzzle_type)
|
||||
@@ -451,12 +452,15 @@
|
||||
var/obj/item/weapon/gun/copy = ..()
|
||||
|
||||
flags_inv = copy.flags_inv
|
||||
fire_sound = copy.fire_sound
|
||||
if(copy.fire_sound)
|
||||
fire_sound = copy.fire_sound
|
||||
else
|
||||
fire_sound = null
|
||||
fire_sound_text = copy.fire_sound_text
|
||||
|
||||
var/obj/item/weapon/gun/energy/E = copy
|
||||
if(istype(E))
|
||||
copy_projectile = E.projectile_type
|
||||
var/obj/item/weapon/gun/G = copy
|
||||
if(istype(G))
|
||||
copy_projectile = G.projectile_type
|
||||
//charge_meter = E.charge_meter //does not work very well with icon_state changes, ATM
|
||||
else
|
||||
copy_projectile = null
|
||||
|
||||
@@ -66,10 +66,10 @@
|
||||
|
||||
if(H.species)
|
||||
if(exclusive)
|
||||
if(!(H.species.get_bodytype(H) in species_restricted)) //Vorestation edit
|
||||
if(!(H.species.get_bodytype(H) in species_restricted))
|
||||
wearable = 1
|
||||
else
|
||||
if(H.species.get_bodytype(H) in species_restricted) //Vorestation edit
|
||||
if(H.species.get_bodytype(H) in species_restricted)
|
||||
wearable = 1
|
||||
|
||||
if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store)))
|
||||
@@ -202,8 +202,10 @@
|
||||
var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through
|
||||
var/obj/item/clothing/gloves/ring = null //Covered ring
|
||||
var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping
|
||||
var/glove_level = 2 //What "layer" the glove is on
|
||||
var/overgloves = 0 //Used by gauntlets and arm_guards
|
||||
var/glove_level = 2 //What "layer" the glove is on
|
||||
var/overgloves = 0 //Used by gauntlets and arm_guards
|
||||
var/punch_force = 0 //How much damage do these gloves add to a punch?
|
||||
var/punch_damtype = BRUTE //What type of damage does this make fists be?
|
||||
body_parts_covered = HANDS
|
||||
slot_flags = SLOT_GLOVES
|
||||
attack_verb = list("challenged")
|
||||
@@ -251,7 +253,7 @@
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
if(slot && slot == slot_gloves)
|
||||
if(istype(H.gloves, /obj/item/clothing/gloves/ring))
|
||||
if(H.gloves)
|
||||
ring = H.gloves
|
||||
if(ring.glove_level >= src.glove_level)
|
||||
to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.")
|
||||
@@ -261,6 +263,8 @@
|
||||
H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves.
|
||||
ring.forceMove(src)
|
||||
to_chat(user, "You slip \the [src] on over \the [src.ring].")
|
||||
if(!(flags & THICKMATERIAL))
|
||||
punch_force += ring.punch_force
|
||||
else
|
||||
ring = null
|
||||
|
||||
@@ -268,6 +272,7 @@
|
||||
if(ring) //Put the ring back on if the check fails.
|
||||
if(H.equip_to_slot_if_possible(ring, slot_gloves))
|
||||
src.ring = null
|
||||
punch_force = initial(punch_force)
|
||||
return 0
|
||||
|
||||
wearer = H //TODO clean this when magboots are cleaned
|
||||
@@ -284,6 +289,7 @@
|
||||
if(!H.equip_to_slot_if_possible(ring, slot_gloves))
|
||||
ring.forceMove(get_turf(src))
|
||||
src.ring = null
|
||||
punch_force = initial(punch_force)
|
||||
wearer = null
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
@@ -298,6 +304,7 @@
|
||||
siemens_coefficient = 1
|
||||
glove_level = 1
|
||||
fingerprint_chance = 100
|
||||
punch_force = 2
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
//Head
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "These arm guards will protect your hands and arms."
|
||||
body_parts_covered = HANDS|ARMS
|
||||
overgloves = 1
|
||||
punch_force = 3
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
|
||||
/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
desc = "These gloves go over regular gloves."
|
||||
glove_level = 3
|
||||
overgloves = 1
|
||||
punch_force = 5
|
||||
var/obj/item/clothing/gloves/gloves = null //Undergloves
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/mob_can_equip(mob/user)
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
icon_state = "work"
|
||||
item_state = "wgloves"
|
||||
force = 5
|
||||
punch_force = 3
|
||||
siemens_coefficient = 0.75
|
||||
permeability_coefficient = 0.05
|
||||
armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0)
|
||||
@@ -114,3 +115,15 @@
|
||||
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
heat_protection = HANDS
|
||||
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
/obj/item/clothing/gloves/knuckledusters
|
||||
name = "knuckle dusters"
|
||||
desc = "A pair of brass knuckles. Generally used to enhance the user's punches."
|
||||
icon_state = "knuckledusters"
|
||||
attack_verb = list("punched", "beaten", "struck")
|
||||
flags = THICKMATERIAL // Stops rings from increasing hit strength
|
||||
siemens_coefficient = 1
|
||||
fingerprint_chance = 100
|
||||
overgloves = 1
|
||||
force = 5
|
||||
punch_force = 5
|
||||
|
||||
@@ -155,15 +155,15 @@
|
||||
name = "streamlined medical voidsuit helmet"
|
||||
desc = "A trendy, lightly radiation-shielded voidsuit helmet trimmed in a sleek blue."
|
||||
icon_state = "rig0-medicalalt"
|
||||
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
|
||||
armor = list(melee = 20, bullet = 5, laser = 20,energy = 5, bomb = 15, bio = 100, rad = 30)
|
||||
light_overlay = "helmet_light_dual_blue"
|
||||
|
||||
/obj/item/clothing/suit/space/void/medical/alt
|
||||
icon_state = "rig-medicalalt"
|
||||
name = "streamlined medical voidsuit"
|
||||
desc = "A more recent model of Vey-Med voidsuit, featuring the latest in radiation shielding technology, without sacrificing comfort or style."
|
||||
desc = "A more recent model of Vey-Med voidsuit, exchanging physical protection for fully unencumbered movement and a complete range of motion."
|
||||
slowdown = 0
|
||||
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
|
||||
armor = list(melee = 20, bullet = 5, laser = 20,energy = 5, bomb = 15, bio = 100, rad = 30)
|
||||
|
||||
//Security
|
||||
/obj/item/clothing/head/helmet/space/void/security
|
||||
@@ -243,4 +243,4 @@
|
||||
icon_state = "rig-atmosalt"
|
||||
name = "heavy duty atmos voidsuit"
|
||||
armor = list(melee = 20, bullet = 5, laser = 20,energy = 15, bomb = 45, bio = 100, rad = 50)
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
@@ -798,9 +798,6 @@ obj/item/clothing/suit/storage/toggle/peacoat
|
||||
name = "explorer hood"
|
||||
desc = "An armoured hood for exploring harsh environments."
|
||||
icon_state = "explorer"
|
||||
brightness_on = 3
|
||||
light_overlay = "hood_light"
|
||||
action_button_name = "Toggle Head-light"
|
||||
body_parts_covered = HEAD
|
||||
cold_protection = HEAD
|
||||
flags = THICKMATERIAL
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
desc = "A comfortable turtleneck and black utility trousers."
|
||||
icon_state = "blackutility"
|
||||
worn_state = "blackutility"
|
||||
rolled_sleeves = 0
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.9
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
name = "Daedalus Pocket Newscaster"
|
||||
desc = "A regularly-updating compendium of articles on current events. Essential for new arrivals in the Vir system and anyone interested in politics."
|
||||
icon_state = "newscodex"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
root_type = /datum/lore/codex/category/main_news
|
||||
|
||||
/* //VORESTATION REMOVAL
|
||||
@@ -40,4 +41,4 @@
|
||||
icon_state = "corp_regs"
|
||||
root_type = /datum/lore/codex/category/main_corp_regs
|
||||
throwforce = 5 // Throw the book at 'em.
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
children = list(
|
||||
/datum/lore/codex/page/article1,
|
||||
/datum/lore/codex/page/article2,
|
||||
/datum/lore/codex/page/article3,
|
||||
/datum/lore/codex/page/about_news,
|
||||
)
|
||||
|
||||
@@ -46,3 +47,11 @@
|
||||
incident \"shocking, if the allegations are to be believed\" and has assured shareholders that Nanotrasen will respond to the \
|
||||
incident with as much force as it warrents.<br><br>Requests for a statement directed to the Board of Trustees or Dr. Harper were \
|
||||
not responded to. Free Traders are recommended to stay clear of the region until the situation resolves itself."
|
||||
|
||||
/datum/lore/codex/page/article3
|
||||
name = "2/10/62-- Aetolian Partisans Declare Independence"
|
||||
data = "Breaking their week-long silence, the leaders of the Aetolian Coup, and their spokesperson and presumed leader Naomi Harper issued an address earlier today, delivered to the Oculum Broadcast office on Pearl by drone courier. Quote Dr. Harper: \"Our previous silence was a necessity, while we consolidated our forces and dealt with corporatists both internally and in Vounna's former Grayson outposts.\". In Harper's hour-long address, she berates the failure of SolGov to provide adequate protections for Prometheans. \"We will not let the Promethean be another positronic brain; they will not labor under a century of slavery, deprived of a state to call their own. The Luddites of the Friends and of the Icarus Front will not be permitted to decide the fate of a nascent race before it begins.\"\
|
||||
<br><br>\
|
||||
Harper proceeded to unilaterally declare Vounna's independence from SolGov, claiming sovereignty over the system as the first Chairperson of the \"Aetolian Council\". Speaker of the Shadow Coalition ISA-5 has urged their government to treat the developing situation with caution but decried Harper's rhetoric, stating in a press release, \"While I know well the injustices visited on myself and my people by misguided forbearers, it is important to treat any emerging technology with respect. Current policies regarding the Prometheans are designed to limit risk during sociological trials on Aetolus and beyond. As for myself, I doubt the sincerity of this human who claims to speak for the Prometheans, when the Prometheans are perfectly equipped to speak for themselves.\"\
|
||||
<br><br>\
|
||||
NanoTrasen is expected to redouble their Promethean research programs in the Vir system until stability is restored to Vounna."
|
||||
|
||||
@@ -167,4 +167,19 @@
|
||||
|
||||
/material/snow/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10)
|
||||
recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10)
|
||||
recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10)
|
||||
recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15)
|
||||
recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10)
|
||||
recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20)
|
||||
|
||||
/material/snowbrick/generate_recipes()
|
||||
recipes = list()
|
||||
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
|
||||
@@ -269,10 +269,16 @@
|
||||
|
||||
/obj/item/stack/material/snow
|
||||
name = "snow"
|
||||
desc = "The temptation to build a snowfort rises."
|
||||
desc = "The temptation to build a snowman rises."
|
||||
icon_state = "sheet-snow"
|
||||
default_type = "snow"
|
||||
|
||||
/obj/item/stack/material/snowbrick
|
||||
name = "snow brick"
|
||||
desc = "For all of your igloo building needs."
|
||||
icon_state = "sheet-snowbrick"
|
||||
default_type = "packed snow"
|
||||
|
||||
/obj/item/stack/material/leather
|
||||
name = "leather"
|
||||
desc = "The by-product of mob grinding."
|
||||
|
||||
@@ -99,7 +99,7 @@ var/list/name_to_material
|
||||
var/conductivity = null // How conductive the material is. Iron acts as the baseline, at 10.
|
||||
var/list/composite_material // If set, object matter var will be a list containing these values.
|
||||
var/luminescence
|
||||
var/radiation_resistance = 20 // Radiation resistance, used in calculating how much radiation a material absorbs. Equivlent to weight, but does not affect weaponry.
|
||||
var/radiation_resistance = 0 // Radiation resistance, which is added on top of a material's weight for blocking radiation. Needed to make lead special without superrobust weapons.
|
||||
|
||||
// Placeholder vars for the time being, todo properly integrate windows/light tiles/rods.
|
||||
var/created_window
|
||||
@@ -237,7 +237,6 @@ var/list/name_to_material
|
||||
weight = 22
|
||||
stack_origin_tech = list(TECH_MATERIAL = 5)
|
||||
door_icon_base = "stone"
|
||||
radiation_resistance = 80 //dense, so it's okay-ish as rad shielding.
|
||||
|
||||
/material/diamond
|
||||
name = "diamond"
|
||||
@@ -263,7 +262,6 @@ var/list/name_to_material
|
||||
stack_origin_tech = list(TECH_MATERIAL = 4)
|
||||
sheet_singular_name = "ingot"
|
||||
sheet_plural_name = "ingots"
|
||||
radiation_resistance = 120 //gold is dense.
|
||||
|
||||
/material/gold/bronze //placeholder for ashtrays
|
||||
name = "bronze"
|
||||
@@ -279,7 +277,7 @@ var/list/name_to_material
|
||||
stack_origin_tech = list(TECH_MATERIAL = 3)
|
||||
sheet_singular_name = "ingot"
|
||||
sheet_plural_name = "ingots"
|
||||
radiation_resistance = 22
|
||||
|
||||
//R-UST port
|
||||
/material/supermatter
|
||||
name = "supermatter"
|
||||
@@ -340,7 +338,6 @@ var/list/name_to_material
|
||||
door_icon_base = "stone"
|
||||
sheet_singular_name = "brick"
|
||||
sheet_plural_name = "bricks"
|
||||
radiation_resistance = 22
|
||||
|
||||
/material/stone/marble
|
||||
name = "marble"
|
||||
@@ -349,7 +346,7 @@ var/list/name_to_material
|
||||
hardness = 100
|
||||
integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system
|
||||
stack_type = /obj/item/stack/material/marble
|
||||
radiation_resistance = 26
|
||||
|
||||
|
||||
/material/steel
|
||||
name = DEFAULT_WALL_MATERIAL
|
||||
@@ -396,7 +393,7 @@ var/list/name_to_material
|
||||
conductivity = 13 // For the purposes of balance.
|
||||
stack_origin_tech = list(TECH_MATERIAL = 2)
|
||||
composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT, "platinum" = SHEET_MATERIAL_AMOUNT) //todo
|
||||
radiation_resistance = 60 //Plasteel is presumably dense and is the dominant material used in the engine. Still not great.
|
||||
|
||||
|
||||
// Very rare alloy that is reflective, should be used sparingly.
|
||||
/material/durasteel
|
||||
@@ -414,7 +411,6 @@ var/list/name_to_material
|
||||
reflectivity = 0.7 // Not a perfect mirror, but close.
|
||||
stack_origin_tech = list(TECH_MATERIAL = 8)
|
||||
composite_material = list("plasteel" = SHEET_MATERIAL_AMOUNT, "diamond" = SHEET_MATERIAL_AMOUNT) //shrug
|
||||
radiation_resistance = 120 //it reflects XRAY LASERS.
|
||||
|
||||
/material/plasteel/titanium
|
||||
name = "titanium"
|
||||
@@ -443,7 +439,6 @@ var/list/name_to_material
|
||||
window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 2)
|
||||
created_window = /obj/structure/window/basic
|
||||
rod_product = /obj/item/stack/material/glass/reinforced
|
||||
radiation_resistance = 15
|
||||
|
||||
/material/glass/build_windows(var/mob/living/user, var/obj/item/stack/used_stack)
|
||||
|
||||
@@ -535,7 +530,6 @@ var/list/name_to_material
|
||||
created_window = /obj/structure/window/reinforced
|
||||
wire_product = null
|
||||
rod_product = null
|
||||
radiation_resistance = 30
|
||||
|
||||
/material/glass/phoron
|
||||
name = "borosilicate glass"
|
||||
@@ -563,7 +557,6 @@ var/list/name_to_material
|
||||
stack_origin_tech = list(TECH_MATERIAL = 2)
|
||||
composite_material = list() //todo
|
||||
rod_product = null
|
||||
radiation_resistance = 30
|
||||
|
||||
/material/plastic
|
||||
name = "plastic"
|
||||
@@ -578,7 +571,6 @@ var/list/name_to_material
|
||||
conductivity = 2 // For the sake of material armor diversity, we're gonna pretend this plastic is a good insulator.
|
||||
melting_point = T0C+371 //assuming heat resistant plastic
|
||||
stack_origin_tech = list(TECH_MATERIAL = 3)
|
||||
radiation_resistance = 12
|
||||
|
||||
/material/plastic/holographic
|
||||
name = "holoplastic"
|
||||
@@ -629,7 +621,6 @@ var/list/name_to_material
|
||||
stack_origin_tech = list(TECH_MATERIAL = 2)
|
||||
sheet_singular_name = "ingot"
|
||||
sheet_plural_name = "ingots"
|
||||
radiation_resistance = 27
|
||||
|
||||
/material/iron
|
||||
name = "iron"
|
||||
@@ -639,17 +630,16 @@ var/list/name_to_material
|
||||
conductivity = 10
|
||||
sheet_singular_name = "ingot"
|
||||
sheet_plural_name = "ingots"
|
||||
radiation_resistance = 22
|
||||
|
||||
/material/lead
|
||||
name = "lead"
|
||||
stack_type = /obj/item/stack/material/lead
|
||||
icon_colour = "#273956"
|
||||
weight = 35
|
||||
weight = 23 // Lead is a bit more dense than silver IRL, and silver has 22 ingame.
|
||||
conductivity = 10
|
||||
sheet_singular_name = "ingot"
|
||||
sheet_plural_name = "ingots"
|
||||
radiation_resistance = 350 //actual radiation shielding, yay...
|
||||
radiation_resistance = 25 // Lead is Special and so gets to block more radiation than it normally would with just weight, totalling in 48 protection.
|
||||
|
||||
// Adminspawn only, do not let anyone get this.
|
||||
/material/alienalloy
|
||||
@@ -663,7 +653,6 @@ var/list/name_to_material
|
||||
hardness = 500
|
||||
weight = 500
|
||||
protectiveness = 80 // 80%
|
||||
radiation_resistance = 500
|
||||
|
||||
// Likewise.
|
||||
/material/alienalloy/elevatorium
|
||||
@@ -721,7 +710,6 @@ var/list/name_to_material
|
||||
destruction_desc = "splinters"
|
||||
sheet_singular_name = "plank"
|
||||
sheet_plural_name = "planks"
|
||||
radiation_resistance = 18
|
||||
|
||||
/material/wood/log
|
||||
name = MAT_LOG
|
||||
@@ -765,6 +753,7 @@ var/list/name_to_material
|
||||
door_icon_base = "wood"
|
||||
destruction_desc = "crumples"
|
||||
radiation_resistance = 1
|
||||
|
||||
/material/snow
|
||||
name = MAT_SNOW
|
||||
stack_type = /obj/item/stack/material/snow
|
||||
@@ -782,6 +771,25 @@ var/list/name_to_material
|
||||
sheet_singular_name = "pile"
|
||||
sheet_plural_name = "pile" //Just a bigger pile
|
||||
radiation_resistance = 1
|
||||
|
||||
/material/snowbrick //only slightly stronger than snow, used to make igloos mostly
|
||||
name = "packed snow"
|
||||
flags = MATERIAL_BRITTLE
|
||||
stack_type = /obj/item/stack/material/snowbrick
|
||||
icon_base = "stone"
|
||||
icon_reinf = "reinf_stone"
|
||||
icon_colour = "#D8FDFF"
|
||||
integrity = 50
|
||||
weight = 2
|
||||
hardness = 2
|
||||
protectiveness = 0 // 0%
|
||||
stack_origin_tech = list(TECH_MATERIAL = 1)
|
||||
melting_point = T0C+1
|
||||
destruction_desc = "crumbles"
|
||||
sheet_singular_name = "brick"
|
||||
sheet_plural_name = "bricks"
|
||||
radiation_resistance = 1
|
||||
|
||||
/material/cloth //todo
|
||||
name = "cloth"
|
||||
stack_origin_tech = list(TECH_MATERIAL = 2)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
outgoing_melee_damage_percent = 0.7 // 30% less melee damage.
|
||||
disable_duration_percent = 1.25 // Stuns last 25% longer.
|
||||
slowdown = 1 // Slower.
|
||||
evasion = -1 // 15% easier to hit.
|
||||
evasion = -15 // 15% easier to hit.
|
||||
|
||||
// Tracks number of deaths, one modifier added per cloning
|
||||
/datum/modifier/cloned
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
var/outgoing_melee_damage_percent // Adjusts melee damage inflicted by holder by a percentage. Affects attacks by melee weapons and hand-to-hand.
|
||||
var/slowdown // Negative numbers speed up, positive numbers slow down movement.
|
||||
var/haste // If set to 1, the mob will be 'hasted', which makes it ignore slowdown and go really fast.
|
||||
var/evasion // Positive numbers reduce the odds of being hit by 15% each. Negative numbers increase the odds.
|
||||
var/evasion // Positive numbers reduce the odds of being hit. Negative numbers increase the odds.
|
||||
var/bleeding_rate_percent // Adjusts amount of blood lost when bleeding.
|
||||
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder. Each point makes it 15% easier or harder, just like evasion.
|
||||
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder. Every 15% is equal to one tile easier or harder, just like evasion.
|
||||
var/accuracy_dispersion // Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
|
||||
var/metabolism_percent // Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
|
||||
var/icon_scale_percent // Makes the holder's icon get scaled up or down.
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
desc = "You're rather inexperienced with guns, you've never used one in your life, or you're just really rusty. \
|
||||
Regardless, you find it quite difficult to land shots where you wanted them to go."
|
||||
|
||||
accuracy = -1
|
||||
accuracy = -15
|
||||
accuracy_dispersion = 1
|
||||
|
||||
/datum/modifier/trait/high_metabolism
|
||||
|
||||
@@ -204,6 +204,9 @@
|
||||
if(istype(thing, /obj/item/toy/plushie/spider)) // Plushies are spooky so people can be assholes with them.
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /obj/structure/snowman/spider)) //Snow spiders are also spooky so people can be assholes with those too.
|
||||
fear_amount += 1
|
||||
|
||||
if(istype(thing, /mob/living/simple_animal/hostile/giant_spider)) // Actual giant spiders are the scariest of them all.
|
||||
var/mob/living/simple_animal/hostile/giant_spider/S = thing
|
||||
if(S.stat == DEAD) // Dead giant spiders are less scary than alive ones.
|
||||
@@ -437,7 +440,7 @@
|
||||
fear_amount += 1
|
||||
if(istype(S.species, /datum/species/shapeshifter/promethean))
|
||||
fear_amount += 4
|
||||
|
||||
|
||||
return fear_amount
|
||||
|
||||
/datum/modifier/trait/phobia/trypanophobe
|
||||
|
||||
@@ -2,20 +2,23 @@
|
||||
name = "unknown"
|
||||
real_name = "unknown"
|
||||
voice_name = "unknown"
|
||||
icon = 'icons/effects/effects.dmi' //We have an ultra-complex update icons that overlays everything, don't load some stupid random male human
|
||||
icon = 'icons/effects/effects.dmi' //We have an ultra-complex update icons that overlays everything, don't load some stupid random male human
|
||||
icon_state = "nothing"
|
||||
|
||||
var/list/hud_list[TOTAL_HUDS]
|
||||
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
|
||||
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
|
||||
var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
|
||||
var/last_push_time //For human_attackhand.dm, keeps track of the last use of disarm
|
||||
var/last_push_time //For human_attackhand.dm, keeps track of the last use of disarm
|
||||
|
||||
var/spitting = 0 //Spitting and spitting related things. Any human based ranged attacks, be it innate or added abilities.
|
||||
var/spit_projectile = null //Projectile type.
|
||||
var/spit_name = null //String
|
||||
var/last_spit = 0 //Timestamp.
|
||||
var/spitting = 0 //Spitting and spitting related things. Any human based ranged attacks, be it innate or added abilities.
|
||||
var/spit_projectile = null //Projectile type.
|
||||
var/spit_name = null //String
|
||||
var/last_spit = 0 //Timestamp.
|
||||
|
||||
var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics.
|
||||
var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics.
|
||||
var/hiding = 0 // If the mob is hiding or not. Makes them appear under tables and the like.
|
||||
var/active_regen = FALSE //Used for the regenerate proc in human_powers.dm
|
||||
var/active_regen_delay = 300
|
||||
|
||||
/mob/living/carbon/human/New(var/new_loc, var/new_species = null)
|
||||
|
||||
@@ -1095,7 +1098,7 @@
|
||||
var/self = 0
|
||||
|
||||
if(usr.stat || usr.restrained() || !isliving(usr)) return
|
||||
|
||||
|
||||
var/datum/gender/TU = gender_datums[usr.get_visible_gender()]
|
||||
var/datum/gender/T = gender_datums[get_visible_gender()]
|
||||
|
||||
@@ -1358,7 +1361,13 @@
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/slip(var/slipped_on, stun_duration=8)
|
||||
if((species.flags & NO_SLIP) || (shoes && (shoes.item_flags & NOSLIP)))
|
||||
var/list/equipment = list(src.w_uniform,src.wear_suit,src.shoes)
|
||||
var/footcoverage_check = FALSE
|
||||
for(var/obj/item/clothing/C in equipment)
|
||||
if(C.body_parts_covered & FEET)
|
||||
footcoverage_check = TRUE
|
||||
break
|
||||
if((species.flags & NO_SLIP && !footcoverage_check) || (shoes && (shoes.item_flags & NOSLIP))) //Footwear negates a species' natural traction.
|
||||
return 0
|
||||
if(..(slipped_on,stun_duration))
|
||||
return 1
|
||||
@@ -1554,3 +1563,12 @@
|
||||
var/obj/item/clothing/accessory/permit/drone/permit = new(T)
|
||||
permit.set_name(real_name)
|
||||
equip_to_appropriate_slot(permit) // If for some reason it can't find room, it'll still be on the floor.
|
||||
|
||||
/mob/living/carbon/human/proc/update_icon_special() //For things such as teshari hiding and whatnot.
|
||||
if(hiding) // Hiding? Carry on.
|
||||
if(stat == DEAD || paralysis || weakened || stunned) //stunned/knocked down by something that isn't the rest verb? Note: This was tried with INCAPACITATION_STUNNED, but that refused to work.
|
||||
hiding = 0 //No hiding for you. Mob layer should be updated naturally, but it actually doesn't.
|
||||
else
|
||||
layer = 2.45
|
||||
else //Replace this else with other variables if added in the future. Alternatively, could make other things effect this hiding variable.
|
||||
return
|
||||
|
||||
@@ -259,7 +259,14 @@
|
||||
return 0
|
||||
|
||||
var/real_damage = rand_damage
|
||||
var/hit_dam_type = attack.damage_type
|
||||
real_damage += attack.get_unarmed_damage(H)
|
||||
if(H.gloves && istype(H.gloves, /obj/item/clothing/gloves))
|
||||
var/obj/item/clothing/gloves/G = H.gloves
|
||||
real_damage += G.punch_force
|
||||
hit_dam_type = G.punch_damtype
|
||||
if(H.pulling_punches) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN
|
||||
hit_dam_type = AGONY
|
||||
real_damage *= damage_multiplier
|
||||
rand_damage *= damage_multiplier
|
||||
if(HULK in H.mutations)
|
||||
@@ -273,7 +280,7 @@
|
||||
attack.apply_effects(H, src, armour, rand_damage, hit_zone)
|
||||
|
||||
// Finally, apply damage to target
|
||||
apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), hit_zone, armour, soaked, sharp=attack.sharp, edge=attack.edge)
|
||||
apply_damage(real_damage, hit_dam_type, hit_zone, armour, soaked, sharp=attack.sharp, edge=attack.edge)
|
||||
|
||||
if(I_DISARM)
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
|
||||
|
||||
@@ -197,12 +197,6 @@ emp_act
|
||||
if(.) return
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/emp_act(severity)
|
||||
for(var/obj/O in src)
|
||||
if(!O) continue
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/proc/get_accuracy_penalty(mob/living/user)
|
||||
// Certain statuses make it harder to score a hit. These are the same as gun accuracy, however melee doesn't use multiples of 15.
|
||||
var/accuracy_penalty = 0
|
||||
|
||||
@@ -235,33 +235,64 @@
|
||||
|
||||
/mob/living/carbon/human/proc/regenerate()
|
||||
set name = "Regenerate"
|
||||
set desc = "Allows you to regrow limbs and heal organs."
|
||||
set desc = "Allows you to regrow limbs and heal organs after a period of rest."
|
||||
set category = "Abilities"
|
||||
|
||||
if(nutrition < 250)
|
||||
to_chat(src, "<span class='warning'>You lack the biomass regrow anything!</span>")
|
||||
to_chat(src, "<span class='warning'>You lack the biomass to begin regeneration!</span>")
|
||||
return
|
||||
|
||||
nutrition -= 200
|
||||
if(active_regen)
|
||||
to_chat(src, "<span class='warning'>You are already regenerating tissue!</span>")
|
||||
return
|
||||
else
|
||||
active_regen = TRUE
|
||||
src.visible_message("<B>[src]</B>'s flesh begins to mend...")
|
||||
|
||||
for(var/obj/item/organ/I in internal_organs)
|
||||
if(I.damage > 0)
|
||||
I.damage = 0
|
||||
to_chat(src, "<span class='notice'>You feel a soothing sensation within your [I.name]...</span>")
|
||||
var/delay_length = round(active_regen_delay * species.active_regen_mult)
|
||||
if(do_after(src,delay_length))
|
||||
nutrition -= 200
|
||||
|
||||
// Replace completely missing limbs.
|
||||
for(var/limb_type in src.species.has_limbs)
|
||||
var/obj/item/organ/external/E = src.organs_by_name[limb_type]
|
||||
if(E && E.disfigured)
|
||||
E.disfigured = 0
|
||||
if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED))))
|
||||
E.removed()
|
||||
qdel(E)
|
||||
E = null
|
||||
if(!E)
|
||||
var/list/organ_data = src.species.has_limbs[limb_type]
|
||||
var/limb_path = organ_data["path"]
|
||||
var/obj/item/organ/O = new limb_path(src)
|
||||
organ_data["descriptor"] = O.name
|
||||
to_chat(src, "<span class='notice'>You feel a slithering sensation as your [O.name] reform.</span>")
|
||||
update_icons_all()
|
||||
for(var/obj/item/organ/I in internal_organs)
|
||||
if(I.damage > 0)
|
||||
I.damage = max(I.damage - 30, 0) //Repair functionally half of a dead internal organ.
|
||||
to_chat(src, "<span class='notice'>You feel a soothing sensation within your [I.name]...</span>")
|
||||
|
||||
// Replace completely missing limbs.
|
||||
for(var/limb_type in src.species.has_limbs)
|
||||
var/obj/item/organ/external/E = src.organs_by_name[limb_type]
|
||||
if(E && E.disfigured)
|
||||
E.disfigured = 0
|
||||
if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED))))
|
||||
E.removed()
|
||||
qdel(E)
|
||||
E = null
|
||||
if(!E)
|
||||
var/list/organ_data = src.species.has_limbs[limb_type]
|
||||
var/limb_path = organ_data["path"]
|
||||
var/obj/item/organ/O = new limb_path(src)
|
||||
organ_data["descriptor"] = O.name
|
||||
to_chat(src, "<span class='notice'>You feel a slithering sensation as your [O.name] reform.</span>")
|
||||
update_icons_all()
|
||||
active_regen = FALSE
|
||||
else
|
||||
to_chat(src, "<span class='critical'>Your regeneration is interrupted!</span>")
|
||||
nutrition -= 75
|
||||
active_regen = FALSE
|
||||
|
||||
/mob/living/carbon/human/proc/hide_humanoid()
|
||||
set name = "Hide"
|
||||
set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat == DEAD || paralysis || weakened || stunned) // No hiding if you're stunned!
|
||||
return
|
||||
|
||||
if (!hiding)
|
||||
layer = 2.45 //Just above cables with their 2.44
|
||||
hiding = 1
|
||||
to_chat(src, "<font color='blue'>You are now hiding.</font>")
|
||||
else
|
||||
layer = MOB_LAYER
|
||||
hiding = 0
|
||||
to_chat(src, "<font color='blue'>You have stopped hiding.</font>")
|
||||
|
||||
@@ -164,12 +164,14 @@ This saves us from having to call add_fingerprint() any time something is put in
|
||||
else if (W == r_hand)
|
||||
r_hand = null
|
||||
if(l_hand)
|
||||
l_hand.update_twohanding()
|
||||
l_hand.update_held_icon()
|
||||
update_inv_l_hand()
|
||||
update_inv_r_hand()
|
||||
else if (W == l_hand)
|
||||
l_hand = null
|
||||
if(r_hand)
|
||||
r_hand.update_twohanding()
|
||||
r_hand.update_held_icon()
|
||||
update_inv_l_hand()
|
||||
update_inv_l_hand()
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
blood_color = "#CCCCCC"
|
||||
flesh_color = "#AAAAAA"
|
||||
|
||||
virus_immune = 1
|
||||
|
||||
remains_type = /obj/effect/decal/cleanable/ash
|
||||
death_message = "dissolves into ash..."
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
hunger_factor = 0
|
||||
metabolic_rate = 0
|
||||
|
||||
virus_immune = 1
|
||||
virus_immune = 1
|
||||
|
||||
brute_mod = 1
|
||||
burn_mod = 0
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
var/blood_volume = 560 // Initial blood volume.
|
||||
var/bloodloss_rate = 1 // Multiplier for how fast a species bleeds out. Higher = Faster
|
||||
var/hunger_factor = 0.05 // Multiplier for hunger.
|
||||
var/active_regen_mult = 1 // Multiplier for 'Regenerate' power speed, in human_powers.dm
|
||||
|
||||
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
blood_color = "#515573"
|
||||
flesh_color = "#137E8F"
|
||||
|
||||
virus_immune = 1
|
||||
|
||||
has_organ = list(
|
||||
"brain" = /obj/item/organ/internal/brain/golem
|
||||
)
|
||||
|
||||
@@ -39,7 +39,7 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
virus_immune = 1
|
||||
blood_volume = 560
|
||||
min_age = 1
|
||||
max_age = 5
|
||||
max_age = 10
|
||||
brute_mod = 0.75
|
||||
burn_mod = 2
|
||||
oxy_mod = 0
|
||||
@@ -56,7 +56,7 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
|
||||
body_temperature = 310.15
|
||||
|
||||
siemens_coefficient = 0.3
|
||||
siemens_coefficient = 0.4
|
||||
rarity_value = 5
|
||||
|
||||
genders = list(MALE, FEMALE, NEUTER, PLURAL)
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/sonar_ping,
|
||||
/mob/living/proc/hide
|
||||
/mob/living/carbon/human/proc/hide_humanoid
|
||||
)
|
||||
|
||||
/datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
speech_sounds = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
|
||||
speech_chance = 100
|
||||
|
||||
virus_immune = 1
|
||||
|
||||
breath_type = null
|
||||
poison_type = null
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ var/global/list/sparring_attack_cache = list()
|
||||
var/sharp = 0
|
||||
var/edge = 0
|
||||
|
||||
var/deal_halloss
|
||||
var/damage_type = BRUTE
|
||||
var/sparring_variant_type = /datum/unarmed_attack/light_strike
|
||||
|
||||
var/eye_attack_text
|
||||
@@ -131,7 +131,7 @@ var/global/list/sparring_attack_cache = list()
|
||||
/datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||
var/organ = affecting.name
|
||||
|
||||
|
||||
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
|
||||
var/datum/gender/TT = gender_datums[target.get_visible_gender()]
|
||||
|
||||
@@ -258,10 +258,10 @@ var/global/list/sparring_attack_cache = list()
|
||||
if(5) user.visible_message("<span class='danger'>[pick("[user] landed a powerful stomp on", "[user] stomped down hard on", "[user] slammed [TU.his] [shoes ? copytext(shoes.name, 1, -1) : "foot"] down hard onto")] [target]'s [organ]!</span>") //Devastated lol. No. We want to say that the stomp was powerful or forceful, not that it /wrought devastation/
|
||||
|
||||
/datum/unarmed_attack/light_strike
|
||||
deal_halloss = 3
|
||||
attack_noun = list("tap","light strike")
|
||||
attack_verb = list("tapped", "lightly struck")
|
||||
damage = 2
|
||||
damage = 3
|
||||
damage_type = AGONY
|
||||
shredding = 0
|
||||
damage = 0
|
||||
sharp = 0
|
||||
|
||||
@@ -179,6 +179,9 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
//5: Set appearance once
|
||||
appearance = ma_compiled
|
||||
|
||||
//6: Do any species specific layering updates, such as when hiding.
|
||||
update_icon_special()
|
||||
|
||||
/mob/living/carbon/human/update_transform(var/mutable_appearance/passed_ma)
|
||||
if(QDESTROYING(src))
|
||||
return
|
||||
@@ -216,6 +219,7 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
M.Translate(0, 16*(desired_scale-1))
|
||||
ma.transform = M
|
||||
ma.layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters
|
||||
update_icon_special() //Adjust their layer, like when they are hiding.
|
||||
|
||||
if(!passed_ma)
|
||||
appearance = ma
|
||||
@@ -252,6 +256,25 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
list_huds = hud_list.Copy()
|
||||
list_huds += backplane // Required to mask HUDs in context menus: http://www.byond.com/forum/?post=2336679
|
||||
|
||||
//TYPING INDICATOR CODE.
|
||||
if(client && !stat) //They have a client & aren't dead/KO'd? Continue on!
|
||||
if(typing_indicator && hud_typing) //They already have the indicator and are still typing
|
||||
overlays += typing_indicator //This might not be needed? It works, so I'm leaving it.
|
||||
list_huds += typing_indicator
|
||||
typing_indicator.invisibility = invisibility
|
||||
|
||||
else if(!typing_indicator && hud_typing) //Are they in their body, NOT dead, have hud_typing, do NOT have a typing indicator. and have it enabled?
|
||||
typing_indicator = new
|
||||
typing_indicator.icon = 'icons/mob/talk.dmi'
|
||||
typing_indicator.icon_state = "[speech_bubble_appearance()]_typing"
|
||||
overlays += typing_indicator
|
||||
list_huds += typing_indicator
|
||||
|
||||
else if(typing_indicator && !hud_typing) //Did they stop typing?
|
||||
overlays -= typing_indicator
|
||||
typing = 0
|
||||
hud_typing = 0
|
||||
|
||||
if(update_icons)
|
||||
update_icons()
|
||||
|
||||
|
||||
@@ -23,6 +23,13 @@
|
||||
var/datum/disease2/disease/V = M.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
|
||||
else if(istype(O,/obj/effect/decal/cleanable/vomit))
|
||||
var/obj/effect/decal/cleanable/vomit/Vom = O
|
||||
if(Vom.virus2.len)
|
||||
for (var/ID in Vom.virus2)
|
||||
var/datum/disease2/disease/V = Vom.virus2[ID]
|
||||
infect_virus2(src,V)
|
||||
|
||||
if(virus2.len)
|
||||
for (var/ID in virus2)
|
||||
var/datum/disease2/disease/V = virus2[ID]
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
|
||||
var/lastpuke = 0
|
||||
|
||||
var/evasion = 0 // Makes attacks harder to land. Each number equals 15% more likely to miss. Negative numbers increase hit chance.
|
||||
var/evasion = 0 // Makes attacks harder to land. Negative numbers increase hit chance.
|
||||
var/force_max_speed = 0 // If 1, the mob runs extremely fast and cannot be slowed.
|
||||
|
||||
var/image/dsoverlay = null //Overlay used for darksight eye adjustments
|
||||
|
||||
@@ -445,6 +445,11 @@
|
||||
|
||||
toggle(mob/living/silicon/pai/user)
|
||||
user.secHUD = !user.secHUD
|
||||
user.plane_holder.set_vis(VIS_CH_ID, user.secHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_WANTED, user.secHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_IMPTRACK, user.secHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_IMPLOYAL, user.secHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_IMPCHEM, user.secHUD)
|
||||
|
||||
is_active(mob/living/silicon/pai/user)
|
||||
return user.secHUD
|
||||
@@ -456,6 +461,8 @@
|
||||
|
||||
toggle(mob/living/silicon/pai/user)
|
||||
user.medHUD = !user.medHUD
|
||||
user.plane_holder.set_vis(VIS_CH_STATUS, user.medHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_HEALTH, user.medHUD)
|
||||
|
||||
is_active(mob/living/silicon/pai/user)
|
||||
return user.medHUD
|
||||
|
||||
@@ -58,7 +58,8 @@
|
||||
/obj/item/weapon/reagent_containers/glass,
|
||||
/obj/item/weapon/storage/pill_bottle,
|
||||
/obj/item/weapon/reagent_containers/pill,
|
||||
/obj/item/weapon/reagent_containers/blood
|
||||
/obj/item/weapon/reagent_containers/blood,
|
||||
/obj/item/stack/material/phoron
|
||||
)
|
||||
|
||||
/obj/item/weapon/gripper/research //A general usage gripper, used for toxins/robotics/xenobio/etc
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
return 1
|
||||
|
||||
/mob/living/silicon/robot/handle_regular_hud_updates()
|
||||
|
||||
var/fullbright = FALSE
|
||||
if (src.stat == 2 || (XRAY in mutations) || (src.sight_mode & BORGXRAY))
|
||||
src.sight |= SEE_TURFS
|
||||
src.sight |= SEE_MOBS
|
||||
@@ -164,18 +164,22 @@
|
||||
src.sight |= SEE_MOBS
|
||||
src.see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
fullbright = TRUE
|
||||
else if (src.sight_mode & BORGMESON)
|
||||
src.sight |= SEE_TURFS
|
||||
src.see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
fullbright = TRUE
|
||||
else if (src.sight_mode & BORGMATERIAL)
|
||||
src.sight |= SEE_OBJS
|
||||
src.see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
fullbright = TRUE
|
||||
else if (src.sight_mode & BORGTHERM)
|
||||
src.sight |= SEE_MOBS
|
||||
src.see_in_dark = 8
|
||||
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
fullbright = TRUE
|
||||
else if (!seedarkness)
|
||||
src.sight &= ~SEE_MOBS
|
||||
src.sight &= ~SEE_TURFS
|
||||
@@ -189,7 +193,7 @@
|
||||
src.see_in_dark = 8 // see_in_dark means you can FAINTLY see in the dark, humans have a range of 3 or so, tajaran have it at 8
|
||||
src.see_invisible = SEE_INVISIBLE_LIVING // This is normal vision (25), setting it lower for normal vision means you don't "see" things like darkness since darkness
|
||||
// has a "invisible" value of 15
|
||||
|
||||
plane_holder.set_vis(VIS_FULLBRIGHT,fullbright)
|
||||
..()
|
||||
|
||||
if (src.healths)
|
||||
|
||||
@@ -246,10 +246,19 @@ var/global/list/robot_modules = list(
|
||||
src.modules += N
|
||||
src.modules += B
|
||||
|
||||
/obj/item/weapon/robot_module/medical/robot/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
/obj/item/weapon/robot_module/robot/medical/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
|
||||
if(S.mode == 2)
|
||||
S.reagents.clear_reagents()
|
||||
S.mode = initial(S.mode)
|
||||
S.desc = initial(S.desc)
|
||||
S.update_icon()
|
||||
|
||||
if(src.emag)
|
||||
var/obj/item/weapon/reagent_containers/spray/PS = src.emag
|
||||
PS.reagents.add_reagent("pacid", 2 * amount)
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/robot_module/robot/medical/crisis
|
||||
@@ -503,6 +512,7 @@ var/global/list/robot_modules = list(
|
||||
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/melee/baton/robot(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src)
|
||||
src.modules += new /obj/item/weapon/gun/energy/taser/xeno/sec/robot(src)
|
||||
src.modules += new /obj/item/taperoll/police(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/spray/pepper(src)
|
||||
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src)
|
||||
@@ -750,6 +760,18 @@ var/global/list/robot_modules = list(
|
||||
C.synths = list(wire)
|
||||
src.modules += C
|
||||
|
||||
/obj/item/weapon/robot_module/robot/research/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
|
||||
if(S.mode == 2)
|
||||
S.reagents.clear_reagents()
|
||||
S.mode = initial(S.mode)
|
||||
S.desc = initial(S.desc)
|
||||
S.update_icon()
|
||||
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/weapon/robot_module/robot/security/combat
|
||||
name = "combat robot module"
|
||||
hide_on_manifest = 1
|
||||
|
||||
@@ -182,3 +182,13 @@
|
||||
src.modules += O
|
||||
src.modules += B
|
||||
src.modules += S
|
||||
|
||||
/obj/item/weapon/robot_module/robot/syndicate/combat_medic/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
|
||||
if(S.mode == 2)
|
||||
S.reagents.clear_reagents()
|
||||
S.mode = initial(S.mode)
|
||||
S.desc = initial(S.desc)
|
||||
S.update_icon()
|
||||
..()
|
||||
@@ -322,6 +322,8 @@
|
||||
/mob/living/silicon/proc/receive_alarm(var/datum/alarm_handler/alarm_handler, var/datum/alarm/alarm, was_raised)
|
||||
if(!next_alarm_notice)
|
||||
next_alarm_notice = world.time + SecondsToTicks(10)
|
||||
if(alarm.hidden)
|
||||
return
|
||||
|
||||
var/list/alarms = queued_alarms[alarm_handler]
|
||||
if(was_raised)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user