Merge branch 'master' into bunnypack

This commit is contained in:
Nick
2018-02-09 07:10:12 +01:00
committed by GitHub
394 changed files with 84552 additions and 70254 deletions
+16 -1
View File
@@ -11,4 +11,19 @@
#define APPRENTICE_DESTRUCTION "destruction"
#define APPRENTICE_BLUESPACE "bluespace"
#define APPRENTICE_ROBELESS "robeless"
#define APPRENTICE_HEALING "healing"
#define APPRENTICE_HEALING "healing"
//ERT Types
#define ERT_BLUE "Blue"
#define ERT_RED "Red"
#define ERT_AMBER "Amber"
#define ERT_DEATHSQUAD "Deathsquad"
//ERT subroles
#define ERT_SEC "sec"
#define ERT_MED "med"
#define ERT_ENG "eng"
#define ERT_LEADER "leader"
#define DEATHSQUAD "ds"
#define DEATHSQUAD_LEADER "ds_leader"
+1 -1
View File
@@ -67,7 +67,7 @@ Last space-z level = empty
DECLARE_LEVEL("Main Station", CROSSLINKED, list(ZTRAIT_STATION = TRUE)),\
DECLARE_LEVEL("Empty Area 1", CROSSLINKED, list(ZTRAIT_SPACE_RUINS = TRUE)),\
DECLARE_LEVEL("Empty Area 2", CROSSLINKED, list(ZTRAIT_SPACE_RUINS = TRUE)),\
DECLARE_LEVEL("Lavaland", UNAFFECTED, list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 3)),\
DECLARE_LEVEL("Lavaland", UNAFFECTED, list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 2)),\
DECLARE_LEVEL("Reebe", UNAFFECTED, list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5)),\
)
+1 -1
View File
@@ -191,7 +191,7 @@
#define OFFSET_NECK "neck"
//MINOR TWEAKS/MISC
#define AGE_MIN 17 //youngest a character can be
#define AGE_MIN 18 //youngest a character can be
#define AGE_MAX 85 //oldest a character can be
#define WIZARD_AGE_MIN 30 //youngest a wizard can be
#define APPRENTICE_AGE_MIN 29 //youngest an apprentice can be
+2
View File
@@ -30,6 +30,8 @@
#define STATUS_EFFECT_FLESHMEND /datum/status_effect/fleshmend //Very fast healing; suppressed by fire, and heals less fire damage
#define STATUS_EFFECT_EXERCISED /datum/status_effect/exercised //Prevents heart disease
/////////////
// DEBUFFS //
/////////////
+5 -2
View File
@@ -1506,10 +1506,13 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
// Makes a call in the context of a different usr
// Use sparingly
/world/proc/PushUsr(mob/M, datum/callback/CB)
/world/proc/PushUsr(mob/M, datum/callback/CB, ...)
var/temp = usr
usr = M
. = CB.Invoke()
if (length(args) > 2)
. = CB.Invoke(arglist(args.Copy(3)))
else
. = CB.Invoke()
usr = temp
//Returns a list of all servants of Ratvar and observers.
+28 -28
View File
@@ -1,28 +1,28 @@
//////////////
GLOBAL_VAR_INIT(NEARSIGHTBLOCK, 0)
GLOBAL_VAR_INIT(EPILEPSYBLOCK, 0)
GLOBAL_VAR_INIT(COUGHBLOCK, 0)
GLOBAL_VAR_INIT(TOURETTESBLOCK, 0)
GLOBAL_VAR_INIT(NERVOUSBLOCK, 0)
GLOBAL_VAR_INIT(BLINDBLOCK, 0)
GLOBAL_VAR_INIT(DEAFBLOCK, 0)
GLOBAL_VAR_INIT(HULKBLOCK, 0)
GLOBAL_VAR_INIT(TELEBLOCK, 0)
GLOBAL_VAR_INIT(FIREBLOCK, 0)
GLOBAL_VAR_INIT(XRAYBLOCK, 0)
GLOBAL_VAR_INIT(CLUMSYBLOCK, 0)
GLOBAL_VAR_INIT(STRANGEBLOCK, 0)
GLOBAL_VAR_INIT(RACEBLOCK, 0)
GLOBAL_LIST(bad_se_blocks)
GLOBAL_LIST(good_se_blocks)
GLOBAL_LIST(op_se_blocks)
GLOBAL_VAR(NULLED_SE)
GLOBAL_VAR(NULLED_UI)
GLOBAL_LIST_EMPTY(global_mutations) // list of hidden mutation things
GLOBAL_LIST_EMPTY(bad_mutations)
GLOBAL_LIST_EMPTY(good_mutations)
GLOBAL_LIST_EMPTY(not_good_mutations)
//////////////
GLOBAL_VAR_INIT(NEARSIGHTBLOCK, 0)
GLOBAL_VAR_INIT(EPILEPSYBLOCK, 0)
GLOBAL_VAR_INIT(COUGHBLOCK, 0)
GLOBAL_VAR_INIT(TOURETTESBLOCK, 0)
GLOBAL_VAR_INIT(NERVOUSBLOCK, 0)
GLOBAL_VAR_INIT(BLINDBLOCK, 0)
GLOBAL_VAR_INIT(DEAFBLOCK, 0)
GLOBAL_VAR_INIT(HULKBLOCK, 0)
GLOBAL_VAR_INIT(TELEBLOCK, 0)
GLOBAL_VAR_INIT(FIREBLOCK, 0)
GLOBAL_VAR_INIT(XRAYBLOCK, 0)
GLOBAL_VAR_INIT(CLUMSYBLOCK, 0)
GLOBAL_VAR_INIT(STRANGEBLOCK, 0)
GLOBAL_VAR_INIT(RACEBLOCK, 0)
GLOBAL_LIST(bad_se_blocks)
GLOBAL_LIST(good_se_blocks)
GLOBAL_LIST(op_se_blocks)
GLOBAL_VAR(NULLED_SE)
GLOBAL_VAR(NULLED_UI)
GLOBAL_LIST_EMPTY(global_mutations) // list of hidden mutation things
GLOBAL_LIST_EMPTY(bad_mutations)
GLOBAL_LIST_EMPTY(good_mutations)
GLOBAL_LIST_EMPTY(not_good_mutations)
+1 -1
View File
@@ -162,7 +162,7 @@
if(..())
return
var/mob/living/silicon/S = usr
S.sensor_mode()
S.toggle_sensors()
/datum/hud/ai
+20 -19
View File
@@ -1004,49 +1004,49 @@ obj/item/projectile/bullet/c10mm/soporific
switch(choice)
if("Frame Color")
var/frame_color_input = input(usr,"Choose Frame Color") as color|null
var/frame_color_input = input(usr,"","Choose Frame Color",frame_color) as color|null
if(frame_color_input)
frame_color = sanitize_hexcolor(frame_color_input, desired_format=6, include_crunch=1)
update_icon()
if("Receiver Color")
var/receiver_color_input = input(usr,"Choose Receiver Color") as color|null
var/receiver_color_input = input(usr,"","Choose Receiver Color",receiver_color) as color|null
if(receiver_color_input)
receiver_color = sanitize_hexcolor(receiver_color_input, desired_format=6, include_crunch=1)
update_icon()
if("Body Color")
var/body_color_input = input(usr,"Choose Body Color") as color|null
var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null
if(body_color_input)
body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
update_icon()
if("Barrel Color")
var/barrel_color_input = input(usr,"Choose Barrel Color") as color|null
var/barrel_color_input = input(usr,"","Choose Barrel Color",barrel_color) as color|null
if(barrel_color_input)
barrel_color = sanitize_hexcolor(barrel_color_input, desired_format=6, include_crunch=1)
update_icon()
if("Barrel Tip Color")
var/tip_color_input = input(usr,"Choose Barrel Tip Color") as color|null
var/tip_color_input = input(usr,"","Choose Barrel Tip Color",tip_color) as color|null
if(tip_color_input)
tip_color = sanitize_hexcolor(tip_color_input, desired_format=6, include_crunch=1)
update_icon()
if("Grip Light Color")
var/grip_color_input = input(usr,"Choose Grip Light Color") as color|null
var/grip_color_input = input(usr,"","Choose Grip Light Color",grip_color) as color|null
if(grip_color_input)
grip_color = sanitize_hexcolor(grip_color_input, desired_format=6, include_crunch=1)
update_icon()
if("Light Color")
var/energy_color_input = input(usr,"Choose Light Color") as color|null
var/energy_color_input = input(usr,"","Choose Light Color",energy_color) as color|null
if(energy_color_input)
energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
update_icon()
if("Arm Color")
var/arm_color_input = input(usr,"Choose Arm Color") as color|null
var/arm_color_input = input(usr,"","Choose Arm Color",arm_color) as color|null
if(arm_color_input)
arm_color = sanitize_hexcolor(arm_color_input, desired_format=6, include_crunch=1)
update_icon()
@@ -1155,6 +1155,7 @@ obj/item/projectile/bullet/c10mm/soporific
pin = /obj/item/device/firing_pin
spawnwithmagazine = TRUE
obj_flags = 0
casing_ejector = FALSE
mag_type = /obj/item/ammo_box/magazine/toy/pistol
can_suppress = FALSE
actions_types = list(/datum/action/item_action/pick_color)
@@ -1182,7 +1183,6 @@ obj/item/gun/energy/e_gun/cx
ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
flight_x_offset = 15
flight_y_offset = 10
actions_types = list(/datum/action/item_action/pick_color)
var/body_color = "#252528"
obj/item/gun/energy/e_gun/cx/update_icon()
@@ -1196,16 +1196,17 @@ obj/item/gun/energy/e_gun/cx/update_icon()
var/mob/M = loc
M.update_inv_hands()
obj/item/gun/energy/e_gun/cx/ui_action_click(mob/user, var/datum/action/A)
if(istype(A, /datum/action/item_action/pick_color))
if(alert("Are you sure you want to repaint your gun?", "Confirm Repaint", "Yes", "No") == "Yes")
var/body_color_input = input(usr,"Choose Body Color") as color|null
if(body_color_input)
body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user)
if(!in_range(src, user)) //Basic checks to prevent abuse
return
if(user.incapacitated() || !istype(user))
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
return
if(alert("Are you sure you want to repaint your gun?", "Confirm Repaint", "Yes", "No") == "Yes")
var/body_color_input = input(usr,"","Choose Body Color",body_color) as color|null
if(body_color_input)
body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
update_icon()
A.UpdateButtonIcon()
else
..()
obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file)
. = ..()
@@ -1261,7 +1262,7 @@ obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file)
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
return
if(alert("Are you sure you want to recolor your gun?", "Confirm Repaint", "Yes", "No") == "Yes")
var/body_color_input = input(usr,"Choose Shroud Color") as color|null
var/body_color_input = input(usr,"","Choose Shroud Color",body_color) as color|null
if(body_color_input)
body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
update_icon()
+2 -1
View File
@@ -49,7 +49,8 @@ SUBSYSTEM_DEF(atoms)
++count
CHECK_TICK
log_world("Initialized [count] atoms")
testing("Initialized [count] atoms")
pass(count)
initialized = INITIALIZATION_INNEW_REGULAR
+1 -1
View File
@@ -204,7 +204,7 @@ SUBSYSTEM_DEF(ticker)
check_queue()
check_maprotate()
scripture_states = scripture_unlock_alert(scripture_states)
//SSshuttle.autoEnd()
SSshuttle.autoEnd()
if(!roundend_check_paused && mode.check_finished(force_ending) || force_ending)
current_state = GAME_STATE_FINISHED
+8 -4
View File
@@ -78,11 +78,13 @@
if(W)
var/mob/M = W.resolve()
if(M)
if (length(args))
return world.PushUsr(arglist(list(M, src) + args))
return world.PushUsr(M, src)
if (!object)
return
var/list/calling_arguments = arguments
if (length(args))
if (length(arguments))
@@ -104,11 +106,13 @@
if(W)
var/mob/M = W.resolve()
if(M)
if (length(args))
return world.PushUsr(arglist(list(M, src) + args))
return world.PushUsr(M, src)
if (!object)
return
var/list/calling_arguments = arguments
if (length(args))
if (length(arguments))
+2 -2
View File
@@ -95,7 +95,7 @@
if(!istype(proc_or_callback, /datum/callback)) //if it wasnt a callback before, it is now
proc_or_callback = CALLBACK(src, proc_or_callback)
procs[sig_type] = proc_or_callback
enabled = TRUE
/datum/component/proc/InheritComponent(datum/component/C, i_am_original)
@@ -180,7 +180,7 @@
var/datum/component/old_comp
var/datum/component/new_comp
if(ispath(nt))
if(nt == /datum/component)
CRASH("[nt] attempted instantiation!")
+9 -8
View File
@@ -72,10 +72,10 @@
/datum/component/material_container/proc/user_insert(obj/item/I, mob/living/user)
set waitfor = FALSE
var/requested_amount
var/Itype = I.type
if(ispath(Itype, /obj/item/stack) && precise_insertion)
if(istype(I, /obj/item/stack) && precise_insertion)
var/atom/current_parent = parent
requested_amount = input(user, "How much do you want to insert?", "Inserting sheets") as num|null
var/obj/item/stack/S = I
requested_amount = input(user, "How much do you want to insert?", "Inserting [S.singular_name]s") as num|null
if(isnull(requested_amount) || (requested_amount <= 0))
return
if(QDELETED(I) || QDELETED(user) || QDELETED(src) || parent != current_parent || !user.canUseTopic(current_parent) || !user.is_holding(I) || !user.Adjacent(current_parent))
@@ -86,14 +86,15 @@
var/inserted = insert_item(I, stack_amt = requested_amount)
if(inserted)
if(istype(I, /obj/item/stack))
to_chat(user, "<span class='notice'>You insert [inserted] sheet[inserted>1 ? "s" : ""] into [parent].</span>")
var/obj/item/stack/S = I
to_chat(user, "<span class='notice'>You insert [inserted] [S.singular_name][inserted>1 ? "s" : ""] into [parent].</span>")
if(!QDELETED(I))
user.put_in_active_hand(I)
else
to_chat(user, "<span class='notice'>You insert a material total of [inserted] into [parent].</span>")
qdel(I)
if(after_insert)
after_insert.Invoke(Itype, last_inserted_id, inserted)
after_insert.Invoke(I.type, last_inserted_id, inserted)
else
user.put_in_active_hand(I)
@@ -114,7 +115,7 @@
return (total_amount - total_amount_saved)
return FALSE
/datum/component/material_container/proc/insert_stack(obj/item/stack/S, amt)
/datum/component/material_container/proc/insert_stack(obj/item/stack/S, amt, multiplier = 1)
if(isnull(amt))
amt = S.amount
@@ -132,7 +133,7 @@
if(!amt)
return FALSE
last_inserted_id = insert_materials(S,amt)
last_inserted_id = insert_materials(S,amt * multiplier)
S.use(amt)
return amt
@@ -140,7 +141,7 @@
if(!I)
return FALSE
if(istype(I, /obj/item/stack))
return insert_stack(I, stack_amt)
return insert_stack(I, stack_amt, multiplier)
var/material_amount = get_item_material_amount(I)
if(!material_amount || !has_space(material_amount))
+59
View File
@@ -0,0 +1,59 @@
/datum/disease/heart_failure
form = "Condition"
name = "Myocardial Infarction"
max_stages = 5
stage_prob = 2
cure_text = "Heart replacement surgery to cure. Defibrillation (or as a last resort, uncontrolled electric shocking) may also be effective after the onset of cardiac arrest. Corazone can also mitigate cardiac arrest."
agent = "Shitty Heart"
viable_mobtypes = list(/mob/living/carbon)
permeability_mod = 1
desc = "If left untreated the subject will die!"
severity = "Dangerous!"
disease_flags = CAN_CARRY|CAN_RESIST
spread_flags = VIRUS_SPREAD_NON_CONTAGIOUS
visibility_flags = HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/heart)
var/sound = FALSE
/datum/disease/heart_failure/stage_act()
..()
var/obj/item/organ/heart/O = affected_mob.getorgan(/obj/item/organ/heart)
var/mob/living/carbon/H = affected_mob
if(O && H.can_heartattack())
switch(stage)
if(1 to 2)
if(prob(2))
to_chat(H, "<span class='warning'>You feel [pick("discomfort", "pressure", "a burning sensation", "pain")] in your chest.</span>")
if(prob(2))
to_chat(H, "<span class='warning'>You feel dizzy.</span>")
H.confused += 6
if(prob(3))
to_chat(H, "<span class='warning'>You feel [pick("full", "nauseous", "sweaty", "weak", "tired", "short on breath", "uneasy")].</span>")
if(3 to 4)
if(!sound)
H.playsound_local(H, 'sound/health/slowbeat.ogg',40,0, channel = CHANNEL_HEARTBEAT)
sound = TRUE
if(prob(3))
to_chat(H, "<span class='danger'>You feel a sharp pain in your chest!</span>")
if(prob(25))
affected_mob.vomit(95)
H.emote("cough")
H.Knockdown(40)
H.losebreath += 4
if(prob(3))
to_chat(H, "<span class='danger'>You feel very weak and dizzy...</span>")
H.confused += 8
H.adjustStaminaLoss(40)
H.emote("cough")
if(5)
H.stop_sound_channel(CHANNEL_HEARTBEAT)
H.playsound_local(H, 'sound/effects/singlebeat.ogg', 100, 0)
if(H.stat == CONSCIOUS)
H.visible_message("<span class='userdanger'>[H] clutches at [H.p_their()] chest as if [H.p_their()] heart is stopping!</span>")
H.adjustStaminaLoss(60)
H.reagents.add_reagent("corazone", 3) // To give the victim a final chance to shock their heart before losing consciousness
H.set_heartattack(TRUE)
cure()
else
cure()
+20 -2
View File
@@ -202,6 +202,12 @@
var/list/entries = list()
var/language = /datum/language/common //Initial language, can be changed by HOLORECORD_LANGUAGE entries
/datum/holorecord/proc/set_caller_image(mob/user)
var/olddir = user.dir
user.setDir(SOUTH)
caller_image = getFlatIcon(user)
user.setDir(olddir)
/obj/item/disk/holodisk
name = "holorecord disk"
desc = "Stores recorder holocalls."
@@ -234,7 +240,7 @@
record.language = holodiskOriginal.record.language
to_chat(user, "You copy the record from [holodiskOriginal] to [src] by connecting the ports!")
name = holodiskOriginal.name
else
else
to_chat(user, "[holodiskOriginal] has no record on it!")
..()
@@ -278,7 +284,7 @@
else
var/datum/preset_holoimage/H = new preset_image_type
record.caller_image = H.build_image()
//These build caller image from outfit and some additional data, for use by mappers for ruin holorecords
/datum/preset_holoimage
var/nonhuman_mobtype //Fill this if you just want something nonhuman
@@ -324,9 +330,21 @@
/datum/preset_holoimage/engineer
outfit_type = /datum/outfit/job/engineer/gloved/rig
/datum/preset_holoimage/researcher
outfit_type = /datum/outfit/job/scientist
/datum/preset_holoimage/captain
outfit_type = /datum/outfit/job/captain
/datum/preset_holoimage/nanotrasenprivatesecurity
outfit_type = /datum/outfit/nanotrasensoldiercorpse2
/datum/preset_holoimage/gorilla
nonhuman_mobtype = /mob/living/simple_animal/hostile/gorilla
/datum/preset_holoimage/corgi
nonhuman_mobtype = /mob/living/simple_animal/pet/dog/corgi
/datum/preset_holoimage/clown
outfit_type = /datum/outfit/job/clown
+7
View File
@@ -268,3 +268,10 @@
suffix = "whiteshipdock.dmm"
name = "Whiteship Dock"
description = "An abandoned but functional vessel parked in deep space, ripe for the taking."
/datum/map_template/ruin/space/cat_experiments
id = "meow"
suffix = "mrow_thats_right.dmm"
name = "Feline-Human Combination Den"
description = "With heated debates over the legality of the catperson and their status in the workforce, there's always a place for the blackmarket to slip in for some cash. Whether the results \
are morally sound or not is another issue entirely."
+13
View File
@@ -87,6 +87,7 @@
description = "A respectable mid-sized shuttle that first saw service shuttling Nanotrasen crew to and from their asteroid belt embedded facilities."
credit_cost = 3000
/datum/map_template/shuttle/emergency/bar
suffix = "bar"
name = "The Emergency Escape Bar"
@@ -109,6 +110,18 @@
admin_notes = "This shuttle will likely crush escape, killing anyone there."
credit_cost = -5000
/datum/map_template/shuttle/emergency/saltmine
suffix = "saltmine"
name = "The Saltmine"
description = "Contains everything that upsets you."
admin_notes = "Don't forget: You're here forever."
credit_cost = 5000
/datum/map_template/shuttle/emergency/saltmine/prerequisites_met()
if("revenant" in SSshuttle.shuttle_purchase_requirements_met)
return TRUE
return FALSE
/datum/map_template/shuttle/emergency/luxury
suffix = "luxury"
name = "Luxury Shuttle"
+14
View File
@@ -436,3 +436,17 @@
name = "Fleshmend"
desc = "Our wounds are rapidly healing. <i>This effect is prevented if we are on fire.</i>"
icon_state = "fleshmend"
/datum/status_effect/exercised
id = "Exercised"
duration = 1200
alert_type = null
/datum/status_effect/exercised/on_creation(mob/living/new_owner, ...)
. = ..()
STOP_PROCESSING(SSfastprocess, src)
START_PROCESSING(SSprocessing, src) //this lasts 20 minutes, so SSfastprocess isn't needed.
/datum/status_effect/exercised/Destroy()
. = ..()
STOP_PROCESSING(SSprocessing, src)
@@ -0,0 +1,26 @@
/datum/weather/snow_storm
name = "snow storm"
desc = "Harsh snowstorms roam the topside of this arctic planet, burying any area unfortunate enough to be in its path."
probability = 90
telegraph_message = "<span class='warning'>Drifting particles of snow begin to dust the surrounding area..</span>"
telegraph_duration = 300
telegraph_overlay = "light_snow"
weather_message = "<span class='userdanger'><i>Harsh winds pick up as dense snow begins to fall from the sky! Seek shelter!</i></span>"
weather_overlay = "snow_storm"
weather_duration_lower = 600
weather_duration_upper = 1500
end_duration = 100
end_message = "<span class='boldannounce'>The snowfall dies down, it should be safe to go outside again.</span>"
area_type = /area/awaymission/snowdin/outside
target_trait = ZTRAIT_AWAY
immunity_type = "snow"
/datum/weather/snow_storm/weather_act(mob/living/L)
L.bodytemperature -=(rand(5,15))
+3
View File
@@ -55,6 +55,9 @@
/area/ruin/space/has_grav/powered/dinner_for_two
name = "Dinner for Two"
/area/ruin/space/has_grav/powered/cat_man
name = "Kitty Den"
/area/ruin/space/has_grav/powered/authorship
name = "Authorship"
+2 -2
View File
@@ -370,7 +370,7 @@
SendSignal(COMSIG_ATOM_EMAG_ACT)
/atom/proc/rad_act(strength)
SendSignal(COMSIG_ATOM_RAD_ACT)
SendSignal(COMSIG_ATOM_RAD_ACT, strength)
/atom/proc/narsie_act()
SendSignal(COMSIG_ATOM_NARSIE_ACT)
@@ -569,4 +569,4 @@
return
/atom/proc/GenerateTag()
return
return
+5 -5
View File
@@ -98,7 +98,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
var/threat = 0 // used for determining which meteors are most interesting
var/lifetime = DEFAULT_METEOR_LIFETIME
var/timerid = null
var/list/meteordrop = list(/obj/item/ore/iron)
var/list/meteordrop = list(/obj/item/stack/ore/iron)
var/dropamt = 2
/obj/effect/meteor/Move()
@@ -217,7 +217,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
hits = 1
hitpwr = 3
meteorsound = 'sound/weapons/gunshot_smg.ogg'
meteordrop = list(/obj/item/ore/glass)
meteordrop = list(/obj/item/stack/ore/glass)
threat = 1
//Medium-sized
@@ -250,7 +250,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
hits = 5
heavy = 1
meteorsound = 'sound/effects/bamf.ogg'
meteordrop = list(/obj/item/ore/plasma)
meteordrop = list(/obj/item/stack/ore/plasma)
threat = 20
/obj/effect/meteor/flaming/meteor_effect()
@@ -262,7 +262,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
name = "glowing meteor"
icon_state = "glowing"
heavy = 1
meteordrop = list(/obj/item/ore/uranium)
meteordrop = list(/obj/item/stack/ore/uranium)
threat = 15
@@ -332,7 +332,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
hitpwr = 1
heavy = 1
meteorsound = 'sound/effects/bamf.ogg'
meteordrop = list(/obj/item/ore/plasma)
meteordrop = list(/obj/item/stack/ore/plasma)
threat = 50
/obj/effect/meteor/tunguska/Move()
+9 -10
View File
@@ -89,18 +89,17 @@
if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O))
updateUsrDialog()
return
return TRUE
if(exchange_parts(user, O))
return
return TRUE
if(panel_open)
if(istype(O, /obj/item/crowbar))
default_deconstruction_crowbar(O)
return TRUE
else if(is_wire_tool(O))
wires.interact(user)
return TRUE
if(default_deconstruction_crowbar(O))
return TRUE
if(panel_open && is_wire_tool(O))
wires.interact(user)
return TRUE
if(user.a_intent == INTENT_HARM) //so we can hit the machine
return ..()
@@ -124,7 +123,7 @@
return ..()
/obj/machinery/autolathe/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted)
if(ispath(type_inserted, /obj/item/ore/bluespace_crystal))
if(ispath(type_inserted, /obj/item/stack/ore/bluespace_crystal))
use_power(MINERAL_MATERIAL_AMOUNT / 10)
else
switch(id_inserted)
+2 -1
View File
@@ -46,6 +46,7 @@
/obj/item/toy/eightball = 2,
/obj/item/toy/windupToolbox = 2,
/obj/item/toy/clockwork_watch = 2,
/obj/item/toy/toy_dagger = 2,
/obj/item/extendohand/acme = 1)
light_color = LIGHT_COLOR_GREEN
@@ -76,7 +77,7 @@
new prizeselect(src)
var/atom/movable/prize = pick(contents)
visible_message("<span class='notice'>[src] dispenses a [prize]!</span>", "<span class='notice'>You hear a chime and a clunk.</span>")
visible_message("<span class='notice'>[src] dispenses [prize]!</span>", "<span class='notice'>You hear a chime and a clunk.</span>")
prize.forceMove(get_turf(src))
#undef PULSE_MEDAL
@@ -745,9 +745,9 @@
/datum/comm_message/New(new_title,new_content,new_possible_answers)
..()
if(title)
if(new_title)
title = new_title
if(content)
if(new_content)
content = new_content
if(new_possible_answers)
possible_answers = new_possible_answers
+1 -1
View File
@@ -38,7 +38,7 @@
if(defib && defib.cell && defib.cell.charge < defib.cell.maxcharge)
use_power(20)
defib.cell.give(18) //90% efficiency, slightly better than the cell charger's 87.5%
if(isliving(defib.paddles.loc))
if(defib && defib.paddles && isliving(defib.paddles.loc))
var/mob/living/L = defib.paddles.loc
if(!L.Adjacent(src))
to_chat(L, "<span class='warning'>[defib]'s paddles overextend and come out of your hands!</span>")
+15 -1
View File
@@ -62,9 +62,23 @@
icon = 'icons/obj/structures.dmi'
icon_state = "woodenbarricade"
material = WOOD
var/drop_amount = 3
/obj/structure/barricade/wooden/crude
name = "crude plank barricade"
desc = "This space is blocked off by a crude assortment of planks."
icon_state = "woodenbarricade-old"
drop_amount = 1
max_integrity = 50
proj_pass_rate = 65
/obj/structure/barricade/wooden/crude/snow
desc = "This space is blocked off by a crude assortment of planks. It seems to be covered in a layer of snow."
icon_state = "woodenbarricade-snow-old"
max_integrity = 75
/obj/structure/barricade/wooden/make_debris()
new /obj/item/stack/sheet/mineral/wood(get_turf(src), 3)
new /obj/item/stack/sheet/mineral/wood(get_turf(src), drop_amount)
/obj/structure/barricade/sandbags
+5
View File
@@ -211,6 +211,11 @@
flags_1 = ON_BORDER_1
CanAtmosPass = ATMOS_PASS_PROC
/obj/machinery/door/firedoor/border_only/closed
icon_state = "door_closed"
opacity = TRUE
density = TRUE
/obj/machinery/door/firedoor/border_only/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && (mover.pass_flags & PASSGLASS))
return 1
+9 -4
View File
@@ -110,10 +110,15 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
if(!istype(linked_techweb))
say("Warning: No linked research system!")
return
var/point_gain = techweb_scale_bomb(orig_light - 20 - linked_techweb.max_bomb_value)
if(!point_gain)
var/adjusted = orig_light - 10 - linked_techweb.max_bomb_value
if(adjusted <= 0)
say("Explosion not large enough for research calculations.")
return
linked_techweb.max_bomb_value = orig_light - 20
var/point_gain = techweb_scale_bomb(adjusted)
if(point_gain <= 0)
say("Explosion not large enough for research calculations.")
return
linked_techweb.max_bomb_value = orig_light - 10
linked_techweb.research_points += point_gain
say("Gained [point_gain] points from explosion dataset.")
@@ -124,4 +129,4 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
linked_techweb = SSresearch.science_tech
/proc/techweb_scale_bomb(lightradius)
return (lightradius ** 0.5) * 13000
return (lightradius ** 0.5) * 5000
+2 -2
View File
@@ -165,10 +165,10 @@ The console is located at computer/gulag_teleporter.dm
name = "labor camp teleporter (Machine Board)"
build_path = /obj/machinery/gulag_teleporter
req_components = list(
/obj/item/ore/bluespace_crystal = 2,
/obj/item/stack/ore/bluespace_crystal = 2,
/obj/item/stock_parts/scanning_module,
/obj/item/stock_parts/manipulator)
def_components = list(/obj/item/ore/bluespace_crystal = /obj/item/ore/bluespace_crystal/artificial)
def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial)
/* beacon that receives the teleported prisoner */
/obj/structure/gulag_beacon
+19 -11
View File
@@ -58,6 +58,7 @@ Possible to do for anyone motivated enough:
var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging
var/static/list/holopads = list()
var/obj/effect/overlay/holoray/ray
var/offset = FALSE
/obj/machinery/holopad/Initialize()
. = ..()
@@ -279,7 +280,16 @@ Possible to do for anyone motivated enough:
record_stop()
else if(href_list["record_clear"])
record_clear()
else if(href_list["offset"])
offset++
if (offset > 4)
offset = FALSE
var/turf/new_turf
if (!offset)
new_turf = get_turf(src)
else
new_turf = get_step(src, GLOB.cardinals[offset])
replay_holo.forceMove(new_turf)
updateDialog()
//do not allow AIs to answer calls or people will use it to meta the AI sattelite
@@ -420,7 +430,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/holopad/proc/clear_holo(mob/living/user)
qdel(masters[user]) // Get rid of user's hologram
qdel(holorays[user])
unset_holo(user)
return TRUE
@@ -429,6 +438,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if(istype(AI) && AI.current == src)
AI.current = null
LAZYREMOVE(masters, user) // Discard AI from the list of those who use holopad
qdel(holorays[user])
LAZYREMOVE(holorays, user)
SetLightsAndPower()
return TRUE
@@ -493,7 +503,8 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
replay_mode = TRUE
replay_holo = setup_replay_holo(disk.record)
temp = "Replaying...<br>"
temp += "<A href='?src=[REF(src)];replay_stop=1'>End replay.</A>"
temp += "<A href='?src=[REF(src)];offset=1'>Change offset</A><br>"
temp += "<A href='?src=[REF(src)];replay_stop=1'>End replay</A>"
SetLightsAndPower()
replay_entry(1)
return
@@ -502,6 +513,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if(replay_mode)
replay_mode = FALSE
loop_mode = FALSE
offset = FALSE
temp = null
QDEL_NULL(replay_holo)
SetLightsAndPower()
@@ -514,16 +526,10 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
record_mode = TRUE
record_start = world.time
record_user = user
disk.record.caller_image = get_record_icon(user)
disk.record.set_caller_image(user)
temp = "Recording...<br>"
temp += "<A href='?src=[REF(src)];record_stop=1'>End recording.</A>"
/obj/machinery/holopad/proc/get_record_icon(mob/living/user)
var/olddir = user.dir
user.setDir(SOUTH)
. = getFlatIcon(user)
user.setDir(olddir)
/obj/machinery/holopad/proc/record_message(mob/living/speaker,message,language)
if(!record_mode)
return
@@ -553,8 +559,10 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/holopad/proc/replay_entry(entry_number)
if(!replay_mode)
return
if (!disk.record.entries.len) // check for zero entries such as photographs and no text recordings
return // and pretty much just display them statically untill manually stopped
if(disk.record.entries.len < entry_number)
if (loop_mode)
if(loop_mode)
entry_number = 1
else
replay_stop()
+1 -1
View File
@@ -37,7 +37,7 @@
/obj/machinery/mecha_part_fabricator/Initialize()
var/datum/component/material_container/materials = AddComponent(/datum/component/material_container,
list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
FALSE, list(/obj/item/stack, /obj/item/stack/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.precise_insertion = TRUE
stored_research = new
return ..()
+5 -2
View File
@@ -28,6 +28,9 @@
else
to_chat(user, ("<span class='warning'>There's not enough cable to finish the task!</span>"))
return FALSE
else if(istype(used_atom, /obj/item/stack/ore/bluespace_crystal))
var/obj/item/stack/ore/bluespace_crystal/BSC = used_atom
BSC.use(1)
else if(istype(used_atom, /obj/item/stack))
var/obj/item/stack/S = used_atom
if(S.get_amount() < 5)
@@ -1320,7 +1323,7 @@
"backkey"=/obj/item/crowbar,
"desc"="The bluespace crystal is installed."),
//12
list("key"=/obj/item/ore/bluespace_crystal,
list("key"=/obj/item/stack/ore/bluespace_crystal,
"backkey"=/obj/item/screwdriver,
"desc"="Super capacitor is secured."),
//13
@@ -1514,7 +1517,7 @@
holder.icon_state = "phazon16"
else
user.visible_message("[user] removes the bluespace crystal from the [holder].", "<span class='notice'>You remove the bluespace crystal from the [holder].</span>")
new /obj/item/ore/bluespace_crystal(get_turf(holder))
new /obj/item/stack/ore/bluespace_crystal(get_turf(holder))
holder.icon_state = "phazon14"
if(11)
if(diff==FORWARD)
+4 -4
View File
@@ -26,7 +26,7 @@
if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in equipment)
var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in cargo
if(ore_box)
for(var/obj/item/ore/ore in range(1, src))
for(var/obj/item/stack/ore/ore in range(1, src))
if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) //we can reach it and it's in front of us? grab it!
ore.forceMove(ore_box)
@@ -128,10 +128,10 @@
if(href_list["drop_from_cargo"])
var/obj/O = locate(href_list["drop_from_cargo"])
if(O && O in src.cargo)
src.occupant_message("<span class='notice'>You unload [O].</span>")
occupant_message("<span class='notice'>You unload [O].</span>")
O.forceMove(drop_location())
src.cargo -= O
src.log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]")
cargo -= O
log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]")
return
+33 -30
View File
@@ -1,30 +1,33 @@
/obj/effect/decal/remains
name = "remains"
gender = PLURAL
icon = 'icons/effects/blood.dmi'
/obj/effect/decal/remains/acid_act()
visible_message("<span class='warning'>[src] dissolve[gender==PLURAL?"":"s"] into a puddle of sizzling goop!</span>")
playsound(src, 'sound/items/welder.ogg', 150, 1)
new /obj/effect/decal/cleanable/greenglow(drop_location())
qdel(src)
/obj/effect/decal/remains/human
desc = "They look like human remains. They have a strange aura about them."
icon_state = "remains"
/obj/effect/decal/remains/xeno
desc = "They look like the remains of something... alien. They have a strange aura about them."
icon_state = "remainsxeno"
/obj/effect/decal/remains/xeno/larva
icon_state = "remainslarva"
/obj/effect/decal/remains/robot
desc = "They look like the remains of something mechanical. They have a strange aura about them."
icon = 'icons/mob/robots.dmi'
icon_state = "remainsrobot"
/obj/effect/decal/cleanable/robot_debris/old
name = "dusty robot debris"
desc = "Looks like nobody has touched this in a while."
/obj/effect/decal/remains
name = "remains"
gender = PLURAL
icon = 'icons/effects/blood.dmi'
/obj/effect/decal/remains/acid_act()
visible_message("<span class='warning'>[src] dissolve[gender==PLURAL?"":"s"] into a puddle of sizzling goop!</span>")
playsound(src, 'sound/items/welder.ogg', 150, 1)
new /obj/effect/decal/cleanable/greenglow(drop_location())
qdel(src)
/obj/effect/decal/remains/human
desc = "They look like human remains. They have a strange aura about them."
icon_state = "remains"
/obj/effect/decal/remains/plasma
icon_state = "remainsplasma"
/obj/effect/decal/remains/xeno
desc = "They look like the remains of something... alien. They have a strange aura about them."
icon_state = "remainsxeno"
/obj/effect/decal/remains/xeno/larva
icon_state = "remainslarva"
/obj/effect/decal/remains/robot
desc = "They look like the remains of something mechanical. They have a strange aura about them."
icon = 'icons/mob/robots.dmi'
icon_state = "remainsrobot"
/obj/effect/decal/cleanable/robot_debris/old
name = "dusty robot debris"
desc = "Looks like nobody has touched this in a while."
@@ -0,0 +1,12 @@
/obj/effect/turf_decal/weather
name = "sandy floor"
icon_state = "sandyfloor"
/obj/effect/turf_decal/weather/snow
name = "snowy floor"
icon_state = "snowyfloor"
/obj/effect/turf_decal/weather/snow/corner
name = "snow corner piece"
icon = 'icons/turf/snow.dmi'
icon_state = "snow_corner"
+1 -1
View File
@@ -147,7 +147,7 @@
var/turf/real_target = get_link_target_turf()
if(!istype(real_target))
return FALSE
if(!ismecha(M) && M.anchored && !allow_anchored)
if(!ismecha(M) && !istype(M, /obj/item/projectile) && M.anchored && !allow_anchored)
return
if(ismegafauna(M))
message_admins("[M] has used a portal at [ADMIN_COORDJMP(src)] made by [usr].")
+6 -6
View File
@@ -126,12 +126,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
if(damtype == "brute")
hitsound = "swing_hit"
if (!embedding)
embedding = getEmbeddingBehavior()
else if (islist(embedding))
embedding = getEmbeddingBehavior(arglist(embedding))
else if (!istype(embedding, /datum/embedding_behavior))
stack_trace("Invalid type [embedding.type] found in .embedding during /obj/item Initialize()")
if (!embedding)
embedding = getEmbeddingBehavior()
else if (islist(embedding))
embedding = getEmbeddingBehavior(arglist(embedding))
else if (!istype(embedding, /datum/embedding_behavior))
stack_trace("Invalid type [embedding.type] found in .embedding during /obj/item Initialize()")
/obj/item/Destroy()
flags_1 &= ~DROPDEL_1 //prevent reqdels
+1
View File
@@ -191,6 +191,7 @@
var/obj/machinery/door/firedoor/FD = D
FD.CalculateAffectingAreas()
to_chat(usr, "<span class='notice'>You rename the '[prevname]' to '[str]'.</span>")
log_game("[key_name(usr)] has renamed [prevname] to [str]")
interact()
return 1
+4
View File
@@ -78,6 +78,10 @@
return
A.emag_act(user)
/obj/item/card/emag/fake/afterattack()
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
return
/obj/item/card/id
name = "identification card"
desc = "A card used to provide ID and determine access across the station."
@@ -58,9 +58,9 @@
name = "Bluespace Launchpad (Machine Board)"
build_path = /obj/machinery/launchpad
req_components = list(
/obj/item/ore/bluespace_crystal = 1,
/obj/item/stack/ore/bluespace_crystal = 1,
/obj/item/stock_parts/manipulator = 1)
def_components = list(/obj/item/ore/bluespace_crystal = /obj/item/ore/bluespace_crystal/artificial)
def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial)
/obj/item/circuitboard/machine/limbgrower
name = "Limb Grower (Machine Board)"
@@ -74,11 +74,11 @@
name = "Quantum Pad (Machine Board)"
build_path = /obj/machinery/quantumpad
req_components = list(
/obj/item/ore/bluespace_crystal = 1,
/obj/item/stack/ore/bluespace_crystal = 1,
/obj/item/stock_parts/capacitor = 1,
/obj/item/stock_parts/manipulator = 1,
/obj/item/stack/cable_coil = 1)
def_components = list(/obj/item/ore/bluespace_crystal = /obj/item/ore/bluespace_crystal/artificial)
def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial)
/obj/item/circuitboard/machine/recharger
name = "Weapon Recharger (Machine Board)"
@@ -175,18 +175,18 @@
name = "Teleporter Hub (Machine Board)"
build_path = /obj/machinery/teleport/hub
req_components = list(
/obj/item/ore/bluespace_crystal = 3,
/obj/item/stack/ore/bluespace_crystal = 3,
/obj/item/stock_parts/matter_bin = 1)
def_components = list(/obj/item/ore/bluespace_crystal = /obj/item/ore/bluespace_crystal/artificial)
def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial)
/obj/item/circuitboard/machine/teleporter_station
name = "Teleporter Station (Machine Board)"
build_path = /obj/machinery/teleport/station
req_components = list(
/obj/item/ore/bluespace_crystal = 2,
/obj/item/stack/ore/bluespace_crystal = 2,
/obj/item/stock_parts/capacitor = 2,
/obj/item/stack/sheet/glass = 1)
def_components = list(/obj/item/ore/bluespace_crystal = /obj/item/ore/bluespace_crystal/artificial)
def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial)
/obj/item/circuitboard/machine/vendor
name = "Booze-O-Mat Vendor (Machine Board)"
@@ -674,7 +674,7 @@
name = "Bluespace Artillery Fusor (Machine Board)"
build_path = /obj/machinery/bsa/middle
req_components = list(
/obj/item/ore/bluespace_crystal = 20,
/obj/item/stack/ore/bluespace_crystal = 20,
/obj/item/stack/cable_coil = 2)
/obj/item/circuitboard/machine/bsa/front
@@ -119,6 +119,7 @@
loop.start()
/obj/item/device/geiger_counter/rad_act(amount)
. = ..()
if(amount <= RAD_BACKGROUND_RADIATION || !scanning)
return
current_tick_amount += amount
@@ -200,6 +201,20 @@
to_chat(user, "<span class='warning'>You override [src]'s radiation storing protocols. It will now generate small doses of radiation, and stored rads are now projected into creatures you scan.</span>")
obj_flags |= EMAGGED
/obj/item/device/geiger_counter/cyborg
var/datum/component/mobhook
/obj/item/device/geiger_counter/cyborg/equipped(mob/user)
. = ..()
if (mobhook && mobhook.parent != user)
QDEL_NULL(mobhook)
if (!mobhook)
mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_ATOM_RAD_ACT), CALLBACK(src, /atom.proc/rad_act))
/obj/item/device/geiger_counter/cyborg/dropped()
. = ..()
QDEL_NULL(mobhook)
#undef RAD_LEVEL_NORMAL
#undef RAD_LEVEL_MODERATE
#undef RAD_LEVEL_HIGH
+7 -37
View File
@@ -40,10 +40,11 @@
var/cuffsound = 'sound/weapons/handcuffs.ogg'
var/trashtype = null //for disposable cuffs
/obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/living/carbon/human/user)
/obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/living/user)
if(!istype(C))
return
if(user.has_trait(TRAIT_CLUMSY) && prob(50))
if(iscarbon(user) && (user.has_trait(TRAIT_CLUMSY) && prob(50)))
to_chat(user, "<span class='warning'>Uh... how do those things work?!</span>")
apply_cuffs(user,user)
return
@@ -61,7 +62,10 @@
playsound(loc, cuffsound, 30, 1, -2)
if(do_mob(user, C, 30) && (C.get_num_arms() >= 2 || C.get_arm_ignore()))
apply_cuffs(C,user)
if(iscyborg(user))
apply_cuffs(C, user, TRUE)
else
apply_cuffs(C, user)
to_chat(user, "<span class='notice'>You handcuff [C].</span>")
SSblackbox.record_feedback("tally", "handcuffs", 1, type)
@@ -113,7 +117,6 @@
materials = list(MAT_METAL=150, MAT_GLASS=75)
breakouttime = 300 //Deciseconds = 30s
cuffsound = 'sound/weapons/cablecuff.ogg'
var/datum/robot_energy_storage/wirestorage = null
/obj/item/restraints/handcuffs/cable/Initialize(mapload, param_color)
. = ..()
@@ -128,23 +131,6 @@
color = null
add_atom_colour(item_color, FIXED_COLOUR_PRIORITY)
/obj/item/restraints/handcuffs/cable/attack(mob/living/carbon/C, mob/living/carbon/human/user)
if(!istype(C))
return
if(wirestorage && wirestorage.energy < 15)
to_chat(user, "<span class='warning'>You need at least 15 wire to restrain [C]!</span>")
return
return ..()
/obj/item/restraints/handcuffs/cable/apply_cuffs(mob/living/carbon/target, mob/user, var/dispense = 0)
if(wirestorage)
if(!wirestorage.use_charge(15))
to_chat(user, "<span class='warning'>You need at least 15 wire to restrain [target]!</span>")
return
return ..(target, user, 1)
return ..()
/obj/item/restraints/handcuffs/cable/red
item_color = "red"
color = "#ff0000"
@@ -215,21 +201,6 @@
else
return ..()
/obj/item/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user)
if(iscyborg(user))
if(!C.handcuffed)
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
C.visible_message("<span class='danger'>[user] is trying to put zipties on [C]!</span>", \
"<span class='userdanger'>[user] is trying to put zipties on [C]!</span>")
if(do_mob(user, C, 30))
if(!C.handcuffed)
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
C.update_handcuffed()
to_chat(user, "<span class='notice'>You handcuff [C].</span>")
add_logs(user, C, "handcuffed")
else
to_chat(user, "<span class='warning'>You fail to handcuff [C]!</span>")
/obj/item/restraints/handcuffs/cable/zipties
name = "zipties"
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
@@ -249,7 +220,6 @@
/obj/item/restraints/handcuffs/cable/zipties/used/attack()
return
//Legcuffs
/obj/item/restraints/legcuffs
+13 -13
View File
@@ -1,5 +1,5 @@
//Bluespace crystals, used in telescience and when crushed it will blink you to a random turf.
/obj/item/ore/bluespace_crystal
/obj/item/stack/ore/bluespace_crystal
name = "bluespace crystal"
desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate."
icon = 'icons/obj/telescience.dmi'
@@ -11,38 +11,38 @@
refined_type = /obj/item/stack/sheet/bluespace_crystal
grind_results = list("bluespace" = 20)
/obj/item/ore/bluespace_crystal/refined
/obj/item/stack/ore/bluespace_crystal/refined
name = "refined bluespace crystal"
points = 0
refined_type = null
/obj/item/ore/bluespace_crystal/New()
..()
/obj/item/stack/ore/bluespace_crystal/Initialize()
. = ..()
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
/obj/item/ore/bluespace_crystal/attack_self(mob/user)
/obj/item/stack/ore/bluespace_crystal/attack_self(mob/user)
user.visible_message("<span class='warning'>[user] crushes [src]!</span>", "<span class='danger'>You crush [src]!</span>")
new /obj/effect/particle_effect/sparks(loc)
playsound(src.loc, "sparks", 50, 1)
playsound(loc, "sparks", 50, 1)
blink_mob(user)
qdel(src)
use(1)
/obj/item/ore/bluespace_crystal/proc/blink_mob(mob/living/L)
/obj/item/stack/ore/bluespace_crystal/proc/blink_mob(mob/living/L)
do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg')
/obj/item/ore/bluespace_crystal/throw_impact(atom/hit_atom)
/obj/item/stack/ore/bluespace_crystal/throw_impact(atom/hit_atom)
if(!..()) // not caught in mid-air
visible_message("<span class='notice'>[src] fizzles and disappears upon impact!</span>")
var/turf/T = get_turf(hit_atom)
new /obj/effect/particle_effect/sparks(T)
playsound(src.loc, "sparks", 50, 1)
playsound(loc, "sparks", 50, 1)
if(isliving(hit_atom))
blink_mob(hit_atom)
qdel(src)
use(1)
//Artifical bluespace crystal, doesn't give you much research.
/obj/item/ore/bluespace_crystal/artificial
/obj/item/stack/ore/bluespace_crystal/artificial
name = "artificial bluespace crystal"
desc = "An artificially made bluespace crystal, it looks delicate."
materials = list(MAT_BLUESPACE=MINERAL_MATERIAL_AMOUNT / 2)
@@ -61,7 +61,7 @@
attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed")
novariants = TRUE
grind_results = list("bluespace" = 20)
var/crystal_type = /obj/item/ore/bluespace_crystal/refined
var/crystal_type = /obj/item/stack/ore/bluespace_crystal/refined
/obj/item/stack/sheet/bluespace_crystal/attack_self(mob/user)// to prevent the construction menu from ever happening
to_chat(user, "<span class='warning'>You cannot crush the polycrystal in-hand, try breaking one off.</span>")
@@ -36,7 +36,7 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \
new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("aesthetic volcanic floor tile", /obj/item/stack/tile/basalt, 2, 2, 4, 20), \
new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Breakdown into sand", /obj/item/ore/glass, 1, one_per_turf = 0, on_floor = 1) \
new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = 0, on_floor = 1) \
))
/obj/item/stack/sheet/mineral/sandstone
@@ -84,12 +84,13 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
w_class = WEIGHT_CLASS_TINY
/obj/item/emptysandbag/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/ore/glass))
if(istype(W, /obj/item/stack/ore/glass))
var/obj/item/stack/ore/glass/G = W
to_chat(user, "<span class='notice'>You fill the sandbag.</span>")
var/obj/item/stack/sheet/mineral/sandbags/I = new /obj/item/stack/sheet/mineral/sandbags
qdel(src)
user.put_in_hands(I)
qdel(W)
G.use(1)
else
return ..()
+50 -5
View File
@@ -85,11 +85,56 @@
icon_state = "satchel"
slot_flags = SLOT_BELT | SLOT_POCKET
w_class = WEIGHT_CLASS_NORMAL
storage_slots = 50
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class
max_w_class = WEIGHT_CLASS_NORMAL
can_hold = list(/obj/item/ore)
storage_slots = 8
max_combined_w_class = 16 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class
max_w_class = WEIGHT_CLASS_HUGE
can_hold = list(/obj/item/stack/ore)
var/spam_protection = FALSE //If this is TRUE, the holder won't receive any messages when they fail to pick up ore through crossing it
var/datum/component/mobhook
/obj/item/storage/bag/ore/equipped(mob/user)
. = ..()
if (mobhook && mobhook.parent != user)
QDEL_NULL(mobhook)
if (!mobhook)
mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/Pickup_ores, user))
/obj/item/storage/bag/ore/dropped()
. = ..()
if (mobhook)
QDEL_NULL(mobhook)
/obj/item/storage/bag/ore/proc/Pickup_ores(mob/living/user)
var/show_message = FALSE
var/obj/structure/ore_box/box
var/turf/tile = user.loc
if (!isturf(tile))
return
if (istype(user.pulling, /obj/structure/ore_box))
box = user.pulling
for(var/A in tile)
if (!is_type_in_typecache(A, can_hold))
continue
if (box)
user.transferItemToLoc(A, box)
show_message = TRUE
else if(can_be_inserted(A, TRUE, user))
handle_item_insertion(A, TRUE, user)
show_message = TRUE
else
if(!spam_protection)
to_chat(user, "<span class='warning'>Your [name] is full and can't hold any more!</span>")
spam_protection = TRUE
continue
if(show_message)
playsound(user, "rustle", 50, TRUE)
if (box)
user.visible_message("<span class='notice'>[user] offloads the ores beneath them into [box].</span>", \
"<span class='notice'>You offload the ores beneath you into your [box].</span>")
else
user.visible_message("<span class='notice'>[user] scoops up the ores beneath them.</span>", \
"<span class='notice'>You scoop up the ores beneath you with your [name].</span>")
spam_protection = FALSE
/obj/item/storage/bag/ore/cyborg
name = "cyborg mining satchel"
@@ -228,7 +273,7 @@
var/col_count = min(7,storage_slots) -1
if (adjusted_contents > 7)
row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width.
src.standard_orient_objs(row_num, col_count, numbered_contents)
standard_orient_objs(row_num, col_count, numbered_contents)
return
+3 -1
View File
@@ -4,6 +4,8 @@
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "utilitybelt"
item_state = "utility"
lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi'
slot_flags = SLOT_BELT
attack_verb = list("whipped", "lashed", "disciplined")
max_integrity = 300
@@ -230,7 +232,7 @@
/obj/item/device/t_scanner/adv_mining_scanner,
/obj/item/reagent_containers/pill,
/obj/item/storage/pill_bottle,
/obj/item/ore,
/obj/item/stack/ore,
/obj/item/reagent_containers/food/drinks,
/obj/item/organ/regenerative_core,
/obj/item/device/wormhole_jaunter,
+3 -2
View File
@@ -26,12 +26,13 @@
do_teleport(M, get_turf(M), 15)
/obj/item/melee/baton/cattleprod/attackby(obj/item/I, mob/user, params)//handles sticking a crystal onto a stunprod to make a teleprod
if(istype(I, /obj/item/ore/bluespace_crystal))
if(istype(I, /obj/item/stack/ore/bluespace_crystal))
if(!cell)
var/obj/item/stack/ore/bluespace_crystal/BSC = I
var/obj/item/melee/baton/cattleprod/teleprod/S = new /obj/item/melee/baton/cattleprod/teleprod
remove_item_from_storage(user)
qdel(src)
qdel(I)
BSC.use(1)
user.put_in_hands(S)
to_chat(user, "<span class='notice'>You place the bluespace crystal firmly into the igniter.</span>")
else
+17
View File
@@ -21,6 +21,7 @@
* Kitty toys!
* Snowballs
* Clockwork Watches
* Toy Daggers
*/
@@ -1075,6 +1076,22 @@
..()
to_chat(user, "<span class='info'>Station Time: [worldtime2text()]")
/*
* Toy Dagger
*/
/obj/item/toy/toy_dagger
name = "toy dagger"
desc = "A cheap plastic replica of a dagger. Produced by THE ARM Toys, Inc."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
item_state = "cultdagger"
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
inhand_x_dimension = 32
inhand_y_dimension = 32
w_class = WEIGHT_CLASS_SMALL
/*
* Xenomorph action figure
*/
+1 -1
View File
@@ -80,5 +80,5 @@
/obj/item/trash/coal/burn()
visible_message("[src] fuses into a diamond! Someone wasn't so naughty after all...")
new /obj/item/ore/diamond(loc)
new /obj/item/stack/ore/diamond(loc)
qdel(src)
@@ -365,6 +365,7 @@
buildstacktype = /obj/item/stack/tile/brass
buildstackamount = 1
item_chair = null
var/turns = 0
/obj/structure/chair/brass/Destroy()
STOP_PROCESSING(SSfastprocess, src)
@@ -373,11 +374,15 @@
/obj/structure/chair/brass/process()
setDir(turn(dir,-90))
playsound(src, 'sound/effects/servostep.ogg', 50, FALSE)
turns++
if(turns >= 8)
STOP_PROCESSING(SSfastprocess, src)
/obj/structure/chair/brass/ratvar_act()
return
/obj/structure/chair/brass/AltClick(mob/living/user)
turns = 0
if(!user.canUseTopic(src, be_close = TRUE))
return
if(!isprocessing)
@@ -17,6 +17,8 @@
/obj/structure/closet/crate/New()
..()
if(icon_state == "[initial(icon_state)]open")
opened = TRUE
update_icon()
/obj/structure/closet/crate/CanPass(atom/movable/mover, turf/target)
@@ -87,8 +89,8 @@
/obj/structure/closet/crate/freezer/blood/PopulateContents()
. = ..()
new /obj/item/reagent_containers/blood/empty(src)
new /obj/item/reagent_containers/blood/empty(src)
new /obj/item/reagent_containers/blood(src)
new /obj/item/reagent_containers/blood(src)
new /obj/item/reagent_containers/blood/AMinus(src)
new /obj/item/reagent_containers/blood/BMinus(src)
new /obj/item/reagent_containers/blood/BPlus(src)
+161
View File
@@ -0,0 +1,161 @@
//Chain link fences
//Sprites ported from /VG/
#define CUT_TIME 100
#define CLIMB_TIME 150
#define NO_HOLE 0 //section is intact
#define MEDIUM_HOLE 1 //medium hole in the section - can climb through
#define LARGE_HOLE 2 //large hole in the section - can walk through
#define MAX_HOLE_SIZE LARGE_HOLE
/obj/structure/fence
name = "fence"
desc = "A chain link fence. Not as effective as a wall, but generally it keeps people out."
density = TRUE
anchored = TRUE
icon = 'icons/obj/fence.dmi'
icon_state = "straight"
var/cuttable = TRUE
var/hole_size= NO_HOLE
var/invulnerable = FALSE
/obj/structure/fence/Initialize()
. = ..()
update_cut_status()
/obj/structure/fence/examine(mob/user)
.=..()
switch(hole_size)
if(MEDIUM_HOLE)
user.show_message("There is a large hole in \the [src].")
if(LARGE_HOLE)
user.show_message("\The [src] has been completely cut through.")
/obj/structure/fence/end
icon_state = "end"
cuttable = FALSE
/obj/structure/fence/corner
icon_state = "corner"
cuttable = FALSE
/obj/structure/fence/post
icon_state = "post"
cuttable = FALSE
/obj/structure/fence/cut/medium
icon_state = "straight_cut2"
hole_size = MEDIUM_HOLE
/obj/structure/fence/cut/large
icon_state = "straight_cut3"
hole_size = LARGE_HOLE
/obj/structure/fence/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/wirecutters))
if(!cuttable)
to_chat(user, "<span class='notice'>This section of the fence can't be cut.</span>")
return
if(invulnerable)
to_chat(user, "<span class='notice'>This fence is too strong to cut through.</span>")
return
var/current_stage = hole_size
if(current_stage >= MAX_HOLE_SIZE)
to_chat(user, "<span class='notice'>This fence has too much cut out of it already.</span>")
return
user.visible_message("<span class='danger'>\The [user] starts cutting through \the [src] with \the [W].</span>",\
"<span class='danger'>You start cutting through \the [src] with \the [W].</span>")
if(do_after(user, CUT_TIME*W.toolspeed, target = src))
if(current_stage == hole_size)
switch(++hole_size)
if(MEDIUM_HOLE)
visible_message("<span class='notice'>\The [user] cuts into \the [src] some more.</span>")
to_chat(user, "<span class='info'>You could probably fit yourself through that hole now. Although climbing through would be much faster if you made it even bigger.</span>")
climbable = TRUE
if(LARGE_HOLE)
visible_message("<span class='notice'>\The [user] completely cuts through \the [src].</span>")
to_chat(user, "<span class='info'>The hole in \the [src] is now big enough to walk through.</span>")
climbable = FALSE
update_cut_status()
return TRUE
/obj/structure/fence/proc/update_cut_status()
if(!cuttable)
return
density = TRUE
switch(hole_size)
if(NO_HOLE)
icon_state = initial(icon_state)
if(MEDIUM_HOLE)
icon_state = "straight_cut2"
if(LARGE_HOLE)
icon_state = "straight_cut3"
density = FALSE
//FENCE DOORS
/obj/structure/fence/door
name = "fence door"
desc = "Not very useful without a real lock."
icon_state = "door_closed"
cuttable = FALSE
var/open = FALSE
/obj/structure/fence/door/Initialize()
. = ..()
update_door_status()
/obj/structure/fence/door/opened
icon_state = "door_opened"
open = TRUE
density = TRUE
/obj/structure/fence/door/attack_hand(mob/user)
if(can_open(user))
toggle(user)
return TRUE
/obj/structure/fence/door/proc/toggle(mob/user)
switch(open)
if(FALSE)
visible_message("<span class='notice'>\The [user] opens \the [src].</span>")
open = TRUE
if(TRUE)
visible_message("<span class='notice'>\The [user] closes \the [src].</span>")
open = FALSE
update_door_status()
playsound(src, 'sound/machines/click.ogg', 100, 1)
/obj/structure/fence/door/proc/update_door_status()
switch(open)
if(FALSE)
density = TRUE
icon_state = "door_closed"
if(TRUE)
density = FALSE
icon_state = "door_opened"
/obj/structure/fence/door/proc/can_open(mob/user)
return TRUE
#undef CUT_TIME
#undef CLIMB_TIME
#undef NO_HOLE
#undef SMALL_HOLE
#undef MEDIUM_HOLE
#undef LARGE_HOLE
#undef MAX_HOLE_SIZE
+6
View File
@@ -161,3 +161,9 @@
name = "shrine"
desc = "A shrine dedicated to a deity."
icon_state = "shrine"
/obj/structure/fluff/fokoff_sign
name = "crude sign"
desc = "A crudely-made sign with the words 'fok of' written in some sort of red paint."
icon = 'icons/obj/fluff.dmi'
icon_state = "fokof"
+1 -1
View File
@@ -89,7 +89,7 @@
name = "magic mirror"
desc = "Turn and face the strange... face."
icon_state = "magic_mirror"
var/list/races_blacklist = list("skeleton", "agent", "angel", "military_synth", "memezombies", "clockwork golem servant")
var/list/races_blacklist = list("skeleton", "agent", "angel", "military_synth", "memezombies", "clockwork golem servant", "android", "synth")
var/list/choosable_races = list()
/obj/structure/mirror/magic/New()
+2
View File
@@ -352,7 +352,9 @@
/turf/open/rad_act(pulse_strength)
. = ..()
if (air.gases[/datum/gas/carbon_dioxide] && air.gases[/datum/gas/oxygen])
pulse_strength = min(pulse_strength,air.gases[/datum/gas/carbon_dioxide][MOLES]*1000,air.gases[/datum/gas/oxygen][MOLES]*2000) //Ensures matter is conserved properly
air.gases[/datum/gas/carbon_dioxide][MOLES]=max(air.gases[/datum/gas/carbon_dioxide][MOLES]-(pulse_strength/1000),0)
air.gases[/datum/gas/oxygen][MOLES]=max(air.gases[/datum/gas/oxygen][MOLES]-(pulse_strength/2000),0)
air.assert_gas(/datum/gas/pluoxium)
@@ -72,7 +72,7 @@
floor_tile = /obj/item/stack/tile/grass
broken_states = list("sand")
flags_1 = NONE
var/ore_type = /obj/item/ore/glass
var/ore_type = /obj/item/stack/ore/glass
var/turfverb = "uproot"
/turf/open/floor/grass/Initialize()
@@ -81,9 +81,8 @@
/turf/open/floor/grass/attackby(obj/item/C, mob/user, params)
if(istype(C, /obj/item/shovel) && params)
new ore_type(src)
new ore_type(src) //Make some sand if you shovel grass
user.visible_message("[user] digs up [src].", "<span class='notice'>You [src.turfverb] [src].</span>")
new ore_type(src, 2)
user.visible_message("[user] digs up [src].", "<span class='notice'>You [turfverb] [src].</span>")
playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1)
make_plating()
if(..())
@@ -109,7 +108,7 @@
name = "volcanic floor"
icon = 'icons/turf/floors.dmi'
icon_state = "basalt"
ore_type = /obj/item/ore/glass/basalt
ore_type = /obj/item/stack/ore/glass/basalt
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
slowdown = 0
@@ -126,7 +125,7 @@
icon = 'icons/turf/floors.dmi'
icon_state = "basalt"
floor_tile = /obj/item/stack/tile/basalt
ore_type = /obj/item/ore/glass/basalt
ore_type = /obj/item/stack/ore/glass/basalt
turfverb = "dig up"
slowdown = 0
@@ -183,11 +182,11 @@
A.narsie_act()
/turf/open/floor/carpet/break_tile()
broken = 1
broken = TRUE
update_icon()
/turf/open/floor/carpet/burn_tile()
burnt = 1
burnt = TRUE
update_icon()
/turf/open/floor/carpet/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
@@ -13,7 +13,7 @@
var/environment_type = "asteroid"
var/turf_type = /turf/open/floor/plating/asteroid //Because caves do whacky shit to revert to normal
var/floor_variance = 20 //probability floor has a different icon state
archdrops = list(/obj/item/ore/glass = 5)
archdrops = list(/obj/item/stack/ore/glass = 5)
attachment_holes = FALSE
/turf/open/floor/plating/asteroid/Initialize()
@@ -41,7 +41,7 @@
if(istype(W, /obj/item/storage/bag/ore))
var/obj/item/storage/bag/ore/S = W
if(S.collection_mode == 1)
for(var/obj/item/ore/O in src.contents)
for(var/obj/item/stack/ore/O in contents)
O.attackby(W,user)
return
@@ -77,7 +77,7 @@
icon_state = "basalt"
icon_plating = "basalt"
environment_type = "basalt"
archdrops = list(/obj/item/ore/glass/basalt = 5)
archdrops = list(/obj/item/stack/ore/glass/basalt = 5)
floor_variance = 15
/turf/open/floor/plating/asteroid/basalt/lava //lava underneath
@@ -213,7 +213,7 @@
C.produce_tunnel_from_data(rand(10, 15), dir)
else
SpawnFloor(tunnel)
else //if(!istype(tunnel, src.parent)) // We hit space/normal/wall, stop our tunnel.
else //if(!istype(tunnel, parent)) // We hit space/normal/wall, stop our tunnel.
break
// Chance to change our direction left or right.
@@ -284,17 +284,42 @@
baseturfs = /turf/open/floor/plating/asteroid/snow
icon_state = "snow"
icon_plating = "snow"
initial_gas_mix = "TEMP=180"
initial_gas_mix = "o2=22;n2=82;TEMP=180"
slowdown = 2
environment_type = "snow"
flags_1 = NONE
planetary_atmos = TRUE
archdrops = list(/obj/item/stack/sheet/mineral/snow = 5)
burnt_states = list("snow_dug")
/turf/open/floor/plating/asteroid/snow/burn_tile()
if(!burnt)
visible_message("<span class='danger'>[src] melts away!.</span>")
slowdown = 0
burnt = TRUE
icon_state = "snow_dug"
return TRUE
return FALSE
/turf/open/floor/plating/asteroid/snow/ice
name = "icey snow"
desc = "Looks colder."
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"
floor_variance = 0
icon_state = "snow-ice"
icon_plating = "snow-ice"
environment_type = "snow_cavern"
/turf/open/floor/plating/asteroid/snow/ice/burn_tile()
return FALSE
/turf/open/floor/plating/asteroid/snow/airless
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/plating/asteroid/snow/temperatre
initial_gas_mix = "TEMP=255.37"
initial_gas_mix = "o2=22;n2=82;TEMP=255.37"
/turf/open/floor/plating/asteroid/snow/atmosphere
initial_gas_mix = "o2=22;n2=82;TEMP=180"
planetary_atmos = FALSE
@@ -122,18 +122,31 @@
/turf/open/floor/plating/ironsand/burn_tile()
return
/turf/open/floor/plating/ice
name = "ice sheet"
desc = "A sheet of solid ice. Looks slippery."
icon = 'icons/turf/snow.dmi'
icon_state = "ice"
icon = 'icons/turf/floors/ice_turf.dmi'
icon_state = "unsmooth"
initial_gas_mix = "o2=22;n2=82;TEMP=180"
temperature = 180
planetary_atmos = TRUE
baseturfs = /turf/open/floor/plating/ice
slowdown = 1
wet = TURF_WET_PERMAFROST
attachment_holes = FALSE
/turf/open/floor/plating/ice/HandleWet()
if(wet == TURF_WET_ICE)
return
..()
MakeSlippery(TURF_WET_ICE) //rewet after ..() clears out lube/ice etc.
/turf/open/floor/plating/ice/smooth
icon_state = "smooth"
smooth = SMOOTH_MORE | SMOOTH_BORDER
canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice)
/turf/open/floor/plating/ice/colder
/turf/open/floor/plating/ice/colder
temperature = 140
@@ -149,11 +162,23 @@
/turf/open/floor/plating/snowed
name = "snowed-over plating"
desc = "A section of plating covered in a light layer of snow."
desc = "A section of heated plating, helps keep the snow from stacking up too high."
icon = 'icons/turf/snow.dmi'
icon_state = "snowplating"
initial_gas_mix = "o2=22;n2=82;TEMP=180"
temperature = 180
attachment_holes = FALSE
planetary_atmos = TRUE
/turf/open/floor/plating/snowed/cavern
initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"
/turf/open/floor/plating/snowed/smoothed
smooth = SMOOTH_MORE | SMOOTH_BORDER
canSmoothWith = list(/turf/open/floor/plating/snowed/smoothed, /turf/open/floor/plating/snowed)
planetary_atmos = TRUE
icon = 'icons/turf/floors/snow_turf.dmi'
icon_state = "smooth"
/turf/open/floor/plating/snowed/colder
temperature = 140
+68 -19
View File
@@ -71,11 +71,9 @@
return attack_hand(user)
/turf/closed/mineral/proc/gets_drilled()
if (mineralType && (src.mineralAmt > 0) && (src.mineralAmt < 11))
var/i
for(i in 1 to mineralAmt)
new mineralType(src)
SSblackbox.record_feedback("tally", "ore_mined", 1, mineralType)
if (mineralType && (mineralAmt > 0))
new mineralType(src, mineralAmt)
SSblackbox.record_feedback("tally", "ore_mined", mineralAmt, mineralType)
for(var/obj/effect/temp_visual/mining_overlay/M in src)
qdel(M)
var/flags = NONE
@@ -108,7 +106,7 @@
else if(iscyborg(AM))
var/mob/living/silicon/robot/R = AM
if(istype(R.module_active, /obj/item/pickaxe))
src.attackby(R.module_active,R)
attackby(R.module_active,R)
return
else
return
@@ -121,12 +119,12 @@
switch(severity)
if(3)
if (prob(75))
src.gets_drilled(null, 1)
gets_drilled(null, 1)
if(2)
if (prob(90))
src.gets_drilled(null, 1)
gets_drilled(null, 1)
if(1)
src.gets_drilled(null, 1)
gets_drilled(null, 1)
return
/turf/closed/mineral/Spread(turf/T)
@@ -225,7 +223,7 @@
/turf/closed/mineral/iron
mineralType = /obj/item/ore/iron
mineralType = /obj/item/stack/ore/iron
spreadChance = 20
spread = 1
scan_state = "rock_Iron"
@@ -237,9 +235,18 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
/turf/closed/mineral/iron/ice
environment_type = "snow_cavern"
icon_state = "icerock_iron"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = "o2=22;n2=82;TEMP=180"
defer_change = TRUE
/turf/closed/mineral/uranium
mineralType = /obj/item/ore/uranium
mineralType = /obj/item/stack/ore/uranium
spreadChance = 5
spread = 1
scan_state = "rock_Uranium"
@@ -253,7 +260,7 @@
/turf/closed/mineral/diamond
mineralType = /obj/item/ore/diamond
mineralType = /obj/item/stack/ore/diamond
spreadChance = 0
spread = 1
scan_state = "rock_Diamond"
@@ -265,9 +272,18 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
/turf/closed/mineral/diamond/ice
environment_type = "snow_cavern"
icon_state = "icerock_diamond"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = "o2=22;n2=82;TEMP=180"
defer_change = TRUE
/turf/closed/mineral/gold
mineralType = /obj/item/ore/gold
mineralType = /obj/item/stack/ore/gold
spreadChance = 5
spread = 1
scan_state = "rock_Gold"
@@ -281,7 +297,7 @@
/turf/closed/mineral/silver
mineralType = /obj/item/ore/silver
mineralType = /obj/item/stack/ore/silver
spreadChance = 5
spread = 1
scan_state = "rock_Silver"
@@ -295,7 +311,7 @@
/turf/closed/mineral/titanium
mineralType = /obj/item/ore/titanium
mineralType = /obj/item/stack/ore/titanium
spreadChance = 5
spread = 1
scan_state = "rock_Titanium"
@@ -309,7 +325,7 @@
/turf/closed/mineral/plasma
mineralType = /obj/item/ore/plasma
mineralType = /obj/item/stack/ore/plasma
spreadChance = 8
spread = 1
scan_state = "rock_Plasma"
@@ -321,9 +337,19 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = 1
/turf/closed/mineral/plasma/ice
environment_type = "snow_cavern"
icon_state = "icerock_plasma"
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
turf_type = /turf/open/floor/plating/asteroid/snow/ice
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
initial_gas_mix = "o2=22;n2=82;TEMP=180"
defer_change = TRUE
/turf/closed/mineral/bananium
mineralType = /obj/item/ore/bananium
mineralType = /obj/item/stack/ore/bananium
mineralAmt = 3
spreadChance = 0
spread = 0
@@ -331,7 +357,7 @@
/turf/closed/mineral/bscrystal
mineralType = /obj/item/ore/bluespace_crystal
mineralType = /obj/item/stack/ore/bluespace_crystal
mineralAmt = 1
spreadChance = 0
spread = 0
@@ -370,6 +396,29 @@
turf_type = /turf/open/floor/plating/ashplanet/rocky
defer_change = 1
/turf/closed/mineral/snowmountain
name = "snowy mountainside"
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/mountain_wall.dmi'
icon_state = "mountainrock"
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/closed)
baseturfs = /turf/open/floor/plating/asteroid/snow
initial_gas_mix = "o2=22;n2=82;TEMP=180"
environment_type = "snow"
turf_type = /turf/open/floor/plating/asteroid/snow
defer_change = TRUE
/turf/closed/mineral/snowmountain/cavern
name = "ice cavern rock"
icon = 'icons/turf/mining.dmi'
smooth_icon = 'icons/turf/walls/icerock_wall.dmi'
icon_state = "icerock"
smooth = SMOOTH_MORE|SMOOTH_BORDER
canSmoothWith = list (/turf/closed)
baseturfs = /turf/open/floor/plating/asteroid/snow/ice
environment_type = "snow_cavern"
turf_type = /turf/open/floor/plating/asteroid/snow/ice
//GIBTONITE
@@ -441,7 +490,7 @@
stage = GIBTONITE_STABLE
if(det_time < 0)
det_time = 0
visible_message("<span class='notice'>The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!</span>")
visible_message("<span class='notice'>The chain reaction was stopped! The gibtonite had [det_time] reactions left till the explosion!</span>")
/turf/closed/mineral/gibtonite/gets_drilled(mob/user, triggered_by_explosion = 0)
if(stage == GIBTONITE_UNSTRUCK && mineralAmt >= 1) //Gibtonite deposit is activated
+18 -3
View File
@@ -8,11 +8,18 @@ GLOBAL_PROTECT(admin_ranks)
var/list/subs
/datum/admin_rank/New(init_name, init_rights, list/init_adds, list/init_subs)
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
if (name == "NoRank") //only del if this is a true creation (and not just a New() proc call), other wise trialmins/coders could abuse this to deadmin other admins
QDEL_IN(src, 0)
CRASH("Admin proc call creation of admin datum")
return
name = init_name
switch(name)
if("Removed",null,"")
spawn(0)
qdel(src)
QDEL_IN(src, 0)
throw EXCEPTION("invalid admin-rank name")
return
if(init_rights)
@@ -24,6 +31,14 @@ GLOBAL_PROTECT(admin_ranks)
adds = init_adds
subs = init_subs
/datum/admin_rank/Destroy()
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return QDEL_HINT_LETMELIVE
. = ..()
/datum/admin_rank/vv_edit_var(var_name, var_value)
return FALSE
@@ -78,7 +93,7 @@ GLOBAL_PROTECT(admin_ranks)
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin_private("[key_name(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return
var/flag = admin_keyword_to_flag(word, previous_rights)
if(flag)
+4 -1
View File
@@ -40,7 +40,10 @@
// Jim (Status) FLW PM TP
/datum/antagonist/proc/antag_listing_entry()
var/list/parts = list()
parts += antag_listing_name()
if(show_name_in_check_antagonists)
parts += "[antag_listing_name()]([name])"
else
parts += antag_listing_name()
parts += antag_listing_status()
parts += antag_listing_commands()
return "<tr><td>[parts.Join("</td><td>")]</td></tr>"
+33 -3
View File
@@ -27,6 +27,14 @@ GLOBAL_PROTECT(href_token)
var/deadmined
/datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE)
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
if (!target) //only del if this is a true creation (and not just a New() proc call), other wise trialmins/coders could abuse this to deadmin other admins
QDEL_IN(src, 0)
CRASH("Admin proc call creation of admin datum")
return
if(!ckey)
QDEL_IN(src, 0)
throw EXCEPTION("Admin datum created without a ckey")
@@ -48,8 +56,20 @@ GLOBAL_PROTECT(href_token)
else
deactivate()
/datum/admins/Destroy()
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return QDEL_HINT_LETMELIVE
. = ..()
/datum/admins/proc/activate()
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return
GLOB.deadmins -= target
GLOB.admin_datums[target] = src
deadmined = FALSE
@@ -58,6 +78,11 @@ GLOBAL_PROTECT(href_token)
/datum/admins/proc/deactivate()
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return
GLOB.deadmins[target] = src
GLOB.admin_datums -= target
deadmined = TRUE
@@ -70,14 +95,14 @@ GLOBAL_PROTECT(href_token)
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin_private("[key_name(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return
if(istype(C))
if(C.ckey != target)
var/msg = " has attempted to associate with [target]'s admin datum"
message_admins("[key_name_admin(C)][msg]")
log_admin_private("[key_name(C)][msg]")
log_admin("[key_name(C)][msg]")
return
if (deadmined)
activate()
@@ -88,6 +113,11 @@ GLOBAL_PROTECT(href_token)
GLOB.admins |= C
/datum/admins/proc/disassociate()
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
log_admin("[key_name(usr)][msg]")
return
if(owner)
GLOB.admins -= owner
owner.remove_admin_verbs()
@@ -173,4 +203,4 @@ you will have to do something like if(client.rights & R_ADMIN) yourself.
return "admin_token=[RawHrefToken(forceGlobal)]"
/proc/HrefTokenFormField(forceGlobal = FALSE)
return "<input type='hidden' name='admin_token' value='[RawHrefToken(forceGlobal)]'>"
return "<input type='hidden' name='admin_token' value='[RawHrefToken(forceGlobal)]'>"
+72 -147
View File
@@ -271,77 +271,7 @@
// DEATH SQUADS
/datum/admins/proc/makeDeathsquad()
var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.")
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null)
var/squadSpawned = 0
if(candidates.len >= 2) //Minimum 2 to be considered a squad
//Pick the lucky players
var/numagents = min(5,candidates.len) //How many commandos to spawn
var/list/spawnpoints = GLOB.emergencyresponseteamspawn
while(numagents && candidates.len)
if (numagents > spawnpoints.len)
numagents--
continue // This guy's unlucky, not enough spawn points, we skip him.
var/spawnloc = spawnpoints[numagents]
var/mob/dead/observer/chosen_candidate = pick(candidates)
candidates -= chosen_candidate
if(!chosen_candidate.key)
continue
//Spawn and equip the commando
var/mob/living/carbon/human/Commando = new(spawnloc)
chosen_candidate.client.prefs.copy_to(Commando)
if(numagents == 1) //If Squad Leader
Commando.real_name = "Officer [pick(GLOB.commando_names)]"
Commando.equipOutfit(/datum/outfit/death_commando/officer)
else
Commando.real_name = "Trooper [pick(GLOB.commando_names)]"
Commando.equipOutfit(/datum/outfit/death_commando)
Commando.dna.update_dna_identity()
Commando.key = chosen_candidate.key
Commando.mind.assigned_role = "Death Commando"
for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
spawn(0)
door.open()
//Assign antag status and the mission
Commando.mind.special_role = "deathsquad"
var/datum/objective/missionobj = new
missionobj.owner = Commando.mind
missionobj.explanation_text = mission
missionobj.completed = 1
Commando.mind.objectives += missionobj
Commando.mind.add_antag_datum(/datum/antagonist/auto_custom)
//Greet the commando
to_chat(Commando, "<B><font size=3 color=red>You are the [numagents==1?"Deathsquad Officer":"Death Commando"].</font></B>")
var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division."
if(numagents == 1) //If Squad Leader
missiondesc += " Lead your squad to ensure the completion of the mission. Board the shuttle when your team is ready."
else
missiondesc += " Follow orders given to you by your squad leader."
missiondesc += "<BR><B>Your Mission</B>: [mission]"
to_chat(Commando, missiondesc)
if(CONFIG_GET(flag/enforce_human_authority))
Commando.set_species(/datum/species/human)
//Logging and cleanup
if(numagents == 1)
message_admins("The deathsquad has spawned with the mission: [mission].")
log_game("[key_name(Commando)] has been selected as a Death Commando")
numagents--
squadSpawned++
if (squadSpawned)
return 1
else
return 0
return
return makeEmergencyresponseteam(ERT_DEATHSQUAD)
/datum/admins/proc/makeOfficial()
var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.")
@@ -386,38 +316,70 @@
return 0
// CENTCOM RESPONSE TEAM
/datum/admins/proc/makeEmergencyresponseteam()
var/alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: CentCom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad")
if(!alert)
return
/datum/admins/proc/makeEmergencyresponseteam(alert_type)
var/alert
if(!alert_type)
alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: CentCom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad")
if(!alert)
return
else
alert = alert_type
var/teamsize = 0
var/deathsquad = FALSE
switch(alert)
if("Delta: Deathsquad")
return makeDeathsquad()
alert = ERT_DEATHSQUAD
teamsize = 5
deathsquad = TRUE
if("Red: Elite ERT (Armoury Access + Pulse Weapons)")
alert = "Red"
alert = ERT_RED
if("Amber: Full ERT (Armoury Access)")
alert = "Amber"
alert = ERT_AMBER
if("Blue: Light ERT (No Armoury Access)")
alert = "Blue"
alert = ERT_BLUE
if("Green: CentCom Official")
return makeOfficial()
var/teamcheck = input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num
if(isnull(teamcheck))
return
var/teamsize = min(7,teamcheck)
var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.") as null|text
else
return
if(!teamsize)
var/teamcheck = input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num
if(isnull(teamcheck))
return
teamsize = min(7,teamcheck)
var/default_mission = deathsquad ? "Leave no witnesses." : "Assist the station."
var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", default_mission) as null|text
if(!mission)
return
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for a Code [alert] Nanotrasen Emergency Response Team?", "deathsquad", null)
var/prompt_name = deathsquad ? "an elite Nanotrasen Strike Team" : "a Code [alert] Nanotrasen Emergency Response Team"
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [prompt_name] ?", "deathsquad", null)
var/teamSpawned = 0
if(candidates.len > 0)
//Pick the (un)lucky players
var/numagents = min(teamsize,candidates.len) //How many officers to spawn
var/redalert //If the ert gets super weapons
if (alert == "Red")
numagents = min(teamsize,candidates.len)
redalert = 1
//Create team
var/datum/team/ert/ert_team = new
if(deathsquad)
ert_team.name = "Death Squad"
//Asign team objective
var/datum/objective/missionobj = new
missionobj.team = ert_team
missionobj.explanation_text = mission
missionobj.completed = 1
ert_team.objectives += missionobj
ert_team.mission = missionobj
//We give these out in order, then back from the start if there's more than 3
var/list/role_order = list(ERT_SEC,ERT_MED,ERT_ENG)
var/list/spawnpoints = GLOB.emergencyresponseteamspawn
while(numagents && candidates.len)
if (numagents > spawnpoints.len)
@@ -429,75 +391,38 @@
if(!chosen_candidate.key)
continue
//Spawn and equip the officer
//Spawn the body
var/mob/living/carbon/human/ERTOperative = new(spawnloc)
var/list/lastname = GLOB.last_names
chosen_candidate.client.prefs.copy_to(ERTOperative)
var/ertname = pick(lastname)
switch(numagents)
if(1)
ERTOperative.real_name = "Commander [ertname]"
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/commander/alert : /datum/outfit/ert/commander)
if(2)
ERTOperative.real_name = "Security Officer [ertname]"
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/security/alert : /datum/outfit/ert/security)
if(3)
ERTOperative.real_name = "Medical Officer [ertname]"
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/medic/alert : /datum/outfit/ert/medic)
if(4)
ERTOperative.real_name = "Engineer [ertname]"
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer)
if(5)
ERTOperative.real_name = "Security Officer [ertname]"
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/security/alert : /datum/outfit/ert/security)
if(6)
ERTOperative.real_name = "Medical Officer [ertname]"
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/medic/alert : /datum/outfit/ert/medic)
if(7)
ERTOperative.real_name = "Engineer [ertname]"
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer)
ERTOperative.dna.update_dna_identity()
ERTOperative.key = chosen_candidate.key
ERTOperative.mind.assigned_role = "ERT"
//Open the Armory doors
if(alert != "Blue")
for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
spawn(0)
door.open()
//Assign antag status and the mission
ERTOperative.mind.special_role = "ERT"
var/datum/objective/missionobj = new
missionobj.owner = ERTOperative.mind
missionobj.explanation_text = mission
missionobj.completed = 1
ERTOperative.mind.objectives += missionobj
ERTOperative.mind.add_antag_datum(/datum/antagonist/auto_custom)
//Greet the commando
to_chat(ERTOperative, "<B><font size=3 color=red>You are [numagents==1?"the Emergency Response Team Commander":"an Emergency Response Officer"].</font></B>")
var/missiondesc = "Your squad is being sent on a Code [alert] mission to [station_name()] by Nanotrasen's Security Division."
if(numagents == 1) //If Squad Leader
missiondesc += " Lead your squad to ensure the completion of the mission. Avoid civilian casualites when possible. Board the shuttle when your team is ready."
else
missiondesc += " Follow orders given to you by your commander. Avoid civilian casualites when possible."
missiondesc += "<BR><B>Your Mission</B>: [mission]"
to_chat(ERTOperative, missiondesc)
if(CONFIG_GET(flag/enforce_human_authority))
ERTOperative.set_species(/datum/species/human)
//Logging and cleanup
//Give antag datum
var/datum/antagonist/ert/ert_antag = new
ert_antag.high_alert = alert == ERT_RED
if(numagents == 1)
message_admins("A Code [alert] emergency response team has spawned with the mission: [mission]")
log_game("[key_name(ERTOperative)] has been selected as an Emergency Response Officer")
ert_antag.role = deathsquad ? DEATHSQUAD_LEADER : ERT_LEADER
else
ert_antag.role = deathsquad ? DEATHSQUAD : role_order[WRAP(numagents,1,role_order.len + 1)]
ERTOperative.mind.add_antag_datum(ert_antag,ert_team)
ERTOperative.mind.assigned_role = ert_antag.name
//Logging and cleanup
log_game("[key_name(ERTOperative)] has been selected as an [ert_antag.name]")
numagents--
teamSpawned++
if (teamSpawned)
message_admins("[prompt_name] has spawned with the mission: [mission]")
//Open the Armory doors
if(alert != ERT_BLUE)
for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
spawn(0)
door.open()
return 1
else
return 0
@@ -17,6 +17,7 @@ GLOBAL_LIST_EMPTY(antagonists)
//Antag panel properties
var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind
var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED
var/show_name_in_check_antagonists = FALSE //Will append antagonist name in admin listings - use for categories that share more than one antag type
/datum/antagonist/New()
GLOB.antagonists += src
@@ -206,6 +207,7 @@ GLOBAL_LIST_EMPTY(antagonists)
/datum/antagonist/auto_custom
show_in_antagpanel = FALSE
antagpanel_category = "Other"
show_name_in_check_antagonists = TRUE
/datum/antagonist/auto_custom/on_gain()
..()
@@ -219,12 +221,10 @@ GLOBAL_LIST_EMPTY(antagonists)
already_registered_objectives |= A.objectives
objectives = owner.objectives - already_registered_objectives
/datum/antagonist/auto_custom/antag_listing_name()
return ..() + "([name])"
//This one is created by admin tools for custom objectives
/datum/antagonist/custom
antagpanel_category = "Custom"
show_name_in_check_antagonists = TRUE //They're all different
/datum/antagonist/custom/admin_add(datum/mind/new_owner,mob/admin)
var/custom_name = stripped_input(admin, "Custom antagonist name:", "Custom antag", "Antagonist")
@@ -232,7 +232,4 @@ GLOBAL_LIST_EMPTY(antagonists)
name = custom_name
else
return
..()
/datum/antagonist/custom/antag_listing_name()
return ..() + "([name])"
..()
+252 -266
View File
@@ -1,266 +1,252 @@
/obj/item/antag_spawner
throw_speed = 1
throw_range = 5
w_class = WEIGHT_CLASS_TINY
var/used = FALSE
/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
return
/obj/item/antag_spawner/proc/equip_antag(mob/target)
return
///////////WIZARD
/obj/item/antag_spawner/contract
name = "contract"
desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid."
icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2"
/obj/item/antag_spawner/contract/attack_self(mob/user)
user.set_machine(src)
var/dat
if(used)
dat = "<B>You have already summoned your apprentice.</B><BR>"
else
dat = "<B>Contract of Apprenticeship:</B><BR>"
dat += "<I>Using this contract, you may summon an apprentice to aid you on your mission.</I><BR>"
dat += "<I>If you are unable to establish contact with your apprentice, you can feed the contract back to the spellbook to refund your points.</I><BR>"
dat += "<B>Which school of magic is your apprentice studying?:</B><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_DESTRUCTION]'>Destruction</A><BR>"
dat += "<I>Your apprentice is skilled in offensive magic. They know Magic Missile and Fireball.</I><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_BLUESPACE]'>Bluespace Manipulation</A><BR>"
dat += "<I>Your apprentice is able to defy physics, melting through solid objects and travelling great distances in the blink of an eye. They know Teleport and Ethereal Jaunt.</I><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_HEALING]'>Healing</A><BR>"
dat += "<I>Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.</I><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_ROBELESS]'>Robeless</A><BR>"
dat += "<I>Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.</I><BR>"
user << browse(dat, "window=radio")
onclose(user, "radio")
return
/obj/item/antag_spawner/contract/Topic(href, href_list)
..()
var/mob/living/carbon/human/H = usr
if(H.stat || H.restrained())
return
if(!ishuman(H))
return 1
if(loc == H || (in_range(src, H) && isturf(loc)))
H.set_machine(src)
if(href_list["school"])
if(used)
to_chat(H, "You already used this contract!")
return
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
if(LAZYLEN(candidates))
if(used)
to_chat(H, "You already used this contract!")
return
used = TRUE
var/client/C = pick(candidates)
spawn_antag(C, get_turf(src), href_list["school"],H.mind)
else
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, kind ,datum/mind/user)
new /obj/effect/particle_effect/smoke(T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
var/datum/mind/app_mind = M.mind
var/datum/antagonist/wizard/apprentice/app = new()
app.master = user
app.school = kind
var/datum/antagonist/wizard/master_wizard = user.has_antag_datum(/datum/antagonist/wizard)
if(master_wizard)
if(!master_wizard.wiz_team)
master_wizard.create_wiz_team()
app.wiz_team = master_wizard.wiz_team
master_wizard.wiz_team.add_member(app_mind)
app_mind.add_antag_datum(app)
//TODO Kill these if possible
app_mind.assigned_role = "Apprentice"
app_mind.special_role = "apprentice"
//
SEND_SOUND(M, sound('sound/effects/magic.ogg'))
///////////BORGS AND OPERATIVES
/obj/item/antag_spawner/nuke_ops
name = "syndicate operative teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
var/borg_to_spawn
/obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used)
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
return FALSE
if(!user.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE))
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
return FALSE
if(!user.onSyndieBase())
to_chat(user, "<span class='warning'>[src] is out of range! It can only be used at your base!</span>")
return FALSE
return TRUE
/obj/item/antag_spawner/nuke_ops/attack_self(mob/user)
if(!(check_usability(user)))
return
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
var/list/nuke_candidates = pollGhostCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE)
if(LAZYLEN(nuke_candidates))
if(!(check_usability(user)))
return
used = TRUE
var/client/C = pick(nuke_candidates)
spawn_antag(C, get_turf(src), "syndieborg", user.mind)
do_sparks(4, TRUE, src)
qdel(src)
else
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
var/datum/antagonist/nukeop/new_op = new()
new_op.send_to_spawnpoint = FALSE
new_op.nukeop_outfit = /datum/outfit/syndicate/no_crystals
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE)
if(creator_op)
M.mind.add_antag_datum(new_op,creator_op.nuke_team)
M.mind.special_role = "Nuclear Operative"
//////SYNDICATE BORG
/obj/item/antag_spawner/nuke_ops/borg_tele
name = "syndicate cyborg teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field.."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
/obj/item/antag_spawner/nuke_ops/borg_tele/assault
name = "syndicate assault cyborg teleporter"
borg_to_spawn = "Assault"
/obj/item/antag_spawner/nuke_ops/borg_tele/medical
name = "syndicate medical teleporter"
borg_to_spawn = "Medical"
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user)
var/mob/living/silicon/robot/R
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE)
if(!creator_op)
return
switch(borg_to_spawn)
if("Medical")
R = new /mob/living/silicon/robot/modules/syndicate/medical(T)
else
R = new /mob/living/silicon/robot/modules/syndicate(T) //Assault borg by default
var/brainfirstname = pick(GLOB.first_names_male)
if(prob(50))
brainfirstname = pick(GLOB.first_names_female)
var/brainopslastname = pick(GLOB.last_names)
if(creator_op.nuke_team.syndicate_name) //the brain inside the syndiborg has the same last name as the other ops.
brainopslastname = creator_op.nuke_team.syndicate_name
var/brainopsname = "[brainfirstname] [brainopslastname]"
R.mmi.name = "Man-Machine Interface: [brainopsname]"
R.mmi.brain.name = "[brainopsname]'s brain"
R.mmi.brainmob.real_name = brainopsname
R.mmi.brainmob.name = brainopsname
R.real_name = R.name
R.key = C.key
var/datum/antagonist/nukeop/new_borg = new()
new_borg.send_to_spawnpoint = FALSE
R.mind.add_antag_datum(new_borg,creator_op.nuke_team)
R.mind.special_role = "Syndicate Cyborg"
///////////SLAUGHTER DEMON
/obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game
name = "vial of blood"
desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
var/shatter_msg = "<span class='notice'>You shatter the bottle, no turning back now!</span>"
var/veil_msg = "<span class='warning'>You sense a dark presence lurking just beyond the veil...</span>"
var/objective_verb = "Kill"
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
if(!is_station_level(user.z))
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
return
if(used)
return
var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src)
if(LAZYLEN(candidates))
if(used)
return
used = TRUE
var/client/C = pick(candidates)
spawn_antag(C, get_turf(src), initial(demon_type.name),user.mind)
to_chat(user, shatter_msg)
to_chat(user, veil_msg)
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
qdel(src)
else
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
var/mob/living/simple_animal/slaughter/S = new demon_type(holder)
S.holder = holder
S.key = C.key
S.mind.assigned_role = S.name
S.mind.special_role = S.name
var/datum/objective/assassinate/new_objective
if(user)
new_objective = new /datum/objective/assassinate
new_objective.owner = S.mind
new_objective.target = user
new_objective.explanation_text = "[objective_verb] [user.name], the one who summoned you."
S.mind.objectives += new_objective
var/datum/objective/new_objective2 = new /datum/objective
new_objective2.owner = S.mind
new_objective2.explanation_text = "[objective_verb] everyone[user ? " else while you're at it":""]."
S.mind.objectives += new_objective2
S.mind.add_antag_datum(/datum/antagonist/auto_custom)
to_chat(S, S.playstyle_string)
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \
Ctrl+Click a blood pool to manifest.</B>")
if(new_objective)
to_chat(S, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
to_chat(S, "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]")
/obj/item/antag_spawner/slaughter_demon/laughter
name = "vial of tickles"
desc = "A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures."
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
color = "#FF69B4" // HOT PINK
veil_msg = "<span class='warning'>You sense an adorable presence lurking just beyond the veil...</span>"
objective_verb = "Hug and Tickle"
demon_type = /mob/living/simple_animal/slaughter/laughter
/obj/item/antag_spawner
throw_speed = 1
throw_range = 5
w_class = WEIGHT_CLASS_TINY
var/used = 0
/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
return
/obj/item/antag_spawner/proc/equip_antag(mob/target)
return
///////////WIZARD
/obj/item/antag_spawner/contract
name = "contract"
desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid."
icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2"
/obj/item/antag_spawner/contract/attack_self(mob/user)
user.set_machine(src)
var/dat
if(used)
dat = "<B>You have already summoned your apprentice.</B><BR>"
else
dat = "<B>Contract of Apprenticeship:</B><BR>"
dat += "<I>Using this contract, you may summon an apprentice to aid you on your mission.</I><BR>"
dat += "<I>If you are unable to establish contact with your apprentice, you can feed the contract back to the spellbook to refund your points.</I><BR>"
dat += "<B>Which school of magic is your apprentice studying?:</B><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_DESTRUCTION]'>Destruction</A><BR>"
dat += "<I>Your apprentice is skilled in offensive magic. They know Magic Missile and Fireball.</I><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_BLUESPACE]'>Bluespace Manipulation</A><BR>"
dat += "<I>Your apprentice is able to defy physics, melting through solid objects and travelling great distances in the blink of an eye. They know Teleport and Ethereal Jaunt.</I><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_HEALING]'>Healing</A><BR>"
dat += "<I>Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.</I><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_ROBELESS]'>Robeless</A><BR>"
dat += "<I>Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.</I><BR>"
user << browse(dat, "window=radio")
onclose(user, "radio")
return
/obj/item/antag_spawner/contract/Topic(href, href_list)
..()
var/mob/living/carbon/human/H = usr
if(H.stat || H.restrained())
return
if(!ishuman(H))
return 1
if(loc == H || (in_range(src, H) && isturf(loc)))
H.set_machine(src)
if(href_list["school"])
if(used)
to_chat(H, "You already used this contract!")
return
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
if(candidates.len)
if(used)
to_chat(H, "You already used this contract!")
return
used = 1
var/mob/dead/observer/theghost = pick(candidates)
spawn_antag(theghost.client, get_turf(src), href_list["school"],H.mind)
else
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, kind ,datum/mind/user)
new /obj/effect/particle_effect/smoke(T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
var/datum/mind/app_mind = M.mind
var/datum/antagonist/wizard/apprentice/app = new()
app.master = user
app.school = kind
var/datum/antagonist/wizard/master_wizard = user.has_antag_datum(/datum/antagonist/wizard)
if(master_wizard)
if(!master_wizard.wiz_team)
master_wizard.create_wiz_team()
app.wiz_team = master_wizard.wiz_team
master_wizard.wiz_team.add_member(app_mind)
app_mind.add_antag_datum(app)
//TODO Kill these if possible
app_mind.assigned_role = "Apprentice"
app_mind.special_role = "apprentice"
//
SEND_SOUND(M, sound('sound/effects/magic.ogg'))
///////////BORGS AND OPERATIVES
/obj/item/antag_spawner/nuke_ops
name = "syndicate operative teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
var/borg_to_spawn
/obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used)
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
return FALSE
if(!user.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE))
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
return FALSE
if(!user.onSyndieBase())
to_chat(user, "<span class='warning'>[src] is out of range! It can only be used at your base!</span>")
return FALSE
return TRUE
/obj/item/antag_spawner/nuke_ops/attack_self(mob/user)
if(!(check_usability(user)))
return
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
var/list/nuke_candidates = pollGhostCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE)
if(nuke_candidates.len)
if(!(check_usability(user)))
return
used = TRUE
var/mob/dead/observer/theghost = pick(nuke_candidates)
spawn_antag(theghost.client, get_turf(src), "syndieborg", user.mind)
do_sparks(4, TRUE, src)
qdel(src)
else
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
var/datum/antagonist/nukeop/new_op = new()
new_op.send_to_spawnpoint = FALSE
new_op.nukeop_outfit = /datum/outfit/syndicate/no_crystals
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE)
if(creator_op)
M.mind.add_antag_datum(new_op,creator_op.nuke_team)
M.mind.special_role = "Nuclear Operative"
//////SYNDICATE BORG
/obj/item/antag_spawner/nuke_ops/borg_tele
name = "syndicate cyborg teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field.."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
/obj/item/antag_spawner/nuke_ops/borg_tele/assault
name = "syndicate assault cyborg teleporter"
borg_to_spawn = "Assault"
/obj/item/antag_spawner/nuke_ops/borg_tele/medical
name = "syndicate medical teleporter"
borg_to_spawn = "Medical"
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user)
var/mob/living/silicon/robot/R
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE)
if(!creator_op)
return
switch(borg_to_spawn)
if("Medical")
R = new /mob/living/silicon/robot/modules/syndicate/medical(T)
else
R = new /mob/living/silicon/robot/modules/syndicate(T) //Assault borg by default
var/brainfirstname = pick(GLOB.first_names_male)
if(prob(50))
brainfirstname = pick(GLOB.first_names_female)
var/brainopslastname = pick(GLOB.last_names)
if(creator_op.nuke_team.syndicate_name) //the brain inside the syndiborg has the same last name as the other ops.
brainopslastname = creator_op.nuke_team.syndicate_name
var/brainopsname = "[brainfirstname] [brainopslastname]"
R.mmi.name = "Man-Machine Interface: [brainopsname]"
R.mmi.brain.name = "[brainopsname]'s brain"
R.mmi.brainmob.real_name = brainopsname
R.mmi.brainmob.name = brainopsname
R.real_name = R.name
R.key = C.key
var/datum/antagonist/nukeop/new_borg = new()
new_borg.send_to_spawnpoint = FALSE
R.mind.add_antag_datum(new_borg,creator_op.nuke_team)
R.mind.special_role = "Syndicate Cyborg"
///////////SLAUGHTER DEMON
/obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game
name = "vial of blood"
desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
var/shatter_msg = "<span class='notice'>You shatter the bottle, no turning back now!</span>"
var/veil_msg = "<span class='warning'>You sense a dark presence lurking just beyond the veil...</span>"
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
var/antag_type = /datum/antagonist/slaughter
/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
if(!is_station_level(user.z))
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
return
if(used)
return
var/list/demon_candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", null, null, ROLE_ALIEN, 50, src)
if(demon_candidates.len)
if(used)
return
used = 1
var/mob/dead/observer/theghost = pick(demon_candidates)
spawn_antag(theghost.client, get_turf(src), initial(demon_type.name),user.mind)
to_chat(user, shatter_msg)
to_chat(user, veil_msg)
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
qdel(src)
else
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
var/mob/living/simple_animal/slaughter/S = new demon_type(holder)
S.holder = holder
S.key = C.key
S.mind.assigned_role = S.name
S.mind.special_role = S.name
S.mind.add_antag_datum(antag_type)
to_chat(S, S.playstyle_string)
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \
Ctrl+Click a blood pool to manifest.</B>")
/obj/item/antag_spawner/slaughter_demon/laughter
name = "vial of tickles"
desc = "A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures."
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
color = "#FF69B4" // HOT PINK
veil_msg = "<span class='warning'>You sense an adorable presence lurking just beyond the veil...</span>"
demon_type = /mob/living/simple_animal/slaughter/laughter
antag_type = /datum/antagonist/slaughter/laughter
+19 -2
View File
@@ -27,8 +27,25 @@
/datum/team/proc/roundend_report()
var/list/report = list()
report += "<b>[name]:</b>"
report += "<span class='header'>[name]:</span>"
report += "The [member_name]s were:"
report += printplayerlist(members)
return report.Join("<br>")
if(objectives.len)
report += "<span class='header'>Team had following objectives:</span>"
var/win = TRUE
var/objective_count = 1
for(var/datum/objective/objective in objectives)
if(objective.check_completion())
report += "<B>Objective #[objective_count]</B>: [objective.explanation_text] <span class='greentext'><B>Success!</span>"
else
report += "<B>Objective #[objective_count]</B>: [objective.explanation_text] <span class='redtext'>Fail.</span>"
win = FALSE
objective_count++
if(win)
report += "<span class='greentext'>The [name] was successful!</span>"
else
report += "<span class='redtext'>The [name] have failed!</span>"
return "<div class='panel redborder'>[report.Join("<br>")]</div>"
@@ -148,7 +148,7 @@
result += printplayer(abductor_mind)
result += printobjectives(abductor_mind)
return result.Join("<br>")
return "<div class='panel redborder'>[result.Join("<br>")]</div>"
/datum/antagonist/abductee
name = "Abductee"
@@ -264,8 +264,8 @@
/obj/item/organ/heart/gland/egg/activate()
to_chat(owner, "<span class='boldannounce'>You lay an egg!</span>")
var/obj/item/reagent_containers/food/snacks/egg/egg = new(owner.drop_location())
egg.reagents.add_reagent("sacid",20)
egg.desc += " It smells bad."
egg.reagents.add_reagent(get_random_reagent_id(), 15)
egg.desc += " It looks weird..."
/obj/item/organ/heart/gland/electric
cooldown_low = 800
@@ -28,7 +28,7 @@
to_chat(user, "<span class='[message_span]'>[cultist_message]</span>")
if(user.mind && user.mind.isholy)
to_chat(user, "<span class='boldannounce'>The power of your faith melts away [src]!</span>")
var/obj/item/ore/slag/wrath = new /obj/item/ore/slag
var/obj/item/stack/ore/slag/wrath = new /obj/item/stack/ore/slag
qdel(src)
user.put_in_active_hand(wrath)
if(is_servant_of_ratvar(user) && prob(20))
@@ -89,13 +89,12 @@
if(cooldowntime > world.time)
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shells","Flask of Unholy Water")
var/choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shell","Flask of Unholy Water")
var/list/pickedtype = list()
switch(choice)
if("Eldritch Whetstone")
pickedtype += /obj/item/sharpener/cult
if("Construct Shells")
pickedtype += /obj/structure/constructshell
if("Construct Shell")
pickedtype += /obj/structure/constructshell
if("Flask of Unholy Water")
pickedtype += /obj/item/reagent_containers/glass/beaker/unholywater
-11
View File
@@ -138,21 +138,10 @@ This file contains the cult dagger and rune list code
if(isspaceturf(T))
to_chat(user, "<span class='warning'>You cannot scribe runes in space!</span>")
return FALSE
if(locate(/obj/effect/rune) in T)
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
return FALSE
if(!is_station_level(T.z) && !is_mining_level(T.z))
to_chat(user, "<span class='warning'>The veil is not weak enough here.</span>")
return FALSE
var/area/A = get_area(T)
if(A && !A.blob_allowed)
to_chat(user, "<span class='warning'>There's a passage in [src] specifically forbidding oyster consumption, triple-frying, and building outside of designated cult zones.</span>")
return FALSE
return TRUE
+1 -1
View File
@@ -316,7 +316,7 @@ structure_check() searches for nearby cultist structures required for the invoca
to_chat(M, "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>")
var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
if(sacrificial.mind)
if(sacrificial.mind && !sacrificial.suiciding)
stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul()
stone.transfer_soul("FORCE", sacrificial, usr)
stone.invisibility = 0
+87
View File
@@ -0,0 +1,87 @@
//Both ERT and DS are handled by the same datums since they mostly differ in equipment in objective.
/datum/team/ert
name = "Emergency Response Team"
var/datum/objective/mission //main mission
/datum/antagonist/ert
name = "Emergency Response Officer"
var/datum/team/ert/ert_team
var/role = ERT_SEC
var/high_alert = FALSE
show_in_antagpanel = FALSE
/datum/antagonist/ert/on_gain()
update_name()
forge_objectives()
equipERT()
. = ..()
/datum/antagonist/ert/get_team()
return ert_team
/datum/antagonist/ert/proc/update_name()
var/new_name
switch(role)
if(ERT_ENG)
new_name = "Engineer [pick(GLOB.last_names)]"
if(ERT_MED)
new_name = "Medical Officer [pick(GLOB.last_names)]"
if(ERT_SEC)
new_name = "Security Officer [pick(GLOB.last_names)]"
if(ERT_LEADER)
new_name = "Commander [pick(GLOB.last_names)]"
name = "Emergency Response Commander"
if(DEATHSQUAD)
new_name = "Trooper [pick(GLOB.commando_names)]"
name = "Deathsquad Trooper"
if(DEATHSQUAD_LEADER)
new_name = "Officer [pick(GLOB.commando_names)]"
name = "Deathsquad Officer"
owner.current.fully_replace_character_name(owner.current.real_name,new_name)
/datum/antagonist/ert/create_team(datum/team/ert/new_team)
if(istype(new_team))
ert_team = new_team
/datum/antagonist/ert/proc/forge_objectives()
if(ert_team)
objectives |= ert_team.objectives
/datum/antagonist/ert/proc/equipERT()
var/mob/living/carbon/human/H = owner.current
if(!istype(H))
return
var/outfit
switch(role)
if(ERT_LEADER)
outfit = high_alert ? /datum/outfit/ert/commander/alert : /datum/outfit/ert/commander
if(ERT_ENG)
outfit = high_alert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer
if(ERT_MED)
outfit = high_alert ? /datum/outfit/ert/medic/alert : /datum/outfit/ert/medic
if(ERT_SEC)
outfit = high_alert ? /datum/outfit/ert/security/alert : /datum/outfit/ert/security
if(DEATHSQUAD)
outfit = /datum/outfit/death_commando/officer
if(DEATHSQUAD_LEADER)
outfit = /datum/outfit/death_commando
H.equipOutfit(outfit)
/datum/antagonist/ert/greet()
if(!ert_team)
return
var/leader = role == ERT_LEADER || role == DEATHSQUAD_LEADER
to_chat(owner, "<B><font size=3 color=red>You are the [name].</font></B>")
var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division."
if(leader) //If Squad Leader
missiondesc += " Lead your squad to ensure the completion of the mission. Board the shuttle when your team is ready."
else
missiondesc += " Follow orders given to you by your squad leader."
if(role != DEATHSQUAD && role != DEATHSQUAD_LEADER)
missiondesc += "Avoid civilian casualites when possible."
missiondesc += "<BR><B>Your Mission</B> : [ert_team.mission.explanation_text]"
to_chat(owner,missiondesc)
+2 -1
View File
@@ -126,6 +126,7 @@
form = null
alpha = initial(alpha)
color = initial(color)
maptext = null
visible_message("<span class='warning'>[src] suddenly collapses in on itself, dissolving into a pile of green flesh!</span>", \
"<span class='notice'>You reform to your normal body.</span>")
@@ -226,7 +227,7 @@
player_mind.transfer_to(S)
player_mind.assigned_role = "Morph"
player_mind.special_role = "Morph"
player_mind.add_antag_datum(/datum/antagonist/auto_custom)
player_mind.add_antag_datum(/datum/antagonist/morph)
to_chat(S, S.playstyle_string)
SEND_SOUND(S, sound('sound/magic/mutate.ogg'))
message_admins("[key_name_admin(S)] has been made into a morph by an event.")
@@ -0,0 +1,6 @@
/datum/antagonist/morph
name = "Morph"
show_name_in_check_antagonists = TRUE
show_in_antagpanel = FALSE
//It does nothing! (Besides tracking)
+1 -4
View File
@@ -2,11 +2,11 @@
name = "Ninja"
antagpanel_category = "Ninja"
job_rank = ROLE_NINJA
show_name_in_check_antagonists = TRUE
var/helping_station = FALSE
var/give_objectives = TRUE
var/give_equipment = TRUE
/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override)
var/mob/living/M = mob_override || owner.current
update_ninja_icons_added(M)
@@ -141,9 +141,6 @@
message_admins("[key_name_admin(admin)] has [adj] ninja'ed [new_owner.current].")
log_admin("[key_name(admin)] has [adj] ninja'ed [new_owner.current].")
/datum/antagonist/ninja/antag_listing_name()
return ..() + "(Ninja)"
/datum/antagonist/ninja/proc/update_ninja_icons_added(var/mob/living/carbon/human/ninja)
var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA]
ninjahud.join_hud(ninja)
@@ -224,6 +224,7 @@
invisibility = INVISIBILITY_ABSTRACT
revealed = FALSE
ghostize(0)//Don't re-enter invisible corpse
SSshuttle.shuttle_purchase_requirements_met |= "revenant"
//reveal, stun, icon updates, cast checks, and essence changing
@@ -0,0 +1,31 @@
/datum/antagonist/slaughter
name = "Slaughter demon"
show_name_in_check_antagonists = TRUE
var/objective_verb = "Kill"
var/datum/mind/summoner
job_rank = ROLE_ALIEN
show_in_antagpanel = FALSE
/datum/antagonist/slaughter/on_gain()
forge_objectives()
. = ..()
/datum/antagonist/slaughter/greet()
. = ..()
owner.announce_objectives()
/datum/antagonist/slaughter/proc/forge_objectives()
if(summoner)
var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate
new_objective.owner = owner
new_objective.target = summoner
new_objective.explanation_text = "[objective_verb] [summoner.name], the one who summoned you."
objectives += new_objective
var/datum/objective/new_objective2 = new /datum/objective
new_objective2.owner = owner
new_objective2.explanation_text = "[objective_verb] everyone[summoner ? " else while you're at it":""]."
objectives += new_objective2
/datum/antagonist/slaughter/laughter
name = "Laughter demon"
objective_verb = "Hug and Tickle"
@@ -37,7 +37,7 @@
player_mind.transfer_to(S)
player_mind.assigned_role = "Slaughter Demon"
player_mind.special_role = "Slaughter Demon"
player_mind.add_antag_datum(/datum/antagonist/auto_custom)
player_mind.add_antag_datum(/datum/antagonist/slaughter)
to_chat(S, S.playstyle_string)
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.</B>")
SEND_SOUND(S, 'sound/magic/demon_dies.ogg')
+1 -1
View File
@@ -90,7 +90,7 @@
projectiletype = /obj/item/projectile/beam/disabler
ranged_cooldown_time = 20
projectilesound = 'sound/weapons/taser2.ogg'
loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/ore/bluespace_crystal)
loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal)
del_on_death = 1
deathmessage = "explodes with a sharp pop!"
light_color = LIGHT_COLOR_CYAN
@@ -152,6 +152,7 @@
if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY)
ASSERT_GAS(/datum/gas/carbon_dioxide, air) //don't need to assert o2, since if it isn't present we'll never reach this point anyway
plasma_burn_rate = min(plasma_burn_rate,cached_gases[/datum/gas/plasma][MOLES],cached_gases[/datum/gas/oxygen][MOLES]/oxygen_burn_rate) //Ensures matter is conserved properly
cached_gases[/datum/gas/plasma][MOLES] = QUANTIZE(cached_gases[/datum/gas/plasma][MOLES] - plasma_burn_rate)
cached_gases[/datum/gas/oxygen][MOLES] = QUANTIZE(cached_gases[/datum/gas/oxygen][MOLES] - (plasma_burn_rate * oxygen_burn_rate))
if (super_saturation)
@@ -207,13 +208,13 @@
var/old_heat_capacity = air.heat_capacity()
var/catalyst_efficency = max(min(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/tritium][MOLES],MAX_CATALYST_EFFICENCY)-(temperature/FUSION_HEAT_DROPOFF),1)
var/reaction_energy = THERMAL_ENERGY(air)
var/moles_impurities = air.total_moles()-(cached_gases[/datum/gas/plasma][MOLES]+cached_gases[/datum/gas/tritium][MOLES])
var/moles_impurities = max(air.total_moles()-(cached_gases[/datum/gas/plasma][MOLES]+cached_gases[/datum/gas/tritium][MOLES]),1) //This makes it assume a minimum of 1 mol impurities so the reaction energy doesn't divide by 0
var/plasma_fused = (PLASMA_FUSED_COEFFICENT*catalyst_efficency)*(temperature/PLASMA_BINDING_ENERGY)/10
var/tritium_catalyzed = (CATALYST_COEFFICENT*catalyst_efficency)*(temperature/PLASMA_BINDING_ENERGY)/40
var/plasma_fused = min((PLASMA_FUSED_COEFFICENT*catalyst_efficency)*(temperature/PLASMA_BINDING_ENERGY)/10,cached_gases[/datum/gas/plasma][MOLES]) //Preserve matter
var/tritium_catalyzed = min((CATALYST_COEFFICENT*catalyst_efficency)*(temperature/PLASMA_BINDING_ENERGY)/40,cached_gases[/datum/gas/tritium][MOLES]) //Ditto
var/oxygen_added = tritium_catalyzed
var/waste_added = max((plasma_fused-oxygen_added)-((air.total_moles()*air.heat_capacity())/PLASMA_BINDING_ENERGY),0)
reaction_energy = max(reaction_energy+((catalyst_efficency*cached_gases[/datum/gas/plasma][MOLES])/((moles_impurities/catalyst_efficency)+2)*10)+((plasma_fused/((moles_impurities/catalyst_efficency)))*PLASMA_BINDING_ENERGY),0)
reaction_energy = max(reaction_energy+((catalyst_efficency*cached_gases[/datum/gas/plasma][MOLES])/((moles_impurities/catalyst_efficency)+2)*10)+((plasma_fused/(moles_impurities/catalyst_efficency))*PLASMA_BINDING_ENERGY),0)
air.assert_gases(/datum/gas/oxygen, /datum/gas/carbon_dioxide, /datum/gas/water_vapor, /datum/gas/nitrous_oxide, /datum/gas/nitryl)
//Fusion produces an absurd amount of waste products now, requiring active filtration.
@@ -251,7 +252,7 @@
var/temperature = air.temperature
var/old_heat_capacity = air.heat_capacity()
var/heat_efficency = temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100)
var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100),cached_gases[/datum/gas/oxygen][MOLES],cached_gases[/datum/gas/nitrogen][MOLES])
var/energy_used = heat_efficency*NITRYL_FORMATION_ENERGY
ASSERT_GAS(/datum/gas/nitryl,air)
@@ -283,7 +284,7 @@
var/pressure = air.return_pressure()
var/old_heat_capacity = air.heat_capacity()
var/reaction_efficency = 1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/tritium][MOLES],1)))
var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/tritium][MOLES],1))),cached_gases[/datum/gas/tritium][MOLES],cached_gases[/datum/gas/plasma][MOLES]/2)
var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED
ASSERT_GAS(/datum/gas/bz,air)
@@ -314,9 +315,8 @@
var/list/cached_gases = air.gases
var/old_heat_capacity = air.heat_capacity()
var/heat_scale = air.temperature/STIMULUM_HEAT_SCALE
var/stim_energy_change
stim_energy_change =heat_scale + (STIMULUM_FIRST_RISE(heat_scale**2)) - (STIMULUM_FIRST_DROP(heat_scale**3)) + (STIMULUM_SECOND_RISE(heat_scale**4)) - (STIMULUM_ABSOLUTE_DROP(heat_scale**5))
var/heat_scale = min(air.temperature/STIMULUM_HEAT_SCALE,cached_gases[/datum/gas/tritium][MOLES],cached_gases[/datum/gas/plasma][MOLES],cached_gases[/datum/gas/nitryl][MOLES])
var/stim_energy_change = heat_scale + STIMULUM_FIRST_RISE*(heat_scale**2) - STIMULUM_FIRST_DROP*(heat_scale**3) + STIMULUM_SECOND_RISE*(heat_scale**4) - STIMULUM_ABSOLUTE_DROP*(heat_scale**5)
ASSERT_GAS(/datum/gas/stimulum,air)
cached_gases[/datum/gas/stimulum][MOLES]+= heat_scale/10
@@ -345,7 +345,7 @@
var/list/cached_gases = air.gases
air.assert_gases(/datum/gas/hypernoblium,/datum/gas/bz)
var/old_heat_capacity = air.heat_capacity()
var/nob_formed = (cached_gases[/datum/gas/nitrogen][MOLES]*cached_gases[/datum/gas/tritium][MOLES])/100
var/nob_formed = min((cached_gases[/datum/gas/nitrogen][MOLES]+cached_gases[/datum/gas/tritium][MOLES])/100,cached_gases[/datum/gas/tritium][MOLES]/10,cached_gases[/datum/gas/nitrogen][MOLES]/20)
var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(cached_gases[/datum/gas/bz][MOLES],1)))
cached_gases[/datum/gas/tritium][MOLES] = max(cached_gases[/datum/gas/tritium][MOLES]- 10*nob_formed,0)
cached_gases[/datum/gas/nitrogen][MOLES] = max(cached_gases[/datum/gas/nitrogen][MOLES]- 20*nob_formed,0)
@@ -184,7 +184,8 @@
if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic.
beaker.reagents.trans_to(occupant, 1, efficiency * 0.25) // Transfer reagents.
beaker.reagents.reaction(occupant, VAPOR)
air1.gases[/datum/gas/oxygen][MOLES] -= 2 / efficiency //Let's use gas for this
air1.gases[/datum/gas/oxygen][MOLES] -= max(0,air1.gases[/datum/gas/oxygen][MOLES] - 2 / efficiency) //Let's use gas for this
air1.garbage_collect()
if(++reagent_transfer >= 10 * efficiency) // Throttle reagent transfer (higher efficiency will transfer the same amount but consume less from the beaker).
reagent_transfer = 0
@@ -220,7 +221,8 @@
air1.temperature = max(air1.temperature - heat / air_heat_capacity, TCMB)
mob_occupant.bodytemperature = max(mob_occupant.bodytemperature + heat / heat_capacity, TCMB)
air1.gases[/datum/gas/oxygen][MOLES] -= 0.5 / efficiency // Magically consume gas? Why not, we run on cryo magic.
air1.gases[/datum/gas/oxygen][MOLES] = max(0,air1.gases[/datum/gas/oxygen][MOLES] - 0.5 / efficiency) // Magically consume gas? Why not, we run on cryo magic.
air1.garbage_collect()
/obj/machinery/atmospherics/components/unary/cryo_cell/power_change()
..()
+457 -55
View File
@@ -1,116 +1,469 @@
//Snow Valley Areas//--
/area/awaymission/snowdin
name = "Snowdin Tundra Plains"
name = "Snowdin"
icon_state = "awaycontent1"
requires_power = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
/area/awaymission/snowdin/outside
name = "Snowdin Tundra Plains"
icon_state = "awaycontent25"
/area/awaymission/snowdin/post
name = "Snowdin Outpost"
requires_power = TRUE
icon_state = "awaycontent2"
requires_power = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/snowdin/post/medbay
name = "Snowdin Outpost - Medbay"
icon_state = "awaycontent3"
/area/awaymission/snowdin/post/secpost
name = "Snowdin Outpost - Security Checkpoint"
icon_state = "awaycontent4"
/area/awaymission/snowdin/post/hydro
name = "Snowdin Outpost - Hydroponics"
icon_state = "awaycontent5"
/area/awaymission/snowdin/post/messhall
name = "Snowdin Outpost - Mess Hall"
icon_state = "awaycontent6"
/area/awaymission/snowdin/post/gateway
name = "Snowdin Outpost - Gateway"
icon_state = "awaycontent7"
/area/awaymission/snowdin/post/dorm
name = "Snowdin Outpost - Dorms"
icon_state = "awaycontent8"
/area/awaymission/snowdin/post/kitchen
name = "Snowdin Outpost - Kitchen"
icon_state = "awaycontent9"
/area/awaymission/snowdin/post/engineering
name = "Snowdin Outpost - Engineering"
icon_state = "awaycontent10"
/area/awaymission/snowdin/post/custodials
name = "Snowdin Outpost - Custodials"
icon_state = "awaycontent11"
/area/awaymission/snowdin/post/research
name = "Snowdin Outpost - Research Area"
icon_state = "awaycontent12"
/area/awaymission/snowdin/post/garage
name = "Snowdin Outpost - Garage"
icon_state = "awaycontent13"
/area/awaymission/snowdin/post/minipost
name = "Snowdin Outpost - Recon Post"
icon_state = "awaycontent19"
/area/awaymission/snowdin/post/mining_main
name = "Snowdin Outpost - Mining Post"
icon_state = "awaycontent21"
/area/awaymission/snowdin/post/mining_main/mechbay
name = "Snowdin Outpost - Mining Post Mechbay"
icon_state = "awaycontent25"
/area/awaymission/snowdin/post/mining_main/robotics
name = "Snowdin Outpost - Mining Post Robotics"
icon_state = "awaycontent26"
/area/awaymission/snowdin/post/cavern1
name = "Snowdin Outpost - Cavern Outpost 1"
icon_state = "awaycontent27"
/area/awaymission/snowdin/post/cavern2
name = "Snowdin Outpost - Cavern Outpost 2"
icon_state = "awaycontent28"
/area/awaymission/snowdin/post/mining_dock
name = "Snowdin Outpost - Underground Mine Post"
icon_state = "awaycontent22"
/area/awaymission/snowdin/post/broken_shuttle
name = "Snowdin Outpost - Broken Transist Shuttle"
icon_state = "awaycontent20"
requires_power = FALSE
/area/awaymission/snowdin/igloo
name = "Snowdin Igloos"
icon_state = "awaycontent3"
icon_state = "awaycontent14"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
/area/awaymission/snowdin/cave
name = "Snowdin Caves"
icon_state = "awaycontent4"
icon_state = "awaycontent15"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
/area/awaymission/snowdin/cave/cavern
name = "Snowdin Depths"
icon_state = "awaycontent23"
/area/awaymission/snowdin/cave/mountain
name = "Snowdin Mountains"
icon_state = "awaycontent24"
/area/awaymission/snowdin/base
name = "Snowdin Main Base"
icon_state = "awaycontent5"
icon_state = "awaycontent16"
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
requires_power = TRUE
/area/awaymission/snowdin/dungeon1
name = "Snowdin Depths"
icon_state = "awaycontent6"
icon_state = "awaycontent17"
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/snowdin/sekret
name = "Snowdin Operations"
icon_state = "awaycontent7"
icon_state = "awaycontent18"
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
requires_power = TRUE
/area/shuttle/snowdin/elevator1
name = "Excavation Elevator"
/area/shuttle/snowdin/elevator2
name = "Mining Elevator"
//shuttle console for elevators//
/obj/machinery/computer/shuttle/snowdin/mining
name = "shuttle console"
desc = "A shuttle control computer."
icon_screen = "shuttle"
icon_keyboard = "tech_key"
light_color = LIGHT_COLOR_CYAN
shuttleId = "snowdin_mining"
possible_destinations = "snowdin_mining_top;snowdin_mining_down"
//liquid plasma!!!!!!//
/turf/open/floor/plasteel/vault/snowdin
initial_gas_mix = "o2=22;n2=82;TEMP=180"
planetary_atmos = 1
temperature = 180
/turf/open/floor/plasteel/dark/snowdin
initial_gas_mix = "o2=22;n2=82;TEMP=180"
planetary_atmos = 1
temperature = 180
/turf/open/lava/plasma
name = "liquid plasma"
desc = "A flowing stream of chilled liquid plasma. You probably shouldn't get in."
icon_state = "liquidplasma"
initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"
baseturfs = /turf/open/lava/plasma
slowdown = 2
light_range = 3
light_power = 0.75
light_color = LIGHT_COLOR_PURPLE
/turf/open/lava/plasma/attackby(obj/item/I, mob/user, params)
var/obj/item/reagent_containers/glass/C = I
if(C.reagents.total_volume >= C.volume)
to_chat(user, "<span class='danger'>[C] is full.</span>")
return
C.reagents.add_reagent("plasma", rand(5, 10))
user.visible_message("[user] scoops some plasma from the [src] with \the [C].", "<span class='notice'>You scoop out some plasma from the [src] using \the [C].</span>")
/turf/open/lava/plasma/burn_stuff(AM)
. = 0
if(is_safe())
return FALSE
var/thing_to_check = src
if (AM)
thing_to_check = list(AM)
for(var/thing in thing_to_check)
if(isobj(thing))
var/obj/O = thing
if((O.resistance_flags & (FREEZE_PROOF)) || O.throwing)
continue
else if (isliving(thing))
. = 1
var/mob/living/L = thing
if(L.movement_type & FLYING)
continue //YOU'RE FLYING OVER IT
if("snow" in L.weather_immunities)
continue
var/buckle_check = L.buckling
if(!buckle_check)
buckle_check = L.buckled
if(isobj(buckle_check))
var/obj/O = buckle_check
if(O.resistance_flags & FREEZE_PROOF)
continue
else if(isliving(buckle_check))
var/mob/living/live = buckle_check
if("snow" in live.weather_immunities)
continue
L.adjustFireLoss(2)
if(L)
L.adjust_fire_stacks(20) //dipping into a stream of plasma would probably make you more flammable than usual
L.bodytemperature -=(rand(50,65)) //its cold, man
if(ishuman(L))//are they a carbon?
var/list/plasma_parts = list()//a list of the organic parts to be turned into plasma limbs
var/list/robo_parts = list()//keep a reference of robotic parts so we know if we can turn them into a plasmaman
var/mob/living/carbon/human/PP = L
if(istype(PP.dna.species, /datum/species/plasmaman || /datum/species/android || /datum/species/synth)) //ignore plasmamen/robotic species
return
for(var/BP in PP.bodyparts)
var/obj/item/bodypart/NN = BP
if(NN.status == BODYPART_ORGANIC && NN.species_id != "plasmaman") //getting every organic, non-plasmaman limb (augments/androids are immune to this)
plasma_parts += NN
if(NN.status == BODYPART_ROBOTIC)
robo_parts += NN
if(prob(35)) //checking if the delay is over & if the victim actually has any parts to nom
PP.adjustToxLoss(15)
PP.adjustFireLoss(25)
if(plasma_parts.len)
var/obj/item/bodypart/NB = pick(plasma_parts) //using the above-mentioned list to get a choice of limbs for dismember() to use
PP.emote("scream")
NB.species_id = "plasmaman"//change the species_id of the limb to that of a plasmaman
NB.no_update = TRUE
NB.change_bodypart_status()
PP.visible_message("<span class='warning'>[L] screams in pain as their [NB] melts down to the bone!</span>", \
"<span class='userdanger'>You scream out in pain as your [NB] melts down to the bone, leaving an eerie plasma-like glow where flesh used to be!</span>")
if(!plasma_parts.len && !robo_parts.len) //a person with no potential organic limbs left AND no robotic limbs, time to turn them into a plasmaman
PP.IgniteMob()
PP.set_species(/datum/species/plasmaman)
PP.visible_message("<span class='warning'>[L] bursts into a brilliant purple flame as their entire body is that of a skeleton!</span>", \
"<span class='userdanger'>Your senses numb as all of your remaining flesh is turned into a purple slurry, sloshing off your body and leaving only your bones to show in a vibrant purple!</span>")
/obj/vehicle/ridden/lavaboat/plasma
name = "plasma boat"
desc = "A boat used for traversing the streams of plasma without turning into an icecube."
icon_state = "goliath_boat"
icon = 'icons/obj/lavaland/dragonboat.dmi'
resistance_flags = FREEZE_PROOF
can_buckle = TRUE
/////////// papers
/obj/item/paper/crumpled/ruins/snowdin/snowdingatewaynotice
/obj/item/paper/crumpled/ruins/snowdin/foreshadowing
name = "scribbled note"
info = {"The gateway has been inactive for months, engineers think it's due to the recent drop in tempature fucking with the
circuitry or something. Without a constant supply of resources from Central Command, our stock is getting awfully low. Some of the security members have taken to
using the sparse rifle ammo left to hunting some of the wildlife to try and keep our food supply from emptying. God forbid if the heating goes out, I don't want to
die as a fucking popsicle down here."}
info = {"Somnethings gone VERY wrong here. Jouslen has been mumbling about some weird shit in his cabin during the night and he seems always tired when we're working. I tried to confront him about it and he blew up on me,
telling me to mind my own business. I reported him to the officer, said he'd look into it. We only got another 2 months here before we're pulled for another assignment, so this shit can't go any quicker.."}
/obj/item/paper/crumpled/ruins/snowdin/misc1
name = "Mission Prologue"
info = {"Holy shit, what a rush! Those Nanotrasen bastards didn't even know what hit 'em! All five of us dropped in right on the captain, didn't even have time to yell! We were in and out with that disk in mere minutes!
Crew didn't even know what was happening till the delta alert went down and by then were were already gone. We got a case to drink on the way home to celebrate, fuckin' job well done!"}
Crew didn't even know what was happening till the delta alert went down and by then we were already gone. We got a case to drink on the way home to celebrate, fuckin' job well done!"}
/obj/item/paper/crumpled/ruins/snowdin/keys
/obj/item/paper/crumpled/ruins/snowdin/dontdeadopeninside
name = "scribbled note"
info = {"As a notice for anyone looking to borrow an ATV, some asshat lost the key set for all the vehicles. Nobody has yet to actually come forward about the potential where-abouts, either due to embarrassment or fear of
reprecussions. I hope they enjoy walking through that shit snow during the next shipment because I sure as hell ain't."}
info = {"If you're reading this: GET OUT! The mining go on here has unearthed something that was once-trapped by the layers of ice on this hell-hole. The overseer and Jouslen have gone missing. The officer is
keeping the rest of us on lockdown and I swear to god I keep hearing strange noises outside the walls at night. The gateway link has gone dead and without a supply of resources from Central, we're left
for dead here. We haven't heard anything back from the mining squad either, so I can only assume whatever the fuck they unearthed got them first before coming for us. I don't want to die here.."}
/obj/item/paper/fluff/awaymissions/snowdin/saw_usage
name = "SAW Usage"
info = "YOU SEEN IVAN, WHEN YOU HOLD SAAW LIKE PEESTOL, YOU STRONGER THAN RECOIL FOR FEAR OF HITTING FACE!"
/obj/item/paper/fluff/awaymissions/snowdin/log
name = "Activity Log"
info = {"<b><center>ACTIVITY LOG</b></center><br><br><b>June 3rd</b><br>We've moved to the main base in the valley finally, apparently establishing a listening system on a planet
that never stops fucking snowing is a great idea. There's a few outposts further south we'll be supplying from the main gateway. The summer months are enough already, I can only imagine how bad it'll be during winter.<br><br><b>August 23rd</b><br>
The colder months are finally hitting, some of the machinery seems to be having trouble starting up sometimes. Central sent some portable heaters to help keep the airlocks from
freezing shut along with a couple storage crates with supplies. Nothing on the radio so far, what the hell do they even expect to hear down here, anyway?<br><br><b>September 15th</b>
<br>Another supply shipment through the gateway, they've sent some heavier sets of clothes for the coming winter months. Central said they might encounter issues with shipments
during December to Feburary, so we should try to be frugal with the next shipment.<br><br><b>November 20th</b><br>Final shipment from Central for the next few months. Going outside
for more than 10-15 minutes without losing feeling in your fingers is difficult. We've finally gotten a signal on the radio, it's mostly some weird static though. One of the researchers is trying to decypher it.
<br><br><b>December 10th</b><br>Signal has gotten much stronger, it almost seems like it's coming from under us according to what the researcher managed to decypher. We're waiting from the go from Central before investigating.<br><br>
<i>The rest of the paper seems to be a mixture of scribbles and smudged ink.</i>"}
/obj/item/paper/fluff/awaymissions/snowdin/research_feed
name = "Research Feed"
info = {"<i>A page full of graphs and other detailed infomation on the seismic activity of the surrounding area.</i>"}
/obj/item/paper/fluff/awaymissions/snowdin/log2
name = "Activity Log"
info = {"<b><center>ACTIVITY LOG</b></center><br><br><b>June 14th</b><br>Movement to the second post is finally done. We're located on the southernmost area of the valley with a similar objective as the northern post.
There are two mid-way stops on the eastern and western sides of the valley so movement in between bases isn't horrible. Not too big of a fan of relying on the northern base for
equal supply distribution, though.<br><br><b>August 27h</b><br>First shipment arrived finally, about 4 days after the gateway shipped. Insulation on these buildings is awful, thank god for the spare heaters at least.<br><br>
<b>September 20th</b><br>Another shipment arrival, standard shit. Our radios have been picking up a weird signal during the nights recently, we've sent the transcripts over to the northern
base to be decyphered. Probably some drunk russians or something equally stupid.<br><br><b>November 24th</b><br>We've lost communications with the northern base after recieving the last
shipment of supplies. The snow has really kicked up recently, shits almost like a constant blizzard right now. Maybe it'll drop down soon so we can get a word in.<br><br>
<i>The rest of the paper seems to be a mixture of scribbles and smudged ink.</i>"}
//profile of each of the old crewmembers for the outpost
/obj/item/paper/fluff/awaymissions/snowdin/profile/overseer
name = "Personnel Record AOP#01"
info = {"<b><center>Personnel Log</b></center><br><br><b>Name:</b>Caleb Reed<br><b>Age:</b>38<br><b>Gender:</b>Male<br><b>On-Site Profession:</b>Outpost Overseer<br><br><center><b>Infomation</b></center><br><center>Caleb Reed lead several expeditions
among uncharted planets in search of plasma for Nanotrasen, scouring from hot savanas to freezing arctics. Track record is fairly clean with only incidient including the loss of two researchers during the
expedition of <b>_______</b>, where mis-used of explosive ordinance for tunneling causes a cave-in."}
/obj/item/paper/fluff/awaymissions/snowdin/profile/sec1
name = "Personnel Record AOP#02"
info = {"<b><center>Personnel Log</b></center><br><br><b>Name:</b>James Reed<br><b>Age:</b>43<br><b>Gender:</b>Male<br><b>On-Site Profession:</b>Outpost Security<br><br><center><b>Infomation</b></center><br><center>James Reed has been a part
of Nanotrasen's security force for over 20 years, first joining in 22XX. A clean record and unwavering loyalty to the corperation through numerous deployments to various sites makes him a valuable asset to Natotrasen
when it comes to keeping the peace while prioritizing Nanotrasen privacy matters. "}
/obj/item/paper/fluff/awaymissions/snowdin/profile/hydro1
name = "Personnel Record AOP#03"
info = {"<b><center>Personnel Log</b></center><br><br><b>Name:</b>Katherine Esterdeen<br><b>Age:</b>27<br><b>Gender:</b>Female<br><b>On-Site Profession:</b>Outpost Botanist<br><br><center><b>Infomation</b></center><br><center>Katherine Esterdeen is a recent
graduate with a major in Botany and a PH.D in Ecology. Having a clean record and eager to work, Esterdeen seems to be the right fit for maintaining plants in the middle of nowhere."}
/obj/item/paper/fluff/awaymissions/snowdin/profile/engi1
name = "Personnel Record AOP#04"
info = {"<b><center>Personnel Log</b></center><br><br><b>Name:</b>Rachel Migro<br><b>Age:</b>35<br><b>Gender:</b>Female<br><b>On-Site Profession:</b>Outpost Engineer<br><br><center><b>Infomation</b></center><br><center>Recently certified to be a full-time Journeyman, Rachel has
been assigned various construction projects in the past 5 years. Competent and has no past infractions, should be of little concern."}
/obj/item/paper/fluff/awaymissions/snowdin/profile/research1
name = "Personnel Record AOP#05"
info = {"<b><center>Personnel Log</b></center><br><br><b>Name:</b>Jacob Ullman<br><b>Age:</b>27<br><b>Gender:</b>Male<br><b>On-Site Profession:</b>Outpost Researcher<br><br><center><b>Infomation</b></center><br><center>"}
/obj/item/paper/fluff/awaymissions/snowdin/profile/research2
name = "Personnel Record AOP#06"
info = {"<b><center>Personnel Log</b></center><br><br><b>Name:</b>Elizabeth Queef<br><b>Age:</b>28<br><b>Gender:</b>Female<br><b>On-Site Profession:</b>Outpost Researcher<br><br><center><b>Infomation</b></center><br><center>"}
/obj/item/paper/fluff/awaymissions/snowdin/profile/research3
name = "Personnel Record AOP#07"
info = {"<b><center>Personnel Log</b></center><br><br><b>Name:</b>Jouslen McGee<br><b>Age:</b>38<br><b>Gender:</b>Male<br><b>On-Site Profession:</b>Outpost Researcher<br><br><center><b>Infomation</b></center><br><center>"}
/obj/item/paper/fluff/awaymissions/snowdin/secnotice
name = "Security Notice"
info = {"You have been assigned a position on a listening outpost. Here you'll be watching over several crewmembers assigned to watching signals of the general area.
As not much is expected in terms of issues, we've only assigned one guard per outpost. Crewmembers are expected to keep to their regulated work schedules and may be
disciplined properly if found slacking. Food hoarding is heavily discouraged as all outposts will be sharing from the same shipment every 2-3 months. Hoarding of supplies
should be punished severely as to prevent future incidients. Mutiny and/or rioting should be reported to Central and dealt with swiftly. You're here to secure and protect
Nanotrasen assets, not be a police officer. Do what you must, but make sure it's not messy."}
info = {"YOu have been assigned to this Arctic Post with intention of protecting Nanotrasen assets and ensuring vital infomation is kept secure while the stationed crew obeys protocal. The picked
staff for this post have been pre-screened with no prior incidients on record, but incase of an issue you have been given a single holding cell and instructions to contact Central to terminate the
offending crewmember."}
/obj/item/paper/fluff/awaymissions/snowdin/syndienotice
/obj/item/paper/fluff/awaymissions/snowdin/mining
name = "Assignment Notice"
info = {"You've been assigned as an agent to listen in on Nanotrasen activities from passing ships and nearby stations. The outpost you've been assigned to is under lays of solid
ice and we've supplied you with a scrambler to help avoid Nanotrasen discovery, as they've recently built a listening post of their own aboveground. Get aquainted with your new
crewmates, because you're gonna be here for awhile. Enjoy the free syndicakes."}
/obj/item/paper/crumpled/ruins/snowdin/syndielava
name = "scribbled note"
info = {"Some cracks in the ice nearby have exposed some sort of hidden magma stream under all this shit ice. I don't know whats worse at this point honestly; freezing to death or
burning alive."}
info = {"This cold-ass planet is the new-age equivilant of striking gold. Huge deposits of plasma and literal streams of plasma run through the caverns under all this ice and we're here to mine it all.\
Nanotrasen pays by the pound, so get minin' boys!"}
/obj/item/paper/crumpled/ruins/snowdin/lootstructures
name = "scribbled note"
info = {"From what we've seen so far, theres a ton of iced-over ruins down here in the caves. We sent a few men out to check things out and they never came back, so we decided to
border up majority of the ruins. We've heard some weird shit coming out of these caves and I'm not gonna find out the hard way myself."}
info = {"There's some ruins scattered along the cavern, their walls seem to be made of some sort of super-condensned mixture of ice and snow. We've already barricaded up the ones we've found so far,
since we keep hearing some strange noises from inside. Besides, what sort of fool would wrecklessly run into ancient ruins full of monsters for some old gear, anyway?"}
/obj/item/paper/crumpled/ruins/snowdin/shovel
name = "shoveling duties"
info = {"Snow piles up bad here all-year round, even worse during the winter months. Keeping a constant rotation of shoveling that shit out of the way of the airlocks and keeping the paths decently clear
is a good step towards not getting stuck walking through knee-deep snow."}
//holo disk recording//--
/obj/item/disk/holodisk/snowdin/weregettingpaidright
name = "Conversation #AOP#23"
preset_image_type = /datum/preset_holoimage/researcher
preset_record_text = {"
NAME Jacob Ullman
DELAY 10
SAY Have you gotten anything interesting on the scanners yet? The deep-drilling from the plasma is making it difficult to get anything that isn't useless noise.
DELAY 45
NAME Elizabeth Queef
DELAY 10
SAY Nah. I've been feeding the AI the results for the past 2 weeks to sift through the garbage and haven't seen anything out of the usual, at least whatever Nanotrasen is looking for.
DELAY 45
NAME Jacob Ullman
DELAY 10
SAY Figured as much. Dunno what Nanotrasen expects to find out here past the plasma. At least we're getting paid to fuck around for a couple months while the AI does the hard work.
DELAY 45
NAME Elizabeth Queef
DELAY 10
SAY . . .
DELAY 10
SAY ..We're getting paid?
DELAY 20
NAME Jacob Ullman
DELAY 10
SAY ..We are getting paid, aren't we..?
DELAY 15
PRESET /datum/preset_holoimage/captain
NAME Caleb Reed
DELAY 10
SAY Paid in experience! That's the Nanotrasen Motto!
DELAY 30;"}
/obj/item/disk/holodisk/snowdin/welcometodie
name = "Conversation #AOP#1"
preset_image_type = /datum/preset_holoimage/corgi
preset_record_text = {"
NAME Friendly AI Unit
DELAY 10
SAY Hello! Welcome to the Arctic Post *338-3**$$!
DELAY 30
SAY You have been selected out of $)@! potential candidates for this post!
DELAY 30
SAY Nanotrasen is pleased to have you working in one of the many top-of-the-line research posts within the $%@!! sector!
DELAY 30
SAY Further job assignment infomation can be found at your local security post! Have a secure day!
DELAY 20;"}
/obj/item/disk/holodisk/snowdin/overrun
name = "Conversation #AOP#55"
preset_image_type = /datum/preset_holoimage/nanotrasenprivatesecurity
preset_record_text = {"
NAME James Reed
DELAY 10
SAY Jesus christ, what is that thing??
DELAY 30
PRESET /datum/preset_holoimage/researcher
NAME Elizabeth Queef
DELAY 10
SAY Hell if I know! Just shoot it already!
DELAY 30
PRESET /datum/preset_holoimage/nanotrasenprivatesecurity
NAME James Reed
DELAY 10
SOUND sound/weapons/laser.ogg
DELAY 10
SOUND sound/weapons/laser.ogg
DELAY 10
SOUND sound/weapons/laser.ogg
DELAY 10
SOUND sound/weapons/laser.ogg
DELAY 15
SAY Just go! I'll keep it busy, there's an outpost south of here with an elevator to the surface.
NAME Jacob Ullman
PRESET /datum/preset_holoimage/researcher.
DELAY 15
Say I don't have to be told twice! Let's get the fuck out of here.
DELAY 20;"}
/obj/item/disk/holodisk/snowdin/ripjacob
name = "Conversation #AOP#62"
preset_image_type = /datum/preset_holoimage/researcher
preset_record_text = {"
NAME Jacob Ullman
DELAY 10
SAY Get the elevator called. We got no idea how many of those fuckers are down here and I'd rather get off this planet as soon as possible.
DELAY 45
NAME Elizabeth Queef
DELAY 10
SAY You don't need to tell me twice, I just need to swipe access and then..
DELAY 15
SOUND sound/effects/glassbr1.ogg
DELAY 10
SOUND sound/effects/glassbr2.ogg
DELAY 15
NAME Jacob Ullman
DELAY 10
SAY What the FUCK was that?
DELAY 20
SAY OH FUCK THERE'S MORE OF THEM. CALL FASTER JESUS CHRIST.
DELAY 20
NAME Elizabeth Queef
DELAY 10
SAY DON'T FUCKING RUSH ME ALRIGHT IT'S BEING CALLED.
DELAY 15
SOUND sound/effects/huuu.ogg
DELAY 5
SOUND sound/effects/huuu.ogg
DELAY 15
SOUND sound/effects/woodhit.ogg
DELAY 2
SOUND sound/effects/bodyfall3.ogg
DELAY 5
SOUND sound/effects/meow1.ogg
DELAY 15
NAME Jacob Ullman
DELAY 15
SAY OH FUCK IT'S GOT ME JESUS CHRIIIiiii-
NAME Elizabeth Queef
SAY AAAAAAAAAAAAAAAA FUCK THAT
DELAY 15;"}
//lootspawners//--
@@ -197,6 +550,12 @@
//special items//--
/obj/structure/barricade/wooden/snowed
name = "crude plank barricade"
desc = "This space is blocked off by a wooden barricade. It seems to be covered in a layer of snow."
icon_state = "woodenbarricade-snow"
max_integrity = 125
/obj/item/clothing/under/syndicate/coldres
name = "insulated tactical turtleneck"
desc = "A non-descript and slightly suspicious-looking turtleneck with digital camouflage cargo pants. The interior has been padded with special insulation for both warmth and protection."
@@ -258,10 +617,53 @@
/obj/structure/flora/rock/icy
name = "icy rock"
color = rgb(114,228,250)
color = rgb(204,233,235)
/obj/structure/flora/rock/pile/icy
name = "icey rocks"
color = rgb(114,228,250)
color = rgb(204,233,235)
//decals//--
/obj/effect/turf_decal/snowdin_station_sign
icon_state = "AOP1"
/obj/effect/turf_decal/snowdin_station_sign/two
icon_state = "AOP2"
/obj/effect/turf_decal/snowdin_station_sign/three
icon_state = "AOP3"
/obj/effect/turf_decal/snowdin_station_sign/four
icon_state = "AOP4"
/obj/effect/turf_decal/snowdin_station_sign/five
icon_state = "AOP5"
/obj/effect/turf_decal/snowdin_station_sign/six
icon_state = "AOP6"
/obj/effect/turf_decal/snowdin_station_sign/seven
icon_state = "AOP7"
/obj/effect/turf_decal/snowdin_station_sign/up
icon_state = "AOPU1"
/obj/effect/turf_decal/snowdin_station_sign/up/two
icon_state = "AOPU2"
/obj/effect/turf_decal/snowdin_station_sign/up/three
icon_state = "AOPU3"
/obj/effect/turf_decal/snowdin_station_sign/up/four
icon_state = "AOPU4"
/obj/effect/turf_decal/snowdin_station_sign/up/five
icon_state = "AOPU5"
/obj/effect/turf_decal/snowdin_station_sign/up/six
icon_state = "AOPU6"
/obj/effect/turf_decal/snowdin_station_sign/up/seven
icon_state = "AOPU7"
@@ -23,7 +23,7 @@
name = "Safecode hint spawner"
/obj/effect/landmark/sc_bible_spawner/New()
var/obj/item/storage/book/bible/B = new /obj/item/storage/book/bible/booze(src.loc)
var/obj/item/storage/book/bible/B = new /obj/item/storage/book/bible/booze(loc)
B.name = "The Holy book of the Geometer"
B.deity_name = "Narsie"
B.icon_state = "melted"
@@ -131,7 +131,7 @@ GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]")
new /obj/item/device/soulstone(src)
new /obj/item/clothing/suit/space/hardsuit/cult(src)
//new /obj/item/teleportation_scroll(src)
new /obj/item/ore/diamond(src)
new /obj/item/stack/ore/diamond(src)
/*
* Modified Nar-Sie
+5 -5
View File
@@ -4,7 +4,7 @@
var/material_id = null
export_types = list(
/obj/item/stack/sheet/mineral, /obj/item/stack/tile/mineral,
/obj/item/ore, /obj/item/coin)
/obj/item/stack/ore, /obj/item/coin)
// Yes, it's a base type containing export_types.
// But it has no material_id, so any applies_to check will return false, and these types reduce amount of copypasta a lot
@@ -22,8 +22,8 @@
if(istype(I, /obj/item/stack))
var/obj/item/stack/S = I
amount *= S.amount
else if(istype(I, /obj/item/ore))
amount *= 0.8 // Station's ore redemption equipment is really goddamn good.
if(istype(I, /obj/item/stack/ore))
amount *= 0.8 // Station's ore redemption equipment is really goddamn good.
return round(amount/MINERAL_MATERIAL_AMOUNT)
@@ -84,11 +84,11 @@
material_id = MAT_METAL
export_types = list(
/obj/item/stack/sheet/metal, /obj/item/stack/tile/plasteel,
/obj/item/stack/rods, /obj/item/ore, /obj/item/coin)
/obj/item/stack/rods, /obj/item/stack/ore, /obj/item/coin)
// Glass. Common building material.
/datum/export/material/glass
message = "cm3 of glass"
material_id = MAT_GLASS
export_types = list(/obj/item/stack/sheet/glass, /obj/item/ore,
export_types = list(/obj/item/stack/sheet/glass, /obj/item/stack/ore,
/obj/item/shard)
+25 -2
View File
@@ -825,8 +825,8 @@
/datum/supply_pack/medical/bloodpacks
name = "Blood Pack Variety Crate"
cost = 3500
contains = list(/obj/item/reagent_containers/blood/empty,
/obj/item/reagent_containers/blood/empty,
contains = list(/obj/item/reagent_containers/blood,
/obj/item/reagent_containers/blood,
/obj/item/reagent_containers/blood/APlus,
/obj/item/reagent_containers/blood/AMinus,
/obj/item/reagent_containers/blood/BPlus,
@@ -991,6 +991,29 @@
/obj/item/pizzabox/vegetable,
/obj/item/pizzabox/pineapple)
crate_name = "pizza crate"
var/static/anomalous_box_provided = FALSE
/datum/supply_pack/organic/pizza/fill(obj/structure/closet/crate/C)
. = ..()
if(!anomalous_box_provided)
for(var/obj/item/pizzabox/P in C)
if(prob(1)) //1% chance for each box, so 4% total chance per order
var/obj/item/pizzabox/infinite/fourfiveeight = new(C)
fourfiveeight.boxtag = P.boxtag
qdel(P)
anomalous_box_provided = TRUE
log_game("An anomalous pizza box was provided in a pizza crate at during cargo delivery")
if(prob(50))
addtimer(CALLBACK(src, .proc/anomalous_pizza_report), rand(300, 1800))
else
message_admins("An anomalous pizza box was silently created with no command report in a pizza crate delivery.")
break
/datum/supply_pack/organic/pizza/proc/anomalous_pizza_report()
print_command_report("[station_name()], our anomalous materials divison has reported a missing object that is highly likely to have been sent to your station during a routine cargo \
delivery. Please search all crates and manifests provided with the delivery and return the object if is located. The object resembles a standard <b>\[DATA EXPUNGED\]</b> and is to be \
considered <b>\[REDACTED\]</b> and returned at your leisure. Note that objects the anomaly produces are specifically attuned exactly to the individual opening the anomaly; regardless \
of species, the individual will find the object edible and it will taste great according to their personal definitions, which vary significantly based on person and species.")
/datum/supply_pack/organic/cream_piee
name = "High-yield Clown-grade Cream Pie Crate"
+10 -4
View File
@@ -539,10 +539,10 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
tokens[ckey] = cid_check_reconnect()
sleep(15 SECONDS) //Longer sleep here since this would trigger if a client tries to reconnect manually because the inital reconnect failed
//we sleep after telling the client to reconnect, so if we still exist something is up
log_access("Forced disconnect: [key] [computer_id] [address] - CID randomizer check")
qdel(src)
return TRUE
@@ -585,10 +585,10 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
tokens[ckey] = cid_check_reconnect()
sleep(5 SECONDS) //browse is queued, we don't want them to disconnect before getting the browse() command.
//we sleep after telling the client to reconnect, so if we still exist something is up
log_access("Forced disconnect: [key] [computer_id] [address] - CID randomizer check")
qdel(src)
return TRUE
@@ -709,6 +709,12 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
if (isnull(new_size))
CRASH("change_view called without argument.")
//CIT CHANGES START HERE - makes change_view change DEFAULT_VIEW to 15x15 depending on preferences
if(prefs && CONFIG_GET(string/default_view))
if(!prefs.widescreenpref && new_size == CONFIG_GET(string/default_view))
new_size = "15x15"
//END OF CIT CHANGES
view = new_size
apply_clickcatcher()
if (isliving(mob))
+6 -4
View File
@@ -186,9 +186,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/action_buttons_screen_locs = list()
var/screenshake = 100
var/damagescreenshake = 2
var/arousable = TRUE
/datum/preferences/New(client/C)
parent = C
@@ -386,6 +383,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "High"
dat += "</a><br>"
dat += "<b>Widescreen:</b> <a href='?_src_=prefs;preference=widescreenpref'>[widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]</a><br>"
dat += "<b>Screen Shake:</b> <a href='?_src_=prefs;preference=screenshake'>[(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]</a><br>"
if (!user.client.prefs.screenshake==0)
@@ -1195,7 +1194,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.r_wings_list
if(new_wings)
features["wings"] = new_wings
if("moth_wings")
var/new_moth_wings
new_moth_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.moth_wings_list
@@ -1565,6 +1564,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["exhibitionist"] = TRUE
else
features["exhibitionist"] = FALSE
if("widescreenpref")
widescreenpref = !widescreenpref
user.client.change_view(CONFIG_GET(string/default_view))
if ("screenshake")
var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num
if (!isnull(desiredshake))
@@ -200,6 +200,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["arousable"] >> arousable
S["screenshake"] >> screenshake
S["damagescreenshake"] >> damagescreenshake
S["widescreenpref"] >> widescreenpref
//try to fix any outdated data if necessary
if(needs_update >= 0)
@@ -229,6 +230,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
screenshake = sanitize_integer(screenshake, 0, 800, initial(screenshake))
damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake))
widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref))
return 1
@@ -275,6 +277,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["screenshake"], screenshake)
WRITE_FILE(S["damagescreenshake"], damagescreenshake)
WRITE_FILE(S["arousable"], arousable)
WRITE_FILE(S["widescreenpref"], widescreenpref)
return 1
+1 -1
View File
@@ -402,4 +402,4 @@
if(client && client.prefs.uses_glasses_colour && glasses_equipped)
add_client_colour(G.glass_colour_type)
else
remove_client_colour(G.glass_colour_type)
remove_client_colour(G.glass_colour_type)
@@ -40,6 +40,63 @@
icon_state = "fake-moustache"
flags_inv = HIDEFACE
/obj/item/clothing/mask/fakemoustache/italian
name = "italian moustache"
desc = "Made from authentic Italian moustache hairs. Gives the wearer an irresistable urge to gesticulate wildly."
/obj/item/clothing/mask/fakemoustache/italian/speechModification(message)
if(copytext(message, 1, 2) != "*")
message = " [message] "
message = replacetext(message," mom "," mamma ")
message = replacetext(message," dad "," pappa ")
message = replacetext(message," baby ",pick(" bambino "," little sausage roll "))
message = replacetext(message,"spicy","a-spicy")
message = replacetext(message,"I'm","I'm-a")
message = replacetext(message," friend "," enemy-a ")
message = replacetext(message," enemy "," friend-a ")
message = replacetext(message,"traitor","mafioso")
message = replacetext(message," operative "," greek ")
message = replacetext(message," op "," greek ")
message = replacetext(message," ops "," greeks")
message = replacetext(message," operative "," greek")
message = replacetext(message," operatives "," greeks")
message = replacetext(message," nuke"," spiciest-a meatball")
message = replacetext(message," good"," molto bene")
message = replacetext(message," why"," for-a what reason")
message = replacetext(message," my "," my-a ")
message = replacetext(message,"it's","it's-a")
message = replacetext(message," bad"," molto male")
message = replacetext(message," sing "," sing-a ")
message = replacetext(message," cook "," cook-a ")
message = replacetext(message," want "," want-a ")
message = replacetext(message," what's "," what's-a ")
message = replacetext(message," shitcurity"," carabinieri")
message = replacetext(message," shitsec"," carabinieri")
message = replacetext(message," and "," and-a ")
message = replacetext(message," am "," am-a ")
message = replacetext(message," assistant "," goombah ")
message = replacetext(message," greytide "," curvisti ")
message = replacetext(message," greytider "," curvisti ")
message = replacetext(message," captain "," capitano ")
message = replacetext(message," sec "," polizia ")
message = replacetext(message," security "," polizia ")
message = replacetext(message,"cheese",pick("parmesano","gorgonzola"))
message = replacetext(message," meat",pick(" pepperoni"," prosciutto"))
message = replacetext(message,"who's","who's-a")
message = replacetext(message,"hello",pick("ciao","buongiorno"))
message = replacetext(message," bye ",pick(" ciao "," arrivederci "))
message = replacetext(message,"thing","thing-a")
message = replacetext(message,"whose","whose-a")
message = replacetext(message,"thanks","grazie")
message = replacetext(message," wine"," vino")
message = replacetext(message,"could","could-a")
message = replacetext(message," use"," use-a")
message = replacetext(message," make"," make-a")
message = replacetext(message,"spaghetti", "SPAGHETT")
if(prob(3))
message += pick(" Ravioli, ravioli, give me the formuoli!"," Mamma-mia!"," Mamma-mia! That's a spicy meat-ball!", " La la la la la funiculi funicula!")
return trim(message)
/obj/item/clothing/mask/joy
name = "joy mask"
desc = "Express your happiness or hide your sorrows with this laughing face with crying tears of joy cutout."
+1 -1
View File
@@ -80,7 +80,7 @@
reqs = list(/obj/item/restraints/handcuffs/cable = 1,
/obj/item/stack/rods = 1,
/obj/item/device/assembly/igniter = 1,
/obj/item/ore/bluespace_crystal = 1)
/obj/item/stack/ore/bluespace_crystal = 1)
time = 40
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
+23
View File
@@ -0,0 +1,23 @@
/datum/round_event_control/heart_attack
name = "Random Heart Attack"
typepath = /datum/round_event/heart_attack
weight = 20
max_occurrences = 2
earliest_start = 12000
min_players = 40 // To avoid shafting lowpop
/datum/round_event/heart_attack/start()
var/list/heart_attack_contestants = list()
for(var/mob/living/carbon/H in shuffle(GLOB.player_list))
if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.viruses) || H.undergoing_cardiac_arrest())
continue
if(H.satiety <= -100)
heart_attack_contestants[H] = 1.15
else
heart_attack_contestants[H] = 1
if(LAZYLEN(heart_attack_contestants))
var/mob/living/carbon/C = pickweight(heart_attack_contestants)
var/datum/disease/D = new /datum/disease/heart_failure
C.ForceContractDisease(D)
notify_ghosts("[C] is beginning to have a heart attack!", enter_link="<a href=?src=[REF(C)];orbit=1>(Click to orbit)</a>", source=C, action=NOTIFY_ORBIT)
+4 -3
View File
@@ -1,8 +1,9 @@
/datum/round_event_control/vent_clog
name = "Clogged Vents"
typepath = /datum/round_event/vent_clog
weight = 35
weight = 25
max_occurrences = 1
min_players = 50
/datum/round_event/vent_clog
announceWhen = 1
@@ -27,9 +28,9 @@
if(vent && vent.loc)
var/datum/reagents/R = new/datum/reagents(1000)
R.my_atom = vent
R.add_reagent(get_random_reagent_id(), 1000)
R.add_reagent(get_random_reagent_id(), 250)
var/datum/effect_system/foam_spread/long/foam = new
var/datum/effect_system/foam_spread/foam = new
foam.set_up(200, get_turf(vent), R)
foam.start()
@@ -223,6 +223,8 @@
slice.name = "slice of [name]"
if(desc != initial(desc))
slice.desc = "[desc]"
if(foodtype != initial(foodtype))
slice.foodtype = foodtype //if something happens that overrode our food type, make sure the slice carries that over
/obj/item/reagent_containers/food/snacks/proc/generate_trash(atom/location)
if(trash)
@@ -16,7 +16,7 @@
foodtype = GRAIN | DAIRY | VEGETABLES
/obj/item/reagent_containers/food/snacks/pizza/margherita
name = "margherita"
name = "pizza margherita"
desc = "The most cheezy pizza in galaxy."
icon_state = "pizzamargherita"
slice_path = /obj/item/reagent_containers/food/snacks/pizzaslice/margherita
+43 -1
View File
@@ -16,6 +16,7 @@
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
var/open = FALSE
var/can_open_on_fall = TRUE //if FALSE, this pizza box will never open if it falls from a stack
var/boxtag = ""
var/list/boxes = list()
@@ -239,7 +240,7 @@
var/obj/item/pizzabox/P = V
var/fall_dir = pick(GLOB.alldirs)
step(P, fall_dir)
if(P.pizza && prob(50)) //rip pizza
if(P.pizza && P.can_open_on_fall && prob(50)) //rip pizza
P.open = TRUE
P.pizza.forceMove(get_turf(P))
fall_dir = pick(GLOB.alldirs)
@@ -290,3 +291,44 @@
. = ..()
pizza = new /obj/item/reagent_containers/food/snacks/pizza/pineapple(src)
boxtag = "Honolulu Chew"
//An anomalous pizza box that, when opened, produces the opener's favorite kind of pizza.
/obj/item/pizzabox/infinite
resistance_flags = FIRE_PROOF | LAVA_PROOF | ACID_PROOF //hard to destroy
can_open_on_fall = FALSE
var/list/pizza_types = list(
/obj/item/reagent_containers/food/snacks/pizza/meat = 1,
/obj/item/reagent_containers/food/snacks/pizza/mushroom = 1,
/obj/item/reagent_containers/food/snacks/pizza/margherita = 1,
/obj/item/reagent_containers/food/snacks/pizza/sassysage = 0.8,
/obj/item/reagent_containers/food/snacks/pizza/vegetable = 0.8,
/obj/item/reagent_containers/food/snacks/pizza/pineapple = 0.5,
/obj/item/reagent_containers/food/snacks/pizza/donkpocket = 0.3,
/obj/item/reagent_containers/food/snacks/pizza/dank = 0.1) //pizzas here are weighted by chance to be someone's favorite
var/static/list/pizza_preferences
/obj/item/pizzabox/infinite/Initialize()
. = ..()
if(!pizza_preferences)
pizza_preferences = list()
/obj/item/pizzabox/infinite/examine(mob/user)
..()
if(isobserver(user))
to_chat(user, "<span class='deadsay'>This pizza box is anomalous, and will produce infinite pizza.</span>")
/obj/item/pizzabox/infinite/attack_self(mob/living/user)
QDEL_NULL(pizza)
if(ishuman(user))
attune_pizza(user)
. = ..()
/obj/item/pizzabox/infinite/proc/attune_pizza(mob/living/carbon/human/noms) //tonight on "proc names I never thought I'd type"
if(!pizza_preferences[noms.ckey])
pizza_preferences[noms.ckey] = pickweight(pizza_types)
if(noms.mind && noms.mind.assigned_role == "Botanist")
pizza_preferences[noms.ckey] = /obj/item/reagent_containers/food/snacks/pizza/dank
var/obj/item/pizza_type = pizza_preferences[noms.ckey]
pizza = new pizza_type (src)
pizza.foodtype = noms.dna.species.liked_food //it's our favorite!
@@ -140,7 +140,7 @@
/datum/reagent/water = 10,
/obj/item/reagent_containers/glass/bowl = 1,
/obj/item/reagent_containers/food/snacks/grown/banana = 1,
/obj/item/ore/bananium = 1
/obj/item/stack/ore/bananium = 1
)
result = /obj/item/reagent_containers/food/snacks/soup/clownstears
subcategory = CAT_SOUP
@@ -491,7 +491,7 @@
name = "electronic drone"
icon_state = "setup_drone"
desc = "It's a case, for building mobile electronics with."
w_class = WEIGHT_CLASS_SMALL
w_class = WEIGHT_CLASS_BULKY
max_components = IC_MAX_SIZE_BASE * 3
max_complexity = IC_COMPLEXITY_BASE * 3

Some files were not shown because too many files have changed in this diff Show More