diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 656507316d..07642f1d08 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -7441,14 +7441,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /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" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -14777,7 +14769,6 @@ /turf/open/floor/plating, /area/chapel/main) "aHr" = ( -/obj/effect/landmark/marauder_entry, /turf/open/space, /area/space) "aHs" = ( @@ -100719,7 +100710,7 @@ aaa aaa aaa aaa -aqt +aqs aro aro aro diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 67107bf501..21180a53bd 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -178,7 +178,6 @@ /turf/open/floor/plasteel/airless/solarpanel, /area/solar/port/fore) "aav" = ( -/obj/effect/landmark/marauder_entry, /turf/open/space, /area/space) "aaw" = ( @@ -2225,14 +2224,6 @@ }, /turf/open/floor/plating, /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" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -129060,7 +129051,7 @@ aaa aaa bii aaa -aeD +aeC afD afD afD diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 12d1d8abe7..14282b7ebf 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -38904,7 +38904,7 @@ volume_rate = 200 }, /turf/open/space/basic, -/area/space) +/area/engine/engineering) "bxd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 05f0897465..72a05373eb 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -5751,6 +5751,10 @@ /obj/structure/mirror{ pixel_x = 28 }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, /turf/open/floor/plasteel/freezer{ dir = 2 }, @@ -6101,7 +6105,7 @@ /area/syndicate_mothership/control) "qp" = ( /obj/structure/chair/stool, -/obj/effect/landmark/syndicate_spawn, +/obj/effect/landmark/start/nukeop, /turf/open/floor/plasteel/bar{ dir = 2 }, @@ -6506,6 +6510,7 @@ /area/syndicate_mothership/control) "rj" = ( /obj/structure/closet/cardboard, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/airless, /area/syndicate_mothership/control) "rk" = ( @@ -7623,7 +7628,7 @@ /turf/open/floor/wood, /area/syndicate_mothership/control) "tT" = ( -/obj/effect/landmark/syndicate_spawn, +/obj/effect/landmark/start/nukeop_leader, /turf/open/floor/wood, /area/syndicate_mothership/control) "tU" = ( @@ -8025,6 +8030,9 @@ /area/syndicate_mothership/control) "vb" = ( /obj/structure/closet/cardboard/metal, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/syndicate_mothership/control) "vc" = ( @@ -9731,7 +9739,6 @@ /area/wizard_station) "zj" = ( /obj/structure/table/wood, -/obj/effect/landmark/teleport_scroll, /obj/item/dice/d20, /obj/item/dice, /turf/open/floor/carpet, @@ -13652,6 +13659,44 @@ }, /turf/open/floor/holofloor, /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) = {" aa @@ -34895,7 +34940,7 @@ lG hm aa kl -qs +QT rk rl rm @@ -34903,7 +34948,7 @@ tl rm ux vc -qs +QY kl aa aa @@ -36180,7 +36225,7 @@ hq hm aa kl -qt +QU ro rm sd @@ -36437,7 +36482,7 @@ hq hm aa kl -qs +QV rp ro rm @@ -36445,7 +36490,7 @@ tl rm uy ve -qs +QZ kl aa aa @@ -36695,13 +36740,13 @@ hm aa kl qs -qs +QW se se se se se -qs +QX qs kl aa @@ -76391,9 +76436,9 @@ dM QJ QL fg -QO -QQ -QR +QL +QK +QL dM fN fQ @@ -76903,11 +76948,11 @@ dM QI dM QK -QM +QL QN -QP +QL fr -QS +QL dM fN ab diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 830a25fb0a..2e0b359fac 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -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 diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 540ec9fb63..e5478adff4 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -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)) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a20cad1cf2..c2398982c2 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -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. diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index a2d30b1528..d031c01223 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -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 diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm index efab785d12..e62884ecbc 100644 --- a/code/citadel/cit_guns.dm +++ b/code/citadel/cit_guns.dm @@ -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() \ No newline at end of file diff --git a/code/controllers/subsystem/squeak.dm b/code/controllers/subsystem/squeak.dm index 16b722c71b..964d970e2b 100644 --- a/code/controllers/subsystem/squeak.dm +++ b/code/controllers/subsystem/squeak.dm @@ -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) diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index f245b0766c..97d84a0d3b 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -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() diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm index 230a4d64e4..f51b22dde2 100644 --- a/code/datums/antagonists/ninja.dm +++ b/code/datums/antagonists/ninja.dm @@ -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 SPACE NINJA!") diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 8d4413171d..3c3ab905ea 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -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)) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm index eb4e4f8211..fd9ca0a658 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm @@ -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" diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 4c21f9688b..acf55e4036 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -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("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) - to_chat(synd_mind.current, "The nuclear authorization code is: [nuke_code]") + op.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) + to_chat(op.current, "The nuclear authorization code is: [nuke_code]") - 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) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 75ed90d712..c00328243a 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -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() ..() diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 8384892044..d538c7f75e 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -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.") diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 3d5b8f026b..711ed6e55b 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -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) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 3fb3447f61..34d2edc56c 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -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)) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 7401797a47..68a1cb773c 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -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" diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index 62471505d0..70128be7ee 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -33,7 +33,7 @@ if(!force_rebuild && range == current_range) return FALSE . = TRUE - + current_range = range var/list/checkers_local = checkers diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 15a7c1ab0b..f04f8d4441 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -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("[user] lights [src] with [M]'s burning body. What a cold-blooded badass.") + return var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M) if(lit && cig && user.a_intent == INTENT_HELP) if(cig.lit) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index eb521d8510..2e7163bfa1 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -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 = "Personal Data Assistant" + var/dat = "Personal Data Assistant" + dat += " Refresh" @@ -130,6 +139,12 @@ GLOBAL_LIST_EMPTY(PDAs) if (mode) dat += " | Return" + if (mode == 0) + dat += "
" + dat += "
Toggle Font" + dat += " | Change Color" + dat += "
" + dat += "
" 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, "ERROR: Server isn't responding.") @@ -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 += "→ To [multiple ? "Everyone" : msg.recipient]:
[msg.message][msg.get_photo_ref()]
" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 7d3eabfdc6..e9a622365a 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -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].
" if(cyberimp_detect) to_chat(user, "Detected cybernetic modifications:") diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index d8be420a08..15c6bcd4b1 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -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, "[src] is not currently being shaken.") diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index f1bb4c3772..6303da132c 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -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 diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 6620ec5265..ef65f2dac3 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -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 [open ? "unscrewed" : "screwed shut"].")) /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("You [open ? "open" : "close"] the service panel.", 1) + if (do_after(user, 20*W.toolspeed, target = user)) + open =! open + to_chat(user, "You [open ? "open" : "close"] the service panel.") return - if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) - user.show_message("Now attempting to reset internal memory, please hold.", 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, "[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be pulsed.") + if ((istype(W, /obj/item/device/multitool)) && (!l_hacking)) + if(src.open == 1) + to_chat(user, "Now attempting to reset internal memory, please hold.") + src.l_hacking = 1 + if (do_after(usr, 400*W.toolspeed, target = user)) + to_chat(user, "Internal memory reset - lock has been disengaged.") src.l_set = 0 - user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1) - sleep(80) - src.l_setshort = 0 src.l_hacking = 0 else - user.show_message("Unable to reset internal memory.", 1) src.l_hacking = 0 else - src.l_hacking = 0 + to_chat(user, "You must unscrew the service panel before you can pulse the wiring.") return //At this point you have exhausted all the special things to do when locked // ... but it's still locked. diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index dd2ea47dc4..7628617923 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -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 diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 68e5e31e84..3140e73400 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -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) \ No newline at end of file diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 0b8fbb3844..5bb90f618b 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -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] diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 828fbb2e91..67d0b4dbf7 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -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()) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 238512c8b7..04d03dbf4f 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -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() . = "" diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm index 0e15d24e03..218c19ff22 100644 --- a/code/modules/fields/fields.dm +++ b/code/modules/fields/fields.dm @@ -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 diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm index a480459f38..5e0fbdfb2b 100644 --- a/code/modules/fields/peaceborg_dampener.dm +++ b/code/modules/fields/peaceborg_dampener.dm @@ -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() diff --git a/code/modules/fields/timestop.dm b/code/modules/fields/timestop.dm new file mode 100644 index 0000000000..2fe1f775b4 --- /dev/null +++ b/code/modules/fields/timestop.dm @@ -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) diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index a07375a5b1..cf51c9867f 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -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." diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index 179f944500..0f27265b4b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -82,36 +82,7 @@ insert ascii eagle on american flag background here if(frying.loc == src) to_chat(user, "You eject [frying] from [src].") 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 diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index b48f5faf0a..8ae3632d34 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -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, "You eject the ID from [src]'s card slot.") 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, "No valid ID.") + to_chat(usr, "You insert the ID into [src]'s card slot.") + else + to_chat(usr, "Error: No valid ID!") + 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, "Error: Invalid choice!") + flick(icon_deny, src) return if(prize.cost > inserted_id.mining_points) + to_chat(usr, "Error: Insufficent points for [prize.equipment_name]!") + flick(icon_deny, src) else inserted_id.mining_points -= prize.cost + to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") 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, "Error: Please insert a valid ID!") + flick(icon_deny, src) updateUsrDialog() return @@ -146,6 +159,7 @@ return C.loc = src inserted_id = C + to_chat(usr, "You insert the ID into [src]'s card slot.") interact(user) return if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 4de3b1d4dd..1e3561c8a0 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -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].") diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index 1eb1379dce..03b7fd53ec 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -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 // diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 65a3fd253e..83dd63cc74 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -199,6 +199,8 @@ else to_chat(user, "The MMI indicates the brain is active.") +/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" diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index 36191203ad..906ba71c96 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -34,6 +34,7 @@ if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ? to_chat(user, "You cannot evolve when you are cuffed.") + return if(L.amount_grown >= L.max_grown) //TODO ~Carn to_chat(L, "You are growing into a beautiful alien! It is time to choose a caste.") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index d48d8608bc..74ccdab19c 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -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].
" if(cyberimp_detect) msg += "Detected cybernetic modifications:
" diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 7e8bd6d2c8..6ae5fe0622 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -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() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 5f45d47494..a80340c28a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -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, "Achievement unlocked: [medal]!") + 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, "Achievement unlocked: [medal]!") /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) diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index 8ff3652367..a3184cbb20 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -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.") diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm new file mode 100644 index 0000000000..4ec9cde23c --- /dev/null +++ b/code/modules/ninja/outfit.dm @@ -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() + diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 7e08a11b49..62e5fd723d 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -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) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 0b3c930962..6eedd257d0 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -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" diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index 9199e5eb14..65669d8251 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -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 diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 1c3d416fd0..ac1339d33e 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -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) diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 75014626be..eda6e34677 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -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 diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 4e478d3420..1eec609fc0 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -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)) diff --git a/code/modules/uplink/uplink_item_cit.dm b/code/modules/uplink/uplink_item_cit.dm index c9bb091303..3aa1fd8bb1 100644 --- a/code/modules/uplink/uplink_item_cit.dm +++ b/code/modules/uplink/uplink_item_cit.dm @@ -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/// \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2958.yml b/html/changelogs/AutoChangeLog-pr-2958.yml new file mode 100644 index 0000000000..c02b758502 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2958.yml @@ -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" diff --git a/html/changelogs/AutoChangeLog-pr-2960.yml b/html/changelogs/AutoChangeLog-pr-2960.yml new file mode 100644 index 0000000000..905ec4764f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2960.yml @@ -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." diff --git a/html/changelogs/AutoChangeLog-pr-2963.yml b/html/changelogs/AutoChangeLog-pr-2963.yml new file mode 100644 index 0000000000..056e7a17fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2963.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - tweak: "The mining vendor will now provide more verbose feedback about your interactions." diff --git a/html/changelogs/AutoChangeLog-pr-2966.yml b/html/changelogs/AutoChangeLog-pr-2966.yml new file mode 100644 index 0000000000..3570d4a852 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2966.yml @@ -0,0 +1,4 @@ +author: "RandomMarine" +delete-after: True +changes: + - imageadd: "Air tanks (o2+n2) now have a different appearance from oxygen tanks." diff --git a/html/changelogs/AutoChangeLog-pr-2968.yml b/html/changelogs/AutoChangeLog-pr-2968.yml new file mode 100644 index 0000000000..8ece28e6e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2968.yml @@ -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." diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 971eb849f6..fd53873c18 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/obj/guns/cit_guns.dmi b/icons/obj/guns/cit_guns.dmi index 2db84677d2..c6b2ffe49f 100644 Binary files a/icons/obj/guns/cit_guns.dmi and b/icons/obj/guns/cit_guns.dmi differ diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi index 8e41c003a4..f5ce551e7f 100644 Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ diff --git a/icons/pda_icons/pda_atmos.png b/icons/pda_icons/pda_atmos.png index 89a55a0a6c..4485e39799 100644 Binary files a/icons/pda_icons/pda_atmos.png and b/icons/pda_icons/pda_atmos.png differ diff --git a/icons/pda_icons/pda_back.png b/icons/pda_icons/pda_back.png index 4708824853..d12effb55e 100644 Binary files a/icons/pda_icons/pda_back.png and b/icons/pda_icons/pda_back.png differ diff --git a/icons/pda_icons/pda_bell.png b/icons/pda_icons/pda_bell.png index 1e989c2747..70faf96f64 100644 Binary files a/icons/pda_icons/pda_bell.png and b/icons/pda_icons/pda_bell.png differ diff --git a/icons/pda_icons/pda_blank.png b/icons/pda_icons/pda_blank.png index 665861d3c7..14c58ad5d7 100644 Binary files a/icons/pda_icons/pda_blank.png and b/icons/pda_icons/pda_blank.png differ diff --git a/icons/pda_icons/pda_boom.png b/icons/pda_icons/pda_boom.png index 70e473c3c4..508798c451 100644 Binary files a/icons/pda_icons/pda_boom.png and b/icons/pda_icons/pda_boom.png differ diff --git a/icons/pda_icons/pda_bucket.png b/icons/pda_icons/pda_bucket.png index ee030e3a37..039b23b292 100644 Binary files a/icons/pda_icons/pda_bucket.png and b/icons/pda_icons/pda_bucket.png differ diff --git a/icons/pda_icons/pda_chatroom.png b/icons/pda_icons/pda_chatroom.png index a00221c4e0..2f253bdcf4 100644 Binary files a/icons/pda_icons/pda_chatroom.png and b/icons/pda_icons/pda_chatroom.png differ diff --git a/icons/pda_icons/pda_cleanbot.png b/icons/pda_icons/pda_cleanbot.png index cecbcf4077..f3b976d6a2 100644 Binary files a/icons/pda_icons/pda_cleanbot.png and b/icons/pda_icons/pda_cleanbot.png differ diff --git a/icons/pda_icons/pda_color.png b/icons/pda_icons/pda_color.png new file mode 100644 index 0000000000..8e8bcfe627 Binary files /dev/null and b/icons/pda_icons/pda_color.png differ diff --git a/icons/pda_icons/pda_crate.png b/icons/pda_icons/pda_crate.png index e1e076e279..fce2f952af 100644 Binary files a/icons/pda_icons/pda_crate.png and b/icons/pda_icons/pda_crate.png differ diff --git a/icons/pda_icons/pda_cuffs.png b/icons/pda_icons/pda_cuffs.png index 71958c8abc..ff7e0cf3fe 100644 Binary files a/icons/pda_icons/pda_cuffs.png and b/icons/pda_icons/pda_cuffs.png differ diff --git a/icons/pda_icons/pda_dronephone.png b/icons/pda_icons/pda_dronephone.png index 7cf392eb97..cd7a1e22ec 100644 Binary files a/icons/pda_icons/pda_dronephone.png and b/icons/pda_icons/pda_dronephone.png differ diff --git a/icons/pda_icons/pda_eject.png b/icons/pda_icons/pda_eject.png index 4168be03f6..a9323f8f9f 100644 Binary files a/icons/pda_icons/pda_eject.png and b/icons/pda_icons/pda_eject.png differ diff --git a/icons/pda_icons/pda_exit.png b/icons/pda_icons/pda_exit.png index cd983a4a9a..b440e2cda8 100644 Binary files a/icons/pda_icons/pda_exit.png and b/icons/pda_icons/pda_exit.png differ diff --git a/icons/pda_icons/pda_flashlight.png b/icons/pda_icons/pda_flashlight.png index 3476727930..dafbec2c18 100644 Binary files a/icons/pda_icons/pda_flashlight.png and b/icons/pda_icons/pda_flashlight.png differ diff --git a/icons/pda_icons/pda_floorbot.png b/icons/pda_icons/pda_floorbot.png index 999e45aed2..1572a02f03 100644 Binary files a/icons/pda_icons/pda_floorbot.png and b/icons/pda_icons/pda_floorbot.png differ diff --git a/icons/pda_icons/pda_font.png b/icons/pda_icons/pda_font.png new file mode 100644 index 0000000000..8ae56bfc49 Binary files /dev/null and b/icons/pda_icons/pda_font.png differ diff --git a/icons/pda_icons/pda_honk.png b/icons/pda_icons/pda_honk.png index 55632bf40b..49c2b5c0da 100644 Binary files a/icons/pda_icons/pda_honk.png and b/icons/pda_icons/pda_honk.png differ diff --git a/icons/pda_icons/pda_locked.PNG b/icons/pda_icons/pda_locked.PNG index 79fe582916..ca1e641732 100644 Binary files a/icons/pda_icons/pda_locked.PNG and b/icons/pda_icons/pda_locked.PNG differ diff --git a/icons/pda_icons/pda_mail.png b/icons/pda_icons/pda_mail.png index 6bfb1e8cd7..d41d8dd1ae 100644 Binary files a/icons/pda_icons/pda_mail.png and b/icons/pda_icons/pda_mail.png differ diff --git a/icons/pda_icons/pda_medbot.png b/icons/pda_icons/pda_medbot.png index 24ae212be2..338c2c7ece 100644 Binary files a/icons/pda_icons/pda_medbot.png and b/icons/pda_icons/pda_medbot.png differ diff --git a/icons/pda_icons/pda_medical.png b/icons/pda_icons/pda_medical.png index 448063ecf5..bdee5abfa3 100644 Binary files a/icons/pda_icons/pda_medical.png and b/icons/pda_icons/pda_medical.png differ diff --git a/icons/pda_icons/pda_menu.png b/icons/pda_icons/pda_menu.png index abd6ccb225..afb8d7c5ca 100644 Binary files a/icons/pda_icons/pda_menu.png and b/icons/pda_icons/pda_menu.png differ diff --git a/icons/pda_icons/pda_mule.png b/icons/pda_icons/pda_mule.png index b8c1b636f5..71396128b3 100644 Binary files a/icons/pda_icons/pda_mule.png and b/icons/pda_icons/pda_mule.png differ diff --git a/icons/pda_icons/pda_notes.png b/icons/pda_icons/pda_notes.png index eb076d3ca3..2fe05ee351 100644 Binary files a/icons/pda_icons/pda_notes.png and b/icons/pda_icons/pda_notes.png differ diff --git a/icons/pda_icons/pda_power.png b/icons/pda_icons/pda_power.png index 04175e7c83..86909ea730 100644 Binary files a/icons/pda_icons/pda_power.png and b/icons/pda_icons/pda_power.png differ diff --git a/icons/pda_icons/pda_rdoor.png b/icons/pda_icons/pda_rdoor.png index 6eab5a8817..95c0dfd075 100644 Binary files a/icons/pda_icons/pda_rdoor.png and b/icons/pda_icons/pda_rdoor.png differ diff --git a/icons/pda_icons/pda_reagent.png b/icons/pda_icons/pda_reagent.png index b900af5ae6..65daeb0063 100644 Binary files a/icons/pda_icons/pda_reagent.png and b/icons/pda_icons/pda_reagent.png differ diff --git a/icons/pda_icons/pda_refresh.png b/icons/pda_icons/pda_refresh.png index 08439c6bca..c5e2d24f17 100644 Binary files a/icons/pda_icons/pda_refresh.png and b/icons/pda_icons/pda_refresh.png differ diff --git a/icons/pda_icons/pda_scanner.png b/icons/pda_icons/pda_scanner.png index eabdc511cd..be21fc5d40 100644 Binary files a/icons/pda_icons/pda_scanner.png and b/icons/pda_icons/pda_scanner.png differ diff --git a/icons/pda_icons/pda_signaler.png b/icons/pda_icons/pda_signaler.png index f71398f70d..43a69798bc 100644 Binary files a/icons/pda_icons/pda_signaler.png and b/icons/pda_icons/pda_signaler.png differ diff --git a/icons/pda_icons/pda_status.png b/icons/pda_icons/pda_status.png index fe955e66a6..dec0ec88df 100644 Binary files a/icons/pda_icons/pda_status.png and b/icons/pda_icons/pda_status.png differ diff --git a/sound/weapons/magburst.ogg b/sound/weapons/magburst.ogg new file mode 100644 index 0000000000..33068de0ea Binary files /dev/null and b/sound/weapons/magburst.ogg differ diff --git a/sound/weapons/magrifle.ogg b/sound/weapons/magrifle.ogg new file mode 100644 index 0000000000..2ec2e72af6 Binary files /dev/null and b/sound/weapons/magrifle.ogg differ diff --git a/strings/tips.txt b/strings/tips.txt index 51e1210e03..e76b88c625 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -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, 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, 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, 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. @@ -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, 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 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 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. diff --git a/tgstation.dme b/tgstation.dme index 525e30ca66..dbfeb68502 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1360,6 +1360,7 @@ #include "code\modules\events\wizard\summons.dm" #include "code\modules\fields\fields.dm" #include "code\modules\fields\peaceborg_dampener.dm" +#include "code\modules\fields\timestop.dm" #include "code\modules\fields\turf_objects.dm" #include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Hallucination.dm" @@ -1904,6 +1905,7 @@ #include "code\modules\ninja\energy_katana.dm" #include "code\modules\ninja\ninja_event.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\head.dm" #include "code\modules\ninja\suit\mask.dm" diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index 4e20a7e902..a8b32c7a92 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -456,6 +456,7 @@ function get_pr_code_friendliness($payload, $oldbalance = null){ 'Fix' => 2, 'Refactor' => 2, 'Code Improvement' => 1, + 'Grammar and Formatting' => 1, 'Priority: High' => 4, 'Priority: CRITICAL' => 5, 'Atmospherics' => 4,