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

View File

@@ -12,6 +12,7 @@
#define HIGH_TURF_LAYER 2.03
#define ABOVE_OPEN_TURF_LAYER 2.04
#define CLOSED_TURF_LAYER 2.05
#define BULLET_HOLE_LAYER 2.06
#define ABOVE_NORMAL_TURF_LAYER 2.08
#define LATTICE_LAYER 2.2
#define DISPOSAL_PIPE_LAYER 2.3

View File

@@ -474,7 +474,7 @@
#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 otherwise, update the version and bug lummox
#elseif
#endif
//Flattens a keyed list into a list of it's contents
/proc/flatten_list(list/key_list)
if(!islist(key_list))

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))
return y
/atom/proc/GetAllContents(list/ignore_typecache)
var/list/processing_list = list(src)
var/list/assembled = list()
if(ignore_typecache) //If there's a typecache, use it.
while(processing_list.len)
var/atom/A = processing_list[1]
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
/atom/proc/GetAllContents(list/output=list())
. = output
output += src
for(var/i in 1 to contents.len)
var/atom/thing = contents[i]
thing.GetAllContents(output)
//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.

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(wizardstart)
GLOBAL_LIST_EMPTY(nukeop_start)
GLOBAL_LIST_EMPTY(nukeop_leader_start)
GLOBAL_LIST_EMPTY(newplayer_start)
GLOBAL_LIST_EMPTY(prisonwarp) //prisoners go to these
GLOBAL_LIST_EMPTY(holdingfacility) //captured people go here

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
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/////////
//////projectiles//////
@@ -213,7 +234,7 @@
//////magazines/////
/obj/item/ammo_box/magazine/mmags
/obj/item/ammo_box/magazine/mmag/small
name = "magpistol magazine (non-lethal disabler)"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "nlmagmag"
@@ -223,7 +244,7 @@
max_ammo = 7
multiple_sprites = 2
/obj/item/ammo_box/magazine/mmags/lethal
/obj/item/ammo_box/magazine/mmag/small/lethal
name = "magpistol magazine (lethal)"
icon = 'icons/obj/guns/cit_guns.dmi'
icon_state = "smallmagmag"
@@ -239,7 +260,7 @@
icon_state = "magpistol"
force = 10
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
casing_ejector = 0
fire_delay = 5
@@ -276,7 +297,7 @@
req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5, "syndicate" = 3)
build_type = PROTOLATHE
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")
/datum/design/mag_magpistol/nl
@@ -285,7 +306,7 @@
id = "mag_magpistol_nl"
req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5)
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/////
@@ -339,3 +360,412 @@
materials = list(MAT_METAL = 7500, MAT_GLASS = 1000)
build_path = /obj/item/gun/ballistic/shotgun/toy/mag
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()

View File

@@ -11,6 +11,7 @@ SUBSYSTEM_DEF(squeak)
/datum/controller/subsystem/squeak/Initialize(timeofday)
trigger_migration(config.mice_roundstart)
return ..()
/datum/controller/subsystem/squeak/proc/trigger_migration(num_mice=10)
if(!num_mice)

View File

@@ -57,6 +57,9 @@ SUBSYSTEM_DEF(throwing)
var/pure_diagonal
var/diagonal_error
var/datum/callback/callback
var/paused = FALSE
var/delayed_time = 0
var/last_move = 0
/datum/thrownthing/proc/tick()
var/atom/movable/AM = thrownthing
@@ -64,14 +67,20 @@ SUBSYSTEM_DEF(throwing)
finalize()
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
finalize()
return
var/atom/step
last_move = world.time
//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)
if ((dist_travelled >= maxrange || AM.loc == target_turf) && AM.has_gravity(AM.loc))
finalize()

View File

@@ -1,6 +1,5 @@
/datum/antagonist/ninja
name = "Ninja"
var/team
var/helping_station = 0
var/give_objectives = TRUE
@@ -19,36 +18,8 @@
..(new_owner)
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.
if(safety)
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/equip_space_ninja(mob/living/carbon/human/H = owner.current)
return H.equipOutfit(/datum/outfit/ninja)
/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>!")

View File

@@ -102,10 +102,10 @@
if(implants)
for(var/implant_type in implants)
var/obj/item/implant/I = new implant_type(H)
I.implant(H, null, silent=TRUE)
I.implant(H, null, TRUE)
H.update_body()
return 1
return TRUE
/datum/outfit/proc/apply_fingerprints(mob/living/carbon/human/H)
if(!istype(H))

View File

@@ -9,7 +9,7 @@
var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new
var/datum/action/innate/set_droppoint/set_droppoint_action = new
var/obj/machinery/abductor/console/console
z_lock = ZLEVEL_STATION_PRIMARY
station_lock_override = TRUE
icon = 'icons/obj/abductor.dmi'
icon_state = "camera"

View File

@@ -22,27 +22,17 @@
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/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()
var/n_players = num_players()
var/n_agents = min(round(n_players / 10, 1), agents_possible)
if(antag_candidates.len < n_agents) //In the case of having less candidates than the selected number of agents
n_agents = antag_candidates.len
while(n_agents > 0)
var/datum/mind/new_syndicate = pick(antag_candidates)
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
var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible)
for(var/i = 0, i < n_agents, ++i)
var/datum/mind/new_op = pick_n_take(antag_candidates)
pre_nukeops += new_op
new_op.assigned_role = "Nuclear Operative"
new_op.special_role = "Nuclear Operative"
log_game("[new_op.key] (ckey) has been selected as a nuclear operative")
return TRUE
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
@@ -60,48 +50,36 @@
////////////////////////////////////////////////////////////////////////////////////////
/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/leader_selected = 0
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)
if(spawnpos > synd_spawn.len)
spawnpos = 2
synd_mind.current.loc = synd_spawn[spawnpos]
forge_syndicate_objectives(synd_mind)
greet_syndicate(synd_mind)
equip_syndicate(synd_mind.current)
forge_syndicate_objectives(op)
greet_syndicate(op)
equip_syndicate(op.current)
if(nuke_code)
synd_mind.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>")
op.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
to_chat(op.current, "The nuclear authorization code is: <B>[nuke_code]</B>")
if(!leader_selected)
prepare_syndicate_leader(synd_mind, nuke_code)
leader_selected = 1
if(op == leader)
op.current.forceMove(pick(GLOB.nukeop_leader_start))
prepare_syndicate_leader(op, nuke_code)
else
synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]"
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
op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1])
op.current.real_name = "[syndicate_name()] Operative #[agent_number++]"
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)
nuke.r_code = nuke_code
return ..()
/datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code)
var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
spawn(1)

View File

@@ -121,7 +121,7 @@
return target
/datum/objective/assassinate/check_completion()
return !target || !considered_alive(target)
return !considered_alive(target) || considered_afk(target)
/datum/objective/assassinate/update_explanation_text()
..()

View File

@@ -154,8 +154,7 @@
var/obj/item/device/assembly/flash/T = new(mob)
var/obj/item/toy/crayon/spraycan/R = new(mob)
var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob)
var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new(mob)
var/list/slots = list (
"backpack" = slot_in_backpack,
@@ -163,13 +162,8 @@
"right pocket" = slot_r_store
)
var/where = mob.equip_in_one_of_slots(T, slots)
var/where2 = mob.equip_in_one_of_slots(C, slots)
mob.equip_in_one_of_slots(R,slots)
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.")
S.Insert(mob, special = FALSE, drop_if_replaced = FALSE)
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 (!where)
to_chat(mob, "The Syndicate were unfortunately unable to get you a flash.")

View File

@@ -3,7 +3,8 @@
desc = "Used to access the various cameras on the station."
icon_screen = "cameras"
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/living/current_user = null
var/list/networks = list("SS13")
@@ -13,6 +14,11 @@
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
icon_keyboard = "syndie_key"
@@ -76,7 +82,7 @@
if(!eyeobj.eye_initialized)
var/camera_location
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
if(C.network & networks)
camera_location = get_turf(C)
@@ -201,7 +207,7 @@
var/list/L = list()
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
L.Add(cam)

View File

@@ -213,6 +213,8 @@ GLOBAL_LIST_INIT(pipeID2State, list(
return ..()
if (!isturf(src.loc))
return 1
add_fingerprint(user)
fixdir()
if(pipe_type in list(PIPE_GAS_MIXER, PIPE_GAS_FILTER))

View File

@@ -157,11 +157,27 @@
/obj/effect/landmark/start/wizard
name = "wizard"
/obj/effect/landmark/start/wizard/Initialize(mapload)
/obj/effect/landmark/start/wizard/Initialize()
..()
GLOB.wizardstart += loc
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
name = "New Player"
@@ -205,23 +221,6 @@
/obj/effect/landmark/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.
/obj/effect/landmark/xeno_spawn
name = "xeno_spawn"

View File

@@ -33,7 +33,7 @@
if(!force_rebuild && range == current_range)
return FALSE
. = TRUE
current_range = range
var/list/checkers_local = checkers

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)
if(!istype(M))
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)
if(lit && cig && user.a_intent == INTENT_HELP)
if(cig.lit)

View File

@@ -26,6 +26,14 @@ GLOBAL_LIST_EMPTY(PDAs)
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/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
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)
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>"
@@ -130,6 +139,12 @@ GLOBAL_LIST_EMPTY(PDAs)
if (mode)
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>"
if (!owner)
@@ -307,6 +322,24 @@ GLOBAL_LIST_EMPTY(PDAs)
//BASIC FUNCTIONS===================================
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(mode<=9)
mode = 0
@@ -538,7 +571,7 @@ GLOBAL_LIST_EMPTY(PDAs)
P.show_recieved_message(msg,src)
if(!multiple)
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
if(!multiple)
to_chat(user, "<span class='notice'>ERROR: Server isn't responding.</span>")
@@ -548,7 +581,7 @@ GLOBAL_LIST_EMPTY(PDAs)
if(multiple)
show_to_sender(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)
tnote += "<i><b>&rarr; To [multiple ? "Everyone" : msg.recipient]:</b></i><br>[msg.message][msg.get_photo_ref()]<br>"

View File

@@ -214,7 +214,7 @@ MASS SPECTROMETER
var/cyberimp_detect
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>"
if(cyberimp_detect)
to_chat(user, "<span class='notice'>Detected cybernetic modifications:</span>")

View File

@@ -38,10 +38,14 @@
/obj/item/toy/eightball/Initialize(mapload)
. = ..()
if(prob(1))
new /obj/item/toy/eightball/haunted(get_turf(src))
if(MakeHaunted())
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)
if(shaking)
return
@@ -105,6 +109,9 @@
GLOB.poi_list -= src
. = ..()
/obj/item/toy/eightball/haunted/MakeHaunted()
return FALSE
/obj/item/toy/eightball/haunted/attack_ghost(mob/user)
if(!shaking)
to_chat(user, "<span class='warning'>[src] is not currently being shaken.</span>")

View File

@@ -390,7 +390,6 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
singular_name = "plastic sheet"
icon_state = "sheet-plastic"
throwforce = 7
origin_tech = "materials=1"
origin_tech = "materials=1;biotech=1"
merge_type = /obj/item/stack/sheet/plastic

View File

@@ -28,31 +28,29 @@
/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)
if(locked)
if (istype(W, /obj/item/screwdriver))
if (do_after(user, 20*W.toolspeed, target = src))
src.open =! src.open
user.show_message("<span class='notice'>You [open ? "open" : "close"] the service panel.</span>", 1)
if (do_after(user, 20*W.toolspeed, target = user))
open =! open
to_chat(user, "<span class='notice'>You [open ? "open" : "close"] the service panel.</span>")
return
if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking))
user.show_message("<span class='danger'>Now attempting to reset internal memory, please hold.</span>", 1)
src.l_hacking = 1
if (do_after(usr, 100*W.toolspeed, target = src))
if (prob(33))
src.l_setshort = 1
if (istype(W, /obj/item/wirecutters) || istype(W, /obj/item/card/emag))
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>")
if ((istype(W, /obj/item/device/multitool)) && (!l_hacking))
if(src.open == 1)
to_chat(user, "<span class='danger'>Now attempting to reset internal memory, please hold.</span>")
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
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
else
user.show_message("<span class='danger'>Unable to reset internal memory.</span>", 1)
src.l_hacking = 0
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
//At this point you have exhausted all the special things to do when locked
// ... but it's still locked.

View File

@@ -177,7 +177,7 @@
if("pressure")
var/pressure = params["pressure"]
if(pressure == "reset")
pressure = TANK_DEFAULT_RELEASE_PRESSURE
pressure = initial(distribute_pressure)
. = TRUE
else if(pressure == "min")
pressure = TANK_MIN_RELEASE_PRESSURE

View File

@@ -138,3 +138,16 @@
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_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)

View File

@@ -444,7 +444,7 @@
/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, forceop = FALSE)
// 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/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
for(var/i in 1 to allowed_contents.len)
var/thing = allowed_contents[i]

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
if(!D)
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
else
if(!SSdbcore.Connect())

View File

@@ -34,6 +34,8 @@ GLOBAL_PROTECT(href_token)
admin_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]"
href_token = GenerateToken()
GLOB.admin_datums[ckey] = src
if(R.rights & R_DEBUG) //grant profile access
world.SetConfig("APP/admin", ckey, "role=admin")
/proc/GenerateToken()
. = ""

View File

@@ -30,6 +30,7 @@
//Processing
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/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_field_turfs = FALSE
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()
full_cleanup()
STOP_PROCESSING(SSfields, src)
return ..()
/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/New()
if(requires_processing)
START_PROCESSING(SSfields, src)
/datum/proximity_monitor/advanced/proc/Initialize()
setup_field()
post_setup_field()
@@ -250,11 +256,6 @@
setup_field_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)
T.color = set_edgeturf_color

View File

@@ -5,6 +5,7 @@
name = "\improper Hyperkinetic Dampener Field"
setup_edge_turfs = TRUE
setup_field_turfs = TRUE
requires_processing = TRUE
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_north = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_north")
@@ -21,13 +22,11 @@
use_host_turf = TRUE
/datum/proximity_monitor/advanced/peaceborg_dampener/New()
START_PROCESSING(SSfields, src)
tracked = list()
staging = list()
..()
/datum/proximity_monitor/advanced/peaceborg_dampener/Destroy()
STOP_PROCESSING(SSfields, src)
return ..()
/datum/proximity_monitor/advanced/peaceborg_dampener/process()

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)

View File

@@ -185,6 +185,37 @@
icon_state = ""
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
name = "buttered toast"
desc = "Butter lightly spread over a piece of toast."

View File

@@ -82,36 +82,7 @@ insert ascii eagle on american flag background here
if(frying.loc == src)
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))
if(istype(frying, /obj/item/reagent_containers/))
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)
S.fry(frying, reagents, cook_time)
icon_state = "fryer_off"
user.put_in_hands(S)
frying = null

View File

@@ -8,6 +8,7 @@
density = TRUE
anchored = TRUE
circuit = /obj/item/circuitboard/machine/mining_equipment_vendor
var/icon_deny = "mining-deny"
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.
new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
@@ -108,6 +109,7 @@
if(href_list["choice"])
if(istype(inserted_id))
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.verb_pickup()
inserted_id = null
@@ -118,20 +120,31 @@
return
I.loc = src
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(istype(inserted_id))
var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
if (!prize || !(prize in prize_list))
to_chat(usr, "<span class='warning'>Error: Invalid choice!</span>")
flick(icon_deny, src)
return
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
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)
SSblackbox.add_details("mining_equipment_bought",
"[src.type]|[prize.equipment_path]")
// Add src.type to keep track of free golem purchases
// separately.
else
to_chat(usr, "<span class='warning'>Error: Please insert a valid ID!</span>")
flick(icon_deny, src)
updateUsrDialog()
return
@@ -146,6 +159,7 @@
return
C.loc = src
inserted_id = C
to_chat(usr, "<span class='notice'>You insert the ID into [src]'s card slot.</span>")
interact(user)
return
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))

View File

@@ -32,10 +32,10 @@
new_player_panel()
client.playtitlemusic()
if(SSticker.current_state < GAME_STATE_SETTING_UP)
var/tl = round(SSticker.GetTimeLeft(), 1)/10
var/tl = SSticker.GetTimeLeft()
var/postfix
if(tl >= 0)
postfix = "in about [tl] seconds"
if(tl > 0)
postfix = "in about [DisplayTimeText(tl)]"
else
postfix = "soon"
to_chat(src, "Please set up your character and select \"Ready\". The game will start [postfix].")

View File

@@ -67,30 +67,317 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
/datum/sprite_accessory/hair/short
name = "Short Hair" // try to capatilize the names please~ // try to spell
icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
//Place in order by major style E.G "Afro, Bun, Ponytail"
//Place different versions under the same style E.G "Bun > Large Bun, Ponytail > Long Ponytail"
//A
/datum/sprite_accessory/hair/shorthair2
name = "Short Hair 2"
icon_state = "hair_shorthair2"
/datum/sprite_accessory/hair/afro
name = "Afro" // try to capatilize the names please~ // try to spell
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
name = "Short Hair 3"
icon_state = "hair_shorthair3"
/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/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
name = "Cut Hair"
icon_state = "hair_c"
/datum/sprite_accessory/hair/long
name = "Shoulder-length Hair"
icon_state = "hair_b"
/datum/sprite_accessory/hair/halfbang
name = "Half-banged Hair"
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
name = "Long Hair"
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
name = "Over Eye"
icon_state = "hair_shortovereye"
@@ -103,29 +390,39 @@
name = "Very Long Over Eye"
icon_state = "hair_longest2"
/datum/sprite_accessory/hair/longest
name = "Very Long Hair"
icon_state = "hair_longest"
//P
/datum/sprite_accessory/hair/longfringe
name = "Long Fringe"
icon_state = "hair_longfringe"
/datum/sprite_accessory/hair/parted
name = "Parted"
icon_state = "hair_parted"
/datum/sprite_accessory/hair/longestalt
name = "Longer Fringe"
icon_state = "hair_vlongfringe"
/datum/sprite_accessory/hair/sidepartlongalt
name = "Long Side Part"
icon_state = "hair_longsidepart"
/datum/sprite_accessory/hair/gentle
name = "Gentle"
icon_state = "hair_gentle"
/datum/sprite_accessory/hair/kagami
name = "Pigtails"
icon_state = "hair_kagami"
/datum/sprite_accessory/hair/halfbang
name = "Half-banged Hair"
icon_state = "hair_halfbang"
/datum/sprite_accessory/hair/pigtail
name = "Pigtails 2"
icon_state = "hair_pigtails"
/datum/sprite_accessory/hair/halfbang2
name = "Half-banged Hair 2"
icon_state = "hair_halfbang2"
/datum/sprite_accessory/hair/pigtail
name = "Pigtails 3"
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
name = "Ponytail"
@@ -147,6 +444,36 @@
name = "Ponytail 5"
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
name = "Side Pony"
@@ -164,141 +491,33 @@
name = "Side Pony 4"
icon_state = "hair_sidetail4"
/datum/sprite_accessory/hair/oneshoulder
name = "One Shoulder"
icon_state = "hair_oneshoulder"
/datum/sprite_accessory/hair/short
name = "Short Hair"
icon_state = "hair_a"
/datum/sprite_accessory/hair/tressshoulder
name = "Tress Shoulder"
icon_state = "hair_tressshoulder"
/datum/sprite_accessory/hair/shorthair2
name = "Short Hair 2"
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
name = "Parted"
icon_state = "hair_parted"
name = "Side Part"
icon_state = "hair_part"
/datum/sprite_accessory/hair/pompadour
name = "Pompadour"
icon_state = "hair_pompadour"
/datum/sprite_accessory/hair/skinhead
name = "Skinhead"
icon_state = "hair_skinhead"
/datum/sprite_accessory/hair/bigpompadour
name = "Big Pompadour"
icon_state = "hair_bigpompadour"
/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/protagonist
name = "Slightly Long"
icon_state = "hair_protagonist"
/datum/sprite_accessory/hair/spiky
name = "Spiky"
@@ -312,122 +531,6 @@
name = "Spiky 3"
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
name = "Swept Back Hair"
icon_state = "hair_swept"
@@ -436,73 +539,24 @@
name = "Swept Back Hair 2"
icon_state = "hair_swept2"
/datum/sprite_accessory/hair/business
name = "Business Hair"
icon_state = "hair_business"
//T
/datum/sprite_accessory/hair/business2
name = "Business Hair 2"
icon_state = "hair_business2"
//U
/datum/sprite_accessory/hair/business3
name = "Business Hair 3"
icon_state = "hair_business3"
/datum/sprite_accessory/hair/updo
name = "Updo"
icon_state = "hair_updo"
/datum/sprite_accessory/hair/business4
name = "Business Hair 4"
icon_state = "hair_business4"
//V
/datum/sprite_accessory/hair/hedgehog
name = "Hedgehog Hair"
icon_state = "hair_hedgehog"
//W
/datum/sprite_accessory/hair/bob
name = "Bob Hair"
icon_state = "hair_bob"
//X
/datum/sprite_accessory/hair/bob2
name = "Bob Hair 2"
icon_state = "hair_bob2"
//Y
/datum/sprite_accessory/hair/boddicker
name = "Boddicker"
icon_state = "hair_boddicker"
//Z
/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 //
@@ -516,82 +570,81 @@
icon_state = null
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
name = "Abraham Lincoln Beard"
icon_state = "facial_abe"
/datum/sprite_accessory/facial_hair/brokenman
name = "Broken Man"
icon_state = "facial_brokenman"
/datum/sprite_accessory/facial_hair/chinstrap
name = "Chinstrap"
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
name = "Hipster Beard"
icon_state = "facial_hip"
/datum/sprite_accessory/facial_hair/gt
name = "Goatee"
icon_state = "facial_gt"
/datum/sprite_accessory/facial_hair/hogan
name = "Hulk Hogan Mustache"
icon_state = "facial_hogan" //-Neek
/datum/sprite_accessory/facial_hair/jensen
name = "Jensen Beard"
icon_state = "facial_jensen"
/datum/sprite_accessory/facial_hair/dwarf
name = "Dwarf Beard"
icon_state = "facial_dwarf"
/datum/sprite_accessory/facial_hair/fiveoclock
name = "Five o Clock Shadow"
icon_state = "facial_fiveoclock"
/datum/sprite_accessory/facial_hair/fu
name = "Fu Manchu"
icon_state = "facial_fumanchu"
/datum/sprite_accessory/facial_hair/brokenman
name = "Broken Man"
icon_state = "facial_brokenman"
/datum/sprite_accessory/facial_hair/longbeard
name = "Long Beard"
icon_state = "facial_longbeard"
/datum/sprite_accessory/facial_hair/neckbeard
name = "Neckbeard"
icon_state = "facial_neckbeard"
/datum/sprite_accessory/facial_hair/selleck
name = "Selleck Mustache"
icon_state = "facial_selleck"
/datum/sprite_accessory/facial_hair/chaplin
name = "Square Mustache"
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 //

View File

@@ -199,6 +199,8 @@
else
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
name = "Syndicate Man-Machine Interface"

View File

@@ -34,6 +34,7 @@
if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ?
to_chat(user, "<span class='danger'>You cannot evolve when you are cuffed.</span>")
return
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>")

View File

@@ -311,7 +311,7 @@
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/medical))
var/cyberimp_detect
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>"
if(cyberimp_detect)
msg += "Detected cybernetic modifications:<br>"

View File

@@ -117,6 +117,7 @@
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?
speed = 1
gold_core_spawnable = 0
//tarantulas are really tanky, regenerating (maybe), hulky monster but are also extremely slow, so.
/mob/living/simple_animal/hostile/poison/giant_spider/tarantula
@@ -134,6 +135,7 @@
speed = 7
status_flags = NONE
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = 0
/mob/living/simple_animal/hostile/poison/giant_spider/tarantula/movement_delay()
var/turf/T = get_turf(src)
@@ -153,6 +155,7 @@
maxHealth = 40
health = 40
var/datum/action/innate/spider/comm/letmetalkpls
gold_core_spawnable = 0
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize()
. = ..()

View File

@@ -144,44 +144,42 @@
return TRUE
/proc/UnlockMedal(medal,client/player)
set waitfor = FALSE
if(!player || !medal)
return
if(global.medal_hub && global.medal_pass && global.medals_enabled)
spawn()
var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass)
if(isnull(result))
global.medals_enabled = FALSE
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]!")
else if (result)
to_chat(player, "<span class='greenannounce'><B>Achievement unlocked: [medal]!</B></span>")
var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass)
if(isnull(result))
global.medals_enabled = FALSE
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]!")
else if (result)
to_chat(player, "<span class='greenannounce'><B>Achievement unlocked: [medal]!</B></span>")
/proc/SetScore(score,client/player,increment,force)
set waitfor = FALSE
if(!score || !player)
return
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(!oldscore[score])
oldscore[score] = 1
else
oldscore[score] = (text2num(oldscore[score]) + 1)
if(increment)
if(!oldscore[score])
oldscore[score] = 1
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))
global.medals_enabled = FALSE
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]!")
if(isnull(result))
global.medals_enabled = FALSE
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]!")
/proc/GetScore(score,client/player,returnlist)

View File

@@ -71,13 +71,9 @@ Contents:
var/datum/antagonist/ninja/ninjadatum = add_ninja(Ninja)
ninjadatum.equip_space_ninja()
Ninja.internal = Ninja.s_store
Ninja.update_internals_hud_icon(1)
if(Ninja.mind != Mind) //something has gone wrong!
throw EXCEPTION("Ninja created with incorrect mind")
SSticker.mode.update_ninja_icons_added(Ninja)
spawned_mobs += Ninja
message_admins("[key_name_admin(Ninja)] has been made into a ninja by an event.")

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()

View File

@@ -151,6 +151,12 @@
for(var/i in 1 to 4 + rand(1,2))
var/chosen = pick(borks)
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))
for(var/j in 1 to rand(1, 3))
step(B, pick(NORTH,SOUTH,EAST,WEST))
@@ -173,6 +179,7 @@
/obj/item/reagent_containers/food/snacks/soup,
/obj/item/reagent_containers/food/snacks/grown,
/obj/item/reagent_containers/food/snacks/grown/mushroom,
/obj/item/reagent_containers/food/snacks/deepfryholder
)
blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable)

View File

@@ -542,84 +542,6 @@
log_admin("[key_name(G)] was made a golem by [key_name(user)].")
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
name = "bluespace floor tile"
singular_name = "floor tile"

View File

@@ -1,7 +1,6 @@
/obj/machinery/computer/camera_advanced/shuttle_docker
name = "navigation computer"
desc = "Used to designate a precise transit location for a spacecraft."
z_lock = ZLEVEL_STATION_PRIMARY
jump_action = null
var/datum/action/innate/shuttledocker_rotate/rotate_action = new
var/datum/action/innate/shuttledocker_place/place_action = new
@@ -133,7 +132,7 @@
if(!V)
continue
var/obj/docking_port/stationary/S = V
if(z_lock && (S.z != z_lock))
if(z_lock.len && !(S.z in z_lock))
continue
if((S.id == shuttlePortId) || jumpto_ports[S.id])
continue
@@ -222,7 +221,7 @@
if(!V)
continue
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
if(console.jumpto_ports[S.id])
L[S.name] = S

View File

@@ -47,8 +47,8 @@
desc = "Used to designate a precise transit location for the syndicate shuttle."
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
z_lock = ZLEVEL_STATION_PRIMARY
shuttleId = "syndicate"
station_lock_override = TRUE
shuttlePortId = "syndicate_custom"
shuttlePortName = "custom location"
jumpto_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1)

View File

@@ -39,3 +39,8 @@
desc = "These cybernetic eye implants will display a security HUD over everything you see."
origin_tech = "materials=4;programming=4;biotech=3;combat=3"
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

View File

@@ -6,6 +6,7 @@
status = ORGAN_ROBOTIC
var/implant_color = "#FFFFFF"
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)
if(iscarbon(M))

View File

@@ -31,12 +31,133 @@
/datum/uplink_item/dangerous/antitank
name = "Anti Tank Pistol"
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!\
Uses sniper ammo.\
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! \
Uses sniper ammo. \
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
refundable = TRUE
cost = 14
surplus = 25
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///