Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into BookClub

This commit is contained in:
Aurorablade
2016-05-21 21:59:29 -04:00
231 changed files with 3836 additions and 1842 deletions
+3 -4
View File
@@ -5115,7 +5115,7 @@
"bUs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bUt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/crew_quarters/hor)
"bUu" = (/obj/machinery/power/apc{dir = 8; name = "RD Office APC"; pixel_x = -25},/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bUv" = (/obj/machinery/hologram/holopad,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bUv" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bUw" = (/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("Research","SS13")},/obj/item/clothing/glasses/welding/superior,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bUx" = (/obj/structure/closet/secure_closet/RD,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bUy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
@@ -7232,7 +7232,7 @@
"cJd" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel,/area/engine/engineering)
"cJe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cJf" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/hardsuitstorage)
"cJg" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/hardsuitstorage)
"cJg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access_txt = "11"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
"cJh" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology)
"cJi" = (/obj/machinery/camera{c_tag = "Engineering Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cJj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
@@ -7337,7 +7337,6 @@
"cLe" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cLf" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/weapon/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cLg" = (/obj/effect/spawner/window,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cLh" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access_txt = "11"; req_one_access_txt = null},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
"cLi" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology)
"cLj" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cLk" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/toxins/xenobiology)
@@ -8921,7 +8920,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJcFKcFLcyrcFNcDucFPcFOcFQcFScFTcSpcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAbikckPcxOcxPcxOcGAcxRcqUcGBcJPcJJcqUdlWcGDcwAcwAcwAckPbikbikaabaabbikbikbikbikbikbwocyKcvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcGFaabbikaabcGFaabbikaabcGFaabbikbikbikbikbikbikbikbikcDccDccDccGGcGHcFMcDdcGJcfRcGKcExcExcExcExcGLcExcFGcECcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGWcGXcGYcGZcHacHbcFYcELcDwcHccHdcDzcDzcHecBCcHfcHgcDFcHhcCAcHicHjcHkcHlcHmcHncHocHpcHocHqaabcCKcCKcCKcCKcCKcHBcoAcEhclUcIJcyVcyYcyXcEecEccEgcEfcHwcGucHZczVcIRcIQclUcusbGycJRcoAbikckPcxOcxOcxOcFjcHEcHFcHGcJScHIcCZcCZcCZcHJcHKcHLcHMbikbikbikaabaabbikbikbikbikbwobwocvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaabaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikaabaabcDccDdcDdcDdcDdcHPcHQcHRcfRcHScfRcfRcEBcHTcfRcECcHUcHVcGOcHWcFNcHXcHYcIacIacIbcIccIdcIedmabRFcIbcIhcIicIjcIkcIlcImcIncIocIpcIqcGfcIrcIscItcIucIvcIwcIxcIycIzcIAcIBcICcIDcDPcDQcIEcIFcIFcCKcHBcoAcEhclUclUclUclUclUcJhcANcBRcJQcMccBScMecMdcMCcBVclUcuscGqcGrcGrcGrcJTcJTcJTcJTcJTcJUcKTcKbcKUcIUczbcIVczbcIWczbcIXcHMbikbikbikbikaabaabbikbikbikbikbwocvzbwoaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikczocHOczqaabczocHOczqbikczocHOczqbikbikbikaabbikbikbikbikaabaabaabbikbikaabaabcJbcJbcJbcJbcJbcJbcJbcJccJbcJbcECcJdcJecGOcHWcFNcJfcFNcJgcLhcDtcJicJjcFWcJkcFRcDtcJmcDzcDwcJncJocJpcIncJqcJrcJscJtcJucJvcJwcJtcJxcJycJzcJAcDFcJBcJCcJDcJEaabcEVcJFcJGcJHcCKcHBcoDcKWcKVcKVcKVcKXclUcFacyLcCLcFecyScCMcyTcyTcyScCNclUcuscGvbVibGycKYcKZcoAbikbikckPcJVcJWcJXcJYcJVcJWcJZcKacJVcJWcLackPaabaabaabaabaabaabaabaabaabaabbwocvzbwobwobwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikczocHOczqaabczocHOczqbikczocHOczqbikbikbikaabbikbikbikbikaabaabaabbikbikaabaabcJbcJbcJbcJbcJbcJbcJbcJccJbcJbcECcJdcJecGOcHWcFNcJfcFNcFNcJgcDtcJicJjcFWcJkcFRcDtcJmcDzcDwcJncJocJpcIncJqcJrcJscJtcJucJvcJwcJtcJxcJycJzcJAcDFcJBcJCcJDcJEaabcEVcJFcJGcJHcCKcHBcoDcKWcKVcKVcKVcKXclUcFacyLcCLcFecyScCMcyTcyTcyScCNclUcuscGvbVibGycKYcKZcoAbikbikckPcJVcJWcJXcJYcJVcJWcJZcKacJVcJWcLackPaabaabaabaabaabaabaabaabaabaabbwocvzbwobwobwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikaabaabbikbikaabaabaabcJbcKjcKjcKkcGIcKmcKmcKncKocKocKpcKqcKrcGOcHWcGOcKscGOcGOcGOcDtcKtcKucKvcKwcKxcKycKzcKAcKBcKCcKCcKCcKDcKEcKFcKGcKHcKIcHhcCAcKJcKKcKLcKMcKNcDFcJBcKOcKPcKQcKRcDQcKScIFcIFcCKcHBcoDcEhbVibVibVibYDclUcFgcCOcDXcNDcyScPocPMcyTcPVcPQclUcuscGvbVibGycyHbGycoAbikbikckPcLicLjcLkcwAcLlcLmcLncwAcLocLpcLqckPaabaabbikbikbikbikbikbikbikbikbwocvzbxXbxXbwoaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqaabczocHOczqaabaabaabbikaabbikbikaabaabbikbikbikaabbikbikcJbcKjcKjcKkcLscLscLscLtcLucLvcECcLwcLxcLycLzcLAcLBcLCcLDcLDcLEcLFcLGcGOcGOcGOcLHcLIcLJcLKcLLcLMcLNcLOcLPcECcLQcLQcLRcHhcCAcLScLTcLUcLVcLWcDFcLXcLYcLZcMacMbcCKcCKcCKcCKcCKcHBcoDcEhcLbbGybGybYDclUcNEczVczVcOtcDZcQMcRwcyTdbkcYuclUcuscGvczhbGychCcITcoAbikbikckPcMpcxOcxOcwAcMpcxOcxOcwAcMpcxOcxOckPbikaabaabbikbikbikbikbikbikbikbwocLccyJbxXbwobwobwocJNcJNaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagiaabczocMqczqbikczocMqczqbikczocMqczqaabafxaabaabaabaabaabaabbikbikbikbikbikbikaabcJbcMrcMscLscLscLscMtcMucMucMucMucMucMucMucMvcMwcMxcMycMzcMzcMzcMAcMBdcpdcodcvcMzcMBcMDcMEcMFcLMcMGcLOcLPcMHcMIcMJcMKcMLcMMcMNcMOcKNcMPcMQcMRcMScMTcMUcIDcMVcDQcMWcMXcMXcCKcHBcoAcEhbVicozcLdbYDclUcOBczVcQgcPYcySdcydczcyTdcBdcAclUcuscGvbVibGybVibVicoAaabaabckPcNncBZcxOcwAcNncBZcxOcwAcNncBZcxOckPbikbikaabaabbikbikbikbikbikbikbwocvzcyJcLecyJcLfbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+1
View File
@@ -16,6 +16,7 @@ Pipelines + Other Objects -> Pipe network
idle_power_usage = 0
active_power_usage = 0
power_channel = ENVIRON
on_blueprints = TRUE
var/nodealert = 0
var/can_unwrench = 0
@@ -66,3 +66,13 @@
icon_state = "circ-off"
return 1
/obj/machinery/atmospherics/binary/circulator/attackby(var/obj/item/W as obj, var/mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
var/turf/T = get_turf(src)
if(!istype(T, /turf/simulated))
return ..()
anchored = !anchored
to_chat(user, "You [(anchored) ? "fasten" : "loosen"] \the [src] to the floor")
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
else return ..()
+6 -5
View File
@@ -43,11 +43,11 @@
#define HAS_LIPS 64
#define IS_PLANT 128
#define CAN_BE_FAT 256
#define IS_RESTRICTED 512
#define NO_INTORGANS 1024
#define NO_POISON 2048
#define RADIMMUNE 4096
#define ALL_RPARTS 8192
#define NO_INTORGANS 512
#define NO_POISON 1024
#define RADIMMUNE 2048
#define ALL_RPARTS 4096
#define NOGUNS 8192
//Species clothing flags
#define HAS_UNDERWEAR 1
@@ -66,6 +66,7 @@
#define HAS_MARKINGS 256
#define TAIL_WAGGING 512
#define NO_EYES 1024
#define HAS_FUR 2048
//Species Diet Flags
#define DIET_CARN 1
+21 -3
View File
@@ -10,6 +10,24 @@
#define T20C 293.15 // 20degC
#define TCMB 2.7 // -270.3degC
#define Clamp(x, y, z) (x <= y ? y : (x >= z ? z : x))
#define CLAMP01(x) (Clamp(x, 0, 1))
#define Clamp(x, y, z) ((x) <= (y) ? (y) : ((x) >= (z) ? (z) : (x)))
#define CLAMP01(x) (Clamp((x), 0, 1))
#define SIMPLE_SIGN(X) ((X) < 0 ? -1 : 1)
#define SIGN(X) ((X) ? SIMPLE_SIGN(X) : 0)
#define hypotenuse(Ax, Ay, Bx, By) (sqrt(((Ax) - (Bx))**2 + ((Ay) - (By))**2))
#define Ceiling(x) (-round(-(x)))
#define Tan(x) (sin(x) / cos(x))
#define Cot(x) (1 / Tan(x))
#define Csc(x) (1 / sin(x))
#define Sec(x) (1 / cos(x))
#define Floor(x) (round(x))
#define Inverse(x) (1 / (x))
#define IsEven(x) ((x) % 2 == 0)
#define IsOdd(x) ((x) % 2 == 1)
#define IsInRange(val, min, max) ((min) <= (val) && (val) <= (max))
#define IsInteger(x) (Floor(x) == (x))
#define IsMultiple(x, y) ((x) % (y) == 0)
#define Lcm(a, b) (abs(a) / Gcd((a), (b)) * abs(b))
#define Root(n, x) ((x) ** (1 / (n)))
#define ToDegrees(radians) ((radians) * 57.2957795) // 180 / Pi
#define ToRadians(degrees) ((degrees) * 0.0174532925) // Pi / 180
+8
View File
@@ -142,6 +142,14 @@
#define STAGE_FIVE 9
#define STAGE_SIX 11 //From supermatter shard
#define in_range(source, user) (get_dist(source, user) <= 1)
#define RANGE_TURFS(RADIUS, CENTER) \
block( \
locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \
locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \
)
#define FOR_DVIEW(type, range, center, invis_flags) \
dview_mob.loc = center; \
dview_mob.see_invisible = invis_flags; \
+41 -2
View File
@@ -76,7 +76,11 @@
#define APPEARANCE_FACIAL_HAIR_COLOR 128
#define APPEARANCE_EYE_COLOR 256
#define APPEARANCE_ALL_HAIR APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR
#define APPEARANCE_ALL 511
#define APPEARANCE_HEAD_ACCESSORY 512
#define APPEARANCE_MARKINGS 1024
#define APPEARANCE_BODY_ACCESSORY 2048
#define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY
#define APPEARANCE_ALL 4095
// Intents
#define I_HELP "help"
@@ -97,4 +101,39 @@
#define CHEM_MOB_SPAWN_INVALID 0
#define CHEM_MOB_SPAWN_HOSTILE 1
#define CHEM_MOB_SPAWN_FRIENDLY 2
#define CHEM_MOB_SPAWN_FRIENDLY 2
#define isobserver(A) (istype((A), /mob/dead/observer))
#define isliving(A) (istype((A), /mob/living))
#define isAutoAnnouncer(A) (istype((A), /mob/living/automatedannouncer))
#define iscarbon(A) (istype((A), /mob/living/carbon))
#define ishuman(A) (istype((A), /mob/living/carbon/human))
#define isbrain(A) (istype((A), /mob/living/carbon/brain))
#define isalien(A) (istype((A), /mob/living/carbon/alien))
#define isalienadult(A) (istype((A), /mob/living/carbon/alien/humanoid))
#define islarva(A) (istype((A), /mob/living/carbon/alien/larva))
#define isslime(A) (istype((A), /mob/living/carbon/slime))
#define isanimal(A) (istype((A), /mob/living/simple_animal))
#define iscorgi(A) (istype((A), /mob/living/simple_animal/pet/corgi))
#define ismouse(A) (istype((A), /mob/living/simple_animal/mouse))
#define isbot(A) (istype((A), /mob/living/simple_animal/bot))
#define isswarmer(A) (istype((A), /mob/living/simple_animal/hostile/swarmer))
#define isguardian(A) (istype((A), /mob/living/simple_animal/hostile/guardian))
#define issilicon(A) (istype((A), /mob/living/silicon))
#define isAI(A) (istype((A), /mob/living/silicon/ai))
#define isrobot(A) (istype((A), /mob/living/silicon/robot))
#define ispAI(A) (istype((A), /mob/living/silicon/pai))
#define isAIEye(A) (istype((A), /mob/camera/aiEye))
#define isovermind(A) (istype((A), /mob/camera/blob))
#define isSpirit(A) (istype((A), /mob/spirit))
#define ismask(A) (istype((A), /mob/spirit/mask))
#define isorgan(A) (istype((A), /obj/item/organ/external))
#define hasorgans(A) (ishuman(A))
#define is_admin(user) (check_rights(R_ADMIN, 0, (user)) != 0)
+27 -55
View File
@@ -1,10 +1,3 @@
//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a
#define RANGE_TURFS(RADIUS, CENTER) \
block( \
locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \
locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \
)
/proc/dopage(src,target)
var/href_list
var/href
@@ -46,13 +39,6 @@
areas |= T.loc
return areas
/proc/in_range(source, user)
if(get_dist(source, user) <= 1)
return 1
return 0 //not in range and not telekinetic
// Like view but bypasses luminosity check
/proc/hear(var/range, var/atom/source)
@@ -65,11 +51,6 @@
return heard
//We used to use linear regression to approximate the answer, but Mloc realized this was actually faster.
//And lo and behold, it is, and it's more accurate to boot.
/proc/cheap_hypotenuse(Ax,Ay,Bx,By)
return sqrt(abs(Ax - Bx)**2 + abs(Ay - By)**2) //A squared + B squared = C squared
/proc/circlerange(center=usr,radius=3)
var/turf/centerturf = get_turf(center)
@@ -233,53 +214,44 @@
. |= M // Since we're already looping through mobs, why bother using |= ? This only slows things down.
return .
#define SIGN(X) ((X<0)?-1:1)
proc
inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5)
var/turf/T
if(X1==X2)
if(Y1==Y2)
return 1 //Light cannot be blocked on same tile
else
var/s = SIGN(Y2-Y1)
Y1+=s
while(Y1!=Y2)
T=locate(X1,Y1,Z)
if(T.opacity)
return 0
Y1+=s
/proc/inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5)
var/turf/T
if(X1==X2)
if(Y1==Y2)
return 1 //Light cannot be blocked on same tile
else
var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1))
var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles
var/signX = SIGN(X2-X1)
var/signY = SIGN(Y2-Y1)
if(X1<X2)
b+=m
while(X1!=X2 || Y1!=Y2)
if(round(m*X1+b-Y1))
Y1+=signY //Line exits tile vertically
else
X1+=signX //Line exits tile horizontally
var/s = SIMPLE_SIGN(Y2-Y1)
Y1+=s
while(Y1!=Y2)
T=locate(X1,Y1,Z)
if(T.opacity)
return 0
return 1
#undef SIGN
Y1+=s
else
var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1))
var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles
var/signX = SIMPLE_SIGN(X2-X1)
var/signY = SIMPLE_SIGN(Y2-Y1)
if(X1<X2)
b+=m
while(X1!=X2 || Y1!=Y2)
if(round(m*X1+b-Y1))
Y1+=signY //Line exits tile vertically
else
X1+=signX //Line exits tile horizontally
T=locate(X1,Y1,Z)
if(T.opacity)
return 0
return 1
proc/isInSight(var/atom/A, var/atom/B)
/proc/isInSight(var/atom/A, var/atom/B)
var/turf/Aturf = get_turf(A)
var/turf/Bturf = get_turf(B)
if(!Aturf || !Bturf)
return 0
if(inLineOfSight(Aturf.x,Aturf.y, Bturf.x,Bturf.y,Aturf.z))
return 1
else
return 0
return inLineOfSight(Aturf.x, Aturf.y, Bturf.x, Bturf.y, Aturf.z)
/proc/get_cardinal_step_away(atom/start, atom/finish) //returns the position of a step from start away from finish, in one of the cardinal directions
//returns only NORTH, SOUTH, EAST, or WEST
-73
View File
@@ -3,70 +3,18 @@
var/const/E = 2.71828183
var/const/Sqrt2 = 1.41421356
// List of square roots for the numbers 1-100.
var/list/sqrtTable = list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10)
/proc/Atan2(x, y)
if(!x && !y) return 0
var/a = arccos(x / sqrt(x*x + y*y))
return y >= 0 ? a : -a
/proc/Ceiling(x)
return -round(-x)
//Replaced in /code/__DEFINES/math.dm because holy shit man a define is faster.
/*
/proc/Clamp(val, min, max)
return max(min, min(val, max))
*/
// cotangent
/proc/Cot(x)
return 1 / Tan(x)
// cosecant
/proc/Csc(x)
return 1 / sin(x)
/proc/Default(a, b)
return a ? a : b
/proc/Floor(x)
return round(x)
// Greatest Common Divisor - Euclid's algorithm
/proc/Gcd(a, b)
return b ? Gcd(b, a % b) : a
/proc/Inverse(x)
return 1 / x
/proc/IsAboutEqual(a, b, deviation = 0.1)
return abs(a - b) <= deviation
/proc/IsEven(x)
return x % 2 == 0
// Returns true if val is from min to max, inclusive.
/proc/IsInRange(val, min, max)
return min <= val && val <= max
/proc/IsInteger(x)
return Floor(x) == x
/proc/IsOdd(x)
return !IsEven(x)
/proc/IsMultiple(x, y)
return x % y == 0
// Least Common Multiple
/proc/Lcm(a, b)
return abs(a) / Gcd(a, b) * abs(b)
// Performs a linear interpolation between a and b.
// Note that amount=0 returns a, amount=1 returns b, and
// amount=0.5 returns the mean of a and b.
@@ -81,15 +29,6 @@ var/list/sqrtTable = list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,
sum += val
return sum / values
// Returns the nth root of x.
/proc/Root(n, x)
return x ** (1 / n)
// secant
/proc/Sec(x)
return 1 / cos(x)
// The quadratic formula. Returns a list with the solutions, or an empty list
// if they are imaginary.
/proc/SolveQuadratic(a, b, c)
@@ -103,18 +42,6 @@ var/list/sqrtTable = list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,
if(!d) return
. += (-b - root) / bottom
// tangent
/proc/Tan(x)
return sin(x) / cos(x)
/proc/ToDegrees(radians)
// 180 / Pi
return radians * 57.2957795
/proc/ToRadians(degrees)
// Pi / 180
return degrees * 0.0174532925
// Will filter out extra rotations and negative rotations
// E.g: 540 becomes 180. -180 becomes 180.
/proc/SimplifyDegrees(degrees)
+1 -1
View File
@@ -52,7 +52,7 @@ proc/random_hair_style(var/gender, species = "Human")
if(valid_hairstyles.len)
h_style = pick(valid_hairstyles)
return h_style
return h_style
proc/GetOppositeDir(var/dir)
switch(dir)
+8
View File
@@ -208,6 +208,14 @@ proc/checkhtml(var/t)
t = replacetext(t, char, repl_chars[char])
return t
//Strips the first char and returns it and the new string as a list
/proc/strip_first(t)
return list(copytext(t, 1, 2), copytext(t, 2, 0))
//Strips the last char and returns it and the new string as a list
/proc/strip_last(t)
return list(copytext(t, 1, length(t)), copytext(t, length(t)))
//Adds 'u' number of zeros ahead of the text 't'
/proc/add_zero(t, u)
while (length(t) < u)
+2 -5
View File
@@ -185,9 +185,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
/////////////////////////////////////////////////////////////////////////
/proc/sign(x)
return x!=0?x/abs(x):0
/proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm
var/px=M.x //starting x
var/py=M.y
@@ -196,8 +193,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/dy=N.y-py
var/dxabs=abs(dx)//Absolute value of x distance
var/dyabs=abs(dy)
var/sdx=sign(dx) //Sign of x distance (+ or -)
var/sdy=sign(dy)
var/sdx=SIGN(dx) //Sign of x distance (+ or -)
var/sdy=SIGN(dy)
var/x=dxabs>>1 //Counters for steps taken, setting to distance/2
var/y=dyabs>>1 //Bit-shifting makes me l33t. It also makes getline() unnessecarrily fast.
var/j //Generic integer for counting
+1
View File
@@ -30,3 +30,4 @@ var/global/list/beacons = list()
var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none.
var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
var/global/list/abductor_equipment = list() //list of all abductor equipment
var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels
+2 -1
View File
@@ -50,7 +50,8 @@
T.client.screen -= button
qdel(button)
button = null
T.actions.Remove(src)
if(T.actions)
T.actions.Remove(src)
T.update_action_buttons()
owner = null
return
@@ -355,16 +355,11 @@ var/global/datum/controller/processScheduler/processScheduler
/datum/controller/processScheduler/proc/updateTimeAllowance()
// Time allowance goes down linearly with world.cpu.
var/tmp/error = cpuAverage - 100
var/tmp/timeAllowanceDelta = sign(error) * -0.5 * world.tick_lag * max(0, 0.001 * abs(error))
var/tmp/timeAllowanceDelta = SIMPLE_SIGN(error) * -0.5 * world.tick_lag * max(0, 0.001 * abs(error))
//timeAllowance = world.tick_lag * min(1, 0.5 * ((200/max(1,cpuAverage)) - 1))
timeAllowance = min(timeAllowanceMax, max(0, timeAllowance + timeAllowanceDelta))
/datum/controller/processScheduler/proc/sign(var/x)
if (x == 0)
return 1
return x / abs(x)
/datum/controller/processScheduler/proc/statProcesses()
if(!isRunning)
stat("Processes", "Scheduler not running")
+4
View File
@@ -68,6 +68,8 @@
var/assistantlimit = 0 //enables assistant limiting
var/assistantratio = 2 //how many assistants to security members
var/traitor_objectives_amount = 2
var/max_maint_drones = 5 //This many drones can spawn,
var/allow_drone_spawn = 1 //assuming the admin allow them to.
var/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes.
@@ -598,6 +600,8 @@
config.limbs_can_break = value
if("shuttle_refuel_delay")
config.shuttle_refuel_delay = text2num(value)
if("traitor_objectives_amount")
config.traitor_objectives_amount = text2num(value)
if("reactionary_explosions")
config.reactionary_explosions = 1
if("bombcap")
+10 -9
View File
@@ -126,6 +126,7 @@
proc/get_id_photo(var/mob/living/carbon/human/H)
var/icon/preview_icon = null
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
var/g = "m"
if (H.gender == FEMALE)
@@ -170,32 +171,32 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
eyes_s.Blend(rgb(H.r_eyes, H.g_eyes, H.b_eyes), ICON_ADD)
face_s.Blend(eyes_s, ICON_OVERLAY)
var/datum/sprite_accessory/hair_style = hair_styles_list[H.h_style]
var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style]
if(hair_style)
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
// I'll want to make a species-specific proc for this sooner or later
// But this'll do for now
if(H.get_species() == "Slime People")
if(head_organ.species.name == "Slime People")
hair_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD)
else
hair_s.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD)
hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
face_s.Blend(hair_s, ICON_OVERLAY)
//Head Accessory
if(H.species.bodyflags & HAS_HEAD_ACCESSORY)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[H.ha_style]
if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[head_organ.ha_style]
if(head_accessory_style && head_accessory_style.species_allowed)
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
head_accessory_s.Blend(rgb(H.r_headacc, H.g_headacc, H.b_headacc), ICON_ADD)
head_accessory_s.Blend(rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc), ICON_ADD)
face_s.Blend(head_accessory_s, ICON_OVERLAY)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style]
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[head_organ.f_style]
if(facial_hair_style && facial_hair_style.species_allowed)
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(H.get_species() == "Slime People")
if(head_organ.species.name == "Slime People")
facial_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD)
else
facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD)
facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD)
face_s.Blend(facial_s, ICON_OVERLAY)
//Markings
+10 -9
View File
@@ -30,20 +30,21 @@ BONUS
var/mob/living/M = A.affected_mob
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
switch(A.stage)
if(1, 2)
to_chat(H, "<span class='warning'>Your chin itches.</span>")
if(H.f_style == "Shaved")
H.f_style = "Jensen Beard"
H.update_hair()
if(head_organ.f_style == "Shaved")
head_organ.f_style = "Jensen Beard"
H.update_fhair()
if(3, 4)
to_chat(H, "<span class='warning'>You feel tough.</span>")
if(!(H.f_style == "Dwarf Beard") && !(H.f_style == "Very Long Beard") && !(H.f_style == "Full Beard"))
H.f_style = "Full Beard"
H.update_hair()
if(!(head_organ.f_style == "Dwarf Beard") && !(head_organ.f_style == "Very Long Beard") && !(head_organ.f_style == "Full Beard"))
head_organ.f_style = "Full Beard"
H.update_fhair()
else
to_chat(H, "<span class='warning'>You feel manly!</span>")
if(!(H.f_style == "Dwarf Beard") && !(H.f_style == "Very Long Beard"))
H.f_style = pick("Dwarf Beard", "Very Long Beard")
H.update_hair()
if(!(head_organ.f_style == "Dwarf Beard") && !(head_organ.f_style == "Very Long Beard"))
head_organ.f_style = pick("Dwarf Beard", "Very Long Beard")
H.update_fhair()
return
@@ -31,7 +31,7 @@ Bonus
switch(A.stage)
if(2)
if(M.reagents.get_reagent_amount("oculine")<10)
M.reagents.add_reagent("oculine"=10)
M.reagents.add_reagent("oculine", 10)
to_chat(M, "<span class='notice'>Your hearing feels clearer and crisp.</span>")
if(3)
if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 )
@@ -31,18 +31,20 @@ BONUS
to_chat(M, "<span class='warning'>[pick("Your scalp itches.", "Your skin feels flakey.")]</span>")
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
switch(A.stage)
if(3, 4)
if(!(H.h_style == "Bald") && !(H.h_style == "Balding Hair"))
if(!(head_organ.h_style == "Bald") && !(head_organ.h_style == "Balding Hair"))
to_chat(H, "<span class='warning'>Your hair starts to fall out in clumps...</span>")
spawn(50)
H.h_style = "Balding Hair"
head_organ.h_style = "Balding Hair"
H.update_hair()
if(5)
if(!(H.f_style == "Shaved") || !(H.h_style == "Bald"))
if(!(head_organ.f_style == "Shaved") || !(head_organ.h_style == "Bald"))
to_chat(H, "<span class='warning'>Your hair starts to fall out in clumps...</span>")
spawn(50)
H.f_style = "Shaved"
H.h_style = "Bald"
head_organ.f_style = "Shaved"
head_organ.h_style = "Bald"
H.update_hair()
H.update_fhair()
return
+13 -1
View File
@@ -38,4 +38,16 @@
if(prob(50))
affected_mob.gib()
else
return
return
/datum/disease/gbs/curable
name = "Non-Contagious GBS"
stage_prob = 5
spread_text = "Non-Contagious"
spread_flags = SPECIAL
cure_text = "Cryoxadone"
cures = list("cryoxadone")
cure_chance = 10
agent = "gibbis"
spread_flags = NON_CONTAGIOUS
disease_flags = CURABLE
+51
View File
@@ -0,0 +1,51 @@
/datum/disease/kuru
name = "Space Kuru"
max_stages = 4
stage_prob = 5
spread_text = "Non-Contagious"
spread_flags = SPECIAL
cure_text = "Incurable"
agent = "Prions"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "Uncontrollable laughing."
severity = BIOHAZARD
spread_flags = NON_CONTAGIOUS
/datum/disease/kuru/stage_act()
..()
switch(stage)
if(1)
if(prob(50))
affected_mob.emote("laugh")
if(prob(50))
affected_mob.Jitter(25)
if(2)
if (prob(50))
affected_mob.visible_message("<span class='danger'>[affected_mob] laughs uncontrollably!</span>")
affected_mob.Stun(10)
affected_mob.Weaken(10)
affected_mob.Jitter(250)
affected_mob.drop_l_hand()
affected_mob.drop_r_hand()
if(3)
if(prob(25))
to_chat(affected_mob, "<span class='danger'>You feel like you are about to drop dead!</span>")
to_chat(affected_mob, "<span class='danger'>Your body convulses painfully!</span>")
affected_mob.drop_l_hand()
affected_mob.drop_r_hand()
affected_mob.adjustBruteLoss(5)
affected_mob.adjustOxyLoss(5)
affected_mob.Stun(10)
affected_mob.Weaken(10)
affected_mob.Jitter(250)
affected_mob.visible_message("<span class='danger'>[affected_mob] laughs uncontrollably!</span>")
if(4)
if(prob(25))
to_chat(affected_mob, "<span class='danger'>You feel like you are going to die!</span>")
affected_mob.adjustOxyLoss(75)
affected_mob.adjustBruteLoss(75)
affected_mob.drop_l_hand()
affected_mob.drop_r_hand()
affected_mob.Stun(10)
affected_mob.Weaken(10)
affected_mob.visible_message("<span class='danger'>[affected_mob] laughs uncontrollably!</span>")
+34
View File
@@ -0,0 +1,34 @@
/datum/disease/vampire
name = "Grave Fever"
max_stages = 3
stage_prob = 5
spread_text = "Non-Contagious"
spread_flags = SPECIAL
cure_text = "Antibiotics"
cures = list("spaceacillin")
agent = "Grave Dust"
cure_chance = 20
viable_mobtypes = list(/mob/living/carbon/human)
severity = DANGEROUS
disease_flags = CURABLE
spread_flags = NON_CONTAGIOUS
/datum/disease/vampire/stage_act()
..()
var/toxdamage = stage * 2
var/stuntime = stage * 2
if(prob(10))
affected_mob.emote(pick("cough","groan", "gasp"))
affected_mob.losebreath++
if(prob(15))
if(prob(33))
to_chat(affected_mob, "<span class='danger'>You feel sickly and weak.</span>")
affected_mob.slowed += 3
affected_mob.adjustToxLoss(toxdamage)
if(prob(5))
to_chat(affected_mob, "<span class='danger'>Your joints ache horribly!</span>")
affected_mob.Weaken(stuntime)
affected_mob.Stun(stuntime)
+2 -2
View File
@@ -485,13 +485,13 @@
if(!def_value)//If it's a custom objective, it will be an empty string.
def_value = "custom"
var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "blood", "debrain", "protect", "prevent", "harm", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "destroy", "maroon", "identity theft", "custom")
var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "blood", "debrain", "protect", "prevent", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "destroy", "maroon", "identity theft", "custom")
if (!new_obj_type) return
var/datum/objective/new_objective = null
switch (new_obj_type)
if ("assassinate","protect","debrain", "harm", "brig", "maroon")
if ("assassinate","protect","debrain", "brig", "maroon")
//To determine what to name the objective in explanation text.
var/objective_type_capital = uppertext(copytext(new_obj_type, 1,2))//Capitalize first letter.
var/objective_type_text = copytext(new_obj_type, 2)//Leave the rest of the text.
+37 -11
View File
@@ -54,8 +54,13 @@ var/list/uplink_items = list()
var/list/excludefrom = list() //Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something.
var/list/job = null
var/surplus = 100 //Chance of being included in the surplus crate (when pick() selects it)
var/hijack_only = 0 //can this item be purchased only during hijackings?
/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U)
if(hijack_only)
if(!(locate(/datum/objective/hijack) in usr.mind.objectives))
to_chat(usr, "<span class='warning'>The Syndicate lacks resources to provide you with this item.</span>")
return
if(item)
U.uses -= max(cost, 0)
U.used_TC += cost
@@ -89,15 +94,16 @@ var/list/uplink_items = list()
var/obj/I = spawn_item(get_turf(user), U)
if(ishuman(user))
var/mob/living/carbon/human/A = user
A.put_in_any_hand_if_possible(I)
if(I)
if(ishuman(user))
var/mob/living/carbon/human/A = user
A.put_in_any_hand_if_possible(I)
if(istype(I,/obj/item/weapon/storage/box/) && I.contents.len>0)
for(var/atom/o in I)
U.purchase_log += "<BIG>\icon[o]</BIG>"
else
U.purchase_log += "<BIG>\icon[I]</BIG>"
if(istype(I,/obj/item/weapon/storage/box/) && I.contents.len>0)
for(var/atom/o in I)
U.purchase_log += "<BIG>\icon[o]</BIG>"
else
U.purchase_log += "<BIG>\icon[I]</BIG>"
//U.interact(user)
return 1
@@ -174,6 +180,16 @@ var/list/uplink_items = list()
cost = 13
job = list("Chaplain")
/datum/uplink_item/jobspecific/artistic_toolbox
name = "Artistic Toolbox"
desc = "An accursed toolbox that grants its followers extreme power at the cost of requiring repeated sacrifices to it. If sacrifices are not provided, it will turn on its follower."
reference = "HGAT"
item = /obj/item/weapon/storage/toolbox/green/memetic
cost = 20
job = list("Chaplain")
surplus = 0 //No lucky chances from the crate; if you get this, this is ALL you're getting
hijack_only = 1 //This is a murderbone weapon, as such, it should only be available in those scenarios.
//Janitor
/datum/uplink_item/jobspecific/cautionsign
@@ -235,6 +251,16 @@ var/list/uplink_items = list()
cost = 5
job = list("Barber")
//Botanist
/datum/uplink_item/jobspecific/bee_briefcase
name = "Briefcase Full of Bees"
desc = "A seemingly innocent briefcase full of not-so-innocent Syndicate-bred bees. Inject the case with blood to train the bees to ignore the donor(s). It also wirelessly taps into station intercomms to broadcast a message of TERROR."
reference = "BEE"
item = /obj/item/weapon/bee_briefcase
cost = 10
job = list("Botanist")
//Engineer
/datum/uplink_item/jobspecific/powergloves
@@ -302,7 +328,7 @@ var/list/uplink_items = list()
reference = "TPB"
item = /obj/item/weapon/reagent_containers/glass/bottle/traitor
cost = 2
job = list("Scientist","Research Director","Chief Medical Officer","Medical Doctor","Psychiatrist","Chemist","Paramedic","Virologist","Bartender")
job = list("Research Director","Chief Medical Officer","Medical Doctor","Psychiatrist","Paramedic","Virologist","Bartender")
// DANGEROUS WEAPONS
@@ -618,7 +644,7 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_weapons/sleepy_pen
name = "Sleepy Pen"
desc = "A syringe disguised as a functional pen. It's filled with a potent anaesthetic. \The pen holds two doses of the mixture. The pen can be refilled."
desc = "A syringe disguised as a functional pen. It's filled with a potent anaesthetic. \ The pen holds two doses of the mixture. The pen can be refilled."
reference = "SP"
item = /obj/item/weapon/pen/sleepy
cost = 8
@@ -673,7 +699,7 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_weapons/dehy_carp
name = "Dehydrated Space Carp"
desc = "Just add water to make your very own hostile to everything space carp. It looks just like a plushie."
desc = "Just add water to make your very own hostile to everything space carp. It looks just like a plushie. The first person to squeeze it will be registered as its owner, who it will not attack. If no owner is registered, it'll just attack everyone."
reference = "DSC"
item = /obj/item/toy/carpplushie/dehy_carp
cost = 3
+1 -1
View File
@@ -157,7 +157,7 @@ Actual Adjacent procs :
for(var/dir in cardinal)
T = get_step(src,dir)
if(simulated_only && !istype(T))
if(!T || (simulated_only && !istype(T)))
continue
if(!T.density && !LinkBlockedWithAccess(T,caller, ID))
L.Add(T)
+1
View File
@@ -2327,6 +2327,7 @@ area/security/podbay
/area/awaymission
name = "\improper Strange Location"
icon_state = "away"
report_alerts = 0
/area/awaymission/example
name = "\improper Strange Station"
+19 -18
View File
@@ -133,19 +133,20 @@ var/global/list/bad_blocks[0]
ResetUI(1)
// Hair
// FIXME: Species-specific defaults pls
if(!character.h_style)
character.h_style = "Skinhead"
var/hair = hair_styles_list.Find(character.h_style)
var/obj/item/organ/external/head/H = character.get_organ("head")
if(!H.h_style)
H.h_style = "Skinhead"
var/hair = hair_styles_list.Find(H.h_style)
// Facial Hair
if(!character.f_style)
character.f_style = "Shaved"
var/beard = facial_hair_styles_list.Find(character.f_style)
if(!H.f_style)
H.f_style = "Shaved"
var/beard = facial_hair_styles_list.Find(H.f_style)
// Head Accessory
if(!character.ha_style)
character.ha_style = "None"
var/headacc = head_accessory_styles_list.Find(character.ha_style)
if(!H.ha_style)
H.ha_style = "None"
var/headacc = head_accessory_styles_list.Find(H.ha_style)
/*// Body Accessory
if(!character.body_accessory)
@@ -157,13 +158,13 @@ var/global/list/bad_blocks[0]
character.m_style = "None"
var/marks = marking_styles_list.Find(character.m_style)
SetUIValueRange(DNA_UI_HAIR_R, character.r_hair, 255, 1)
SetUIValueRange(DNA_UI_HAIR_G, character.g_hair, 255, 1)
SetUIValueRange(DNA_UI_HAIR_B, character.b_hair, 255, 1)
SetUIValueRange(DNA_UI_HAIR_R, H.r_hair, 255, 1)
SetUIValueRange(DNA_UI_HAIR_G, H.g_hair, 255, 1)
SetUIValueRange(DNA_UI_HAIR_B, H.b_hair, 255, 1)
SetUIValueRange(DNA_UI_BEARD_R, character.r_facial, 255, 1)
SetUIValueRange(DNA_UI_BEARD_G, character.g_facial, 255, 1)
SetUIValueRange(DNA_UI_BEARD_B, character.b_facial, 255, 1)
SetUIValueRange(DNA_UI_BEARD_R, H.r_facial, 255, 1)
SetUIValueRange(DNA_UI_BEARD_G, H.g_facial, 255, 1)
SetUIValueRange(DNA_UI_BEARD_B, H.b_facial, 255, 1)
SetUIValueRange(DNA_UI_EYES_R, character.r_eyes, 255, 1)
SetUIValueRange(DNA_UI_EYES_G, character.g_eyes, 255, 1)
@@ -173,9 +174,9 @@ var/global/list/bad_blocks[0]
SetUIValueRange(DNA_UI_SKIN_G, character.g_skin, 255, 1)
SetUIValueRange(DNA_UI_SKIN_B, character.b_skin, 255, 1)
SetUIValueRange(DNA_UI_HACC_R, character.r_headacc, 255, 1)
SetUIValueRange(DNA_UI_HACC_G, character.g_headacc, 255, 1)
SetUIValueRange(DNA_UI_HACC_B, character.b_headacc, 255, 1)
SetUIValueRange(DNA_UI_HACC_R, H.r_headacc, 255, 1)
SetUIValueRange(DNA_UI_HACC_G, H.g_headacc, 255, 1)
SetUIValueRange(DNA_UI_HACC_B, H.b_headacc, 255, 1)
SetUIValueRange(DNA_UI_MARK_R, character.r_markings, 255, 1)
SetUIValueRange(DNA_UI_MARK_G, character.g_markings, 255, 1)
+13 -12
View File
@@ -131,13 +131,14 @@
src.dna.UpdateUI()
dna.check_integrity()
var/mob/living/carbon/human/H = src
H.r_hair = dna.GetUIValueRange(DNA_UI_HAIR_R, 255)
H.g_hair = dna.GetUIValueRange(DNA_UI_HAIR_G, 255)
H.b_hair = dna.GetUIValueRange(DNA_UI_HAIR_B, 255)
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
head_organ.r_hair = dna.GetUIValueRange(DNA_UI_HAIR_R, 255)
head_organ.g_hair = dna.GetUIValueRange(DNA_UI_HAIR_G, 255)
head_organ.b_hair = dna.GetUIValueRange(DNA_UI_HAIR_B, 255)
H.r_facial = dna.GetUIValueRange(DNA_UI_BEARD_R, 255)
H.g_facial = dna.GetUIValueRange(DNA_UI_BEARD_G, 255)
H.b_facial = dna.GetUIValueRange(DNA_UI_BEARD_B, 255)
head_organ.r_facial = dna.GetUIValueRange(DNA_UI_BEARD_R, 255)
head_organ.g_facial = dna.GetUIValueRange(DNA_UI_BEARD_G, 255)
head_organ.b_facial = dna.GetUIValueRange(DNA_UI_BEARD_B, 255)
H.r_skin = dna.GetUIValueRange(DNA_UI_SKIN_R, 255)
H.g_skin = dna.GetUIValueRange(DNA_UI_SKIN_G, 255)
@@ -147,9 +148,9 @@
H.g_eyes = dna.GetUIValueRange(DNA_UI_EYES_G, 255)
H.b_eyes = dna.GetUIValueRange(DNA_UI_EYES_B, 255)
H.r_headacc = dna.GetUIValueRange(DNA_UI_HACC_R, 255)
H.g_headacc = dna.GetUIValueRange(DNA_UI_HACC_G, 255)
H.b_headacc = dna.GetUIValueRange(DNA_UI_HACC_B, 255)
head_organ.r_headacc = dna.GetUIValueRange(DNA_UI_HACC_R, 255)
head_organ.g_headacc = dna.GetUIValueRange(DNA_UI_HACC_G, 255)
head_organ.b_headacc = dna.GetUIValueRange(DNA_UI_HACC_B, 255)
H.r_markings = dna.GetUIValueRange(DNA_UI_MARK_R, 255)
H.g_markings = dna.GetUIValueRange(DNA_UI_MARK_G, 255)
@@ -168,17 +169,17 @@
//Hair
var/hair = dna.GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_list.len)
if((0 < hair) && (hair <= hair_styles_list.len))
H.h_style = hair_styles_list[hair]
head_organ.h_style = hair_styles_list[hair]
//Facial Hair
var/beard = dna.GetUIValueRange(DNA_UI_BEARD_STYLE,facial_hair_styles_list.len)
if((0 < beard) && (beard <= facial_hair_styles_list.len))
H.f_style = facial_hair_styles_list[beard]
head_organ.f_style = facial_hair_styles_list[beard]
//Head Accessories
var/headacc = dna.GetUIValueRange(DNA_UI_HACC_STYLE,head_accessory_styles_list.len)
if((0 < headacc) && (headacc <= head_accessory_styles_list.len))
H.ha_style = head_accessory_styles_list[headacc]
head_organ.ha_style = head_accessory_styles_list[headacc]
//Markings
var/marks = dna.GetUIValueRange(DNA_UI_MARK_STYLE,marking_styles_list.len)
+2 -2
View File
@@ -144,8 +144,8 @@
/datum/dna/gene/basic/tk
name="Telekenesis"
activation_messages=list("You feel smarter.")
deactivation_messages=("You feel dumber.")
activation_messages = list("You feel smarter.")
deactivation_messages = list("You feel dumber.")
mutation=TK
activation_prob=10
+87 -56
View File
@@ -37,61 +37,7 @@
to_chat(usr, "\red You can't change your appearance right now!")
return
var/mob/living/carbon/human/M=usr
var/new_facial = input("Please select facial hair color.", "Character Generation",rgb(M.r_facial,M.g_facial,M.b_facial)) as null|color
if(new_facial)
M.r_facial = hex2num(copytext(new_facial, 2, 4))
M.g_facial = hex2num(copytext(new_facial, 4, 6))
M.b_facial = hex2num(copytext(new_facial, 6, 8))
var/new_hair = input("Please select hair color.", "Character Generation",rgb(M.r_hair,M.g_hair,M.b_hair)) as null|color
if(new_facial)
M.r_hair = hex2num(copytext(new_hair, 2, 4))
M.g_hair = hex2num(copytext(new_hair, 4, 6))
M.b_hair = hex2num(copytext(new_hair, 6, 8))
var/new_eyes = input("Please select eye color.", "Character Generation",rgb(M.r_eyes,M.g_eyes,M.b_eyes)) as null|color
if(new_eyes)
M.r_eyes = hex2num(copytext(new_eyes, 2, 4))
M.g_eyes = hex2num(copytext(new_eyes, 4, 6))
M.b_eyes = hex2num(copytext(new_eyes, 6, 8))
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", "[35-M.s_tone]") as null|text
if (!new_tone)
new_tone = 35
M.s_tone = max(min(round(text2num(new_tone)), 220), 1)
M.s_tone = -M.s_tone + 35
// hair
var/list/all_hairs = subtypesof(/datum/sprite_accessory/hair)
var/list/hairs = list()
// loop through potential hairs
for(var/x in all_hairs)
var/datum/sprite_accessory/hair/H = new x // create new hair datum based on type x
hairs.Add(H.name) // add hair name to hairs
qdel(H) // delete the hair after it's all done
var/new_style = input("Please select hair style", "Character Generation",M.h_style) as null|anything in hairs
// if new style selected (not cancel)
if (new_style)
M.h_style = new_style
// facial hair
var/list/all_fhairs = subtypesof(/datum/sprite_accessory/facial_hair)
var/list/fhairs = list()
for(var/x in all_fhairs)
var/datum/sprite_accessory/facial_hair/H = new x
fhairs.Add(H.name)
qdel(H)
new_style = input("Please select facial style", "Character Generation",M.f_style) as null|anything in fhairs
if(new_style)
M.f_style = new_style
var/obj/item/organ/external/head/head_organ = M.get_organ("head")
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
if (new_gender)
@@ -99,8 +45,93 @@
M.change_gender(MALE)
else
M.change_gender(FEMALE)
var/new_eyes = input("Please select eye color.", "Character Generation", rgb(M.r_eyes,M.g_eyes,M.b_eyes)) as null|color
if(new_eyes)
M.r_eyes = hex2num(copytext(new_eyes, 2, 4))
M.g_eyes = hex2num(copytext(new_eyes, 4, 6))
M.b_eyes = hex2num(copytext(new_eyes, 6, 8))
M.change_eye_color(M.r_eyes, M.g_eyes, M.b_eyes)
// hair
var/list/valid_hairstyles = M.generate_valid_hairstyles()
var/new_style = input("Please select hair style", "Character Generation", head_organ.h_style) as null|anything in valid_hairstyles
// if new style selected (not cancel)
if (new_style)
head_organ.h_style = new_style
var/new_hair = input("Please select hair color.", "Character Generation", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as null|color
if(new_hair)
head_organ.r_hair = hex2num(copytext(new_hair, 2, 4))
head_organ.g_hair = hex2num(copytext(new_hair, 4, 6))
head_organ.b_hair = hex2num(copytext(new_hair, 6, 8))
// facial hair
var/list/valid_facial_hairstyles = M.generate_valid_facial_hairstyles()
new_style = input("Please select facial style", "Character Generation", head_organ.f_style) as null|anything in valid_facial_hairstyles
if(new_style)
head_organ.f_style = new_style
var/new_facial = input("Please select facial hair color.", "Character Generation", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as null|color
if(new_facial)
head_organ.r_facial = hex2num(copytext(new_facial, 2, 4))
head_organ.g_facial = hex2num(copytext(new_facial, 4, 6))
head_organ.b_facial = hex2num(copytext(new_facial, 6, 8))
//Head accessory.
if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
var/list/valid_head_accessories = M.generate_valid_head_accessories()
var/new_head_accessory = input("Please select head accessory style", "Character Generation", head_organ.ha_style) as null|anything in valid_head_accessories
if(new_head_accessory)
head_organ.ha_style = new_head_accessory
var/new_head_accessory_colour = input("Please select head accessory colour.", "Character Generation", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as null|color
if(new_head_accessory_colour)
head_organ.r_headacc = hex2num(copytext(new_head_accessory_colour, 2, 4))
head_organ.g_headacc = hex2num(copytext(new_head_accessory_colour, 4, 6))
head_organ.b_headacc = hex2num(copytext(new_head_accessory_colour, 6, 8))
//Body markings.
if(M.species.bodyflags & HAS_MARKINGS)
var/list/valid_markings = M.generate_valid_markings()
var/new_marking = input("Please select marking style", "Character Generation", M.m_style) as null|anything in valid_markings
if(new_marking)
M.m_style = new_marking
var/new_marking_colour = input("Please select marking colour.", "Character Generation", rgb(M.r_markings, M.g_markings, M.b_markings)) as null|color
if(new_marking_colour)
M.r_markings = hex2num(copytext(new_marking_colour, 2, 4))
M.g_markings = hex2num(copytext(new_marking_colour, 4, 6))
M.b_markings = hex2num(copytext(new_marking_colour, 6, 8))
//Body accessory.
if(M.species.tail && M.species.bodyflags & HAS_TAIL)
var/list/valid_body_accessories = M.generate_valid_body_accessories()
if(valid_body_accessories.len > 1) //By default valid_body_accessories will always have at the very least a 'none' entry populating the list, even if the user's species is not present in any of the list items.
var/new_body_accessory = input("Please select body accessory style", "Character Generation", M.body_accessory) as null|anything in valid_body_accessories
if(new_body_accessory)
M.body_accessory = body_accessory_by_name[new_body_accessory]
//Skin tone.
if(M.species.bodyflags & HAS_SKIN_TONE)
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", "[M.s_tone]") as null|text
if (!new_tone)
new_tone = 35
M.s_tone = 35 - max(min(round(text2num(new_tone)), 220), 1)
//Skin colour.
if(M.species.bodyflags & HAS_SKIN_COLOR)
var/new_body_colour = input("Please select body colour.", "Character Generation", rgb(M.r_skin, M.g_skin, M.b_skin)) as null|color
if(new_body_colour)
M.r_skin = hex2num(copytext(new_body_colour, 2, 4))
M.g_skin = hex2num(copytext(new_body_colour, 4, 6))
M.b_skin = hex2num(copytext(new_body_colour, 6, 8))
M.force_update_limbs()
M.regenerate_icons()
M.check_dna()
M.update_dna()
M.visible_message("\blue \The [src] morphs and changes [M.get_visible_gender() == MALE ? "his" : M.get_visible_gender() == FEMALE ? "her" : "their"] appearance!", "\blue You change your appearance!", "\red Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")
+2 -1
View File
@@ -68,6 +68,7 @@
..()
/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(var/mob/living/carbon/human/H)
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
is_zombie = 1
if(H.wear_suit)
var/obj/item/clothing/suit/armor/A = H.wear_suit
@@ -82,7 +83,7 @@
icon = H.icon
speak_emote = list("groans")
icon_state = "zombie2_s"
H.h_style = null
head_organ.h_style = null
H.update_hair()
human_overlays = H.overlays
update_icons()
+3 -2
View File
@@ -94,6 +94,7 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
var/mob/living/carbon/human/vox = newraider.current
var/obj/item/organ/external/head/head_organ = vox.get_organ("head")
vox.real_name = capitalize(newname)
vox.name = vox.real_name
@@ -105,8 +106,8 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
vox.add_language("Vox-pidgin")
vox.add_language("Galactic Common")
vox.add_language("Tradeband")
vox.h_style = "Short Vox Quills"
vox.f_style = "Shaved"
head_organ.h_style = "Short Vox Quills"
head_organ.f_style = "Shaved"
for(var/obj/item/organ/external/limb in vox.organs)
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
@@ -43,12 +43,28 @@
experimentUI(user)
/obj/machinery/abductor/experiment/proc/dissection_icon(mob/living/carbon/human/H)
var/icon/I = icon(H.stand_icon)
var/icon/splat = icon(H.species.damage_overlays, "30")
splat.Blend(icon(H.species.damage_mask, "torso"), ICON_MULTIPLY)
splat.Blend(H.species.blood_color, ICON_MULTIPLY)
I.Blend(splat, ICON_OVERLAY)
return I
/obj/machinery/abductor/experiment/proc/experimentUI(mob/user)
var/dat
dat += "<h3> Experiment </h3>"
if(occupant)
dat += "<table><tr><td>"
dat += "</td><td>"
var/icon/H = icon(dissection_icon(occupant), dir = SOUTH)
if(H)
user << browse_rsc(H, "dissection_img.png")
dat += "<table><tr><td>"
dat += "<img src='dissection_img.png' height='80' width='80'>"
dat += "</td><td>"
else
dat += "ERR: Unable to retrieve image data for occupant."
dat += "<a href='?src=\ref[src];experiment=1'>Probe</a><br>"
dat += "<a href='?src=\ref[src];experiment=2'>Dissect</a><br>"
dat += "<a href='?src=\ref[src];experiment=3'>Analyze</a><br>"
@@ -80,6 +80,7 @@
density = 0
pass_flags = PASSTABLE
ventcrawler = 2
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
var/talk_inside_host = 0 // So that borers don't accidentally give themselves away on a botched message
var/used_dominate
@@ -97,8 +97,7 @@
/mob/living/simple_animal/hostile/swarmer/emp_act()
if(health > 1)
health = 1
return
adjustHealth(health-1)
else
death()
@@ -156,30 +155,17 @@
S.DisIntegrate(src)
toggle_cam(S, 0)
/obj/machinery/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
/obj/structure/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>")
/obj/structure/particle_accelerator/fuel_chamber/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
/obj/machinery/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) // Since the console is still parented to this
to_chat(S, "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>")
/obj/structure/particle_accelerator/particle_emitter/center/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>")
/obj/structure/particle_accelerator/particle_emitter/left/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>")
/obj/structure/particle_accelerator/particle_emitter/right/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>")
/obj/structure/particle_accelerator/particle_emitter/end_cap/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>")
/obj/structure/particle_accelerator/particle_emitter/power_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>")
/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
if(!active)
S.DisIntegrate(src)
return
to_chat(S, "<span class='warning'>An inhospitable area may be created as a result of destroying this object. Aborting.</span>")
/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisIntegrate(src)
@@ -234,7 +220,7 @@
/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
for(var/turf/T in range(1, src))
if(istype(T, /turf/space) || istype(T.loc, /area/space))
if(istype(T, /turf/space) || istype(T.loc, /area/space) || istype(T, /turf/simulated/floor/plating/airless))
to_chat(S, "<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>")
return
..()
@@ -515,7 +501,7 @@
return
to_chat(src, "<span class='info'>Attempting to repair damage to our body, stand by...</span>")
if(do_mob(src, src, 100))
adjustBruteLoss(-100)
adjustHealth(-100)
to_chat(src, "<span class='info'>We successfully repaired ourselves.</span>")
/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight()
@@ -86,7 +86,7 @@
hud_used.guardianhealthdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#efeeef'>[resulthealth]%</font></div>"
/mob/living/simple_animal/hostile/guardian/adjustBruteLoss(amount) //The spirit is invincible, but passes on damage to the summoner
/mob/living/simple_animal/hostile/guardian/adjustHealth(amount) //The spirit is invincible, but passes on damage to the summoner
var/damage = amount * damage_transfer
if (summoner)
if(loc == summoner)
@@ -162,7 +162,7 @@
if(L.stat == DEAD)
if(do_after(src, 30, target = L))
if(eat(L))
heal_overall_damage(50,50)
adjustHealth(-50)
return
else if(istype(target,/obj/item)) // Eat items just to be annoying
var/obj/item/I = target
@@ -81,7 +81,7 @@
/mob/living/simple_animal/revenant/narsie_act()
return //most humans will now be either bones or harvesters, but we're still un-alive.
/mob/living/simple_animal/revenant/adjustBruteLoss(amount)
/mob/living/simple_animal/revenant/adjustHealth(amount)
if(!revealed)
return
essence = max(0, essence-amount)
+10 -8
View File
@@ -133,6 +133,8 @@ proc/issyndicate(mob/living/M as mob)
/datum/game_mode/proc/create_syndicate(var/datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human
var/mob/living/carbon/human/M = synd_mind.current
var/obj/item/organ/external/head/head_organ = M.get_organ("head")
M.set_species("Human",1)
M.dna.ready_dna(M) // Quadriplegic Nuke Ops won't be participating in the paralympics
@@ -149,18 +151,18 @@ proc/issyndicate(mob/living/M as mob)
if(prob(5))
facial_hair_style = pick(facial_hair_styles_list)
M.r_facial = hex2num(copytext(hair_c, 2, 4))
M.g_facial = hex2num(copytext(hair_c, 4, 6))
M.b_facial = hex2num(copytext(hair_c, 6, 8))
M.r_hair = hex2num(copytext(hair_c, 2, 4))
M.g_hair = hex2num(copytext(hair_c, 4, 6))
M.b_hair = hex2num(copytext(hair_c, 6, 8))
head_organ.r_facial = hex2num(copytext(hair_c, 2, 4))
head_organ.g_facial = hex2num(copytext(hair_c, 4, 6))
head_organ.b_facial = hex2num(copytext(hair_c, 6, 8))
head_organ.r_hair = hex2num(copytext(hair_c, 2, 4))
head_organ.g_hair = hex2num(copytext(hair_c, 4, 6))
head_organ.b_hair = hex2num(copytext(hair_c, 6, 8))
M.r_eyes = hex2num(copytext(eye_c, 2, 4))
M.g_eyes = hex2num(copytext(eye_c, 4, 6))
M.b_eyes = hex2num(copytext(eye_c, 6, 8))
M.s_tone = skin_tone
M.h_style = hair_style
M.f_style = facial_hair_style
head_organ.h_style = hair_style
head_organ.f_style = facial_hair_style
M.body_accessory = null
/datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code)
+47 -269
View File
@@ -8,12 +8,13 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \
- /datum/theft_objective/number/special \
- /datum/theft_objective/number/coins
datum/objective
/datum/objective
var/datum/mind/owner = null //Who owns the objective.
var/explanation_text = "Nothing" //What that person is supposed to do.
var/datum/mind/target = null //If they are focused on a particular person.
var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter.
var/completed = 0 //currently only used for custom objectives.
var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead.
New(var/text)
all_objectives |= src
@@ -53,7 +54,9 @@ datum/objective
target = pick(possible_targets)
datum/objective/assassinate
/datum/objective/assassinate
martyr_compatible = 1
find_target()
..()
if(target && target.current)
@@ -81,7 +84,9 @@ datum/objective/assassinate
datum/objective/mutiny
/datum/objective/mutiny
martyr_compatible = 1
find_target()
..()
if(target && target.current)
@@ -109,7 +114,7 @@ datum/objective/mutiny
return 0
return 1
datum/objective/mutiny/rp
/datum/objective/mutiny/rp
find_target()
..()
if(target && target.current)
@@ -144,97 +149,9 @@ datum/objective/mutiny/rp
return 0
return rval
datum/objective/anti_revolution/execute
find_target()
..()
if(target && target.current)
explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute \him[target.current]."
else
explanation_text = "Free Objective"
return target
/datum/objective/maroon
martyr_compatible = 1
find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has extracted confidential information above their clearance. Execute \him[target.current]."
else
explanation_text = "Free Objective"
return target
check_completion()
if(target && target.current)
if(target.current.stat == DEAD || !ishuman(target.current))
return 1
return 0
return 1
datum/objective/anti_revolution/brig
var/already_completed = 0
find_target()
..()
if(target && target.current)
explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example."
else
explanation_text = "Free Objective"
return target
find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Brig [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] for 20 minutes to set an example."
else
explanation_text = "Free Objective"
return target
check_completion()
if(already_completed)
return 1
if(target && target.current)
if(target.current.stat == DEAD)
return 0
if(target.is_brigged(10 * 60 * 10))
already_completed = 1
return 1
return 0
return 0
datum/objective/anti_revolution/demote
find_target()
..()
if(target && target.current)
explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to Nanotrasen's goals. Demote \him[target.current] to assistant."
else
explanation_text = "Free Objective"
return target
find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to Nanotrasen's goals. Demote \him[target.current] to assistant."
else
explanation_text = "Free Objective"
return target
check_completion()
if(target && target.current && istype(target,/mob/living/carbon/human))
var/obj/item/weapon/card/id/I = target.current:wear_id
if(istype(I, /obj/item/device/pda))
var/obj/item/device/pda/P = I
I = P.id
if(!istype(I)) return 1
if(I.assignment == "Civilian")
return 1
else
return 0
return 1
datum/objective/maroon
find_target()
..()
if(target && target.current)
@@ -259,7 +176,9 @@ datum/objective/maroon
return 0
return 1
datum/objective/debrain//I want braaaainssss
/datum/objective/debrain //I want braaaainssss
martyr_compatible = 0
find_target()
..()
if(target && target.current)
@@ -292,7 +211,9 @@ datum/objective/debrain//I want braaaainssss
return 0
datum/objective/protect//The opposite of killing a dude.
/datum/objective/protect //The opposite of killing a dude.
martyr_compatible = 1
find_target()
..()
if(target && target.current)
@@ -327,7 +248,8 @@ datum/objective/protect//The opposite of killing a dude.
return 0
datum/objective/hijack
/datum/objective/hijack
martyr_compatible = 0 //Technically you won't get both anyway.
explanation_text = "Hijack the shuttle to ensure no loyalist Nanotrasen crew escape alive."
check_completion()
@@ -358,6 +280,7 @@ datum/objective/hijack
/datum/objective/hijackclone
explanation_text = "Hijack the emergency shuttle by ensuring only you (or your copies) escape."
martyr_compatible = 0
check_completion()
if(!owner.current)
@@ -386,8 +309,9 @@ datum/objective/hijack
return 1
return 0
datum/objective/block
/datum/objective/block
explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive."
martyr_compatible = 1
check_completion()
if(!istype(owner.current, /mob/living/silicon))
@@ -410,9 +334,7 @@ datum/objective/block
return 1
datum/objective/escape
/datum/objective/escape
explanation_text = "Escape on the shuttle or an escape pod alive and free."
var/escape_areas = list(/area/shuttle/escape,
/area/shuttle/escape_pod1/centcom,
@@ -447,7 +369,7 @@ datum/objective/escape
return 0
datum/objective/escape/escape_with_identity
/datum/objective/escape/escape_with_identity
var/target_real_name // Has to be stored because the target's real_name can change over the course of the round
find_target()
@@ -477,7 +399,7 @@ datum/objective/escape/escape_with_identity
return 1
return 0
datum/objective/die
/datum/objective/die
explanation_text = "Die a glorious death."
check_completion()
@@ -489,7 +411,7 @@ datum/objective/die
datum/objective/survive
/datum/objective/survive
explanation_text = "Stay alive until the end."
check_completion()
@@ -499,98 +421,15 @@ datum/objective/survive
return 0
return 1
// Similar to the anti-rev objective, but for traitors
datum/objective/brig
var/already_completed = 0
find_target()
..()
if(target && target.current)
explanation_text = "Have [target.current.real_name], the [target.assigned_role] brigged for 10 minutes."
else
explanation_text = "Free Objective"
return target
find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Have [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] brigged for 10 minutes."
else
explanation_text = "Free Objective"
return target
check_completion()
if(already_completed)
return 1
if(target && target.current)
if(target.current.stat == DEAD)
return 0
// Make the actual required time a bit shorter than the official time
if(target.is_brigged(10 * 60 * 5))
already_completed = 1
return 1
return 0
return 0
// Harm a crew member, making an example of them
datum/objective/harm
var/already_completed = 0
find_target()
..()
if(target && target.current)
explanation_text = "Make an example of [target.current.real_name], the [target.assigned_role]. Break one of their bones, detach one of their limbs or disfigure their face. Make sure they're alive when you do it."
else
explanation_text = "Free Objective"
return target
find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Make an example of [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]. Break one of their bones, detach one of their limbs or disfigure their face. Make sure they're alive when you do it."
else
explanation_text = "Free Objective"
return target
check_completion()
if(already_completed)
return 1
if(target && target.current && istype(target.current, /mob/living/carbon/human))
if(target.current.stat == DEAD)
return 0
var/mob/living/carbon/human/H = target.current
for(var/obj/item/organ/external/E in H.organs)
if(E.status & ORGAN_BROKEN)
return 1
for(var/limb_tag in H.species.has_limbs) //todo check prefs for robotic limbs and amputations.
var/list/organ_data = H.species.has_limbs[limb_tag]
var/limb_type = organ_data["path"]
var/found
for(var/obj/item/organ/external/E in H.organs)
if(limb_type == E.type)
found = 1
break
if(!found)
return 1
var/obj/item/organ/external/head/head = H.get_organ("head")
if(head.disfigured)
return 1
return 0
datum/objective/nuclear
/datum/objective/nuclear
explanation_text = "Destroy the station with a nuclear device."
martyr_compatible = 1
datum/objective/steal
/datum/objective/steal
var/datum/theft_objective/steal_target
martyr_compatible = 0
find_target(var/special_only=0)
var/loop=50
@@ -638,7 +477,8 @@ datum/objective/steal
if(!steal_target) return 1 // Free Objective
return steal_target.check_completion(owner)
datum/objective/steal/exchange
/datum/objective/steal/exchange
martyr_compatible = 0
proc/set_faction(var/faction,var/otheragent)
target = otheragent
@@ -650,7 +490,7 @@ datum/objective/steal/exchange
explanation_text = "Acquire [targetinfo.name] held by [target.current.real_name], the [target.assigned_role] and syndicate agent"
steal_target = targetinfo
datum/objective/steal/exchange/backstab
/datum/objective/steal/exchange/backstab
set_faction(var/faction)
var/datum/theft_objective/unique/targetinfo
@@ -661,7 +501,7 @@ datum/objective/steal/exchange/backstab
explanation_text = "Do not give up or lose [targetinfo.name]."
steal_target = targetinfo
datum/objective/download
/datum/objective/download
proc/gen_amount_goal()
target_amount = rand(10,20)
explanation_text = "Download [target_amount] research levels."
@@ -673,7 +513,7 @@ datum/objective/download
datum/objective/capture
/datum/objective/capture
proc/gen_amount_goal()
target_amount = rand(5,10)
explanation_text = "Accumulate [target_amount] capture points."
@@ -686,7 +526,7 @@ datum/objective/capture
datum/objective/absorb
/datum/objective/absorb
proc/gen_amount_goal(var/lowbound = 4, var/highbound = 6)
target_amount = rand (lowbound,highbound)
if (ticker)
@@ -714,8 +554,10 @@ datum/objective/absorb
else
return 0
datum/objective/destroy
/datum/objective/destroy
martyr_compatible = 1
var/target_real_name
find_target()
var/list/possible_targets = active_ais(1)
var/mob/living/silicon/ai/target_ai = pick(possible_targets)
@@ -734,71 +576,7 @@ datum/objective/destroy
return 0
return 1
/* Isn't suited for global objectives
/*---------CULTIST----------*/
eldergod
explanation_text = "Summon Nar-Sie via the use of an appropriate rune. It will only work if nine cultists stand on and around it."
check_completion()
if(!eldergod) //global var, defined in rune4.dm
return 1
return 0
survivecult
var/num_cult
var/cult_needed = 4 + round((num_players_started() / 10))
explanation_text = "Our knowledge must live on. Make sure at least [cult_needed] acolytes escape on the shuttle to spread their work on an another station."
check_completion()
if(!emergency_shuttle.returned())
return 0
var/cultists_escaped = 0
var/area/shuttle/escape/centcom/C = /area/shuttle/escape/centcom
for(var/turf/T in get_area_turfs(C.type))
for(var/mob/living/carbon/H in T)
if(iscultist(H))
cultists_escaped++
if(cultists_escaped >= cult_needed)
return 1
return 0
sacrifice //stolen from traitor target objective
proc/find_target() //I don't know how to make it work with the rune otherwise, so I'll do it via a global var, sacrifice_target, defined in rune15.dm
var/datum/game_mode/cult/C = ticker.mode
var/list/possible_targets = C.get_unconvertables()
if(!possible_targets.len)
for(var/mob/living/carbon/human/player in player_list)
if(player.mind && !(player.mind in cult))
possible_targets += player.mind
if(possible_targets.len > 0)
sacrifice_target = pick(possible_targets)
if(sacrifice_target && sacrifice_target.current)
explanation_text = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune (hell join blood) and three acolytes to do so."
else
explanation_text = "Free Objective"
return sacrifice_target
check_completion() //again, calling on a global list defined in rune15.dm
if(sacrifice_target in sacrificed)
return 1
else
return 0
/*-------ENDOF CULTIST------*/
*/
datum/objective/blood
/datum/objective/blood
proc/gen_amount_goal(low = 150, high = 400)
target_amount = rand(low,high)
target_amount = round(round(target_amount/5)*5)
@@ -812,7 +590,7 @@ datum/objective/blood
return 0
// /vg/; Vox Inviolate for humans :V
datum/objective/minimize_casualties
/datum/objective/minimize_casualties
explanation_text = "Minimise casualties."
check_completion()
if(owner.kills.len>5) return 0
@@ -820,11 +598,11 @@ datum/objective/minimize_casualties
//Vox heist objectives.
datum/objective/heist
/datum/objective/heist
proc/choose_target()
return
datum/objective/heist/kidnap
/datum/objective/heist/kidnap
choose_target()
var/list/roles = list("Chief Engineer","Research Director","Roboticist","Chemist","Station Engineer")
var/list/possible_targets = list()
@@ -866,7 +644,7 @@ datum/objective/heist/kidnap
else
return 0
datum/objective/heist/loot
/datum/objective/heist/loot
choose_target()
var/loot = "an object"
switch(rand(1,8))
@@ -937,7 +715,7 @@ datum/objective/heist/loot
return 0
datum/objective/heist/salvage
/datum/objective/heist/salvage
choose_target()
switch(rand(1,8))
if(1)
@@ -1009,7 +787,7 @@ datum/objective/heist/salvage
return 0
datum/objective/heist/inviolate_crew
/datum/objective/heist/inviolate_crew
explanation_text = "Do not leave any Vox behind, alive or dead."
check_completion()
@@ -1022,7 +800,7 @@ datum/objective/heist/inviolate_crew
//Would be nice to use vox-specific kills but is currently not feasible.
var/global/vox_kills = 0 //Used to check the Inviolate.
datum/objective/heist/inviolate_death
/datum/objective/heist/inviolate_death
explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
check_completion()
if(vox_kills > MAX_VOX_KILLS) return 0
+1 -1
View File
@@ -301,7 +301,7 @@ Made by Xhuis
blood_color = "#555555"
flesh_color = "#222222"
flags = NO_BLOOD | NO_BREATHE | RADIMMUNE
flags = NO_BLOOD | NO_BREATHE | RADIMMUNE | NOGUNS //Can't use guns due to muzzle flash
burn_mod = 1.5 //1.5x burn damage, 2x is excessive
hot_env_multiplier = 1.5
+85 -79
View File
@@ -74,101 +74,107 @@
..()
/datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor)
/datum/game_mode/proc/forge_traitor_objectives(datum/mind/traitor)
if(istype(traitor.current, /mob/living/silicon))
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
var/objective_count = 0
if(prob(30))
var/special_pick = rand(1,2)
switch(special_pick)
if(1)
var/datum/objective/block/block_objective = new
block_objective.owner = traitor
traitor.objectives += block_objective
objective_count++
if(2) //Protect and strand a target
var/datum/objective/protect/yandere_one = new
yandere_one.owner = traitor
traitor.objectives += yandere_one
yandere_one.find_target()
objective_count++
var/datum/objective/maroon/yandere_two = new
yandere_two.owner = traitor
yandere_two.target = yandere_one.target
traitor.objectives += yandere_two
objective_count++
for(var/i = objective_count, i < config.traitor_objectives_amount, i++)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
var/datum/objective/survive/survive_objective = new
survive_objective.owner = traitor
traitor.objectives += survive_objective
if(prob(10))
var/datum/objective/block/block_objective = new
block_objective.owner = traitor
traitor.objectives += block_objective
else
if(!exchange_blue && traitors.len >= 5 && name != "AutoTraitor") //Set up an exchange if there are enough traitors, turned off during autotraitor temporarily due to bugs.
var/is_hijacker = prob(10)
var/martyr_chance = prob(20)
var/objective_count = is_hijacker //Hijacking counts towards number of objectives
if(!exchange_blue && traitors.len >= 8) //Set up an exchange if there are enough traitors
if(!exchange_red)
exchange_red = traitor
else
exchange_blue = traitor
assign_exchange_role(exchange_red)
assign_exchange_role(exchange_blue)
else
var/list/active_ais = active_ais()
if(active_ais.len && prob(4)) // Leaving this at a flat chance for now, problems with the num_players() proc due to latejoin antags.
var/datum/objective/destroy/destroy_objective = new
destroy_objective.owner = traitor
destroy_objective.find_target()
traitor.objectives += destroy_objective
else
switch(rand(1,100))
if(1 to 30)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
if(31 to 40)
var/datum/objective/debrain/debrain_objective = new
debrain_objective.owner = traitor
debrain_objective.find_target()
traitor.objectives += debrain_objective
if(41 to 50)
var/datum/objective/protect/protect_objective = new
protect_objective.owner = traitor
protect_objective.find_target_with_special_role(null,0)
if (!protect_objective.target)
protect_objective.find_target() //We could not find any traitors, protect somebody
traitor.objectives += protect_objective
if(51 to 61)
var/datum/objective/harm/harm_objective = new
harm_objective.owner = traitor
harm_objective.find_target()
traitor.objectives += harm_objective
else
var/datum/objective/steal/steal_objective = new
steal_objective.owner = traitor
steal_objective.find_target()
traitor.objectives += steal_objective
switch(rand(1,100))
if(1 to 30) // Die glorious death
if (!(locate(/datum/objective/die) in traitor.objectives) && !(locate(/datum/objective/steal) in traitor.objectives) && !(locate(/datum/objective/steal/exchange) in traitor.objectives) && !(locate(/datum/objective/steal/exchange/backstab) in traitor.objectives))
var/datum/objective/die/die_objective = new
die_objective.owner = traitor
traitor.objectives += die_objective
objective_count += 1 //Exchange counts towards number of objectives
var/list/active_ais = active_ais()
for(var/i = objective_count, i < config.traitor_objectives_amount, i++)
if(prob(50))
if(active_ais.len && prob(100/player_list.len))
var/datum/objective/destroy/destroy_objective = new
destroy_objective.owner = traitor
destroy_objective.find_target()
traitor.objectives += destroy_objective
else if(prob(5))
var/datum/objective/debrain/debrain_objective = new
debrain_objective.owner = traitor
debrain_objective.find_target()
traitor.objectives += debrain_objective
else if(prob(30))
var/datum/objective/maroon/maroon_objective = new
maroon_objective.owner = traitor
maroon_objective.find_target()
traitor.objectives += maroon_objective
else
if(prob(85))
if (!(locate(/datum/objective/escape) in traitor.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = traitor
traitor.objectives += escape_objective
else
if(prob(50))
if (!(locate(/datum/objective/hijack) in traitor.objectives))
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = traitor
traitor.objectives += hijack_objective
else
if (!(locate(/datum/objective/minimize_casualties) in traitor.objectives))
var/datum/objective/minimize_casualties/escape_objective = new
escape_objective.owner = traitor
traitor.objectives += escape_objective
if(31 to 85)
if (!(locate(/datum/objective/escape) in traitor.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = traitor
traitor.objectives += escape_objective
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
else
if (!(locate(/datum/objective/hijack) in traitor.objectives))
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = traitor
traitor.objectives += hijack_objective
var/datum/objective/steal/steal_objective = new
steal_objective.owner = traitor
steal_objective.find_target()
traitor.objectives += steal_objective
return
if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount
if (!(locate(/datum/objective/hijack) in traitor.objectives))
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = traitor
traitor.objectives += hijack_objective
return
var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead.
for(var/datum/objective/O in traitor.objectives)
if(!O.martyr_compatible)
martyr_compatibility = 0
break
if(martyr_compatibility && martyr_chance)
var/datum/objective/die/martyr_objective = new
martyr_objective.owner = traitor
traitor.objectives += martyr_objective
return
else
if(!(locate(/datum/objective/escape) in traitor.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = traitor
traitor.objectives += escape_objective
return
/datum/game_mode/proc/greet_traitor(var/datum/mind/traitor)
@@ -7,6 +7,7 @@
required_enemies = 1 // how many of each type are required
recommended_enemies = 3
var/protected_species_vampire = list("Machine")
var/special_job_protection = list("Chaplain") //this must exist or else Chaplain can role for Vampire. That said, we don't want to rule out him getting traitor, either
/datum/game_mode/traitor/vampire/announce()
to_chat(world, "<B>The current game mode is - Traitor+Vampire!</B>")
@@ -22,6 +23,8 @@
for(var/mob/new_player/player in player_list)
if((player.mind in possible_vampires) && (player.client.prefs.species in protected_species_vampire))
possible_vampires -= player.mind
if((player.mind in possible_vampires) && (player.mind.assigned_role in special_job_protection))
possible_vampires -= player.mind
if(possible_vampires.len > 0)
var/datum/mind/vampire = pick(possible_vampires)
@@ -192,8 +192,8 @@
/obj/effect/proc_holder/spell/vampire/targetted/disease
name = "Diseased Touch (100)"
desc = "Touches your victim with infected blood giving them appendicitis, which will, left untreated, cause a slow death by poison."
gain_desc = "You have gained the Diseased Touch ability which causes those you touch to die unless treated medically."
desc = "Touches your victim with infected blood giving them Grave Fever, which will, left untreated, causes toxic building and frequent collapsing."
gain_desc = "You have gained the Diseased Touch ability which causes those you touch to become weak unless treated medically."
action_icon_state = "vampire_disease"
required_blood = 100
@@ -204,7 +204,7 @@
if(!affects(target))
to_chat(usr, "<span class='warning'>They seem to be unaffected.</span>")
continue
var/datum/disease/D = new /datum/disease/appendicitis //someone should probably make a better virus for this
var/datum/disease/D = new /datum/disease/vampire
target.ForceContractDisease(D)
/obj/effect/proc_holder/spell/vampire/mob_aoe/glare
-2
View File
@@ -118,8 +118,6 @@
if(making_mage || shuttle_master.emergency.mode >= SHUTTLE_ESCAPE)
return 0
if(mages_made >= max_mages)
return 0
making_mage = 1
var/list/candidates = list()
var/mob/dead/observer/harry = null
+4 -1
View File
@@ -79,7 +79,7 @@
while(!accepted)
if(!B) break // prevents possible runtime errors
new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon")
new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon", "Greentext")
switch(new_book_style)
if("Koran")
B.icon_state = "koran"
@@ -129,6 +129,9 @@
if("Necronomicon")
B.icon_state = "necronomicon"
B.item_state = "necronomicon"
if("Greentext")
B.icon_state = "greentext"
B.item_state = "greentext"
else
// if christian bible, revert to default
B.icon_state = "bible"
@@ -698,6 +698,17 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/weapon/stock_parts/capacitor = 2,
/obj/item/weapon/stock_parts/console_screen = 1)
/obj/item/weapon/circuitboard/teleporter_perma
name = "circuit board (Permanent Teleporter)"
build_path = /obj/machinery/teleport/perma
board_type = "machine"
origin_tech = "programming=3;engineering=5;bluespace=5;materials=4"
frame_desc = "Requires 3 Bluespace Crystals and 1 Matter Bin."
req_components = list(
/obj/item/weapon/ore/bluespace_crystal = 3,
/obj/item/weapon/stock_parts/matter_bin = 1)
var/target
/obj/item/weapon/circuitboard/telesci_pad
name = "Circuit board (Telepad)"
build_path = /obj/machinery/telepad
+2
View File
@@ -489,6 +489,7 @@
to_chat(M, "<span class='boldnotice'>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</span>")
occupant = M
name = "[name] ([occupant.name])"
time_entered = world.time
if(findtext("[M.key]","@",1,2))
@@ -581,6 +582,7 @@
to_chat(L, "<span class='notice'>[on_enter_occupant_message]</span>")
to_chat(L, "<span class='boldnotice'>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</span>")
occupant = L
name = "[name] ([occupant.name])"
time_entered = world.time
if(findtext("[L.key]","@",1,2))
+2 -1
View File
@@ -800,6 +800,7 @@ About the new airlock wires panel:
else
return
else if(istype(C, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, 1)
src.p_open = !( src.p_open )
src.update_icon()
else if(istype(C, /obj/item/weapon/wirecutters))
@@ -1067,4 +1068,4 @@ About the new airlock wires panel:
src.unlock()
src.open()
src.lock()
return
return
+2 -1
View File
@@ -621,7 +621,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
//#### Sending the signal to all subspace receivers ####//
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
R.receive_signal(signal)
spawn(0)
R.receive_signal(signal)
if(do_sleep)
sleep(rand(10,25))
+76 -5
View File
@@ -319,17 +319,18 @@
/obj/machinery/teleport/hub/Bumped(M as mob|obj)
if(z == ZLEVEL_CENTCOMM)
to_chat(M, "You can't use this here.")
return
if(power_station && power_station.engaged && !panel_open)
//--FalseIncarnate
//Prevents AI cores from using the teleporter, prints out failure messages for clarity
if(istype(M, /mob/living/silicon/ai) || istype(M, /obj/structure/AIcore))
visible_message("\red The teleporter rejects the AI unit.")
visible_message("<span class='warning'>The teleporter rejects the AI unit.</span>")
if(istype(M, /mob/living/silicon/ai))
var/mob/living/silicon/ai/T = M
var/list/TPError = list("\red Firmware instructions dictate you must remain on your assigned station!",
"\red You cannot interface with this technology and get rejected!",
"\red External firewalls prevent you from utilizing this machine!",
"\red Your AI core's anti-bluespace failsafes trigger and prevent teleportation!")
var/list/TPError = list("<span class='warning'>Firmware instructions dictate you must remain on your assigned station!</span>",
"<span class='warning'>You cannot interface with this technology and get rejected!</span>",
"<span class='warning'>External firewalls prevent you from utilizing this machine!</span>",
"<span class='warning'>Your AI core's anti-bluespace failsafes trigger and prevent teleportation!</span>")
to_chat(T, "[pick(TPError)]")
return
else
@@ -370,6 +371,71 @@
else
icon_state = "tele0"
/obj/machinery/teleport/perma
name = "permanent teleporter"
desc = "A teleporter with the target pre-set on the circuit board."
icon_state = "tele0"
var/recalibrating = 0
use_power = 1
idle_power_usage = 10
active_power_usage = 2000
var/target
var/tele_delay = 50
/obj/machinery/teleport/perma/RefreshParts()
for(var/obj/item/weapon/circuitboard/teleporter_perma/C in component_parts)
target = C.target
var/A = 40
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
A -= M.rating * 10
tele_delay = max(A, 0)
update_icon()
/obj/machinery/teleport/perma/Bumped(M as mob|obj)
if(stat & (BROKEN|NOPOWER))
return
if(z == ZLEVEL_CENTCOMM)
to_chat(M, "You can't use this here.")
return
if(target && !recalibrating && !panel_open)
//--FalseIncarnate
//Prevents AI cores from using the teleporter, prints out failure messages for clarity
if(istype(M, /mob/living/silicon/ai) || istype(M, /obj/structure/AIcore))
visible_message("<span class='warning'>The teleporter rejects the AI unit.</span>")
if(istype(M, /mob/living/silicon/ai))
var/mob/living/silicon/ai/T = M
var/list/TPError = list("<span class='warning'>Firmware instructions dictate you must remain on your assigned station!</span>",
"<span class='warning'>You cannot interface with this technology and get rejected!</span>",
"<span class='warning'>External firewalls prevent you from utilizing this machine!</span>",
"<span class='warning'>Your AI core's anti-bluespace failsafes trigger and prevent teleportation!</span>")
to_chat(T, "[pick(TPError)]")
return
else
do_teleport(M, target)
use_power(5000)
if(tele_delay)
recalibrating = 1
update_icon()
spawn(tele_delay)
recalibrating = 0
update_icon()
//--FalseIncarnate
return
/obj/machinery/teleport/perma/power_change()
..()
update_icon()
/obj/machinery/teleport/perma/update_icon()
if(panel_open)
icon_state = "tele-o"
else if(target && !recalibrating && !(stat & (BROKEN|NOPOWER)))
icon_state = "tele1"
else
icon_state = "tele0"
/obj/machinery/teleport/station
name = "station"
desc = "The power control station for a bluespace teleporter."
@@ -457,6 +523,11 @@
link_console_and_hub()
to_chat(user, "<span class='caution'>You reconnect the station to nearby machinery.</span>")
return
if(istype(W, /obj/item/weapon/circuitboard/teleporter_perma))
var/obj/item/weapon/circuitboard/teleporter_perma/C = W
C.target = teleporter_console.target
to_chat(user, "<span class='caution'>You copy the targeting information from \the [src] to \the [W]</span>")
return
/obj/machinery/teleport/station/attack_ai()
src.attack_hand()
+1 -1
View File
@@ -22,7 +22,7 @@
recharging_mecha = null
return ..()
/turf/simulated/floor/mech_bay_recharge_floor/Entered(var/obj/mecha/mecha)
/turf/simulated/floor/mech_bay_recharge_floor/Entered(var/obj/mecha/mecha, atom/OL, ignoreRest = 0)
. = ..()
if(istype(mecha))
mecha.occupant_message("<b>Initializing power control devices.</b>")
+2 -35
View File
@@ -9,9 +9,6 @@
idle_power_usage = 20
active_power_usage = 5000
var/time_coeff = 1
var/resource_coeff = 1
var/time_coeff_tech = 1
var/resource_coeff_tech = 1
var/list/resources = list(
MAT_METAL=0,
MAT_GLASS=0,
@@ -80,12 +77,6 @@
T += M.rating
res_max_amount = (187000+(T * 37500))
//ressources adjustment coefficient (1 -> 0.88 -> 0.75)
T = -1
for(var/obj/item/weapon/stock_parts/micro_laser/Ma in component_parts)
T += Ma.rating
resource_coeff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/8,0.01)
//building time adjustment coefficient (1 -> 0.8 -> 0.6)
T = -1
for(var/obj/item/weapon/stock_parts/manipulator/Ml in component_parts)
@@ -230,29 +221,6 @@
output += "\[<a href='?src=\ref[src];process_queue=1'>Process queue</a> | <a href='?src=\ref[src];clear_queue=1'>Clear queue</a>\]"
return output
/obj/machinery/mecha_part_fabricator/proc/update_tech()
if(!files)
return
var/output
for(var/datum/tech/T in files.known_tech)
if(T && T.level > 1)
var/diff
switch(T.id)
if("materials")
//one materials level is 1/32, so that max level is 0.75 coefficient
diff = round(initial(resource_coeff_tech) - (initial(resource_coeff_tech)*(T.level-1))/32,0.01)
if(resource_coeff_tech>diff)
resource_coeff_tech = diff
output+="Production efficiency increased.<br>"
if("programming")
//one materials level is 1/40, so that max level is 0.8 coefficient
diff = round(initial(time_coeff_tech) - (initial(time_coeff_tech)*(T.level-1))/40,0.1)
if(time_coeff_tech>diff)
time_coeff_tech = diff
output+="Production routines updated.<br>"
return output
/obj/machinery/mecha_part_fabricator/proc/sync()
temp = "Updating local R&D database..."
updateUsrDialog()
@@ -269,7 +237,6 @@
files.RefreshResearch()
temp = "Processed equipment designs.<br>"
//check if the tech coefficients have changed
temp += update_tech()
temp += "<a href='?src=\ref[src];clear_temp=1'>Return</a>"
updateUsrDialog()
@@ -281,10 +248,10 @@
return
/obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(datum/design/D, resource, roundto = 1)
return round(D.materials[resource]*resource_coeff*resource_coeff_tech, roundto)
return round(D.materials[resource], roundto)
/obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(datum/design/D, roundto = 1) //aran
return round(initial(D.construction_time)*time_coeff*time_coeff_tech, roundto)
return round(initial(D.construction_time)*time_coeff, roundto)
/obj/machinery/mecha_part_fabricator/attack_ghost(mob/user)
interact(user)
+36 -15
View File
@@ -916,6 +916,8 @@ steam.start() -- spawns the effect
/obj/effect/effect/foam/New(loc, var/ismetal=0)
..(loc)
icon_state = "[ismetal ? "m":""]foam"
if(!ismetal && reagents)
color = mix_color_from_reagents(reagents.reagent_list)
metal = ismetal
playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3)
spawn(3 + metal*3)
@@ -944,10 +946,13 @@ steam.start() -- spawns the effect
// on delete, transfer any reagents to the floor
/obj/effect/effect/foam/Destroy()
if(!metal && reagents)
for(var/atom/A in oview(0,src))
reagents.handle_reactions()
for(var/atom/A in oview(1, src))
if(A == src)
continue
reagents.reaction(A, 1, 1)
if(reagents.total_volume)
var/fraction = 5 / reagents.total_volume
reagents.reaction(A, TOUCH, fraction)
return ..()
/obj/effect/effect/foam/process()
@@ -969,13 +974,14 @@ steam.start() -- spawns the effect
if(F)
continue
F = new(T, metal)
F = new /obj/effect/effect/foam(T, metal)
F.amount = amount
if(!metal)
F.create_reagents(10)
if (reagents)
F.create_reagents(15)
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
F.reagents.add_reagent(R.id,1)
F.reagents.add_reagent(R.id, min(R.volume, 3), R.data, reagents.chem_temp)
F.color = mix_color_from_reagents(reagents.reagent_list)
// foam disolves when heated
// except metal foams
@@ -993,16 +999,26 @@ steam.start() -- spawns the effect
if (istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
M.slip("foam", 5, 2)
if(M.slip("foam", 5, 2))
if(reagents)
for(var/reagent_id in reagents.reagent_list)
var/amount = M.reagents.get_reagent_amount(reagent_id)
if(amount < 25)
M.reagents.add_reagent(reagent_id, min(round(amount / 2), 15))
if(reagents.total_volume)
var/fraction = 5 / reagents.total_volume
reagents.reaction(M, TOUCH, fraction)
/datum/effect/system/foam_spread
var/amount = 5 // the size of the foam spread.
var/list/carried_reagents // the IDs of reagents present when the foam was mixed
var/metal = 0 // 0=foam, 1=metalfoam, 2=ironfoam
var/temperature = T0C
var/list/banned_reagents = list("smoke_powder", "fluorosurfactant", "stimulants")
/datum/effect/system/foam_spread/set_up(amt=5, loca, var/datum/reagents/carry = null, var/metalfoam = 0)
amount = round(sqrt(amt / 3), 1)
amount = min(round(amt/5, 1), 7)
if(istype(loca, /turf/))
location = loca
else
@@ -1010,35 +1026,40 @@ steam.start() -- spawns the effect
carried_reagents = list()
metal = metalfoam
temperature = carry.chem_temp
// bit of a hack here. Foam carries along any reagent also present in the glass it is mixed
// with (defaults to water if none is present). Rather than actually transfer the reagents,
// this makes a list of the reagent ids and spawns 1 unit of that reagent when the foam disolves.
if(carry && !metal)
for(var/datum/reagent/R in carry.reagent_list)
carried_reagents += R.id
carried_reagents[R.id] = R.volume
/datum/effect/system/foam_spread/start()
spawn(0)
var/obj/effect/effect/foam/F = locate() in location
if(F)
F.amount += amount
F.amount = min(F.amount, 27)
return
F = new(src.location, metal)
F = new /obj/effect/effect/foam(location, metal)
F.amount = amount
if(!metal) // don't carry other chemicals if a metal foam
F.create_reagents(10)
F.create_reagents(15)
if(carried_reagents)
for(var/id in carried_reagents)
F.reagents.add_reagent(id,1)
if(banned_reagents.Find("[id]"))
continue
var/datum/reagent/reagent_volume = carried_reagents[id]
F.reagents.add_reagent(id, min(reagent_volume, 3), null, temperature)
F.color = mix_color_from_reagents(F.reagents.reagent_list)
else
F.reagents.add_reagent("water", 1)
F.reagents.add_reagent("cleaner", 1)
F.color = mix_color_from_reagents(F.reagents.reagent_list)
// wall formed by metal foams
// dense and opaque, but easy to break
+2 -2
View File
@@ -89,7 +89,7 @@
var/turf/T = A
if(!T)
continue
var/dist = cheap_hypotenuse(T.x, T.y, x0, y0)
var/dist = hypotenuse(T.x, T.y, x0, y0)
if(config.reactionary_explosions)
var/turf/Trajectory = T
@@ -206,7 +206,7 @@
var/list/wipe_colours = list()
for(var/turf/T in spiral_range_turfs(max_range, epicenter))
wipe_colours += T
var/dist = cheap_hypotenuse(T.x, T.y, x0, y0)
var/dist = hypotenuse(T.x, T.y, x0, y0)
if(newmode == "Yes")
var/turf/TT = T
+48 -2
View File
@@ -41,7 +41,7 @@
if(href_list["create_area"])
if(get_area_type()==AREA_SPACE)
create_area()
updateUsrDialog()
//One-use area creation permits.
@@ -77,6 +77,12 @@
icon_state = "blueprints"
fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage."
w_class = 3
var/list/showing = list()
var/client/viewing
/obj/item/areaeditor/blueprints/Destroy()
clear_viewer()
return ..()
/obj/item/areaeditor/blueprints/attack_self(mob/user as mob)
@@ -85,6 +91,11 @@
if(get_area_type() == AREA_STATION)
. += "<p>According to the [src], you are now in <b>\"[sanitize(A.name)]\"</b>.</p>"
. += "<p>You may <a href='?src=\ref[src];edit_area=1'> move an amendment</a> to the drawing.</p>"
if(!viewing)
. += "<p><a href='?src=\ref[src];view_blueprints=1'>View structural data</a></p>"
else
. += "<p><a href='?src=\ref[src];refresh=1'>Refresh structural data</a></p>"
. += "<p><a href='?src=\ref[src];hide_blueprints=1'>Hide structural data</a></p>"
var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
popup.set_content(.)
popup.open()
@@ -97,8 +108,43 @@
if(get_area_type()!=AREA_STATION)
return
edit_area()
updateUsrDialog()
if(href_list["view_blueprints"])
set_viewer(usr, "<span class='notice'>You flip the blueprints over to view the complex information diagram.</span>")
if(href_list["hide_blueprints"])
clear_viewer(usr, "<span class='notice'>You flip the blueprints over to view the simple information diagram.</span>")
if(href_list["refresh"])
clear_viewer(usr)
set_viewer(usr)
attack_self(usr)
/obj/item/areaeditor/blueprints/proc/get_images(turf/T, viewsize)
. = list()
for(var/tt in RANGE_TURFS(viewsize, T))
var/turf/TT = tt
if(TT.blueprint_data)
. += TT.blueprint_data
/obj/item/areaeditor/blueprints/proc/set_viewer(mob/user, message = "")
if(user && user.client)
if(viewing)
clear_viewer()
viewing = user.client
showing = get_images(get_turf(user), viewing.view)
viewing.images |= showing
if(message)
to_chat(user, message)
/obj/item/areaeditor/blueprints/proc/clear_viewer(mob/user, message = "")
if(viewing)
viewing.images -= showing
viewing = null
showing.Cut()
if(message)
to_chat(user, message)
/obj/item/areaeditor/blueprints/dropped(mob/user)
..()
clear_viewer()
/obj/item/areaeditor/proc/get_area()
var/turf/T = get_turf(usr)
+15 -15
View File
@@ -29,35 +29,35 @@
new /obj/item/weapon/reagent_containers/food/pill/zoom( src )
new /obj/item/weapon/reagent_containers/food/pill/zoom( src )
/obj/item/weapon/reagent_containers/food/pill/random_drugs
name = "pill"
desc = ""
desc = "A cocktail of illicit designer drugs, who knows what might be in here."
/obj/item/weapon/reagent_containers/food/pill/random_drugs/New()
..()
icon_state = "pill" + pick("2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20")
name = pick("lunar","vorpal","hardcore","willow", "void","loopy","electro", "cyber","heavy", "ninja", "hydro", "blue", "red", "green", "purple", "strong", "divine","carp" ,"deadly","dead","vicious" ,"wild" ,"demon", "chill", "solid", "liquid", "crazy", "super", "hyper", "space", "wizard", "rainbow", "star", "turbo", "prism", "sticky") + " " + pick("jack","zero","null","beat","nip","bubbles" ,"ice","medicine","venom","shock","solar" ,"spice" ,"shredder", "heart" , "heat", "pill","hopper","scum","fruit", "bolt", "deck", "butter", "runoff", "grease", "flair", "sweat", "zone", "blast")
name = "[pick_list("chemistry_tools.json", "CYBERPUNK_drug_prefixes")] [pick_list("chemistry_tools.json", "CYBERPUNK_drug_suffixes")]"
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" , "hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" ,"hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
reagents.add_reagent(pick("pancuronium","neurotoxin","frostoil", "toxin","morphine", "carpotoxin", "hippiesdelight","methamphetamine","haloperidol" , "hydrocodone", "psilocybin", "lsd", "capsaicin", "space_drugs" , "epinephrine", "serotrotium"), pick(5,7,10,13,15))
var/primaries = rand(1,3)
var/adulterants = rand(2,4)
while(primaries > 0)
primaries--
reagents.add_reagent(pick_list("chemistry_tools.json", "CYBERPUNK_drug_primaries"), 6)
while(adulterants > 0)
adulterants--
reagents.add_reagent(pick_list("chemistry_tools.json", "CYBERPUNK_drug_adulterants"), 3)
/obj/item/weapon/storage/pill_bottle/random_drug_bottle
name = "odd pill bottle"
desc = "You're not sure if you trust the contents of this bottle..."
name = "pill bottle (???)"
desc = "Huh."
/obj/item/weapon/storage/pill_bottle/random_drug_bottle/New()
..()
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
new /obj/item/weapon/reagent_containers/food/pill/random_drugs( src )
for(var/i in 1 to 5)
new /obj/item/weapon/reagent_containers/food/pill/random_drugs(src)
@@ -77,6 +77,11 @@
if (!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
if((HULK in H.mutations) || (H.species.flags & NOGUNS))
user << "<span class='warning'>Your fingers can't press the button!</span>"
return
add_fingerprint(user)
@@ -56,6 +56,7 @@
dir=ndir
b_stat=1
on = 0
global_intercoms.Add(src)
update_icon()
/obj/item/device/radio/intercom/department/medbay/New()
@@ -104,6 +105,7 @@
/obj/item/device/radio/intercom/Destroy()
processing_objects.Remove(src)
global_intercoms.Remove(src)
return ..()
/obj/item/device/radio/intercom/attack_ai(mob/user as mob)
@@ -422,11 +422,13 @@ var/global/list/default_medbay_channels = list(
//#### Sending the signal to all subspace receivers ####//
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
R.receive_signal(signal)
spawn(0)
R.receive_signal(signal)
// Allinone can act as receivers.
for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
R.receive_signal(signal)
spawn(0)
R.receive_signal(signal)
// Receiving code can be located in Telecommunications.dm
return signal.data["done"] && position.z in signal.data["level"]
@@ -475,7 +477,8 @@ var/global/list/default_medbay_channels = list(
signal.frequency = connection.frequency // Quick frequency set
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
R.receive_signal(signal)
spawn(0)
R.receive_signal(signal)
sleep(rand(10,25)) // wait a little...
@@ -520,7 +523,7 @@ var/global/list/default_medbay_channels = list(
// what the range is in which mobs will hear the radio
// returns: -1 if can't receive, range otherwise
if (wires.IsIndexCut(WIRE_RECEIVE))
if (!wires || wires.IsIndexCut(WIRE_RECEIVE))
return -1
if(!listening)
return -1
+5
View File
@@ -161,6 +161,11 @@
desc = "A flag proudly proclaiming the superior heritage of Vulpkanin."
icon_state = "vulpflag"
/obj/item/flag/species/drask
name = "Drask flag"
desc = "A flag proudly proclaiming the superior heritage of Drask."
icon_state = "draskflag"
//Department Flags
/obj/item/flag/cargo
+2 -2
View File
@@ -166,7 +166,7 @@ var/list/tape_roll_applications = list()
/obj/item/tape/attack_hand(mob/user as mob)
if (user.a_intent == I_HELP && src.allowed(user))
user.show_viewers("\blue [user] lifts [src], allowing passage.")
user.visible_message("<span class=notice>[user] lifts [src], allowing passage.</span>", "<span class=notice>You lift [src], allowing passage.</span>")
src.density = 0
spawn(200)
src.density = 1
@@ -180,7 +180,7 @@ var/list/tape_roll_applications = list()
if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user))))
to_chat(user, "You can't break the [src] with that!")
return
user.show_viewers("\blue [user] breaks the [src]!")
user.visible_message("<span class=warning>[user] breaks the [src]!</span>", "<span class=warning>You break the [src]!</span>")
var/dir[2]
var/icon_dir = src.icon_state
+3
View File
@@ -949,6 +949,9 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/plushie/attack(mob/M as mob, mob/user as mob)
playsound(loc, poof_sound, 20, 1) // Play the whoosh sound in local area
if(iscarbon(M))
if(prob(10))
M.reagents.add_reagent("hugs", 10)
return ..()
/obj/item/toy/plushie/attack_self(mob/user as mob)
+41 -18
View File
@@ -7,62 +7,85 @@
w_class = 1.0
desc = "This is rubbish."
raisins
/obj/item/trash/raisins
name = "4no raisins"
icon_state= "4no_raisins"
candy
/obj/item/trash/candy
name = "Candy"
icon_state= "candy"
cheesie
/obj/item/trash/cheesie
name = "Cheesie honkers"
icon_state = "cheesie_honkers"
chips
/obj/item/trash/chips
name = "Chips"
icon_state = "chips"
popcorn
/obj/item/trash/popcorn
name = "Popcorn"
icon_state = "popcorn"
sosjerky
/obj/item/trash/sosjerky
name = "Scaredy's Private Reserve Beef Jerky"
icon_state = "sosjerky"
syndi_cakes
/obj/item/trash/syndi_cakes
name = "Syndi cakes"
icon_state = "syndi_cakes"
waffles
/obj/item/trash/waffles
name = "Waffles"
icon_state = "waffles"
plate
/obj/item/trash/plate
name = "Plate"
icon_state = "plate"
snack_bowl
/obj/item/trash/snack_bowl
name = "Snack bowl"
icon_state = "snack_bowl"
pistachios
/obj/item/trash/pistachios
name = "Pistachios pack"
icon_state = "pistachios_pack"
semki
/obj/item/trash/semki
name = "Semki pack"
icon_state = "semki_pack"
tray
/obj/item/trash/tray
name = "Tray"
icon_state = "tray"
candle
/obj/item/trash/candle
name = "candle"
icon = 'icons/obj/candle.dmi'
icon_state = "candle4"
liquidfood
/obj/item/trash/liquidfood
name = "\improper \"LiquidFood\" ration"
icon_state = "liquidfood"
can
/obj/item/trash/can
name = "crushed can"
icon_state = "cola"
gum
/obj/item/trash/gum
name = "chewed gum"
desc = "NOT free candy."
icon_state = "gum"
tastybread
/obj/item/trash/tastybread
name = "bread tube"
icon_state = "tastybread"
/obj/item/trash/tapetrash
name = "old duct tape"
icon_state = "tape"
desc = "Not sticky anymore."
throw_range = 1
/obj/item/trash/attack(mob/M as mob, mob/living/user as mob)
return
+86 -5
View File
@@ -74,6 +74,12 @@ RCD
src.spark_system.start()
return
if(3)
mode = 4
to_chat(user, "<span class='notice'>Changed mode to 'Windows'</span>")
if(prob(20))
src.spark_system.start()
return
if(4)
mode = 1
to_chat(user, "<span class='notice'>Changed mode to 'Floor & Walls'</span>")
if(prob(20))
@@ -88,7 +94,7 @@ RCD
if(!proximity) return
if(istype(A,/area/shuttle)||istype(A,/turf/space/transit))
return 0
if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock)))
if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/window)))
return 0
switch(mode)
@@ -97,7 +103,8 @@ RCD
if(useResource(1, user))
to_chat(user, "Building Floor...")
activate()
A:ChangeTurf(/turf/simulated/floor/plating)
var/turf/AT = A
AT.ChangeTurf(/turf/simulated/floor/plating)
return 1
return 0
@@ -108,7 +115,8 @@ RCD
if(do_after(user, 20, target = A))
if(!useResource(3, user)) return 0
activate()
A:ChangeTurf(/turf/simulated/wall)
var/turf/AT = A
AT.ChangeTurf(/turf/simulated/wall)
return 1
return 0
@@ -136,7 +144,8 @@ RCD
if(do_after(user, 40, target = A))
if(!useResource(5, user)) return 0
activate()
A:ChangeTurf(/turf/simulated/floor/plating)
var/turf/AT = A
AT.ChangeTurf(/turf/simulated/floor/plating)
return 1
return 0
@@ -147,7 +156,8 @@ RCD
if(do_after(user, 50, target = A))
if(!useResource(5, user)) return 0
activate()
A:ChangeTurf(/turf/space)
var/turf/AT = A
AT.ChangeTurf(/turf/space)
return 1
return 0
@@ -161,7 +171,78 @@ RCD
qdel(A)
return 1
return 0
if(istype(A, /obj/structure/window)) // You mean the grille of course, do you?
A = locate(/obj/structure/grille) in A.loc
if(istype(A, /obj/structure/grille))
if(!checkResource(2, user))
return 0
to_chat(user, "Deconstructing window...")
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(!do_after(user, 20, target = A))
return 0
if(locate(/obj/structure/window/full/shuttle) in A.contents)
return 0 // Let's not give shuttle-griefers an easy time.
if(!useResource(2, user))
return 0
activate()
var/turf/T1 = get_turf(A)
qdel(A)
A = null
for(var/obj/structure/window/W in T1.contents)
W.disassembled = 1
W.density = 0
qdel(W)
for(var/cdir in cardinal)
var/turf/T2 = get_step(T1, cdir)
if(locate(/obj/structure/window/full/shuttle) in T2.contents)
continue // Shuttle windows? Nah. We don't need extra windows there.
if(!(locate(/obj/structure/grille) in T2.contents))
continue
for(var/obj/structure/window/W in T2.contents)
if(W.dir == turn(cdir, 180))
W.disassembled = 1
W.density = 0
qdel(W)
var/obj/structure/window/reinforced/W = new(T2)
W.dir = turn(cdir, 180)
return 1
return 0
if(4)
if(istype(A, /turf/simulated/floor))
if(locate(/obj/structure/grille) in contents)
return 0 // We already have window
if(!checkResource(2, user))
return 0
to_chat(user, "Constructing window...")
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
if(!do_after(user, 20, target = A))
return 0
if(locate(/obj/structure/grille) in A.contents)
return 0 // We already have window
if(!useResource(2, user))
return 0
activate()
new /obj/structure/grille(A)
for(var/obj/structure/window/W in contents)
W.disassembled = 1 // Prevent that annoying glass breaking sound
W.density = 0
qdel(W)
for(var/cdir in cardinal)
var/turf/T = get_step(A, cdir)
if(locate(/obj/structure/grille) in T.contents)
for(var/obj/structure/window/W in T.contents)
if(W.dir == turn(cdir, 180))
W.disassembled = 1
W.density = 0
qdel(W)
else // Build a window!
var/obj/structure/window/reinforced/W = new(A)
W.dir = cdir
var/turf/AT = A
AT.ChangeTurf(/turf/simulated/floor/plating) // Platings go under windows.
return 1
else
to_chat(user, "ERROR: RCD in MODE: [mode] attempted use by [user]. Send this text #coderbus or an admin.")
return 0
@@ -0,0 +1,79 @@
/obj/item/weapon/bee_briefcase
name = "briefcase"
desc = "This briefcase has easy-release clasps and smells vaguely of honey and blood..."
icon = 'icons/obj/storage.dmi'
icon_state = "briefcase"
item_state = "briefcase"
flags = CONDUCT
hitsound = "swing_hit"
force = 10
throw_speed = 2
throw_range = 4
w_class = 4
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
var/bees_left = 10
var/list/blood_list = list()
var/sound_file = 'sound/misc/briefcase_bees.ogg'
var/next_sound = 0
/obj/item/weapon/bee_briefcase/examine(mob/user)
..()
if(loc == user)
if(bees_left)
to_chat(user, "<span class='warning'>There are [bees_left] bees still inside in briefcase!</span>")
else
to_chat(user, "<span class='danger'>The bees are gone... Colony collapse disorder?</span>")
/obj/item/weapon/bee_briefcase/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/reagent_containers/syringe))
var/obj/item/weapon/reagent_containers/syringe/S = I
if(!bees_left)
to_chat(user, "<span class='warning'>The briefcase is empty, so there is no point in injecting something into it.</span>")
return
if(S.reagents && S.reagents.total_volume)
to_chat(user, "<span class='notice'>You inject [src] with [S].</span>")
for(var/datum/reagent/A in S.reagents.reagent_list)
if(A.id == "blood")
if(!(A.data["donor"] in blood_list))
blood_list += A.data["donor"]
if(A.id == "strange_reagent") //RELOAD THE BEES (1 bee per 1 unit, max 15 bees)
if(bees_left < 15)
bees_left = min(15, round((bees_left + A.volume), 1)) //No partial bees, max 15 bees in case at any given time
to_chat(user, "<span class='warning'>The buzzing inside the briefcase intensifies as new bees form inside.</span>")
else
to_chat(user, "<span class='warning'>The buzzing inside the briefcase swells momentarily, then returns to normal. Guess it was too cramped...</span>")
S.reagents.clear_reagents()
S.update_icon()
else if(istype(I, /obj/item/weapon/plantspray))
var/obj/item/weapon/plantspray/PS = I
user.drop_item(PS)
bees_left = max(0, (bees_left - PS.pest_kill_str))
to_chat(user, "You spray [PS] into \the [src].")
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
qdel(PS)
/obj/item/weapon/bee_briefcase/attack_self(mob/user as mob)
if(!bees_left)
to_chat(user, "<span class='danger'>The lack of all and any bees at this event has been somewhat of a let-down...</span>")
return
else
if(world.time >= next_sound) //This cooldown doesn't prevent us from releasing bees, just stops the sound
next_sound = world.time + 90
//Play sound through the station intercomms, so everyone knows the doom you have wrought.
for(var/O in global_intercoms)
var/obj/item/device/radio/intercom/I = O
if(I.z != ZLEVEL_STATION) //Only broadcast to the station intercoms
continue
if(!I.on) //Only broadcast to active intercoms (powered, switched on)
continue
playsound(I, sound_file, 35)
//Release up to 5 bees per use. Without using strange reagent, that means two uses. WITH strange reagent, you can get more if you don't release the last bee
for(var/bee = min(5, bees_left), bee > 0, bee--)
var/mob/living/simple_animal/hostile/poison/bees/syndi/B = new /mob/living/simple_animal/hostile/poison/bees/syndi(null)
B.master_and_friends = blood_list //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood
B.forceMove(get_turf(user)) //RELEASE THE BEES!
bees_left -= 5
@@ -39,6 +39,12 @@
//So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
if(user.client && (target in user.client.screen))
to_chat(user, "<span class='notice'>You need to take that [target.name] off before cleaning it.</span>")
else if(target == user && user.a_intent == I_GRAB && ishuman(target))
var/mob/living/carbon/human/muncher = user
if(muncher && muncher.get_species() == "Drask")
to_chat(user, "You take a bite of the [src.name]. Delicious!")
playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0)
user.nutrition += 2
else if(istype(target,/obj/effect/decal/cleanable))
user.visible_message("<span class='warning'>[user] begins to scrub \the [target.name] out with [src].</span>")
if(do_after(user, src.cleanspeed, target = target) && target)
+9 -9
View File
@@ -91,16 +91,16 @@
/obj/item/weapon/razor/attack(mob/living/carbon/M as mob, mob/user as mob)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/C = H.organs_by_name["head"]
var/obj/item/organ/external/head/C = H.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[C.model]
if(user.zone_sel.selecting == "mouth")
if(!get_location_accessible(H, "mouth"))
to_chat(user, "<span class='warning'>The mask is in the way.</span>")
return
if((H.species && H.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
if((C.species && C.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
to_chat(user, "<span class='warning'>You find yourself disappointed at the appalling lack of facial hair.</span>")
return
if(H.f_style == "Shaved")
if(C.f_style == "Shaved")
to_chat(user, "<span class='notice'>Already clean-shaven.</span>")
return
if(H == user) //shaving yourself
@@ -109,7 +109,7 @@
if(do_after(user, 50, target = H))
user.visible_message("<span class='notice'>[user] shaves his facial hair clean with the [src].</span>", \
"<span class='notice'>You finish shaving with the [src]. Fast and clean!</span>")
H.f_style = "Shaved"
C.f_style = "Shaved"
H.update_fhair()
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
else
@@ -121,17 +121,17 @@
if(user_loc == user.loc && H_loc == H.loc)
user.visible_message("<span class='danger'>[user] shaves off [H]'s facial hair with \the [src].</span>", \
"<span class='notice'>You shave [H]'s facial hair clean off.</span>")
H.f_style = "Shaved"
C.f_style = "Shaved"
H.update_fhair()
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
if(user.zone_sel.selecting == "head")
if(!get_location_accessible(H, "head"))
to_chat(user, "<span class='warning'>The headgear is in the way.</span>")
return
if((H.species && H.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
if((C.species && C.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
to_chat(user, "<span class='warning'>You find yourself disappointed at the appalling lack of hair.</span>")
return
if(H.h_style == "Bald" || H.h_style == "Balding Hair" || H.h_style == "Skinhead")
if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead")
to_chat(user, "<span class='notice'>There is not enough hair left to shave...</span>")
return
if(H == user) //shaving yourself
@@ -140,7 +140,7 @@
if(do_after(user, 50, target = H))
user.visible_message("<span class='notice'>[user] shaves his head with the [src].</span>", \
"<span class='notice'>You finish shaving with the [src].</span>")
H.h_style = "Skinhead"
C.h_style = "Skinhead"
H.update_hair()
playsound(src.loc, 'sound/items/Welder2.ogg', 40, 1)
else
@@ -152,7 +152,7 @@
if(user_loc == user.loc && H_loc == H.loc)
user.visible_message("<span class='danger'>[user] shaves [H]'s head bald with \the [src]!</span>", \
"<span class='warning'>You shave [H]'s head bald.</span>")
H.h_style = "Skinhead"
C.h_style = "Skinhead"
H.update_hair()
playsound(src.loc, 'sound/items/Welder2.ogg', 40, 1)
else
@@ -458,11 +458,11 @@
New()
..()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
B1.reagents.add_reagent("fluorosurfactant", 40)
B2.reagents.add_reagent("water", 40)
B2.reagents.add_reagent("cleaner", 60)
B2.reagents.add_reagent("cleaner", 10)
B2.reagents.add_reagent("water", 40) //when you make pre-designed foam reactions that carry the reagents, always add water last
beakers += B1
beakers += B2
+12 -11
View File
@@ -30,21 +30,21 @@
//this is largely copypasted from there.
//handle facial hair (if necessary)
var/list/species_facial_hair = list()
var/obj/item/organ/external/head/C = H.organs_by_name["head"]
var/obj/item/organ/external/head/C = H.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[C.model]
if(H.gender == MALE || H.get_species() == "Vulpkanin")
if(H.species)
if(C.species)
for(var/i in facial_hair_styles_list)
var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i]
if(H.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
if(H.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(C.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
if(C.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(robohead.is_monitor)
to_chat(user, "<span class='warning'>You are unable to find anything on [H]'s face worth cutting. How disappointing.</span>")
return
continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_facial_hair += i
else
if(H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(C.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(!robohead.is_monitor)
if("Human" in tmp_facial.species_allowed)
species_facial_hair += i
@@ -56,18 +56,18 @@
var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair
//handle normal hair
var/list/species_hair = list()
if(H.species)
if(C.species)
for(var/i in hair_styles_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
if(H.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
if(H.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(C.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
if(C.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(robohead.is_monitor)
to_chat(user, "<span class='warning'>You are unable to find anything on [H]'s head worth cutting. How disappointing.</span>")
return
continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_hair += i
else
if(H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(C.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(!robohead.is_monitor)
if("Human" in tmp_hair.species_allowed)
species_hair += i
@@ -84,11 +84,12 @@
user.visible_message("<span class='notice'>[user] stops cutting [M]'s hair.</span>", "<span class='notice'>You stop cutting [M]'s hair.</span>")
return
if(f_new_style)
H.f_style = f_new_style
C.f_style = f_new_style
if(h_new_style)
H.h_style = h_new_style
C.h_style = h_new_style
H.update_hair()
H.update_fhair()
user.visible_message("<span class='notice'>[user] finishes cutting [M]'s hair!</span>")
/obj/item/weapon/scissors/safety //Totally safe, I assure you.
@@ -0,0 +1,183 @@
/obj/item/weapon/storage/toolbox/green
name = "artistic toolbox"
desc = "A metal container designed to hold various tools. This variety holds art supplies."
icon_state = "green"
item_state = "toolbox_green"
icon = 'icons/goonstation/objects/objects.dmi'
lefthand_file = 'icons/goonstation/mob/inhands/items_lefthand.dmi'
righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi'
/obj/item/weapon/storage/toolbox/green/memetic
name = "artistic toolbox"
desc = "His Grace."
force = 5
throwforce = 10
var/list/servantlinks = list()
var/hunger = 0
var/hunger_message_level = 0
var/original_owner = null
var/activated = 0
var/mindless_override = 0
/obj/item/weapon/storage/toolbox/green/memetic/attack_hand(mob/living/carbon/user)
if(!activated)
if(ishuman(user) && !user.HasDisease(new /datum/disease/memetic_madness(0)))
activated = 1
user.ForceContractDisease(new /datum/disease/memetic_madness(0))
for(var/datum/disease/memetic_madness/DD in user.viruses)
DD.progenitor = src
servantlinks.Add(DD)
break
force += 4
throwforce += 4
user << 'sound/goonstation/effects/screech.ogg'
shake_camera(user, 20, 1)
to_chat(user, "<i><b><font face = Tempus Sans ITC>His Grace accepts thee, spread His will! All who look close to the Enlightened may share His gifts.</font></b></i>")
original_owner = user
return
..()
/obj/item/weapon/storage/toolbox/green/memetic/attackby(obj/item/I, mob/user)
if(activated)
if(istype(I, /obj/item/weapon/grab/))
var/obj/item/weapon/grab/G = I
if(!G.affecting)
return
if(!user.HasDisease(new /datum/disease/memetic_madness(0)))
to_chat(user, "<span class='warning'>You can't seem to find the latch to open this.</span>")
return
if(!ishuman(G.affecting) || issmall(G.affecting))
to_chat(user, "<span class='warning'>His Grace will not accept such a meager offering!</span>")
return
if(!mindless_override)
if(G.affecting.mind == null && G.affecting.ckey == null)
to_chat(user, "<span class='warning'>His Grace will not accept a soulless shell for an offering!</span>")
return
if(!G.affecting.stat && !G.affecting.restrained() && !G.affecting.weakened)
to_chat(user, "<span class='warning'>They're moving too much to feed to His Grace!</span>")
return
user.visible_message("<span class='userdanger'>[user] is trying to feed [G.affecting] to [src]!</span>")
if(!do_mob(user, G.affecting, 30))
return
G.affecting.forceMove(src)
user.visible_message("<span class='userdanger'>[user] has fed [G.affecting] to [src]!</span>")
consume(G.affecting)
qdel(G)
to_chat(user, "<i><b><font face = Tempus Sans ITC>You have done well...</font></b></i>")
force += 5
throwforce += 5
return
..()
/obj/item/weapon/storage/toolbox/green/memetic/proc/consume(mob/M)
if (!M)
return
hunger = 0
hunger_message_level = 0
playsound(src.loc, 'sound/goonstation/misc/burp_alien.ogg', 50, 0)
M.emote("scream")
M.death()
M.ghostize()
if(M == original_owner)
qdel(M)
var/obj/item/weapon/storage/toolbox/green/fake_toolbox = new(get_turf(src))
fake_toolbox.desc = "It looks a lot duller than it used to."
qdel(src)
/obj/item/weapon/storage/toolbox/green/memetic/Destroy()
for(var/mob/living/carbon/human/H in src)
H.forceMove(get_turf(src))
visible_message("<span class='warning'>[H] bursts out of [src]!</span>")
for(var/A in servantlinks)
var/datum/disease/memetic_madness/D = A
if(D)
D.cure()
break
if(servantlinks)
servantlinks.Cut()
servantlinks = null
original_owner = null
visible_message("<span class='userdanger'>[src] screams!</span>")
playsound(src.loc, 'sound/goonstation/effects/screech.ogg', 100, 1)
return ..()
/datum/disease/memetic_madness
name = "Memetic Kill Agent"
max_stages = 4
stage_prob = 8
spread_text = "Non-Contagious"
spread_flags = SPECIAL
cure_text = "Unknown"
viable_mobtypes = list(/mob/living/carbon/human)
severity = BIOHAZARD
disease_flags = CURABLE
spread_flags = NON_CONTAGIOUS
var/obj/item/weapon/storage/toolbox/green/memetic/progenitor = null
/datum/disease/memetic_madness/Destroy()
progenitor = null
if(affected_mob)
affected_mob.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE
return ..()
/datum/disease/memetic_madness/stage_act()
..()
if(!progenitor) //if someone admin spawns this, cure it right away; this should only ever be given directly from the toolbox itself.
cure()
return
if(progenitor in affected_mob.contents)
affected_mob.adjustOxyLoss(-5)
affected_mob.adjustBruteLoss(-12)
affected_mob.adjustFireLoss(-12)
affected_mob.adjustToxLoss(-5)
var/status = CANSTUN | CANWEAKEN | CANPARALYSE
affected_mob.status_flags &= ~status
affected_mob.dizziness = max(0, affected_mob.dizziness-10)
affected_mob.drowsyness = max(0, affected_mob.drowsyness-10)
affected_mob.SetSleeping(0)
stage = 1
switch(progenitor.hunger)
if(10 to 60)
if(progenitor.hunger_message_level < 1)
progenitor.hunger_message_level = 1
to_chat(affected_mob, "<i><b><font face = Tempus Sans ITC>Feed Me the unclean ones...They will be purified...</font></b></i>")
if(61 to 120)
if(progenitor.hunger_message_level < 2)
progenitor.hunger_message_level = 2
to_chat(affected_mob, "<i><b><font face = Tempus Sans ITC>I hunger for the flesh of the impure...</font></b></i>")
if(121 to 210)
if(prob(10) && progenitor.hunger_message_level < 3)
progenitor.hunger_message_level = 3
to_chat(affected_mob, "<i><b><font face = Tempus Sans ITC>The hunger of your Master grows with every passing moment. Feed Me at once.</font></b></i>")
if(211 to 399)
if(progenitor.hunger_message_level < 4)
progenitor.hunger_message_level = 4
to_chat(affected_mob, "<i><b><font face = Tempus Sans ITC>His Grace starves in your hands. Feed Me the unclean or suffer.</font></b></i>")
if(400 to INFINITY)
affected_mob.visible_message("<span class='userdanger'>[progenitor] consumes [affected_mob] whole!</span>")
progenitor.consume(affected_mob)
return
progenitor.hunger += min(max((progenitor.force / 10), 1), 10)
else
affected_mob.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE
if(stage == 4)
if(get_dist(get_turf(progenitor), get_turf(affected_mob)) <= 7)
stage = 1
return
if(prob(4))
to_chat(affected_mob, "<span class='danger'>You are too far from His Grace...</span>")
affected_mob.adjustToxLoss(5)
else if(prob(6))
to_chat(affected_mob, "<span class='danger'>You feel weak.</span>")
affected_mob.adjustBruteLoss(5)
if(ismob(progenitor.loc))
progenitor.hunger++
@@ -15,6 +15,11 @@
materials = list(MAT_METAL=4000)
flags = CONDUCT
attack_verb = list("slammed", "bashed", "battered", "bludgeoned", "thrashed", "whacked")
var/upgradable = 1
var/result = /obj/structure/table
var/parts = list(
/obj/item/stack/sheet/metal,
/obj/item/stack/sheet/metal)
/obj/item/weapon/table_parts/reinforced
name = "reinforced table parts"
@@ -23,18 +28,33 @@
icon_state = "reinf_tableparts"
materials = list(MAT_METAL=8000)
flags = CONDUCT
upgradable = 0
result = /obj/structure/table/reinforced
parts = list(
/obj/item/stack/sheet/metal,
/obj/item/stack/rods)
/obj/item/weapon/table_parts/wood
name = "wooden table parts"
desc = "Keep away from fire."
icon_state = "wood_tableparts"
flags = null
upgradable = 0
result = /obj/structure/table/woodentable
parts = list(
/obj/item/stack/sheet/wood,
/obj/item/stack/sheet/wood)
/obj/item/weapon/table_parts/glass
name = "glass table parts"
desc = "fragile!"
icon_state = "glass_tableparts"
flags = null
upgradable = 0
result = /obj/structure/glasstable_frame
parts = list(
/obj/item/stack/sheet/metal,
/obj/item/stack/sheet/metal)
/obj/item/weapon/rack_parts
name = "rack parts"
@@ -49,71 +69,27 @@
*/
/obj/item/weapon/table_parts/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal( user.loc )
new /obj/item/stack/sheet/metal( user.loc )
//SN src = null
if(istype(W, /obj/item/weapon/wrench))
for(var/p in parts)
new p(user.loc)
qdel(src)
if (istype(W, /obj/item/stack/rods))
if (W:amount >= 4)
new /obj/item/weapon/table_parts/reinforced( user.loc )
to_chat(user, "\blue You reinforce the [name].")
W:use(4)
else if(upgradable && istype(W, /obj/item/stack/rods))
var/obj/item/stack/rods/R = W
if(R.amount >= 4)
new /obj/item/weapon/table_parts/reinforced(user.loc)
to_chat(user, "<span class=notice>You reinforce the [name].</span>")
R.use(4)
qdel(src)
else if (W:amount < 4)
to_chat(user, "\red You need at least four rods to do this.")
else
to_chat(user, "<span class=warning>You need at least four rods to do this.</span>")
/obj/item/weapon/table_parts/attack_self(mob/user as mob)
new /obj/structure/table( user.loc )
for(var/obj/structure/table/T in user.loc)
to_chat(user, "<span class=warning>You can't build tables on top of tables!</span>")
return
new result(user.loc)
user.drop_item()
qdel(src)
return
/*
* Reinforced Table Parts
*/
/obj/item/weapon/table_parts/reinforced/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal( user.loc )
new /obj/item/stack/rods( user.loc )
qdel(src)
/obj/item/weapon/table_parts/reinforced/attack_self(mob/user as mob)
new /obj/structure/table/reinforced( user.loc )
user.drop_item()
qdel(src)
return
/*
* Wooden Table Parts
*/
/obj/item/weapon/table_parts/wood/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
qdel(src)
/obj/item/weapon/table_parts/wood/attack_self(mob/user as mob)
new /obj/structure/table/woodentable( user.loc )
user.drop_item()
qdel(src)
return
/*
* Glass Table Parts
*/
/obj/item/weapon/table_parts/glass/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal( user.loc )
new /obj/item/stack/sheet/metal( user.loc )
qdel(src)
/obj/item/weapon/table_parts/glass/attack_self(mob/user as mob)
new /obj/structure/glasstable_frame( user.loc )
user.drop_item()
qdel(src)
return
/*
* Rack Parts
@@ -121,14 +97,11 @@
/obj/item/weapon/rack_parts/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
if (istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal( user.loc )
new /obj/item/stack/sheet/metal(user.loc)
qdel(src)
return
return
/obj/item/weapon/rack_parts/attack_self(mob/user as mob)
var/obj/structure/rack/R = new /obj/structure/rack( user.loc )
var/obj/structure/rack/R = new /obj/structure/rack(user.loc)
R.add_fingerprint(user)
user.drop_item()
qdel(src)
return
qdel(src)
+30 -1
View File
@@ -12,6 +12,35 @@
update_icon()
/obj/item/stack/tape_roll/attack(mob/living/carbon/human/M as mob, mob/living/user as mob)
if(M.wear_mask)
to_chat(user, "Remove their mask first!")
else if(amount < 2)
to_chat(user, "You'll need more tape for this!")
else if(!M.check_has_mouth())
to_chat(user, "They have no mouth to tape over!")
else
if(M == user)
to_chat(user, "You try to tape your own mouth shut.")
else
to_chat(user, "You try to tape [M]'s mouth shut.")
M.visible_message("<span class='warning'>[user] tries to tape [M]'s mouth closed!</span>")
if(do_after(user, 50, target = M))
if(M == user)
to_chat(user, "You cover your own mouth with a piece of duct tape.")
else
to_chat(user, "You cover [M]'s mouth with a piece of duct tape. That will shut them up!")
M.visible_message("<span class='warning'>[user] tapes [M]'s mouth shut!</span>")
var/obj/item/clothing/mask/muzzle/G = new /obj/item/clothing/mask/muzzle/tapegag
M.equip_to_slot(G, slot_wear_mask)
G.add_fingerprint(user)
amount = amount - 2
if(amount <= 0)
user.unEquip(src, 1)
qdel(src)
/* -- Disabled for now until it has a use --
/obj/item/stack/tape_roll/attack_self(mob/user as mob)
to_chat(user, "You remove a length of tape from [src].")
@@ -110,4 +139,4 @@
if(dir_offset & NORTH)
pixel_y += 32
else if(dir_offset & SOUTH)
pixel_y -= 32
pixel_y -= 32
+13
View File
@@ -23,6 +23,19 @@
// Reagent ID => friendly name
var/list/reagents_to_log=list()
var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart?
var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created.
/obj/New()
. = ..()
if(on_blueprints && isturf(loc))
var/turf/T = loc
if(force_blueprints)
T.add_blueprints(src)
else
T.add_blueprints_preround(src)
/obj/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state = default_state)
// Calling Topic without a corresponding window open causes runtime errors
if(!nowindow && ..())
@@ -320,7 +320,7 @@
return
step_towards(O, src.loc)
if(user != O)
user.show_viewers("<span class='danger'>[user] stuffs [O] into [src]!</span>")
user.visible_message("<span class='danger'>[user] stuffs [O] into [src]!</span>", "<span class='danger'>You stuff [O] into [src]!</span>")
src.add_fingerprint(user)
/obj/structure/closet/attack_ai(mob/user)
@@ -58,6 +58,7 @@
return
if(src.allowed(user))
src.locked = !src.locked
playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
for(var/mob/O in viewers(user, 3))
if((O.client && !( O.blinded )))
to_chat(O, "<span class='notice'>The locker has been [locked ? null : "un"]locked by [user].</span>")
@@ -172,4 +173,4 @@
if(istype(src.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace)
var/obj/structure/bigDelivery/BD = src.loc
BD.attack_hand(usr)
open()
open()
+1
View File
@@ -17,6 +17,7 @@
if(!AC)
AC = new(src, user)
AC.name = "SalonPro Nano-Mirror&trade;"
AC.flags = APPEARANCE_ALL_BODY
ui_users[user] = AC
AC.ui_interact(user)
+9 -8
View File
@@ -148,6 +148,7 @@ var/send_emergency_team
/client/proc/create_response_team(obj/spawn_location)
var/mob/living/carbon/human/M = new(null)
var/obj/item/organ/external/head/head_organ = M.get_organ("head")
response_team_members |= M
var/new_gender = alert(usr, "Please select your gender.", "Character Generation", "Male", "Female")
@@ -173,18 +174,18 @@ var/send_emergency_team
if(prob(5))
facial_hair_style = pick(facial_hair_styles_list)
M.r_facial = hex2num(copytext(hair_c, 2, 4))
M.g_facial = hex2num(copytext(hair_c, 4, 6))
M.b_facial = hex2num(copytext(hair_c, 6, 8))
M.r_hair = hex2num(copytext(hair_c, 2, 4))
M.g_hair = hex2num(copytext(hair_c, 4, 6))
M.b_hair = hex2num(copytext(hair_c, 6, 8))
head_organ.r_facial = hex2num(copytext(hair_c, 2, 4))
head_organ.g_facial = hex2num(copytext(hair_c, 4, 6))
head_organ.b_facial = hex2num(copytext(hair_c, 6, 8))
head_organ.r_hair = hex2num(copytext(hair_c, 2, 4))
head_organ.g_hair = hex2num(copytext(hair_c, 4, 6))
head_organ.b_hair = hex2num(copytext(hair_c, 6, 8))
M.r_eyes = hex2num(copytext(eye_c, 2, 4))
M.g_eyes = hex2num(copytext(eye_c, 4, 6))
M.b_eyes = hex2num(copytext(eye_c, 6, 8))
M.s_tone = skin_tone
M.h_style = hair_style
M.f_style = facial_hair_style
head_organ.h_style = hair_style
head_organ.f_style = facial_hair_style
M.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]"
M.name = M.real_name
+1 -1
View File
@@ -67,7 +67,7 @@
else
to_chat(user, "<span class='warning'>The plating is going to need some support! Place metal rods first.</span>")
/turf/space/Entered(atom/movable/A as mob|obj)
/turf/space/Entered(atom/movable/A as mob|obj, atom/OL, ignoreRest = 0)
..()
if(destination_z && A && (src in A.locs))
+1 -1
View File
@@ -85,7 +85,7 @@
/turf/space/transit/horizontal
dir = WEST
/turf/space/transit/Entered(atom/movable/AM, atom/OldLoc)
/turf/space/transit/Entered(atom/movable/AM, atom/OldLoc, ignoreRest = 0)
if(!AM)
return
if(istype(AM, /obj/docking_port) || !AM.simulated)
+22 -2
View File
@@ -29,6 +29,8 @@
var/image/obscured //camerachunks
var/list/blueprint_data //for the station blueprints, images of objects eg: pipes
var/list/footstep_sounds = list()
var/shoe_running_volume = 50
var/shoe_walking_volume = 20
@@ -119,7 +121,7 @@
return 1 //Nothing found to block so return success!
/turf/Entered(atom/movable/M)
/turf/Entered(atom/movable/M, atom/OL, ignoreRest = 0)
if(ismob(M))
var/mob/O = M
if(!O.lastarea)
@@ -161,6 +163,7 @@
var/old_dynamic_lighting = dynamic_lighting
var/list/old_affecting_lights = affecting_lights
var/old_lighting_overlay = lighting_overlay
var/old_blueprint_data = blueprint_data
if(air_master)
air_master.remove_from_active(src)
@@ -170,6 +173,7 @@
if(istype(W, /turf/simulated))
W:Assimilate_Air()
W.RemoveLattice()
W.blueprint_data = old_blueprint_data
for(var/turf/space/S in range(W,1))
S.update_starlight()
@@ -384,4 +388,20 @@
return 1
/turf/proc/can_lay_cable()
return can_have_cabling() & !intact
return can_have_cabling() & !intact
/turf/proc/add_blueprints(atom/movable/AM)
var/image/I = new
I.appearance = AM.appearance
I.appearance_flags = RESET_COLOR|RESET_ALPHA|RESET_TRANSFORM
I.loc = src
I.dir = AM.dir
I.alpha = 128
if(!blueprint_data)
blueprint_data = list()
blueprint_data += I
/turf/proc/add_blueprints_preround(atom/movable/AM)
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
add_blueprints(AM)
+5
View File
@@ -142,6 +142,11 @@ var/global/nologevent = 0
if(istype(M, /mob/dead/observer))
body += "<a href='?_src_=holder;incarn_ghost=\ref[M]'>Re-incarnate</a> | "
if(ispAI(M))
body += "<B>Is a pAI</B> "
else
body += "<A href='?_src_=holder;makePAI=\ref[M]'>Make pAI</A> | "
// DNA2 - Admin Hax
if(M.dna && iscarbon(M))
body += "<br><br>"
+22
View File
@@ -1142,6 +1142,28 @@
message_admins("\blue [key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1)
H.corgize()
else if(href_list["makePAI"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["makePAI"])
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
var/painame = "Default"
var/name = ""
if(alert(usr, "Do you want to set their name or let them choose their own name?", "Name Choice", "Set Name", "Let them choose") == "Set Name")
name = sanitize(copytext(input(usr, "Enter a name for the new pAI. Default name is [painame].", "pAI Name", painame),1,MAX_NAME_LEN))
else
name = sanitize(copytext(input(H, "An admin wants to make you into a pAI. Choose a name. Default is [painame].", "pAI Name", painame),1,MAX_NAME_LEN))
if(!name)
name = painame
log_admin("[key_name(usr)] attempting to pAIze [key_name(H)]")
message_admins("\blue [key_name_admin(usr)] attempting to pAIze [key_name_admin(H)]", 1)
H.paize(name)
else if(href_list["forcespeech"])
if(!check_rights(R_SERVER|R_EVENT)) return
+6 -3
View File
@@ -497,6 +497,7 @@ client/proc/one_click_antag()
/datum/admins/proc/create_vox_raider(obj/spawn_location, leader_chosen = 0)
var/mob/living/carbon/human/new_vox = new(spawn_location.loc, "Vox")
var/obj/item/organ/external/head/head_organ = new_vox.get_organ("head")
var/sounds = rand(2,8)
var/i = 0
@@ -515,8 +516,8 @@ client/proc/one_click_antag()
new_vox.add_language("Vox-pidgin")
new_vox.add_language("Galactic Common")
new_vox.add_language("Tradeband")
new_vox.h_style = "Short Vox Quills"
new_vox.f_style = "Shaved"
head_organ.h_style = "Short Vox Quills"
head_organ.f_style = "Shaved"
for(var/obj/item/organ/external/limb in new_vox.organs)
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
@@ -557,7 +558,9 @@ client/proc/one_click_antag()
for(var/i = 0, i<numVampires, i++)
H = pick(candidates)
H.make_vampire()
ticker.mode.vampires += H.mind
ticker.mode.grant_vampire_powers(H)
ticker.mode.update_vampire_icons_added(H.mind)
candidates.Remove(H)
return 1
+18 -8
View File
@@ -52,7 +52,7 @@ var/list/sounds_cache = list()
set desc = "Plays a sound at every intercomm on the station z level. Works best with small sounds."
if(!check_rights(R_SOUNDS)) return
var/A = alert("This will play a sound at every intercomm on the station Z, are you sure you want to continue? This works best with short sounds, beware.","Warning","Yep","Nope")
var/A = alert("This will play a sound at every intercomm, are you sure you want to continue? This works best with short sounds, beware.","Warning","Yep","Nope")
if(A != "Yep") return
var/list/sounds = file2list("sound/serversound_list.txt");
@@ -67,15 +67,25 @@ var/list/sounds_cache = list()
if(inputvol && inputvol >= 1 && inputvol <= 70)
cvol = inputvol
var/list/intercomms = list()
//Allows for override to utilize intercomms on all z-levels
var/B = alert("Do you want to play through intercomms on ALL Z-levels, or just the station?", "Override", "All", "Station")
var/ignore_z = 0
if(B == "All")
ignore_z = 1
for(var/obj/item/device/radio/intercom/I in world)
if(I.z != ZLEVEL_STATION) continue
intercomms += I
//Allows for override to utilize incomplete and unpowered intercomms
var/C = alert("Do you want to play through unpowered / incomplete intercomms, so the crew can't silence it?", "Override", "Yep", "Nope")
var/ignore_power = 0
if(C == "Yep")
ignore_power = 1
if(intercomms.len)
for(var/obj/item/device/radio/intercom/I in intercomms)
playsound(I, melody, cvol)
for(var/O in global_intercoms)
var/obj/item/device/radio/intercom/I = O
if(I.z != ZLEVEL_STATION && !ignore_z)
continue
if(!I.on && !ignore_power)
continue
playsound(I, melody, cvol)
/*
/client/proc/cuban_pete()
@@ -19,9 +19,6 @@
* Areas
*/
//Gateroom gets its own APC specifically for the gate
/area/awaymission
report_alerts = 0
/area/awaymission/gateroom
//Library, medbay, storage room
+166 -190
View File
@@ -63,6 +63,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
#define MAX_SAVE_SLOTS 20 // Save slots for regular players
#define MAX_SAVE_SLOTS_MEMBER 20 // Save slots for BYOND members
#define TAB_CHAR 0
#define TAB_GAME 1
/datum/preferences
//doohickeys for savefiles
// var/path
@@ -174,7 +177,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/nanotrasen_relation = "Neutral"
// 0 = character settings, 1 = game preferences
var/current_tab = 0
var/current_tab = TAB_CHAR
// OOC Metadata:
var/metadata = ""
@@ -207,229 +210,198 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
save_preferences(C)
save_character(C) //let's save this new random character so it doesn't keep generating new ones.
/datum/preferences/proc/color_square(r, g, b)
return "<span style='font-face: fixedsys; background-color: #[num2hex(r, 2)][num2hex(g, 2)][num2hex(b, 2)]; color: #[num2hex(r, 2)][num2hex(g, 2)][num2hex(b, 2)]'>___</span>"
// Hello I am a proc full of snowflake species checks how are you
/datum/preferences/proc/ShowChoices(mob/user)
if(!user || !user.client) return
if(!user || !user.client)
return
update_preview_icon()
user << browse_rsc(preview_icon_front, "previewicon.png")
user << browse_rsc(preview_icon_side, "previewicon2.png")
var/dat = "<html><body><center>"
dat += "<a href='?_src_=prefs;preference=tab;tab=0' [current_tab == 0 ? "class='linkOn'" : ""]>Character Settings</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=1' [current_tab == 1 ? "class='linkOn'" : ""]>Game Preferences</a>"
var/dat = ""
dat += "<center>"
dat += "<a href='?_src_=prefs;preference=tab;tab=[TAB_CHAR]' [current_tab == TAB_CHAR ? "class='linkOn'" : ""]>Character Settings</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=[TAB_GAME]' [current_tab == TAB_GAME ? "class='linkOn'" : ""]>Game Preferences</a>"
dat += "</center>"
dat += "<HR>"
switch(current_tab)
if (0) // Character Settings#
if(TAB_CHAR) // Character Settings
dat += "<div class='statusDisplay' style='max-width: 128px; position: absolute; left: 150px; top: 150px'><img src=previewicon.png height=64 width=64><img src=previewicon2.png height=64 width=64></div>"
dat += "<table width='100%'><tr><td width='405px' height='25px' valign='top'>"
dat += "<b>Name: </b>"
dat += "<a href='?_src_=prefs;preference=name;task=input'><b>[real_name]</b></a>"
dat += "<a href='?_src_=prefs;preference=name;task=random'>(Randomize)</a>"
dat += "<a href='?_src_=prefs;preference=name'><span class='[be_random_name ? "good" : "bad"]'>(Always Randomize)</span></a><br>"
dat += "</td><td width='405px' height='25px' valign='left'>"
dat += "<center>"
dat += "Slot <b>[slot_name]</b> - "
dat += "<a href=\"byond://?src=\ref[user];preference=open_load_dialog\">Load slot</a> - "
dat += "<a href=\"byond://?src=\ref[user];preference=save\">Save slot</a> - "
dat += "<a href=\"byond://?src=\ref[user];preference=reload\">Reload slot</a>"
dat += "</center>"
dat += "<center><h2>Occupation Choices</h2>"
dat += "<a href='?_src_=prefs;preference=job;task=menu'>Set Occupation Preferences</a><br></center>"
dat += "</td></tr></table>"
dat += "<table width='100%'><tr><td width='405px' height='200px' valign='top'>"
dat += "<h2>Identity</h2>"
dat += "<table width='100%'><tr><td width='75%' valign='top'>"
if(appearance_isbanned(user))
dat += "<b>You are banned from using custom names and appearances. You can continue to adjust your characters, but you will be randomised once you join the game.</b><br>"
dat += "<b>Name:</b> "
dat += "<a href='?_src_=prefs;preference=name;task=input'><b>[real_name]</b></a><br>"
dat += "(<a href='?_src_=prefs;preference=name;task=random'>Random Name</A>) "
dat += "(<a href='?_src_=prefs;preference=name'>Always Random Name: [be_random_name ? "Yes" : "No"]</a>)"
dat += "<br>"
dat += "<b>Gender:</b> <a href='?_src_=prefs;preference=gender'><b>[gender == MALE ? "Male" : "Female"]</b></a><br>"
dat += "<b>Age:</b> <a href='?_src_=prefs;preference=age;task=input'>[age]</a>"
//dat += "<b>Spawn Point</b>: <a href='byond://?src=\ref[user];preference=spawnpoint;task=input'>[spawnpoint]</a>"
dat += "<br><table><tr><td><b>Body</b> "
dat += "(<a href='?_src_=prefs;preference=all;task=random'>&reg;</A>)"
dat += "<br>"
dat += "Species: <a href='?_src_=prefs;preference=species;task=input'>[species]</a><br>"
if(species == "Vox")//oldvox code, sucks I know
dat += "N2 Tank: <a href='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]</a><br>"
dat += "Secondary Language:<br><a href='?_src_=prefs;preference=language;task=input'>[language]</a><br>"
dat += "Blood Type: <a href='?_src_=prefs;preference=b_type;task=input'>[b_type]</a><br>"
dat += "<b>You are banned from using custom names and appearances. \
You can continue to adjust your characters, but you will be randomised once you join the game.\
</b><br>"
dat += "<b>Gender:</b> <a href='?_src_=prefs;preference=gender'>[gender == MALE ? "Male" : "Female"]</a><br>"
dat += "<b>Age:</b> <a href='?_src_=prefs;preference=age;task=input'>[age]</a><br>"
dat += "<b>Body:</b> <a href='?_src_=prefs;preference=all;task=random'>(&reg;)</a><br>"
dat += "<b>Species:</b> <a href='?_src_=prefs;preference=species;task=input'>[species]</a><br>"
if(species == "Vox")
dat += "<b>N2 Tank:</b> <a href='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]</a><br>"
dat += "<b>Secondary Language:</b> <a href='?_src_=prefs;preference=language;task=input'>[language]</a><br>"
dat += "<b>Blood Type:</b> <a href='?_src_=prefs;preference=b_type;task=input'>[b_type]</a><br>"
if(species in list("Human", "Drask"))
dat += "Skin Tone: <a href='?_src_=prefs;preference=s_tone;task=input'>[-s_tone + 35]/220</a><br>"
dat += "<b>Skin Tone:</b> <a href='?_src_=prefs;preference=s_tone;task=input'>[-s_tone + 35]/220</a><br>"
dat += "<b>Disabilities:</b> <a href='?_src_=prefs;preference=disabilities'>\[Set\]</a><br>"
dat += "<b>Nanotrasen Relation:</b> <a href ='?_src_=prefs;preference=nt_relation;task=input'>[nanotrasen_relation]</a><br>"
dat += "<a href='byond://?src=\ref[user];preference=flavor_text;task=input'>Set Flavor Text</a><br>"
if(lentext(flavor_text) <= 40)
if(!lentext(flavor_text)) dat += "\[...\]<br>"
else dat += "[flavor_text]<br>"
else dat += "[TextPreview(flavor_text)]...<br>"
// dat += "Skin pattern: <a href='byond://?src=\ref[user];preference=skin_style;task=input'>Adjust</a><br>"
dat += "<br><b>Handicaps</b><br>"
dat += "\t<a href='?_src_=prefs;preference=disabilities'><b>\[Set Disabilities\]</b></a><br>"
dat += "Limbs and Parts: <a href='?_src_=prefs;preference=limbs;task=input'>Adjust</a><br>"
dat += "<h2>Hair & Accessories</h2>"
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
var/headaccessoryname = "Head Accessory: "
if(species == "Unathi")
headaccessoryname = "Horns: "
dat += "<b>[headaccessoryname]</b>"
dat += "<a href='?_src_=prefs;preference=ha_style;task=input'>[ha_style]</a> "
dat += "<a href='?_src_=prefs;preference=headaccessory;task=input'>Color</a> [color_square(r_headacc, g_headacc, b_headacc)]<br>"
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings.
dat += "<b>Body Markings:</b> "
dat += "<a href='?_src_=prefs;preference=m_style;task=input'>[m_style]</a>"
dat += "<a href='?_src_=prefs;preference=markings;task=input'>Color</a> [color_square(r_markings, g_markings, b_markings)]<br>"
dat += "<b>Hair:</b> "
dat += "<a href='?_src_=prefs;preference=h_style;task=input'>[h_style]</a>"
dat += "<a href='?_src_=prefs;preference=hair;task=input'>Color</a> [color_square(r_hair, g_hair, b_hair)]<br>"
dat += "<b>Facial Hair:</b> "
dat += "<a href='?_src_=prefs;preference=f_style;task=input'>[f_style ? "[f_style]" : "Shaved"]</a>"
dat += "<a href='?_src_=prefs;preference=facial;task=input'>Color</a> [color_square(r_facial, g_facial, b_facial)]<br>"
if(species != "Machine")
dat += "<b>Eyes:</b> "
dat += "<a href='?_src_=prefs;preference=eyes;task=input'>Color</a> [color_square(r_eyes, g_eyes, b_eyes)]<br>"
if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
dat += "<b>Body Color:</b> "
dat += "<a href='?_src_=prefs;preference=skin;task=input'>Color</a> [color_square(r_skin, g_skin, b_skin)]<br>"
if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
dat += "<b>Body Accessory:</b> "
dat += "<a href='?_src_=prefs;preference=body_accessory;task=input'>[body_accessory ? "[body_accessory]" : "None"]</a><br>"
dat += "</td><td width='405px' height='200px' valign='top'>"
dat += "<h2>Occupation Choices</h2>"
dat += "<a href='?_src_=prefs;preference=job;task=menu'>Set Occupation Preferences</a><br>"
if(jobban_isbanned(user, "Records"))
dat += "<b>You are banned from using character records.</b><br>"
else
dat += "<a href=\"byond://?src=\ref[user];preference=records;record=1\">Character Records</a><br>"
dat += "<h2>Limbs</h2>"
dat += "<b>Limbs and Parts:</b> <a href='?_src_=prefs;preference=limbs;task=input'>Adjust</a><br>"
if(species != "Slime People" && species != "Machine")
dat += "Internal Organs: <a href='?_src_=prefs;preference=organs;task=input'>Adjust</a><br>"
dat += "<b>Internal Organs:</b> <a href='?_src_=prefs;preference=organs;task=input'>Adjust</a><br>"
//display limbs below
var/ind = 0
for(var/name in organ_data)
// to_chat(world, "[ind] \ [organ_data.len]")
var/status = organ_data[name]
var/organ_name = null
switch(name)
if("chest")
organ_name = "torso"
if("groin")
organ_name = "lower body"
if("head")
organ_name = "head"
if("l_arm")
organ_name = "left arm"
if("r_arm")
organ_name = "right arm"
if("l_leg")
organ_name = "left leg"
if("r_leg")
organ_name = "right leg"
if("l_foot")
organ_name = "left foot"
if("r_foot")
organ_name = "right foot"
if("l_hand")
organ_name = "left hand"
if("r_hand")
organ_name = "right hand"
if("heart")
organ_name = "heart"
if("eyes")
organ_name = "eyes"
if("chest") organ_name = "torso"
if("groin") organ_name = "lower body"
if("head") organ_name = "head"
if("l_arm") organ_name = "left arm"
if("r_arm") organ_name = "right arm"
if("l_leg") organ_name = "left leg"
if("r_leg") organ_name = "right leg"
if("l_foot") organ_name = "left foot"
if("r_foot") organ_name = "right foot"
if("l_hand") organ_name = "left hand"
if("r_hand") organ_name = "right hand"
if("heart") organ_name = "heart"
if("eyes") organ_name = "eyes"
if(status == "cyborg")
if(status in list("cyborg", "amputated", "mechanical", "assisted"))
++ind
if(ind > 1)
dat += ", "
var/datum/robolimb/R
if(rlimb_data[name] && all_robolimbs[rlimb_data[name]])
R = all_robolimbs[rlimb_data[name]]
else
R = basic_robolimb
dat += "\t[R.company] [organ_name] prosthesis"
if(ind > 1) dat += ", "
else if(status == "amputated")
++ind
if(ind > 1)
dat += ", "
dat += "\tAmputated [organ_name]"
else if(status == "mechanical")
++ind
if(ind > 1)
dat += ", "
dat += "\tMechanical [organ_name]"
else if(status == "assisted")
++ind
if(ind > 1)
dat += ", "
switch(organ_name)
if("heart")
dat += "\tPacemaker-assisted [organ_name]"
if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements
dat += "\tSurgically altered [organ_name]"
if("eyes")
dat += "\tRetinal overlayed [organ_name]"
switch(status)
if("cyborg")
var/datum/robolimb/R
if(rlimb_data[name] && all_robolimbs[rlimb_data[name]])
R = all_robolimbs[rlimb_data[name]]
else
dat += "\tMechanically assisted [organ_name]"
if(!ind)
dat += "\[...\]<br><br>"
else
dat += "<br><br>"
dat += "<b>Underwear:</b><BR><a href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a><BR>"
dat += "<b>Undershirt:</b><BR><a href ='?_src_=prefs;preference=undershirt;task=input'>[undershirt]</a><BR>"
dat += "<b>Socks:</b><BR><a href ='?_src_=prefs;preference=socks;task=input'>[socks]</a><BR>"
dat += "Backpack Type:<br><a href ='?_src_=prefs;preference=bag;task=input'><b>[backbaglist[backbag]]</b></a><br>"
dat += "Nanotrasen Relation:<br><a href ='?_src_=prefs;preference=nt_relation;task=input'><b>[nanotrasen_relation]</b></a><br>"
dat += "</td><td><b>Preview</b><br><img src=previewicon.png height=64 width=64><img src=previewicon2.png height=64 width=64></td></tr></table>"
dat += "</td><td width='300px' height='300px'>"
R = basic_robolimb
dat += "\t[R.company] [organ_name] prosthesis"
if("amputated") dat += "\tAmputated [organ_name]"
if("mechanical") dat += "\tMechanical [organ_name]"
if("assisted")
switch(organ_name)
if("heart") dat += "\tPacemaker-assisted [organ_name]"
if("voicebox") dat += "\tSurgically altered [organ_name]"
if("eyes") dat += "\tRetinal overlayed [organ_name]"
else dat += "\tMechanically assisted [organ_name]"
if(!ind) dat += "\[...\]<br>"
else dat += "<br>"
if(jobban_isbanned(user, "Records"))
dat += "<b>You are banned from using character records.</b><br>"
else
dat += "<b><a href=\"byond://?src=\ref[user];preference=records;record=1\">Character Records</a></b><br>"
dat += "<a href='byond://?src=\ref[user];preference=flavor_text;task=input'><b>Set Flavor Text</b></a><br>"
if(lentext(flavor_text) <= 40)
if(!lentext(flavor_text))
dat += "\[...\]"
else
dat += "[flavor_text]"
else
dat += "[TextPreview(flavor_text)]...<br>"
dat += "<br>"
dat += "<h2>Clothing</h2>"
dat += "<b>Underwear:</b> <a href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a><BR>"
dat += "<b>Undershirt:</b> <a href ='?_src_=prefs;preference=undershirt;task=input'>[undershirt]</a><BR>"
dat += "<b>Socks:</b> <a href ='?_src_=prefs;preference=socks;task=input'>[socks]</a><BR>"
dat += "<b>Backpack Type:</b> <a href ='?_src_=prefs;preference=bag;task=input'>[backbaglist[backbag]]</a><br>"
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
var/headaccessoryname = "Head Accessory"
if(species == "Unathi")
headaccessoryname = "Horns"
dat += "<br><b>[headaccessoryname]</b><br>"
dat += "<a href='?_src_=prefs;preference=headaccessory;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_headacc, 2)][num2hex(g_headacc, 2)][num2hex(b_headacc, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_headacc, 2)][num2hex(g_headacc, 2)][num2hex(b_headacc)]'><tr><td>__</td></tr></table></font> "
dat += "Style: <a href='?_src_=prefs;preference=ha_style;task=input'>[ha_style]</a><br>"
dat += "</td></tr></table>"
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings.
dat += "<br><b>Body Markings</b><br>"
dat += "<a href='?_src_=prefs;preference=markings;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_markings, 2)][num2hex(g_markings, 2)][num2hex(b_markings, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_markings, 2)][num2hex(g_markings, 2)][num2hex(b_markings)]'><tr><td>__</td></tr></table></font> "
dat += "<br>Style: <a href='?_src_=prefs;preference=m_style;task=input'>[m_style]</a><br>"
dat += "<br><b>Hair</b><br>"
dat += "<a href='?_src_=prefs;preference=hair;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair)]'><tr><td>__</td></tr></table></font> "
dat += " <br>Style: <a href='?_src_=prefs;preference=h_style;task=input'>[h_style]</a><br>"
dat += "<br><b>Facial Hair</b><br>"
dat += "<a href='?_src_=prefs;preference=facial;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_facial, 2)][num2hex(g_facial, 2)][num2hex(b_facial, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_facial, 2)][num2hex(g_facial, 2)][num2hex(b_facial)]'><tr><td>__</td></tr></table></font> "
dat += " <br>Style: <a href='?_src_=prefs;preference=f_style;task=input'>[f_style ? "[f_style]" : "Shaved"]</a><br>"
if(species != "Machine")
dat += "<br><b>Eyes</b><br>"
dat += "<a href='?_src_=prefs;preference=eyes;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes)]'><tr><td>__</td></tr></table></font><br>"
if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
dat += "<br><b>Body Color</b><br>"
dat += "<a href='?_src_=prefs;preference=skin;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_skin, 2)][num2hex(g_skin, 2)][num2hex(b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_skin, 2)][num2hex(g_skin, 2)][num2hex(b_skin)]'><tr><td>__</td></tr></table></font>"
if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
dat += "<br><b>Body Accessory</b><br>"
dat += "Accessory: <a href='?_src_=prefs;preference=body_accessory;task=input'>[body_accessory ? "[body_accessory]" : "None"]</a><br>"
dat += "</td></tr></table><hr><center>"
if (1) // General Preferences
if(TAB_GAME) // General Preferences
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
dat += "<h2>General Settings</h2>"
dat += "<b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
dat += "<b>Fancy NanoUI:</b> <a href='?_src_=prefs;preference=nanoui'>[(nanoui_fancy) ? "Yes" : "No"]</a><br>"
dat += "<b>Ghost-Item Attack Animation:</b> <a href='?_src_=prefs;preference=ghost_att_anim'>[(show_ghostitem_attack) ? "Yes" : "No"]</a><br>"
dat += "<b>Custom UI settings:</b><br>"
dat += "<b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <table style='display:inline;' bgcolor='[UI_style_color]'><tr><td>__</td></tr></table><br>"
dat += "<b>Alpha (transparency):</b> <a href='?_src_=prefs;preference=UIalpha'><b>[UI_style_alpha]</b></a><br>"
dat += " - <b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
dat += " - <b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <table style='display:inline;' bgcolor='[UI_style_color]'<tr><td>__</td></tr></table><br>"
dat += " - <b>Alpha (transparency):</b> <a href='?_src_=prefs;preference=UIalpha'><b>[UI_style_alpha]</b></a><br>"
dat += "<br>"
dat += "<b>Play admin midis:</b> <a href='?_src_=prefs;preference=hear_midis'><b>[(sound & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>"
dat += "<b>Play lobby music:</b> <a href='?_src_=prefs;preference=lobby_music'><b>[(sound & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>"
if(user.client.holder)
dat += "<b>Adminhelp sound:</b> "
dat += "<a href='?_src_=prefs;preference=hear_adminhelps'><b>[(sound & SOUND_ADMINHELP)?"On":"Off"]</b></a><br>"
if(check_rights(R_ADMIN,0))
dat += "<b>OOC:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : normal_ooc_colour];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
if(config.allow_Metadata)
dat += "<b>OOC notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'><b>Edit</b></a><br>"
if(unlock_content)
dat += "<b>BYOND Membership Publicity:</b> <a href='?_src_=prefs;preference=publicity'><b>[(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
dat += "<b>Randomized character slot:</b> <a href='?_src_=prefs;preference=randomslot'><b>[randomslot ? "Yes" : "No"]</b></a><br>"
dat += "<b>Ghost ears:</b> <a href='?_src_=prefs;preference=ghost_ears'><b>[(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]</b></a><br>"
dat += "<b>Ghost sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]</b></a><br>"
dat += "<b>Ghost radio:</b> <a href='?_src_=prefs;preference=ghost_radio'><b>[(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]</b></a><br>"
if(config.allow_Metadata)
dat += "<b>OOC notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'><b>Edit</b></a><br>"
if(user.client)
if(user.client.holder)
dat += "<b>Adminhelp sound:</b> "
dat += "<a href='?_src_=prefs;preference=hear_adminhelps'><b>[(sound & SOUND_ADMINHELP)?"On":"Off"]</b></a><br>"
if(check_rights(R_ADMIN,0))
dat += "<b>OOC:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : normal_ooc_colour];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
if(unlock_content)
dat += "<b>BYOND Membership Publicity:</b> <a href='?_src_=prefs;preference=publicity'><b>[(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
dat += "</td><td width='300px' height='300px' valign='top'>"
dat += "<h2>Special Role Settings</h2>"
// dat += "<br><br>"
if(jobban_isbanned(user, "Syndicate"))
dat += "<b>You are banned from special roles.</b>"
src.be_special = list()
be_special = list()
else
for (var/i in special_roles)
for(var/i in special_roles)
if(jobban_isbanned(user, i))
dat += "<b>Be [capitalize(i)]:</b> <font color=red><b> \[BANNED]</b></font><br>"
else if(!player_old_enough_antag(user.client,i))
@@ -437,17 +409,17 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "<b>Be [capitalize(i)]:</b> <font color=red><b> \[IN [(available_in_days_antag)] DAYS]</b></font><br>"
else
dat += "<b>Be [capitalize(i)]:</b> <a href='?_src_=prefs;preference=be_special;role=[i]'><b>[(i in src.be_special) ? "Yes" : "No"]</b></a><br>"
dat += "</td></tr></table><hr><center>"
dat += "</td></tr></table>"
dat += "<hr><center>"
if(!IsGuestKey(user.key))
dat += "<a href='?_src_=prefs;preference=load'>Undo</a> - "
dat += "<a href='?_src_=prefs;preference=save'>Save Setup</a> - "
dat += "<a href='?_src_=prefs;preference=reset_all'>Reset Setup</a>"
dat += "</center></body></html>"
dat += "</center>"
// user << browse(dat, "window=preferences;size=560x580")
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 640, 810)
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 820, 640)
popup.set_content(dat)
popup.open(0)
@@ -1631,7 +1603,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("nanoui")
nanoui_fancy = !nanoui_fancy
if("ghost_att_anim")
if("ghost_att_anim")
show_ghostitem_attack = !show_ghostitem_attack
if("UIcolor")
@@ -1701,6 +1673,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("open_load_dialog")
if(!IsGuestKey(user.key))
open_load_dialog(user)
return 1
if("close_load_dialog")
close_load_dialog(user)
@@ -1753,13 +1726,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.g_eyes = g_eyes
character.b_eyes = b_eyes
character.r_hair = r_hair
character.g_hair = g_hair
character.b_hair = b_hair
//Head-specific
var/obj/item/organ/external/head/H = character.get_organ("head")
H.r_hair = r_hair
H.g_hair = g_hair
H.b_hair = b_hair
character.r_facial = r_facial
character.g_facial = g_facial
character.b_facial = b_facial
H.r_facial = r_facial
H.g_facial = g_facial
H.b_facial = b_facial
H.h_style = h_style
H.f_style = f_style
//End of head-specific.
character.r_skin = r_skin
character.g_skin = g_skin
@@ -1767,9 +1746,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.s_tone = s_tone
character.h_style = h_style
character.f_style = f_style
// Destroy/cyborgize organs
for(var/name in organ_data)
@@ -1846,10 +1822,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.socks = socks
if(character.species.bodyflags & HAS_HEAD_ACCESSORY)
character.r_headacc = r_headacc
character.g_headacc = g_headacc
character.b_headacc = b_headacc
character.ha_style = ha_style
H.r_headacc = r_headacc
H.g_headacc = g_headacc
H.b_headacc = b_headacc
H.ha_style = ha_style
if(character.species.bodyflags & HAS_MARKINGS)
character.r_markings = r_markings
character.g_markings = g_markings
+5 -2
View File
@@ -176,9 +176,11 @@
/obj/item/clothing/head/kitty/update_icon(var/mob/living/carbon/human/user)
if(!istype(user)) return
var/obj/item/organ/external/head/head_organ = user.get_organ("head")
mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty")
// mob2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty2") - Commented out because it seemingly does nothing.
mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
mob.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
// mob2.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) - Commented out because it seemingly does nothing.
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner")
@@ -201,8 +203,9 @@
/obj/item/clothing/head/kitty/mouse/update_icon(var/mob/living/carbon/human/user)
if(!istype(user)) return
var/obj/item/organ/external/head/head_organ = user.get_organ("head")
mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mousey")
mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
mob.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mouseyinner")
mob.Blend(earbit, ICON_OVERLAY)
+31 -1
View File
@@ -7,6 +7,8 @@
w_class = 2
gas_transfer_coefficient = 0.90
put_on_delay = 20
var/resist_time = 0 //deciseconds of how long you need to gnaw to get rid of the gag, 0 to make it impossible to remove
var/mute = 1 // 1 - completely mutes you, 0 - muffles everything you say "MHHPHHMMM!!!"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi'
@@ -24,6 +26,34 @@
icon_state = "gag"
w_class = 1
/obj/item/clothing/mask/muzzle/tapegag
name = "tape gag"
desc = "MHPMHHH!"
icon_state = "tapegag"
item_state = null
w_class = 1
resist_time = 150
mute = 0
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
)
/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user)
var/atom/movable/R = new /obj/item/trash/tapetrash
if(user.species.bodyflags & HAS_FUR)
R.desc += " Is that...fur?"
var/turf/T = get_turf(src)
R.loc = T
transfer_fingerprints_to(R)
playsound(src,'sound/items/poster_ripped.ogg',40,1)
spawn(0) // Because of how dropping is done, if the muzzle gets deleted now, icons won't properly update and the whole unEquip() proc will break stuff.
qdel(src) // This makes sure it gets deleted AFTER all that has to be done is done.
user.emote("scream")
/obj/item/clothing/mask/surgical
name = "sterile mask"
desc = "A sterile mask designed to help prevent the spread of diseases."
@@ -244,4 +274,4 @@ obj/item/clothing/mask/bandana/purple
name = "black bandana"
icon_state = "bandblack"
item_color = "black"
desc = "It's a black bandana."
desc = "It's a black bandana."
+30 -1
View File
@@ -25,8 +25,37 @@
items = list()
result = /obj/item/weapon/reagent_containers/food/snacks/chocolatebar
/datum/recipe/candy/fudge_peanut
reagents = list("sugar" = 5, "milk" = 5)
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
fruit = list("peanuts" = 3)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/peanut
/datum/recipe/candy/fudge_cherry
reagents = list("sugar" = 5, "milk" = 5)
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
fruit = list("cherries" = 3)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cherry
/datum/recipe/candy/fudge_cookies_n_cream
reagents = list("sugar" = 5, "milk" = 5, "cream" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
/obj/item/weapon/reagent_containers/food/snacks/cookie,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/cookies_n_cream
/datum/recipe/candy/fudge_turtle
reagents = list("sugar" = 5, "milk" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
/obj/item/weapon/reagent_containers/food/snacks/candy/caramel,
)
fruit = list("peanuts" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge/turtle
/datum/recipe/candy/fudge
reagents = list("sugar" = 5, "cream" = 5)
reagents = list("sugar" = 5, "milk" = 5)
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge
@@ -109,7 +109,7 @@
if((bee_resources >= BEE_RESOURCE_NEW_BEE_COST && prob(BEE_PROB_NEW_BEE)) || freebee)
if(!freebee)
bee_resources = max(bee_resources - BEE_RESOURCE_NEW_BEE_COST, 0)
var/mob/living/simple_animal/hostile/poison/bees/B = new(src)
var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src)
B.beehome = src
B.assign_reagent(queen_bee.beegent)
bees += B
@@ -180,7 +180,7 @@
visible_message("<span class='notice'>[user] sets [qb] down inside the apiary, making it their new home.</span>")
var/relocated = 0
for(var/b in bees)
var/mob/living/simple_animal/hostile/poison/bees/B = b
var/mob/living/simple_animal/hostile/poison/bees/worker/B = b
if(B.reagent_incompatible(queen_bee))
bees -= B
B.beehome = null
+2 -1
View File
@@ -40,7 +40,7 @@
seed_name = "ghost pepper"
display_name = "ghost pepper plants"
mutants = null
chems = list("capsaicin" = list(8,2), "condensedcapsaicin" = list(4,4), "plantmatter" = list(1,50))
chems = list("capsaicin" = list(8,2), "condensedcapsaicin" = list(4,4), "ghostchilijuice" = list(4,4), "plantmatter" = list(1,50))
kitchen_tag = "ghostchili"
preset_icon = "ghostchilipepper"
@@ -899,6 +899,7 @@
seed_name = "peanut"
display_name = "peanut vines"
chems = list("plantmatter" = list(1,10))
kitchen_tag = "peanuts"
preset_icon = "peanuts"
/datum/seed/peanuts/New()
+21 -13
View File
@@ -11,7 +11,7 @@
/obj/structure/closet/crate/secure/loot/New()
..()
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "z")
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
code = ""
for(var/i = 0, i < codelen, i++)
var/dig = pick(digits)
@@ -165,7 +165,7 @@
to_chat(user, "<span class='notice'>You leave the crate alone.</span>")
else
to_chat(user, "<span class='warning'>A red light flashes.</span>")
lastattempt = replacetext(input, 0, "z")
lastattempt = input
attempts--
if(attempts == 0)
boom(user)
@@ -186,19 +186,27 @@
else
to_chat(user, "<span class='notice'>* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts.</span>")
if(lastattempt != null)
var/list/guess = list()
var/guess = lastattempt
var/bulls = 0
var/cows = 0
for(var/i = 1, i < codelen + 1, i++)
var/a = copytext(lastattempt, i, i+1) //Stuff the code into the list
guess += a
guess[a] = i
for(var/i in guess) //Go through list and count matches
var/a = findtext(code, i)
if(a == guess[i])
++bulls
else if(a)
++cows
var/list/banned = list()
for(var/i; i <= length(lastattempt); i++)
var/list/a = strip_first(guess)
if(a[1] in banned)
continue
if(findtext(a[2], a[1]))
if(findtext(code, a[1], i, i+1))
++bulls
banned += a[1]
else
var/g = findtext(code, a[1])
if(g)
if(g == i)
++bulls
else
++cows
guess = a[2]
to_chat(user, "<span class='notice'>Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>")
else ..()
else ..()
+6 -6
View File
@@ -49,11 +49,11 @@
var/point_upgrade_temp = 1
var/sheet_per_ore_temp = 1
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
sheet_per_ore_temp = B.rating
sheet_per_ore_temp = 0.65 + (0.35 * B.rating)
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
ore_pickup_rate_temp = 15 * M.rating
for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts)
point_upgrade_temp = L.rating
point_upgrade_temp = 0.65 + (0.35 * L.rating)
ore_pickup_rate = ore_pickup_rate_temp
point_upgrade = point_upgrade_temp
sheet_per_ore = sheet_per_ore_temp
@@ -225,7 +225,7 @@
var/obj/item/stack/sheet/inp = stack_list[text2path(href_list["release"])]
var/obj/item/stack/sheet/out = new inp.type()
var/desired = input("How much?", "How much to eject?", 1) as num
out.amount = min(desired,50,inp.amount)
out.amount = round(min(desired,50,inp.amount))
if(out.amount >= 1)
inp.amount -= out.amount
unload_mineral(out)
@@ -242,7 +242,7 @@
var/desired = input("How much?", "How much would you like to smelt?", 1) as num
var/obj/item/stack/sheet/plasteel/plasteelout = new
plasteelout.amount = min(desired,50,metalstack.amount,plasmastack.amount)
plasteelout.amount = round(min(desired,50,metalstack.amount,plasmastack.amount))
if(plasteelout.amount >= 1)
metalstack.amount -= plasteelout.amount
plasmastack.amount -= plasteelout.amount
@@ -258,7 +258,7 @@
var/desired = input("How much?", "How much would you like to smelt?", 1) as num
var/obj/item/stack/sheet/plasmaglass/plasglassout = new
plasglassout.amount = min(desired, 50, glassstack.amount, plasmastack.amount)
plasglassout.amount = round(min(desired, 50, glassstack.amount, plasmastack.amount))
if(plasglassout.amount >= 1)
glassstack.amount -= plasglassout.amount
plasmastack.amount -= plasglassout.amount
@@ -811,7 +811,7 @@
O.forceMove(loc)
return
/mob/living/simple_animal/hostile/mining_drone/adjustBruteLoss()
/mob/living/simple_animal/hostile/mining_drone/adjustHealth()
if(search_objects)
SetOffenseBehavior()
..()
@@ -192,7 +192,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return 0
/mob/dead/observer/can_use_hands() return 0
/mob/dead/observer/is_active() return 0
/mob/dead/observer/Stat()
..()
+1 -2
View File
@@ -124,7 +124,6 @@
I.dropped(src)
if(I)
I.layer = initial(I.layer)
return 1
@@ -173,4 +172,4 @@
return l_hand
if(slot_r_hand)
return r_hand
return null
return null
@@ -8,7 +8,7 @@
// if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
// act = copytext(act,1,length(act)) //seriously who the fuck wrote this
var/muzzled = is_muzzled()
act = lowertext(act)
switch(act)
if("sign")
if(!restrained())
@@ -8,7 +8,7 @@
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = is_muzzled()
act = lowertext(act)
switch(act)
if ("me")
if(silent)
+3 -2
View File
@@ -44,14 +44,15 @@
user.drop_item()
B.forceMove(src)
held_brain = B
if(istype(O,/obj/item/organ/internal/brain/xeno)) // I'm not sure how well this will work now, since I don't think you can actually get xeno brains
if(istype(O,/obj/item/organ/internal/brain/xeno)) // kept the type check, as it still does other weird stuff
name = "Man-Machine Interface: Alien - [brainmob.real_name]"
icon = 'icons/mob/alien.dmi'
icon_state = "AlienMMI"
alien = 1
else
name = "Man-Machine Interface: [brainmob.real_name]"
icon_state = "mmi_full"
icon = B.mmi_icon
icon_state = "[B.mmi_icon_state]"
alien = 0
feedback_inc("cyborg_mmis_filled",1)

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