mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-29 08:08:49 +01:00
Merge branch 'master' into voiced-skeletons
This commit is contained in:
@@ -1,34 +1,35 @@
|
||||
"a" = (/turf/template_noop,/area/template_noop)
|
||||
"b" = (/turf/closed/wall/shuttle/smooth/nodiagonal{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"c" = (/obj/structure/closet/crate,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/storage/bag/ore,/obj/item/device/mining_scanner,/obj/item/device/flashlight/lantern,/obj/item/weapon/card/id/mining,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"d" = (/obj/structure/closet/crate,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/storage/bag/ore,/obj/item/device/mining_scanner,/obj/item/device/flashlight/lantern,/obj/item/weapon/card/id/mining,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"e" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"f" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"g" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"h" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "o2=14;n2=23;TEMP=300"},/area/ruin/powered)
|
||||
"i" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "o2=14;n2=23;TEMP=300"},/area/ruin/powered)
|
||||
"j" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"k" = (/obj/machinery/computer/arcade/battle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"l" = (/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"m" = (/obj/effect/mob_spawn/human/golem/adamantine,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"n" = (/obj/machinery/mineral/equipment_vendor/golem,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"o" = (/obj/item/weapon/resonator,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"p" = (/obj/machinery/mineral/ore_redemption,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"q" = (/obj/structure/statue/gold/rd,/obj/structure/window/reinforced{dir = 4; name = "shrine of the liberator"; pixel_x = 0},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"r" = (/obj/machinery/computer/shuttle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"s" = (/obj/structure/extinguisher_cabinet{pixel_y = 30},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"t" = (/obj/structure/table/wood,/obj/item/weapon/bedsheet/rd{desc = "Majestic."; layer = 3; name = "Royal Cape of the Liberator"; pixel_x = 5; pixel_y = 9},/obj/item/weapon/book/manual/research_and_development{name = "Sacred Text of the Liberator"; pixel_x = -4; pixel_y = 3},/obj/structure/window/reinforced{dir = 4; name = "shrine of the liberator"; pixel_x = 0},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"u" = (/obj/item/weapon/resonator/upgraded,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"v" = (/obj/machinery/autolathe,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"w" = (/obj/structure/table/wood,/obj/machinery/reagentgrinder,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"x" = (/obj/machinery/computer/arcade/orion_trail,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"y" = (/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"z" = (/obj/structure/table/wood,/obj/item/weapon/surgical_drapes{pixel_x = 15},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"A" = (/obj/item/weapon/storage/firstaid/fire,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"B" = (/obj/item/weapon/storage/firstaid/brute,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/brute,/obj/item/areaeditor/blueprints{desc = "Use to build new structures in the wastes."; name = "land claim"},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"C" = (/obj/item/weapon/storage/firstaid/brute,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/disk/design_disk/golem_shell,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"D" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"E" = (/obj/structure/ore_box,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered)
|
||||
"b" = (/turf/closed/wall/shuttle/smooth/nodiagonal{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"c" = (/obj/structure/closet/crate,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/storage/bag/ore,/obj/item/device/mining_scanner,/obj/item/device/flashlight/lantern,/obj/item/weapon/card/id/mining,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"d" = (/obj/structure/closet/crate,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/storage/bag/ore,/obj/item/device/mining_scanner,/obj/item/device/flashlight/lantern,/obj/item/weapon/card/id/mining,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"e" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"f" = (/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"g" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"h" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "o2=14;n2=23;TEMP=300"},/area/ruin/powered/golem_ship)
|
||||
"i" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth; initial_gas_mix = "o2=14;n2=23;TEMP=300"},/area/ruin/powered/golem_ship)
|
||||
"j" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"k" = (/obj/machinery/computer/arcade/battle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"l" = (/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"m" = (/obj/effect/mob_spawn/human/golem/adamantine,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"n" = (/obj/machinery/mineral/equipment_vendor/golem,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"o" = (/obj/item/weapon/resonator,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"p" = (/obj/machinery/mineral/ore_redemption,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"q" = (/obj/structure/statue/gold/rd,/obj/structure/window/reinforced{dir = 4; name = "shrine of the liberator"; pixel_x = 0},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"r" = (/obj/machinery/computer/shuttle,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"s" = (/obj/machinery/bluespace_beacon,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"t" = (/obj/structure/extinguisher_cabinet{pixel_y = 30},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"u" = (/obj/structure/table/wood,/obj/item/weapon/bedsheet/rd{desc = "Majestic."; layer = 3; name = "Royal Cape of the Liberator"; pixel_x = 5; pixel_y = 9},/obj/item/weapon/book/manual/research_and_development{name = "Sacred Text of the Liberator"; pixel_x = -4; pixel_y = 3},/obj/structure/window/reinforced{dir = 4; name = "shrine of the liberator"; pixel_x = 0},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"v" = (/obj/item/weapon/resonator/upgraded,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"w" = (/obj/machinery/autolathe,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"x" = (/obj/structure/table/wood,/obj/machinery/reagentgrinder,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"y" = (/obj/machinery/computer/arcade/orion_trail,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"z" = (/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"A" = (/obj/structure/table/wood,/obj/item/weapon/surgical_drapes{pixel_x = 15},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"B" = (/obj/item/weapon/storage/firstaid/fire,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"C" = (/obj/item/weapon/storage/firstaid/brute,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/brute,/obj/item/areaeditor/blueprints{desc = "Use to build new structures in the wastes."; name = "land claim"},/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"D" = (/obj/item/weapon/storage/firstaid/brute,/obj/structure/table/wood,/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/disk/design_disk/golem_shell,/turf/open/floor/plasteel/shuttle/purple{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"E" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
"F" = (/obj/structure/ore_box,/turf/open/floor/plating{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered/golem_ship)
|
||||
|
||||
(1,1,1) = {"
|
||||
aaaaaaaaaaaaaaaaaaaa
|
||||
@@ -40,14 +41,14 @@ aabbbbjjbbbbjjbbbbbb
|
||||
aabkllllmmbllllllnhi
|
||||
aabllllloojlllllllhi
|
||||
bbbjjbbbbbblllllpbbb
|
||||
bqrllllllljlllllljsj
|
||||
btlllllllljlllllljlj
|
||||
bbbjjbbbbbblllluvbbb
|
||||
aabllllloojllllllwhi
|
||||
aabxllllmmbyllzABChi
|
||||
bqrllllllljlslllljtj
|
||||
bulllllllljlllllljlj
|
||||
bbbjjbbbbbbllllvwbbb
|
||||
aabllllloojllllllxhi
|
||||
aabyllllmmbzllABCDhi
|
||||
aabbbbjjbbbbjjbbbbbb
|
||||
aaaaabfffffffffffDhi
|
||||
aaaaabEEEEEEEefffDhi
|
||||
aaaaabfffffffffffEhi
|
||||
aaaaabFFFFFFFefffEhi
|
||||
aaaaabbbbbbbbbbbbbbb
|
||||
aaaaaaaaaaaaaaaaaaaa
|
||||
aaaaaaaaaaaaaaaaaaaa
|
||||
|
||||
@@ -31,7 +31,6 @@ A small map intended for lowpop(40 players and less).
|
||||
#if !defined(MAP_OVERRIDE_FILES)
|
||||
#define MAP_OVERRIDE_FILES
|
||||
#include "map_files\BirdStation\telecomms.dm"
|
||||
#include "map_files\BirdStation\misc.dm"
|
||||
#include "map_files\BirdStation\job\job_changes.dm"
|
||||
#include "map_files\BirdStation\job\removed_jobs.dm"
|
||||
#endif
|
||||
@@ -40,4 +39,4 @@ A small map intended for lowpop(40 players and less).
|
||||
|
||||
#warn a map has already been included, ignoring birdstation.
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1469,7 +1469,7 @@
|
||||
"aCm" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk,/turf/open/floor/plating,/area/maintenance/disposal)
|
||||
"aCn" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/light,/turf/open/floor/plating,/area/maintenance/disposal)
|
||||
"aCo" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/door/poddoor{id = "crusherdoor"; layer = 3.1; name = "crusher safety blast door"},/turf/open/floor/plating,/area/maintenance/disposal)
|
||||
"aCp" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/recycler/birdstation{emagged = 1; name = "dangerous old crusher"},/turf/open/floor/plating,/area/maintenance/disposal)
|
||||
"aCp" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/machinery/recycler/deathtrap,/turf/open/floor/plating,/area/maintenance/disposal)
|
||||
"aCq" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/turf/open/floor/plating,/area/maintenance/disposal)
|
||||
"aCr" = (/obj/machinery/conveyor{dir = 8; id = "garbage"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal/deliveryChute{dir = 8},/turf/open/floor/plating,/area/maintenance/disposal)
|
||||
"aCs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/closed/wall/r_wall,/area/maintenance/disposal)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
supervisors = "the captain and the head of personnel"
|
||||
|
||||
/datum/outfit/job/New()
|
||||
box = /obj/item/weapon/storage/box/birdsurv
|
||||
box = /obj/item/weapon/storage/box/survival/radio
|
||||
|
||||
/datum/job/assistant // Here so assistant appears on the top of the select job list.
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
..()
|
||||
|
||||
/datum/outfit/job/hos/New()
|
||||
box = /obj/item/weapon/storage/box/birdsec
|
||||
box = /obj/item/weapon/storage/box/security/radio
|
||||
|
||||
/datum/job/officer/New()
|
||||
..()
|
||||
@@ -39,7 +39,7 @@
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_weapons, access_forensics_lockers)
|
||||
|
||||
/datum/outfit/job/officer/New()
|
||||
box = /obj/item/weapon/storage/box/birdsec
|
||||
box = /obj/item/weapon/storage/box/security/radio
|
||||
|
||||
/datum/job/detective/New()
|
||||
..()
|
||||
@@ -47,7 +47,7 @@
|
||||
minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue, access_weapons, access_forensics_lockers)
|
||||
|
||||
/datum/outfit/job/detective/New()
|
||||
box = /obj/item/weapon/storage/box/birdsec
|
||||
box = /obj/item/weapon/storage/box/security/radio
|
||||
|
||||
//Medbay
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_tcomsat)
|
||||
|
||||
/datum/outfit/job/engineer/New()
|
||||
box = /obj/item/weapon/storage/box/birdeng
|
||||
box = /obj/item/weapon/storage/box/engineer/radio
|
||||
|
||||
//Science
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_mineral_storeroom)
|
||||
|
||||
/datum/outfit/job/mining/New()
|
||||
box = /obj/item/weapon/storage/box/birdeng
|
||||
box = /obj/item/weapon/storage/box/engineer/radio
|
||||
|
||||
//Service
|
||||
|
||||
@@ -123,4 +123,4 @@
|
||||
|
||||
/datum/job/clown/New()
|
||||
..()
|
||||
supervisors = "nobody but yourself" //Honk
|
||||
supervisors = "nobody but yourself" //Honk
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
|
||||
// modified crusher
|
||||
// only does 120 brute damage and won't eat the victims items
|
||||
|
||||
|
||||
/obj/machinery/recycler/birdstation/eat(mob/living/L)
|
||||
|
||||
L.loc = src.loc
|
||||
|
||||
if(istype(L,/mob/living/silicon))
|
||||
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
|
||||
else
|
||||
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
var/gib = 1
|
||||
if(istype(L,/mob/living/carbon))
|
||||
gib = 0
|
||||
add_blood(L)
|
||||
|
||||
if(!blood && !istype(L,/mob/living/silicon))
|
||||
blood = 1
|
||||
update_icon()
|
||||
L.Paralyse(5)
|
||||
if(gib || emagged == 2)
|
||||
L.gib()
|
||||
else if(emagged == 1)
|
||||
L.adjustBruteLoss(120)
|
||||
|
||||
// we don't want anyone to dismantle or disable the crusher easily
|
||||
|
||||
/obj/machinery/recycler/birdstation/attackby(obj/item/I, mob/user, params)
|
||||
if (istype(I, /obj/item/weapon/wrench) || istype(I, /obj/item/weapon/screwdriver))
|
||||
return
|
||||
|
||||
|
||||
//special birdstation survival boxes
|
||||
|
||||
/obj/item/weapon/storage/box/birdsurv/New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/clothing/mask/breath(src)
|
||||
new /obj/item/weapon/tank/internals/emergency_oxygen(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
|
||||
new /obj/item/device/radio/off(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/box/birdeng/New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/clothing/mask/breath(src)
|
||||
new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
|
||||
new /obj/item/device/radio/off(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/box/birdsec/New()
|
||||
..()
|
||||
contents = list()
|
||||
new /obj/item/clothing/mask/gas/sechailer(src)
|
||||
new /obj/item/weapon/tank/internals/emergency_oxygen(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
|
||||
new /obj/item/device/radio/off(src)
|
||||
return
|
||||
@@ -33852,7 +33852,14 @@
|
||||
/area/crew_quarters/theatre)
|
||||
"boC" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/weapon/lipstick/random,
|
||||
/obj/item/weapon/lipstick/random{
|
||||
pixel_x = 2;
|
||||
pixel_y = 2
|
||||
},
|
||||
/obj/item/weapon/lipstick/random{
|
||||
pixel_x = -2;
|
||||
pixel_y = -2
|
||||
},
|
||||
/turf/open/floor/wood,
|
||||
/area/crew_quarters/theatre)
|
||||
"boD" = (
|
||||
@@ -78083,6 +78090,10 @@
|
||||
/area/hallway/primary/aft{
|
||||
name = "Aft Port Hallway"
|
||||
})
|
||||
"cSm" = (
|
||||
/obj/structure/closet/secure_closet/freezer/cream_pie,
|
||||
/turf/open/floor/wood,
|
||||
/area/crew_quarters/theatre)
|
||||
|
||||
(1,1,1) = {"
|
||||
aaa
|
||||
@@ -108287,7 +108298,7 @@ biH
|
||||
bjZ
|
||||
bkT
|
||||
bmM
|
||||
boC
|
||||
cSm
|
||||
bqO
|
||||
bte
|
||||
bmM
|
||||
|
||||
@@ -33996,8 +33996,8 @@
|
||||
},
|
||||
/area/crew_quarters/kitchen)
|
||||
"bjL" = (
|
||||
/obj/structure/closet,
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/obj/structure/closet/secure_closet/freezer/cream_pie,
|
||||
/turf/open/floor/plasteel{
|
||||
icon_state = "redbluefull"
|
||||
},
|
||||
@@ -34014,8 +34014,15 @@
|
||||
},
|
||||
/area/crew_quarters/theatre)
|
||||
"bjN" = (
|
||||
/obj/item/weapon/storage/crayons,
|
||||
/obj/structure/table/wood,
|
||||
/obj/item/weapon/storage/crayons{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pie/cream{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
/turf/open/floor/plasteel{
|
||||
icon_state = "redbluefull"
|
||||
},
|
||||
@@ -61714,6 +61721,25 @@
|
||||
},
|
||||
/turf/closed/indestructible/opshuttle,
|
||||
/area/shuttle/syndicate)
|
||||
"ckh" = (
|
||||
/obj/structure/table/wood,
|
||||
/obj/machinery/airalarm{
|
||||
dir = 4;
|
||||
icon_state = "alarm0";
|
||||
pixel_x = -22
|
||||
},
|
||||
/obj/item/weapon/storage/crayons{
|
||||
pixel_x = 3;
|
||||
pixel_y = 3
|
||||
},
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pie/cream{
|
||||
pixel_x = -3;
|
||||
pixel_y = -3
|
||||
},
|
||||
/turf/open/floor/plasteel{
|
||||
icon_state = "redbluefull"
|
||||
},
|
||||
/area/space)
|
||||
"cki" = (
|
||||
/turf/open/space,
|
||||
/obj/machinery/porta_turret/syndicate{
|
||||
@@ -61724,17 +61750,6 @@
|
||||
icon_state = "diagonalWall3"
|
||||
},
|
||||
/area/shuttle/syndicate)
|
||||
"ckh" = (
|
||||
/turf/open/space,
|
||||
/obj/machinery/porta_turret/syndicate{
|
||||
dir = 4
|
||||
},
|
||||
/turf/closed/wall/shuttle{
|
||||
tag = "icon-diagonalWall3 (WEST)";
|
||||
icon_state = "diagonalWall3";
|
||||
dir = 8
|
||||
},
|
||||
/area/shuttle/syndicate)
|
||||
|
||||
(1,1,1) = {"
|
||||
aaa
|
||||
@@ -95288,7 +95303,7 @@ bkQ
|
||||
bfv
|
||||
bvd
|
||||
bfv
|
||||
bfv
|
||||
ckh
|
||||
bqH
|
||||
bsy
|
||||
btK
|
||||
|
||||
+502
-529
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -19,7 +19,7 @@ z7 = empty space
|
||||
|
||||
#define MINETYPE "lavaland"
|
||||
|
||||
#include "map_files\MetaStation\MetaStation.v41I.dmm"
|
||||
#include "map_files\MetaStation\MetaStation.dmm"
|
||||
#include "map_files\generic\z2.dmm"
|
||||
#include "map_files\generic\z3.dmm"
|
||||
#include "map_files\generic\z4.dmm"
|
||||
@@ -30,7 +30,7 @@ z7 = empty space
|
||||
#include "map_files\generic\z9.dmm"
|
||||
|
||||
#define MAP_PATH "map_files/MetaStation"
|
||||
#define MAP_FILE "MetaStation.v41I.dmm"
|
||||
#define MAP_FILE "MetaStation.dmm"
|
||||
#define MAP_NAME "MetaStation"
|
||||
|
||||
#define MAP_TRANSITION_CONFIG list(MAIN_STATION = CROSSLINKED, CENTCOMM = SELFLOOPING, ABANDONED_SATELLITE = CROSSLINKED, DERELICT = CROSSLINKED, MINING = SELFLOOPING, EMPTY_AREA_1 = CROSSLINKED, EMPTY_AREA_2 = CROSSLINKED, EMPTY_AREA_3 = CROSSLINKED, EMPTY_AREA_4 = CROSSLINKED)
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
"aH" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "The Emergency Escape Bar"},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
|
||||
"aI" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
|
||||
"aJ" = (/obj/structure/chair,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
|
||||
"aK" = (/mob/living/simple_animal/drone/snowflake{desc = "A barkeeping drone, an indestructible robot built to tend bars."; dir = 8; health = 3000; languages = 127; laws = "1. Serve drinks. 2. Talk to patrons. 3. Don't get messed up in their affairs."; maxHealth = 3000; name = "Bardrone"; seeStatic = 0},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
|
||||
"aK" = (/mob/living/simple_animal/drone/snowflake/bardrone,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
|
||||
"aL" = (/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
|
||||
"aM" = (/obj/structure/table,/turf/open/floor/plasteel/bar,/area/shuttle/escape)
|
||||
"aN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 6; pixel_y = 4},/turf/open/floor/plasteel/bar,/area/shuttle/escape)
|
||||
|
||||
@@ -15,20 +15,20 @@
|
||||
"o" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"p" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"q" = (/obj/item/stack/sheet/metal,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"r" = (/obj/machinery/door/airlock/cult/unruned/glass,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"r" = (/obj/machinery/door/airlock/cult/unruned/glass/friendly,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"s" = (/obj/machinery/status_display,/turf/closed/wall/cult,/area/shuttle/escape)
|
||||
"t" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"u" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"v" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"w" = (/mob/living/simple_animal/hostile/construct/builder,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"x" = (/obj/machinery/door/airlock/cult,/turf/open/floor/plating,/area/shuttle/escape)
|
||||
"x" = (/obj/machinery/door/airlock/cult/friendly,/turf/open/floor/plating,/area/shuttle/escape)
|
||||
"y" = (/obj/effect/decal/cleanable/blood/gibs/up,/obj/item/candle/infinite,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"z" = (/obj/effect/rune/raise_dead,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"A" = (/obj/item/candle/infinite,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"B" = (/obj/effect/rune/true_sight,/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/core,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"C" = (/mob/living/simple_animal/hostile/construct/armored,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"D" = (/obj/effect/rune/true_sight,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"E" = (/obj/machinery/door/airlock/cult,/obj/docking_port/mobile/emergency{name = "shuttle 667"},/turf/open/floor/plating,/area/shuttle/escape)
|
||||
"E" = (/obj/machinery/door/airlock/cult/friendly,/obj/docking_port/mobile/emergency{name = "shuttle 667"},/turf/open/floor/plating,/area/shuttle/escape)
|
||||
"F" = (/obj/effect/decal/cleanable/blood/gibs/down,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"G" = (/obj/structure/extinguisher_cabinet{has_extinguisher = null; icon_state = "extinguisher_empty"; opened = 1; pixel_x = 27; pixel_y = 0},/obj/item/weapon/extinguisher{safety = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"H" = (/mob/living/simple_animal/hostile/construct/wraith,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
@@ -37,7 +37,7 @@
|
||||
"K" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult"); name = "right eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"L" = (/obj/effect/decal/cleanable/blood/drip,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"M" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"N" = (/obj/machinery/door/airlock/cult/glass,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"N" = (/obj/machinery/door/airlock/cult/glass/friendly,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"O" = (/obj/structure/dresser,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"P" = (/obj/structure/showcase/horrific_experiment,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
"Q" = (/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
|
||||
|
||||
@@ -70,3 +70,13 @@
|
||||
#define UNARMED_ATTACK 2
|
||||
#define PROJECTILE_ATTACK 3
|
||||
#define THROWN_PROJECTILE_ATTACK 4
|
||||
|
||||
|
||||
//Gun Stuff
|
||||
#define SAWN_INTACT 0
|
||||
#define SAWN_OFF 1
|
||||
#define SAWN_SAWING -1
|
||||
|
||||
#define WEAPON_LIGHT 0
|
||||
#define WEAPON_MEDIUM 1
|
||||
#define WEAPON_HEAVY 2
|
||||
@@ -8,6 +8,14 @@
|
||||
|
||||
#define ishuman(A) (istype(A, /mob/living/carbon/human))
|
||||
|
||||
// Human sub-species
|
||||
#define isabductor(A) (is_species(A, /datum/species/abductor))
|
||||
#define isgolem(A) (is_species(A, /datum/species/golem))
|
||||
#define islizard(A) (is_species(A, /datum/species/lizard))
|
||||
#define isplasmaman(A) (is_species(A, /datum/species/plasmaman))
|
||||
#define ispodperson(A) (is_species(A, /datum/species/podperson))
|
||||
#define isflyperson(A) (is_species(A, /datum/species/fly))
|
||||
|
||||
#define ismonkey(A) (istype(A, /mob/living/carbon/monkey))
|
||||
|
||||
#define isbrain(A) (istype(A, /mob/living/carbon/brain))
|
||||
@@ -32,6 +40,8 @@
|
||||
|
||||
#define ismouse(A) (istype(A, /mob/living/simple_animal/mouse))
|
||||
|
||||
#define isconstruct(A) (istype(A, /mob/living/simple_animal/hostile/construct))
|
||||
|
||||
#define isbear(A) (istype(A, /mob/living/simple_animal/hostile/bear))
|
||||
|
||||
#define iscarp(A) (istype(A, /mob/living/simple_animal/hostile/carp))
|
||||
@@ -78,4 +88,4 @@
|
||||
|
||||
#define issignaler(O) (istype(O, /obj/item/device/assembly/signaler))
|
||||
|
||||
#define istimer(O) (istype(O, /obj/item/device/assembly/timer))
|
||||
#define istimer(O) (istype(O, /obj/item/device/assembly/timer))
|
||||
|
||||
@@ -317,4 +317,11 @@ Proc for attack log creation, because really why not
|
||||
. = 0
|
||||
break mainloop
|
||||
if(progbar)
|
||||
qdel(progbar)
|
||||
qdel(progbar)
|
||||
|
||||
/proc/is_species(A, species_datum)
|
||||
. = FALSE
|
||||
if(ishuman(A))
|
||||
var/mob/living/carbon/human/H = A
|
||||
if(H.dna && istype(H.dna.species, species_datum))
|
||||
. = TRUE
|
||||
|
||||
@@ -8,9 +8,21 @@
|
||||
|
||||
/obj/structure/cult/examine(mob/user)
|
||||
..()
|
||||
user << "<span class='notice'>\The [src] is [anchored ? "":"not "]secured to the floor.</span>"
|
||||
if(iscultist(user) && cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
|
||||
|
||||
/obj/structure/cult/attackby(obj/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
|
||||
anchored = !anchored
|
||||
user << "<span class='notice'>You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.</span>"
|
||||
if(!anchored)
|
||||
icon_state = "[initial(icon_state)]_off"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/cult/proc/getETA()
|
||||
var/time = (cooldowntime - world.time)/600
|
||||
var/eta = "[round(time, 1)] minutes"
|
||||
@@ -28,6 +40,9 @@
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>"
|
||||
return
|
||||
if(!anchored)
|
||||
user << "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>"
|
||||
return
|
||||
if(cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
|
||||
return
|
||||
@@ -40,7 +55,7 @@
|
||||
pickedtype = /obj/item/clothing/glasses/night/cultblind
|
||||
if("Flask of Unholy Water")
|
||||
pickedtype = /obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
|
||||
if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time)
|
||||
if(src && !qdeleted(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
cooldowntime = world.time + 2400
|
||||
var/obj/item/N = new pickedtype(get_turf(src))
|
||||
user << "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with an [N]!</span>"
|
||||
@@ -56,6 +71,9 @@
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>The heat radiating from [src] pushes you back.</span>"
|
||||
return
|
||||
if(!anchored)
|
||||
user << "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>"
|
||||
return
|
||||
if(cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
|
||||
return
|
||||
@@ -68,7 +86,7 @@
|
||||
pickedtype = /obj/item/clothing/suit/hooded/cultrobes/berserker
|
||||
if("Nar-Sien Hardsuit")
|
||||
pickedtype = /obj/item/clothing/suit/space/hardsuit/cult
|
||||
if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time)
|
||||
if(src && !qdeleted(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
cooldowntime = world.time + 2400
|
||||
var/obj/item/N = new pickedtype(get_turf(src))
|
||||
user << "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating [N]!</span>"
|
||||
@@ -79,44 +97,49 @@
|
||||
desc = "A floating crystal that slowly heals those faithful to Nar'Sie."
|
||||
icon_state = "pylon"
|
||||
luminosity = 5
|
||||
var/heal_delay = 50
|
||||
var/last_shot = 0
|
||||
var/list/corruption = list()
|
||||
var/heal_delay = 25
|
||||
var/last_heal = 0
|
||||
var/corrupt_delay = 50
|
||||
var/last_corrupt = 0
|
||||
|
||||
/obj/structure/cult/pylon/New()
|
||||
SSobj.processing |= src
|
||||
corruption += get_turf(src)
|
||||
for(var/i in 1 to 5)
|
||||
for(var/t in corruption)
|
||||
var/turf/T = t
|
||||
corruption |= T.GetAtmosAdjacentTurfs()
|
||||
SSfastprocess.processing |= src
|
||||
..()
|
||||
|
||||
/obj/structure/cult/pylon/Destroy()
|
||||
SSobj.processing.Remove(src)
|
||||
SSfastprocess.processing.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/structure/cult/pylon/process()
|
||||
if((last_shot + heal_delay) <= world.time)
|
||||
last_shot = world.time
|
||||
if(!anchored)
|
||||
return
|
||||
if(last_heal <= world.time)
|
||||
last_heal = world.time + heal_delay
|
||||
for(var/mob/living/L in range(5, src))
|
||||
if(iscultist(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(istype(H))
|
||||
L.adjustBruteLoss(-1, 0)
|
||||
L.adjustFireLoss(-1, 0)
|
||||
L.updatehealth()
|
||||
if(istype(L, /mob/living/simple_animal/hostile/construct))
|
||||
var/mob/living/simple_animal/M = L
|
||||
if(M.health < M.maxHealth)
|
||||
M.adjustHealth(-2)
|
||||
if(corruption.len)
|
||||
var/turf/T = pick_n_take(corruption)
|
||||
corruption -= T
|
||||
if(istype(T, /turf/open/floor/engine/cult) || istype(T, /turf/open/space) || istype(T, /turf/open/floor/plating/lava))
|
||||
return
|
||||
if(iscultist(L) || istype(L, /mob/living/simple_animal/shade) || istype(L, /mob/living/simple_animal/hostile/construct))
|
||||
if(L.health != L.maxHealth)
|
||||
PoolOrNew(/obj/effect/overlay/temp/heal, list(get_turf(src), "#960000"))
|
||||
if(ishuman(L))
|
||||
L.adjustBruteLoss(-1, 0)
|
||||
L.adjustFireLoss(-1, 0)
|
||||
L.updatehealth()
|
||||
if(istype(L, /mob/living/simple_animal/shade) || istype(L, /mob/living/simple_animal/hostile/construct))
|
||||
var/mob/living/simple_animal/M = L
|
||||
if(M.health < M.maxHealth)
|
||||
M.adjustHealth(-1)
|
||||
CHECK_TICK
|
||||
if(last_corrupt <= world.time)
|
||||
var/list/validturfs = list()
|
||||
for(var/T in circleviewturfs(src, 5))
|
||||
if(istype(T, /turf/closed) || istype(T, /turf/open/floor/engine/cult) || istype(T, /turf/open/space) || istype(T, /turf/open/floor/plating/lava))
|
||||
continue
|
||||
validturfs |= T
|
||||
var/turf/T = safepick(validturfs)
|
||||
if(T)
|
||||
T.ChangeTurf(/turf/open/floor/engine/cult)
|
||||
|
||||
last_corrupt = world.time + corrupt_delay
|
||||
else
|
||||
last_corrupt = world.time + corrupt_delay*2
|
||||
|
||||
/obj/structure/cult/tome
|
||||
name = "archives"
|
||||
@@ -128,6 +151,9 @@
|
||||
if(!iscultist(user))
|
||||
user << "<span class='warning'>All of these books seem to be gibberish.</span>"
|
||||
return
|
||||
if(!anchored)
|
||||
user << "<span class='cultitalic'>You need to anchor [src] to the floor with a tome first.</span>"
|
||||
return
|
||||
if(cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
|
||||
return
|
||||
@@ -140,7 +166,7 @@
|
||||
pickedtype = /obj/item/device/shuttle_curse
|
||||
if("Veil Shifter")
|
||||
pickedtype = /obj/item/device/cult_shift
|
||||
if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time)
|
||||
if(src && !qdeleted(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
cooldowntime = world.time + 2400
|
||||
var/obj/item/N = new pickedtype(get_turf(src))
|
||||
user << "<span class='cultitalic'>You summon [N] from the archives!</span>"
|
||||
|
||||
@@ -17,6 +17,7 @@ This file contains the arcane tome files.
|
||||
..()
|
||||
if(iscultist(user) || user.stat == DEAD)
|
||||
user << "<span class='cult'>The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie.</span>"
|
||||
user << "<span class='cult'>Striking a cult structure will unanchor or reanchor it.</span>"
|
||||
user << "<span class='cult'>Striking another cultist with it will purge holy water from them.</span>"
|
||||
user << "<span class='cult'>Striking a noncultist, however, will sear their flesh.</span>"
|
||||
|
||||
@@ -154,7 +155,7 @@ This file contains the arcane tome files.
|
||||
|
||||
text += "<font color='red'><b>Juggernaut</b></font><br>The Juggernaut is a slow, but durable, melee attacker which can produce temporary forcewalls. It will also reflect most lethal energy weapons.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Artificer</b></font><br>The Artificer is a weak and fragile construct, able to heal other constructs, produce more <font color='red'><b>soulstones</b></font> and <font color='red'><b>construct shells</b></font>, \
|
||||
text += "<font color='red'><b>Artificer</b></font><br>The Artificer is a weak and fragile construct, able to heal other constructs, shades, or itself, produce more <font color='red'><b>soulstones</b></font> and <font color='red'><b>construct shells</b></font>, \
|
||||
construct fortifying cult walls and flooring, and finally, it can release a few indiscriminate stunning missiles.<br><br>"
|
||||
|
||||
text += "<font color='red'><b>Harvester</b></font><br>If you see one, know that you have done all you can and your life is void.<br><br>"
|
||||
|
||||
@@ -203,7 +203,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
log_game("Talisman Creation rune failed - already in use")
|
||||
return
|
||||
var/obj/item/weapon/paper/paper_to_imbue = pick(papers_on_rune)
|
||||
for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply)
|
||||
for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply - /obj/item/weapon/paper/talisman/supply/weak)
|
||||
var/obj/item/weapon/paper/talisman/J = I
|
||||
var/talisman_cult_name = initial(J.cultist_name)
|
||||
if(talisman_cult_name)
|
||||
@@ -534,40 +534,29 @@ var/list/teleport_runes = list()
|
||||
var/mob/living/user = invokers[1]
|
||||
if(rune_in_use)
|
||||
return
|
||||
for(var/mob/living/M in orange(1,src))
|
||||
if(M.stat == DEAD)
|
||||
potential_sacrifice_mobs.Add(M)
|
||||
for(var/mob/living/M in orange(1,T))
|
||||
if(M.stat == DEAD && !iscultist(M))
|
||||
potential_sacrifice_mobs |= M
|
||||
if(!potential_sacrifice_mobs.len)
|
||||
user << "<span class='cultitalic'>There are no eligible sacrifices nearby!</span>"
|
||||
log_game("Raise Dead rune failed - no catalyst corpse")
|
||||
return
|
||||
mob_to_sacrifice = input(user, "Choose a corpse to sacrifice.", "Corpse to Sacrifice") as null|anything in potential_sacrifice_mobs
|
||||
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || !mob_to_revive || !mob_to_sacrifice || rune_in_use)
|
||||
log_game("Raise Dead rune failed - no catalyst corpses")
|
||||
fail_invoke()
|
||||
return
|
||||
for(var/mob/living/M in T.contents)
|
||||
if(M.stat == DEAD)
|
||||
potential_revive_mobs.Add(M)
|
||||
potential_revive_mobs |= M
|
||||
if(!potential_revive_mobs.len)
|
||||
user << "<span class='cultitalic'>There is no eligible revival target on the rune!</span>"
|
||||
log_game("Raise Dead rune failed - no corpse to revived")
|
||||
log_game("Raise Dead rune failed - no corpses to revive")
|
||||
fail_invoke()
|
||||
return
|
||||
mob_to_sacrifice = input(user, "Choose a corpse to sacrifice.", "Corpse to Sacrifice") as null|anything in potential_sacrifice_mobs
|
||||
if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_sacrifice, user, 1))
|
||||
return
|
||||
mob_to_revive = input(user, "Choose a corpse to revive.", "Corpse to Revive") as null|anything in potential_revive_mobs
|
||||
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || rune_in_use)
|
||||
if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_sacrifice, user, 1))
|
||||
return
|
||||
if(!in_range(mob_to_sacrifice,src))
|
||||
user << "<span class='cultitalic'>The sacrificial target has been moved!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - catalyst corpse moved")
|
||||
return
|
||||
if(!(mob_to_revive in T.contents))
|
||||
user << "<span class='cultitalic'>The corpse to revive has been moved!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - revival target moved")
|
||||
return
|
||||
if(mob_to_sacrifice.stat != DEAD)
|
||||
user << "<span class='cultitalic'>The sacrificial target must be dead!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - catalyst corpse is not dead")
|
||||
if(!validness_checks(mob_to_revive, user, 0))
|
||||
return
|
||||
rune_in_use = 1
|
||||
if(user.name == "Herbert West")
|
||||
@@ -579,19 +568,47 @@ var/list/teleport_runes = list()
|
||||
mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=20)
|
||||
sleep(20)
|
||||
if(!mob_to_sacrifice || !in_range(mob_to_sacrifice, src))
|
||||
mob_to_sacrifice.visible_message("<span class='warning'><b>[mob_to_sacrifice] disintegrates into a pile of bones</span>")
|
||||
rune_in_use = 0
|
||||
return
|
||||
mob_to_sacrifice.dust()
|
||||
if(!mob_to_revive || mob_to_revive.stat != DEAD)
|
||||
visible_message("<span class='warning'>The glowing tendril snaps against the rune with a shocking crack.</span>")
|
||||
rune_in_use = 0
|
||||
fail_invoke()
|
||||
return
|
||||
mob_to_revive.revive() //This does remove disabilities and such, but the rune might actually see some use because of it!
|
||||
mob_to_sacrifice.visible_message("<span class='warning'><b>[mob_to_sacrifice] disintegrates into a pile of bones.</span>")
|
||||
mob_to_sacrifice.dust()
|
||||
mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it!
|
||||
mob_to_revive << "<span class='cultlarge'>\"PASNAR SAVRAE YAM'TOTH. Arise.\"</span>"
|
||||
mob_to_revive.visible_message("<span class='warning'>[mob_to_revive] draws in a huge breath, red light shining from their eyes.</span>", \
|
||||
"<span class='cultlarge'>You awaken suddenly from the void. You're alive!</span>")
|
||||
rune_in_use = 0
|
||||
|
||||
/obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user, saccing)
|
||||
var/turf/T = get_turf(src)
|
||||
if(!user)
|
||||
return 0
|
||||
if(!Adjacent(user) || user.incapacitated())
|
||||
return 0
|
||||
if(!target_mob)
|
||||
fail_invoke()
|
||||
return 0
|
||||
if(saccing)
|
||||
if(!in_range(target_mob, src))
|
||||
user << "<span class='cultitalic'>The sacrificial target has been moved!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - catalyst corpse moved")
|
||||
return 0
|
||||
if(target_mob.stat != DEAD)
|
||||
user << "<span class='cultitalic'>The sacrificial target must be dead!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - catalyst corpse is not dead")
|
||||
return 0
|
||||
else if(!(target_mob in T.contents))
|
||||
user << "<span class='cultitalic'>The corpse to revive has been moved!</span>"
|
||||
fail_invoke()
|
||||
log_game("Raise Dead rune failed - revival target moved")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/effect/rune/raise_dead/fail_invoke()
|
||||
..()
|
||||
@@ -783,8 +800,9 @@ var/list/teleport_runes = list()
|
||||
|
||||
/obj/effect/rune/blood_boil/invoke(var/list/invokers)
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
visible_message("<span class='warning'>[src] briefly bubbles before exploding!</span>")
|
||||
for(var/mob/living/carbon/C in viewers(src))
|
||||
for(var/mob/living/carbon/C in viewers(T))
|
||||
if(!iscultist(C))
|
||||
var/obj/item/weapon/nullrod/N = C.null_rod_check()
|
||||
if(N)
|
||||
@@ -797,8 +815,8 @@ var/list/teleport_runes = list()
|
||||
var/mob/living/L = M
|
||||
L.apply_damage(15, BRUTE, pick("l_arm", "r_arm"))
|
||||
L << "<span class='cultitalic'>[src] saps your strength!</span>"
|
||||
explosion(get_turf(src), -1, 0, 1, 5)
|
||||
qdel(src)
|
||||
explosion(T, -1, 0, 1, 5)
|
||||
|
||||
|
||||
//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
|
||||
|
||||
@@ -263,8 +263,10 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
|
||||
if(gangs.len)
|
||||
if(!winner)
|
||||
world << "<span class='redtext'>The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]</span><br>"
|
||||
feedback_set_details("round_end_result","win - gang domination complete")
|
||||
else
|
||||
world << "<span class='redtext'>The [winner.name] Gang successfully performed a hostile takeover of the station!</span><br>"
|
||||
feedback_set_details("round_end_result","loss - gangs failed takeover")
|
||||
|
||||
for(var/datum/gang/G in gangs)
|
||||
var/text = "<b>The [G.name] Gang was [winner==G ? "<span class='greenannounce'>victorious</span>" : "<span class='boldannounce'>defeated</span>"] with [round((G.territory.len/start_state.num_territories)*100, 1)]% control of the station!</b>"
|
||||
|
||||
@@ -236,8 +236,8 @@
|
||||
console.vest = V
|
||||
V.flags |= NODROP
|
||||
agent.equip_to_slot_or_del(V, slot_wear_suit)
|
||||
agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_in_backpack)
|
||||
agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/alien(agent), slot_belt)
|
||||
agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_belt)
|
||||
agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/alien(agent), slot_in_backpack)
|
||||
agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack)
|
||||
agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head)
|
||||
|
||||
|
||||
@@ -112,19 +112,11 @@
|
||||
if(combat_cooldown==initial(combat_cooldown))
|
||||
SSobj.processing.Remove(src)
|
||||
|
||||
/obj/item/device/abductor/proc/IsAbductor(user)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.dna.species.id != "abductor")
|
||||
return 0
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/device/abductor/proc/AbductorCheck(user)
|
||||
if(IsAbductor(user))
|
||||
return 1
|
||||
if(isabductor(user))
|
||||
return TRUE
|
||||
user << "<span class='warning'>You can't figure how this works!</span>"
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/obj/item/device/abductor/proc/ScientistCheck(user)
|
||||
var/mob/living/carbon/human/H = user
|
||||
@@ -194,7 +186,7 @@
|
||||
user << "<span class='warning'>This specimen is already marked!</span>"
|
||||
return
|
||||
if(istype(target,/mob/living/carbon/human))
|
||||
if(IsAbductor(target))
|
||||
if(isabductor(target))
|
||||
marked = target
|
||||
user << "<span class='notice'>You mark [target] for future retrieval.</span>"
|
||||
else
|
||||
@@ -304,27 +296,26 @@
|
||||
break
|
||||
return console
|
||||
|
||||
|
||||
/obj/item/device/firing_pin/alien
|
||||
/obj/item/device/firing_pin/abductor
|
||||
name = "alien firing pin"
|
||||
desc = "An odd device that resembles a firing pin."
|
||||
fail_message = "<span class='alienwarning'>UNAUTHORIZED -- UNAUTHORIZED</span>"
|
||||
icon_state = "firing_pin_ayy"
|
||||
desc = "This firing pin is slimy and warm; you can swear you feel it \
|
||||
constantly trying to mentally probe you."
|
||||
fail_message = "<span class='abductor'>\
|
||||
Firing error, please contact Command.</span>"
|
||||
|
||||
/obj/item/device/firing_pin/alien/pin_auth(mob/living/user)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.dna.species.id != "abductor")
|
||||
return 0
|
||||
return 1
|
||||
/obj/item/device/firing_pin/abductor/pin_auth(mob/living/user)
|
||||
. = isabductor(user)
|
||||
|
||||
/obj/item/weapon/gun/energy/alien
|
||||
name = "alien pistol"
|
||||
desc = "A complicated gun that fires bursts of high-intensity radiation."
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/declone)
|
||||
pin = /obj/item/device/firing_pin/alien
|
||||
pin = /obj/item/device/firing_pin/abductor
|
||||
icon_state = "alienpistol"
|
||||
item_state = "alienpistol"
|
||||
origin_tech = "combat=5;materials=4;powerstorage=3;abductor=3"
|
||||
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
|
||||
|
||||
/obj/item/weapon/paper/abductor
|
||||
name = "Dissection Guide"
|
||||
@@ -402,16 +393,8 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
icon_state = "wonderprodProbe"
|
||||
item_state = "wonderprodProbe"
|
||||
|
||||
/obj/item/weapon/abductor_baton/proc/IsAbductor(mob/living/user)
|
||||
if(!ishuman(user))
|
||||
return 0
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.dna.species.id != "abductor")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/abductor_baton/attack(mob/target, mob/living/user)
|
||||
if(!IsAbductor(user))
|
||||
if(!isabductor(user))
|
||||
return
|
||||
|
||||
if(isrobot(target))
|
||||
@@ -689,4 +672,4 @@ Congratulations! You are now trained for xenobiology research!"}
|
||||
else if(istype(W, /obj/item/stack/sheet))
|
||||
return // no material modding
|
||||
else
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -45,15 +45,12 @@
|
||||
set_droppoint_action.target = console
|
||||
set_droppoint_action.Grant(user)
|
||||
|
||||
/obj/machinery/computer/camera_advanced/abductor/proc/IsAbductor(mob/living/carbon/human/H)
|
||||
return H.dna.species.id == "abductor"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H)
|
||||
var/datum/species/abductor/S = H.dna.species
|
||||
return S.scientist
|
||||
|
||||
/obj/machinery/computer/camera_advanced/abductor/attack_hand(mob/user)
|
||||
if(!iscarbon(user) || !IsAbductor(user))
|
||||
if(!isabductor(user))
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -154,4 +151,4 @@
|
||||
var/mob/camera/aiEye/remote/remote_eye = C.remote_control
|
||||
|
||||
var/obj/machinery/abductor/console/console = target
|
||||
console.SetDroppoint(remote_eye.loc,owner)
|
||||
console.SetDroppoint(remote_eye.loc,owner)
|
||||
|
||||
@@ -3,9 +3,6 @@
|
||||
/obj/machinery/abductor
|
||||
var/team = 0
|
||||
|
||||
/obj/machinery/abductor/proc/IsAbductor(mob/living/carbon/human/H)
|
||||
return H.dna.species.id == "abductor"
|
||||
|
||||
/obj/machinery/abductor/proc/IsAgent(mob/living/carbon/human/H)
|
||||
if(H.dna.species.id == "abductor")
|
||||
var/datum/species/abductor/S = H.dna.species
|
||||
@@ -37,7 +34,7 @@
|
||||
/obj/machinery/abductor/console/attack_hand(mob/user)
|
||||
if(..())
|
||||
return
|
||||
if(!IsAbductor(user))
|
||||
if(!isabductor(user))
|
||||
user << "<span class='warning'>You start mashing alien buttons at random!</span>"
|
||||
if(do_after(user,100, target = src))
|
||||
TeleporterSend()
|
||||
@@ -208,4 +205,4 @@
|
||||
new item(src.loc)
|
||||
else
|
||||
say("Insufficent data!")
|
||||
return
|
||||
return
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
/obj/machinery/abductor/gland_dispenser/attack_hand(mob/user)
|
||||
if(..())
|
||||
return
|
||||
if(!IsAbductor(user))
|
||||
if(!isabductor(user))
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/box_css = {"
|
||||
@@ -82,4 +82,4 @@
|
||||
if(amounts[count]>0)
|
||||
amounts[count]--
|
||||
var/T = gland_types[count]
|
||||
new T(get_turf(src))
|
||||
new T(get_turf(src))
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
/obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user)
|
||||
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target))
|
||||
return
|
||||
if(IsAbductor(target))
|
||||
if(isabductor(target))
|
||||
return
|
||||
close_machine(target)
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/abductor/experiment/close_machine(mob/target)
|
||||
for(var/mob/living/carbon/C in loc)
|
||||
if(IsAbductor(C))
|
||||
for(var/A in loc)
|
||||
if(isabductor(A))
|
||||
return
|
||||
if(state_open && !panel_open)
|
||||
..(target)
|
||||
|
||||
@@ -90,6 +90,7 @@
|
||||
faction = list("swarmer")
|
||||
AIStatus = AI_OFF
|
||||
pass_flags = PASSTABLE
|
||||
mob_size = MOB_SIZE_TINY
|
||||
ventcrawler = 2
|
||||
ranged = 1
|
||||
projectiletype = /obj/item/projectile/beam/disabler
|
||||
@@ -551,4 +552,3 @@
|
||||
M << rendered
|
||||
if(M in dead_mob_list)
|
||||
M << "<a href='?src=\ref[M];follow=\ref[src]'>(F)</a> [rendered]"
|
||||
|
||||
|
||||
@@ -142,10 +142,12 @@
|
||||
if(istype(W, /obj/item/weapon/wirecutters)) //enable/disable the camera
|
||||
toggle_cam(user, 1)
|
||||
health = initial(health) //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex.
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/device/multitool)) //change focus
|
||||
setViewRange((view_range == initial(view_range)) ? short_range : initial(view_range))
|
||||
user << "<span class='notice'>You [(view_range == initial(view_range)) ? "restore" : "mess up"] the camera's focus.</span>"
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/weapon/weldingtool))
|
||||
if(weld(W, user))
|
||||
@@ -157,7 +159,7 @@
|
||||
assembly.dir = src.dir
|
||||
assembly = null
|
||||
qdel(src)
|
||||
return
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/device/analyzer))
|
||||
if(!isXRay())
|
||||
|
||||
@@ -321,11 +321,15 @@
|
||||
hackProof = 1
|
||||
aiControlDisabled = 1
|
||||
var/openingoverlaytype = /obj/effect/overlay/temp/cult/door
|
||||
var/friendly = FALSE
|
||||
|
||||
/obj/machinery/door/airlock/cult/allowed(mob/M)
|
||||
if(!density)
|
||||
return 1
|
||||
if(iscultist(M) || istype(M, /mob/living/simple_animal/shade) || istype(M, /mob/living/simple_animal/hostile/construct))
|
||||
if(friendly || \
|
||||
iscultist(M) || \
|
||||
istype(M, /mob/living/simple_animal/shade) || \
|
||||
istype(M, /mob/living/simple_animal/hostile/construct))
|
||||
PoolOrNew(openingoverlaytype, src.loc)
|
||||
return 1
|
||||
else
|
||||
@@ -345,22 +349,34 @@
|
||||
/obj/machinery/door/airlock/cult/narsie_act()
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/cult/friendly
|
||||
friendly = TRUE
|
||||
|
||||
/obj/machinery/door/airlock/cult/glass
|
||||
doortype = /obj/structure/door_assembly/door_assembly_cult/glass
|
||||
glass = 1
|
||||
opacity = 0
|
||||
|
||||
/obj/machinery/door/airlock/cult/glass/friendly
|
||||
friendly = TRUE
|
||||
|
||||
/obj/machinery/door/airlock/cult/unruned
|
||||
icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi'
|
||||
overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi'
|
||||
doortype = /obj/structure/door_assembly/door_assembly_cult/unruned
|
||||
openingoverlaytype = /obj/effect/overlay/temp/cult/door/unruned
|
||||
|
||||
/obj/machinery/door/airlock/cult/unruned/friendly
|
||||
friendly = TRUE
|
||||
|
||||
/obj/machinery/door/airlock/cult/unruned/glass
|
||||
doortype = /obj/structure/door_assembly/door_assembly_cult/unruned/glass
|
||||
glass = 1
|
||||
opacity = 0
|
||||
|
||||
/obj/machinery/door/airlock/cult/unruned/glass/friendly
|
||||
friendly = TRUE
|
||||
|
||||
//////////////////////////////////
|
||||
/*
|
||||
Misc Airlocks
|
||||
|
||||
@@ -8,13 +8,15 @@ var/const/SAFETY_COOLDOWN = 100
|
||||
layer = MOB_LAYER+1 // Overhead
|
||||
anchored = 1
|
||||
density = 1
|
||||
var/safety_mode = 0 // Temporality stops the machine if it detects a mob
|
||||
var/grinding = 0
|
||||
var/safety_mode = FALSE // Temporarily stops machine if it detects a mob
|
||||
var/icon_name = "grinder-o"
|
||||
var/blood = 0
|
||||
var/eat_dir = WEST
|
||||
var/amount_produced = 1
|
||||
var/datum/material_container/materials
|
||||
var/crush_damage = 1000
|
||||
var/eat_victim_items = TRUE
|
||||
var/item_recycle_sound = 'sound/items/Welder.ogg'
|
||||
|
||||
/obj/machinery/recycler/New()
|
||||
..()
|
||||
@@ -72,9 +74,9 @@ var/const/SAFETY_COOLDOWN = 100
|
||||
|
||||
/obj/machinery/recycler/emag_act(mob/user)
|
||||
if(!emagged)
|
||||
emagged = 1
|
||||
emagged = TRUE
|
||||
if(safety_mode)
|
||||
safety_mode = 0
|
||||
safety_mode = FALSE
|
||||
update_icon()
|
||||
playsound(src.loc, "sparks", 75, 1, -1)
|
||||
user << "<span class='notice'>You use the cryptographic sequencer on the [src.name].</span>"
|
||||
@@ -83,7 +85,7 @@ var/const/SAFETY_COOLDOWN = 100
|
||||
..()
|
||||
var/is_powered = !(stat & (BROKEN|NOPOWER))
|
||||
if(safety_mode)
|
||||
is_powered = 0
|
||||
is_powered = FALSE
|
||||
icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end
|
||||
|
||||
// This is purely for admin possession !FUN!.
|
||||
@@ -104,24 +106,34 @@ var/const/SAFETY_COOLDOWN = 100
|
||||
|
||||
var/move_dir = get_dir(loc, AM.loc)
|
||||
if(move_dir == eat_dir)
|
||||
eat(AM)
|
||||
|
||||
/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE)
|
||||
var/list/to_eat = list(AM0)
|
||||
if(istype(AM0, /obj/item))
|
||||
to_eat += AM0.GetAllContents()
|
||||
var/items_recycled = 0
|
||||
|
||||
for(var/i in to_eat)
|
||||
var/atom/movable/AM = i
|
||||
if(isliving(AM))
|
||||
if(emagged)
|
||||
eat(AM)
|
||||
crush_living(AM)
|
||||
else
|
||||
stop(AM)
|
||||
emergency_stop(AM)
|
||||
else if(istype(AM, /obj/item))
|
||||
recycle(AM)
|
||||
else // Can't recycle
|
||||
recycle_item(AM)
|
||||
items_recycled++
|
||||
else
|
||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
AM.loc = src.loc
|
||||
|
||||
/obj/machinery/recycler/proc/recycle(obj/item/I, sound = 1)
|
||||
I.loc = src.loc
|
||||
if(!istype(I))
|
||||
return
|
||||
if(items_recycled && sound)
|
||||
playsound(src.loc, item_recycle_sound, 50, 1)
|
||||
|
||||
/obj/machinery/recycler/proc/recycle_item(obj/item/I)
|
||||
I.loc = src.loc
|
||||
|
||||
if(sound)
|
||||
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
|
||||
var/material_amount = materials.get_item_material_amount(I)
|
||||
if(!material_amount)
|
||||
qdel(I)
|
||||
@@ -131,18 +143,18 @@ var/const/SAFETY_COOLDOWN = 100
|
||||
materials.retrieve_all()
|
||||
|
||||
|
||||
/obj/machinery/recycler/proc/stop(mob/living/L)
|
||||
/obj/machinery/recycler/proc/emergency_stop(mob/living/L)
|
||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
safety_mode = 1
|
||||
safety_mode = TRUE
|
||||
update_icon()
|
||||
L.loc = src.loc
|
||||
|
||||
spawn(SAFETY_COOLDOWN)
|
||||
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
safety_mode = 0
|
||||
safety_mode = FALSE
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/recycler/proc/eat(mob/living/L)
|
||||
/obj/machinery/recycler/proc/crush_living(mob/living/L)
|
||||
|
||||
L.loc = src.loc
|
||||
|
||||
@@ -151,22 +163,23 @@ var/const/SAFETY_COOLDOWN = 100
|
||||
else
|
||||
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
var/gib = 1
|
||||
var/gib = TRUE
|
||||
// By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count)
|
||||
if(iscarbon(L))
|
||||
gib = 0
|
||||
gib = FALSE
|
||||
if(L.stat == CONSCIOUS)
|
||||
L.say("ARRRRRRRRRRRGH!!!")
|
||||
add_blood(L)
|
||||
|
||||
if(!blood && !issilicon(L))
|
||||
blood = 1
|
||||
blood = TRUE
|
||||
update_icon()
|
||||
|
||||
// Remove and recycle the equipped items.
|
||||
for(var/obj/item/I in L.get_equipped_items())
|
||||
if(L.unEquip(I))
|
||||
recycle(I, 0)
|
||||
// Remove and recycle the equipped items
|
||||
if(eat_victim_items)
|
||||
for(var/obj/item/I in L.get_equipped_items())
|
||||
if(L.unEquip(I))
|
||||
eat(I, sound=FALSE)
|
||||
|
||||
// Instantly lie down, also go unconscious from the pain, before you die.
|
||||
L.Paralyse(5)
|
||||
@@ -175,9 +188,13 @@ var/const/SAFETY_COOLDOWN = 100
|
||||
if(gib || emagged == 2)
|
||||
L.gib()
|
||||
else if(emagged == 1)
|
||||
L.adjustBruteLoss(1000)
|
||||
|
||||
L.adjustBruteLoss(crush_damage)
|
||||
|
||||
/obj/machinery/recycler/deathtrap
|
||||
name = "dangerous old crusher"
|
||||
emagged = TRUE
|
||||
crush_damage = 120
|
||||
flags = NODECONSTRUCT
|
||||
|
||||
/obj/item/weapon/paper/recycler
|
||||
name = "paper - 'garbage duty instructions'"
|
||||
|
||||
@@ -224,6 +224,7 @@
|
||||
if(target == "input")
|
||||
target = input("New target temperature:", name, round(targetTemperature - T0C, 1)) as num|null
|
||||
if(!isnull(target) && !..())
|
||||
target += T0C
|
||||
. = TRUE
|
||||
else if(adjust)
|
||||
target = targetTemperature + adjust
|
||||
|
||||
@@ -2,21 +2,15 @@
|
||||
name = "washing machine"
|
||||
desc = "Gets rid of those pesky bloodstains, or your money back!"
|
||||
icon = 'icons/obj/machines/washing_machine.dmi'
|
||||
icon_state = "wm_10"
|
||||
icon_state = "wm_1_0"
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/state = 1
|
||||
//1 = empty, open door
|
||||
//2 = empty, closed door
|
||||
//3 = full, open door
|
||||
//4 = full, closed door
|
||||
//5 = running
|
||||
//6 = blood, open door
|
||||
//7 = blood, closed door
|
||||
//8 = blood, running
|
||||
var/gibs_ready = 0
|
||||
var/obj/crayon
|
||||
var/obj/paper
|
||||
state_open = 1
|
||||
var/busy = 0
|
||||
var/bloody_mess = 0
|
||||
var/has_corgi = 0
|
||||
var/obj/item/color_source
|
||||
var/max_wash_capacity = 5
|
||||
|
||||
/obj/machinery/washing_machine/examine(mob/user)
|
||||
..()
|
||||
@@ -26,286 +20,227 @@
|
||||
if(!user.canUseTopic(src))
|
||||
return
|
||||
|
||||
if( state != 4 )
|
||||
usr << "The washing machine cannot run in this state."
|
||||
if(busy)
|
||||
return
|
||||
|
||||
if( locate(/mob,contents) )
|
||||
state = 8
|
||||
else
|
||||
state = 5
|
||||
if(state_open)
|
||||
user << "<span class='notice'>Close the door first</span>"
|
||||
return
|
||||
|
||||
if(bloody_mess)
|
||||
user << "<span class='warning'>[src] must be cleaned up first.</span>"
|
||||
return
|
||||
|
||||
if(has_corgi)
|
||||
bloody_mess = 1
|
||||
|
||||
busy = 1
|
||||
update_icon()
|
||||
sleep(200)
|
||||
for(var/atom/A in contents)
|
||||
A.clean_blood()
|
||||
wash_cycle()
|
||||
|
||||
//Tanning!
|
||||
for(var/obj/item/stack/sheet/hairlesshide/HH in contents)
|
||||
var/obj/item/stack/sheet/wetleather/WL = new(src)
|
||||
WL.amount = HH.amount
|
||||
qdel(HH)
|
||||
|
||||
//Corgi costume says goodbye
|
||||
for(var/obj/item/clothing/suit/hooded/ian_costume/IC in contents)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src)
|
||||
qdel(IC)
|
||||
|
||||
for(var/obj/item/weapon/paper/P in contents)
|
||||
if(crayon)
|
||||
var/dye_color
|
||||
if(istype(crayon,/obj/item/toy/crayon))
|
||||
var/obj/item/toy/crayon/CR = crayon
|
||||
dye_color = CR.paint_color
|
||||
if(dye_color)
|
||||
P.color = dye_color
|
||||
qdel(crayon)
|
||||
crayon = null
|
||||
|
||||
if(crayon)
|
||||
var/wash_color
|
||||
if(istype(crayon,/obj/item/toy/crayon))
|
||||
var/obj/item/toy/crayon/CR = crayon
|
||||
wash_color = CR.paint_color
|
||||
else if(istype(crayon,/obj/item/weapon/stamp))
|
||||
var/obj/item/weapon/stamp/ST = crayon
|
||||
wash_color = ST.item_color
|
||||
|
||||
|
||||
if(wash_color)
|
||||
var/new_jumpsuit_icon_state = ""
|
||||
var/new_jumpsuit_item_state = ""
|
||||
var/new_jumpsuit_name = ""
|
||||
var/new_can_adjust
|
||||
var/new_glove_icon_state = ""
|
||||
var/new_glove_item_state = ""
|
||||
var/new_glove_name = ""
|
||||
var/new_shoe_icon_state = ""
|
||||
var/new_shoe_name = ""
|
||||
var/new_sheet_icon_state = ""
|
||||
var/new_sheet_name = ""
|
||||
var/new_softcap_icon_state = ""
|
||||
var/new_softcap_name = ""
|
||||
var/new_desc = "The colors are a bit dodgy."
|
||||
for(var/T in typesof(/obj/item/clothing/under/color))
|
||||
var/obj/item/clothing/under/color/J = new T
|
||||
//world << "DEBUG: [wash_color] == [J.item_color]"
|
||||
if(wash_color == J.item_color)
|
||||
new_jumpsuit_icon_state = J.icon_state
|
||||
new_jumpsuit_item_state = J.item_state
|
||||
new_jumpsuit_name = J.name
|
||||
new_can_adjust = J.can_adjust
|
||||
qdel(J)
|
||||
break
|
||||
qdel(J)
|
||||
for(var/T in typesof(/obj/item/clothing/gloves/color))
|
||||
var/obj/item/clothing/gloves/color/G = new T
|
||||
if(wash_color == G.item_color)
|
||||
new_glove_icon_state = G.icon_state
|
||||
new_glove_item_state = G.item_state
|
||||
new_glove_name = G.name
|
||||
qdel(G)
|
||||
break
|
||||
qdel(G)
|
||||
for(var/T in typesof(/obj/item/clothing/shoes/sneakers))
|
||||
var/obj/item/clothing/shoes/sneakers/S = new T
|
||||
if(wash_color == S.item_color)
|
||||
new_shoe_icon_state = S.icon_state
|
||||
new_shoe_name = S.name
|
||||
qdel(S)
|
||||
break
|
||||
qdel(S)
|
||||
for(var/T in typesof(/obj/item/weapon/bedsheet))
|
||||
var/obj/item/weapon/bedsheet/B = new T
|
||||
if(wash_color == B.item_color)
|
||||
new_sheet_icon_state = B.icon_state
|
||||
new_sheet_name = B.name
|
||||
qdel(B)
|
||||
break
|
||||
qdel(B)
|
||||
for(var/T in typesof(/obj/item/clothing/head/soft))
|
||||
var/obj/item/clothing/head/soft/H = new T
|
||||
if(wash_color == H.item_color)
|
||||
new_softcap_icon_state = H.icon_state
|
||||
new_softcap_name = H.name
|
||||
qdel(H)
|
||||
break
|
||||
qdel(H)
|
||||
if(new_jumpsuit_icon_state && new_jumpsuit_item_state && new_jumpsuit_name)
|
||||
for(var/obj/item/clothing/under/color/J in contents)
|
||||
J.item_state = new_jumpsuit_item_state
|
||||
J.icon_state = new_jumpsuit_icon_state
|
||||
J.item_color = wash_color
|
||||
J.name = new_jumpsuit_name
|
||||
J.desc = new_desc
|
||||
J.suit_color = wash_color
|
||||
J.can_adjust = new_can_adjust
|
||||
if(new_glove_icon_state && new_glove_item_state && new_glove_name)
|
||||
for(var/obj/item/clothing/gloves/color/G in contents)
|
||||
G.item_state = new_glove_item_state
|
||||
G.icon_state = new_glove_icon_state
|
||||
G.item_color = wash_color
|
||||
G.name = new_glove_name
|
||||
G.desc = new_desc
|
||||
if(new_shoe_icon_state && new_shoe_name)
|
||||
for(var/obj/item/clothing/shoes/sneakers/S in contents)
|
||||
if (S.chained == 1)
|
||||
S.chained = 0
|
||||
S.slowdown = SHOES_SLOWDOWN
|
||||
new /obj/item/weapon/restraints/handcuffs( src )
|
||||
S.icon_state = new_shoe_icon_state
|
||||
S.item_color = wash_color
|
||||
S.name = new_shoe_name
|
||||
S.desc = new_desc
|
||||
if(new_sheet_icon_state && new_sheet_name)
|
||||
for(var/obj/item/weapon/bedsheet/B in contents)
|
||||
B.icon_state = new_sheet_icon_state
|
||||
B.item_color = wash_color
|
||||
B.name = new_sheet_name
|
||||
B.desc = new_desc
|
||||
if(new_softcap_icon_state && new_softcap_name)
|
||||
for(var/obj/item/clothing/head/soft/H in contents)
|
||||
H.icon_state = new_softcap_icon_state
|
||||
H.item_color = wash_color
|
||||
H.name = new_softcap_name
|
||||
H.desc = new_desc
|
||||
qdel(crayon)
|
||||
crayon = null
|
||||
/obj/machinery/washing_machine/clean_blood()
|
||||
..()
|
||||
if(!busy)
|
||||
bloody_mess = 0
|
||||
update_icon()
|
||||
|
||||
|
||||
if( locate(/mob,contents) )
|
||||
state = 7
|
||||
gibs_ready = 1
|
||||
else
|
||||
state = 4
|
||||
/obj/machinery/washing_machine/proc/wash_cycle()
|
||||
for(var/X in contents)
|
||||
var/atom/movable/AM = X
|
||||
AM.clean_blood()
|
||||
AM.machine_wash(src)
|
||||
|
||||
busy = 0
|
||||
if(color_source)
|
||||
qdel(color_source)
|
||||
color_source = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/washing_machine/verb/climb_out()
|
||||
set name = "Climb out"
|
||||
set category = "Object"
|
||||
set src in usr.loc
|
||||
|
||||
sleep(20)
|
||||
if(state in list(1,3,6) )
|
||||
usr.loc = src.loc
|
||||
//what happens to this object when washed inside a washing machine
|
||||
/atom/movable/proc/machine_wash(obj/machinery/washing_machine/WM)
|
||||
return
|
||||
|
||||
/obj/item/stack/sheet/hairlesshide/machine_wash(obj/machinery/washing_machine/WM)
|
||||
var/obj/item/stack/sheet/wetleather/WL = new(loc)
|
||||
WL.amount = amount
|
||||
qdel(src)
|
||||
|
||||
/obj/item/clothing/suit/hooded/ian_costume/machine_wash(obj/machinery/washing_machine/WM)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/paper/machine_wash(obj/machinery/washing_machine/WM)
|
||||
if(WM.color_source)
|
||||
if(istype(WM.color_source,/obj/item/toy/crayon))
|
||||
var/obj/item/toy/crayon/CR = WM.color_source
|
||||
color = CR.paint_color
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/machine_wash(obj/machinery/washing_machine/WM)
|
||||
gib()
|
||||
|
||||
/obj/item/clothing/under/color/machine_wash(obj/machinery/washing_machine/WM)
|
||||
jumpsuit_wash(WM)
|
||||
|
||||
/obj/item/clothing/under/rank/machine_wash(obj/machinery/washing_machine/WM)
|
||||
jumpsuit_wash(WM)
|
||||
|
||||
/obj/item/clothing/under/proc/jumpsuit_wash(obj/machinery/washing_machine/WM)
|
||||
if(WM.color_source)
|
||||
var/wash_color = WM.color_source.item_color
|
||||
var/obj/item/clothing/under/U
|
||||
for(var/T in typesof(/obj/item/clothing/under/color))
|
||||
var/obj/item/clothing/under/color/J = T
|
||||
if(wash_color == initial(J.item_color))
|
||||
U = J
|
||||
break
|
||||
if(!U)
|
||||
for(var/T in typesof(/obj/item/clothing/under/rank))
|
||||
var/obj/item/clothing/under/rank/R = T
|
||||
if(wash_color == initial(R.item_color))
|
||||
U = R
|
||||
break
|
||||
if(U)
|
||||
item_state = initial(U.item_state)
|
||||
icon_state = initial(U.icon_state)
|
||||
item_color = wash_color
|
||||
name = initial(U.name)
|
||||
desc = "The colors are a bit dodgy."
|
||||
can_adjust = initial(U.can_adjust)
|
||||
if(!can_adjust && adjusted) //we deadjust the uniform if it's now unadjustable
|
||||
toggle_jumpsuit_adjust()
|
||||
|
||||
/obj/item/clothing/gloves/color/machine_wash(obj/machinery/washing_machine/WM)
|
||||
if(WM.color_source)
|
||||
var/wash_color = WM.color_source.item_color
|
||||
for(var/T in typesof(/obj/item/clothing/gloves/color))
|
||||
var/obj/item/clothing/gloves/color/G = T
|
||||
if(wash_color == initial(G.item_color))
|
||||
item_state = initial(G.item_state)
|
||||
icon_state = initial(G.icon_state)
|
||||
item_color = wash_color
|
||||
name = initial(G.name)
|
||||
desc = "The colors are a bit dodgy."
|
||||
break
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/machine_wash(obj/machinery/washing_machine/WM)
|
||||
if(chained)
|
||||
chained = 0
|
||||
slowdown = SHOES_SLOWDOWN
|
||||
new /obj/item/weapon/restraints/handcuffs(loc)
|
||||
if(WM.color_source)
|
||||
var/wash_color = WM.color_source.item_color
|
||||
for(var/T in typesof(/obj/item/clothing/shoes/sneakers))
|
||||
var/obj/item/clothing/shoes/sneakers/S = T
|
||||
if(wash_color == initial(S.item_color))
|
||||
icon_state = initial(S.icon_state)
|
||||
item_color = wash_color
|
||||
name = initial(S.name)
|
||||
desc = "The colors are a bit dodgy."
|
||||
break
|
||||
|
||||
/obj/item/weapon/bedsheet/machine_wash(obj/machinery/washing_machine/WM)
|
||||
if(WM.color_source)
|
||||
var/wash_color = WM.color_source.item_color
|
||||
for(var/T in typesof(/obj/item/weapon/bedsheet))
|
||||
var/obj/item/weapon/bedsheet/B = T
|
||||
if(wash_color == initial(B.item_color))
|
||||
icon_state = initial(B.icon_state)
|
||||
item_color = wash_color
|
||||
name = initial(B.name)
|
||||
desc = "The colors are a bit dodgy."
|
||||
break
|
||||
|
||||
/obj/item/clothing/head/soft/machine_wash(obj/machinery/washing_machine/WM)
|
||||
if(WM.color_source)
|
||||
var/wash_color = WM.color_source.item_color
|
||||
for(var/T in typesof(/obj/item/clothing/head/soft))
|
||||
var/obj/item/clothing/head/soft/H = T
|
||||
if(wash_color == initial(H.item_color))
|
||||
icon_state = initial(H.icon_state)
|
||||
item_color = wash_color
|
||||
name = initial(H.name)
|
||||
desc = "The colors are a bit dodgy."
|
||||
break
|
||||
|
||||
|
||||
/obj/machinery/washing_machine/relaymove(mob/user)
|
||||
container_resist(user)
|
||||
|
||||
/obj/machinery/washing_machine/container_resist(mob/user)
|
||||
if(!busy)
|
||||
add_fingerprint(user)
|
||||
open_machine()
|
||||
|
||||
|
||||
|
||||
/obj/machinery/washing_machine/update_icon()
|
||||
icon_state = "wm_[state]0"
|
||||
overlays.Cut()
|
||||
if(busy)
|
||||
icon_state = "wm_running_[bloody_mess]"
|
||||
else if(bloody_mess)
|
||||
icon_state = "wm_[state_open]_blood"
|
||||
else
|
||||
var/full = contents.len ? 1 : 0
|
||||
icon_state = "wm_[state_open]_[full]"
|
||||
if(panel_open)
|
||||
overlays += image(icon, icon_state = "wm_panel")
|
||||
|
||||
/obj/machinery/washing_machine/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/weapon/stamp))
|
||||
if( state in list( 1, 3, 6 ) )
|
||||
if(!crayon)
|
||||
if(!user.drop_item())
|
||||
return
|
||||
crayon = W
|
||||
crayon.loc = src
|
||||
else
|
||||
..()
|
||||
else
|
||||
..()
|
||||
if(default_deconstruction_screwdriver(user, null, null, W))
|
||||
update_icon()
|
||||
return
|
||||
else if(istype(W,/obj/item/weapon/grab))
|
||||
if(state == 1)
|
||||
if(state_open)
|
||||
var/obj/item/weapon/grab/G = W
|
||||
if(iscorgi(G.affecting))
|
||||
has_corgi = 1
|
||||
G.affecting.loc = src
|
||||
qdel(G)
|
||||
state = 3
|
||||
else
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
else if(istype(W,/obj/item/stack/sheet/hairlesshide) || \
|
||||
istype(W,/obj/item/clothing/under) || \
|
||||
istype(W,/obj/item/clothing/mask) || \
|
||||
istype(W,/obj/item/clothing/head) || \
|
||||
istype(W,/obj/item/clothing/gloves) || \
|
||||
istype(W,/obj/item/clothing/shoes) || \
|
||||
istype(W,/obj/item/clothing/suit) || \
|
||||
istype(W,/obj/item/weapon/bedsheet) || \
|
||||
istype(W,/obj/item/weapon/paper))
|
||||
else if(user.a_intent != "harm")
|
||||
|
||||
//YES, it's hardcoded... saves a var/can_be_washed for every single clothing item.
|
||||
if ( istype(W,/obj/item/clothing/suit/space ) )
|
||||
user << "This item does not fit."
|
||||
return
|
||||
if ( istype(W,/obj/item/clothing/suit/syndicatefake ) )
|
||||
user << "This item does not fit."
|
||||
return
|
||||
// if ( istype(W,/obj/item/clothing/suit/powered ) )
|
||||
// user << "This item does not fit."
|
||||
// return
|
||||
if ( istype(W,/obj/item/clothing/suit/cyborg_suit ) )
|
||||
user << "This item does not fit."
|
||||
return
|
||||
if ( istype(W,/obj/item/clothing/suit/bomb_suit ) )
|
||||
user << "This item does not fit."
|
||||
return
|
||||
if ( istype(W,/obj/item/clothing/suit/armor ) )
|
||||
user << "This item does not fit."
|
||||
return
|
||||
if ( istype(W,/obj/item/clothing/suit/armor ) )
|
||||
user << "This item does not fit."
|
||||
return
|
||||
if ( istype(W,/obj/item/clothing/mask/gas ) )
|
||||
user << "This item does not fit."
|
||||
return
|
||||
if ( istype(W,/obj/item/clothing/mask/cigarette ) )
|
||||
user << "This item does not fit."
|
||||
return
|
||||
if ( istype(W,/obj/item/clothing/head/syndicatefake ) )
|
||||
user << "This item does not fit."
|
||||
return
|
||||
if ( istype(W,/obj/item/clothing/head/helmet ) )
|
||||
user << "This item does not fit."
|
||||
return
|
||||
if(W.flags & NODROP) //if "can't drop" item
|
||||
user << "<span class='warning'>\The [W] is stuck to your hand, you cannot put it in the washing machine!</span>"
|
||||
return
|
||||
if (!state_open)
|
||||
user << "<span class='warning'>Open the door first!</span>"
|
||||
return 1
|
||||
|
||||
if(contents.len < 5)
|
||||
if ( state in list(1, 3) )
|
||||
if(!user.drop_item())
|
||||
return
|
||||
W.loc = src
|
||||
state = 3
|
||||
else
|
||||
user << "<span class='warning'>You can't put the item in right now!</span>"
|
||||
else
|
||||
if(bloody_mess)
|
||||
user << "<span class='warning'>[src] must be cleaned up first.</span>"
|
||||
return 1
|
||||
|
||||
if(contents.len >= max_wash_capacity)
|
||||
user << "<span class='warning'>The washing machine is full!</span>"
|
||||
return 1
|
||||
|
||||
if(!user.unEquip(W))
|
||||
user << "<span class='warning'>\The [W] is stuck to your hand, you cannot put it in the washing machine!</span>"
|
||||
return 1
|
||||
|
||||
if(istype(W,/obj/item/toy/crayon) || istype(W,/obj/item/weapon/stamp))
|
||||
color_source = W
|
||||
W.loc = src
|
||||
update_icon()
|
||||
|
||||
else
|
||||
..()
|
||||
update_icon()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/washing_machine/attack_hand(mob/user)
|
||||
switch(state)
|
||||
if(1)
|
||||
state = 2
|
||||
if(2)
|
||||
state = 1
|
||||
for(var/atom/movable/O in contents)
|
||||
O.loc = src.loc
|
||||
if(3)
|
||||
state = 4
|
||||
if(4)
|
||||
state = 3
|
||||
for(var/atom/movable/O in contents)
|
||||
O.loc = src.loc
|
||||
crayon = null
|
||||
state = 1
|
||||
if(5)
|
||||
user << "<span class='danger'>The [src] is busy.</span>"
|
||||
if(6)
|
||||
state = 7
|
||||
if(7)
|
||||
if(gibs_ready)
|
||||
gibs_ready = 0
|
||||
if(locate(/mob,contents))
|
||||
var/mob/M = locate(/mob,contents)
|
||||
M.gib()
|
||||
for(var/atom/movable/O in contents)
|
||||
O.loc = src.loc
|
||||
crayon = null
|
||||
state = 1
|
||||
if(busy)
|
||||
user << "<span class='warning'>[src] is busy.</span>"
|
||||
return
|
||||
|
||||
if(!state_open)
|
||||
open_machine()
|
||||
else
|
||||
state_open = 0 //close the door
|
||||
update_icon()
|
||||
|
||||
|
||||
update_icon()
|
||||
/obj/machinery/washing_machine/open_machine(drop = 1)
|
||||
..()
|
||||
density = 1 //because machinery/open_machine() sets it to 0
|
||||
color_source = null
|
||||
has_corgi = 0
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
icon_state = "mecha_analyzer"
|
||||
origin_tech = "materials=3;engineering=2"
|
||||
selectable = 0
|
||||
equip_cooldown = 30
|
||||
var/scanning = 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/mining_scanner/New()
|
||||
|
||||
@@ -43,10 +43,12 @@
|
||||
icon_state = "heal"
|
||||
duration = 15
|
||||
|
||||
/obj/effect/overlay/temp/heal/New()
|
||||
/obj/effect/overlay/temp/heal/New(loc, colour)
|
||||
..()
|
||||
pixel_x = rand(-12, 12)
|
||||
pixel_y = rand(-9, 0)
|
||||
if(colour)
|
||||
color = colour
|
||||
|
||||
/obj/effect/overlay/temp/explosion
|
||||
name = "explosion"
|
||||
|
||||
@@ -578,4 +578,13 @@ obj/item/proc/item_action_slot_check(slot, mob/user)
|
||||
/obj/item/proc/can_dismember()
|
||||
if((sharpness || damtype == BURN) && w_class >= 3)
|
||||
return 1
|
||||
return 0
|
||||
return 0
|
||||
|
||||
/obj/item/proc/open_flame()
|
||||
var/turf/location = loc
|
||||
if(ismob(location))
|
||||
var/mob/M = location
|
||||
if(M.l_hand == src || M.r_hand == src)
|
||||
location = get_turf(M)
|
||||
if(isturf(location))
|
||||
location.hotspot_expose(700, 5)
|
||||
|
||||
@@ -1,22 +1,23 @@
|
||||
#define CANDLE_LUMINOSITY 2
|
||||
/obj/item/candle
|
||||
name = "red candle"
|
||||
desc = "a candle"
|
||||
desc = "In Greek myth, Prometheus stole fire from the Gods and gave it to \
|
||||
humankind. The jewelry he kept for himself."
|
||||
icon = 'icons/obj/candle.dmi'
|
||||
icon_state = "candle1"
|
||||
item_state = "candle1"
|
||||
w_class = 1
|
||||
var/wax = 200
|
||||
var/lit = 0
|
||||
var/infinite = 0
|
||||
var/start_lit = 0
|
||||
var/lit = FALSE
|
||||
var/infinite = FALSE
|
||||
var/start_lit = FALSE
|
||||
heat = 1000
|
||||
|
||||
/obj/item/candle/New()
|
||||
..()
|
||||
if(start_lit)
|
||||
// No visible message
|
||||
light(null)
|
||||
light(show_message = FALSE)
|
||||
|
||||
/obj/item/candle/update_icon()
|
||||
var/i
|
||||
@@ -56,12 +57,13 @@
|
||||
light() //honk
|
||||
return
|
||||
|
||||
/obj/item/candle/proc/light(flavor_text = "<span class='danger'>[usr] lights the [name].</span>")
|
||||
/obj/item/candle/proc/light(show_message)
|
||||
if(!src.lit)
|
||||
src.lit = 1
|
||||
src.lit = TRUE
|
||||
//src.damtype = "fire"
|
||||
if(flavor_text)
|
||||
usr.visible_message(flavor_text)
|
||||
if(show_message)
|
||||
usr.visible_message(
|
||||
"<span class='danger'>[usr] lights the [name].</span>")
|
||||
SetLuminosity(CANDLE_LUMINOSITY)
|
||||
SSobj.processing |= src
|
||||
update_icon()
|
||||
@@ -79,14 +81,13 @@
|
||||
M.unEquip(src, 1) //src is being deleted anyway
|
||||
qdel(src)
|
||||
update_icon()
|
||||
if(istype(loc, /turf)) //start a fire if possible
|
||||
var/turf/T = loc
|
||||
T.hotspot_expose(700, 5)
|
||||
|
||||
open_flame()
|
||||
|
||||
/obj/item/candle/attack_self(mob/user)
|
||||
if(lit)
|
||||
lit = 0
|
||||
user.visible_message(
|
||||
"<span class='notice'>[user] snuffs [src].</span>")
|
||||
lit = FALSE
|
||||
update_icon()
|
||||
SetLuminosity(0)
|
||||
user.AddLuminosity(-CANDLE_LUMINOSITY)
|
||||
@@ -110,7 +111,7 @@
|
||||
|
||||
|
||||
/obj/item/candle/infinite
|
||||
infinite = 1
|
||||
start_lit = 1
|
||||
infinite = TRUE
|
||||
start_lit = TRUE
|
||||
|
||||
#undef CANDLE_LUMINOSITY
|
||||
|
||||
@@ -1,43 +1,263 @@
|
||||
|
||||
/*
|
||||
* Crayons
|
||||
*/
|
||||
|
||||
/obj/item/toy/crayon
|
||||
name = "crayon"
|
||||
desc = "A colourful crayon. Looks tasty. Mmmm..."
|
||||
icon = 'icons/obj/crayons.dmi'
|
||||
icon_state = "crayonred"
|
||||
item_color = "red"
|
||||
w_class = 1
|
||||
attack_verb = list("attacked", "coloured")
|
||||
var/paint_color = "#FF0000" //RGB
|
||||
var/drawtype = "rune"
|
||||
var/text_buffer = ""
|
||||
var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow","star","poseur tag")
|
||||
var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
|
||||
var/list/numerals = list("0","1","2","3","4","5","6","7","8","9")
|
||||
var/list/oriented = list("arrow","body") // These turn to face the same way as the drawer
|
||||
var/uses = 30 //-1 or less for unlimited uses
|
||||
var/instant = 0
|
||||
var/dat
|
||||
var/list/validSurfaces = list(/turf/open/floor)
|
||||
var/gang = 0 //For marking territory
|
||||
var/edible = 1
|
||||
|
||||
/obj/item/toy/crayon/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.</span>")
|
||||
return (BRUTELOSS|OXYLOSS)
|
||||
|
||||
/obj/item/toy/crayon/New()
|
||||
..()
|
||||
name = "[item_color] crayon" //Makes crayons identifiable in things like grinders
|
||||
drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1,6)]")
|
||||
if(config)
|
||||
if(config.mutant_races == 1)
|
||||
graffiti |= "antilizard"
|
||||
graffiti |= "prolizard"
|
||||
|
||||
/obj/item/toy/crayon/initialize()
|
||||
if(config.mutant_races == 1)
|
||||
graffiti |= "antilizard"
|
||||
graffiti |= "prolizard"
|
||||
|
||||
/obj/item/toy/crayon/attack_self(mob/living/user)
|
||||
update_window(user)
|
||||
|
||||
/obj/item/toy/crayon/proc/update_window(mob/living/user)
|
||||
dat += "<center><h2>Currently selected: [drawtype]</h2><br>"
|
||||
dat += "<a href='?src=\ref[src];type=random_letter'>Random letter</a><a href='?src=\ref[src];type=letter'>Pick letter/number</a>"
|
||||
dat += "<a href='?src=\ref[src];buffer=1'>Write</a>"
|
||||
dat += "<hr>"
|
||||
dat += "<h3>Runes:</h3><br>"
|
||||
dat += "<a href='?src=\ref[src];type=random_rune'>Random rune</a>"
|
||||
for(var/i = 1; i <= 6; i++)
|
||||
dat += "<a href='?src=\ref[src];type=rune[i]'>Rune[i]</a>"
|
||||
if(!((i + 1) % 3)) //3 buttons in a row
|
||||
dat += "<br>"
|
||||
dat += "<hr>"
|
||||
graffiti.Find()
|
||||
dat += "<h3>Graffiti:</h3><br>"
|
||||
dat += "<a href='?src=\ref[src];type=random_graffiti'>Random graffiti</a>"
|
||||
var/c = 1
|
||||
for(var/T in graffiti)
|
||||
dat += "<a href='?src=\ref[src];type=[T]'>[T]</a>"
|
||||
if(!((c + 1) % 3)) //3 buttons in a row
|
||||
dat += "<br>"
|
||||
c++
|
||||
dat += "<hr>"
|
||||
var/datum/browser/popup = new(user, "crayon", name, 300, 500)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
dat = ""
|
||||
|
||||
/obj/item/toy/crayon/proc/crayon_text_strip(text)
|
||||
var/list/base = char_split(lowertext(text))
|
||||
var/list/out = list()
|
||||
for(var/a in base)
|
||||
if(a in (letters|numerals))
|
||||
out += a
|
||||
return jointext(out,"")
|
||||
|
||||
/obj/item/toy/crayon/Topic(href, href_list, hsrc)
|
||||
var/temp = "a"
|
||||
if(href_list["buffer"])
|
||||
text_buffer = crayon_text_strip(stripped_input(usr,"Choose what to write.", "Scribbles",default = text_buffer))
|
||||
if(href_list["type"])
|
||||
switch(href_list["type"])
|
||||
if("random_letter")
|
||||
temp = pick(letters)
|
||||
if("letter")
|
||||
temp = input("Choose what to write.", "Scribbles") in (letters|numerals)
|
||||
if("random_rune")
|
||||
temp = "rune[rand(1,6)]"
|
||||
if("random_graffiti")
|
||||
temp = pick(graffiti)
|
||||
else
|
||||
temp = href_list["type"]
|
||||
if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
|
||||
return
|
||||
drawtype = temp
|
||||
update_window(usr)
|
||||
|
||||
/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity || !check_allowed_items(target)) return
|
||||
if(!uses)
|
||||
user << "<span class='warning'>There is no more of [src.name] left!</span>"
|
||||
if(!instant)
|
||||
qdel(src)
|
||||
return
|
||||
if(istype(target, /obj/effect/decal/cleanable))
|
||||
target = target.loc
|
||||
if(is_type_in_list(target,validSurfaces))
|
||||
|
||||
var/temp = "rune"
|
||||
if(letters.Find(drawtype))
|
||||
temp = "letter"
|
||||
else if(graffiti.Find(drawtype))
|
||||
temp = "graffiti"
|
||||
else if(numerals.Find(drawtype))
|
||||
temp = "number"
|
||||
|
||||
////////////////////////// GANG FUNCTIONS
|
||||
var/area/territory
|
||||
var/gangID
|
||||
if(gang)
|
||||
//Determine gang affiliation
|
||||
gangID = user.mind.gang_datum
|
||||
|
||||
//Check area validity. Reject space, player-created areas, and non-station z-levels.
|
||||
if(gangID)
|
||||
territory = get_area(target)
|
||||
if(territory && (territory.z == ZLEVEL_STATION) && territory.valid_territory)
|
||||
//Check if this area is already tagged by a gang
|
||||
if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag
|
||||
if(territory_claimed(territory, user))
|
||||
return
|
||||
if(locate(/obj/machinery/power/apc) in (user.loc.contents | target.contents))
|
||||
user << "<span class='warning'>You cannot tag here.</span>"
|
||||
return
|
||||
else
|
||||
user << "<span class='warning'>[territory] is unsuitable for tagging.</span>"
|
||||
return
|
||||
/////////////////////////////////////////
|
||||
|
||||
var/graf_rot
|
||||
if(oriented.Find(drawtype))
|
||||
switch(user.dir)
|
||||
if(EAST)
|
||||
graf_rot = 90
|
||||
if(SOUTH)
|
||||
graf_rot = 180
|
||||
if(WEST)
|
||||
graf_rot = 270
|
||||
else
|
||||
graf_rot = 0
|
||||
|
||||
user << "<span class='notice'>You start [instant ? "spraying" : "drawing"] a [temp] on the [target.name]...</span>"
|
||||
if(instant)
|
||||
playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
|
||||
if((instant>0) || do_after(user, 50, target = target))
|
||||
|
||||
if(length(text_buffer))
|
||||
drawtype = copytext(text_buffer,1,2)
|
||||
text_buffer = copytext(text_buffer,2)
|
||||
|
||||
//Gang functions
|
||||
if(gangID)
|
||||
//Delete any old markings on this tile, including other gang tags
|
||||
if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag
|
||||
if(territory_claimed(territory, user))
|
||||
return
|
||||
for(var/obj/effect/decal/cleanable/crayon/old_marking in target)
|
||||
qdel(old_marking)
|
||||
new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",graf_rot)
|
||||
user << "<span class='notice'>You tagged [territory] for your gang!</span>"
|
||||
|
||||
else
|
||||
new /obj/effect/decal/cleanable/crayon(target,paint_color,drawtype,temp,graf_rot)
|
||||
|
||||
user << "<span class='notice'>You finish [instant ? "spraying" : "drawing"] \the [temp].</span>"
|
||||
if(instant<0)
|
||||
playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
|
||||
if(uses < 0)
|
||||
return
|
||||
uses = max(0,uses-1)
|
||||
if(!uses)
|
||||
user << "<span class='warning'>There is no more of [src.name] left!</span>"
|
||||
if(!instant)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/toy/crayon/attack(mob/M, mob/user)
|
||||
if(edible && (M == user))
|
||||
user << "You take a bite of the [src.name]. Delicious!"
|
||||
user.nutrition += 5
|
||||
if(uses < 0)
|
||||
return
|
||||
uses = max(0,uses-5)
|
||||
if(!uses)
|
||||
user << "<span class='warning'>There is no more of [src.name] left!</span>"
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/toy/crayon/proc/territory_claimed(area/territory,mob/user)
|
||||
var/occupying_gang
|
||||
for(var/datum/gang/G in ticker.mode.gangs)
|
||||
if(territory.type in (G.territory|G.territory_new))
|
||||
occupying_gang = G.name
|
||||
break
|
||||
if(occupying_gang)
|
||||
user << "<span class='danger'>[territory] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!</span>"
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
/obj/item/toy/crayon/red
|
||||
icon_state = "crayonred"
|
||||
paint_color = "#DA0000"
|
||||
colourName = "red"
|
||||
item_color = "red"
|
||||
|
||||
/obj/item/toy/crayon/orange
|
||||
icon_state = "crayonorange"
|
||||
paint_color = "#FF9300"
|
||||
colourName = "orange"
|
||||
item_color = "orange"
|
||||
|
||||
/obj/item/toy/crayon/yellow
|
||||
icon_state = "crayonyellow"
|
||||
paint_color = "#FFF200"
|
||||
colourName = "yellow"
|
||||
item_color = "yellow"
|
||||
|
||||
/obj/item/toy/crayon/green
|
||||
icon_state = "crayongreen"
|
||||
paint_color = "#A8E61D"
|
||||
colourName = "green"
|
||||
item_color = "green"
|
||||
|
||||
/obj/item/toy/crayon/blue
|
||||
icon_state = "crayonblue"
|
||||
paint_color = "#00B7EF"
|
||||
colourName = "blue"
|
||||
item_color = "blue"
|
||||
|
||||
/obj/item/toy/crayon/purple
|
||||
icon_state = "crayonpurple"
|
||||
paint_color = "#DA00FF"
|
||||
colourName = "purple"
|
||||
item_color = "purple"
|
||||
|
||||
/obj/item/toy/crayon/white
|
||||
icon_state = "crayonwhite"
|
||||
paint_color = "#FFFFFF"
|
||||
colourName = "white"
|
||||
item_color = "white"
|
||||
|
||||
/obj/item/toy/crayon/mime
|
||||
icon_state = "crayonmime"
|
||||
desc = "A very sad-looking crayon."
|
||||
paint_color = "#FFFFFF"
|
||||
colourName = "mime"
|
||||
item_color = "mime"
|
||||
uses = -1
|
||||
|
||||
/obj/item/toy/crayon/mime/attack_self(mob/living/user)
|
||||
@@ -62,7 +282,7 @@
|
||||
/obj/item/toy/crayon/rainbow
|
||||
icon_state = "crayonrainbow"
|
||||
paint_color = "#FFF000"
|
||||
colourName = "rainbow"
|
||||
item_color = "rainbow"
|
||||
uses = -1
|
||||
|
||||
/obj/item/toy/crayon/rainbow/attack_self(mob/living/user)
|
||||
@@ -110,12 +330,12 @@
|
||||
/obj/item/weapon/storage/crayons/update_icon()
|
||||
overlays.Cut()
|
||||
for(var/obj/item/toy/crayon/crayon in contents)
|
||||
overlays += image('icons/obj/crayons.dmi',crayon.colourName)
|
||||
overlays += image('icons/obj/crayons.dmi',crayon.item_color)
|
||||
|
||||
/obj/item/weapon/storage/crayons/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/toy/crayon))
|
||||
var/obj/item/toy/crayon/C = W
|
||||
switch(C.colourName)
|
||||
switch(C.item_color)
|
||||
if("mime")
|
||||
usr << "This crayon is too sad to be contained in this box."
|
||||
return
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
/obj/item/device/pda/clown/Crossed(AM as mob|obj)
|
||||
if (istype(AM, /mob/living/carbon))
|
||||
var/mob/living/carbon/M = AM
|
||||
if(M.slip(8, 5, src, NO_SLIP_WHEN_WALKING))
|
||||
if(M.slip(0, 6, src, NO_SLIP_WHEN_WALKING))
|
||||
if (ishuman(M) && (M.real_name != src.owner))
|
||||
if (istype(src.cartridge, /obj/item/weapon/cartridge/clown))
|
||||
var/obj/item/weapon/cartridge/clown/cart = src.cartridge
|
||||
@@ -197,4 +197,4 @@
|
||||
/obj/item/device/pda/geneticist
|
||||
name = "geneticist PDA"
|
||||
default_cartridge = /obj/item/weapon/cartridge/medical
|
||||
icon_state = "pda-genetics"
|
||||
icon_state = "pda-genetics"
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/obj/item/modkit
|
||||
name = "modification kit"
|
||||
desc = "A one-use kit, which enables kinetic accelerators to be fired with only one hand, as well as allowing less dextrous races to use the tool."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "modkit"
|
||||
origin_tech = "programming=2;materials=2;magnets=4"
|
||||
var/uses = 1
|
||||
|
||||
/obj/item/modkit/afterattack(obj/item/weapon/gun/energy/kinetic_accelerator/C, mob/user)
|
||||
..()
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
return
|
||||
if(!istype(C))
|
||||
user << "<span class='warning'>This kit can only modify kinetic accelerators!</span>"
|
||||
return ..()
|
||||
user <<"<span class='notice'>You modify the [C], making it less unwieldy.</span>"
|
||||
C.name = "compact [C.name]"
|
||||
C.weapon_weight = WEAPON_LIGHT
|
||||
C.trigger_guard = TRIGGER_GUARD_ALLOW_ALL
|
||||
uses --
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
@@ -50,8 +50,8 @@
|
||||
user << "<span class='warning'>You have already forged a seal on [src]!</span>"
|
||||
else
|
||||
var/obj/item/toy/crayon/C = O
|
||||
name = "[C.colourName] secret documents"
|
||||
icon_state = "docs_[C.colourName]"
|
||||
forgedseal = C.colourName
|
||||
user << "<span class='notice'>You forge the official seal with a [C.colourName] crayon. No one will notice... right?</span>"
|
||||
name = "[C.item_color] secret documents"
|
||||
icon_state = "docs_[C.item_color]"
|
||||
forgedseal = C.item_color
|
||||
user << "<span class='notice'>You forge the official seal with a [C.item_color] crayon. No one will notice... right?</span>"
|
||||
update_icon()
|
||||
@@ -63,6 +63,7 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
|
||||
icon_state = "sandbags"
|
||||
singular_name = "sandbag"
|
||||
force = 5
|
||||
layer = 2.95
|
||||
throwforce = 5
|
||||
w_class = 3
|
||||
throw_speed = 1
|
||||
|
||||
@@ -323,223 +323,6 @@
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/*
|
||||
* Crayons
|
||||
*/
|
||||
|
||||
/obj/item/toy/crayon
|
||||
name = "crayon"
|
||||
desc = "A colourful crayon. Looks tasty. Mmmm..."
|
||||
icon = 'icons/obj/crayons.dmi'
|
||||
icon_state = "crayonred"
|
||||
w_class = 1
|
||||
attack_verb = list("attacked", "coloured")
|
||||
var/paint_color = "#FF0000" //RGB
|
||||
var/drawtype = "rune"
|
||||
var/text_buffer = ""
|
||||
var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow","star","poseur tag")
|
||||
var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
|
||||
var/list/numerals = list("0","1","2","3","4","5","6","7","8","9")
|
||||
var/list/oriented = list("arrow","body") // These turn to face the same way as the drawer
|
||||
var/uses = 30 //-1 or less for unlimited uses
|
||||
var/instant = 0
|
||||
var/colourName = "red" //for updateIcon purposes
|
||||
var/dat
|
||||
var/list/validSurfaces = list(/turf/open/floor)
|
||||
var/gang = 0 //For marking territory
|
||||
var/edible = 1
|
||||
|
||||
/obj/item/toy/crayon/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.</span>")
|
||||
return (BRUTELOSS|OXYLOSS)
|
||||
|
||||
/obj/item/toy/crayon/New()
|
||||
..()
|
||||
name = "[colourName] crayon" //Makes crayons identifiable in things like grinders
|
||||
drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1,6)]")
|
||||
if(config)
|
||||
if(config.mutant_races == 1)
|
||||
graffiti |= "antilizard"
|
||||
graffiti |= "prolizard"
|
||||
|
||||
/obj/item/toy/crayon/initialize()
|
||||
if(config.mutant_races == 1)
|
||||
graffiti |= "antilizard"
|
||||
graffiti |= "prolizard"
|
||||
|
||||
/obj/item/toy/crayon/attack_self(mob/living/user)
|
||||
update_window(user)
|
||||
|
||||
/obj/item/toy/crayon/proc/update_window(mob/living/user)
|
||||
dat += "<center><h2>Currently selected: [drawtype]</h2><br>"
|
||||
dat += "<a href='?src=\ref[src];type=random_letter'>Random letter</a><a href='?src=\ref[src];type=letter'>Pick letter/number</a>"
|
||||
dat += "<a href='?src=\ref[src];buffer=1'>Write</a>"
|
||||
dat += "<hr>"
|
||||
dat += "<h3>Runes:</h3><br>"
|
||||
dat += "<a href='?src=\ref[src];type=random_rune'>Random rune</a>"
|
||||
for(var/i = 1; i <= 6; i++)
|
||||
dat += "<a href='?src=\ref[src];type=rune[i]'>Rune[i]</a>"
|
||||
if(!((i + 1) % 3)) //3 buttons in a row
|
||||
dat += "<br>"
|
||||
dat += "<hr>"
|
||||
graffiti.Find()
|
||||
dat += "<h3>Graffiti:</h3><br>"
|
||||
dat += "<a href='?src=\ref[src];type=random_graffiti'>Random graffiti</a>"
|
||||
var/c = 1
|
||||
for(var/T in graffiti)
|
||||
dat += "<a href='?src=\ref[src];type=[T]'>[T]</a>"
|
||||
if(!((c + 1) % 3)) //3 buttons in a row
|
||||
dat += "<br>"
|
||||
c++
|
||||
dat += "<hr>"
|
||||
var/datum/browser/popup = new(user, "crayon", name, 300, 500)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
dat = ""
|
||||
|
||||
/obj/item/toy/crayon/proc/crayon_text_strip(text)
|
||||
var/list/base = char_split(lowertext(text))
|
||||
var/list/out = list()
|
||||
for(var/a in base)
|
||||
if(a in (letters|numerals))
|
||||
out += a
|
||||
return jointext(out,"")
|
||||
|
||||
/obj/item/toy/crayon/Topic(href, href_list, hsrc)
|
||||
var/temp = "a"
|
||||
if(href_list["buffer"])
|
||||
text_buffer = crayon_text_strip(stripped_input(usr,"Choose what to write.", "Scribbles",default = text_buffer))
|
||||
if(href_list["type"])
|
||||
switch(href_list["type"])
|
||||
if("random_letter")
|
||||
temp = pick(letters)
|
||||
if("letter")
|
||||
temp = input("Choose what to write.", "Scribbles") in (letters|numerals)
|
||||
if("random_rune")
|
||||
temp = "rune[rand(1,6)]"
|
||||
if("random_graffiti")
|
||||
temp = pick(graffiti)
|
||||
else
|
||||
temp = href_list["type"]
|
||||
if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
|
||||
return
|
||||
drawtype = temp
|
||||
update_window(usr)
|
||||
|
||||
/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity || !check_allowed_items(target)) return
|
||||
if(!uses)
|
||||
user << "<span class='warning'>There is no more of [src.name] left!</span>"
|
||||
if(!instant)
|
||||
qdel(src)
|
||||
return
|
||||
if(istype(target, /obj/effect/decal/cleanable))
|
||||
target = target.loc
|
||||
if(is_type_in_list(target,validSurfaces))
|
||||
|
||||
var/temp = "rune"
|
||||
if(letters.Find(drawtype))
|
||||
temp = "letter"
|
||||
else if(graffiti.Find(drawtype))
|
||||
temp = "graffiti"
|
||||
else if(numerals.Find(drawtype))
|
||||
temp = "number"
|
||||
|
||||
////////////////////////// GANG FUNCTIONS
|
||||
var/area/territory
|
||||
var/gangID
|
||||
if(gang)
|
||||
//Determine gang affiliation
|
||||
gangID = user.mind.gang_datum
|
||||
|
||||
//Check area validity. Reject space, player-created areas, and non-station z-levels.
|
||||
if(gangID)
|
||||
territory = get_area(target)
|
||||
if(territory && (territory.z == ZLEVEL_STATION) && territory.valid_territory)
|
||||
//Check if this area is already tagged by a gang
|
||||
if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag
|
||||
if(territory_claimed(territory, user))
|
||||
return
|
||||
if(locate(/obj/machinery/power/apc) in (user.loc.contents | target.contents))
|
||||
user << "<span class='warning'>You cannot tag here.</span>"
|
||||
return
|
||||
else
|
||||
user << "<span class='warning'>[territory] is unsuitable for tagging.</span>"
|
||||
return
|
||||
/////////////////////////////////////////
|
||||
|
||||
var/graf_rot
|
||||
if(oriented.Find(drawtype))
|
||||
switch(user.dir)
|
||||
if(EAST)
|
||||
graf_rot = 90
|
||||
if(SOUTH)
|
||||
graf_rot = 180
|
||||
if(WEST)
|
||||
graf_rot = 270
|
||||
else
|
||||
graf_rot = 0
|
||||
|
||||
user << "<span class='notice'>You start [instant ? "spraying" : "drawing"] a [temp] on the [target.name]...</span>"
|
||||
if(instant)
|
||||
playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
|
||||
if((instant>0) || do_after(user, 50, target = target))
|
||||
|
||||
if(length(text_buffer))
|
||||
drawtype = copytext(text_buffer,1,2)
|
||||
text_buffer = copytext(text_buffer,2)
|
||||
|
||||
//Gang functions
|
||||
if(gangID)
|
||||
//Delete any old markings on this tile, including other gang tags
|
||||
if(!(locate(/obj/effect/decal/cleanable/crayon/gang) in target)) //Ignore the check if the tile being sprayed has a gang tag
|
||||
if(territory_claimed(territory, user))
|
||||
return
|
||||
for(var/obj/effect/decal/cleanable/crayon/old_marking in target)
|
||||
qdel(old_marking)
|
||||
new /obj/effect/decal/cleanable/crayon/gang(target,gangID,"graffiti",graf_rot)
|
||||
user << "<span class='notice'>You tagged [territory] for your gang!</span>"
|
||||
|
||||
else
|
||||
new /obj/effect/decal/cleanable/crayon(target,paint_color,drawtype,temp,graf_rot)
|
||||
|
||||
user << "<span class='notice'>You finish [instant ? "spraying" : "drawing"] \the [temp].</span>"
|
||||
if(instant<0)
|
||||
playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
|
||||
if(uses < 0)
|
||||
return
|
||||
uses = max(0,uses-1)
|
||||
if(!uses)
|
||||
user << "<span class='warning'>There is no more of [src.name] left!</span>"
|
||||
if(!instant)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/toy/crayon/attack(mob/M, mob/user)
|
||||
if(edible && (M == user))
|
||||
user << "You take a bite of the [src.name]. Delicious!"
|
||||
user.nutrition += 5
|
||||
if(uses < 0)
|
||||
return
|
||||
uses = max(0,uses-5)
|
||||
if(!uses)
|
||||
user << "<span class='warning'>There is no more of [src.name] left!</span>"
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/toy/crayon/proc/territory_claimed(area/territory,mob/user)
|
||||
var/occupying_gang
|
||||
for(var/datum/gang/G in ticker.mode.gangs)
|
||||
if(territory.type in (G.territory|G.territory_new))
|
||||
occupying_gang = G.name
|
||||
break
|
||||
if(occupying_gang)
|
||||
user << "<span class='danger'>[territory] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!</span>"
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/*
|
||||
* Snap pops
|
||||
*/
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
name = "high frequency blade"
|
||||
desc = "Bad references are the DNA of the soul."
|
||||
attack_verb = list("chopped", "sliced", "cut", "zandatsu'd")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/weapon/nullrod/hammmer
|
||||
icon_state = "hammeron"
|
||||
|
||||
@@ -13,6 +13,13 @@
|
||||
..()
|
||||
tracked_implants -= src
|
||||
|
||||
/obj/item/weapon/implanter/tracking/New()
|
||||
imp = new /obj/item/weapon/implant/tracking( src )
|
||||
..()
|
||||
/obj/item/weapon/implanter/tracking/gps/New()
|
||||
imp = new /obj/item/device/gps/mining/internal( src )
|
||||
..()
|
||||
|
||||
/obj/item/weapon/implant/tracking/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Tracking Beacon<BR>
|
||||
|
||||
@@ -111,6 +111,8 @@
|
||||
|
||||
/obj/item/weapon/kitchen/knife/combat/survival
|
||||
name = "survival knife"
|
||||
icon_state = "survivalknife"
|
||||
desc = "A hunting grade survival knife."
|
||||
force = 15
|
||||
throwforce = 15
|
||||
|
||||
|
||||
@@ -351,6 +351,10 @@
|
||||
icon_state = "duffle-clown"
|
||||
item_state = "duffle-clown"
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/clown/cream_pie/New()
|
||||
. = ..()
|
||||
for(var/i in 1 to 10)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/pie/cream(src)
|
||||
|
||||
/obj/item/weapon/storage/backpack/dufflebag/syndie
|
||||
name = "suspicious looking dufflebag"
|
||||
|
||||
@@ -57,37 +57,45 @@
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/weapon/storage/box/survival
|
||||
|
||||
// Ordinary survival box
|
||||
/obj/item/weapon/storage/box/survival/New()
|
||||
..()
|
||||
new /obj/item/clothing/mask/breath(src)
|
||||
new /obj/item/weapon/tank/internals/emergency_oxygen(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
|
||||
|
||||
/obj/item/weapon/storage/box/engineer
|
||||
/obj/item/weapon/storage/box/survival/radio/New()
|
||||
..()
|
||||
new /obj/item/device/radio/off(src)
|
||||
|
||||
// Engineer survival box
|
||||
/obj/item/weapon/storage/box/engineer/New()
|
||||
..()
|
||||
new /obj/item/clothing/mask/breath(src)
|
||||
new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
|
||||
|
||||
/obj/item/weapon/storage/box/syndie
|
||||
/obj/item/weapon/storage/box/engineer/radio/New()
|
||||
..()
|
||||
new /obj/item/device/radio/off(src)
|
||||
|
||||
// Syndie survival box
|
||||
/obj/item/weapon/storage/box/syndie/New()
|
||||
..()
|
||||
new /obj/item/clothing/mask/gas/syndicate(src)
|
||||
new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src)
|
||||
|
||||
/obj/item/weapon/storage/box/security
|
||||
|
||||
// Security survival box
|
||||
/obj/item/weapon/storage/box/security/New()
|
||||
..()
|
||||
new /obj/item/clothing/mask/gas/sechailer(src)
|
||||
new /obj/item/weapon/tank/internals/emergency_oxygen(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
|
||||
|
||||
/obj/item/weapon/storage/box/security/radio/New()
|
||||
..()
|
||||
new /obj/item/device/radio/off(src)
|
||||
|
||||
/obj/item/weapon/storage/box/gloves
|
||||
name = "box of latex gloves"
|
||||
desc = "Contains sterile latex gloves."
|
||||
@@ -231,6 +239,19 @@
|
||||
new /obj/item/weapon/implantpad(src)
|
||||
new /obj/item/weapon/locator(src)
|
||||
|
||||
/obj/item/weapon/storage/box/minertracker
|
||||
name = "boxed tracking implant kit"
|
||||
desc = "For finding those who have died on the accursed lavaworld."
|
||||
icon_state = "implant"
|
||||
|
||||
/obj/item/weapon/storage/box/minertracker/New()
|
||||
..()
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/weapon/implantcase/tracking(src)
|
||||
new /obj/item/weapon/implanter(src)
|
||||
new /obj/item/weapon/implantpad(src)
|
||||
new /obj/item/weapon/locator(src)
|
||||
|
||||
/obj/item/weapon/storage/box/chemimp
|
||||
name = "boxed chemical implant kit"
|
||||
desc = "Box of stuff used to implant chemicals."
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
if(locked)
|
||||
icon_state = icon_locked
|
||||
user << "<span class='danger'>You lock the [src.name]!</span>"
|
||||
close_all()
|
||||
return
|
||||
else
|
||||
icon_state = icon_closed
|
||||
|
||||
@@ -290,14 +290,9 @@
|
||||
remove_fuel(1)
|
||||
update_icon()
|
||||
|
||||
|
||||
//This is to start fires. process() is only called if the welder is on.
|
||||
var/turf/location = loc
|
||||
if(ismob(location))
|
||||
var/mob/M = location
|
||||
if(M.l_hand == src || M.r_hand == src)
|
||||
location = get_turf(M)
|
||||
if(isturf(location))
|
||||
location.hotspot_expose(700, 5)
|
||||
open_flame()
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/afterattack(atom/O, mob/user, proximity)
|
||||
|
||||
@@ -508,4 +508,7 @@
|
||||
else
|
||||
owner.visible_message("<span class='danger'>[owner] parries [attack_text] with [src]!</span>")
|
||||
return 1
|
||||
return 0
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/twohanded/vibro_weapon/update_icon()
|
||||
icon_state = "hfrequency[wielded]"
|
||||
@@ -395,7 +395,7 @@
|
||||
add_fingerprint(user)
|
||||
locked = !locked
|
||||
user.visible_message("<span class='notice'>[user] [locked ? null : "un"]locks [src].</span>",
|
||||
"<span class='notice'>You [locked ? null : "un"]locks [src].</span>")
|
||||
"<span class='notice'>You [locked ? null : "un"]lock [src].</span>")
|
||||
update_icon()
|
||||
else
|
||||
user << "<span class='notice'>Access Denied</span>"
|
||||
|
||||
@@ -61,3 +61,12 @@
|
||||
new /obj/item/stack/spacecash/c500(src)
|
||||
for(var/i = 0, i < 6, i++)
|
||||
new /obj/item/stack/spacecash/c200(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/cream_pie
|
||||
name = "cream pie closet"
|
||||
desc = "Contains pies filled with cream and/or custard, you sickos."
|
||||
req_access = list(access_theatre)
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/pie/New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/pie/cream(src)
|
||||
|
||||
@@ -27,7 +27,9 @@
|
||||
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
user.visible_message("<span class='notice'>[user] unfastens [src].</span>", \
|
||||
"<span class='notice'>You unfasten [src].</span>")
|
||||
new /obj/item/sign_backing(get_turf(user))
|
||||
var/obj/item/sign_backing/SB = new (get_turf(user))
|
||||
SB.icon_state = icon_state
|
||||
SB.sign_path = type
|
||||
qdel(src)
|
||||
else if(istype(O, /obj/item/weapon/pen))
|
||||
var/list/sign_types = list("Secure Area", "Biohazard", "High Voltage", "Radiation", "Hard Vacuum Ahead", "Disposal: Leads To Space", "Danger: Fire", "No Smoking", "Medbay", "Science", "Chemistry", \
|
||||
@@ -82,11 +84,12 @@
|
||||
|
||||
/obj/item/sign_backing
|
||||
name = "sign backing"
|
||||
desc = "A blank sign with adhesive backing."
|
||||
desc = "A sign with adhesive backing."
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
icon_state = "backing"
|
||||
w_class = 3
|
||||
burn_state = FLAMMABLE
|
||||
var/sign_path = /obj/structure/sign/basic //the type of sign that will be created when placed on a turf
|
||||
|
||||
/obj/item/sign_backing/afterattack(atom/target, mob/user, proximity)
|
||||
if(isturf(target) && proximity)
|
||||
@@ -94,7 +97,7 @@
|
||||
user.visible_message("<span class='notice'>[user] fastens [src] to [T].</span>", \
|
||||
"<span class='notice'>You attach a blank sign to [T].</span>")
|
||||
playsound(T, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
new /obj/structure/sign/basic(T)
|
||||
new sign_path(T)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -101,10 +101,13 @@
|
||||
var/mob/living/carbon/M = AM
|
||||
switch(wet)
|
||||
if(TURF_WET_WATER)
|
||||
if(!M.slip(3, 1, null, NO_SLIP_WHEN_WALKING))
|
||||
if(!M.slip(0, 3, null, NO_SLIP_WHEN_WALKING))
|
||||
M.inertia_dir = 0
|
||||
if(TURF_WET_LUBE)
|
||||
M.slip(0, 7, null, (SLIDE|GALOSHES_DONT_HELP))
|
||||
M.slip(0, 4, null, (SLIDE|GALOSHES_DONT_HELP))
|
||||
M.confused += 8
|
||||
if(TURF_WET_ICE)
|
||||
M.slip(0, 6, null, (SLIDE|GALOSHES_DONT_HELP))
|
||||
if(TURF_WET_ICE || TURF_WET_PERMAFROST)
|
||||
M.slip(0, 4, null, (SLIDE|NO_SLIP_WHEN_WALKING))
|
||||
|
||||
|
||||
@@ -534,7 +534,9 @@
|
||||
for(var/obj/machinery/capture_the_flag/CTF in machines)
|
||||
ctf_enabled = !CTF.ctf_enabled
|
||||
CTF.ctf_enabled = !CTF.ctf_enabled
|
||||
CTF.TellGhost()
|
||||
message_admins("[key_name_admin(usr)] has [ctf_enabled? "enabled" : "disabled"] CTF!")
|
||||
notify_ghosts("CTF has been [ctf_enabled? "enabled" : "disabled"]!",'sound/effects/ghost2.ogg')
|
||||
|
||||
if(E)
|
||||
E.processing = 0
|
||||
|
||||
@@ -26,8 +26,6 @@ var/sound/admin_sound
|
||||
|
||||
for(var/mob/M in player_list)
|
||||
if(M.client.prefs.toggles & SOUND_MIDI)
|
||||
var/vol = M.client.prefs.adminmusicvolume
|
||||
admin_sound.volume = vol
|
||||
M << admin_sound
|
||||
|
||||
feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -172,6 +172,16 @@
|
||||
M.faction += team
|
||||
M.equipOutfit(ctf_gear)
|
||||
|
||||
/obj/machinery/capture_the_flag/proc/TellGhost()
|
||||
if(ctf_enabled)
|
||||
notify_ghosts("[name] has been activated!", enter_link="<a href=?src=\ref[src];join=1>(Click to join the [team] team!)</a> or click on the controller directly!", source = src, attack_not_jump = 0)
|
||||
|
||||
/obj/machinery/capture_the_flag/Topic(href, href_list)
|
||||
if(href_list["join"])
|
||||
var/mob/dead/observer/ghost = usr
|
||||
if(istype(ghost))
|
||||
attack_ghost(ghost)
|
||||
|
||||
/obj/machinery/capture_the_flag/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/twohanded/required/ctf))
|
||||
var/obj/item/weapon/twohanded/required/ctf/flag = I
|
||||
@@ -214,6 +224,12 @@
|
||||
CTF.ctf_gear = CTF.instagib_gear
|
||||
CTF.respawn_cooldown = INSTAGIB_RESPAWN
|
||||
|
||||
/obj/machinery/capture_the_flag/proc/normal_mode()
|
||||
for(var/obj/machinery/capture_the_flag/CTF in machines)
|
||||
if(CTF.ctf_enabled == TRUE)
|
||||
CTF.ctf_gear = initial(ctf_gear)
|
||||
CTF.respawn_cooldown = DEFAULT_RESPAWN
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/deagle/CTF
|
||||
desc = "This looks like it could really hurt in melee."
|
||||
force = 75
|
||||
|
||||
@@ -73,16 +73,16 @@
|
||||
/obj/machinery/recycler/lumbermill
|
||||
name = "lumbermill saw"
|
||||
desc = "Faster then the cartoons!"
|
||||
emagged = 2 //Always grinds people
|
||||
emagged = 2 //Always gibs people
|
||||
item_recycle_sound = 'sound/weapons/chainsawhit.ogg'
|
||||
|
||||
/obj/machinery/recycler/lumbermill/recycle(obj/item/weapon/grown/log/L, sound = 1)
|
||||
L.loc = src.loc
|
||||
/obj/machinery/recycler/lumbermill/recycle_item(obj/item/weapon/grown/log/L)
|
||||
if(!istype(L))
|
||||
return
|
||||
if(sound)
|
||||
playsound(src.loc, 'sound/weapons/chainsawhit.ogg', 100, 1)
|
||||
new L.plank_type(src.loc, 1 + round(L.seed.potency / 25))
|
||||
qdel(L)
|
||||
else
|
||||
var/potency = L.seed.potency
|
||||
..()
|
||||
new L.plank_type(src.loc, 1 + round(potency / 25))
|
||||
|
||||
/mob/living/simple_animal/chicken/rabbit/normal
|
||||
icon_state = "b_rabbit"
|
||||
@@ -130,4 +130,4 @@
|
||||
spawnableAtoms = list(/obj/structure/flora/rock/icy = 5, /obj/structure/flora/rock/pile/icy = 5)
|
||||
|
||||
/obj/effect/landmark/mapGenerator/snowy
|
||||
mapGeneratorType = /datum/mapGenerator/snowy
|
||||
mapGeneratorType = /datum/mapGenerator/snowy
|
||||
|
||||
@@ -829,6 +829,14 @@
|
||||
/obj/item/pizzabox/vegetable)
|
||||
crate_name = "pizza crate"
|
||||
|
||||
/datum/supply_pack/organic/cream_piee
|
||||
name = "High-yield Clown-grade Cream Pie Crate"
|
||||
cost = 6000
|
||||
contains = list(/obj/item/weapon/storage/backpack/dufflebag/clown/cream_pie)
|
||||
crate_name = "party equipment crate"
|
||||
contraband = TRUE
|
||||
access = access_theatre
|
||||
|
||||
/datum/supply_pack/organic/monkey
|
||||
name = "Monkey Crate"
|
||||
cost = 2000
|
||||
@@ -1198,7 +1206,9 @@
|
||||
/obj/item/weapon/folder/red,
|
||||
/obj/item/weapon/folder/yellow,
|
||||
/obj/item/weapon/clipboard,
|
||||
/obj/item/weapon/clipboard)
|
||||
/obj/item/weapon/clipboard,
|
||||
/obj/item/weapon/stamp,
|
||||
/obj/item/weapon/stamp/denied)
|
||||
crate_name = "bureaucracy crate"
|
||||
|
||||
/datum/supply_pack/misc/toner
|
||||
|
||||
@@ -62,7 +62,6 @@ var/list/preferences_datums = list()
|
||||
var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
|
||||
|
||||
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
|
||||
var/adminmusicvolume = 50
|
||||
//Mob preview
|
||||
var/icon/preview_icon = null
|
||||
|
||||
|
||||
@@ -223,7 +223,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["preferred_map"] >> preferred_map
|
||||
S["ignoring"] >> ignoring
|
||||
S["ghost_hud"] >> ghost_hud
|
||||
S["adminmusicvolume"] >> adminmusicvolume
|
||||
S["inquisitive_ghost"] >> inquisitive_ghost
|
||||
|
||||
//try to fix any outdated data if necessary
|
||||
@@ -275,7 +274,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["preferred_map"] << preferred_map
|
||||
S["ignoring"] << ignoring
|
||||
S["ghost_hud"] << ghost_hud
|
||||
S["adminmusicvolume"] << adminmusicvolume
|
||||
S["inquisitive_ghost"] << inquisitive_ghost
|
||||
|
||||
return 1
|
||||
|
||||
@@ -332,13 +332,4 @@ var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
|
||||
prefs.toggles ^= SOUND_ANNOUNCEMENTS
|
||||
src << "You will now [(prefs.toggles & SOUND_ANNOUNCEMENTS) ? "no longer hear announcements" : "hear announcement sounds"]."
|
||||
prefs.save_preferences()
|
||||
feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
/client/verb/set_admin_volume()
|
||||
set name = "Set Admin Music Volume"
|
||||
set category = "Preferences"
|
||||
set desc = "Set the volume you hear admin music at."
|
||||
var/musinput = input("Range of 0 to 100.","Admin Music Volume", prefs.adminmusicvolume) as num
|
||||
prefs.adminmusicvolume = max(0,min(musinput,100))
|
||||
prefs.save_preferences()
|
||||
feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -341,7 +341,6 @@ BLIND // can't see anything
|
||||
var/can_adjust = 1
|
||||
var/adjusted = 0
|
||||
var/alt_covers_chest = 0 // for adjusted/rolled-down jumpsuits, 0 = exposes chest and arms, 1 = exposes arms only
|
||||
var/suit_color = null
|
||||
var/obj/item/clothing/tie/hastie = null
|
||||
|
||||
/obj/item/clothing/under/worn_overlays(var/isinhands = FALSE)
|
||||
@@ -363,7 +362,6 @@ BLIND // can't see anything
|
||||
//make the sensor mode favor higher levels, except coords.
|
||||
sensor_mode = pick(0, 1, 1, 2, 2, 2, 3, 3)
|
||||
adjusted = 0
|
||||
suit_color = item_color
|
||||
..()
|
||||
|
||||
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
|
||||
@@ -482,25 +480,25 @@ BLIND // can't see anything
|
||||
if(!can_adjust)
|
||||
usr << "<span class='warning'>You cannot wear this suit any differently!</span>"
|
||||
return
|
||||
if(src.adjusted == 1)
|
||||
src.fitted = initial(fitted)
|
||||
src.item_color = initial(item_color)
|
||||
src.item_color = src.suit_color //colored jumpsuits are shit and break without this
|
||||
src.body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
usr << "<span class='notice'>You adjust the suit back to normal.</span>"
|
||||
src.adjusted = 0
|
||||
else
|
||||
if(src.fitted != FEMALE_UNIFORM_TOP)
|
||||
src.fitted = NO_FEMALE_UNIFORM
|
||||
src.item_color += "_d"
|
||||
if (alt_covers_chest) // for the special snowflake suits that don't expose the chest when adjusted
|
||||
src.body_parts_covered = CHEST|GROIN|LEGS
|
||||
else
|
||||
src.body_parts_covered = GROIN|LEGS
|
||||
if(toggle_jumpsuit_adjust())
|
||||
usr << "<span class='notice'>You adjust the suit to wear it more casually.</span>"
|
||||
src.adjusted = 1
|
||||
else
|
||||
usr << "<span class='notice'>You adjust the suit back to normal.</span>"
|
||||
usr.update_inv_w_uniform()
|
||||
..()
|
||||
|
||||
/obj/item/clothing/under/proc/toggle_jumpsuit_adjust()
|
||||
adjusted = !adjusted
|
||||
if(adjusted)
|
||||
if(fitted != FEMALE_UNIFORM_TOP)
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
if (alt_covers_chest) // for the special snowflake suits that don't expose the chest when adjusted
|
||||
body_parts_covered = CHEST|GROIN|LEGS
|
||||
else
|
||||
body_parts_covered = GROIN|LEGS
|
||||
else
|
||||
fitted = initial(fitted)
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
return adjusted
|
||||
|
||||
/obj/item/clothing/under/examine(mob/user)
|
||||
..()
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
icon_state = "hardhat0_cakehat"
|
||||
item_state = "hardhat0_cakehat"
|
||||
item_color = "cakehat"
|
||||
hitsound = 'sound/weapons/tap.ogg'
|
||||
flags_inv = HIDEEARS|HIDEHAIR
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
brightness_on = 2 //luminosity when on
|
||||
@@ -69,6 +70,7 @@
|
||||
force = 15
|
||||
throwforce = 15
|
||||
damtype = BURN
|
||||
hitsound = 'sound/items/Welder.ogg'
|
||||
SSobj.processing |= src
|
||||
|
||||
/obj/item/clothing/head/hardhat/cakehat/turn_off()
|
||||
@@ -76,6 +78,7 @@
|
||||
force = 0
|
||||
throwforce = 0
|
||||
damtype = BRUTE
|
||||
hitsound = 'sound/weapons/tap.ogg'
|
||||
SSobj.processing -= src
|
||||
|
||||
/obj/item/clothing/head/hardhat/cakehat/is_hot()
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
heat_protection = FEET
|
||||
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
|
||||
|
||||
redcoat
|
||||
item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way.
|
||||
/obj/item/clothing/shoes/sneakers/black/redcoat
|
||||
item_color = "redcoat" //Exists for washing machines. Is not different from black shoes in any way.
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/brown
|
||||
name = "brown shoes"
|
||||
@@ -20,18 +20,23 @@
|
||||
icon_state = "brown"
|
||||
item_color = "brown"
|
||||
|
||||
captain
|
||||
item_color = "captain" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
hop
|
||||
item_color = "hop" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
ce
|
||||
item_color = "chief" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
rd
|
||||
item_color = "director" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
cmo
|
||||
item_color = "medical" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
cmo
|
||||
item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
/obj/item/clothing/shoes/sneakers/brown/captain
|
||||
item_color = "captain" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/brown/hop
|
||||
item_color = "hop" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/brown/ce
|
||||
item_color = "chief" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/brown/rd
|
||||
item_color = "director" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/brown/cmo
|
||||
item_color = "medical" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/brown/qm
|
||||
item_color = "cargo" //Exists for washing machines. Is not different from brown shoes in any way.
|
||||
|
||||
/obj/item/clothing/shoes/sneakers/blue
|
||||
name = "blue shoes"
|
||||
|
||||
@@ -115,6 +115,12 @@
|
||||
put_on_delay = 40
|
||||
can_hold_items = 1
|
||||
|
||||
/obj/item/clothing/shoes/workboots/mining
|
||||
name = "mining boots"
|
||||
desc = "Steel-toed mining boots for mining in hazardous environments. Very good at keeping toes uncrushed."
|
||||
icon_state = "explorer"
|
||||
burn_state = FIRE_PROOF
|
||||
|
||||
/obj/item/clothing/shoes/cult
|
||||
name = "nar-sian invoker boots"
|
||||
desc = "A pair of boots worn by the followers of Nar-Sie."
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
icon_state = initial(C.icon_state)
|
||||
item_state = initial(C.item_state)
|
||||
item_color = initial(C.item_color)
|
||||
suit_color = initial(C.item_color)
|
||||
|
||||
/obj/item/clothing/under/color/black
|
||||
name = "black jumpsuit"
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype( W, /obj/item/toy/crayon ))
|
||||
var/obj/item/toy/crayon/C = W
|
||||
var/clr = C.colourName
|
||||
var/clr = C.item_color
|
||||
|
||||
if(!(clr in list("blue", "green", "mime", "orange", "purple", "rainbow", "red", "yellow")))
|
||||
usr << "<span class='notice'>[src] refuses to take on this colour!</span>"
|
||||
|
||||
@@ -188,15 +188,15 @@
|
||||
var/obj/item/seeds/seed = G.seed
|
||||
var/mob/living/carbon/M = target
|
||||
|
||||
var/stun_len = seed.potency * rate
|
||||
var/stun_len = seed.potency * rate * 0.8
|
||||
if(istype(G) && ispath(G.trash, /obj/item/weapon/grown))
|
||||
return
|
||||
|
||||
if(!istype(G, /obj/item/weapon/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube")))
|
||||
stun_len /= 3
|
||||
|
||||
var/stun = max(stun_len * 2, 1)
|
||||
var/weaken = max(stun_len, 0.5)
|
||||
var/stun = min(stun_len, 7)
|
||||
var/weaken = min(stun_len, 7)
|
||||
|
||||
if(M.slip(stun, weaken, G))
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
@@ -309,4 +309,4 @@
|
||||
|
||||
/datum/plant_gene/trait/maxchem/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
|
||||
..()
|
||||
G.reagents.maximum_volume *= rate
|
||||
G.reagents.maximum_volume *= rate
|
||||
|
||||
@@ -78,7 +78,7 @@ Shaft Miner
|
||||
|
||||
belt = /obj/item/device/pda/shaftminer
|
||||
ears = /obj/item/device/radio/headset/headset_cargo
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
shoes = /obj/item/clothing/shoes/workboots/mining
|
||||
gloves = /obj/item/clothing/gloves/color/black
|
||||
uniform = /obj/item/clothing/under/rank/miner/lavaland
|
||||
l_pocket = /obj/item/weapon/reagent_containers/pill/patch/styptic
|
||||
|
||||
@@ -296,14 +296,17 @@
|
||||
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule , 400),
|
||||
new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500),
|
||||
new /datum/data/mining_equipment("Explorer Belt", /obj/item/weapon/storage/belt/mining, 500),
|
||||
new /datum/data/mining_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/medipen/survival, 500),
|
||||
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
|
||||
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 600),
|
||||
new /datum/data/mining_equipment("Tracking Implant Kit",/obj/item/weapon/storage/box/minertracker, 600),
|
||||
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 750),
|
||||
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 750),
|
||||
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800),
|
||||
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
|
||||
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1000),
|
||||
new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/hardsuit_jetpack , 2000),
|
||||
new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/hardsuit_jetpack, 2000),
|
||||
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
|
||||
new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
|
||||
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
|
||||
new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500),
|
||||
new /datum/data/mining_equipment("Super Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator/super, 3000),
|
||||
@@ -512,15 +515,31 @@
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/device/wormhole_jaunter/proc/get_destinations(mob/user)
|
||||
var/list/destinations = list()
|
||||
|
||||
if(isgolem(user))
|
||||
for(var/obj/item/device/radio/beacon/B in world)
|
||||
var/turf/T = get_turf(B)
|
||||
if(istype(T.loc, /area/ruin/powered/golem_ship))
|
||||
destinations += B
|
||||
|
||||
// In the event golem beacon is destroyed, send to station instead
|
||||
if(destinations.len)
|
||||
return destinations
|
||||
|
||||
for(var/obj/item/device/radio/beacon/B in world)
|
||||
var/turf/T = get_turf(B)
|
||||
if(T.z == ZLEVEL_STATION)
|
||||
destinations += B
|
||||
|
||||
return destinations
|
||||
|
||||
/obj/item/device/wormhole_jaunter/proc/activate(mob/user)
|
||||
if(!turf_check(user))
|
||||
return
|
||||
|
||||
var/list/L = list()
|
||||
for(var/obj/item/device/radio/beacon/B in world)
|
||||
var/turf/T = get_turf(B)
|
||||
if(T.z == ZLEVEL_STATION)
|
||||
L += B
|
||||
var/list/L = get_destinations(user)
|
||||
if(!L.len)
|
||||
user << "<span class='notice'>The [src.name] found no beacons in the world to anchor a wormhole to.</span>"
|
||||
return
|
||||
@@ -1124,44 +1143,32 @@
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/golem
|
||||
name = "golem ship equipment vendor"
|
||||
desc = "A modified mining equipment vendor. It seems a few selections were replaced."
|
||||
prize_list = list(
|
||||
new /datum/data/mining_equipment("Stimpack", /obj/item/weapon/reagent_containers/hypospray/medipen/stimpack, 50),
|
||||
new /datum/data/mining_equipment("Stimpack Bundle", /obj/item/weapon/storage/box/medipens/utility, 200),
|
||||
new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 100),
|
||||
new /datum/data/mining_equipment("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium,100),
|
||||
new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 200),
|
||||
new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250),
|
||||
new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 300),
|
||||
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
|
||||
new /datum/data/mining_equipment("Monkey Cube", /obj/item/weapon/reagent_containers/food/snacks/monkeycube, 300),
|
||||
new /datum/data/mining_equipment("Toolbelt", /obj/item/weapon/storage/belt/utility, 350),
|
||||
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/weapon/hivelordstabilizer, 400),
|
||||
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/weapon/survivalcapsule, 400),
|
||||
new /datum/data/mining_equipment("GAR scanners", /obj/item/clothing/glasses/meson/gar, 500),
|
||||
new /datum/data/mining_equipment("Sulphuric Acid", /obj/item/weapon/reagent_containers/glass/beaker/sulphuric, 500),
|
||||
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
|
||||
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 800),
|
||||
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800),
|
||||
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
|
||||
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1000),
|
||||
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
|
||||
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
|
||||
new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500),
|
||||
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500),
|
||||
new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone, 800),
|
||||
new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_ugprade, 400),
|
||||
new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/device/mine_bot_ugprade/health, 400),
|
||||
new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/device/mine_bot_ugprade/cooldown, 600),
|
||||
new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
|
||||
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/weapon/storage/box/rndboards, 2000),
|
||||
)
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/golem/New()
|
||||
..()
|
||||
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem(null)
|
||||
B.apply_default_parts(src)
|
||||
desc += "\nIt seems a few selections have been added."
|
||||
prize_list += list(
|
||||
new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250),
|
||||
new /datum/data/mining_equipment("Monkey Cube", /obj/item/weapon/reagent_containers/food/snacks/monkeycube, 300),
|
||||
new /datum/data/mining_equipment("Toolbelt", /obj/item/weapon/storage/belt/utility, 350),
|
||||
new /datum/data/mining_equipment("Sulphuric Acid", /obj/item/weapon/reagent_containers/glass/beaker/sulphuric, 500),
|
||||
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600),
|
||||
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
|
||||
new /datum/data/mining_equipment("Modification Kit", /obj/item/modkit, 1700),
|
||||
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/weapon/storage/box/rndboards, 2000),
|
||||
|
||||
)
|
||||
|
||||
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
|
||||
RefreshParts()
|
||||
|
||||
/obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem
|
||||
name = "circuit board (Golem Ship Equipment Vendor)"
|
||||
build_path = /obj/machinery/mineral/equipment_vendor/golem
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
name = "rock"
|
||||
icon = 'icons/turf/mining.dmi'
|
||||
icon_state = "rock"
|
||||
var/smooth_icon = 'icons/turf/smoothrocks.dmi'
|
||||
smooth = SMOOTH_MORE|SMOOTH_BORDER
|
||||
canSmoothWith = list (/turf/closed/mineral, /turf/closed/wall)
|
||||
baseturf = /turf/open/floor/plating/asteroid/airless
|
||||
@@ -14,7 +15,7 @@
|
||||
layer = MOB_LAYER + 0.05
|
||||
temperature = TCMB
|
||||
var/environment_type = "asteroid"
|
||||
var/turf/open/floor/plating/asteroid/turf_type = /turf/open/floor/plating/asteroid/airless
|
||||
var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless
|
||||
var/mineralType = null
|
||||
var/mineralAmt = 3
|
||||
var/spread = 0 //will the seam spread?
|
||||
@@ -26,7 +27,7 @@
|
||||
/turf/closed/mineral/New()
|
||||
pixel_y = -4
|
||||
pixel_x = -4
|
||||
icon = 'icons/turf/smoothrocks.dmi'
|
||||
icon = smooth_icon
|
||||
..()
|
||||
if (mineralType && mineralAmt && spread && spreadChance)
|
||||
for(var/dir in cardinal)
|
||||
@@ -707,3 +708,56 @@
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
defer_change = 1
|
||||
|
||||
|
||||
//BECAUSE ONE PLANET WASNT ENOUGH
|
||||
|
||||
/turf/closed/mineral/ash_rock //wall piece
|
||||
pixel_y = -4
|
||||
pixel_x = -4
|
||||
name = "rock"
|
||||
icon = 'icons/turf/mining.dmi'
|
||||
smooth_icon = 'icons/turf/walls/rock_wall.dmi'
|
||||
icon_state = "rock"
|
||||
smooth = SMOOTH_MORE|SMOOTH_BORDER
|
||||
canSmoothWith = list (/turf/closed/mineral, /turf/closed/wall)
|
||||
baseturf = /turf/open/floor/plating/ash
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
environment_type = "waste"
|
||||
turf_type = /turf/open/floor/plating/ash
|
||||
defer_change = 1
|
||||
|
||||
/turf/open/floor/plating/ash
|
||||
pixel_y = -4
|
||||
pixel_x = -4
|
||||
icon = 'icons/turf/mining.dmi'
|
||||
name = "ash"
|
||||
icon_state = "ash"
|
||||
smooth = SMOOTH_MORE|SMOOTH_BORDER
|
||||
canSmoothWith = list (/turf/open/floor/plating/ash, /turf/closed)
|
||||
var/smooth_icon = 'icons/turf/floors/ash.dmi'
|
||||
desc = "The ground is covered in volcanic ash."
|
||||
baseturf = /turf/open/floor/plating/ash //I assume this will be a chasm eventually, once this becomes an actual surface
|
||||
slowdown = 1
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
|
||||
/turf/open/floor/plating/ash/New()
|
||||
pixel_y = -4
|
||||
pixel_x = -4
|
||||
icon = smooth_icon
|
||||
..()
|
||||
|
||||
/turf/open/floor/plating/ash/break_tile()
|
||||
return
|
||||
|
||||
/turf/open/floor/plating/ash/burn_tile()
|
||||
return
|
||||
|
||||
/turf/open/floor/plating/ash/rocky
|
||||
name = "rocky ground"
|
||||
icon_state = "rockyash"
|
||||
icon = 'icons/turf/mining.dmi'
|
||||
smooth_icon = 'icons/turf/floors/rocky_ash.dmi'
|
||||
slowdown = 0
|
||||
smooth = SMOOTH_MORE|SMOOTH_BORDER
|
||||
canSmoothWith = list (/turf/open/floor/plating/ash/rocky, /turf/closed)
|
||||
@@ -122,8 +122,6 @@ var/const/MAX_ACTIVE_TIME = 400
|
||||
return 0
|
||||
if(M.getorgan(/obj/item/organ/body_egg/alien_embryo))
|
||||
return 0
|
||||
if(loc == M)
|
||||
return 0
|
||||
if(stat != CONSCIOUS)
|
||||
return 0
|
||||
if(!sterile) M.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
|
||||
|
||||
@@ -119,11 +119,11 @@
|
||||
if(health >= 0)
|
||||
|
||||
if(lying)
|
||||
M.visible_message("<span class='notice'>[M] shakes [src] trying to get \him up!</span>", \
|
||||
"<span class='notice'>You shake [src] trying to get \him up!</span>")
|
||||
M.visible_message("<span class='notice'>[M] shakes [src] trying to get them up!</span>", \
|
||||
"<span class='notice'>You shake [src] trying to get them up!</span>")
|
||||
else
|
||||
M.visible_message("<span class='notice'>[M] hugs [src] to make \him feel better!</span>", \
|
||||
"<span class='notice'>You hug [src] to make \him feel better!</span>")
|
||||
M.visible_message("<span class='notice'>[M] hugs [src] to make them feel better!</span>", \
|
||||
"<span class='notice'>You hug [src] to make them feel better!</span>")
|
||||
AdjustSleeping(-5)
|
||||
AdjustParalysis(-3)
|
||||
AdjustStunned(-3)
|
||||
@@ -212,7 +212,8 @@
|
||||
|
||||
var/atom/movable/item = src.get_active_hand()
|
||||
|
||||
if(!item || (item.flags & NODROP)) return
|
||||
if(!item || (item.flags & (NODROP|ABSTRACT)))
|
||||
return
|
||||
|
||||
if(istype(item, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = item
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
|
||||
take_overall_damage(b_loss,f_loss)
|
||||
//attempt to dismember bodyparts
|
||||
if(severity >= 2 || !bomb_armor)
|
||||
if(severity <= 2 || !bomb_armor)
|
||||
var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3.
|
||||
for(var/X in bodyparts)
|
||||
var/obj/item/bodypart/BP = X
|
||||
|
||||
@@ -443,7 +443,7 @@
|
||||
darksight = 3
|
||||
say_mod = "gibbers"
|
||||
sexes = 0
|
||||
specflags = list(NOBLOOD,NOBREATH,VIRUSIMMUNE)
|
||||
specflags = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS)
|
||||
mutant_organs = list(/obj/item/organ/tongue/abductor)
|
||||
var/scientist = 0 // vars to not pollute spieces list with castes
|
||||
var/agent = 0
|
||||
|
||||
@@ -175,16 +175,18 @@ Please contact me on #coderbus IRC. ~Carnie x
|
||||
var/obj/item/clothing/under/U = w_uniform
|
||||
if(client && hud_used && hud_used.hud_shown)
|
||||
if(hud_used.inventory_shown) //if the inventory is open ...
|
||||
w_uniform.screen_loc = ui_iclothing //...draw the item in the inventory screen
|
||||
U.screen_loc = ui_iclothing //...draw the item in the inventory screen
|
||||
client.screen += w_uniform //Either way, add the item to the HUD
|
||||
|
||||
if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT))
|
||||
return
|
||||
|
||||
|
||||
var/t_color = w_uniform.item_color
|
||||
var/t_color = U.item_color
|
||||
if(!t_color)
|
||||
t_color = w_uniform.icon_state
|
||||
t_color = U.icon_state
|
||||
if(U.adjusted)
|
||||
t_color = "[t_color]_d"
|
||||
|
||||
var/image/standing
|
||||
|
||||
|
||||
@@ -371,18 +371,37 @@ The proc would return a human next to the bot to be set to the patient var.
|
||||
Pass the desired type path itself, declaring a temporary var beforehand is not required.
|
||||
*/
|
||||
/mob/living/simple_animal/bot/proc/scan(scan_type, old_target, scan_range = DEFAULT_SCAN_RANGE)
|
||||
var/final_result
|
||||
for (var/scan in shuffle(view(scan_range, src))) //Search for something in range!
|
||||
if(!istype(scan, scan_type)) //Check that the thing we found is the type we want!
|
||||
continue //If not, keep searching!
|
||||
if( (scan in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness
|
||||
continue
|
||||
var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected.
|
||||
if(scan_result)
|
||||
final_result = scan_result
|
||||
else
|
||||
continue //The current element failed assessment, move on to the next.
|
||||
return final_result
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T)
|
||||
return
|
||||
var/list/adjacent = T.GetAtmosAdjacentTurfs(1)
|
||||
for(var/scan in adjacent)//Let's see if there's something right next to us first!
|
||||
var/final_result = checkscan(scan,scan_type,old_target)
|
||||
if(final_result)
|
||||
return final_result
|
||||
|
||||
for (var/scan in shuffle(view(scan_range, src))-adjacent) //Search for something in range!
|
||||
var/final_result = checkscan(scan,scan_type,old_target)
|
||||
if(final_result)
|
||||
return final_result
|
||||
|
||||
/mob/living/simple_animal/bot/proc/checkscan(scan, scan_type, old_target)
|
||||
if(!istype(scan, scan_type)) //Check that the thing we found is the type we want!
|
||||
return 0 //If not, keep searching!
|
||||
if( (scan in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness
|
||||
return 0
|
||||
var/turf/T = get_turf(scan)
|
||||
if(T)
|
||||
for(var/C in T.contents)
|
||||
if(istype(C,src.type) && (C != src)) //Is there another bot there already? If so, let's skip it so we dont all atack on top of eachother.
|
||||
return 0
|
||||
var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected.
|
||||
if(scan_result)
|
||||
return scan_result
|
||||
else
|
||||
return 0 //The current element failed assessment, move on to the next.
|
||||
return
|
||||
|
||||
|
||||
//When the scan finds a target, run bot specific processing to select it for the next step. Empty by default.
|
||||
/mob/living/simple_animal/bot/proc/process_scan(scan_target)
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
pressure_resistance = 200
|
||||
unique_name = 1
|
||||
AIStatus = AI_OFF //normal constructs don't have AI
|
||||
loot = list(/obj/item/weapon/ectoplasm)
|
||||
del_on_death = 1
|
||||
var/list/construct_spells = list()
|
||||
var/playstyle_string = "<b>You are a generic construct! Your job is to not exist, and you should probably adminhelp this.</b>"
|
||||
|
||||
@@ -34,12 +36,8 @@
|
||||
AddSpell(new spell(null))
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/death()
|
||||
..(1)
|
||||
new /obj/item/weapon/ectoplasm (src.loc)
|
||||
visible_message("<span class='danger'>[src] collapses in a shattered heap.</span>")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
deathmessage = "<span class='danger'>[src] collapses in a shattered heap.</span>"
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/examine(mob/user)
|
||||
var/msg = "<span cass='info'>*---------*\nThis is \icon[src] \a <b>[src]</b>!\n"
|
||||
@@ -183,12 +181,12 @@
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
|
||||
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser)
|
||||
playstyle_string = "<b>You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \
|
||||
use magic missile, repair allied constructs (by clicking on them), \
|
||||
use magic missile, repair allied constructs, shades, and yourself (by clicking on them), \
|
||||
<i>and, most important of all,</i> create new constructs by producing soulstones to capture souls, \
|
||||
and shells to place those soulstones into.</b>"
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/builder/Found(atom/A) //what have we found here?
|
||||
if(istype(A, /mob/living/simple_animal/hostile/construct)) //is it a construct?
|
||||
if(isconstruct(A)) //is it a construct?
|
||||
var/mob/living/simple_animal/hostile/construct/C = A
|
||||
if(C.health < C.maxHealth) //is it hurt? let's go heal it if it is
|
||||
return 1
|
||||
@@ -207,7 +205,7 @@
|
||||
..()
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it
|
||||
if(isconstruct(L) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it
|
||||
LoseTarget()
|
||||
return 0
|
||||
if(L.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you
|
||||
@@ -216,7 +214,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/builder/Aggro()
|
||||
..()
|
||||
if(istype(target, /mob/living/simple_animal/hostile/construct)) //oh the target is a construct no need to flee
|
||||
if(isconstruct(target)) //oh the target is a construct no need to flee
|
||||
retreat_distance = null
|
||||
minimum_distance = 1
|
||||
|
||||
@@ -229,11 +227,6 @@
|
||||
AIStatus = AI_ON
|
||||
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/////////////////////////////Non-cult Artificer/////////////////////////
|
||||
/mob/living/simple_animal/hostile/construct/builder/noncult
|
||||
construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
staticOverlays = list()
|
||||
hud_possible = list(DIAG_STAT_HUD, DIAG_HUD, ANTAG_HUD)
|
||||
unique_name = TRUE
|
||||
var/staticChoice = "static"
|
||||
var/list/staticChoices = list("static", "blank", "letter", "animal")
|
||||
var/picked = FALSE //Have we picked our visual appearence (+ colour if applicable)
|
||||
@@ -64,10 +65,7 @@
|
||||
var/datum/personal_crafting/handcrafting
|
||||
|
||||
/mob/living/simple_animal/drone/New()
|
||||
..()
|
||||
if(name != initial(name))
|
||||
name = name + " ([rand(100,999)])"
|
||||
real_name = name
|
||||
. = ..()
|
||||
|
||||
access_card = new /obj/item/weapon/card/id(src)
|
||||
var/datum/job/captain/C = new /datum/job/captain
|
||||
|
||||
@@ -54,6 +54,17 @@
|
||||
..()
|
||||
desc += " This drone appears to have a complex holoprojector built on its 'head'."
|
||||
|
||||
/mob/living/simple_animal/drone/snowflake/bardrone
|
||||
name = "Bardrone"
|
||||
desc = "A barkeeping drone, an indestructible robot built to tend bars."
|
||||
seeStatic = FALSE
|
||||
laws = "1. Serve drinks.\n\
|
||||
2. Talk to patrons.\n\
|
||||
3. Don't get messed up in their affairs."
|
||||
languages = ALL
|
||||
status_flags = GODMODE // Please don't punch the barkeeper
|
||||
unique_name = FALSE // disables the (123) number suffix
|
||||
|
||||
/obj/item/drone_shell/syndrone
|
||||
name = "syndrone shell"
|
||||
desc = "A shell of a syndrone, a modified maintenance drone designed to infiltrate and annihilate."
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
|
||||
|
||||
if(ishuman(user))
|
||||
if(stat == DEAD)
|
||||
if(stat == DEAD || status_flags & GODMODE)
|
||||
..()
|
||||
return
|
||||
if(user.get_active_hand())
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
icon = 'icons/mob/lavaland/dragon.dmi'
|
||||
faction = list("mining")
|
||||
speak_emote = list("roars")
|
||||
luminosity = 3
|
||||
armour_penetration = 40
|
||||
melee_damage_lower = 40
|
||||
melee_damage_upper = 40
|
||||
@@ -28,6 +29,7 @@
|
||||
var/anger_modifier = 0
|
||||
var/obj/item/device/gps/internal
|
||||
var/swooping = 0
|
||||
var/swoop_cooldown = 0
|
||||
deathmessage = "collapes into a pile of bones, it's flesh sloughing away."
|
||||
death_sound = 'sound/magic/demon_dies.ogg'
|
||||
damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
|
||||
@@ -41,6 +43,13 @@
|
||||
return
|
||||
else
|
||||
..()
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.stat == DEAD)
|
||||
L.gib()
|
||||
visible_message("<span class='danger'>[src] devours [L]!</span>")
|
||||
src << "<span class='userdanger'>You feast on [L], restoring your health!</span>"
|
||||
adjustBruteLoss(-L.maxHealth)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
|
||||
return 1
|
||||
@@ -51,16 +60,27 @@
|
||||
name = "fireball"
|
||||
desc = "Get out of the way!"
|
||||
layer = 6
|
||||
dir = SOUTH
|
||||
randomdir = 0
|
||||
duration = 10
|
||||
pixel_z = 500
|
||||
anchored = 1
|
||||
|
||||
/obj/effect/overlay/temp/target
|
||||
icon = 'icons/mob/actions.dmi'
|
||||
icon_state = "sniper_zoom"
|
||||
layer = MOB_LAYER - 0.1
|
||||
anchored = 1
|
||||
luminosity = 2
|
||||
duration = 10
|
||||
|
||||
/obj/effect/overlay/temp/dragon_swoop
|
||||
name = "certain death"
|
||||
desc = "Don't just stand there, move!"
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "rune_large"
|
||||
layer = MOB_LAYER - 0.1
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
color = "#FF0000"
|
||||
duration = 10
|
||||
|
||||
/obj/effect/overlay/temp/target/ex_act()
|
||||
return
|
||||
@@ -81,8 +101,8 @@
|
||||
anger_modifier = Clamp(((maxHealth - health)/50),0,20)
|
||||
ranged_cooldown = world.time + ranged_cooldown_time
|
||||
|
||||
if(prob(15 + anger_modifier))
|
||||
if(health < maxHealth/2 && !client)
|
||||
if(prob(15 + anger_modifier) && !client)
|
||||
if(health < maxHealth/2)
|
||||
swoop_attack(1)
|
||||
else
|
||||
fire_rain()
|
||||
@@ -103,33 +123,36 @@
|
||||
if(prob(10))
|
||||
new /obj/effect/overlay/temp/target(turf)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls()
|
||||
var/list/attack_dirs = list(NORTH,EAST,SOUTH,WEST)
|
||||
if(prob(50))
|
||||
attack_dirs = list(NORTH,WEST,SOUTH,EAST)
|
||||
playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
|
||||
|
||||
spawn(0)
|
||||
for(var/d in attack_dirs)
|
||||
for(var/d in attack_dirs)
|
||||
spawn(0)
|
||||
var/turf/E = get_edge_target_turf(src, d)
|
||||
var/range = 10
|
||||
for(var/turf/open/J in getline(src,E))
|
||||
if(!range)
|
||||
break
|
||||
range--
|
||||
|
||||
PoolOrNew(/obj/effect/hotspot,J)
|
||||
J.hotspot_expose(700,50,1)
|
||||
for(var/mob/living/L in J)
|
||||
if(L != src)
|
||||
L.adjustFireLoss(20)
|
||||
L << "<span class='danger'>You're hit by the drake's fire breath!</span>"
|
||||
sleep(1)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0)
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0, atom/movable/manual_target)
|
||||
if(stat)
|
||||
return
|
||||
var/mob/living/swoop_target = target
|
||||
var/swoop_target
|
||||
if(manual_target)
|
||||
swoop_target = manual_target
|
||||
else
|
||||
swoop_target = target
|
||||
stop_automated_movement = TRUE
|
||||
swooping = 1
|
||||
icon_state = "swoop"
|
||||
@@ -150,9 +173,10 @@
|
||||
else
|
||||
tturf = get_turf(src)
|
||||
src.loc = tturf
|
||||
new/obj/effect/overlay/temp/dragon_swoop(tturf)
|
||||
animate(src, pixel_x = 0, pixel_z = 0, time = 10)
|
||||
sleep(10)
|
||||
playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1)
|
||||
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
|
||||
for(var/mob/living/L in range(1,tturf))
|
||||
if(L == src)
|
||||
continue
|
||||
@@ -170,6 +194,19 @@
|
||||
stop_automated_movement = FALSE
|
||||
swooping = 0
|
||||
density = 1
|
||||
swoop_cooldown = world.time + 200
|
||||
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/AltClickOn(atom/movable/A)
|
||||
if(!istype(A))
|
||||
return
|
||||
if(swoop_cooldown >= world.time)
|
||||
src << "You need to wait 20 seconds between swoop attacks!"
|
||||
return
|
||||
swoop_attack(1, A)
|
||||
|
||||
|
||||
/obj/item/device/gps/internal/dragon
|
||||
icon_state = null
|
||||
@@ -228,8 +265,8 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/lesser
|
||||
name = "lesser ash drake"
|
||||
maxHealth = 500
|
||||
health = 500
|
||||
maxHealth = 750
|
||||
health = 750
|
||||
melee_damage_upper = 30
|
||||
melee_damage_lower = 30
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
|
||||
@@ -248,21 +285,15 @@
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/random = rand(1,5)
|
||||
var/random = rand(1,3)
|
||||
|
||||
switch(random)
|
||||
if(1)
|
||||
user << "<span class='danger'>The blood sears your insides! What the hell were you thinking?</span>"
|
||||
user.reagents.add_reagent("hellwater", 50)
|
||||
if(2)
|
||||
user << "<span class='danger'>Other than tasting terrible, nothing really happens.</span>"
|
||||
if(3)
|
||||
if(2)
|
||||
user << "<span class='danger'>Your flesh begins to melt! Miraculously, you seem fine otherwise.</span>"
|
||||
H.set_species(/datum/species/skeleton)
|
||||
if(4)
|
||||
user << "<span class='danger'>The blood mixes with your own, filling your veins with a pulsing fire.</span>"
|
||||
H.dna.species.coldmod = 0
|
||||
if(5)
|
||||
if(3)
|
||||
user << "<span class='danger'>You don't feel so good...</span>"
|
||||
H.ForceContractDisease(new /datum/disease/transformation/dragon(0))
|
||||
playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||
@@ -318,15 +349,11 @@
|
||||
|
||||
/obj/structure/closet/crate/necropolis/dragon/New()
|
||||
..()
|
||||
var/loot = rand(1,4)
|
||||
var/loot = rand(1,3)
|
||||
switch(loot)
|
||||
if(1)
|
||||
for(var/i in 1 to 10)
|
||||
new /obj/item/weapon/ore/diamond(src)
|
||||
new /obj/item/weapon/ore/gold(src)
|
||||
if(2)
|
||||
new /obj/item/weapon/melee/ghost_sword(src)
|
||||
if(3)
|
||||
if(2)
|
||||
new /obj/item/weapon/dragons_blood(src)
|
||||
if(4)
|
||||
if(3)
|
||||
new /obj/item/weapon/lava_staff(src)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "Attack the weak point for massive damage."
|
||||
health = 1000
|
||||
maxHealth = 1000
|
||||
a_intent = "harm"
|
||||
sentience_type = SENTIENCE_BOSS
|
||||
environment_smash = 4
|
||||
robust_searching = 1
|
||||
|
||||
@@ -26,16 +26,28 @@
|
||||
faction = list("cult")
|
||||
status_flags = CANPUSH
|
||||
flying = 1
|
||||
loot = list(/obj/item/weapon/ectoplasm)
|
||||
del_on_death = 1
|
||||
|
||||
|
||||
/mob/living/simple_animal/shade/death()
|
||||
..(1)
|
||||
new /obj/item/weapon/ectoplasm (src.loc)
|
||||
visible_message("<span class='warning'>[src] lets out a contented sigh as their form unwinds.</span>")
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
deathmessage = "<span class='warning'>[src] lets out a contented sigh as their form unwinds.</span>"
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0)
|
||||
return TRUE //this doesn't make much sense; you'd thing TRUE would mean it'd process spacemove but it means it doesn't
|
||||
|
||||
/mob/living/simple_animal/shade/attack_animal(mob/living/simple_animal/M)
|
||||
if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
|
||||
if(health < maxHealth)
|
||||
adjustHealth(-25)
|
||||
Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4)
|
||||
M.visible_message("<span class='danger'>[M] heals \the <b>[src]</b>.</span>", \
|
||||
"<span class='cult'>You heal <b>[src]</b>, leaving <b>[src]</b> at <b>[health]/[maxHealth]</b> health.</span>")
|
||||
else
|
||||
M << "<span class='cult'>You cannot heal <b>[src]</b>, as it is unharmed!</span>"
|
||||
else if(src != M)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/shade/attackby(obj/item/O, mob/user, params) //Marker -Agouri
|
||||
if(istype(O, /obj/item/device/soulstone))
|
||||
@@ -43,4 +55,3 @@
|
||||
SS.transfer_soul("SHADE", src, user)
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
qdel(src)
|
||||
return -1
|
||||
target = nOwner.mind
|
||||
update_text(nOwner)
|
||||
update_text()
|
||||
|
||||
|
||||
/obj/item/weapon/paper/contract/employment/update_text()
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
var/copy_as_paper = 1
|
||||
if(istype(copy, /obj/item/weapon/paper/contract/employment))
|
||||
var/obj/item/weapon/paper/contract/employment/E = copy
|
||||
var/obj/item/weapon/paper/contract/employment/C = new /obj/item/weapon/paper/contract/employment (loc, E.target)
|
||||
var/obj/item/weapon/paper/contract/employment/C = new /obj/item/weapon/paper/contract/employment (loc, E.target.current)
|
||||
if(C)
|
||||
copy_as_paper = 0
|
||||
if(copy_as_paper)
|
||||
|
||||
@@ -72,25 +72,35 @@
|
||||
|
||||
// Syndicate stamp to forge documents.
|
||||
|
||||
/obj/item/weapon/stamp/chameleon
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
|
||||
/obj/item/weapon/stamp/chameleon/attack_self(mob/user)
|
||||
|
||||
var/list/stamp_types = typesof(/obj/item/weapon/stamp) - src.type // Get all stamp types except our own
|
||||
var/list/stamps = list()
|
||||
|
||||
var/list/stamp_names = list()
|
||||
// Generate them into a list
|
||||
for(var/stamp_type in stamp_types)
|
||||
var/obj/item/weapon/stamp/S = new stamp_type
|
||||
stamps[capitalize(S.name)] = S
|
||||
for(var/i in stamp_types)
|
||||
var/obj/item/weapon/stamp/stamp_type = i
|
||||
stamp_names += initial(stamp_type.name)
|
||||
|
||||
var/list/show_stamps = list("EXIT" = null) + sortList(stamps) // the list that will be shown to the user to pick from
|
||||
stamp_names = sortList(stamp_names)
|
||||
// the list that will be shown to the user to pick from
|
||||
world << jointext(stamp_names, ",")
|
||||
|
||||
var/input_stamp = input(user, "Choose a stamp to disguise as.", "Choose a stamp.") in show_stamps
|
||||
var/input_stamp = input(user, "Choose a stamp to disguise as.",
|
||||
"Choose a stamp.") as null|anything in stamp_names
|
||||
world << input_stamp
|
||||
|
||||
if(user && src in user.contents)
|
||||
if(user && (src in user.contents) && input_stamp)
|
||||
var/obj/item/weapon/stamp/stamp_type
|
||||
for(var/i in stamp_types)
|
||||
stamp_type = i
|
||||
if(initial(stamp_type.name) == input_stamp)
|
||||
break
|
||||
world << stamp_type
|
||||
|
||||
var/obj/item/weapon/stamp/chosen_stamp = stamps[capitalize(input_stamp)]
|
||||
|
||||
if(chosen_stamp)
|
||||
name = chosen_stamp.name
|
||||
icon_state = chosen_stamp.icon_state
|
||||
item_color = chosen_stamp.item_color
|
||||
name = initial(stamp_type.name)
|
||||
icon_state = initial(stamp_type.icon_state)
|
||||
item_color = initial(stamp_type.item_color)
|
||||
|
||||
@@ -289,24 +289,41 @@
|
||||
if (modified)
|
||||
icon_state = "foamdart_empty"
|
||||
desc = "Its nerf or nothing! ... Although, this one doesn't look too safe."
|
||||
if(BB)
|
||||
BB.icon_state = "foamdart_empty"
|
||||
else
|
||||
icon_state = "foamdart"
|
||||
desc = "Its nerf or nothing! Ages 8 and up."
|
||||
if(BB)
|
||||
BB.icon_state = "foamdart_empty"
|
||||
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
|
||||
if (istype(A, /obj/item/weapon/screwdriver) && !modified)
|
||||
modified = 1
|
||||
BB.damage_type = BRUTE
|
||||
icon_state = "foamdart_empty"
|
||||
desc = "Its nerf or nothing! ... Although, this one doesn't look too safe."
|
||||
user << "<span class='notice'>You pop the safety cap off of [src].</span>"
|
||||
else if ((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len)
|
||||
FD.damage_type = BRUTE
|
||||
update_icon()
|
||||
else if ((istype(A, /obj/item/weapon/pen)) && modified && !FD.pen)
|
||||
if(!user.unEquip(A))
|
||||
return
|
||||
A.loc = BB
|
||||
BB.damage = 5
|
||||
BB.nodamage = 0
|
||||
A.loc = FD
|
||||
FD.pen = A
|
||||
FD.damage = 5
|
||||
FD.nodamage = 0
|
||||
user << "<span class='notice'>You insert [A] into [src].</span>"
|
||||
return
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/attack_self(mob/living/user)
|
||||
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
|
||||
if(FD.pen)
|
||||
FD.damage = initial(FD.damage)
|
||||
FD.nodamage = initial(FD.nodamage)
|
||||
user.put_in_hands(FD.pen)
|
||||
user << "<span class='notice'>You remove [FD.pen] from [src].</span>"
|
||||
FD.pen = null
|
||||
|
||||
/obj/item/ammo_casing/caseless/foam_dart/riot
|
||||
name = "riot foam dart"
|
||||
desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
var/turf/curloc = user.loc
|
||||
if (!istype(targloc) || !istype(curloc) || !BB)
|
||||
return 0
|
||||
BB.ammo_casing = src
|
||||
if(targloc == curloc)
|
||||
if(target) //if the target is right on our location we go straight to bullet_act()
|
||||
target.bullet_act(BB, BB.def_zone)
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
#define SAWN_INTACT 0
|
||||
#define SAWN_OFF 1
|
||||
#define SAWN_SAWING -1
|
||||
|
||||
#define WEAPON_LIGHT 0
|
||||
#define WEAPON_MEDIUM 1
|
||||
#define WEAPON_HEAVY 2
|
||||
|
||||
/obj/item/weapon/gun
|
||||
name = "gun"
|
||||
desc = "It's a gun. It's pretty terrible, though."
|
||||
|
||||
@@ -87,6 +87,9 @@
|
||||
|
||||
/obj/item/weapon/gun/magic/wand/resurrection/zap_self(mob/living/user)
|
||||
user.revive(full_heal = 1)
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.regenerate_limbs()
|
||||
user << "<span class='notice'>You feel great!</span>"
|
||||
charges--
|
||||
..()
|
||||
@@ -162,4 +165,4 @@
|
||||
/obj/item/weapon/gun/magic/wand/fireball/zap_self(mob/living/user)
|
||||
explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
|
||||
charges--
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -103,6 +103,8 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/medbeam/proc/on_beam_tick(var/mob/living/target)
|
||||
if(target.health != target.maxHealth)
|
||||
PoolOrNew(/obj/effect/overlay/temp/heal, list(get_turf(target), "#80F5FF"))
|
||||
target.adjustBruteLoss(-4)
|
||||
target.adjustFireLoss(-4)
|
||||
return
|
||||
|
||||
@@ -211,8 +211,7 @@
|
||||
suit_requirement = /obj/item/clothing/suit/bluetag
|
||||
tagcolor = "blue"
|
||||
|
||||
|
||||
/obj/item/device/firing_pin/Destroy()
|
||||
if(gun)
|
||||
gun.pin = null
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
pressure_resistance = INFINITY
|
||||
var/def_zone = "" //Aiming at
|
||||
var/mob/firer = null//Who shot it
|
||||
var/obj/item/ammo_casing/ammo_casing = null
|
||||
var/suppressed = 0 //Attack message
|
||||
var/yo = null
|
||||
var/xo = null
|
||||
@@ -139,3 +140,8 @@
|
||||
..()
|
||||
if(isliving(AM) && AM.density && !checkpass(PASSMOB))
|
||||
Bump(AM, 1)
|
||||
|
||||
/obj/item/projectile/Destroy()
|
||||
if(ammo_casing)
|
||||
qdel(ammo_casing)
|
||||
return ..()
|
||||
|
||||
@@ -57,6 +57,9 @@
|
||||
if(target.hellbound)
|
||||
return
|
||||
if(ismob(target))
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
C.regenerate_limbs()
|
||||
if(target.revive(full_heal = 1))
|
||||
if(!target.ckey)
|
||||
for(var/mob/dead/observer/ghost in player_list)
|
||||
|
||||
@@ -1,26 +1,22 @@
|
||||
/obj/item/projectile/bullet/reusable
|
||||
name = "reusable bullet"
|
||||
desc = "How do you even reuse a bullet?"
|
||||
var/obj/item/ammo_casing/caseless/ammo_type = /obj/item/ammo_casing/caseless/
|
||||
var/ammo_type = /obj/item/ammo_casing/caseless/
|
||||
var/dropped = 0
|
||||
|
||||
/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = 0)
|
||||
. = ..()
|
||||
if (src.contents.len)
|
||||
var/obj/content
|
||||
for(content in src.contents)
|
||||
content.loc = src.loc
|
||||
else
|
||||
new ammo_type(src.loc)
|
||||
handle_drop()
|
||||
|
||||
/obj/item/projectile/bullet/reusable/on_range()
|
||||
if (src.contents.len)
|
||||
var/obj/content
|
||||
for(content in src.contents)
|
||||
content.loc = src.loc
|
||||
else
|
||||
new ammo_type(src.loc)
|
||||
handle_drop()
|
||||
..()
|
||||
|
||||
/obj/item/projectile/bullet/reusable/proc/handle_drop()
|
||||
if(!dropped)
|
||||
new ammo_type(src.loc)
|
||||
dropped = 1
|
||||
|
||||
/obj/item/projectile/bullet/reusable/magspear
|
||||
name = "magnetic spear"
|
||||
desc = "WHITE WHALE, HOLY GRAIL"
|
||||
@@ -38,9 +34,32 @@
|
||||
icon_state = "foamdart"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/foam_dart
|
||||
range = 10
|
||||
var/obj/item/weapon/pen/pen = null
|
||||
|
||||
/obj/item/projectile/bullet/reusable/foam_dart/handle_drop()
|
||||
if(dropped)
|
||||
return
|
||||
dropped = 1
|
||||
var/obj/item/ammo_casing/caseless/foam_dart/newdart = new ammo_type(src.loc)
|
||||
var/obj/item/ammo_casing/caseless/foam_dart/old_dart = ammo_casing
|
||||
newdart.modified = old_dart.modified
|
||||
if(pen)
|
||||
var/obj/item/projectile/bullet/reusable/foam_dart/newdart_FD = newdart.BB
|
||||
newdart_FD.pen = pen
|
||||
pen.loc = newdart_FD
|
||||
pen = null
|
||||
newdart.BB.damage = damage
|
||||
newdart.BB.nodamage = nodamage
|
||||
newdart.BB.damage_type = damage_type
|
||||
newdart.update_icon()
|
||||
|
||||
/obj/item/projectile/bullet/reusable/foam_dart/Destroy()
|
||||
if(pen)
|
||||
qdel(pen)
|
||||
return ..()
|
||||
|
||||
/obj/item/projectile/bullet/reusable/foam_dart/riot
|
||||
name = "riot foam dart"
|
||||
icon_state = "foamdart_riot"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
|
||||
stamina = 25
|
||||
stamina = 25
|
||||
|
||||
@@ -120,3 +120,11 @@
|
||||
volume = 60
|
||||
amount_per_transfer_from_this = 30
|
||||
list_reagents = list("atropine" = 10, "epinephrine" = 10, "salbutamol" = 20, "spaceacillin" = 20)
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/medipen/survival
|
||||
name = "survival medipen"
|
||||
desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. "
|
||||
icon_state = "stimpen"
|
||||
volume = 80
|
||||
amount_per_transfer_from_this = 80
|
||||
list_reagents = list("salbutamol" = 10, "coffee" = 20, "leporazine" = 20, "tricordrazine" = 15, "epinephrine" = 10, "omnizine" = 5)
|
||||
|
||||
@@ -177,6 +177,16 @@ other types of metals and chemistry for reagents).
|
||||
build_path = /obj/item/weapon/pickaxe/drill/jackhammer
|
||||
category = list("Mining Designs")
|
||||
|
||||
/datum/design/modkit
|
||||
name = "Modification Kit"
|
||||
desc = "A device which allows kinetic accelerators to be wielded with one hand, and by any organism."
|
||||
id = "modkit"
|
||||
req_tech = list("materials" = 5, "powerstorage" = 4, "engineering" = 4, "magnets" = 4, "combat" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_GOLD = 1500, MAT_URANIUM = 1000)
|
||||
build_path = /obj/item/modkit
|
||||
category = list("Mining Designs")
|
||||
|
||||
/datum/design/superaccelerator
|
||||
name = "Super-Kinetic Accelerator"
|
||||
desc = "An upgraded version of the proto-kinetic accelerator, with superior damage, speed and range."
|
||||
|
||||
@@ -111,6 +111,8 @@
|
||||
S.loc = remote_eye.loc
|
||||
S.visible_message("[S] warps in!")
|
||||
X.stored_slimes -= S
|
||||
else
|
||||
owner << "<span class='notice'>Target is not near a camera. Cannot proceed.</span>"
|
||||
|
||||
/datum/action/innate/slime_pick_up
|
||||
name = "Pick up Slime"
|
||||
@@ -133,6 +135,8 @@
|
||||
S.visible_message("[S] vanishes in a flash of light!")
|
||||
S.loc = X
|
||||
X.stored_slimes += S
|
||||
else
|
||||
owner << "<span class='notice'>Target is not near a camera. Cannot proceed.</span>"
|
||||
|
||||
|
||||
/datum/action/innate/feed_slime
|
||||
@@ -152,6 +156,8 @@
|
||||
food.LAssailant = C
|
||||
X.monkeys --
|
||||
owner << "[X] now has [X.monkeys] monkeys left."
|
||||
else
|
||||
owner << "<span class='notice'>Target is not near a camera. Cannot proceed.</span>"
|
||||
|
||||
|
||||
/datum/action/innate/monkey_recycle
|
||||
@@ -171,3 +177,5 @@
|
||||
M.visible_message("[M] vanishes as they are reclaimed for recycling!")
|
||||
X.monkeys = round(X.monkeys + 0.2,0.1)
|
||||
qdel(M)
|
||||
else
|
||||
owner << "<span class='notice'>Target is not near a camera. Cannot proceed.</span>"
|
||||
|
||||
@@ -17,16 +17,17 @@
|
||||
|
||||
|
||||
|
||||
|
||||
//Areas
|
||||
|
||||
/area/ruin/unpowered/no_grav/way_home
|
||||
name = "\improper Salvation"
|
||||
icon_state = "away"
|
||||
|
||||
|
||||
|
||||
/area/ruin/powered/snow_biodome
|
||||
|
||||
/area/ruin/powered/golem_ship
|
||||
name = "Free Golem Ship"
|
||||
|
||||
// Ruins of "onehalf" ship
|
||||
/area/ruin/onehalf/hallway
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user