Merge branch 'master' into bunnypack
This commit is contained in:
@@ -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"
|
||||
@@ -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)),\
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 //
|
||||
/////////////
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
if(..())
|
||||
return
|
||||
var/mob/living/silicon/S = usr
|
||||
S.sensor_mode()
|
||||
S.toggle_sensors()
|
||||
|
||||
|
||||
/datum/hud/ai
|
||||
|
||||
+20
-19
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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!")
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
@@ -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].")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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)]'>"
|
||||
|
||||
@@ -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])"
|
||||
..()
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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')
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user