Merge branch 'master' of https://github.com/tgstation/tgstation into bayputers

This commit is contained in:
Shadowlight213
2016-08-05 23:15:39 -07:00
166 changed files with 2396 additions and 1113 deletions
@@ -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
+30 -30
View File
@@ -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" = (
+1 -1
View File
@@ -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{
+51 -51
View File
@@ -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
+1 -1
View File
@@ -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,
+2
View File
@@ -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))
+1
View File
@@ -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.
+1
View File
@@ -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
+9 -3
View File
@@ -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.
+8 -6
View File
@@ -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
View File
@@ -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
+6
View File
@@ -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()
+4 -31
View File
@@ -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
+1
View File
@@ -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
View File
@@ -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]"
+27
View File
@@ -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>")
..()
+7 -1
View File
@@ -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
View File
@@ -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
+4
View File
@@ -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
View File
@@ -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"
+29 -17
View File
@@ -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)
+58 -2
View File
@@ -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
+1 -1
View File
@@ -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
+62 -11
View File
@@ -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
+3 -2
View File
@@ -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))
+36 -17
View File
@@ -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)
+7
View File
@@ -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
+58 -108
View File
@@ -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
+12 -10
View File
@@ -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)
+114
View File
@@ -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)
+59 -14
View File
@@ -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)
+1 -1
View File
@@ -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 --
+1 -1
View File
@@ -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
+5 -2
View File
@@ -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)
+1 -1
View File
@@ -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
+6
View File
@@ -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>"
+3
View File
@@ -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)))
+4 -1
View File
@@ -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)
+5 -2
View File
@@ -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)
+5 -2
View File
@@ -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)
+3 -1
View File
@@ -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>")
+25
View File
@@ -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
+34 -9
View File
@@ -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)
+1 -1
View File
@@ -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
+80 -43
View File
@@ -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>"
+3
View File
@@ -219,3 +219,6 @@
/obj/proc/CanAStarPass()
. = !density
/obj/proc/check_uplink_validity()
return 1
+5 -2
View File
@@ -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)
+6 -2
View File
@@ -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)
+2 -2
View File
@@ -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"
+5 -2
View File
@@ -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)
+1
View File
@@ -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
+5 -2
View File
@@ -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)
+1 -1
View File
@@ -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)
+8 -3
View File
@@ -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
+5 -2
View File
@@ -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")
+21 -1
View File
@@ -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)
+2 -2
View File
@@ -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'
+1 -1
View File
@@ -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
+7 -1
View File
@@ -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
+2 -1
View File
@@ -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
+13 -2
View File
@@ -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"
+3 -3
View File
@@ -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()
+3 -3
View File
@@ -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
+2 -2
View File
@@ -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"
+6 -6
View File
@@ -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
+1 -1
View File
@@ -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"
+5 -5
View File
@@ -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"
+72
View File
@@ -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"
+2
View File
@@ -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
+15
View File
@@ -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)
+1 -1
View File
@@ -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
+91 -176
View File
@@ -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"])
+1 -1
View File
@@ -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
+6 -6
View File
@@ -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))
+93 -1
View File
@@ -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