Merge branch 'master' into voiced-skeletons

This commit is contained in:
Jack Edge
2016-05-13 18:37:23 +01:00
124 changed files with 2392 additions and 1918 deletions
@@ -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
+1 -2
View File
@@ -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
+1 -1
View File
@@ -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
-63
View File
@@ -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
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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)
+4 -4
View File
@@ -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)
+10
View File
@@ -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
+11 -1
View File
@@ -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))
+8 -1
View File
@@ -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
+57 -31
View File
@@ -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>"
+2 -1
View File
@@ -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>"
+48 -30
View File
@@ -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.
+2
View File
@@ -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]"
+3 -1
View File
@@ -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())
+17 -1
View File
@@ -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
+45 -28
View File
@@ -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'"
+1
View File
@@ -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
+202 -267
View File
@@ -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()
+3 -1
View File
@@ -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"
+10 -1
View File
@@ -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)
+17 -16
View File
@@ -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
+231 -11
View File
@@ -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)
+4 -4
View File
@@ -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
-217
View File
@@ -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
+2 -7
View File
@@ -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)
+4 -1
View File
@@ -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)
+6 -3
View File
@@ -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
+5 -2
View File
@@ -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))
+2
View File
@@ -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
-2
View File
@@ -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
+11 -1
View File
@@ -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
-1
View File
@@ -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
+1 -10
View File
@@ -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!
+17 -19
View File
@@ -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()
+19 -14
View File
@@ -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."
-1
View File
@@ -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"
+1 -1
View File
@@ -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>"
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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
+48 -41
View File
@@ -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
+56 -2
View File
@@ -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
+6 -5
View File
@@ -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
+18 -7
View File
@@ -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
+1 -1
View File
@@ -23,7 +23,7 @@
qdel(src)
return -1
target = nOwner.mind
update_text(nOwner)
update_text()
/obj/item/weapon/paper/contract/employment/update_text()
+1 -1
View File
@@ -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)
+23 -13
View File
@@ -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."
+1
View File
@@ -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)
-8
View File
@@ -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."
+4 -1
View File
@@ -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--
..()
..()
+2
View File
@@ -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
+1 -2
View File
@@ -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 ..()
+6
View File
@@ -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)
+33 -14
View File
@@ -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)
+10
View File
@@ -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>"
+3 -2
View File
@@ -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