Merge branch 'master' into upstream-merge-31077

This commit is contained in:
LetterJay
2017-09-29 12:46:25 -04:00
committed by GitHub
99 changed files with 1533 additions and 766 deletions
+1 -10
View File
@@ -7441,14 +7441,6 @@
/obj/effect/spawner/structure/window/reinforced, /obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/crew_quarters/fitness) /area/crew_quarters/fitness)
"aqt" = (
/obj/effect/landmark/syndicate_breach_area,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/crew_quarters/fitness)
"aqu" = ( "aqu" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10 dir = 10
@@ -14777,7 +14769,6 @@
/turf/open/floor/plating, /turf/open/floor/plating,
/area/chapel/main) /area/chapel/main)
"aHr" = ( "aHr" = (
/obj/effect/landmark/marauder_entry,
/turf/open/space, /turf/open/space,
/area/space) /area/space)
"aHs" = ( "aHs" = (
@@ -100719,7 +100710,7 @@ aaa
aaa aaa
aaa aaa
aaa aaa
aqt aqs
aro aro
aro aro
aro aro
+1 -10
View File
@@ -178,7 +178,6 @@
/turf/open/floor/plasteel/airless/solarpanel, /turf/open/floor/plasteel/airless/solarpanel,
/area/solar/port/fore) /area/solar/port/fore)
"aav" = ( "aav" = (
/obj/effect/landmark/marauder_entry,
/turf/open/space, /turf/open/space,
/area/space) /area/space)
"aaw" = ( "aaw" = (
@@ -2225,14 +2224,6 @@
}, },
/turf/open/floor/plating, /turf/open/floor/plating,
/area/crew_quarters/fitness/recreation) /area/crew_quarters/fitness/recreation)
"aeD" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/effect/landmark/syndicate_breach_area,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
/area/crew_quarters/fitness/recreation)
"aeE" = ( "aeE" = (
/obj/effect/spawner/structure/window/reinforced, /obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -129060,7 +129051,7 @@ aaa
aaa aaa
bii bii
aaa aaa
aeD aeC
afD afD
afD afD
afD afD
@@ -38904,7 +38904,7 @@
volume_rate = 200 volume_rate = 200
}, },
/turf/open/space/basic, /turf/open/space/basic,
/area/space) /area/engine/engineering)
"bxd" = ( "bxd" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4 dir = 4
+61 -16
View File
@@ -5751,6 +5751,10 @@
/obj/structure/mirror{ /obj/structure/mirror{
pixel_x = 28 pixel_x = 28
}, },
/obj/structure/sink{
dir = 4;
pixel_x = 11
},
/turf/open/floor/plasteel/freezer{ /turf/open/floor/plasteel/freezer{
dir = 2 dir = 2
}, },
@@ -6101,7 +6105,7 @@
/area/syndicate_mothership/control) /area/syndicate_mothership/control)
"qp" = ( "qp" = (
/obj/structure/chair/stool, /obj/structure/chair/stool,
/obj/effect/landmark/syndicate_spawn, /obj/effect/landmark/start/nukeop,
/turf/open/floor/plasteel/bar{ /turf/open/floor/plasteel/bar{
dir = 2 dir = 2
}, },
@@ -6506,6 +6510,7 @@
/area/syndicate_mothership/control) /area/syndicate_mothership/control)
"rj" = ( "rj" = (
/obj/structure/closet/cardboard, /obj/structure/closet/cardboard,
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plating/airless, /turf/open/floor/plating/airless,
/area/syndicate_mothership/control) /area/syndicate_mothership/control)
"rk" = ( "rk" = (
@@ -7623,7 +7628,7 @@
/turf/open/floor/wood, /turf/open/floor/wood,
/area/syndicate_mothership/control) /area/syndicate_mothership/control)
"tT" = ( "tT" = (
/obj/effect/landmark/syndicate_spawn, /obj/effect/landmark/start/nukeop_leader,
/turf/open/floor/wood, /turf/open/floor/wood,
/area/syndicate_mothership/control) /area/syndicate_mothership/control)
"tU" = ( "tU" = (
@@ -8025,6 +8030,9 @@
/area/syndicate_mothership/control) /area/syndicate_mothership/control)
"vb" = ( "vb" = (
/obj/structure/closet/cardboard/metal, /obj/structure/closet/cardboard/metal,
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
/turf/open/floor/plating/airless, /turf/open/floor/plating/airless,
/area/syndicate_mothership/control) /area/syndicate_mothership/control)
"vc" = ( "vc" = (
@@ -9731,7 +9739,6 @@
/area/wizard_station) /area/wizard_station)
"zj" = ( "zj" = (
/obj/structure/table/wood, /obj/structure/table/wood,
/obj/effect/landmark/teleport_scroll,
/obj/item/dice/d20, /obj/item/dice/d20,
/obj/item/dice, /obj/item/dice,
/turf/open/floor/carpet, /turf/open/floor/carpet,
@@ -13652,6 +13659,44 @@
}, },
/turf/open/floor/holofloor, /turf/open/floor/holofloor,
/area/holodeck/rec_center/school) /area/holodeck/rec_center/school)
"QT" = (
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
"QU" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
"QV" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
"QW" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
"QX" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
"QY" = (
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
"QZ" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
/turf/open/floor/plating/airless,
/area/syndicate_mothership/control)
(1,1,1) = {" (1,1,1) = {"
aa aa
@@ -34895,7 +34940,7 @@ lG
hm hm
aa aa
kl kl
qs QT
rk rk
rl rl
rm rm
@@ -34903,7 +34948,7 @@ tl
rm rm
ux ux
vc vc
qs QY
kl kl
aa aa
aa aa
@@ -36180,7 +36225,7 @@ hq
hm hm
aa aa
kl kl
qt QU
ro ro
rm rm
sd sd
@@ -36437,7 +36482,7 @@ hq
hm hm
aa aa
kl kl
qs QV
rp rp
ro ro
rm rm
@@ -36445,7 +36490,7 @@ tl
rm rm
uy uy
ve ve
qs QZ
kl kl
aa aa
aa aa
@@ -36695,13 +36740,13 @@ hm
aa aa
kl kl
qs qs
qs QW
se se
se se
se se
se se
se se
qs QX
qs qs
kl kl
aa aa
@@ -76391,9 +76436,9 @@ dM
QJ QJ
QL QL
fg fg
QO QL
QQ QK
QR QL
dM dM
fN fN
fQ fQ
@@ -76903,11 +76948,11 @@ dM
QI QI
dM dM
QK QK
QM QL
QN QN
QP QL
fr fr
QS QL
dM dM
fN fN
ab ab
+1
View File
@@ -12,6 +12,7 @@
#define HIGH_TURF_LAYER 2.03 #define HIGH_TURF_LAYER 2.03
#define ABOVE_OPEN_TURF_LAYER 2.04 #define ABOVE_OPEN_TURF_LAYER 2.04
#define CLOSED_TURF_LAYER 2.05 #define CLOSED_TURF_LAYER 2.05
#define BULLET_HOLE_LAYER 2.06
#define ABOVE_NORMAL_TURF_LAYER 2.08 #define ABOVE_NORMAL_TURF_LAYER 2.08
#define LATTICE_LAYER 2.2 #define LATTICE_LAYER 2.2
#define DISPOSAL_PIPE_LAYER 2.3 #define DISPOSAL_PIPE_LAYER 2.3
+1 -1
View File
@@ -474,7 +474,7 @@
#error Remie said that lummox was adding a way to get a lists #error Remie said that lummox was adding a way to get a lists
#error contents via list.values, if that is true remove this #error contents via list.values, if that is true remove this
#error otherwise, update the version and bug lummox #error otherwise, update the version and bug lummox
#elseif #endif
//Flattens a keyed list into a list of it's contents //Flattens a keyed list into a list of it's contents
/proc/flatten_list(list/key_list) /proc/flatten_list(list/key_list)
if(!islist(key_list)) if(!islist(key_list))
+6 -22
View File
@@ -502,28 +502,12 @@ Turf and target are separate in case you want to teleport some distance from a t
var/y=arcsin(x/sqrt(1+x*x)) var/y=arcsin(x/sqrt(1+x*x))
return y return y
/atom/proc/GetAllContents(list/ignore_typecache) /atom/proc/GetAllContents(list/output=list())
var/list/processing_list = list(src) . = output
var/list/assembled = list() output += src
if(ignore_typecache) //If there's a typecache, use it. for(var/i in 1 to contents.len)
while(processing_list.len) var/atom/thing = contents[i]
var/atom/A = processing_list[1] thing.GetAllContents(output)
processing_list -= A
if(ignore_typecache[A.type])
continue
processing_list |= (A.contents - assembled)
assembled |= A
else //If there's none, only make this check once for performance.
while(processing_list.len)
var/atom/A = processing_list[1]
processing_list -= A
processing_list |= (A.contents - assembled)
assembled |= A
return assembled
//Step-towards method of determining whether one atom can see another. Similar to viewers() //Step-towards method of determining whether one atom can see another. Similar to viewers()
/proc/can_see(atom/source, atom/target, length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate. /proc/can_see(atom/source, atom/target, length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate.
+2
View File
@@ -33,6 +33,8 @@ GLOBAL_LIST_EMPTY(department_security_spawns) //list of all department security
GLOBAL_LIST_EMPTY(generic_event_spawns) //list of all spawns for events GLOBAL_LIST_EMPTY(generic_event_spawns) //list of all spawns for events
GLOBAL_LIST_EMPTY(wizardstart) GLOBAL_LIST_EMPTY(wizardstart)
GLOBAL_LIST_EMPTY(nukeop_start)
GLOBAL_LIST_EMPTY(nukeop_leader_start)
GLOBAL_LIST_EMPTY(newplayer_start) GLOBAL_LIST_EMPTY(newplayer_start)
GLOBAL_LIST_EMPTY(prisonwarp) //prisoners go to these GLOBAL_LIST_EMPTY(prisonwarp) //prisoners go to these
GLOBAL_LIST_EMPTY(holdingfacility) //captured people go here GLOBAL_LIST_EMPTY(holdingfacility) //captured people go here
+435 -5
View File
@@ -172,6 +172,27 @@
spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable
recoil = 1 recoil = 1
///toy memes///
/obj/item/ammo_box/magazine/toy/x9
name = "foam force X9 magazine"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "toy9magazine"
max_ammo = 30
multiple_sprites = 2
/obj/item/gun/ballistic/automatic/x9/toy
name = "donksoft X9"
desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up."
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "toy9"
can_suppress = 0
needs_permit = 0
mag_type = /obj/item/ammo_box/magazine/toy/x9
casing_ejector = 0
spread = 45 //MAXIMUM XCOM MEMES (actually that'd be 90 spread)
////////XCOM2 Magpistol///////// ////////XCOM2 Magpistol/////////
//////projectiles////// //////projectiles//////
@@ -213,7 +234,7 @@
//////magazines///// //////magazines/////
/obj/item/ammo_box/magazine/mmags /obj/item/ammo_box/magazine/mmag/small
name = "magpistol magazine (non-lethal disabler)" name = "magpistol magazine (non-lethal disabler)"
icon = 'icons/obj/guns/cit_guns.dmi' icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "nlmagmag" icon_state = "nlmagmag"
@@ -223,7 +244,7 @@
max_ammo = 7 max_ammo = 7
multiple_sprites = 2 multiple_sprites = 2
/obj/item/ammo_box/magazine/mmags/lethal /obj/item/ammo_box/magazine/mmag/small/lethal
name = "magpistol magazine (lethal)" name = "magpistol magazine (lethal)"
icon = 'icons/obj/guns/cit_guns.dmi' icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "smallmagmag" icon_state = "smallmagmag"
@@ -239,7 +260,7 @@
icon_state = "magpistol" icon_state = "magpistol"
force = 10 force = 10
fire_sound = 'sound/weapons/magpistol.ogg' fire_sound = 'sound/weapons/magpistol.ogg'
mag_type = /obj/item/ammo_box/magazine/mmags mag_type = /obj/item/ammo_box/magazine/mmag/small
can_suppress = 0 can_suppress = 0
casing_ejector = 0 casing_ejector = 0
fire_delay = 5 fire_delay = 5
@@ -276,7 +297,7 @@
req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5, "syndicate" = 3) req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5, "syndicate" = 3)
build_type = PROTOLATHE build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_SILVER = 500) materials = list(MAT_METAL = 4000, MAT_SILVER = 500)
build_path = /obj/item/ammo_box/magazine/mmags/lethal build_path = /obj/item/ammo_box/magazine/mmag/small/lethal
category = list("Ammo") category = list("Ammo")
/datum/design/mag_magpistol/nl /datum/design/mag_magpistol/nl
@@ -285,7 +306,7 @@
id = "mag_magpistol_nl" id = "mag_magpistol_nl"
req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5) req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5)
materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250) materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
build_path = /obj/item/ammo_box/magazine/mmags build_path = /obj/item/ammo_box/magazine/mmag/small
//////toy memes///// //////toy memes/////
@@ -339,3 +360,412 @@
materials = list(MAT_METAL = 7500, MAT_GLASS = 1000) materials = list(MAT_METAL = 7500, MAT_GLASS = 1000)
build_path = /obj/item/gun/ballistic/shotgun/toy/mag build_path = /obj/item/gun/ballistic/shotgun/toy/mag
category = list("hacked", "Misc") category = list("hacked", "Misc")
//////Magrifle//////
///projectiles///
/obj/item/projectile/bullet/magrifle
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "magjectile-large"
damage = 30
armour_penetration = 25
light_range = 3
light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "magjectile-large-nl"
damage = 5
knockdown = 30
stamina = 75
armour_penetration = 0
light_range = 3
light_color = LIGHT_COLOR_BLUE
///ammo casings///
/obj/item/ammo_casing/caseless/amagm
desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
caliber = "magm"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/magrifle
/obj/item/ammo_casing/caseless/anlmagm
desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
caliber = "magm"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/nlmagrifle
///magazines///
/obj/item/ammo_box/magazine/mmag/
name = "magrifle magazine (non-lethal disabler)"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "mediummagmag"
origin_tech = "magnets=6"
ammo_type = /obj/item/ammo_casing/caseless/anlmagm
caliber = "magm"
max_ammo = 15
multiple_sprites = 2
/obj/item/ammo_box/magazine/mmag/lethal
name = "magrifle magazine (lethal)"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "mediummagmag"
origin_tech = "combat=6"
ammo_type = /obj/item/ammo_casing/caseless/amagm
///the gun itself///
/obj/item/gun/ballistic/automatic/magrifle
name = "\improper Magnetic Rifle"
desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "magrifle"
item_state = "arg"
slot_flags = 0
origin_tech = "combat=6;engineering=6;magnets=6"
mag_type = /obj/item/ammo_box/magazine/mmag
fire_sound = 'sound/weapons/magrifle.ogg'
can_suppress = 0
burst_size = 3
fire_delay = 2
spread = 15
recoil = 1
casing_ejector = 0
///research///
/obj/item/gun/ballistic/automatic/magrifle/nopin
pin = null
/datum/design/magrifle
name = "Magrifle"
desc = "An upscaled Magpistol in rifle form."
id = "magrifle"
req_tech = list("combat" = 7, "magnets" = 7, "powerstorage" = 7)
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000)
build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin
category = list("Weapons")
/datum/design/mag_magrifle
name = "Magrifle Magazine (Lethal)"
desc = "A 15 round magazine for the Magrifle."
id = "mag_magrifle"
req_tech = list("combat" = 7, "magnets" = 7, "materials" = 5, "syndicate" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 8000, MAT_SILVER = 1000)
build_path = /obj/item/ammo_box/magazine/mmag/lethal
category = list("Ammo")
/datum/design/mag_magrifle/nl
name = "Magrifle Magazine (Non-Lethal)"
desc = "A 15 round non-lethal magazine for the Magrifle."
id = "mag_magrifle_nl"
req_tech = list("combat" = 7, "magnets" = 7, "materials" = 5)
materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
build_path = /obj/item/ammo_box/magazine/mmag
//////Hyper-Burst Rifle//////
///projectiles///
/obj/item/projectile/bullet/mags/hyper
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "magjectile"
damage = 10
armour_penetration = 10
stamina = 10
forcedodge = TRUE
range = 6
light_range = 1
light_color = LIGHT_COLOR_RED
/obj/item/projectile/bullet/mags/hyper/inferno
icon_state = "magjectile-large"
stamina = 0
forcedodge = FALSE
range = 25
light_range = 4
/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE)
..()
explosion(target, -1, 1, 2, 4, 5)
return 1
///ammo casings///
/obj/item/ammo_casing/caseless/ahyper
desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle."
caliber = "hypermag"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "hyper-casing-live"
projectile_type = /obj/item/projectile/bullet/mags/hyper
pellets = 12
variance = 40
/obj/item/ammo_casing/caseless/ahyper/inferno
projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno
pellets = 1
variance = 0
///magazines///
/obj/item/ammo_box/magazine/mhyper
name = "hyper-burst rifle magazine"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "hypermag-4"
ammo_type = /obj/item/ammo_casing/caseless/ahyper
caliber = "hypermag"
desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range."
max_ammo = 4
/obj/item/ammo_box/magazine/mhyper/update_icon()
..()
icon_state = "hypermag-[ammo_count() ? "4" : "0"]"
/obj/item/ammo_box/magazine/mhyper/inferno
name = "hyper-burst rifle magazine (inferno)"
ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno
desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light."
///gun itself///
/obj/item/gun/ballistic/automatic/hyperburst
name = "\improper Hyper-Burst Rifle"
desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once."
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "hyperburst"
item_state = "arg"
slot_flags = 0
origin_tech = "combat=6;engineering=6;magnets=6;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/mhyper
fire_sound = 'sound/weapons/magburst.ogg'
can_suppress = 0
burst_size = 1
fire_delay = 40
recoil = 2
casing_ejector = 0
weapon_weight = WEAPON_HEAVY
/obj/item/gun/ballistic/automatic/hyperburst/update_icon()
..()
icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]"
/* made redundant by reskinnable stetchkins
//////Stealth Pistol//////
/obj/item/gun/ballistic/automatic/pistol/stealth
name = "stealth pistol"
desc = "A unique bullpup pistol with a compact frame. Has an integrated surpressor."
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "stealthpistol"
w_class = WEIGHT_CLASS_SMALL
origin_tech = "combat=3;materials=3;syndicate=4"
mag_type = /obj/item/ammo_box/magazine/m10mm
can_suppress = 0
fire_sound = 'sound/weapons/gunshot_silenced.ogg'
suppressed = 1
burst_size = 1
/obj/item/gun/ballistic/automatic/pistol/stealth/update_icon()
..()
if(magazine)
cut_overlays()
add_overlay("stealthpistol-magazine")
else
cut_overlays()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
*/
//////10mm soporific bullets//////
obj/item/projectile/bullet/c10mm/soporific
name ="10mm soporific bullet"
armour_penetration = 0
nodamage = TRUE
dismemberment = 0
knockdown = 0
/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE)
if((blocked != 100) && isliving(target))
var/mob/living/L = target
L.blur_eyes(6)
if(L.staminaloss >= 40)
L.Sleeping(250)
else
L.adjustStaminaLoss(58)
return 1
/obj/item/ammo_casing/c10mm/soporific
name = ".10mm soporific bullet casing"
desc = "A 10mm soporific bullet casing."
projectile_type = /obj/item/projectile/bullet/c10mm/soporific
/obj/item/ammo_box/magazine/m10mm/soporific
name = "pistol magazine (10mm soporific)"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "9x19pS"
desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target."
ammo_type = /obj/item/ammo_casing/c10mm/soporific
/obj/item/ammo_box/c10mm/soporific
name = "ammo box (10mm soporific)"
ammo_type = /obj/item/ammo_casing/c10mm/soporific
max_ammo = 24
//////Flechette Launcher//////
///projectiles///
/obj/item/projectile/bullet/cflechetteap //shreds armor
name = "flechette (armor piercing)"
damage = 8
armour_penetration = 80
/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding
name = "flechette (serrated)"
damage = 8
dismemberment = 10
armour_penetration = -80
/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE)
if((blocked != 100) && iscarbon(target))
var/mob/living/carbon/C = target
C.bleed(10)
return ..()
///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)///
/obj/item/ammo_casing/caseless/flechetteap
name = "flechette (armor piercing)"
desc = "A flechette made with a tungsten alloy."
projectile_type = /obj/item/projectile/bullet/cflechetteap
caliber = "flechette"
throwforce = 1
throw_speed = 3
/obj/item/ammo_casing/caseless/flechettes
name = "flechette (serrated)"
desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh."
projectile_type = /obj/item/projectile/bullet/cflechettes
caliber = "flechette"
throwforce = 2
throw_speed = 3
embed_chance = 75
///magazine///
/obj/item/ammo_box/magazine/flechette
name = "flechette magazine (armor piercing)"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "flechettemag"
origin_tech = "combat=5;syndicate=1"
ammo_type = /obj/item/ammo_casing/caseless/flechetteap
caliber = "flechette"
max_ammo = 40
multiple_sprites = 2
/obj/item/ammo_box/magazine/flechette/s
name = "flechette magazine (serrated)"
ammo_type = /obj/item/ammo_casing/caseless/flechettes
///the gun itself///
/obj/item/gun/ballistic/automatic/flechette
name = "\improper CX Flechette Launcher"
desc = "A flechette launching machine pistol with an unconventional bullpup frame."
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "flechettegun"
item_state = "gun"
w_class = WEIGHT_CLASS_NORMAL
slot_flags = 0
/obj/item/device/firing_pin/implant/pindicate
origin_tech = "combat=6;materials=2;syndicate=5"
mag_type = /obj/item/ammo_box/magazine/flechette/
fire_sound = 'sound/weapons/gunshot_smg.ogg'
can_suppress = 0
burst_size = 5
fire_delay = 1
casing_ejector = 0
spread = 20
/obj/item/gun/ballistic/automatic/flechette/update_icon()
..()
if(magazine)
cut_overlays()
add_overlay("flechettegun-magazine")
else
cut_overlays()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
///unique variant///
/obj/item/projectile/bullet/cflechetteshredder
name = "flechette (shredder)"
damage = 5
dismemberment = 40
/obj/item/ammo_casing/caseless/flechetteshredder
name = "flechette (shredder)"
desc = "A serrated flechette made of a special alloy that forms a monofilament edge."
projectile_type = /obj/item/projectile/bullet/cflechettes
/obj/item/ammo_box/magazine/flechette/shredder
name = "flechette magazine (shredder)"
icon_state = "shreddermag"
ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder
/obj/item/gun/ballistic/automatic/flechette/shredder
name = "\improper CX Shredder"
desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes."
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/flechette/shredder
spread = 30
/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon()
..()
if(magazine)
cut_overlays()
add_overlay("shreddergun-magazine")
else
cut_overlays()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
//////modular pistol////// (reskinnable stetchkins)
/obj/item/gun/ballistic/automatic/pistol/modular
name = "modular pistol"
desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors."
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "cde"
can_unsuppress = TRUE
unique_rename = TRUE
unique_reskin = list("Default" = "cde",
"NT-99" = "n99",
"Stealth" = "stealthpistol",
"HKVP-78" = "vp78",
"Luger" = "p08b",
"Mk.58" = "secguncomp",
"PX4 Storm" = "px4"
)
/obj/item/gun/ballistic/automatic/pistol/modular/update_icon()
..()
if(current_skin)
icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
else
icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
if(magazine && suppressed)
cut_overlays()
add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay
else if (magazine)
cut_overlays()
add_overlay("[unique_reskin[current_skin]]-magazine")
else
cut_overlays()
+1
View File
@@ -11,6 +11,7 @@ SUBSYSTEM_DEF(squeak)
/datum/controller/subsystem/squeak/Initialize(timeofday) /datum/controller/subsystem/squeak/Initialize(timeofday)
trigger_migration(config.mice_roundstart) trigger_migration(config.mice_roundstart)
return ..()
/datum/controller/subsystem/squeak/proc/trigger_migration(num_mice=10) /datum/controller/subsystem/squeak/proc/trigger_migration(num_mice=10)
if(!num_mice) if(!num_mice)
+10 -1
View File
@@ -57,6 +57,9 @@ SUBSYSTEM_DEF(throwing)
var/pure_diagonal var/pure_diagonal
var/diagonal_error var/diagonal_error
var/datum/callback/callback var/datum/callback/callback
var/paused = FALSE
var/delayed_time = 0
var/last_move = 0
/datum/thrownthing/proc/tick() /datum/thrownthing/proc/tick()
var/atom/movable/AM = thrownthing var/atom/movable/AM = thrownthing
@@ -64,14 +67,20 @@ SUBSYSTEM_DEF(throwing)
finalize() finalize()
return return
if(paused)
delayed_time += world.time - last_move
return
if (dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept if (dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept
finalize() finalize()
return return
var/atom/step var/atom/step
last_move = world.time
//calculate how many tiles to move, making up for any missed ticks. //calculate how many tiles to move, making up for any missed ticks.
var/tilestomove = Ceiling(min(((((world.time+world.tick_lag) - start_time) * speed) - (dist_travelled ? dist_travelled : -1)), speed*MAX_TICKS_TO_MAKE_UP) * (world.tick_lag * SSthrowing.wait)) var/tilestomove = Ceiling(min(((((world.time+world.tick_lag) - start_time + delayed_time) * speed) - (dist_travelled ? dist_travelled : -1)), speed*MAX_TICKS_TO_MAKE_UP) * (world.tick_lag * SSthrowing.wait))
while (tilestomove-- > 0) while (tilestomove-- > 0)
if ((dist_travelled >= maxrange || AM.loc == target_turf) && AM.has_gravity(AM.loc)) if ((dist_travelled >= maxrange || AM.loc == target_turf) && AM.has_gravity(AM.loc))
finalize() finalize()
+2 -31
View File
@@ -1,6 +1,5 @@
/datum/antagonist/ninja /datum/antagonist/ninja
name = "Ninja" name = "Ninja"
var/team
var/helping_station = 0 var/helping_station = 0
var/give_objectives = TRUE var/give_objectives = TRUE
@@ -19,36 +18,8 @@
..(new_owner) ..(new_owner)
helping_station = rand(0,1) helping_station = rand(0,1)
/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current, safety=0)//Safety in case you need to unequip stuff for existing characters. /datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current)
if(safety) return H.equipOutfit(/datum/outfit/ninja)
qdel(H.w_uniform)
qdel(H.wear_suit)
qdel(H.wear_mask)
qdel(H.head)
qdel(H.shoes)
qdel(H.gloves)
var/obj/item/clothing/suit/space/space_ninja/theSuit = new(H)
var/obj/item/dash/energy_katana/EK = new(H)
theSuit.energyKatana = EK
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(H), slot_shoes)
H.equip_to_slot_or_del(theSuit, slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/space_ninja(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(H), slot_glasses)
H.equip_to_slot_or_del(EK, slot_belt)
H.equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/tank/internals/emergency_oxygen(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/tank/jetpack/carbondioxide(H), slot_back)
theSuit.randomize_param()
var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
E.implant(H)
return 1
/datum/antagonist/ninja/proc/addMemories() /datum/antagonist/ninja/proc/addMemories()
owner.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A <font color='red'><B>SPACE NINJA</B></font>!") owner.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A <font color='red'><B>SPACE NINJA</B></font>!")
+2 -2
View File
@@ -102,10 +102,10 @@
if(implants) if(implants)
for(var/implant_type in implants) for(var/implant_type in implants)
var/obj/item/implant/I = new implant_type(H) var/obj/item/implant/I = new implant_type(H)
I.implant(H, null, silent=TRUE) I.implant(H, null, TRUE)
H.update_body() H.update_body()
return 1 return TRUE
/datum/outfit/proc/apply_fingerprints(mob/living/carbon/human/H) /datum/outfit/proc/apply_fingerprints(mob/living/carbon/human/H)
if(!istype(H)) if(!istype(H))
@@ -9,7 +9,7 @@
var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new
var/datum/action/innate/set_droppoint/set_droppoint_action = new var/datum/action/innate/set_droppoint/set_droppoint_action = new
var/obj/machinery/abductor/console/console var/obj/machinery/abductor/console/console
z_lock = ZLEVEL_STATION_PRIMARY station_lock_override = TRUE
icon = 'icons/obj/abductor.dmi' icon = 'icons/obj/abductor.dmi'
icon_state = "camera" icon_state = "camera"
+27 -49
View File
@@ -22,27 +22,17 @@
var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
var/list/pre_nukeops = list()
/datum/game_mode/nuclear/pre_setup() /datum/game_mode/nuclear/pre_setup()
var/n_players = num_players() var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible)
var/n_agents = min(round(n_players / 10, 1), agents_possible) for(var/i = 0, i < n_agents, ++i)
var/datum/mind/new_op = pick_n_take(antag_candidates)
if(antag_candidates.len < n_agents) //In the case of having less candidates than the selected number of agents pre_nukeops += new_op
n_agents = antag_candidates.len new_op.assigned_role = "Nuclear Operative"
new_op.special_role = "Nuclear Operative"
while(n_agents > 0) log_game("[new_op.key] (ckey) has been selected as a nuclear operative")
var/datum/mind/new_syndicate = pick(antag_candidates) return TRUE
syndicates += new_syndicate
antag_candidates -= new_syndicate //So it doesn't pick the same guy each time.
n_agents--
for(var/datum/mind/synd_mind in syndicates)
synd_mind.assigned_role = "Syndicate"
synd_mind.special_role = "Syndicate"//So they actually have a special role/N
log_game("[synd_mind.key] (ckey) has been selected as a nuclear operative")
return 1
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
@@ -60,48 +50,36 @@
//////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////
/datum/game_mode/nuclear/post_setup() /datum/game_mode/nuclear/post_setup()
var/list/turf/synd_spawn = list()
for(var/obj/effect/landmark/A in GLOB.landmarks_list)
if(A.name == "Syndicate-Spawn")
synd_spawn += get_turf(A)
continue
var/nuke_code = random_nukecode() var/nuke_code = random_nukecode()
var/leader_selected = 0
var/agent_number = 1 var/agent_number = 1
var/spawnpos = 1 var/datum/mind/leader = pick(pre_nukeops)
syndicates += pre_nukeops
for(var/i = 1 to pre_nukeops.len)
var/datum/mind/op = pre_nukeops[i]
for(var/datum/mind/synd_mind in syndicates) forge_syndicate_objectives(op)
if(spawnpos > synd_spawn.len) greet_syndicate(op)
spawnpos = 2 equip_syndicate(op.current)
synd_mind.current.loc = synd_spawn[spawnpos]
forge_syndicate_objectives(synd_mind)
greet_syndicate(synd_mind)
equip_syndicate(synd_mind.current)
if(nuke_code) if(nuke_code)
synd_mind.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0) op.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
to_chat(synd_mind.current, "The nuclear authorization code is: <B>[nuke_code]</B>") to_chat(op.current, "The nuclear authorization code is: <B>[nuke_code]</B>")
if(!leader_selected) if(op == leader)
prepare_syndicate_leader(synd_mind, nuke_code) op.current.forceMove(pick(GLOB.nukeop_leader_start))
leader_selected = 1 prepare_syndicate_leader(op, nuke_code)
else else
synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]" op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1])
agent_number++ op.current.real_name = "[syndicate_name()] Operative #[agent_number++]"
spawnpos++
update_synd_icons_added(synd_mind)
synd_mind.current.playsound_local(get_turf(synd_mind.current), 'sound/ambience/antag/ops.ogg',100,0)
var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
update_synd_icons_added(op)
op.current.playsound_local(get_turf(op.current), 'sound/ambience/antag/ops.ogg',100,0)
var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
if(nuke) if(nuke)
nuke.r_code = nuke_code nuke.r_code = nuke_code
return ..() return ..()
/datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code) /datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code)
var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
spawn(1) spawn(1)
+1 -1
View File
@@ -121,7 +121,7 @@
return target return target
/datum/objective/assassinate/check_completion() /datum/objective/assassinate/check_completion()
return !target || !considered_alive(target) return !considered_alive(target) || considered_afk(target)
/datum/objective/assassinate/update_explanation_text() /datum/objective/assassinate/update_explanation_text()
..() ..()
+3 -9
View File
@@ -154,8 +154,7 @@
var/obj/item/device/assembly/flash/T = new(mob) var/obj/item/device/assembly/flash/T = new(mob)
var/obj/item/toy/crayon/spraycan/R = new(mob) var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new(mob)
var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob)
var/list/slots = list ( var/list/slots = list (
"backpack" = slot_in_backpack, "backpack" = slot_in_backpack,
@@ -163,13 +162,8 @@
"right pocket" = slot_r_store "right pocket" = slot_r_store
) )
var/where = mob.equip_in_one_of_slots(T, slots) var/where = mob.equip_in_one_of_slots(T, slots)
var/where2 = mob.equip_in_one_of_slots(C, slots) S.Insert(mob, special = FALSE, drop_if_replaced = FALSE)
mob.equip_in_one_of_slots(R,slots) to_chat(mob, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.")
if (!where2)
to_chat(mob, "The Syndicate were unfortunately unable to get you a chameleon security HUD.")
else
to_chat(mob, "The chameleon security HUD in your [where2] will help you keep track of who is mindshield-implanted, and unable to be recruited.")
if (!where) if (!where)
to_chat(mob, "The Syndicate were unfortunately unable to get you a flash.") to_chat(mob, "The Syndicate were unfortunately unable to get you a flash.")
@@ -3,7 +3,8 @@
desc = "Used to access the various cameras on the station." desc = "Used to access the various cameras on the station."
icon_screen = "cameras" icon_screen = "cameras"
icon_keyboard = "security_key" icon_keyboard = "security_key"
var/z_lock = null // Lock use to this zlevel var/list/z_lock = list() // Lock use to these z levels
var/station_lock_override = FALSE
var/mob/camera/aiEye/remote/eyeobj var/mob/camera/aiEye/remote/eyeobj
var/mob/living/current_user = null var/mob/living/current_user = null
var/list/networks = list("SS13") var/list/networks = list("SS13")
@@ -13,6 +14,11 @@
light_color = LIGHT_COLOR_RED light_color = LIGHT_COLOR_RED
/obj/machinery/computer/camera_advanced/Initialize()
. = ..()
if(station_lock_override)
z_lock = GLOB.station_z_levels.Copy()
/obj/machinery/computer/camera_advanced/syndie /obj/machinery/computer/camera_advanced/syndie
icon_keyboard = "syndie_key" icon_keyboard = "syndie_key"
@@ -76,7 +82,7 @@
if(!eyeobj.eye_initialized) if(!eyeobj.eye_initialized)
var/camera_location var/camera_location
for(var/obj/machinery/camera/C in GLOB.cameranet.cameras) for(var/obj/machinery/camera/C in GLOB.cameranet.cameras)
if(!C.can_use() || z_lock && C.z != z_lock) if(!C.can_use() || z_lock.len && !(C.z in z_lock))
continue continue
if(C.network & networks) if(C.network & networks)
camera_location = get_turf(C) camera_location = get_turf(C)
@@ -201,7 +207,7 @@
var/list/L = list() var/list/L = list()
for (var/obj/machinery/camera/cam in GLOB.cameranet.cameras) for (var/obj/machinery/camera/cam in GLOB.cameranet.cameras)
if(origin.z_lock && cam.z != origin.z_lock) if(origin.z_lock.len && !(cam.z in origin.z_lock))
continue continue
L.Add(cam) L.Add(cam)
+2
View File
@@ -213,6 +213,8 @@ GLOBAL_LIST_INIT(pipeID2State, list(
return ..() return ..()
if (!isturf(src.loc)) if (!isturf(src.loc))
return 1 return 1
add_fingerprint(user)
fixdir() fixdir()
if(pipe_type in list(PIPE_GAS_MIXER, PIPE_GAS_FILTER)) if(pipe_type in list(PIPE_GAS_MIXER, PIPE_GAS_FILTER))
+17 -18
View File
@@ -157,11 +157,27 @@
/obj/effect/landmark/start/wizard /obj/effect/landmark/start/wizard
name = "wizard" name = "wizard"
/obj/effect/landmark/start/wizard/Initialize(mapload) /obj/effect/landmark/start/wizard/Initialize()
..() ..()
GLOB.wizardstart += loc GLOB.wizardstart += loc
return INITIALIZE_HINT_QDEL return INITIALIZE_HINT_QDEL
/obj/effect/landmark/start/nukeop
name = "nukeop"
/obj/effect/landmark/start/nukeop/Initialize()
..()
GLOB.nukeop_start += loc
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/start/nukeop_leader
name = "nukeop leader"
/obj/effect/landmark/start/nukeop_leader/Initialize()
..()
GLOB.nukeop_leader_start += loc
return INITIALIZE_HINT_QDEL
/obj/effect/landmark/start/new_player /obj/effect/landmark/start/new_player
name = "New Player" name = "New Player"
@@ -205,23 +221,6 @@
/obj/effect/landmark/tripai /obj/effect/landmark/tripai
name = "tripai" name = "tripai"
// marauder entry (XXX WTF IS MAURADER ENTRY???)
/obj/effect/landmark/marauder_entry
name = "Marauder Entry"
// syndicate breach area (XXX I DON'T KNOW WHAT THIS IS EITHER)
/obj/effect/landmark/syndicate_breach_area
name = "Syndicate Breach Area"
// teleport scroll landmark, XXX DOES THIS DO ANYTHING?
/obj/effect/landmark/teleport_scroll
name = "Teleport-Scroll"
/obj/effect/landmark/syndicate_spawn
name = "Syndicate-Spawn"
// xenos. // xenos.
/obj/effect/landmark/xeno_spawn /obj/effect/landmark/xeno_spawn
name = "xeno_spawn" name = "xeno_spawn"
+1 -1
View File
@@ -33,7 +33,7 @@
if(!force_rebuild && range == current_range) if(!force_rebuild && range == current_range)
return FALSE return FALSE
. = TRUE . = TRUE
current_range = range current_range = range
var/list/checkers_local = checkers var/list/checkers_local = checkers
+3
View File
@@ -234,6 +234,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user) /obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M)) if(!istype(M))
return ..() return ..()
if(M.on_fire && !lit)
light("<span class='notice'>[user] lights [src] with [M]'s burning body. What a cold-blooded badass.</span>")
return
var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M) var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
if(lit && cig && user.a_intent == INTENT_HELP) if(lit && cig && user.a_intent == INTENT_HELP)
if(cig.lit) if(cig.lit)
+36 -3
View File
@@ -26,6 +26,14 @@ GLOBAL_LIST_EMPTY(PDAs)
var/obj/item/cartridge/cartridge = null //current cartridge var/obj/item/cartridge/cartridge = null //current cartridge
var/mode = 0 //Controls what menu the PDA will display. 0 is hub; the rest are either built in or based on cartridge. var/mode = 0 //Controls what menu the PDA will display. 0 is hub; the rest are either built in or based on cartridge.
var/icon_alert = "pda-r" //Icon to be overlayed for message alerts. Taken from the pda icon file. var/icon_alert = "pda-r" //Icon to be overlayed for message alerts. Taken from the pda icon file.
var/font_index = 0 //This int tells DM which font is currently selected and lets DM know when the last font has been selected so that it can cycle back to the first font when "toggle font" is pressed again.
var/font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;" //The currently selected font.
var/background_color = "#808000" //The currently selected background color.
#define FONT_VT 0
#define FONT_SHARE 1
#define FONT_ORBITRON 2
#define FONT_MONO 3
//Secondary variables //Secondary variables
var/scanmode = 0 //1 is medical scanner, 2 is forensics, 3 is reagent scanner. var/scanmode = 0 //1 is medical scanner, 2 is forensics, 3 is reagent scanner.
@@ -121,7 +129,8 @@ GLOBAL_LIST_EMPTY(PDAs)
hidden_uplink.interact(user) hidden_uplink.interact(user)
return return
var/dat = "<html><head><title>Personal Data Assistant</title></head><body bgcolor=\"#808000\"><style>a, a:link, a:visited, a:active, a:hover { color: #000000; }img {border-style:none;}</style>" var/dat = "<!DOCTYPE html><html><head><title>Personal Data Assistant</title><link href=\"https://fonts.googleapis.com/css?family=Orbitron|Share+Tech+Mono|VT323\" rel=\"stylesheet\"></head><body bgcolor=\"" + background_color + "\"><style>body{" + font_mode + "}ul,ol{list-style-type: none;}a, a:link, a:visited, a:active, a:hover { color: #000000;text-decoration:none; }img {border-style:none;}</style>"
dat += "<a href='byond://?src=\ref[src];choice=Refresh'><img src=pda_refresh.png> Refresh</a>" dat += "<a href='byond://?src=\ref[src];choice=Refresh'><img src=pda_refresh.png> Refresh</a>"
@@ -130,6 +139,12 @@ GLOBAL_LIST_EMPTY(PDAs)
if (mode) if (mode)
dat += " | <a href='byond://?src=\ref[src];choice=Return'><img src=pda_menu.png> Return</a>" dat += " | <a href='byond://?src=\ref[src];choice=Return'><img src=pda_menu.png> Return</a>"
if (mode == 0)
dat += "<div align=\"center\">"
dat += "<br><a href='byond://?src=\ref[src];choice=Toggle_Font'>Toggle Font</a>"
dat += " | <a href='byond://?src=\ref[src];choice=Change_Color'>Change Color</a>"
dat += "</div>"
dat += "<br>" dat += "<br>"
if (!owner) if (!owner)
@@ -307,6 +322,24 @@ GLOBAL_LIST_EMPTY(PDAs)
//BASIC FUNCTIONS=================================== //BASIC FUNCTIONS===================================
if("Refresh")//Refresh, goes to the end of the proc. if("Refresh")//Refresh, goes to the end of the proc.
if ("Toggle_Font")
//CODE REVISION 2
font_index = (font_index + 1) % 4
switch(font_index)
if (FONT_VT)
font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;"
if (FONT_SHARE)
font_mode = "font-family:\"Share Tech Mono\", monospace;letter-spacing:0px;"
if (FONT_ORBITRON)
font_mode = "font-family:\"Orbitron\", monospace;letter-spacing:0px; font-size:15px"
if (FONT_MONO)
font_mode = "font-family:monospace;"
if ("Change_Color")
var/new_color = input("Please enter a color name or hex value (Default is \'#808000\').")as color
background_color = new_color
if("Return")//Return if("Return")//Return
if(mode<=9) if(mode<=9)
mode = 0 mode = 0
@@ -538,7 +571,7 @@ GLOBAL_LIST_EMPTY(PDAs)
P.show_recieved_message(msg,src) P.show_recieved_message(msg,src)
if(!multiple) if(!multiple)
show_to_ghosts(user,msg) show_to_ghosts(user,msg)
log_talk(user,"[key_name(user)] (PDA: [name]) sent \"[message]\" to [key_name(P,null,TRUE)]",LOGPDA) log_talk(user,"[key_name(user)] (PDA: [initial(name)]) sent \"[message]\" to [key_name(P,null,TRUE)]",LOGPDA)
else else
if(!multiple) if(!multiple)
to_chat(user, "<span class='notice'>ERROR: Server isn't responding.</span>") to_chat(user, "<span class='notice'>ERROR: Server isn't responding.</span>")
@@ -548,7 +581,7 @@ GLOBAL_LIST_EMPTY(PDAs)
if(multiple) if(multiple)
show_to_sender(last_sucessful_msg,1) show_to_sender(last_sucessful_msg,1)
show_to_ghosts(user,last_sucessful_msg,1) show_to_ghosts(user,last_sucessful_msg,1)
log_talk(user,"[user] (PDA: [name]) sent \"[message]\" to Everyone",LOGPDA) log_talk(user,"[user] (PDA: [initial(name)]) sent \"[message]\" to Everyone",LOGPDA)
/obj/item/device/pda/proc/show_to_sender(datum/data_pda_msg/msg,multiple = 0) /obj/item/device/pda/proc/show_to_sender(datum/data_pda_msg/msg,multiple = 0)
tnote += "<i><b>&rarr; To [multiple ? "Everyone" : msg.recipient]:</b></i><br>[msg.message][msg.get_photo_ref()]<br>" tnote += "<i><b>&rarr; To [multiple ? "Everyone" : msg.recipient]:</b></i><br>[msg.message][msg.get_photo_ref()]<br>"
+1 -1
View File
@@ -214,7 +214,7 @@ MASS SPECTROMETER
var/cyberimp_detect var/cyberimp_detect
for(var/obj/item/organ/cyberimp/CI in C.internal_organs) for(var/obj/item/organ/cyberimp/CI in C.internal_organs)
if(CI.status == ORGAN_ROBOTIC) if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant)
cyberimp_detect += "[C.name] is modified with a [CI.name].<br>" cyberimp_detect += "[C.name] is modified with a [CI.name].<br>"
if(cyberimp_detect) if(cyberimp_detect)
to_chat(user, "<span class='notice'>Detected cybernetic modifications:</span>") to_chat(user, "<span class='notice'>Detected cybernetic modifications:</span>")
+9 -2
View File
@@ -38,10 +38,14 @@
/obj/item/toy/eightball/Initialize(mapload) /obj/item/toy/eightball/Initialize(mapload)
. = ..() . = ..()
if(prob(1)) if(MakeHaunted())
new /obj/item/toy/eightball/haunted(get_turf(src))
return INITIALIZE_HINT_QDEL return INITIALIZE_HINT_QDEL
/obj/item/toy/eightball/proc/MakeHaunted()
. = prob(1)
if(.)
new /obj/item/toy/eightball/haunted(loc)
/obj/item/toy/eightball/attack_self(mob/user) /obj/item/toy/eightball/attack_self(mob/user)
if(shaking) if(shaking)
return return
@@ -105,6 +109,9 @@
GLOB.poi_list -= src GLOB.poi_list -= src
. = ..() . = ..()
/obj/item/toy/eightball/haunted/MakeHaunted()
return FALSE
/obj/item/toy/eightball/haunted/attack_ghost(mob/user) /obj/item/toy/eightball/haunted/attack_ghost(mob/user)
if(!shaking) if(!shaking)
to_chat(user, "<span class='warning'>[src] is not currently being shaken.</span>") to_chat(user, "<span class='warning'>[src] is not currently being shaken.</span>")
@@ -390,7 +390,6 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
singular_name = "plastic sheet" singular_name = "plastic sheet"
icon_state = "sheet-plastic" icon_state = "sheet-plastic"
throwforce = 7 throwforce = 7
origin_tech = "materials=1"
origin_tech = "materials=1;biotech=1" origin_tech = "materials=1;biotech=1"
merge_type = /obj/item/stack/sheet/plastic merge_type = /obj/item/stack/sheet/plastic
+13 -15
View File
@@ -28,31 +28,29 @@
/obj/item/storage/secure/examine(mob/user) /obj/item/storage/secure/examine(mob/user)
..() ..()
to_chat(user, text("The service panel is [src.open ? "open" : "closed"].")) to_chat(user, text("The service panel is currently <b>[open ? "unscrewed" : "screwed shut"]</b>."))
/obj/item/storage/secure/attackby(obj/item/W, mob/user, params) /obj/item/storage/secure/attackby(obj/item/W, mob/user, params)
if(locked) if(locked)
if (istype(W, /obj/item/screwdriver)) if (istype(W, /obj/item/screwdriver))
if (do_after(user, 20*W.toolspeed, target = src)) if (do_after(user, 20*W.toolspeed, target = user))
src.open =! src.open open =! open
user.show_message("<span class='notice'>You [open ? "open" : "close"] the service panel.</span>", 1) to_chat(user, "<span class='notice'>You [open ? "open" : "close"] the service panel.</span>")
return return
if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) if (istype(W, /obj/item/wirecutters) || istype(W, /obj/item/card/emag))
user.show_message("<span class='danger'>Now attempting to reset internal memory, please hold.</span>", 1) to_chat(user, "<span class='danger'>[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be <b>pulsed</b>.</span>")
src.l_hacking = 1 if ((istype(W, /obj/item/device/multitool)) && (!l_hacking))
if (do_after(usr, 100*W.toolspeed, target = src)) if(src.open == 1)
if (prob(33)) to_chat(user, "<span class='danger'>Now attempting to reset internal memory, please hold.</span>")
src.l_setshort = 1 src.l_hacking = 1
if (do_after(usr, 400*W.toolspeed, target = user))
to_chat(user, "<span class='danger'>Internal memory reset - lock has been disengaged.</span>")
src.l_set = 0 src.l_set = 0
user.show_message("<span class='danger'>Internal memory reset. Please give it a few seconds to reinitialize.</span>", 1)
sleep(80)
src.l_setshort = 0
src.l_hacking = 0 src.l_hacking = 0
else else
user.show_message("<span class='danger'>Unable to reset internal memory.</span>", 1)
src.l_hacking = 0 src.l_hacking = 0
else else
src.l_hacking = 0 to_chat(user, "<span class='notice'>You must <b>unscrew</b> the service panel before you can pulse the wiring.</span>")
return return
//At this point you have exhausted all the special things to do when locked //At this point you have exhausted all the special things to do when locked
// ... but it's still locked. // ... but it's still locked.
+1 -1
View File
@@ -177,7 +177,7 @@
if("pressure") if("pressure")
var/pressure = params["pressure"] var/pressure = params["pressure"]
if(pressure == "reset") if(pressure == "reset")
pressure = TANK_DEFAULT_RELEASE_PRESSURE pressure = initial(distribute_pressure)
. = TRUE . = TRUE
else if(pressure == "min") else if(pressure == "min")
pressure = TANK_MIN_RELEASE_PRESSURE pressure = TANK_MIN_RELEASE_PRESSURE
+13
View File
@@ -138,3 +138,16 @@
desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern." desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern."
icon = 'icons/turf/walls/hierophant_wall.dmi' icon = 'icons/turf/walls/hierophant_wall.dmi'
icon_state = "wall" icon_state = "wall"
/turf/closed/bullet_act(obj/item/projectile/Proj)
..()
if(!Proj.nodamage && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
var/mutable_appearance/bullet_hole = mutable_appearance('icons/effects/effects.dmi', "bullet_hole", BULLET_HOLE_LAYER)
var/random_x = rand(-13, 13)
bullet_hole.pixel_x += random_x
var/random_y = rand(-13, 13)
bullet_hole.pixel_y += random_y
add_overlay(bullet_hole, TRUE)
+1 -1
View File
@@ -444,7 +444,7 @@
/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, forceop = FALSE) /turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, forceop = FALSE)
// Remove all atoms except observers, landmarks, docking ports // Remove all atoms except observers, landmarks, docking ports
var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object)) var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object))
var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(ignore_typecache), ignored_atoms) var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(), ignored_atoms | ignore_typecache)
allowed_contents -= src allowed_contents -= src
for(var/i in 1 to allowed_contents.len) for(var/i in 1 to allowed_contents.len)
var/thing = allowed_contents[i] var/thing = allowed_contents[i]
-2
View File
@@ -214,8 +214,6 @@ GLOBAL_PROTECT(admin_ranks)
var/datum/admins/D = new(rank_names[rank], ckey) //create the admin datum and store it for later use var/datum/admins/D = new(rank_names[rank], ckey) //create the admin datum and store it for later use
if(!D) if(!D)
continue //will occur if an invalid rank is provided continue //will occur if an invalid rank is provided
if(D.rank.rights & R_DEBUG) //grant profile access
world.SetConfig("APP/admin", ckey, "role=admin")
D.associate(GLOB.directory[ckey]) //find the client for a ckey if they are connected and associate them with the new admin datum D.associate(GLOB.directory[ckey]) //find the client for a ckey if they are connected and associate them with the new admin datum
else else
if(!SSdbcore.Connect()) if(!SSdbcore.Connect())
+2
View File
@@ -34,6 +34,8 @@ GLOBAL_PROTECT(href_token)
admin_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]" admin_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]"
href_token = GenerateToken() href_token = GenerateToken()
GLOB.admin_datums[ckey] = src GLOB.admin_datums[ckey] = src
if(R.rights & R_DEBUG) //grant profile access
world.SetConfig("APP/admin", ckey, "role=admin")
/proc/GenerateToken() /proc/GenerateToken()
. = "" . = ""
+6 -5
View File
@@ -30,6 +30,7 @@
//Processing //Processing
var/process_inner_turfs = FALSE //Don't do this unless it's absolutely necessary var/process_inner_turfs = FALSE //Don't do this unless it's absolutely necessary
var/process_edge_turfs = FALSE //Don't do this either unless it's absolutely necessary, you can just track what things are inside manually or on the initial setup. var/process_edge_turfs = FALSE //Don't do this either unless it's absolutely necessary, you can just track what things are inside manually or on the initial setup.
var/requires_processing = FALSE
var/setup_edge_turfs = FALSE //Setup edge turfs/all field turfs. Set either or both to ON when you need it, it's defaulting to off unless you do to save CPU. var/setup_edge_turfs = FALSE //Setup edge turfs/all field turfs. Set either or both to ON when you need it, it's defaulting to off unless you do to save CPU.
var/setup_field_turfs = FALSE var/setup_field_turfs = FALSE
var/use_host_turf = FALSE //For fields from items carried on mobs to check turf instead of loc... var/use_host_turf = FALSE //For fields from items carried on mobs to check turf instead of loc...
@@ -41,6 +42,7 @@
/datum/proximity_monitor/advanced/Destroy() /datum/proximity_monitor/advanced/Destroy()
full_cleanup() full_cleanup()
STOP_PROCESSING(SSfields, src)
return ..() return ..()
/datum/proximity_monitor/advanced/proc/assume_params(list/field_params) /datum/proximity_monitor/advanced/proc/assume_params(list/field_params)
@@ -76,6 +78,10 @@
/datum/proximity_monitor/advanced/proc/process_edge_turf(turf/T) /datum/proximity_monitor/advanced/proc/process_edge_turf(turf/T)
/datum/proximity_monitor/advanced/New()
if(requires_processing)
START_PROCESSING(SSfields, src)
/datum/proximity_monitor/advanced/proc/Initialize() /datum/proximity_monitor/advanced/proc/Initialize()
setup_field() setup_field()
post_setup_field() post_setup_field()
@@ -250,11 +256,6 @@
setup_field_turfs = TRUE setup_field_turfs = TRUE
setup_edge_turfs = TRUE setup_edge_turfs = TRUE
/datum/proximity_monitor/advanced/debug/recalculate_field()
..()
/datum/proximity_monitor/advanced/debug/post_setup_field()
..()
/datum/proximity_monitor/advanced/debug/setup_edge_turf(turf/T) /datum/proximity_monitor/advanced/debug/setup_edge_turf(turf/T)
T.color = set_edgeturf_color T.color = set_edgeturf_color
+1 -2
View File
@@ -5,6 +5,7 @@
name = "\improper Hyperkinetic Dampener Field" name = "\improper Hyperkinetic Dampener Field"
setup_edge_turfs = TRUE setup_edge_turfs = TRUE
setup_field_turfs = TRUE setup_field_turfs = TRUE
requires_processing = TRUE
field_shape = FIELD_SHAPE_RADIUS_SQUARE field_shape = FIELD_SHAPE_RADIUS_SQUARE
var/static/image/edgeturf_south = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_south") var/static/image/edgeturf_south = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_south")
var/static/image/edgeturf_north = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_north") var/static/image/edgeturf_north = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_north")
@@ -21,13 +22,11 @@
use_host_turf = TRUE use_host_turf = TRUE
/datum/proximity_monitor/advanced/peaceborg_dampener/New() /datum/proximity_monitor/advanced/peaceborg_dampener/New()
START_PROCESSING(SSfields, src)
tracked = list() tracked = list()
staging = list() staging = list()
..() ..()
/datum/proximity_monitor/advanced/peaceborg_dampener/Destroy() /datum/proximity_monitor/advanced/peaceborg_dampener/Destroy()
STOP_PROCESSING(SSfields, src)
return ..() return ..()
/datum/proximity_monitor/advanced/peaceborg_dampener/process() /datum/proximity_monitor/advanced/peaceborg_dampener/process()
+131
View File
@@ -0,0 +1,131 @@
/obj/effect/timestop
anchored = TRUE
name = "chronofield"
desc = "ZA WARUDO"
icon = 'icons/effects/160x160.dmi'
icon_state = "time"
layer = FLY_LAYER
pixel_x = -64
pixel_y = -64
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/list/immune = list() // the one who creates the timestop is immune
var/turf/target
var/freezerange = 2
var/duration = 140
var/datum/proximity_monitor/advanced/timestop/chronofield
alpha = 125
/obj/effect/timestop/Initialize(mapload, radius, time, list/immune_atoms, start = TRUE) //Immune atoms assoc list atom = TRUE
. = ..()
if(immune_atoms)
immune = immune_atoms.Copy()
if(!isnull(time))
duration = time
if(!isnull(radius))
freezerange = radius
for(var/mob/living/L in GLOB.player_list)
if(locate(/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop) in L.mind.spell_list) //People who can stop time are immune to its effects
immune[L] = TRUE
if(start)
timestop()
/obj/effect/timestop/Destroy()
qdel(chronofield)
playsound(src, 'sound/magic/timeparadox2.ogg', 75, TRUE, frequency = -1) //reverse!
return ..()
/obj/effect/timestop/proc/timestop()
target = get_turf(src)
playsound(src, 'sound/magic/timeparadox2.ogg', 75, 1, -1)
chronofield = make_field(/datum/proximity_monitor/advanced/timestop, list("current_range" = freezerange, "host" = src, "immune" = immune))
QDEL_IN(src, duration)
/obj/effect/timestop/wizard
duration = 100
/datum/proximity_monitor/advanced/timestop
name = "chronofield"
setup_field_turfs = TRUE
field_shape = FIELD_SHAPE_RADIUS_SQUARE
requires_processing = TRUE
var/list/immune = list()
var/list/mob/living/frozen_mobs = list()
var/list/obj/item/projectile/frozen_projectiles = list()
var/list/atom/movable/frozen_throws = list()
/datum/proximity_monitor/advanced/timestop/Destroy()
unfreeze_all()
return ..()
/datum/proximity_monitor/advanced/timestop/field_turf_crossed(atom/movable/AM)
freeze_atom(AM)
/datum/proximity_monitor/advanced/timestop/proc/freeze_atom(atom/movable/A)
if(immune[A] || !istype(A))
return FALSE
if(A.throwing)
freeze_throwing(A)
if(isliving(A))
freeze_mob(A)
else if(istype(A, /obj/item/projectile))
freeze_projectile(A)
else
return FALSE
return TRUE
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_all()
for(var/i in frozen_projectiles)
unfreeze_projectile(i)
for(var/i in frozen_mobs)
unfreeze_mob(i)
for(var/i in frozen_throws)
unfreeze_throw(i)
/datum/proximity_monitor/advanced/timestop/proc/freeze_throwing(atom/movable/AM)
var/datum/thrownthing/T = AM.throwing
T.paused = TRUE
frozen_throws[AM] = T
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_throw(atom/movable/AM)
var/datum/thrownthing/T = frozen_throws[AM]
T.paused = FALSE
frozen_throws -= AM
/datum/proximity_monitor/advanced/timestop/process()
for(var/i in frozen_mobs)
var/mob/living/m = i
if(get_dist(get_turf(m), get_turf(host)) > current_range)
unfreeze_mob(m)
else
m.Stun(20, 1, 1)
/datum/proximity_monitor/advanced/timestop/setup_field_turf(turf/T)
for(var/i in T.contents)
freeze_atom(i)
return ..()
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_projectile(obj/item/projectile/P)
frozen_projectiles -= P
P.paused = FALSE
/datum/proximity_monitor/advanced/timestop/proc/freeze_projectile(obj/item/projectile/P)
frozen_projectiles[P] = TRUE
P.paused = TRUE
/datum/proximity_monitor/advanced/timestop/proc/freeze_mob(mob/living/L)
L.Stun(20, 1, 1)
frozen_mobs[L] = L.anchored
L.anchored = TRUE
if(ishostile(L))
var/mob/living/simple_animal/hostile/H = L
H.AIStatus = AI_OFF
H.LoseTarget()
/datum/proximity_monitor/advanced/timestop/proc/unfreeze_mob(mob/living/L)
L.AdjustStun(-20, 1, 1)
L.anchored = frozen_mobs[L]
frozen_mobs -= L
if(ishostile(L))
var/mob/living/simple_animal/hostile/H = L
H.AIStatus = initial(H.AIStatus)
@@ -185,6 +185,37 @@
icon_state = "" icon_state = ""
bitesize = 2 bitesize = 2
/obj/item/reagent_containers/food/snacks/deepfryholder/proc/fry(obj/item/frying, datum/reagents/reagents, cook_time = 30)
if(istype(frying, /obj/item/reagent_containers/))
var/obj/item/reagent_containers/food = frying
food.reagents.trans_to(src, food.reagents.total_volume)
icon = frying.icon
overlays = frying.overlays
icon_state = frying.icon_state
desc = frying.desc
w_class = frying.w_class
reagents.trans_to(src, 2*(cook_time/15))
switch(cook_time)
if(0 to 15)
add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY)
name = "lightly-fried [frying.name]"
if(16 to 49)
add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY)
name = "fried [frying.name]"
if(50 to 59)
add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY)
name = "deep-fried [frying.name]"
if(60 to INFINITY)
add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY)
name = "the physical manifestation of the very concept of fried foods"
desc = "A heavily fried...something. Who can tell anymore?"
filling_color = color
foodtype |= FRIED
if(istype(frying, /obj/item/reagent_containers/food/snacks/))
qdel(frying)
else
frying.forceMove(src)
/obj/item/reagent_containers/food/snacks/butteredtoast /obj/item/reagent_containers/food/snacks/butteredtoast
name = "buttered toast" name = "buttered toast"
desc = "Butter lightly spread over a piece of toast." desc = "Butter lightly spread over a piece of toast."
@@ -82,36 +82,7 @@ insert ascii eagle on american flag background here
if(frying.loc == src) if(frying.loc == src)
to_chat(user, "<span class='notice'>You eject [frying] from [src].</span>") to_chat(user, "<span class='notice'>You eject [frying] from [src].</span>")
var/obj/item/reagent_containers/food/snacks/deepfryholder/S = new(get_turf(src)) var/obj/item/reagent_containers/food/snacks/deepfryholder/S = new(get_turf(src))
if(istype(frying, /obj/item/reagent_containers/)) S.fry(frying, reagents, cook_time)
var/obj/item/reagent_containers/food = frying
food.reagents.trans_to(S, food.reagents.total_volume)
S.icon = frying.icon
S.overlays = frying.overlays
S.icon_state = frying.icon_state
S.desc = frying.desc
S.w_class = frying.w_class
reagents.trans_to(S, 2*(cook_time/15))
switch(cook_time)
if(0 to 15)
S.add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY)
S.name = "lightly-fried [frying.name]"
if(16 to 49)
S.add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY)
S.name = "fried [frying.name]"
if(50 to 59)
S.add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY)
S.name = "deep-fried [frying.name]"
if(60 to INFINITY)
S.add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY)
S.name = "the physical manifestation of the very concept of fried foods"
S.desc = "A heavily fried...something. Who can tell anymore?"
S.filling_color = S.color
S.foodtype |= FRIED
if(istype(frying, /obj/item/reagent_containers/food/snacks/))
qdel(frying)
else
frying.forceMove(S)
icon_state = "fryer_off" icon_state = "fryer_off"
user.put_in_hands(S) user.put_in_hands(S)
frying = null frying = null
+15 -1
View File
@@ -8,6 +8,7 @@
density = TRUE density = TRUE
anchored = TRUE anchored = TRUE
circuit = /obj/item/circuitboard/machine/mining_equipment_vendor circuit = /obj/item/circuitboard/machine/mining_equipment_vendor
var/icon_deny = "mining-deny"
var/obj/item/card/id/inserted_id var/obj/item/card/id/inserted_id
var/list/prize_list = list( //if you add something to this, please, for the love of god, use tabs and not spaces. var/list/prize_list = list( //if you add something to this, please, for the love of god, use tabs and not spaces.
new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
@@ -108,6 +109,7 @@
if(href_list["choice"]) if(href_list["choice"])
if(istype(inserted_id)) if(istype(inserted_id))
if(href_list["choice"] == "eject") if(href_list["choice"] == "eject")
to_chat(usr, "<span class='notice'>You eject the ID from [src]'s card slot.</span>")
inserted_id.loc = loc inserted_id.loc = loc
inserted_id.verb_pickup() inserted_id.verb_pickup()
inserted_id = null inserted_id = null
@@ -118,20 +120,31 @@
return return
I.loc = src I.loc = src
inserted_id = I inserted_id = I
else to_chat(usr, "<span class='danger'>No valid ID.</span>") to_chat(usr, "<span class='notice'>You insert the ID into [src]'s card slot.</span>")
else
to_chat(usr, "<span class='warning'>Error: No valid ID!</span>")
flick(icon_deny, src)
if(href_list["purchase"]) if(href_list["purchase"])
if(istype(inserted_id)) if(istype(inserted_id))
var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
if (!prize || !(prize in prize_list)) if (!prize || !(prize in prize_list))
to_chat(usr, "<span class='warning'>Error: Invalid choice!</span>")
flick(icon_deny, src)
return return
if(prize.cost > inserted_id.mining_points) if(prize.cost > inserted_id.mining_points)
to_chat(usr, "<span class='warning'>Error: Insufficent points for [prize.equipment_name]!</span>")
flick(icon_deny, src)
else else
inserted_id.mining_points -= prize.cost inserted_id.mining_points -= prize.cost
to_chat(usr, "<span class='notice'>[src] clanks to life briefly before vending [prize.equipment_name]!</span>")
new prize.equipment_path(src.loc) new prize.equipment_path(src.loc)
SSblackbox.add_details("mining_equipment_bought", SSblackbox.add_details("mining_equipment_bought",
"[src.type]|[prize.equipment_path]") "[src.type]|[prize.equipment_path]")
// Add src.type to keep track of free golem purchases // Add src.type to keep track of free golem purchases
// separately. // separately.
else
to_chat(usr, "<span class='warning'>Error: Please insert a valid ID!</span>")
flick(icon_deny, src)
updateUsrDialog() updateUsrDialog()
return return
@@ -146,6 +159,7 @@
return return
C.loc = src C.loc = src
inserted_id = C inserted_id = C
to_chat(usr, "<span class='notice'>You insert the ID into [src]'s card slot.</span>")
interact(user) interact(user)
return return
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
+3 -3
View File
@@ -32,10 +32,10 @@
new_player_panel() new_player_panel()
client.playtitlemusic() client.playtitlemusic()
if(SSticker.current_state < GAME_STATE_SETTING_UP) if(SSticker.current_state < GAME_STATE_SETTING_UP)
var/tl = round(SSticker.GetTimeLeft(), 1)/10 var/tl = SSticker.GetTimeLeft()
var/postfix var/postfix
if(tl >= 0) if(tl > 0)
postfix = "in about [tl] seconds" postfix = "in about [DisplayTimeText(tl)]"
else else
postfix = "soon" postfix = "soon"
to_chat(src, "Please set up your character and select \"Ready\". The game will start [postfix].") to_chat(src, "Please set up your character and select \"Ready\". The game will start [postfix].")
@@ -67,30 +67,317 @@
/datum/sprite_accessory/hair /datum/sprite_accessory/hair
icon = 'icons/mob/human_face.dmi' // default icon for all hairs icon = 'icons/mob/human_face.dmi' // default icon for all hairs
/datum/sprite_accessory/hair/short //Place in order by major style E.G "Afro, Bun, Ponytail"
name = "Short Hair" // try to capatilize the names please~ // try to spell //Place different versions under the same style E.G "Bun > Large Bun, Ponytail > Long Ponytail"
icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you //A
/datum/sprite_accessory/hair/shorthair2 /datum/sprite_accessory/hair/afro
name = "Short Hair 2" name = "Afro" // try to capatilize the names please~ // try to spell
icon_state = "hair_shorthair2" icon_state = "hair_afro" // you do not need to define _s or _l sub-states, game automatically does this for you
/datum/sprite_accessory/hair/shorthair3 /datum/sprite_accessory/hair/afro2
name = "Short Hair 3" name = "Afro 2"
icon_state = "hair_shorthair3" icon_state = "hair_afro2"
/datum/sprite_accessory/hair/afro_large
name = "Big Afro"
icon_state = "hair_bigafro"
/datum/sprite_accessory/hair/antenna
name = "Ahoge"
icon_state = "hair_antenna"
//B
/datum/sprite_accessory/hair/bald
name = "Bald"
icon_state = null
/datum/sprite_accessory/hair/balding
name = "Balding Hair"
icon_state = "hair_e"
/datum/sprite_accessory/hair/longbangs
name = "Long Bangs"
icon_state = "hair_lbangs"
/datum/sprite_accessory/hair/bedhead
name = "Bedhead"
icon_state = "hair_bedhead"
/datum/sprite_accessory/hair/bedhead2
name = "Bedhead 2"
icon_state = "hair_bedheadv2"
/datum/sprite_accessory/hair/bedhead3
name = "Bedhead 3"
icon_state = "hair_bedheadv3"
/datum/sprite_accessory/hair/beehive
name = "Beehive"
icon_state = "hair_beehive"
/datum/sprite_accessory/hair/beehive2
name = "Beehive 2"
icon_state = "hair_beehivev2"
/datum/sprite_accessory/hair/bob
name = "Bob"
icon_state = "hair_bobcut"
/datum/sprite_accessory/hair/bobcurl
name = "Bobcurl"
icon_state = "hair_bobcurl"
/datum/sprite_accessory/hair/bob
name = "Bob Hair"
icon_state = "hair_bob"
/datum/sprite_accessory/hair/bob2
name = "Bob Hair 2"
icon_state = "hair_bob2"
/datum/sprite_accessory/hair/boddicker
name = "Boddicker"
icon_state = "hair_boddicker"
/datum/sprite_accessory/hair/bowl
name = "Bowl"
icon_state = "hair_bowlcut"
/datum/sprite_accessory/hair/braided
name = "Braided"
icon_state = "hair_braided"
/datum/sprite_accessory/hair/front_braid
name = "Braided front"
icon_state = "hair_braidfront"
/datum/sprite_accessory/hair/braidtail
name = "Braided Tail"
icon_state = "hair_braidtail"
/datum/sprite_accessory/hair/lowbraid
name = "Low Braid"
icon_state = "hair_hbraid"
/datum/sprite_accessory/hair/not_floorlength_braid
name = "High Braid"
icon_state = "hair_braid2"
/datum/sprite_accessory/hair/shortbraid
name = "Short Braid"
icon_state = "hair_shortbraid"
/datum/sprite_accessory/hair/braid
name = "Floorlength Braid"
icon_state = "hair_braid"
/datum/sprite_accessory/hair/business
name = "Business Hair"
icon_state = "hair_business"
/datum/sprite_accessory/hair/business2
name = "Business Hair 2"
icon_state = "hair_business2"
/datum/sprite_accessory/hair/business3
name = "Business Hair 3"
icon_state = "hair_business3"
/datum/sprite_accessory/hair/business4
name = "Business Hair 4"
icon_state = "hair_business4"
/datum/sprite_accessory/hair/bun
name = "Bun Head"
icon_state = "hair_bun"
/datum/sprite_accessory/hair/bun2
name = "Bun Head 2"
icon_state = "hair_bunhead2"
/datum/sprite_accessory/hair/largebun
name = "Large Bun"
icon_state = "hair_largebun"
/datum/sprite_accessory/hair/buzz
name = "Buzzcut"
icon_state = "hair_buzzcut"
//C
/datum/sprite_accessory/hair/crew
name = "Crewcut"
icon_state = "hair_crewcut"
/datum/sprite_accessory/hair/combover
name = "Combover"
icon_state = "hair_combover"
/datum/sprite_accessory/hair/curls
name = "Curls"
icon_state = "hair_curls"
//D
/datum/sprite_accessory/hair/devillock
name = "Devil Lock"
icon_state = "hair_devilock"
/datum/sprite_accessory/hair/dreadlocks
name = "Dreadlocks"
icon_state = "hair_dreads"
/datum/sprite_accessory/hair/drillhair
name = "Drill Hair"
icon_state = "hair_drillhair"
//E
/datum/sprite_accessory/hair/emo
name = "Emo"
icon_state = "hair_emo"
/datum/sprite_accessory/hair/longemo
name = "Long Emo"
icon_state = "hair_longemo"
//F
/datum/sprite_accessory/hair/feather
name = "Feather"
icon_state = "hair_feather"
/datum/sprite_accessory/hair/sargeant
name = "Flat Top"
icon_state = "hair_sargeant"
/datum/sprite_accessory/hair/bigflattop
name = "Big Flat Top"
icon_state = "hair_bigflattop"
/datum/sprite_accessory/hair/fag
name = "Flow Hair"
icon_state = "hair_f"
/datum/sprite_accessory/hair/longfringe
name = "Long Fringe"
icon_state = "hair_longfringe"
/datum/sprite_accessory/hair/longestalt
name = "Longer Fringe"
icon_state = "hair_vlongfringe"
//G
/datum/sprite_accessory/hair/gelled
name = "Gelled Back"
icon_state = "hair_gelled"
/datum/sprite_accessory/hair/gentle
name = "Gentle"
icon_state = "hair_gentle"
//H
/datum/sprite_accessory/hair/cut /datum/sprite_accessory/hair/cut
name = "Cut Hair" name = "Cut Hair"
icon_state = "hair_c" icon_state = "hair_c"
/datum/sprite_accessory/hair/long /datum/sprite_accessory/hair/halfbang
name = "Shoulder-length Hair" name = "Half-banged Hair"
icon_state = "hair_b" icon_state = "hair_halfbang"
/datum/sprite_accessory/hair/halfbang2
name = "Half-banged Hair 2"
icon_state = "hair_halfbang2"
/datum/sprite_accessory/hair/hedgehog
name = "Hedgehog Hair"
icon_state = "hair_hedgehog"
/datum/sprite_accessory/hair/hitop
name = "Hitop"
icon_state = "hair_hitop"
/datum/sprite_accessory/hair/himecut
name = "Hime Cut"
icon_state = "hair_himecut"
/datum/sprite_accessory/hair/himecut2
name = "Hime Cut 2"
icon_state = "hair_himecut2"
/datum/sprite_accessory/hair/himeup
name = "Hime Updo"
icon_state = "hair_himeup"
//I
//J
/datum/sprite_accessory/hair/jensen
name = "Jensen Hair"
icon_state = "hair_jensen"
//K
/datum/sprite_accessory/hair/keanu
name = "Keanu Hair"
icon_state = "hair_keanu"
/datum/sprite_accessory/hair/kusangi
name = "Kusanagi Hair"
icon_state = "hair_kusanagi"
//L
/datum/sprite_accessory/hair/longer /datum/sprite_accessory/hair/longer
name = "Long Hair" name = "Long Hair"
icon_state = "hair_vlong" icon_state = "hair_vlong"
/datum/sprite_accessory/hair/long
name = "Long Hair 1"
icon_state = "hair_long"
/datum/sprite_accessory/hair/long2
name = "Long Hair 2"
icon_state = "hair_long2"
/datum/sprite_accessory/hair/longest
name = "Very Long Hair"
icon_state = "hair_longest"
//M
/datum/sprite_accessory/hair/megaeyebrows
name = "Mega Eyebrows"
icon_state = "hair_megaeyebrows"
/datum/sprite_accessory/hair/messy
name = "Messy"
icon_state = "hair_messy"
/datum/sprite_accessory/hair/mohawk
name = "Mohawk"
icon_state = "hair_d"
/datum/sprite_accessory/hair/reversemohawk
name = "Reverse Mohawk"
icon_state = "hair_reversemohawk"
//N
//O
/datum/sprite_accessory/hair/odango
name = "Odango"
icon_state = "hair_odango"
/datum/sprite_accessory/hair/ombre
name = "Ombre"
icon_state = "hair_ombre"
/datum/sprite_accessory/hair/over_eye /datum/sprite_accessory/hair/over_eye
name = "Over Eye" name = "Over Eye"
icon_state = "hair_shortovereye" icon_state = "hair_shortovereye"
@@ -103,29 +390,39 @@
name = "Very Long Over Eye" name = "Very Long Over Eye"
icon_state = "hair_longest2" icon_state = "hair_longest2"
/datum/sprite_accessory/hair/longest //P
name = "Very Long Hair"
icon_state = "hair_longest"
/datum/sprite_accessory/hair/longfringe /datum/sprite_accessory/hair/parted
name = "Long Fringe" name = "Parted"
icon_state = "hair_longfringe" icon_state = "hair_parted"
/datum/sprite_accessory/hair/longestalt /datum/sprite_accessory/hair/sidepartlongalt
name = "Longer Fringe" name = "Long Side Part"
icon_state = "hair_vlongfringe" icon_state = "hair_longsidepart"
/datum/sprite_accessory/hair/gentle /datum/sprite_accessory/hair/kagami
name = "Gentle" name = "Pigtails"
icon_state = "hair_gentle" icon_state = "hair_kagami"
/datum/sprite_accessory/hair/halfbang /datum/sprite_accessory/hair/pigtail
name = "Half-banged Hair" name = "Pigtails 2"
icon_state = "hair_halfbang" icon_state = "hair_pigtails"
/datum/sprite_accessory/hair/halfbang2 /datum/sprite_accessory/hair/pigtail
name = "Half-banged Hair 2" name = "Pigtails 3"
icon_state = "hair_halfbang2" icon_state = "hair_pigtails2"
/datum/sprite_accessory/hair/pixie
name = "Pixie Cut"
icon_state = "hair_pixie"
/datum/sprite_accessory/hair/pompadour
name = "Pompadour"
icon_state = "hair_pompadour"
/datum/sprite_accessory/hair/bigpompadour
name = "Big Pompadour"
icon_state = "hair_bigpompadour"
/datum/sprite_accessory/hair/ponytail1 /datum/sprite_accessory/hair/ponytail1
name = "Ponytail" name = "Ponytail"
@@ -147,6 +444,36 @@
name = "Ponytail 5" name = "Ponytail 5"
icon_state = "hair_ponytail5" icon_state = "hair_ponytail5"
/datum/sprite_accessory/hair/highponytail
name = "High Ponytail"
icon_state = "hair_highponytail"
/datum/sprite_accessory/hair/longponytail
name = "Long Ponytail"
icon_state = "hair_longstraightponytail"
//Q
/datum/sprite_accessory/hair/quiff
name = "Quiff"
icon_state = "hair_quiff"
//R
//S
/datum/sprite_accessory/hair/oneshoulder
name = "One Shoulder"
icon_state = "hair_oneshoulder"
/datum/sprite_accessory/hair/tressshoulder
name = "Tress Shoulder"
icon_state = "hair_tressshoulder"
/datum/sprite_accessory/hair/sidecut
name = "Sidecut"
icon_state = "hair_sidecut"
/datum/sprite_accessory/hair/sidetail /datum/sprite_accessory/hair/sidetail
name = "Side Pony" name = "Side Pony"
@@ -164,141 +491,33 @@
name = "Side Pony 4" name = "Side Pony 4"
icon_state = "hair_sidetail4" icon_state = "hair_sidetail4"
/datum/sprite_accessory/hair/oneshoulder /datum/sprite_accessory/hair/short
name = "One Shoulder" name = "Short Hair"
icon_state = "hair_oneshoulder" icon_state = "hair_a"
/datum/sprite_accessory/hair/tressshoulder /datum/sprite_accessory/hair/shorthair2
name = "Tress Shoulder" name = "Short Hair 2"
icon_state = "hair_tressshoulder" icon_state = "hair_shorthair2"
/datum/sprite_accessory/hair/shorthair3
name = "Short Hair 3"
icon_state = "hair_shorthair3"
/datum/sprite_accessory/hair/long
name = "Shoulder-length Hair"
icon_state = "hair_b"
/datum/sprite_accessory/hair/parted /datum/sprite_accessory/hair/parted
name = "Parted" name = "Side Part"
icon_state = "hair_parted" icon_state = "hair_part"
/datum/sprite_accessory/hair/pompadour /datum/sprite_accessory/hair/skinhead
name = "Pompadour" name = "Skinhead"
icon_state = "hair_pompadour" icon_state = "hair_skinhead"
/datum/sprite_accessory/hair/bigpompadour /datum/sprite_accessory/hair/protagonist
name = "Big Pompadour" name = "Slightly Long"
icon_state = "hair_bigpompadour" icon_state = "hair_protagonist"
/datum/sprite_accessory/hair/quiff
name = "Quiff"
icon_state = "hair_quiff"
/datum/sprite_accessory/hair/bedhead
name = "Bedhead"
icon_state = "hair_bedhead"
/datum/sprite_accessory/hair/bedhead2
name = "Bedhead 2"
icon_state = "hair_bedheadv2"
/datum/sprite_accessory/hair/bedhead3
name = "Bedhead 3"
icon_state = "hair_bedheadv3"
/datum/sprite_accessory/hair/messy
name = "Messy"
icon_state = "hair_messy"
/datum/sprite_accessory/hair/beehive
name = "Beehive"
icon_state = "hair_beehive"
/datum/sprite_accessory/hair/beehive2
name = "Beehive 2"
icon_state = "hair_beehivev2"
/datum/sprite_accessory/hair/bobcurl
name = "Bobcurl"
icon_state = "hair_bobcurl"
/datum/sprite_accessory/hair/bob
name = "Bob"
icon_state = "hair_bobcut"
/datum/sprite_accessory/hair/bowl
name = "Bowl"
icon_state = "hair_bowlcut"
/datum/sprite_accessory/hair/buzz
name = "Buzzcut"
icon_state = "hair_buzzcut"
/datum/sprite_accessory/hair/crew
name = "Crewcut"
icon_state = "hair_crewcut"
/datum/sprite_accessory/hair/combover
name = "Combover"
icon_state = "hair_combover"
/datum/sprite_accessory/hair/devillock
name = "Devil Lock"
icon_state = "hair_devilock"
/datum/sprite_accessory/hair/dreadlocks
name = "Dreadlocks"
icon_state = "hair_dreads"
/datum/sprite_accessory/hair/curls
name = "Curls"
icon_state = "hair_curls"
/datum/sprite_accessory/hair/afro
name = "Afro"
icon_state = "hair_afro"
/datum/sprite_accessory/hair/afro2
name = "Afro 2"
icon_state = "hair_afro2"
/datum/sprite_accessory/hair/afro_large
name = "Big Afro"
icon_state = "hair_bigafro"
/datum/sprite_accessory/hair/sargeant
name = "Flat Top"
icon_state = "hair_sargeant"
/datum/sprite_accessory/hair/emo
name = "Emo"
icon_state = "hair_emo"
/datum/sprite_accessory/hair/longemo
name = "Long Emo"
icon_state = "hair_longemo"
/datum/sprite_accessory/hair/fag
name = "Flow Hair"
icon_state = "hair_f"
/datum/sprite_accessory/hair/feather
name = "Feather"
icon_state = "hair_feather"
/datum/sprite_accessory/hair/hitop
name = "Hitop"
icon_state = "hair_hitop"
/datum/sprite_accessory/hair/mohawk
name = "Mohawk"
icon_state = "hair_d"
/datum/sprite_accessory/hair/reversemohawk
name = "Reverse Mohawk"
icon_state = "hair_reversemohawk"
/datum/sprite_accessory/hair/jensen
name = "Jensen Hair"
icon_state = "hair_jensen"
/datum/sprite_accessory/hair/gelled
name = "Gelled Back"
icon_state = "hair_gelled"
/datum/sprite_accessory/hair/spiky /datum/sprite_accessory/hair/spiky
name = "Spiky" name = "Spiky"
@@ -312,122 +531,6 @@
name = "Spiky 3" name = "Spiky 3"
icon_state = "hair_spiky2" icon_state = "hair_spiky2"
/datum/sprite_accessory/hair/protagonist
name = "Slightly Long"
icon_state = "hair_protagonist"
/datum/sprite_accessory/hair/kusangi
name = "Kusanagi Hair"
icon_state = "hair_kusanagi"
/datum/sprite_accessory/hair/kagami
name = "Pigtails"
icon_state = "hair_kagami"
/datum/sprite_accessory/hair/pigtail
name = "Pigtails 2"
icon_state = "hair_pigtails"
/datum/sprite_accessory/hair/pigtail
name = "Pigtails 3"
icon_state = "hair_pigtails2"
/datum/sprite_accessory/hair/himecut
name = "Hime Cut"
icon_state = "hair_himecut"
/datum/sprite_accessory/hair/himecut2
name = "Hime Cut 2"
icon_state = "hair_himecut2"
/datum/sprite_accessory/hair/himeup
name = "Hime Updo"
icon_state = "hair_himeup"
/datum/sprite_accessory/hair/antenna
name = "Ahoge"
icon_state = "hair_antenna"
/datum/sprite_accessory/hair/front_braid
name = "Braided front"
icon_state = "hair_braidfront"
/datum/sprite_accessory/hair/lowbraid
name = "Low Braid"
icon_state = "hair_hbraid"
/datum/sprite_accessory/hair/not_floorlength_braid
name = "High Braid"
icon_state = "hair_braid2"
/datum/sprite_accessory/hair/shortbraid
name = "Short Braid"
icon_state = "hair_shortbraid"
/datum/sprite_accessory/hair/braid
name = "Floorlength Braid"
icon_state = "hair_braid"
/datum/sprite_accessory/hair/odango
name = "Odango"
icon_state = "hair_odango"
/datum/sprite_accessory/hair/ombre
name = "Ombre"
icon_state = "hair_ombre"
/datum/sprite_accessory/hair/updo
name = "Updo"
icon_state = "hair_updo"
/datum/sprite_accessory/hair/skinhead
name = "Skinhead"
icon_state = "hair_skinhead"
/datum/sprite_accessory/hair/longbangs
name = "Long Bangs"
icon_state = "hair_lbangs"
/datum/sprite_accessory/hair/balding
name = "Balding Hair"
icon_state = "hair_e"
/datum/sprite_accessory/hair/bald
name = "Bald"
icon_state = null
/datum/sprite_accessory/hair/parted
name = "Side Part"
icon_state = "hair_part"
/datum/sprite_accessory/hair/braided
name = "Braided"
icon_state = "hair_braided"
/datum/sprite_accessory/hair/bun
name = "Bun Head"
icon_state = "hair_bun"
/datum/sprite_accessory/hair/bun2
name = "Bun Head 2"
icon_state = "hair_bunhead2"
/datum/sprite_accessory/hair/braidtail
name = "Braided Tail"
icon_state = "hair_braidtail"
/datum/sprite_accessory/hair/bigflattop
name = "Big Flat Top"
icon_state = "hair_bigflattop"
/datum/sprite_accessory/hair/drillhair
name = "Drill Hair"
icon_state = "hair_drillhair"
/datum/sprite_accessory/hair/keanu
name = "Keanu Hair"
icon_state = "hair_keanu"
/datum/sprite_accessory/hair/swept /datum/sprite_accessory/hair/swept
name = "Swept Back Hair" name = "Swept Back Hair"
icon_state = "hair_swept" icon_state = "hair_swept"
@@ -436,73 +539,24 @@
name = "Swept Back Hair 2" name = "Swept Back Hair 2"
icon_state = "hair_swept2" icon_state = "hair_swept2"
/datum/sprite_accessory/hair/business //T
name = "Business Hair"
icon_state = "hair_business"
/datum/sprite_accessory/hair/business2 //U
name = "Business Hair 2"
icon_state = "hair_business2"
/datum/sprite_accessory/hair/business3 /datum/sprite_accessory/hair/updo
name = "Business Hair 3" name = "Updo"
icon_state = "hair_business3" icon_state = "hair_updo"
/datum/sprite_accessory/hair/business4 //V
name = "Business Hair 4"
icon_state = "hair_business4"
/datum/sprite_accessory/hair/hedgehog //W
name = "Hedgehog Hair"
icon_state = "hair_hedgehog"
/datum/sprite_accessory/hair/bob //X
name = "Bob Hair"
icon_state = "hair_bob"
/datum/sprite_accessory/hair/bob2 //Y
name = "Bob Hair 2"
icon_state = "hair_bob2"
/datum/sprite_accessory/hair/boddicker //Z
name = "Boddicker"
icon_state = "hair_boddicker"
/datum/sprite_accessory/hair/long
name = "Long Hair 1"
icon_state = "hair_long"
/datum/sprite_accessory/hair/long2
name = "Long Hair 2"
icon_state = "hair_long2"
/datum/sprite_accessory/hair/pixie
name = "Pixie Cut"
icon_state = "hair_pixie"
/datum/sprite_accessory/hair/megaeyebrows
name = "Mega Eyebrows"
icon_state = "hair_megaeyebrows"
/datum/sprite_accessory/hair/highponytail
name = "High Ponytail"
icon_state = "hair_highponytail"
/datum/sprite_accessory/hair/longponytail
name = "Long Ponytail"
icon_state = "hair_longstraightponytail"
/datum/sprite_accessory/hair/sidepartlongalt
name = "Long Side Part"
icon_state = "hair_longsidepart"
/datum/sprite_accessory/hair/sidecut
name = "Sidecut"
icon_state = "hair_sidecut"
/datum/sprite_accessory/hair/largebun
name = "Large Bun"
icon_state = "hair_largebun"
///////////////////////////// /////////////////////////////
// Facial Hair Definitions // // Facial Hair Definitions //
@@ -516,82 +570,81 @@
icon_state = null icon_state = null
gender = NEUTER gender = NEUTER
/datum/sprite_accessory/facial_hair/watson
name = "Watson Mustache"
icon_state = "facial_watson"
/datum/sprite_accessory/facial_hair/hogan
name = "Hulk Hogan Mustache"
icon_state = "facial_hogan" //-Neek
/datum/sprite_accessory/facial_hair/vandyke
name = "Van Dyke Mustache"
icon_state = "facial_vandyke"
/datum/sprite_accessory/facial_hair/chaplin
name = "Square Mustache"
icon_state = "facial_chaplin"
/datum/sprite_accessory/facial_hair/selleck
name = "Selleck Mustache"
icon_state = "facial_selleck"
/datum/sprite_accessory/facial_hair/neckbeard
name = "Neckbeard"
icon_state = "facial_neckbeard"
/datum/sprite_accessory/facial_hair/fullbeard
name = "Full Beard"
icon_state = "facial_fullbeard"
/datum/sprite_accessory/facial_hair/longbeard
name = "Long Beard"
icon_state = "facial_longbeard"
/datum/sprite_accessory/facial_hair/vlongbeard
name = "Very Long Beard"
icon_state = "facial_wise"
/datum/sprite_accessory/facial_hair/elvis
name = "Elvis Sideburns"
icon_state = "facial_elvis"
/datum/sprite_accessory/facial_hair/abe /datum/sprite_accessory/facial_hair/abe
name = "Abraham Lincoln Beard" name = "Abraham Lincoln Beard"
icon_state = "facial_abe" icon_state = "facial_abe"
/datum/sprite_accessory/facial_hair/brokenman
name = "Broken Man"
icon_state = "facial_brokenman"
/datum/sprite_accessory/facial_hair/chinstrap /datum/sprite_accessory/facial_hair/chinstrap
name = "Chinstrap" name = "Chinstrap"
icon_state = "facial_chin" icon_state = "facial_chin"
/datum/sprite_accessory/facial_hair/dwarf
name = "Dwarf Beard"
icon_state = "facial_dwarf"
/datum/sprite_accessory/facial_hair/elvis
name = "Elvis Sideburns"
icon_state = "facial_elvis"
/datum/sprite_accessory/facial_hair/fiveoclock
name = "Five o Clock Shadow"
icon_state = "facial_fiveoclock"
/datum/sprite_accessory/facial_hair/fullbeard
name = "Full Beard"
icon_state = "facial_fullbeard"
/datum/sprite_accessory/facial_hair/fu
name = "Fu Manchu"
icon_state = "facial_fumanchu"
/datum/sprite_accessory/facial_hair/gt
name = "Goatee"
icon_state = "facial_gt"
/datum/sprite_accessory/facial_hair/hip /datum/sprite_accessory/facial_hair/hip
name = "Hipster Beard" name = "Hipster Beard"
icon_state = "facial_hip" icon_state = "facial_hip"
/datum/sprite_accessory/facial_hair/gt /datum/sprite_accessory/facial_hair/hogan
name = "Goatee" name = "Hulk Hogan Mustache"
icon_state = "facial_gt" icon_state = "facial_hogan" //-Neek
/datum/sprite_accessory/facial_hair/jensen /datum/sprite_accessory/facial_hair/jensen
name = "Jensen Beard" name = "Jensen Beard"
icon_state = "facial_jensen" icon_state = "facial_jensen"
/datum/sprite_accessory/facial_hair/dwarf /datum/sprite_accessory/facial_hair/longbeard
name = "Dwarf Beard" name = "Long Beard"
icon_state = "facial_dwarf" icon_state = "facial_longbeard"
/datum/sprite_accessory/facial_hair/fiveoclock /datum/sprite_accessory/facial_hair/neckbeard
name = "Five o Clock Shadow" name = "Neckbeard"
icon_state = "facial_fiveoclock" icon_state = "facial_neckbeard"
/datum/sprite_accessory/facial_hair/fu /datum/sprite_accessory/facial_hair/selleck
name = "Fu Manchu" name = "Selleck Mustache"
icon_state = "facial_fumanchu" icon_state = "facial_selleck"
/datum/sprite_accessory/facial_hair/brokenman /datum/sprite_accessory/facial_hair/chaplin
name = "Broken Man" name = "Square Mustache"
icon_state = "facial_brokenman" icon_state = "facial_chaplin"
/datum/sprite_accessory/facial_hair/vandyke
name = "Van Dyke Mustache"
icon_state = "facial_vandyke"
/datum/sprite_accessory/facial_hair/vlongbeard
name = "Very Long Beard"
icon_state = "facial_wise"
/datum/sprite_accessory/facial_hair/watson
name = "Watson Mustache"
icon_state = "facial_watson"
/////////////////////////// ///////////////////////////
// Underwear Definitions // // Underwear Definitions //
+2
View File
@@ -199,6 +199,8 @@
else else
to_chat(user, "<span class='notice'>The MMI indicates the brain is active.</span>") to_chat(user, "<span class='notice'>The MMI indicates the brain is active.</span>")
/obj/item/device/mmi/relaymove()
return //so that the MMI won't get a warning about not being able to move if it tries to move
/obj/item/device/mmi/syndie /obj/item/device/mmi/syndie
name = "Syndicate Man-Machine Interface" name = "Syndicate Man-Machine Interface"
@@ -34,6 +34,7 @@
if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ? if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ?
to_chat(user, "<span class='danger'>You cannot evolve when you are cuffed.</span>") to_chat(user, "<span class='danger'>You cannot evolve when you are cuffed.</span>")
return
if(L.amount_grown >= L.max_grown) //TODO ~Carn if(L.amount_grown >= L.max_grown) //TODO ~Carn
to_chat(L, "<span class='name'>You are growing into a beautiful alien! It is time to choose a caste.</span>") to_chat(L, "<span class='name'>You are growing into a beautiful alien! It is time to choose a caste.</span>")
@@ -311,7 +311,7 @@
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/medical)) if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/medical))
var/cyberimp_detect var/cyberimp_detect
for(var/obj/item/organ/cyberimp/CI in internal_organs) for(var/obj/item/organ/cyberimp/CI in internal_organs)
if(CI.status == ORGAN_ROBOTIC) if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant)
cyberimp_detect += "[name] is modified with a [CI.name].<br>" cyberimp_detect += "[name] is modified with a [CI.name].<br>"
if(cyberimp_detect) if(cyberimp_detect)
msg += "Detected cybernetic modifications:<br>" msg += "Detected cybernetic modifications:<br>"
@@ -117,6 +117,7 @@
move_to_delay = 4 move_to_delay = 4
poison_type = "venom" //all in venom, glass cannon. you bite 5 times and they are DEFINITELY dead, but 40 health and you are extremely obvious. Ambush, maybe? poison_type = "venom" //all in venom, glass cannon. you bite 5 times and they are DEFINITELY dead, but 40 health and you are extremely obvious. Ambush, maybe?
speed = 1 speed = 1
gold_core_spawnable = 0
//tarantulas are really tanky, regenerating (maybe), hulky monster but are also extremely slow, so. //tarantulas are really tanky, regenerating (maybe), hulky monster but are also extremely slow, so.
/mob/living/simple_animal/hostile/poison/giant_spider/tarantula /mob/living/simple_animal/hostile/poison/giant_spider/tarantula
@@ -134,6 +135,7 @@
speed = 7 speed = 7
status_flags = NONE status_flags = NONE
mob_size = MOB_SIZE_LARGE mob_size = MOB_SIZE_LARGE
gold_core_spawnable = 0
/mob/living/simple_animal/hostile/poison/giant_spider/tarantula/movement_delay() /mob/living/simple_animal/hostile/poison/giant_spider/tarantula/movement_delay()
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
@@ -153,6 +155,7 @@
maxHealth = 40 maxHealth = 40
health = 40 health = 40
var/datum/action/innate/spider/comm/letmetalkpls var/datum/action/innate/spider/comm/letmetalkpls
gold_core_spawnable = 0
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize() /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize()
. = ..() . = ..()
@@ -144,44 +144,42 @@
return TRUE return TRUE
/proc/UnlockMedal(medal,client/player) /proc/UnlockMedal(medal,client/player)
set waitfor = FALSE
if(!player || !medal) if(!player || !medal)
return return
if(global.medal_hub && global.medal_pass && global.medals_enabled) if(global.medal_hub && global.medal_pass && global.medals_enabled)
spawn() var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass)
var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass) if(isnull(result))
if(isnull(result)) global.medals_enabled = FALSE
global.medals_enabled = FALSE log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]")
log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]") message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!")
message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!") else if (result)
else if (result) to_chat(player, "<span class='greenannounce'><B>Achievement unlocked: [medal]!</B></span>")
to_chat(player, "<span class='greenannounce'><B>Achievement unlocked: [medal]!</B></span>")
/proc/SetScore(score,client/player,increment,force) /proc/SetScore(score,client/player,increment,force)
set waitfor = FALSE
if(!score || !player) if(!score || !player)
return return
if(global.medal_hub && global.medal_pass && global.medals_enabled) if(global.medal_hub && global.medal_pass && global.medals_enabled)
spawn() var/list/oldscore = GetScore(score,player,1)
var/list/oldscore = GetScore(score,player,1)
if(increment) if(increment)
if(!oldscore[score]) if(!oldscore[score])
oldscore[score] = 1 oldscore[score] = 1
else
oldscore[score] = (text2num(oldscore[score]) + 1)
else else
oldscore[score] = force oldscore[score] = (text2num(oldscore[score]) + 1)
else
oldscore[score] = force
var/newscoreparam = list2params(oldscore) var/newscoreparam = list2params(oldscore)
var/result = world.SetScores(player.ckey, newscoreparam, global.medal_hub, global.medal_pass) var/result = world.SetScores(player.ckey, newscoreparam, global.medal_hub, global.medal_pass)
if(isnull(result)) if(isnull(result))
global.medals_enabled = FALSE global.medals_enabled = FALSE
log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]") log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]")
message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!") message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!")
/proc/GetScore(score,client/player,returnlist) /proc/GetScore(score,client/player,returnlist)
-4
View File
@@ -71,13 +71,9 @@ Contents:
var/datum/antagonist/ninja/ninjadatum = add_ninja(Ninja) var/datum/antagonist/ninja/ninjadatum = add_ninja(Ninja)
ninjadatum.equip_space_ninja() ninjadatum.equip_space_ninja()
Ninja.internal = Ninja.s_store
Ninja.update_internals_hud_icon(1)
if(Ninja.mind != Mind) //something has gone wrong! if(Ninja.mind != Mind) //something has gone wrong!
throw EXCEPTION("Ninja created with incorrect mind") throw EXCEPTION("Ninja created with incorrect mind")
SSticker.mode.update_ninja_icons_added(Ninja) SSticker.mode.update_ninja_icons_added(Ninja)
spawned_mobs += Ninja spawned_mobs += Ninja
message_admins("[key_name_admin(Ninja)] has been made into a ninja by an event.") message_admins("[key_name_admin(Ninja)] has been made into a ninja by an event.")
+25
View File
@@ -0,0 +1,25 @@
/datum/outfit/ninja
name = "Space Ninja"
uniform = /obj/item/clothing/under/color/black
suit = /obj/item/clothing/suit/space/space_ninja
glasses = /obj/item/clothing/glasses/night
mask = /obj/item/clothing/mask/gas/space_ninja
head = /obj/item/clothing/head/helmet/space/space_ninja
ears = /obj/item/device/radio/headset
shoes = /obj/item/clothing/shoes/space_ninja
gloves = /obj/item/clothing/gloves/space_ninja
back = /obj/item/tank/jetpack/carbondioxide
l_pocket = /obj/item/grenade/plastic/x4
r_pocket = /obj/item/tank/internals/emergency_oxygen
internals_slot = slot_r_store
belt = /obj/item/dash/energy_katana
implants = list(/obj/item/implant/explosive)
/datum/outfit/ninja/post_equip(mob/living/carbon/human/H)
if(istype(H.wear_suit, suit))
var/obj/item/clothing/suit/space/space_ninja/S = H.wear_suit
if(istype(H.belt, belt))
S.energyKatana = H.belt
S.randomize_param()
@@ -151,6 +151,12 @@
for(var/i in 1 to 4 + rand(1,2)) for(var/i in 1 to 4 + rand(1,2))
var/chosen = pick(borks) var/chosen = pick(borks)
var/obj/B = new chosen(T) var/obj/B = new chosen(T)
if(prob(5))//Fry it!
var/obj/item/reagent_containers/food/snacks/deepfryholder/D = new(T)
var/datum/reagents/reagents = new(25)
reagents.add_reagent("nutriment", 25)
D.fry(B, reagents)
B = D
if(prob(50)) if(prob(50))
for(var/j in 1 to rand(1, 3)) for(var/j in 1 to rand(1, 3))
step(B, pick(NORTH,SOUTH,EAST,WEST)) step(B, pick(NORTH,SOUTH,EAST,WEST))
@@ -173,6 +179,7 @@
/obj/item/reagent_containers/food/snacks/soup, /obj/item/reagent_containers/food/snacks/soup,
/obj/item/reagent_containers/food/snacks/grown, /obj/item/reagent_containers/food/snacks/grown,
/obj/item/reagent_containers/food/snacks/grown/mushroom, /obj/item/reagent_containers/food/snacks/grown/mushroom,
/obj/item/reagent_containers/food/snacks/deepfryholder
) )
blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable) blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)
@@ -542,84 +542,6 @@
log_admin("[key_name(G)] was made a golem by [key_name(user)].") log_admin("[key_name(G)] was made a golem by [key_name(user)].")
qdel(src) qdel(src)
/obj/effect/timestop
anchored = TRUE
name = "chronofield"
desc = "ZA WARUDO"
icon = 'icons/effects/160x160.dmi'
icon_state = "time"
layer = FLY_LAYER
pixel_x = -64
pixel_y = -64
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/mob/living/immune = list() // the one who creates the timestop is immune
var/list/stopped_atoms = list()
var/freezerange = 2
var/duration = 140
alpha = 125
/obj/effect/timestop/Initialize()
. = ..()
for(var/mob/living/L in GLOB.player_list)
if(locate(/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop) in L.mind.spell_list) //People who can stop time are immune to its effects
immune += L
timestop()
/obj/effect/timestop/proc/timestop()
set waitfor = FALSE
playsound(src, 'sound/magic/timeparadox2.ogg', 75, 1, -1)
for(var/i in 1 to duration-1)
for(var/atom/A in orange (freezerange, src.loc))
if(isliving(A))
var/mob/living/M = A
if(M in immune)
continue
M.Stun(200, 1, 1)
M.anchored = TRUE
if(ishostile(M))
var/mob/living/simple_animal/hostile/H = M
H.AIStatus = AI_OFF
H.LoseTarget()
stopped_atoms |= M
else if(istype(A, /obj/item/projectile))
var/obj/item/projectile/P = A
P.paused = TRUE
stopped_atoms |= P
for(var/mob/living/M in stopped_atoms)
if(get_dist(get_turf(M),get_turf(src)) > freezerange) //If they lagged/ran past the timestop somehow, just ignore them
unfreeze_mob(M)
stopped_atoms -= M
stoplag()
//End
playsound(src, 'sound/magic/timeparadox2.ogg', 75, TRUE, frequency = -1) //reverse!
for(var/mob/living/M in stopped_atoms)
unfreeze_mob(M)
for(var/obj/item/projectile/P in stopped_atoms)
P.paused = FALSE
qdel(src)
return
/obj/effect/timestop/proc/unfreeze_mob(mob/living/M)
M.AdjustStun(-200, 1, 1)
M.anchored = FALSE
if(ishostile(M))
var/mob/living/simple_animal/hostile/H = M
H.AIStatus = initial(H.AIStatus)
/obj/effect/timestop/wizard
duration = 100
/obj/item/stack/tile/bluespace /obj/item/stack/tile/bluespace
name = "bluespace floor tile" name = "bluespace floor tile"
singular_name = "floor tile" singular_name = "floor tile"
+2 -3
View File
@@ -1,7 +1,6 @@
/obj/machinery/computer/camera_advanced/shuttle_docker /obj/machinery/computer/camera_advanced/shuttle_docker
name = "navigation computer" name = "navigation computer"
desc = "Used to designate a precise transit location for a spacecraft." desc = "Used to designate a precise transit location for a spacecraft."
z_lock = ZLEVEL_STATION_PRIMARY
jump_action = null jump_action = null
var/datum/action/innate/shuttledocker_rotate/rotate_action = new var/datum/action/innate/shuttledocker_rotate/rotate_action = new
var/datum/action/innate/shuttledocker_place/place_action = new var/datum/action/innate/shuttledocker_place/place_action = new
@@ -133,7 +132,7 @@
if(!V) if(!V)
continue continue
var/obj/docking_port/stationary/S = V var/obj/docking_port/stationary/S = V
if(z_lock && (S.z != z_lock)) if(z_lock.len && !(S.z in z_lock))
continue continue
if((S.id == shuttlePortId) || jumpto_ports[S.id]) if((S.id == shuttlePortId) || jumpto_ports[S.id])
continue continue
@@ -222,7 +221,7 @@
if(!V) if(!V)
continue continue
var/obj/docking_port/stationary/S = V var/obj/docking_port/stationary/S = V
if(console.z_lock && (S.z != console.z_lock)) if(console.z_lock.len && !(S.z in console.z_lock))
continue continue
if(console.jumpto_ports[S.id]) if(console.jumpto_ports[S.id])
L[S.name] = S L[S.name] = S
+1 -1
View File
@@ -47,8 +47,8 @@
desc = "Used to designate a precise transit location for the syndicate shuttle." desc = "Used to designate a precise transit location for the syndicate shuttle."
icon_screen = "syndishuttle" icon_screen = "syndishuttle"
icon_keyboard = "syndie_key" icon_keyboard = "syndie_key"
z_lock = ZLEVEL_STATION_PRIMARY
shuttleId = "syndicate" shuttleId = "syndicate"
station_lock_override = TRUE
shuttlePortId = "syndicate_custom" shuttlePortId = "syndicate_custom"
shuttlePortName = "custom location" shuttlePortName = "custom location"
jumpto_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1) jumpto_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1)
@@ -39,3 +39,8 @@
desc = "These cybernetic eye implants will display a security HUD over everything you see." desc = "These cybernetic eye implants will display a security HUD over everything you see."
origin_tech = "materials=4;programming=4;biotech=3;combat=3" origin_tech = "materials=4;programming=4;biotech=3;combat=3"
HUD_type = DATA_HUD_SECURITY_ADVANCED HUD_type = DATA_HUD_SECURITY_ADVANCED
/obj/item/organ/cyberimp/eyes/hud/security/syndicate
name = "Contraband Security HUD Implant"
desc = "A Cybersun Industries brand Security HUD Implant. These illicit cybernetic eye implants will display a security HUD over everything you see."
syndicate_implant = TRUE
@@ -6,6 +6,7 @@
status = ORGAN_ROBOTIC status = ORGAN_ROBOTIC
var/implant_color = "#FFFFFF" var/implant_color = "#FFFFFF"
var/implant_overlay var/implant_overlay
var/syndicate_implant = FALSE //Makes the implant invisible to health analyzers and medical HUDs.
/obj/item/organ/cyberimp/New(var/mob/M = null) /obj/item/organ/cyberimp/New(var/mob/M = null)
if(iscarbon(M)) if(iscarbon(M))
+125 -4
View File
@@ -31,12 +31,133 @@
/datum/uplink_item/dangerous/antitank /datum/uplink_item/dangerous/antitank
name = "Anti Tank Pistol" name = "Anti Tank Pistol"
desc = "Essentially amounting to a sniper rifle with no stock and barrel (or indeed, any rifling at all),\ desc = "Essentially amounting to a sniper rifle with no stock and barrel (or indeed, any rifling at all), \
this extremely dubious pistol is guaranteed to dislocate your wrists and hit the broad side of a barn!\ this extremely dubious pistol is guaranteed to dislocate your wrists and hit the broad side of a barn! \
Uses sniper ammo.\ Uses sniper ammo. \
Bullets tend to veer off-course. We are not responsible for any unintentional damage or injury resulting from inaacuracy." Bullets tend to veer off-course. We are not responsible for any unintentional damage or injury resulting from inaacuracy."
item = /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate item = /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate
refundable = TRUE
cost = 14 cost = 14
surplus = 25 surplus = 25
include_modes = list(/datum/game_mode/nuclear) include_modes = list(/datum/game_mode/nuclear)
/* Commented out due to introduction of reskinnable stetchkins. May still have a niche if people decide it somehow has value.
/datum/uplink_item/dangerous/stealthpistol
name = "Stealth Pistol"
desc = "A compact, easily concealable bullpup pistol that fires 10mm auto rounds in 8 round magazines. \
Has an integrated suppressor."
item = /obj/item/gun/ballistic/automatic/pistol/stealth
cost = 10
surplus = 30
*/
///Soporific 10mm mags///
/datum/uplink_item/ammo/pistolzzz
name = "10mm Soporific Magazine"
desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. Loaded with soporific rounds that put the target to sleep. \
NOTE: Soporific is not instant acting due to the constraints of the round's scale. Will usually require two shots to take effect."
item = /obj/item/ammo_box/magazine/m10mm/soporific
cost = 2
///flechette memes///
/datum/uplink_item/dangerous/flechettegun
name = "Flechette Launcher"
desc = "A compact bullpup that fires micro-flechettes.\
Flechettes have very poor performance idividually, but can be very deadly in numbers. \
Pre-loaded with armor piercing flechettes that are capable of puncturing most kinds of armor."
item = /obj/item/gun/ballistic/automatic/flechette
cost = 12
surplus = 30
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/flechetteap
name = "Armor Piercing Flechette Magazine"
desc = "An additional 40-round flechette magazine; compatible with the Flechette Launcer. \
Loaded with armor piercing flechettes that very nearly ignore armor, but are not very effective agaisnt flesh."
item = /obj/item/ammo_box/magazine/flechette
cost = 2
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/flechettes
name = "Serrated Flechette Magazine"
desc = "An additional 40-round flechette magazine; compatible with the Flechette Launcer. \
Loaded with serrated flechettes that shreds flesh, but is stopped dead in its tracks by armor. \
These flechettes are highly likely to sever arteries, and even limbs."
item = /obj/item/ammo_box/magazine/flechette/s
cost = 2
include_modes = list(/datum/game_mode/nuclear)
///shredder///
/datum/uplink_item/nukeoffer/shredder
name = "Shredder bundle"
desc = "A truly horrific weapon designed simply to maim its victim, the CX Shredder is banned by several intergalactic treaties. \
You'll get two of them with this. And spare ammo to boot. And we'll throw in an extra elite hardsuit and chest rig to hold them all!"
item = /obj/item/storage/backpack/duffelbag/syndie/shredderbundle
cost = 30 // normally 41
///Modular Pistols///
/datum/uplink_item/bundle/modular
name="Modular Pistol Kit"
desc="A heavy briefcase containing one modular pistol (chambered in 10mm), one supressor, and spare ammunition, including a box of soporific ammo. \
Includes a suit jacket that is padded with a robust liner."
item = /obj/item/storage/briefcase/modularbundle
cost = 12
//////Bundle stuff//////
///bundle category///
/datum/uplink_item/bundle
category = "Bundles"
surplus = 0
cant_discount = TRUE
///place bundle storage items here I guess///
/obj/item/storage/briefcase/modularbundle
name = "briefcase"
desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding."
icon_state = "briefcase"
flags_1 = CONDUCT_1
force = 10
hitsound = "swing_hit"
throw_speed = 2
throw_range = 4
w_class = WEIGHT_CLASS_BULKY
max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 21
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
resistance_flags = FLAMMABLE
max_integrity = 150
/obj/item/storage/briefcase/modularbundle/PopulateContents()
new /obj/item/gun/ballistic/automatic/pistol/modular(src)
new /obj/item/suppressor(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/ammo_box/magazine/m10mm/soporific(src)
new /obj/item/ammo_box/c10mm/soporific(src)
new /obj/item/clothing/under/lawyer/blacksuit(src)
new /obj/item/clothing/accessory/waistcoat(src)
new /obj/item/clothing/suit/toggle/lawyer/black/syndie(src)
/obj/item/clothing/suit/toggle/lawyer/black/syndie
desc = "A snappy dress jacket. Suspiciously has no tags or branding."
armor = list(melee = 10, bullet = 10, laser = 10, energy = 10, bomb = 10)
/obj/item/storage/backpack/duffelbag/syndie/shredderbundle
desc = "A large duffel bag containing two CX Shredders, some magazines, an elite hardsuit, and a chest rig."
/obj/item/storage/backpack/duffelbag/syndie/shredderbundle/PopulateContents()
new /obj/item/ammo_box/magazine/flechette/shredder(src)
new /obj/item/ammo_box/magazine/flechette/shredder(src)
new /obj/item/ammo_box/magazine/flechette/shredder(src)
new /obj/item/ammo_box/magazine/flechette/shredder(src)
new /obj/item/gun/ballistic/automatic/flechette/shredder(src)
new /obj/item/gun/ballistic/automatic/flechette/shredder(src)
new /obj/item/storage/belt/military(src)
new /obj/item/clothing/suit/space/hardsuit/syndi/elite(src)
///End of Bundle stuff///
+15
View File
@@ -0,0 +1,15 @@
author: "Toriate"
delete-after: True
changes:
- rscadd: "Adds Magrifles, RnD"
- rscadd: "Adds Modular Pistols, reskinnable stetchkins available only in a bundle"
- rscadd: "Adds Bundle category for regular traitor uplink"
- rscadd: "Adds Flechette Launcher, nukeop exclusive, unique variant available in bundle"
- rscadd: "Adds 10mm Soporific rounds"
- rscadd: "adds Foam X9 assault rifle, adminspawn"
- bugfix: "Anti Tank Pistol no longer refundable"
- wip: "Adds Hyper-Burst Rifle, adminspawn only weapon, intended for nukeops"
- soundadd: "added Magrifle sounds"
- soundadd: "added Hyper-Burst Rifle sounds"
- imageadd: "added 6 alternative sprites for 10mm pistols, includes suppressed sprites"
- spellcheck: "Anti Tank Pistol description fixed"
@@ -0,0 +1,4 @@
author: "Robustin"
delete-after: True
changes:
- tweak: "Revheads no longer spawn with chameleon glasses or a spraycan, instead they will start with a cybernetic security HUD implanted into their eyes."
@@ -0,0 +1,4 @@
author: "ShizCalev"
delete-after: True
changes:
- tweak: "The mining vendor will now provide more verbose feedback about your interactions."
@@ -0,0 +1,4 @@
author: "RandomMarine"
delete-after: True
changes:
- imageadd: "Air tanks (o2+n2) now have a different appearance from oxygen tanks."
@@ -0,0 +1,5 @@
author: "Augustfox"
delete-after: True
changes:
- tweak: "Reordered hair in a semi-alphabetized list for easier use in character creation."
- tweak: "Alphabetized facial hair for easier use in character creation."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 867 KiB

After

Width:  |  Height:  |  Size: 867 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 B

After

Width:  |  Height:  |  Size: 106 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 203 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 B

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.
Binary file not shown.
-5
View File
@@ -76,7 +76,6 @@ As a Security Officer, communicate and coordinate with your fellow officers usin
As a Security Officer, your sechuds or HUDsunglasses can not only see crewmates' job assignments and criminal status, but also if they are mindshield implanted. Use this to your advantage in a revolution to definitively tell who is on your side! As a Security Officer, your sechuds or HUDsunglasses can not only see crewmates' job assignments and criminal status, but also if they are mindshield implanted. Use this to your advantage in a revolution to definitively tell who is on your side!
As a Security Officer, mindshield implants can only prevent someone from being turned into a cultist: unlike revolutionaries, it will not de-cult them if they have already been converted. As a Security Officer, mindshield implants can only prevent someone from being turned into a cultist: unlike revolutionaries, it will not de-cult them if they have already been converted.
As a Security Officer, examining someone while wearing sechuds or HUDsunglasses will let you set their arrest level, which will cause Beepsky and other security bots to chase after them. As a Security Officer, examining someone while wearing sechuds or HUDsunglasses will let you set their arrest level, which will cause Beepsky and other security bots to chase after them.
As a Security Officer, implanting a gang member the first time will deconvert them, but destroy the implant. You must implant them a second time to protect them from further conversion attempts. Keep in mind that gang members have ways to destroy implants in people!
As the Detective, people leave fingerprints everywhere and on everything. With the exception of white latex, gloves will hide them. All is not lost, however, as gloves leave fibers specific to their kind such as black or nitrile, pointing to a general department. As the Detective, people leave fingerprints everywhere and on everything. With the exception of white latex, gloves will hide them. All is not lost, however, as gloves leave fibers specific to their kind such as black or nitrile, pointing to a general department.
As the Detective, you can use your forensics scanner from a distance. As the Detective, you can use your forensics scanner from a distance.
As the Lawyer, try to negotiate with the Warden if sentences seem too high for the crime. As the Lawyer, try to negotiate with the Warden if sentences seem too high for the crime.
@@ -181,10 +180,6 @@ As a Wizard, the fireball spell performs very poorly at close range, as it can e
As a Wizard, summoning guns will turn a large portion of the crew against themselves, but will also give everyone anything from a pea shooter to a BFG 9000. Use at your own risk! As a Wizard, summoning guns will turn a large portion of the crew against themselves, but will also give everyone anything from a pea shooter to a BFG 9000. Use at your own risk!
As a Wizard, the staff of chaos can fire any type of bolts from the magical wands. This can range from bolts of instant death to healing or reviving someone. As a Wizard, the staff of chaos can fire any type of bolts from the magical wands. This can range from bolts of instant death to healing or reviving someone.
As a Wizard, most spells become unusable if you are not wearing your robe, hat, and sandals. As a Wizard, most spells become unusable if you are not wearing your robe, hat, and sandals.
As a Gangster, you can destroy mindshield implants with an implant breaker, letting you reconvert that person.
As a Gangster, your influence is based on how many areas you have tagged and how many people are wearing your gang's outfit; more areas and more people wearing the outfit will give you more influence.
As a Gangster, your gang outfits are very robust, giving moderate resistances to most direct damage at the cost of stealth.
As a Gang Boss, don't wait too long to promote lieutenants! If you get caught by security or enemy gangsters, hopefully you have a backup.
As an Abductor, you can select where your victims will be sent on the ship control console. As an Abductor, you can select where your victims will be sent on the ship control console.
As an Abductor Agent, the combat mode vest has much higher resistance to every kind of weapon, and your helmet prevents the AI from tracking you. As an Abductor Agent, the combat mode vest has much higher resistance to every kind of weapon, and your helmet prevents the AI from tracking you.
As an Abductor, the baton can cycle between four modes: stun, sleep, cuff and probe. As an Abductor, the baton can cycle between four modes: stun, sleep, cuff and probe.
+2
View File
@@ -1360,6 +1360,7 @@
#include "code\modules\events\wizard\summons.dm" #include "code\modules\events\wizard\summons.dm"
#include "code\modules\fields\fields.dm" #include "code\modules\fields\fields.dm"
#include "code\modules\fields\peaceborg_dampener.dm" #include "code\modules\fields\peaceborg_dampener.dm"
#include "code\modules\fields\timestop.dm"
#include "code\modules\fields\turf_objects.dm" #include "code\modules\fields\turf_objects.dm"
#include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\Hallucination.dm"
@@ -1904,6 +1905,7 @@
#include "code\modules\ninja\energy_katana.dm" #include "code\modules\ninja\energy_katana.dm"
#include "code\modules\ninja\ninja_event.dm" #include "code\modules\ninja\ninja_event.dm"
#include "code\modules\ninja\Ninja_Readme.dm" #include "code\modules\ninja\Ninja_Readme.dm"
#include "code\modules\ninja\outfit.dm"
#include "code\modules\ninja\suit\gloves.dm" #include "code\modules\ninja\suit\gloves.dm"
#include "code\modules\ninja\suit\head.dm" #include "code\modules\ninja\suit\head.dm"
#include "code\modules\ninja\suit\mask.dm" #include "code\modules\ninja\suit\mask.dm"
@@ -456,6 +456,7 @@ function get_pr_code_friendliness($payload, $oldbalance = null){
'Fix' => 2, 'Fix' => 2,
'Refactor' => 2, 'Refactor' => 2,
'Code Improvement' => 1, 'Code Improvement' => 1,
'Grammar and Formatting' => 1,
'Priority: High' => 4, 'Priority: High' => 4,
'Priority: CRITICAL' => 5, 'Priority: CRITICAL' => 5,
'Atmospherics' => 4, 'Atmospherics' => 4,