This commit is contained in:
Fordoxia
2024-05-03 01:25:48 +01:00
140 changed files with 1977 additions and 1010 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
version: 1
# The BYOND version to use
# Must be interpreted as a string, keep quoted
byond: "515.1620"
byond: '515.1633'
# Folders to create in "<instance_path>/Configuration/GameStaticFiles/"
static_files:
# Config directory should be static
@@ -3133,10 +3133,6 @@
icon_state = "stage_stairs"
},
/area/ruin/space/derelict/crew_quarters)
"hF" = (
/obj/structure/sign/barsign,
/turf/simulated/wall/mineral/titanium/nodecon,
/area/ruin/space/derelict/crew_quarters)
"hH" = (
/obj/machinery/door/airlock/public/glass{
name = "Eastern Annex"
@@ -7553,6 +7549,13 @@
},
/turf/simulated/wall/mineral/titanium/nodecon/nodiagonal,
/area/ruin/space/derelict/arrival)
"Ef" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/barsign{
pixel_y = 32
},
/turf/simulated/floor/plasteel/dark,
/area/ruin/space/derelict/crew_quarters)
"Nv" = (
/obj/effect/spawner/airlock{
req_access_txt = 0
@@ -13520,8 +13523,8 @@ gn
gG
gG
gG
hF
hT
aV
Ef
in
iK
je
+22 -16
View File
@@ -1121,6 +1121,12 @@
icon_state = "cafeteria"
},
/area/ghost_bar)
"et" = (
/obj/machinery/barsign/ghost_bar{
pixel_y = 32
},
/turf/simulated/floor/wood,
/area/ghost_bar)
"ev" = (
/turf/simulated/floor/beach/sand,
/area/holodeck/source_beach)
@@ -2689,6 +2695,15 @@
/obj/structure/chair/stool,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/syndicate)
"jA" = (
/obj/machinery/barsign{
pixel_y = 32
},
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "green"
},
/area/centcom/evac)
"jB" = (
/obj/structure/table/wood,
/obj/machinery/door_control/no_emag{
@@ -5375,10 +5390,6 @@
/obj/effect/landmark/spawner/syndie,
/turf/simulated/floor/wood,
/area/syndicate_mothership)
"sd" = (
/obj/structure/sign/barsign,
/turf/simulated/wall/indestructible/riveted,
/area/ghost_bar)
"se" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
@@ -7985,7 +7996,7 @@
/turf/simulated/wall/indestructible/syndicate,
/area/admin)
"Cv" = (
/obj/structure/sign/barsign{
/obj/machinery/barsign{
pixel_y = -32
},
/obj/machinery/icemachine,
@@ -9238,7 +9249,7 @@
/area/centcom/specops)
"GT" = (
/obj/structure/chair,
/obj/structure/sign/barsign{
/obj/machinery/barsign{
pixel_y = 32
},
/obj/effect/landmark/spawner/tdomeobserve,
@@ -12930,7 +12941,7 @@
pixel_y = 5
},
/obj/structure/table/wood,
/obj/structure/sign/barsign{
/obj/machinery/barsign{
pixel_y = -32
},
/turf/simulated/floor/plasteel{
@@ -13931,11 +13942,6 @@
},
/turf/simulated/wall/indestructible/fakeglass,
/area/centcom/specops)
"Xi" = (
/obj/effect/spawner/window,
/obj/structure/sign/barsign,
/turf/simulated/floor/plating,
/area/centcom/evac)
"Xj" = (
/turf/simulated/floor/transparent/glass,
/area/centcom/specops)
@@ -46023,8 +46029,8 @@ Ng
Ng
So
Vs
Xi
Xx
Qe
jA
YO
ZZ
gI
@@ -73030,8 +73036,8 @@ vd
Ml
vd
xy
sd
Jy
Me
et
Jy
Jy
Jy
+11 -9
View File
@@ -23086,7 +23086,7 @@
/area/station/maintenance/port)
"bsg" = (
/obj/structure/table,
/obj/item/clothing/head/soft/grey{
/obj/item/clothing/head/soft{
pixel_x = -2;
pixel_y = 3
},
@@ -24963,10 +24963,6 @@
"bzd" = (
/turf/simulated/floor/plasteel/goonplaque/memorial,
/area/station/hallway/secondary/exit)
"bze" = (
/obj/structure/sign/barsign,
/turf/simulated/wall,
/area/station/service/bar)
"bzf" = (
/turf/simulated/floor/plasteel{
dir = 1;
@@ -71298,9 +71294,9 @@
"mIA" = (
/obj/structure/table,
/obj/item/stamp/granted,
/obj/item/clothing/head/soft,
/obj/item/clothing/head/soft/cargo,
/obj/item/hand_labeler,
/obj/item/clothing/head/soft,
/obj/item/clothing/head/soft/cargo,
/turf/simulated/floor/plasteel{
dir = 4;
icon_state = "brown"
@@ -76275,6 +76271,12 @@
},
/turf/simulated/floor/plating,
/area/station/maintenance/apmaint)
"pcF" = (
/obj/machinery/barsign{
pixel_y = 32
},
/turf/simulated/floor/plasteel,
/area/station/hallway/primary/starboard/west)
"pcH" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/disposalpipe/segment,
@@ -130569,8 +130571,8 @@ bmq
bmq
bmq
bzo
bze
bAk
aUS
pcF
bHy
bDb
bEy
+10 -24
View File
@@ -3620,7 +3620,6 @@
icon_state = "4-8"
},
/turf/simulated/floor/plasteel{
dir = 2;
icon_state = "green"
},
/area/station/public/quantum/service)
@@ -23133,7 +23132,7 @@
"cvm" = (
/obj/structure/table,
/obj/item/clothing/gloves/fingerless,
/obj/item/clothing/head/soft,
/obj/item/clothing/head/soft/cargo,
/turf/simulated/floor/plasteel{
icon_state = "darkbrown"
},
@@ -26138,10 +26137,6 @@
"cMz" = (
/turf/simulated/wall/r_wall,
/area/station/maintenance/fore)
"cMA" = (
/obj/structure/sign/barsign,
/turf/simulated/wall,
/area/station/maintenance/gambling_den)
"cME" = (
/obj/structure/cable/orange{
d1 = 2;
@@ -48367,10 +48362,6 @@
},
/turf/simulated/floor/plating,
/area/station/hallway/spacebridge/serveng)
"iwJ" = (
/obj/structure/sign/barsign,
/turf/simulated/wall,
/area/station/service/bar)
"iwU" = (
/obj/structure/sign/directions/evac{
dir = 4;
@@ -54698,7 +54689,6 @@
icon_state = "0-8"
},
/turf/simulated/floor/plasteel{
dir = 2;
icon_state = "green"
},
/area/station/public/quantum/service)
@@ -62093,6 +62083,9 @@
/obj/structure/chair/sofa/corp{
dir = 1
},
/obj/machinery/barsign{
pixel_y = -32
},
/turf/simulated/floor/carpet,
/area/station/hallway/primary/port/east)
"mJX" = (
@@ -62400,6 +62393,9 @@
"mPu" = (
/obj/structure/table/wood/poker,
/obj/effect/spawner/lootdrop/maintenance,
/obj/machinery/barsign{
pixel_y = 32
},
/turf/simulated/floor/wood{
icon_state = "wood-broken"
},
@@ -70189,16 +70185,6 @@
icon_state = "white"
},
/area/station/science/misc_lab)
"pqq" = (
/obj/machinery/door/airlock/multi_tile/glass{
dir = 4
},
/obj/effect/mapping_helpers/airlock/autoname,
/obj/machinery/door/firedoor,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
/area/station/public/quantum/security)
"pqr" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 4
@@ -116888,7 +116874,7 @@ xla
sZf
aWA
iEe
pqq
bNX
ibX
jzf
hPy
@@ -118729,7 +118715,7 @@ pkc
iqL
rZl
mJT
iwJ
aZZ
iox
bjr
rRc
@@ -122101,7 +122087,7 @@ bhO
hUU
sbn
sbn
cMA
uJT
mPu
mER
oWa
+107 -107
View File
@@ -2819,7 +2819,7 @@
/area/station/maintenance/fore)
"aqv" = (
/obj/structure/table/wood,
/obj/structure/sign/barsign{
/obj/machinery/barsign{
pixel_y = 32
},
/obj/item/wrench,
@@ -4880,7 +4880,7 @@
/turf/simulated/floor/engine,
/area/station/engineering/controlroom)
"avL" = (
/obj/structure/sign/barsign{
/obj/machinery/barsign{
pixel_y = 32
},
/turf/simulated/floor/plasteel{
@@ -9070,7 +9070,7 @@
/area/station/service/bar)
"aGA" = (
/obj/structure/table/wood,
/obj/structure/sign/barsign{
/obj/machinery/barsign{
pixel_y = 32
},
/obj/machinery/chem_dispenser/soda{
@@ -10213,6 +10213,12 @@
/obj/effect/landmark/spawner/nukedisc_respawn,
/turf/simulated/floor/plating,
/area/station/maintenance/auxsolarport)
"aJK" = (
/obj/machinery/light,
/obj/effect/turf_decal/stripes/line,
/obj/machinery/alarm/directional/south,
/turf/simulated/floor/plasteel,
/area/station/hallway/secondary/exit)
"aJM" = (
/obj/structure/cable{
d1 = 1;
@@ -13792,10 +13798,6 @@
icon_state = "bar"
},
/area/station/service/bar)
"aTq" = (
/obj/effect/spawner/airlock,
/turf/simulated/wall,
/area/station/hallway/secondary/exit)
"aTr" = (
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 1
@@ -54207,7 +54209,7 @@
/obj/machinery/light{
dir = 1
},
/obj/structure/sign/barsign{
/obj/machinery/barsign{
pixel_y = 32
},
/turf/simulated/floor/plating,
@@ -61709,13 +61711,21 @@
/turf/simulated/floor/plasteel,
/area/station/hallway/primary/aft/south)
"dHO" = (
/obj/effect/spawner/window/reinforced/grilled,
/obj/structure/cable{
d1 = 2;
d2 = 8;
icon_state = "2-8"
},
/obj/structure/cable{
d1 = 1;
d2 = 2;
icon_state = "1-2"
d2 = 8;
icon_state = "1-8"
},
/obj/structure/cable{
d2 = 8;
icon_state = "0-8"
},
/obj/structure/cable,
/obj/effect/spawner/window/reinforced/grilled,
/turf/simulated/floor/plating,
/area/station/hallway/secondary/exit)
"dHQ" = (
@@ -62691,17 +62701,6 @@
},
/turf/simulated/floor/carpet/blue,
/area/station/command/office/blueshield)
"dNS" = (
/obj/docking_port/stationary{
dir = 4;
dwidth = 16;
height = 21;
id = "emergency_home";
name = "emergency evac bay";
width = 41
},
/turf/space,
/area/space)
"dNZ" = (
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel{
@@ -63949,16 +63948,6 @@
/obj/item/crowbar/red,
/turf/simulated/floor/plasteel/dark,
/area/station/maintenance/apmaint)
"dSB" = (
/obj/machinery/atmospherics/unary/portables_connector{
dir = 8
},
/obj/machinery/atmospherics/portable/canister/air,
/obj/effect/turf_decal/stripes/line{
dir = 10
},
/turf/simulated/floor/plasteel,
/area/station/hallway/secondary/exit)
"dSD" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -64691,12 +64680,6 @@
icon_state = "neutralfull"
},
/area/station/hallway/primary/central)
"dUY" = (
/obj/machinery/light,
/obj/effect/turf_decal/stripes/line,
/obj/machinery/alarm/directional/south,
/turf/simulated/floor/plasteel,
/area/station/hallway/secondary/exit)
"dUZ" = (
/obj/machinery/light,
/obj/machinery/status_display{
@@ -66432,6 +66415,16 @@
/obj/effect/decal/cleanable/dirt,
/turf/simulated/wall,
/area/station/legal/lawoffice)
"evE" = (
/obj/structure/cable{
d1 = 1;
d2 = 2;
icon_state = "1-2"
},
/obj/structure/cable,
/obj/effect/spawner/window/reinforced/grilled,
/turf/simulated/floor/plating,
/area/station/hallway/secondary/exit)
"evX" = (
/obj/structure/cable,
/obj/effect/spawner/window/reinforced/grilled,
@@ -66566,6 +66559,22 @@
icon_state = "yellowcorner"
},
/area/station/hallway/primary/port/east)
"ezr" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 6
},
/obj/structure/cable{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/obj/structure/cable{
d1 = 2;
d2 = 4;
icon_state = "2-4"
},
/turf/simulated/floor/plasteel/white,
/area/station/medical/virology)
"ezR" = (
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel{
@@ -69236,6 +69245,10 @@
icon_state = "redyellowfull"
},
/area/station/maintenance/fsmaint)
"gcP" = (
/obj/effect/spawner/airlock,
/turf/simulated/wall,
/area/station/hallway/secondary/exit)
"gdJ" = (
/obj/effect/spawner/window/reinforced/grilled,
/turf/simulated/floor/plating,
@@ -71023,6 +71036,16 @@
},
/turf/simulated/floor/plating,
/area/station/command/office/rd)
"hli" = (
/obj/machinery/atmospherics/unary/portables_connector{
dir = 8
},
/obj/machinery/atmospherics/portable/canister/air,
/obj/effect/turf_decal/stripes/line{
dir = 10
},
/turf/simulated/floor/plasteel,
/area/station/hallway/secondary/exit)
"hly" = (
/obj/structure/table/wood,
/turf/simulated/floor/plasteel/dark,
@@ -75560,15 +75583,6 @@
icon_state = "whiteblue"
},
/area/station/medical/storage)
"kdg" = (
/obj/structure/sign/vacuum{
pixel_x = -32
},
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/simulated/floor/plasteel,
/area/station/hallway/secondary/exit)
"kdm" = (
/obj/machinery/power/apc/critical/directional/north,
/obj/machinery/firealarm{
@@ -75669,6 +75683,15 @@
},
/turf/simulated/floor/plasteel/dark,
/area/station/medical/morgue)
"kfC" = (
/obj/structure/sign/vacuum{
pixel_x = -32
},
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/simulated/floor/plasteel,
/area/station/hallway/secondary/exit)
"kfT" = (
/obj/structure/cable{
d2 = 4;
@@ -76089,6 +76112,17 @@
/obj/effect/spawner/random_spawners/blood_maybe,
/turf/simulated/floor/plating,
/area/station/maintenance/fsmaint)
"ksE" = (
/obj/docking_port/stationary{
dir = 4;
dwidth = 16;
height = 21;
id = "emergency_home";
name = "emergency evac bay";
width = 41
},
/turf/space,
/area/space)
"ksV" = (
/obj/machinery/door/airlock/maintenance,
/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
@@ -82354,22 +82388,6 @@
icon_state = "red"
},
/area/station/security/permabrig)
"ogR" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 6
},
/obj/structure/cable{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
/obj/structure/cable{
d1 = 2;
d2 = 4;
icon_state = "2-4"
},
/turf/simulated/floor/plasteel/white,
/area/station/medical/virology)
"ogX" = (
/obj/machinery/camera{
c_tag = "Experimentation Lab Office";
@@ -91307,6 +91325,21 @@
},
/turf/simulated/floor/plasteel,
/area/station/science/research)
"tjT" = (
/obj/item/radio/intercom{
name = "west bump";
pixel_x = -28
},
/obj/machinery/newscaster{
dir = 1;
name = "south bump";
pixel_y = -28
},
/obj/effect/turf_decal/stripes/line{
dir = 10
},
/turf/simulated/floor/plasteel,
/area/station/hallway/secondary/exit)
"tkb" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
@@ -91839,24 +91872,6 @@
icon_state = "yellowcorner"
},
/area/station/hallway/primary/port/west)
"tEp" = (
/obj/effect/spawner/window/reinforced/grilled,
/obj/structure/cable{
d1 = 2;
d2 = 8;
icon_state = "2-8"
},
/obj/structure/cable{
d1 = 1;
d2 = 8;
icon_state = "1-8"
},
/obj/structure/cable{
d2 = 8;
icon_state = "0-8"
},
/turf/simulated/floor/plating,
/area/station/hallway/secondary/exit)
"tEw" = (
/obj/structure/showcase{
density = 0;
@@ -92354,21 +92369,6 @@
/obj/effect/spawner/window/reinforced/grilled,
/turf/simulated/floor/plating,
/area/station/security/prison/cell_block)
"tSp" = (
/obj/item/radio/intercom{
name = "west bump";
pixel_x = -28
},
/obj/machinery/newscaster{
dir = 1;
name = "south bump";
pixel_y = -28
},
/obj/effect/turf_decal/stripes/line{
dir = 10
},
/turf/simulated/floor/plasteel,
/area/station/hallway/secondary/exit)
"tSt" = (
/obj/structure/table,
/obj/item/reagent_containers/drinks/drinkingglass{
@@ -136687,7 +136687,7 @@ dIx
dIx
dIx
dIx
aTq
gcP
abj
aaa
aaa
@@ -137198,7 +137198,7 @@ dPM
dkq
dSs
dSP
dSB
hli
dIH
dIH
dIH
@@ -137456,8 +137456,8 @@ dNa
dXJ
dKo
dUj
kdg
tSp
kfC
tjT
dIH
abj
aaa
@@ -138742,7 +138742,7 @@ joI
dNc
dNQ
dOw
dUY
aJK
dIH
abj
aaa
@@ -140526,10 +140526,10 @@ pIY
kuJ
kpd
kpd
tEp
dHO
dHO
dHO
evE
evE
evE
tJT
dKQ
jpk
@@ -141304,7 +141304,7 @@ aaa
aaa
aaa
aaa
dNS
ksE
aaa
aaa
aaa
@@ -149011,7 +149011,7 @@ dGw
dGw
hGZ
qgr
ogR
ezr
wWW
qfH
sRk
+11 -7
View File
@@ -6218,10 +6218,6 @@
},
/turf/simulated/floor/plasteel,
/area/station/engineering/control)
"aHe" = (
/obj/structure/sign/barsign,
/turf/simulated/wall,
/area/station/service/bar)
"aHg" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -10928,7 +10924,7 @@
/area/station/public/locker)
"aVT" = (
/obj/structure/table,
/obj/item/clothing/head/soft/grey{
/obj/item/clothing/head/soft{
pixel_x = -2;
pixel_y = 3
},
@@ -45393,6 +45389,14 @@
icon_state = "neutralcorner"
},
/area/station/hallway/primary/central/west)
"dKD" = (
/obj/machinery/barsign{
pixel_y = -32
},
/turf/simulated/floor/plasteel{
icon_state = "redcorner"
},
/area/station/hallway/primary/starboard)
"dKK" = (
/obj/effect/spawner/window/reinforced/grilled,
/turf/simulated/floor/plating,
@@ -127034,8 +127038,8 @@ bjp
bez
vtx
boY
bqA
aHe
dKD
bsp
ded
bEv
bEv
+8 -6
View File
@@ -454,6 +454,12 @@
},
/turf/simulated/floor/pod,
/area/ruin/powered/beach)
"qe" = (
/obj/machinery/barsign{
pixel_y = 32
},
/turf/simulated/floor/beach/sand,
/area/ruin/powered/beach)
"qT" = (
/obj/machinery/shower{
dir = 8
@@ -491,10 +497,6 @@
},
/turf/simulated/floor/beach/sand,
/area/ruin/powered/beach)
"Ds" = (
/obj/structure/sign/barsign,
/turf/simulated/wall/mineral/sandstone,
/area/ruin/powered/beach)
"Ec" = (
/obj/machinery/door/airlock/sandstone{
name = "Beach Access"
@@ -1087,8 +1089,8 @@ aC
aC
aC
JF
Ds
bE
aj
qe
bE
bE
bE
+4
View File
@@ -37,6 +37,10 @@
#define SLOT_HUD_COLLAR 23
#define SLOT_HUD_AMOUNT 23
// Boolean defines for hands
#define HAND_BOOL_RIGHT 0
#define HAND_BOOL_LEFT 1
// accessory slots
#define ACCESSORY_SLOT_DECOR 1
#define ACCESSORY_SLOT_UTILITY 2
+6
View File
@@ -357,3 +357,9 @@
#define TS_TIER_3 3
#define TS_TIER_4 4
#define TS_TIER_5 5
/* Defines used for `incorporeal_move` */
#define NO_INCORPOREAL_MOVE 0
#define INCORPOREAL_MOVE_NORMAL 1
#define INCORPOREAL_MOVE_NINJA 2
#define INCORPOREAL_MOVE_HOLY_BLOCK 3
-5
View File
@@ -26,11 +26,6 @@
return TRUE
return FALSE
/proc/iscrowbar(O)
if(istype(O, /obj/item/crowbar))
return TRUE
return FALSE
/proc/iscoil(O)
if(istype(O, /obj/item/stack/cable_coil))
return TRUE
+8 -2
View File
@@ -70,8 +70,14 @@
return num_list
//Splits the text of a file at seperator and returns them in a list.
/proc/file2list(filename, seperator="\n")
return splittext(return_file_text(filename),seperator)
/proc/file2list(filename, separator = "\n", no_empty = TRUE)
var/list/result = list()
for(var/line in splittext(return_file_text(filename), separator))
var/text = trim(line)
if(no_empty && !text)
continue
result += text
return result
/proc/dir2text(direction)
switch(direction)
+1 -1
View File
@@ -1172,7 +1172,7 @@ GLOBAL_LIST_INIT(wall_items, typecacheof(list(/obj/machinery/power/apc, /obj/mac
/obj/machinery/computer/security/telescreen, /obj/machinery/airlock_controller,
/obj/item/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth,
/obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment,
/obj/structure/sign)))
/obj/structure/sign, /obj/machinery/barsign)))
/proc/gotwallitem(loc, dir)
for(var/obj/O in loc)
+2 -2
View File
@@ -486,9 +486,9 @@
var/mob/M = usr
switch(name)
if("right hand", "r_hand")
M.activate_hand("r")
M.activate_hand(HAND_BOOL_RIGHT)
if("left hand", "l_hand")
M.activate_hand("l")
M.activate_hand(HAND_BOOL_LEFT)
return TRUE
/atom/movable/screen/swap_hand
+7 -7
View File
@@ -341,7 +341,7 @@ SUBSYSTEM_DEF(timer)
return
// Sort it first
var/list/sorted = sortTim(GLOB.timers_by_type, GLOBAL_PROC_REF(cmp_numeric_dsc), TRUE)
var/list/sorted = sortTim(GLOB.timers_by_proc, GLOBAL_PROC_REF(cmp_numeric_dsc), TRUE)
// DOOMP EET
var/timer_json_file = file("[GLOB.log_directory]/timers.json")
@@ -571,14 +571,14 @@ SUBSYSTEM_DEF(timer)
CRASH("this timer is attached to no object, the attempted proc to call was [callBack.delegate]")
. = "[callBack.object.type]"
GLOBAL_LIST_EMPTY(timers_by_type)
GLOBAL_LIST_EMPTY(timers_by_proc)
// Allows us to track what types generate the most timers. Just invokes the global addtimer
/datum/proc/addtimer(datum/callback/callback, wait = 0, flags = 0)
var/tt = "[type]"
if(tt in GLOB.timers_by_type)
GLOB.timers_by_type[tt]++
var/timer_function = "[type][callback.delegate]"
if(timer_function in GLOB.timers_by_proc)
GLOB.timers_by_proc[timer_function]++
else
GLOB.timers_by_type[tt] = 1
GLOB.timers_by_proc[timer_function] = 1
return global.addtimer(callback, wait, flags)
/**
@@ -594,7 +594,7 @@ GLOBAL_LIST_EMPTY(timers_by_type)
if(!check_rights(R_DEBUG | R_VIEWRUNTIMES))
return
var/list/sorted = sortTim(GLOB.timers_by_type, GLOBAL_PROC_REF(cmp_numeric_dsc), TRUE)
var/list/sorted = sortTim(GLOB.timers_by_proc, GLOBAL_PROC_REF(cmp_numeric_dsc), TRUE)
var/list/text = list("<h1>Timer Log</h1>", "<ul>")
for(var/key in sorted)
text += "<li>[key] - [sorted[key]]</li>"
+1 -1
View File
@@ -4,7 +4,7 @@
var/rights
/datum/keybinding/admin/can_use(client/C, mob/M)
if(rights && !check_rights(rights, FALSE))
if(rights && !check_rights(rights, FALSE, M))
return FALSE
return !isnull(C.holder) && ..()
+16
View File
@@ -42,6 +42,22 @@
. = ..()
C.mob.swap_hand()
/datum/keybinding/mob/hand_right
name = "Swap to/Activate Right Hand"
/datum/keybinding/mob/hand_right/down(client/C)
. = ..()
if(!C.mob.activate_hand(HAND_BOOL_RIGHT))
C.mob.mode()
/datum/keybinding/mob/hand_left
name = "Swap to/Activate Left Hand"
/datum/keybinding/mob/hand_left/down(client/C)
. = ..()
if(!C.mob.activate_hand(HAND_BOOL_LEFT))
C.mob.mode()
// Intents
/datum/keybinding/mob/prev_intent
name = "Previous Intent"
+1 -1
View File
@@ -863,7 +863,7 @@
/datum/outfit/admin/trader/sol
name = "Trans-Solar Federation Trader"
suit = /obj/item/clothing/suit/jacket/cargobomber
head = /obj/item/clothing/head/soft
head = /obj/item/clothing/head/soft/cargo
/datum/outfit/admin/trader/cyber
name = "Cybersun Industries Trader"
+1 -1
View File
@@ -26,7 +26,7 @@
/atom/movable/lighting_object,
/obj/machinery/dna_vault,
/obj/machinery/power/bluespace_tap,
/obj/structure/sign/barsign,
/obj/machinery/barsign,
/obj/machinery/atmospherics/unary/cryo_cell,
/obj/machinery/gravity_generator
)
@@ -77,6 +77,7 @@
cost = 25 //A chef can get a knife that sharp easily, though it won't block. While you can get endless boomerang, they are less deadly than a stech, and slower / more predictable.
job = list("Mime", "Chef")
// Shaft miner
/datum/uplink_item/jobspecific/pressure_mod
name = "Kinetic Accelerator Pressure Mod"
desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity."
@@ -86,6 +87,15 @@
job = list("Shaft Miner")
surplus = 0 // Requires a KA to even be used.
/datum/uplink_item/jobspecific/mining_charge_hacker
name = "Mining Charge Hacker"
desc = "Looks and functions like an advanced mining scanner, but allows mining charges to be placed anywhere and destroy more than rocks. \
Use it on a mining charge to override its safeties. Reduces explosive power of mining charges due to the modification of their internals."
reference = "MCH"
item = /obj/item/t_scanner/adv_mining_scanner/syndicate
cost = 25
job = list("Shaft Miner")
//Chef
/datum/uplink_item/jobspecific/specialsauce
name = "Chef Excellence's Special Sauce"
+13 -10
View File
@@ -16,27 +16,29 @@
var/list/blood_DNA
var/blood_color
var/pass_flags = 0
var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom.
var/simulated = TRUE //filter for actions - used by lighting overlays
/// The higher the germ level, the more germ on the atom.
var/germ_level = GERM_LEVEL_AMBIENT
/// Filter for actions - used by lighting overlays
var/simulated = TRUE
var/atom_say_verb = "says"
var/bubble_icon = "default" ///what icon the mob uses for speechbubbles
var/dont_save = FALSE // For atoms that are temporary by necessity - like lighting overlays
/// What icon the mob uses for speechbubbles
var/bubble_icon = "default"
///Chemistry.
// Chemistry.
var/container_type = NONE
var/datum/reagents/reagents = null
//This atom's HUD (med/sec, etc) images. Associative list.
/// This atom's HUD (med/sec, etc) images. Associative list.
var/list/image/hud_list
//HUD images that this atom can provide.
/// HUD images that this atom can provide.
var/list/hud_possible
//Value used to increment ex_act() if reactionary_explosions is on
/// Value used to increment ex_act() if reactionary_explosions is on
var/explosion_block = 0
//Detective Work, used for the duplicate data points kept in the scanners
// Detective Work, used for the duplicate data points kept in the scanners
var/list/original_atom
/// Materials scannable by detective
/// List of fibers that this atom has
var/list/suit_fibers
var/admin_spawned = FALSE //was this spawned by an admin? used for stat tracking stuff.
@@ -536,6 +538,7 @@
if(reagents)
reagents.temperature_reagents(exposed_temperature)
/// If it returns TRUE, attack chain stops
/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type)
switch(tool_type)
if(TOOL_CROWBAR)
+4 -4
View File
@@ -232,7 +232,7 @@
//////////////////
////////////////////////////////////////
// Totally Crippling
// MARK: Totally Crippling
////////////////////////////////////////
// WAS: /datum/bioEffect/mute
@@ -252,7 +252,7 @@
return ""
////////////////////////////////////////
// Harmful to others as well as self
// MARK: Harmful to everyone
////////////////////////////////////////
/datum/mutation/disability/radioactive
@@ -283,7 +283,7 @@
return "rads_s"
////////////////////////////////////////
// Other disabilities
// MARK: Other disabilities
////////////////////////////////////////
// WAS: /datum/bioEffect/fat
@@ -447,7 +447,7 @@
return "[prefix][uppertext(jointext(rearranged," "))]!!"
//////////////////
// USELESS SHIT //
// MARK: USELESS SHIT
//////////////////
// WAS: /datum/bioEffect/strong
@@ -38,7 +38,7 @@
environment_smash = initial(environment_smash)
alpha = 255
range = 13
incorporeal_move = 0
incorporeal_move = NO_INCORPOREAL_MOVE
ADD_TRAIT(src, TRAIT_CAN_STRIP, TRAIT_GENERIC)
to_chat(src, "<span class='danger'>You switch to combat mode.</span>")
toggle = FALSE
@@ -50,7 +50,7 @@
environment_smash = ENVIRONMENT_SMASH_NONE
alpha = 60
range = 255
incorporeal_move = 1
incorporeal_move = INCORPOREAL_MOVE_NORMAL
REMOVE_TRAIT(src, TRAIT_CAN_STRIP, TRAIT_GENERIC) //spiritual pickpocketting is forbidden
to_chat(src, "<span class='danger'>You switch to scout mode.</span>")
toggle = TRUE
@@ -16,7 +16,7 @@
var/icon_stun = "revenant_stun"
var/icon_drain = "revenant_draining"
mob_biotypes = MOB_SPIRIT
incorporeal_move = 3
incorporeal_move = INCORPOREAL_MOVE_HOLY_BLOCK
see_invisible = INVISIBILITY_REVENANT
invisibility = INVISIBILITY_REVENANT
health = INFINITY //Revenants don't use health, they use essence instead
@@ -79,7 +79,7 @@
if(unreveal_time && world.time >= unreveal_time)
unreveal_time = 0
revealed = 0
incorporeal_move = 3
incorporeal_move = INCORPOREAL_MOVE_HOLY_BLOCK
invisibility = INVISIBILITY_REVENANT
to_chat(src, "<span class='revenboldnotice'>You are once more concealed.</span>")
if(unstun_time && world.time >= unstun_time)
@@ -275,7 +275,7 @@
return
revealed = 1
invisibility = 0
incorporeal_move = 0
incorporeal_move = NO_INCORPOREAL_MOVE
if(!unreveal_time)
to_chat(src, "<span class='revendanger'>You have been revealed!</span>")
unreveal_time = world.time + time
+4 -1
View File
@@ -358,6 +358,7 @@
clone.set_heartattack(FALSE) //you are not allowed to die
clone.adjustCloneLoss(25) //to punish early ejects
clone.Weaken(4 SECONDS)
ADD_TRAIT(clone, TRAIT_NOFIRE, "cloning") // Plasmamen shouldn't catch fire while cloning
//Ejects a clone. The force var ejects even if there's still clone damage.
/obj/machinery/clonepod/proc/eject_clone(force = FALSE)
@@ -376,6 +377,7 @@
patient_mind.transfer_to(clone)
clone.grab_ghost()
clone.update_revive()
REMOVE_TRAIT(clone, TRAIT_NOFIRE, "cloning")
to_chat(clone, "<span class='userdanger'>You remember nothing from the time that you were dead!</span>")
to_chat(clone, "<span class='notice'>There's a bright flash of light, and you take your first breath once more.</span>")
@@ -393,7 +395,8 @@
patient_mind.transfer_to(clone)
clone.grab_ghost()
clone.update_revive()
to_chat(clone, "<span class='userdanger'>You remember nothing from the time that you were dead!")
REMOVE_TRAIT(clone, TRAIT_NOFIRE, "cloning")
to_chat(clone, "<span class='userdanger'>You remember nothing from the time that you were dead!</span>")
to_chat(clone, "<span class='danger'>You're ripped out of blissful oblivion! You feel like shit.</span>")
reset_cloning()
+1 -1
View File
@@ -128,7 +128,7 @@
A.amount = 5
return
if(3)
if(istype(P, /obj/item/crowbar))
if(P.tool_behaviour == TOOL_CROWBAR)
playsound(src.loc, P.usesound, 50, 1)
state = 2
circuit.loc = src.loc
+11 -11
View File
@@ -1,5 +1,5 @@
/*
Station Airlocks Regular
MARK: Station Airlocks Regular
*/
/obj/machinery/door/airlock/command
@@ -60,7 +60,7 @@
//////////////////////////////////
/*
Station Airlocks Glass
MARK: Station Airlocks Glass
*/
/obj/machinery/door/airlock/glass
@@ -116,7 +116,7 @@
//////////////////////////////////
/*
Station Airlocks Mineral
MARK: Station Airlocks Mineral
*/
/obj/machinery/door/airlock/gold
@@ -273,7 +273,7 @@
//////////////////////////////////
/*
Station2 Airlocks
MARK: Station2 Airlocks
*/
/obj/machinery/door/airlock/public
@@ -287,7 +287,7 @@
//////////////////////////////////
/*
External Airlocks
MARK: External Airlocks
*/
/obj/machinery/door/airlock/external
@@ -317,7 +317,7 @@
//////////////////////////////////
/*
CentCom Airlocks
MARK: CentCom Airlocks
*/
/obj/machinery/door/airlock/centcom
@@ -339,7 +339,7 @@
//////////////////////////////////
/*
Vault Airlocks
MARK: Vault Airlocks
*/
/obj/machinery/door/airlock/vault
@@ -354,7 +354,7 @@
//////////////////////////////////
/*
Hatch Airlocks
MARK: Hatch Airlocks
*/
/obj/machinery/door/airlock/hatch
@@ -400,7 +400,7 @@
//////////////////////////////////
/*
High Security Airlocks
MARK: High Security Airlocks
*/
/obj/machinery/door/airlock/highsecurity
@@ -474,7 +474,7 @@
//////////////////////////////////
/*
Cult Airlocks
MARK: Cult Airlocks
*/
/obj/machinery/door/airlock/cult
@@ -610,7 +610,7 @@
//////////////////////////////////
/*
Misc Airlocks
MARK: Misc Airlocks
*/
//Terribly sorry for the code doubling, but things go derpy otherwise.
+19 -10
View File
@@ -156,7 +156,7 @@ GLOBAL_LIST_EMPTY(holopads)
var/datum/holocall/HC = I
HC.Disconnect(src)
/obj/machinery/hologram/holopad/interact(mob/living/carbon/human/user) //Carn: hologram requests.
/obj/machinery/hologram/holopad/interact(mob/living/user)
if(!istype(user))
return
if(!anchored)
@@ -262,20 +262,24 @@ GLOBAL_LIST_EMPTY(holopads)
updateDialog()
//do not allow AIs to answer calls or people will use it to meta the AI satellite
/obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai/user)
if(!istype(user))
/obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai_or_robot)
var/mob/living/silicon/ai/ai = ai_or_robot
var/mob/living/silicon/robot/robot = ai_or_robot
if(!istype(ai) && !istype(robot))
return
if(outgoing_call)
return
if(istype(robot))
interact(robot)
/*There are pretty much only three ways to interact here.
I don't need to check for client since they're clicking on an object.
This may change in the future but for now will suffice.*/
if(user.eyeobj.loc != loc)//Set client eye on the object if it's not already.
user.eyeobj.setLoc(get_turf(src))
else if(!LAZYLEN(masters) || !masters[user])//If there is no hologram, possibly make one.
activate_holo(user, 1)
else if(ai.eyeobj.loc != loc)//Set client eye on the object if it's not already.
ai.eyeobj.setLoc(get_turf(src))
else if(!LAZYLEN(masters) || !masters[ai])//If there is no hologram, possibly make one.
activate_holo(ai, 1)
else//If there is a hologram, remove it.
clear_holo(user)
clear_holo(ai)
/obj/machinery/hologram/holopad/process()
for(var/I in masters)
@@ -373,8 +377,13 @@ GLOBAL_LIST_EMPTY(holopads)
if(isAI(user))
hologram.icon = AI.holo_icon
else //make it like real life
hologram.icon = getHologramIcon(get_id_photo(user))
hologram.icon_state = user.icon_state
if(isrobot(user))
var/mob/living/silicon/robot/robot = user
hologram.icon = getHologramIcon(icon(robot.icon))
hologram.icon_state = robot.icon_state
else
hologram.icon = getHologramIcon(get_id_photo(user))
hologram.icon_state = user.icon_state
hologram.alpha = 100
hologram.Impersonation = user
+1 -1
View File
@@ -142,7 +142,7 @@
return FALSE
if(4) // Grille in place
if(istype(W, /obj/item/crowbar))
if(W.tool_behaviour == TOOL_CROWBAR)
to_chat(user, "You begin to pry off the grille from \the [src]...")
playsound(get_turf(src), W.usesound, 50, 1)
if(do_after(user, 30 * W.toolspeed, target = src) && (build == 4))
+3 -3
View File
@@ -334,7 +334,7 @@ GLOBAL_LIST_EMPTY(turret_icons)
/obj/machinery/porta_turret/attackby(obj/item/I, mob/user)
if((stat & BROKEN) && !syndicate)
if(istype(I, /obj/item/crowbar))
if(I.tool_behaviour == TOOL_CROWBAR)
//If the turret is destroyed, you can remove it with a crowbar to
//try and salvage its components
to_chat(user, "<span class='notice'>You begin prying the metal coverings off.</span>")
@@ -861,7 +861,7 @@ GLOBAL_LIST_EMPTY(turret_icons)
build_step = 1
return
else if(istype(I, /obj/item/crowbar) && !anchored)
else if(I.tool_behaviour == TOOL_CROWBAR && !anchored)
playsound(loc, I.usesound, 75, 1)
to_chat(user, "<span class='notice'>You dismantle the turret construction.</span>")
new /obj/item/stack/sheet/metal( loc, 5)
@@ -955,7 +955,7 @@ GLOBAL_LIST_EMPTY(turret_icons)
return
if(7)
if(istype(I, /obj/item/crowbar))
if(I.tool_behaviour == TOOL_CROWBAR)
playsound(loc, I.usesound, 75, 1)
to_chat(user, "<span class='notice'>You pry off the turret's exterior armor.</span>")
new /obj/item/stack/sheet/metal(loc, 2)
+10 -3
View File
@@ -225,6 +225,15 @@ GLOBAL_LIST_EMPTY(allRequestConsoles)
has_active_secondary_goal = check_for_active_secondary_goal(goalRequester)
if(has_active_secondary_goal || !secondaryGoalAuth)
return
var/found_message_server = FALSE
for(var/obj/machinery/message_server/MS as anything in GLOB.message_servers)
if(MS.active)
found_message_server = TRUE
break
if(!found_message_server)
screen = RCS_SENTFAIL
return
generate_secondary_goal(department, goalRequester, usr)
reset_message(FALSE)
view_messages()
@@ -235,7 +244,6 @@ GLOBAL_LIST_EMPTY(allRequestConsoles)
screen = RCS_SENTPASS
else
screen = RCS_SENTFAIL
atom_say("No server detected!")
//Handle screen switching
if("setScreen")
@@ -393,8 +401,7 @@ GLOBAL_LIST_EMPTY(allRequestConsoles)
if(!message)
return
var/found_message_server = FALSE
for(var/M in GLOB.message_servers)
var/obj/machinery/message_server/MS = M
for(var/obj/machinery/message_server/MS as anything in GLOB.message_servers)
if(!MS.active)
continue
MS.send_rc_message(ckey(recipient), sender, message, stamped, verified, priority)
+6
View File
@@ -296,6 +296,12 @@
/obj/machinery/shieldgen/update_icon_state()
icon_state = "shield[active ? "on" : "off"][malfunction ? "br" : ""]"
/obj/machinery/shieldgen/onShuttleMove(turf/oldT, turf/T1, rotation, mob/caller)
. = ..()
if(active)
shields_down()
addtimer(CALLBACK(src, PROC_REF(shields_up)), 1 SECONDS)//Lets docking finish, prevents placing shields on shuttle tiles.
/obj/machinery/shieldgen/raven
name = "military shield generator"
desc = "Military grade shield generators used to protect spaceships from incoming fire."
+17 -12
View File
@@ -347,16 +347,6 @@
to_chat(usr, "<span class='warning'>The unit is not operational.</span>")
return
if(panel_open)
if(istype(I, /obj/item/crowbar))
if(occupant || helmet || suit || storage || boots)
to_chat(user, "<span class='warning'>There are contents that prevent you from deconstructing [src]!</span>")
return
if(locked)
to_chat(user, "<span class='warning'>The security system prevents you from deconstructing [src]!</span>")
return
dump_contents() // probably still a good idea for just incase?
default_deconstruction_crowbar(user, I)
return
wires.Interact(user)
return
if(state_open)
@@ -369,10 +359,25 @@
return
return ..()
/obj/machinery/suit_storage_unit/screwdriver_act(mob/user, obj/item/I)
if(!I.use_tool(src, user, 0, volume = I.tool_volume))
/obj/machinery/suit_storage_unit/crowbar_act(mob/living/user, obj/item/I)
if(!panel_open)
return
. = TRUE
if(!I.use_tool(src, user, volume = I.tool_volume))
return
if(occupant || helmet || suit || storage || boots)
to_chat(user, "<span class='warning'>There are contents that prevent you from deconstructing [src]!</span>")
return
if(locked)
to_chat(user, "<span class='warning'>The security system prevents you from deconstructing [src]!</span>")
return
dump_contents() // probably still a good idea for just incase?
default_deconstruction_crowbar(user, I)
/obj/machinery/suit_storage_unit/screwdriver_act(mob/user, obj/item/I)
. = TRUE
if(!I.use_tool(src, user, I.tool_volume))
return
if(shocked && !(stat & NOPOWER))
if(shock(user, 100))
return
+4 -4
View File
@@ -554,7 +554,7 @@
/obj/item/clothing/suit/hooded/wintercoat/cargo = 3,
/obj/item/clothing/suit/jacket/cargobomber = 3,
/obj/item/clothing/suit/storage/hazardvest = 3,
/obj/item/clothing/head/soft = 3,
/obj/item/clothing/head/soft/cargo = 3,
/obj/item/clothing/head/hardhat/orange = 2,
/obj/item/clothing/gloves/fingerless = 6,
/obj/item/clothing/accessory/armband/cargo = 6,
@@ -571,7 +571,7 @@
/obj/item/clothing/suit/hooded/wintercoat/cargo = 75,
/obj/item/clothing/suit/jacket/cargobomber = 75,
/obj/item/clothing/suit/storage/hazardvest = 50,
/obj/item/clothing/head/soft = 20,
/obj/item/clothing/head/soft/cargo = 20,
/obj/item/clothing/head/hardhat/orange = 30,
/obj/item/clothing/gloves/fingerless = 20,
/obj/item/clothing/accessory/armband/cargo = 20,
@@ -597,7 +597,7 @@
/obj/item/clothing/suit/chef = 2,
/obj/item/clothing/suit/chef/classic = 2,
/obj/item/clothing/head/chefhat = 2,
/obj/item/clothing/head/soft/mime = 2,
/obj/item/clothing/head/soft/white = 2,
/obj/item/clothing/head/beret/white = 2,
/obj/item/clothing/shoes/laceup = 2,
/obj/item/clothing/shoes/white = 2,
@@ -614,7 +614,7 @@
/obj/item/clothing/suit/chef = 50,
/obj/item/clothing/suit/chef/classic = 50,
/obj/item/clothing/head/chefhat = 50,
/obj/item/clothing/head/soft/mime = 30,
/obj/item/clothing/head/soft/white = 30,
/obj/item/clothing/head/beret/white = 20,
/obj/item/clothing/shoes/laceup = 30,
/obj/item/clothing/shoes/white = 20,
+1 -1
View File
@@ -129,7 +129,7 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/heavy(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
+5 -6
View File
@@ -101,10 +101,10 @@
desc = "An ion shotgun, that when fired gives the mecha a second of EMP shielding with the excess energy from the discharge."
icon_state = "mecha_ion"
origin_tech = "materials=4;combat=5;magnets=4"
energy_drain = 300 // This is per shot + 1x cost, so 1500 per shotgun shot
energy_drain = 215 // This is per shot + 1x cost, so ~1500 per shotgun shot
projectile = /obj/item/projectile/ion/weak
projectiles_per_shot = 4
variance = 35
projectiles_per_shot = 6
variance = 40
fire_sound = 'sound/weapons/ionrifle.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion/action()
@@ -501,13 +501,12 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/mining_grenade
name = "\improper \"Little boy\" Mining Grenade Launcher"
icon_state = "mecha_missilerack_six"
icon_state = "mining_launcher"
origin_tech = "combat=5;materials=4;engineering=4"
projectile = /obj/item/projectile/bullet/reusable/mining_bomb/mecha
fire_sound = 'sound/effects/bang.ogg'
energy_drain = 350 // cost A LOT, but powerful miner tool
energy_drain = 150 // cost a lot, but powerful miner tool
equip_cooldown = 2 SECONDS
harmful = TRUE
/obj/item/mecha_parts/mecha_equipment/weapon/energy/mining_grenade/action()
if(!lavaland_equipment_pressure_check(get_turf(chassis)))
+13 -10
View File
@@ -18,6 +18,8 @@
var/ruin_mecha = FALSE //if the mecha starts on a ruin, don't automatically give it a tracking beacon to prevent metagaming.
var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items)
var/can_move = 0 // time of next allowed movement
/// Time it takes to enter the mech
var/mech_enter_time = 4 SECONDS
var/mob/living/carbon/occupant = null
var/step_in = 10 //make a step in step_in/10 sec.
var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South.
@@ -262,8 +264,9 @@
//////////////////////////////////
//////// Movement procs ////////
//////// MARK: Movement procs
//////////////////////////////////
/obj/mecha/Process_Spacemove(movement_dir = 0)
. = ..()
if(.)
@@ -449,7 +452,7 @@
///////////////////////////////////
//////// Internal damage ////////
//////// MARK: Internal damage
///////////////////////////////////
/obj/mecha/proc/check_for_internal_damage(list/possible_int_damage, ignore_threshold=null)
@@ -492,7 +495,7 @@
////////////////////////////////////////
//////// Health related procs ////////
//////// MARK: Health related procs
////////////////////////////////////////
/obj/mecha/proc/get_armour_facing(relative_dir)
@@ -686,7 +689,7 @@
check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL))
//////////////////////
////// AttackBy //////
////// MARK: AttackBy
//////////////////////
/obj/mecha/attackby(obj/item/W, mob/user, params)
@@ -918,7 +921,7 @@
/////////////////////////////////////
//////////// AI piloting ////////////
//////////// MARK: AI piloting
/////////////////////////////////////
/obj/mecha/attack_ai(mob/living/silicon/ai/user)
@@ -1024,7 +1027,7 @@
GrantActions(AI, !AI.can_dominate_mechs)
/////////////////////////////////////
//////// Atmospheric stuff ////////
//////// MARK: Atmospheric stuff
/////////////////////////////////////
/obj/mecha/proc/get_turf_air()
@@ -1154,7 +1157,7 @@
return TRUE
/obj/mecha/proc/put_in(mob/user) // need this proc to use INVOKE_ASYNC in other proc. You're not recommended to use that one
if(do_after(user, 40, target = src))
if(do_after(user, mech_enter_time, target = src))
if(obj_integrity <= 0)
to_chat(user, "<span class='warning'>You cannot get in the [name], it has been destroyed!</span>")
else if(occupant)
@@ -1338,7 +1341,7 @@
go_out()
/////////////////////////
////// Access stuff /////
////// MARK: Access stuff
/////////////////////////
/obj/mecha/proc/operation_allowed(mob/living/carbon/human/H)
@@ -1376,7 +1379,7 @@
return 1
///////////////////////
///// Power stuff /////
///// MARK: Power stuff
///////////////////////
/obj/mecha/proc/has_charge(amount)
@@ -1436,7 +1439,7 @@
return icon_state
//////////////////////////////////////////
//////// Mecha global iterators ////////
//////// MARK: Mecha global iterators
//////////////////////////////////////////
/obj/mecha/process()
+1
View File
@@ -6,6 +6,7 @@
step_in = 4 //Move speed, lower is faster.
var/fast_pressure_step_in = 2 //step_in while in normal pressure conditions
var/slow_pressure_step_in = 4 //step_in while in better pressure conditions
mech_enter_time = 3 SECONDS
max_temperature = 20000
max_integrity = 200
lights_power = 7
@@ -154,7 +154,7 @@
to_chat(user, "<span class='warning'>Turn off [src] before you perform this action!</span>")
return FALSE
user.visible_message("<span class='notice'>[user] unscrews [src]'s maintenance panel and begins fiddling with its innards...</span>", "<span class='notice'>You begin resetting [src]...</span>")
if(!I.use_tool(src, user, 40, volume = 50))
if(!I.use_tool(src, user, 40, I.tool_volume))
return FALSE
user.visible_message("<span class='notice'>[user] refastens [src]'s maintenance panel!</span>", "<span class='notice'>You reset [src] to its factory settings!</span>")
emagged = FALSE
@@ -81,7 +81,7 @@
return TRUE
/*******************/
/**** COMMON ****/
// MARK: COMMON
/*******************/
/obj/item/borg/upgrade/reset
@@ -268,7 +268,7 @@
return TRUE
/***********************/
/**** SECURITY ****/
// MARK: Security
/***********************/
/obj/item/borg/upgrade/disablercooler
@@ -294,7 +294,7 @@
return TRUE
/*******************/
/**** MINING ****/
// MARK: Mining
/*******************/
/obj/item/borg/upgrade/ddrill
@@ -333,7 +333,7 @@
return TRUE
/***********************/
/**** ENGINEER ****/
// MARK: Engineer
/***********************/
/obj/item/borg/upgrade/rcd
@@ -360,7 +360,7 @@
items_to_add = list(/obj/item/storage/part_replacer)
/***********************/
/**** JANITOR ****/
// MARK: Janitor
/***********************/
/obj/item/borg/upgrade/floorbuffer
@@ -411,7 +411,7 @@
)
/***********************/
/**** SYNDIE ****/
// MARK: Syndicate
/***********************/
/obj/item/borg/upgrade/syndicate
@@ -439,7 +439,7 @@
)
/***********************/
/**** ABDUCTOR ****/
// MARK: Abductor
/***********************/
/obj/item/borg/upgrade/abductor_engi
@@ -113,6 +113,7 @@ GLOBAL_LIST_INIT(metal_recipes, list(
new /datum/stack_recipe("air alarm frame", /obj/item/mounted/frame/alarm_frame, 2),
new /datum/stack_recipe("fire alarm frame", /obj/item/mounted/frame/firealarm, 2),
new /datum/stack_recipe("intercom frame", /obj/item/mounted/frame/intercom, 2),
new /datum/stack_recipe/barsign_frame("bar sign frame", /obj/machinery/barsign, 4),
new /datum/stack_recipe("extinguisher cabinet frame", /obj/item/mounted/frame/extinguisher, 2),
null
))
@@ -319,7 +320,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list (
new /datum/stack_recipe("cloth handwraps", /obj/item/clothing/gloves/handwraps, 2),
new /datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1),
new /datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 3),
new /datum/stack_recipe("white softcap", /obj/item/clothing/head/soft/mime, 2),
new /datum/stack_recipe("white softcap", /obj/item/clothing/head/soft/white, 2),
new /datum/stack_recipe("white beanie", /obj/item/clothing/head/beanie, 2),
)),
null,
@@ -1,5 +1,7 @@
// Called when a mob tries to use the item as a tool.
// Handles most checks.
/**
* Called when a mob tries to use the item as a tool.
* Handles most checks.
*/
/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks)
// No delay means there is no start message, and no reason to call tool_start_check before use_tool.
// Run the start check here so we wouldn't have to call it manually.
@@ -12,6 +12,7 @@
var/image_overlay = null
var/obj/item/assembly/nadeassembly = null
var/assemblyattacher
var/notify_admins = TRUE
/obj/item/grenade/plastic/Initialize(mapload)
. = ..()
@@ -79,8 +80,9 @@
target = AM
loc = null
message_admins("[key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - <A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[target.x];Y=[target.y];Z=[target.z]'>JMP</a>) with [det_time] second fuse",0,1)
log_game("[key_name(user)] planted [name] on [target.name] at ([target.x],[target.y],[target.z]) with [det_time] second fuse")
if(notify_admins)
message_admins("[ADMIN_LOOKUPFLW(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - <a href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[target.x];Y=[target.y];Z=[target.z]'>JMP</a>) with [det_time] second fuse", 0, 1)
log_game("[key_name(user)] planted [name] on [target.name] at ([target.x],[target.y],[target.z]) with [det_time] second fuse")
AddComponent(/datum/component/persistent_overlay, image_overlay, target)
if(!nadeassembly)
@@ -30,8 +30,8 @@
/obj/item/storage/bag/garment/captain/populate_contents()
new /obj/item/clothing/head/caphat(src)
new /obj/item/clothing/head/caphat/parade(src)
new /obj/item/clothing/head/caphat/beret(src)
new /obj/item/clothing/head/caphat/beret/white(src)
new /obj/item/clothing/head/beret/captain(src)
new /obj/item/clothing/head/beret/captain/white(src)
new /obj/item/clothing/head/crown/fancy(src)
new /obj/item/clothing/suit/armor/vest/capcarapace(src)
new /obj/item/clothing/suit/armor/vest/capcarapace/jacket(src)
@@ -53,7 +53,7 @@
/obj/item/storage/bag/garment/head_of_personnel/populate_contents()
new /obj/item/clothing/head/hop(src)
new /obj/item/clothing/head/hop/beret(src)
new /obj/item/clothing/head/beret/hop(src)
new /obj/item/clothing/suit/mantle/armor/hop(src)
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/clothing/suit/hopcoat(src)
@@ -76,7 +76,7 @@
/obj/item/storage/bag/garment/head_of_security/populate_contents()
new /obj/item/clothing/head/HoS(src)
new /obj/item/clothing/head/HoS/beret(src)
new /obj/item/clothing/head/beret/hos(src)
new /obj/item/clothing/suit/armor/hos(src)
new /obj/item/clothing/suit/armor/hos/alt(src)
new /obj/item/clothing/suit/mantle/armor(src)
@@ -204,7 +204,7 @@
new /obj/item/clothing/under/rank/cargo/qm/whimsy(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/clothing/head/qm(src)
new /obj/item/clothing/head/qm/beret(src)
new /obj/item/clothing/head/beret/qm(src)
new /obj/item/clothing/head/hardhat/orange(src)
new /obj/item/clothing/suit/qmcoat(src)
new /obj/item/clothing/suit/mantle/qm(src)
+532 -154
View File
@@ -1,34 +1,46 @@
/// All Signs are 64 by 32 pixels, they take two tiles
/obj/structure/sign/barsign
#define BARSIGN_FRAME 0
#define BARSIGN_CIRCUIT 1
#define BARSIGN_WIRED 2
#define BARSIGN_COMPLETE 3
// All Signs are 64 by 32 pixels, they take two tiles
/obj/machinery/barsign
name = "Bar Sign"
desc = "A bar sign with no writing on it."
icon = 'icons/obj/barsigns.dmi'
icon_state = "empty"
icon_state = "off"
req_access = list(ACCESS_BAR)
max_integrity = 500
integrity_failure = 250
armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, RAD = 0, FIRE = 50, ACID = 50)
var/list/barsigns=list()
var/list/hiddensigns
max_integrity = 200
integrity_failure = 160
idle_power_consumption = 5
active_power_consumption = 25
power_state = ACTIVE_POWER_USE
armor = list(MELEE = 0, BULLET = 0, LASER = 20, ENERGY = 100, BOMB = 0, RAD = 100, FIRE = 50, ACID = 50)
anchored = TRUE
layer = ABOVE_WINDOW_LAYER
var/list/barsigns = list()
var/list/syndisigns = list()
var/datum/barsign/current_sign
var/datum/barsign/prev_sign
var/panel_open = FALSE
blocks_emissive = FALSE
does_emissive = TRUE
var/build_stage = BARSIGN_COMPLETE
/obj/structure/sign/barsign/Initialize(mapload)
/obj/machinery/barsign/Initialize(mapload)
. = ..()
//filling the barsigns list
// Fill the barsigns lists
for(var/bartype in subtypesof(/datum/barsign))
var/datum/barsign/signinfo = new bartype
if(!signinfo.hidden)
if(signinfo.hidden)
continue
if(!signinfo.syndicate)
barsigns += signinfo
else
syndisigns += signinfo
//randomly assigning a sign
set_sign(pick(barsigns))
set_random_sign()
set_light(1, LIGHTING_MINIMUM_POWER)
/obj/structure/sign/barsign/proc/set_sign(datum/barsign/sign)
/obj/machinery/barsign/proc/set_sign(datum/barsign/sign)
if(!istype(sign))
return
current_sign = sign
@@ -41,363 +53,729 @@
update_icon()
/obj/structure/sign/barsign/update_icon_state()
. = ..()
/obj/machinery/barsign/proc/set_random_sign()
if(!emagged)
set_sign(pick(barsigns))
else
set_sign(pick(syndisigns))
if(!current_sign || broken)
icon_state = "empty"
// Saves a /datum/barsign to the prev_sign variable.
/obj/machinery/barsign/proc/save_sign(datum/barsign/S)
// Broken, blank, and EMPed screens shouldn't be saved.
if(istype(S, /datum/barsign) && !istype(S, /datum/barsign/hiddensigns))
prev_sign = S
return TRUE
return FALSE
/obj/machinery/barsign/update_icon_state()
switch(build_stage)
if(BARSIGN_FRAME)
if(!istype(current_sign, /datum/barsign/hiddensigns/building/frame))
set_sign(new /datum/barsign/hiddensigns/building/frame)
return
if(BARSIGN_CIRCUIT)
if(!istype(current_sign, /datum/barsign/hiddensigns/building/circuited))
set_sign(new /datum/barsign/hiddensigns/building/circuited)
return
if(BARSIGN_WIRED)
if(!istype(current_sign, /datum/barsign/hiddensigns/building/wired))
set_sign(new /datum/barsign/hiddensigns/building/wired)
return
if(BARSIGN_COMPLETE)
if((stat & BROKEN) && !istype(current_sign, /datum/barsign/hiddensigns/signbroken))
set_sign(new /datum/barsign/hiddensigns/signbroken)
return
if((stat & NOPOWER) && !(stat & BROKEN) && !istype(current_sign, /datum/barsign/hiddensigns/signoff))
set_sign(new /datum/barsign/hiddensigns/signoff)
return
if((stat & EMPED) && !(stat & BROKEN|NOPOWER) && !istype(current_sign, /datum/barsign/hiddensigns/empbarsign))
set_sign(new /datum/barsign/hiddensigns/empbarsign)
return
if(!current_sign)
turn_off()
return
icon_state = current_sign.icon
/obj/structure/sign/barsign/update_overlays()
// Allows the sign to be visible in complete darkness.
/obj/machinery/barsign/update_overlays()
. = ..()
underlays.Cut()
if(current_sign == "empty" || broken || !current_sign)
if(!is_on() || stat & (BROKEN|NOPOWER) || !current_sign || build_stage < BARSIGN_COMPLETE)
return
underlays |= emissive_appearance(icon, current_sign.icon)
/obj/structure/sign/barsign/obj_break(damage_flag)
if(!broken && !(flags & NODECONSTRUCT))
broken = TRUE
prev_sign = current_sign
set_light(0)
update_icon()
/obj/machinery/barsign/examine(mob/user)
. = ..()
switch(build_stage)
if(BARSIGN_FRAME)
. += "<span class='notice'>It's missing a <i>circuit board</i> and the <b>bolts</b> are exposed.</span>"
if(BARSIGN_CIRCUIT)
. += "<span class='notice'>The frame needs <i>wiring</i> and the circuit board could be <b>pried out</b>.</span>"
if(BARSIGN_WIRED)
. += "<span class='notice'>The frame lacks a <i>glass screen</i> and is filled with wires that could be <b>cut</b>.</span>"
if(BARSIGN_COMPLETE)
. += "<span class='info'><b>Alt-Click</b> to toggle its power.</span>"
if(panel_open)
. += "<span class='notice'>It is disabled by its <i>unscrewed</i> maintenance panel that exposes an area from which the screen could be <b>pried out</b>.</span>"
/obj/structure/sign/barsign/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/metal(drop_location(), 2)
new /obj/item/stack/cable_coil(drop_location(), 2)
qdel(src)
/obj/machinery/barsign/proc/is_on()
if(power_state == ACTIVE_POWER_USE)
return TRUE
return FALSE
/obj/structure/sign/barsign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
playsound(src.loc, 'sound/effects/glasshit.ogg', 75, TRUE)
if(BURN)
playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE)
/obj/structure/sign/barsign/attack_ai(mob/user as mob)
return src.attack_hand(user)
/obj/structure/sign/barsign/attack_hand(mob/user as mob)
if(!src.allowed(user))
to_chat(user, "<span class = 'info'>Access denied.</span>")
return
if(broken)
to_chat(user, "<span class ='danger'>The controls seem unresponsive.</span>")
return
pick_sign()
/obj/structure/sign/barsign/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/cable_coil) && panel_open)
var/obj/item/stack/cable_coil/C = I
if(emagged) //Emagged, not broken by EMP
to_chat(user, "<span class='warning'>Sign has been damaged beyond repair!</span>")
return
else if(!broken)
to_chat(user, "<span class='warning'>This sign is functioning properly!</span>")
return
if(C.use(2))
to_chat(user, "<span class='notice'>You replace the burnt wiring.</span>")
broken = FALSE
else
to_chat(user, "<span class='warning'>You need at least two lengths of cable!</span>")
/obj/machinery/barsign/proc/toggle_on_off()
if(is_on())
return turn_off()
else
return ..()
return turn_on()
/obj/structure/sign/barsign/screwdriver_act(mob/user, obj/item/I)
if(!panel_open)
to_chat(user, "<span class='notice'>You open the maintenance panel.</span>")
prev_sign = current_sign
set_sign(new /datum/barsign/hiddensigns/signoff)
else
to_chat(user, "<span class='notice'>You close the maintenance panel.</span>")
if(!broken && !emagged)
set_sign(prev_sign)
set_light(1, LIGHTING_MINIMUM_POWER)
else if(emagged)
set_sign(new /datum/barsign/hiddensigns/syndibarsign)
else
set_sign(new /datum/barsign/hiddensigns/empbarsign)
panel_open = !panel_open
/obj/machinery/barsign/proc/turn_off()
if((stat & (BROKEN|EMPED|MAINT)) || !is_on() || build_stage < BARSIGN_COMPLETE)
return FALSE
save_sign(current_sign)
set_light(0)
power_state = IDLE_POWER_USE
set_sign(new /datum/barsign/hiddensigns/signoff)
playsound(src, 'sound/machines/lightswitch.ogg', 10, TRUE)
return TRUE
/obj/structure/sign/barsign/emp_act(severity)
set_sign(new /datum/barsign/hiddensigns/empbarsign)
broken = TRUE
/obj/machinery/barsign/proc/turn_on()
if((stat & (BROKEN|NOPOWER|MAINT)) || is_on() || build_stage < BARSIGN_COMPLETE)
return FALSE
if(panel_open)
return FALSE
set_light(1, LIGHTING_MINIMUM_POWER)
power_state = ACTIVE_POWER_USE
if(prev_sign)
set_sign(prev_sign)
else
set_random_sign()
playsound(src, 'sound/machines/lightswitch.ogg', 10, TRUE)
return TRUE
/obj/structure/sign/barsign/emag_act(mob/user)
if(broken || emagged)
to_chat(user, "<span class='warning'>Nothing interesting happens!</span>")
/obj/machinery/barsign/attack_hand(mob/user)
if(..())
return
if(stat & MAINT)
to_chat(user, "<span class='warning'>Wait until the repairs are complete!</span>")
return
if((stat & (BROKEN|NOPOWER|EMPED)) || build_stage < BARSIGN_COMPLETE)
to_chat(user, "<span class='warning'>The controls seem unresponsive.</span>")
return
if(panel_open)
to_chat(user, "<span class='warning'>Close the maintenance panel first!</span>")
return
if(!allowed(user))
to_chat(user, "<span class='warning'>Access denied.</span>")
return
pick_sign(user)
/obj/machinery/barsign/AltClick(mob/user)
add_fingerprint(user)
if(toggle_on_off())
return
attack_hand(user)
/obj/machinery/barsign/attackby(obj/item/I, mob/user, params)
switch(build_stage)
// Inserting the electronics/circuit
if(BARSIGN_FRAME)
if(istype(I, /obj/item/barsign_electronics))
var/obj/item/barsign_electronics/electronic = I
if(electronic.destroyed)
emagged = TRUE
else
emagged = FALSE
if(electronic.restricts_access)
req_access = list(ACCESS_BAR)
else
req_access = list()
to_chat(user, "<span class='notice'>You insert the circuit!</span>")
qdel(electronic)
build_stage = BARSIGN_CIRCUIT
update_icon()
playsound(get_turf(src), I.usesound, 50, TRUE)
add_fingerprint(user)
return
// Wiring the bar sign
if(BARSIGN_CIRCUIT)
if(istype(I, /obj/item/stack/cable_coil))
if(!I.use(5))
to_chat(user, "<span class='warning'>You need a total of five cables to wire [src]!</span>")
return
stat &= ~EMPED
build_stage = BARSIGN_WIRED
update_icon()
playsound(get_turf(src), I.usesound, 50, TRUE)
to_chat(user, "<span class='notice'>You wire [src]!</span>")
power_state = IDLE_POWER_USE
add_fingerprint(user)
return
// Placing in the glass
if(BARSIGN_WIRED)
if(istype(I, /obj/item/stack/sheet/glass))
if(!I.use(2))
to_chat(user, "<span class='warning'>You need at least 2 sheets of glass for this!</span>")
return
build_stage = BARSIGN_COMPLETE
playsound(get_turf(src), I.usesound, 50, TRUE)
obj_integrity = max_integrity
if(stat & BROKEN)
stat &= ~BROKEN
set_sign(new /datum/barsign/hiddensigns/signoff)
add_fingerprint(user)
return
return ..()
/obj/machinery/barsign/proc/pick_sign(mob/user)
var/picked_name
if(!emagged)
picked_name = tgui_input_list(user, "Available Signage", "Bar Sign", barsigns)
else
picked_name = tgui_input_list(user, "Available Signage", "Bar Sign", syndisigns)
if(!picked_name)
return
turn_on()
set_sign(picked_name)
/obj/machinery/barsign/obj_break(damage_flag)
if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
turn_off()
stat |= BROKEN
// Don't break the glass unless it actually has glass.
if(build_stage == BARSIGN_COMPLETE)
set_sign(new /datum/barsign/hiddensigns/signbroken)
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE)
/obj/machinery/barsign/welder_act(mob/living/user, obj/item/I)
if(user.a_intent != INTENT_HELP)
return
. = TRUE
if(obj_integrity >= max_integrity)
to_chat(user, "<span class='notice'>[src] does not need repairs.</span>")
return
if(I.tool_behaviour != TOOL_WELDER)
return
if(!I.tool_use_check(user, 0))
return
var/time = max(50 * (1 - obj_integrity / max_integrity), 5)
WELDER_ATTEMPT_REPAIR_MESSAGE
turn_off()
stat |= MAINT
if(I.use_tool(src, user, time, volume = I.tool_volume))
WELDER_REPAIR_SUCCESS_MESSAGE
obj_integrity = max_integrity
stat &= ~BROKEN
set_sign(new /datum/barsign/hiddensigns/signoff)
add_fingerprint(user)
stat &= ~MAINT
/obj/machinery/barsign/screwdriver_act(mob/living/user, obj/item/I)
if(user.a_intent != INTENT_HELP)
return
. = TRUE
if(I.tool_behaviour != TOOL_SCREWDRIVER)
return
if(!I.use_tool(src, user, 0, volume = 0))
return
if(!(flags & NODECONSTRUCT))
if(!panel_open)
panel_open = TRUE
turn_off()
to_chat(user, "<span class='notice'>You open the maintenance panel of [src].</span>")
else
panel_open = FALSE
to_chat(user, "<span class='notice'>You close the maintenance panel of [src].</span>")
I.play_tool_sound(user, I.tool_volume)
add_fingerprint(user)
/obj/machinery/barsign/wrench_act(mob/living/user, obj/item/I)
if(user.a_intent != INTENT_HELP)
return
if(build_stage != BARSIGN_FRAME)
return
. = TRUE
if(I.tool_behaviour != TOOL_WRENCH)
return
if(!I.use_tool(src, user, 0, volume = 0))
return
if(!(flags & NODECONSTRUCT))
WRENCH_UNANCHOR_WALL_MESSAGE
I.play_tool_sound(user, I.tool_volume)
deconstruct(TRUE)
/obj/machinery/barsign/crowbar_act(mob/living/user, obj/item/I)
if(user.a_intent != INTENT_HELP)
return FALSE
if(build_stage != BARSIGN_CIRCUIT && build_stage != BARSIGN_COMPLETE)
return FALSE
. = TRUE
if(I.tool_behaviour != TOOL_CROWBAR)
return
if(!I.use_tool(src, user, 0, volume = 0))
return
if(flags & NODECONSTRUCT)
return
// Removing the electronics
if(build_stage == BARSIGN_CIRCUIT)
var/obj/item/barsign_electronics/electronic
electronic = new /obj/item/barsign_electronics
if(!emagged)
to_chat(user, "<span class='notice'>You pull the electronics out from [src].</span>")
else
// Give fried electronics if the sign is emagged
to_chat(user, "<span class='notice'>You pull the fried electronics out from [src].</span>")
electronic.destroyed = TRUE
electronic.icon_state = "door_electronics_smoked"
if(!length(req_access))
electronic.restricts_access = FALSE
electronic.forceMove(get_turf(user))
build_stage = BARSIGN_FRAME
update_icon()
add_fingerprint(user)
// Removing the glass screen
else if(build_stage == BARSIGN_COMPLETE)
if(!panel_open)
to_chat(user, "<span class='warning'>Open the maintenance panel first!</span>")
return
// Drop a shard if the glass is broken
if(stat & BROKEN)
to_chat(user, "<span class='notice'>You remove the broken screen from [src].</span>")
new /obj/item/shard(get_turf(user))
else
to_chat(user, "<span class='notice'>You pull the glass screen out from [src].</span>")
new /obj/item/stack/sheet/glass(get_turf(user), 2)
build_stage = BARSIGN_WIRED
update_icon()
add_fingerprint(user)
I.play_tool_sound(user, I.tool_volume)
/obj/machinery/barsign/wirecutter_act(mob/living/user, obj/item/I)
if(user.a_intent != INTENT_HELP)
return
if(build_stage != BARSIGN_WIRED)
return
. = TRUE
if(I.tool_behaviour != TOOL_WIRECUTTER)
return
if(!I.use_tool(src, user, 0, volume = 0))
return
if(!(flags & NODECONSTRUCT))
if(stat & EMPED)
to_chat(user, "<span class='notice'>You remove the burnt wires out from [src].</span>")
else
to_chat(user, "<span class='notice'>You cut the wires out from [src].</span>")
new /obj/item/stack/cable_coil(get_turf(user), 5)
build_stage = BARSIGN_CIRCUIT
update_icon()
power_state = NO_POWER_USE
I.play_tool_sound(user, I.tool_volume)
add_fingerprint(user)
/obj/machinery/barsign/emag_act(mob/user)
if(stat & (BROKEN|NOPOWER|EMPED))
to_chat(user, "<span class='warning'>[src] cannot be taken over right now!</span>")
return
if(emagged)
to_chat(user, "<span class='warning'>[src] is already taken over!</span>")
return
to_chat(user, "<span class='notice'>You emag the barsign. Takeover in progress...</span>")
add_fingerprint(user)
addtimer(CALLBACK(src, PROC_REF(post_emag)), 10 SECONDS)
return TRUE
/obj/structure/sign/barsign/proc/post_emag()
if(broken || emagged)
/obj/machinery/barsign/proc/post_emag()
if(stat & (BROKEN|NOPOWER|EMPED))
return
set_sign(new /datum/barsign/hiddensigns/syndibarsign)
emagged = TRUE
req_access = list(ACCESS_SYNDICATE)
set_random_sign()
req_access = list()
/obj/structure/sign/barsign/proc/pick_sign()
var/picked_name = tgui_input_list(usr, "Available Signage", "Bar Sign", barsigns)
if(!picked_name)
/obj/machinery/barsign/emp_act(severity)
if(build_stage >= BARSIGN_WIRED)
if(!(stat & EMPED))
stat |= EMPED
turn_on()
set_sign(new /datum/barsign/hiddensigns/empbarsign)
playsound(loc, 'sound/effects/sparks4.ogg', 60, TRUE)
return ..()
/obj/machinery/barsign/power_change()
. = ..()
if(. && (stat & NOPOWER))
turn_off()
/obj/machinery/barsign/deconstruct(disassembled = FALSE)
if(disassembled)
new /obj/item/stack/sheet/metal(drop_location(), 4)
else
new /obj/item/stack/sheet/metal(drop_location(), 2)
if(build_stage >= BARSIGN_WIRED && !(stat & EMPED))
new /obj/item/stack/cable_coil(drop_location(), 3)
if(build_stage >= BARSIGN_COMPLETE)
new /obj/item/shard(drop_location())
qdel(src)
/datum/stack_recipe/barsign_frame
/datum/stack_recipe/barsign_frame/try_build(mob/user, obj/item/stack/S, multiplier)
if(!..())
return FALSE
var/user_turf = get_turf(user)
var/placing_on = get_step(user_turf, user.dir)
// Return FALSE if the user isn't facing a wall/window.
if(!is_valid_turf(placing_on))
to_chat(user, "<span class='warning'>You need to be facing a wall or window to place the [title].</span>")
return FALSE
// Return FALSE if there isn't space for the entire sign.
if((user.dir != NORTH && user.dir != SOUTH) || !is_valid_turf(get_step(placing_on, EAST)))
to_chat(user, "<span class='warning'>There is not enough space to place the [title].</span>")
return FALSE
// Return FALSE if there's already stuff on the wall.
if(gotwallitem(user_turf, FLIP_DIR_VERTICALLY(user.dir)) || gotwallitem(get_step(user_turf, EAST), FLIP_DIR_VERTICALLY(user.dir)))
to_chat(user, "<span class='warning'>There's already an item on the wall!</span>")
return FALSE
// Return FALSE if it would cause two bar signs to overlap.
if((locate(/obj/machinery/barsign) in get_step(user_turf, WEST)))
to_chat(user, "<span class='warning'>There's already a bar sign here!</span>")
return FALSE
return TRUE
/datum/stack_recipe/barsign_frame/proc/is_valid_turf(turf/T)
if(!istype(T))
return FALSE
if(iswallturf(T))
return TRUE
if(locate(/obj/structure/window/full) in T)
return TRUE
return FALSE
/datum/stack_recipe/barsign_frame/post_build(mob/user, obj/item/stack/S, obj/machinery/barsign/O)
.= ..()
playsound(O, 'sound/items/deconstruct.ogg', 10, TRUE)
O.build_stage = BARSIGN_FRAME
O.power_state = NO_POWER_USE
O.set_light(0)
O.update_icon()
if(user.dir == SOUTH)
O.pixel_y = -32
else
O.pixel_y = 32
/obj/item/barsign_electronics
name = "bar sign electronics"
desc = "A circuit. It has a small data storage component filled with various bar sign designs."
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
origin_tech = "engineering=2;programming=1"
usesound = 'sound/items/deconstruct.ogg'
var/destroyed = FALSE
/// Restricts the sign to bar access if TRUE
var/restricts_access = TRUE
/obj/item/barsign_electronics/examine(mob/user)
. = ..()
. += "<span class='notice'>Use it while in your active hand to toggle the access restrictions.</span>"
/obj/item/barsign_electronics/attack_self(mob/user)
. = ..()
if(destroyed)
return
set_sign(picked_name)
restricts_access = !restricts_access
to_chat(user, "<span class='notice'>You [restricts_access ? "enable" : "disable"] the access restrictions of [src].</span>")
// For the ghost bar since occupants don't have bar access.
/obj/machinery/barsign/ghost_bar
req_access = list()
/obj/machinery/barsign/ghost_bar/Initialize(mapload)
. = ..()
// Also give them access to syndicate signs because why not.
barsigns |= syndisigns
set_random_sign()
//Code below is to define useless variables for datums. It errors without these
/datum/barsign
var/name = "Name"
var/icon = "Icon"
var/desc = "desc"
var/hidden = 0
var/icon = "Icon"
/// Signs that should never be accessed by players via the selection menu.
var/hidden = FALSE
/// Signs that have a syndicate theme. Normally accessed by emagging the sign.
var/syndicate = FALSE
//Anything below this is where all the specific signs are. If people want to add more signs, add them below.
/datum/barsign/maltesefalcon
name = "Maltese Falcon"
icon = "maltesefalcon"
desc = "The Maltese Falcon, Space Bar and Grill."
icon = "maltesefalcon"
/datum/barsign/thebark
name = "The Bark"
icon = "thebark"
desc = "Ian's bar of choice."
icon = "thebark"
/datum/barsign/harmbaton
name = "The Harmbaton"
icon = "theharmbaton"
desc = "A great dining experience for both security members and assistants."
icon = "theharmbaton"
/datum/barsign/thesingulo
name = "The Singulo"
icon = "thesingulo"
desc = "Where people go that'd rather not be called by their name."
icon = "thesingulo"
/datum/barsign/thedrunkcarp
name = "The Drunk Carp"
icon = "thedrunkcarp"
desc = "Don't drink and swim."
icon = "thedrunkcarp"
/datum/barsign/scotchservinwill
name = "Scotch Servin Willy's"
icon = "scotchservinwill"
desc = "Willy sure moved up in the world from clown to bartender."
icon = "scotchservinwill"
/datum/barsign/officerbeersky
name = "Officer Beersky's"
icon = "officerbeersky"
desc = "Man eat a dong, these drinks are great."
icon = "officerbeersky"
/datum/barsign/thecavern
name = "The Cavern"
icon = "thecavern"
desc = "Fine drinks while listening to some fine tunes."
icon = "thecavern"
/datum/barsign/theouterspess
name = "The Outer Spess"
icon = "theouterspess"
desc = "This bar isn't actually located in outer space."
icon = "theouterspess"
/datum/barsign/slipperyshots
name = "Slippery Shots"
icon = "slipperyshots"
desc = "Slippery slope to drunkenness with our shots!"
icon = "slipperyshots"
/datum/barsign/thegreytide
name = "The Grey Tide"
icon = "thegreytide"
desc = "Abandon your toolboxing ways and enjoy a lazy beer!"
icon = "thegreytide"
/datum/barsign/honkednloaded
name = "Honked 'n' Loaded"
icon = "honkednloaded"
desc = "Honk."
icon = "honkednloaded"
/datum/barsign/thenest
name = "The Nest"
icon = "thenest"
desc = "A good place to retire for a drink after a long night of crime fighting."
icon = "thenest"
/datum/barsign/thecoderbus
name = "The Coderbus"
icon = "thecoderbus"
desc = "A very controversial bar known for its wide variety of constantly-changing drinks."
icon = "thecoderbus"
/datum/barsign/theadminbus
name = "The Adminbus"
icon = "theadminbus"
desc = "An establishment visited mainly by space-judges. It isn't bombed nearly as much as court hearings."
icon = "theadminbus"
/datum/barsign/oldcockinn
name = "The Old Cock Inn"
icon = "oldcockinn"
desc = "Something about this sign fills you with despair."
icon = "oldcockinn"
/datum/barsign/thewretchedhive
name = "The Wretched Hive"
icon = "thewretchedhive"
desc = "Legally obligated to instruct you to check your drinks for acid before consumption."
icon = "thewretchedhive"
/datum/barsign/robustacafe
name = "The Robusta Cafe"
icon = "robustacafe"
desc = "Holder of the 'Most Lethal Barfights' record 5 years uncontested."
icon = "robustacafe"
/datum/barsign/emergencyrumparty
name = "The Emergency Rum Party"
icon = "emergencyrumparty"
desc = "Still serving drinks that were banned years ago."
icon = "emergencyrumparty"
/datum/barsign/combocafe
name = "The Combo Cafe"
icon = "combocafe"
desc = "Renowned system-wide for their utterly uncreative drink combinations."
icon = "combocafe"
/datum/barsign/vladssaladbar
name = "Vlad's Salad Bar"
icon = "vladssaladbar"
desc = "Under new management. Vlad was always a bit too trigger happy with that shotgun."
icon = "vladssaladbar"
/datum/barsign/theshaken
name = "The Shaken"
icon = "theshaken"
desc = "This establishment does not serve stirred drinks."
icon = "theshaken"
/datum/barsign/thealenath
name = "The Ale' Nath"
icon = "thealenath"
desc = "All right, buddy. I think you've had EI NATH. Time to get a cab."
icon = "thealenath"
/datum/barsign/thealohasnackbar
name = "The Aloha Snackbar"
icon = "alohasnackbar"
desc = "A tasteful, inoffensive tiki bar sign."
icon = "alohasnackbar"
/datum/barsign/thenet
name = "The Net"
icon = "thenet"
desc = "The sea of drinkformation." //you couldn't come up with something better?
icon = "thenet"
/datum/barsign/armok
name = "Armok's Bar and Grill"
icon = "armokbar"
desc = "Dorfs need not apply."
icon = "armokbar"
/datum/barsign/meadbay
name = "Mead Bay"
icon = "meadbay"
desc = "Still probably a better place to get treated than the real one."
icon = "meadbay"
/datum/barsign/whiskeyimplant
name = "Whiskey Implant"
desc = "A bar known for its unconventional means of serving you drinks, whether you want them or not."
icon = "whiskeyimplant"
desc = "A bar known for its unconventional means of serving you drinks,whether you want them or not."
/datum/barsign/redshirt
name = "The Red Shirt"
icon = "theredshirt"
desc = "A number of famous patrons have attended this bar, including:..."
icon = "theredshirt"
/datum/barsign/lv426
name = "LV-426"
icon = "lv426"
desc = "Drinking with fancy facemasks is clearly more important than going to medbay."
icon = "lv426"
/datum/barsign/zocalo
name = "Zocalo"
icon = "zocalo"
desc = "Anteriormente ubicado en Spessmerica."
icon = "zocalo"
/datum/barsign/fourtheemprah
name = "4 The Emprah"
icon = "4theemprah"
desc = "Enjoyed by fanatics, heretics, and brain-damaged patrons alike."
icon = "4theemprah"
/datum/barsign/ishimura
name = "Ishimura"
icon = "ishimura"
desc = "Well known for their quality brownstar and delicious crackers."
icon = "ishimura"
/datum/barsign/tardis
name = "Tardis"
icon = "tardis"
desc = "This establishment has been through at least 5,343 iterations."
icon = "tardis"
/datum/barsign/quarks
name = "Quark's"
icon = "quarks"
desc = "Frequenters of this establishment are often seen wearing meson scanners; how quaint."
icon = "quarks"
/datum/barsign/tenforward
name = "Ten Forward"
icon = "tenforward"
desc = "Totally not a rip-off of an established bar or anything like that."
icon = "tenforward"
/datum/barsign/thepranicngpony
name = "The Prancing Pony"
icon = "thepranicngpony"
desc = "Ok, we don't take to kindly to you short folk pokin' round looking for some ranger scum."
icon = "thepranicngpony"
/datum/barsign/vault13
name = "Vault 13"
icon = "vault13"
desc = "Coincidence is intentional."
icon = "vault13"
/datum/barsign/solaris
name = "Solaris"
icon = "solaris"
desc = "When is a plasma giant not a plasma giant? When it's a bar serving plasma from a plasma giant."
icon = "solaris"
/datum/barsign/thehive
name = "The Hive"
icon = "thehive"
desc = "Dedicated to and founded in memory of those who died aboard the NT Class 4407 Research Stations."
icon = "thehive"
/datum/barsign/cantina
name = "Chalmun's Cantina"
icon = "cantina"
desc = "The bar was founded on the principles of originality; they have the same music playing 24/7."
icon = "cantina"
/datum/barsign/milliways42
name = "Milliways 42"
icon = "milliways42"
desc = "It's not really the end; it's the beginning, meaning, and answer for all your beverage needs."
icon = "milliways42"
/datum/barsign/timeofeve
name = "The Time of Eve"
icon = "thetimeofeve"
desc = "Vintage drinks from 2453!."
icon = "thetimeofeve"
/datum/barsign/spaceasshole
name = "Space Asshole"
icon = "spaceasshole"
desc = "Open since 2125, Not much has changed since then; the engineers still release the singulo and the damn miners still are more likely to cave your face in that deliver ores."
icon = "spaceasshole"
/datum/barsign/themaint
name = "The Maint"
icon = "themaint"
desc = "Home to Greytiders, Security and other unholy creations."
icon = "themaint"
/datum/barsign/syndicat
name = "The SyndiCat"
desc = "Syndicate or die."
icon = "thesyndicat"
syndicate = TRUE
/datum/barsign/hiddensigns
hidden = 1
hidden = TRUE
//Hidden signs list below this point
/datum/barsign/hiddensigns/empbarsign
name = "Haywire Barsign"
icon = "empbarsign"
desc = "Something has gone very wrong."
/datum/barsign/hiddensigns/syndibarsign
name = "Syndi Cat Takeover"
icon = "syndibarsign"
desc = "Syndicate or die."
icon = "empbarsign"
/datum/barsign/hiddensigns/signoff
name = "Bar Sign"
icon = "empty"
desc = "This sign doesn't seem to be on."
icon = "off"
/datum/barsign/hiddensigns/signbroken
name = "Broken Bar Sign"
desc = "This sign has a massive crack in it!"
icon = "broken"
/datum/barsign/hiddensigns/building
name = "Bar Sign Frame"
desc = "This isn't advertising anything except that the bar is under renovations."
/datum/barsign/hiddensigns/building/frame
icon = "frame"
/datum/barsign/hiddensigns/building/circuited
icon = "circuited"
/datum/barsign/hiddensigns/building/wired
icon = "wired"
#undef BARSIGN_FRAME
#undef BARSIGN_CIRCUIT
#undef BARSIGN_WIRED
#undef BARSIGN_COMPLETE
@@ -53,8 +53,8 @@
new /obj/item/clothing/suit/chef/classic(src)
new /obj/item/clothing/suit/chef/classic(src)
new /obj/item/clothing/suit/chef/classic(src)
new /obj/item/clothing/head/soft/mime(src)
new /obj/item/clothing/head/soft/mime(src)
new /obj/item/clothing/head/soft/white(src)
new /obj/item/clothing/head/soft/white(src)
new /obj/item/storage/box/mousetraps(src)
new /obj/item/storage/box/mousetraps(src)
new /obj/item/clothing/under/rank/civilian/chef(src)
@@ -10,7 +10,7 @@
new /obj/item/clothing/shoes/black(src)
new /obj/item/radio/headset/headset_cargo(src)
new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/clothing/head/soft(src)
new /obj/item/clothing/head/soft/cargo(src)
new /obj/item/storage/bag/mail(src)
/obj/structure/closet/secure_closet/quartermaster
@@ -402,9 +402,9 @@
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/head/soft/grey(src)
new /obj/item/clothing/head/soft/grey(src)
new /obj/item/clothing/head/soft/grey(src)
new /obj/item/clothing/head/soft(src)
new /obj/item/clothing/head/soft(src)
new /obj/item/clothing/head/soft(src)
if(prob(50))
new /obj/item/storage/backpack/duffel(src)
if(prob(40))
@@ -30,25 +30,27 @@
return
/obj/structure/largecrate/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/crowbar))
if(manifest)
manifest.forceMove(loc)
manifest = null
update_icon()
new /obj/item/stack/sheet/wood(src)
var/turf/T = get_turf(src)
for(var/O in contents)
var/atom/movable/A = O
A.forceMove(T)
user.visible_message("<span class='notice'>[user] pries \the [src] open.</span>", \
"<span class='notice'>You pry open \the [src].</span>", \
"<span class='notice'>You hear splitting wood.</span>")
qdel(src)
else if(user.a_intent != INTENT_HARM)
if(user.a_intent != INTENT_HARM)
attack_hand(user)
else
return ..()
/obj/structure/largecrate/crowbar_act(mob/living/user, obj/item/I)
. = TRUE
if(manifest)
manifest.forceMove(loc)
manifest = null
update_icon()
new /obj/item/stack/sheet/wood(src)
var/turf/T = get_turf(src)
for(var/O in contents)
var/atom/movable/A = O
A.forceMove(T)
user.visible_message("<span class='notice'>[user] pries [src] open.</span>", \
"<span class='notice'>You pry open [src].</span>", \
"<span class='notice'>You hear splitting wood.</span>")
qdel(src)
/obj/structure/largecrate/Destroy()
var/turf/src_turf = get_turf(src)
for(var/obj/O in contents)
@@ -60,54 +62,60 @@
/obj/structure/largecrate/lisa
icon_state = "lisacrate"
/obj/structure/largecrate/lisa/attackby(obj/item/W as obj, mob/user as mob) //ugly but oh well
if(istype(W, /obj/item/crowbar))
new /mob/living/simple_animal/pet/dog/corgi/Lisa(loc)
/obj/structure/largecrate/lisa/crowbar_act(mob/living/user, obj/item/I)
if(!I.use_tool(src, user, I.tool_volume))
return
new /mob/living/simple_animal/pet/dog/corgi/Lisa(loc)
return ..()
/obj/structure/largecrate/cow
name = "cow crate"
icon_state = "lisacrate"
/obj/structure/largecrate/cow/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/crowbar))
new /mob/living/simple_animal/cow(loc)
/obj/structure/largecrate/cow/crowbar_act(mob/living/user, obj/item/I)
if(!I.use_tool(src, user, I.tool_volume))
return
new /mob/living/simple_animal/cow(loc)
return ..()
/obj/structure/largecrate/goat
name = "goat crate"
icon_state = "lisacrate"
/obj/structure/largecrate/goat/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/crowbar))
new /mob/living/simple_animal/hostile/retaliate/goat(loc)
/obj/structure/largecrate/goat/crowbar_act(mob/living/user, obj/item/I)
if(!I.use_tool(src, user, I.tool_volume))
return
new /mob/living/simple_animal/hostile/retaliate/goat(loc)
return ..()
/obj/structure/largecrate/chick
name = "chicken crate"
icon_state = "lisacrate"
/obj/structure/largecrate/chick/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/crowbar))
var/num = rand(4, 6)
for(var/i in 1 to num)
new /mob/living/simple_animal/chick(loc)
/obj/structure/largecrate/chick/crowbar_act(mob/living/user, obj/item/I)
if(!I.use_tool(src, user, I.tool_volume))
return
var/num = rand(4, 6)
for(var/i in 1 to num)
new /mob/living/simple_animal/chick(loc)
return ..()
/obj/structure/largecrate/cat
name = "cat crate"
icon_state = "lisacrate"
/obj/structure/largecrate/cat/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/crowbar))
new /mob/living/simple_animal/pet/cat(loc)
/obj/structure/largecrate/cat/crowbar_act(mob/living/user, obj/item/I)
if(!I.use_tool(src, user, I.tool_volume))
return
new /mob/living/simple_animal/pet/cat(loc)
return ..()
/obj/structure/largecrate/secway
name = "secway crate"
/obj/structure/largecrate/secway/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/crowbar))
new /obj/vehicle/secway(loc)
new /obj/item/key/security(loc)
/obj/structure/largecrate/secway/crowbar_act(mob/living/user, obj/item/I)
if(!I.use_tool(src, user, I.tool_volume))
return
new /obj/vehicle/secway(loc)
new /obj/item/key/security(loc)
return ..()
+29 -21
View File
@@ -87,32 +87,40 @@
put_in_cart(I, user)
else
to_chat(user, "<span class='notice'>[src] can't hold any more signs.</span>")
else if(istype(I, /obj/item/crowbar))
user.visible_message("<span class='warning'>[user] begins to empty the contents of [src].</span>")
if(do_after(user, 30 * I.toolspeed, target = src))
to_chat(usr, "<span class='notice'>You empty the contents of [src]'s bucket onto the floor.</span>")
reagents.reaction(src.loc)
src.reagents.clear_reagents()
else if(istype(I, /obj/item/wrench))
if(!anchored && !isinspace())
playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
"<span class='notice'> You have tightened \the [src]'s casters.</span>", \
"You hear ratchet.")
anchored = TRUE
else if(anchored)
playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
"<span class='notice'> You have loosened \the [src]'s casters.</span>", \
"You hear ratchet.")
anchored = FALSE
else if(mybag)
mybag.attackby(I, user, params)
else
to_chat(usr, "<span class='warning'>You cannot interface your modules [src]!</span>")
/obj/structure/janitorialcart/crowbar_act(mob/living/user, obj/item/I)
. = TRUE
user.visible_message("<span class='warning'>[user] begins to empty the contents of [src].</span>")
if(!I.use_tool(src, user, 3 SECONDS, I.tool_volume))
return
to_chat(user, "<span class='notice'>You empty the contents of [src]'s bucket onto the floor.</span>")
reagents.reaction(loc)
reagents.clear_reagents()
/obj/structure/janitorialcart/wrench_act(mob/living/user, obj/item/I)
. = TRUE
if(!anchored && !isinspace())
if(!I.use_tool(src, user, I.tool_volume))
return
user.visible_message( \
"[user] tightens [src]'s casters.", \
"<span class='notice'>You have tightened [src]'s casters.</span>", \
"You hear ratchet.")
anchored = TRUE
return
if(anchored)
if(!I.use_tool(src, user, I.tool_volume))
return
user.visible_message( \
"[user] loosens [src]'s casters.", \
"<span class='notice'>You have loosened [src]'s casters.</span>", \
"You hear ratchet.")
anchored = FALSE
/obj/structure/janitorialcart/attack_hand(mob/user)
var/list/cart_items = list()
+11 -10
View File
@@ -68,21 +68,22 @@
..()
/obj/structure/kitchenspike/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/crowbar))
if(!has_buckled_mobs())
playsound(loc, I.usesound, 100, 1)
if(do_after(user, 20 * I.toolspeed, target = src))
to_chat(user, "<span class='notice'>You pry the spikes out of the frame.</span>")
deconstruct(TRUE)
else
to_chat(user, "<span class='notice'>You can't do that while something's on the spike!</span>")
return
else if(istype(I, /obj/item/grab))
if(istype(I, /obj/item/grab))
var/obj/item/grab/G = I
if(G.affecting && isliving(G.affecting))
start_spike(G.affecting, user)
return ..()
/obj/structure/kitchenspike/crowbar_act(mob/living/user, obj/item/I)
. = TRUE
if(has_buckled_mobs())
to_chat(user, "<span class='notice'>You can't do that while something's on the spike!</span>")
return
if(!I.use_tool(src, user, 2 SECONDS, I.tool_volume))
return
to_chat(user, "<span class='notice'>You pry the spikes out of the frame.</span>")
deconstruct(TRUE)
/obj/structure/kitchenspike/MouseDrop_T(mob/living/victim, mob/living/user)
if(!user.Adjacent(src) || !user.Adjacent(victim) || isAI(user) || !ismob(victim))
return
+1 -1
View File
@@ -53,7 +53,7 @@
if(!I.tool_start_check(user, amount = 0))
return
to_chat(user, "<span class='notice'>You begin repairing [src]...</span>")
if(I.use_tool(src, user, 40, volume = 50))
if(I.use_tool(src, user, 4 SECONDS, I.tool_volume))
obj_integrity = max_integrity
to_chat(user, "<span class='notice'>You repair [src].</span>")
+1 -1
View File
@@ -223,7 +223,7 @@
if(X.key != key && X.key != C.key)
if(message_type == MESSAGE_TYPE_MENTORPM)
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob))
to_chat(X, third_party_message, MESSAGE_TYPE_ADMINPM)
to_chat(X, third_party_message, MESSAGE_TYPE_MENTORPM)
else
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
to_chat(X, third_party_message, MESSAGE_TYPE_ADMINPM)
@@ -419,6 +419,7 @@
H.equip_to_appropriate_slot(mask)
tank.toggle_internals(H, TRUE)
M.reagents.add_reagent("mutadone", 1) // 1u of mutadone for the Hulk:tm: experience
M.update_icons()
// Supply them with some chow. How generous is the Syndicate?
@@ -9,6 +9,7 @@ RESTRICT_TYPE(/datum/antagonist/mindslave/thrall)
SSticker.mode.vampire_enthralled += owner
/datum/antagonist/mindslave/thrall/remove_owner_from_gamemode()
owner.current.create_log(CONVERSION_LOG, "Deconverted from thrall")
SSticker.mode.vampire_enthralled -= owner
/datum/antagonist/mindslave/thrall/apply_innate_effects(mob/living/mob_override)
+17 -8
View File
@@ -93,24 +93,33 @@
to_chat(user, "<span class='warning'>\The [T] seems stuck to your hand!</span>")
return
if(panel_open)
if(istype(O, /obj/item/wrench))
default_unfasten_wrench(user, O, time = 6 SECONDS)
if(component_parts && istype(O, /obj/item/crowbar))
if(tickets) //save the tickets!
print_tickets()
default_deconstruction_crowbar(user, O)
return
return ..()
/obj/machinery/prize_counter/crowbar_act(mob/living/user, obj/item/I)
if(!panel_open || !component_parts)
return
. = TRUE
if(tickets) //save the tickets!
print_tickets()
default_deconstruction_crowbar(user, I)
/obj/machinery/prize_counter/screwdriver_act(mob/living/user, obj/item/I)
if(!anchored)
return
I.play_tool_sound(src)
. = TRUE
if(!I.use_tool(src, user, I.tool_volume))
return
panel_open = !panel_open
to_chat(user, "<span class='notice'>You [panel_open ? "open" : "close"] the maintenance panel.</span>")
update_icon(UPDATE_ICON_STATE)
return TRUE
/obj/machinery/prize_counter/wrench_act(mob/living/user, obj/item/I)
if(!panel_open)
return
. = TRUE
default_unfasten_wrench(user, I, time = 6 SECONDS)
/obj/machinery/prize_counter/attack_hand(mob/user)
if(..())
@@ -96,13 +96,13 @@
/obj/machinery/atmospherics/trinary/filter/process_atmos()
..()
if(!on)
return 0
return FALSE
var/output_starting_pressure = air3.return_pressure()
if(output_starting_pressure >= target_pressure || air2.return_pressure() >= target_pressure)
if(output_starting_pressure >= target_pressure || (filter_type != FILTER_NOTHING && air2.return_pressure() >= target_pressure))
//No need to mix if target is already full!
return 1
return TRUE
//Calculate necessary moles to transfer using PV=nRT
@@ -158,7 +158,7 @@
parent1.update = 1
return 1
return TRUE
/obj/machinery/atmospherics/trinary/filter/attack_ghost(mob/user)
ui_interact(user)
@@ -5,7 +5,7 @@
var/list/obj/machinery/atmospherics/pipe/members = list()
var/list/obj/machinery/atmospherics/other_atmosmch = list()
var/update = 1
var/update = TRUE
/datum/pipeline/New()
SSair.networks += src
@@ -22,7 +22,7 @@
/datum/pipeline/process()//This use to be called called from the pipe networks
if(update)
update = 0
update = FALSE
reconcile_air()
return
@@ -179,7 +179,7 @@
(partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity))
air.temperature -= heat/total_heat_capacity
update = 1
update = TRUE
/datum/pipeline/proc/reconcile_air()
var/list/datum/gas_mixture/GL = list()
+1 -13
View File
@@ -139,23 +139,11 @@
// Objects loop
if(!(flags & DMM_IGNORE_OBJS))
for(var/obj/O in model.contents)
if(O.dont_save || QDELETED(O))
if(QDELETED(O))
continue
obj_template += "[O.type][check_attributes(O,use_json=use_json)],"
// Mobs Loop
for(var/mob/M in model.contents)
if(M.dont_save || QDELETED(M))
continue
if(M.client)
if(!(flags & DMM_IGNORE_PLAYERS))
mob_template += "[M.type][check_attributes(M,use_json=use_json)],"
else
if(!(flags & DMM_IGNORE_NPCS))
mob_template += "[M.type][check_attributes(M,use_json=use_json)],"
// Area
if(!(flags & DMM_IGNORE_AREAS))
var/area/m_area = model.loc
+4 -4
View File
@@ -1175,7 +1175,7 @@
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/hands.dmi', "lgloves"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/mask.dmi', "mime"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/head.dmi', "beret"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/head/beret.dmi', "beret"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/suit.dmi', "suspenders"), ICON_OVERLAY)
has_gloves = TRUE
switch(backbag)
@@ -1324,7 +1324,7 @@
clothes_s = new /icon('icons/mob/clothing/under/medical.dmi', "paramedic_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/mask.dmi', "cigoff"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/head.dmi', "bluesoft"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/head/softcap.dmi', "bluesoft"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "medicalpack"), ICON_OVERLAY)
@@ -1368,7 +1368,7 @@
clothes_s.Blend(new /icon('icons/mob/clothing/hands.dmi', "bgloves"), ICON_OVERLAY)
has_gloves = TRUE
if(prob(1))
clothes_s.Blend(new /icon('icons/mob/clothing/head.dmi', "beret_hos"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/head/beret.dmi', "beret_hos"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "securitypack"), ICON_OVERLAY)
@@ -1411,7 +1411,7 @@
clothes_s = new /icon('icons/mob/clothing/under/security.dmi', "security_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "jackboots"), ICON_UNDERLAY)
if(prob(1))
clothes_s.Blend(new /icon('icons/mob/clothing/head.dmi', "beret_officer"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/head/beret.dmi', "beret_officer"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "securitypack"), ICON_OVERLAY)
@@ -114,7 +114,7 @@
/datum/gear/hat/capwhite
display_name = "Cap, white"
path = /obj/item/clothing/head/soft/mime
path = /obj/item/clothing/head/soft/white
/datum/gear/hat/caporange
display_name = "Cap, orange"
@@ -122,7 +122,7 @@
/datum/gear/hat/capgrey
display_name = "Cap, grey"
path = /obj/item/clothing/head/soft/grey
path = /obj/item/clothing/head/soft
/datum/gear/hat/capyellow
display_name = "Cap, yellow"
@@ -179,12 +179,12 @@
/datum/gear/hat/beret_job/captain
display_name = "Beret, captain's"
path = /obj/item/clothing/head/caphat/beret
path = /obj/item/clothing/head/beret/captain
allowed_roles = list("Captain")
/datum/gear/hat/beret_job/captain_white
display_name = "Beret, captain's white"
path = /obj/item/clothing/head/caphat/beret/white
path = /obj/item/clothing/head/beret/captain/white
allowed_roles = list("Captain")
/datum/gear/hat/beret_job/sec
@@ -199,12 +199,12 @@
/datum/gear/hat/beret_job/hop
display_name = "Beret, head of personnel"
path = /obj/item/clothing/head/hop/beret
path = /obj/item/clothing/head/beret/hop
allowed_roles = list("Head of Personnel")
/datum/gear/hat/beret_job/qm
display_name = "Beret, quartermaster"
path = /obj/item/clothing/head/qm/beret
path = /obj/item/clothing/head/beret/qm
allowed_roles = list("Quartermaster")
/datum/gear/hat/beret_job/sci
+175
View File
@@ -0,0 +1,175 @@
//Base items
/obj/item/clothing/head/beret
name = "beret"
desc = "A beret, an artist's favorite headwear."
icon = 'icons/obj/clothing/head/beret.dmi'
icon_state = "beret"
item_state = 'icons/mob/clothing/head/beret.dmi'
icon_override = 'icons/mob/clothing/head/beret.dmi'
dog_fashion = /datum/dog_fashion/head/beret
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head/beret.dmi'
)
/obj/item/clothing/head/beret/blue
icon_state = "beret_blue"
/obj/item/clothing/head/beret/black
icon_state = "beret_black"
/obj/item/clothing/head/beret/white
icon_state = "beret_white"
/obj/item/clothing/head/beret/purple_normal
icon_state = "beret_purple_normal"
/obj/item/clothing/head/beret/durathread
name = "durathread beret"
desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer."
icon_state = "beret_durathread"
item_color = null
armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 5, RAD = 0, FIRE = 20, ACID = 5)
//Central Command
/obj/item/clothing/head/beret/centcom/officer
name = "officer beret"
desc = "A black beret adorned with the shield—a silver kite shield with an engraved sword—of the Nanotrasen security forces, announcing to the world that the wearer is a defender of Nanotrasen."
icon_state = "beret_centcom_officer"
armor = list(MELEE = 35, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 10, ACID = 50)
strip_delay = 60
/obj/item/clothing/head/beret/centcom/officer/navy
name = "navy blue officer beret"
desc = "A navy blue beret adorned with the shield—a silver kite shield with an engraved sword—of the Nanotrasen security forces, announcing to the world that the wearer is a defender of Nanotrasen."
icon_state = "beret_centcom_officer_navy"
/obj/item/clothing/head/beret/centcom/captain
name = "naval captain's beret"
desc = "A white beret adorned with the shield—a cobalt kite shield with an engraved sword—of the Nanotrasen security forces, worn only by those captaining a vessel of the Nanotrasen Navy."
icon_state = "beret_centcom_captain"
//Captain
/obj/item/clothing/head/beret/captain
name = "captain's beret"
desc = "For Captains that are more inclined towards style."
icon_state = "beret_captain"
armor = list(MELEE = 15, BULLET = 10, LASER = 15, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 50, ACID = 50)
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/captain
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head/beret.dmi',
"Drask" = 'icons/mob/clothing/species/drask/head/beret.dmi',
)
/obj/item/clothing/head/beret/captain/white
name = "captain's white beret"
desc = "For Captains that are more inclined towards style, and for the color white."
icon_state = "beret_captain_white"
//Security
/obj/item/clothing/head/beret/hos
name = "head of security's beret"
desc = "A robust beret for the Head of Security, for looking stylish while not sacrificing protection."
icon_state = "beret_hos_black"
armor = list(MELEE = 35, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 50, ACID = 75)
strip_delay = 80
dog_fashion = /datum/dog_fashion/head/HoS
/obj/item/clothing/head/beret/sec
name = "security beret"
desc = "A beret with the security insignia emblazoned on it. For officers that are more inclined towards style than safety."
icon_state = "beret_officer"
armor = list(MELEE = 25, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 0, RAD = 0, FIRE = 10, ACID = 50)
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/beret/sec
/obj/item/clothing/head/beret/sec/warden
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "beret_warden"
armor = list(MELEE = 35, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 20, ACID = 50)
//Engineering
/obj/item/clothing/head/beret/ce
name = "chief engineer's beret"
desc = "A white beret with the engineering insignia emblazoned on it. Its owner knows what they're doing. Probably."
icon_state = "beret_ce"
/obj/item/clothing/head/beret/eng
name = "engineering beret"
desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety."
icon_state = "beret_engineering"
/obj/item/clothing/head/beret/atmos
name = "atmospherics beret"
desc = "A beret for those who have shown immaculate proficienty in piping. Or plumbing."
icon_state = "beret_atmospherics"
//Science
/obj/item/clothing/head/beret/sci
name = "science beret"
desc = "A white beret with a purple science insignia emblazoned on it. It has that authentic smell of burning plasma."
icon_state = "beret_science"
/obj/item/clothing/head/beret/robowhite
name = "robotics beret"
desc = "A white beret with a brown robotics insignia emblazoned on it. It smells distinctly like oil."
icon_state = "beret_roboticswhite"
/obj/item/clothing/head/beret/roboblack
name = "bioengineer beret"
desc = "A black beret with a brown robotics insignia emblazoned on it. It smells distinctly like oil."
icon_state = "beret_roboticsblack"
//Service
/obj/item/clothing/head/beret/hop
name = "head of personnel's beret"
desc = "For doing paperwork with style."
icon_state = "beret_hop"
armor = list(MELEE = 15, BULLET = 10, LASER = 15, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 50, ACID = 50)
dog_fashion = /datum/dog_fashion/head/hop
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head/beret.dmi',
"Drask" = 'icons/mob/clothing/species/drask/head/beret.dmi',
)
/obj/item/clothing/head/beret/janitor
name = "janitorial beret"
desc = "A purple beret with a mint service insignia emblazoned on it. It smells squeaky clean."
icon_state = "beret_janitor"
//Medical
/obj/item/clothing/head/beret/med
name = "medical beret"
desc = "A white beret with a green cross finely threaded into it. It has that sterile smell about it."
icon_state = "beret_med"
//Cargo
/obj/item/clothing/head/beret/qm
name = "quartermaster's beret"
desc = "A brown beret with a golden cargo insignia emblazoned on it. Rule over Cargonia in style."
icon_state = "beret_qm"
dog_fashion = /datum/dog_fashion/head/qm
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head/beret.dmi',
"Drask" = 'icons/mob/clothing/species/drask/head/beret.dmi'
)
//Special Roles
/obj/item/clothing/head/beret/solgov/command
name = "\improper Trans-Solar Federation Lieutenant's beret"
desc = "A beret worn by marines of the Trans-Solar Federation. The insignia signifies the wearer bears the rank of a Lieutenant."
icon_state = "beret_solgovc"
item_color = "solgovc"
dog_fashion = null
armor = list(MELEE = 10, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 50, ACID = 75)
strip_delay = 80
/obj/item/clothing/head/beret/solgov/command/elite
name = "\improper Trans-Solar Federation Specops Lieutenant's beret"
desc = "A beret worn by marines of the Trans-Solar Federation Specops division. The insignia signifies the wearer bears the rank of a Lieutenant."
armor = list(MELEE = 25, BULLET = 75, LASER = 5, ENERGY = 5, BOMB = 15, RAD = 50, FIRE = 200, ACID = 200)
icon_state = "beret_solgovcelite"
item_color = "solgovcelite"
resistance_flags = FIRE_PROOF
@@ -63,9 +63,16 @@
/obj/item/clothing/head/collectable/beret
name = "collectable beret"
desc = "A Collectable red Beret. It smells faintly of Garlic."
icon = 'icons/obj/clothing/head/beret.dmi'
icon_state = "beret"
item_state = 'icons/mob/clothing/head/beret.dmi'
icon_override = 'icons/mob/clothing/head/beret.dmi'
dog_fashion = /datum/dog_fashion/head/beret
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head/beret.dmi'
)
/obj/item/clothing/head/collectable/welding
name = "collectable welding helmet"
desc = "A Collectable Welding Helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this Helmet is done so at the owner's own risk!"
-132
View File
@@ -35,20 +35,6 @@
desc = "Worn only by Captains with an abundance of class."
icon_state = "captain_cap"
/obj/item/clothing/head/caphat/beret
name = "captain's beret"
desc = "For Captains that are more inclined towards style."
icon_state = "captain_beret"
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head.dmi',
"Drask" = 'icons/mob/clothing/species/drask/head.dmi',
)
/obj/item/clothing/head/caphat/beret/white
name = "captain's white beret"
desc = "For Captains that are more inclined towards style, and for the color white."
icon_state = "captain_beret_white"
//Head of Personnel
/obj/item/clothing/head/hop
name = "head of personnel's cap"
@@ -62,16 +48,6 @@
"Grey" = 'icons/mob/clothing/species/grey/head.dmi'
)
/obj/item/clothing/head/hop/beret
name = "head of personnel's beret"
desc = "For doing paperwork with style."
icon_state = "beret_hop"
dog_fashion = /datum/dog_fashion/head/hop
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head.dmi',
"Drask" = 'icons/mob/clothing/species/drask/head.dmi',
)
//Quartermaster
/obj/item/clothing/head/qm
name = "quartermaster's cap"
@@ -84,16 +60,6 @@
"Grey" = 'icons/mob/clothing/species/grey/head.dmi'
)
/obj/item/clothing/head/qm/beret
name = "quartermaster's beret"
desc = "A brown beret with a golden cargo insignia emblazoned on it. Rule over Cargonia in style."
icon_state = "beret_qm"
dog_fashion = /datum/dog_fashion/head/qm
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head.dmi',
"Drask" = 'icons/mob/clothing/species/drask/head.dmi'
)
//Nanotrasen Representative
/obj/item/clothing/head/ntrep
name = "Nanotrasen Representative's hat"
@@ -151,24 +117,6 @@
"Grey" = 'icons/mob/clothing/species/grey/head.dmi'
)
//Mime
/obj/item/clothing/head/beret
name = "beret"
desc = "A beret, an artist's favorite headwear."
icon_state = "beret"
dog_fashion = /datum/dog_fashion/head/beret
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head.dmi'
)
/obj/item/clothing/head/beret/durathread
name = "durathread beret"
desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer."
icon_state = "beretdurathread"
item_color = null
armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 5, RAD = 0, FIRE = 20, ACID = 5)
//Security
/obj/item/clothing/head/HoS
name = "head of security's cap"
@@ -178,16 +126,6 @@
strip_delay = 80
dog_fashion = /datum/dog_fashion/head/HoS
/obj/item/clothing/head/HoS/beret
name = "head of security's beret"
desc = "A robust beret for the Head of Security, for looking stylish while not sacrificing protection."
icon_state = "beret_hos_black"
dog_fashion = /datum/dog_fashion/head/HoS
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head.dmi'
)
/obj/item/clothing/head/warden
name = "warden's police hat"
desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts."
@@ -221,61 +159,8 @@
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head.dmi'
)
/obj/item/clothing/head/beret/sec
name = "security beret"
desc = "A beret with the security insignia emblazoned on it. For officers that are more inclined towards style than safety."
icon_state = "beret_officer"
armor = list(MELEE = 25, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 0, RAD = 0, FIRE = 10, ACID = 50)
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/beret/sec
/obj/item/clothing/head/beret/sec/warden
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "beret_warden"
armor = list(MELEE = 35, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 20, ACID = 50)
/obj/item/clothing/head/beret/eng
name = "engineering beret"
desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety."
icon_state = "beret_engineering"
/obj/item/clothing/head/beret/atmos
name = "atmospherics beret"
desc = "A beret for those who have shown immaculate proficienty in piping. Or plumbing."
icon_state = "beret_atmospherics"
/obj/item/clothing/head/beret/ce
name = "chief engineer's beret"
desc = "A white beret with the engineering insignia emblazoned on it. Its owner knows what they're doing. Probably."
icon_state = "beret_ce"
/obj/item/clothing/head/beret/sci
name = "science beret"
desc = "A white beret with a purple science insignia emblazoned on it. It has that authentic smell of burning plasma."
icon_state = "beret_science"
/obj/item/clothing/head/beret/robowhite
name = "robotics beret"
desc = "A white beret with a brown robotics insignia emblazoned on it. It smells distinctly like oil."
icon_state = "beret_roboticswhite"
/obj/item/clothing/head/beret/roboblack
name = "bioengineer beret"
desc = "A black beret with a brown robotics insignia emblazoned on it. It smells distinctly like oil."
icon_state = "beret_roboticsblack"
/obj/item/clothing/head/beret/janitor
name = "janitorial beret"
desc = "A purple beret with a mint service insignia emblazoned on it. It smells squeaky clean."
icon_state = "beret_janitor"
//Medical
/obj/item/clothing/head/beret/med
name = "medical beret"
desc = "A white beret with a green cross finely threaded into it. It has that sterile smell about it."
icon_state = "beret_med"
/obj/item/clothing/head/surgery
name = "blue surgical cap"
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs."
@@ -310,20 +195,3 @@
icon_state = "surgcap_black"
dog_fashion = /datum/dog_fashion/head/surgery
//Special Roles
/obj/item/clothing/head/beret/solgov/command
name = "\improper Trans-Solar Federation Lieutenant's beret"
desc = "A beret worn by marines of the Trans-Solar Federation. The insignia signifies the wearer bears the rank of a Lieutenant."
icon_state = "solgovcberet"
item_color = "solgovc"
dog_fashion = null
armor = list(MELEE = 10, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 50, ACID = 75)
strip_delay = 80
/obj/item/clothing/head/beret/solgov/command/elite
name = "\improper Trans-Solar Federation Specops Lieutenant's beret"
desc = "A beret worn by marines of the Trans-Solar Federation Specops division. The insignia signifies the wearer bears the rank of a Lieutenant."
armor = list(MELEE = 25, BULLET = 75, LASER = 5, ENERGY = 5, BOMB = 15, RAD = 50, FIRE = 200, ACID = 200)
icon_state = "solgovceliteberet"
item_color = "solgovcelite"
resistance_flags = FIRE_PROOF
-29
View File
@@ -27,18 +27,6 @@
item_state = "jwig"
dog_fashion = /datum/dog_fashion/head/justice_wig
/obj/item/clothing/head/beret/blue
icon_state = "beret_blue"
/obj/item/clothing/head/beret/black
icon_state = "beret_black"
/obj/item/clothing/head/beret/white
icon_state = "beret_white"
/obj/item/clothing/head/beret/purple_normal
icon_state = "beret_purple_normal"
/obj/item/clothing/head/that
name = "top-hat"
desc = "It's an amish looking hat."
@@ -424,23 +412,6 @@
icon_state = "beret_purple"
item_state = "purpleberet"
/obj/item/clothing/head/beret/centcom/officer
name = "officer beret"
desc = "A black beret adorned with the shield—a silver kite shield with an engraved sword—of the Nanotrasen security forces, announcing to the world that the wearer is a defender of Nanotrasen."
icon_state = "beret_centcom_officer"
armor = list(MELEE = 35, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 10, ACID = 50)
strip_delay = 60
/obj/item/clothing/head/beret/centcom/officer/navy
name = "navy blue officer beret"
desc = "A navy blue beret adorned with the shield—a silver kite shield with an engraved sword—of the Nanotrasen security forces, announcing to the world that the wearer is a defender of Nanotrasen."
icon_state = "beret_centcom_officer_navy"
/obj/item/clothing/head/beret/centcom/captain
name = "captain's beret"
desc = "A white beret adorned with the shield—a cobalt kite shield with an engraved sword—of the Nanotrasen security forces, worn only by those captaining a vessel of the Nanotrasen Navy."
icon_state = "beret_centcom_captain"
/obj/item/clothing/head/sombrero
name = "sombrero"
icon_state = "sombrero"
+24 -23
View File
@@ -1,14 +1,16 @@
/obj/item/clothing/head/soft
name = "cargo cap"
desc = "It's a baseball hat in a tasteless yellow colour."
icon_state = "cargosoft"
item_state = "helmet"
item_color = "cargo"
name = "grey cap"
desc = "It's a baseball hat in a tasteless grey colour."
icon = 'icons/obj/clothing/head/softcap.dmi'
icon_state = "greysoft"
item_state = 'icons/mob/clothing/head/softcap.dmi'
icon_override = 'icons/mob/clothing/head/softcap.dmi'
item_color = "grey"
var/flipped = FALSE
actions_types = list(/datum/action/item_action/flip_cap)
dog_fashion = /datum/dog_fashion/head/cargo_tech
dog_fashion = /datum/dog_fashion/head/softcap
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head.dmi'
"Vox" = 'icons/mob/clothing/species/vox/head/softcap.dmi'
)
dyeable = TRUE
@@ -62,24 +64,17 @@
item_color = "yellow"
dog_fashion = /datum/dog_fashion/head/softcap
/obj/item/clothing/head/soft/grey
name = "grey cap"
desc = "It's a baseball hat in a tasteful grey colour."
icon_state = "greysoft"
item_color = "grey"
dog_fashion = /datum/dog_fashion/head/softcap
/obj/item/clothing/head/soft/orange
name = "orange cap"
desc = "It's a baseball hat in a tasteless orange colour."
icon_state = "orangesoft"
item_color = "orange"
/obj/item/clothing/head/soft/mime
/obj/item/clothing/head/soft/white
name = "white cap"
desc = "It's a baseball hat in a tasteless white colour."
icon_state = "mimesoft"
item_color = "mime"
icon_state = "whitesoft"
item_color = "white"
dog_fashion = /datum/dog_fashion/head/softcap
/obj/item/clothing/head/soft/purple
@@ -103,6 +98,13 @@
item_color = "rainbow"
dog_fashion = /datum/dog_fashion/head/softcap
/obj/item/clothing/head/soft/cargo
name = "cargo cap"
desc = "It's a baseball hat in a tasteless yellow colour."
icon_state = "cargosoft"
item_color = "cargo"
dog_fashion = /datum/dog_fashion/head/cargo_tech
/obj/item/clothing/head/soft/deliverysoft
name = "delivery boy cap"
desc = "It's a baseball hat that is part of the delivery boy uniform."
@@ -110,10 +112,9 @@
item_color = "delivery"
dog_fashion = /datum/dog_fashion/head/softcap
sprite_sheets = list(
"Human" = 'icons/mob/clothing/head.dmi',
"Vox" = 'icons/mob/clothing/species/vox/head.dmi',
"Drask" = 'icons/mob/clothing/species/drask/head.dmi',
"Grey" = 'icons/mob/clothing/species/grey/head.dmi'
"Vox" = 'icons/mob/clothing/species/vox/head/softcap.dmi',
"Drask" = 'icons/mob/clothing/species/drask/head/softcap.dmi',
"Grey" = 'icons/mob/clothing/species/grey/head/softcap.dmi'
)
/obj/item/clothing/head/soft/janitorgrey
@@ -177,7 +178,7 @@
/obj/item/clothing/head/soft/solgov/marines/command/elite
name = "\improper Trans-Solar Federation Specops Lieutenant's cap"
desc = "A cap worn by marines of the Trans-Solar Federation Specops division. You aren't quite sure how they made this bulletproof, but you are glad it is! The insignia signifies the wearer bears the rank of a Lieutenant."
armor= list(MELEE = 25, BULLET = 75, LASER = 5, ENERGY = 5, BOMB = 15, RAD = 50, FIRE = 200, ACID = 200)
icon_state = "solgovcelitesoft"
armor = list(MELEE = 25, BULLET = 75, LASER = 5, ENERGY = 5, BOMB = 15, RAD = 50, FIRE = 200, ACID = 200)
icon_state = "solgovcelitesoft_flipped"
item_color = "solgovcelite"
resistance_flags = FIRE_PROOF
@@ -70,19 +70,21 @@
/obj/item/clothing/head/helmet/space/deathsquad/beret
name = "officer beret"
desc = "An armored beret commonly used by special operations officers."
icon = 'icons/obj/clothing/head/beret.dmi'
icon_state = "beret_officer"
item_state = 'icons/mob/clothing/head/beret.dmi'
icon_override = 'icons/mob/clothing/head/beret.dmi'
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
flags_inv = null
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/head.dmi'
"Vox" = 'icons/mob/clothing/species/vox/head/beret.dmi'
)
/obj/item/clothing/head/helmet/space/deathsquad/beret/solgov
name = "\improper Trans-Solar Federation commander's beret"
desc = "A camouflaged beret adorned with the star of the Trans-Solar Federation, worn by generals of the Trans-Solar Federation."
icon_state = "solgovceliteberet"
icon_state = "beret_solgovcelite"
/obj/item/clothing/suit/space/deathsquad/officer
name = "officer jacket"
+91 -33
View File
@@ -1,9 +1,16 @@
#define ALLOWED_INGREDIENT_SUNGLASSES list( \
/obj/item/clothing/glasses/sunglasses, \
/obj/item/clothing/glasses/sunglasses/noir, \
/obj/item/clothing/glasses/sunglasses/yeah, \
/obj/item/clothing/glasses/sunglasses/big \
)
/datum/crafting_recipe/durathread_vest
name = "Durathread Vest"
result = list(/obj/item/clothing/suit/armor/vest/durathread)
reqs = list(/obj/item/stack/sheet/durathread = 5,
/obj/item/stack/sheet/leather = 4)
time = 50
time = 5 SECONDS
category = CAT_CLOTHING
/datum/crafting_recipe/durathread_helmet
@@ -11,35 +18,35 @@
result = list(/obj/item/clothing/head/helmet/durathread)
reqs = list(/obj/item/stack/sheet/durathread = 4,
/obj/item/stack/sheet/leather = 5)
time = 40
time = 4 SECONDS
category = CAT_CLOTHING
/datum/crafting_recipe/durathread_jumpsuit
name = "Durathread Jumpsuit"
result = list(/obj/item/clothing/under/misc/durathread)
reqs = list(/obj/item/stack/sheet/durathread = 4)
time = 40
time = 4 SECONDS
category = CAT_CLOTHING
/datum/crafting_recipe/durathread_beret
name = "Durathread Beret"
result = list(/obj/item/clothing/head/beret/durathread)
reqs = list(/obj/item/stack/sheet/durathread = 2)
time = 40
time = 4 SECONDS
category = CAT_CLOTHING
/datum/crafting_recipe/durathread_beanie
name = "Durathread Beanie"
result = list(/obj/item/clothing/head/beanie/durathread)
reqs = list(/obj/item/stack/sheet/durathread = 2)
time = 40
time = 4 SECONDS
category = CAT_CLOTHING
/datum/crafting_recipe/durathread_bandana
name = "Durathread Bandana"
result = list(/obj/item/clothing/mask/bandana/durathread)
reqs = list(/obj/item/stack/sheet/durathread = 1)
time = 25
time = 2.5 SECONDS
category = CAT_CLOTHING
/datum/crafting_recipe/fannypack
@@ -47,7 +54,7 @@
result = list(/obj/item/storage/belt/fannypack)
reqs = list(/obj/item/stack/sheet/cloth = 2,
/obj/item/stack/sheet/leather = 1)
time = 20
time = 2 SECONDS
category = CAT_CLOTHING
/datum/crafting_recipe/hudgogsec
@@ -60,6 +67,10 @@
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/hudgogsec/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/hud/security)
/datum/crafting_recipe/hudgogsecremoval
name = "Security HUD removal (goggles)"
result = list(/obj/item/clothing/glasses/goggles, /obj/item/clothing/glasses/hud/security)
@@ -78,6 +89,10 @@
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/hudgoghealth/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/hud/health)
/datum/crafting_recipe/hudgoghealthremoval
name = "Health HUD removal (goggles)"
result = list(/obj/item/clothing/glasses/goggles, /obj/item/clothing/glasses/hud/health)
@@ -96,6 +111,10 @@
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/hudgogdiagnostic/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/hud/diagnostic)
/datum/crafting_recipe/hudgogdiagnosticremoval
name = "Diagnostic HUD removal (goggles)"
result = list(/obj/item/clothing/glasses/goggles, /obj/item/clothing/glasses/hud/diagnostic)
@@ -114,6 +133,10 @@
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/hudgoghydroponic/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/hud/hydroponic)
/datum/crafting_recipe/hudgoghydroponicremoval
name = "Hydroponic HUD removal (goggles)"
result = list(/obj/item/clothing/glasses/goggles, /obj/item/clothing/glasses/hud/hydroponic)
@@ -132,6 +155,10 @@
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/hudgogskills/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/hud/skills)
/datum/crafting_recipe/hudgogskillsremoval
name = "Skills HUD removal (goggles)"
result = list(/obj/item/clothing/glasses/goggles, /obj/item/clothing/glasses/hud/skills)
@@ -143,17 +170,22 @@
/datum/crafting_recipe/hudsunsec
name = "Security HUDsunglasses"
result = list(/obj/item/clothing/glasses/hud/security/sunglasses)
time = 20
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/security = 1,
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/hudsunsec/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/hud/security) \
| typesof(/obj/item/clothing/glasses/sunglasses) - ALLOWED_INGREDIENT_SUNGLASSES
/datum/crafting_recipe/hudsunsecremoval
name = "Security HUD removal"
result = list(/obj/item/clothing/glasses/sunglasses, /obj/item/clothing/glasses/hud/security)
time = 20
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1)
category = CAT_CLOTHING
@@ -161,17 +193,22 @@
/datum/crafting_recipe/hudsunmed
name = "Medical HUDsunglasses"
result = list(/obj/item/clothing/glasses/hud/health/sunglasses)
time = 20
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/health = 1,
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/hudsunmed/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/hud/health) \
| typesof(/obj/item/clothing/glasses/sunglasses) - ALLOWED_INGREDIENT_SUNGLASSES
/datum/crafting_recipe/hudsunmedremoval
name = "Medical HUD removal"
result = list(/obj/item/clothing/glasses/sunglasses, /obj/item/clothing/glasses/hud/health)
time = 20
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses = 1)
category = CAT_CLOTHING
@@ -179,17 +216,22 @@
/datum/crafting_recipe/hudsundiag
name = "Diagnostic HUDsunglasses"
result = list(/obj/item/clothing/glasses/hud/diagnostic/sunglasses)
time = 20
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/diagnostic = 1,
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/hudsundiag/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/hud/diagnostic) \
| typesof(/obj/item/clothing/glasses/sunglasses) - ALLOWED_INGREDIENT_SUNGLASSES
/datum/crafting_recipe/hudsundiagremoval
name = "Diagnostic HUD removal"
result = list(/obj/item/clothing/glasses/sunglasses, /obj/item/clothing/glasses/hud/diagnostic)
time = 20
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/diagnostic/sunglasses = 1)
category = CAT_CLOTHING
@@ -197,17 +239,22 @@
/datum/crafting_recipe/hudsunjani
name = "Janitor HUD sunglasses"
result = list(/obj/item/clothing/glasses/hud/janitor/sunglasses)
time = 20
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/janitor = 1,
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/hudsunjani/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/hud/janitor) \
| typesof(/obj/item/clothing/glasses/sunglasses) - ALLOWED_INGREDIENT_SUNGLASSES
/datum/crafting_recipe/hudsunjaniremoval
name = "Janitor HUD sunglasses removal"
result = list(/obj/item/clothing/glasses/sunglasses, /obj/item/clothing/glasses/hud/janitor)
time = 20
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/janitor/sunglasses = 1)
category = CAT_CLOTHING
@@ -222,6 +269,11 @@
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/hudsunmeson/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/meson) \
| typesof(/obj/item/clothing/glasses/sunglasses) - ALLOWED_INGREDIENT_SUNGLASSES
/datum/crafting_recipe/hudsunmesonremoval
name = "Meson HUD sunglasses removal"
result = list(/obj/item/clothing/glasses/sunglasses, /obj/item/clothing/glasses/meson)
@@ -233,17 +285,22 @@
/datum/crafting_recipe/beergoggles
name = "Sunscanners"
result = list(/obj/item/clothing/glasses/sunglasses/reagent)
time = 20
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/science = 1,
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/beergoggles/New()
..()
blacklist = subtypesof(/obj/item/clothing/glasses/science) \
| typesof(/obj/item/clothing/glasses/sunglasses) - ALLOWED_INGREDIENT_SUNGLASSES
/datum/crafting_recipe/beergogglesremoval
name = "Sunscanners removal"
result = list(/obj/item/clothing/glasses/sunglasses, /obj/item/clothing/glasses/science)
time = 20
time = 2 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1)
category = CAT_CLOTHING
@@ -251,7 +308,7 @@
/datum/crafting_recipe/ghostsheet
name = "Ghost Sheet"
result = list(/obj/item/clothing/suit/ghost_sheet)
time = 5
time = 0.5 SECONDS
tools = list(TOOL_WIRECUTTER)
reqs = list(/obj/item/bedsheet = 1)
category = CAT_CLOTHING
@@ -259,40 +316,40 @@
/datum/crafting_recipe/cowboyboots
name = "Cowboy Boots"
result = list(/obj/item/clothing/shoes/cowboy)
time = 4.5 SECONDS
reqs = list(/obj/item/stack/sheet/leather = 2)
time = 45
category = CAT_CLOTHING
/datum/crafting_recipe/lizardboots
name = "Lizard Skin Boots"
result = list(/obj/effect/spawner/lootdrop/lizardboots)
time = 6 SECONDS
reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1, /obj/item/stack/sheet/leather = 1)
time = 60
category = CAT_CLOTHING
/datum/crafting_recipe/rubberduckyshoes
name = "Rubber Ducky Shoes"
result = list(/obj/item/clothing/shoes/ducky)
time = 45
time = 4.5 SECONDS
tools = list(TOOL_WIRECUTTER)
reqs = list(/obj/item/bikehorn/rubberducky = 2,
/obj/item/clothing/shoes/sandal = 1)
tools = list(TOOL_WIRECUTTER)
category = CAT_CLOTHING
/datum/crafting_recipe/salmonsuit
name = "Salmon Suit"
result = list(/obj/item/clothing/suit/hooded/salmon_costume)
time = 60
time = 6 SECONDS
tools = list(TOOL_WIRECUTTER)
reqs = list(/obj/item/fish/salmon = 20,
/obj/item/stack/tape_roll = 5)
tools = list(TOOL_WIRECUTTER)
pathtools = list(/obj/item/kitchen/knife)
category = CAT_CLOTHING
/datum/crafting_recipe/voice_modulator
name = "Voice Modulator Mask"
result = list(/obj/item/clothing/mask/gas/voice_modulator)
time = 45
time = 4.5 SECONDS
tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL)
reqs = list(/obj/item/clothing/mask/gas = 1,
/obj/item/assembly/voice = 1,
@@ -302,37 +359,38 @@
/datum/crafting_recipe/flower_crown
name = "Flower Crown"
result = list(/obj/item/clothing/head/flower_crown)
reqs = list(/obj/item/food/snacks/grown/poppy = 3,
/obj/item/food/snacks/grown/lily = 3,
/obj/item/grown/sunflower = 3
)
time = 2 SECONDS
reqs = list(/obj/item/food/snacks/grown/poppy = 3,
/obj/item/food/snacks/grown/lily = 3,
/obj/item/grown/sunflower = 3)
category = CAT_CLOTHING
/datum/crafting_recipe/sunflower_crown
name = "Sunflower Crown"
result = list(/obj/item/clothing/head/sunflower_crown)
reqs = list(/obj/item/grown/sunflower = 5)
time = 2 SECONDS
reqs = list(/obj/item/grown/sunflower = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/poppy_crown
name = "Poppy Crown"
result = list(/obj/item/clothing/head/poppy_crown)
reqs = list(/obj/item/food/snacks/grown/poppy = 5)
time = 2 SECONDS
reqs = list(/obj/item/food/snacks/grown/poppy = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/lily_crown
name = "Lily Crown"
result = list(/obj/item/clothing/head/lily_crown)
reqs = list(/obj/item/food/snacks/grown/lily = 5)
time = 2 SECONDS
reqs = list(/obj/item/food/snacks/grown/lily = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/geranium_crown
name = "Geranium Crown"
result = list(/obj/item/clothing/head/geranium_crown)
reqs = list(/obj/item/food/snacks/grown/geranium = 5)
time = 2 SECONDS
reqs = list(/obj/item/food/snacks/grown/geranium = 5)
category = CAT_CLOTHING
#undef ALLOWED_INGREDIENT_SUNGLASSES
+3 -3
View File
@@ -652,7 +652,7 @@
icon_state = "sparkyninja_beret"
/// sigholtstarsong: Sigholt Starsong
/obj/item/clothing/head/beret/fluff/sigholt
/obj/item/clothing/head/fluff/sigholt
name = "Lieutenant Starsong's beret"
desc = "This beret bears insignia of the SOLGOV Marine Corps 417th Regiment, 2nd Battalion, Bravo Company. It looks meticulously maintained."
icon_state = "beret_hos"
@@ -680,7 +680,7 @@
H.Slur(6 SECONDS) //always slur
/// Epic_Charger: Linda Clark
/obj/item/clothing/head/beret/fluff/linda
/obj/item/clothing/head/fluff/linda
name = "Green beret"
desc = "A beret, an artist's favorite headwear. This one has two holes cut on the edges."
icon = 'icons/obj/custom_items.dmi'
@@ -743,7 +743,7 @@
return 1
/// V-Force_Bomber: E.L.O.
/obj/item/clothing/head/beret/fluff/elo
/obj/item/clothing/head/fluff/elo
name = "E.L.O.'s medical beret"
desc = "E.L.O.s personal medical beret, issued by Nanotrassen and awarded along with her medal."
icon = 'icons/obj/custom_items.dmi'
@@ -242,7 +242,7 @@
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = gibtime * 5) //start shaking
var/slab_name = occupant.name
var/slab_count = 3
var/slab_count = 6
var/slab_type = /obj/item/food/snacks/meat/human //gibber can only gib humans on paracode, no need to check meat type
var/slab_nutrition = occupant.nutrition / 15
+7
View File
@@ -135,16 +135,23 @@
add_random_traits(1, 1)
/obj/item/seeds/proc/mutate_stat(stat, level, mutation_size)
// 50% chance to do nothing to each stat even if mutation level is nonzero.
if(level <= 0 || prob(50))
return
var/mod = 0
// Roll for a bit of change every 10 mutation level.
while(level > 10)
mod += rand(0, mutation_size)
level -= 10
// And a partial chance if there's any mutation level left over.
if(level > 0 && prob(level * 10))
mod += rand(0, mutation_size)
// Ensure we change it at least a bit if we passed the initial prob(50).
mod = max(1, mod)
// 50% chance of going either way.
if(prob(50))
mod = -mod
+2 -2
View File
@@ -15,8 +15,8 @@
/obj/item/mimejutsu_scroll
name = "Mimejutsu 'scroll'"
desc = "Its a beret with a note stapled to it..."
icon = 'icons/obj/clothing/hats.dmi'
desc = "Its a beret with a note stapled to it..."
icon = 'icons/obj/clothing/head/beret.dmi'
icon_state = "beret"
var/used = FALSE
@@ -0,0 +1,215 @@
/obj/item/grenade/plastic/miningcharge
name = "industrial mining charge"
desc = "Used to make big holes in rocks. Only works on rocks!"
icon = 'icons/obj/mining.dmi'
icon_state = "mining-charge-2"
item_state = "charge_indust"
det_time = 5
notify_admins = FALSE // no need to make adminlogs on lavaland, while they are "safe" to use
/// When TRUE, charges won't detonate on it's own. Used for mining detonator
var/timer_off = FALSE
var/installed = FALSE
var/smoke_amount = 3
/// list of sizes for explosion. Third number is used for actual rock explosion size, second number is radius for Weaken() effects, first is used for hacked charges
var/boom_sizes = list(2, 3, 5)
var/hacked = FALSE
/obj/item/grenade/plastic/miningcharge/Initialize()
. = ..()
image_overlay = mutable_appearance(icon, "[icon_state]_active", ON_EDGED_TURF_LAYER)
/obj/item/grenade/plastic/miningcharge/examine(mob/user)
. = ..()
if(hacked)
. += "<span class='warning'>Its wiring is haphazardly changed.</span>"
if(timer_off)
. += "<span class='notice'>The mining charge is connected to a detonator.</span>"
/obj/item/grenade/plastic/miningcharge/attack_self(mob/user)
if(nadeassembly)
nadeassembly.attack_self(user)
/obj/item/grenade/plastic/miningcharge/afterattack(atom/movable/AM, mob/user, flag)
if(!ismineralturf(AM) && !hacked)
return
if(is_ancient_rock(AM) && !hacked)
to_chat(user, "<span class='notice'>This rock appears to be resistant to all mining tools except pickaxes!</span>")
return
if(!timer_off) //override original proc for plastic explosions
return ..()
if(!flag)
return
if(iscarbon(AM))
return
to_chat(user, "<span class='notice'>You start planting [src].</span>")
if(!do_after(user, (2.5 SECONDS) * toolspeed, target = AM))
return
if(!user.unEquip(src))
return
target = AM
forceMove(AM)
if(hacked)
message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_COORDJMP(target)]")
log_game("planted [name] on [target.name] at [COORD(target)]", user)
installed = TRUE
target.overlays += image_overlay
/obj/item/grenade/plastic/miningcharge/attackby(obj/item/I, mob/user, params)
if(!istype(I, /obj/item/detonator))
return
var/obj/item/detonator/detonator = I
if((src in detonator.bombs) || timer_off)
to_chat(user, "<span class='warning'>[src] was already synchronized to a existing detonator!</span>")
return
detonator.bombs += src
timer_off = TRUE
to_chat(user, "<span class='notice'>You synchronize [src] to [I].</span>")
playsound(src, 'sound/machines/twobeep.ogg', 50)
detonator.update_icon()
/obj/item/grenade/plastic/miningcharge/proc/detonate()
addtimer(CALLBACK(src, PROC_REF(prime)), 3 SECONDS)
/obj/item/grenade/plastic/miningcharge/prime()
if(hacked) //try not to blow your fingers off
explode()
return
var/turf/simulated/mineral/location = get_turf(target)
var/datum/effect_system/smoke_spread/S = new
S.set_up(smoke_amount, 0, location, null)
S.start()
for(var/turf/simulated/mineral/rock in circlerangeturfs(location, boom_sizes[3]))
var/distance = get_dist_euclidian(location, rock)
if(distance <= boom_sizes[3])
rock.mineralAmt += 3 // if rock is going to get drilled, add bonus mineral amount
rock.gets_drilled()
for(var/mob/living/carbon/C in circlerange(location, boom_sizes[3]))
var/distance = get_dist_euclidian(location, C)
C.flash_eyes()
C.Weaken((boom_sizes[2] - distance) * 1 SECONDS) //1 second for how close you are to center if you're in range
C.AdjustDeaf((boom_sizes[3] - distance) * 5 SECONDS) //guaranteed deafness
var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears)
if(istype(ears) && C.check_ear_prot() < HEARING_PROTECTION_MINOR) //headsets should be enough to avoid taking damage
ears.receive_damage((boom_sizes[3] - distance) * 2) //something like that i guess. Mega charge makes 12 damage to ears if nearby
to_chat(C, "<span class='userdanger'>You are knocked down by the power of the mining charge!</span>")
qdel(src)
/obj/item/grenade/plastic/miningcharge/proc/explode()
var/turf/location
if(target)
if(!QDELETED(target))
if(isturf(target))
location = get_turf(target)
else
location = get_atom_on_turf(target)
target.overlays -= image_overlay
else
location = get_atom_on_turf(src)
if(location)
explosion(location, boom_sizes[1], boom_sizes[2], boom_sizes[3], cause = src)
location.ex_act(2, target)
qdel(src)
/obj/item/grenade/plastic/miningcharge/proc/override_safety()
hacked = TRUE
notify_admins = TRUE
boom_sizes[1] = round(boom_sizes[1] / 3) //lesser - 0, normal - 0, mega - 1; c4 - 0
boom_sizes[2] = round(boom_sizes[2] / 3) //lesser - 0, normal - 1, mega - 2; c4 - 0
boom_sizes[3] = round(boom_sizes[3] / 1.5) //lesser - 2, normal - 3, mega - 5; c4 - 3
/// Overriding to avoid the chargers from exploding because of received damage
/obj/item/grenade/plastic/miningcharge/deconstruct(disassembled = TRUE)
if(!QDELETED(src))
qdel(src)
/obj/item/grenade/plastic/miningcharge/lesser
name = "mining charge"
desc = "A mining charge. This one seems less powerful than industrial. Only works on rocks!"
icon_state = "mining-charge-1"
item_state = "charge_lesser"
smoke_amount = 1
boom_sizes = list(1, 2, 3)
/obj/item/grenade/plastic/miningcharge/mega
name = "experimental mining charge"
desc = "A mining charge. This one seems much more powerful than normal!"
icon_state = "mining-charge-3"
item_state = "charge_mega"
smoke_amount = 5
boom_sizes = list(4, 6, 8)
/obj/item/storage/backpack/duffel/miningcharges/populate_contents()
for(var/i in 1 to 5)
new /obj/item/grenade/plastic/miningcharge/lesser(src)
for(var/i in 1 to 3)
new /obj/item/grenade/plastic/miningcharge(src)
new /obj/item/detonator(src)
//MINING CHARGE HACKER
/obj/item/t_scanner/adv_mining_scanner/syndicate
var/charges = 6
/obj/item/t_scanner/adv_mining_scanner/syndicate/examine(mob/user)
. = ..()
. += "<span class='notice'>This scanner has an extra port for overriding mining charge safeties.</span>"
/obj/item/t_scanner/adv_mining_scanner/syndicate/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(!istype(target, /obj/item/grenade/plastic/miningcharge))
return
var/obj/item/grenade/plastic/miningcharge/charge = target
if(charge.hacked)
to_chat(user, "<span class='notice'>[src] is already overridden!</span>")
return
if(charges <= 0)
to_chat(user, "<span class='notice'>Its overriding function is depleted.</span>")
return
charge.override_safety()
visible_message("<span class='warning'>Sparks fly out of [src]!</span>")
playsound(src, "sparks", 50, TRUE)
charges--
if(charges <= 0)
to_chat(user, "<span class='warning'>[src]'s internal battery for overriding mining charges has run dry!</span>")
// MINING CHARGES DETONATOR
/obj/item/detonator
name = "mining charge detonator"
desc = "A specialized mining device designed for controlled demolition operations using mining explosives."
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/mining.dmi'
icon_state = "Detonator-0"
/// list of all bombs connected to a detonator for a moment
var/list/bombs = list()
/obj/item/detonator/examine(mob/user)
. = ..()
if(length(bombs))
. += "<span class='notice'>List of synched bombs:</span>"
for(var/obj/item/grenade/plastic/miningcharge/charge in bombs)
. += "<span class='notice'>[bicon(charge)] [charge]. Current status: [charge.installed ? "ready to detonate" : "ready to deploy"].</span>"
/obj/item/detonator/update_icon()
. = ..()
if(length(bombs))
icon_state = "Detonator-1"
else
icon_state = initial(icon_state)
/obj/item/detonator/attack_self(mob/user)
playsound(src, 'sound/items/detonator.ogg', 40)
if(length(bombs))
to_chat(user, "<span class='notice'>Activating explosives...</span>")
for(var/obj/item/grenade/plastic/miningcharge/charge in bombs)
if(QDELETED(charge))
bombs -= charge
update_icon() //if the last bomb was qdeleted, detonator icon should change after activating
continue
if(charge.installed)
bombs -= charge
charge.detonate()
update_icon()
else
to_chat(user, "<span class='warning'>There are no charges linked to a detonator!</span>")
return ..()
+1 -1
View File
@@ -237,7 +237,7 @@
maturation = 7
production = 4
yield = 4
potency = 15
potency = 50
growthstages = 3
rarity = 20
reagents_add = list("nutriment" = 0.1)
+18 -7
View File
@@ -42,6 +42,7 @@
EQUIPMENT("Mining MODsuit", /obj/item/mod/control/pre_equipped/mining/vendor, 3500),
EQUIPMENT("Asteroid MODsuit Skin", /obj/item/mod/skin_applier/asteroid, 1000),
EQUIPMENT("Tracking Bio-chip Kit", /obj/item/storage/box/minertracker, 600),
EQUIPMENT("Mining Charge Detonator", /obj/item/detonator, 150)
)
prize_list["Consumables"] = list(
EQUIPMENT("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
@@ -50,6 +51,8 @@
EQUIPMENT("Jaunter", /obj/item/wormhole_jaunter, 750),
EQUIPMENT("Chasm Jaunter Recovery Grenade", /obj/item/grenade/jaunter_grenade, 1500),
EQUIPMENT("Lazarus Injector", /obj/item/lazarus_injector, 1000),
EQUIPMENT("Mining Charge", /obj/item/grenade/plastic/miningcharge/lesser, 150),
EQUIPMENT("Industrial Mining Charge", /obj/item/grenade/plastic/miningcharge, 500),
EQUIPMENT("Point Transfer Card", /obj/item/card/mining_point_card, 500),
EQUIPMENT("Shelter Capsule", /obj/item/survivalcapsule, 400),
EQUIPMENT("Stabilizing Serum", /obj/item/hivelordstabilizer, 400),
@@ -71,7 +74,7 @@
EQUIPMENT("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
EQUIPMENT("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
EQUIPMENT("Kinetic Crusher", /obj/item/kinetic_crusher, 750),
EQUIPMENT("Mecha Grenade Launcher", /obj/item/mecha_parts/mecha_equipment/weapon/energy/mining_grenade, 3000),
EQUIPMENT("Mecha Grenade Launcher", /obj/item/mecha_parts/mecha_equipment/weapon/energy/mining_grenade, 2500),
EQUIPMENT("Resonator", /obj/item/resonator, 800),
EQUIPMENT("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
EQUIPMENT("Super Resonator", /obj/item/resonator/upgraded, 2500),
@@ -209,12 +212,7 @@
add_fingerprint()
/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
return
if(panel_open)
if(istype(I, /obj/item/crowbar))
remove_id()
default_deconstruction_crowbar(user, I)
return TRUE
if(istype(I, /obj/item/mining_voucher))
if(!has_power())
@@ -234,6 +232,17 @@
return
return ..()
/obj/machinery/mineral/equipment_vendor/crowbar_act(mob/living/user, obj/item/I)
if(!panel_open)
return
. = TRUE
remove_id()
default_deconstruction_crowbar(user, I)
/obj/machinery/mineral/equipment_vendor/screwdriver_act(mob/living/user, obj/item/I)
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
return TRUE
/**
* Called when someone slaps the machine with a mining voucher
*
@@ -242,7 +251,7 @@
* * redeemer - The person holding it
*/
/obj/machinery/mineral/equipment_vendor/proc/redeem_voucher(obj/item/mining_voucher/voucher, mob/redeemer)
var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Plasma Cutter", "Jaunter Kit", "Mining Conscription Kit")
var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Plasma Cutter", "Mining Explosives Kit", "Jaunter Kit", "Mining Conscription Kit")
var/selection = tgui_input_list(redeemer, "Pick your equipment", "Mining Voucher Redemption", items)
if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer)
@@ -268,6 +277,8 @@
new /obj/item/kinetic_crusher(drop_location)
if("Plasma Cutter")
new /obj/item/gun/energy/plasmacutter(drop_location)
if("Mining Explosives Kit")
new /obj/item/storage/backpack/duffel/miningcharges(drop_location)
if("Jaunter Kit")
new /obj/item/wormhole_jaunter(drop_location)
new /obj/item/stack/medical/bruise_pack/advanced(drop_location)
+7 -6
View File
@@ -21,15 +21,16 @@
S.remove_from_storage(O, src) //This will move the item to this item's contents
CHECK_TICK
to_chat(user, "<span class='notice'>You empty the satchel into the box.</span>")
else if(istype(W, /obj/item/crowbar))
playsound(src, W.usesound, 50, 1)
var/obj/item/crowbar/C = W
if(do_after(user, 50 * C.toolspeed, target = src))
user.visible_message("<span class='notice'>[user] pries [src] apart.</span>", "<span class='notice'>You pry apart [src].</span>", "<span class='italics'>You hear splitting wood.</span>")
deconstruct(TRUE, user)
else
return ..()
/obj/structure/ore_box/crowbar_act(mob/living/user, obj/item/I)
. = TRUE
if(!I.use_tool(src, user, 5 SECONDS, I.tool_volume))
return
user.visible_message("<span class='notice'>[user] pries [src] apart.</span>", "<span class='notice'>You pry apart [src].</span>", "<span class='italics'>You hear splitting wood.</span>")
deconstruct(TRUE, user)
/obj/structure/ore_box/attack_hand(mob/user)
if(Adjacent(user))
show_contents(user)
+3 -10
View File
@@ -194,18 +194,11 @@
SEND_SIGNAL(src, COMSIG_CARBON_SWAP_HANDS)
/mob/living/carbon/activate_hand(selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand.
if(istext(selhand))
selhand = lowertext(selhand)
if(selhand == "right" || selhand == "r")
selhand = 0
if(selhand == "left" || selhand == "l")
selhand = 1
/mob/living/carbon/activate_hand(selhand)
if(selhand != hand)
swap_hand()
return TRUE
return FALSE
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M)
if(health < HEALTH_THRESHOLD_CRIT)
+5
View File
@@ -1130,3 +1130,8 @@
. = ..()
for(var/obj/O in src)
O.on_mob_move(Dir, src)
/mob/living/Crossed(atom/movable/mover)
if(istype(mover, /obj/singularity/energy_ball))
dust()
return ..()
+2 -2
View File
@@ -26,8 +26,8 @@
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
//Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas.
/// Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
var/incorporeal_move = NO_INCORPOREAL_MOVE
var/now_pushing = null
@@ -157,10 +157,6 @@
to_chat(user, "<span class='warning'>The maintenance drone chassis is not compatible with [I].</span>")
return
else if(istype(I, /obj/item/crowbar))
to_chat(user, "<span class='warning'>The machine is hermetically sealed. You can't open the case.</span>")
return
else if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda))
if(stat == DEAD)
// Currently not functional, so commenting out until it's fixed to avoid confusion
@@ -206,6 +202,10 @@
..()
/mob/living/silicon/robot/drone/crowbar_act(mob/user, obj/item/I)
. = TRUE
to_chat(user, "<span class='warning'>The machine is hermetically sealed. You can't open the case.</span>")
/mob/living/silicon/robot/drone/Destroy()
. = ..()
QDEL_NULL(stack_glass)
@@ -11,7 +11,6 @@
if(.)
handle_robot_hud_updates()
handle_robot_cell()
process_locks()
update_items()
@@ -121,16 +120,6 @@
if(module_state_3)
module_state_3:screen_loc = ui_inv3
/mob/living/silicon/robot/proc/process_locks()
if(weapon_lock)
uneq_all()
weaponlock_time --
if(weaponlock_time <= 0)
if(src.client)
to_chat(src, "<span class='warning'><B>Weapon Lock Timed Out!</span>")
weapon_lock = FALSE
weaponlock_time = 120
//Robots on fire
/mob/living/silicon/robot/handle_fire()
. = ..()
@@ -17,9 +17,9 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
var/sight_mode = 0
var/custom_name = ""
var/custom_sprite = FALSE //Due to all the sprites involved, a var for our custom borgs may be best
var/custom_sprite = FALSE // Due to all the sprites involved, a var for our custom borgs may be best.
//Hud stuff
// HUD stuff.
var/atom/movable/screen/hands = null
var/atom/movable/screen/inv1 = null
var/atom/movable/screen/inv2 = null
@@ -27,10 +27,11 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
var/atom/movable/screen/lamp_button = null
var/atom/movable/screen/thruster_button = null
var/shown_robot_modules = FALSE //Used to determine whether they have the module menu shown or not
/// Used to determine whether the robot has the module menu shown or not.
var/shown_robot_modules = FALSE
var/atom/movable/screen/robot_modules_background
//3 Modules can be activated at any one time.
// 3 Modules can be activated at any one time.
var/obj/item/robot_module/module = null
var/module_active = null
var/module_state_1 = null
@@ -42,81 +43,116 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
var/obj/item/stock_parts/cell/cell = null
var/obj/machinery/camera/camera = null
// Components are basically robot organs.
/// Components are basically robot organs.
var/list/components = list()
var/obj/item/robot_parts/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of..
/// Used for deconstruction to remember what the robot was constructed out of.
var/obj/item/robot_parts/robot_suit/robot_suit = null
/// Used for deconstruction to remember what the robot was constructed out of.
var/obj/item/mmi/mmi = null
var/obj/item/pda/silicon/robot/rbPDA = null
var/datum/wires/robot/wires = null
/// Is the robot's maintenance panel open?
var/opened = FALSE
/// Does the robot have a non-default sprite for an open service panel?
var/custom_panel = null
/// Robot skins with non-default sprites for an open service panel.
var/list/custom_panel_names = list("Cricket")
/// Robot skins with multiple variants for different modules. They require special handling to make their eyes display.
var/list/custom_eye_names = list("Cricket", "Standard")
var/emagged = 0
/// Has the robot been emagged?
var/emagged = FALSE
/// Can the robot be emagged?
var/is_emaggable = TRUE
/// Is the robot protected from the visual portion of flashbangs and flashes(1)? Are they protected from laser pointer (2)?
var/eye_protection = 0
/// Is the robot protected from the audio component of flashbangs? Prevents inflicting confusion.
var/ear_protection = FALSE
/// All incoming damage has this number subtracted from it.
var/damage_protection = 0
/// Is the robot immune to EMPs?
var/emp_protection = FALSE
/// Value incoming brute damage to borgs is mutiplied by.
/// Incoming brute damage is multiplied by this number.
var/brute_mod = 1
/// Value incoming burn damage to borgs is multiplied by.
/// Incoming burn damage is multiplied by this number.
var/burn_mod = 1
var/list/force_modules
/// Can a robot rename itself with the Namepick verb?
var/allow_rename = TRUE
/// Setting to TRUE unlocks a borg's Safety Override modules.
var/weapons_unlock = FALSE
var/static_radio_channels = FALSE
var/wiresexposed = FALSE
/// Is the robot's cover locked?
var/locked = TRUE
/// Determines the ID access needed to unlock the robot's cover.
var/list/req_one_access = list(ACCESS_ROBOTICS)
/// Used for robot access checks.
var/list/req_access
/// Used when generating the number in default robot names.
var/ident = 0
//var/list/laws = list()
var/viewalerts = FALSE
/// What specialisation the robot has.
var/modtype = "Default"
var/datum/effect_system/spark_spread/spark_system //So they can initialize sparks whenever/N
var/low_power_mode = FALSE //whether the robot has no charge left.
var/weapon_lock = FALSE
var/weaponlock_time = 120
var/lawupdate = TRUE //Cyborgs will sync their laws with their AI by default
var/lockcharge //Used when locking down a borg to preserve cell charge
var/speed = 0 //Cause sec borgs gotta go fast //No they dont!
var/scrambledcodes = FALSE // Used to determine if a borg shows up on the robotics console. Setting to TRUE hides them.
var/can_lock_cover = FALSE //Used to set if a borg can re-lock its cover.
/// Has the robot's power cell run out of charge?
var/low_power_mode = FALSE
/// Determines if the robot tries to sync its laws to a connected AI.
var/lawupdate = TRUE
/// Used when locking down a robot to preserve cell charge.
var/lockcharge
/// Speed modifier. Positive numbers reduce speed, negative numbers increase it.
var/speed = 0
/// If set to TRUE, a robot will not be visible on the robotics control console.
var/scrambledcodes = FALSE
/// If set to TRUE, a robot can re-lock its own cover.
var/can_lock_cover = FALSE
/// Determines if a robot acts as a mobile security camera that can be observed through security consoles or by an AI.
var/has_camera = TRUE
var/pdahide = FALSE //Used to hide the borg from the messenger list
var/tracking_entities = 0 //The number of known entities currently accessing the internal camera
/// If set to TRUE, the robot will be hidden on the PDA messenger list.
var/pdahide = FALSE
/// The number of known entities currently accessing the internal camera.
var/tracking_entities = 0
/// Determines if the robot is referred to as an "Android", "Robot", or "Cyborg" based on the type of brain inside.
var/braintype = "Cyborg"
/// The default skin of some special robots.
var/base_icon = ""
/// If set to TRUE, the robot's 3 module slots will progressively become unusable as they take damage.
var/modules_break = TRUE
var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting.
var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power.
var/lamp_recharging = FALSE //Flag for if the lamp is on cooldown after being forcibly disabled.
/// Maximum brightness of a robot's headlamp. Set as a var for easy adjusting.
var/lamp_max = 10
/// Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power. Increments in steps of 2.
var/lamp_intensity = 0
/// Flag for if the headlamp is on cooldown after being forcibly disabled (e.g. by a shadow deamon).
var/lamp_recharging = FALSE
/// When the camera moved signal was send last. Avoid overdoing it
/// When the camera moved signal was sent last. Avoid overdoing it.
var/last_camera_update
hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD)
var/default_cell_type = /obj/item/stock_parts/cell/high
var/ionpulse = FALSE // Jetpack-like effect.
var/ionpulse_on = FALSE // Jetpack-like effect.
/// Does it clean the tile under it?
/// Does the robot have ion thrusters installed?
var/ionpulse = FALSE
/// Are the robot's ion thrusters activated?
var/ionpulse_on = FALSE
/// Does the robot clean dirt under it when it moves onto a tile?
var/floorbuffer = FALSE
var/datum/action/item_action/toggle_research_scanner/scanner = null
var/list/module_actions = list()
var/has_advanced_reagent_vision = FALSE // Determines if the cyborg has advanced reagent vision.
/// If set to TRUE, the robot can see the types and precice quantities of reagents in transparent containers, the % amount of different reagents in opaque containers, and can identify different blood types.
var/has_advanced_reagent_vision = FALSE
/// Integer used to determine self-mailing location, used only by drones and saboteur borgs.
/// Integer used to determine self-mailing location, used only by drones and saboteur robots.
var/mail_destination = 1
var/datum/ui_module/robot_self_diagnosis/self_diagnosis
var/datum/ui_module/destination_tagger/mail_setter
@@ -106,25 +106,6 @@
visible_message("[user] inserts a cell into [src].",
"<span class='notice'>You insert the new cell into [src].</span>")
update_controls()
else if(istype(I, /obj/item/crowbar) && open && cell)
cell.add_fingerprint(usr)
cell.forceMove(loc)
cell = null
visible_message("[user] crowbars out the power cell from [src].",
"<span class='notice'>You pry the powercell out of [src].</span>")
update_controls()
else if(istype(I, /obj/item/wrench))
if(health < maxHealth)
adjustBruteLoss(-25)
updatehealth()
user.visible_message(
"<span class='notice'>[user] repairs [src]!</span>",
"<span class='notice'>You repair [src]!</span>"
)
else
to_chat(user, "<span class='notice'>[src] does not need a repair!</span>")
else if((istype(I, /obj/item/multitool) || istype(I, /obj/item/wirecutters)) && open)
return attack_hand(user)
else if(load && ismob(load)) // chance to knock off rider
if(prob(1 + I.force * 2))
unload(0)
@@ -138,16 +119,58 @@
update_icon()
return
/mob/living/simple_animal/bot/mulebot/crowbar_act(mob/living/user, obj/item/I)
if(!open || !cell)
return
. = TRUE
if(!I.use_tool(src, user, I.tool_volume))
return
cell.add_fingerprint(user)
cell.forceMove(loc)
cell = null
visible_message("[user] crowbars out the power cell from [src].",
"<span class='notice'>You pry the powercell out of [src].</span>")
update_controls()
/mob/living/simple_animal/bot/mulebot/multitool_act(mob/living/user, obj/item/I)
if(!open)
return
. = TRUE
if(!I.use_tool(src, user, I.tool_volume))
return
attack_hand(user)
/mob/living/simple_animal/bot/mulebot/screwdriver_act(mob/living/user, obj/item/I)
. = ..()
if(!.)
return
if(open)
on = FALSE
update_controls()
update_icon()
/mob/living/simple_animal/bot/mulebot/wrench_act(mob/living/user, obj/item/I)
. = TRUE
if(health >= maxHealth)
to_chat(user, "<span class='notice'>[src] does not need a repair!</span>")
return
if(!I.use_tool(src, user, I.tool_volume))
return
adjustBruteLoss(-25)
updatehealth()
user.visible_message(
"<span class='notice'>[user] repairs [src]!</span>",
"<span class='notice'>You repair [src]!</span>"
)
/mob/living/simple_animal/bot/mulebot/wirecutter_act(mob/living/user, obj/item/I)
if(!open)
return
. = TRUE
if(!I.use_tool(src, user, I.tool_volume))
return
attack_hand(user)
/mob/living/simple_animal/bot/mulebot/emag_act(mob/user)
if(!emagged)
emagged = TRUE
+1 -1
View File
@@ -918,7 +918,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
return
/mob/proc/activate_hand(selhand)
return
return FALSE
/mob/dead/observer/verb/respawn()
set name = "Respawn as NPC"
+7 -4
View File
@@ -245,10 +245,10 @@
return
var/mob/living/L = mob
switch(L.incorporeal_move)
if(1)
if(INCORPOREAL_MOVE_NORMAL)
L.forceMove(get_step(L, direct))
L.dir = direct
if(2)
if(INCORPOREAL_MOVE_NINJA)
if(prob(50))
var/locx
var/locy
@@ -287,7 +287,7 @@
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
L.forceMove(get_step(L, direct))
L.dir = direct
if(3) //Incorporeal move, but blocked by holy-watered tiles
if(INCORPOREAL_MOVE_HOLY_BLOCK)
var/turf/simulated/floor/stepTurf = get_step(L, direct)
if(stepTurf.flags & NOJAUNT)
to_chat(L, "<span class='warning'>Holy energies block your path.</span>")
@@ -297,7 +297,7 @@
else
L.forceMove(get_step(L, direct))
L.dir = direct
return 1
return TRUE
///Process_Spacemove
@@ -362,6 +362,9 @@
return
if(!Process_Spacemove(get_dir(pulling.loc, A)))
return
var/target_turf = get_step(pulling, get_dir(pulling.loc, A))
if(!Adjacent(target_turf)) //Make sure the turf we are trying to pull to is adjacent to the user.
return
if(ismob(pulling))
var/mob/M = pulling
var/atom/movable/t = M.pulling
+1 -2
View File
@@ -4,7 +4,6 @@
animate_movement = 2
pressure_resistance = 8
throwforce = 10
dont_save = TRUE //to avoid it messing up in buildmode saving
var/datum/mind/mind
blocks_emissive = EMISSIVE_BLOCK_GENERIC
@@ -45,7 +44,7 @@
var/memory = ""
var/notransform = FALSE //Carbon
/// True for left hand active, otherwise for right hand active
var/hand = null
var/hand = HAND_BOOL_RIGHT
var/real_name = null
var/flavor_text = ""
var/med_record = ""
+4
View File
@@ -10,6 +10,7 @@
body_parts_covered = HEAD
heat_protection = HEAD
cold_protection = HEAD
permeability_coefficient = 0.01
sprite_sheets = list(
"Grey" = 'icons/mob/clothing/modsuit/species/grey_helmets.dmi',
"Vulpkanin" = 'icons/mob/clothing/modsuit/species/vulp_modsuits.dmi',
@@ -36,6 +37,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO
heat_protection = UPPER_TORSO|LOWER_TORSO
cold_protection = UPPER_TORSO|LOWER_TORSO
permeability_coefficient = 0.01
hide_tail_by_species = list("modsuit")
sprite_sheets = list(
"Vulpkanin" = 'icons/mob/clothing/modsuit/species/vulp_modsuits.dmi',
@@ -57,6 +59,7 @@
body_parts_covered = HANDS|ARMS
heat_protection = HANDS|ARMS
cold_protection = HANDS|ARMS
permeability_coefficient = 0.01
sprite_sheets = list(
"Vulpkanin" = 'icons/mob/clothing/modsuit/species/vulp_modsuits.dmi',
"Tajaran" = 'icons/mob/clothing/modsuit/species/taj_modsuits.dmi',
@@ -77,6 +80,7 @@
body_parts_covered = FEET|LEGS
heat_protection = FEET|LEGS
cold_protection = FEET|LEGS
permeability_coefficient = 0.01
sprite_sheets = list(
"Vulpkanin" = 'icons/mob/clothing/modsuit/species/vulp_modsuits.dmi',
"Tajaran" = 'icons/mob/clothing/modsuit/species/taj_modsuits.dmi',
@@ -60,7 +60,7 @@
loaded_tank = I
I.forceMove(src)
update_icons()
else if(iscrowbar(I))
else if(I.tool_behaviour == TOOL_CROWBAR)
if(loaded_tank && !locked)
eject()
return TRUE
+91 -11
View File
@@ -41,6 +41,8 @@
var/has_close_field = FALSE
/// Init list that has all the areas that we can possibly move to, to reduce processing impact
var/list/all_possible_areas = list()
/// How many tiles do we move per movement step?
var/steps_per_move = 8
/obj/singularity/energy_ball/Initialize(mapload, starting_energy = 50, is_miniball = FALSE)
miniball = is_miniball
@@ -84,7 +86,6 @@
/obj/singularity/energy_ball/process()
if(!parent_energy_ball)
handle_energy()
move_the_basket_ball()
playsound(loc, 'sound/magic/lightningbolt.ogg', 100, TRUE, extrarange = 30, channel = CHANNEL_ENGINE)
@@ -99,6 +100,8 @@
var/range = rand(1, clamp(length(orbiting_balls), 2, 3))
//We zap off the main ball instead of ourselves to make things looks proper
tesla_zap(src, range, TESLA_MINI_POWER / 7 * range)
move_the_basket_ball()
else
energy = 0 // ensure we dont have miniballs of miniballs //But it'll be cool broooooooooooooooo
@@ -108,6 +111,7 @@
. += "There are [length(orbiting_balls)] mini-balls orbiting it."
/obj/singularity/energy_ball/proc/move_the_basket_ball()
has_close_field = FALSE
for(var/i in 1 to length(GLOB.field_generator_fields))
var/temp_distance = get_dist(src, GLOB.field_generator_fields[i])
if(temp_distance <= 15)
@@ -117,28 +121,104 @@
var/turf/T = get_step(src, pick(GLOB.alldirs))
if(can_move(T))
forceMove(T)
has_close_field = FALSE
for(var/mob/living/carbon/C in loc)
dust_mobs(C)
return
if(!target_turf)
if(!target_turf || loc == target_turf)
find_the_basket()
return
for(var/i in 0 to 8)
movement_dir = get_dir(get_turf(src), target_turf)
forceMove(get_step(src, movement_dir))
if(get_turf(src) == target_turf)
target_turf = null
for(var/mob/living/carbon/C in loc)
dust_mobs(C)
has_close_field = FALSE
var/turf/move_target = next_move_target()
movement_beam(move_target, 1.5 SECONDS)
sleep(0.5 SECONDS)
// MORE POWER
movement_beam(move_target, 1 SECONDS)
sleep(0.5 SECONDS)
walk_towards(src, move_target, 0, 10)
/datum/move_with_corner
var/turf/start
var/turf/end
var/turf/corner
var/pre_corner_x_unit
var/pre_corner_y_unit
var/pre_corner_dist
var/post_corner_x_unit
var/post_corner_y_unit
var/post_corner_dist
/datum/move_with_corner/New(atom/start_in, atom/end_in)
start = start_in
end = end_in
pre_corner_x_unit = (end.x > start.x) ? 1 : -1
pre_corner_y_unit = (end.y > start.y) ? 1 : -1
if(start.x == end.x)
// Moving along y
corner = end
pre_corner_x_unit = 0
pre_corner_dist = abs(start.y - end.y)
return
if(start.y == end.y)
// Moving along x
corner = end
pre_corner_y_unit = 0
pre_corner_dist = abs(start.x - end.x)
return
pre_corner_dist = min(abs(start.x-end.x), abs(start.y-end.y))
corner = locate(start.x + pre_corner_x_unit * pre_corner_dist, start.y + pre_corner_y_unit * pre_corner_dist, start.z)
if(start.x + pre_corner_x_unit * pre_corner_dist == end.x)
// x finished first, move along y
post_corner_x_unit = 0
post_corner_dist = abs(start.y - end.y) - pre_corner_dist
else
// y finished first, move along x
post_corner_y_unit = 0
post_corner_dist = abs(start.x - end.x) - pre_corner_dist
/datum/move_with_corner/proc/get_early_end(dist)
if(dist <= pre_corner_dist)
return locate(start.x + pre_corner_x_unit * dist, start.y + pre_corner_y_unit * dist, start.z)
else if(dist == pre_corner_dist)
return corner
else if(dist >= pre_corner_dist + post_corner_dist)
return end
var/remaining_dist = dist - pre_corner_dist
return locate(corner.x + remaining_dist * post_corner_x_unit, corner.y + remaining_dist * post_corner_y_unit, corner.z)
/obj/singularity/energy_ball/proc/next_move_target()
var/datum/move_with_corner/path = new(loc, target_turf)
return path.get_early_end(steps_per_move)
/obj/singularity/energy_ball/proc/movement_beam(turf/move_target, duration)
var/datum/move_with_corner/path = new(loc, move_target)
loc.Beam(path.corner, "lightning[rand(1, 12)]", 'icons/effects/effects.dmi', duration, INFINITY)
if(path.corner != move_target)
path.corner.Beam(move_target, "lightning[rand(1, 12)]", 'icons/effects/effects.dmi', duration, INFINITY)
/obj/singularity/energy_ball/proc/find_the_basket()
var/area/where_to_move = pick(all_possible_areas) // Grabs a random area that isn't restricted
var/turf/target_area_turfs = get_area_turfs(where_to_move) // Grabs the turfs from said area
target_turf = pick(target_area_turfs) // Grabs a single turf from the entire list
/obj/singularity/energy_ball/Move(target, direction)
// Energy balls move through everything, make it a forceMove.
if(miniball)
return ..()
forceMove(target, direction)
return TRUE
// This handles mobs crossing us. For us crossing mobs, see /mob/living/Crossed.
// (It also dusts them.)
/obj/singularity/energy_ball/Crossed(atom/thing)
if(isliving(thing))
var/mob/victim = thing
victim.dust()
/obj/singularity/energy_ball/proc/handle_energy()
if(energy >= energy_to_raise)
energy_to_lower = energy_to_raise - 20

Some files were not shown because too many files have changed in this diff Show More