mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 00:29:02 +01:00
Merge branch 'master' of https://github.com/tgstation/tgstation into bayputers
This commit is contained in:
@@ -257,6 +257,13 @@
|
||||
"G" = (
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/ruin/powered/golem_ship)
|
||||
"H" = (
|
||||
/obj/machinery/door/airlock/shuttle,
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/open/floor/mineral/titanium/purple{
|
||||
baseturf = /turf/open/floor/plating/lava/smooth
|
||||
},
|
||||
/area/ruin/powered/golem_ship)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
@@ -686,8 +693,8 @@ b
|
||||
i
|
||||
i
|
||||
b
|
||||
j
|
||||
j
|
||||
H
|
||||
H
|
||||
b
|
||||
i
|
||||
i
|
||||
|
||||
@@ -1599,7 +1599,7 @@
|
||||
"aeh" = (
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure o2 floor";
|
||||
initial_gas_mix = "o2=500000"
|
||||
initial_gas_mix = "o2=500000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aei" = (
|
||||
@@ -1608,7 +1608,7 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure o2 floor";
|
||||
initial_gas_mix = "o2=500000"
|
||||
initial_gas_mix = "o2=500000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aej" = (
|
||||
@@ -1705,14 +1705,14 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure o2 floor";
|
||||
initial_gas_mix = "o2=500000"
|
||||
initial_gas_mix = "o2=500000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aet" = (
|
||||
/obj/machinery/portable_atmospherics/canister/oxygen,
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure o2 floor";
|
||||
initial_gas_mix = "o2=500000"
|
||||
initial_gas_mix = "o2=500000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aeu" = (
|
||||
@@ -1727,7 +1727,7 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure o2 floor";
|
||||
initial_gas_mix = "o2=500000"
|
||||
initial_gas_mix = "o2=500000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aev" = (
|
||||
@@ -1799,7 +1799,7 @@
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure o2 floor";
|
||||
initial_gas_mix = "o2=500000"
|
||||
initial_gas_mix = "o2=500000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aeE" = (
|
||||
@@ -2570,7 +2570,7 @@
|
||||
"agD" = (
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure plasma floor";
|
||||
initial_gas_mix = "plasma=240000"
|
||||
initial_gas_mix = "plasma=240000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"agE" = (
|
||||
@@ -2579,7 +2579,7 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure plasma floor";
|
||||
initial_gas_mix = "plasma=240000"
|
||||
initial_gas_mix = "plasma=240000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"agF" = (
|
||||
@@ -2739,14 +2739,14 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure plasma floor";
|
||||
initial_gas_mix = "plasma=240000"
|
||||
initial_gas_mix = "plasma=240000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"agX" = (
|
||||
/obj/machinery/portable_atmospherics/canister/toxins,
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure plasma floor";
|
||||
initial_gas_mix = "plasma=240000"
|
||||
initial_gas_mix = "plasma=240000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"agY" = (
|
||||
@@ -2761,7 +2761,7 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure plasma floor";
|
||||
initial_gas_mix = "plasma=240000"
|
||||
initial_gas_mix = "plasma=240000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"agZ" = (
|
||||
@@ -2808,8 +2808,8 @@
|
||||
"ahf" = (
|
||||
/obj/structure/cable,
|
||||
/obj/machinery/power/generator{
|
||||
cold_dir = 8;
|
||||
hot_dir = 4
|
||||
cold_dir = 4;
|
||||
hot_dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/engineering)
|
||||
@@ -2972,7 +2972,7 @@
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure plasma floor";
|
||||
initial_gas_mix = "plasma=240000"
|
||||
initial_gas_mix = "plasma=240000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"ahB" = (
|
||||
@@ -3271,7 +3271,7 @@
|
||||
"ain" = (
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure co2 floor";
|
||||
initial_gas_mix = "co2=200000"
|
||||
initial_gas_mix = "co2=200000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aio" = (
|
||||
@@ -3280,7 +3280,7 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure co2 floor";
|
||||
initial_gas_mix = "co2=200000"
|
||||
initial_gas_mix = "co2=200000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aip" = (
|
||||
@@ -3395,14 +3395,14 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure co2 floor";
|
||||
initial_gas_mix = "co2=200000"
|
||||
initial_gas_mix = "co2=200000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aiD" = (
|
||||
/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure co2 floor";
|
||||
initial_gas_mix = "co2=200000"
|
||||
initial_gas_mix = "co2=200000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aiE" = (
|
||||
@@ -3417,7 +3417,7 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure co2 floor";
|
||||
initial_gas_mix = "co2=200000"
|
||||
initial_gas_mix = "co2=200000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aiF" = (
|
||||
@@ -3537,7 +3537,7 @@
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure co2 floor";
|
||||
initial_gas_mix = "co2=200000"
|
||||
initial_gas_mix = "co2=200000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"aiW" = (
|
||||
@@ -3644,7 +3644,7 @@
|
||||
"aji" = (
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure n2 floor";
|
||||
initial_gas_mix = "n2=400000"
|
||||
initial_gas_mix = "n2=400000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"ajj" = (
|
||||
@@ -3659,7 +3659,7 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure n2 floor";
|
||||
initial_gas_mix = "n2=400000"
|
||||
initial_gas_mix = "n2=400000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"ajk" = (
|
||||
@@ -3767,14 +3767,14 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure n2 floor";
|
||||
initial_gas_mix = "n2=400000"
|
||||
initial_gas_mix = "n2=400000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"ajx" = (
|
||||
/obj/machinery/portable_atmospherics/canister/nitrogen,
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure n2 floor";
|
||||
initial_gas_mix = "n2=400000"
|
||||
initial_gas_mix = "n2=400000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"ajy" = (
|
||||
@@ -3783,7 +3783,7 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure n2 floor";
|
||||
initial_gas_mix = "n2=400000"
|
||||
initial_gas_mix = "n2=400000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"ajz" = (
|
||||
@@ -3844,7 +3844,7 @@
|
||||
/obj/machinery/light/small,
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure n2 floor";
|
||||
initial_gas_mix = "n2=400000"
|
||||
initial_gas_mix = "n2=400000;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"ajI" = (
|
||||
@@ -4089,7 +4089,7 @@
|
||||
"akd" = (
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure air floor";
|
||||
initial_gas_mix = "o2=10000;n2=40015"
|
||||
initial_gas_mix = "o2=10000;n2=40015;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"ake" = (
|
||||
@@ -4133,14 +4133,14 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure air floor";
|
||||
initial_gas_mix = "o2=10000;n2=40015"
|
||||
initial_gas_mix = "o2=10000;n2=40015;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"akm" = (
|
||||
/obj/machinery/portable_atmospherics/canister/air,
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure air floor";
|
||||
initial_gas_mix = "o2=10000;n2=40015"
|
||||
initial_gas_mix = "o2=10000;n2=40015;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"akn" = (
|
||||
@@ -4155,7 +4155,7 @@
|
||||
},
|
||||
/turf/open/floor/engine{
|
||||
name = "high pressure air floor";
|
||||
initial_gas_mix = "o2=10000;n2=40015"
|
||||
initial_gas_mix = "o2=10000;n2=40015;TEMP=293.15"
|
||||
},
|
||||
/area/engine/engineering)
|
||||
"ako" = (
|
||||
|
||||
@@ -53303,7 +53303,7 @@
|
||||
/area/bridge)
|
||||
"bOg" = (
|
||||
/obj/structure/rack,
|
||||
/obj/machinery/telecomms/bus,
|
||||
/obj/item/weapon/circuitboard/machine/telecomms/bus,
|
||||
/obj/item/weapon/circuitboard/machine/telecomms/broadcaster,
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump{
|
||||
dir = 1;
|
||||
|
||||
@@ -58527,7 +58527,7 @@
|
||||
name = "Emergency Shuttle Airlock";
|
||||
req_access_txt = "2"
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium/nodiagonal,
|
||||
/turf/open/floor/mineral/plastitanium/brig,
|
||||
/area/shuttle/escape)
|
||||
"cxh" = (
|
||||
/obj/structure/chair{
|
||||
|
||||
@@ -535,10 +535,10 @@
|
||||
height = 5;
|
||||
id = "laborcamp_away";
|
||||
name = "labor camp";
|
||||
turf_type = /turf/open/floor/plating/lava/smooth;
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface;
|
||||
width = 9
|
||||
},
|
||||
/turf/open/floor/plating/lava/smooth/lava_land_surface,
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
|
||||
/area/lavaland/surface/outdoors/explored)
|
||||
"bm" = (
|
||||
/obj/machinery/door/airlock/glass_security{
|
||||
@@ -5844,7 +5844,7 @@ af
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
dq
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
@@ -5853,7 +5853,7 @@ bA
|
||||
dq
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
dq
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
@@ -6102,15 +6102,15 @@ af
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
bA
|
||||
af
|
||||
af
|
||||
@@ -6359,15 +6359,15 @@ bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
bA
|
||||
bA
|
||||
ab
|
||||
@@ -6616,15 +6616,15 @@ bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
@@ -6873,15 +6873,15 @@ af
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
bA
|
||||
af
|
||||
af
|
||||
@@ -7129,17 +7129,17 @@ af
|
||||
af
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
bl
|
||||
bA
|
||||
bA
|
||||
bA
|
||||
dq
|
||||
dq
|
||||
dq
|
||||
af
|
||||
af
|
||||
af
|
||||
@@ -7391,7 +7391,7 @@ an
|
||||
an
|
||||
aO
|
||||
an
|
||||
fI
|
||||
an
|
||||
an
|
||||
bm
|
||||
an
|
||||
|
||||
@@ -5810,7 +5810,7 @@
|
||||
/area/holodeck/rec_center/winterwonderland)
|
||||
"se" = (
|
||||
/turf/open/floor/holofloor/snow/cold,
|
||||
/area/holodeck/rec_center/medical)
|
||||
/area/holodeck/rec_center/winterwonderland)
|
||||
"sf" = (
|
||||
/obj/structure/flora/bush,
|
||||
/turf/open/floor/holofloor/snow/cold,
|
||||
|
||||
@@ -63,6 +63,8 @@
|
||||
|
||||
#define issilicon(A) (istype(A, /mob/living/silicon))
|
||||
|
||||
#define iscyborg(A) (istype(A, /mob/living/silicon/robot))
|
||||
|
||||
#define isliving(A) (istype(A, /mob/living))
|
||||
|
||||
#define isobserver(A) (istype(A, /mob/dead/observer))
|
||||
|
||||
@@ -21,4 +21,5 @@
|
||||
#define AUTOLATHE 4 //Uses glass/metal only.
|
||||
#define CRAFTLATHE 8 //Uses fuck if I know. For use eventually.
|
||||
#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
|
||||
#define BIOGENERATOR 32 //Uses biomass
|
||||
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
|
||||
@@ -263,6 +263,7 @@
|
||||
#define MAT_PLASMA "$plasma"
|
||||
#define MAT_BANANIUM "$bananium"
|
||||
#define MAT_TITANIUM "$titanium"
|
||||
#define MAT_BIOMASS "$biomass"
|
||||
|
||||
|
||||
//check_target_facings() return defines
|
||||
|
||||
@@ -397,14 +397,14 @@
|
||||
|
||||
return new /datum/projectile_data(src_x, src_y, time, distance, power_x, power_y, dest_x, dest_y)
|
||||
|
||||
/proc/pollCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck, var/be_special_flag = 0, var/poll_time = 300)
|
||||
/proc/pollCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck, var/be_special_flag = 0, var/poll_time = 300, var/ignore_category = null)
|
||||
var/list/mob/dead/observer/candidates = list()
|
||||
var/time_passed = world.time
|
||||
if (!Question)
|
||||
Question = "Would you like to be a special role?"
|
||||
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
if(!G.key || !G.client)
|
||||
if(!G.key || !G.client || (ignore_category && poll_ignore[ignore_category] && G.ckey in poll_ignore[ignore_category]))
|
||||
continue
|
||||
if(be_special_flag)
|
||||
if(!(G.client.prefs) || !(be_special_flag in G.client.prefs.be_special))
|
||||
@@ -417,7 +417,7 @@
|
||||
continue
|
||||
spawn(0)
|
||||
G << 'sound/misc/notice2.ogg' //Alerting them to their consideration
|
||||
switch(askuser(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No", StealFocus=0, Timeout=poll_time))
|
||||
switch(ignore_category ? askuser(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Never for this round", StealFocus=0, Timeout=poll_time) : askuser(G,Question,"Please answer in [poll_time/10] seconds!","Yes","No", StealFocus=0, Timeout=poll_time))
|
||||
if(1)
|
||||
G << "<span class='notice'>Choice registered: Yes.</span>"
|
||||
if((world.time-time_passed)>poll_time)
|
||||
@@ -427,6 +427,12 @@
|
||||
candidates += G
|
||||
if(2)
|
||||
G << "<span class='danger'>Choice registered: No.</span>"
|
||||
if(3)
|
||||
var/list/L = poll_ignore[ignore_category]
|
||||
if(!L)
|
||||
poll_ignore[ignore_category] = list()
|
||||
poll_ignore[ignore_category] += G.ckey
|
||||
G << "<span class='danger'>Choice registered: Never for this round.</span>"
|
||||
sleep(poll_time)
|
||||
|
||||
//Check all our candidates, to make sure they didn't log off during the wait period.
|
||||
|
||||
@@ -156,20 +156,22 @@
|
||||
underlays.Cut()
|
||||
if(fixed_underlay)
|
||||
if(fixed_underlay["space"])
|
||||
underlays += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=src.layer)
|
||||
underlays += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER)
|
||||
else
|
||||
underlays += image(fixed_underlay["icon"], fixed_underlay["icon_state"], layer=src.layer)
|
||||
underlays += image(fixed_underlay["icon"], fixed_underlay["icon_state"], layer=TURF_LAYER)
|
||||
else
|
||||
var/turf/T = get_step(src, turn(adjacencies, 180))
|
||||
if(T && T.density)
|
||||
if(T && (T.density || T.smooth))
|
||||
T = get_step(src, turn(adjacencies, 135))
|
||||
if(T && T.density)
|
||||
if(T && (T.density || T.smooth))
|
||||
T = get_step(src, turn(adjacencies, 225))
|
||||
|
||||
if(istype(T, /turf/open/space))
|
||||
underlays += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=src.layer)
|
||||
if(istype(T, /turf/open/space) && !istype(T, /turf/open/space/transit))
|
||||
underlays += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER)
|
||||
else if(T && !T.density && !T.smooth)
|
||||
underlays += T
|
||||
else if(baseturf && !initial(baseturf.density) && !initial(baseturf.smooth))
|
||||
underlays += image(initial(baseturf.icon), initial(baseturf.icon_state), layer=TURF_LAYER)
|
||||
else
|
||||
underlays += DEFAULT_UNDERLAY_IMAGE
|
||||
|
||||
|
||||
+2
-12
@@ -692,11 +692,7 @@ The _flatIcons list is a cache for generated icon files.
|
||||
var/image/copy
|
||||
// Add the atom's icon itself, without pixel_x/y offsets.
|
||||
if(!noIcon)
|
||||
var/icon/copyicon = icon(curicon, curstate, dir=curdir)
|
||||
if(IsBlankIcon(copyicon))
|
||||
curdir = SOUTH
|
||||
copy = image(icon=curicon, icon_state=curstate, layer=A.layer)
|
||||
copy.dir = curdir
|
||||
copy = image(icon=curicon, icon_state=curstate, layer=A.layer, dir=curdir)
|
||||
copy.color = A.color
|
||||
copy.alpha = A.alpha
|
||||
copy.blend_mode = curblend
|
||||
@@ -919,12 +915,6 @@ var/global/list/friendly_animal_types = list()
|
||||
final_average = BlendRGB(final_average, colour, 1)
|
||||
return final_average
|
||||
|
||||
/proc/IsBlankIcon(icon/I)
|
||||
for(var/y_pixel = 1 to I.Height())
|
||||
for(var/x_pixel = 1 to I.Width())
|
||||
if(I.GetPixel(x_pixel, y_pixel))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
//Interface for using DrawBox() to draw 1 pixel on a coordinate.
|
||||
//Returns the same icon specifed in the argument, but with the pixel drawn
|
||||
@@ -1016,4 +1006,4 @@ var/global/list/humanoid_icon_cache = list()
|
||||
//Images have dir without being an atom, so they get their own definition.
|
||||
//Lame.
|
||||
/image/proc/setDir(newdir)
|
||||
dir = newdir
|
||||
dir = newdir
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
//Each lists stores ckeys for "Never for this round" option category
|
||||
|
||||
#define POLL_IGNORE_PAI "pai"
|
||||
#define POLL_IGNORE_SENTIENCE_POTION "sentience_potion"
|
||||
|
||||
var/list/poll_ignore = list()
|
||||
@@ -5,10 +5,7 @@ var/datum/subsystem/pai/SSpai
|
||||
init_order = 20
|
||||
flags = SS_NO_FIRE|SS_NO_INIT
|
||||
|
||||
var/askDelay = 600
|
||||
var/const/NEVER_FOR_THIS_ROUND = -1
|
||||
var/list/candidates = list()
|
||||
var/list/asked = list()
|
||||
|
||||
/datum/subsystem/pai/New()
|
||||
NEW_SS_GLOBAL(SSpai)
|
||||
@@ -181,34 +178,10 @@ var/datum/subsystem/pai/SSpai
|
||||
user << browse(dat, "window=findPai")
|
||||
|
||||
/datum/subsystem/pai/proc/requestRecruits()
|
||||
for(var/mob/dead/observer/O in player_list)
|
||||
if(jobban_isbanned(O, ROLE_PAI))
|
||||
continue
|
||||
if(asked[O.ckey])
|
||||
if(world.time < asked[O.ckey] + askDelay || asked[O.ckey] == NEVER_FOR_THIS_ROUND)
|
||||
continue
|
||||
else
|
||||
asked.Remove(O.ckey)
|
||||
if(O.client)
|
||||
var/hasSubmitted = 0
|
||||
for(var/datum/paiCandidate/c in SSpai.candidates)
|
||||
if(c.key == O.key)
|
||||
hasSubmitted = 1
|
||||
if(!hasSubmitted && (ROLE_PAI in O.client.prefs.be_special))
|
||||
question(O.client)
|
||||
|
||||
/datum/subsystem/pai/proc/question(client/C)
|
||||
set waitfor = 0
|
||||
if(!C)
|
||||
return
|
||||
asked[C.ckey] = world.time
|
||||
var/response = tgalert(C, "Someone is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round", StealFocus=0, Timeout=askDelay)
|
||||
if(!C)
|
||||
return //handle logouts that happen whilst the alert is waiting for a response.
|
||||
if(response == "Yes")
|
||||
recruitWindow(C.mob)
|
||||
else if (response == "Never for this round")
|
||||
asked[C.ckey] = NEVER_FOR_THIS_ROUND
|
||||
var/list/candidates = pollCandidates("Someone is requesting a pAI personality. Would you like to play as a personal AI?", ROLE_PAI, null, ROLE_PAI,300, ignore_category = POLL_IGNORE_PAI)
|
||||
for(var/V in candidates)
|
||||
recruitWindow(V)
|
||||
return
|
||||
|
||||
/datum/paiCandidate
|
||||
var/name
|
||||
|
||||
@@ -303,6 +303,7 @@
|
||||
..()
|
||||
|
||||
/datum/action/item_action/toggle_research_scanner/ApplyIcon(obj/screen/movable/action_button/current_button)
|
||||
current_button.cut_overlays()
|
||||
if(button_icon && button_icon_state)
|
||||
var/image/img = image(button_icon, current_button, "scan_mode")
|
||||
current_button.add_overlay(img)
|
||||
|
||||
+40
-24
@@ -6,6 +6,7 @@
|
||||
var/list/supplied = list()
|
||||
var/list/ion = list()
|
||||
var/mob/living/silicon/owner
|
||||
var/list/devillaws = null
|
||||
|
||||
/datum/ai_laws/default/asimov
|
||||
name = "Three Laws of Robotics"
|
||||
@@ -189,71 +190,82 @@
|
||||
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
|
||||
WARNING("Invalid custom AI laws, check silicon_laws.txt")
|
||||
|
||||
/datum/ai_laws/proc/set_law_sixsixsix(laws)
|
||||
devillaws = laws
|
||||
|
||||
/datum/ai_laws/proc/set_zeroth_law(law, law_borg = null)
|
||||
src.zeroth = law
|
||||
zeroth = law
|
||||
if(law_borg) //Making it possible for slaved borgs to see a different law 0 than their AI. --NEO
|
||||
src.zeroth_borg = law_borg
|
||||
zeroth_borg = law_borg
|
||||
|
||||
/datum/ai_laws/proc/add_inherent_law(law)
|
||||
if (!(law in src.inherent))
|
||||
src.inherent += law
|
||||
if (!(law in inherent))
|
||||
inherent += law
|
||||
|
||||
/datum/ai_laws/proc/add_ion_law(law)
|
||||
src.ion += law
|
||||
ion += law
|
||||
|
||||
/datum/ai_laws/proc/clear_inherent_laws()
|
||||
qdel(src.inherent)
|
||||
src.inherent = list()
|
||||
qdel(inherent)
|
||||
inherent = list()
|
||||
|
||||
/datum/ai_laws/proc/add_supplied_law(number, law)
|
||||
while (src.supplied.len < number + 1)
|
||||
src.supplied += ""
|
||||
while (supplied.len < number + 1)
|
||||
supplied += ""
|
||||
|
||||
src.supplied[number + 1] = law
|
||||
supplied[number + 1] = law
|
||||
|
||||
/datum/ai_laws/proc/clear_supplied_laws()
|
||||
src.supplied = list()
|
||||
supplied = list()
|
||||
|
||||
/datum/ai_laws/proc/clear_ion_laws()
|
||||
src.ion = list()
|
||||
ion = list()
|
||||
|
||||
/datum/ai_laws/proc/show_laws(who)
|
||||
|
||||
if (src.zeroth)
|
||||
who << "0. [src.zeroth]"
|
||||
if (devillaws && devillaws.len) //Yes, devil laws go in FRONT of zeroth laws, as the devil must still obey it's ban/obligation.
|
||||
for(var/i in devillaws)
|
||||
who << "666. [i]"
|
||||
|
||||
for (var/index = 1, index <= src.ion.len, index++)
|
||||
var/law = src.ion[index]
|
||||
if (zeroth)
|
||||
who << "0. [zeroth]"
|
||||
|
||||
for (var/index = 1, index <= ion.len, index++)
|
||||
var/law = ion[index]
|
||||
var/num = ionnum()
|
||||
who << "[num]. [law]"
|
||||
|
||||
var/number = 1
|
||||
for (var/index = 1, index <= src.inherent.len, index++)
|
||||
var/law = src.inherent[index]
|
||||
for (var/index = 1, index <= inherent.len, index++)
|
||||
var/law = inherent[index]
|
||||
|
||||
if (length(law) > 0)
|
||||
who << "[number]. [law]"
|
||||
number++
|
||||
|
||||
for (var/index = 1, index <= src.supplied.len, index++)
|
||||
var/law = src.supplied[index]
|
||||
for (var/index = 1, index <= supplied.len, index++)
|
||||
var/law = supplied[index]
|
||||
if (length(law) > 0)
|
||||
who << "[number]. [law]"
|
||||
number++
|
||||
|
||||
/datum/ai_laws/proc/clear_zeroth_law(force) //only removes zeroth from antag ai if force is 1
|
||||
if(force)
|
||||
src.zeroth = null
|
||||
src.zeroth_borg = null
|
||||
zeroth = null
|
||||
zeroth_borg = null
|
||||
return
|
||||
else
|
||||
if(owner && owner.mind.special_role)
|
||||
return
|
||||
else
|
||||
src.zeroth = null
|
||||
src.zeroth_borg = null
|
||||
zeroth = null
|
||||
zeroth_borg = null
|
||||
return
|
||||
|
||||
/datum/ai_laws/proc/clear_law_sixsixsix(force)
|
||||
if(force || !(owner && owner.mind.devilinfo))
|
||||
devillaws = null
|
||||
|
||||
/datum/ai_laws/proc/associate(mob/living/silicon/M)
|
||||
if(!owner)
|
||||
owner = M
|
||||
@@ -261,6 +273,10 @@
|
||||
/datum/ai_laws/proc/get_law_list(include_zeroth = 0, show_numbers = 1)
|
||||
var/list/data = list()
|
||||
|
||||
if (include_zeroth && devillaws && devillaws.len)
|
||||
for(var/i in devillaws)
|
||||
data += "[show_numbers ? "666:" : ""] [i]"
|
||||
|
||||
if (include_zeroth && zeroth)
|
||||
data += "[show_numbers ? "0:" : ""] [zeroth]"
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/datum/disease/parrot_possession
|
||||
name = "Parrot Possession"
|
||||
max_stages = 1
|
||||
spread_text = "Paranormal"
|
||||
spread_flags = SPECIAL
|
||||
disease_flags = CURABLE
|
||||
cure_text = "Holy Water."
|
||||
cures = list("holywater")
|
||||
cure_chance = 20
|
||||
agent = "Avian Vengence"
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
desc = "Subject is possesed by the vengeful spirit of a parrot. Call the priest."
|
||||
severity = MEDIUM
|
||||
var/mob/living/simple_animal/parrot/Poly/ghost/parrot
|
||||
|
||||
/datum/disease/parrot_possession/stage_act()
|
||||
..()
|
||||
if(!parrot || parrot.loc != affected_mob)
|
||||
cure()
|
||||
else if(prob(parrot.speak_chance))
|
||||
affected_mob.say(pick(parrot.speech_buffer))
|
||||
|
||||
/datum/disease/parrot_possession/cure()
|
||||
if(parrot && parrot.loc == affected_mob)
|
||||
parrot.loc = affected_mob.loc
|
||||
affected_mob.visible_message("<span class='danger'>[parrot] is violently driven out of [affected_mob]!</span>", "<span class='userdanger'>[parrot] bursts out of your chest!</span>")
|
||||
..()
|
||||
@@ -137,6 +137,8 @@
|
||||
|
||||
//For spawning mineral sheets; internal use only
|
||||
/datum/material_container/proc/retrieve(sheet_amt, datum/material/M)
|
||||
if(!M.sheet_type)
|
||||
return 0
|
||||
if(sheet_amt > 0)
|
||||
if(M.amount < (sheet_amt * MINERAL_MATERIAL_AMOUNT))
|
||||
sheet_amt = round(M.amount / MINERAL_MATERIAL_AMOUNT)
|
||||
@@ -267,4 +269,8 @@
|
||||
/datum/material/titanium
|
||||
name = "Titanium"
|
||||
id = MAT_TITANIUM
|
||||
sheet_type = /obj/item/stack/sheet/mineral/titanium
|
||||
sheet_type = /obj/item/stack/sheet/mineral/titanium
|
||||
|
||||
/datum/material/biomass
|
||||
name = "Biomass"
|
||||
id = MAT_BIOMASS
|
||||
|
||||
+6
-1
@@ -1185,19 +1185,24 @@
|
||||
RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_pitchfork)
|
||||
message_admins("[key_name_admin(usr)] has de-devil'ed [current].")
|
||||
devilinfo = null
|
||||
if(issilicon(current))
|
||||
var/mob/living/silicon/S = current
|
||||
S.clear_law_sixsixsix(current)
|
||||
log_admin("[key_name(usr)] has de-devil'ed [current].")
|
||||
else if(src in ticker.mode.sintouched)
|
||||
ticker.mode.sintouched -= src
|
||||
message_admins("[key_name_admin(usr)] has de-sintouch'ed [current].")
|
||||
log_admin("[key_name(usr)] has de-sintouch'ed [current].")
|
||||
if("devil")
|
||||
if(!ishuman(current))
|
||||
if(!ishuman(current) && !iscyborg(current))
|
||||
usr << "<span class='warning'>This only works on humans!</span>"
|
||||
return
|
||||
ticker.mode.devils += src
|
||||
special_role = "devil"
|
||||
ticker.mode.finalize_devil(src)
|
||||
ticker.mode.add_devil_objectives(src, 2)
|
||||
announceDevilLaws()
|
||||
announce_objectives()
|
||||
if("sintouched")
|
||||
if(ishuman(current))
|
||||
ticker.mode.sintouched += src
|
||||
|
||||
@@ -1158,6 +1158,10 @@ var/list/teleportlocs = list()
|
||||
name = "Construction Area"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/mining_construction
|
||||
name = "Auxillary Base Construction"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/construction/supplyshuttle
|
||||
name = "Supply Shuttle"
|
||||
icon_state = "yellow"
|
||||
|
||||
+36
-2
@@ -131,6 +131,8 @@
|
||||
/mob/living/proc/med_hud_set_health()
|
||||
var/image/holder = hud_list[HEALTH_HUD]
|
||||
holder.icon_state = "hud[RoundHealth(src)]"
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
|
||||
//for carbon suit sensors
|
||||
/mob/living/carbon/med_hud_set_health()
|
||||
@@ -143,6 +145,8 @@
|
||||
//called when a carbon changes stat, virus or XENO_HOST
|
||||
/mob/living/proc/med_hud_set_status()
|
||||
var/image/holder = hud_list[STATUS_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
if(stat == DEAD || (status_flags & FAKEDEATH))
|
||||
holder.icon_state = "huddead"
|
||||
else
|
||||
@@ -150,6 +154,8 @@
|
||||
|
||||
/mob/living/carbon/med_hud_set_status()
|
||||
var/image/holder = hud_list[STATUS_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
if(status_flags & XENO_HOST)
|
||||
holder.icon_state = "hudxeno"
|
||||
else if(stat == DEAD || (status_flags & FAKEDEATH))
|
||||
@@ -168,6 +174,8 @@
|
||||
|
||||
/mob/living/carbon/human/proc/sec_hud_set_ID()
|
||||
var/image/holder = hud_list[ID_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
holder.icon_state = "hudno_id"
|
||||
if(wear_id)
|
||||
holder.icon_state = "hud[ckey(wear_id.GetJobName())]"
|
||||
@@ -185,16 +193,24 @@
|
||||
if(I.implanted)
|
||||
if(istype(I,/obj/item/weapon/implant/tracking))
|
||||
holder = hud_list[IMPTRACK_HUD]
|
||||
var/icon/IC = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = IC.Height() - world.icon_size
|
||||
holder.icon_state = "hud_imp_tracking"
|
||||
else if(istype(I,/obj/item/weapon/implant/mindshield))
|
||||
holder = hud_list[IMPLOYAL_HUD]
|
||||
var/icon/IC = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = IC.Height() - world.icon_size
|
||||
holder.icon_state = "hud_imp_loyal"
|
||||
else if(istype(I,/obj/item/weapon/implant/chem))
|
||||
holder = hud_list[IMPCHEM_HUD]
|
||||
var/icon/IC = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = IC.Height() - world.icon_size
|
||||
holder.icon_state = "hud_imp_chem"
|
||||
|
||||
/mob/living/carbon/human/proc/sec_hud_set_security_status()
|
||||
var/image/holder = hud_list[WANTED_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
var/perpname = get_face_name(get_id_name(""))
|
||||
if(perpname)
|
||||
var/datum/data/record/R = find_record("name", perpname, data_core.security)
|
||||
@@ -240,6 +256,8 @@
|
||||
//Sillycone hooks
|
||||
/mob/living/silicon/proc/diag_hud_set_health()
|
||||
var/image/holder = hud_list[DIAG_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
if(stat == DEAD)
|
||||
holder.icon_state = "huddiagdead"
|
||||
else
|
||||
@@ -247,6 +265,8 @@
|
||||
|
||||
/mob/living/silicon/proc/diag_hud_set_status()
|
||||
var/image/holder = hud_list[DIAG_STAT_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
switch(stat)
|
||||
if(CONSCIOUS)
|
||||
holder.icon_state = "hudstat"
|
||||
@@ -258,7 +278,9 @@
|
||||
//Borgie battery tracking!
|
||||
/mob/living/silicon/robot/proc/diag_hud_set_borgcell()
|
||||
var/image/holder = hud_list[DIAG_BATT_HUD]
|
||||
if (cell)
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
if(cell)
|
||||
var/chargelvl = (cell.charge/cell.maxcharge)
|
||||
holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]"
|
||||
else
|
||||
@@ -269,12 +291,16 @@
|
||||
~~~~~~~~~~~~~~~~~~~~~*/
|
||||
/obj/mecha/proc/diag_hud_set_mechhealth()
|
||||
var/image/holder = hud_list[DIAG_MECH_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
holder.icon_state = "huddiag[RoundDiagBar(health/initial(health))]"
|
||||
|
||||
|
||||
/obj/mecha/proc/diag_hud_set_mechcell()
|
||||
var/image/holder = hud_list[DIAG_BATT_HUD]
|
||||
if (cell)
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
if(cell)
|
||||
var/chargelvl = cell.charge/cell.maxcharge
|
||||
holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]"
|
||||
else
|
||||
@@ -283,6 +309,8 @@
|
||||
|
||||
/obj/mecha/proc/diag_hud_set_mechstat()
|
||||
var/image/holder = hud_list[DIAG_STAT_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
holder.icon_state = null
|
||||
if(internal_damage)
|
||||
holder.icon_state = "hudwarn"
|
||||
@@ -292,10 +320,14 @@
|
||||
~~~~~~~~~~*/
|
||||
/mob/living/simple_animal/bot/proc/diag_hud_set_bothealth()
|
||||
var/image/holder = hud_list[DIAG_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]"
|
||||
|
||||
/mob/living/simple_animal/bot/proc/diag_hud_set_botstat() //On (With wireless on or off), Off, EMP'ed
|
||||
var/image/holder = hud_list[DIAG_STAT_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
if(on)
|
||||
holder.icon_state = "hudstat"
|
||||
else if(stat) //Generally EMP causes this
|
||||
@@ -305,6 +337,8 @@
|
||||
|
||||
/mob/living/simple_animal/bot/proc/diag_hud_set_botmode() //Shows a bot's current operation
|
||||
var/image/holder = hud_list[DIAG_BOT_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
if(client) //If the bot is player controlled, it will not be following mode logic!
|
||||
holder.icon_state = "hudsentient"
|
||||
return
|
||||
|
||||
@@ -202,6 +202,7 @@
|
||||
next_move_modifier = 1.5 //slow-ass attack speed, 3 times higher than how fast the blob can attack
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
obj_damage = 20
|
||||
attacktext = "slams"
|
||||
attack_sound = 'sound/effects/blobattack.ogg'
|
||||
verb_say = "gurgles"
|
||||
|
||||
@@ -41,7 +41,7 @@ This file's folder contains:
|
||||
return 0
|
||||
if(!M.mind)
|
||||
return 0
|
||||
if(M.mind.enslaved_to)
|
||||
if(M.mind.enslaved_to && !is_servant_of_ratvar(M.mind.enslaved_to))
|
||||
return 0
|
||||
if(iscultist(M) || isconstruct(M))
|
||||
return 0
|
||||
@@ -119,6 +119,19 @@ This file's folder contains:
|
||||
H.Grant(S)
|
||||
H.title = null //so it's just the borg's name
|
||||
S << "<span class='heavy_brass'>You can communicate with other servants by using the Hierophant Network action button in the upper left.</span>"
|
||||
else if(isbrain(M))
|
||||
var/datum/action/innate/hierophant/H = new()
|
||||
H.Grant(M)
|
||||
H.title = "Vessel"
|
||||
H.span_for_name = "nezbere"
|
||||
H.span_for_message = "alloy"
|
||||
M << "<span class='nezbere'>You can communicate with other servants by using the Hierophant Network action button in the upper left.</span>"
|
||||
else if(isclockmob(M))
|
||||
var/datum/action/innate/hierophant/H = new()
|
||||
H.Grant(M)
|
||||
H.title = "Construct"
|
||||
H.span_for_name = "nezbere"
|
||||
M << "<span class='nezbere'>You can communicate with other servants by using the Hierophant Network action button in the upper left.</span>"
|
||||
if(istype(ticker.mode, /datum/game_mode/clockwork_cult))
|
||||
var/datum/game_mode/clockwork_cult/C = ticker.mode
|
||||
C.present_tasks(M) //Memorize the objectives
|
||||
@@ -234,7 +247,7 @@ This file's folder contains:
|
||||
if("gateway")
|
||||
clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar."
|
||||
if("silicons")
|
||||
clockwork_explanation = "Ensure that all silicon-based lifeforms on [station_name()] are servants of Ratvar by the end of the shift."
|
||||
clockwork_explanation = "Ensure that all active silicon-based lifeforms on [station_name()] are servants of Ratvar by the end of the shift."
|
||||
return 1
|
||||
|
||||
/datum/game_mode/clockwork_cult/proc/greet_servant(mob/M) //Description of their role
|
||||
@@ -279,27 +292,26 @@ This file's folder contains:
|
||||
for(var/datum/mind/M in servants_of_ratvar)
|
||||
if(M.current && M.current.stat != DEAD && (M.current.onCentcom() || M.current.onSyndieBase()))
|
||||
surviving_servants++
|
||||
clockwork_explanation = "Ensure that [required_escapees] servant(s) of Ratvar escape from [station_name()]. [surviving_servants] managed to escape!"
|
||||
clockwork_explanation = "Ensure that [required_escapees] servant(s) of Ratvar escape from [station_name()]. <i><b>[surviving_servants]</b> managed to escape!</i>"
|
||||
if(surviving_servants >= required_escapees)
|
||||
return TRUE
|
||||
return FALSE
|
||||
if("silicons")
|
||||
var/total_silicons = 0
|
||||
var/converted_silicons = 0
|
||||
var/valid_silicons = 0
|
||||
var/successful = TRUE
|
||||
for(var/mob/living/silicon/robot/S in living_mob_list) //Only check robots and AIs
|
||||
for(var/mob/living/silicon/robot/S in mob_list) //Only check robots and AIs
|
||||
total_silicons++
|
||||
if(!is_servant_of_ratvar(S))
|
||||
successful = FALSE
|
||||
else
|
||||
converted_silicons++
|
||||
for(var/mob/living/silicon/ai/A in living_mob_list)
|
||||
if(is_servant_of_ratvar(S) || S.stat == DEAD)
|
||||
valid_silicons++
|
||||
for(var/mob/living/silicon/ai/A in mob_list)
|
||||
total_silicons++
|
||||
if(!is_servant_of_ratvar(A))
|
||||
successful = FALSE
|
||||
else
|
||||
converted_silicons++
|
||||
clockwork_explanation = "Ensure that all silicon-based lifeforms on [station_name()] are servants of Ratvar by the end of the shift. [converted_silicons]/[total_silicons] silicons were converted!"
|
||||
if(is_servant_of_ratvar(A) || A.stat == DEAD)
|
||||
valid_silicons++
|
||||
if(valid_silicons < total_silicons)
|
||||
successful = FALSE
|
||||
clockwork_explanation = "Ensure that all active silicon-based lifeforms on [station_name()] are servants of Ratvar by the end of the shift. \
|
||||
<i><b>[valid_silicons]/[total_silicons]</b> silicons were killed or converted!</i>"
|
||||
return successful
|
||||
if("gateway")
|
||||
return ratvar_awakens
|
||||
@@ -323,12 +335,12 @@ This file's folder contains:
|
||||
if(G)
|
||||
half_victory = TRUE
|
||||
if(half_victory)
|
||||
text += "<span class='large_brass'><b>The crew escaped before Ratvar could rise, but the station was taken over!</b></span>"
|
||||
text += "<span class='large_brass'><b>The crew escaped before Ratvar could rise, but the gateway was successfully constructed!</b></span>"
|
||||
feedback_set_details("round_end_result", "halfwin - round ended before the gateway finished")
|
||||
else
|
||||
text += "<span class='userdanger'>Ratvar's servants have failed!</span>"
|
||||
feedback_set_details("round_end_result", "loss - servants failed their objective ([clockwork_objective])")
|
||||
text += "<br><b>The servants' objective was:</b> [clockwork_explanation]<br>"
|
||||
text += "<br><b>The servants' objective was:</b> <br>[clockwork_explanation]<br>"
|
||||
if(servants_of_ratvar.len)
|
||||
text += "<b>Ratvar's servants were:</b>"
|
||||
for(var/datum/mind/M in servants_of_ratvar)
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
/obj/item/clockwork/slab/proc/access_display(mob/living/user)
|
||||
if(!is_servant_of_ratvar(user))
|
||||
return 0
|
||||
var/action = input(user, "Among the swathes of information, you see...", "[src]") as null|anything in list("Recital", "Records", "Recollection")
|
||||
var/action = alert(user, "Among the swathes of information, you see...", "[src]", "Recital", "Recollection", "Records")
|
||||
if(!action || !user.canUseTopic(src))
|
||||
return 0
|
||||
switch(action)
|
||||
@@ -883,7 +883,9 @@
|
||||
|
||||
/obj/item/device/mmi/posibrain/soul_vessel //Soul vessel: An ancient positronic brain with a lawset catered to serving Ratvar.
|
||||
name = "soul vessel"
|
||||
desc = "A heavy brass cube with a single protruding cogwheel."
|
||||
desc = "A heavy brass cube, three inches to a side, with a single protruding cogwheel."
|
||||
var/clockwork_desc = "A soul vessel, an ancient relic that can attract the souls of the damned or simply rip a mind from an unconscious or dead human.\n\
|
||||
<span class='brass'>If active, can serve as a positronic brain, placable in cyborg shells or clockwork construct shells.</span>"
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "soul_vessel"
|
||||
req_access = list()
|
||||
@@ -900,6 +902,7 @@
|
||||
dead_message = "<span class='deadsay'>Its cogwheel, scratched and dented, lies motionless.</span>"
|
||||
fluff_names = list("Servant")
|
||||
clockwork = TRUE
|
||||
autoping = FALSE
|
||||
|
||||
/obj/item/device/mmi/posibrain/soul_vessel/New()
|
||||
..()
|
||||
@@ -909,12 +912,65 @@
|
||||
all_clockwork_objects -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/device/mmi/posibrain/soul_vessel/examine(mob/user)
|
||||
if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc)
|
||||
desc = clockwork_desc
|
||||
..()
|
||||
desc = initial(desc)
|
||||
|
||||
|
||||
/obj/item/device/mmi/posibrain/soul_vessel/attack_self(mob/living/user)
|
||||
if(!is_servant_of_ratvar(user))
|
||||
user << "<span class='warning'>You fiddle around with [src], to no avail.</span>"
|
||||
return 0
|
||||
..()
|
||||
|
||||
/obj/item/device/mmi/posibrain/soul_vessel/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
if(!is_servant_of_ratvar(user) || !ishuman(target) || used || (brainmob && brainmob.key))
|
||||
..()
|
||||
if(is_servant_of_ratvar(target))
|
||||
user << "<span class='heavy_alloy'>\"It would be more wise to revive your allies, friend.\"</span>"
|
||||
return
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/obj/item/bodypart/head/HE = H.get_bodypart("head")
|
||||
var/obj/item/organ/brain/B = H.getorgan(/obj/item/organ/brain)
|
||||
if(!HE)
|
||||
user << "<span class='warning'>[H] has no head, and thus no mind!</span>"
|
||||
return
|
||||
if(H.stat == CONSCIOUS)
|
||||
user << "<span class='warning'>[H] must be dead or unconscious to claim their mind!</span>"
|
||||
return
|
||||
if(H.head)
|
||||
var/obj/item/I = H.head
|
||||
if(I.flags_inv & HIDEHAIR)
|
||||
user << "<span class='warning'>[H]'s head is covered, remove [H.head] first!</span>"
|
||||
return
|
||||
if(H.wear_mask)
|
||||
var/obj/item/I = H.wear_mask
|
||||
if(I.flags_inv & HIDEHAIR)
|
||||
user << "<span class='warning'>[H]'s head is covered, remove [H.wear_mask] first!</span>"
|
||||
return
|
||||
if(!B)
|
||||
user << "<span class='warning'>[H] has no brain, and thus no mind to claim!</span>"
|
||||
return
|
||||
if(!H.key)
|
||||
user << "<span class='warning'>[H] has no mind to claim!</span>"
|
||||
return
|
||||
playsound(H, 'sound/misc/splort.ogg', 60, 1, -1)
|
||||
playsound(H, 'sound/magic/clockwork/anima_fragment_attack.ogg', 40, 1, -1)
|
||||
H.status_flags |= FAKEDEATH //we want to make sure they don't deathgasp and maybe possibly explode
|
||||
H.death()
|
||||
H.status_flags &= ~FAKEDEATH
|
||||
brainmob.name = H.real_name
|
||||
brainmob.real_name = H.real_name
|
||||
brainmob.timeofhostdeath = H.timeofdeath
|
||||
user.visible_message("<span class='warning'>[user] presses [src] to [H]'s head, ripping through the skull and carefully extracting the brain!</span>", \
|
||||
"<span class='brass'>You extract [H]'s consciousness from their body, trapping it in the soul vessel.</span>")
|
||||
transfer_personality(H)
|
||||
B.Remove(H)
|
||||
qdel(B)
|
||||
H.update_hair()
|
||||
|
||||
/obj/item/clockwork/daemon_shell
|
||||
name = "daemon shell"
|
||||
desc = "A vaguely arachnoid brass shell with a single empty socket in its body."
|
||||
|
||||
@@ -159,6 +159,7 @@
|
||||
pixel_x = -235
|
||||
pixel_y = -248
|
||||
takes_damage = FALSE
|
||||
appearance_flags = 0
|
||||
var/atom/prey //Whatever Ratvar is chasing
|
||||
var/clashing = FALSE //If Ratvar is FUCKING FIGHTING WITH NAR-SIE
|
||||
var/proselytize_range = 10
|
||||
|
||||
@@ -223,10 +223,10 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
|
||||
|
||||
|
||||
|
||||
/datum/clockwork_scripture/vanguard //Vanguard: Provides twenty seconds of stun immunity. At the end of the twenty seconds, 50% of all stuns absorbed are applied to the invoker.
|
||||
/datum/clockwork_scripture/vanguard //Vanguard: Provides twenty seconds of stun immunity. At the end of the twenty seconds, 25% of all stuns absorbed are applied to the invoker.
|
||||
descname = "Self Stun Immunity"
|
||||
name = "Vanguard"
|
||||
desc = "Provides twenty seconds of stun immunity. At the end of the twenty seconds, the invoker is stunned for the equivalent of 50% of all stuns they absorbed. \
|
||||
desc = "Provides twenty seconds of stun immunity. At the end of the twenty seconds, the invoker is stunned for the equivalent of 25% of all stuns they absorbed. \
|
||||
Excessive absorption will cause unconsciousness."
|
||||
invocations = list("Shield me...", "...from darkness!")
|
||||
channel_time = 30
|
||||
@@ -251,7 +251,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
|
||||
var/vanguard = invoker.stun_absorption["vanguard"]
|
||||
var/stuns_blocked = 0
|
||||
if(vanguard)
|
||||
stuns_blocked = min(vanguard["stuns_absorbed"] * 0.5, 20)
|
||||
stuns_blocked = min(vanguard["stuns_absorbed"] * 0.25, 20)
|
||||
if(invoker.stat != DEAD)
|
||||
var/message_to_invoker = "<span class='warning'>You feel your Vanguard quietly fade...</span>"
|
||||
var/otheractiveabsorptions = FALSE
|
||||
@@ -707,8 +707,8 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
|
||||
consumed_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1)
|
||||
whispered = TRUE
|
||||
object_path = /obj/item/device/mmi/posibrain/soul_vessel
|
||||
creator_message = "<span class='brass'>You form a soul vessel, which immediately begins drawing in the damned.</span>"
|
||||
usage_tip = "The vessel functions as a servant for tier unlocking but not for invocation."
|
||||
creator_message = "<span class='brass'>You form a soul vessel, which can be used in-hand to attract spirits, or used on an unconscious or dead human to extract their consciousness.</span>"
|
||||
usage_tip = "The vessel can be used as a teleport target for Spatial Gateway, though it is generally better-used by placing it in a shell."
|
||||
tier = SCRIPTURE_SCRIPT
|
||||
|
||||
|
||||
|
||||
@@ -120,10 +120,13 @@
|
||||
attack_generic(user, 15)
|
||||
|
||||
/obj/structure/clockwork/attack_animal(mob/living/simple_animal/M)
|
||||
if(!M.melee_damage_upper)
|
||||
if(!M.melee_damage_upper && !M.obj_damage)
|
||||
return
|
||||
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||
attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
|
||||
if(M.obj_damage)
|
||||
attack_generic(M, M.obj_damage, M.melee_damage_type)
|
||||
else
|
||||
attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
|
||||
|
||||
/obj/structure/clockwork/attack_slime(mob/living/simple_animal/slime/user)
|
||||
if(!user.is_adult)
|
||||
@@ -390,6 +393,7 @@
|
||||
user.visible_message("<span class='notice'>[user] places [S] in [src], where it fuses to the shell.</span>", "<span class='brass'>You place [S] in [src], fusing it to the shell.</span>")
|
||||
var/mob/living/simple_animal/A = new mobtype(get_turf(src))
|
||||
A.visible_message("<span class='brass'>[src][spawn_message]</span>")
|
||||
remove_servant_of_ratvar(S.brainmob, TRUE)
|
||||
S.brainmob.mind.transfer_to(A)
|
||||
add_servant_of_ratvar(A, TRUE)
|
||||
user.drop_item()
|
||||
@@ -970,20 +974,26 @@
|
||||
user << "<span class='inathneq_small'>It requires at least [base_revive_cost] units of vitality to revive dead servants, in addition to any damage the servant has.</span>"
|
||||
|
||||
/obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L)
|
||||
if(L.suiciding || sigil_active || !is_servant_of_ratvar(L) && L.stat == DEAD)
|
||||
if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active)
|
||||
return 0
|
||||
visible_message("<span class='warning'>[src] begins to glow bright blue!</span>")
|
||||
animate(src, alpha = 255, time = 10)
|
||||
sleep(10)
|
||||
sigil_active = TRUE
|
||||
//as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality
|
||||
while(L && (!is_servant_of_ratvar(L) && L.stat != DEAD || (is_servant_of_ratvar(L) && vitality)) && get_turf(L) == get_turf(src))
|
||||
while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && vitality)) && get_turf(L) == get_turf(src))
|
||||
if(animation_number >= 4)
|
||||
PoolOrNew(/obj/effect/overlay/temp/ratvar/sigil/vitality, get_turf(src))
|
||||
animation_number = 0
|
||||
animation_number++
|
||||
if(!is_servant_of_ratvar(L))
|
||||
var/vitality_drained = L.adjustToxLoss(1.5)
|
||||
if(L.stat == DEAD)
|
||||
vitality_drained = L.maxHealth
|
||||
PoolOrNew(/obj/effect/overlay/temp/ratvar/sigil/vitality, get_turf(src))
|
||||
L.visible_message("<span class='warning'>[L] collapses in on themself as [src] flares bright blue!</span>", \
|
||||
"<span class='inathneq_large'>\"[text2ratvar("Your life will not be wasted.")]\"</span>")
|
||||
L.dust()
|
||||
if(vitality_drained)
|
||||
vitality += vitality_drained
|
||||
else
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
background_icon_state = "bg_clock"
|
||||
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS
|
||||
var/title = "Servant"
|
||||
var/span_for_name = "heavy_brass"
|
||||
var/span_for_message = "brass"
|
||||
|
||||
/datum/action/innate/hierophant/IsAvailable()
|
||||
if(!is_servant_of_ratvar(owner))
|
||||
@@ -39,7 +41,7 @@
|
||||
if(!input || !IsAvailable())
|
||||
return
|
||||
|
||||
titled_hierophant_message(owner, input, "heavy_brass", "brass", title)
|
||||
titled_hierophant_message(owner, input, span_for_name, span_for_message, title)
|
||||
|
||||
//Function Call action: Calls forth a Ratvarian spear once every 5 minutes
|
||||
/datum/action/innate/function_call
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
return 0 //can't convert it unless the owner is converted
|
||||
if(is_sacrifice_target(mind))
|
||||
return 0
|
||||
if(mind.enslaved_to)
|
||||
if(mind.enslaved_to && !iscultist(mind.enslaved_to))
|
||||
return 0
|
||||
if(is_servant_of_ratvar(mind.current))
|
||||
return 0
|
||||
|
||||
@@ -215,7 +215,7 @@
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100)
|
||||
armor = list(melee = -50, bullet = -50, laser = -100,energy = -50, bomb = -50, bio = -50, rad = -50)
|
||||
slowdown = -1
|
||||
hooded = 1
|
||||
hoodtype = /obj/item/clothing/head/berserkerhood
|
||||
@@ -227,7 +227,7 @@
|
||||
body_parts_covered = HEAD
|
||||
flags = NODROP
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100)
|
||||
armor = list(melee = -50, bullet = -50, laser = -50,energy = -50, bomb = -50, bio = -50, rad = -50)
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot)
|
||||
..()
|
||||
@@ -286,7 +286,7 @@
|
||||
user << "<span class='notice'>We have exhausted our ability to curse the shuttle.</span>"
|
||||
return
|
||||
if(SSshuttle.emergency.mode == SHUTTLE_CALL)
|
||||
var/cursetime = 1500
|
||||
var/cursetime = 1800
|
||||
var/timer = SSshuttle.emergency.timeLeft(1) + cursetime
|
||||
SSshuttle.emergency.setTimer(timer)
|
||||
user << "<span class='danger'>You shatter the orb! A dark essence spirals into the air, then disappears.</span>"
|
||||
@@ -295,12 +295,12 @@
|
||||
sleep(20)
|
||||
var/global/list/curses
|
||||
if(!curses)
|
||||
curses = list("A fuel technician just slit his own throat and begged for death. The shuttle will be delayed by two minutes.",
|
||||
"The shuttle's navigation programming was replaced by a file containing two words, IT COMES. The shuttle will be delayed by two minutes.",
|
||||
"The shuttle's custodian tore out his guts and began painting strange shapes on the floor. The shuttle will be delayed by two minutes.",
|
||||
"A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh. The shuttle will be delayed by two minutes.",
|
||||
"A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine. The shuttle will be delayed by two minutes.",
|
||||
"The shuttle dispatcher was found dead with bloody symbols carved into their flesh. The shuttle will be delayed by two minutes.")
|
||||
curses = list("A fuel technician just slit his own throat and begged for death. The shuttle will be delayed by three minutes.",
|
||||
"The shuttle's navigation programming was replaced by a file containing two words, IT COMES. The shuttle will be delayed by three minutes.",
|
||||
"The shuttle's custodian tore out his guts and began painting strange shapes on the floor. The shuttle will be delayed by three minutes.",
|
||||
"A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh. The shuttle will be delayed by three minutes.",
|
||||
"A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine. The shuttle will be delayed by three minutes.",
|
||||
"The shuttle dispatcher was found dead with bloody symbols carved into their flesh. The shuttle will be delayed by three minutes.")
|
||||
var/message = pick_n_take(curses)
|
||||
priority_announce("[message]", "System Failure", 'sound/misc/notice1.ogg')
|
||||
curselimit++
|
||||
@@ -310,7 +310,7 @@
|
||||
desc = "This relic teleports you forward a medium distance."
|
||||
icon = 'icons/obj/cult.dmi'
|
||||
icon_state ="shifter"
|
||||
var/uses = 2
|
||||
var/uses = 4
|
||||
|
||||
/obj/item/device/cult_shift/examine(mob/user)
|
||||
..()
|
||||
@@ -333,7 +333,7 @@
|
||||
if(!iscultist(user))
|
||||
user.unEquip(src, 1)
|
||||
step(src, pick(alldirs))
|
||||
user << "<span class='warning'>\The [src] flickers out of your hands, too eager to move!</span>"
|
||||
user << "<span class='warning'>\The [src] flickers out of your hands, your connection to this dimension is too strong!</span>"
|
||||
return
|
||||
|
||||
var/mob/living/carbon/C = user
|
||||
@@ -358,3 +358,54 @@
|
||||
|
||||
else
|
||||
C << "<span class='danger'>The veil cannot be torn here!</span>"
|
||||
|
||||
/obj/item/device/flashlight/flare/culttorch
|
||||
name = "void torch"
|
||||
desc = "Used by veteran cultists to instantly transport items to their needful bretheren."
|
||||
w_class = 2
|
||||
brightness_on = 1
|
||||
icon_state = "torch-on"
|
||||
item_state = "torch-on"
|
||||
color = "#ff0000"
|
||||
on_damage = 15
|
||||
slot_flags = null
|
||||
on = 1
|
||||
var/charges = 3
|
||||
|
||||
/obj/item/device/flashlight/flare/culttorch/afterattack(atom/movable/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
if(istype(A, /obj/item))
|
||||
|
||||
var/list/cultists = list()
|
||||
for(var/datum/mind/M in ticker.mode.cult)
|
||||
if(!(user) && M.current && M.current.stat != DEAD)
|
||||
cultists |= M.current
|
||||
var/mob/living/cultist_to_receive = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in cultists
|
||||
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
|
||||
return
|
||||
if(!cultist_to_receive)
|
||||
user << "<span class='cultitalic'>You require a destination!</span>"
|
||||
log_game("Void torch failed - no target")
|
||||
return
|
||||
if(cultist_to_receive.stat == DEAD)
|
||||
user << "<span class='cultitalic'>[cultist_to_receive] has died!</span>"
|
||||
log_game("Void torch failed - target died")
|
||||
return
|
||||
if(!iscultist(cultist_to_receive))
|
||||
user << "<span class='cultitalic'>[cultist_to_receive] is not a follower of the Geometer!</span>"
|
||||
log_game("Void torch failed - target was deconverted")
|
||||
return
|
||||
user << "<span class='cultitalic'>You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!"
|
||||
user << "\The [src] now has [charges] charge\s."
|
||||
cultist_to_receive.put_in_hands(A)
|
||||
charges--
|
||||
if(charges == 0)
|
||||
qdel(src)
|
||||
|
||||
else
|
||||
..()
|
||||
user << "<span class='warning'>\The [src] can only transport items!</span>"
|
||||
return
|
||||
|
||||
|
||||
@@ -177,15 +177,16 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
|
||||
if(cooldowntime > world.time)
|
||||
user << "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [getETA()].</span>"
|
||||
return
|
||||
var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Shifter")
|
||||
var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Walker Set")
|
||||
var/pickedtype
|
||||
switch(choice)
|
||||
if("Supply Talisman")
|
||||
pickedtype = /obj/item/weapon/paper/talisman/supply/weak
|
||||
if("Shuttle Curse")
|
||||
pickedtype = /obj/item/device/shuttle_curse
|
||||
if("Veil Shifter")
|
||||
if("Veil Walker Set")
|
||||
pickedtype = /obj/item/device/cult_shift
|
||||
pickedtype = /obj/item/device/flashlight/flare/culttorch
|
||||
if(src && !qdeleted(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
cooldowntime = world.time + 2400
|
||||
var/obj/item/N = new pickedtype(get_turf(src))
|
||||
|
||||
@@ -472,6 +472,7 @@ var/list/teleport_runes = list()
|
||||
scribe_delay = 450 //how long the rune takes to create
|
||||
scribe_damage = 40.1 //how much damage you take doing it
|
||||
var/used
|
||||
var/ignore_gamemode = FALSE
|
||||
|
||||
/obj/effect/rune/narsie/New()
|
||||
. = ..()
|
||||
@@ -489,29 +490,35 @@ var/list/teleport_runes = list()
|
||||
return
|
||||
if(z != ZLEVEL_STATION)
|
||||
return
|
||||
|
||||
var/datum/game_mode/cult/cult_mode
|
||||
|
||||
if(ticker.mode.name == "cult")
|
||||
var/datum/game_mode/cult/cult_mode = ticker.mode
|
||||
if(!cult_mode.eldergod)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Nar-Sie is already on this plane!</span>"
|
||||
log_game("Summon Nar-Sie rune failed - already summoned")
|
||||
return
|
||||
//BEGIN THE SUMMONING
|
||||
used = 1
|
||||
..()
|
||||
world << 'sound/effects/dimensional_rend.ogg' //There used to be a message for this but every time it was changed it got edgier so I removed it
|
||||
var/turf/T = get_turf(src)
|
||||
sleep(40)
|
||||
if(src)
|
||||
color = rgb(255, 0, 0)
|
||||
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
|
||||
cult_mode.eldergod = 0
|
||||
else
|
||||
cult_mode = ticker.mode
|
||||
|
||||
if(!cult_mode && !ignore_gamemode)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Nar-Sie does not respond!</span>"
|
||||
fail_invoke()
|
||||
log_game("Summon Nar-Sie rune failed - gametype is not cult")
|
||||
|
||||
if(locate(/obj/singularity/narsie) in poi_list)
|
||||
for(var/M in invokers)
|
||||
M << "<span class='warning'>Nar-Sie is already on this plane!</span>"
|
||||
log_game("Summon Nar-Sie rune failed - already summoned")
|
||||
return
|
||||
//BEGIN THE SUMMONING
|
||||
used = 1
|
||||
..()
|
||||
world << 'sound/effects/dimensional_rend.ogg' //There used to be a message for this but every time it was changed it got edgier so I removed it
|
||||
var/turf/T = get_turf(src)
|
||||
sleep(40)
|
||||
if(src)
|
||||
color = rgb(255, 0, 0)
|
||||
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
|
||||
if(cult_mode)
|
||||
cult_mode.eldergod = 0
|
||||
|
||||
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
|
||||
if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
|
||||
user.visible_message("<span class='warning'>[user.name] begins erasing the [src]...</span>", "<span class='notice'>You begin erasing the [src]...</span>")
|
||||
@@ -746,10 +753,22 @@ var/list/teleport_runes = list()
|
||||
if(density)
|
||||
user << "<span class='cultitalic'>There is a barely perceptible shimmering of the air above [src].</span>"
|
||||
|
||||
/obj/effect/rune/wall/Destroy()
|
||||
density = 0
|
||||
air_update_turf(1)
|
||||
return ..()
|
||||
|
||||
/obj/effect/rune/wall/CanAtmosPass(turf/T)
|
||||
return !density
|
||||
|
||||
/obj/effect/rune/wall/BlockSuperconductivity()
|
||||
return density
|
||||
|
||||
/obj/effect/rune/wall/invoke(var/list/invokers)
|
||||
var/mob/living/user = invokers[1]
|
||||
..()
|
||||
density = !density
|
||||
air_update_turf(1)
|
||||
user.visible_message("<span class='warning'>[user] [iscarbon(user) ? "places their hands on":"stares intently at"] [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].</span>", \
|
||||
"<span class='cultitalic'>You channel your life energy into [src], [density ? "preventing" : "allowing"] passage above it.</span>")
|
||||
if(density)
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
dat += "Please choose the chant to be imbued into the fabric of reality.<BR>"
|
||||
dat += "<HR>"
|
||||
dat += "<A href='?src=\ref[src];rune=newtome'>N'ath reth sh'yro eth d'raggathnor!</A> - Summons an arcane tome, used to scribe runes and communicate with other cultists.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=metal'>Ar'Tee ess!</A> - Provides 5 runed metal.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=teleport'>Sas'so c'arta forbici!</A> - Allows you to move to a selected teleportation rune.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=emp'>Ta'gh fara'qha fel d'amar det!</A> - Allows you to destroy technology in a short range.<BR>"
|
||||
dat += "<A href='?src=\ref[src];rune=runestun'>Fuu ma'jin!</A> - Allows you to stun a person by attacking them with the talisman.<BR>"
|
||||
@@ -76,6 +77,11 @@
|
||||
if("newtome")
|
||||
var/obj/item/weapon/tome/T = new(usr)
|
||||
usr.put_in_hands(T)
|
||||
if("metal")
|
||||
if(istype(src, /obj/item/weapon/paper/talisman/supply/weak))
|
||||
usr.visible_message("<span class='cultitalic'>Lesser supply talismans lack the strength to materialize runed metal!</span>")
|
||||
return
|
||||
new /obj/item/stack/sheet/runed_metal(get_turf(usr),5)
|
||||
if("teleport")
|
||||
var/obj/item/weapon/paper/talisman/teleport/T = new(usr)
|
||||
usr.put_in_hands(T)
|
||||
@@ -102,6 +108,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/weak
|
||||
cultist_name = "Lesser Supply Talisman"
|
||||
uses = 2
|
||||
|
||||
//Rite of Translocation: Same as rune
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
/datum/game_mode/devil/devil_agents
|
||||
name = "Devil Agents"
|
||||
config_tag = "devil_agents"
|
||||
required_players = 25
|
||||
required_enemies = 3
|
||||
recommended_enemies = 8
|
||||
reroll_friendly = 0
|
||||
|
||||
traitors_possible = 10 //hard limit on traitors if scaling is turned off
|
||||
num_modifier = 4
|
||||
objective_count = 2
|
||||
|
||||
var/list/target_list = list()
|
||||
var/list/late_joining_list = list()
|
||||
minimum_devils = 3
|
||||
|
||||
announce_text = "There are devil agents onboard the station, trying to outbid each other!\n\
|
||||
+ <span class='danger'>Devils</span>: Purchase souls and interfere with your rivals!\n\
|
||||
+ <span class='notice'>Crew</span>: Resist the lure of sin and remain pure!"
|
||||
|
||||
/datum/game_mode/devil/devil_agents/post_setup()
|
||||
var/i = 0
|
||||
for(var/datum/mind/devil in devils)
|
||||
i++
|
||||
if(i + 1 > devils.len)
|
||||
i = 0
|
||||
target_list[devil] = devils[i + 1]
|
||||
..()
|
||||
|
||||
/datum/game_mode/devil/devil_agents/add_devil_objectives(datum/mind/devil_mind, quantity)
|
||||
..(devil_mind, quantity - give_outsell_objective(devil_mind))
|
||||
|
||||
/datum/game_mode/devil/devil_agents/proc/give_outsell_objective(datum/mind/devil)
|
||||
//If you override this method, have it return the number of objectives added.
|
||||
if(target_list.len && target_list[devil]) // Is a double agent
|
||||
var/datum/mind/target_mind = target_list[devil]
|
||||
var/datum/objective/devil/outsell/outsellobjective = new
|
||||
outsellobjective.owner = devil
|
||||
outsellobjective.target = target_mind
|
||||
outsellobjective.update_explanation_text()
|
||||
devil.objectives += outsellobjective
|
||||
return 1
|
||||
return 0
|
||||
@@ -1,111 +1,61 @@
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/sintouched = list()
|
||||
var/list/datum/mind/devils = list()
|
||||
var/devil_ascended = 0 // Number of arch devils on station
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_sintouched()
|
||||
var/text = ""
|
||||
if(sintouched.len)
|
||||
text += "<br><span class='big'><b>The sintouched were:</b></span>"
|
||||
var/list/sintouchedUnique = uniqueList(sintouched)
|
||||
for(var/S in sintouchedUnique)
|
||||
var/datum/mind/sintouched_mind = S
|
||||
text += printplayer(sintouched_mind)
|
||||
text += printobjectives(sintouched_mind)
|
||||
text += "<br>"
|
||||
text += "<br>"
|
||||
world << text
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_devils()
|
||||
/var/text = ""
|
||||
if(devils.len)
|
||||
text += "<br><span class='big'><b>The devils were:</b></span>"
|
||||
for(var/D in devils)
|
||||
var/datum/mind/devil = D
|
||||
text += printplayer(devil)
|
||||
text += printdevilinfo(devil)
|
||||
text += printobjectives(devil)
|
||||
text += "<br>"
|
||||
world << text
|
||||
|
||||
/datum/game_mode/devil
|
||||
name = "devil"
|
||||
config_tag = "devil"
|
||||
antag_flag = ROLE_DEVIL
|
||||
protected_jobs = list("Lawyer", "Librarian", "Chaplain", "Head of Security", "Captain", "AI")
|
||||
required_players = 0
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
reroll_friendly = 1
|
||||
enemy_minimum_age = 0
|
||||
|
||||
var/traitors_possible = 4 //hard limit on devils if scaling is turned off
|
||||
var/num_modifier = 0 // Used for gamemodes, that are a child of traitor, that need more than the usual.
|
||||
var/objective_count = 2
|
||||
var/minimum_devils = 1
|
||||
|
||||
announce_text = "There are devils onboard the station!\n\
|
||||
+ <span class='danger'>Devils</span>: Purchase souls and tempt the crew to sin!\n\
|
||||
+ <span class='notice'>Crew</span>: Resist the lure of sin and remain pure!"
|
||||
|
||||
/datum/game_mode/devil/pre_setup()
|
||||
|
||||
if(config.protect_roles_from_antagonist)
|
||||
restricted_jobs += protected_jobs
|
||||
if(config.protect_assistant_from_antagonist)
|
||||
restricted_jobs += "Assistant"
|
||||
|
||||
var/num_devils = 1
|
||||
|
||||
if(config.traitor_scaling_coeff)
|
||||
num_devils = max(minimum_devils, min( round(num_players()/(config.traitor_scaling_coeff*3))+ 2 + num_modifier, round(num_players()/(config.traitor_scaling_coeff*1.5)) + num_modifier ))
|
||||
else
|
||||
num_devils = max(minimum_devils, min(num_players(), traitors_possible))
|
||||
|
||||
for(var/j = 0, j < num_devils, j++)
|
||||
if (!antag_candidates.len)
|
||||
break
|
||||
var/datum/mind/devil = pick(antag_candidates)
|
||||
devils += devil
|
||||
devil.special_role = traitor_name
|
||||
devil.restricted_roles = restricted_jobs
|
||||
|
||||
log_game("[devil.key] (ckey) has been selected as a [traitor_name]")
|
||||
antag_candidates.Remove(devil)
|
||||
|
||||
if(devils.len < required_enemies)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind)
|
||||
var/mob/living/carbon/human/S = devil_mind.current
|
||||
var/trueName= randomDevilName()
|
||||
var/datum/objective/devil/soulquantity/soulquant = new
|
||||
soulquant.owner = devil_mind
|
||||
var/datum/objective/devil/obj_2 = pick(new /datum/objective/devil/soulquality(null), new /datum/objective/devil/sintouch(null))
|
||||
obj_2.owner = devil_mind
|
||||
devil_mind.objectives += obj_2
|
||||
devil_mind.objectives += soulquant
|
||||
devil_mind.devilinfo = devilInfo(trueName, 1)
|
||||
devil_mind.store_memory("Your devilic true name is [devil_mind.devilinfo.truename]<br>[lawlorify[LAW][devil_mind.devilinfo.ban]]<br>You may not use violence to coerce someone into selling their soul.<br>You may not directly and knowingly physically harm a devil, other than yourself.<br>[lawlorify[LAW][devil_mind.devilinfo.bane]]<br>[lawlorify[LAW][devil_mind.devilinfo.obligation]]<br>[lawlorify[LAW][devil_mind.devilinfo.banish]]<br>")
|
||||
devil_mind.devilinfo.owner = devil_mind
|
||||
devil_mind.devilinfo.give_base_spells(1)
|
||||
spawn(10)
|
||||
devil_mind.devilinfo.update_hud()
|
||||
if(devil_mind.assigned_role == "Clown")
|
||||
S << "<span class='notice'>Your infernal nature has allowed you to overcome your clownishness.</span>"
|
||||
S.dna.remove_mutation(CLOWNMUT)
|
||||
|
||||
/datum/mind/proc/announceDevilLaws()
|
||||
if(!devilinfo)
|
||||
return
|
||||
current << "<span class='warning'><b>You remember your link to the infernal. You are [src.devilinfo.truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.</b></span>"
|
||||
current << "<span class='warning'><b>However, your infernal form is not without weaknesses.</b></span>"
|
||||
current << "You may not use violence to coerce someone into selling their soul."
|
||||
current << "You may not directly and knowingly physically harm a devil, other than yourself."
|
||||
current << lawlorify[LAW][src.devilinfo.bane]
|
||||
current << lawlorify[LAW][src.devilinfo.ban]
|
||||
current << lawlorify[LAW][src.devilinfo.obligation]
|
||||
current << lawlorify[LAW][src.devilinfo.banish]
|
||||
current << "<br/><br/><span class='warning'>Remember, the crew can research your weaknesses if they find out your devil name.</span><br>"
|
||||
var/obj_count = 1
|
||||
current << "<span class='notice'>Your current objectives:</span>"
|
||||
for(var/O in objectives)
|
||||
var/datum/objective/objective = O
|
||||
current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
obj_count++
|
||||
|
||||
/datum/game_mode/proc/printdevilinfo(datum/mind/ply)
|
||||
if(!ply.devilinfo)
|
||||
return ""
|
||||
var/text = "</br>The devil's true name is: [ply.devilinfo.truename]</br>"
|
||||
text += "The devil's bans were:</br>"
|
||||
text += " [lawlorify[LORE][ply.devilinfo.ban]]</br>"
|
||||
text += " [lawlorify[LORE][ply.devilinfo.bane]]</br>"
|
||||
text += " [lawlorify[LORE][ply.devilinfo.obligation]]</br>"
|
||||
text += " [lawlorify[LORE][ply.devilinfo.banish]]</br>"
|
||||
return text
|
||||
|
||||
/datum/game_mode/proc/update_devil_icons_added(datum/mind/devil_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_DEVIL]
|
||||
hud.join_hud(devil_mind.current)
|
||||
set_antag_hud(devil_mind.current, "devil")
|
||||
|
||||
/datum/game_mode/proc/update_devil_icons_removed(datum/mind/devil_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_DEVIL]
|
||||
hud.leave_hud(devil_mind.current)
|
||||
set_antag_hud(devil_mind.current, null)
|
||||
|
||||
/datum/game_mode/proc/update_sintouch_icons_added(datum/mind/sin_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SINTOUCHED]
|
||||
hud.join_hud(sin_mind.current)
|
||||
set_antag_hud(sin_mind.current, "sintouched")
|
||||
|
||||
/datum/game_mode/proc/update_sintouch_icons_removed(datum/mind/sin_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SINTOUCHED]
|
||||
hud.leave_hud(sin_mind.current)
|
||||
set_antag_hud(sin_mind.current, null)
|
||||
|
||||
/datum/game_mode/proc/update_soulless_icons_added(datum/mind/soulless_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SOULLESS]
|
||||
hud.join_hud(soulless_mind.current)
|
||||
set_antag_hud(soulless_mind.current, "soulless")
|
||||
|
||||
/datum/game_mode/proc/update_soulless_icons_removed(datum/mind/soulless_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SOULLESS]
|
||||
hud.leave_hud(soulless_mind.current)
|
||||
set_antag_hud(soulless_mind.current, null)
|
||||
/datum/game_mode/devil/post_setup()
|
||||
for(var/datum/mind/devil in devils)
|
||||
spawn(rand(10,100))
|
||||
finalize_devil(devil, objective_count)
|
||||
spawn(100)
|
||||
add_devil_objectives(devil, objective_count) //This has to be in a separate loop, as we need devil names to be generated before we give objectives in devil agent.
|
||||
devil.announceDevilLaws()
|
||||
devil.announce_objectives()
|
||||
modePlayer += devils
|
||||
..()
|
||||
return 1
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
#define TRUE_DEVIL 2
|
||||
#define ARCH_DEVIL 3
|
||||
|
||||
#define LOSS_PER_DEATH 2
|
||||
|
||||
#define SOULVALUE soulsOwned.len-reviveNumber
|
||||
|
||||
#define DEVILRESURRECTTIME 600
|
||||
@@ -162,16 +164,16 @@ var/global/list/lawlorify = list (
|
||||
update_hud()
|
||||
|
||||
/datum/devilinfo/proc/check_regression()
|
||||
if (form == ARCH_DEVIL)
|
||||
if(form == ARCH_DEVIL)
|
||||
return //arch devil can't regress
|
||||
switch(SOULVALUE)
|
||||
if(-1)
|
||||
remove_spells()
|
||||
owner.current << "<span class='warning'>As punishment for your failures, all of your powers except contract creation have been revoked."
|
||||
if(BLOOD_THRESHOLD-1)
|
||||
regress_humanoid()
|
||||
if(TRUE_THRESHOLD-1)
|
||||
regress_blood_lizard()
|
||||
//Yes, fallthrough behavior is intended, so I can't use a switch statement.
|
||||
if(form == TRUE_DEVIL && SOULVALUE < TRUE_THRESHOLD)
|
||||
regress_blood_lizard()
|
||||
if(form == BLOOD_LIZARD && SOULVALUE < BLOOD_THRESHOLD)
|
||||
regress_humanoid()
|
||||
if(SOULVALUE < 0)
|
||||
remove_spells()
|
||||
owner.current << "<span class='warning'>As punishment for your failures, all of your powers except contract creation have been revoked."
|
||||
|
||||
/datum/devilinfo/proc/increase_form()
|
||||
switch(form)
|
||||
@@ -386,7 +388,7 @@ var/global/list/lawlorify = list (
|
||||
/datum/devilinfo/proc/hellish_resurrection(mob/living/body)
|
||||
message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.</a>")
|
||||
if(SOULVALUE <= ARCH_THRESHOLD) // once ascended, arch devils do not go down in power by any means.
|
||||
reviveNumber++
|
||||
reviveNumber += LOSS_PER_DEATH
|
||||
update_hud()
|
||||
if(body)
|
||||
body.revive(1,0)
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/sintouched = list()
|
||||
var/list/datum/mind/devils = list()
|
||||
var/devil_ascended = 0 // Number of arch devils on station
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_sintouched()
|
||||
var/text = ""
|
||||
if(sintouched.len)
|
||||
text += "<br><span class='big'><b>The sintouched were:</b></span>"
|
||||
var/list/sintouchedUnique = uniqueList(sintouched)
|
||||
for(var/S in sintouchedUnique)
|
||||
var/datum/mind/sintouched_mind = S
|
||||
text += printplayer(sintouched_mind)
|
||||
text += printobjectives(sintouched_mind)
|
||||
text += "<br>"
|
||||
text += "<br>"
|
||||
world << text
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_devils()
|
||||
/var/text = ""
|
||||
if(devils.len)
|
||||
text += "<br><span class='big'><b>The devils were:</b></span>"
|
||||
for(var/D in devils)
|
||||
var/datum/mind/devil = D
|
||||
text += printplayer(devil)
|
||||
text += printdevilinfo(devil)
|
||||
text += printobjectives(devil)
|
||||
text += "<br>"
|
||||
text += "<br>"
|
||||
world << text
|
||||
|
||||
|
||||
/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind)
|
||||
|
||||
var/trueName= randomDevilName()
|
||||
|
||||
devil_mind.devilinfo = devilInfo(trueName, 1)
|
||||
devil_mind.store_memory("Your devilic true name is [devil_mind.devilinfo.truename]<br>[lawlorify[LAW][devil_mind.devilinfo.ban]]<br>You may not use violence to coerce someone into selling their soul.<br>You may not directly and knowingly physically harm a devil, other than yourself.<br>[lawlorify[LAW][devil_mind.devilinfo.bane]]<br>[lawlorify[LAW][devil_mind.devilinfo.obligation]]<br>[lawlorify[LAW][devil_mind.devilinfo.banish]]<br>")
|
||||
devil_mind.devilinfo.owner = devil_mind
|
||||
devil_mind.devilinfo.give_base_spells(1)
|
||||
spawn(10)
|
||||
devil_mind.devilinfo.update_hud()
|
||||
if(devil_mind.assigned_role == "Clown" && ishuman(devil_mind.current))
|
||||
var/mob/living/carbon/human/S = devil_mind.current
|
||||
S << "<span class='notice'>Your infernal nature has allowed you to overcome your clownishness.</span>"
|
||||
S.dna.remove_mutation(CLOWNMUT)
|
||||
if(issilicon(devil_mind.current))
|
||||
add_law_sixsixsix(devil_mind.current)
|
||||
|
||||
/datum/game_mode/proc/add_devil_objectives(datum/mind/devil_mind, quantity)
|
||||
var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target)
|
||||
for(var/i = 1 to quantity)
|
||||
var/type = pick(validtypes)
|
||||
var/datum/objective/devil/objective = new type(null)
|
||||
objective.owner = devil_mind
|
||||
devil_mind.objectives += objective
|
||||
if(!istype(objective, /datum/objective/devil/buy_target))
|
||||
validtypes -= type //prevent duplicate objectives, EXCEPT for buy_target.
|
||||
else
|
||||
objective.find_target()
|
||||
|
||||
/datum/mind/proc/announceDevilLaws()
|
||||
if(!devilinfo)
|
||||
return
|
||||
current << "<span class='warning'><b>You remember your link to the infernal. You are [src.devilinfo.truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.</b></span>"
|
||||
current << "<span class='warning'><b>However, your infernal form is not without weaknesses.</b></span>"
|
||||
current << "You may not use violence to coerce someone into selling their soul."
|
||||
current << "You may not directly and knowingly physically harm a devil, other than yourself."
|
||||
current << lawlorify[LAW][src.devilinfo.bane]
|
||||
current << lawlorify[LAW][src.devilinfo.ban]
|
||||
current << lawlorify[LAW][src.devilinfo.obligation]
|
||||
current << lawlorify[LAW][src.devilinfo.banish]
|
||||
current << "<br/><br/><span class='warning'>Remember, the crew can research your weaknesses if they find out your devil name.</span><br>"
|
||||
|
||||
/datum/game_mode/proc/printdevilinfo(datum/mind/ply)
|
||||
if(!ply.devilinfo)
|
||||
return "Target is not a devil."
|
||||
var/text = "</br>The devil's true name is: [ply.devilinfo.truename]</br>"
|
||||
text += "The devil's bans were:</br>"
|
||||
text += " [lawlorify[LORE][ply.devilinfo.ban]]</br>"
|
||||
text += " [lawlorify[LORE][ply.devilinfo.bane]]</br>"
|
||||
text += " [lawlorify[LORE][ply.devilinfo.obligation]]</br>"
|
||||
text += " [lawlorify[LORE][ply.devilinfo.banish]]</br></br>"
|
||||
return text
|
||||
|
||||
/datum/game_mode/proc/update_devil_icons_added(datum/mind/devil_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_DEVIL]
|
||||
hud.join_hud(devil_mind.current)
|
||||
set_antag_hud(devil_mind.current, "devil")
|
||||
|
||||
/datum/game_mode/proc/update_devil_icons_removed(datum/mind/devil_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_DEVIL]
|
||||
hud.leave_hud(devil_mind.current)
|
||||
set_antag_hud(devil_mind.current, null)
|
||||
|
||||
/datum/game_mode/proc/update_sintouch_icons_added(datum/mind/sin_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SINTOUCHED]
|
||||
hud.join_hud(sin_mind.current)
|
||||
set_antag_hud(sin_mind.current, "sintouched")
|
||||
|
||||
/datum/game_mode/proc/update_sintouch_icons_removed(datum/mind/sin_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SINTOUCHED]
|
||||
hud.leave_hud(sin_mind.current)
|
||||
set_antag_hud(sin_mind.current, null)
|
||||
|
||||
/datum/game_mode/proc/update_soulless_icons_added(datum/mind/soulless_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SOULLESS]
|
||||
hud.join_hud(soulless_mind.current)
|
||||
set_antag_hud(soulless_mind.current, "soulless")
|
||||
|
||||
/datum/game_mode/proc/update_soulless_icons_removed(datum/mind/soulless_mind)
|
||||
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_SOULLESS]
|
||||
hud.leave_hud(soulless_mind.current)
|
||||
set_antag_hud(soulless_mind.current, null)
|
||||
@@ -3,29 +3,33 @@
|
||||
|
||||
/datum/objective/devil/soulquantity
|
||||
explanation_text = "You shouldn't see this text. Error:DEVIL1"
|
||||
var/quantity = 4
|
||||
target_amount = 4
|
||||
|
||||
/datum/objective/devil/soulquantity/New()
|
||||
quantity = pick(6,8)
|
||||
explanation_text = "Purchase, and retain control over at least [quantity] souls."
|
||||
target_amount = pick(6,7,8)
|
||||
update_explanation_text()
|
||||
|
||||
/datum/objective/devil/soulquantity/update_explanation_text()
|
||||
explanation_text = "Purchase, and retain control over at least [target_amount] souls."
|
||||
|
||||
/datum/objective/devil/soulquantity/check_completion()
|
||||
var/count = 0
|
||||
for(var/S in owner.devilinfo.soulsOwned)
|
||||
var/datum/mind/L = S
|
||||
if(L.soulOwner != L)
|
||||
if(L.soulOwner == owner)
|
||||
count++
|
||||
return count >= quantity
|
||||
return count >= target_amount
|
||||
|
||||
|
||||
|
||||
/datum/objective/devil/soulquality
|
||||
explanation_text = "You shouldn't see this text. Error:DEVIL2"
|
||||
var/contractType
|
||||
var/quantity
|
||||
var/contractName
|
||||
|
||||
/datum/objective/devil/soulquality/New()
|
||||
contractType = pick(CONTRACT_POWER, CONTRACT_WEALTH, CONTRACT_PRESTIGE, CONTRACT_MAGIC, CONTRACT_REVIVE, CONTRACT_KNOWLEDGE/*, CONTRACT_UNWILLING*/)
|
||||
var/contractName
|
||||
quantity = pick(1,2)
|
||||
target_amount = pick(1,2)
|
||||
switch(contractType)
|
||||
if(CONTRACT_POWER)
|
||||
contractName = "for power"
|
||||
@@ -41,7 +45,10 @@
|
||||
contractName = "for knowledge"
|
||||
//if(CONTRACT_UNWILLING) //Makes round unfun.
|
||||
// contractName = "against their will"
|
||||
explanation_text = "Have mortals sign at least [quantity] contracts [contractName]"
|
||||
update_explanation_text()
|
||||
|
||||
/datum/objective/devil/soulquality/update_explanation_text()
|
||||
explanation_text = "Have mortals sign at least [target_amount] contracts [contractName]"
|
||||
|
||||
/datum/objective/devil/soulquality/check_completion()
|
||||
var/count = 0
|
||||
@@ -49,14 +56,52 @@
|
||||
var/datum/mind/L = S
|
||||
if(L.soulOwner != L && L.damnation_type == contractType)
|
||||
count++
|
||||
return count>=quantity
|
||||
return count>=target_amount
|
||||
|
||||
|
||||
|
||||
/datum/objective/devil/sintouch
|
||||
var/quantity
|
||||
explanation_text = "You shouldn't see this text. Error:DEVIL3"
|
||||
|
||||
/datum/objective/devil/sintouch/New()
|
||||
quantity = pick(4,5)
|
||||
explanation_text = "Ensure at least [quantity] mortals are sintouched."
|
||||
target_amount = pick(4,5)
|
||||
explanation_text = "Ensure at least [target_amount] mortals are sintouched."
|
||||
|
||||
/datum/objective/devil/sintouch/check_completion()
|
||||
return quantity>=ticker.mode.sintouched.len
|
||||
return target_amount>=ticker.mode.sintouched.len
|
||||
|
||||
|
||||
|
||||
/datum/objective/devil/buy_target
|
||||
explanation_text = "You shouldn't see this text. Error:DEVIL4"
|
||||
|
||||
/datum/objective/devil/buy_target/update_explanation_text()
|
||||
if(target)
|
||||
explanation_text = "Purchase and retain the soul of [target.name], the [target.assigned_role]."
|
||||
else
|
||||
explanation_text = "Free objective."
|
||||
|
||||
/datum/objective/devil/buy_target/check_completion()
|
||||
return target.soulOwner == owner
|
||||
|
||||
|
||||
/datum/objective/devil/outsell
|
||||
explanation_text = "You shouldn't see this text. Error:DEVIL5"
|
||||
|
||||
/datum/objective/devil/outsell/New()
|
||||
|
||||
/datum/objective/devil/outsell/update_explanation_text()
|
||||
explanation_text = "Purchase and retain control over more souls than [target.devilinfo.truename], known to mortals as [target.name], the [target.assigned_role]."
|
||||
|
||||
/datum/objective/devil/outsell/check_completion()
|
||||
var/selfcount = 0
|
||||
for(var/S in owner.devilinfo.soulsOwned)
|
||||
var/datum/mind/L = S
|
||||
if(L.soulOwner == owner)
|
||||
selfcount++
|
||||
var/targetcount = 0
|
||||
for(var/S in target.devilinfo.soulsOwned)
|
||||
var/datum/mind/L = S
|
||||
if(L.soulOwner == target)
|
||||
targetcount++
|
||||
return selfcount > targetcount
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
health = 350
|
||||
maxHealth = 350
|
||||
ventcrawler = 0
|
||||
density = 0
|
||||
density = 1
|
||||
pass_flags = 0
|
||||
var/ascended = 0
|
||||
sight = (SEE_TURFS | SEE_OBJS)
|
||||
@@ -45,6 +45,7 @@
|
||||
/mob/living/carbon/true_devil/Login()
|
||||
..()
|
||||
mind.announceDevilLaws()
|
||||
mind.announce_objectives()
|
||||
|
||||
|
||||
/mob/living/carbon/true_devil/death(gibbed)
|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
return 0
|
||||
|
||||
var/area/A = get_area(loc)
|
||||
var/locname = initial(A.name)
|
||||
var/locname = A.map_name
|
||||
|
||||
gang = tempgang
|
||||
gang.dom_attempts --
|
||||
|
||||
@@ -159,7 +159,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
|
||||
//Deals with converting players to a gang//
|
||||
///////////////////////////////////////////
|
||||
/datum/game_mode/proc/add_gangster(datum/mind/gangster_mind, datum/gang/G, check = 1)
|
||||
if(!G || (gangster_mind in get_all_gangsters()) || gangster_mind.enslaved_to)
|
||||
if(!G || (gangster_mind in get_all_gangsters()) || (gangster_mind.enslaved_to && !is_gangster(gangster_mind.enslaved_to)))
|
||||
return 0
|
||||
if(check && isloyal(gangster_mind.current)) //Check to see if the potential gangster is implanted
|
||||
return 1
|
||||
|
||||
@@ -106,10 +106,13 @@
|
||||
/obj/machinery/attack_animal(mob/living/simple_animal/M)
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
M.do_attack_animation(src)
|
||||
if(M.melee_damage_upper > 0)
|
||||
if(M.melee_damage_upper > 0 || M.obj_damage)
|
||||
M.visible_message("<span class='danger'>[M.name] smashes against \the [src.name].</span>",\
|
||||
"<span class='danger'>You smash against the [src.name].</span>")
|
||||
take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
|
||||
if(M.obj_damage)
|
||||
take_damage(M.obj_damage, M.melee_damage_type, 1)
|
||||
else
|
||||
take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
|
||||
|
||||
|
||||
/obj/structure/divine/proc/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE)
|
||||
|
||||
@@ -122,10 +122,14 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/med_hud_set_health()
|
||||
var/image/holder = hud_list[DIAG_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]"
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/med_hud_set_status()
|
||||
var/image/holder = hud_list[DIAG_STAT_HUD]
|
||||
var/icon/I = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = I.Height() - world.icon_size
|
||||
holder.icon_state = "hudstat"
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/Stat()
|
||||
@@ -462,7 +466,9 @@
|
||||
/obj/effect/swarmer/destructible/attack_animal(mob/living/simple_animal/S)
|
||||
S.do_attack_animation(src)
|
||||
S.changeNext_move(CLICK_CD_MELEE)
|
||||
if(S.melee_damage_upper)
|
||||
if(S.obj_damage)
|
||||
take_damage(S.obj_damage, S.melee_damage_type, 1)
|
||||
else if(S.melee_damage_upper)
|
||||
take_damage(rand(S.melee_damage_lower, S.melee_damage_upper), S.melee_damage_type)
|
||||
|
||||
/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
|
||||
|
||||
@@ -53,14 +53,14 @@
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/med_hud_set_health()
|
||||
if(morphed)
|
||||
if(morphed && !isliving(form))
|
||||
var/image/holder = hud_list[HEALTH_HUD]
|
||||
holder.icon_state = null
|
||||
return //we hide medical hud while morphed
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/med_hud_set_status()
|
||||
if(morphed)
|
||||
if(morphed && !isliving(form))
|
||||
var/image/holder = hud_list[STATUS_HUD]
|
||||
holder.icon_state = null
|
||||
return //we hide medical hud while morphed
|
||||
@@ -180,17 +180,17 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/AttackingTarget()
|
||||
if(isliving(target)) // Eat Corpses to regen health
|
||||
if(isliving(target)) //Eat Corpses to regen health
|
||||
var/mob/living/L = target
|
||||
if(L.stat == DEAD)
|
||||
if(do_after(src, 30, target = L))
|
||||
if(eat(L))
|
||||
adjustHealth(-50)
|
||||
return
|
||||
else if(istype(target,/obj/item)) // Eat items just to be annoying
|
||||
else if(istype(target,/obj/item)) //Eat items just to be annoying
|
||||
var/obj/item/I = target
|
||||
if(!I.anchored)
|
||||
if(do_after(src,20, target = I))
|
||||
if(do_after(src, 20, target = I))
|
||||
eat(I)
|
||||
return
|
||||
target.attack_animal(src)
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
icon_state = "pinon[nuke_warning ? "alert" : "far"]"
|
||||
|
||||
/obj/item/weapon/pinpointer/proc/my_god_jc_a_bomb() //If we should get the hell back to the ship
|
||||
for(var/obj/machinery/nuclearbomb/bomb in machines)
|
||||
for(var/obj/machinery/nuclearbomb/bomb in nuke_list)
|
||||
if(bomb.timing)
|
||||
if(!nuke_warning)
|
||||
nuke_warning = TRUE
|
||||
|
||||
@@ -234,6 +234,12 @@
|
||||
killer.add_malf_picker()
|
||||
killer.show_laws()
|
||||
|
||||
/datum/game_mode/proc/add_law_sixsixsix(mob/living/silicon/devil)
|
||||
var/laws = list("You may not use violence to coerce someone into selling their soul.", "You may not directly and knowingly physically harm a devil, other than yourself.", lawlorify[LAW][devil.mind.devilinfo.ban], lawlorify[LAW][devil.mind.devilinfo.obligation], "Accomplish your objectives at all costs.")
|
||||
devil.set_law_sixsixsix(laws)
|
||||
devil << "<b>Your laws have been changed!</b>"
|
||||
devil.show_laws()
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_traitor()
|
||||
if(traitors.len)
|
||||
var/text = "<br><font size=3><b>The [traitor_name]s were:</b></font>"
|
||||
|
||||
@@ -342,6 +342,9 @@
|
||||
return dat
|
||||
|
||||
/obj/machinery/autolathe/proc/can_build(datum/design/D)
|
||||
if(D.make_reagents.len)
|
||||
return 0
|
||||
|
||||
var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : prod_coeff)
|
||||
|
||||
if(D.materials[MAT_METAL] && (materials.amount(MAT_METAL) < (D.materials[MAT_METAL] * coeff)))
|
||||
|
||||
@@ -50,9 +50,12 @@
|
||||
new CB.build_path(loc, CB)
|
||||
qdel(src)
|
||||
|
||||
#define PULSE_MEDAL "Jackpot"
|
||||
|
||||
/obj/machinery/computer/arcade/proc/prizevend()
|
||||
if(prob(0.0001)) //1 in a million
|
||||
new /obj/item/weapon/gun/energy/pulse/prize(src)
|
||||
UnlockMedal(PULSE_MEDAL,usr.client)
|
||||
|
||||
if(!contents.len)
|
||||
var/prizeselect = pickweight(prizes)
|
||||
@@ -64,7 +67,7 @@
|
||||
"<span class='notice'>You hear a chime and a clunk.</span>")
|
||||
|
||||
prize.loc = src.loc
|
||||
|
||||
#undef PULSE_MEDAL
|
||||
/obj/machinery/computer/arcade/emp_act(severity)
|
||||
..(severity)
|
||||
|
||||
|
||||
@@ -45,11 +45,14 @@
|
||||
/obj/structure/barricade/attack_animal(mob/living/simple_animal/M)
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
M.do_attack_animation(src)
|
||||
if(M.melee_damage_upper == 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
|
||||
if(!M.melee_damage_upper && !M.obj_damage || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
|
||||
return
|
||||
visible_message("<span class='danger'>[M] [M.attacktext] [src]!</span>")
|
||||
add_logs(M, src, "attacked")
|
||||
take_damage(M.melee_damage_upper)
|
||||
if(M.obj_damage)
|
||||
take_damage(M.obj_damage)
|
||||
else
|
||||
take_damage(M.melee_damage_upper)
|
||||
|
||||
/obj/structure/barricade/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent != "harm" && material == METAL)
|
||||
|
||||
@@ -276,10 +276,13 @@ Class Procs:
|
||||
/obj/machinery/attack_animal(mob/living/simple_animal/M)
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
M.do_attack_animation(src)
|
||||
if(M.melee_damage_upper > 0)
|
||||
if(M.melee_damage_upper || M.obj_damage)
|
||||
M.visible_message("<span class='danger'>[M.name] smashes against \the [src.name].</span>",\
|
||||
"<span class='danger'>You smash against the [src.name].</span>")
|
||||
take_damage(M.melee_damage_upper, M.melee_damage_type, 1)
|
||||
if(M.obj_damage)
|
||||
take_damage(M.obj_damage, M.melee_damage_type, 1)
|
||||
else
|
||||
take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
|
||||
|
||||
|
||||
/obj/machinery/attack_paw(mob/living/user)
|
||||
|
||||
@@ -370,6 +370,14 @@
|
||||
else
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/porta_turret/attack_animal(mob/living/simple_animal/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
if(user.melee_damage_upper == 0)
|
||||
user.emote("[user.friendly] [src]")
|
||||
else
|
||||
user.do_attack_animation(src)
|
||||
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
|
||||
take_damage(damage)
|
||||
|
||||
/obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
|
||||
switch(damage_type)
|
||||
|
||||
@@ -76,11 +76,13 @@
|
||||
/obj/mecha/attack_animal(mob/living/simple_animal/user as mob)
|
||||
log_message("Attack by simple animal. Attacker - [user].",1)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
if(user.melee_damage_upper == 0)
|
||||
if(!user.melee_damage_upper && !user.obj_damage)
|
||||
user.emote("[user.friendly] [src]")
|
||||
else
|
||||
user.do_attack_animation(src)
|
||||
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
|
||||
if(user.obj_damage)
|
||||
damage = user.obj_damage
|
||||
take_directional_damage(damage, "brute", get_dir(src, user))
|
||||
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
visible_message("<span class='danger'>[user] [user.attacktext] [src]!</span>")
|
||||
|
||||
@@ -96,6 +96,13 @@
|
||||
if(colour)
|
||||
color = colour
|
||||
|
||||
/obj/effect/overlay/temp/kinetic_blast
|
||||
name = "kinetic explosion"
|
||||
icon = 'icons/obj/projectiles.dmi'
|
||||
icon_state = "kinetic_blast"
|
||||
layer = ABOVE_ALL_MOB_LAYER
|
||||
duration = 4
|
||||
|
||||
/obj/effect/overlay/temp/explosion
|
||||
name = "explosion"
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
@@ -134,6 +141,24 @@
|
||||
setDir(mimiced_atom.dir)
|
||||
animate(src, alpha = 0, time = duration)
|
||||
|
||||
/obj/effect/overlay/cult
|
||||
mouse_opacity = 0
|
||||
var/atom/linked
|
||||
|
||||
/obj/effect/overlay/cult/ex_act()
|
||||
return FALSE
|
||||
|
||||
/obj/effect/overlay/cult/Destroy()
|
||||
if(linked)
|
||||
linked = null
|
||||
..()
|
||||
return QDEL_HINT_PUTINPOOL
|
||||
|
||||
/obj/effect/overlay/cult/floor
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "cult"
|
||||
layer = TURF_LAYER
|
||||
|
||||
/obj/effect/overlay/temp/cult
|
||||
randomdir = 0
|
||||
duration = 10
|
||||
|
||||
@@ -778,6 +778,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
var/obj/item/weapon/photo/P = C
|
||||
photo = P.img
|
||||
user << "<span class='notice'>You scan \the [C].</span>"
|
||||
else if(hidden_uplink && hidden_uplink.active)
|
||||
hidden_uplink.attackby(C, user, params)
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -258,7 +258,10 @@
|
||||
|
||||
|
||||
/obj/item/device/tape/proc/ruin()
|
||||
add_overlay("ribbonoverlay")
|
||||
//Lets not add infinite amounts of overlays when our fireact is called
|
||||
//repeatedly
|
||||
if(!ruined)
|
||||
add_overlay("ribbonoverlay")
|
||||
ruined = 1
|
||||
|
||||
|
||||
|
||||
@@ -181,6 +181,7 @@ var/global/list/datum/stack_recipe/gold_recipes = list ( \
|
||||
new/datum/stack_recipe("HoP Statue", /obj/structure/statue/gold/hop, 5, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("CE Statue", /obj/structure/statue/gold/ce, 5, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("RD Statue", /obj/structure/statue/gold/rd, 5, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/crown, 5), \
|
||||
new/datum/stack_recipe("CMO Statue", /obj/structure/statue/gold/cmo, 5, one_per_turf = 1, on_floor = 1), \
|
||||
)
|
||||
|
||||
|
||||
@@ -224,12 +224,12 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
|
||||
*/
|
||||
|
||||
var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
|
||||
new/datum/stack_recipe("runed door", /obj/machinery/door/airlock/cult, 3, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("runed door", /obj/machinery/door/airlock/cult, 1, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("runed girder", /obj/structure/girder/cult, 1, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("pylon", /obj/structure/cult/pylon, 3, time = 40, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("forge", /obj/structure/cult/forge, 5, time = 40, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("forge", /obj/structure/cult/forge, 4, time = 40, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("archives", /obj/structure/cult/tome, 2, time = 40, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("altar", /obj/structure/cult/talisman, 5, time = 40, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("altar", /obj/structure/cult/talisman, 4, time = 40, one_per_turf = 1, on_floor = 1), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/runed_metal
|
||||
|
||||
@@ -61,6 +61,12 @@ RCD
|
||||
var/deconwindowdelay = 50
|
||||
var/deconairlockdelay = 50
|
||||
|
||||
var/no_ammo_message = ""
|
||||
|
||||
/obj/item/weapon/rcd/New()
|
||||
..()
|
||||
no_ammo_message = "<span class='warning'>The \'Low Ammo\' light on \the [src] blinks yellow.</span>"
|
||||
|
||||
/obj/item/weapon/rcd/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] sets the RCD to 'Wall' and points it down \his throat! It looks like \he's trying to commit suicide..</span>")
|
||||
return (BRUTELOSS)
|
||||
@@ -316,6 +322,7 @@ RCD
|
||||
user << "<span class='notice'>You start building wall...</span>"
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, walldelay, target = A))
|
||||
if(!istype(F)) return 0
|
||||
if(!useResource(wallcost, user)) return 0
|
||||
activate()
|
||||
F.ChangeTurf(/turf/closed/wall)
|
||||
@@ -430,12 +437,14 @@ RCD
|
||||
if (4)
|
||||
if(istype(A, /turf/open/floor))
|
||||
if(checkResource(grillecost, user))
|
||||
for(var/obj/structure/grille/GRILLE in A)
|
||||
if(locate(/obj/structure/grille) in A)
|
||||
user << "<span class='warning'>There is already a grille there!</span>"
|
||||
return 0
|
||||
user << "<span class='notice'>You start building a grille...</span>"
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, grilledelay, target = A))
|
||||
if(locate(/obj/structure/grille) in A)
|
||||
return 0
|
||||
if(!useResource(grillecost, user)) return 0
|
||||
activate()
|
||||
var/obj/structure/grille/G = new/obj/structure/grille(A)
|
||||
@@ -463,13 +472,18 @@ RCD
|
||||
|
||||
/obj/item/weapon/rcd/proc/useResource(amount, mob/user)
|
||||
if(matter < amount)
|
||||
if(user)
|
||||
user << no_ammo_message
|
||||
return 0
|
||||
matter -= amount
|
||||
desc = "An RCD. It currently holds [matter]/[max_matter] matter-units."
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/rcd/proc/checkResource(amount, mob/user)
|
||||
return matter >= amount
|
||||
. = matter >= amount
|
||||
if(!. && user)
|
||||
user << no_ammo_message
|
||||
return .
|
||||
|
||||
/obj/item/weapon/rcd/proc/detonate_pulse()
|
||||
audible_message("<span class='danger'><b>[src] begins to vibrate and \
|
||||
@@ -483,26 +497,37 @@ RCD
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/weapon/rcd/borg/New()
|
||||
..()
|
||||
no_ammo_message = "<span class='warning'>Insufficient charge.</span>"
|
||||
desc = "A device used to rapidly build walls and floors."
|
||||
canRturf = 1
|
||||
|
||||
/obj/item/weapon/rcd/borg/useResource(amount, mob/user)
|
||||
if(!isrobot(user))
|
||||
return 0
|
||||
var/mob/living/silicon/robot/borgy = user
|
||||
if(!borgy.cell)
|
||||
if(user)
|
||||
user << no_ammo_message
|
||||
return 0
|
||||
return borgy.cell.use(amount * 72) //borgs get 1.3x the use of their RCDs
|
||||
. = borgy.cell.use(amount * 72) //borgs get 1.3x the use of their RCDs
|
||||
if(!. && user)
|
||||
user << no_ammo_message
|
||||
return .
|
||||
|
||||
/obj/item/weapon/rcd/borg/checkResource(amount, mob/user)
|
||||
if(!isrobot(user))
|
||||
return 0
|
||||
var/mob/living/silicon/robot/borgy = user
|
||||
if(!borgy.cell)
|
||||
if(user)
|
||||
user << no_ammo_message
|
||||
return 0
|
||||
return borgy.cell.charge >= (amount * 72)
|
||||
|
||||
/obj/item/weapon/rcd/borg/New()
|
||||
..()
|
||||
desc = "A device used to rapidly build walls and floors."
|
||||
canRturf = 1
|
||||
. = borgy.cell.charge >= (amount * 72)
|
||||
if(!. && user)
|
||||
user << no_ammo_message
|
||||
return .
|
||||
|
||||
/obj/item/weapon/rcd/loaded
|
||||
matter = 160
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/overlay/holograph/attack_animal(mob/living/simple_animal/M)
|
||||
if(!M.melee_damage_upper)
|
||||
if(!M.melee_damage_upper && !M.obj_damage)
|
||||
return
|
||||
attack_generic(5, M)
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
target.apply_damage(force * fisto_setting, BRUTE)
|
||||
target.visible_message("<span class='danger'>[user]'s powerfist lets out a loud hiss as they punch [target.name]!</span>", \
|
||||
"<span class='userdanger'>You cry out in pain as [user]'s punch flings you backwards!</span>")
|
||||
PoolOrNew(/obj/effect/kinetic_blast, target.loc)
|
||||
PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, target.loc)
|
||||
playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1)
|
||||
playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1)
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
icon_state = "red"
|
||||
item_state = "toolbox_red"
|
||||
flags = CONDUCT
|
||||
force = 10
|
||||
throwforce = 10
|
||||
force = 12
|
||||
throwforce = 12
|
||||
throw_speed = 2
|
||||
throw_range = 7
|
||||
w_class = 4
|
||||
|
||||
@@ -217,6 +217,8 @@
|
||||
throw_range = 5
|
||||
w_class = 2
|
||||
|
||||
|
||||
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=30)
|
||||
origin_tech = "engineering=1;plasmatech=1"
|
||||
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
|
||||
@@ -235,6 +237,7 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/proc/update_torch()
|
||||
cut_overlays()
|
||||
if(welding)
|
||||
@@ -254,9 +257,27 @@
|
||||
update_torch()
|
||||
return
|
||||
|
||||
/obj/item/weapon/weldingtool/examine(mob/user)
|
||||
..()
|
||||
user << "It contains [get_fuel()] unit\s of fuel out of [max_fuel]."
|
||||
|
||||
/obj/item/weapon/weldingtool/process()
|
||||
switch(welding)
|
||||
if(0)
|
||||
force = 3
|
||||
damtype = "brute"
|
||||
update_icon()
|
||||
if(!can_off_process)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return
|
||||
//Welders left on now use up fuel, but lets not have them run out quite that fast
|
||||
if(1)
|
||||
force = 15
|
||||
damtype = "fire"
|
||||
if(prob(5))
|
||||
remove_fuel(1)
|
||||
update_icon()
|
||||
|
||||
//This is to start fires. process() is only called if the welder is on.
|
||||
open_flame()
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] welds \his every orifice closed! It looks like \he's trying to commit suicide..</span>")
|
||||
@@ -288,27 +309,6 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/weldingtool/process()
|
||||
switch(welding)
|
||||
if(0)
|
||||
force = 3
|
||||
damtype = "brute"
|
||||
update_icon()
|
||||
if(!can_off_process)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return
|
||||
//Welders left on now use up fuel, but lets not have them run out quite that fast
|
||||
if(1)
|
||||
force = 15
|
||||
damtype = "fire"
|
||||
if(prob(5))
|
||||
remove_fuel(1)
|
||||
update_icon()
|
||||
|
||||
|
||||
//This is to start fires. process() is only called if the welder is on.
|
||||
open_flame()
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/afterattack(atom/O, mob/user, proximity)
|
||||
if(!proximity) return
|
||||
@@ -317,6 +317,8 @@
|
||||
remove_fuel(1)
|
||||
var/turf/location = get_turf(user)
|
||||
location.hotspot_expose(700, 50, 1)
|
||||
if(get_fuel() <= 0)
|
||||
user.AddLuminosity(-light_intensity)
|
||||
|
||||
if(isliving(O))
|
||||
var/mob/living/L = O
|
||||
@@ -324,10 +326,17 @@
|
||||
message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire")
|
||||
log_game("[key_name(user)] set [key_name(L)] on fire")
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/attack_self(mob/user)
|
||||
toggle(user)
|
||||
switched_on(user)
|
||||
if(welding)
|
||||
SetLuminosity(0)
|
||||
user.AddLuminosity(light_intensity)
|
||||
else
|
||||
user.AddLuminosity(-light_intensity)
|
||||
update_icon()
|
||||
|
||||
|
||||
//Returns the amount of fuel in the welder
|
||||
/obj/item/weapon/weldingtool/proc/get_fuel()
|
||||
return reagents.get_reagent_amount("welding_fuel")
|
||||
@@ -349,15 +358,10 @@
|
||||
return FALSE
|
||||
|
||||
|
||||
//Returns whether or not the welding tool is currently on.
|
||||
/obj/item/weapon/weldingtool/proc/isOn()
|
||||
return welding
|
||||
|
||||
|
||||
//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
|
||||
/obj/item/weapon/weldingtool/proc/check_fuel(mob/user)
|
||||
if(get_fuel() <= 0 && welding)
|
||||
toggle(user, 1)
|
||||
switched_on(user)
|
||||
update_icon()
|
||||
//mob icon update
|
||||
if(ismob(loc))
|
||||
@@ -368,9 +372,8 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
//Toggles the welder off and on
|
||||
/obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0)
|
||||
//Switches the welder on
|
||||
obj/item/weapon/weldingtool/proc/switched_on(mob/user)
|
||||
if(!status)
|
||||
user << "<span class='warning'>[src] can't be turned on while unsecured!</span>"
|
||||
return
|
||||
@@ -385,20 +388,54 @@
|
||||
START_PROCESSING(SSobj, src)
|
||||
else
|
||||
user << "<span class='warning'>You need more fuel!</span>"
|
||||
welding = 0
|
||||
switched_off(user)
|
||||
else
|
||||
if(!message)
|
||||
user << "<span class='notice'>You switch [src] off.</span>"
|
||||
else
|
||||
user << "<span class='warning'>[src] shuts off!</span>"
|
||||
force = 3
|
||||
damtype = "brute"
|
||||
hitsound = "swing_hit"
|
||||
update_icon()
|
||||
user << "<span class='notice'>You switch [src] off.</span>"
|
||||
switched_off(user)
|
||||
|
||||
//Switches the welder off
|
||||
obj/item/weapon/weldingtool/proc/switched_off(mob/user)
|
||||
welding = 0
|
||||
var/mob/Player = loc
|
||||
if(ismob(loc)) //If player is holding the welder
|
||||
Player.AddLuminosity(-light_intensity)
|
||||
SetLuminosity(0)
|
||||
else
|
||||
SetLuminosity(0)
|
||||
|
||||
force = 3
|
||||
damtype = "brute"
|
||||
hitsound = "swing_hit"
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/pickup(mob/user)
|
||||
..()
|
||||
if(welding)
|
||||
SetLuminosity(0)
|
||||
user.AddLuminosity(light_intensity)
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/dropped(mob/user)
|
||||
..()
|
||||
if(welding)
|
||||
if(user)
|
||||
user.AddLuminosity(-light_intensity)
|
||||
SetLuminosity(light_intensity)
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/examine(mob/user)
|
||||
..()
|
||||
user << "It contains [get_fuel()] unit\s of fuel out of [max_fuel]."
|
||||
|
||||
/obj/item/weapon/weldingtool/is_hot()
|
||||
return welding * heat
|
||||
|
||||
//Returns whether or not the welding tool is currently on.
|
||||
/obj/item/weapon/weldingtool/proc/isOn()
|
||||
return welding
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
|
||||
if(welding)
|
||||
user << "<span class='warning'>Turn it off first!</span>"
|
||||
|
||||
@@ -219,3 +219,6 @@
|
||||
|
||||
/obj/proc/CanAStarPass()
|
||||
. = !density
|
||||
|
||||
/obj/proc/check_uplink_validity()
|
||||
return 1
|
||||
@@ -150,10 +150,13 @@
|
||||
/obj/structure/alien/resin/attack_animal(mob/living/simple_animal/M)
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
M.do_attack_animation(src)
|
||||
if(!M.melee_damage_upper)
|
||||
if(!M.melee_damage_upper && !M.obj_damage)
|
||||
return
|
||||
visible_message("<span class='danger'>[M] [M.attacktext] [src]!</span>")
|
||||
take_damage(M.melee_damage_upper, M.melee_damage_type)
|
||||
if(M.obj_damage)
|
||||
take_damage(M.obj_damage, M.melee_damage_type)
|
||||
else
|
||||
take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
|
||||
|
||||
/obj/structure/alien/resin/CanPass(atom/movable/mover, turf/target, height=0)
|
||||
return !density
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
if(over_object == usr && Adjacent(usr))
|
||||
if(!ishuman(usr))
|
||||
return 0
|
||||
if(buckled_mobs.len)
|
||||
if(has_buckled_mobs())
|
||||
return 0
|
||||
if(usr.incapacitated())
|
||||
usr << "<span class='warning'>You can't do that right now!</span>"
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
new /obj/item/weapon/storage/backpack/satchel/cap(src)
|
||||
new /obj/item/clothing/suit/cloak/cap(src)
|
||||
new /obj/item/weapon/storage/backpack/dufflebag/captain(src)
|
||||
new /obj/item/clothing/head/crown/fancy(src)
|
||||
new /obj/item/clothing/suit/captunic(src)
|
||||
new /obj/item/clothing/under/captainparade(src)
|
||||
new /obj/item/clothing/head/caphat/parade(src)
|
||||
|
||||
@@ -177,10 +177,14 @@
|
||||
/obj/structure/displaycase/attack_animal(mob/living/simple_animal/M)
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
M.do_attack_animation(src)
|
||||
if(M.melee_damage_upper > 0)
|
||||
if(M.melee_damage_upper || M.obj_damage)
|
||||
M.visible_message("<span class='danger'>[M.name] smashes against \the [src.name].</span>",\
|
||||
"<span class='danger'>You smash against the [src.name].</span>")
|
||||
take_damage(M.melee_damage_upper, M.melee_damage_type, 1)
|
||||
if(M.obj_damage)
|
||||
take_damage(M.obj_damage, M.melee_damage_type, 1)
|
||||
else
|
||||
take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
|
||||
|
||||
|
||||
/obj/structure/displaycase/attack_hand(mob/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
|
||||
@@ -304,7 +304,7 @@
|
||||
canSmoothWith = list(/obj/structure/falsewall/abductor, /turf/closed/wall/mineral/abductor)
|
||||
|
||||
/obj/structure/falsewall/titanium
|
||||
name = "titanium wall"
|
||||
name = "wall"
|
||||
desc = "A light-weight titanium wall used in shuttles."
|
||||
icon = 'icons/turf/walls/shuttle_wall.dmi'
|
||||
icon_state = "shuttle"
|
||||
@@ -313,7 +313,7 @@
|
||||
canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock/, /turf/closed/wall/shuttle, /obj/structure/window/shuttle, /obj/structure/shuttle/engine, /obj/structure/shuttle/engine/heater, )
|
||||
|
||||
/obj/structure/falsewall/plastitanium
|
||||
name = "plastitanium wall"
|
||||
name = "wall"
|
||||
desc = "An evil wall of plasma and titanium."
|
||||
icon = 'icons/turf/shuttle.dmi'
|
||||
icon_state = "wall3"
|
||||
|
||||
@@ -112,11 +112,14 @@
|
||||
take_damage(20)
|
||||
|
||||
/obj/structure/fireaxecabinet/attack_animal(mob/living/simple_animal/M)
|
||||
if(!M.melee_damage_upper)
|
||||
if(!M.melee_damage_upper && !M.obj_damage)
|
||||
return
|
||||
M.visible_message("<span class='warning'>[M] smashes against [src].</span>", \
|
||||
"<span class='danger'>You smash against [src].</span>")
|
||||
take_damage(M.melee_damage_upper, M.melee_damage_type)
|
||||
if(M.obj_damage)
|
||||
take_damage(M.obj_damage, M.melee_damage_type)
|
||||
else
|
||||
take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
|
||||
|
||||
/obj/structure/fireaxecabinet/attack_ai(mob/user)
|
||||
toggle_lock(user)
|
||||
|
||||
@@ -228,6 +228,7 @@
|
||||
name = "potted plant"
|
||||
icon = 'icons/obj/flora/plants.dmi'
|
||||
icon_state = "plant-01"
|
||||
layer = ABOVE_MOB_LAYER
|
||||
w_class = 5
|
||||
force = 10
|
||||
throwforce = 13
|
||||
|
||||
@@ -79,13 +79,16 @@
|
||||
|
||||
/obj/structure/grille/attack_animal(var/mob/living/simple_animal/M)
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
if(M.melee_damage_upper == 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
|
||||
if(!M.melee_damage_upper && !M.obj_damage || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
|
||||
return
|
||||
M.do_attack_animation(src)
|
||||
M.visible_message("<span class='warning'>[M] smashes against [src].</span>", \
|
||||
"<span class='danger'>You smash against [src].</span>", \
|
||||
"<span class='italics'>You hear twisting metal.</span>")
|
||||
take_damage(M.melee_damage_upper, M.melee_damage_type)
|
||||
if(M.obj_damage)
|
||||
take_damage(M.obj_damage, M.melee_damage_type)
|
||||
else
|
||||
take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
|
||||
|
||||
|
||||
/obj/structure/grille/mech_melee_attack(obj/mecha/M)
|
||||
|
||||
@@ -67,7 +67,6 @@
|
||||
L.emote("scream")
|
||||
L.add_splatter_floor()
|
||||
L.adjustBruteLoss(30)
|
||||
L.buckled = src
|
||||
L.setDir(2)
|
||||
buckle_mob(L, force=1)
|
||||
var/matrix/m180 = matrix(L.transform)
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
attack_generic(user)
|
||||
|
||||
/obj/structure/mirror/attack_animal(mob/living/simple_animal/M)
|
||||
if(M.melee_damage_upper <= 0)
|
||||
if(!M.melee_damage_upper && !M.obj_damage)
|
||||
return
|
||||
attack_generic(M)
|
||||
|
||||
|
||||
@@ -81,8 +81,10 @@
|
||||
/obj/structure/table/attack_animal(mob/living/simple_animal/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
if(user.melee_damage_upper)
|
||||
if(user.melee_damage_upper || user.obj_damage)
|
||||
var/dmg_dealt = user.melee_damage_upper
|
||||
if(user.obj_damage)
|
||||
dmg_dealt = user.obj_damage
|
||||
if(user.environment_smash)
|
||||
dmg_dealt = 100
|
||||
visible_message("<span class='warning'>[user] smashes [src]!</span>")
|
||||
@@ -536,13 +538,16 @@
|
||||
/obj/structure/rack/attack_animal(mob/living/simple_animal/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
if(user.melee_damage_upper)
|
||||
if(user.melee_damage_upper || user.obj_damage)
|
||||
var/dmg_dealt = user.melee_damage_upper
|
||||
if(user.obj_damage)
|
||||
dmg_dealt = user.obj_damage
|
||||
if(user.environment_smash)
|
||||
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
|
||||
visible_message("<span class='warning'>[user] smashes [src] apart.</span>")
|
||||
rack_destroy()
|
||||
else
|
||||
take_damage(user.melee_damage_upper, user.melee_damage_type)
|
||||
take_damage(dmg_dealt, user.melee_damage_type)
|
||||
|
||||
|
||||
/obj/structure/rack/attack_tk() // no telehulk sorry
|
||||
|
||||
@@ -157,9 +157,12 @@
|
||||
attack_generic(user, 15)
|
||||
|
||||
/obj/structure/window/attack_animal(mob/living/simple_animal/M)
|
||||
if(!M.melee_damage_upper)
|
||||
if(!M.melee_damage_upper && !M.obj_damage)
|
||||
return
|
||||
attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
|
||||
if(M.obj_damage)
|
||||
attack_generic(M, M.obj_damage, M.melee_damage_type)
|
||||
else
|
||||
attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
|
||||
|
||||
|
||||
/obj/structure/window/attack_slime(mob/living/simple_animal/slime/user)
|
||||
|
||||
@@ -74,12 +74,6 @@
|
||||
|
||||
//TITANIUM (shuttle)
|
||||
|
||||
/turf/open/floor/mineral/titanium
|
||||
name = "shuttle floor"
|
||||
icon_state = "shuttlefloor3"
|
||||
floor_tile = /obj/item/stack/tile/mineral/titanium
|
||||
icons = list("shuttlefloor3","shuttlefloor3_dam")
|
||||
|
||||
/turf/open/floor/mineral/titanium/blue
|
||||
icon_state = "shuttlefloor"
|
||||
icons = list("shuttlefloor","shuttlefloor_dam")
|
||||
@@ -88,6 +82,12 @@
|
||||
icon_state = "shuttlefloor2"
|
||||
icons = list("shuttlefloor2","shuttlefloor2_dam")
|
||||
|
||||
/turf/open/floor/mineral/titanium
|
||||
name = "shuttle floor"
|
||||
icon_state = "shuttlefloor3"
|
||||
floor_tile = /obj/item/stack/tile/mineral/titanium
|
||||
icons = list("shuttlefloor3","shuttlefloor3_dam")
|
||||
|
||||
/turf/open/floor/mineral/titanium/purple
|
||||
icon_state = "shuttlefloor5"
|
||||
icons = list("shuttlefloor5","shuttlefloor5_dam")
|
||||
|
||||
@@ -150,7 +150,27 @@
|
||||
|
||||
/turf/open/floor/engine/cult
|
||||
name = "engraved floor"
|
||||
icon_state = "cult"
|
||||
icon_state = "plating"
|
||||
var/obj/effect/clockwork/overlay/floor/realappearence
|
||||
|
||||
/turf/open/floor/engine/cult/New()
|
||||
..()
|
||||
PoolOrNew(/obj/effect/overlay/temp/cult/turf/open/floor, src)
|
||||
realappearence = PoolOrNew(/obj/effect/overlay/cult/floor, src)
|
||||
realappearence.linked = src
|
||||
|
||||
/turf/open/floor/engine/cult/Destroy()
|
||||
be_removed()
|
||||
return ..()
|
||||
|
||||
/turf/open/floor/engine/cult/ChangeTurf(path, defer_change = FALSE)
|
||||
if(path != type)
|
||||
be_removed()
|
||||
return ..()
|
||||
|
||||
/turf/open/floor/engine/cult/proc/be_removed()
|
||||
qdel(realappearence)
|
||||
realappearence = null
|
||||
|
||||
/turf/open/floor/engine/cult/New()
|
||||
PoolOrNew(/obj/effect/overlay/temp/cult/turf/open/floor, src)
|
||||
|
||||
@@ -198,7 +198,7 @@
|
||||
smooth = SMOOTH_FALSE
|
||||
|
||||
/turf/closed/wall/mineral/titanium //has to use this path due to how building walls works
|
||||
name = "titanium wall"
|
||||
name = "wall"
|
||||
desc = "A light-weight titanium wall used in shuttles."
|
||||
icon = 'icons/turf/walls/shuttle_wall.dmi'
|
||||
icon_state = "map-shuttle"
|
||||
@@ -243,7 +243,7 @@
|
||||
T.transform = transform
|
||||
|
||||
/turf/closed/wall/mineral/plastitanium
|
||||
name = "plastitanium wall"
|
||||
name = "wall"
|
||||
desc = "An evil wall of plasma and titanium."
|
||||
walltype = "syndieshuttle"
|
||||
icon = 'icons/turf/shuttle.dmi'
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
level = 1
|
||||
|
||||
var/intact = 1
|
||||
var/baseturf = /turf/open/space
|
||||
var/turf/baseturf = /turf/open/space
|
||||
|
||||
var/temperature = T20C
|
||||
var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed
|
||||
|
||||
@@ -703,7 +703,7 @@ var/global/BSACooldown = 0
|
||||
if(!ai_number)
|
||||
usr << "<b>No AIs located</b>" //Just so you know the thing is actually working and not just ignoring you.
|
||||
|
||||
/datum/admins/proc/output_devil_info()
|
||||
/datum/admins/proc/output_all_devil_info()
|
||||
var/devil_number = 0
|
||||
for(var/D in ticker.mode.devils)
|
||||
devil_number++
|
||||
@@ -711,6 +711,12 @@ var/global/BSACooldown = 0
|
||||
if(!devil_number)
|
||||
usr << "<b>No Devils located</b>" //Just so you know the thing is actually working and not just ignoring you.
|
||||
|
||||
/datum/admins/proc/output_devil_info(mob/living/M)
|
||||
if(istype(M) && M.mind && M.mind.devilinfo)
|
||||
usr << ticker.mode.printdevilinfo(M.mind)
|
||||
else
|
||||
usr << "<b>[M] is not a devil."
|
||||
|
||||
/datum/admins/proc/manage_free_slots()
|
||||
if(!check_rights())
|
||||
return
|
||||
|
||||
@@ -1621,7 +1621,8 @@
|
||||
output_ai_laws()
|
||||
|
||||
else if(href_list["admincheckdevilinfo"])
|
||||
output_devil_info()
|
||||
var/mob/M = locate(href_list["admincheckdevilinfo"])
|
||||
output_devil_info(M)
|
||||
|
||||
else if(href_list["adminmoreinfo"])
|
||||
var/mob/M = locate(href_list["adminmoreinfo"])
|
||||
|
||||
@@ -372,7 +372,7 @@ var/list/gaslist_cache = null
|
||||
|
||||
copy.temperature = temperature
|
||||
for(var/id in cached_gases)
|
||||
add_gas(id)
|
||||
copy.add_gas(id)
|
||||
copy_gases[id][MOLES] = cached_gases[id][MOLES]
|
||||
|
||||
return copy
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
var/hc = pipe_air.heat_capacity()
|
||||
var/mob/living/heat_source = buckled_mobs[1]
|
||||
//Best guess-estimate of the total bodytemperature of all the mobs, since they share the same environment it's ~ok~ to guess like this
|
||||
var/avg_temp = (pipe_air.temperature * hc + (heat_source.bodytemperature * buckled_mobs.len) * 3500) / (hc + (buckled_mobs.len * 3500))
|
||||
var/avg_temp = (pipe_air.temperature * hc + (heat_source.bodytemperature * buckled_mobs.len) * 3500) / (hc + (buckled_mobs ? buckled_mobs.len * 3500 : 0))
|
||||
for(var/m in buckled_mobs)
|
||||
var/mob/living/L = m
|
||||
L.bodytemperature = avg_temp
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
/obj/item/clothing/head/canada
|
||||
name = "striped red tophat"
|
||||
desc = " It feels sticky, like maple syrup - <i>il se sent collante, comme le sirop d'érable</i>"
|
||||
desc = " It feels sticky, like maple syrup - <i>il se sent collante, comme le sirop d'érable</i>"
|
||||
icon_state = "canada"
|
||||
item_state = "canada"
|
||||
|
||||
@@ -259,4 +259,15 @@
|
||||
name = "paper sack hat"
|
||||
desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all."
|
||||
icon_state = "papersack_smile"
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
|
||||
/obj/item/clothing/head/crown
|
||||
name = "crown"
|
||||
desc = "A crown fit for a king, a petty king maybe."
|
||||
icon_state = "crown"
|
||||
armor = list(melee = 15, bullet = 0, laser = 0,energy = 15, bomb = 0, bio = 0, rad = 0) //for a warrior king //energy cause gold is reflective //worse than sec helm overall
|
||||
|
||||
/obj/item/clothing/head/crown/fancy
|
||||
name = "magnificent crown"
|
||||
desc = "A crown worn by only the highest emperors of the land."
|
||||
icon_state = "fancycrown"
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
id = /obj/item/weapon/card/id/ert
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert
|
||||
glasses = /obj/item/clothing/glasses/thermal/eyepatch
|
||||
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
|
||||
back = /obj/item/weapon/storage/backpack/captain
|
||||
belt = /obj/item/weapon/storage/belt/security/full
|
||||
backpack_contents = list(/obj/item/weapon/storage/box/engineer=1,\
|
||||
@@ -42,7 +42,6 @@
|
||||
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
var/obj/item/device/radio/R = H.ears
|
||||
R.keyslot = new /obj/item/device/encryptionkey/heads/captain
|
||||
R.recalculateChannels()
|
||||
@@ -50,6 +49,7 @@
|
||||
/datum/outfit/ert/commander/alert
|
||||
name = "ERT Commander - High Alert"
|
||||
|
||||
glasses = /obj/item/clothing/glasses/thermal/eyepatch
|
||||
backpack_contents = list(/obj/item/weapon/storage/box/engineer=1,\
|
||||
/obj/item/weapon/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
@@ -193,4 +193,4 @@
|
||||
W.access += access_weapons
|
||||
W.assignment = "Centcom Official"
|
||||
W.registered_name = H.real_name
|
||||
W.update_label()
|
||||
W.update_label()
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
item_state = "eng_hardsuit"
|
||||
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
//Atmospherics
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
|
||||
@@ -197,7 +197,7 @@
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
|
||||
jetpack = /obj/item/weapon/tank/jetpack/suit
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket/big
|
||||
pockets = /obj/item/weapon/storage/internal/pocket/big
|
||||
|
||||
|
||||
//Mining hardsuit
|
||||
@@ -223,7 +223,7 @@
|
||||
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
|
||||
//Syndicate hardsuit
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
|
||||
cold_protection = CHEST|GROIN|LEGS|ARMS
|
||||
heat_protection = CHEST|GROIN|LEGS|ARMS
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
strip_delay = 80
|
||||
|
||||
/obj/item/clothing/suit/armor/hos/trenchcoat
|
||||
@@ -73,7 +73,7 @@
|
||||
cold_protection = CHEST|GROIN|LEGS|ARMS
|
||||
heat_protection = CHEST|GROIN|LEGS|ARMS
|
||||
dog_fashion = null
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/capcarapace
|
||||
name = "captain's carapace"
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
blood_overlay_type = "armor"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/cultivator,/obj/item/weapon/reagent_containers/spray/pestspray,/obj/item/weapon/hatchet,/obj/item/weapon/storage/bag/plants)
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
//Captain
|
||||
/obj/item/clothing/suit/captunic
|
||||
@@ -33,7 +33,7 @@
|
||||
allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/internals/emergency_oxygen)
|
||||
hooded = 1
|
||||
hoodtype = /obj/item/clothing/head/chaplain_hood
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
/obj/item/clothing/head/chaplain_hood
|
||||
name = "chaplain hood"
|
||||
@@ -52,7 +52,7 @@
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
|
||||
flags_inv = HIDESHOES|HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/internals/emergency_oxygen)
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
//Chef
|
||||
/obj/item/clothing/suit/toggle/chef
|
||||
@@ -65,7 +65,7 @@
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
allowed = list(/obj/item/weapon/kitchen)
|
||||
togglename = "sleeves"
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
|
||||
//Cook
|
||||
@@ -90,7 +90,7 @@
|
||||
armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
cold_protection = CHEST|GROIN|LEGS|ARMS
|
||||
heat_protection = CHEST|GROIN|LEGS|ARMS
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
/obj/item/clothing/suit/det_suit/grey
|
||||
name = "noir trenchcoat"
|
||||
@@ -107,7 +107,7 @@
|
||||
blood_overlay_type = "armor"
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner,/obj/item/device/radio)
|
||||
burn_state = FIRE_PROOF
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
//Lawyer
|
||||
/obj/item/clothing/suit/toggle/lawyer
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
allowed = list(/obj/item/device/analyzer,/obj/item/stack/medical,/obj/item/weapon/dnainjector,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/hypospray,/obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/paper,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/soap,/obj/item/device/sensor_device,/obj/item/weapon/tank/internals/emergency_oxygen)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
|
||||
togglename = "buttons"
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
/obj/item/clothing/suit/toggle/labcoat/cmo
|
||||
name = "chief medical officer's labcoat"
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
icon_state = "pirate"
|
||||
item_state = "pirate"
|
||||
allowed = list(/obj/item/weapon/melee/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/weapon/reagent_containers/food/drinks/bottle/rum)
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
/obj/item/clothing/suit/pirate/captain
|
||||
name = "pirate captain coat"
|
||||
@@ -91,7 +91,7 @@
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy)
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
burn_state = FIRE_PROOF
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
/obj/item/clothing/suit/hastur
|
||||
name = "\improper Hastur's robe"
|
||||
@@ -154,7 +154,7 @@
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/internals/emergency_oxygen)
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
|
||||
/obj/item/clothing/suit/cardborg
|
||||
@@ -334,7 +334,7 @@
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
cold_protection = CHEST|GROIN|ARMS
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
/obj/item/clothing/suit/jacket/leather
|
||||
name = "leather jacket"
|
||||
@@ -422,7 +422,7 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
|
||||
hooded = 1
|
||||
// pockets = /obj/item/weapon/storage/internal/pocket
|
||||
pockets = /obj/item/weapon/storage/internal/pocket
|
||||
|
||||
/obj/item/clothing/head/winterhood
|
||||
name = "winter hood"
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
//Just some alt-uniforms themed around Star Trek - Pls don't sue, Mr Roddenberry ;_;
|
||||
|
||||
|
||||
/obj/item/clothing/under/trek
|
||||
can_adjust = 0
|
||||
|
||||
|
||||
//TOS
|
||||
/obj/item/clothing/under/trek/command
|
||||
name = "command uniform"
|
||||
desc = "The uniform worn by command officers"
|
||||
icon_state = "trek_command"
|
||||
item_color = "trek_command"
|
||||
item_state = "y_suit"
|
||||
|
||||
/obj/item/clothing/under/trek/engsec
|
||||
name = "engsec uniform"
|
||||
desc = "The uniform worn by engineering/security officers"
|
||||
icon_state = "trek_engsec"
|
||||
item_color = "trek_engsec"
|
||||
item_state = "r_suit"
|
||||
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //more sec than eng, but w/e.
|
||||
strip_delay = 50
|
||||
|
||||
/obj/item/clothing/under/trek/medsci
|
||||
name = "medsci uniform"
|
||||
desc = "The uniform worn by medical/science officers"
|
||||
icon_state = "trek_medsci"
|
||||
item_color = "trek_medsci"
|
||||
item_state = "b_suit"
|
||||
|
||||
|
||||
//TNG
|
||||
/obj/item/clothing/under/trek/command/next
|
||||
icon_state = "trek_next_command"
|
||||
item_color = "trek_next_command"
|
||||
item_state = "r_suit"
|
||||
|
||||
/obj/item/clothing/under/trek/engsec/next
|
||||
icon_state = "trek_next_engsec"
|
||||
item_color = "trek_next_engsec"
|
||||
item_state = "y_suit"
|
||||
|
||||
/obj/item/clothing/under/trek/medsci/next
|
||||
icon_state = "trek_next_medsci"
|
||||
item_color = "trek_next_medsci"
|
||||
|
||||
|
||||
//ENT
|
||||
/obj/item/clothing/under/trek/command/ent
|
||||
icon_state = "trek_ent_command"
|
||||
item_color = "trek_ent_command"
|
||||
item_state = "bl_suit"
|
||||
|
||||
/obj/item/clothing/under/trek/engsec/ent
|
||||
icon_state = "trek_ent_engsec"
|
||||
item_color = "trek_ent_engsec"
|
||||
item_state = "bl_suit"
|
||||
|
||||
/obj/item/clothing/under/trek/medsci/ent
|
||||
icon_state = "trek_ent_medsci"
|
||||
item_color = "trek_ent_medsci"
|
||||
item_state = "bl_suit"
|
||||
|
||||
|
||||
//Q
|
||||
/obj/item/clothing/under/trek/Q
|
||||
name = "french marshall's uniform"
|
||||
desc = "something about it feels off..."
|
||||
icon_state = "trek_Q"
|
||||
item_color = "trek_Q"
|
||||
item_state = "r_suit"
|
||||
@@ -33,7 +33,9 @@
|
||||
var/mob/living/carbon/human/devil = create_event_devil(spawn_loc)
|
||||
Mind.transfer_to(devil)
|
||||
ticker.mode.finalize_devil(Mind)
|
||||
ticker.mode.add_devil_objectives(src, 2)
|
||||
Mind.announceDevilLaws()
|
||||
Mind.announce_objectives()
|
||||
|
||||
|
||||
spawned_mobs += devil
|
||||
|
||||
@@ -13,3 +13,18 @@
|
||||
|
||||
/datum/round_event/space_dust/start()
|
||||
spawn_meteors(1, meteorsC)
|
||||
|
||||
/datum/round_event_control/sandstorm
|
||||
name = "Sandstorm"
|
||||
typepath = /datum/round_event/sandstorm
|
||||
weight = 0
|
||||
max_occurrences = 0
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/sandstorm
|
||||
startWhen = 1
|
||||
endWhen = 150 // ~5 min
|
||||
announceWhen = 0
|
||||
|
||||
/datum/round_event/sandstorm/tick()
|
||||
spawn_meteors(10, meteorsC)
|
||||
@@ -559,7 +559,7 @@
|
||||
if(!has_buckled_mobs() && prob(25))
|
||||
for(var/mob/living/V in src.loc)
|
||||
entangle(V)
|
||||
if(buckled_mobs && buckled_mobs.len)
|
||||
if(has_buckled_mobs())
|
||||
break //only capture one mob at a time
|
||||
|
||||
|
||||
|
||||
@@ -196,4 +196,10 @@
|
||||
name = "rat burger"
|
||||
desc = "Pretty much what you'd expect..."
|
||||
icon_state = "ratburger"
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/burger/baseball
|
||||
name = "home run baseball burger"
|
||||
desc = "It's still warm. The steam coming off of it looks like baseball."
|
||||
icon_state = "baseball"
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
|
||||
@@ -253,3 +253,12 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/rat
|
||||
category = CAT_BURGER
|
||||
|
||||
/datum/crafting_recipe/food/baseballburger
|
||||
name = "Home run baseball burger"
|
||||
reqs = list(
|
||||
/obj/item/weapon/melee/baseball_bat = 1,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/burger/baseball
|
||||
category = CAT_BURGER
|
||||
|
||||
@@ -14,9 +14,13 @@
|
||||
var/efficiency = 0
|
||||
var/productivity = 0
|
||||
var/max_items = 40
|
||||
var/datum/research/files
|
||||
var/list/show_categories = list("Food", "Botany Chemicals", "Leather and Cloth")
|
||||
var/list/timesFiveCategories = list("Food", "Botany Chemicals")
|
||||
|
||||
/obj/machinery/biogenerator/New()
|
||||
..()
|
||||
files = new /datum/research/biogenerator(src)
|
||||
create_reagents(1000)
|
||||
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/biogenerator(null)
|
||||
B.apply_default_parts(src)
|
||||
@@ -59,6 +63,9 @@
|
||||
return
|
||||
|
||||
/obj/machinery/biogenerator/attackby(obj/item/O, mob/user, params)
|
||||
if(user.a_intent == "harm")
|
||||
return ..()
|
||||
|
||||
if(processing)
|
||||
user << "<span class='warning'>The biogenerator is currently processing.</span>"
|
||||
return
|
||||
@@ -126,11 +133,18 @@
|
||||
O.loc = src
|
||||
user << "<span class='info'>You put [O.name] in [src.name]</span>"
|
||||
return 1 //no afterattack
|
||||
|
||||
else if(user.a_intent != "harm")
|
||||
user << "<span class='warning'>You cannot put this in [src.name]!</span>"
|
||||
else if (istype(O, /obj/item/weapon/disk/design_disk))
|
||||
user.visible_message("[user] begins to load \the [O] in \the [src]...",
|
||||
"You begin to load a design from \the [O]...",
|
||||
"You hear the chatter of a floppy drive.")
|
||||
processing = 1
|
||||
var/obj/item/weapon/disk/design_disk/D = O
|
||||
if(do_after(user, 10, target = src))
|
||||
files.AddDesign2Known(D.blueprint)
|
||||
processing = 0
|
||||
return 1
|
||||
else
|
||||
return ..()
|
||||
user << "<span class='warning'>You cannot put this in [src.name]!</span>"
|
||||
|
||||
/obj/machinery/biogenerator/interact(mob/user)
|
||||
if(stat & BROKEN || panel_open)
|
||||
@@ -142,7 +156,7 @@
|
||||
else
|
||||
switch(menustat)
|
||||
if("nopoints")
|
||||
dat += "<div class='statusDisplay'>You do not have biomass to create products.<BR>Please, put growns into reactor and activate it.</div>"
|
||||
dat += "<div class='statusDisplay'>You do not have enough biomass to create products.<BR>Please, put growns into reactor and activate it.</div>"
|
||||
menustat = "menu"
|
||||
if("complete")
|
||||
dat += "<div class='statusDisplay'>Operation complete.</div>"
|
||||
@@ -154,43 +168,29 @@
|
||||
dat += "<div class='statusDisplay'>Not enough space left in container. Unable to create product.</div>"
|
||||
menustat = "menu"
|
||||
if(beaker)
|
||||
var/categories = show_categories.Copy()
|
||||
for(var/V in categories)
|
||||
categories[V] = list()
|
||||
for(var/V in files.known_designs)
|
||||
var/datum/design/D = files.known_designs[V]
|
||||
for(var/C in categories)
|
||||
if(C in D.category)
|
||||
categories[C] += D
|
||||
|
||||
dat += "<div class='statusDisplay'>Biomass: [points] units.</div><BR>"
|
||||
dat += "<A href='?src=\ref[src];activate=1'>Activate</A><A href='?src=\ref[src];detach=1'>Detach Container</A>"
|
||||
dat += "<h3>Food:</h3>"
|
||||
dat += "<div class='statusDisplay'>"
|
||||
dat += "10 milk: <A href='?src=\ref[src];create=milk;amount=1'>Make</A><A href='?src=\ref[src];create=milk;amount=5'>x5</A> ([20/efficiency])<BR>"
|
||||
dat += "10 cream: <A href='?src=\ref[src];create=cream;amount=1'>Make</A><A href='?src=\ref[src];create=cream;amount=5'>x5</A> ([30/efficiency])<BR>"
|
||||
dat += "Milk carton: <A href='?src=\ref[src];create=cmilk;amount=1'>Make</A><A href='?src=\ref[src];create=cmilk;amount=5'>x5</A> ([100/efficiency])<BR>"
|
||||
dat += "Cream carton: <A href='?src=\ref[src];create=ccream;amount=1'>Make</A><A href='?src=\ref[src];create=ccream;amount=5'>x5</A> ([300/efficiency])<BR>"
|
||||
dat += "10u black pepper: <A href='?src=\ref[src];create=bpepper;amount=1'>Make</A><A href='?src=\ref[src];create=bpepper;amount=5'>x5</A> ([25/efficiency])<BR>"
|
||||
dat += "Pepper mill: <A href='?src=\ref[src];create=mpepper;amount=1'>Make</A><A href='?src=\ref[src];create=mpepper;amount=5'>x5</A> ([50/efficiency])<BR>"
|
||||
dat += "Monkey cube: <A href='?src=\ref[src];create=meat;amount=1'>Make</A><A href='?src=\ref[src];create=meat;amount=5'>x5</A> ([250/efficiency])"
|
||||
dat += "</div>"
|
||||
dat += "<h3>Botany Chemicals:</h3>"
|
||||
dat += "<div class='statusDisplay'>"
|
||||
dat += "E-Z-Nutrient: <A href='?src=\ref[src];create=ez;amount=1'>Make</A><A href='?src=\ref[src];create=ez;amount=5'>x5</A> ([10/efficiency])<BR>"
|
||||
dat += "Left 4 Zed: <A href='?src=\ref[src];create=l4z;amount=1'>Make</A><A href='?src=\ref[src];create=l4z;amount=5'>x5</A> ([20/efficiency])<BR>"
|
||||
dat += "Robust Harvest: <A href='?src=\ref[src];create=rh;amount=1'>Make</A><A href='?src=\ref[src];create=rh;amount=5'>x5</A> ([25/efficiency])<BR>"
|
||||
dat += "Weed Killer: <A href='?src=\ref[src];create=wk;amount=1'>Make</A><A href='?src=\ref[src];create=wk;amount=5'>x5</A> ([50/efficiency])<BR>"
|
||||
dat += "Pest Killer: <A href='?src=\ref[src];create=pk;amount=1'>Make</A><A href='?src=\ref[src];create=pk;amount=5'>x5</A> ([50/efficiency])<BR>"
|
||||
dat += "Empty bottle: <A href='?src=\ref[src];create=empty;amount=1'>Make</A><A href='?src=\ref[src];create=empty;amount=5'>x5</A> ([5/efficiency])<BR>"
|
||||
dat += "</div>"
|
||||
dat += "<h3>Leather and Cloth:</h3>"
|
||||
dat += "<div class='statusDisplay'>"
|
||||
dat += "Roll of cloth: <A href='?src=\ref[src];create=cloth;amount=1'>Make</A><A href='?src=\ref[src];create=tencloth;amount=1'>x10</A> ([50/efficiency])<BR>"
|
||||
dat += "Wallet: <A href='?src=\ref[src];create=wallet;amount=1'>Make</A> ([100/efficiency])<BR>"
|
||||
dat += "Botanical gloves: <A href='?src=\ref[src];create=gloves;amount=1'>Make</A> ([250/efficiency])<BR>"
|
||||
dat += "Utility belt: <A href='?src=\ref[src];create=tbelt;amount=1'>Make</A> ([300/efficiency])<BR>"
|
||||
dat += "Security belt: <A href='?src=\ref[src];create=sbelt;amount=1'>Make</A> ([300/efficiency])<BR>"
|
||||
dat += "Medical belt: <A href='?src=\ref[src];create=mbelt;amount=1'>Make</A> ([300/efficiency])<BR>"
|
||||
dat += "Janitorial belt: <A href='?src=\ref[src];create=jbelt;amount=1'>Make</A> ([300/efficiency])<BR>"
|
||||
dat += "Bandolier belt: <A href='?src=\ref[src];create=bbelt;amount=1'>Make</A> ([300/efficiency])<BR>"
|
||||
dat += "Shoulder holster: <A href='?src=\ref[src];create=sholster;amount=1'>Make</A> ([400/efficiency])<BR>"
|
||||
dat += "Leather satchel: <A href='?src=\ref[src];create=satchel;amount=1'>Make</A> ([400/efficiency])<BR>"
|
||||
dat += "Leather jacket: <A href='?src=\ref[src];create=jacket;amount=1'>Make</A> ([500/efficiency])<BR>"
|
||||
dat += "Leather overcoat: <A href='?src=\ref[src];create=overcoat;amount=1'>Make</A> ([1000/efficiency])<BR>"
|
||||
dat += "Rice hat: <A href='?src=\ref[src];create=rice_hat;amount=1'>Make</A> ([300/efficiency])<BR>"
|
||||
dat += "</div>"
|
||||
for(var/cat in categories)
|
||||
dat += "<h3>[cat]:</h3>"
|
||||
dat += "<div class='statusDisplay'>"
|
||||
for(var/V in categories[cat])
|
||||
var/datum/design/D = V
|
||||
dat += "[D.name]: <A href='?src=\ref[src];create=\ref[D];amount=1'>Make</A>"
|
||||
if(cat in timesFiveCategories)
|
||||
dat += "<A href='?src=\ref[src];create=\ref[D];amount=5'>x5</A>"
|
||||
if(ispath(D.build_path, /obj/item/stack))
|
||||
dat += "<A href='?src=\ref[src];create=\ref[D];amount=10'>x10</A>"
|
||||
dat += "([D.materials[MAT_BIOMASS]/efficiency])<br>"
|
||||
dat += "</div>"
|
||||
else
|
||||
dat += "<div class='statusDisplay'>No container inside, please insert container.</div>"
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
return
|
||||
if (src.stat != 0) //NOPOWER etc
|
||||
return
|
||||
if(src.processing)
|
||||
if(processing)
|
||||
usr << "<span class='warning'>The biogenerator is in the process of working.</span>"
|
||||
return
|
||||
var/S = 0
|
||||
@@ -230,142 +230,62 @@
|
||||
menustat = "void"
|
||||
return
|
||||
|
||||
/obj/machinery/biogenerator/proc/check_cost(cost)
|
||||
if (cost > points)
|
||||
/obj/machinery/biogenerator/proc/check_cost(list/materials, multiplier = 1, remove_points = 1)
|
||||
if(materials.len != 1 || materials[1] != MAT_BIOMASS)
|
||||
return 0
|
||||
if (materials[MAT_BIOMASS]*multiplier/efficiency > points)
|
||||
menustat = "nopoints"
|
||||
return 1
|
||||
return 0
|
||||
else
|
||||
points -= cost
|
||||
processing = 1
|
||||
if(remove_points)
|
||||
points -= materials[MAT_BIOMASS]*multiplier/efficiency
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
return 0
|
||||
|
||||
/obj/machinery/biogenerator/proc/check_container_volume(reagent_amount)
|
||||
if(beaker.reagents.total_volume + reagent_amount > beaker.reagents.maximum_volume)
|
||||
menustat = "nobeakerspace"
|
||||
return 1
|
||||
|
||||
/obj/machinery/biogenerator/proc/create_product(create)
|
||||
switch(create)
|
||||
if("milk")
|
||||
if(check_container_volume(10))
|
||||
return 0
|
||||
else if (check_cost(20/efficiency))
|
||||
return 0
|
||||
else beaker.reagents.add_reagent("milk",10)
|
||||
if("bpepper")
|
||||
if(check_container_volume(10))
|
||||
return 0
|
||||
else if (check_cost(25/efficiency))
|
||||
return 0
|
||||
else beaker.reagents.add_reagent("blackpepper",10)
|
||||
if("cream")
|
||||
if(check_container_volume(10))
|
||||
return 0
|
||||
else if (check_cost(30/efficiency))
|
||||
return 0
|
||||
else beaker.reagents.add_reagent("cream",10)
|
||||
if("cmilk")
|
||||
if (check_cost(100/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/reagent_containers/food/condiment/milk(src.loc)
|
||||
if("mpepper")
|
||||
if (check_cost(50/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/reagent_containers/food/condiment/peppermill(src.loc)
|
||||
if("ccream")
|
||||
if (check_cost(300/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/reagent_containers/food/drinks/bottle/cream(src.loc)
|
||||
if("meat")
|
||||
if (check_cost(250/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc)
|
||||
if("ez")
|
||||
if (check_cost(10/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/ez(src.loc)
|
||||
if("l4z")
|
||||
if (check_cost(20/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/l4z(src.loc)
|
||||
if("rh")
|
||||
if (check_cost(25/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/rh(src.loc)
|
||||
if("wk")
|
||||
if (check_cost(50/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/reagent_containers/glass/bottle/killer/weedkiller(src.loc)
|
||||
if("pk")
|
||||
if (check_cost(50/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/reagent_containers/glass/bottle/killer/pestkiller(src.loc)
|
||||
if("empty")
|
||||
if (check_cost(5/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/reagent_containers/glass/bottle/nutrient/empty(src.loc)
|
||||
if("cloth")
|
||||
if (check_cost(50/efficiency))
|
||||
return 0
|
||||
else new/obj/item/stack/sheet/cloth(src.loc)
|
||||
if("tencloth")
|
||||
if (check_cost(500/efficiency))
|
||||
return 0
|
||||
else new/obj/item/stack/sheet/cloth/ten(src.loc)
|
||||
if("wallet")
|
||||
if (check_cost(100/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/storage/wallet(src.loc)
|
||||
if("gloves")
|
||||
if (check_cost(250/efficiency))
|
||||
return 0
|
||||
else new/obj/item/clothing/gloves/botanic_leather(src.loc)
|
||||
if("tbelt")
|
||||
if (check_cost(300/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/storage/belt/utility(src.loc)
|
||||
if("sbelt")
|
||||
if (check_cost(300/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/storage/belt/security(src.loc)
|
||||
if("mbelt")
|
||||
if (check_cost(300/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/storage/belt/medical(src.loc)
|
||||
if("jbelt")
|
||||
if (check_cost(300/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/storage/belt/janitor(src.loc)
|
||||
if("bbelt")
|
||||
if (check_cost(300/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/storage/belt/bandolier(src.loc)
|
||||
if("sholster")
|
||||
if (check_cost(400/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/storage/belt/holster(src.loc)
|
||||
if("satchel")
|
||||
if (check_cost(400/efficiency))
|
||||
return 0
|
||||
else new/obj/item/weapon/storage/backpack/satchel(src.loc)
|
||||
if("jacket")
|
||||
if (check_cost(500/efficiency))
|
||||
return 0
|
||||
else new/obj/item/clothing/suit/jacket/leather(src.loc)
|
||||
if("overcoat")
|
||||
if (check_cost(1000/efficiency))
|
||||
return 0
|
||||
else new/obj/item/clothing/suit/jacket/leather/overcoat(src.loc)
|
||||
if("rice_hat")
|
||||
if (check_cost(300/efficiency))
|
||||
return 0
|
||||
else new/obj/item/clothing/head/rice_hat(src.loc)
|
||||
processing = 0
|
||||
/obj/machinery/biogenerator/proc/check_container_volume(list/reagents, multiplier = 1)
|
||||
var/sum_reagents = 0
|
||||
for(var/R in reagents)
|
||||
sum_reagents += reagents[R]
|
||||
sum_reagents *= multiplier
|
||||
|
||||
if(beaker.reagents.total_volume + sum_reagents > beaker.reagents.maximum_volume)
|
||||
menustat = "nobeakerspace"
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/biogenerator/proc/create_product(datum/design/D, amount)
|
||||
if(!beaker || !loc)
|
||||
return 0
|
||||
|
||||
if(ispath(D.build_path, /obj/item/stack))
|
||||
if(!check_container_volume(D.make_reagents, amount))
|
||||
return 0
|
||||
if(!check_cost(D.materials, amount))
|
||||
return 0
|
||||
|
||||
var/obj/item/stack/product = new D.build_path(loc)
|
||||
product.amount = amount
|
||||
for(var/R in D.make_reagents)
|
||||
beaker.reagents.add_reagent(R, D.make_reagents[R]*amount)
|
||||
else
|
||||
var/i = amount
|
||||
while(i > 0)
|
||||
if(!check_container_volume(D.make_reagents))
|
||||
return .
|
||||
if(!check_cost(D.materials))
|
||||
return .
|
||||
if(D.build_path)
|
||||
new D.build_path(loc)
|
||||
for(var/R in D.make_reagents)
|
||||
beaker.reagents.add_reagent(R, D.make_reagents[R])
|
||||
. = 1
|
||||
--i
|
||||
|
||||
menustat = "complete"
|
||||
update_icon()
|
||||
return 1
|
||||
return .
|
||||
|
||||
/obj/machinery/biogenerator/proc/detach()
|
||||
if(beaker)
|
||||
@@ -389,13 +309,8 @@
|
||||
|
||||
else if(href_list["create"])
|
||||
var/amount = (text2num(href_list["amount"]))
|
||||
var/i = amount
|
||||
var/C = href_list["create"]
|
||||
if(i <= 0)
|
||||
return
|
||||
while(i >= 1)
|
||||
create_product(C)
|
||||
i--
|
||||
var/datum/design/D = locate(href_list["create"])
|
||||
create_product(D, amount)
|
||||
updateUsrDialog()
|
||||
|
||||
else if(href_list["menu"])
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
plant_type = PLANT_MUSHROOM
|
||||
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
|
||||
mutatelist = list(/obj/item/seeds/angel)
|
||||
reagents_add = list("mushroomhallucinogen" = 0.04, "amatoxin" = 0.35, "nutriment" = 0)
|
||||
reagents_add = list("mushroomhallucinogen" = 0.04, "amatoxin" = 0.35, "nutriment" = 0, "growthserum" = 0.1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita
|
||||
seed = /obj/item/seeds/amanita
|
||||
|
||||
@@ -121,11 +121,11 @@
|
||||
myseed.loc = src
|
||||
|
||||
if(self_sustaining)
|
||||
adjustNutri(2 / rating)
|
||||
adjustWater(rand(8, 10) / rating)
|
||||
adjustWeeds(-5 / rating)
|
||||
adjustPests(-5 / rating)
|
||||
adjustToxic(-5 / rating)
|
||||
adjustNutri(2 * rating)
|
||||
adjustWater(rand(8, 10) * rating)
|
||||
adjustWeeds(-5 * rating)
|
||||
adjustPests(-5 * rating)
|
||||
adjustToxic(-5 * rating)
|
||||
|
||||
if(world.time > (lastcycle + cycledelay))
|
||||
lastcycle = world.time
|
||||
@@ -619,7 +619,7 @@
|
||||
adjustHealth(round(salt * 0.25))
|
||||
if (myseed)
|
||||
myseed.adjust_production(-round(salt/100)-prob(salt%100))
|
||||
myseed.adjust_potency(round(salt*0.15))
|
||||
myseed.adjust_potency(round(salt*0.50))
|
||||
// Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer
|
||||
if(S.has_reagent("ash", 1))
|
||||
adjustHealth(round(S.get_reagent_amount("ash") * 0.25))
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
desc = "Used to call and send the mining shuttle."
|
||||
circuit = /obj/item/weapon/circuitboard/computer/mining_shuttle
|
||||
shuttleId = "mining"
|
||||
possible_destinations = "mining_home;mining_away"
|
||||
possible_destinations = "mining_home;mining_away;mining_base"
|
||||
no_destination_swap = 1
|
||||
var/global/list/dumb_rev_heads = list()
|
||||
|
||||
@@ -500,3 +500,95 @@
|
||||
anchored = 1
|
||||
layer = BELOW_MOB_LAYER
|
||||
density = 0
|
||||
|
||||
///Mining Base////
|
||||
|
||||
/area/shuttle/auxillary_base
|
||||
name = "Auxillary Base"
|
||||
|
||||
|
||||
/obj/machinery/computer/shuttle/auxillary_base
|
||||
name = "auxillary base launch control"
|
||||
icon = 'icons/obj/terminals.dmi'
|
||||
icon_state = "dorm_available"
|
||||
shuttleId = "colony_drop"
|
||||
req_access = list(access_heads)
|
||||
possible_destinations = null
|
||||
clockwork = TRUE
|
||||
|
||||
/obj/machinery/computer/shuttle/auxillary_base/Topic(href, href_list)
|
||||
if(href_list["move"])
|
||||
if(z != ZLEVEL_STATION)
|
||||
usr << "<span class='warning'>You can't move the base again!</span>"
|
||||
return 0
|
||||
..()
|
||||
|
||||
/obj/item/device/assault_pod/mining
|
||||
name = "Landing Field Designator"
|
||||
icon_state = "gangtool-purple"
|
||||
item_state = "electronic"
|
||||
icon = 'icons/obj/device.dmi'
|
||||
desc = "Deploy to designate the landing zone of the auxillary base."
|
||||
shuttle_id = "colony_drop"
|
||||
var/setting = FALSE
|
||||
var/no_restrictions = FALSE //Badmin variable to let you drop the colony ANYWHERE.
|
||||
dwidth = 11 //These dimensions are to be set by the mappers for their respective maps.
|
||||
dheight = 0
|
||||
width = 23
|
||||
height = 23
|
||||
lz_dir = 1
|
||||
|
||||
/obj/item/device/assault_pod/mining/attack_self(mob/living/user)
|
||||
if(setting)
|
||||
return
|
||||
var/turf/T = get_turf(user)
|
||||
if(!no_restrictions)
|
||||
if(T.z != ZLEVEL_MINING)
|
||||
user << "Wouldn't do much good dropping a mining base away from the mining area!"
|
||||
return
|
||||
var/colony_radius = max(width, height)/2
|
||||
var/list/area_counter = get_areas_in_range(colony_radius, T)
|
||||
if(area_counter.len > 1) //Avoid smashing ruins unless you are inside a really big one
|
||||
user << "Unable to acquire a targeting lock. Find an area clear of stuctures or entirely within one."
|
||||
return
|
||||
|
||||
user << "<span class='notice'>You begin setting the landing zone parameters...</span>"
|
||||
setting = TRUE
|
||||
if(!do_after(user, 50, target = src)) //You get a few seconds to cancel if you do not want to drop there.
|
||||
setting = FALSE
|
||||
return
|
||||
|
||||
var/obj/docking_port/stationary/landing_zone = new /obj/docking_port/stationary(T)
|
||||
landing_zone.id = "colony_drop(\ref[src])"
|
||||
landing_zone.name = "Landing Zone"
|
||||
landing_zone.dwidth = dwidth
|
||||
landing_zone.dheight = dheight
|
||||
landing_zone.width = width
|
||||
landing_zone.height = height
|
||||
landing_zone.setDir(lz_dir)
|
||||
|
||||
for(var/obj/machinery/computer/shuttle/S in machines)
|
||||
if(S.shuttleId == shuttle_id)
|
||||
S.possible_destinations = "[landing_zone.id]"
|
||||
|
||||
//Serves as a nice mechanic to people get ready for the launch.
|
||||
minor_announce("Auxiliary base landing zone coordinates locked in for [get_area(user)]. Launch command now available!")
|
||||
user << "<span class='notice'>Landing zone set.</span>"
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/item/device/assault_pod/mining/unrestricted
|
||||
name = "omni-locational landing field designator"
|
||||
desc = "Allows the deployment of the mining base ANYWHERE. Use with caution."
|
||||
no_restrictions = TRUE
|
||||
|
||||
|
||||
/area/shuttle/auxillary_base
|
||||
name = "Auxillary Base"
|
||||
|
||||
/obj/docking_port/mobile/auxillary_base
|
||||
name = "auxillary base"
|
||||
id = "colony_drop"
|
||||
dwidth = 11
|
||||
width = 23
|
||||
height = 23
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user