mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-15 00:53:23 +01:00
Merge remote-tracking branch 'remotes/upstream/master' into events
# Conflicts: # code/modules/events/immovable_rod.dm
This commit is contained in:
@@ -16,6 +16,7 @@ data/
|
||||
/_maps/map_files/**/*.dmm.backup
|
||||
/_maps/quicksave/*
|
||||
/nano/debug.html
|
||||
**/__pycache__/*
|
||||
*.db
|
||||
stddef.dm
|
||||
.atom-build.json
|
||||
|
||||
@@ -274,6 +274,7 @@ CREATE TABLE `player` (
|
||||
`nanoui_fancy` smallint(4) DEFAULT '1',
|
||||
`show_ghostitem_attack` smallint(4) DEFAULT '1',
|
||||
`lastchangelog` varchar(32) NOT NULL DEFAULT '0',
|
||||
`windowflashing` smallint(4) DEFAULT '1',
|
||||
`exp` mediumtext,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `ckey` (`ckey`)
|
||||
|
||||
@@ -273,6 +273,7 @@ CREATE TABLE `SS13_player` (
|
||||
`nanoui_fancy` smallint(4) DEFAULT '1',
|
||||
`show_ghostitem_attack` smallint(4) DEFAULT '1',
|
||||
`lastchangelog` varchar(32) NOT NULL DEFAULT '0',
|
||||
`windowflashing` smallint(4) DEFAULT '1',
|
||||
`exp` mediumtext,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `ckey` (`ckey`)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
"aaa" = (/turf/space,/area/space)
|
||||
"aab" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_n"; name = "north of station"; width = 18},/turf/space,/area/space)
|
||||
"aac" = (/turf/space,/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
|
||||
"aac" = (/turf/space,/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
|
||||
"aad" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate)
|
||||
"aae" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
|
||||
"aaf" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_mid"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
|
||||
"aag" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
|
||||
"aah" = (/turf/space,/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
|
||||
"aah" = (/turf/space,/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
|
||||
"aai" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
|
||||
"aaj" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
|
||||
"aak" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
|
||||
@@ -29,7 +29,7 @@
|
||||
"aaC" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
|
||||
"aaD" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/space)
|
||||
"aaE" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
|
||||
"aaF" = (/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
|
||||
"aaF" = (/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
|
||||
"aaG" = (/obj/structure/closet/syndicate/suits,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
|
||||
"aaH" = (/obj/effect/landmark{name = "Syndicate-Uplink"; tag = ""},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
|
||||
"aaI" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
|
||||
|
||||
@@ -372,10 +372,10 @@
|
||||
"hh" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
|
||||
"hi" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
|
||||
"hj" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/assault_pod)
|
||||
"hk" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"hk" = (/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"hl" = (/obj/machinery/door/airlock/centcom{aiControlDisabled = 1; name = "Assault Pod"; opacity = 1; req_one_access_txt = "150"},/turf/simulated/floor/plating,/area/shuttle/assault_pod)
|
||||
"hm" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
|
||||
"hn" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"hn" = (/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"ho" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
|
||||
"hp" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
|
||||
"hq" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
|
||||
@@ -396,7 +396,7 @@
|
||||
"hF" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/assault_pod)
|
||||
"hG" = (/obj/machinery/computer/shuttle/syndicate/drop_pod,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/assault_pod)
|
||||
"hH" = (/obj/structure/stool/bed/chair,/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/assault_pod)
|
||||
"hI" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod)
|
||||
"hI" = (/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod)
|
||||
"hJ" = (/obj/machinery/vending/clothing,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
|
||||
"hK" = (/turf/unsimulated/floor/grass,/area/centcom/control)
|
||||
"hL" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control)
|
||||
@@ -407,7 +407,7 @@
|
||||
"hQ" = (/obj/structure/rack,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
|
||||
"hR" = (/obj/structure/rack,/obj/item/weapon/storage/fancy/crayons,/obj/item/toy/sword,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
|
||||
"hS" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/centcom/evac)
|
||||
"hT" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"hT" = (/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"hU" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
|
||||
"hV" = (/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
|
||||
"hW" = (/obj/machinery/door/airlock/centcom{aiControlDisabled = 1; name = "Assault Pod"; opacity = 1; req_one_access_txt = "150"},/obj/docking_port/mobile/assault_pod,/turf/simulated/floor/plating,/area/shuttle/assault_pod)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
"at" = (/obj/structure/table/woodentable,/obj/item/weapon/newton,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"au" = (/obj/structure/grille,/obj/structure/window/full/basic,/turf/simulated/floor/plating,/area/awaymission/challenge/main)
|
||||
"av" = (/mob/living/simple_animal/hostile/winter/reindeer,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
|
||||
"aw" = (/obj/machinery/gun_turret/grenade{desc = "Winterized 40mm grenade launcher defense turret. If you've had this much time to look at it, you're probably already dead."; faction = "winter"; name = "winterized mounted grenade launcher (40mm)"},/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
|
||||
"aw" = (/obj/machinery/porta_turret/syndicate/grenade{desc = "Winterized 40mm grenade launcher defense turret. If you've had this much time to look at it, you're probably already dead."; faction = "winter"; name = "winterized mounted grenade launcher (40mm)"},/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
|
||||
"ax" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"ay" = (/obj/structure/table/woodentable,/obj/structure/safe/floor,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/automatic/mini_uzi,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"az" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
@@ -30,7 +30,7 @@
|
||||
"aD" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"aE" = (/obj/machinery/floodlight,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"aF" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"aG" = (/obj/machinery/gun_turret/exterior{desc = "Winterized exterior defense turret chambered for 7.62 rounds. Designed to down intruders with heavy calliber bullets."; faction = "winter"; name = "winterized machine gun turret (7.62)"},/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
|
||||
"aG" = (/obj/machinery/porta_turret/syndicate/exterior{desc = "Winterized exterior defense turret chambered for 7.62 rounds. Designed to down intruders with heavy calliber bullets."; faction = "winter"; name = "winterized machine gun turret (7.62)"},/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
|
||||
"aH" = (/mob/living/simple_animal/hostile/winter/snowman,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
|
||||
"aI" = (/obj/structure/flora/bush,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
|
||||
"aJ" = (/obj/item/weapon/pickaxe/gold,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
|
||||
@@ -73,7 +73,7 @@
|
||||
"bu" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"bv" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"bw" = (/obj/machinery/autolathe,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"bx" = (/obj/machinery/gun_turret/interior{density = 0; desc = "Winterized interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; faction = "winter"; name = "wall mounted machine gun turret (.45)"; pixel_y = 27},/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"bx" = (/obj/machinery/porta_turret/syndicate/interior{density = 0; desc = "Winterized interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; faction = "winter"; name = "wall mounted machine gun turret (.45)"; pixel_y = 27},/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"by" = (/obj/structure/table,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
|
||||
"bz" = (/obj/item/clothing/head/cone,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
|
||||
"bA" = (/mob/living/simple_animal/walrus,/turf/simulated/floor/snow{carbon_dioxide = 21.8366; nitrogen = 0; oxygen = 82.1472; temperature = 73},/area/awaymission/challenge/main)
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
"cu" = (/obj/item/weapon/moneybag,/turf/simulated/floor/carpet,/area/awaymission/wwgov)
|
||||
"cv" = (/obj/structure/stool/bed/chair/wood/wings,/turf/simulated/floor/wood,/area/awaymission/wwgov)
|
||||
"cw" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"cx" = (/obj/effect/mine/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"cx" = (/obj/effect/mine/gas/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"cy" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/wood,/area/awaymission/wwgov)
|
||||
"cz" = (/obj/item/clothing/gloves/color/yellow,/obj/item/device/multitool,/turf/simulated/floor/wood,/area/awaymission/wwgov)
|
||||
"cA" = (/obj/structure/stool/bed/chair/wood/normal{dir = 4},/turf/simulated/floor/wood,/area/awaymission/wwgov)
|
||||
@@ -166,7 +166,7 @@
|
||||
"dj" = (/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,/turf/simulated/floor/plasteel{tag = "icon-stage_bleft"; icon_state = "stage_bleft"},/area/awaymission/wwgov)
|
||||
"dk" = (/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"dl" = (/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"dm" = (/obj/effect/mine/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"dm" = (/obj/effect/mine/gas/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"dn" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"do" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand4"; icon_state = "ironsand4"},/area/awaymission/wwgov)
|
||||
"dp" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
@@ -207,7 +207,7 @@
|
||||
"dY" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwgov)
|
||||
"dZ" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/space,/area/space)
|
||||
"ea" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"eb" = (/obj/effect/mine/plasma,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"eb" = (/obj/effect/mine/gas/plasma,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"ec" = (/obj/effect/decal/cleanable/blood,/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/wwmines)
|
||||
"ed" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/item/ammo_box/a357,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"ee" = (/obj/structure/stool/bed/chair/comfy/brown{tag = "icon-comfychair_brown (EAST)"; icon_state = "comfychair_brown"; dir = 4},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
|
||||
@@ -238,7 +238,7 @@
|
||||
"eE" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
|
||||
"eF" = (/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
|
||||
"eG" = (/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
|
||||
"eH" = (/obj/effect/mine/plasma,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"eH" = (/obj/effect/mine/gas/plasma,/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"eI" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_beige"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
|
||||
"eJ" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
|
||||
"eK" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibup1"; icon_state = "gibup1"},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
|
||||
@@ -267,7 +267,7 @@
|
||||
"fh" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area/space)
|
||||
"fi" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/space,/area/space)
|
||||
"fj" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
|
||||
"fk" = (/obj/effect/mine/plasma,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"fk" = (/obj/effect/mine/gas/plasma,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"fl" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibdown1"; icon_state = "gibdown1"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
|
||||
"fm" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
"fn" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/wood,/area/awaymission/wwmines)
|
||||
|
||||
@@ -83,12 +83,12 @@
|
||||
"abE" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
|
||||
"abF" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/two_tile_ver{id_tag = "whiteshippoddoor"; layer = 3.1},/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
|
||||
"abG" = (/obj/machinery/door_control{id = "whiteshippoddoor"; name = "Pod Door Control"; pixel_y = -24},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
|
||||
"abH" = (/turf/space,/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
|
||||
"abH" = (/turf/space,/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
|
||||
"abI" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate)
|
||||
"abJ" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
|
||||
"abK" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_mid"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
|
||||
"abL" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
|
||||
"abM" = (/turf/space,/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
|
||||
"abM" = (/turf/space,/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
|
||||
"abN" = (/turf/simulated/wall/r_wall,/area/security/permabrig)
|
||||
"abO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/permabrig)
|
||||
"abP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/wall/r_wall,/area/security/permabrig)
|
||||
@@ -148,7 +148,7 @@
|
||||
"acR" = (/obj/machinery/door/airlock{name = "Toilet"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
|
||||
"acS" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
|
||||
"acT" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
|
||||
"acU" = (/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
|
||||
"acU" = (/obj/machinery/porta_turret/syndicate,/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
|
||||
"acV" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/security/permabrig)
|
||||
"acW" = (/turf/simulated/wall,/area/security/permabrig)
|
||||
"acX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass{name = "Prison Garden"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
|
||||
@@ -8780,7 +8780,7 @@
|
||||
"dmR" = (/obj/machinery/camera{c_tag = "Mini Satellite Access"; dir = 4; network = list("SS13","MiniSat")},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/engine/engineering)
|
||||
"dmS" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/engine/engineering)
|
||||
"dmT" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/transit_tube{dir = 4; icon_state = "Block"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/engineering)
|
||||
"dmU" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/transit_tube/station,/obj/structure/transit_tube_pod{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering)
|
||||
"dmU" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/transit_tube/station,/obj/structure/transit_tube_pod{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-siding8 (NORTH)"; icon_state = "siding8"; dir = 1},/area/engine/engineering)
|
||||
"dmV" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube,/turf/simulated/floor/plating,/area/engine/engineering)
|
||||
"dmW" = (/obj/structure/transit_tube,/turf/space,/area/space)
|
||||
"dmX" = (/obj/structure/transit_tube{icon_state = "E-W-Pass"},/obj/structure/lattice,/turf/space,/area/space)
|
||||
|
||||
@@ -436,7 +436,7 @@
|
||||
"it" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_mothership)
|
||||
"iu" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
|
||||
"iv" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/assault_pod)
|
||||
"iw" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"iw" = (/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"ix" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station)
|
||||
"iy" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/wizard_station)
|
||||
"iz" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station)
|
||||
@@ -447,7 +447,7 @@
|
||||
"iE" = (/turf/space,/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/space)
|
||||
"iF" = (/obj/machinery/door/airlock/centcom{aiControlDisabled = 1; name = "Assault Pod"; opacity = 1; req_one_access_txt = "150"},/turf/simulated/floor/plating,/area/shuttle/assault_pod)
|
||||
"iG" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
|
||||
"iH" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"iH" = (/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"iI" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
|
||||
"iJ" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/assault_pod)
|
||||
"iK" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/assault_pod)
|
||||
@@ -484,8 +484,8 @@
|
||||
"jp" = (/turf/simulated/floor/plasteel,/area/tdome/arena_source)
|
||||
"jq" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/tdome/arena_source)
|
||||
"jr" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/energy/sword/saber/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
|
||||
"js" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod)
|
||||
"jt" = (/turf/space,/obj/machinery/gun_turret/assault_pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"js" = (/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall3"; icon_state = "diagonalWall3"; dir = 2},/area/shuttle/assault_pod)
|
||||
"jt" = (/turf/space,/obj/machinery/porta_turret/syndicate/pod,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/assault_pod)
|
||||
"ju" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
|
||||
"jv" = (/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plating/airless,/area/syndicate_mothership)
|
||||
"jw" = (/obj/machinery/door/airlock/centcom{aiControlDisabled = 1; name = "Assault Pod"; opacity = 1; req_one_access_txt = "150"},/obj/docking_port/mobile/assault_pod,/turf/simulated/floor/plating,/area/shuttle/assault_pod)
|
||||
|
||||
@@ -620,7 +620,7 @@
|
||||
"lW" = (/obj/machinery/power/apc/noalarm{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor/plasteel/airless,/area/derelict/teleporter)
|
||||
"lX" = (/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot)
|
||||
"lY" = (/turf/simulated/mineral,/area/syndicate_depot)
|
||||
"lZ" = (/obj/structure/lattice,/obj/machinery/gun_turret/exterior,/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot)
|
||||
"lZ" = (/obj/structure/lattice,/obj/machinery/porta_turret/syndicate/exterior,/turf/simulated/floor/plating/airless/asteroid,/area/syndicate_depot)
|
||||
"ma" = (/turf/simulated/mineral/random,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_depot)
|
||||
"mb" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_depot)
|
||||
"mc" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; icon_state = "window5"; name = "window"; opacity = 0},/area/syndicate_depot)
|
||||
@@ -633,16 +633,16 @@
|
||||
"mj" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mk" = (/obj/structure/closet/crate{name = "foot locker"},/obj/item/ammo_box/magazine/smgm45{pixel_x = 3},/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate{pixel_x = -3; pixel_y = -2},/obj/item/weapon/lighter/zippo/gonzofist,/obj/item/clothing/under/syndicate{pixel_x = 3; pixel_y = 3},/obj/item/clothing/suit/armor/vest/combat{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"ml" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (WEST)"},/area/syndicate_depot)
|
||||
"mm" = (/obj/machinery/gun_turret/interior,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mm" = (/obj/machinery/porta_turret/syndicate/interior,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mn" = (/obj/item/device/radio/intercom/syndicate{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mo" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mp" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/syndicate_depot)
|
||||
"mq" = (/turf/simulated/mineral,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_depot)
|
||||
"mr" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_depot)
|
||||
"ms" = (/obj/machinery/gun_turret/interior{density = 0; desc = "Syndicate interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; name = "wall mounted machine gun turret (.45)"; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"ms" = (/obj/machinery/porta_turret/syndicate/interior{density = 0; desc = "Syndicate interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; name = "wall mounted machine gun turret (.45)"; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mt" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/syndicake,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mu" = (/obj/machinery/gun_turret/grenade,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mv" = (/obj/machinery/gun_turret/interior{density = 0; desc = "Syndicate interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; name = "wall mounted machine gun turret (.45)"; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mu" = (/obj/machinery/porta_turret/syndicate/grenade,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mv" = (/obj/machinery/porta_turret/syndicate/interior{density = 0; desc = "Syndicate interior defense turret chambered for .45 rounds and mounted on a wall. Designed to down intruders without damaging the hull."; name = "wall mounted machine gun turret (.45)"; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"mw" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_depot)
|
||||
"mx" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/syndicate_depot)
|
||||
"my" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/engine,/area/syndicate_depot)
|
||||
|
||||
@@ -32,7 +32,8 @@
|
||||
#define slot_r_ear 20
|
||||
#define slot_wear_pda 21
|
||||
#define slot_tie 22
|
||||
#define slots_amt 22
|
||||
#define slot_collar 23
|
||||
#define slots_amt 23
|
||||
|
||||
//Cant seem to find a mob bitflags area other than the powers one
|
||||
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
|
||||
#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT)
|
||||
|
||||
|
||||
#define NOREACT 16384 //Reagents dont' react inside this container.
|
||||
//Reagent flags
|
||||
#define REAGENT_NOREACT 1
|
||||
|
||||
//Species flags.
|
||||
|
||||
|
||||
@@ -47,3 +47,8 @@
|
||||
#define ANTAG_HUD_CHANGELING 15
|
||||
#define ANTAG_HUD_VAMPIRE 16
|
||||
#define ANTAG_HUD_ABDUCTOR 17 //For Fox
|
||||
|
||||
// Notification action types
|
||||
#define NOTIFY_JUMP "jump"
|
||||
#define NOTIFY_ATTACK "attack"
|
||||
#define NOTIFY_FOLLOW "orbit"
|
||||
@@ -1,6 +1,27 @@
|
||||
// Atoms
|
||||
#define isatom(A) istype(A, /atom)
|
||||
#define ismovableatom(A) istype(A, /atom/movable)
|
||||
#define isclient(A) istype(A, /client)
|
||||
|
||||
// Mobs
|
||||
#define ismegafauna(A) istype(A, /mob/living/simple_animal/hostile/megafauna)
|
||||
|
||||
//Turfs
|
||||
#define issimulatedturf(A) istype(A, /turf/simulated)
|
||||
|
||||
#define isspaceturf(A) istype(A, /turf/space)
|
||||
|
||||
#define isfloorturf(A) istype(A, /turf/simulated/floor)
|
||||
|
||||
#define isunsimulatedturf(A) istype(A, /turf/unsimulated)
|
||||
|
||||
#define iswallturf(A) istype(A, /turf/simulated/wall)
|
||||
|
||||
#define isreinforcedwallturf(A) istype(A, /turf/simulated/wall/r_wall)
|
||||
|
||||
#define ismineralturf(A) istype(A, /turf/simulated/mineral)
|
||||
|
||||
// Misc
|
||||
#define isclient(A) istype(A, /client)
|
||||
#define isradio(A) istype(A, /obj/item/device/radio)
|
||||
#define ispill(A) istype(A, /obj/item/weapon/reagent_containers/food/pill)
|
||||
|
||||
|
||||
+15
-1
@@ -17,6 +17,8 @@
|
||||
#define CLICK_CD_TKSTRANGLE 10
|
||||
#define CLICK_CD_POINT 10
|
||||
#define CLICK_CD_RESIST 20
|
||||
#define CLICK_CD_CLICK_ABILITY 6
|
||||
#define CLICK_CD_RAPID 2
|
||||
|
||||
//Sizes of mobs, used by mob/living/var/mob_size
|
||||
#define MOB_SIZE_TINY 0
|
||||
@@ -285,7 +287,6 @@
|
||||
#define SOUND_MINIMUM_PRESSURE 10
|
||||
#define FALLOFF_SOUNDS 0.5
|
||||
|
||||
|
||||
// Bluespace shelter deploy checks
|
||||
#define SHELTER_DEPLOY_ALLOWED "allowed"
|
||||
#define SHELTER_DEPLOY_BAD_TURFS "bad turfs"
|
||||
@@ -299,3 +300,16 @@
|
||||
|
||||
// The cooldown on OOC messages such as OOC, LOOC, praying and adminhelps
|
||||
#define OOC_COOLDOWN 5
|
||||
|
||||
// Medal names
|
||||
#define BOSS_KILL_MEDAL "Killer"
|
||||
#define ALL_KILL_MEDAL "Exterminator" //Killing all of x type
|
||||
|
||||
// Score names
|
||||
#define LEGION_SCORE "Legion Killed"
|
||||
#define COLOSSUS_SCORE "Colossus Killed"
|
||||
#define BUBBLEGUM_SCORE "Bubblegum Killed"
|
||||
#define DRAKE_SCORE "Drakes Killed"
|
||||
#define BIRD_SCORE "Hierophants Killed"
|
||||
#define BOSS_SCORE "Bosses Killed"
|
||||
#define TENDRIL_CLEAR_SCORE "Tendrils Killed"
|
||||
@@ -4,8 +4,7 @@
|
||||
#define QDEL_HINT_LETMELIVE 1 //qdel should let the object live after calling destory.
|
||||
#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
|
||||
#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste.
|
||||
#define QDEL_HINT_PUTINPOOL 5 //qdel will put this object in the atom pool.
|
||||
#define QDEL_HINT_FINDREFERENCE 6 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm.
|
||||
#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm.
|
||||
//if TESTING is enabled, qdel will call this object's find_references() verb.
|
||||
|
||||
// A convenient wrapper around checking for qdeletion/non-existence
|
||||
|
||||
+14
-4
@@ -151,7 +151,7 @@
|
||||
// The old system would loop through lists for a total of 5000 per function call, in an empty server.
|
||||
// This new system will loop at around 1000 in an empty server.
|
||||
|
||||
/proc/get_mobs_in_view(var/R, var/atom/source)
|
||||
/proc/get_mobs_in_view(var/R, var/atom/source, var/include_clientless = FALSE)
|
||||
// Returns a list of mobs in range of R from source. Used in radio and say code.
|
||||
|
||||
var/turf/T = get_turf(source)
|
||||
@@ -165,7 +165,7 @@
|
||||
for(var/atom/A in range)
|
||||
if(ismob(A))
|
||||
var/mob/M = A
|
||||
if(M.client)
|
||||
if(M.client || include_clientless)
|
||||
hear += M
|
||||
//log_to_dd("Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])")
|
||||
else if(istype(A, /obj/item/device/radio))
|
||||
@@ -418,7 +418,7 @@
|
||||
/proc/SecondsToTicks(var/seconds)
|
||||
return seconds * 10
|
||||
|
||||
proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0, var/poll_time = 300, var/ignore_respawnability = 0, var/min_hours = 0)
|
||||
proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = 300, ignore_respawnability = 0, min_hours = 0, flashwindow = TRUE)
|
||||
var/roletext = be_special_type ? get_roletext(be_special_type) : null
|
||||
var/list/mob/dead/observer/candidates = list()
|
||||
var/time_passed = world.time
|
||||
@@ -444,7 +444,8 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0,
|
||||
continue
|
||||
spawn(0)
|
||||
G << 'sound/misc/notice2.ogg'//Alerting them to their consideration
|
||||
|
||||
if(flashwindow)
|
||||
window_flash(G.client)
|
||||
switch(alert(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Not This Round"))
|
||||
if("Yes")
|
||||
to_chat(G, "<span class='notice'>Choice registered: Yes.</span>")
|
||||
@@ -471,3 +472,12 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0,
|
||||
candidates.Remove(G)
|
||||
|
||||
return candidates
|
||||
|
||||
/proc/window_flash(client/C)
|
||||
if(ismob(C))
|
||||
var/mob/M = C
|
||||
if(M.client)
|
||||
C = M.client
|
||||
if(!C || !C.prefs.windowflashing)
|
||||
return
|
||||
winset(C, "mainwindow", "flash=5")
|
||||
@@ -72,6 +72,14 @@
|
||||
return 0
|
||||
return L[A.type]
|
||||
|
||||
//returns a new list with only atoms that are in typecache L
|
||||
/proc/typecache_filter_list(list/atoms, list/typecache)
|
||||
. = list()
|
||||
for (var/thing in atoms)
|
||||
var/atom/A = thing
|
||||
if(typecache[A.type])
|
||||
. += A
|
||||
|
||||
//Like typesof() or subtypesof(), but returns a typecache instead of a list
|
||||
/proc/typecacheof(path, ignore_root_path)
|
||||
if(ispath(path))
|
||||
|
||||
@@ -431,3 +431,17 @@ proc/checkhtml(var/t)
|
||||
text = copytext(text, 1, index) + repl_chars[char] + copytext(text, index+keylength)
|
||||
index = findtext(text, char)
|
||||
return text
|
||||
|
||||
//Checks if any of a given list of needles is in the haystack
|
||||
/proc/text_in_list(haystack, list/needle_list, start=1, end=0)
|
||||
for(var/needle in needle_list)
|
||||
if(findtext(haystack, needle, start, end))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
//Like above, but case sensitive
|
||||
/proc/text_in_list_case(haystack, list/needle_list, start=1, end=0)
|
||||
for(var/needle in needle_list)
|
||||
if(findtextEx(haystack, needle, start, end))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
+81
-12
@@ -1,4 +1,3 @@
|
||||
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
/*
|
||||
@@ -326,7 +325,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
var/mob/M = old_list[named]
|
||||
if(issilicon(M))
|
||||
AI_list |= M
|
||||
else if(isobserver(M) || M.stat == 2)
|
||||
else if(isobserver(M) || M.stat == DEAD)
|
||||
Dead_list |= M
|
||||
else if(M.key && M.client)
|
||||
keyclient_list |= M
|
||||
@@ -360,7 +359,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
namecounts[name] = 1
|
||||
if(M.real_name && M.real_name != M.name)
|
||||
name += " \[[M.real_name]\]"
|
||||
if(M.stat == 2)
|
||||
if(M.stat == DEAD)
|
||||
if(istype(M, /mob/dead/observer/))
|
||||
name += " \[ghost\]"
|
||||
else
|
||||
@@ -550,15 +549,21 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
|
||||
/proc/can_see(var/atom/source, var/atom/target, var/length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate.
|
||||
var/turf/current = get_turf(source)
|
||||
var/turf/target_turf = get_turf(target)
|
||||
var/steps = 0
|
||||
|
||||
while(current != target_turf)
|
||||
if(steps > length) return 0
|
||||
if(current.opacity) return 0
|
||||
for(var/atom/A in current)
|
||||
if(A.opacity) return 0
|
||||
current = get_step_towards(current, target_turf)
|
||||
steps++
|
||||
var/steps = 1
|
||||
|
||||
if(current != target_turf)
|
||||
current = get_step_towards(current, target_turf)
|
||||
while(current != target_turf)
|
||||
if(steps > length)
|
||||
return 0
|
||||
if(current.opacity)
|
||||
return 0
|
||||
for(var/thing in current)
|
||||
var/atom/A = thing
|
||||
if(A.opacity)
|
||||
return 0
|
||||
current = get_step_towards(current, target_turf)
|
||||
steps++
|
||||
|
||||
return 1
|
||||
|
||||
@@ -1812,6 +1817,70 @@ var/global/list/g_fancy_list_of_types = null
|
||||
//you might be thinking of adding more steps to this, or making it use a loop and a counter var
|
||||
// not worth it.
|
||||
|
||||
// This proc gets a list of all "points of interest" (poi's) that can be used by admins to track valuable mobs or atoms (such as the nuke disk).
|
||||
/proc/getpois(mobs_only=0,skip_mindless=0)
|
||||
var/list/mobs = sortmobs()
|
||||
var/list/names = list()
|
||||
var/list/pois = list()
|
||||
var/list/namecounts = list()
|
||||
|
||||
for(var/mob/M in mobs)
|
||||
if(skip_mindless && (!M.mind && !M.ckey))
|
||||
if(!isbot(M) && !istype(M, /mob/camera/))
|
||||
continue
|
||||
if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins
|
||||
continue
|
||||
var/name = M.name
|
||||
if(name in names)
|
||||
namecounts[name]++
|
||||
name = "[name] ([namecounts[name]])"
|
||||
else
|
||||
names.Add(name)
|
||||
namecounts[name] = 1
|
||||
if(M.real_name && M.real_name != M.name)
|
||||
name += " \[[M.real_name]\]"
|
||||
if(M.stat == DEAD)
|
||||
if(istype(M, /mob/dead/observer/))
|
||||
name += " \[ghost\]"
|
||||
else
|
||||
name += " \[dead\]"
|
||||
pois[name] = M
|
||||
|
||||
if(!mobs_only)
|
||||
for(var/atom/A in poi_list)
|
||||
if(!A || !A.loc)
|
||||
continue
|
||||
var/name = A.name
|
||||
if(names.Find(name))
|
||||
namecounts[name]++
|
||||
name = "[name] ([namecounts[name]])"
|
||||
else
|
||||
names.Add(name)
|
||||
namecounts[name] = 1
|
||||
pois[name] = A
|
||||
|
||||
return pois
|
||||
|
||||
/proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20)
|
||||
var/client/C
|
||||
if(istype(mob_or_client, /mob))
|
||||
var/mob/M = mob_or_client
|
||||
if(M.client)
|
||||
C = M.client
|
||||
else
|
||||
return
|
||||
else if(istype(mob_or_client, /client))
|
||||
C = mob_or_client
|
||||
|
||||
if(!istype(C))
|
||||
return
|
||||
|
||||
C.color = flash_color
|
||||
spawn(0)
|
||||
animate(C, color = initial(C.color), time = flash_time)
|
||||
|
||||
#define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255)))
|
||||
|
||||
/proc/make_bit_triplet()
|
||||
var/list/num_sample = list(1, 2, 3, 4, 5, 6, 7, 8, 9)
|
||||
var/result = 0
|
||||
|
||||
@@ -36,3 +36,8 @@ var/eventchance = 10 //% per 5 mins
|
||||
var/event = 0
|
||||
var/hadevent = 0
|
||||
var/blobevent = 0
|
||||
|
||||
//Medals hub related variables
|
||||
var/global/medal_hub = null
|
||||
var/global/medal_pass = " "
|
||||
var/global/medals_enabled = TRUE //will be auto set to false if the game fails contacting the medal hub to prevent unneeded calls.
|
||||
@@ -19,3 +19,5 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse
|
||||
)
|
||||
|
||||
var/list/mineral_turfs = list()
|
||||
|
||||
var/list/ruin_landmarks = list()
|
||||
@@ -33,5 +33,9 @@ var/global/list/shuttle_caller_list = list() //list of all communication cons
|
||||
var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
|
||||
var/global/list/pinpointer_list = list() //list of all pinpointers. Used to change stuff they are pointing to all at once.
|
||||
var/global/list/abductor_equipment = list() //list of all abductor equipment
|
||||
|
||||
|
||||
var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels
|
||||
var/global/list/global_radios = list() //list of all radios, across all z-levels
|
||||
var/global/list/global_radios = list() //list of all radios, across all z-levels
|
||||
|
||||
var/global/list/poi_list = list() //list of points of interest for observe/follow
|
||||
@@ -49,6 +49,6 @@ var/list/datum/map_template/map_templates = list()
|
||||
|
||||
var/list/datum/map_template/ruins_templates = list()
|
||||
var/list/datum/map_template/space_ruins_templates = list()
|
||||
//var/list/datum/map_template/lava_ruins_templates = list()
|
||||
var/list/datum/map_template/lava_ruins_templates = list()
|
||||
var/list/datum/map_template/shelter_templates = list()
|
||||
var/list/datum/map_template/shuttle_templates = list()
|
||||
+3
-17
@@ -95,9 +95,9 @@
|
||||
update_inv_r_hand(0)
|
||||
return
|
||||
|
||||
// operate two STORAGE levels deep here (item in backpack in src; NOT item in box in backpack in src)
|
||||
// operate three levels deep here (item in backpack in src; item in box in backpack in src, not any deeper)
|
||||
var/sdepth = A.storage_depth(src)
|
||||
if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 1))
|
||||
if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 2))
|
||||
// No adjacency needed
|
||||
if(W)
|
||||
var/resolved = A.attackby(W,src)
|
||||
@@ -323,16 +323,6 @@
|
||||
|
||||
// Simple helper to face what you clicked on, in case it should be needed in more than one place
|
||||
/mob/proc/face_atom(var/atom/A)
|
||||
|
||||
/* // Snowflake for space vines. //Are you fucking kidding me?
|
||||
var/is_buckled = 0
|
||||
if(buckled)
|
||||
if(istype(buckled))
|
||||
if(!buckled.movable)
|
||||
is_buckled = 1
|
||||
else
|
||||
is_buckled = 0*/
|
||||
|
||||
if( stat || buckled || !A || !x || !y || !A.x || !A.y ) return
|
||||
var/dx = A.x - x
|
||||
var/dy = A.y - y
|
||||
@@ -345,11 +335,7 @@
|
||||
else
|
||||
if(dx > 0) direction = EAST
|
||||
else direction = WEST
|
||||
usr.dir = direction
|
||||
|
||||
/* if(buckled && buckled.movable)
|
||||
buckled.dir = direction
|
||||
buckled.handle_rotation()*/
|
||||
dir = direction
|
||||
|
||||
/obj/screen/click_catcher
|
||||
icon = 'icons/mob/screen_full.dmi'
|
||||
|
||||
+24
-11
@@ -197,6 +197,16 @@ The box in your backpack has an oxygen tank and gas mask in it."
|
||||
name = "High Pressure"
|
||||
desc = "The air around you is hazardously thick. A fire suit would protect you."
|
||||
icon_state = "highpressure"
|
||||
|
||||
/obj/screen/alert/lightexposure
|
||||
name = "Light Exposure"
|
||||
desc = "You're exposed to light."
|
||||
icon_state = "lightexposure"
|
||||
|
||||
/obj/screen/alert/nolight
|
||||
name = "No Light"
|
||||
desc = "You're not exposed to any light."
|
||||
icon_state = "nolight"
|
||||
|
||||
/obj/screen/alert/blind
|
||||
name = "Blind"
|
||||
@@ -349,25 +359,28 @@ so as to remain in compliance with the most up-to-date laws."
|
||||
var/mob/dead/observer/G = usr
|
||||
G.reenter_corpse()
|
||||
|
||||
/obj/screen/alert/notify_jump
|
||||
/obj/screen/alert/notify_action
|
||||
name = "Body created"
|
||||
desc = "A body was created. You can enter it."
|
||||
icon_state = "template"
|
||||
timeout = 300
|
||||
var/atom/jump_target = null
|
||||
var/attack_not_jump = null
|
||||
var/atom/target = null
|
||||
var/action = NOTIFY_JUMP
|
||||
|
||||
/obj/screen/alert/notify_jump/Click()
|
||||
/obj/screen/alert/notify_action/Click()
|
||||
if(!usr || !usr.client) return
|
||||
if(!jump_target) return
|
||||
if(!target) return
|
||||
var/mob/dead/observer/G = usr
|
||||
if(!istype(G)) return
|
||||
if(attack_not_jump)
|
||||
jump_target.attack_ghost(G)
|
||||
else
|
||||
var/turf/T = get_turf(jump_target)
|
||||
if(T && isturf(T))
|
||||
G.loc = T
|
||||
switch(action)
|
||||
if(NOTIFY_ATTACK)
|
||||
target.attack_ghost(G)
|
||||
if(NOTIFY_JUMP)
|
||||
var/turf/T = get_turf(target)
|
||||
if(T && isturf(T))
|
||||
G.loc = T
|
||||
if(NOTIFY_FOLLOW)
|
||||
G.ManualFollow(target)
|
||||
|
||||
//OBJECT-BASED
|
||||
|
||||
|
||||
@@ -74,7 +74,9 @@
|
||||
|
||||
/////////////////////////
|
||||
|
||||
if(istype(M, /mob/living/simple_animal))
|
||||
if(isanimal(M))
|
||||
var/mob/living/simple_animal/S = M
|
||||
S.attacked_by(src, user)
|
||||
return 0 // No sanic-speed double-attacks for you - simple mobs will handle being attacked on their own
|
||||
var/power = force
|
||||
|
||||
|
||||
@@ -4,16 +4,16 @@
|
||||
|
||||
Otherwise pretty standard.
|
||||
*/
|
||||
/mob/living/carbon/human/UnarmedAttack(var/atom/A, var/proximity)
|
||||
var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
|
||||
|
||||
/mob/living/carbon/human/UnarmedAttack(atom/A, proximity)
|
||||
// Special glove functions:
|
||||
// If the gloves do anything, have them return 1 to stop
|
||||
// normal attack_hand() here.
|
||||
if(proximity && istype(G) && G.Touch(A,1))
|
||||
var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
|
||||
if(proximity && istype(G) && G.Touch(A, 1))
|
||||
return
|
||||
|
||||
A.attack_hand(src)
|
||||
|
||||
/atom/proc/attack_hand(mob/user as mob)
|
||||
return
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ var/global/datum/controller/process/weather/weather_master
|
||||
var/list/possible_weather_for_this_z = list()
|
||||
for(var/V in existing_weather)
|
||||
var/datum/weather/WE = V
|
||||
if(WE.target_level == Z && WE.probability) //Another check so that it doesn't run extra weather
|
||||
if(WE.target_z == Z && WE.probability) //Another check so that it doesn't run extra weather
|
||||
possible_weather_for_this_z[WE] = WE.probability
|
||||
var/datum/weather/W = pickweight(possible_weather_for_this_z)
|
||||
run_weather(W.name)
|
||||
|
||||
@@ -575,6 +575,12 @@
|
||||
|
||||
if("round_abandon_penalty_period")
|
||||
config.round_abandon_penalty_period = MinutesToTicks(text2num(value))
|
||||
|
||||
if("medal_hub_address")
|
||||
global.medal_hub = value
|
||||
|
||||
if("medal_hub_password")
|
||||
global.medal_pass = value
|
||||
|
||||
if("disable_ooc_emoji")
|
||||
config.disable_ooc_emoji = 1
|
||||
|
||||
@@ -17,8 +17,7 @@
|
||||
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
|
||||
return
|
||||
|
||||
|
||||
/client/proc/debug_controller(controller in list("Master","failsafe","Ticker","Air","Lighting","Jobs","Sun","Radio","Configuration","pAI", "Cameras","Garbage", "Transfer Controller","Event","Alarm","Scheduler","Nano","Vote","Mob Hunt Server"))
|
||||
/client/proc/debug_controller(controller in list("Master","failsafe","Ticker","Air","Lighting","Jobs","Sun","Radio","Configuration","pAI", "Cameras","Garbage", "Transfer Controller","Event","Alarm","Scheduler","Nano","Vote","Diseases","Fires","Mob","NPC AI","Shuttle","Timer","Weather","Space","Mob Hunt Server"))
|
||||
set category = "Debug"
|
||||
set name = "Debug Controller"
|
||||
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
|
||||
@@ -76,6 +75,30 @@
|
||||
if("Vote")
|
||||
debug_variables(vote)
|
||||
feedback_add_details("admin_verb","DVote")
|
||||
if("Diseases")
|
||||
debug_variables(disease_master)
|
||||
feedback_add_details("admin_verb","DDiseases")
|
||||
if("Fires")
|
||||
debug_variables(fire_master)
|
||||
feedback_add_details("admin_verb","DFires")
|
||||
if("Mob")
|
||||
debug_variables(mob_master)
|
||||
feedback_add_details("admin_verb","DMob")
|
||||
if("NPC AI")
|
||||
debug_variables(npcai_master)
|
||||
feedback_add_details("admin_verb","DNPCAI")
|
||||
if("Shuttle")
|
||||
debug_variables(shuttle_master)
|
||||
feedback_add_details("admin_verb","DShuttle")
|
||||
if("Timer")
|
||||
debug_variables(timer_master)
|
||||
feedback_add_details("admin_verb","DTimer")
|
||||
if("Weather")
|
||||
debug_variables(weather_master)
|
||||
feedback_add_details("admin_verb","DWeather")
|
||||
if("Space")
|
||||
debug_variables(space_manager)
|
||||
feedback_add_details("admin_verb","DSpace")
|
||||
if("Mob Hunt Server")
|
||||
debug_variables(mob_hunt_server)
|
||||
feedback_add_details("admin_verb","DMobHuntServer")
|
||||
|
||||
@@ -187,6 +187,40 @@
|
||||
|
||||
/datum/action/item_action/toggle_hardsuit_mode
|
||||
name = "Toggle Hardsuit Mode"
|
||||
|
||||
/datum/action/item_action/toggle_unfriendly_fire
|
||||
name = "Toggle Friendly Fire \[ON\]"
|
||||
desc = "Toggles if the staff causes friendly fire."
|
||||
button_icon_state = "vortex_ff_on"
|
||||
|
||||
/datum/action/item_action/toggle_unfriendly_fire/Trigger()
|
||||
if(..())
|
||||
UpdateButtonIcon()
|
||||
|
||||
/datum/action/item_action/toggle_unfriendly_fire/UpdateButtonIcon()
|
||||
if(istype(target, /obj/item/weapon/hierophant_staff))
|
||||
var/obj/item/weapon/hierophant_staff/H = target
|
||||
if(H.friendly_fire_check)
|
||||
button_icon_state = "vortex_ff_off"
|
||||
name = "Toggle Friendly Fire \[OFF\]"
|
||||
button.name = name
|
||||
else
|
||||
button_icon_state = "vortex_ff_on"
|
||||
name = "Toggle Friendly Fire \[ON\]"
|
||||
button.name = name
|
||||
..()
|
||||
|
||||
/datum/action/item_action/vortex_recall
|
||||
name = "Vortex Recall"
|
||||
desc = "Recall yourself, and anyone nearby, to an attuned hierophant rune at any time.<br>If no such rune exists, will produce a rune at your location."
|
||||
button_icon_state = "vortex_recall"
|
||||
|
||||
/datum/action/item_action/vortex_recall/IsAvailable()
|
||||
if(istype(target, /obj/item/weapon/hierophant_staff))
|
||||
var/obj/item/weapon/hierophant_staff/H = target
|
||||
if(H.teleporting)
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/datum/action/item_action/toggle
|
||||
|
||||
@@ -323,6 +357,11 @@
|
||||
..()
|
||||
name = "Toggle [target.name]"
|
||||
button.name = name
|
||||
|
||||
/datum/action/item_action/organ_action/use/New(Target)
|
||||
..()
|
||||
name = "Use [target.name]"
|
||||
button.name = name
|
||||
|
||||
// for clothing accessories like holsters
|
||||
/datum/action/item_action/accessory
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
// reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0)
|
||||
|
||||
/datum
|
||||
var/var_edited = 0 //Warrenty void if seal is broken
|
||||
|
||||
/datum/proc/on_varedit(modified_var) //called whenever a var is edited
|
||||
var_edited = 1
|
||||
|
||||
/client/proc/debug_variables(datum/D in world)
|
||||
set category = "Debug"
|
||||
set name = "View Variables"
|
||||
|
||||
+80
-24
@@ -3,9 +3,53 @@
|
||||
|
||||
/obj/effect/proc_holder
|
||||
var/panel = "Debug"//What panel the proc holder needs to go on.
|
||||
var/active = FALSE //Used by toggle based abilities.
|
||||
var/ranged_mousepointer
|
||||
|
||||
var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin verb for now
|
||||
|
||||
/obj/effect/proc_holder/proc/InterceptClickOn(mob/living/user, params, atom/A)
|
||||
if(user.ranged_ability != src)
|
||||
to_chat(user, "<span class='warning'><b>[user.ranged_ability.name]</b> has been disabled.")
|
||||
user.ranged_ability.remove_ranged_ability(user)
|
||||
return TRUE //TRUE for failed, FALSE for passed.
|
||||
user.next_click = world.time + CLICK_CD_CLICK_ABILITY
|
||||
user.face_atom(A)
|
||||
return FALSE
|
||||
|
||||
/obj/effect/proc_holder/proc/add_ranged_ability(mob/living/user, var/msg)
|
||||
if(!user || !user.client)
|
||||
return
|
||||
if(user.ranged_ability && user.ranged_ability != src)
|
||||
to_chat(user, "<span class='warning'><b>[user.ranged_ability.name]</b> has been replaced by <b>[name]</b>.")
|
||||
user.ranged_ability.remove_ranged_ability(user)
|
||||
user.ranged_ability = src
|
||||
user.client.click_intercept = user.ranged_ability
|
||||
add_mousepointer(user.client)
|
||||
active = TRUE
|
||||
if(msg)
|
||||
to_chat(user, msg)
|
||||
update_icon()
|
||||
|
||||
/obj/effect/proc_holder/proc/add_mousepointer(client/C)
|
||||
if(C && ranged_mousepointer && C.mouse_pointer_icon == initial(C.mouse_pointer_icon))
|
||||
C.mouse_pointer_icon = ranged_mousepointer
|
||||
|
||||
/obj/effect/proc_holder/proc/remove_mousepointer(client/C)
|
||||
if(C && ranged_mousepointer && C.mouse_pointer_icon == ranged_mousepointer)
|
||||
C.mouse_pointer_icon = initial(C.mouse_pointer_icon)
|
||||
|
||||
/obj/effect/proc_holder/proc/remove_ranged_ability(mob/living/user, var/msg)
|
||||
if(!user || !user.client || (user.ranged_ability && user.ranged_ability != src)) //To avoid removing the wrong ability
|
||||
return
|
||||
user.ranged_ability = null
|
||||
user.client.click_intercept = null
|
||||
remove_mousepointer(user.client)
|
||||
active = FALSE
|
||||
if(msg)
|
||||
to_chat(user, msg)
|
||||
update_icon()
|
||||
|
||||
/obj/effect/proc_holder/spell
|
||||
name = "Spell"
|
||||
desc = "A wizard spell"
|
||||
@@ -26,6 +70,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
|
||||
var/ghost = 0 // Skip life check.
|
||||
var/clothes_req = 1 //see if it requires clothes
|
||||
var/human_req = 0 //spell can only be cast by humans
|
||||
var/nonabstract_req = 0 //spell can only be cast by mobs that are physical entities
|
||||
var/stat_allowed = 0 //see if it requires being conscious/alive, need to set to 1 for ghostpells
|
||||
var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell
|
||||
var/invocation_emote_self = null
|
||||
@@ -54,13 +100,15 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
var/action_icon = 'icons/mob/actions.dmi'
|
||||
var/action_icon_state = "spell_default"
|
||||
var/action_background_icon_state = "bg_spell"
|
||||
|
||||
var/sound = null //The sound the spell makes when it is cast
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0, mob/living/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
|
||||
|
||||
if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list))
|
||||
to_chat(user, "<span class='warning'>You shouldn't have this spell! Something's wrong.</span>")
|
||||
return 0
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/caster = user
|
||||
if(caster.remoteview_target)
|
||||
caster.remoteview_target = null
|
||||
@@ -83,26 +131,31 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
|
||||
if(!ghost)
|
||||
if(user.stat && !stat_allowed)
|
||||
to_chat(user, "Not when you're incapacitated.")
|
||||
to_chat(user, "<span class='notice'>You can't cast this spell while incapacitated.</span>")
|
||||
return 0
|
||||
|
||||
if(ishuman(user) && (invocation_type == "whisper" || invocation_type == "shout") && user.is_muzzled())
|
||||
to_chat(user, "Mmmf mrrfff!")
|
||||
return 0
|
||||
var/obj/effect/proc_holder/spell/noclothes/spell = locate() in (user.mob_spell_list | (user.mind ? user.mind.spell_list : list()))
|
||||
if(clothes_req && !(spell && istype(spell)))//clothes check
|
||||
if(!istype(user, /mob/living/carbon/human))
|
||||
to_chat(user, "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans.")
|
||||
|
||||
var/obj/effect/proc_holder/spell/noclothes/clothes_spell = locate() in (user.mob_spell_list | (user.mind ? user.mind.spell_list : list()))
|
||||
if((ishuman(user) && clothes_req) && !istype(clothes_spell))//clothes check
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/rig/wizard))
|
||||
to_chat(user, "<span class='notice'>I don't feel strong enough without my robe.</span>")
|
||||
return 0
|
||||
if(!istype(user:wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(user:wear_suit, /obj/item/clothing/suit/space/rig/wizard))
|
||||
to_chat(user, "I don't feel strong enough without my robe.")
|
||||
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
|
||||
to_chat(user, "<span class='notice'>I don't feel strong enough without my sandals.</span>")
|
||||
return 0
|
||||
if(!istype(user:shoes, /obj/item/clothing/shoes/sandal))
|
||||
to_chat(user, "I don't feel strong enough without my sandals.")
|
||||
return 0
|
||||
if(!istype(user:head, /obj/item/clothing/head/wizard) && !istype(user:head, /obj/item/clothing/head/helmet/space/rig/wizard))
|
||||
if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/rig/wizard))
|
||||
to_chat(user, "<span class='notice'>I don't feel strong enough without my hat.</span>")
|
||||
return 0
|
||||
else if(!ishuman(user))
|
||||
if(clothes_req || human_req)
|
||||
to_chat(user, "<span class='notice'>This spell can only be cast by humans!</span>")
|
||||
return 0
|
||||
if(nonabstract_req && (isbrain(user) || ispAI(user)))
|
||||
to_chat(user, "<span class='notice'>This spell can only be cast by physical beings!</span>")
|
||||
return 0
|
||||
|
||||
if(!skipcharge)
|
||||
switch(charge_type)
|
||||
@@ -130,6 +183,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
if("emote")
|
||||
user.visible_message(invocation, invocation_emote_self) //same style as in mob/living/emote.dm
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/playMagSound()
|
||||
playsound(get_turf(usr), sound,50,1)
|
||||
|
||||
/obj/effect/proc_holder/spell/New()
|
||||
..()
|
||||
action = new(src)
|
||||
@@ -167,10 +223,14 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
spawn(0)
|
||||
if(charge_type == "recharge" && recharge)
|
||||
start_recharge()
|
||||
|
||||
if(sound)
|
||||
playMagSound()
|
||||
|
||||
if(prob(critfailchance))
|
||||
critfail(targets)
|
||||
else
|
||||
cast(targets)
|
||||
cast(targets, user = user)
|
||||
after_cast(targets)
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/before_cast(list/targets)
|
||||
@@ -216,7 +276,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
smoke.set_up(smoke_amt, 0, location) // same here
|
||||
smoke.start()
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/proc/cast(list/targets, mob/user = usr)
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/critfail(list/targets)
|
||||
@@ -270,9 +330,6 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
switch(max_targets)
|
||||
if(0) //unlimited
|
||||
for(var/mob/living/target in view_or_range(range, user, selection_type))
|
||||
for(var/F in user.faction)
|
||||
if(F in target.faction)
|
||||
continue
|
||||
targets += target
|
||||
if(1) //single target can be picked
|
||||
if(range < 0)
|
||||
@@ -326,7 +383,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
revert_cast(user)
|
||||
return
|
||||
|
||||
perform(targets)
|
||||
perform(targets, user=user)
|
||||
|
||||
return
|
||||
|
||||
@@ -341,7 +398,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
revert_cast()
|
||||
return
|
||||
|
||||
perform(targets)
|
||||
perform(targets, user=user)
|
||||
|
||||
return
|
||||
|
||||
@@ -377,7 +434,6 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
return 0
|
||||
|
||||
if(ishuman(user))
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
if((invocation_type == "whisper" || invocation_type == "shout") && H.is_muzzled())
|
||||
@@ -393,8 +449,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
|
||||
if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/rig/wizard))
|
||||
return 0
|
||||
else
|
||||
if(clothes_req)
|
||||
if(clothes_req || human_req)
|
||||
return 0
|
||||
if(isbrain(user) || ispAI(user))
|
||||
if(nonabstract_req && (isbrain(user) || ispAI(user)))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport
|
||||
name = "Area teleport"
|
||||
desc = "This spell teleports you to a type of area of your selection."
|
||||
|
||||
nonabstract_req = 1
|
||||
|
||||
var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list
|
||||
var/invocation_area = 1 //if the invocation appends the selected area
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1)
|
||||
|
||||
var/sound1 = 'sound/weapons/ZapBang.ogg'
|
||||
var/sound2 = 'sound/weapons/ZapBang.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/perform(list/targets, recharge = 1, mob/living/user = usr)
|
||||
var/thearea = before_cast(targets)
|
||||
if(!thearea || !cast_check(1))
|
||||
revert_cast()
|
||||
@@ -32,7 +37,8 @@
|
||||
|
||||
return thearea
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/cast(list/targets,area/thearea)
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/cast(list/targets,area/thearea,mob/living/user = usr)
|
||||
playsound(get_turf(user), sound1, 50,1)
|
||||
for(var/mob/living/target in targets)
|
||||
var/list/L = list()
|
||||
for(var/turf/T in get_area_turfs(thearea.type))
|
||||
@@ -64,7 +70,8 @@
|
||||
break
|
||||
|
||||
if(!success)
|
||||
target.loc = pick(L)
|
||||
target.forceMove(pick(L))
|
||||
playsound(get_turf(user), sound2, 50,1)
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
|
||||
/obj/effect/proc_holder/spell/bloodcrawl/choose_targets(mob/user = usr)
|
||||
for(var/obj/effect/decal/cleanable/target in range(range, get_turf(user)))
|
||||
if(istype(target,/obj/effect/decal/cleanable/blood) && !(istype(target,/obj/effect/decal/cleanable/blood/oil) || istype(target,/obj/effect/decal/cleanable/blood/gibs/robot)))
|
||||
perform(target)
|
||||
if(target.can_bloodcrawl_in())
|
||||
perform(target, user = user)
|
||||
return
|
||||
revert_cast()
|
||||
to_chat(user, "<span class='warning'>There must be a nearby source of blood!</span>")
|
||||
|
||||
@@ -13,15 +13,17 @@
|
||||
var/list/newVars = list() //vars of the summoned objects will be replaced with those where they meet
|
||||
//should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example
|
||||
var/delay = 1//Go Go Gadget Inheritance
|
||||
|
||||
var/cast_sound = 'sound/items/welder.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets)
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/cast(list/targets,mob/living/user = usr)
|
||||
playsound(get_turf(user), cast_sound, 50,1)
|
||||
for(var/turf/T in targets)
|
||||
if(T.density && !summon_ignore_density)
|
||||
targets -= T
|
||||
playsound(get_turf(src), 'sound/items/welder.ogg', 50, 1)
|
||||
playsound(get_turf(src), cast_sound, 50, 1)
|
||||
|
||||
if(do_after(usr,delay, target = usr))
|
||||
if(do_after(user,delay, target = user))
|
||||
for(var/i=0,i<summon_amt,i++)
|
||||
if(!targets.len)
|
||||
break
|
||||
@@ -30,8 +32,8 @@
|
||||
if(summon_ignore_prev_spawn_points)
|
||||
targets -= spawn_place
|
||||
if(ispath(summoned_object_type,/turf))
|
||||
if(istype(get_turf(usr),/turf/simulated/shuttle))
|
||||
to_chat(usr, "\red You can't build things on shuttles!")
|
||||
if(istype(get_turf(user),/turf/simulated/shuttle))
|
||||
to_chat(user, "\red You can't build things on shuttles!")
|
||||
break
|
||||
var/turf/O = spawn_place
|
||||
var/N = summoned_object_type
|
||||
@@ -42,6 +44,7 @@
|
||||
for(var/varName in newVars)
|
||||
if(varName in summoned_object.vars)
|
||||
summoned_object.vars[varName] = newVars[varName]
|
||||
summoned_object.admin_spawned = TRUE
|
||||
|
||||
if(summon_lifespan)
|
||||
spawn(summon_lifespan)
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
if(new_turf.density)
|
||||
break
|
||||
T = new_turf
|
||||
perform(list(T))
|
||||
perform(list(T), user = user)
|
||||
|
||||
/obj/effect/proc_holder/spell/dumbfire/cast(list/targets, mob/user = usr)
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
projectile.dir = get_dir(projectile, target)
|
||||
projectile.name = proj_name
|
||||
|
||||
var/current_loc = usr.loc
|
||||
var/current_loc = user.loc
|
||||
|
||||
projectile.loc = current_loc
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
projectile.cast(current_loc)
|
||||
break
|
||||
|
||||
var/mob/living/L = locate(/mob/living) in range(projectile, proj_trigger_range) - usr
|
||||
var/mob/living/L = locate(/mob/living) in range(projectile, proj_trigger_range) - user
|
||||
if(L && L.stat != DEAD)
|
||||
projectile.cast(L.loc)
|
||||
break
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
action_icon_state = "emp"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets, mob/user = usr)
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
empulse(target.loc, emp_heavy, emp_light)
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
range = -1
|
||||
cooldown_min = 100 //50 deciseconds reduction per rank
|
||||
include_user = 1
|
||||
nonabstract_req = 1
|
||||
centcom_cancast = 0 //Prevent people from getting to centcom
|
||||
|
||||
var phaseshift = 0
|
||||
@@ -17,7 +18,7 @@
|
||||
|
||||
action_icon_state = "jaunt"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
|
||||
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets, mob/user = usr) //magnets, so mostly hardcoded
|
||||
for(var/mob/living/target in targets)
|
||||
if(!target.can_safely_leave_loc()) // No more brainmobs hopping out of their brains
|
||||
to_chat(target, "<span class='warning'>You are somehow too bound to your current location to abandon it.</span>")
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
var/ex_light = 3
|
||||
var/ex_flash = 4
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets, mob/user = usr)
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
explosion(target.loc,ex_severe,ex_heavy,ex_light,ex_flash)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
6th bit - ?
|
||||
*/
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets, mob/user = usr)
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
for(var/x in mutations)
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
selection_type = "range"
|
||||
|
||||
action_icon_state = "barn"
|
||||
sound = 'sound/magic/HorseHead_curse.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/horsemask/cast(list/targets, mob/user = usr)
|
||||
if(!targets.len)
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
var/summon_type = null //this will put an obj at the target's location
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets, mob/user = usr)
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
switch(destroys)
|
||||
|
||||
@@ -11,8 +11,9 @@
|
||||
cooldown_min = 20 //20 deciseconds reduction per rank
|
||||
|
||||
action_icon_state = "knock"
|
||||
sound = 'sound/magic/Knock.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets, mob/user = usr)
|
||||
for(var/turf/T in targets)
|
||||
for(var/obj/machinery/door/door in T.contents)
|
||||
spawn(1)
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
var/ready = 0
|
||||
var/image/halo = null
|
||||
action_icon_state = "lightning"
|
||||
var/sound/Snd // so far only way i can think of to stop a sound, thank MSO for the idea.
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lightning/lightnian
|
||||
clothes_req = 0
|
||||
@@ -31,8 +32,10 @@
|
||||
/obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr)
|
||||
ready = 1
|
||||
to_chat(user, "<span class='notice'>You start gathering the power.</span>")
|
||||
Snd = new/sound('sound/magic/lightning_chargeup.ogg',channel = 7)
|
||||
halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER)
|
||||
user.overlays.Add(halo)
|
||||
playsound(get_turf(user), Snd, 50, 0)
|
||||
start_time = world.time
|
||||
if(do_mob(user,user,100,uninterruptible=1))
|
||||
if(ready)
|
||||
@@ -59,11 +62,14 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
|
||||
/obj/effect/proc_holder/spell/targeted/lightning/cast(list/targets, mob/user = usr)
|
||||
ready = 0
|
||||
var/mob/living/carbon/target = targets[1]
|
||||
Snd=sound(null, repeat = 0, wait = 1, channel = Snd.channel) //byond, why you suck?
|
||||
playsound(get_turf(user),Snd,50,0)// Sorry MrPerson, but the other ways just didn't do it the way i needed to work, this is the only way.
|
||||
if(get_dist(user,target)>range)
|
||||
to_chat(user, "<span class='notice'>They are too far away!</span>")
|
||||
Reset(user)
|
||||
return
|
||||
|
||||
playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, 1)
|
||||
user.Beam(target,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
|
||||
|
||||
var/energy = min(world.time - start_time,100)
|
||||
@@ -75,10 +81,10 @@ obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
|
||||
var/mob/living/carbon/current = target
|
||||
if(bounces < 1)
|
||||
current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
|
||||
playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
playsound(get_turf(current), 'sound/magic/LightningShock.ogg', 50, 1, -1)
|
||||
else
|
||||
current.electrocute_act(bolt_energy,"Lightning Bolt",safety=1)
|
||||
playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
playsound(get_turf(current), 'sound/magic/LightningShock.ogg', 50, 1, -1)
|
||||
var/list/possible_targets = new
|
||||
for(var/mob/living/M in view_or_range(range,target,"view"))
|
||||
if(user == M || target == M && los_check(current,M)) // || origin == M ? Not sure double shockings is good or not
|
||||
|
||||
@@ -10,7 +10,9 @@
|
||||
charge_max = 300
|
||||
clothes_req = 0
|
||||
range = 0
|
||||
|
||||
cast_sound = null
|
||||
human_req = 1
|
||||
|
||||
action_icon_state = "mime"
|
||||
action_background_icon_state = "bg_mime"
|
||||
|
||||
@@ -34,6 +36,7 @@
|
||||
charge_max = 3000
|
||||
range = -1
|
||||
include_user = 1
|
||||
human_req = 1
|
||||
|
||||
action_icon_state = "mime"
|
||||
action_background_icon_state = "bg_mime"
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
projectile.dir = get_dir(target,projectile)
|
||||
projectile.name = proj_name
|
||||
|
||||
var/current_loc = usr.loc
|
||||
var/current_loc = user.loc
|
||||
|
||||
projectile.loc = current_loc
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
qdel(trail)
|
||||
|
||||
if(projectile.loc in range(target.loc,proj_trigger_range))
|
||||
projectile.perform(list(target))
|
||||
projectile.perform(list(target), user = user)
|
||||
break
|
||||
|
||||
current_loc = projectile.loc
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
/obj/effect/proc_holder/spell/targeted/shapeshift
|
||||
name = "Shapechange"
|
||||
desc = "Take on the shape of another for a time to use their natural abilities. Once you've made your choice it cannot be changed."
|
||||
clothes_req = 0
|
||||
human_req = 0
|
||||
charge_max = 200
|
||||
cooldown_min = 50
|
||||
range = -1
|
||||
include_user = 1
|
||||
invocation = "RAC'WA NO!"
|
||||
invocation_type = "shout"
|
||||
action_icon_state = "shapeshift"
|
||||
|
||||
var/shapeshift_type
|
||||
var/list/current_shapes = list()
|
||||
var/list/current_casters = list()
|
||||
var/list/possible_shapes = list(/mob/living/simple_animal/mouse,
|
||||
/mob/living/simple_animal/pet/corgi,
|
||||
/mob/living/simple_animal/bot/ed209,
|
||||
/mob/living/simple_animal/hostile/construct/armoured)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shapeshift/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/M in targets)
|
||||
if(!shapeshift_type)
|
||||
var/list/animal_list = list()
|
||||
for(var/path in possible_shapes)
|
||||
var/mob/living/simple_animal/A = path
|
||||
animal_list[initial(A.name)] = path
|
||||
shapeshift_type = input(M, "Choose Your Animal Form!", "It's Morphing Time!", null) as anything in animal_list
|
||||
if(!shapeshift_type) //If you aren't gonna decide I am!
|
||||
shapeshift_type = pick(animal_list)
|
||||
shapeshift_type = animal_list[shapeshift_type]
|
||||
if(M in current_shapes)
|
||||
Restore(M)
|
||||
else
|
||||
Shapeshift(M)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shapeshift/proc/Shapeshift(mob/living/caster)
|
||||
for(var/mob/living/M in caster)
|
||||
if(M.status_flags & GODMODE)
|
||||
to_chat(caster, "<span class='warning'>You're already shapeshifted!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/shape = new shapeshift_type(caster.loc)
|
||||
caster.loc = shape
|
||||
caster.status_flags |= GODMODE
|
||||
|
||||
current_shapes |= shape
|
||||
current_casters |= caster
|
||||
clothes_req = 0
|
||||
human_req = 0
|
||||
|
||||
caster.mind.transfer_to(shape)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shapeshift/proc/Restore(mob/living/shape)
|
||||
var/mob/living/caster
|
||||
for(var/mob/living/M in shape)
|
||||
if(M in current_casters)
|
||||
caster = M
|
||||
break
|
||||
if(!caster)
|
||||
return
|
||||
caster.loc = shape.loc
|
||||
caster.status_flags &= ~GODMODE
|
||||
|
||||
clothes_req = initial(clothes_req)
|
||||
human_req = initial(human_req)
|
||||
current_casters.Remove(caster)
|
||||
current_shapes.Remove(shape)
|
||||
|
||||
shape.mind.transfer_to(caster)
|
||||
qdel(shape) //Gib it maybe ?
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shapeshift/dragon
|
||||
name = "Dragon Form"
|
||||
desc = "Take on the shape a lesser ash drake."
|
||||
invocation = "RAAAAAAAAWR!"
|
||||
|
||||
shapeshift_type = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
|
||||
list/current_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser)
|
||||
list/current_casters = list()
|
||||
list/possible_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser)
|
||||
@@ -15,9 +15,9 @@
|
||||
|
||||
action_icon_state = "summons"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets)
|
||||
for(var/mob/living/user in targets)
|
||||
var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand())
|
||||
/obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/target in targets)
|
||||
var/list/hand_items = list(target.get_active_hand(),target.get_inactive_hand())
|
||||
var/butterfingers = 0
|
||||
var/message
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
if(issilicon(M)) //Items in silicons warp the whole silicon
|
||||
M.loc.visible_message("<span class='warning'>[M] suddenly disappears!</span>")
|
||||
M.loc = user.loc
|
||||
M.loc = target.loc
|
||||
M.loc.visible_message("<span class='caution'>[M] suddenly appears!</span>")
|
||||
item_to_retrive = null
|
||||
break
|
||||
@@ -68,10 +68,10 @@
|
||||
/*if(C.internal_organs_by_name && item_to_retrive in C.internal_organs_by_name ) //This won't work, as we use organ datums instead of objects. --DZD
|
||||
C.internal_organs_by_name -= item_to_retrive
|
||||
if(istype(marked_item, /obj/item/brain)) //If this code ever runs I will be happy
|
||||
var/obj/item/brain/B = new /obj/item/brain(user.loc)
|
||||
var/obj/item/brain/B = new /obj/item/brain(target.loc)
|
||||
B.transfer_identity(C)
|
||||
C.death()
|
||||
add_logs(user, C, "magically debrained", addition="INTENT: [uppertext(user.a_intent)]")*/
|
||||
add_logs(target, C, "magically debrained", addition="INTENT: [uppertext(target.a_intent)]")*/
|
||||
if(C.stomach_contents && item_to_retrive in C.stomach_contents)
|
||||
C.stomach_contents -= item_to_retrive
|
||||
|
||||
@@ -91,19 +91,21 @@
|
||||
item_to_retrive.loc.visible_message("<span class='warning'>The [item_to_retrive.name] suddenly disappears!</span>")
|
||||
|
||||
|
||||
if(user.hand) //left active hand
|
||||
if(!user.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1))
|
||||
if(!user.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1))
|
||||
if(target.hand) //left active hand
|
||||
if(!target.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1))
|
||||
if(!target.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1))
|
||||
butterfingers = 1
|
||||
else //right active hand
|
||||
if(!user.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1))
|
||||
if(!user.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1))
|
||||
if(!target.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1))
|
||||
if(!target.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1))
|
||||
butterfingers = 1
|
||||
if(butterfingers)
|
||||
item_to_retrive.loc = user.loc
|
||||
item_to_retrive.loc = target.loc
|
||||
item_to_retrive.loc.visible_message("<span class='caution'>The [item_to_retrive.name] suddenly appears!</span>")
|
||||
playsound(get_turf(target),'sound/magic/SummonItems_generic.ogg',50,1)
|
||||
else
|
||||
item_to_retrive.loc.visible_message("<span class='caution'>The [item_to_retrive.name] suddenly appears in [user]'s hand!</span>")
|
||||
item_to_retrive.loc.visible_message("<span class='caution'>The [item_to_retrive.name] suddenly appears in [target]'s hand!</span>")
|
||||
playsound(get_turf(target),'sound/magic/SummonItems_generic.ogg',50,1)
|
||||
|
||||
if(message)
|
||||
to_chat(user, message)
|
||||
to_chat(target, message)
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
return 0
|
||||
..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/touch/cast(list/targets)
|
||||
for(var/mob/living/carbon/user in targets)
|
||||
/obj/effect/proc_holder/spell/targeted/touch/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/carbon/target in targets)
|
||||
if(!attached_hand)
|
||||
if(!ChargeHand(user))
|
||||
if(!ChargeHand(target))
|
||||
return 0
|
||||
while(attached_hand) //hibernate untill the spell is actually used
|
||||
charge_counter = 0
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
starting_spells = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/target in targets)
|
||||
for(var/obj/effect/proc_holder/spell/spell in contents)
|
||||
spell.perform(list(target),0)
|
||||
spell.perform(list(target), 0, user = user)
|
||||
for(var/obj/effect/proc_holder/spell/spell in linked_spells)
|
||||
spell.perform(list(target),0)
|
||||
spell.perform(list(target), 0, user = user)
|
||||
|
||||
return
|
||||
@@ -1,14 +1,19 @@
|
||||
/obj/effect/proc_holder/spell/targeted/turf_teleport
|
||||
name = "Turf Teleport"
|
||||
desc = "This spell teleports the target to the turf in range."
|
||||
nonabstract_req = 1
|
||||
|
||||
var/inner_tele_radius = 1
|
||||
var/outer_tele_radius = 2
|
||||
|
||||
var/include_space = 0 //whether it includes space tiles in possible teleport locations
|
||||
var/include_dense = 0 //whether it includes dense tiles in possible teleport locations
|
||||
|
||||
var/sound1 = 'sound/weapons/ZapBang.ogg'
|
||||
var/sound2 = 'sound/weapons/ZapBang.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/turf_teleport/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/targeted/turf_teleport/cast(list/targets,mob/living/user = usr)
|
||||
playsound(get_turf(user), sound1, 50,1)
|
||||
for(var/mob/living/target in targets)
|
||||
var/list/turfs = new/list()
|
||||
for(var/turf/T in range(target,outer_tele_radius))
|
||||
@@ -31,4 +36,5 @@
|
||||
if(!picked || !isturf(picked))
|
||||
return
|
||||
|
||||
target.loc = picked
|
||||
target.forceMove(picked)
|
||||
playsound(get_turf(user), sound2, 50,1)
|
||||
|
||||
@@ -25,9 +25,12 @@
|
||||
proj_trail_icon_state = "magicmd"
|
||||
|
||||
action_icon_state = "magicm"
|
||||
|
||||
sound = 'sound/magic/MAGIC_MISSILE.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile
|
||||
amt_weakened = 3
|
||||
sound = 'sound/magic/MM_Hit.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/noclothes
|
||||
name = "No Clothes"
|
||||
@@ -52,8 +55,9 @@
|
||||
cooldown_min = 300 //25 deciseconds reduction per rank
|
||||
|
||||
action_icon_state = "mutate"
|
||||
sound = 'sound/magic/Mutate.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/mutate/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/mutate/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/target in targets)
|
||||
target.dna.SetSEState(HULKBLOCK, 1)
|
||||
genemutcheck(target, HULKBLOCK, null, MUTCHK_FORCED)
|
||||
@@ -93,6 +97,8 @@
|
||||
|
||||
emp_heavy = 6
|
||||
emp_light = 10
|
||||
|
||||
sound = 'sound/magic/Disable_Tech.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/turf_teleport/blink
|
||||
name = "Blink"
|
||||
@@ -117,6 +123,9 @@
|
||||
centcom_cancast = 0 //prevent people from getting to centcom
|
||||
|
||||
action_icon_state = "blink"
|
||||
|
||||
sound1 = 'sound/magic/blink.ogg'
|
||||
sound2 = 'sound/magic/blink.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/area_teleport/teleport
|
||||
name = "Teleport"
|
||||
@@ -135,6 +144,9 @@
|
||||
smoke_amt = 5
|
||||
|
||||
action_icon_state = "spell_teleport"
|
||||
|
||||
sound1 = 'sound/magic/Teleport_diss.ogg'
|
||||
sound2 = 'sound/magic/Teleport_app.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
|
||||
name = "Forcewall"
|
||||
@@ -152,6 +164,7 @@
|
||||
summon_lifespan = 300
|
||||
|
||||
action_icon_state = "shield"
|
||||
cast_sound = 'sound/magic/ForceWall.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop
|
||||
name = "Stop Time"
|
||||
@@ -180,7 +193,8 @@
|
||||
|
||||
summon_type = list(/mob/living/simple_animal/hostile/carp)
|
||||
|
||||
|
||||
cast_sound = 'sound/magic/Summon_Karp.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct
|
||||
name = "Artificer"
|
||||
desc = "This spell conjures a construct which may be controlled by Shades"
|
||||
@@ -195,6 +209,7 @@
|
||||
summon_type = list(/obj/structure/constructshell)
|
||||
|
||||
action_icon_state = "artificer"
|
||||
cast_sound = 'sound/magic/SummonItems_generic.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/creature
|
||||
name = "Summon Creature Swarm"
|
||||
@@ -209,6 +224,7 @@
|
||||
range = 3
|
||||
|
||||
summon_type = list(/mob/living/simple_animal/hostile/creature)
|
||||
cast_sound = 'sound/magic/SummonItems_generic.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/trigger/blind
|
||||
name = "Blind"
|
||||
@@ -229,12 +245,14 @@
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/blind
|
||||
amt_eye_blind = 10
|
||||
amt_eye_blurry = 20
|
||||
sound = 'sound/magic/Blind.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/blind
|
||||
disabilities = BLIND
|
||||
duration = 300
|
||||
sound = 'sound/magic/Blind.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/dumbfire/fireball
|
||||
/obj/effect/proc_holder/spell/fireball
|
||||
name = "Fireball"
|
||||
desc = "This spell fires a fireball at a target and does not require wizard garb."
|
||||
|
||||
@@ -245,29 +263,65 @@
|
||||
invocation_type = "shout"
|
||||
range = 20
|
||||
cooldown_min = 20 //10 deciseconds reduction per rank
|
||||
var/fireball_type = /obj/item/projectile/magic/fireball
|
||||
action_icon_state = "fireball0"
|
||||
sound = 'sound/magic/Fireball.ogg'
|
||||
|
||||
proj_icon_state = "fireball"
|
||||
proj_name = "a fireball"
|
||||
proj_type = "/obj/effect/proc_holder/spell/turf/fireball"
|
||||
active = FALSE
|
||||
|
||||
proj_lifespan = 200
|
||||
proj_step_delay = 1
|
||||
/obj/effect/proc_holder/spell/fireball/Click()
|
||||
var/mob/living/user = usr
|
||||
if(!istype(user))
|
||||
return
|
||||
|
||||
action_icon_state = "fireball"
|
||||
var/msg
|
||||
|
||||
/obj/effect/proc_holder/spell/turf/fireball/cast(var/turf/T)
|
||||
explosion(T, -1, 0, 2, 3, 0, flame_range = 2)
|
||||
if(!can_cast(user))
|
||||
msg = "<span class='warning'>You can no longer cast Fireball.</span>"
|
||||
remove_ranged_ability(user, msg)
|
||||
return
|
||||
|
||||
if(active)
|
||||
msg = "<span class='notice'>You extinguish your fireball...for now.</span>"
|
||||
remove_ranged_ability(user, msg)
|
||||
else
|
||||
msg = "<span class='notice'>Your prepare to cast your fireball spell! <B>Left-click to cast at a target!</B></span>"
|
||||
add_ranged_ability(user, msg)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/fireball
|
||||
amt_dam_brute = 20
|
||||
amt_dam_fire = 25
|
||||
/obj/effect/proc_holder/spell/fireball/update_icon()
|
||||
if(!action)
|
||||
return
|
||||
action.button_icon_state = "fireball[active]"
|
||||
action.UpdateButtonIcon()
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/explosion/fireball
|
||||
ex_severe = -1
|
||||
ex_heavy = -1
|
||||
ex_light = 2
|
||||
ex_flash = 5
|
||||
/obj/effect/proc_holder/spell/fireball/InterceptClickOn(mob/living/user, params, atom/target)
|
||||
if(..())
|
||||
return FALSE
|
||||
|
||||
if(!cast_check(0, user))
|
||||
remove_ranged_ability(user)
|
||||
return FALSE
|
||||
|
||||
var/list/targets = list(target)
|
||||
perform(targets, user = user)
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/spell/fireball/cast(list/targets, mob/living/user = usr)
|
||||
var/target = targets[1] //There is only ever one target for fireball
|
||||
var/turf/T = user.loc
|
||||
var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction
|
||||
if(!isturf(U) || !isturf(T))
|
||||
return 0
|
||||
|
||||
var/obj/item/projectile/magic/fireball/FB = new fireball_type(user.loc)
|
||||
FB.current = get_turf(user)
|
||||
FB.preparePixelProjectile(target, get_turf(target), user)
|
||||
FB.fire()
|
||||
user.newtonian_move(get_dir(U, T))
|
||||
remove_ranged_ability(user)
|
||||
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/repulse
|
||||
name = "Repulse"
|
||||
@@ -282,12 +336,13 @@
|
||||
var/maxthrow = 5
|
||||
|
||||
action_icon_state = "repulse"
|
||||
sound = 'sound/magic/Repulse.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets)
|
||||
var/mob/user = usr
|
||||
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets, mob/user = usr)
|
||||
var/list/thrownatoms = list()
|
||||
var/atom/throwtarget
|
||||
var/distfromcaster
|
||||
playMagSound()
|
||||
for(var/turf/T in targets) //Done this way so things don't get thrown all around hilariously.
|
||||
for(var/atom/movable/AM in T)
|
||||
thrownatoms += AM
|
||||
@@ -314,3 +369,24 @@
|
||||
M.Weaken(2)
|
||||
to_chat(M, "<span class='userdanger'>You're thrown back by a mystical force!</span>")
|
||||
spawn(0) AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1)//So stuff gets tossed around at the same time.
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/sacred_flame
|
||||
name = "Sacred Flame"
|
||||
desc = "Makes everyone around you more flammable, and lights yourself on fire."
|
||||
charge_max = 60
|
||||
clothes_req = 0
|
||||
invocation = "FI'RAN DADISKO"
|
||||
invocation_type = "shout"
|
||||
max_targets = 0
|
||||
range = 6
|
||||
include_user = 1
|
||||
selection_type = "view"
|
||||
action_icon_state = "sacredflame"
|
||||
sound = 'sound/magic/Fireball.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/sacred_flame/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/L in targets)
|
||||
L.adjust_fire_stacks(20)
|
||||
if(isliving(user))
|
||||
var/mob/living/U = user
|
||||
U.IgniteMob()
|
||||
@@ -1571,6 +1571,14 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
cost = 15
|
||||
containername = "snacks supply crate"
|
||||
|
||||
/datum/supply_packs/vending/chinese
|
||||
name = "Chinese Supply Crate"
|
||||
contains = list(/obj/item/weapon/vending_refill/chinese,
|
||||
/obj/item/weapon/vending_refill/chinese,
|
||||
/obj/item/weapon/vending_refill/chinese)
|
||||
cost = 15
|
||||
containername = "chinese supply crate"
|
||||
|
||||
/datum/supply_packs/vending/cola
|
||||
name = "Softdrinks Supply Crate"
|
||||
contains = list(/obj/item/weapon/vending_refill/cola,
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
var/weather_duration_upper = 1500 //See above - this is the highest possible duration
|
||||
var/weather_sound
|
||||
var/weather_overlay
|
||||
var/weather_color = null
|
||||
|
||||
var/end_message = "<span class='danger'>The wind relents its assault.</span>" //Displayed once the wather is over
|
||||
var/end_duration = 300 //In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely
|
||||
@@ -28,8 +29,9 @@
|
||||
|
||||
var/area_type = /area/space //Types of area to affect
|
||||
var/list/impacted_areas = list() //Areas to be affected by the weather, calculated when the weather begins
|
||||
var/target_level = MAIN_STATION //The z-level to affect
|
||||
|
||||
var/target_z = MAIN_STATION //The z-level to affect
|
||||
var/list/protected_areas = list()//Areas that are protected and excluded from the affected areas.
|
||||
|
||||
var/overlay_layer = 10 //Since it's above everything else, this is the layer used by default. 2 is below mobs and walls if you need to use that.
|
||||
var/aesthetic = FALSE //If the weather has no purpose other than looks
|
||||
var/immunity_type = "storm" //Used by mobs to prevent them from being affected by the weather
|
||||
@@ -50,15 +52,20 @@
|
||||
if(stage == STARTUP_STAGE)
|
||||
return
|
||||
stage = STARTUP_STAGE
|
||||
var/list/affectareas = list()
|
||||
for(var/V in get_areas(area_type))
|
||||
affectareas += V
|
||||
for(var/V in protected_areas)
|
||||
affectareas -= get_areas(V)
|
||||
for(var/V in affectareas)
|
||||
var/area/A = V
|
||||
if(is_on_level_name(A,target_level))
|
||||
if(is_on_level_name(A,target_z))
|
||||
impacted_areas |= A
|
||||
weather_duration = rand(weather_duration_lower, weather_duration_upper)
|
||||
update_areas()
|
||||
for(var/V in player_list)
|
||||
var/mob/M = V
|
||||
if(is_on_level_name(M,target_level))
|
||||
if(is_on_level_name(M,target_z))
|
||||
if(telegraph_message)
|
||||
to_chat(M, telegraph_message)
|
||||
if(telegraph_sound)
|
||||
@@ -72,7 +79,7 @@
|
||||
update_areas()
|
||||
for(var/V in player_list)
|
||||
var/mob/M = V
|
||||
if(is_on_level_name(M,target_level))
|
||||
if(is_on_level_name(M,target_z))
|
||||
if(weather_message)
|
||||
to_chat(M, weather_message)
|
||||
if(weather_sound)
|
||||
@@ -87,7 +94,7 @@
|
||||
update_areas()
|
||||
for(var/V in player_list)
|
||||
var/mob/M = V
|
||||
if(is_on_level_name(M,target_level))
|
||||
if(is_on_level_name(M,target_z))
|
||||
if(end_message)
|
||||
to_chat(M, end_message)
|
||||
if(end_sound)
|
||||
@@ -102,7 +109,7 @@
|
||||
update_areas()
|
||||
|
||||
/datum/weather/proc/can_impact(mob/living/L) //Can this weather impact a mob?
|
||||
if(!is_on_level_name(L,target_level))
|
||||
if(!is_on_level_name(L,target_z))
|
||||
return
|
||||
if(immunity_type in L.weather_immunities)
|
||||
return
|
||||
@@ -119,6 +126,7 @@
|
||||
N.layer = overlay_layer
|
||||
N.icon = 'icons/effects/weather_effects.dmi'
|
||||
N.invisibility = 0
|
||||
N.color = weather_color
|
||||
switch(stage)
|
||||
if(STARTUP_STAGE)
|
||||
N.icon_state = telegraph_overlay
|
||||
@@ -127,6 +135,7 @@
|
||||
if(WIND_DOWN_STAGE)
|
||||
N.icon_state = end_overlay
|
||||
if(END_STAGE)
|
||||
N.color = null
|
||||
N.icon_state = initial(N.icon_state)
|
||||
N.icon = 'icons/turf/areas.dmi'
|
||||
N.layer = 10 //Just default back to normal area stuff since I assume setting a var is faster than initial
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
end_duration = 0
|
||||
|
||||
area_type = /area
|
||||
target_level = MAIN_STATION
|
||||
target_z = MAIN_STATION
|
||||
|
||||
overlay_layer = 2 //Covers floors only
|
||||
immunity_type = "lava"
|
||||
@@ -50,7 +50,7 @@
|
||||
end_duration = 0
|
||||
|
||||
area_type = /area
|
||||
target_level = MAIN_STATION
|
||||
target_z = MAIN_STATION
|
||||
|
||||
/datum/weather/advanced_darkness/update_areas()
|
||||
for(var/V in impacted_areas)
|
||||
@@ -87,7 +87,7 @@
|
||||
end_overlay = "light_ash"
|
||||
|
||||
area_type = /area/mine/dangerous
|
||||
target_level = MINING
|
||||
target_z = MINING
|
||||
|
||||
immunity_type = "ash"
|
||||
|
||||
|
||||
@@ -58,6 +58,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
|
||||
var/tele_proof = 0
|
||||
var/no_teleportlocs = 0
|
||||
|
||||
var/outdoors = 0 //For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room)
|
||||
|
||||
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
|
||||
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
|
||||
@@ -121,6 +123,7 @@ var/list/ghostteleportlocs = list()
|
||||
power_light = 0
|
||||
power_equip = 0
|
||||
power_environ = 0
|
||||
outdoors = 1
|
||||
ambientsounds = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/traitor.ogg')
|
||||
|
||||
/area/space/atmosalert()
|
||||
@@ -551,6 +554,7 @@ var/list/ghostteleportlocs = list()
|
||||
name = "\improper Asteroid - Underground"
|
||||
icon_state = "cave"
|
||||
requires_power = 0
|
||||
outdoors = 1
|
||||
|
||||
/area/asteroid/artifactroom
|
||||
name = "\improper Asteroid - Artifact"
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
var/list/original_atom
|
||||
|
||||
var/allow_spin = 1 //Set this to 1 for a _target_ that is being thrown at; if an atom has this set to 1 then atoms thrown AT it will not spin; currently used for the singularity. -Fox
|
||||
|
||||
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
|
||||
|
||||
/atom/proc/onCentcom()
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -464,3 +466,7 @@
|
||||
|
||||
/atom/proc/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
|
||||
return
|
||||
|
||||
/atom/on_varedit(modified_var)
|
||||
if(!Debug2)
|
||||
admin_spawned = TRUE
|
||||
@@ -225,6 +225,10 @@
|
||||
if(isobj(A))
|
||||
if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement
|
||||
src.throw_impact(A,speed)
|
||||
|
||||
/atom/movable/proc/throw_at_fast(atom/target, range, speed, thrower, no_spin)
|
||||
set waitfor = 0
|
||||
throw_at(target, range, speed, thrower, no_spin)
|
||||
|
||||
/atom/movable/proc/throw_at(atom/target, range, speed, thrower, no_spin)
|
||||
if(!target || !src || (flags & NODROP))
|
||||
|
||||
@@ -259,8 +259,8 @@
|
||||
|
||||
action_icon_state = "genetic_incendiary"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets)
|
||||
var/mob/living/carbon/L = usr
|
||||
/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets,mob/living/user = usr)
|
||||
var/mob/living/carbon/L = user
|
||||
L.adjust_fire_stacks(0.5)
|
||||
L.visible_message("<span class='danger'>[L.name]</b> suddenly bursts into flames!</span>")
|
||||
L.IgniteMob()
|
||||
|
||||
@@ -28,17 +28,17 @@
|
||||
|
||||
action_icon_state = "genetic_morph"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/morph/cast(list/targets)
|
||||
if(!ishuman(usr)) return
|
||||
/obj/effect/proc_holder/spell/targeted/morph/cast(list/targets, mob/user = usr)
|
||||
if(!ishuman(user)) return
|
||||
|
||||
if(istype(usr.loc,/mob/))
|
||||
to_chat(usr, "<span class='warning'>You can't change your appearance right now!</span>")
|
||||
if(istype(user.loc,/mob/))
|
||||
to_chat(user, "<span class='warning'>You can't change your appearance right now!</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/M=usr
|
||||
var/mob/living/carbon/human/M = user
|
||||
var/obj/item/organ/external/head/head_organ = M.get_organ("head")
|
||||
var/obj/item/organ/internal/eyes/eyes_organ = M.get_int_organ(/obj/item/organ/internal/eyes)
|
||||
|
||||
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
|
||||
var/new_gender = alert(user, "Please select gender.", "Character Generation", "Male", "Female")
|
||||
if(new_gender)
|
||||
if(new_gender == "Male")
|
||||
M.change_gender(MALE)
|
||||
@@ -219,7 +219,7 @@
|
||||
validtargets += M
|
||||
|
||||
if(!validtargets.len)
|
||||
to_chat(usr, "<span class='warning'>There are no valid targets!</span>")
|
||||
to_chat(user, "<span class='warning'>There are no valid targets!</span>")
|
||||
start_recharge()
|
||||
return
|
||||
|
||||
@@ -229,24 +229,24 @@
|
||||
revert_cast(user)
|
||||
return
|
||||
|
||||
perform(targets)
|
||||
perform(targets, user = user)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/remotetalk/cast(list/targets)
|
||||
if(!ishuman(usr)) return
|
||||
/obj/effect/proc_holder/spell/targeted/remotetalk/cast(list/targets, mob/user = usr)
|
||||
if(!ishuman(user)) return
|
||||
var/say = input("What do you wish to say") as text|null
|
||||
if(!say)
|
||||
return
|
||||
say = strip_html(say)
|
||||
|
||||
for(var/mob/living/target in targets)
|
||||
log_say("Project Mind: [key_name(usr)]->[key_name(target)]: [say]")
|
||||
log_say("Project Mind: [key_name(user)]->[key_name(target)]: [say]")
|
||||
if(REMOTE_TALK in target.mutations)
|
||||
target.show_message("<span class='notice'>You hear [usr.real_name]'s voice: [say]</span>")
|
||||
target.show_message("<span class='notice'>You hear [user.real_name]'s voice: [say]</span>")
|
||||
else
|
||||
target.show_message("<span class='notice'>You hear a voice that seems to echo around the room: [say]</span>")
|
||||
usr.show_message("<span class='notice'>You project your mind into [target.real_name]: [say]</span>")
|
||||
user.show_message("<span class='notice'>You project your mind into [target.real_name]: [say]</span>")
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
G.show_message("<i>Telepathic message from <b>[usr]</b> ([ghost_follow_link(usr, ghost=G)]) to <b>[target]</b> ([ghost_follow_link(target, ghost=G)]): [say]</i>")
|
||||
G.show_message("<i>Telepathic message from <b>[user]</b> ([ghost_follow_link(user, ghost=G)]) to <b>[target]</b> ([ghost_follow_link(target, ghost=G)]): [say]</i>")
|
||||
|
||||
/datum/dna/gene/basic/grant_spell/remoteview
|
||||
name="Remote Viewing"
|
||||
@@ -283,39 +283,39 @@
|
||||
if(REMOTE_VIEW in M.mutations)
|
||||
remoteviewers += M
|
||||
if(!remoteviewers.len || remoteviewers.len == 1)
|
||||
to_chat(usr, "<span class='warning'>No valid targets with remote view were found!</span>")
|
||||
to_chat(user, "<span class='warning'>No valid targets with remote view were found!</span>")
|
||||
start_recharge()
|
||||
return
|
||||
targets += input("Choose the target to spy on.", "Targeting") as mob in remoteviewers
|
||||
|
||||
perform(targets)
|
||||
perform(targets, user = user)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/remoteview/cast(list/targets)
|
||||
var/mob/living/carbon/human/user
|
||||
if(ishuman(usr))
|
||||
user = usr
|
||||
/obj/effect/proc_holder/spell/targeted/remoteview/cast(list/targets, mob/user = usr)
|
||||
var/mob/living/carbon/human/H
|
||||
if(ishuman(user))
|
||||
H = user
|
||||
else
|
||||
return
|
||||
|
||||
var/mob/target
|
||||
|
||||
if(istype(user.l_hand, /obj/item/tk_grab) || istype(user.r_hand, /obj/item/tk_grab/))
|
||||
to_chat(user, "<span class='warning'>Your mind is too busy with that telekinetic grab.</span>")
|
||||
user.remoteview_target = null
|
||||
user.reset_perspective(0)
|
||||
if(istype(H.l_hand, /obj/item/tk_grab) || istype(H.r_hand, /obj/item/tk_grab/))
|
||||
to_chat(H, "<span class='warning'>Your mind is too busy with that telekinetic grab.</span>")
|
||||
H.remoteview_target = null
|
||||
H.reset_perspective(0)
|
||||
return
|
||||
|
||||
if(user.client.eye != user.client.mob)
|
||||
user.remoteview_target = null
|
||||
user.reset_perspective(0)
|
||||
if(H.client.eye != user.client.mob)
|
||||
H.remoteview_target = null
|
||||
H.reset_perspective(0)
|
||||
return
|
||||
|
||||
for(var/mob/living/L in targets)
|
||||
target = L
|
||||
|
||||
if(target)
|
||||
user.remoteview_target = target
|
||||
user.reset_perspective(target)
|
||||
H.remoteview_target = target
|
||||
H.reset_perspective(target)
|
||||
else
|
||||
user.remoteview_target = null
|
||||
user.reset_perspective(0)
|
||||
H.remoteview_target = null
|
||||
H.reset_perspective(0)
|
||||
|
||||
@@ -58,7 +58,6 @@
|
||||
|
||||
// if(!traitors.len)
|
||||
// return 0
|
||||
..()
|
||||
return 1
|
||||
|
||||
|
||||
@@ -197,5 +196,3 @@
|
||||
//message_admins("New traitor roll failed. No new traitor.")
|
||||
//else
|
||||
//message_admins("Late Joiner does not have Be Syndicate")
|
||||
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
/obj/effect/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2, offspring)
|
||||
blob_cores += src
|
||||
processing_objects.Add(src)
|
||||
poi_list |= src
|
||||
adjustcolors(color) //so it atleast appears
|
||||
if(!overmind)
|
||||
create_overmind(new_overmind)
|
||||
@@ -41,6 +42,7 @@
|
||||
overmind.blob_core = null
|
||||
overmind = null
|
||||
processing_objects.Remove(src)
|
||||
poi_list.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
helptext = "Grants us thermal vision or flash protection. We will become a lot more vulnerable to flash-based devices while thermal vision is active."
|
||||
chemical_cost = 0
|
||||
dna_cost = 2 //Would be 1 without thermal vision
|
||||
var/active = 0 //Whether or not vision is enhanced
|
||||
|
||||
/obj/effect/proc_holder/changeling/augmented_eyesight/sting_action(mob/living/carbon/human/user)
|
||||
if(!istype(user))
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
dna_cost = 1
|
||||
req_human = 1
|
||||
var/stacks = 0 //Increments every 5 seconds; damage increases over time
|
||||
var/active = 0 //Whether or not you are a hedgehog
|
||||
var/enabled = 0 //Whether or not you are a hedgehog
|
||||
|
||||
/obj/effect/proc_holder/changeling/strained_muscles/sting_action(var/mob/living/carbon/user)
|
||||
active = !active
|
||||
if(active)
|
||||
enabled = !enabled
|
||||
if(enabled)
|
||||
to_chat(user, "<span class='notice'>Our muscles tense and strengthen.</span>")
|
||||
else
|
||||
user.status_flags &= ~GOTTAGOFAST
|
||||
@@ -23,10 +23,10 @@
|
||||
user.Weaken(3)
|
||||
user.emote("gasp")
|
||||
|
||||
while(active)
|
||||
while(enabled)
|
||||
user.status_flags |= GOTTAGOFAST
|
||||
if(user.stat || user.staminaloss >= 90)
|
||||
active = 0 //Let's use something exact instead of !active where we can.
|
||||
enabled = 0 //Let's use something exact instead of !enabled where we can.
|
||||
to_chat(user, "<span class='notice'>Our muscles relax without the energy to strengthen them.</span>")
|
||||
user.status_flags &= ~GOTTAGOFAST
|
||||
user.Weaken(2)
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
sleep(40)
|
||||
|
||||
while(!active) //Damage stacks decrease fairly rapidly while not in sanic mode
|
||||
while(!enabled) //Damage stacks decrease fairly rapidly while not in sanic mode
|
||||
if(stacks >= 1)
|
||||
stacks--
|
||||
sleep(20)
|
||||
|
||||
@@ -12,7 +12,11 @@
|
||||
return
|
||||
|
||||
/obj/effect/rune/proc/check_icon()
|
||||
icon = get_rune_cult(invocation)
|
||||
if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way
|
||||
var/bits = make_bit_triplet()
|
||||
icon = get_rune(bits)
|
||||
else
|
||||
icon = get_rune_cult(invocation)
|
||||
|
||||
/obj/item/weapon/tome
|
||||
name = "arcane tome"
|
||||
|
||||
@@ -153,6 +153,16 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
L.changeNext_move(CLICK_CD_MELEE)//THIS IS WHY WE CAN'T HAVE NICE THINGS
|
||||
do_invoke_glow()
|
||||
|
||||
/obj/effect/rune/proc/burn_invokers(var/list/mobstoburn)
|
||||
for(var/M in mobstoburn)
|
||||
var/mob/living/L = M
|
||||
to_chat(L, "<span class='cultlarge'><i>\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"</i></span>")
|
||||
if(L.reagents)
|
||||
L.reagents.add_reagent("hell_water", 10)
|
||||
L.Weaken(7)
|
||||
L.Stun(7)
|
||||
fail_invoke()
|
||||
|
||||
/obj/effect/rune/proc/do_invoke_glow()
|
||||
var/oldtransform = transform
|
||||
spawn(0) //animate is a delay, we want to avoid being delayed
|
||||
@@ -476,16 +486,13 @@ var/list/teleport_runes = list()
|
||||
return
|
||||
var/mob/living/user = invokers[1]
|
||||
var/datum/game_mode/cult/cult_mode = ticker.mode
|
||||
if(!(CULT_ELDERGOD in cult_mode.objectives))
|
||||
message_admins("[key_name_admin(user)] tried to summonn an eldritch horror when the objective was wrong")
|
||||
burn_invokers(invokers)
|
||||
log_game("Summon Nar-Sie rune failed - improper objective")
|
||||
if(!is_station_level(user.z))
|
||||
message_admins("[user.real_name]([user.ckey]) tried to summon an eldritch horror off station")
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
to_chat(L, "<span class='cultlarge'><i>\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"</i></span>")
|
||||
if(L.reagents)
|
||||
L.reagents.add_reagent("hell_water", 10)
|
||||
L.Weaken(7)
|
||||
L.Stun(7)
|
||||
fail_invoke()
|
||||
message_admins("[key_name_admin(user)] tried to summon an eldritch horror off station")
|
||||
burn_invokers(invokers)
|
||||
log_game("Summon Nar-Sie rune failed - off station Z level")
|
||||
return
|
||||
if(!cult_mode.eldergod)
|
||||
@@ -566,26 +573,12 @@ var/list/teleport_runes = list()
|
||||
var/datum/game_mode/cult/cult_mode = ticker.mode
|
||||
if(!(CULT_SLAUGHTER in cult_mode.objectives))
|
||||
message_admins("[usr.real_name]([user.ckey]) tried to summon demons when the objective was wrong")
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
to_chat(L, "<span class='cultlarge'><i>\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"</i></span>")
|
||||
if(L.reagents)
|
||||
L.reagents.add_reagent("hell_water", 10)
|
||||
L.Weaken(7)
|
||||
L.Stun(7)
|
||||
fail_invoke()
|
||||
burn_invokers(invokers)
|
||||
log_game("Summon Demons rune failed - improper objective")
|
||||
return
|
||||
if(!is_station_level(user.z))
|
||||
message_admins("[user.real_name]([user.ckey]) tried to summon demons off station")
|
||||
for(var/M in invokers)
|
||||
var/mob/living/L = M
|
||||
to_chat(L, "<span class='cultlarge'><i>\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"</i></span>")
|
||||
if(L.reagents)
|
||||
L.reagents.add_reagent("hell_water", 10)
|
||||
L.Weaken(7)
|
||||
L.Stun(7)
|
||||
fail_invoke()
|
||||
burn_invokers(invokers)
|
||||
log_game("Summon demons rune failed - off station Z level")
|
||||
return
|
||||
if(cult_mode.demons_summoned)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_state = "swarmer_unactivated"
|
||||
|
||||
/obj/item/unactivated_swarmer/New()
|
||||
notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "<a href=?src=[UID()];ghostjoin=1>(Click to enter)</a>", source = src, attack_not_jump = 1)
|
||||
notify_ghosts("An unactivated swarmer has been created in [get_area(src)]!", enter_link = "<a href=?src=[UID()];ghostjoin=1>(Click to enter)</a>", source = src, action = NOTIFY_ATTACK)
|
||||
..()
|
||||
|
||||
/obj/item/unactivated_swarmer/Topic(href, href_list)
|
||||
@@ -63,7 +63,7 @@
|
||||
mob_size = MOB_SIZE_TINY
|
||||
ventcrawler = 2
|
||||
ranged = 1
|
||||
ranged_cooldown_cap = 1
|
||||
ranged_cooldown_time = 20
|
||||
universal_speak = 0
|
||||
universal_understand = 0
|
||||
projectilesound = 'sound/weapons/taser2.ogg'
|
||||
|
||||
@@ -496,7 +496,7 @@
|
||||
melee_damage_upper = 10
|
||||
damage_transfer = 0.9
|
||||
projectiletype = /obj/item/projectile/guardian
|
||||
ranged_cooldown_cap = 1
|
||||
ranged_cooldown_time = 1
|
||||
projectilesound = 'sound/effects/hit_on_shattered_glass.ogg'
|
||||
ranged = 1
|
||||
rapid = 1
|
||||
|
||||
@@ -126,12 +126,12 @@
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
|
||||
for(var/mob/living/M in targets)
|
||||
spawn(0)
|
||||
var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "")
|
||||
var/msg = stripped_input(user, "What do you wish to tell [M]?", null, "")
|
||||
if(!msg)
|
||||
charge_counter = charge_max
|
||||
return
|
||||
log_say("RevenantTransmit: [key_name(user)]->[key_name(M)] : [msg]")
|
||||
to_chat(usr, "<span class='revennotice'><b>You transmit to [M]:</b> [msg]</span>")
|
||||
to_chat(user, "<span class='revennotice'><b>You transmit to [M]:</b> [msg]</span>")
|
||||
to_chat(M, "<span class='revennotice'><b>An alien voice resonates from all around...</b></span><i> [msg]</I>")
|
||||
|
||||
|
||||
|
||||
@@ -300,7 +300,7 @@ proc/issyndicate(mob/living/M as mob)
|
||||
|
||||
/datum/game_mode/nuclear/declare_completion()
|
||||
var/disk_rescued = 1
|
||||
for(var/obj/item/weapon/disk/nuclear/D in world)
|
||||
for(var/obj/item/weapon/disk/nuclear/D in poi_list)
|
||||
if(!D.onCentcom())
|
||||
disk_rescued = 0
|
||||
break
|
||||
|
||||
@@ -32,10 +32,12 @@ var/bomb_set
|
||||
r_code = "[rand(10000, 99999.0)]"//Creates a random code upon object spawn.
|
||||
wires = new/datum/wires/nuclearbomb(src)
|
||||
previous_level = get_security_level()
|
||||
poi_list |= src
|
||||
|
||||
/obj/machinery/nuclearbomb/Destroy()
|
||||
qdel(wires)
|
||||
wires = null
|
||||
poi_list.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/nuclearbomb/process()
|
||||
|
||||
@@ -97,6 +97,10 @@ Made by Xhuis
|
||||
shadow.special_role = SPECIAL_ROLE_SHADOWLING
|
||||
shadow.restricted_roles = restricted_jobs
|
||||
shadowlings--
|
||||
|
||||
var/thrall_scaling = round(num_players() / 3)
|
||||
required_thralls = Clamp(thrall_scaling, 15, 25)
|
||||
|
||||
..()
|
||||
return 1
|
||||
|
||||
@@ -150,7 +154,6 @@ Made by Xhuis
|
||||
update_shadow_icons_added(new_thrall_mind)
|
||||
new_thrall_mind.current.create_attack_log("<span class='danger'>Became a thrall</span>")
|
||||
new_thrall_mind.current.add_language("Shadowling Hivemind")
|
||||
new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_glare(null))
|
||||
new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk(null))
|
||||
new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall(null))
|
||||
to_chat(new_thrall_mind.current, "<span class='shadowling'><b>You see the truth. Reality has been torn away and you realize what a fool you've been.</b></span>")
|
||||
@@ -308,6 +311,7 @@ Made by Xhuis
|
||||
hot_env_multiplier = 1.5
|
||||
|
||||
silent_steps = 1
|
||||
grant_vision_toggle = 0
|
||||
|
||||
/datum/species/shadow/ling/handle_life(var/mob/living/carbon/human/H)
|
||||
if(!H.weakeyes)
|
||||
@@ -318,11 +322,13 @@ Made by Xhuis
|
||||
var/turf/T = H.loc
|
||||
light_amount = T.get_lumcount() * 10
|
||||
if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) //Can survive in very small light levels. Also doesn't take damage while incorporeal, for shadow walk purposes
|
||||
H.throw_alert("lightexposure", /obj/screen/alert/lightexposure)
|
||||
H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN)
|
||||
if(H.stat != DEAD)
|
||||
to_chat(H, "<span class='userdanger'>The light burns you!</span>")//Message spam to say "GET THE FUCK OUT"
|
||||
H << 'sound/weapons/sear.ogg'
|
||||
else if(light_amount < LIGHT_HEAL_THRESHOLD)
|
||||
H.clear_alert("lightexposure")
|
||||
H.heal_overall_damage(5, 5)
|
||||
H.adjustToxLoss(-5)
|
||||
H.adjustBrainLoss(-25) //Shad O. Ling gibbers, "CAN U BE MY THRALL?!!"
|
||||
@@ -354,8 +360,10 @@ Made by Xhuis
|
||||
var/turf/T = H.loc
|
||||
light_amount = T.get_lumcount() * 10
|
||||
if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move)
|
||||
H.throw_alert("lightexposure", /obj/screen/alert/lightexposure)
|
||||
H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN/2)
|
||||
else if(light_amount < LIGHT_HEAL_THRESHOLD)
|
||||
H.clear_alert("lightexposure")
|
||||
H.heal_overall_damage(2,2)
|
||||
H.adjustToxLoss(-5)
|
||||
H.adjustBrainLoss(-25)
|
||||
|
||||
@@ -21,67 +21,33 @@
|
||||
clothes_req = 0
|
||||
action_icon_state = "glare"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/carbon/human/target in targets)
|
||||
if(!ishuman(target))
|
||||
to_chat(usr, "<span class='warning'>You may only glare at humans!</span>")
|
||||
to_chat(user, "<span class='warning'>You may only glare at humans!</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!shadowling_check(usr))
|
||||
if(!shadowling_check(user))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(target.stat)
|
||||
to_chat(usr, "<span class='warning'>[target] must be conscious!</span>")
|
||||
to_chat(user, "<span class='warning'>[target] must be conscious!</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(is_shadow_or_thrall(target))
|
||||
to_chat(usr, "<span class='danger'>You don't see why you would want to paralyze an ally.</span>")
|
||||
to_chat(user, "<span class='danger'>You don't see why you would want to paralyze an ally.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
var/mob/living/carbon/human/M = target
|
||||
usr.visible_message("<span class='warning'><b>[usr]'s eyes flash a blinding red!</b></span>")
|
||||
user.visible_message("<span class='warning'><b>[user]'s eyes flash a blinding red!</b></span>")
|
||||
target.visible_message("<span class='danger'>[target] freezes in place, their eyes glazing over...</span>")
|
||||
if(in_range(target, usr))
|
||||
to_chat(target, "<span class='userdanger'>Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by their heavenly beauty...</span>")
|
||||
if(in_range(target, user))
|
||||
to_chat(target, "<span class='userdanger'>Your gaze is forcibly drawn into [user]'s eyes, and you are mesmerized by their heavenly beauty...</span>")
|
||||
else //Only alludes to the shadowling if the target is close by
|
||||
to_chat(target, "<span class='userdanger'>Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights...</span>")
|
||||
target.Stun(10)
|
||||
M.AdjustSilence(10)
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lesser_glare
|
||||
name = "Lesser Glare"
|
||||
desc = "Stuns and mutes a target for a short duration."
|
||||
panel = "Thrall Abilities"
|
||||
charge_max = 450
|
||||
clothes_req = 0
|
||||
action_icon_state = "glare"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lesser_glare/cast(list/targets)
|
||||
for(var/mob/living/carbon/human/target in targets)
|
||||
if(!ishuman(target) || !target)
|
||||
to_chat(usr, "<span class='warning'>You nay only glare at humans!</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(target.stat)
|
||||
to_chat(usr, "<span class='warning'>[target] must be conscious!</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(is_shadow_or_thrall(target))
|
||||
to_chat(usr, "<span class='warning'>You cannot glare at allies!</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
var/mob/living/carbon/human/M = target
|
||||
usr.visible_message("<span class='warning'><b>[usr]'s eyes flash a blinding red!</b></span>")
|
||||
target.visible_message("<span class='danger'>[target] freezes in place, their eyes glazing over...</span>")
|
||||
if(in_range(target, usr))
|
||||
to_chat(target, "<span class='userdanger'>Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights...</span>")
|
||||
else
|
||||
to_chat(target, "<span class='userdanger'>Red lights suddenly dance in your vision, and you are mesmerized by their heavenly beauty...</span>")
|
||||
target.Stun(3) //Roughly 30% as long as the normal one
|
||||
M.AdjustSilence(3)
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/veil
|
||||
name = "Veil"
|
||||
desc = "Extinguishes most nearby light sources."
|
||||
@@ -138,12 +104,12 @@
|
||||
if(F.light_range > 0)
|
||||
extinguishItem(F)
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets)
|
||||
if(!shadowling_check(usr))
|
||||
/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets, mob/user = usr)
|
||||
if(!shadowling_check(user))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
to_chat(usr, "<span class='shadowling'>You silently disable all nearby lights.</span>")
|
||||
for(var/obj/effect/glowshroom/G in orange(2, usr)) //Why the fuck was this in the loop below?
|
||||
to_chat(user, "<span class='shadowling'>You silently disable all nearby lights.</span>")
|
||||
for(var/obj/effect/glowshroom/G in orange(2, user)) //Why the fuck was this in the loop below?
|
||||
G.visible_message("<span class='warning'>\The [G] withers away!</span>")
|
||||
qdel(G)
|
||||
for(var/turf/T in targets)
|
||||
@@ -175,30 +141,30 @@
|
||||
include_user = 1
|
||||
action_icon_state = "shadow_walk"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shadow_walk/cast(list/targets)
|
||||
if(!shadowling_check(usr))
|
||||
/obj/effect/proc_holder/spell/targeted/shadow_walk/cast(list/targets, mob/user = usr)
|
||||
if(!shadowling_check(user))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/user in targets)
|
||||
for(var/mob/living/target in targets)
|
||||
playsound(user.loc, 'sound/effects/bamf.ogg', 50, 1)
|
||||
user.visible_message("<span class='warning'>[user] vanishes in a puff of black mist!</span>", "<span class='shadowling'>You enter the space between worlds as a passageway.</span>")
|
||||
user.SetStunned(0)
|
||||
user.SetWeakened(0)
|
||||
user.incorporeal_move = 1
|
||||
user.alpha = 0
|
||||
user.ExtinguishMob()
|
||||
var/turf/T = get_turf(user)
|
||||
user.forceMove(T) //to properly move the mob out of a potential container
|
||||
if(user.buckled)
|
||||
user.buckled.unbuckle_mob()
|
||||
if(user.pulledby)
|
||||
user.pulledby.stop_pulling()
|
||||
user.stop_pulling()
|
||||
target.visible_message("<span class='warning'>[target] vanishes in a puff of black mist!</span>", "<span class='shadowling'>You enter the space between worlds as a passageway.</span>")
|
||||
target.SetStunned(0)
|
||||
target.SetWeakened(0)
|
||||
target.incorporeal_move = 1
|
||||
target.alpha = 0
|
||||
target.ExtinguishMob()
|
||||
var/turf/T = get_turf(target)
|
||||
target.forceMove(T) //to properly move the mob out of a potential container
|
||||
if(target.buckled)
|
||||
target.buckled.unbuckle_mob()
|
||||
if(target.pulledby)
|
||||
target.pulledby.stop_pulling()
|
||||
target.stop_pulling()
|
||||
sleep(40) //4 seconds
|
||||
user.visible_message("<span class='warning'>[user] suddenly manifests!</span>", "<span class='shadowling'>The pressure becomes too much and you vacate the interdimensional darkness.</span>")
|
||||
user.incorporeal_move = 0
|
||||
user.alpha = 255
|
||||
user.forceMove(user.loc)
|
||||
target.visible_message("<span class='warning'>[target] suddenly manifests!</span>", "<span class='shadowling'>The pressure becomes too much and you vacate the interdimensional darkness.</span>")
|
||||
target.incorporeal_move = 0
|
||||
target.alpha = 255
|
||||
target.forceMove(user.loc)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk
|
||||
name = "Guise"
|
||||
@@ -210,13 +176,13 @@
|
||||
include_user = 1
|
||||
action_icon_state = "shadow_walk"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk/cast(list/targets)
|
||||
for(var/mob/living/user in targets)
|
||||
user.visible_message("<span class='warning'>[user] suddenly fades away!</span>", "<span class='shadowling'>You veil yourself in darkness, making you harder to see.</span>")
|
||||
user.alpha = 10
|
||||
/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/target in targets)
|
||||
target.visible_message("<span class='warning'>[target] suddenly fades away!</span>", "<span class='shadowling'>You veil yourself in darkness, making you harder to see.</span>")
|
||||
target.alpha = 10
|
||||
sleep(40)
|
||||
user.visible_message("<span class='warning'>[user] appears from nowhere!</span>", "<span class='shadowling'>Your shadowy guise slips away.</span>")
|
||||
user.alpha = initial(user.alpha)
|
||||
target.visible_message("<span class='warning'>[target] appears from nowhere!</span>", "<span class='shadowling'>Your shadowy guise slips away.</span>")
|
||||
target.alpha = initial(target.alpha)
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shadow_vision
|
||||
@@ -230,11 +196,11 @@
|
||||
var/datum/vision_override/vision_path = /datum/vision_override/nightvision
|
||||
action_icon_state = "darksight"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shadow_vision/cast(list/targets)
|
||||
for(var/mob/living/user in targets)
|
||||
if(!istype(user) || !ishuman(user))
|
||||
/obj/effect/proc_holder/spell/targeted/shadow_vision/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/target in targets)
|
||||
if(!istype(target) || !ishuman(target))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(!H.vision_type)
|
||||
to_chat(H, "<span class='notice'>You shift the nerves in your eyes, allowing you to see in the dark.</span>")
|
||||
H.vision_type = new vision_path
|
||||
@@ -256,17 +222,17 @@
|
||||
clothes_req = 0
|
||||
action_icon_state = "icy_veins"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets)
|
||||
if(!shadowling_check(usr))
|
||||
/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets, mob/user = usr)
|
||||
if(!shadowling_check(user))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
to_chat(usr, "<span class='shadowling'>You freeze the nearby air.</span>")
|
||||
playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1)
|
||||
to_chat(user, "<span class='shadowling'>You freeze the nearby air.</span>")
|
||||
playsound(user.loc, 'sound/effects/ghost2.ogg', 50, 1)
|
||||
|
||||
for(var/turf/T in targets)
|
||||
for(var/mob/living/carbon/M in T.contents)
|
||||
if(is_shadow_or_thrall(M))
|
||||
if(M == usr) //No message for the user, of course
|
||||
if(M == user) //No message for the user, of course
|
||||
continue
|
||||
else
|
||||
to_chat(M, "<span class='danger'>You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!</span>")
|
||||
@@ -290,80 +256,80 @@
|
||||
var/enthralling = 0
|
||||
action_icon_state = "enthrall"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets)
|
||||
var/mob/living/carbon/human/user = usr
|
||||
/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets, mob/user = usr)
|
||||
var/mob/living/carbon/human/ling = user
|
||||
listclearnulls(ticker.mode.shadowling_thralls)
|
||||
if(!(user.mind in ticker.mode.shadows))
|
||||
if(!(ling.mind in ticker.mode.shadows))
|
||||
return
|
||||
if(user.get_species() != "Shadowling")
|
||||
if(ling.get_species() != "Shadowling")
|
||||
if(ticker.mode.shadowling_thralls.len >= 5)
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/carbon/human/target in targets)
|
||||
if(!in_range(usr, target))
|
||||
to_chat(usr, "<span class='warning'>You need to be closer to enthrall [target].</span>")
|
||||
if(!in_range(user, target))
|
||||
to_chat(user, "<span class='warning'>You need to be closer to enthrall [target].</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!target.key || !target.mind)
|
||||
to_chat(usr, "<span class='warning'>The target has no mind.</span>")
|
||||
to_chat(user, "<span class='warning'>The target has no mind.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(target.stat)
|
||||
to_chat(usr, "<span class='warning'>The target must be conscious.</span>")
|
||||
to_chat(user, "<span class='warning'>The target must be conscious.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(is_shadow_or_thrall(target))
|
||||
to_chat(usr, "<span class='warning'>You can not enthrall allies.</span>")
|
||||
to_chat(user, "<span class='warning'>You can not enthrall allies.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!ishuman(target))
|
||||
to_chat(usr, "<span class='warning'>You can only enthrall humans.</span>")
|
||||
to_chat(user, "<span class='warning'>You can only enthrall humans.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(enthralling)
|
||||
to_chat(usr, "<span class='warning'>You are already enthralling!</span>")
|
||||
to_chat(user, "<span class='warning'>You are already enthralling!</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!target.client)
|
||||
to_chat(usr, "<span class='warning'>[target]'s mind is vacant of activity.</span>")
|
||||
to_chat(user, "<span class='warning'>[target]'s mind is vacant of activity.</span>")
|
||||
enthralling = 1
|
||||
to_chat(usr, "<span class='danger'>This target is valid. You begin the enthralling.</span>")
|
||||
to_chat(target, "<span class='userdanger'>[usr] stares at you. You feel your head begin to pulse.</span>")
|
||||
to_chat(user, "<span class='danger'>This target is valid. You begin the enthralling.</span>")
|
||||
to_chat(target, "<span class='userdanger'>[user] stares at you. You feel your head begin to pulse.</span>")
|
||||
|
||||
for(var/progress = 0, progress <= 3, progress++)
|
||||
switch(progress)
|
||||
if(1)
|
||||
to_chat(usr, "<span class='notice'>You place your hands to [target]'s head...</span>")
|
||||
usr.visible_message("<span class='warning'>[usr] places their hands onto the sides of [target]'s head!</span>")
|
||||
to_chat(user, "<span class='notice'>You place your hands to [target]'s head...</span>")
|
||||
user.visible_message("<span class='warning'>[user] places their hands onto the sides of [target]'s head!</span>")
|
||||
if(2)
|
||||
to_chat(usr, "<span class='notice'>You begin preparing [target]'s mind as a blank slate...</span>")
|
||||
usr.visible_message("<span class='warning'>[usr]'s palms flare a bright red against [target]'s temples!</span>")
|
||||
to_chat(user, "<span class='notice'>You begin preparing [target]'s mind as a blank slate...</span>")
|
||||
user.visible_message("<span class='warning'>[user]'s palms flare a bright red against [target]'s temples!</span>")
|
||||
to_chat(target, "<span class='danger'>A terrible red light floods your mind. You collapse as conscious thought is wiped away.</span>")
|
||||
target.Weaken(12)
|
||||
sleep(20)
|
||||
if(isloyal(target))
|
||||
to_chat(usr, "<span class='notice'>They have a mindshield implant. You begin to deactivate it - this will take some time.</span>")
|
||||
usr.visible_message("<span class='warning'>[usr] pauses, then dips their head in concentration!</span>")
|
||||
to_chat(user, "<span class='notice'>They have a mindshield implant. You begin to deactivate it - this will take some time.</span>")
|
||||
user.visible_message("<span class='warning'>[user] pauses, then dips their head in concentration!</span>")
|
||||
to_chat(target, "<span class='boldannounce'>Your mindshield implant becomes hot as it comes under attack!</span>")
|
||||
sleep(100) //10 seconds - not spawn() so the enthralling takes longer
|
||||
to_chat(usr, "<span class='notice'>The nanobots composing the mindshield implant have been rendered inert. Now to continue.</span>")
|
||||
usr.visible_message("<span class='warning'>[usr] relaxes again.</span>")
|
||||
to_chat(user, "<span class='notice'>The nanobots composing the mindshield implant have been rendered inert. Now to continue.</span>")
|
||||
user.visible_message("<span class='warning'>[user] relaxes again.</span>")
|
||||
for(var/obj/item/weapon/implant/loyalty/L in target)
|
||||
if(L && L.implanted)
|
||||
qdel(L)
|
||||
to_chat(target, "<span class='boldannounce'>Your mental protection implant unexpectedly falters, dims, dies.</span>")
|
||||
if(3)
|
||||
to_chat(usr, "<span class='notice'>You begin planting the tumor that will control the new thrall...</span>")
|
||||
usr.visible_message("<span class='warning'>A strange energy passes from [usr]'s hands into [target]'s head!</span>")
|
||||
to_chat(user, "<span class='notice'>You begin planting the tumor that will control the new thrall...</span>")
|
||||
user.visible_message("<span class='warning'>A strange energy passes from [user]'s hands into [target]'s head!</span>")
|
||||
to_chat(target, "<span class='boldannounce'>You feel your memories twisting, morphing. A sense of horror dominates your mind.</span>")
|
||||
if(!do_mob(usr, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a mindshield implant
|
||||
to_chat(usr, "<span class='warning'>The enthralling has been interrupted - your target's mind returns to its previous state.</span>")
|
||||
to_chat(target, "<span class='userdanger'>You wrest yourself away from [usr]'s hands and compose yourself</span>")
|
||||
if(!do_mob(user, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a mindshield implant
|
||||
to_chat(user, "<span class='warning'>The enthralling has been interrupted - your target's mind returns to its previous state.</span>")
|
||||
to_chat(target, "<span class='userdanger'>You wrest yourself away from [user]'s hands and compose yourself</span>")
|
||||
enthralling = 0
|
||||
return
|
||||
|
||||
enthralling = 0
|
||||
to_chat(usr, "<span class='shadowling'>You have enthralled <b>[target]</b>!</span>")
|
||||
to_chat(user, "<span class='shadowling'>You have enthralled <b>[target]</b>!</span>")
|
||||
target.visible_message("<span class='big'>[target] looks to have experienced a revelation!</span>", \
|
||||
"<span class='warning'>False faces all d<b>ark not real not real not--</b></span>")
|
||||
target.setOxyLoss(0) //In case the shadowling was choking them out
|
||||
@@ -380,18 +346,18 @@
|
||||
clothes_req = 0
|
||||
action_icon_state = "regen_armor"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets)
|
||||
if(!is_shadow(usr))
|
||||
to_chat(usr, "<span class='warning'>You must be a shadowling to do this!</span>")
|
||||
/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets, mob/user = usr)
|
||||
if(!is_shadow(user))
|
||||
to_chat(user, "<span class='warning'>You must be a shadowling to do this!</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/user in targets)
|
||||
if(!istype(user) || !ishuman(user))
|
||||
for(var/mob/living/target in targets)
|
||||
if(!istype(target) || !ishuman(target))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.visible_message("<span class='warning'>[H]'s skin suddenly bubbles and shifts around their body!</span>", \
|
||||
"<span class='shadowling'>You regenerate your protective armor and cleanse your form of defects.</span>")
|
||||
H.adjustCloneLoss(user.getCloneLoss())
|
||||
H.adjustCloneLoss(target.getCloneLoss())
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(H), slot_wear_suit)
|
||||
@@ -415,54 +381,54 @@
|
||||
var/reviveThrallAcquired
|
||||
action_icon_state = "collective_mind"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/collective_mind/cast(list/targets)
|
||||
if(!shadowling_check(usr))
|
||||
/obj/effect/proc_holder/spell/targeted/collective_mind/cast(list/targets, mob/user = usr)
|
||||
if(!shadowling_check(user))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/user in targets)
|
||||
for(var/mob/living/target in targets)
|
||||
var/thralls = 0
|
||||
var/victory_threshold = 15
|
||||
var/victory_threshold = ticker.mode.required_thralls
|
||||
var/mob/M
|
||||
|
||||
to_chat(user, "<span class='shadowling'><b>You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.</b></span>")
|
||||
to_chat(target, "<span class='shadowling'><b>You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.</b></span>")
|
||||
|
||||
for(M in living_mob_list)
|
||||
if(is_thrall(M))
|
||||
thralls++
|
||||
to_chat(M, "<span class='shadowling'>You feel hooks sink into your mind and pull.</span>")
|
||||
|
||||
if(!do_after(user, 30, target = user))
|
||||
to_chat(user, "<span class='warning'>Your concentration has been broken. The mental hooks you have sent out now retract into your mind.</span>")
|
||||
if(!do_after(target, 30, target = target))
|
||||
to_chat(target, "<span class='warning'>Your concentration has been broken. The mental hooks you have sent out now retract into your mind.</span>")
|
||||
return
|
||||
|
||||
if(thralls >= 3 && !screech_acquired)
|
||||
screech_acquired = 1
|
||||
to_chat(user, "<span class='shadowling'><i>The power of your thralls has granted you the <b>Sonic Screech</b> ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.</span>")
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null))
|
||||
to_chat(target, "<span class='shadowling'><i>The power of your thralls has granted you the <b>Sonic Screech</b> ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.</span>")
|
||||
target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null))
|
||||
|
||||
if(thralls >= 5 && !blind_smoke_acquired)
|
||||
blind_smoke_acquired = 1
|
||||
to_chat(user, "<span class='shadowling'><i>The power of your thralls has granted you the <b>Blinding Smoke</b> ability. \
|
||||
to_chat(target, "<span class='shadowling'><i>The power of your thralls has granted you the <b>Blinding Smoke</b> ability. \
|
||||
It will create a choking cloud that will blind any non-thralls who enter.</i></span>")
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null))
|
||||
target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null))
|
||||
|
||||
if(thralls >= 7 && !drainLifeAcquired)
|
||||
drainLifeAcquired = 1
|
||||
to_chat(user, "<span class='shadowling'><i>The power of your thralls has granted you the <b>Drain Life</b> ability. You can now drain the health of nearby humans to heal yourself.</i></span>")
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife(null))
|
||||
to_chat(target, "<span class='shadowling'><i>The power of your thralls has granted you the <b>Drain Life</b> ability. You can now drain the health of nearby humans to heal yourself.</i></span>")
|
||||
target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife(null))
|
||||
|
||||
if(thralls >= 9 && !reviveThrallAcquired)
|
||||
reviveThrallAcquired = 1
|
||||
to_chat(user, "<span class='shadowling'><i>The power of your thralls has granted you the <b>Black Recuperation</b> ability. \
|
||||
to_chat(target, "<span class='shadowling'><i>The power of your thralls has granted you the <b>Black Recuperation</b> ability. \
|
||||
This will, after a short time, bring a dead thrall completely back to life with no bodily defects.</i></span>")
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/reviveThrall(null))
|
||||
target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/reviveThrall(null))
|
||||
|
||||
if(thralls < victory_threshold)
|
||||
to_chat(user, "<span class='shadowling'>You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.</span>")
|
||||
to_chat(target, "<span class='shadowling'>You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.</span>")
|
||||
|
||||
else if(thralls >= victory_threshold)
|
||||
to_chat(usr, "<span class='shadowling'><b>You are now powerful enough to ascend. Use the Ascendance ability when you are ready. <i>This will kill all of your thralls.</i></span>")
|
||||
to_chat(usr, "<span class='shadowling'><b>You may find Ascendance in the Shadowling Evolution tab.</b></span>")
|
||||
to_chat(target, "<span class='shadowling'><b>You are now powerful enough to ascend. Use the Ascendance ability when you are ready. <i>This will kill all of your thralls.</i></span>")
|
||||
to_chat(target, "<span class='shadowling'><b>You may find Ascendance in the Shadowling Evolution tab.</b></span>")
|
||||
for(M in living_mob_list)
|
||||
if(is_shadow(M))
|
||||
var/obj/effect/proc_holder/spell/targeted/collective_mind/CM
|
||||
@@ -471,10 +437,10 @@
|
||||
qdel(CM)
|
||||
M.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch)
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_ascend(null))
|
||||
if(M == usr)
|
||||
if(M == user)
|
||||
to_chat(M, "<span class='shadowling'><i>You project this power to the rest of the shadowlings.</i></span>")
|
||||
else
|
||||
to_chat(M, "<span class='shadowling'><b>[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)</b></span>")//Tells all the other shadowlings
|
||||
to_chat(M, "<span class='shadowling'><b>[target.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)</b></span>")//Tells all the other shadowlings
|
||||
|
||||
|
||||
|
||||
@@ -489,15 +455,15 @@
|
||||
include_user = 1
|
||||
action_icon_state = "black_smoke"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/blindness_smoke/cast(list/targets) //Extremely hacky
|
||||
if(!shadowling_check(usr))
|
||||
/obj/effect/proc_holder/spell/targeted/blindness_smoke/cast(list/targets, mob/user = usr) //Extremely hacky
|
||||
if(!shadowling_check(user))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/user in targets)
|
||||
user.visible_message("<span class='warning'>[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!</span>")
|
||||
to_chat(user, "<span class='deadsay'>You regurgitate a vast cloud of blinding smoke.</span>")
|
||||
playsound(user, 'sound/effects/bamf.ogg', 50, 1)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(user.loc)
|
||||
for(var/mob/living/target in targets)
|
||||
target.visible_message("<span class='warning'>[target] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!</span>")
|
||||
to_chat(target, "<span class='deadsay'>You regurgitate a vast cloud of blinding smoke.</span>")
|
||||
playsound(target, 'sound/effects/bamf.ogg', 50, 1)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(target.loc)
|
||||
B.reagents.clear_reagents() //Just in case!
|
||||
B.icon_state = null //Invisible
|
||||
B.reagents.add_reagent("blindness_smoke", 10)
|
||||
@@ -539,17 +505,17 @@
|
||||
clothes_req = 0
|
||||
action_icon_state = "screech"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets)
|
||||
if(!shadowling_check(usr))
|
||||
/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets, mob/user = usr)
|
||||
if(!shadowling_check(user))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
usr.audible_message("<span class='warning'><b>[usr] lets out a horrible scream!</b></span>")
|
||||
playsound(usr.loc, 'sound/effects/screech.ogg', 100, 1)
|
||||
user.audible_message("<span class='warning'><b>[user] lets out a horrible scream!</b></span>")
|
||||
playsound(user.loc, 'sound/effects/screech.ogg', 100, 1)
|
||||
|
||||
for(var/turf/T in targets)
|
||||
for(var/mob/target in T.contents)
|
||||
if(is_shadow_or_thrall(target))
|
||||
if(target == usr) //No message for the user, of course
|
||||
if(target == user) //No message for the user, of course
|
||||
continue
|
||||
else
|
||||
continue
|
||||
@@ -583,10 +549,11 @@
|
||||
var/list/nearbyTargets
|
||||
action_icon_state = "drain_life"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/drainLife/cast(list/targets, var/mob/living/carbon/human/U = usr)
|
||||
if(!shadowling_check(usr))
|
||||
/obj/effect/proc_holder/spell/aoe_turf/drainLife/cast(list/targets, mob/user = usr)
|
||||
if(!shadowling_check(user))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
var/mob/living/carbon/human/U = usr
|
||||
targetsDrained = 0
|
||||
nearbyTargets = list()
|
||||
for(var/turf/T in targets)
|
||||
@@ -597,7 +564,7 @@
|
||||
nearbyTargets.Add(M)
|
||||
if(!targetsDrained)
|
||||
charge_counter = charge_max
|
||||
to_chat(usr, "<span class='warning'>There were no nearby humans for you to drain.</span>")
|
||||
to_chat(U, "<span class='warning'>There were no nearby humans for you to drain.</span>")
|
||||
return
|
||||
for(var/mob/living/carbon/M in nearbyTargets)
|
||||
U.heal_organ_damage(10, 10)
|
||||
@@ -608,8 +575,8 @@
|
||||
U.AdjustStunned(-1)
|
||||
M.adjustOxyLoss(20)
|
||||
M.adjustStaminaLoss(20)
|
||||
to_chat(M, "<span class='boldannounce'>You feel a wave of exhaustion and a curious draining sensation directed towards [usr]!</span>")
|
||||
to_chat(usr, "<span class='shadowling'>You draw life from those around you to heal your wounds.</span>")
|
||||
to_chat(M, "<span class='boldannounce'>You feel a wave of exhaustion and a curious draining sensation directed towards [U]!</span>")
|
||||
to_chat(U, "<span class='shadowling'>You draw life from those around you to heal your wounds.</span>")
|
||||
|
||||
|
||||
|
||||
@@ -623,24 +590,24 @@
|
||||
include_user = 0
|
||||
action_icon_state = "revive_thrall"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/reviveThrall/cast(list/targets)
|
||||
if(!shadowling_check(usr))
|
||||
/obj/effect/proc_holder/spell/targeted/reviveThrall/cast(list/targets, mob/user = usr)
|
||||
if(!shadowling_check(user))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/carbon/human/thrallToRevive in targets)
|
||||
var/choice = alert(usr,"Empower a living thrall or revive a dead one?",,"Empower","Revive","Cancel")
|
||||
var/choice = alert(user,"Empower a living thrall or revive a dead one?",,"Empower","Revive","Cancel")
|
||||
switch(choice)
|
||||
if("Empower")
|
||||
if(!is_thrall(thrallToRevive))
|
||||
to_chat(usr, "<span class='warning'>[thrallToRevive] is not a thrall.</span>")
|
||||
to_chat(user, "<span class='warning'>[thrallToRevive] is not a thrall.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(thrallToRevive.stat != CONSCIOUS)
|
||||
to_chat(usr, "<span class='warning'>[thrallToRevive] must be conscious to become empowered.</span>")
|
||||
to_chat(user, "<span class='warning'>[thrallToRevive] must be conscious to become empowered.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(thrallToRevive.get_species() == "Lesser Shadowling")
|
||||
to_chat(usr, "<span class='warning'>[thrallToRevive] is already empowered.</span>")
|
||||
to_chat(user, "<span class='warning'>[thrallToRevive] is already empowered.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
var/empowered_thralls = 0
|
||||
@@ -651,54 +618,53 @@
|
||||
if(H.get_species() == "Lesser Shadowling")
|
||||
empowered_thralls++
|
||||
if(empowered_thralls >= EMPOWERED_THRALL_LIMIT)
|
||||
to_chat(usr, "<span class='warning'>You cannot spare this much energy. There are too many empowered thralls.</span>")
|
||||
to_chat(user, "<span class='warning'>You cannot spare this much energy. There are too many empowered thralls.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
usr.visible_message("<span class='danger'>[usr] places their hands over [thrallToRevive]'s face, red light shining from beneath.</span>", \
|
||||
user.visible_message("<span class='danger'>[user] places their hands over [thrallToRevive]'s face, red light shining from beneath.</span>", \
|
||||
"<span class='shadowling'>You place your hands on [thrallToRevive]'s face and begin gathering energy...</span>")
|
||||
to_chat(thrallToRevive, "<span class='userdanger'>[usr] places their hands over your face. You feel energy gathering. Stand still...</span>")
|
||||
if(!do_mob(usr, thrallToRevive, 80))
|
||||
to_chat(usr, "<span class='warning'>Your concentration snaps. The flow of energy ebbs.</span>")
|
||||
to_chat(thrallToRevive, "<span class='userdanger'>[user] places their hands over your face. You feel energy gathering. Stand still...</span>")
|
||||
if(!do_mob(user, thrallToRevive, 80))
|
||||
to_chat(user, "<span class='warning'>Your concentration snaps. The flow of energy ebbs.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
to_chat(usr, "<span class='shadowling'><b><i>You release a massive surge of power into [thrallToRevive]!</b></i></span>")
|
||||
usr.visible_message("<span class='boldannounce'><i>Red lightning surges into [thrallToRevive]'s face!</i></span>")
|
||||
to_chat(user, "<span class='shadowling'><b><i>You release a massive surge of power into [thrallToRevive]!</b></i></span>")
|
||||
user.visible_message("<span class='boldannounce'><i>Red lightning surges into [thrallToRevive]'s face!</i></span>")
|
||||
playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)
|
||||
playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)
|
||||
usr.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
|
||||
user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
|
||||
thrallToRevive.Weaken(5)
|
||||
thrallToRevive.visible_message("<span class='warning'><b>[thrallToRevive] collapses, their skin and face distorting!</span>", \
|
||||
"<span class='userdanger'><i>AAAAAAAAAAAAAAAAAAAGH-</i></span>")
|
||||
sleep(20)
|
||||
thrallToRevive.visible_message("<span class='warning'>[thrallToRevive] slowly rises, no longer recognizable as human.</span>", \
|
||||
"<span class='shadowling'><b>You feel new power flow into you. You have been gifted by your masters. You now closely resemble them. You are empowered in \
|
||||
darkness but wither slowly in light. In addition, Lesser Glare and Guise have been upgraded into their true forms.</b></span>")
|
||||
darkness but wither slowly in light. In addition, you now have glare and true shadow walk.</b></span>")
|
||||
thrallToRevive.set_species("Lesser Shadowling")
|
||||
thrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/lesser_glare)
|
||||
thrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk)
|
||||
thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare(null))
|
||||
thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk(null))
|
||||
if("Revive")
|
||||
if(!is_thrall(thrallToRevive))
|
||||
to_chat(usr, "<span class='warning'>[thrallToRevive] is not a thrall.</span>")
|
||||
to_chat(user, "<span class='warning'>[thrallToRevive] is not a thrall.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(thrallToRevive.stat != DEAD)
|
||||
to_chat(usr, "<span class='warning'>[thrallToRevive] is not dead.</span>")
|
||||
to_chat(user, "<span class='warning'>[thrallToRevive] is not dead.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
usr.visible_message("<span class='danger'>[usr] kneels over [thrallToRevive], placing their hands on \his chest.</span>", \
|
||||
user.visible_message("<span class='danger'>[user] kneels over [thrallToRevive], placing their hands on \his chest.</span>", \
|
||||
"<span class='shadowling'>You crouch over the body of your thrall and begin gathering energy...</span>")
|
||||
thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive)
|
||||
if(!do_mob(usr, thrallToRevive, 30))
|
||||
to_chat(usr, "<span class='warning'>Your concentration snaps. The flow of energy ebbs.</span>")
|
||||
if(!do_mob(user, thrallToRevive, 30))
|
||||
to_chat(user, "<span class='warning'>Your concentration snaps. The flow of energy ebbs.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
to_chat(usr, "<span class='shadowling'><b><i>You release a massive surge of power into [thrallToRevive]!</b></i></span>")
|
||||
usr.visible_message("<span class='boldannounce'><i>Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest!</i></span>")
|
||||
to_chat(user, "<span class='shadowling'><b><i>You release a massive surge of power into [thrallToRevive]!</b></i></span>")
|
||||
user.visible_message("<span class='boldannounce'><i>Red lightning surges from [user]'s hands into [thrallToRevive]'s chest!</i></span>")
|
||||
playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)
|
||||
playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)
|
||||
usr.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
|
||||
user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
|
||||
sleep(10)
|
||||
if(thrallToRevive.revive())
|
||||
thrallToRevive.visible_message("<span class='boldannounce'>[thrallToRevive] heaves in breath, dim red light shining in their eyes.</span>", \
|
||||
@@ -719,8 +685,8 @@
|
||||
charge_max = 600
|
||||
action_icon_state = "extend_shuttle"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets)
|
||||
if(!shadowling_check(usr))
|
||||
/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets, mob/user = usr)
|
||||
if(!shadowling_check(user))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/carbon/human/target in targets)
|
||||
@@ -728,23 +694,23 @@
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!is_thrall(target))
|
||||
to_chat(usr, "<span class='warning'>[target] must be a thrall.</span>")
|
||||
to_chat(user, "<span class='warning'>[target] must be a thrall.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(shuttle_master.emergency.mode != SHUTTLE_CALL)
|
||||
to_chat(usr, "<span class='warning'>The shuttle must be inbound only to the station.</span>")
|
||||
to_chat(user, "<span class='warning'>The shuttle must be inbound only to the station.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
var/mob/living/carbon/human/M = target
|
||||
usr.visible_message("<span class='warning'>[usr]'s eyes flash a bright red!</span>", \
|
||||
user.visible_message("<span class='warning'>[user]'s eyes flash a bright red!</span>", \
|
||||
"<span class='notice'>You begin to draw [M]'s life force.</span>")
|
||||
M.visible_message("<span class='warning'>[M]'s face falls slack, their jaw slightly distending.</span>", \
|
||||
"<span class='boldannounce'>You are suddenly transported... far, far away...</span>")
|
||||
if(!do_after(usr, 50, target = M))
|
||||
if(!do_after(user, 50, target = M))
|
||||
to_chat(M, "<span class='warning'>You are snapped back to reality, your haze dissipating!</span>")
|
||||
to_chat(usr, "<span class='warning'>You have been interrupted. The draw has failed.</span>")
|
||||
to_chat(user, "<span class='warning'>You have been interrupted. The draw has failed.</span>")
|
||||
return
|
||||
to_chat(usr, "<span class='notice'>You project [M]'s life force toward the approaching shuttle, extending its arrival duration!</span>")
|
||||
to_chat(user, "<span class='notice'>You project [M]'s life force toward the approaching shuttle, extending its arrival duration!</span>")
|
||||
M.visible_message("<span class='warning'>[M]'s eyes suddenly flare red. They proceed to collapse on the floor, not breathing.</span>", \
|
||||
"<span class='warning'><b>...speeding by... ...pretty blue glow... ...touch it... ...no glow now... ...no light... ...nothing at all...</span>")
|
||||
M.death()
|
||||
@@ -754,7 +720,7 @@
|
||||
timer += more_minutes
|
||||
event_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 15 minutes..", "System Failure", 'sound/misc/notice1.ogg')
|
||||
shuttle_master.emergency.setTimer(timer)
|
||||
usr.mind.spell_list.Remove(src) //Can only be used once!
|
||||
user.mind.spell_list.Remove(src) //Can only be used once!
|
||||
qdel(src)
|
||||
|
||||
// ASCENDANT ABILITIES BEYOND THIS POINT //
|
||||
@@ -768,20 +734,20 @@
|
||||
clothes_req = 0
|
||||
action_icon_state = "annihilate"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets)
|
||||
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
|
||||
/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets, mob/user = usr)
|
||||
var/mob/living/simple_animal/ascendant_shadowling/SHA = user
|
||||
if(SHA.phasing)
|
||||
to_chat(usr, "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>")
|
||||
to_chat(user, "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
|
||||
playsound(usr.loc, 'sound/magic/Staff_Chaos.ogg', 100, 1)
|
||||
playsound(user.loc, 'sound/magic/Staff_Chaos.ogg', 100, 1)
|
||||
for(var/mob/living/boom in targets)
|
||||
if(is_shadow(boom)) //Used to not work on thralls. Now it does so you can PUNISH THEM LIKE THE WRATHFUL GOD YOU ARE.
|
||||
to_chat(usr, "<span class='warning'>Making an ally explode seems unwise.<span>")
|
||||
to_chat(user, "<span class='warning'>Making an ally explode seems unwise.<span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
usr.visible_message("<span class='danger'>[usr]'s markings flare as they gesture at [boom]!</span>", \
|
||||
user.visible_message("<span class='danger'>[user]'s markings flare as they gesture at [boom]!</span>", \
|
||||
"<span class='shadowling'>You direct a lance of telekinetic energy at [boom].</span>")
|
||||
sleep(4)
|
||||
if(iscarbon(boom))
|
||||
@@ -800,32 +766,32 @@
|
||||
clothes_req = 0
|
||||
action_icon_state = "enthrall"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets)
|
||||
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
|
||||
/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets, mob/user = usr)
|
||||
var/mob/living/simple_animal/ascendant_shadowling/SHA = user
|
||||
if(SHA.phasing)
|
||||
charge_counter = charge_max
|
||||
to_chat(usr, "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>")
|
||||
to_chat(user, "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>")
|
||||
return
|
||||
|
||||
for(var/mob/living/carbon/human/target in targets)
|
||||
if(is_shadow_or_thrall(target))
|
||||
to_chat(usr, "<span class='warning'>You cannot enthrall an ally.<span>")
|
||||
to_chat(user, "<span class='warning'>You cannot enthrall an ally.<span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!target.ckey || !target.mind)
|
||||
to_chat(usr, "<span class='warning'>The target has no mind.</span>")
|
||||
to_chat(user, "<span class='warning'>The target has no mind.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(target.stat)
|
||||
to_chat(usr, "<span class='warning'>The target must be conscious.</span>")
|
||||
to_chat(user, "<span class='warning'>The target must be conscious.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!ishuman(target))
|
||||
to_chat(usr, "<span class='warning'>You can only enthrall humans.</span>")
|
||||
to_chat(user, "<span class='warning'>You can only enthrall humans.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
|
||||
to_chat(usr, "<span class='shadowling'>You instantly rearrange <b>[target]</b>'s memories, hyptonitizing them into a thrall.</span>")
|
||||
to_chat(user, "<span class='shadowling'>You instantly rearrange <b>[target]</b>'s memories, hyptonitizing them into a thrall.</span>")
|
||||
to_chat(target, "<span class='userdanger'><font size=3>An agonizing spike of pain drives into your mind, and--</font></span>")
|
||||
ticker.mode.add_thrall(target.mind)
|
||||
target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL
|
||||
@@ -843,8 +809,8 @@
|
||||
clothes_req = 0
|
||||
action_icon_state = "shadow_walk"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift/cast(list/targets)
|
||||
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
|
||||
/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift/cast(list/targets, mob/user = usr)
|
||||
var/mob/living/simple_animal/ascendant_shadowling/SHA = user
|
||||
for(SHA in targets)
|
||||
SHA.phasing = !SHA.phasing
|
||||
if(SHA.phasing)
|
||||
@@ -869,16 +835,16 @@
|
||||
clothes_req = 0
|
||||
action_icon_state = "lightning_storm"
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets)
|
||||
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
|
||||
/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets, mob/user = usr)
|
||||
var/mob/living/simple_animal/ascendant_shadowling/SHA = user
|
||||
if(SHA.phasing)
|
||||
to_chat(usr, "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>")
|
||||
to_chat(user, "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>")
|
||||
charge_counter = charge_max
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'><b>A massive ball of lightning appears in [usr]'s hands and flares out!</b></span>", \
|
||||
user.visible_message("<span class='warning'><b>A massive ball of lightning appears in [user]'s hands and flares out!</b></span>", \
|
||||
"<span class='shadowling'>You conjure a ball of lightning and release it.</span>")
|
||||
playsound(usr.loc, 'sound/magic/lightningbolt.ogg', 100, 1)
|
||||
playsound(user.loc, 'sound/magic/lightningbolt.ogg', 100, 1)
|
||||
for(var/turf/T in targets)
|
||||
for(var/mob/living/carbon/human/target in T.contents)
|
||||
if(is_shadow_or_thrall(target))
|
||||
@@ -887,7 +853,7 @@
|
||||
playsound(target, 'sound/magic/LightningShock.ogg', 50, 1)
|
||||
target.Weaken(8)
|
||||
target.take_organ_damage(0,50)
|
||||
usr.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
|
||||
user.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit
|
||||
name = "Ascendant Broadcast"
|
||||
@@ -899,9 +865,9 @@
|
||||
include_user = 1
|
||||
action_icon_state = "transmit"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit/cast(list/targets)
|
||||
for(var/mob/living/user in targets)
|
||||
var/text = stripped_input(user, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "")
|
||||
/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/target in targets)
|
||||
var/text = stripped_input(target, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "")
|
||||
if(!text)
|
||||
return
|
||||
to_chat(world, "<font size=4><span class='shadowling'><b>\"[text]\"</font></span>")
|
||||
|
||||
@@ -10,11 +10,11 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
|
||||
include_user = 1
|
||||
action_icon_state = "hatch"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shadowling_hatch/cast(list/targets)
|
||||
if(usr.stat || !ishuman(usr) || !usr || !is_shadow(usr || isinspace(usr)))
|
||||
/obj/effect/proc_holder/spell/targeted/shadowling_hatch/cast(list/targets, mob/user = usr)
|
||||
if(user.stat || !ishuman(user) || !user || !is_shadow(user || isinspace(user)))
|
||||
return
|
||||
if(!isturf(usr.loc))
|
||||
to_chat(usr, "<span class='warning'>You can't hatch here!</span>")
|
||||
if(!isturf(user.loc))
|
||||
to_chat(user, "<span class='warning'>You can't hatch here!</span>")
|
||||
return
|
||||
for(var/mob/living/carbon/human/H in targets)
|
||||
var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No")
|
||||
@@ -33,8 +33,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
|
||||
|
||||
sleep(50)
|
||||
var/turf/simulated/floor/F
|
||||
var/turf/shadowturf = get_turf(usr)
|
||||
for(F in orange(1, usr))
|
||||
var/turf/shadowturf = get_turf(user)
|
||||
for(F in orange(1, user))
|
||||
new /obj/structure/alien/resin/wall/shadowling(F)
|
||||
for(var/obj/structure/alien/resin/wall/shadowling/R in shadowturf) //extremely hacky
|
||||
qdel(R)
|
||||
@@ -68,7 +68,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
|
||||
var/newNameId = pick(possibleShadowlingNames)
|
||||
possibleShadowlingNames.Remove(newNameId)
|
||||
H.real_name = newNameId
|
||||
H.name = usr.real_name
|
||||
H.name = user.real_name
|
||||
H.SetStunned(0)
|
||||
to_chat(H, "<i><b><font size=3>YOU LIVE!!!</i></b></font>")
|
||||
|
||||
@@ -83,13 +83,13 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
|
||||
H.socks = "None"
|
||||
H.faction |= "faithless"
|
||||
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(usr), slot_wear_suit)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(usr), slot_glasses)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(user), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(user), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(user), slot_wear_suit)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(user), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(user), slot_gloves)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(user), slot_wear_mask)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(user), slot_glasses)
|
||||
H.set_species("Shadowling") //can't be a shadowling without being a shadowling
|
||||
|
||||
H.mind.RemoveSpell(src)
|
||||
@@ -116,8 +116,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
|
||||
include_user = 1
|
||||
action_icon_state = "ascend"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shadowling_ascend/cast(list/targets)
|
||||
var/mob/living/carbon/human/H = usr
|
||||
/obj/effect/proc_holder/spell/targeted/shadowling_ascend/cast(list/targets, mob/user = usr)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!shadowling_check(H))
|
||||
return
|
||||
for(H in targets)
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
revert_cast(user)
|
||||
return
|
||||
|
||||
perform(list(T))
|
||||
perform(list(T), user = user)
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/self/choose_targets(mob/user = usr)
|
||||
perform(list(user))
|
||||
@@ -131,7 +131,7 @@
|
||||
revert_cast(user)
|
||||
return
|
||||
|
||||
perform(targets)
|
||||
perform(targets, user = user)
|
||||
|
||||
/datum/vampire_passive
|
||||
var/gain_desc
|
||||
@@ -150,14 +150,14 @@
|
||||
charge_max = 200
|
||||
stat_allowed = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/self/rejuvenate/cast()
|
||||
var/mob/living/U = usr
|
||||
/obj/effect/proc_holder/spell/vampire/self/rejuvenate/cast(list/targets, mob/user = usr)
|
||||
var/mob/living/U = user
|
||||
|
||||
usr.SetWeakened(0)
|
||||
usr.SetStunned(0)
|
||||
usr.SetParalysis(0)
|
||||
user.SetWeakened(0)
|
||||
user.SetStunned(0)
|
||||
user.SetParalysis(0)
|
||||
U.adjustStaminaLoss(-75)
|
||||
to_chat(usr, "<span class='notice'>You flush your system with clean blood and remove any incapacitating effects.</span>")
|
||||
to_chat(user, "<span class='notice'>You flush your system with clean blood and remove any incapacitating effects.</span>")
|
||||
spawn(1)
|
||||
if(usr.mind.vampire.get_ability(/datum/vampire_passive/regen))
|
||||
for(var/i = 1 to 5)
|
||||
@@ -173,15 +173,15 @@
|
||||
action_icon_state = "vampire_hypnotise"
|
||||
required_blood = 20
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/targetted/hypnotise/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/vampire/targetted/hypnotise/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/target in targets)
|
||||
usr.visible_message("<span class='warning'>[usr]'s eyes flash briefly as he stares into [target]'s eyes</span>")
|
||||
if(do_mob(usr, target, 50))
|
||||
user.visible_message("<span class='warning'>[user]'s eyes flash briefly as he stares into [target]'s eyes</span>")
|
||||
if(do_mob(user, target, 50))
|
||||
if(!affects(target))
|
||||
to_chat(usr, "<span class='warning'>Your piercing gaze fails to knock out [target].</span>")
|
||||
to_chat(target, "\blue [usr]'s feeble gaze is ineffective.")
|
||||
to_chat(user, "<span class='warning'>Your piercing gaze fails to knock out [target].</span>")
|
||||
to_chat(target, "\blue [user]'s feeble gaze is ineffective.")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Your piercing gaze knocks out [target].</span>")
|
||||
to_chat(user, "<span class='warning'>Your piercing gaze knocks out [target].</span>")
|
||||
to_chat(target, "<span class='warning'>You find yourself unable to move and barely able to speak.</span>")
|
||||
target.Weaken(10)
|
||||
target.Stun(10)
|
||||
@@ -197,12 +197,12 @@
|
||||
action_icon_state = "vampire_disease"
|
||||
required_blood = 100
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/targetted/disease/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/vampire/targetted/disease/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/carbon/target in targets)
|
||||
to_chat(usr, "<span class='warning'>You stealthily infect [target] with your diseased touch.</span>")
|
||||
target.help_shake_act(usr)
|
||||
to_chat(user, "<span class='warning'>You stealthily infect [target] with your diseased touch.</span>")
|
||||
target.help_shake_act(user)
|
||||
if(!affects(target))
|
||||
to_chat(usr, "<span class='warning'>They seem to be unaffected.</span>")
|
||||
to_chat(user, "<span class='warning'>They seem to be unaffected.</span>")
|
||||
continue
|
||||
var/datum/disease/D = new /datum/disease/vampire
|
||||
target.ForceContractDisease(D)
|
||||
@@ -214,10 +214,10 @@
|
||||
charge_max = 300
|
||||
stat_allowed = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/mob_aoe/glare/cast(list/targets)
|
||||
usr.visible_message("<span class='warning'><b>[usr]'s eyes emit a blinding flash!</span>")
|
||||
if(istype(usr:glasses, /obj/item/clothing/glasses/sunglasses/blindfold))
|
||||
to_chat(usr, "<span class='warning'>You're blindfolded!</span>")
|
||||
/obj/effect/proc_holder/spell/vampire/mob_aoe/glare/cast(list/targets, mob/user = usr)
|
||||
user.visible_message("<span class='warning'><b>[user]'s eyes emit a blinding flash!</span>")
|
||||
if(istype(user:glasses, /obj/item/clothing/glasses/sunglasses/blindfold))
|
||||
to_chat(user, "<span class='warning'>You're blindfolded!</span>")
|
||||
return
|
||||
for(var/mob/living/target in targets)
|
||||
if(!affects(target))
|
||||
@@ -225,7 +225,7 @@
|
||||
target.Stun(5)
|
||||
target.Weaken(5)
|
||||
target.stuttering = 20
|
||||
to_chat(target, "<span class='warning'>You are blinded by [usr]'s glare.</span>")
|
||||
to_chat(target, "<span class='warning'>You are blinded by [user]'s glare.</span>")
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/self/shapeshift
|
||||
name = "Shapeshift (50)"
|
||||
@@ -234,12 +234,12 @@
|
||||
action_icon_state = "genetic_poly"
|
||||
required_blood = 50
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/self/shapeshift/cast()
|
||||
usr.visible_message("<span class='warning'>[usr] transforms!</span>")
|
||||
usr.client.prefs.real_name = usr.generate_name()
|
||||
usr.client.prefs.random_character()
|
||||
usr.client.prefs.copy_to(usr)
|
||||
usr.regenerate_icons()
|
||||
/obj/effect/proc_holder/spell/vampire/self/shapeshift/cast(list/targets, mob/user = usr)
|
||||
user.visible_message("<span class='warning'>[user] transforms!</span>")
|
||||
user.client.prefs.real_name = user.generate_name()
|
||||
user.client.prefs.random_character()
|
||||
user.client.prefs.copy_to(user)
|
||||
user.regenerate_icons()
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/self/screech
|
||||
name = "Chiroptean Screech (30)"
|
||||
@@ -248,10 +248,10 @@
|
||||
action_icon_state = "vampire_screech"
|
||||
required_blood = 30
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/self/screech/cast()
|
||||
usr.visible_message("<span class='warning'>[usr] lets out an ear piercing shriek!</span>", "<span class='warning'>You let out a loud shriek.</span>", "<span class='warning'>You hear a loud painful shriek!</span>")
|
||||
/obj/effect/proc_holder/spell/vampire/self/screech/cast(list/targets, mob/user = usr)
|
||||
user.visible_message("<span class='warning'>[user] lets out an ear piercing shriek!</span>", "<span class='warning'>You let out a loud shriek.</span>", "<span class='warning'>You hear a loud painful shriek!</span>")
|
||||
for(var/mob/living/carbon/C in hearers(4))
|
||||
if(C == usr)
|
||||
if(C == user)
|
||||
continue
|
||||
if(ishuman(C) && (C:l_ear || C:r_ear) && istype((C:l_ear || C:r_ear), /obj/item/clothing/ears/earmuffs))
|
||||
continue
|
||||
@@ -265,7 +265,7 @@
|
||||
C.Jitter(150)
|
||||
for(var/obj/structure/window/W in view(4))
|
||||
W.destroy()
|
||||
playsound(usr.loc, 'sound/effects/creepyshriek.ogg', 100, 1)
|
||||
playsound(user.loc, 'sound/effects/creepyshriek.ogg', 100, 1)
|
||||
|
||||
|
||||
/proc/isvampirethrall(mob/living/M as mob)
|
||||
@@ -278,19 +278,19 @@
|
||||
action_icon_state = "vampire_enthrall"
|
||||
required_blood = 300
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/targetted/enthrall/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/vampire/targetted/enthrall/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/target in targets)
|
||||
usr.visible_message("<span class='warning'>[usr] bites [target]'s neck!</span>", "<span class='warning'>You bite [target]'s neck and begin the flow of power.</span>")
|
||||
user.visible_message("<span class='warning'>[user] bites [target]'s neck!</span>", "<span class='warning'>You bite [target]'s neck and begin the flow of power.</span>")
|
||||
to_chat(target, "<span class='warning'>You feel the tendrils of evil invade your mind.</span>")
|
||||
if(!ishuman(target))
|
||||
to_chat(usr, "<span class='warning'>You can only enthrall humans.</span>")
|
||||
to_chat(user, "<span class='warning'>You can only enthrall humans.</span>")
|
||||
break
|
||||
if(do_mob(usr, target, 50))
|
||||
if(can_enthrall(usr, target))
|
||||
handle_enthrall(usr, target)
|
||||
if(do_mob(user, target, 50))
|
||||
if(can_enthrall(user, target))
|
||||
handle_enthrall(user, target)
|
||||
else
|
||||
revert_cast(usr)
|
||||
to_chat(usr, "<span class='warning'>You or your target either moved or you dont have enough usable blood.</span>")
|
||||
revert_cast(user)
|
||||
to_chat(user, "<span class='warning'>You or your target either moved or you dont have enough usable blood.</span>")
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/targetted/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C)
|
||||
var/enthrall_safe = 0
|
||||
@@ -359,11 +359,11 @@
|
||||
return
|
||||
name = "[initial(name)] ([user.mind.vampire.iscloaking ? "Deactivate" : "Activate"])"
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/self/cloak/cast()
|
||||
var/datum/vampire/V = usr.mind.vampire
|
||||
/obj/effect/proc_holder/spell/vampire/self/cloak/cast(list/targets, mob/user = usr)
|
||||
var/datum/vampire/V = user.mind.vampire
|
||||
V.iscloaking = !V.iscloaking
|
||||
update_name()
|
||||
to_chat(usr, "<span class='notice'>You will now be [V.iscloaking ? "hidden" : "seen"] in darkness.</span>")
|
||||
to_chat(user, "<span class='notice'>You will now be [V.iscloaking ? "hidden" : "seen"] in darkness.</span>")
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/bats
|
||||
name = "Summon Bats (75)"
|
||||
@@ -387,11 +387,11 @@
|
||||
for(var/i = locs.len + 1 to num_bats)
|
||||
locs += user.loc
|
||||
|
||||
perform(locs)
|
||||
perform(locs, user = user)
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/bats/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/vampire/bats/cast(list/targets, mob/user = usr)
|
||||
for(var/T in targets)
|
||||
new /mob/living/simple_animal/hostile/scarybat(T, usr)
|
||||
new /mob/living/simple_animal/hostile/scarybat(T, user)
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/self/jaunt
|
||||
name = "Mist Form (30)"
|
||||
@@ -402,12 +402,12 @@
|
||||
required_blood = 30
|
||||
var/jaunt_duration = 50 //in deciseconds
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/self/jaunt/cast()
|
||||
if(usr.buckled)
|
||||
usr.buckled.unbuckle_mob()
|
||||
/obj/effect/proc_holder/spell/vampire/self/jaunt/cast(list/targets, mob/user = usr)
|
||||
if(user.buckled)
|
||||
user.buckled.unbuckle_mob()
|
||||
spawn(0)
|
||||
var/mob/living/U = usr
|
||||
var/originalloc = get_turf(usr.loc)
|
||||
var/mob/living/U = user
|
||||
var/originalloc = get_turf(user.loc)
|
||||
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt(originalloc)
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay(originalloc)
|
||||
animation.name = "water"
|
||||
@@ -418,34 +418,34 @@
|
||||
animation.layer = 5
|
||||
animation.master = holder
|
||||
U.ExtinguishMob()
|
||||
if(usr.buckled)
|
||||
usr.buckled.unbuckle_mob()
|
||||
if(user.buckled)
|
||||
user.buckled.unbuckle_mob()
|
||||
flick("liquify", animation)
|
||||
usr.forceMove(holder)
|
||||
usr.client.eye = holder
|
||||
user.forceMove(holder)
|
||||
user.client.eye = holder
|
||||
var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread()
|
||||
steam.set_up(10, 0, originalloc)
|
||||
steam.start()
|
||||
sleep(jaunt_duration)
|
||||
var/mobloc = get_turf(usr.loc)
|
||||
var/mobloc = get_turf(user.loc)
|
||||
if(get_area(mobloc) == /area/security/armoury/gamma)
|
||||
to_chat(usr, "A strange energy repels you!")
|
||||
to_chat(user, "A strange energy repels you!")
|
||||
mobloc = originalloc
|
||||
animation.loc = mobloc
|
||||
steam.location = mobloc
|
||||
steam.start()
|
||||
usr.canmove = 0
|
||||
user.canmove = 0
|
||||
sleep(20)
|
||||
flick("reappear",animation)
|
||||
sleep(5)
|
||||
if(!usr.Move(mobloc))
|
||||
if(!user.Move(mobloc))
|
||||
for(var/direction in list(1,2,4,8,5,6,9,10))
|
||||
var/turf/T = get_step(mobloc, direction)
|
||||
if(T)
|
||||
if(usr.Move(T))
|
||||
if(user.Move(T))
|
||||
break
|
||||
usr.canmove = 1
|
||||
usr.client.eye = usr
|
||||
user.canmove = 1
|
||||
user.client.eye = user
|
||||
qdel(animation)
|
||||
qdel(holder)
|
||||
|
||||
@@ -492,29 +492,29 @@
|
||||
to_chat(user, "\red You cannot find darkness to step to.")
|
||||
return
|
||||
|
||||
perform(turfs)
|
||||
perform(turfs, user = user)
|
||||
|
||||
/obj/effect/proc_holder/spell/vampire/shadowstep/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/vampire/shadowstep/cast(list/targets, mob/user = usr)
|
||||
if(usr.buckled)
|
||||
usr.buckled.unbuckle_mob()
|
||||
user.buckled.unbuckle_mob()
|
||||
spawn(0)
|
||||
var/turf/picked = pick(targets)
|
||||
|
||||
if(!picked || !isturf(picked))
|
||||
return
|
||||
var/mob/living/U = usr
|
||||
var/mob/living/U = user
|
||||
U.ExtinguishMob()
|
||||
if(usr.buckled)
|
||||
usr.buckled.unbuckle_mob()
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay(get_turf(usr))
|
||||
animation.name = usr.name
|
||||
if(user.buckled)
|
||||
user.buckled.unbuckle_mob()
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay(get_turf(user))
|
||||
animation.name = user.name
|
||||
animation.density = 0
|
||||
animation.anchored = 1
|
||||
animation.icon = usr.icon
|
||||
animation.icon = user.icon
|
||||
animation.alpha = 127
|
||||
animation.layer = 5
|
||||
//animation.master = src
|
||||
usr.forceMove(picked)
|
||||
user.forceMove(picked)
|
||||
spawn(10)
|
||||
qdel(animation)
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
switch(href_list["school"])
|
||||
if("destruction")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball(null))
|
||||
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
|
||||
if("bluespace")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
|
||||
|
||||
@@ -88,6 +88,8 @@
|
||||
new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(get_turf(H))
|
||||
if("medibeam")
|
||||
new /obj/item/weapon/gun/medbeam(get_turf(H))
|
||||
|
||||
playsound(get_turf(H), 'sound/magic/Summon_guns.ogg', 50, 1)
|
||||
else
|
||||
switch(randomizemagic)
|
||||
if("fireball")
|
||||
@@ -155,3 +157,5 @@
|
||||
if("necromantic")
|
||||
new /obj/item/device/necromantic_stone(get_turf(H))
|
||||
to_chat(H, "<span class='notice'>You suddenly feel lucky.</span>")
|
||||
|
||||
playsound(get_turf(H), 'sound/magic/Summon_Magic.ogg', 50, 1)
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
|
||||
/datum/spellbook_entry/fireball
|
||||
name = "Fireball"
|
||||
spell_type = /obj/effect/proc_holder/spell/dumbfire/fireball
|
||||
spell_type = /obj/effect/proc_holder/spell/fireball
|
||||
log_name = "FB"
|
||||
|
||||
/datum/spellbook_entry/magicm
|
||||
@@ -714,7 +714,7 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/fireball
|
||||
spell = /obj/effect/proc_holder/spell/dumbfire/fireball
|
||||
spell = /obj/effect/proc_holder/spell/fireball
|
||||
spellname = "fireball"
|
||||
icon_state ="bookfireball"
|
||||
desc = "This book feels warm to the touch."
|
||||
@@ -854,3 +854,9 @@
|
||||
spellname = "disintegrate"
|
||||
icon_state ="bookfireball"
|
||||
desc = "This book feels like it will rip stuff apart."
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/sacredflame
|
||||
spell = /obj/effect/proc_holder/spell/targeted/sacred_flame
|
||||
spellname = "sacred flame"
|
||||
icon_state ="booksacredflame"
|
||||
desc = "Become one with the flames that burn within... and invite others to do so as well."
|
||||
@@ -439,3 +439,5 @@ var/time_last_changed_position = 0
|
||||
name = "\improper CentComm identification computer"
|
||||
circuit = /obj/item/weapon/circuitboard/card/centcom
|
||||
req_access = list(access_cent_commander)
|
||||
change_position_cooldown = -1
|
||||
blacklisted = list()
|
||||
@@ -369,7 +369,7 @@ What a mess.*/
|
||||
var/counter = 1
|
||||
while(active2.fields[text("com_[]", counter)])
|
||||
counter++
|
||||
active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557<BR>[t1]")
|
||||
active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [worldtime2text()]<BR>[t1]")
|
||||
|
||||
if("Delete Record (ALL)")
|
||||
if(active1)
|
||||
|
||||
@@ -230,6 +230,7 @@ to destroy them and players will be able to make replacements.
|
||||
var/list/names_paths = list("Booze-O-Mat" = /obj/machinery/vending/boozeomat,
|
||||
"Solar's Best Hot Drinks" = /obj/machinery/vending/coffee,
|
||||
"Getmore Chocolate Corp" = /obj/machinery/vending/snack,
|
||||
"Mr. Chang" = /obj/machinery/vending/chinese,
|
||||
"Robust Softdrinks" = /obj/machinery/vending/cola,
|
||||
"ShadyCigs Deluxe" = /obj/machinery/vending/cigarette,
|
||||
"AutoDrobe" = /obj/machinery/vending/autodrobe,
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
var/health = 80 //the turret's health
|
||||
var/locked = 1 //if the turret's behaviour control access is locked
|
||||
var/controllock = 0 //if the turret responds to control panels
|
||||
|
||||
|
||||
var/installation = /obj/item/weapon/gun/energy/gun/turret //the type of weapon installed
|
||||
var/gun_charge = 0 //the charge of the gun inserted
|
||||
var/projectile = null //holder for bullettype
|
||||
@@ -56,6 +56,13 @@
|
||||
|
||||
var/screen = 0 // Screen 0: main control, screen 1: access levels
|
||||
var/one_access = 0 // Determines if access control is set to req_one_access or req_access
|
||||
|
||||
var/syndicate = 0 //is the turret a syndicate turret?
|
||||
var/faction = ""
|
||||
var/emp_vulnerable = 1 // Can be empd
|
||||
var/scan_range = 7
|
||||
var/always_up = 0 //Will stay active
|
||||
var/has_cover = 1 //Hides the cover
|
||||
|
||||
/obj/machinery/porta_turret/centcom
|
||||
enabled = 0
|
||||
@@ -99,7 +106,7 @@
|
||||
one_access = 0
|
||||
|
||||
/obj/machinery/porta_turret/proc/setup()
|
||||
var/obj/item/weapon/gun/energy/E= new installation //All energy-based weapons are applicable
|
||||
var/obj/item/weapon/gun/energy/E = new installation //All energy-based weapons are applicable
|
||||
var/obj/item/ammo_casing/shottype = E.ammo_type[1]
|
||||
|
||||
projectile = shottype.projectile_type
|
||||
@@ -206,10 +213,10 @@ var/list/turret_icons
|
||||
data["screen"] = screen
|
||||
data["locked"] = locked
|
||||
data["enabled"] = enabled
|
||||
data["is_lethal"] = 1
|
||||
data["lethal_control"] = !syndicate ? 1 : 0
|
||||
data["lethal"] = lethal
|
||||
|
||||
if(data["access"])
|
||||
if(data["access"] && !syndicate)
|
||||
var/settings[0]
|
||||
settings[++settings.len] = list("category" = "Neutralize All Non-Synthetics", "setting" = "check_synth", "value" = check_synth)
|
||||
settings[++settings.len] = list("category" = "Check Weapon Authorization", "setting" = "check_weapons", "value" = check_weapons)
|
||||
@@ -219,18 +226,19 @@ var/list/turret_icons
|
||||
settings[++settings.len] = list("category" = "Check Misc. Lifeforms", "setting" = "check_anomalies", "value" = check_anomalies)
|
||||
data["settings"] = settings
|
||||
|
||||
data["one_access"] = one_access
|
||||
var/accesses[0]
|
||||
var/list/access_list = get_all_accesses()
|
||||
for(var/access in access_list)
|
||||
var/name = get_access_desc(access)
|
||||
var/active
|
||||
if(one_access)
|
||||
active = (access in req_one_access)
|
||||
else
|
||||
active = (access in req_access)
|
||||
accesses[++accesses.len] = list("name" = name, "active" = active, "number" = access)
|
||||
data["accesses"] = accesses
|
||||
if(!syndicate)
|
||||
data["one_access"] = one_access
|
||||
var/accesses[0]
|
||||
var/list/access_list = get_all_accesses()
|
||||
for(var/access in access_list)
|
||||
var/name = get_access_desc(access)
|
||||
var/active
|
||||
if(one_access)
|
||||
active = (access in req_one_access)
|
||||
else
|
||||
active = (access in req_access)
|
||||
accesses[++accesses.len] = list("name" = name, "active" = active, "number" = access)
|
||||
data["accesses"] = accesses
|
||||
return data
|
||||
|
||||
/obj/machinery/porta_turret/proc/HasController()
|
||||
@@ -259,6 +267,8 @@ var/list/turret_icons
|
||||
var/value = text2num(href_list["value"])
|
||||
if(href_list["command"] == "enable")
|
||||
enabled = value
|
||||
else if(syndicate)
|
||||
return 1
|
||||
else if(href_list["command"] == "screen")
|
||||
screen = value
|
||||
else if(href_list["command"] == "lethal")
|
||||
@@ -276,11 +286,12 @@ var/list/turret_icons
|
||||
else if(href_list["command"] == "check_anomalies")
|
||||
check_anomalies = value
|
||||
|
||||
if(href_list["one_access"])
|
||||
toggle_one_access(href_list["one_access"])
|
||||
if(!syndicate)
|
||||
if(href_list["one_access"])
|
||||
toggle_one_access(href_list["one_access"])
|
||||
|
||||
if(href_list["access"])
|
||||
toggle_access(href_list["access"])
|
||||
if(href_list["access"])
|
||||
toggle_access(href_list["access"])
|
||||
|
||||
return 1
|
||||
|
||||
@@ -311,7 +322,7 @@ var/list/turret_icons
|
||||
req_access += required
|
||||
|
||||
/obj/machinery/porta_turret/power_change()
|
||||
if(powered())
|
||||
if(powered() || !use_power)
|
||||
stat &= ~NOPOWER
|
||||
update_icon()
|
||||
else
|
||||
@@ -321,7 +332,7 @@ var/list/turret_icons
|
||||
|
||||
|
||||
/obj/machinery/porta_turret/attackby(obj/item/I, mob/user)
|
||||
if(stat & BROKEN)
|
||||
if((stat & BROKEN) && !syndicate)
|
||||
if(istype(I, /obj/item/weapon/crowbar))
|
||||
//If the turret is destroyed, you can remove it with a crowbar to
|
||||
//try and salvage its components
|
||||
@@ -438,13 +449,12 @@ var/list/turret_icons
|
||||
return
|
||||
|
||||
health -= force
|
||||
if(force > 5 && prob(45))
|
||||
if(force > 5 && prob(45) && spark_system)
|
||||
spark_system.start()
|
||||
if(health <= 0)
|
||||
die() //the death process :(
|
||||
|
||||
/obj/machinery/porta_turret/bullet_act(obj/item/projectile/Proj)
|
||||
|
||||
if(Proj.damage_type == STAMINA)
|
||||
return
|
||||
|
||||
@@ -461,7 +471,7 @@ var/list/turret_icons
|
||||
take_damage(Proj.damage)
|
||||
|
||||
/obj/machinery/porta_turret/emp_act(severity)
|
||||
if(enabled)
|
||||
if(enabled && emp_vulnerable)
|
||||
//if the turret is on, the EMP no matter how severe disables the turret for a while
|
||||
//and scrambles its settings, with a slight chance of having an emag effect
|
||||
check_arrest = prob(50)
|
||||
@@ -494,7 +504,8 @@ var/list/turret_icons
|
||||
/obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0
|
||||
health = 0
|
||||
stat |= BROKEN //enables the BROKEN bit
|
||||
spark_system.start() //creates some sparks because they look cool
|
||||
if(spark_system)
|
||||
spark_system.start() //creates some sparks because they look cool
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/porta_turret/process()
|
||||
@@ -503,35 +514,43 @@ var/list/turret_icons
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
//if the turret has no power or is broken, make the turret pop down if it hasn't already
|
||||
popDown()
|
||||
if(!always_up)
|
||||
//if the turret has no power or is broken, make the turret pop down if it hasn't already
|
||||
popDown()
|
||||
return
|
||||
|
||||
if(!enabled)
|
||||
//if the turret is off, make it pop down
|
||||
popDown()
|
||||
if(!always_up)
|
||||
//if the turret is off, make it pop down
|
||||
popDown()
|
||||
return
|
||||
|
||||
var/list/targets = list() //list of primary targets
|
||||
var/list/secondarytargets = list() //targets that are least important
|
||||
|
||||
for(var/obj/mecha/ME in view(7,src))
|
||||
for(var/obj/mecha/ME in view(scan_range,src))
|
||||
assess_and_assign(ME.occupant, targets, secondarytargets)
|
||||
|
||||
for(var/obj/spacepod/SP in view(7,src))
|
||||
for(var/obj/spacepod/SP in view(scan_range,src))
|
||||
assess_and_assign(SP.pilot, targets, secondarytargets)
|
||||
|
||||
for(var/obj/vehicle/T in view(7,src))
|
||||
for(var/obj/vehicle/T in view(scan_range,src))
|
||||
assess_and_assign(T.buckled_mob, targets, secondarytargets)
|
||||
|
||||
for(var/mob/living/C in view(7,src)) //loops through all living lifeforms in view
|
||||
for(var/mob/living/C in view(scan_range,src)) //loops through all living lifeforms in view
|
||||
assess_and_assign(C, targets, secondarytargets)
|
||||
|
||||
if(!tryToShootAt(targets))
|
||||
if(!tryToShootAt(secondarytargets)) // if no valid targets, go for secondary targets
|
||||
spawn()
|
||||
popDown() // no valid targets, close the cover
|
||||
if(!always_up)
|
||||
spawn()
|
||||
popDown() // no valid targets, close the cover
|
||||
|
||||
/obj/machinery/porta_turret/proc/in_faction(mob/living/target)
|
||||
if(!(faction in target.faction))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/porta_turret/proc/assess_and_assign(var/mob/living/L, var/list/targets, var/list/secondarytargets)
|
||||
switch(assess_living(L))
|
||||
if(TURRET_PRIORITY_TARGET)
|
||||
@@ -552,17 +571,20 @@ var/list/turret_icons
|
||||
if(!L)
|
||||
return TURRET_NOT_TARGET
|
||||
|
||||
if(!emagged && (issilicon(L) || isbot(L))) // Don't target silica
|
||||
if(!emagged && !syndicate && (issilicon(L) || isbot(L))) // Don't target silica
|
||||
return TURRET_NOT_TARGET
|
||||
|
||||
if(L.stat && !emagged) //if the perp is dead/dying, no need to bother really
|
||||
return TURRET_NOT_TARGET //move onto next potential victim!
|
||||
|
||||
if(get_dist(src, L) > 7) //if it's too far away, why bother?
|
||||
if(get_dist(src, L) > scan_range) //if it's too far away, why bother?
|
||||
return TURRET_NOT_TARGET
|
||||
|
||||
if(emagged) // If emagged not even the dead get a rest
|
||||
return L.stat ? TURRET_SECONDARY_TARGET : TURRET_PRIORITY_TARGET
|
||||
|
||||
if(in_faction(L))
|
||||
return TURRET_NOT_TARGET
|
||||
|
||||
if(lethal && locate(/mob/living/silicon/ai) in get_turf(L)) //don't accidentally kill the AI!
|
||||
return TURRET_NOT_TARGET
|
||||
@@ -648,18 +670,19 @@ var/list/turret_icons
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/porta_turret/proc/set_raised_raising(var/raised, var/raising)
|
||||
src.raised = raised
|
||||
src.raising = raising
|
||||
density = raised || raising
|
||||
/obj/machinery/porta_turret/proc/set_raised_raising(var/is_raised, var/is_raising)
|
||||
raised = is_raised
|
||||
raising = is_raising
|
||||
density = is_raised || is_raising
|
||||
|
||||
/obj/machinery/porta_turret/proc/target(var/mob/living/target)
|
||||
if(disabled)
|
||||
return
|
||||
if(target)
|
||||
last_target = target
|
||||
spawn()
|
||||
popUp() //pop the turret up if it's not already up.
|
||||
if(has_cover)
|
||||
spawn()
|
||||
popUp() //pop the turret up if it's not already up.
|
||||
dir = get_dir(src, target) //even if you can't shoot, follow the target
|
||||
spawn()
|
||||
shootAt(target)
|
||||
@@ -667,7 +690,7 @@ var/list/turret_icons
|
||||
return
|
||||
|
||||
/obj/machinery/porta_turret/proc/shootAt(var/mob/living/target)
|
||||
if(!raised) //the turret has to be raised in order to fire - makes sense, right?
|
||||
if(!raised && has_cover) //the turret has to be raised in order to fire - makes sense, right?
|
||||
return
|
||||
//any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power!
|
||||
if(!emagged) //if it hasn't been emagged, it has to obey a cooldown rate
|
||||
@@ -719,9 +742,9 @@ var/list/turret_icons
|
||||
/obj/machinery/porta_turret/proc/setState(var/datum/turret_checks/TC)
|
||||
if(controllock)
|
||||
return
|
||||
src.enabled = TC.enabled
|
||||
src.lethal = TC.lethal
|
||||
src.iconholder = TC.lethal
|
||||
enabled = TC.enabled
|
||||
lethal = TC.lethal
|
||||
iconholder = TC.lethal
|
||||
|
||||
check_synth = TC.check_synth
|
||||
check_access = TC.check_access
|
||||
@@ -731,7 +754,7 @@ var/list/turret_icons
|
||||
check_anomalies = TC.check_anomalies
|
||||
ailock = TC.ailock
|
||||
|
||||
src.power_change()
|
||||
power_change()
|
||||
|
||||
/*
|
||||
Portable turret constructions
|
||||
@@ -944,3 +967,87 @@ var/list/turret_icons
|
||||
|
||||
/atom/movable/porta_turret_cover
|
||||
icon = 'icons/obj/turrets.dmi'
|
||||
|
||||
// Syndicate turrets
|
||||
/obj/machinery/porta_turret/syndicate
|
||||
projectile = /obj/item/projectile/bullet
|
||||
eprojectile = /obj/item/projectile/bullet
|
||||
shot_sound = 'sound/weapons/Gunshot.ogg'
|
||||
eshot_sound = 'sound/weapons/Gunshot.ogg'
|
||||
|
||||
icon_state = "syndieturret0"
|
||||
var/icon_state_initial = "syndieturret0"
|
||||
var/icon_state_active = "syndieturret1"
|
||||
var/icon_state_destroyed = "syndieturret2"
|
||||
|
||||
syndicate = 1
|
||||
installation = null
|
||||
always_up = 1
|
||||
use_power = 0
|
||||
has_cover = 0
|
||||
raised = 1
|
||||
scan_range = 9
|
||||
|
||||
faction = "syndicate"
|
||||
emp_vulnerable = 0
|
||||
|
||||
lethal = 1
|
||||
check_arrest = 0
|
||||
check_records = 0
|
||||
check_weapons = 0
|
||||
check_access = 0
|
||||
check_anomalies = 1
|
||||
check_synth = 1
|
||||
ailock = 1
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/New()
|
||||
..()
|
||||
if(req_one_access && req_one_access.len)
|
||||
req_one_access.Cut()
|
||||
req_access = list(access_syndicate)
|
||||
one_access = 0
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/update_icon()
|
||||
if(stat & BROKEN)
|
||||
icon_state = icon_state_destroyed
|
||||
else if(enabled)
|
||||
icon_state = icon_state_active
|
||||
else
|
||||
icon_state = icon_state_initial
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/setup()
|
||||
return
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/assess_perp(mob/living/carbon/human/perp)
|
||||
return 10 //Syndicate turrets shoot everything not in their faction
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/pod
|
||||
health = 40
|
||||
projectile = /obj/item/projectile/bullet/weakbullet3
|
||||
eprojectile = /obj/item/projectile/bullet/weakbullet3
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/interior
|
||||
name = "machine gun turret (.45)"
|
||||
desc = "Syndicate interior defense turret chambered for .45 rounds. Designed to down intruders without damaging the hull."
|
||||
projectile = /obj/item/projectile/bullet/midbullet
|
||||
eprojectile = /obj/item/projectile/bullet/midbullet
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/exterior
|
||||
name = "machine gun turret (7.62)"
|
||||
desc = "Syndicate exterior defense turret chambered for 7.62 rounds. Designed to down intruders with heavy calliber bullets."
|
||||
projectile = /obj/item/projectile/bullet
|
||||
eprojectile = /obj/item/projectile/bullet/midbullet
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/grenade
|
||||
name = "mounted grenade launcher (40mm)"
|
||||
desc = "Syndicate 40mm grenade launcher defense turret. If you've had this much time to look at it, you're probably already dead."
|
||||
projectile = /obj/item/projectile/bullet/a40mm
|
||||
eprojectile = /obj/item/projectile/bullet/midbullet
|
||||
|
||||
/obj/machinery/porta_turret/syndicate/assault_pod
|
||||
name = "machine gun turret (4.6x30mm)"
|
||||
desc = "Syndicate exterior defense turret chambered for 4.6x30mm rounds. Designed to be fitted to assault pods, it uses low calliber bullets to save space."
|
||||
health = 100
|
||||
projectile = /obj/item/projectile/bullet/weakbullet3
|
||||
eprojectile = /obj/item/projectile/bullet/midbullet
|
||||
|
||||
|
||||
@@ -8,14 +8,16 @@
|
||||
|
||||
//Request Console Screens
|
||||
#define RCS_MAINMENU 0 // Main menu
|
||||
#define RCS_RQASSIST 1 // Request supplies
|
||||
#define RCS_RQSUPPLY 2 // Request assistance
|
||||
#define RCS_RQSUPPLY 1 // Request supplies
|
||||
#define RCS_RQASSIST 2 // Request assistance
|
||||
#define RCS_SENDINFO 3 // Relay information
|
||||
#define RCS_SENTPASS 4 // Message sent successfully
|
||||
#define RCS_SENTFAIL 5 // Message sent unsuccessfully
|
||||
#define RCS_VIEWMSGS 6 // View messages
|
||||
#define RCS_MESSAUTH 7 // Authentication before sending
|
||||
#define RCS_ANNOUNCE 8 // Send announcement
|
||||
#define RCS_SHIPPING 9 // Print Shipping Labels/Packages
|
||||
#define RCS_SHIP_LOG 10 // View Shipping Label Log
|
||||
|
||||
var/req_console_assistance = list()
|
||||
var/req_console_supplies = list()
|
||||
@@ -52,6 +54,10 @@ var/list/obj/machinery/requests_console/allConsoles = list()
|
||||
var/priority = -1 ; //Priority of the message being sent
|
||||
light_range = 0
|
||||
var/datum/announcement/announcement = new
|
||||
var/list/shipping_log = list()
|
||||
var/ship_tag_name = ""
|
||||
var/ship_tag_index = 0
|
||||
var/print_cooldown = 0 //cooldown on shipping label printer, stores the in-game time of when the printer will next be ready
|
||||
|
||||
/obj/machinery/requests_console/power_change()
|
||||
..()
|
||||
@@ -128,6 +134,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
|
||||
data["assist_dept"] = req_console_assistance
|
||||
data["supply_dept"] = req_console_supplies
|
||||
data["info_dept"] = req_console_information
|
||||
data["ship_dept"] = TAGGERLOCATIONS
|
||||
|
||||
data["message"] = message
|
||||
data["recipient"] = recipient
|
||||
@@ -135,6 +142,8 @@ var/list/obj/machinery/requests_console/allConsoles = list()
|
||||
data["msgStamped"] = msgStamped
|
||||
data["msgVerified"] = msgVerified
|
||||
data["announceAuth"] = announceAuth
|
||||
data["shipDest"] = ship_tag_name
|
||||
data["shipping_log"] = shipping_log
|
||||
|
||||
return data
|
||||
|
||||
@@ -182,7 +191,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
|
||||
screen = RCS_SENTPASS
|
||||
message_log += "<B>Message sent to [recipient]</B><BR>[message]"
|
||||
else
|
||||
audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4)
|
||||
audible_message(text("[bicon(src)] *The Requests Console beeps: '<b>NOTICE:</b> No server detected!'"),,4)
|
||||
|
||||
//Handle screen switching
|
||||
if(href_list["setScreen"])
|
||||
@@ -199,6 +208,26 @@ var/list/obj/machinery/requests_console/allConsoles = list()
|
||||
reset_message()
|
||||
screen = tempScreen
|
||||
|
||||
if(href_list["shipSelect"])
|
||||
ship_tag_name = href_list["shipSelect"]
|
||||
ship_tag_index = TAGGERLOCATIONS.Find(ship_tag_name)
|
||||
|
||||
//Handle Shipping Label Printing
|
||||
if(href_list["printLabel"])
|
||||
var/error_message = ""
|
||||
if(!ship_tag_index)
|
||||
error_message = "Please select a destination."
|
||||
else if(!msgVerified)
|
||||
error_message = "Please verify shipper ID."
|
||||
else if(world.time < print_cooldown)
|
||||
error_message = "Please allow the printer time to prepare the next shipping label."
|
||||
if(error_message)
|
||||
audible_message(text("[bicon(src)] *The Requests Console beeps: '<b>NOTICE:</b> [error_message]'"),,4)
|
||||
return
|
||||
print_label(ship_tag_name, ship_tag_index)
|
||||
shipping_log += "<B>Shipping Label printed for [ship_tag_name]</b><br>[msgVerified]"
|
||||
reset_message(1)
|
||||
|
||||
//Handle silencing the console
|
||||
if(href_list["toggleSilent"])
|
||||
silent = !silent
|
||||
@@ -245,6 +274,10 @@ var/list/obj/machinery/requests_console/allConsoles = list()
|
||||
reset_message()
|
||||
to_chat(user, "<span class='warning'>You are not authorized to send announcements.</span>")
|
||||
updateUsrDialog()
|
||||
if(screen == RCS_SHIPPING)
|
||||
var/obj/item/weapon/card/id/T = O
|
||||
msgVerified = text("<font color='green'><b>Sender verified as [T.registered_name] ([T.assignment])</b></font>")
|
||||
updateUsrDialog()
|
||||
if(istype(O, /obj/item/weapon/stamp))
|
||||
if(inoperable(MAINT)) return
|
||||
if(screen == RCS_MESSAUTH)
|
||||
@@ -261,6 +294,8 @@ var/list/obj/machinery/requests_console/allConsoles = list()
|
||||
msgStamped = ""
|
||||
announceAuth = 0
|
||||
announcement.announcer = ""
|
||||
ship_tag_name = ""
|
||||
ship_tag_index = 0
|
||||
if(mainmenu)
|
||||
screen = RCS_MAINMENU
|
||||
|
||||
@@ -286,3 +321,9 @@ var/list/obj/machinery/requests_console/allConsoles = list()
|
||||
else // Normal
|
||||
src.message_log += "<b>From:</b> [linkedSender]<BR>[message]"
|
||||
set_light(2)
|
||||
|
||||
/obj/machinery/requests_console/proc/print_label(tag_name, tag_index)
|
||||
var/obj/item/shippingPackage/sp = new /obj/item/shippingPackage(get_turf(src))
|
||||
sp.sortTag = tag_index
|
||||
sp.update_desc()
|
||||
print_cooldown = world.time + 600 //1 minute cooldown before you can print another label, but you can still configure the next one during this time
|
||||
|
||||
@@ -257,6 +257,7 @@
|
||||
var/obj/machinery/syndicatebomb/B = src.loc
|
||||
for(var/i = 0; i < amt_summon; i++)
|
||||
var/atom/movable/X = new summon_path
|
||||
X.admin_spawned = TRUE
|
||||
X.loc = get_turf(src)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
|
||||
@@ -25,6 +25,9 @@
|
||||
var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos)
|
||||
var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg
|
||||
var/ailock = 0 //Silicons cannot use this
|
||||
|
||||
var/syndicate = 0
|
||||
var/faction = "" // Turret controls can only access turrets that are in the same faction
|
||||
|
||||
req_access = list(access_ai_upload)
|
||||
|
||||
@@ -36,6 +39,23 @@
|
||||
enabled = 1
|
||||
lethal = 1
|
||||
icon_state = "control_kill"
|
||||
|
||||
/obj/machinery/turretid/syndicate
|
||||
enabled = 1
|
||||
lethal = 1
|
||||
icon_state = "control_kill"
|
||||
|
||||
lethal = 1
|
||||
check_arrest = 0
|
||||
check_records = 0
|
||||
check_weapons = 0
|
||||
check_access = 0
|
||||
check_anomalies = 1
|
||||
check_synth = 1
|
||||
ailock = 1
|
||||
|
||||
syndicate = 1
|
||||
faction = "syndicate"
|
||||
|
||||
/obj/machinery/turretid/Destroy()
|
||||
if(control_area)
|
||||
@@ -50,7 +70,7 @@
|
||||
control_area = get_area(src)
|
||||
else if(istext(control_area))
|
||||
for(var/area/A in world)
|
||||
if(A.name && A.name==control_area)
|
||||
if(A.name && A.name == control_area)
|
||||
control_area = A
|
||||
break
|
||||
|
||||
@@ -130,10 +150,10 @@
|
||||
data["access"] = !isLocked(user)
|
||||
data["locked"] = locked
|
||||
data["enabled"] = enabled
|
||||
data["is_lethal"] = 1
|
||||
data["lethal_control"] = !syndicate ? 1 : 0
|
||||
data["lethal"] = lethal
|
||||
|
||||
if(data["access"])
|
||||
if(data["access"] && !syndicate)
|
||||
var/settings[0]
|
||||
settings[++settings.len] = list("category" = "Neutralize All Non-Synthetics", "setting" = "check_synth", "value" = check_synth)
|
||||
settings[++settings.len] = list("category" = "Check Weapon Authorization", "setting" = "check_weapons", "value" = check_weapons)
|
||||
@@ -156,6 +176,8 @@
|
||||
var/value = text2num(href_list["value"])
|
||||
if(href_list["command"] == "enable")
|
||||
enabled = value
|
||||
else if(syndicate)
|
||||
return 1
|
||||
else if(href_list["command"] == "lethal")
|
||||
lethal = value
|
||||
else if(href_list["command"] == "check_synth")
|
||||
@@ -188,7 +210,8 @@
|
||||
|
||||
if(istype(control_area))
|
||||
for(var/obj/machinery/porta_turret/aTurret in control_area)
|
||||
aTurret.setState(TC)
|
||||
if(faction == aTurret.faction)
|
||||
aTurret.setState(TC)
|
||||
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -1,580 +0,0 @@
|
||||
/area/turret_protected
|
||||
name = "Turret Protected Area"
|
||||
var/list/turretTargets = list()
|
||||
|
||||
/area/turret_protected/proc/subjectDied(target)
|
||||
if( isliving(target) )
|
||||
if( !issilicon(target) )
|
||||
var/mob/living/L = target
|
||||
if( L.stat )
|
||||
if( L in turretTargets )
|
||||
src.Exited(L)
|
||||
|
||||
|
||||
/area/turret_protected/Entered(O)
|
||||
..()
|
||||
if( iscarbon(O) )
|
||||
turretTargets |= O
|
||||
else if( istype(O, /obj/mecha) )
|
||||
var/obj/mecha/Mech = O
|
||||
if( Mech.occupant )
|
||||
turretTargets |= Mech
|
||||
else if( istype(O, /obj/spacepod) )
|
||||
var/obj/spacepod/Pod = O
|
||||
if( Pod.pilot )
|
||||
turretTargets |= Pod
|
||||
else if(istype(O,/mob/living/simple_animal))
|
||||
turretTargets |= O
|
||||
return 1
|
||||
|
||||
/area/turret_protected/Exited(O)
|
||||
if( ismob(O) && !issilicon(O) )
|
||||
turretTargets -= O
|
||||
else if( istype(O, /obj/mecha) )
|
||||
turretTargets -= O
|
||||
else if( istype(O, /obj/spacepod) )
|
||||
turretTargets -= O
|
||||
..()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/turret
|
||||
name = "turret"
|
||||
icon = 'icons/obj/turrets.dmi'
|
||||
icon_state = "grey_target_prism"
|
||||
var/raised = 0
|
||||
var/enabled = 1
|
||||
anchored = 1
|
||||
layer = 3
|
||||
invisibility = INVISIBILITY_LEVEL_TWO
|
||||
density = 1
|
||||
var/lasers = 0
|
||||
var/lasertype = 1
|
||||
// 1 = lasers
|
||||
// 2 = cannons
|
||||
// 3 = pulse
|
||||
// 4 = change (HONK)
|
||||
// 5 = bluetag
|
||||
// 6 = redtag
|
||||
var/health = 80
|
||||
var/obj/machinery/turretcover/cover = null
|
||||
var/popping = 0
|
||||
var/wasvalid = 0
|
||||
var/lastfired = 0
|
||||
var/shot_delay = 30 //3 seconds between shots
|
||||
var/datum/effect/system/spark_spread/spark_system
|
||||
use_power = 1
|
||||
idle_power_usage = 50
|
||||
active_power_usage = 300
|
||||
// var/list/targets
|
||||
var/atom/movable/cur_target
|
||||
var/targeting_active = 0
|
||||
var/area/turret_protected/protected_area
|
||||
|
||||
|
||||
/obj/machinery/turret/New()
|
||||
spark_system = new /datum/effect/system/spark_spread
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
// targets = new
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/machinery/turretcover
|
||||
name = "pop-up turret cover"
|
||||
icon = 'icons/obj/turrets.dmi'
|
||||
icon_state = "turretCover"
|
||||
anchored = 1
|
||||
layer = 3.5
|
||||
density = 0
|
||||
var/obj/machinery/turret/host = null
|
||||
|
||||
/obj/machinery/turret/proc/isPopping()
|
||||
return (popping!=0)
|
||||
|
||||
/obj/machinery/turret/power_change()
|
||||
if(stat & BROKEN)
|
||||
icon_state = "grey_target_prism"
|
||||
else
|
||||
if( powered() )
|
||||
if(src.enabled)
|
||||
if(src.lasers)
|
||||
icon_state = "orange_target_prism"
|
||||
else
|
||||
icon_state = "target_prism"
|
||||
else
|
||||
icon_state = "grey_target_prism"
|
||||
stat &= ~NOPOWER
|
||||
else
|
||||
spawn(rand(0, 15))
|
||||
src.icon_state = "grey_target_prism"
|
||||
stat |= NOPOWER
|
||||
|
||||
/obj/machinery/turret/proc/setState(var/enabled, var/lethal)
|
||||
src.enabled = enabled
|
||||
src.lasers = lethal
|
||||
src.power_change()
|
||||
|
||||
|
||||
/obj/machinery/turret/proc/get_protected_area()
|
||||
var/area/turret_protected/TP = get_area(src)
|
||||
if(istype(TP))
|
||||
return TP
|
||||
return
|
||||
|
||||
/obj/machinery/turret/proc/check_target(var/atom/movable/T as mob|obj)
|
||||
if( T && T in protected_area.turretTargets )
|
||||
var/area/area_T = get_area(T)
|
||||
if( !area_T || (area_T.type != protected_area.type) )
|
||||
protected_area.Exited(T)
|
||||
return 0 //If the guy is somehow not in the turret's area (teleportation), get them out the damn list. --NEO
|
||||
if( iscarbon(T) )
|
||||
var/mob/living/carbon/MC = T
|
||||
if( !MC.stat )
|
||||
if( !MC.lying || lasers )
|
||||
return 1
|
||||
else if( istype(T, /obj/mecha) )
|
||||
var/obj/mecha/ME = T
|
||||
if( ME.occupant )
|
||||
return 1
|
||||
else if( istype(T, /obj/spacepod) )
|
||||
var/obj/spacepod/SP = T
|
||||
if( SP.pilot )
|
||||
return 1
|
||||
else if(istype(T,/mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/A = T
|
||||
if( !A.stat )
|
||||
if(lasers)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/turret/proc/get_new_target()
|
||||
var/list/new_targets = new
|
||||
var/new_target
|
||||
for(var/mob/living/carbon/M in protected_area.turretTargets)
|
||||
if(!M.stat)
|
||||
if(!M.lying || lasers)
|
||||
new_targets += M
|
||||
for(var/obj/mecha/M in protected_area.turretTargets)
|
||||
if(M.occupant)
|
||||
new_targets += M
|
||||
for(var/obj/spacepod/M in protected_area.turretTargets)
|
||||
if(M.pilot)
|
||||
new_targets += M.pilot
|
||||
for(var/mob/living/simple_animal/M in protected_area.turretTargets)
|
||||
if(!M.stat)
|
||||
new_targets += M
|
||||
if(new_targets.len)
|
||||
new_target = pick(new_targets)
|
||||
return new_target
|
||||
|
||||
|
||||
/obj/machinery/turret/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(src.cover==null)
|
||||
src.cover = new /obj/machinery/turretcover(src.loc)
|
||||
src.cover.host = src
|
||||
protected_area = get_protected_area()
|
||||
if(!enabled || !protected_area || protected_area.turretTargets.len<=0)
|
||||
if(!isDown() && !isPopping())
|
||||
popDown()
|
||||
return
|
||||
if(!check_target(cur_target)) //if current target fails target check
|
||||
cur_target = get_new_target() //get new target
|
||||
|
||||
if(cur_target) //if it's found, proceed
|
||||
// to_chat(world, "[cur_target]")
|
||||
if(!isPopping())
|
||||
if(isDown())
|
||||
popUp()
|
||||
use_power = 2
|
||||
else
|
||||
spawn()
|
||||
if(!targeting_active)
|
||||
targeting_active = 1
|
||||
target()
|
||||
targeting_active = 0
|
||||
|
||||
if(prob(15))
|
||||
if(prob(50))
|
||||
playsound(get_turf(src), 'sound/effects/turret/move1.wav', 60, 1)
|
||||
else
|
||||
playsound(get_turf(src), 'sound/effects/turret/move2.wav', 60, 1)
|
||||
|
||||
else if(!isPopping())//else, pop down
|
||||
if(!isDown())
|
||||
popDown()
|
||||
use_power = 1
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/turret/proc/target()
|
||||
while(src && enabled && !stat && check_target(cur_target))
|
||||
src.dir = get_dir(src, cur_target)
|
||||
shootAt(cur_target)
|
||||
sleep(shot_delay)
|
||||
return
|
||||
|
||||
/obj/machinery/turret/proc/shootAt(var/atom/movable/target)
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = get_turf(target)
|
||||
if(!T || !U)
|
||||
return
|
||||
var/obj/item/projectile/A
|
||||
if(src.lasers)
|
||||
switch(lasertype)
|
||||
if(1)
|
||||
A = new /obj/item/projectile/beam(loc)
|
||||
if(2)
|
||||
A = new /obj/item/projectile/beam/laser/heavylaser(loc)
|
||||
if(3)
|
||||
A = new /obj/item/projectile/beam/pulse(loc)
|
||||
if(4)
|
||||
A = new /obj/item/projectile/magic/change(loc)
|
||||
if(5)
|
||||
A = new /obj/item/projectile/beam/lasertag/bluetag(loc)
|
||||
if(6)
|
||||
A = new /obj/item/projectile/beam/lasertag/redtag(loc)
|
||||
use_power(500)
|
||||
else
|
||||
A = new /obj/item/projectile/energy/electrode( loc )
|
||||
use_power(200)
|
||||
if(src.lasers)
|
||||
playsound(get_turf(src), 'sound/weapons/Laser.ogg', 60, 1)
|
||||
else
|
||||
playsound(get_turf(src), 'sound/weapons/Taser.ogg', 60, 1)
|
||||
A.original = target
|
||||
A.current = T
|
||||
A.yo = U.y - T.y
|
||||
A.xo = U.x - T.x
|
||||
A.fire()
|
||||
return A
|
||||
|
||||
|
||||
/obj/machinery/turret/proc/isDown()
|
||||
return (invisibility!=0)
|
||||
|
||||
/obj/machinery/turret/proc/popUp()
|
||||
if((!isPopping()) || src.popping==-1)
|
||||
invisibility = 0
|
||||
popping = 1
|
||||
playsound(get_turf(src), 'sound/effects/turret/open.wav', 60, 1)
|
||||
if(src.cover!=null)
|
||||
flick("popup", src.cover)
|
||||
src.cover.icon_state = "openTurretCover"
|
||||
spawn(10)
|
||||
if(popping==1) popping = 0
|
||||
|
||||
/obj/machinery/turret/proc/popDown()
|
||||
if((!isPopping()) || src.popping==1)
|
||||
popping = -1
|
||||
playsound(get_turf(src), 'sound/effects/turret/open.wav', 60, 1)
|
||||
if(src.cover!=null)
|
||||
flick("popdown", src.cover)
|
||||
src.cover.icon_state = "turretCover"
|
||||
spawn(10)
|
||||
if(popping==-1)
|
||||
invisibility = INVISIBILITY_LEVEL_TWO
|
||||
popping = 0
|
||||
|
||||
/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj)
|
||||
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
src.health -= Proj.damage
|
||||
..()
|
||||
if(prob(45) && Proj.damage > 0) src.spark_system.start()
|
||||
qdel(Proj)
|
||||
if(src.health <= 0)
|
||||
src.die()
|
||||
return
|
||||
|
||||
/obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N
|
||||
..()
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
playsound(src.loc, 'sound/weapons/smash.ogg', 60, 1)
|
||||
src.spark_system.start()
|
||||
src.health -= W.force * 0.5
|
||||
if(src.health <= 0)
|
||||
src.die()
|
||||
return
|
||||
|
||||
/obj/machinery/turret/emp_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
enabled = 0
|
||||
lasers = 0
|
||||
power_change()
|
||||
..()
|
||||
|
||||
/obj/machinery/turret/ex_act(severity)
|
||||
if(severity < 3)
|
||||
src.die()
|
||||
|
||||
/obj/machinery/turret/proc/die()
|
||||
src.health = 0
|
||||
src.density = 0
|
||||
src.stat |= BROKEN
|
||||
src.icon_state = "destroyed_target_prism"
|
||||
if(cover!=null)
|
||||
qdel(cover)
|
||||
sleep(3)
|
||||
flick("explosion", src)
|
||||
spawn(13)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/machinery/turret/attack_animal(mob/living/simple_animal/M as mob)
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
M.do_attack_animation(src)
|
||||
if(M.melee_damage_upper == 0) return
|
||||
if(!(stat & BROKEN))
|
||||
visible_message("<span class='userdanger'>[M] [M.attacktext] [src]!</span>")
|
||||
add_logs(src, M, "attacked", admin=0, print_attack_log = 0)
|
||||
//src.create_attack_log("<font color='orange'>was attacked by [M.name] ([M.ckey])</font>")
|
||||
src.health -= M.melee_damage_upper
|
||||
if(src.health <= 0)
|
||||
src.die()
|
||||
else
|
||||
to_chat(M, "<span class='danger'>That object is useless to you.</span>")
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/machinery/turret/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
M.do_attack_animation(src)
|
||||
if(!(stat & BROKEN))
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
|
||||
visible_message("<span class='userdanger'>[M] has slashed at [src]!</span>")
|
||||
src.health -= 15
|
||||
if(src.health <= 0)
|
||||
src.die()
|
||||
else
|
||||
to_chat(M, "\green That object is useless to you.")
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/machinery/turretid/Topic(href, href_list, var/nowindow = 0)
|
||||
if(..(href, href_list))
|
||||
return 1
|
||||
if(src.locked)
|
||||
if(!istype(usr, /mob/living/silicon))
|
||||
to_chat(usr, "Control panel is locked!")
|
||||
return
|
||||
if(href_list["toggleOn"])
|
||||
src.enabled = !src.enabled
|
||||
src.updateTurrets()
|
||||
else if(href_list["toggleLethal"])
|
||||
src.lethal = !src.lethal
|
||||
src.updateTurrets()
|
||||
if(!nowindow)
|
||||
src.attack_hand(usr)
|
||||
|
||||
/obj/machinery/turretid/proc/update_icons()
|
||||
if(src.enabled)
|
||||
if(src.lethal)
|
||||
icon_state = "control_kill"
|
||||
else
|
||||
icon_state = "control_stun"
|
||||
else
|
||||
icon_state = "control_standby"
|
||||
//CODE FIXED BUT REMOVED
|
||||
// if(control_area) //USE: updates other controls in the area
|
||||
// for(var/obj/machinery/turretid/Turret_Control in world) //I'm not sure if this is what it was
|
||||
// if( Turret_Control.control_area != src.control_area ) continue //supposed to do. Or whether the person
|
||||
// Turret_Control.icon_state = icon_state //who coded it originally was just tired
|
||||
// Turret_Control.enabled = enabled //or something. I don't see any situation
|
||||
// Turret_Control.lethal = lethal //in which this would be used on the current map.
|
||||
//If he wants it back he can uncomment it
|
||||
|
||||
|
||||
/obj/machinery/gun_turret //related to turrets but work way differentely because of being mounted on a moving ship.
|
||||
name = "machine gun turret"
|
||||
desc = "Syndicate heavy defense turret. It really packs a bunch."
|
||||
density = 1
|
||||
anchored = 1
|
||||
var/state = 0 //Like stat on mobs, 0 is alive, 1 is damaged, 2 is dead
|
||||
var/faction = "syndicate"
|
||||
var/atom/cur_target = null
|
||||
var/scan_range = 9 //You will never see them coming
|
||||
var/health = 200 //Because it lacks a cover, and is mostly to keep people from touching the syndie shuttle.
|
||||
var/bullet_type = /obj/item/projectile/bullet
|
||||
var/firing_sound = 'sound/weapons/Gunshot3.ogg'
|
||||
var/base_icon = "syndieturret"
|
||||
icon = 'icons/obj/turrets.dmi'
|
||||
icon_state = "syndieturret0"
|
||||
|
||||
/obj/machinery/gun_turret/New()
|
||||
..()
|
||||
take_damage(0) //check your health
|
||||
|
||||
/obj/machinery/gun_turret/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
die()
|
||||
if(2)
|
||||
take_damage(100)
|
||||
if(3)
|
||||
take_damage(50)
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/emp_act() //Can't emp an mechanical turret.
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/update_icon()
|
||||
if(state > 2 || state < 0) //someone fucked up the vars so fix them
|
||||
take_damage(0)
|
||||
icon_state = "[base_icon]" + "[state]"
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/proc/take_damage(damage)
|
||||
health -= damage
|
||||
var/orig_health = initial(health)
|
||||
var/health_percent = (health/orig_health) * 100
|
||||
|
||||
if(health_percent > 50)
|
||||
state = 0
|
||||
else
|
||||
state = 1
|
||||
if(health_percent <= 0)
|
||||
if(state != 2)
|
||||
die()
|
||||
return
|
||||
state = 2
|
||||
|
||||
update_icon()
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/bullet_act(var/obj/item/projectile/Proj)
|
||||
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
take_damage(Proj.damage)
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/proc/die()
|
||||
state = 2
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/gun_turret/attack_hand(mob/user)
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/attack_ai(mob/user)
|
||||
return attack_hand(user)
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/attack_alien(mob/living/user as mob)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
|
||||
user.visible_message("[user] slashes at [src]", "You slash at [src]")
|
||||
take_damage(15)
|
||||
return
|
||||
|
||||
/obj/machinery/gun_turret/proc/validate_target(atom/target)
|
||||
if(get_dist(target, src)>scan_range)
|
||||
return 0
|
||||
if(istype(target, /mob))
|
||||
var/mob/M = target
|
||||
if(!M.stat)
|
||||
return 1
|
||||
else if(istype(target, /obj/mecha))
|
||||
var/obj/mecha/M = target
|
||||
if(M.occupant)
|
||||
return 1
|
||||
else if(istype(target, /obj/spacepod))
|
||||
var/obj/spacepod/S = target
|
||||
if(S.pilot)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/process()
|
||||
if(state == 2)
|
||||
return
|
||||
if(cur_target && !validate_target(cur_target))
|
||||
cur_target = null
|
||||
if(!cur_target)
|
||||
cur_target = get_target()
|
||||
if(cur_target)
|
||||
fire(cur_target)
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/proc/get_target()
|
||||
var/list/pos_targets = list()
|
||||
var/target = null
|
||||
for(var/mob/living/M in view(scan_range,src))
|
||||
if(M.stat)
|
||||
continue
|
||||
if(faction in M.faction)
|
||||
continue
|
||||
if(ispAI(M))
|
||||
continue
|
||||
pos_targets += M
|
||||
for(var/obj/mecha/M in oview(scan_range, src))
|
||||
if(M.occupant)
|
||||
if(faction in M.occupant.faction)
|
||||
continue
|
||||
if(!M.occupant)
|
||||
continue //Don't shoot at empty mechs.
|
||||
pos_targets += M
|
||||
for(var/obj/spacepod/M in oview(scan_range, src))
|
||||
if(M.pilot)
|
||||
var/mob/P = M.pilot
|
||||
if(faction in P.faction)
|
||||
continue
|
||||
if(!M.pilot)
|
||||
continue //Don't shoot at empty pods.
|
||||
pos_targets += M
|
||||
if(pos_targets.len)
|
||||
target = pick(pos_targets)
|
||||
return target
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/proc/fire(atom/target)
|
||||
if(!target)
|
||||
cur_target = null
|
||||
return
|
||||
src.dir = get_dir(src,target)
|
||||
var/turf/targloc = get_turf(target)
|
||||
if(!src)
|
||||
return
|
||||
var/turf/curloc = get_turf(src)
|
||||
if(!targloc || !curloc)
|
||||
return
|
||||
if(targloc == curloc)
|
||||
return
|
||||
playsound(get_turf(src), firing_sound, 60, 1)
|
||||
var/obj/item/projectile/A = new bullet_type(curloc)
|
||||
A.original = target
|
||||
A.current = curloc
|
||||
A.yo = targloc.y - curloc.y
|
||||
A.xo = targloc.x - curloc.x
|
||||
A.fire()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/gun_turret/interior
|
||||
name = "machine gun turret (.45)"
|
||||
desc = "Syndicate interior defense turret chambered for .45 rounds. Designed to down intruders without damaging the hull."
|
||||
bullet_type = /obj/item/projectile/bullet/midbullet
|
||||
|
||||
/obj/machinery/gun_turret/exterior
|
||||
name = "machine gun turret (7.62)"
|
||||
desc = "Syndicate exterior defense turret chambered for 7.62 rounds. Designed to down intruders with heavy calliber bullets."
|
||||
bullet_type = /obj/item/projectile/bullet
|
||||
|
||||
/obj/machinery/gun_turret/grenade
|
||||
name = "mounted grenade launcher (40mm)"
|
||||
desc = "Syndicate 40mm grenade launcher defense turret. If you've had this much time to look at it, you're probably already dead."
|
||||
bullet_type = /obj/item/projectile/bullet/a40mm
|
||||
|
||||
/obj/machinery/gun_turret/assault_pod
|
||||
name = "machine gun turret (4.6x30mm)"
|
||||
desc = "Syndicate exterior defense turret chambered for 4.6x30mm rounds. Designed to be fitted to assault pods, it uses low calliber bullets to save space."
|
||||
health = 100
|
||||
bullet_type = /obj/item/projectile/bullet/weakbullet3
|
||||
@@ -800,6 +800,17 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chinese/rice = 6)
|
||||
prices = list(/obj/item/weapon/reagent_containers/food/snacks/chinese/chowmein = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/tao = 50, /obj/item/weapon/reagent_containers/food/snacks/chinese/newdles = 50,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chinese/rice = 50)
|
||||
refill_canister = /obj/item/weapon/vending_refill/chinese
|
||||
|
||||
/obj/machinery/vending/chinese/New()
|
||||
..()
|
||||
component_parts = list()
|
||||
var/obj/item/weapon/circuitboard/vendor/V = new(null)
|
||||
V.set_type(type)
|
||||
component_parts += V
|
||||
component_parts += new /obj/item/weapon/vending_refill/chinese(0)
|
||||
component_parts += new /obj/item/weapon/vending_refill/chinese(0)
|
||||
component_parts += new /obj/item/weapon/vending_refill/chinese(0)
|
||||
|
||||
/obj/machinery/vending/cola
|
||||
name = "\improper Robust Softdrinks"
|
||||
|
||||
@@ -243,7 +243,6 @@
|
||||
desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur."
|
||||
icon = 'icons/obj/guns/projectile.dmi'
|
||||
icon_state = "syringegun"
|
||||
flags = NOREACT
|
||||
var/list/syringes
|
||||
var/list/known_reagents
|
||||
var/list/processed_reagents
|
||||
@@ -259,6 +258,7 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/New()
|
||||
..()
|
||||
create_reagents(max_volume)
|
||||
reagents.set_reacting(FALSE)
|
||||
syringes = new
|
||||
known_reagents = list("epinephrine"="Epinephrine","charcoal"="Charcoal")
|
||||
processed_reagents = new
|
||||
@@ -273,7 +273,8 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail()
|
||||
..()
|
||||
flags &= ~NOREACT
|
||||
if(reagents)
|
||||
reagents.set_reacting(TRUE)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/mecha/medical/M)
|
||||
if(..())
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
|
||||
processing_objects.Add(src)
|
||||
removeVerb(/obj/mecha/verb/disconnect_from_port)
|
||||
poi_list |= src
|
||||
log_message("[src] created.")
|
||||
mechas_list += src //global mech list
|
||||
prepare_huds()
|
||||
@@ -616,6 +617,7 @@
|
||||
qdel(internal_tank)
|
||||
|
||||
processing_objects.Remove(src)
|
||||
poi_list.Remove(src)
|
||||
equipment.Cut()
|
||||
cell = null
|
||||
internal_tank = null
|
||||
@@ -831,6 +833,8 @@
|
||||
|
||||
/obj/mecha/proc/attacked_by(obj/item/I, mob/user)
|
||||
log_message("Attacked by [I]. Attacker - [user]")
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
var/deflection = deflect_chance
|
||||
var/dam_coeff = 1
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster/B in equipment)
|
||||
|
||||
@@ -18,6 +18,11 @@
|
||||
|
||||
var/new_frequency = sanitize_frequency(rand(PUBLIC_LOW_FREQ, PUBLIC_HIGH_FREQ))
|
||||
aSignal.set_frequency(new_frequency)
|
||||
poi_list |= src
|
||||
|
||||
/obj/effect/anomaly/Destroy()
|
||||
poi_list.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/anomaly/proc/anomalyEffect()
|
||||
if(prob(50))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
obj/effect/decal/cleanable/liquid_fuel
|
||||
/obj/effect/decal/cleanable/liquid_fuel
|
||||
//Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles.
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "fuel"
|
||||
@@ -6,52 +6,53 @@ obj/effect/decal/cleanable/liquid_fuel
|
||||
anchored = 1
|
||||
var/amount = 1 //Basically moles.
|
||||
|
||||
New(newLoc,amt=1)
|
||||
src.amount = amt
|
||||
/obj/effect/decal/cleanable/liquid_fuel/New(newLoc,amt=1)
|
||||
amount = amt
|
||||
|
||||
//Be absorbed by any other liquid fuel in the tile.
|
||||
for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
|
||||
if(other != src)
|
||||
other.amount += src.amount
|
||||
spawn other.Spread()
|
||||
qdel(src)
|
||||
//Be absorbed by any other liquid fuel in the tile.
|
||||
for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
|
||||
if(other != src)
|
||||
other.amount += amount
|
||||
spawn other.Spread()
|
||||
qdel(src)
|
||||
|
||||
Spread()
|
||||
. = ..()
|
||||
Spread()
|
||||
. = ..()
|
||||
|
||||
proc/Spread()
|
||||
//Allows liquid fuels to sometimes flow into other tiles.
|
||||
if(amount < 0.5) return
|
||||
var/turf/simulated/S = loc
|
||||
if(!istype(S)) return
|
||||
for(var/d in cardinal)
|
||||
if(rand(25))
|
||||
var/turf/simulated/target = get_step(src,d)
|
||||
var/turf/simulated/origin = get_turf(src)
|
||||
if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
|
||||
if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target)
|
||||
new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25)
|
||||
amount *= 0.75
|
||||
/obj/effect/decal/cleanable/liquid_fuel/proc/Spread()
|
||||
//Allows liquid fuels to sometimes flow into other tiles.
|
||||
if(amount < 0.5) return
|
||||
var/turf/simulated/S = loc
|
||||
if(!istype(S)) return
|
||||
for(var/d in cardinal)
|
||||
if(rand(25))
|
||||
var/turf/simulated/target = get_step(src, d)
|
||||
var/turf/simulated/origin = get_turf(src)
|
||||
if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
|
||||
if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in target)
|
||||
new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25)
|
||||
amount *= 0.75
|
||||
|
||||
flamethrower_fuel
|
||||
icon_state = "mustard"
|
||||
anchored = 0
|
||||
New(newLoc, amt = 1, d = 0)
|
||||
dir = d //Setting this direction means you won't get torched by your own flamethrower.
|
||||
. = ..()
|
||||
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel
|
||||
icon_state = "mustard"
|
||||
anchored = 0
|
||||
|
||||
Spread()
|
||||
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
|
||||
if(amount < 0.1) return
|
||||
var/turf/simulated/S = loc
|
||||
if(!istype(S)) return
|
||||
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/New(newLoc, amt = 1, d = 0)
|
||||
dir = d //Setting this direction means you won't get torched by your own flamethrower.
|
||||
. = ..()
|
||||
|
||||
for(var/d in list(turn(dir,90),turn(dir,-90), dir))
|
||||
var/turf/simulated/O = get_step(S,d)
|
||||
if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
|
||||
continue
|
||||
if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
|
||||
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
|
||||
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
|
||||
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Spread()
|
||||
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
|
||||
if(amount < 0.1) return
|
||||
var/turf/simulated/S = loc
|
||||
if(!istype(S)) return
|
||||
|
||||
amount *= 0.25
|
||||
for(var/d in list(turn(dir,90),turn(dir,-90), dir))
|
||||
var/turf/simulated/O = get_step(S,d)
|
||||
if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
|
||||
continue
|
||||
if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
|
||||
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
|
||||
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
|
||||
|
||||
amount *= 0.25
|
||||
|
||||
@@ -117,10 +117,13 @@ var/global/list/image/splatter_cache=list()
|
||||
user.hand_blood_color = basecolor
|
||||
user.update_inv_gloves(1)
|
||||
user.verbs += /mob/living/carbon/human/proc/bloody_doodle
|
||||
|
||||
/obj/effect/decal/cleanable/blood/can_bloodcrawl_in()
|
||||
return amount
|
||||
|
||||
/obj/effect/decal/cleanable/blood/splatter
|
||||
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
|
||||
amount = 2
|
||||
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
|
||||
amount = 2
|
||||
|
||||
/obj/effect/decal/cleanable/blood/drip
|
||||
name = "drips of blood"
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like
|
||||
return
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/can_bloodcrawl_in()
|
||||
return FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/gibs/robot/streak(var/list/directions)
|
||||
spawn (0)
|
||||
@@ -42,6 +45,9 @@
|
||||
desc = "It's black and greasy. Looks like Beepsky made another mess."
|
||||
basecolor="#030303"
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/can_bloodcrawl_in()
|
||||
return FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/oil/dry()
|
||||
return
|
||||
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
var/targeted_by = null // Used so cleanbots can't claim a mess.
|
||||
var/noscoop = 0 //if it has this, don't let it be scooped up
|
||||
var/noclear = 0 //if it has this, don't delete it when its' scooped up
|
||||
|
||||
/obj/effect/decal/cleanable/proc/can_bloodcrawl_in()
|
||||
return FALSE
|
||||
|
||||
/obj/effect/decal/cleanable/New()
|
||||
if(random_icon_states && length(src.random_icon_states) > 0)
|
||||
|
||||
@@ -39,23 +39,23 @@
|
||||
if("prisonwarp")
|
||||
prisonwarp += loc
|
||||
qdel(src)
|
||||
|
||||
|
||||
if("prisonsecuritywarp")
|
||||
prisonsecuritywarp += loc
|
||||
qdel(src)
|
||||
|
||||
|
||||
if("tdome1")
|
||||
tdome1 += loc
|
||||
|
||||
|
||||
if("tdome2")
|
||||
tdome2 += loc
|
||||
|
||||
|
||||
if("tdomeadmin")
|
||||
tdomeadmin += loc
|
||||
|
||||
|
||||
if("tdomeobserve")
|
||||
tdomeobserve += loc
|
||||
|
||||
|
||||
if("aroomwarp")
|
||||
aroomwarp += loc
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
if("ERT Director")
|
||||
ertdirector += loc
|
||||
qdel(src)
|
||||
|
||||
|
||||
if("Response Team")
|
||||
emergencyresponseteamspawn += loc
|
||||
qdel(src)
|
||||
@@ -214,6 +214,7 @@
|
||||
new /obj/item/clothing/head/ushanka(src.loc)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/effect/landmark/costume/imperium_monk/New()
|
||||
new /obj/item/clothing/suit/imperium_monk(src.loc)
|
||||
if(prob(25))
|
||||
@@ -250,3 +251,17 @@
|
||||
new /obj/item/clothing/mask/gas/sexymime(src.loc)
|
||||
new /obj/item/clothing/under/sexymime(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/landmark/ruin
|
||||
var/datum/map_template/ruin/ruin_template
|
||||
|
||||
/obj/effect/landmark/ruin/New(loc, my_ruin_template)
|
||||
name = "ruin_[ruin_landmarks.len + 1]"
|
||||
..(loc)
|
||||
ruin_template = my_ruin_template
|
||||
ruin_landmarks |= src
|
||||
|
||||
/obj/effect/landmark/ruin/Destroy()
|
||||
ruin_landmarks -= src
|
||||
ruin_template = null
|
||||
. = ..()
|
||||
|
||||
@@ -1,94 +1,166 @@
|
||||
/obj/effect/mine
|
||||
name = "Mine"
|
||||
name = "dummy mine"
|
||||
desc = "I Better stay away from that thing."
|
||||
density = 1
|
||||
density = 0
|
||||
anchored = 1
|
||||
layer = 3
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "uglymine"
|
||||
var/triggerproc = "explode" //name of the proc thats called when the mine is triggered
|
||||
var/triggered = 0
|
||||
|
||||
/obj/effect/mine/New()
|
||||
icon_state = "uglyminearmed"
|
||||
var/triggered = 0
|
||||
|
||||
/obj/effect/mine/proc/mineEffect(mob/living/victim)
|
||||
to_chat(victim, "<span class='danger'>*click*</span>")
|
||||
|
||||
/obj/effect/mine/Crossed(AM as mob|obj)
|
||||
Bumped(AM)
|
||||
|
||||
/obj/effect/mine/Bumped(mob/M as mob|obj)
|
||||
|
||||
if(triggered) return
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
for(var/mob/O in viewers(world.view, src.loc))
|
||||
to_chat(O, "<font color='red'>[M] triggered the [bicon(src)] [src]</font>")
|
||||
triggered = 1
|
||||
call(src,triggerproc)(M)
|
||||
|
||||
/obj/effect/mine/proc/triggerrad(obj)
|
||||
if(isanimal(AM))
|
||||
var/mob/living/simple_animal/SA = AM
|
||||
if(!SA.flying)
|
||||
triggermine(SA)
|
||||
else
|
||||
triggermine(AM)
|
||||
|
||||
/obj/effect/mine/proc/triggermine(mob/living/victim)
|
||||
if(triggered)
|
||||
return
|
||||
visible_message("<span class='danger'>[victim] sets off \icon[src] [src]!</span>")
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
obj:radiation += 50
|
||||
randmutb(obj)
|
||||
domutcheck(obj,null)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/triggerstun(obj)
|
||||
if(ismob(obj))
|
||||
var/mob/M = obj
|
||||
M.Stun(30)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/triggern2o(obj)
|
||||
atmos_spawn_air(SPAWN_N2O, 360)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/triggerplasma(obj)
|
||||
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 360)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/triggerkick(obj)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
qdel(obj:client)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/explode(obj)
|
||||
explosion(loc, 0, 1, 2, 3)
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
mineEffect(victim)
|
||||
triggered = 1
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/explosive
|
||||
name = "explosive mine"
|
||||
var/range_devastation = 0
|
||||
var/range_heavy = 1
|
||||
var/range_light = 2
|
||||
var/range_flash = 3
|
||||
|
||||
/obj/effect/mine/explosive/mineEffect(mob/living/victim)
|
||||
explosion(loc, range_devastation, range_heavy, range_light, range_flash)
|
||||
|
||||
/obj/effect/mine/stun
|
||||
name = "stun mine"
|
||||
var/stun_time = 8
|
||||
|
||||
/obj/effect/mine/stun/mineEffect(mob/living/victim)
|
||||
if(isliving(victim))
|
||||
victim.Weaken(stun_time)
|
||||
|
||||
/obj/effect/mine/dnascramble
|
||||
name = "Radiation Mine"
|
||||
icon_state = "uglymine"
|
||||
triggerproc = "triggerrad"
|
||||
var/radiation_amount
|
||||
|
||||
/obj/effect/mine/dnascramble/mineEffect(mob/living/victim)
|
||||
victim.apply_effect(radiation_amount, IRRADIATE, 0)
|
||||
randmutb(victim)
|
||||
domutcheck(victim ,null)
|
||||
|
||||
/obj/effect/mine/plasma
|
||||
name = "Plasma Mine"
|
||||
icon_state = "uglymine"
|
||||
triggerproc = "triggerplasma"
|
||||
/obj/effect/mine/gas
|
||||
name = "oxygen mine"
|
||||
var/gas_amount = 360
|
||||
var/gas_type = SPAWN_OXYGEN
|
||||
|
||||
/obj/effect/mine/kick
|
||||
name = "Kick Mine"
|
||||
icon_state = "uglymine"
|
||||
triggerproc = "triggerkick"
|
||||
/obj/effect/mine/gas/mineEffect(mob/living/victim)
|
||||
atmos_spawn_air(gas_type, gas_amount)
|
||||
|
||||
/obj/effect/mine/n2o
|
||||
name = "N2O Mine"
|
||||
icon_state = "uglymine"
|
||||
triggerproc = "triggern2o"
|
||||
/obj/effect/mine/gas/plasma
|
||||
name = "plasma mine"
|
||||
gas_type = SPAWN_HEAT | SPAWN_TOXINS
|
||||
|
||||
/obj/effect/mine/stun
|
||||
name = "Stun Mine"
|
||||
icon_state = "uglymine"
|
||||
triggerproc = "triggerstun"
|
||||
/obj/effect/mine/gas/n2o
|
||||
name = "\improper N2O mine"
|
||||
gas_type = SPAWN_N2O
|
||||
|
||||
/obj/effect/mine/sound
|
||||
name = "honkblaster 1000"
|
||||
var/sound = 'sound/items/bikehorn.ogg'
|
||||
|
||||
/obj/effect/mine/sound/mineEffect(mob/living/victim)
|
||||
playsound(loc, sound, 100, 1)
|
||||
|
||||
/obj/effect/mine/sound/bwoink
|
||||
name = "bwoink mine"
|
||||
sound = 'sound/effects/adminhelp.ogg'
|
||||
|
||||
/obj/effect/mine/pickup
|
||||
name = "pickup"
|
||||
desc = "pick me up"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "electricity2"
|
||||
density = 0
|
||||
var/duration = 0
|
||||
|
||||
/obj/effect/mine/pickup/New()
|
||||
..()
|
||||
animate(src, pixel_y = 4, time = 20, loop = -1)
|
||||
|
||||
/obj/effect/mine/pickup/triggermine(mob/living/victim)
|
||||
if(triggered)
|
||||
return
|
||||
triggered = 1
|
||||
invisibility = 101
|
||||
mineEffect(victim)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/pickup/bloodbath
|
||||
name = "Red Orb"
|
||||
desc = "You feel angry just looking at it."
|
||||
duration = 1200 //2min
|
||||
color = "red"
|
||||
|
||||
/obj/effect/mine/pickup/bloodbath/mineEffect(mob/living/carbon/victim)
|
||||
if(!istype(victim) || !victim.client)
|
||||
return
|
||||
to_chat(victim, "<span class='reallybig redtext'>RIP AND TEAR</span>")
|
||||
victim << 'sound/misc/e1m1.ogg'
|
||||
var/old_color = victim.client.color
|
||||
var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0)
|
||||
var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
|
||||
|
||||
spawn(0)
|
||||
new /obj/effect/hallucination/delusion(victim.loc, victim, force_kind = "demon", duration = duration, skip_nearby = 0)
|
||||
|
||||
var/obj/item/weapon/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
|
||||
chainsaw.flags |= NODROP
|
||||
victim.drop_l_hand()
|
||||
victim.drop_r_hand()
|
||||
victim.put_in_hands(chainsaw)
|
||||
chainsaw.attack_self(victim)
|
||||
chainsaw.wield(victim)
|
||||
victim.reagents.add_reagent("adminordrazine", 25)
|
||||
|
||||
victim.client.color = pure_red
|
||||
animate(victim.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT)
|
||||
spawn(10)
|
||||
animate(victim.client,color = old_color, time = duration)//, easing = SINE_EASING|EASE_OUT)
|
||||
spawn(duration)
|
||||
to_chat(victim, "<span class='notice'>Your bloodlust seeps back into the bog of your subconscious and you regain self control.<span>")
|
||||
qdel(chainsaw)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/pickup/healing
|
||||
name = "Blue Orb"
|
||||
desc = "You feel better just looking at it."
|
||||
color = "blue"
|
||||
|
||||
/obj/effect/mine/pickup/healing/mineEffect(mob/living/carbon/victim)
|
||||
if(!victim.client || !istype(victim))
|
||||
return
|
||||
to_chat(victim, "<span class='notice'>You feel great!</span>")
|
||||
victim.revive()
|
||||
|
||||
/obj/effect/mine/pickup/speed
|
||||
name = "Yellow Orb"
|
||||
desc = "You feel faster just looking at it."
|
||||
color = "yellow"
|
||||
duration = 300
|
||||
|
||||
/obj/effect/mine/pickup/speed/mineEffect(mob/living/carbon/victim)
|
||||
if(!victim.client || !istype(victim))
|
||||
return
|
||||
to_chat(victim, "<span class='notice'>You feel fast!</span>")
|
||||
victim.status_flags |= GOTTAGOREALLYFAST
|
||||
spawn(duration)
|
||||
victim.status_flags &= ~GOTTAGOREALLYFAST
|
||||
to_chat(victim, "<span class='notice'>You slow down.</span>")
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/obj/effect/overlay
|
||||
name = "overlay"
|
||||
unacidable = 1
|
||||
@@ -17,60 +16,9 @@
|
||||
var/tmp/atom/BeamSource
|
||||
New()
|
||||
..()
|
||||
spawn(10) qdel(src)
|
||||
|
||||
|
||||
/obj/effect/overlay/temp
|
||||
anchored = 1
|
||||
layer = 4.1
|
||||
mouse_opacity = 0
|
||||
var/duration = 10
|
||||
var/randomdir = 1
|
||||
|
||||
/obj/effect/overlay/temp/New()
|
||||
if(randomdir)
|
||||
dir = pick(cardinal)
|
||||
spawn(duration)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/overlay/temp/revenant
|
||||
name = "spooky lights"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "purplesparkles"
|
||||
|
||||
/obj/effect/overlay/temp/revenant/cracks
|
||||
name = "glowing cracks"
|
||||
icon_state = "purplecrack"
|
||||
duration = 6
|
||||
|
||||
/obj/effect/overlay/temp/guardian
|
||||
randomdir = 0
|
||||
|
||||
/obj/effect/overlay/temp/guardian/phase
|
||||
duration = 5
|
||||
icon_state = "phasein"
|
||||
|
||||
/obj/effect/overlay/temp/guardian/phase/out
|
||||
icon_state = "phaseout"
|
||||
|
||||
/obj/effect/overlay/temp/emp
|
||||
name = "emp sparks"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "empdisable"
|
||||
|
||||
/obj/effect/overlay/temp/emp/pulse
|
||||
name = "emp pulse"
|
||||
icon_state = "emp pulse"
|
||||
duration = 8
|
||||
randomdir = 0
|
||||
|
||||
/obj/effect/overlay/temp/kinetic_blast
|
||||
name = "kinetic explosion"
|
||||
icon = 'icons/obj/projectiles.dmi'
|
||||
icon_state = "kinetic_blast"
|
||||
layer = 4.1
|
||||
duration = 4
|
||||
|
||||
spawn(10)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/overlay/palmtree_r
|
||||
name = "Palm tree"
|
||||
icon = 'icons/misc/beach2.dmi'
|
||||
@@ -98,6 +46,152 @@
|
||||
icon_state = "admin"
|
||||
layer = 4.1
|
||||
|
||||
/obj/effect/overlay/temp
|
||||
anchored = 1
|
||||
layer = 4.1
|
||||
mouse_opacity = 0
|
||||
var/duration = 10
|
||||
var/randomdir = 1
|
||||
|
||||
/obj/effect/overlay/temp/New()
|
||||
if(randomdir)
|
||||
dir = pick(cardinal)
|
||||
|
||||
flick("[icon_state]", src) //Because we might be pulling it from a pool, flick whatever icon it uses so it starts at the start of the icon's animation.
|
||||
|
||||
spawn(duration)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/overlay/temp/revenant
|
||||
name = "spooky lights"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "purplesparkles"
|
||||
|
||||
/obj/effect/overlay/temp/revenant/cracks
|
||||
name = "glowing cracks"
|
||||
icon_state = "purplecrack"
|
||||
duration = 6
|
||||
|
||||
/obj/effect/overlay/temp/guardian
|
||||
randomdir = 0
|
||||
|
||||
/obj/effect/overlay/temp/guardian/phase
|
||||
duration = 5
|
||||
icon_state = "phasein"
|
||||
|
||||
/obj/effect/overlay/temp/guardian/phase/out
|
||||
icon_state = "phaseout"
|
||||
|
||||
/obj/effect/overlay/temp/emp
|
||||
name = "emp sparks"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "empdisable"
|
||||
|
||||
/obj/effect/overlay/temp/emp/pulse
|
||||
name = "emp pulse"
|
||||
icon_state = "emppulse"
|
||||
duration = 8
|
||||
randomdir = 0
|
||||
|
||||
/obj/effect/overlay/temp/heal //color is white by default, set to whatever is needed
|
||||
name = "healing glow"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "heal"
|
||||
duration = 15
|
||||
|
||||
/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/kinetic_blast
|
||||
name = "kinetic explosion"
|
||||
icon = 'icons/obj/projectiles.dmi'
|
||||
icon_state = "kinetic_blast"
|
||||
layer = 4.1
|
||||
duration = 4
|
||||
|
||||
/obj/effect/overlay/temp/decoy
|
||||
desc = "It's a decoy!"
|
||||
duration = 15
|
||||
|
||||
/obj/effect/overlay/temp/decoy/New(loc, atom/mimiced_atom)
|
||||
..()
|
||||
alpha = initial(alpha)
|
||||
if(mimiced_atom)
|
||||
name = mimiced_atom.name
|
||||
appearance = mimiced_atom.appearance
|
||||
dir = mimiced_atom.dir
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/overlay/temp/decoy/fading/New(loc, atom/mimiced_atom)
|
||||
..()
|
||||
animate(src, alpha = 0, time = duration)
|
||||
|
||||
/obj/effect/overlay/temp/cult
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
randomdir = 0
|
||||
duration = 10
|
||||
|
||||
/obj/effect/overlay/temp/cult/sparks
|
||||
randomdir = 1
|
||||
name = "blood sparks"
|
||||
icon_state = "bloodsparkles"
|
||||
|
||||
/obj/effect/overlay/temp/dir_setting
|
||||
randomdir = FALSE
|
||||
|
||||
/obj/effect/overlay/temp/dir_setting/New(loc, set_dir)
|
||||
if(set_dir)
|
||||
dir = set_dir
|
||||
..()
|
||||
|
||||
/obj/effect/overlay/temp/dir_setting/bloodsplatter
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
duration = 5
|
||||
randomdir = FALSE
|
||||
layer = MOB_LAYER - 0.1
|
||||
var/splatter_type = "splatter"
|
||||
|
||||
/obj/effect/overlay/temp/dir_setting/bloodsplatter/New(loc, set_dir)
|
||||
if(set_dir in diagonals)
|
||||
icon_state = "[splatter_type][pick(1, 2, 6)]"
|
||||
else
|
||||
icon_state = "[splatter_type][pick(3, 4, 5)]"
|
||||
..()
|
||||
var/target_pixel_x = 0
|
||||
var/target_pixel_y = 0
|
||||
switch(set_dir)
|
||||
if(NORTH)
|
||||
target_pixel_y = 16
|
||||
if(SOUTH)
|
||||
target_pixel_y = -16
|
||||
layer = MOB_LAYER + 0.1
|
||||
if(EAST)
|
||||
target_pixel_x = 16
|
||||
if(WEST)
|
||||
target_pixel_x = -16
|
||||
if(NORTHEAST)
|
||||
target_pixel_x = 16
|
||||
target_pixel_y = 16
|
||||
if(NORTHWEST)
|
||||
target_pixel_x = -16
|
||||
target_pixel_y = 16
|
||||
if(SOUTHEAST)
|
||||
target_pixel_x = 16
|
||||
target_pixel_y = -16
|
||||
layer = MOB_LAYER + 0.1
|
||||
if(SOUTHWEST)
|
||||
target_pixel_x = -16
|
||||
target_pixel_y = -16
|
||||
layer = MOB_LAYER + 0.1
|
||||
animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration)
|
||||
|
||||
/obj/effect/overlay/temp/dir_setting/bloodsplatter/xenosplatter
|
||||
splatter_type = "xsplatter"
|
||||
|
||||
/obj/effect/overlay/wall_rot
|
||||
name = "Wallrot"
|
||||
desc = "Ick..."
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
By submitting this form, you accept any fines, fees, or personal injury/death that may occur during construction."
|
||||
w_class = 1
|
||||
|
||||
/obj/item/areaeditor/permit/attack_self(mob/user as mob)
|
||||
/obj/item/areaeditor/permit/attack_self(mob/user)
|
||||
. = ..()
|
||||
var/area/A = get_area()
|
||||
if(get_area_type() == AREA_STATION)
|
||||
@@ -85,7 +85,7 @@
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/areaeditor/blueprints/attack_self(mob/user as mob)
|
||||
/obj/item/areaeditor/blueprints/attack_self(mob/user)
|
||||
. = ..()
|
||||
var/area/A = get_area()
|
||||
if(get_area_type() == AREA_STATION)
|
||||
@@ -153,7 +153,7 @@
|
||||
|
||||
|
||||
/obj/item/areaeditor/proc/get_area_type(var/area/A = get_area())
|
||||
if(istype(A,/area/space))
|
||||
if(A.outdoors)
|
||||
return AREA_SPACE
|
||||
var/list/SPECIALS = list(
|
||||
/area/shuttle,
|
||||
@@ -305,3 +305,10 @@
|
||||
return ROOM_ERR_SPACE
|
||||
found+=T
|
||||
return found
|
||||
|
||||
//Blueprint Subtypes
|
||||
|
||||
/obj/item/areaeditor/blueprints/cyborg
|
||||
name = "station schematics"
|
||||
desc = "A digital copy of the station blueprints stored in your memory."
|
||||
fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station."
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user