mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-26 21:48:21 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into BookClub
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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
@@ -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
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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")
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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>")
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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!")
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
if(!AC)
|
||||
AC = new(src, user)
|
||||
AC.name = "SalonPro Nano-Mirror™"
|
||||
AC.flags = APPEARANCE_ALL_BODY
|
||||
ui_users[user] = AC
|
||||
AC.ui_interact(user)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
@@ -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)
|
||||
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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'>®</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'>(®)</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];'> </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];'> </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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user