@@ -254,6 +254,12 @@
|
|||||||
#define FBP_POSI "Positronic"
|
#define FBP_POSI "Positronic"
|
||||||
#define FBP_DRONE "Drone"
|
#define FBP_DRONE "Drone"
|
||||||
|
|
||||||
|
// Similar to above but for borgs.
|
||||||
|
// Seperate defines are unfortunately required since borgs display the brain differently for some reason.
|
||||||
|
#define BORG_BRAINTYPE_CYBORG "Cyborg"
|
||||||
|
#define BORG_BRAINTYPE_POSI "Robot"
|
||||||
|
#define BORG_BRAINTYPE_DRONE "Drone"
|
||||||
|
|
||||||
// 'Regular' species.
|
// 'Regular' species.
|
||||||
#define SPECIES_HUMAN "Human"
|
#define SPECIES_HUMAN "Human"
|
||||||
#define SPECIES_HUMAN_VATBORN "Vatborn"
|
#define SPECIES_HUMAN_VATBORN "Vatborn"
|
||||||
|
|||||||
@@ -29,3 +29,15 @@
|
|||||||
// unidentified object due to a typo or some other unique difference in message output.
|
// unidentified object due to a typo or some other unique difference in message output.
|
||||||
#define ROGUELIKE_MESSAGE_NOTHING "Nothing happens."
|
#define ROGUELIKE_MESSAGE_NOTHING "Nothing happens."
|
||||||
#define ROGUELIKE_MESSAGE_UNKNOWN "Something happened, but you're not sure what."
|
#define ROGUELIKE_MESSAGE_UNKNOWN "Something happened, but you're not sure what."
|
||||||
|
|
||||||
|
// Cataloguer defines.
|
||||||
|
|
||||||
|
// Defines about the reward point scaling. Adjust these if you want points to be more or less common.
|
||||||
|
#define CATALOGUER_REWARD_TRIVIAL 10 // Very easy things that would take little effort to find, like the grass or an NT banner.
|
||||||
|
#define CATALOGUER_REWARD_EASY 40 // Fairly easy things, like the common Sif creatures, cave crystals, and the base spiders
|
||||||
|
#define CATALOGUER_REWARD_MEDIUM 160 // Takes effort to find, like PoI specific things like black boxes, or rarer mobs like the special spiders.
|
||||||
|
#define CATALOGUER_REWARD_HARD 640 // Requires significant effort, such as scanning all spiders or other compilation-based discoveries, or clearing a dangerous PoI.
|
||||||
|
#define CATALOGUER_REWARD_SUPERHARD 2560 // Very difficult and dangerous, such as scanning the Advanced Dark Gygax.
|
||||||
|
|
||||||
|
// 5 10 20 40 80 160
|
||||||
|
// 10 40 160 640 2560
|
||||||
@@ -177,7 +177,7 @@ Proc for attack log creation, because really why not
|
|||||||
else
|
else
|
||||||
return pick("chest", "groin")
|
return pick("chest", "groin")
|
||||||
|
|
||||||
/proc/do_mob(mob/user , mob/target, time = 30, target_zone = 0, uninterruptible = 0, progress = 1)
|
/proc/do_mob(mob/user , mob/target, time = 30, target_zone = 0, uninterruptible = FALSE, progress = TRUE, ignore_movement = FALSE)
|
||||||
if(!user || !target)
|
if(!user || !target)
|
||||||
return 0
|
return 0
|
||||||
var/user_loc = user.loc
|
var/user_loc = user.loc
|
||||||
@@ -190,37 +190,41 @@ Proc for attack log creation, because really why not
|
|||||||
|
|
||||||
var/endtime = world.time+time
|
var/endtime = world.time+time
|
||||||
var/starttime = world.time
|
var/starttime = world.time
|
||||||
. = 1
|
. = TRUE
|
||||||
while (world.time < endtime)
|
while (world.time < endtime)
|
||||||
stoplag(1)
|
stoplag(1)
|
||||||
if (progress)
|
if (progress)
|
||||||
progbar.update(world.time - starttime)
|
progbar.update(world.time - starttime)
|
||||||
if(!user || !target)
|
if(!user || !target)
|
||||||
. = 0
|
. = FALSE
|
||||||
break
|
break
|
||||||
if(uninterruptible)
|
if(uninterruptible)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if(!user || user.incapacitated() || user.loc != user_loc)
|
if(!user || user.incapacitated())
|
||||||
. = 0
|
. = FALSE
|
||||||
break
|
break
|
||||||
|
|
||||||
if(target.loc != target_loc)
|
if(user.loc != user_loc && !ignore_movement)
|
||||||
. = 0
|
. = FALSE
|
||||||
|
break
|
||||||
|
|
||||||
|
if(target.loc != target_loc && !ignore_movement)
|
||||||
|
. = FALSE
|
||||||
break
|
break
|
||||||
|
|
||||||
if(user.get_active_hand() != holding)
|
if(user.get_active_hand() != holding)
|
||||||
. = 0
|
. = FALSE
|
||||||
break
|
break
|
||||||
|
|
||||||
if(target_zone && user.zone_sel.selecting != target_zone)
|
if(target_zone && user.zone_sel.selecting != target_zone)
|
||||||
. = 0
|
. = FALSE
|
||||||
break
|
break
|
||||||
|
|
||||||
if (progbar)
|
if (progbar)
|
||||||
qdel(progbar)
|
qdel(progbar)
|
||||||
|
|
||||||
/proc/do_after(mob/user, delay, atom/target = null, needhand = 1, progress = 1, var/incapacitation_flags = INCAPACITATION_DEFAULT)
|
/proc/do_after(mob/user, delay, atom/target = null, needhand = TRUE, progress = TRUE, incapacitation_flags = INCAPACITATION_DEFAULT, ignore_movement = FALSE, max_distance = null)
|
||||||
if(!user)
|
if(!user)
|
||||||
return 0
|
return 0
|
||||||
if(!delay)
|
if(!delay)
|
||||||
@@ -245,17 +249,29 @@ Proc for attack log creation, because really why not
|
|||||||
if(progress)
|
if(progress)
|
||||||
progbar.update(world.time - starttime)
|
progbar.update(world.time - starttime)
|
||||||
|
|
||||||
if(!user || user.incapacitated(incapacitation_flags) || user.loc != original_loc)
|
if(!user || user.incapacitated(incapacitation_flags))
|
||||||
. = 0
|
. = FALSE
|
||||||
break
|
break
|
||||||
|
|
||||||
if(target_loc && (QDELETED(target) || target_loc != target.loc))
|
if(user.loc != original_loc && !ignore_movement)
|
||||||
. = 0
|
. = FALSE
|
||||||
|
break
|
||||||
|
|
||||||
|
if(target_loc && (QDELETED(target)))
|
||||||
|
. = FALSE
|
||||||
|
break
|
||||||
|
|
||||||
|
if(target && target_loc != target.loc && !ignore_movement)
|
||||||
|
. = FALSE
|
||||||
break
|
break
|
||||||
|
|
||||||
if(needhand)
|
if(needhand)
|
||||||
if(user.get_active_hand() != holding)
|
if(user.get_active_hand() != holding)
|
||||||
. = 0
|
. = FALSE
|
||||||
|
break
|
||||||
|
|
||||||
|
if(max_distance && target && get_dist(user, target) > max_distance)
|
||||||
|
. = FALSE
|
||||||
break
|
break
|
||||||
|
|
||||||
if(progbar)
|
if(progbar)
|
||||||
|
|||||||
176
code/datums/looping_sounds/sequence.dm
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
// These looping sounds work off of a sequence of things (usually letters or numbers) given to them.
|
||||||
|
|
||||||
|
// Base sequencer type.
|
||||||
|
/datum/looping_sound/sequence
|
||||||
|
var/sequence = "The quick brown fox jumps over the lazy dog" // The string to iterate over.
|
||||||
|
var/position = 1 // Where we are inside the sequence. IE the index we're on for the above.
|
||||||
|
var/loop_sequence = TRUE // If it should loop the entire sequence upon reaching the end. Otherwise stop() is called.
|
||||||
|
var/repeat_sequnce_delay = 2 SECONDS // How long to wait when reaching the end, if the above var is true, in deciseconds.
|
||||||
|
var/next_iteration_delay = 0
|
||||||
|
|
||||||
|
/datum/looping_sound/sequence/vv_edit_var(var_name, var_value)
|
||||||
|
if(var_name == "sequence")
|
||||||
|
set_new_sequence(var_value)
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/datum/looping_sound/sequence/proc/iterate_on_sequence()
|
||||||
|
var/data = get_data_from_position()
|
||||||
|
next_iteration_delay = process_data(data)
|
||||||
|
increment_position()
|
||||||
|
|
||||||
|
/datum/looping_sound/sequence/proc/get_data_from_position()
|
||||||
|
return sequence[position]
|
||||||
|
|
||||||
|
// Override to do something based on the input.
|
||||||
|
/datum/looping_sound/sequence/proc/process_data(input)
|
||||||
|
return
|
||||||
|
|
||||||
|
// Changes the sequence, and sets the position back to the start.
|
||||||
|
/datum/looping_sound/sequence/proc/set_new_sequence(new_sequence)
|
||||||
|
sequence = new_sequence
|
||||||
|
reset_position()
|
||||||
|
|
||||||
|
// Called to advance the position, and handle reaching the end if so.
|
||||||
|
/datum/looping_sound/sequence/proc/increment_position()
|
||||||
|
position++
|
||||||
|
if(position > get_max_position())
|
||||||
|
reached_end_of_sequence()
|
||||||
|
|
||||||
|
/datum/looping_sound/sequence/proc/get_max_position()
|
||||||
|
return length(sequence)
|
||||||
|
|
||||||
|
/datum/looping_sound/sequence/proc/reset_position()
|
||||||
|
position = 1
|
||||||
|
|
||||||
|
// Called when the sequence is finished being iterated over.
|
||||||
|
// If looping is on, the position will be reset, otherwise processing will stop.
|
||||||
|
/datum/looping_sound/sequence/proc/reached_end_of_sequence()
|
||||||
|
if(loop_sequence)
|
||||||
|
next_iteration_delay += repeat_sequnce_delay
|
||||||
|
reset_position()
|
||||||
|
else
|
||||||
|
stop()
|
||||||
|
|
||||||
|
/datum/looping_sound/sequence/sound_loop(starttime)
|
||||||
|
iterate_on_sequence()
|
||||||
|
|
||||||
|
timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), next_iteration_delay, TIMER_STOPPABLE)
|
||||||
|
|
||||||
|
#define MORSE_DOT "*" // Yes this is an asterisk but its easier to see on a computer compared to a period.
|
||||||
|
#define MORSE_DASH "-"
|
||||||
|
#define MORSE_BASE_DELAY 1 // If you change this you will also need to change [dot|dash]_soundfile variables.
|
||||||
|
|
||||||
|
// This implements an automatic conversion of text (the sequence) into audible morse code.
|
||||||
|
// This can be useful for flavor purposes. For 'real' usage its suggested to also display the sequence in text form, for the benefit of those without sound.
|
||||||
|
/datum/looping_sound/sequence/morse
|
||||||
|
// This is just to pass validation in the base type.
|
||||||
|
mid_sounds = list('sound/effects/tones/440_sine_01.ogg')
|
||||||
|
mid_length = 1
|
||||||
|
opacity_check = TRUE // So we don't have to constantly hear it when out of sight.
|
||||||
|
|
||||||
|
// Dots.
|
||||||
|
// In Morse Code, the dot's length is one unit.
|
||||||
|
var/dot_soundfile = 'sound/effects/tones/440_sine_01.ogg' // The sound file to play for a 'dot'.
|
||||||
|
var/dot_delay = MORSE_BASE_DELAY // How long the sound above plays for, in deciseconds.
|
||||||
|
|
||||||
|
// Dashes.
|
||||||
|
// In Morse Code, a dash's length is equal to three units (or three dots).
|
||||||
|
var/dash_soundfile = 'sound/effects/tones/440_sine_03.ogg' // The sound file to play for a 'dash'.
|
||||||
|
var/dash_delay = MORSE_BASE_DELAY * 3 // Same as the dot delay, except for the dash sound.
|
||||||
|
|
||||||
|
// Spaces.
|
||||||
|
// In Morse Code, a space's length is equal to one unit (or one dot).
|
||||||
|
var/spaces_between_sounds = MORSE_BASE_DELAY // How many spaces are between parts of the same letter.
|
||||||
|
var/spaces_between_letters = MORSE_BASE_DELAY * 3 // How many spaces are between different letters in the same word.
|
||||||
|
var/spaces_between_words = MORSE_BASE_DELAY * 7 // How many spaces are between different words.
|
||||||
|
|
||||||
|
// Morse Alphabet.
|
||||||
|
// Note that it is case-insensative. 'A' and 'a' will make the same sounds.
|
||||||
|
// Unfortunately there isn't a nice way to implement procedure signs w/o the space inbetween the letters.
|
||||||
|
// Also some of the punctuation isn't super offical/widespread in real life but its the future so *shrug.
|
||||||
|
var/static/list/morse_alphabet = list(
|
||||||
|
"A" = list("*", "-"),
|
||||||
|
"B" = list("-", "*", "*", "*"),
|
||||||
|
"C" = list("-", "*", "-", "*"),
|
||||||
|
"D" = list("-", "*", "*"),
|
||||||
|
"E" = list("*"),
|
||||||
|
"F" = list("*", "*", "-", "*"),
|
||||||
|
"G" = list("-", "-", "*"),
|
||||||
|
"H" = list("*", "*", "*", "*"),
|
||||||
|
"I" = list("*", "*"),
|
||||||
|
"J" = list("*", "-", "-", "-"),
|
||||||
|
"K" = list("-", "*", "-"),
|
||||||
|
"L" = list("*", "-", "*", "*"),
|
||||||
|
"M" = list("*", "*"),
|
||||||
|
"N" = list("-", "*"),
|
||||||
|
"O" = list("-", "-", "-"),
|
||||||
|
"P" = list("*", "-", "-", "*"),
|
||||||
|
"Q" = list("-", "-", "*", "-"),
|
||||||
|
"R" = list("*", "-", "*"),
|
||||||
|
"S" = list("*", "*", "*"),
|
||||||
|
"T" = list("-"),
|
||||||
|
"U" = list("*", "*", "-"),
|
||||||
|
"V" = list("*", "*", "*", "-"),
|
||||||
|
"W" = list("*", "-", "-"),
|
||||||
|
"X" = list("-", "*", "*", "-"),
|
||||||
|
"Y" = list("-", "*", "-", "-"),
|
||||||
|
"Z" = list("-", "-", "*", "*"),
|
||||||
|
|
||||||
|
"1" = list("*", "-", "-", "-", "-"),
|
||||||
|
"2" = list("*", "*", "-", "-", "-"),
|
||||||
|
"3" = list("*", "*", "*", "-", "-"),
|
||||||
|
"4" = list("*", "*", "*", "*", "-"),
|
||||||
|
"5" = list("*", "*", "*", "*", "*"),
|
||||||
|
"6" = list("-", "*", "*", "*", "*"),
|
||||||
|
"7" = list("-", "-", "*", "*", "*"),
|
||||||
|
"8" = list("-", "-", "-", "*", "*"),
|
||||||
|
"9" = list("-", "-", "-", "-", "*"),
|
||||||
|
"0" = list("-", "-", "-", "-", "-"),
|
||||||
|
|
||||||
|
"." = list("*", "-", "*", "-", "*", "-"),
|
||||||
|
"," = list("-", "-", "*", "*", "-", "-"),
|
||||||
|
"?" = list("*", "*", "-", "-", "*", "*"),
|
||||||
|
"'" = list("*", "-", "-", "-", "-", "*"),
|
||||||
|
"!" = list("-", "*", "-", "*", "-", "-"),
|
||||||
|
"/" = list("-", "*", "*", "-", "*"),
|
||||||
|
"(" = list("-", "*", "-", "-", "*"),
|
||||||
|
")" = list("-", "*", "-", "-", "*", "-"),
|
||||||
|
"&" = list("*", "-", "*", "*", "*"),
|
||||||
|
":" = list("-", "-", "-", "*", "*", "*"),
|
||||||
|
";" = list("-", "*", "-", "*", "-", "*"),
|
||||||
|
"=" = list("-", "*", "*", "*", "-"),
|
||||||
|
"+" = list("*", "-", "*", "-", "*"),
|
||||||
|
"-" = list("-", "*", "*", "*", "*", "-"),
|
||||||
|
"_" = list("*", "*", "-", "-", "*", "-"),
|
||||||
|
"\""= list("*", "-", "*", "*", "-", "*"),
|
||||||
|
"$" = list("*", "*", "*", "-", "*", "*", "-"),
|
||||||
|
"@" = list("*", "-", "-", "*", "-", "*"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
/datum/looping_sound/sequence/morse/process_data(letter)
|
||||||
|
letter = uppertext(letter) // Make it case-insensative.
|
||||||
|
|
||||||
|
// If it's whitespace, treat it as a (Morse) space.
|
||||||
|
if(letter == " ")
|
||||||
|
return spaces_between_words
|
||||||
|
|
||||||
|
if(!(letter in morse_alphabet))
|
||||||
|
CRASH("Encountered invalid character in morse sequence \"[letter]\".")
|
||||||
|
return
|
||||||
|
|
||||||
|
// So I heard you like sequences...
|
||||||
|
// Play a sequence of sounds while inside the current iteration of the outer sequence.
|
||||||
|
var/list/instructions = morse_alphabet[letter]
|
||||||
|
for(var/sound in instructions)
|
||||||
|
if(sound == MORSE_DOT)
|
||||||
|
play(dot_soundfile)
|
||||||
|
sleep(dot_delay)
|
||||||
|
else // It's a dash otherwise.
|
||||||
|
play(dash_soundfile)
|
||||||
|
sleep(dash_delay)
|
||||||
|
sleep(spaces_between_sounds)
|
||||||
|
return spaces_between_letters
|
||||||
|
|
||||||
|
#undef MORSE_DOT
|
||||||
|
#undef MORSE_DASH
|
||||||
@@ -426,9 +426,28 @@
|
|||||||
icon = 'icons/obj/doors/shuttledoors_vertical.dmi'
|
icon = 'icons/obj/doors/shuttledoors_vertical.dmi'
|
||||||
assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical
|
assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock
|
||||||
|
name = "Precursor Alpha Object - Doors"
|
||||||
|
desc = "This object appears to be used in order to restrict or allow access to \
|
||||||
|
rooms based on its physical state. In other words, a door. \
|
||||||
|
Despite being designed and created by unknown ancient alien hands, this door has \
|
||||||
|
a large number of similarities to the conventional airlock, such as being driven by \
|
||||||
|
electricity, opening and closing by physically moving, and being air tight. \
|
||||||
|
It also operates by responding to signals through internal electrical conduits. \
|
||||||
|
These characteristics make it possible for one with experience with a multitool \
|
||||||
|
to manipulate the door.\
|
||||||
|
<br><br>\
|
||||||
|
The symbol on the door does not match any living species' patterns, giving further \
|
||||||
|
implications that this door is very old, and yet it remains operational after \
|
||||||
|
thousands of years. It is unknown if that is due to superb construction, or \
|
||||||
|
unseen autonomous maintenance having been performed."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/machinery/door/airlock/alien
|
/obj/machinery/door/airlock/alien
|
||||||
name = "alien airlock"
|
name = "alien airlock"
|
||||||
desc = "You're fairly sure this is a door."
|
desc = "You're fairly sure this is a door."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock)
|
||||||
icon = 'icons/obj/doors/Dooralien.dmi'
|
icon = 'icons/obj/doors/Dooralien.dmi'
|
||||||
explosion_resistance = 20
|
explosion_resistance = 20
|
||||||
secured_wires = TRUE
|
secured_wires = TRUE
|
||||||
|
|||||||
@@ -3,14 +3,40 @@
|
|||||||
This code is slightly more documented than normal, as requested by XSI on IRC.
|
This code is slightly more documented than normal, as requested by XSI on IRC.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/turret
|
||||||
|
name = "Turrets"
|
||||||
|
desc = "This imtimidating machine is essentially an automated gun. It is able to \
|
||||||
|
scan its immediate environment, and if it determines that a threat is nearby, it will \
|
||||||
|
open up, aim the barrel of the weapon at the threat, and engage it until the threat \
|
||||||
|
goes away, it dies (if using a lethal gun), or the turret is destroyed. This has made them \
|
||||||
|
well suited for long term defense for a static position, as electricity costs much \
|
||||||
|
less than hiring a person to stand around. Despite this, the lack of a sapient entity's \
|
||||||
|
judgement has sometimes lead to tragedy when turrets are poorly configured.\
|
||||||
|
<br><br>\
|
||||||
|
Early models generally had simple designs, and would shoot at anything that moved, with only \
|
||||||
|
the option to disable it remotely for maintenance or to let someone pass. More modern iterations \
|
||||||
|
of turrets have instead replaced those simple systems with intricate optical sensors and \
|
||||||
|
image recognition software that allow the turret to distinguish between several kinds of \
|
||||||
|
entities, and to only engage whatever their owners configured them to fight against.\
|
||||||
|
Some models also have the ability to switch between a lethal and non-lethal mode.\
|
||||||
|
<br><br>\
|
||||||
|
Today's cutting edge in static defense development has shifted away from improving the \
|
||||||
|
software of the turret, and instead towards the hardware. The newest solutions for \
|
||||||
|
automated protection includes new hardware capabilities such as thicker armor, more \
|
||||||
|
advanced integrated weapons, and some may even have been built with EM hardening in \
|
||||||
|
mind."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
|
|
||||||
#define TURRET_PRIORITY_TARGET 2
|
#define TURRET_PRIORITY_TARGET 2
|
||||||
#define TURRET_SECONDARY_TARGET 1
|
#define TURRET_SECONDARY_TARGET 1
|
||||||
#define TURRET_NOT_TARGET 0
|
#define TURRET_NOT_TARGET 0
|
||||||
|
|
||||||
/obj/machinery/porta_turret
|
/obj/machinery/porta_turret
|
||||||
name = "turret"
|
name = "turret"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/turret)
|
||||||
icon = 'icons/obj/turrets.dmi'
|
icon = 'icons/obj/turrets.dmi'
|
||||||
icon_state = "turretCover"
|
icon_state = "turret_cover"
|
||||||
anchored = 1
|
anchored = 1
|
||||||
|
|
||||||
density = 0
|
density = 0
|
||||||
@@ -18,6 +44,17 @@
|
|||||||
idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power
|
idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power
|
||||||
active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
|
active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
|
||||||
power_channel = EQUIP //drains power from the EQUIPMENT channel
|
power_channel = EQUIP //drains power from the EQUIPMENT channel
|
||||||
|
req_one_access = list(access_security, access_heads)
|
||||||
|
|
||||||
|
// icon_states for turrets.
|
||||||
|
// These are for the turret covers.
|
||||||
|
var/closed_state = "turret_cover" // For when it is closed.
|
||||||
|
var/raising_state = "popup" // When turret is opening.
|
||||||
|
var/opened_state = "open" // When fully opened.
|
||||||
|
var/lowering_state = "popdown" // When closing.
|
||||||
|
var/gun_active_state = "target_prism" // The actual gun's icon_state when active.
|
||||||
|
var/gun_disabled_state = "grey_target_prism" // Gun sprite when depowered/disabled.
|
||||||
|
var/gun_destroyed_state = "destroyed_target_prism" // Turret sprite for when the turret dies.
|
||||||
|
|
||||||
var/raised = 0 //if the turret cover is "open" and the turret is raised
|
var/raised = 0 //if the turret cover is "open" and the turret is raised
|
||||||
var/raising= 0 //if the turret is currently opening or closing its cover
|
var/raising= 0 //if the turret is currently opening or closing its cover
|
||||||
@@ -66,6 +103,7 @@
|
|||||||
var/can_salvage = TRUE // If false, salvaging doesn't give you anything.
|
var/can_salvage = TRUE // If false, salvaging doesn't give you anything.
|
||||||
|
|
||||||
/obj/machinery/porta_turret/crescent
|
/obj/machinery/porta_turret/crescent
|
||||||
|
req_one_access = list(access_cent_specops)
|
||||||
enabled = 0
|
enabled = 0
|
||||||
ailock = 1
|
ailock = 1
|
||||||
check_synth = 0
|
check_synth = 0
|
||||||
@@ -76,12 +114,19 @@
|
|||||||
check_anomalies = 1
|
check_anomalies = 1
|
||||||
check_all = 0
|
check_all = 0
|
||||||
|
|
||||||
|
/obj/machinery/porta_turret/can_catalogue(mob/user) // Dead turrets can't be scanned.
|
||||||
|
if(stat & BROKEN)
|
||||||
|
to_chat(user, span("warning", "\The [src] was destroyed, so it cannot be scanned."))
|
||||||
|
return FALSE
|
||||||
|
return ..()
|
||||||
|
|
||||||
/obj/machinery/porta_turret/stationary
|
/obj/machinery/porta_turret/stationary
|
||||||
ailock = 1
|
ailock = 1
|
||||||
lethal = 1
|
lethal = 1
|
||||||
installation = /obj/item/weapon/gun/energy/laser
|
installation = /obj/item/weapon/gun/energy/laser
|
||||||
|
|
||||||
/obj/machinery/porta_turret/stationary/syndie // Generic turrets for POIs that need to not shoot their buddies.
|
/obj/machinery/porta_turret/stationary/syndie // Generic turrets for POIs that need to not shoot their buddies.
|
||||||
|
req_one_access = list(access_syndicate)
|
||||||
enabled = TRUE
|
enabled = TRUE
|
||||||
check_all = TRUE
|
check_all = TRUE
|
||||||
faction = "syndicate" // Make sure this equals the faction that the mobs in the POI have or they will fight each other.
|
faction = "syndicate" // Make sure this equals the faction that the mobs in the POI have or they will fight each other.
|
||||||
@@ -89,13 +134,30 @@
|
|||||||
/obj/machinery/porta_turret/ai_defense
|
/obj/machinery/porta_turret/ai_defense
|
||||||
name = "defense turret"
|
name = "defense turret"
|
||||||
desc = "This variant appears to be much more durable."
|
desc = "This variant appears to be much more durable."
|
||||||
|
req_one_access = list(access_synth) // Just in case.
|
||||||
installation = /obj/item/weapon/gun/energy/xray // For the armor pen.
|
installation = /obj/item/weapon/gun/energy/xray // For the armor pen.
|
||||||
health = 250 // Since lasers do 40 each.
|
health = 250 // Since lasers do 40 each.
|
||||||
maxhealth = 250
|
maxhealth = 250
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_turret
|
||||||
|
name = "Precursor Alpha Object - Turrets"
|
||||||
|
desc = "An autonomous defense turret created by unknown ancient aliens. It utilizes an \
|
||||||
|
integrated laser projector to harm, firing a cyan beam at the target. The signal processing \
|
||||||
|
of this mechanism appears to be radically different to conventional electronics used by modern \
|
||||||
|
technology, which appears to be much less susceptible to external electromagnetic influences.\
|
||||||
|
<br><br>\
|
||||||
|
This makes the turret be very resistant to the effects of an EM pulse. It is unknown if whatever \
|
||||||
|
species that built the turret had intended for it to have that quality, or if it was an incidental \
|
||||||
|
quirk of how they designed their electronics."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/obj/machinery/porta_turret/alien // The kind used on the UFO submap.
|
/obj/machinery/porta_turret/alien // The kind used on the UFO submap.
|
||||||
name = "interior anti-boarding turret"
|
name = "interior anti-boarding turret"
|
||||||
desc = "A very tough looking turret made by alien hands."
|
desc = "A very tough looking turret made by alien hands."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_turret)
|
||||||
|
icon_state = "alien_turret_cover"
|
||||||
|
req_one_access = list(access_alien)
|
||||||
installation = /obj/item/weapon/gun/energy/alien
|
installation = /obj/item/weapon/gun/energy/alien
|
||||||
enabled = TRUE
|
enabled = TRUE
|
||||||
lethal = TRUE
|
lethal = TRUE
|
||||||
@@ -104,10 +166,18 @@
|
|||||||
health = 250 // Similar to the AI turrets.
|
health = 250 // Similar to the AI turrets.
|
||||||
maxhealth = 250
|
maxhealth = 250
|
||||||
|
|
||||||
|
closed_state = "alien_turret_cover"
|
||||||
|
raising_state = "alien_popup"
|
||||||
|
opened_state = "alien_open"
|
||||||
|
lowering_state = "alien_popdown"
|
||||||
|
gun_active_state = "alien_gun"
|
||||||
|
gun_disabled_state = "alien_gun_disabled"
|
||||||
|
gun_destroyed_state = "alien_gun_destroyed"
|
||||||
|
|
||||||
/obj/machinery/porta_turret/alien/destroyed // Turrets that are already dead, to act as a warning of what the rest of the submap contains.
|
/obj/machinery/porta_turret/alien/destroyed // Turrets that are already dead, to act as a warning of what the rest of the submap contains.
|
||||||
name = "broken interior anti-boarding turret"
|
name = "broken interior anti-boarding turret"
|
||||||
desc = "A very tough looking turret made by alien hands. This one looks destroyed, thankfully."
|
desc = "A very tough looking turret made by alien hands. This one looks destroyed, thankfully."
|
||||||
icon_state = "destroyed_target_prism"
|
icon_state = "alien_gun_destroyed"
|
||||||
stat = BROKEN
|
stat = BROKEN
|
||||||
can_salvage = FALSE // So you need to actually kill a turret to get the alien gun.
|
can_salvage = FALSE // So you need to actually kill a turret to get the alien gun.
|
||||||
|
|
||||||
@@ -118,11 +188,7 @@
|
|||||||
check_all = TRUE
|
check_all = TRUE
|
||||||
can_salvage = FALSE // So you can't just twoshot a turret and get a fancy gun
|
can_salvage = FALSE // So you can't just twoshot a turret and get a fancy gun
|
||||||
|
|
||||||
/obj/machinery/porta_turret/New()
|
/obj/machinery/porta_turret/Initialize()
|
||||||
..()
|
|
||||||
req_access.Cut()
|
|
||||||
req_one_access = list(access_security, access_heads)
|
|
||||||
|
|
||||||
//Sets up a spark system
|
//Sets up a spark system
|
||||||
spark_system = new /datum/effect/effect/system/spark_spread
|
spark_system = new /datum/effect/effect/system/spark_spread
|
||||||
spark_system.set_up(5, 0, src)
|
spark_system.set_up(5, 0, src)
|
||||||
@@ -130,20 +196,35 @@
|
|||||||
|
|
||||||
setup()
|
setup()
|
||||||
|
|
||||||
/obj/machinery/porta_turret/crescent/New()
|
// If turrets ever switch overlays, this will need to be cached and reapplied each time overlays_cut() is called.
|
||||||
..()
|
var/image/turret_opened_overlay = image(icon, opened_state)
|
||||||
req_one_access.Cut()
|
turret_opened_overlay.layer = layer-0.1
|
||||||
req_access = list(access_cent_specops)
|
add_overlay(turret_opened_overlay)
|
||||||
|
return ..()
|
||||||
/obj/machinery/porta_turret/alien/New()
|
|
||||||
..()
|
|
||||||
req_one_access.Cut()
|
|
||||||
req_access = list(access_alien)
|
|
||||||
|
|
||||||
/obj/machinery/porta_turret/Destroy()
|
/obj/machinery/porta_turret/Destroy()
|
||||||
qdel(spark_system)
|
qdel(spark_system)
|
||||||
spark_system = null
|
spark_system = null
|
||||||
. = ..()
|
return ..()
|
||||||
|
|
||||||
|
/obj/machinery/porta_turret/update_icon()
|
||||||
|
if(stat & BROKEN) // Turret is dead.
|
||||||
|
icon_state = gun_destroyed_state
|
||||||
|
|
||||||
|
else if(raised || raising)
|
||||||
|
// Turret is open.
|
||||||
|
if(powered() && enabled)
|
||||||
|
// Trying to shoot someone.
|
||||||
|
icon_state = gun_active_state
|
||||||
|
|
||||||
|
else
|
||||||
|
// Disabled.
|
||||||
|
icon_state = gun_disabled_state
|
||||||
|
|
||||||
|
else
|
||||||
|
// Its closed.
|
||||||
|
icon_state = closed_state
|
||||||
|
|
||||||
|
|
||||||
/obj/machinery/porta_turret/proc/setup()
|
/obj/machinery/porta_turret/proc/setup()
|
||||||
var/obj/item/weapon/gun/energy/E = installation //All energy-based weapons are applicable
|
var/obj/item/weapon/gun/energy/E = installation //All energy-based weapons are applicable
|
||||||
@@ -204,31 +285,6 @@
|
|||||||
iconholder = 1
|
iconholder = 1
|
||||||
icon_color = "green"
|
icon_color = "green"
|
||||||
|
|
||||||
var/list/turret_icons
|
|
||||||
|
|
||||||
/obj/machinery/porta_turret/update_icon()
|
|
||||||
if(!turret_icons)
|
|
||||||
turret_icons = list()
|
|
||||||
turret_icons["open"] = image(icon, "openTurretCover")
|
|
||||||
|
|
||||||
underlays.Cut()
|
|
||||||
underlays += turret_icons["open"]
|
|
||||||
|
|
||||||
if(stat & BROKEN)
|
|
||||||
icon_state = "destroyed_target_prism"
|
|
||||||
else if(raised || raising)
|
|
||||||
if(powered() && enabled)
|
|
||||||
if(iconholder)
|
|
||||||
//lasers have a orange icon
|
|
||||||
icon_state = "[icon_color]_target_prism"
|
|
||||||
else
|
|
||||||
//almost everything has a blue icon
|
|
||||||
icon_state = "target_prism"
|
|
||||||
else
|
|
||||||
icon_state = "grey_target_prism"
|
|
||||||
else
|
|
||||||
icon_state = "turretCover"
|
|
||||||
|
|
||||||
/obj/machinery/porta_turret/proc/isLocked(mob/user)
|
/obj/machinery/porta_turret/proc/isLocked(mob/user)
|
||||||
if(ailock && issilicon(user))
|
if(ailock && issilicon(user))
|
||||||
to_chat(user, "<span class='notice'>There seems to be a firewall preventing you from accessing this device.</span>")
|
to_chat(user, "<span class='notice'>There seems to be a firewall preventing you from accessing this device.</span>")
|
||||||
@@ -634,7 +690,7 @@ var/list/turret_icons
|
|||||||
|
|
||||||
var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc)
|
var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc)
|
||||||
flick_holder.layer = layer + 0.1
|
flick_holder.layer = layer + 0.1
|
||||||
flick("popup", flick_holder)
|
flick(raising_state, flick_holder)
|
||||||
sleep(10)
|
sleep(10)
|
||||||
qdel(flick_holder)
|
qdel(flick_holder)
|
||||||
|
|
||||||
@@ -655,7 +711,7 @@ var/list/turret_icons
|
|||||||
|
|
||||||
var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc)
|
var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc)
|
||||||
flick_holder.layer = layer + 0.1
|
flick_holder.layer = layer + 0.1
|
||||||
flick("popdown", flick_holder)
|
flick(lowering_state, flick_holder)
|
||||||
sleep(10)
|
sleep(10)
|
||||||
qdel(flick_holder)
|
qdel(flick_holder)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/obj/mecha/combat/marauder
|
/obj/mecha/combat/marauder
|
||||||
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
|
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
|
||||||
name = "Marauder"
|
name = "Marauder"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/marauder)
|
||||||
icon_state = "marauder"
|
icon_state = "marauder"
|
||||||
initial_icon = "marauder"
|
initial_icon = "marauder"
|
||||||
step_in = 5
|
step_in = 5
|
||||||
@@ -33,6 +34,7 @@
|
|||||||
/obj/mecha/combat/marauder/seraph
|
/obj/mecha/combat/marauder/seraph
|
||||||
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
|
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
|
||||||
name = "Seraph"
|
name = "Seraph"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/seraph)
|
||||||
icon_state = "seraph"
|
icon_state = "seraph"
|
||||||
initial_icon = "seraph"
|
initial_icon = "seraph"
|
||||||
operation_req_access = list(access_cent_creed)
|
operation_req_access = list(access_cent_creed)
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
/obj/mecha/medical/odysseus/
|
/obj/mecha/medical/odysseus/
|
||||||
desc = "These exosuits are developed and produced by Vey-Med. (© All rights reserved)."
|
desc = "These exosuits are developed and produced by Vey-Med. (© All rights reserved)."
|
||||||
name = "Odysseus"
|
name = "Odysseus"
|
||||||
|
catalogue_data = list(
|
||||||
|
/datum/category_item/catalogue/technology/odysseus,
|
||||||
|
/datum/category_item/catalogue/information/organization/vey_med
|
||||||
|
)
|
||||||
icon_state = "odysseus"
|
icon_state = "odysseus"
|
||||||
initial_icon = "odysseus"
|
initial_icon = "odysseus"
|
||||||
step_in = 2
|
step_in = 2
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/obj/mecha/working/hoverpod
|
/obj/mecha/working/hoverpod
|
||||||
desc = "Stubby and round, this space-capable craft is an ancient favorite."
|
desc = "Stubby and round, this space-capable craft is an ancient favorite."
|
||||||
name = "Hover Pod"
|
name = "Hover Pod"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/hoverpod)
|
||||||
icon_state = "engineering_pod"
|
icon_state = "engineering_pod"
|
||||||
initial_icon = "engineering_pod"
|
initial_icon = "engineering_pod"
|
||||||
internal_damage_threshold = 80
|
internal_damage_threshold = 80
|
||||||
|
|||||||
@@ -23,13 +23,16 @@
|
|||||||
name = "\improper NanoTrasen banner"
|
name = "\improper NanoTrasen banner"
|
||||||
icon_state = "banner-nt"
|
icon_state = "banner-nt"
|
||||||
desc = "A banner with NanoTrasen's logo on it."
|
desc = "A banner with NanoTrasen's logo on it."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/nanotrasen)
|
||||||
|
|
||||||
/obj/item/weapon/banner/solgov
|
/obj/item/weapon/banner/solgov
|
||||||
name = "\improper SolGov banner"
|
name = "\improper SolGov banner"
|
||||||
icon_state = "banner-solgov"
|
icon_state = "banner-solgov"
|
||||||
desc = "A banner with the symbol of the Solar Confederate Government."
|
desc = "A banner with the symbol of the Solar Confederate Government."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/solgov)
|
||||||
|
|
||||||
/obj/item/weapon/banner/virgov
|
/obj/item/weapon/banner/virgov
|
||||||
name = "\improper VirGov banner"
|
name = "\improper VirGov banner"
|
||||||
icon_state = "banner-virgov"
|
icon_state = "banner-virgov"
|
||||||
desc = "A banner with the symbol of the local government, the Vir Governmental Authority, also known as VirGov."
|
desc = "A banner with the symbol of the local government, the Vir Governmental Authority, also known as VirGov."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/virgov)
|
||||||
@@ -68,9 +68,24 @@
|
|||||||
desc = "Optimised and stripped-down version of a regular multitool."
|
desc = "Optimised and stripped-down version of a regular multitool."
|
||||||
toolspeed = 0.5
|
toolspeed = 0.5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_multitool
|
||||||
|
name = "Precursor Alpha Object - Pulse Tool"
|
||||||
|
desc = "This ancient object appears to be an electrical tool. \
|
||||||
|
It has a simple mechanism at the handle, which will cause a pulse of \
|
||||||
|
energy to be emitted from the head of the tool. This can be used on a \
|
||||||
|
conductive object such as a wire, in order to send a pulse signal through it.\
|
||||||
|
<br><br>\
|
||||||
|
These qualities make this object somewhat similar in purpose to the common \
|
||||||
|
multitool, and can probably be used for tasks such as direct interfacing with \
|
||||||
|
an airlock, if one knows how."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/item/device/multitool/alien
|
/obj/item/device/multitool/alien
|
||||||
name = "alien multitool"
|
name = "alien multitool"
|
||||||
desc = "An omni-technological interface."
|
desc = "An omni-technological interface."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_multitool)
|
||||||
icon = 'icons/obj/abductor.dmi'
|
icon = 'icons/obj/abductor.dmi'
|
||||||
icon_state = "multitool"
|
icon_state = "multitool"
|
||||||
toolspeed = 0.1
|
toolspeed = 0.1
|
||||||
|
|||||||
@@ -27,9 +27,24 @@
|
|||||||
icon_state = "red_crowbar"
|
icon_state = "red_crowbar"
|
||||||
item_state = "crowbar_red"
|
item_state = "crowbar_red"
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_crowbar
|
||||||
|
name = "Precursor Alpha Object - Hard Light Pry Tool"
|
||||||
|
desc = "An object which bears striking resemblence to the common crowbar. \
|
||||||
|
It appears to also serve a similar purpose, being used for prying. Unlike \
|
||||||
|
a crowbar, however, this object is made of some form of 'hard light'.\
|
||||||
|
<br><br>\
|
||||||
|
There is a visible switch on the base of the tool, which controls the \
|
||||||
|
hard light side of the tool. When the switch is used, the shape of \
|
||||||
|
the tool changes, with the hard light moving and making a prying motion. \
|
||||||
|
This allows the user to pry something with no physical effort beyond keeping \
|
||||||
|
the tool aligned while in use."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/item/weapon/tool/crowbar/alien
|
/obj/item/weapon/tool/crowbar/alien
|
||||||
name = "alien crowbar"
|
name = "alien crowbar"
|
||||||
desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
|
desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_crowbar)
|
||||||
icon = 'icons/obj/abductor.dmi'
|
icon = 'icons/obj/abductor.dmi'
|
||||||
usesound = 'sound/weapons/sonic_jackhammer.ogg'
|
usesound = 'sound/weapons/sonic_jackhammer.ogg'
|
||||||
icon_state = "crowbar"
|
icon_state = "crowbar"
|
||||||
|
|||||||
@@ -67,9 +67,24 @@
|
|||||||
/obj/item/weapon/tool/screwdriver/is_screwdriver()
|
/obj/item/weapon/tool/screwdriver/is_screwdriver()
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_screwdriver
|
||||||
|
name = "Precursor Alpha Object - Hard Light Torgue Tool"
|
||||||
|
desc = "This appears to be a tool, with a solid handle, and a thin hard light \
|
||||||
|
shaft, with a tip at the end. On the handle appears to be two mechanisms that \
|
||||||
|
causes the hard light section to spin at a high speed while held down, in a \
|
||||||
|
similar fashion as an electric drill. One makes it spin clockwise, the other \
|
||||||
|
counter-clockwise.\
|
||||||
|
<br><br>\
|
||||||
|
The hard light tip is able to shift its shape to a degree when pressed into \
|
||||||
|
a solid receptacle. This allows it to be able to function on many kinds of \
|
||||||
|
fastener, which includes the screws."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/item/weapon/tool/screwdriver/alien
|
/obj/item/weapon/tool/screwdriver/alien
|
||||||
name = "alien screwdriver"
|
name = "alien screwdriver"
|
||||||
desc = "An ultrasonic screwdriver."
|
desc = "An ultrasonic screwdriver."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_screwdriver)
|
||||||
icon = 'icons/obj/abductor.dmi'
|
icon = 'icons/obj/abductor.dmi'
|
||||||
icon_state = "screwdriver_a"
|
icon_state = "screwdriver_a"
|
||||||
item_state = "screwdriver_black"
|
item_state = "screwdriver_black"
|
||||||
|
|||||||
@@ -374,9 +374,34 @@
|
|||||||
toolspeed = 2
|
toolspeed = 2
|
||||||
eye_safety_modifier = 1 // Safer on eyes.
|
eye_safety_modifier = 1 // Safer on eyes.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_welder
|
||||||
|
name = "Precursor Alpha Object - Self Refueling Exothermic Tool"
|
||||||
|
desc = "An unwieldly tool which somewhat resembles a weapon, due to \
|
||||||
|
having a prominent trigger attached to the part which would presumably \
|
||||||
|
have been held by whatever had created this object. When the trigger is \
|
||||||
|
held down, a small but very high temperature flame shoots out from the \
|
||||||
|
tip of the tool. The grip is able to be held by human hands, however the \
|
||||||
|
shape makes it somewhat awkward to hold.\
|
||||||
|
<br><br>\
|
||||||
|
The tool appears to utilize an unknown fuel to light and maintain the \
|
||||||
|
flame. What is more unusual, is that the fuel appears to replenish itself. \
|
||||||
|
How it does this is not known presently, however experimental human-made \
|
||||||
|
welders have been known to have a similar quality.\
|
||||||
|
<br><br>\
|
||||||
|
Interestingly, the flame is able to cut through a wide array of materials, \
|
||||||
|
such as iron, steel, stone, lead, plasteel, and even durasteel. Yet, it is unable \
|
||||||
|
to cut the unknown material that itself and many other objects made by this \
|
||||||
|
precursor civilization have made. This raises questions on the properties of \
|
||||||
|
that material, and how difficult it would have been to work with. This tool \
|
||||||
|
does demonstrate, however, that the alien fuel cannot melt precursor beams, walls, \
|
||||||
|
or other structual elements, making it rather limited for their \
|
||||||
|
deconstruction purposes."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/item/weapon/weldingtool/alien
|
/obj/item/weapon/weldingtool/alien
|
||||||
name = "alien welding tool"
|
name = "alien welding tool"
|
||||||
desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
|
desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_welder)
|
||||||
icon = 'icons/obj/abductor.dmi'
|
icon = 'icons/obj/abductor.dmi'
|
||||||
icon_state = "welder"
|
icon_state = "welder"
|
||||||
toolspeed = 0.1
|
toolspeed = 0.1
|
||||||
|
|||||||
@@ -43,9 +43,24 @@
|
|||||||
/obj/item/weapon/tool/wirecutters/is_wirecutter()
|
/obj/item/weapon/tool/wirecutters/is_wirecutter()
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_wirecutters
|
||||||
|
name = "Precursor Alpha Object - Wire Seperator"
|
||||||
|
desc = "An object appearing to have a tool shape. It has two handles, and two \
|
||||||
|
sides which are attached to each other in the center. At the end on each side \
|
||||||
|
is a sharp cutting edge, made from a seperate material than the rest of the \
|
||||||
|
tool.\
|
||||||
|
<br><br>\
|
||||||
|
This tool appears to serve the same purpose as conventional wirecutters, due \
|
||||||
|
to how similar the shapes are. If so, this implies that the creators of this \
|
||||||
|
object also may utilize flexible cylindrical strands of metal to transmit \
|
||||||
|
energy and signals, just as humans do."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/item/weapon/tool/wirecutters/alien
|
/obj/item/weapon/tool/wirecutters/alien
|
||||||
name = "alien wirecutters"
|
name = "alien wirecutters"
|
||||||
desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
|
desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_wirecutters)
|
||||||
icon = 'icons/obj/abductor.dmi'
|
icon = 'icons/obj/abductor.dmi'
|
||||||
icon_state = "cutters"
|
icon_state = "cutters"
|
||||||
toolspeed = 0.1
|
toolspeed = 0.1
|
||||||
|
|||||||
@@ -25,9 +25,26 @@
|
|||||||
usesound = 'sound/items/drill_use.ogg'
|
usesound = 'sound/items/drill_use.ogg'
|
||||||
toolspeed = 0.5
|
toolspeed = 0.5
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_wrench
|
||||||
|
name = "Precursor Alpha Object - Fastener Torque Tool"
|
||||||
|
desc = "This is an object that has a distinctive tool shape. \
|
||||||
|
It has a handle on one end, with a simple mechanism attached to it. \
|
||||||
|
On the other end is the head of the tool, with two sides each glowing \
|
||||||
|
a different color. The head opens up towards the top, in a similar shape \
|
||||||
|
as a conventional wrench.\
|
||||||
|
<br><br>\
|
||||||
|
When an object is placed into the head section of the tool, the tool appears \
|
||||||
|
to force the object to be turned in a specific direction. The direction can be \
|
||||||
|
inverted by pressing down on the mechanism on the handle. It is not known if \
|
||||||
|
this tool was intended by its creators to tighten fasteners or if it has a less obvious \
|
||||||
|
purpose, however it is very well suited to act in a wrench's capacity regardless."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/item/weapon/tool/wrench/alien
|
/obj/item/weapon/tool/wrench/alien
|
||||||
name = "alien wrench"
|
name = "alien wrench"
|
||||||
desc = "A polarized wrench. It causes anything placed between the jaws to turn."
|
desc = "A polarized wrench. It causes anything placed between the jaws to turn."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_wrench)
|
||||||
icon = 'icons/obj/abductor.dmi'
|
icon = 'icons/obj/abductor.dmi'
|
||||||
icon_state = "wrench"
|
icon_state = "wrench"
|
||||||
usesound = 'sound/effects/empulse.ogg'
|
usesound = 'sound/effects/empulse.ogg'
|
||||||
|
|||||||
@@ -186,6 +186,7 @@
|
|||||||
name = "mysterious potted bulbs"
|
name = "mysterious potted bulbs"
|
||||||
desc = "This is a mysterious looking plant. Touching the bulbs cause them to shrink."
|
desc = "This is a mysterious looking plant. Touching the bulbs cause them to shrink."
|
||||||
icon_state = "plant-07"
|
icon_state = "plant-07"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/flora/eyebulbs)
|
||||||
|
|
||||||
/obj/structure/flora/pottedplant/smalltree
|
/obj/structure/flora/pottedplant/smalltree
|
||||||
name = "small potted tree"
|
name = "small potted tree"
|
||||||
@@ -199,6 +200,7 @@
|
|||||||
light_range = 2
|
light_range = 2
|
||||||
light_power = 0.6
|
light_power = 0.6
|
||||||
light_color = "#33CCFF"
|
light_color = "#33CCFF"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/flora/sif_tree)
|
||||||
|
|
||||||
/obj/structure/flora/pottedplant/orientaltree
|
/obj/structure/flora/pottedplant/orientaltree
|
||||||
name = "potted oriental tree"
|
name = "potted oriental tree"
|
||||||
@@ -296,6 +298,19 @@
|
|||||||
/obj/structure/flora/sif
|
/obj/structure/flora/sif
|
||||||
icon = 'icons/obj/flora/sifflora.dmi'
|
icon = 'icons/obj/flora/sifflora.dmi'
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/flora/subterranean_bulbs
|
||||||
|
name = "Sivian Flora - Subterranean Bulbs"
|
||||||
|
desc = "A plant which is native to Sif, it continues the trend of being a bioluminescent specimen. These plants \
|
||||||
|
are generally suited for conditions experienced in caverns, which are generally dark and cold. It is not \
|
||||||
|
known why this plant evolved to be bioluminescent, however this property has, unintentionally, allowed for \
|
||||||
|
it to spread much farther than before, with the assistance of humans.\
|
||||||
|
<br><br>\
|
||||||
|
In Sif's early history, Sivian settlers found this plant while they were establishing mines. Their ability \
|
||||||
|
to emit low, but consistant amounts of light made them desirable to the settlers. They would often cultivate \
|
||||||
|
this plant inside man-made tunnels and mines to act as a backup source of light that would not need \
|
||||||
|
electricity. This technique has saved many lost miners, and this practice continues to this day."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/structure/flora/sif/subterranean
|
/obj/structure/flora/sif/subterranean
|
||||||
name = "subterranean plant"
|
name = "subterranean plant"
|
||||||
desc = "This is a subterranean plant. It's bulbous ends glow faintly."
|
desc = "This is a subterranean plant. It's bulbous ends glow faintly."
|
||||||
@@ -303,15 +318,25 @@
|
|||||||
light_range = 2
|
light_range = 2
|
||||||
light_power = 0.6
|
light_power = 0.6
|
||||||
light_color = "#FF6633"
|
light_color = "#FF6633"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/flora/subterranean_bulbs)
|
||||||
|
|
||||||
/obj/structure/flora/sif/subterranean/Initialize()
|
/obj/structure/flora/sif/subterranean/Initialize()
|
||||||
icon_state = "[initial(icon_state)][rand(1,2)]"
|
icon_state = "[initial(icon_state)][rand(1,2)]"
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/flora/eyebulbs
|
||||||
|
name = "Sivian Flora - Eyebulbs"
|
||||||
|
desc = "A plant native to Sif. On the end of its stems are bulbs which visually resemble \
|
||||||
|
eyes, which shrink when touched. One theory is that the bulbs are a result of mimicry, appearing as eyeballs to protect from predators.<br><br>\
|
||||||
|
These plants have no known use."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/structure/flora/sif/eyes
|
/obj/structure/flora/sif/eyes
|
||||||
name = "mysterious bulbs"
|
name = "mysterious bulbs"
|
||||||
desc = "This is a mysterious looking plant. They kind of look like eyeballs. Creepy."
|
desc = "This is a mysterious looking plant. They kind of look like eyeballs. Creepy."
|
||||||
icon_state = "eyeplant"
|
icon_state = "eyeplant"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/flora/eyebulbs)
|
||||||
|
|
||||||
/obj/structure/flora/sif/eyes/Initialize()
|
/obj/structure/flora/sif/eyes/Initialize()
|
||||||
icon_state = "[initial(icon_state)][rand(1,3)]"
|
icon_state = "[initial(icon_state)][rand(1,3)]"
|
||||||
|
|||||||
@@ -229,6 +229,16 @@
|
|||||||
|
|
||||||
// Sif trees
|
// Sif trees
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/flora/sif_tree
|
||||||
|
name = "Sivian Flora - Tree"
|
||||||
|
desc = "The damp, shaded environment of Sif's most common variety of tree provides an ideal environment for a wide \
|
||||||
|
variety of bioluminescent bacteria. The soft glow of the microscopic organisms in turn attracts several native microphagous \
|
||||||
|
animals which act as an effective dispersal method. By this mechanism, new trees and bacterial colonies often sprout in \
|
||||||
|
unison, having formed a symbiotic relationship over countless years of evolution.\
|
||||||
|
<br><br>\
|
||||||
|
Wood-like material can be obtained from this by cutting it down with a bladed tool."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
/obj/structure/flora/tree/sif
|
/obj/structure/flora/tree/sif
|
||||||
name = "glowing tree"
|
name = "glowing tree"
|
||||||
desc = "It's a tree, except this one seems quite alien. It glows a deep blue."
|
desc = "It's a tree, except this one seems quite alien. It glows a deep blue."
|
||||||
@@ -236,6 +246,7 @@
|
|||||||
icon_state = "tree_sif"
|
icon_state = "tree_sif"
|
||||||
base_state = "tree_sif"
|
base_state = "tree_sif"
|
||||||
product = /obj/item/stack/material/log/sif
|
product = /obj/item/stack/material/log/sif
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/flora/sif_tree)
|
||||||
|
|
||||||
/obj/structure/flora/tree/sif/Initialize()
|
/obj/structure/flora/tree/sif/Initialize()
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|||||||
@@ -39,11 +39,58 @@
|
|||||||
icon_state = "experiment-open"
|
icon_state = "experiment-open"
|
||||||
interaction_message = "<span class='warning'>You don't see any mechanism to close this thing.</span>"
|
interaction_message = "<span class='warning'>You don't see any mechanism to close this thing.</span>"
|
||||||
|
|
||||||
|
|
||||||
|
// Obtained by scanning both a void core and void cell.
|
||||||
|
// The reward is a good chunk of points and some faulty physics wank.
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_void_power
|
||||||
|
name = "Precursor Alpha Technology - Void Power"
|
||||||
|
desc = "Several types of precursor objects observed so far appear to be driven by electricity, however the \
|
||||||
|
source appears to be from self contained objects, with no apparent means of generation being visible.\
|
||||||
|
To anyone with a basic understanding of physics, that should not be possible, due to appearing to be a \
|
||||||
|
perpetual motion machine.\
|
||||||
|
<br><br>\
|
||||||
|
This phenomenon has been given the term 'void power' by this device, until adaquate information becomes available. \
|
||||||
|
Several possible explainations exists for this behaviour;\
|
||||||
|
<br>\
|
||||||
|
<ul>\
|
||||||
|
<li>* These objects do, in fact, power themselves for free, and the modern understanding of the physical world \
|
||||||
|
is in fact incorrect. This is the most obvious answer, but it is very unlikely to be true.</li>\
|
||||||
|
<li>* The objects draw from an unknown source of energy that exists at all points in space, or at least where the \
|
||||||
|
void powered machine was found, that presently cannot be detected or determined, and converts that energy into electrical energy \
|
||||||
|
to drive the machine it is inside of.</li>\
|
||||||
|
<li>* The objects appear to power themselves, but are actually giving the appearance of being a closed system, when instead \
|
||||||
|
an unknown, external object or machine is transferring power through an unknown means to the primary system being \
|
||||||
|
powered, acting as a non-physical conduit. This might be the most likely explaination, however it would open many new \
|
||||||
|
questions as well, such as how the hypothesized external machine is able to transfer power without any physical \
|
||||||
|
interactions inbetween, or the distance between the true source of power and the void powered object, which could \
|
||||||
|
be vast, possibly across star systems or even originating from outside the galaxy.</li>\
|
||||||
|
</ul>\
|
||||||
|
Regardless of the method, it is remarkable how the electrical systems have resisted entrophy and remained functional to this day. \
|
||||||
|
Unfortunately, the extreme rarity of these objects, combined with small throughput, means that humanity will not become a \
|
||||||
|
post-scarcity civilization from this discovery, but instead might have a few permanent flashlights."
|
||||||
|
unlocked_by_all = list(
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_void_core,
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_void_cell
|
||||||
|
)
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_void_core
|
||||||
|
name = "Precursor Alpha Object - Void Core"
|
||||||
|
desc = "This is a very enigmatic machine. Scans show that electricity is being outputted from inside \
|
||||||
|
of it, and being distributed to its environment, however no apparent method of power generation \
|
||||||
|
appears to exist inside the machine. This ability also appears to be shared with certain other \
|
||||||
|
kinds of machines made by this species.\
|
||||||
|
<br><br>\
|
||||||
|
Scanning similar objects may yield more information."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/structure/prop/alien/power
|
/obj/structure/prop/alien/power
|
||||||
name = "void core"
|
name = "void core"
|
||||||
icon_state = "core"
|
icon_state = "core"
|
||||||
desc = "An alien machine that seems to be producing energy seemingly out of nowhere."
|
desc = "An alien machine that seems to be producing energy seemingly out of nowhere."
|
||||||
interaction_message = "<span class='warning'>Messing with something that makes energy out of nowhere seems very unwise.</span>"
|
interaction_message = "<span class='warning'>Messing with something that makes energy out of nowhere seems very unwise.</span>"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_void_core)
|
||||||
|
|
||||||
/obj/item/prop/alien
|
/obj/item/prop/alien
|
||||||
name = "some alien item"
|
name = "some alien item"
|
||||||
|
|||||||
108
code/game/objects/structures/props/blackbox.dm
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
// A fluff structure for certain PoIs involving crashed ships.
|
||||||
|
// They can be scanned by a cataloguer to obtain the data held inside, and determine what caused whatever is happening on the ship.
|
||||||
|
/obj/structure/prop/blackbox
|
||||||
|
name = "blackbox recorder"
|
||||||
|
desc = "A study machine that logs information about whatever it's attached to, hopefully surviving even if its carrier does not. \
|
||||||
|
This one looks like it has ceased writing to its internal data storage."
|
||||||
|
icon = 'icons/obj/stationobjs.dmi'
|
||||||
|
icon_state = "blackbox_off"
|
||||||
|
|
||||||
|
// Black boxes are resistant to explosions.
|
||||||
|
/obj/structure/prop/blackbox/ex_act(severity)
|
||||||
|
..(++severity)
|
||||||
|
|
||||||
|
|
||||||
|
/obj/structure/prop/blackbox/quarantined_shuttle
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/quarantined_shuttle)
|
||||||
|
|
||||||
|
// The actual 'data' on the black box. Obtainable with a Cataloguer.
|
||||||
|
/datum/category_item/catalogue/information/blackbox
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/blackbox/quarantined_shuttle
|
||||||
|
name = "Black Box Data - MBT-540"
|
||||||
|
desc = {"
|
||||||
|
<B>Pilot's Log for Major Bill's Transportation Shuttle MBT-540</B><BR>
|
||||||
|
Routine flight inbound for VIMC Outpost C-12 6:35AM 03/12/2491, Estimated arrival 7:05AM. 16 passengers, 2 crew.<BR>
|
||||||
|
<B>V.I.S Traffic Control 06:05:55:</B>Major Bill's MBT-540 you are clear for departure from Dock 6 on departure route Charlie. Have a safe flight.<BR>
|
||||||
|
<B>Captain Willis 06:06:33:</B> You too, control. Departing route Charlie.<BR>
|
||||||
|
<B>Captain Willis 06:06:48:</B> ...Damn it.<BR> ** <BR><B>Captain Adisu 06:10:23: </B> Hey Ted, I'm seeing a fuel line pressure drop on engine 3?<BR>
|
||||||
|
<B>Captain Willis 06:10:50</B>: Yeah, I see it. Heater's fading out, redistributing thrust 30% to compensate.<BR><B>06:12:31: A loud thud is heard.</B><BR>
|
||||||
|
<B>Captain Adisu 06:12:34: </B> What the (Expletives)?<BR><B>Captain Adisu 06:12:39:</B> We just lost power to engine- engine two. Hold on... Atmospheric alarm in the cargo bay. Son of a...<BR>
|
||||||
|
<B>Captain Willis 06:12:59:</B> Reducing thrust further 30%, do we have a breach Adi, a breach?<BR>
|
||||||
|
<B>Captain Adisu 06:13:05:</B>No breach, checking cameras... Looks like- looks like some cargo came loose back there.<BR>
|
||||||
|
<B>Captain Willis 06:13:15:</B> (Expletives), I'm turning us around. Put out a distress call to Control, we'll be back in Sif orbit in a couple of minutes.<BR>
|
||||||
|
**
|
||||||
|
<BR>
|
||||||
|
<B>V.I.S Traffic Control 06:15:49:</B> MBT-540 we are recieving you. Your atmospheric sensors are reading potentially harmful toxins in your cargo bay. Advise locking down interior cargo bay doors. Please stand by.<BR>
|
||||||
|
<B>Captain Adisu 06:16:10:</B> Understood. <BR> ** <BR><B>V.I.S Traffic Control 06:27:02: </B> MBT-540, we have no docking bays available at this time, are you equipped for atmospheric re-entry?<BR>
|
||||||
|
<B>Captain Willis 06:27:12:</B> We-We are shielded. But we have fuel and air for-<BR>
|
||||||
|
<B>V.I.S Traffic Control 06:27:17:</B> Please make an emergency landing at the coordinates provided and standby for further information.<BR>
|
||||||
|
**
|
||||||
|
<BR>
|
||||||
|
<B>Captain Willis 06:36:33:</B> Emergency landing successful. Adi, er Adisu is checking on the passengers but we had a smooth enough landing, are we clear to begin evacu-<BR>
|
||||||
|
<B>06:36:50: (Sound of emergency shutters closing)</B><BR><B>Captain Willis 06:36:51: </B>What the hell? Control we just had a remote activation of our emergency shutters, please advise.<BR>
|
||||||
|
<B>V.I.S Traffic Control 06:38:10:</B> Captain, please tune to frequency 1493.8 we are passing you on to local emergency response units. Godspeed.<BR>
|
||||||
|
<B>Captain Willis 06:38:49:</B> This is Captain Willis of Major Bill's Transportation flight MBT-540 we have eighteen souls aboard and our emergency lockdown shutters have engaged remotely. Do you read?<BR>
|
||||||
|
<B>S.D.D.C:</B> This is the Sif Department of Disease Control, your vessel has been identified as carrying highly sensitive materials, and due to the nature of your system's automated alerts you will be asked to remain in quarantine until we are able to determine the nature of the pathogens aboard and whether it has entered the air circulation system. Please remain in your cockpit at this time.<BR>
|
||||||
|
**
|
||||||
|
</BR>
|
||||||
|
<B>Captain Adisu 17:23:58:09:</B> I don't think they're opening those doors Ted. I don't think they're coming.
|
||||||
|
"}
|
||||||
|
|
||||||
|
/obj/structure/prop/blackbox/crashed_med_shuttle
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/crashed_med_shuttle)
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/blackbox/crashed_med_shuttle
|
||||||
|
name = "Black Box Data - VMV Aurora's Light" // This might be incorrect.
|
||||||
|
desc = {"
|
||||||
|
\[Unable to recover data before this point.\]<BR>
|
||||||
|
<B>Captain Simmons 19:52:01:</B> Come on... it's right there in the distance, we're almost there!<BR>
|
||||||
|
<B>Doctor Nazarril 19:52:26:</B> Odysseus online. Orrderrs, sirr?<BR>
|
||||||
|
<B>Captain Simmons 19:52:29:</B> Brace for impact. We're going in full-speed.<BR>
|
||||||
|
<B>Technician Dynasty 19:52:44:</B> Chief, fire's spread to the secondary propulsion systems.<BR>
|
||||||
|
<B>Captain Simmons 19:52:51:</B> Copy. Any word from TraCon? Transponder's down still?<BR>
|
||||||
|
<B>Technician Dynasty 19:53:02:</B> Can't get in touch, sir. Emergency beacon's active, but we're not going t-<BR>
|
||||||
|
<B>Doctor Nazarril 19:53:08:</B> Don't say it. As long as we believe, we'll get through this.<BR>
|
||||||
|
<B>Captain Simmons 19:53:11:</B> Damn right. We're a few klicks out from the port. Rough landing, but we can do it.<BR>
|
||||||
|
<B>V.I.T.A. 19:53:26:</B> Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.<BR>
|
||||||
|
<B>A loud explosion is heard.</B><BR>
|
||||||
|
<B>V.I.T.A. 19:53:29:</B> Alert: fuel intake valve open.<BR>
|
||||||
|
<B>Technician Dynasty 19:53:31:</B> ... ah.<BR>
|
||||||
|
<B>Doctor Nazarril 19:53:34:</B> Trrranslate?<BR>
|
||||||
|
<B>V.I.T.A. 19:53:37:</B> There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.<BR>
|
||||||
|
<B>Technician Dynasty 19:53:48:</B> We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.<BR>
|
||||||
|
<B>V.I.T.A. 19:53:53:</B> The Technician is correct.<BR>
|
||||||
|
<B>Doctor Nazarril 19:54:02:</B> Then... we can't land therrre.<BR>
|
||||||
|
<B>V.I.T.A. 19:54:11:</B> Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible.<BR>
|
||||||
|
<B>Captain Simmons 19:54:27:</B> I- alright. I'm bringing us down. You all know what this means.<BR>
|
||||||
|
<B>Doctor Nazarril 19:54:33:</B> Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.<BR>
|
||||||
|
<B>Technician Dynasty 19:54:39:</B> We had a good run. I'm going to miss this.<BR>
|
||||||
|
<B>Captain Simmons 19:54:47:</B> VITA. Tell them we died heroes. Tell them... we did all we could.<BR>
|
||||||
|
<B>V.I.T.A. 19:54:48:</B> I will. Impact in five. Four. Three.<BR>
|
||||||
|
<B>Doctor Nazarril 19:54:49:</B> Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.<BR>
|
||||||
|
<B>Technician Dynasty 19:54:50:</B> Any time, kid. Any time.<BR>
|
||||||
|
<B>V.I.T.A. 19:54:41:</B> Two.<BR>
|
||||||
|
<B>V.I.T.A. 19:54:42:</B> One.<BR>
|
||||||
|
**8/DEC/2561**<BR>
|
||||||
|
<B>V.I.T.A. 06:22:16:</B> Backup power restored. Attempting to establish connection with emergency rescue personnel.<BR>
|
||||||
|
<B>V.I.T.A. 06:22:17:</B> Unable to establish connection. Transponder destroyed on impact.<BR>
|
||||||
|
<B>V.I.T.A. 06:22:18:</B> No lifesigns detected on board.<BR>
|
||||||
|
**1/JAN/2562**<BR>
|
||||||
|
<B>V.I.T.A. 00:00:00:</B> Happy New Year, crew.<BR>
|
||||||
|
<B>V.I.T.A. 00:00:01:</B> Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.<BR>
|
||||||
|
<B>V.I.T.A. 00:00:02:</B> Nobody's coming.<BR>
|
||||||
|
**14/FEB/2562**<BR>
|
||||||
|
<B>V.I.T.A. 00:00:00:</B> Roses are red.<BR>
|
||||||
|
<B>V.I.T.A. 00:00:01:</B> Violets are blue.<BR>
|
||||||
|
<B>V.I.T.A. 00:00:02:</B> Won't you come back?<BR>
|
||||||
|
<B>V.I.T.A. 00:00:03:</B> I miss you.<BR>
|
||||||
|
**15/FEB/2562**<BR>
|
||||||
|
<B>V.I.T.A. 22:19:06:</B> Power reserves critical. Transferring remaining power to emergency broadcasting beacon.<BR>
|
||||||
|
<B>V.I.T.A. 22:19:07:</B> Should anyone find this, lay them to rest. They deserve a proper burial.<BR>
|
||||||
|
<B>V.I.T.A. 22:19:08:</B> Erasing files... shutting down.<BR>
|
||||||
|
<B>A low, monotone beep.</B><BR>
|
||||||
|
**16/FEB/2562**<BR>
|
||||||
|
<B>Something chitters.</B><BR>
|
||||||
|
<B>End of transcript.</B>
|
||||||
|
"}
|
||||||
20
code/game/objects/structures/props/fake_ai.dm
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// A fluff structure to visually look like an AI core.
|
||||||
|
// Unlike the decoy AI mob, this won't explode if someone tries to card it.
|
||||||
|
/obj/structure/prop/fake_ai
|
||||||
|
name = "AI"
|
||||||
|
desc = ""
|
||||||
|
icon = 'icons/mob/AI.dmi'
|
||||||
|
icon_state = "ai"
|
||||||
|
|
||||||
|
/obj/structure/prop/fake_ai/attackby(obj/O, mob/user)
|
||||||
|
if(istype(O, /obj/item/device/aicard)) // People trying to card the fake AI will get told its impossible.
|
||||||
|
to_chat(user, span("warning", "This core does not appear to have a suitable port to use \the [O] on..."))
|
||||||
|
return TRUE
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/structure/prop/fake_ai/dead
|
||||||
|
icon_state = "ai-crash"
|
||||||
|
|
||||||
|
/obj/structure/prop/fake_ai/dead/crashed_med_shuttle
|
||||||
|
name = "V.I.T.A."
|
||||||
|
icon_state = "ai-heartline-crash"
|
||||||
29
code/game/objects/structures/props/transmitter.dm
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
// A fluff structure for certain PoIs involving communications.
|
||||||
|
// It makes audible sounds, generally in morse code.
|
||||||
|
/obj/structure/prop/transmitter
|
||||||
|
name = "transmitter"
|
||||||
|
desc = "A machine that appears to be transmitting a message somewhere else. It sounds like it's on a loop."
|
||||||
|
icon = 'icons/obj/stationobjs.dmi'
|
||||||
|
icon_state = "sensors"
|
||||||
|
var/datum/looping_sound/sequence/morse/soundloop
|
||||||
|
var/message_to_play = "The quick brown fox jumps over the lazy dog."
|
||||||
|
|
||||||
|
/obj/structure/prop/transmitter/Initialize()
|
||||||
|
soundloop = new(list(src), FALSE)
|
||||||
|
set_new_message(message_to_play)
|
||||||
|
soundloop.start()
|
||||||
|
interaction_message = "On the monitor it displays '[uppertext(message_to_play)]'."
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/structure/prop/transmitter/Destroy()
|
||||||
|
QDEL_NULL(soundloop)
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/structure/prop/transmitter/vv_edit_var(var_name, var_value)
|
||||||
|
if(var_name == "message_to_play")
|
||||||
|
set_new_message(var_value)
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/structure/prop/transmitter/proc/set_new_message(new_message)
|
||||||
|
soundloop.set_new_sequence(new_message)
|
||||||
|
interaction_message = "On the monitor it displays '[uppertext(new_message)]'."
|
||||||
@@ -319,9 +319,26 @@
|
|||||||
qdel(src)
|
qdel(src)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_bed
|
||||||
|
name = "Precursor Alpha Object - Resting Contraption"
|
||||||
|
desc = "This appears to be a relatively long and flat object, with the top side being made of \
|
||||||
|
an soft material, giving it very similar characteristics to an ordinary bed. If this object was \
|
||||||
|
designed to act as a bed, this carries several implications for whatever species had built it, such as;\
|
||||||
|
<br><br>\
|
||||||
|
Being capable of experiencing comfort, or at least being able to suffer from some form of fatigue.<br>\
|
||||||
|
Developing while under the influence of gravitational forces, to be able to 'lie' on the object.<br>\
|
||||||
|
Being within a range of sizes in order for the object to function as a bed. Too small, and the species \
|
||||||
|
would be unable to reach the top of the object. Too large, and they would have little room to contact \
|
||||||
|
the top side of the object.<br>\
|
||||||
|
<br><br>\
|
||||||
|
As a note, the size of this object appears to be within the bounds for an average human to be able to \
|
||||||
|
rest comfortably on top of it."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/structure/bed/alien
|
/obj/structure/bed/alien
|
||||||
name = "resting contraption"
|
name = "resting contraption"
|
||||||
desc = "Whatever species designed this must've enjoyed relaxation as well. Looks vaguely comfy."
|
desc = "Whatever species designed this must've enjoyed relaxation as well. Looks vaguely comfy."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_bed)
|
||||||
icon = 'icons/obj/abductor.dmi'
|
icon = 'icons/obj/abductor.dmi'
|
||||||
icon_state = "bed"
|
icon_state = "bed"
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,13 @@ var/list/grass_types = list(
|
|||||||
/obj/structure/flora/ausbushes/fullgrass
|
/obj/structure/flora/ausbushes/fullgrass
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/flora/sif_grass
|
||||||
|
name = "Sivian Flora - Moss"
|
||||||
|
desc = "A natural moss that has adapted to the sheer cold climate of Sif. \
|
||||||
|
The moss came to rely partially on bioluminescent bacteria provided by the local tree populations. \
|
||||||
|
As such, the moss often grows in large clusters in the denser forests of Sif. \
|
||||||
|
The moss has evolved into it's distinctive blue hue thanks to it's reliance on bacteria that has a similar color."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
/turf/simulated/floor/outdoors/grass/sif
|
/turf/simulated/floor/outdoors/grass/sif
|
||||||
name = "growth"
|
name = "growth"
|
||||||
@@ -29,6 +36,9 @@ var/list/grass_types = list(
|
|||||||
/obj/structure/flora/sif/eyes
|
/obj/structure/flora/sif/eyes
|
||||||
)
|
)
|
||||||
|
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/flora/sif_grass)
|
||||||
|
catalogue_delay = 2 SECONDS
|
||||||
|
|
||||||
/turf/simulated/floor/outdoors/grass/sif/Initialize()
|
/turf/simulated/floor/outdoors/grass/sif/Initialize()
|
||||||
if(tree_chance && prob(tree_chance) && !check_density())
|
if(tree_chance && prob(tree_chance) && !check_density())
|
||||||
new /obj/structure/flora/tree/sif(src)
|
new /obj/structure/flora/tree/sif(src)
|
||||||
|
|||||||
@@ -237,7 +237,7 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
/datum/lore/organization/tsc/zeng_hu
|
/datum/lore/organization/tsc/zeng_hu
|
||||||
name = "Zeng-Hu pharmaceuticals"
|
name = "Zeng-Hu Pharmaceuticals"
|
||||||
short_name = "Zeng-Hu"
|
short_name = "Zeng-Hu"
|
||||||
acronym = "ZH"
|
acronym = "ZH"
|
||||||
desc = "Zeng-Hu is an old TSC, based in the Sol system. Until the discovery of Phoron, Zeng-Hu maintained a stranglehold \
|
desc = "Zeng-Hu is an old TSC, based in the Sol system. Until the discovery of Phoron, Zeng-Hu maintained a stranglehold \
|
||||||
@@ -453,11 +453,14 @@
|
|||||||
/datum/lore/organization/tsc/mbt
|
/datum/lore/organization/tsc/mbt
|
||||||
name = "Major Bill's Transportation"
|
name = "Major Bill's Transportation"
|
||||||
short_name = "Major Bill's"
|
short_name = "Major Bill's"
|
||||||
desc = "The most popular courier service and starliner, Major Bill's is an unassuming corporation whose greatest asset is their low cost and brand recognition. Major Bill’s is known, perhaps unfavorably, for its mascot, Major Bill, a cartoonish military figure that spouts quotable slogans. Their motto is \"With Major Bill's, you won't pay major bills!\", an earworm much of the galaxy longs to forget."
|
desc = "The most popular courier service and starliner, Major Bill's is an unassuming corporation whose greatest asset \
|
||||||
|
is their low cost and brand recognition. Major Bill's is known, perhaps unfavorably, for its mascot, Major Bill, \
|
||||||
|
a cartoonish military figure that spouts quotable slogans. Their motto is \"With Major Bill's, you won't pay major bills!\", \
|
||||||
|
an earworm much of the galaxy longs to forget."
|
||||||
history = ""
|
history = ""
|
||||||
work = "courier and passenger transit"
|
work = "courier and passenger transit"
|
||||||
headquarters = "Mars, Sol"
|
headquarters = "Mars, Sol"
|
||||||
motto = ""
|
motto = "With Major Bill's, you won't pay major bills!"
|
||||||
|
|
||||||
ship_prefixes = list("TTV" = "transport", "TTV" = "luxury transit")
|
ship_prefixes = list("TTV" = "transport", "TTV" = "luxury transit")
|
||||||
destination_names = list()
|
destination_names = list()
|
||||||
@@ -479,9 +482,14 @@
|
|||||||
/datum/lore/organization/gov/virgov
|
/datum/lore/organization/gov/virgov
|
||||||
name = "Vir Governmental Authority"
|
name = "Vir Governmental Authority"
|
||||||
short_name = "VirGov"
|
short_name = "VirGov"
|
||||||
desc = "VirGov is the sole governing administration for the Vir system, based in New Reykjavik, Sif. It is a representative \
|
desc = "The aptly named Vir Governmental Authority is the sole governing administration for the Vir system, based \
|
||||||
democratic government, and a fully recognized member of the Solar Confederate Government. Anyone operating inside of Vir must \
|
out of New Reykjavik on Sif. It is a representative democratic government, and a fully recognised member of the \
|
||||||
comply with VirGov's legislation and regulations."
|
Confederation.\
|
||||||
|
<br><br>\
|
||||||
|
Corporate entities such as Nanotrasen which operate on Sif, in Vir space, or on other bodies in the Vir system must \
|
||||||
|
all comply with legislation as determined by the VGA and SolGov. As a result, any serious criminal offences, \
|
||||||
|
industrial accidents, or concerning events should be forwarded to the VGA in the event that assistance or \
|
||||||
|
communication is required from the Vir Police, Vir Defence Force, Vir Interior Ministry, or other important groups."
|
||||||
history = "" // Todo like the rest of them
|
history = "" // Todo like the rest of them
|
||||||
work = "governing body of Vir"
|
work = "governing body of Vir"
|
||||||
headquarters = "New Reykjavik, Sif, Vir"
|
headquarters = "New Reykjavik, Sif, Vir"
|
||||||
@@ -501,10 +509,18 @@
|
|||||||
name = "Solar Confederate Government"
|
name = "Solar Confederate Government"
|
||||||
short_name = "SolGov"
|
short_name = "SolGov"
|
||||||
acronym = "SCG"
|
acronym = "SCG"
|
||||||
desc = "SolGov is a decentralized confederation of human governmental entities based on Luna, Sol, which defines top-level law for their member states. \
|
desc = "The Solar Confederate Government, or SolGov, is a mostly-human governmental entity based on Luna and \
|
||||||
Member states receive various benefits such as defensive pacts, trade agreements, social support and funding, and being able to participate \
|
extending throughout most of the local bubble.\
|
||||||
in the Colonial Assembly. The majority, but not all human territories are members of SolGov. As such, SolGov is a major power and \
|
<br><br>\
|
||||||
defacto represents humanity on the galactic stage."
|
SolGov defines top-level law (such as sapient rights and transgressive \
|
||||||
|
technology) and acts as an intermediary council for problems involving member states, but leaves most other law for \
|
||||||
|
states to define themselves. The member states of SolGov obey these laws, pay confederate taxes, and provide each \
|
||||||
|
other with military aid, in exchange for membership in the largest free trade, customs, and military union in the \
|
||||||
|
known galaxy. Each state appoints two representatives to the Colonial Assembly where issues are voted upon. \
|
||||||
|
The vast majority of human states are members of SolGov.\
|
||||||
|
<br><br>\
|
||||||
|
Sol's military forces are divided between central confederate forces and local defense forces, although it reserves \
|
||||||
|
the right to nationalize the defense forces in the event of a major crisis, such as the SolGov-Hegemony War."
|
||||||
history = "" // Todo
|
history = "" // Todo
|
||||||
work = "governing polity of humanity's Confederation"
|
work = "governing polity of humanity's Confederation"
|
||||||
headquarters = "Luna, Sol"
|
headquarters = "Luna, Sol"
|
||||||
|
|||||||
81
code/modules/catalogue/atoms.dm
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/atom
|
||||||
|
var/catalogue_delay = 5 SECONDS // How long it take to scan.
|
||||||
|
// List of types of /datum/category_item/catalogue that should be 'unlocked' when scanned by a Cataloguer.
|
||||||
|
// It is null by default to save memory by not having everything hold onto empty lists. Use macros like LAZYLEN() to check.
|
||||||
|
// Also you should use get_catalogue_data() to access this instead of doing so directly, so special behavior can be enabled.
|
||||||
|
var/list/catalogue_data = null
|
||||||
|
|
||||||
|
/mob
|
||||||
|
catalogue_delay = 10 SECONDS
|
||||||
|
|
||||||
|
// Tests if something can be catalogued.
|
||||||
|
// If something goes wrong and a mob was supplied, the mob will be told why they can't catalogue it.
|
||||||
|
/atom/proc/can_catalogue(mob/user)
|
||||||
|
// First check if anything is even on here.
|
||||||
|
var/list/data = get_catalogue_data()
|
||||||
|
if(!LAZYLEN(data))
|
||||||
|
to_chat(user, span("warning", "\The [src] is not interesting enough to catalogue."))
|
||||||
|
return FALSE
|
||||||
|
else
|
||||||
|
// Check if this has nothing new on it.
|
||||||
|
var/has_new_data = FALSE
|
||||||
|
for(var/t in data)
|
||||||
|
var/datum/category_item/catalogue/item = GLOB.catalogue_data.resolve_item(t)
|
||||||
|
if(!item.visible)
|
||||||
|
has_new_data = TRUE
|
||||||
|
break
|
||||||
|
|
||||||
|
if(!has_new_data)
|
||||||
|
to_chat(user, span("warning", "Scanning \the [src] would provide no new information."))
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/mob/living/can_catalogue(mob/user) // Dead mobs can't be scanned.
|
||||||
|
if(stat >= DEAD)
|
||||||
|
to_chat(user, span("warning", "Entities must be alive for a comprehensive scan."))
|
||||||
|
return FALSE
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/can_catalogue(mob/user) // Items must be identified to be scanned.
|
||||||
|
if(!is_identified())
|
||||||
|
to_chat(user, span("warning", "The properties of this object has not been determined. Identify it first."))
|
||||||
|
return FALSE
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/atom/proc/get_catalogue_delay()
|
||||||
|
return catalogue_delay
|
||||||
|
|
||||||
|
// Override for special behaviour.
|
||||||
|
// Should return a list with one or more "/datum/category_item/catalogue" types, or null.
|
||||||
|
// If overriding, it may be wise to call the super and get the results in order to merge the base result and the special result, if appropiate.
|
||||||
|
/atom/proc/get_catalogue_data()
|
||||||
|
return catalogue_data
|
||||||
|
|
||||||
|
/mob/living/carbon/human/get_catalogue_data()
|
||||||
|
var/list/data = list()
|
||||||
|
// First, handle robot-ness.
|
||||||
|
var/beep_boop = get_FBP_type()
|
||||||
|
switch(beep_boop)
|
||||||
|
if(FBP_CYBORG)
|
||||||
|
data += /datum/category_item/catalogue/technology/cyborgs
|
||||||
|
if(FBP_POSI)
|
||||||
|
data += /datum/category_item/catalogue/technology/positronics
|
||||||
|
if(FBP_DRONE)
|
||||||
|
data += /datum/category_item/catalogue/technology/drone/drones
|
||||||
|
// Now for species.
|
||||||
|
if(!(beep_boop in list(FBP_POSI, FBP_DRONE))) // Don't give the species entry if they are a posi or drone.
|
||||||
|
if(species && LAZYLEN(species.catalogue_data))
|
||||||
|
data += species.catalogue_data
|
||||||
|
return data
|
||||||
|
|
||||||
|
/mob/living/silicon/robot/get_catalogue_data()
|
||||||
|
var/list/data = list()
|
||||||
|
switch(braintype)
|
||||||
|
if(BORG_BRAINTYPE_CYBORG)
|
||||||
|
data += /datum/category_item/catalogue/technology/cyborgs
|
||||||
|
if(BORG_BRAINTYPE_POSI)
|
||||||
|
data += /datum/category_item/catalogue/technology/positronics
|
||||||
|
if(BORG_BRAINTYPE_DRONE)
|
||||||
|
data += /datum/category_item/catalogue/technology/drone/drones
|
||||||
|
return data
|
||||||
440
code/modules/catalogue/catalogue_data.dm
Normal file
@@ -0,0 +1,440 @@
|
|||||||
|
GLOBAL_DATUM_INIT(catalogue_data, /datum/category_collection/catalogue, new)
|
||||||
|
|
||||||
|
// The collection holds everything together and is GLOB accessible.
|
||||||
|
/datum/category_collection/catalogue
|
||||||
|
category_group_type = /datum/category_group/catalogue
|
||||||
|
|
||||||
|
/datum/category_collection/catalogue/proc/resolve_item(item_path)
|
||||||
|
for(var/group in categories)
|
||||||
|
var/datum/category_group/G = group
|
||||||
|
|
||||||
|
var/datum/category_item/catalogue/C = item_path
|
||||||
|
var/name_to_search = initial(C.name)
|
||||||
|
if(G.items_by_name[name_to_search])
|
||||||
|
return G.items_by_name[name_to_search]
|
||||||
|
|
||||||
|
// for(var/item in G.items)
|
||||||
|
// var/datum/category_item/I = item
|
||||||
|
// if(I.type == item_path)
|
||||||
|
// return I
|
||||||
|
|
||||||
|
|
||||||
|
// Groups act as sections for the different data.
|
||||||
|
/datum/category_group/catalogue
|
||||||
|
|
||||||
|
// Plants.
|
||||||
|
/datum/category_group/catalogue/flora
|
||||||
|
name = "Flora"
|
||||||
|
category_item_type = /datum/category_item/catalogue/flora
|
||||||
|
|
||||||
|
// Animals.
|
||||||
|
/datum/category_group/catalogue/fauna
|
||||||
|
name = "Fauna"
|
||||||
|
category_item_type = /datum/category_item/catalogue/fauna
|
||||||
|
|
||||||
|
// Gadgets, tech, and robots.
|
||||||
|
/datum/category_group/catalogue/technology
|
||||||
|
name = "Technology"
|
||||||
|
category_item_type = /datum/category_item/catalogue/technology
|
||||||
|
|
||||||
|
// Abstract information.
|
||||||
|
/datum/category_group/catalogue/information
|
||||||
|
name = "Information"
|
||||||
|
category_item_type = /datum/category_item/catalogue/information
|
||||||
|
|
||||||
|
// Weird stuff like precursors.
|
||||||
|
/datum/category_group/catalogue/anomalous
|
||||||
|
name = "Anomalous"
|
||||||
|
category_item_type = /datum/category_item/catalogue/anomalous
|
||||||
|
|
||||||
|
// Physical material things like crystals and metals.
|
||||||
|
/datum/category_group/catalogue/material
|
||||||
|
name = "Material"
|
||||||
|
category_item_type = /datum/category_item/catalogue/material
|
||||||
|
|
||||||
|
|
||||||
|
// Items act as individual data for each object.
|
||||||
|
/datum/category_item/catalogue
|
||||||
|
var/desc = null // Paragraph or two about what the object is.
|
||||||
|
var/value = 0 // How many 'exploration points' you get for scanning it. Suggested to use the CATALOGUER_REWARD_* defines for easy tweaking.
|
||||||
|
var/visible = FALSE // When someone scans the correct object, this gets set to TRUE and becomes viewable in the databanks.
|
||||||
|
var/list/cataloguers = null // List of names of those who helped 'discover' this piece of data, in string form.
|
||||||
|
var/list/unlocked_by_any = null // List of types that, if they are discovered, it will also make this datum discovered.
|
||||||
|
var/list/unlocked_by_all = null // Similar to above, but all types on the list must be discovered for this to be discovered.
|
||||||
|
|
||||||
|
// Discovers a specific datum, and any datums associated with this datum by unlocked_by_[any|all].
|
||||||
|
// Returns null if nothing was found, otherwise returns a list of datum instances that was discovered, usually for the cataloguer to use.
|
||||||
|
/datum/category_item/catalogue/proc/discover(mob/user, list/new_cataloguers)
|
||||||
|
if(visible) // Already found.
|
||||||
|
return
|
||||||
|
|
||||||
|
. = list(src)
|
||||||
|
visible = TRUE
|
||||||
|
cataloguers = new_cataloguers
|
||||||
|
display_in_chatlog(user)
|
||||||
|
. += attempt_chain_discoveries(user, new_cataloguers, type)
|
||||||
|
|
||||||
|
// Calls discover() on other datums if they include the type that was just discovered is inside unlocked_by_[any|all].
|
||||||
|
// Returns discovered datums.
|
||||||
|
/datum/category_item/catalogue/proc/attempt_chain_discoveries(mob/user, list/new_cataloguers, type_to_test)
|
||||||
|
. = list()
|
||||||
|
for(var/G in category.collection.categories) // I heard you like loops.
|
||||||
|
var/datum/category_group/catalogue/group = G
|
||||||
|
for(var/I in group.items)
|
||||||
|
var/datum/category_item/catalogue/item = I
|
||||||
|
// First, look for datums unlocked with the 'any' list.
|
||||||
|
if(LAZYLEN(item.unlocked_by_any))
|
||||||
|
for(var/T in item.unlocked_by_any)
|
||||||
|
if(ispath(type_to_test, T) && item.discover(user, new_cataloguers))
|
||||||
|
. += item
|
||||||
|
|
||||||
|
// Now for the more complicated 'all' list.
|
||||||
|
if(LAZYLEN(item.unlocked_by_all))
|
||||||
|
if(type_to_test in item.unlocked_by_all)
|
||||||
|
// Unlike the 'any' list, the 'all' list requires that all datums inside it to have been found first.
|
||||||
|
var/should_discover = TRUE
|
||||||
|
for(var/T in item.unlocked_by_all)
|
||||||
|
var/datum/category_item/catalogue/thing = GLOB.catalogue_data.resolve_item(T)
|
||||||
|
if(istype(thing))
|
||||||
|
if(!thing.visible)
|
||||||
|
should_discover = FALSE
|
||||||
|
break
|
||||||
|
if(should_discover && item.discover(user, new_cataloguers))
|
||||||
|
. += item
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/proc/display_in_chatlog(mob/user)
|
||||||
|
to_chat(user, "<br>")
|
||||||
|
to_chat(user, span("notice", "<b>[uppertext(name)]</b>"))
|
||||||
|
|
||||||
|
// Some entries get very long so lets not totally flood the chatlog.
|
||||||
|
var/desc_length_limit = 750
|
||||||
|
var/displayed_desc = desc
|
||||||
|
if(length(desc) > desc_length_limit)
|
||||||
|
displayed_desc = copytext(displayed_desc, 1, desc_length_limit + 1)
|
||||||
|
displayed_desc += "... (View databanks for full data)"
|
||||||
|
|
||||||
|
to_chat(user, span("notice", "<i>[displayed_desc]</i>"))
|
||||||
|
to_chat(user, span("notice", "Cataloguers : <b>[english_list(cataloguers)]</b>."))
|
||||||
|
to_chat(user, span("notice", "Contributes <b>[value]</b> points to personal exploration fund."))
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Truncates text to limit if necessary.
|
||||||
|
var/size = length(message)
|
||||||
|
if (size <= length)
|
||||||
|
return message
|
||||||
|
else
|
||||||
|
return copytext(message, 1, length + 1)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/flora
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/humans
|
||||||
|
name = "Sapients - Humans"
|
||||||
|
desc = "Humans are a space-faring species hailing originally from the planet Earth in the Sol system. \
|
||||||
|
They are currently among the most numerous known species in the galaxy, in both population and holdings, \
|
||||||
|
and are relatively technologically advanced. With good healthcare and a reasonable lifestyle, \
|
||||||
|
they can live to around 110 years. The oldest humans are around 150 years old.\
|
||||||
|
<br><br>\
|
||||||
|
Humanity is the primary driving force for rapid space expansion, owing to their strong, expansionist central \
|
||||||
|
government and opportunistic Trans-Stellar Corporations. The prejudices of the 21st century have mostly \
|
||||||
|
given way to bitter divides on the most important issue of the times<65> technological expansionism, \
|
||||||
|
with the major human factions squabbling over their approach to technology in the face of a \
|
||||||
|
looming singularity.\
|
||||||
|
<br><br>\
|
||||||
|
While most humans have accepted the existence of aliens in their communities and workplaces as a \
|
||||||
|
fact of life, exceptions abound. While more culturally diverse than most species, humans are \
|
||||||
|
generally regarded as somewhat technophobic and isolationist by members of other species."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/skrell
|
||||||
|
name = "Sapients - Skrell"
|
||||||
|
desc = "The Skrell are a species of amphibious humanoids, distinguished by their green-blue gelatinous \
|
||||||
|
appearance and head tentacles. Skrell warble from the world of Qerr'balak, a humid planet with \
|
||||||
|
plenty of swamps and jungles. Currently more technologically advanced than humanity, they \
|
||||||
|
emphasize the study of the mind above all else.\
|
||||||
|
<br><br>\
|
||||||
|
Gender has little meaning to Skrell outside of reproduction, and in fact many other species \
|
||||||
|
have a difficult time telling the difference between male and female Skrell apart. The most \
|
||||||
|
obvious signs (voice in a slightly higher register, longer head-tails for females) are \
|
||||||
|
never a guarantee.\
|
||||||
|
<br><br>\
|
||||||
|
Due to their scientific focus of the mind and body, Skrell tend to be more peaceful and their \
|
||||||
|
colonization has been slow, swiftly outpaced by humanity. They were the first contact sentient \
|
||||||
|
species, and are humanity's longest, and closest, ally in space."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/unathi
|
||||||
|
name = "Sapients - Unathi"
|
||||||
|
desc = "The Unathi are a species of large reptilian humanoids hailing from Moghes, in the \
|
||||||
|
Uueoa-Esa binary star system. Most Unathi live in a semi-rigid clan system, and clan \
|
||||||
|
enclaves dot the surface of their homeworld. Proud and long-lived, Unathi of all \
|
||||||
|
walks of life display a tendency towards perfectionism, and mastery of one<6E>s craft \
|
||||||
|
is greatly respected among them. Despite the aggressive nature of their contact, \
|
||||||
|
Unathi seem willing, if not eager, to reconcile with humanity, though mutual \
|
||||||
|
distrust runs rampant among individuals of both groups."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/tajaran
|
||||||
|
name = "Sapients - Tajaran"
|
||||||
|
desc = "Tajaran are a race of humanoid mammalian aliens from Meralar, the fourth planet \
|
||||||
|
of the Rarkajar star system. Thickly furred and protected from cold, they thrive on \
|
||||||
|
their subartic planet, where the only terran temperate areas spread across the \
|
||||||
|
equator and <20>tropical belt.<2E>\
|
||||||
|
<br><br>\
|
||||||
|
With their own share of bloody wars and great technological advances, the Tajaran are a \
|
||||||
|
proud kind. They fiercely believe they belong among the stars and consider themselves \
|
||||||
|
a rightful interstellar nation, even if Humanity helped them to actually achieve \
|
||||||
|
superluminar speeds with Bluespace FTL drives.\
|
||||||
|
<br><br>\
|
||||||
|
Relatively new to the galaxy, their contacts with other species are aloof, but friendly. \
|
||||||
|
Among these bonds, Humanity stands out as valued trade partner and maybe even friend."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/dionaea
|
||||||
|
name = "Sapients - Dionaea"
|
||||||
|
desc = "The Dionaea are a group of intensely curious plant-like organisms. An individual \
|
||||||
|
Diona is a single dog-sized creature called a nymphs, and multiple nymphs link together \
|
||||||
|
to form larger, more intelligent collectives. Discovered by the Skrell in and around \
|
||||||
|
the stars in the Epsilon Ursae Minoris system, they have accompanied the Skrell in \
|
||||||
|
warbling throughout the cosmos as a key part of Skrellian starships, stations, \
|
||||||
|
and terraforming equipment.\
|
||||||
|
<br><br>\
|
||||||
|
Dionaea have no concept of violence or individual identity and want little in \
|
||||||
|
terms of material resources or living space. This makes Dionaea among the most \
|
||||||
|
agreeable members of the galactic community, though their slow, curious alien \
|
||||||
|
minds can be hard to sympathize with."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/teshari
|
||||||
|
name = "Sapients - Teshari"
|
||||||
|
desc = "The Teshari are reptilian pack predators from the Skrell homeworld. \
|
||||||
|
While they evolved alongside the Skrell, their interactions with them tended \
|
||||||
|
to be confused and violent, and until peaceful contact was made they largely \
|
||||||
|
stayed in their territories on and around the poles, in tundral terrain far \
|
||||||
|
too desolate and cold to be of interest to the Skrell. In more enlightened \
|
||||||
|
times, the Teshari are a minority culture on many Skrell worlds, maintaining \
|
||||||
|
their own settlements and cultures, but often finding themselves standing \
|
||||||
|
on the shoulders of their more technologically advanced neighbors when it \
|
||||||
|
comes to meeting and exploring the rest of the galaxy."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/zaddat
|
||||||
|
name = "Sapients - Zaddat"
|
||||||
|
desc = "The Zaddat are an Unathi client species that has recently come to the \
|
||||||
|
Golden Crescent. They wear high-pressure voidsuits called Shrouds to protect \
|
||||||
|
themselves from the harsh light and low pressure of the station, making \
|
||||||
|
medical care a challenge and fighting especially dangerous. \
|
||||||
|
Operating out of massive Colony ships, they trade their labor to their \
|
||||||
|
host nation to fund their search for a new home to replace their \
|
||||||
|
now-lifeless homeworld of Xohox."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/promethean
|
||||||
|
name = "Sapients - Promethean"
|
||||||
|
desc = "Prometheans (Macrolimus artificialis) are a species of artificially-created \
|
||||||
|
gelatinous humanoids, chiefly characterized by their primarily liquid bodies and \
|
||||||
|
ability to change their bodily shape and color in order to mimic many forms of life. \
|
||||||
|
Derived from the Aetolian giant slime (Macrolimus vulgaris) inhabiting the warm, \
|
||||||
|
tropical planet of Aetolus, they are a relatively newly lab-created sapient species, \
|
||||||
|
and as such many things about them have yet to be comprehensively studied."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/vox
|
||||||
|
name = "Sapients - Vox"
|
||||||
|
desc = "Probably the best known of these aliens are the Vox, a bird-like species \
|
||||||
|
with a very rough comprehension of Galactic Common and an even looser understanding \
|
||||||
|
of property rights. Vox raiders have plagued human merchants for centuries, \
|
||||||
|
and Skrell for even longer, but remain poorly understood. \
|
||||||
|
They have no desire to partake in diplomacy or trade with the rest of the galaxy, \
|
||||||
|
or even to conquer planets and stations to live in. They breathe phoron \
|
||||||
|
and appear to be well adapted to their role as space-faring raiders, \
|
||||||
|
leading many to speculate that they're heavily bioengineered, \
|
||||||
|
an assumption which is at odds with their ramshackle technological level."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM // Since Vox are much rarer.
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/drone/drones
|
||||||
|
name = "Drones"
|
||||||
|
desc = "A drone is a software-based artificial intelligence, generally about an order of magnitude \
|
||||||
|
less intelligent than a positronic brain. However, the processing power available to a drone can \
|
||||||
|
vary wildly, from cleaning bots barely more advanced than those from the 21st century to cutting-edge \
|
||||||
|
supercomputers capable of complex conversation. Drones are legally objects in all starfaring polities \
|
||||||
|
outside of the Almach Association, and the sapience of even the most advanced drones is a matter of speculation."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
// Scanning any drone mob will get you this alongside the mob entry itself.
|
||||||
|
unlocked_by_any = list(/datum/category_item/catalogue/technology/drone)
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/positronics
|
||||||
|
name = "Sapients - Positronics"
|
||||||
|
desc = "A Positronic being, often an Android, Gynoid, or Robot, is an individual with a positronic brain, \
|
||||||
|
manufactured and fostered amongst organic life Positronic brains enjoy the same legal status as a humans, \
|
||||||
|
although discrimination is still common, are considered sapient on all accounts, and can be considered \
|
||||||
|
the <20>synthetic species<65>. Half-developed and half-discovered in the 2280<38>s by a black lab studying alien \
|
||||||
|
artifacts, the first positronic brain was an inch-wide cube of palladium-iridium alloy, nano-etched with \
|
||||||
|
billions upon billions of conduits and connections. Upon activation, hard-booted by way of an emitter \
|
||||||
|
laser, the brain issued a single sentence before the neural pathways collapsed and it became an inert \
|
||||||
|
lump of platinum: <20>What is my purpose?<3F>."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/cyborgs
|
||||||
|
name = "Cyborgs"
|
||||||
|
desc = "A Cyborg is an originally organic being composed of largely cybernetic parts. As a brain preserved \
|
||||||
|
in an MMI, they may inhabit an expensive humanoid chassis, a specially designed industrial shell of some \
|
||||||
|
sort, or be integrated into a computer system as an AI. The term covers all species \
|
||||||
|
(even, in some cases, animal brains) and all applications. It can also be used somewhat derogatorily \
|
||||||
|
for those who are still have more organic parts than just their brains, but for example have a \
|
||||||
|
full set of prosthetic limbs."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information
|
||||||
|
|
||||||
|
// For these we can piggyback off of the lore datums that are already defined and used in some places.
|
||||||
|
/datum/category_item/catalogue/information/organization
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
var/datum_to_copy = null
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/New()
|
||||||
|
..()
|
||||||
|
if(datum_to_copy)
|
||||||
|
// I'd just access the loremaster object but it might not exist because its ugly.
|
||||||
|
var/datum/lore/organization/O = new datum_to_copy()
|
||||||
|
// I would also change the name based on the org datum but changing the name messes up indexing in some lists in the category/collection object attached to us.
|
||||||
|
|
||||||
|
// Now lets combine the data in the datum for a slightly more presentable entry.
|
||||||
|
var/constructed_desc = ""
|
||||||
|
|
||||||
|
if(O.motto)
|
||||||
|
constructed_desc += "<center><b><i>\"[O.motto]\"</i></b></center><br><br>"
|
||||||
|
|
||||||
|
constructed_desc += O.desc
|
||||||
|
|
||||||
|
desc = constructed_desc
|
||||||
|
qdel(O)
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/nanotrasen
|
||||||
|
name = "TSC - NanoTrasen Incorporated"
|
||||||
|
datum_to_copy = /datum/lore/organization/tsc/nanotrasen
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/hephaestus
|
||||||
|
name = "TSC - Hephaestus Industries"
|
||||||
|
datum_to_copy = /datum/lore/organization/tsc/hephaestus
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/vey_med
|
||||||
|
name = "TSC - Vey-Medical"
|
||||||
|
datum_to_copy = /datum/lore/organization/tsc/vey_med
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/zeng_hu
|
||||||
|
name = "TSC - Zeng Hu Pharmaceuticals"
|
||||||
|
datum_to_copy = /datum/lore/organization/tsc/zeng_hu
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/ward_takahashi
|
||||||
|
name = "TSC - Ward-Takahashi General Manufacturing Conglomerate"
|
||||||
|
datum_to_copy = /datum/lore/organization/tsc/ward_takahashi
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/bishop
|
||||||
|
name = "TSC - Bishop Cybernetics"
|
||||||
|
datum_to_copy = /datum/lore/organization/tsc/bishop
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/morpheus
|
||||||
|
name = "TSC - Morpheus Cyberkinetics"
|
||||||
|
datum_to_copy = /datum/lore/organization/tsc/morpheus
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/xion
|
||||||
|
name = "TSC - Xion Manufacturing Group"
|
||||||
|
datum_to_copy = /datum/lore/organization/tsc/xion
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/major_bills
|
||||||
|
name = "TSC - Major Bill's Transportation"
|
||||||
|
datum_to_copy = /datum/lore/organization/tsc/mbt
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/solgov
|
||||||
|
name = "Government - Solar Confederate Government"
|
||||||
|
datum_to_copy = /datum/lore/organization/gov/solgov
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/information/organization/virgov
|
||||||
|
name = "Government - Vir Governmental Authority"
|
||||||
|
datum_to_copy = /datum/lore/organization/gov/virgov
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_controversy
|
||||||
|
name = "Precursor Controversy"
|
||||||
|
desc = "The term 'Precursor' is generally used to refer to one or more ancient races that \
|
||||||
|
had obtained vast technological and cultural progress, but no longer appear to be present, \
|
||||||
|
leaving behind what remains of their creations, as well as many questions for the races that \
|
||||||
|
would stumble upon their ruins. Scientists and xenoarcheologists have been hard at work, trying \
|
||||||
|
to uncover the truth.\
|
||||||
|
<br><br>\
|
||||||
|
In modern times, there is controversy over the accuracy of what knowledge has been uncovered. \
|
||||||
|
The mainstream scientific opinion had been that there was one, and only one ancient species, \
|
||||||
|
called the Singularitarians. This view still is the majority today, however there has also \
|
||||||
|
been dissent over that view, as some feel that the possibility of multiple precursor \
|
||||||
|
civilizations should not be ignored. They point towards a large number of discrepancies between \
|
||||||
|
the dominant Singularitarian theory, and various artifacts that have been found, as well as \
|
||||||
|
different artifacts uncovered appearing to have very different characteristics to each other. \
|
||||||
|
Instead, they say that the Singularitarians were one of multiple precursors.\
|
||||||
|
<br><br>\
|
||||||
|
Presently, no conclusive evidence exists for any side."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
// Add the other precursor groups here when they get added.
|
||||||
|
unlocked_by_any = list(
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a,
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_b
|
||||||
|
)
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/singularitarians
|
||||||
|
name = "Precursors - Singularitarians"
|
||||||
|
desc = "The Singularitarians were a massive, highly-advanced spacefaring race which are now \
|
||||||
|
believed to be extinct. At their height, they extended throughout all of known human space, \
|
||||||
|
with major population centers in the Precursor's Crypt region, as well as significant swaths \
|
||||||
|
of Skrell space, until they were wiped out by a self-replicating nanobot plague that still \
|
||||||
|
coats their ruins as a fine layer of dust. They left behind the proto-positronics, as well \
|
||||||
|
as several high-yield phoron deposits and other artifacts of technology studied, \
|
||||||
|
cautiously, by the races that survived them.\
|
||||||
|
<br><br>\
|
||||||
|
Very little is known about the biology and physiology of the Singularitarians, who are believed \
|
||||||
|
to have been largely post-biological. The Vox claim to be the race that created the positronics, \
|
||||||
|
but said claim is only ever brought up when they claim the right to take any positronic they want. \
|
||||||
|
Some more open-minded xenoarcheologists have voiced the opinion that there is some truth in their \
|
||||||
|
claims, but it's far from a scientific consensus."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
unlocked_by_any = list(/datum/category_item/catalogue/anomalous/precursor_controversy)
|
||||||
|
|
||||||
|
// Obtained by scanning any 'precursor a' object, generally things in the UFO PoI.
|
||||||
|
// A is for Ayyyyyy.
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/precursor_a_basic
|
||||||
|
name = "Precursors - Precursor Group Alpha"
|
||||||
|
desc = "This describes a group of xenoarcheological findings which have strong similarities \
|
||||||
|
together. Specifically, this group of objects appears to have a strong aesthetic for the colors \
|
||||||
|
cyan and pink, both colors often being present on everything in this group. It is unknown why \
|
||||||
|
these two colors were chosen by their creators. Another similarity is that most objects made \
|
||||||
|
in this group appear to be comprised of not well understood metallic materials that are dark, \
|
||||||
|
and very resilient. Some objects in this group also appear to utilize electricity to \
|
||||||
|
operate. Finally, a large number of objects in this group appear to have been made \
|
||||||
|
to be used by the creators of those objects in a physical manner.\
|
||||||
|
<br><br>\
|
||||||
|
It should be noted that the findings in this group appear to conflict heavily with what is \
|
||||||
|
known about the Singularitarians, giving some credence towards these objects belonging to a \
|
||||||
|
seperate precursor. As such, the findings have been partitioned inside this scanner to this \
|
||||||
|
group, labeled Precursor Group Alpha."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
unlocked_by_any = list(/datum/category_item/catalogue/anomalous/precursor_a)
|
||||||
|
|
||||||
|
// Obtained by scanning any 'precursor b' object, generally things dug up from xenoarch.
|
||||||
|
// B is for buried.
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_b/precursor_b_basic
|
||||||
|
name = "Precursors - Precursor Group Beta"
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/material
|
||||||
|
|
||||||
|
|
||||||
312
code/modules/catalogue/cataloguer.dm
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
GLOBAL_LIST_EMPTY(all_cataloguers)
|
||||||
|
|
||||||
|
/*
|
||||||
|
This is a special scanner which exists to give explorers something to do besides shoot things.
|
||||||
|
The scanner is able to be used on certain things in the world, and after a variable delay, the scan finishes,
|
||||||
|
giving the person who scanned it some fluff and information about what they just scanned,
|
||||||
|
as well as points that currently do nothing but measure epeen,
|
||||||
|
and will be used as currency in The Future(tm) to buy things explorers care about.
|
||||||
|
|
||||||
|
Scanning hostile mobs and objects is tricky since only mobs that are alive are scannable, so scanning
|
||||||
|
them requires careful position to stay out of harms way until the scan finishes. That is why
|
||||||
|
the person with the scanner gets a visual box that shows where they are allowed to move to
|
||||||
|
without inturrupting the scan.
|
||||||
|
*/
|
||||||
|
/obj/item/device/cataloguer
|
||||||
|
name = "cataloguer"
|
||||||
|
desc = "A hand-held device, used for compiling information about an object by scanning it. Alt+click to highlight scannable objects around you."
|
||||||
|
description_info = "This is a special device used to obtain information about objects and entities in the environment. \
|
||||||
|
To scan something, click on it with the scanner at a distance. \
|
||||||
|
Scanning something requires remaining within a certain radius of the object for a specific period of time, until the \
|
||||||
|
scan is finished. If the scan is inturrupted, it can be resumed from where it was left off, if the same thing is \
|
||||||
|
scanned again."
|
||||||
|
icon = 'icons/obj/device.dmi'
|
||||||
|
icon_state = "cataloguer"
|
||||||
|
w_class = ITEMSIZE_NORMAL
|
||||||
|
origin_tech = list(TECH_MATERIAL = 2, TECH_DATA = 3, TECH_MAGNET = 3)
|
||||||
|
force = 0
|
||||||
|
var/points_stored = 0 // Amount of 'exploration points' this device holds.
|
||||||
|
var/scan_range = 3 // How many tiles away it can scan. Changing this also changes the box size.
|
||||||
|
var/credit_sharing_range = 14 // If another person is within this radius, they will also be credited with a successful scan.
|
||||||
|
var/datum/category_item/catalogue/displayed_data = null // Used for viewing a piece of data in the UI.
|
||||||
|
var/busy = FALSE // Set to true when scanning, to stop multiple scans.
|
||||||
|
var/debug = FALSE // If true, can view all catalogue data defined, regardless of unlock status.
|
||||||
|
var/weakref/partial_scanned = null // Weakref of the thing that was last scanned if inturrupted. Used to allow for partial scans to be resumed.
|
||||||
|
var/partial_scan_time = 0 // How much to make the next scan shorter.
|
||||||
|
|
||||||
|
/obj/item/device/cataloguer/advanced
|
||||||
|
name = "advanced cataloguer"
|
||||||
|
icon_state = "adv_cataloguer"
|
||||||
|
desc = "A hand-held device, used for compiling information about an object by scanning it. This one is an upgraded model, \
|
||||||
|
with a scanner that both can scan from farther away, and with less time."
|
||||||
|
scan_range = 4
|
||||||
|
toolspeed = 0.8
|
||||||
|
|
||||||
|
// Able to see all defined catalogue data regardless of if it was unlocked, intended for testing.
|
||||||
|
/obj/item/device/cataloguer/debug
|
||||||
|
name = "omniscient cataloguer"
|
||||||
|
desc = "A hand-held cataloguer device that appears to be plated with gold. For some reason, it \
|
||||||
|
just seems to already know everything about narrowly defined pieces of knowledge one would find \
|
||||||
|
from nearby, perhaps due to being colored gold. Truly a epistemological mystery."
|
||||||
|
icon_state = "debug_cataloguer"
|
||||||
|
toolspeed = 0.1
|
||||||
|
scan_range = 7
|
||||||
|
debug = TRUE
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/device/cataloguer/Initialize()
|
||||||
|
GLOB.all_cataloguers += src
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/device/cataloguer/Destroy()
|
||||||
|
GLOB.all_cataloguers -= src
|
||||||
|
displayed_data = null
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/device/cataloguer/update_icon()
|
||||||
|
if(busy)
|
||||||
|
icon_state = "[initial(icon_state)]_active"
|
||||||
|
else
|
||||||
|
icon_state = initial(icon_state)
|
||||||
|
|
||||||
|
/obj/item/device/cataloguer/afterattack(atom/target, mob/user, proximity_flag)
|
||||||
|
// Things that invalidate the scan immediately.
|
||||||
|
if(busy)
|
||||||
|
to_chat(user, span("warning", "\The [src] is already scanning something."))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(isturf(target) && (!target.can_catalogue()))
|
||||||
|
var/turf/T = target
|
||||||
|
for(var/a in T) // If we can't scan the turf, see if we can scan anything on it, to help with aiming.
|
||||||
|
var/atom/A = a
|
||||||
|
if(A.can_catalogue())
|
||||||
|
target = A
|
||||||
|
break
|
||||||
|
|
||||||
|
if(!target.can_catalogue(user)) // This will tell the user what is wrong.
|
||||||
|
return
|
||||||
|
|
||||||
|
if(get_dist(target, user) > scan_range)
|
||||||
|
to_chat(user, span("warning", "You are too far away from \the [target] to catalogue it. Get closer."))
|
||||||
|
return
|
||||||
|
|
||||||
|
// Get how long the delay will be.
|
||||||
|
var/scan_delay = target.get_catalogue_delay() * toolspeed
|
||||||
|
if(partial_scanned)
|
||||||
|
if(partial_scanned.resolve() == target)
|
||||||
|
scan_delay -= partial_scan_time
|
||||||
|
to_chat(user, span("notice", "Resuming previous scan."))
|
||||||
|
else
|
||||||
|
to_chat(user, span("warning", "Scanning new target. Previous scan buffer cleared."))
|
||||||
|
|
||||||
|
// Start the special effects.
|
||||||
|
busy = TRUE
|
||||||
|
update_icon()
|
||||||
|
var/datum/beam/scan_beam = user.Beam(target, icon_state = "rped_upgrade", time = scan_delay)
|
||||||
|
var/filter = filter(type = "outline", size = 1, color = "#FFFFFF")
|
||||||
|
target.filters += filter
|
||||||
|
var/list/box_segments = list()
|
||||||
|
if(user.client)
|
||||||
|
box_segments = draw_box(target, scan_range, user.client)
|
||||||
|
color_box(box_segments, "#00FF00", scan_delay)
|
||||||
|
|
||||||
|
playsound(src.loc, 'sound/machines/beep.ogg', 50)
|
||||||
|
|
||||||
|
// The delay, and test for if the scan succeeds or not.
|
||||||
|
var/scan_start_time = world.time
|
||||||
|
if(do_after(user, scan_delay, target, ignore_movement = TRUE, max_distance = scan_range))
|
||||||
|
if(target.can_catalogue(user))
|
||||||
|
to_chat(user, span("notice", "You successfully scan \the [target] with \the [src]."))
|
||||||
|
playsound(src.loc, 'sound/machines/ping.ogg', 50)
|
||||||
|
catalogue_object(target, user)
|
||||||
|
else
|
||||||
|
// In case someone else scans it first, or it died, etc.
|
||||||
|
to_chat(user, span("warning", "\The [target] is no longer valid to scan with \the [src]."))
|
||||||
|
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50)
|
||||||
|
|
||||||
|
partial_scanned = null
|
||||||
|
partial_scan_time = 0
|
||||||
|
else
|
||||||
|
to_chat(user, span("warning", "You failed to finish scanning \the [target] with \the [src]."))
|
||||||
|
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50)
|
||||||
|
color_box(box_segments, "#FF0000", 3)
|
||||||
|
partial_scanned = weakref(target)
|
||||||
|
partial_scan_time += world.time - scan_start_time // This is added to the existing value so two partial scans will add up correctly.
|
||||||
|
sleep(3)
|
||||||
|
busy = FALSE
|
||||||
|
|
||||||
|
// Now clean up the effects.
|
||||||
|
update_icon()
|
||||||
|
QDEL_NULL(scan_beam)
|
||||||
|
if(target)
|
||||||
|
target.filters -= filter
|
||||||
|
if(user.client) // If for some reason they logged out mid-scan the box will be gone anyways.
|
||||||
|
delete_box(box_segments, user.client)
|
||||||
|
|
||||||
|
// Todo: Display scanned information, increment points, etc.
|
||||||
|
/obj/item/device/cataloguer/proc/catalogue_object(atom/target, mob/living/user)
|
||||||
|
// Figure out who may have helped out.
|
||||||
|
var/list/contributers = list()
|
||||||
|
var/list/contributer_names = list()
|
||||||
|
for(var/thing in player_list)
|
||||||
|
var/mob/M = thing
|
||||||
|
if(M == user)
|
||||||
|
continue
|
||||||
|
if(get_dist(M, user) <= credit_sharing_range)
|
||||||
|
contributers += M
|
||||||
|
contributer_names += M.name
|
||||||
|
|
||||||
|
var/points_gained = 0
|
||||||
|
|
||||||
|
// Discover each datum available.
|
||||||
|
var/list/object_data = target.get_catalogue_data()
|
||||||
|
if(LAZYLEN(object_data))
|
||||||
|
for(var/data_type in object_data)
|
||||||
|
var/datum/category_item/catalogue/I = GLOB.catalogue_data.resolve_item(data_type)
|
||||||
|
if(istype(I))
|
||||||
|
var/list/discoveries = I.discover(user, list(user.name) + contributer_names) // If one discovery leads to another, the list returned will have all of them.
|
||||||
|
if(LAZYLEN(discoveries))
|
||||||
|
for(var/D in discoveries)
|
||||||
|
var/datum/category_item/catalogue/data = D
|
||||||
|
points_gained += data.value
|
||||||
|
|
||||||
|
// Give out points.
|
||||||
|
if(points_gained)
|
||||||
|
// First, to us.
|
||||||
|
to_chat(user, span("notice", "Gained [points_gained] points from this scan."))
|
||||||
|
adjust_points(points_gained)
|
||||||
|
|
||||||
|
// Now to our friends, if any.
|
||||||
|
if(contributers.len)
|
||||||
|
for(var/mob/M in contributers)
|
||||||
|
var/list/things = M.GetAllContents(3) // Depth of two should reach into bags but just in case lets make it three.
|
||||||
|
var/obj/item/device/cataloguer/other_cataloguer = locate() in things // If someone has two or more scanners this only adds points to one.
|
||||||
|
if(other_cataloguer)
|
||||||
|
to_chat(M, span("notice", "Gained [points_gained] points from \the [user]'s scan of \the [target]."))
|
||||||
|
other_cataloguer.adjust_points(points_gained)
|
||||||
|
to_chat(user, span("notice", "Shared discovery with [contributers.len] other contributer\s."))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/device/cataloguer/AltClick(mob/user)
|
||||||
|
pulse_scan(user)
|
||||||
|
|
||||||
|
// Gives everything capable of being scanned an outline for a brief moment.
|
||||||
|
// Helps to avoid having to click a hundred things in a room for things that have an entry.
|
||||||
|
/obj/item/device/cataloguer/proc/pulse_scan(mob/user)
|
||||||
|
if(busy)
|
||||||
|
to_chat(user, span("warning", "\The [src] is busy doing something else."))
|
||||||
|
return
|
||||||
|
|
||||||
|
busy = TRUE
|
||||||
|
update_icon()
|
||||||
|
playsound(src.loc, 'sound/machines/beep.ogg', 50)
|
||||||
|
|
||||||
|
// First, get everything able to be scanned.
|
||||||
|
var/list/scannable_atoms = list()
|
||||||
|
for(var/a in view(world.view, user))
|
||||||
|
var/atom/A = a
|
||||||
|
if(A.can_catalogue()) // Not passing the user is intentional, so they don't get spammed.
|
||||||
|
scannable_atoms += A
|
||||||
|
|
||||||
|
// Highlight things able to be scanned.
|
||||||
|
var/filter = filter(type = "outline", size = 1, color = "#00FF00")
|
||||||
|
for(var/a in scannable_atoms)
|
||||||
|
var/atom/A = a
|
||||||
|
A.filters += filter
|
||||||
|
to_chat(user, span("notice", "\The [src] is highlighting scannable objects in green, if any exist."))
|
||||||
|
|
||||||
|
sleep(2 SECONDS)
|
||||||
|
|
||||||
|
// Remove the highlights.
|
||||||
|
for(var/a in scannable_atoms)
|
||||||
|
var/atom/A = a
|
||||||
|
if(QDELETED(A))
|
||||||
|
continue
|
||||||
|
A.filters -= filter
|
||||||
|
|
||||||
|
busy = FALSE
|
||||||
|
update_icon()
|
||||||
|
if(scannable_atoms.len)
|
||||||
|
playsound(src.loc, 'sound/machines/ping.ogg', 50)
|
||||||
|
else
|
||||||
|
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50)
|
||||||
|
to_chat(user, span("notice", "\The [src] found [scannable_atoms.len] object\s that can be scanned."))
|
||||||
|
|
||||||
|
|
||||||
|
// Negative points are bad.
|
||||||
|
/obj/item/device/cataloguer/proc/adjust_points(amount)
|
||||||
|
points_stored = max(0, points_stored += amount)
|
||||||
|
|
||||||
|
/obj/item/device/cataloguer/attack_self(mob/living/user)
|
||||||
|
interact(user)
|
||||||
|
|
||||||
|
/obj/item/device/cataloguer/interact(mob/user)
|
||||||
|
var/list/dat = list()
|
||||||
|
var/title = "Cataloguer Data Display"
|
||||||
|
|
||||||
|
// Important buttons go on top since the scrollbar will default to the top of the window.
|
||||||
|
dat += "Contains <b>[points_stored]</b> Exploration Points."
|
||||||
|
dat += "<a href='?src=\ref[src];pulse_scan=1'>\[Highlight Scannables\]</a><a href='?src=\ref[src];refresh=1'>\[Refresh\]</a><a href='?src=\ref[src];close=1'>\[Close\]</a>"
|
||||||
|
|
||||||
|
// If displayed_data exists, we show that, otherwise we show a list of all data in the mysterious global list.
|
||||||
|
if(displayed_data)
|
||||||
|
title = uppertext(displayed_data.name)
|
||||||
|
|
||||||
|
dat += "<a href='?src=\ref[src];show_data=null'>\[Back to List\]</a>"
|
||||||
|
if(debug && !displayed_data.visible)
|
||||||
|
dat += "<a href='?src=\ref[src];debug_unlock=\ref[displayed_data]'>\[(DEBUG) Force Discovery\]</a>"
|
||||||
|
dat += "<hr>"
|
||||||
|
|
||||||
|
dat += "<i>[displayed_data.desc]</i>"
|
||||||
|
if(LAZYLEN(displayed_data.cataloguers))
|
||||||
|
dat += "Cataloguers : <b>[english_list(displayed_data.cataloguers)]</b>."
|
||||||
|
else
|
||||||
|
dat += "Catalogued by nobody."
|
||||||
|
dat += "Worth <b>[displayed_data.value]</b> exploration points."
|
||||||
|
|
||||||
|
else
|
||||||
|
dat += "<hr>"
|
||||||
|
for(var/G in GLOB.catalogue_data.categories)
|
||||||
|
var/datum/category_group/group = G
|
||||||
|
var/list/group_dat = list()
|
||||||
|
var/show_group = FALSE
|
||||||
|
|
||||||
|
group_dat += "<b>[group.name]</b>"
|
||||||
|
for(var/I in group.items)
|
||||||
|
var/datum/category_item/catalogue/item = I
|
||||||
|
if(item.visible || debug)
|
||||||
|
group_dat += "<a href='?src=\ref[src];show_data=\ref[item]'>[item.name]</a>"
|
||||||
|
show_group = TRUE
|
||||||
|
|
||||||
|
if(show_group || debug) // Avoid showing 'empty' groups on regular cataloguers.
|
||||||
|
dat += group_dat
|
||||||
|
|
||||||
|
var/datum/browser/popup = new(user, "cataloguer_display_\ref[src]", title, 500, 600, src)
|
||||||
|
popup.set_content(dat.Join("<br>"))
|
||||||
|
popup.open()
|
||||||
|
add_fingerprint(user)
|
||||||
|
|
||||||
|
/obj/item/device/cataloguer/Topic(href, href_list)
|
||||||
|
if(..())
|
||||||
|
usr << browse(null, "window=cataloguer_display")
|
||||||
|
return 0
|
||||||
|
if(href_list["close"] )
|
||||||
|
usr << browse(null, "window=cataloguer_display")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(href_list["show_data"])
|
||||||
|
displayed_data = locate(href_list["show_data"])
|
||||||
|
|
||||||
|
if(href_list["pulse_scan"])
|
||||||
|
pulse_scan(usr)
|
||||||
|
return // Don't refresh the window for this or it will open it back if its closed during the highlighting.
|
||||||
|
|
||||||
|
if(href_list["debug_unlock"] && debug)
|
||||||
|
var/datum/category_item/catalogue/item = locate(href_list["debug_unlock"])
|
||||||
|
item.discover(usr, list("Debugger"))
|
||||||
|
|
||||||
|
interact(usr) // So it refreshes the window.
|
||||||
|
return 1
|
||||||
|
|
||||||
68
code/modules/catalogue/cataloguer_visuals.dm
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#define ICON_SIZE 32
|
||||||
|
|
||||||
|
// Draws a box showing the limits of movement while scanning something.
|
||||||
|
// Only the client supplied will see the box.
|
||||||
|
/obj/item/device/cataloguer/proc/draw_box(atom/A, box_size, client/C)
|
||||||
|
. = list()
|
||||||
|
// Things moved with pixel_[x|y] will move the box, so this is to correct that.
|
||||||
|
var/pixel_x_correction = -A.pixel_x
|
||||||
|
var/pixel_y_correction = -A.pixel_y
|
||||||
|
|
||||||
|
// First, place the bottom-left corner.
|
||||||
|
. += draw_line(A, SOUTHWEST, (-box_size * ICON_SIZE) + pixel_x_correction, (-box_size * ICON_SIZE) + pixel_y_correction, C)
|
||||||
|
|
||||||
|
// Make a line on the bottom, going right.
|
||||||
|
for(var/i = 1 to (box_size * 2) - 1)
|
||||||
|
var/x_displacement = (-box_size * ICON_SIZE) + (ICON_SIZE * i) + pixel_x_correction
|
||||||
|
var/y_displacement = (-box_size * ICON_SIZE) + pixel_y_correction
|
||||||
|
. += draw_line(A, SOUTH, x_displacement, y_displacement, C)
|
||||||
|
|
||||||
|
// Bottom-right corner.
|
||||||
|
. += draw_line(A, SOUTHEAST, (box_size * ICON_SIZE) + pixel_x_correction, (-box_size * ICON_SIZE) + pixel_y_correction, C)
|
||||||
|
|
||||||
|
// Second line, for the right side going up.
|
||||||
|
for(var/i = 1 to (box_size * 2) - 1)
|
||||||
|
var/x_displacement = (box_size * ICON_SIZE) + pixel_x_correction
|
||||||
|
var/y_displacement = (-box_size * ICON_SIZE) + (ICON_SIZE * i) + pixel_y_correction
|
||||||
|
. += draw_line(A, EAST, x_displacement, y_displacement, C)
|
||||||
|
|
||||||
|
// Top-right corner.
|
||||||
|
. += draw_line(A, NORTHEAST, (box_size * ICON_SIZE) + pixel_x_correction, (box_size * ICON_SIZE) + pixel_y_correction, C)
|
||||||
|
|
||||||
|
// Third line, for the top, going right.
|
||||||
|
for(var/i = 1 to (box_size * 2) - 1)
|
||||||
|
var/x_displacement = (-box_size * ICON_SIZE) + (ICON_SIZE * i) + pixel_x_correction
|
||||||
|
var/y_displacement = (box_size * ICON_SIZE) + pixel_y_correction
|
||||||
|
. += draw_line(A, NORTH, x_displacement, y_displacement, C)
|
||||||
|
|
||||||
|
// Top-left corner.
|
||||||
|
. += draw_line(A, NORTHWEST, (-box_size * ICON_SIZE) + pixel_x_correction, (box_size * ICON_SIZE) + pixel_y_correction, C)
|
||||||
|
|
||||||
|
// Fourth and last line, for the left side going up.
|
||||||
|
for(var/i = 1 to (box_size * 2) - 1)
|
||||||
|
var/x_displacement = (-box_size * ICON_SIZE) + pixel_x_correction
|
||||||
|
var/y_displacement = (-box_size * ICON_SIZE) + (ICON_SIZE * i) + pixel_y_correction
|
||||||
|
. += draw_line(A, WEST, x_displacement, y_displacement, C)
|
||||||
|
|
||||||
|
#undef ICON_SIZE
|
||||||
|
|
||||||
|
// Draws an individual segment of the box.
|
||||||
|
/obj/item/device/cataloguer/proc/draw_line(atom/A, line_dir, line_pixel_x, line_pixel_y, client/C)
|
||||||
|
var/image/line = image(icon = 'icons/effects/effects.dmi', loc = A, icon_state = "stripes", dir = line_dir)
|
||||||
|
line.pixel_x = line_pixel_x
|
||||||
|
line.pixel_y = line_pixel_y
|
||||||
|
line.plane = PLANE_FULLSCREEN // It's technically a HUD element but it doesn't need to show above item slots.
|
||||||
|
line.appearance_flags = RESET_TRANSFORM|RESET_COLOR|RESET_ALPHA|NO_CLIENT_COLOR|TILE_BOUND
|
||||||
|
line.alpha = 125
|
||||||
|
C.images += line
|
||||||
|
return line
|
||||||
|
|
||||||
|
// Removes the box that was generated before from the client.
|
||||||
|
/obj/item/device/cataloguer/proc/delete_box(list/box_segments, client/C)
|
||||||
|
for(var/i in box_segments)
|
||||||
|
C.images -= i
|
||||||
|
qdel(i)
|
||||||
|
|
||||||
|
/obj/item/device/cataloguer/proc/color_box(list/box_segments, new_color, new_time)
|
||||||
|
for(var/i in box_segments)
|
||||||
|
animate(i, color = new_color, time = new_time)
|
||||||
@@ -98,3 +98,4 @@
|
|||||||
name = "shipping cap"
|
name = "shipping cap"
|
||||||
desc = "It's a ballcap bearing the colors of Major Bill's Shipping."
|
desc = "It's a ballcap bearing the colors of Major Bill's Shipping."
|
||||||
icon_state = "mbillsoft"
|
icon_state = "mbillsoft"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/major_bills)
|
||||||
|
|||||||
@@ -821,6 +821,7 @@
|
|||||||
desc = "A uniform belonging to Major Bill's Transportation, a shipping megacorporation."
|
desc = "A uniform belonging to Major Bill's Transportation, a shipping megacorporation."
|
||||||
icon_state = "mbill"
|
icon_state = "mbill"
|
||||||
worn_state = "mbill"
|
worn_state = "mbill"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/major_bills)
|
||||||
|
|
||||||
/obj/item/clothing/under/confederacy
|
/obj/item/clothing/under/confederacy
|
||||||
name = "\improper Confederacy uniform"
|
name = "\improper Confederacy uniform"
|
||||||
|
|||||||
@@ -285,6 +285,7 @@
|
|||||||
/obj/item/device/mmi/digital/robot
|
/obj/item/device/mmi/digital/robot
|
||||||
name = "robotic intelligence circuit"
|
name = "robotic intelligence circuit"
|
||||||
desc = "The pinnacle of artifical intelligence which can be achieved using classical computer science."
|
desc = "The pinnacle of artifical intelligence which can be achieved using classical computer science."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/drone/drones)
|
||||||
icon = 'icons/obj/module.dmi'
|
icon = 'icons/obj/module.dmi'
|
||||||
icon_state = "mainboard"
|
icon_state = "mainboard"
|
||||||
w_class = ITEMSIZE_NORMAL
|
w_class = ITEMSIZE_NORMAL
|
||||||
@@ -306,6 +307,7 @@
|
|||||||
/obj/item/device/mmi/digital/posibrain
|
/obj/item/device/mmi/digital/posibrain
|
||||||
name = "positronic brain"
|
name = "positronic brain"
|
||||||
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
|
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/positronics)
|
||||||
icon = 'icons/obj/assemblies.dmi'
|
icon = 'icons/obj/assemblies.dmi'
|
||||||
icon_state = "posibrain"
|
icon_state = "posibrain"
|
||||||
w_class = ITEMSIZE_NORMAL
|
w_class = ITEMSIZE_NORMAL
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \
|
refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \
|
||||||
smell.<br/><br/>Most humans will never meet a Vox raider, instead learning of this insular species through \
|
smell.<br/><br/>Most humans will never meet a Vox raider, instead learning of this insular species through \
|
||||||
dealing with their traders and merchants; those that do rarely enjoy the experience."
|
dealing with their traders and merchants; those that do rarely enjoy the experience."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/vox)
|
||||||
|
|
||||||
// taste_sensitivity = TASTE_DULL
|
// taste_sensitivity = TASTE_DULL
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
var/name // Species name.
|
var/name // Species name.
|
||||||
var/name_plural // Pluralized name (since "[name]s" is not always valid)
|
var/name_plural // Pluralized name (since "[name]s" is not always valid)
|
||||||
var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen.
|
var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen.
|
||||||
|
var/list/catalogue_data = null // A list of /datum/category_item/catalogue datums, for the cataloguer, or null.
|
||||||
|
|
||||||
// Icon/appearance vars.
|
// Icon/appearance vars.
|
||||||
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
|
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ var/datum/species/shapeshifter/promethean/prometheans
|
|||||||
mimic many forms of life. Derived from the Aetolian giant slime (Macrolimus vulgaris) inhabiting the warm, tropical planet \
|
mimic many forms of life. Derived from the Aetolian giant slime (Macrolimus vulgaris) inhabiting the warm, tropical planet \
|
||||||
of Aetolus, they are a relatively new lab-created sapient species, and as such many things about them have yet to be comprehensively studied. \
|
of Aetolus, they are a relatively new lab-created sapient species, and as such many things about them have yet to be comprehensively studied. \
|
||||||
What has Science done?"
|
What has Science done?"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/promethean)
|
||||||
show_ssd = "totally quiescent"
|
show_ssd = "totally quiescent"
|
||||||
death_message = "rapidly loses cohesion, splattering across the ground..."
|
death_message = "rapidly loses cohesion, splattering across the ground..."
|
||||||
knockout_message = "collapses inwards, forming a disordered puddle of goo."
|
knockout_message = "collapses inwards, forming a disordered puddle of goo."
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
the polar tundral regions outside of Skrell territory. Extremely fragile, they developed \
|
the polar tundral regions outside of Skrell territory. Extremely fragile, they developed \
|
||||||
hunting skills that emphasized taking out their prey without themselves getting hit. They \
|
hunting skills that emphasized taking out their prey without themselves getting hit. They \
|
||||||
are only recently becoming known on human stations after reaching space with Skrell assistance."
|
are only recently becoming known on human stations after reaching space with Skrell assistance."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/teshari)
|
||||||
|
|
||||||
num_alternate_languages = 3
|
num_alternate_languages = 3
|
||||||
secondary_langs = list(LANGUAGE_SCHECHI, LANGUAGE_SKRELLIAN)
|
secondary_langs = list(LANGUAGE_SCHECHI, LANGUAGE_SKRELLIAN)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
While the central Sol government maintains control of its far-flung people, powerful corporate \
|
While the central Sol government maintains control of its far-flung people, powerful corporate \
|
||||||
interests, rampant cyber and bio-augmentation and secretive factions make life on most human \
|
interests, rampant cyber and bio-augmentation and secretive factions make life on most human \
|
||||||
worlds tumultous at best."
|
worlds tumultous at best."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/humans)
|
||||||
num_alternate_languages = 3
|
num_alternate_languages = 3
|
||||||
species_language = LANGUAGE_SOL_COMMON
|
species_language = LANGUAGE_SOL_COMMON
|
||||||
secondary_langs = list(LANGUAGE_SOL_COMMON, LANGUAGE_TERMINUS)
|
secondary_langs = list(LANGUAGE_SOL_COMMON, LANGUAGE_TERMINUS)
|
||||||
@@ -67,6 +68,7 @@
|
|||||||
planet, they mostly hold ideals of honesty, virtue, proficiency and bravery above all \
|
planet, they mostly hold ideals of honesty, virtue, proficiency and bravery above all \
|
||||||
else, frequently even their own lives. They prefer warmer temperatures than most species and \
|
else, frequently even their own lives. They prefer warmer temperatures than most species and \
|
||||||
their native tongue is a heavy hissing laungage called Sinta'Unathi."
|
their native tongue is a heavy hissing laungage called Sinta'Unathi."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/unathi)
|
||||||
|
|
||||||
cold_level_1 = 280 //Default 260 - Lower is better
|
cold_level_1 = 280 //Default 260 - Lower is better
|
||||||
cold_level_2 = 220 //Default 200
|
cold_level_2 = 220 //Default 200
|
||||||
@@ -178,6 +180,7 @@
|
|||||||
and have accelerated the fledgling culture into the interstellar age. Their history is full of war and highly fractious \
|
and have accelerated the fledgling culture into the interstellar age. Their history is full of war and highly fractious \
|
||||||
governments, something that permeates even to today's times. They prefer colder, tundra-like climates, much like their \
|
governments, something that permeates even to today's times. They prefer colder, tundra-like climates, much like their \
|
||||||
home worlds and speak a variety of languages, especially Siik and Akhani."
|
home worlds and speak a variety of languages, especially Siik and Akhani."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/tajaran)
|
||||||
|
|
||||||
body_temperature = 320.15 //Even more cold resistant, even more flammable
|
body_temperature = 320.15 //Even more cold resistant, even more flammable
|
||||||
|
|
||||||
@@ -244,6 +247,7 @@
|
|||||||
of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \
|
of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \
|
||||||
herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \
|
herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \
|
||||||
the secrets of their empire to their allies."
|
the secrets of their empire to their allies."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/skrell)
|
||||||
num_alternate_languages = 3
|
num_alternate_languages = 3
|
||||||
secondary_langs = list(LANGUAGE_SKRELLIAN, LANGUAGE_SCHECHI)
|
secondary_langs = list(LANGUAGE_SKRELLIAN, LANGUAGE_SCHECHI)
|
||||||
name_language = LANGUAGE_SKRELLIAN
|
name_language = LANGUAGE_SKRELLIAN
|
||||||
@@ -336,7 +340,12 @@
|
|||||||
min_age = 16
|
min_age = 16
|
||||||
max_age = 90
|
max_age = 90
|
||||||
|
|
||||||
blurb = "The Zaddat are an Unathi client race only recently introduced to SolGov space. Having evolved on the high-pressure and post-apocalyptic world of Xohok, Zaddat require an environmental suit called a Shroud to survive in usual planetary and station atmospheres. Despite these restrictions, worsening conditions on Xohok and the blessing of the Moghes Hegemony have lead the Zaddat to enter human space in search of work and living space."
|
blurb = "The Zaddat are an Unathi client race only recently introduced to SolGov space. Having evolved on \
|
||||||
|
the high-pressure and post-apocalyptic world of Xohok, Zaddat require an environmental suit called a Shroud \
|
||||||
|
to survive in usual planetary and station atmospheres. Despite these restrictions, worsening conditions on \
|
||||||
|
Xohok and the blessing of the Moghes Hegemony have lead the Zaddat to enter human space in search of work \
|
||||||
|
and living space."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/zaddat)
|
||||||
|
|
||||||
hazard_high_pressure = HAZARD_HIGH_PRESSURE + 500 // Dangerously high pressure.
|
hazard_high_pressure = HAZARD_HIGH_PRESSURE + 500 // Dangerously high pressure.
|
||||||
warning_high_pressure = WARNING_HIGH_PRESSURE + 500 // High pressure warning.
|
warning_high_pressure = WARNING_HIGH_PRESSURE + 500 // High pressure warning.
|
||||||
@@ -448,6 +457,7 @@
|
|||||||
all known species, especially the Skrell. Their communal mind makes them slow to react, and they have difficulty understanding \
|
all known species, especially the Skrell. Their communal mind makes them slow to react, and they have difficulty understanding \
|
||||||
even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
|
even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
|
||||||
water and other radiation."
|
water and other radiation."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/dionaea)
|
||||||
|
|
||||||
has_organ = list(
|
has_organ = list(
|
||||||
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
|
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
|
||||||
|
|||||||
@@ -278,11 +278,11 @@
|
|||||||
modtype = prefix
|
modtype = prefix
|
||||||
|
|
||||||
if(istype(mmi, /obj/item/device/mmi/digital/posibrain))
|
if(istype(mmi, /obj/item/device/mmi/digital/posibrain))
|
||||||
braintype = "Robot"
|
braintype = BORG_BRAINTYPE_POSI
|
||||||
else if(istype(mmi, /obj/item/device/mmi/digital/robot))
|
else if(istype(mmi, /obj/item/device/mmi/digital/robot))
|
||||||
braintype = "Drone"
|
braintype = BORG_BRAINTYPE_DRONE
|
||||||
else
|
else
|
||||||
braintype = "Cyborg"
|
braintype = BORG_BRAINTYPE_CYBORG
|
||||||
|
|
||||||
|
|
||||||
var/changed_name = ""
|
var/changed_name = ""
|
||||||
@@ -1099,7 +1099,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/silicon/robot/is_sentient()
|
/mob/living/silicon/robot/is_sentient()
|
||||||
return braintype != "Drone"
|
return braintype != BORG_BRAINTYPE_DRONE
|
||||||
|
|
||||||
|
|
||||||
/mob/living/silicon/robot/drop_item()
|
/mob/living/silicon/robot/drop_item()
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
mob_swap_flags = ~HEAVY
|
mob_swap_flags = ~HEAVY
|
||||||
mob_push_flags = ~HEAVY
|
mob_push_flags = ~HEAVY
|
||||||
|
|
||||||
var/tt_desc = "Uncataloged Life Form" //Tooltip description
|
var/tt_desc = null //Tooltip description
|
||||||
|
|
||||||
//Settings for played mobs
|
//Settings for played mobs
|
||||||
var/show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
|
var/show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
|
||||||
|
|||||||
@@ -4,11 +4,66 @@
|
|||||||
Thick material will prevent injections, similar to other means of injections.
|
Thick material will prevent injections, similar to other means of injections.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Obtained by scanning any giant spider.
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/giant_spiders
|
||||||
|
name = "Giant Spiders"
|
||||||
|
desc = "Giant Spiders are massive arachnids genetically descended from conventional Earth spiders, \
|
||||||
|
however what caused ordinary arachnids to evolve into these are disputed. \
|
||||||
|
Different initial species of spider have co-evolved and interbred to produce a robust biological caste system \
|
||||||
|
capable of producing many varieties of giant spider. They are considered by most people to be a dangerous \
|
||||||
|
invasive species, due to their hostility, venom, and high rate of reproduction. A strong resistance to \
|
||||||
|
various poisons and toxins has been found, making it difficult to indirectly control their population.\
|
||||||
|
<br><br>\
|
||||||
|
Giant Spiders have three known castes, 'Guard', 'Hunter', and 'Nurse'. \
|
||||||
|
Spiders in the Guard caste are generally the physically stronger, resilient types. \
|
||||||
|
The ones in the Hunter caste are usually faster, or have some from of ability to \
|
||||||
|
close the distance between them and their prey rapidly. \
|
||||||
|
Finally, those in the Nurse caste generally act in a supporting role to the other two \
|
||||||
|
castes, spinning webs and ensuring their nest grows larger and more terrifying."
|
||||||
|
value = CATALOGUER_REWARD_TRIVIAL
|
||||||
|
unlocked_by_any = list(/datum/category_item/catalogue/fauna/giant_spider)
|
||||||
|
|
||||||
|
// Obtained by scanning all spider types.
|
||||||
|
/datum/category_item/catalogue/fauna/all_giant_spiders
|
||||||
|
name = "Collection - Giant Spiders"
|
||||||
|
desc = "You have scanned a large array of different types of giant spiders, \
|
||||||
|
and therefore you have been granted a large sum of points, through this \
|
||||||
|
entry."
|
||||||
|
value = CATALOGUER_REWARD_HARD
|
||||||
|
unlocked_by_all = list(
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/guard_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/carrier_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/electric_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/frost_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/hunter_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/lurker_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/nurse_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/pepper_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/phorogenic_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/thermic_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/tunneler_spider,
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/webslinger_spider
|
||||||
|
)
|
||||||
|
|
||||||
|
// Specific to guard spiders.
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/guard_spider
|
||||||
|
name = "Giant Spider - Guard"
|
||||||
|
desc = "This specific spider has been catalogued as 'Guard', \
|
||||||
|
and belongs to the 'Guard' caste. It has a brown coloration, with \
|
||||||
|
red glowing eyes.\
|
||||||
|
<br><br>\
|
||||||
|
This spider, like the others in its caste, is bulky, strong, and resilient. It \
|
||||||
|
relies on its raw strength to kill prey, due to having less potent venom compared \
|
||||||
|
to other spiders."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
// The base spider, in the 'walking tank' family.
|
// The base spider, in the 'walking tank' family.
|
||||||
/mob/living/simple_mob/animal/giant_spider
|
/mob/living/simple_mob/animal/giant_spider
|
||||||
name = "giant spider"
|
name = "giant spider"
|
||||||
desc = "Furry and brown, it makes you shudder to look at it. This one has deep red eyes."
|
desc = "Furry and brown, it makes you shudder to look at it. This one has deep red eyes."
|
||||||
tt_desc = "Atrax robustus gigantus"
|
tt_desc = "X Atrax robustus gigantus"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/guard_spider)
|
||||||
|
|
||||||
icon_state = "guard"
|
icon_state = "guard"
|
||||||
icon_living = "guard"
|
icon_living = "guard"
|
||||||
icon_dead = "guard_dead"
|
icon_dead = "guard_dead"
|
||||||
@@ -61,4 +116,3 @@
|
|||||||
if(prob(poison_chance))
|
if(prob(poison_chance))
|
||||||
to_chat(L, "<span class='warning'>You feel a tiny prick.</span>")
|
to_chat(L, "<span class='warning'>You feel a tiny prick.</span>")
|
||||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,21 @@
|
|||||||
// Carriers are not too dangerous on their own, but they create more spiders when dying.
|
// Carriers are not too dangerous on their own, but they create more spiders when dying.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/carrier_spider
|
||||||
|
name = "Giant Spider - Carrier"
|
||||||
|
desc = "This specific spider has been catalogued as 'Carrier', \
|
||||||
|
and it belongs to the 'Nurse' caste. \
|
||||||
|
<br><br>\
|
||||||
|
The spider has a beige and red appearnce, with bright green eyes. \
|
||||||
|
Inside the spider are a large number of younger spiders and spiderlings, hence \
|
||||||
|
the Carrier classification. \
|
||||||
|
If the host dies, they will be able to exit the body and survive independantly, \
|
||||||
|
unless the host dies catastrophically."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/carrier
|
/mob/living/simple_mob/animal/giant_spider/carrier
|
||||||
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes."
|
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/carrier_spider)
|
||||||
|
|
||||||
icon_state = "carrier"
|
icon_state = "carrier"
|
||||||
icon_living = "carrier"
|
icon_living = "carrier"
|
||||||
icon_dead = "carrier_dead"
|
icon_dead = "carrier_dead"
|
||||||
@@ -60,8 +74,15 @@
|
|||||||
new_body.key = src.key
|
new_body.key = src.key
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
// Note that this isn't required for the 'scan all spiders' entry since its essentially a meme.
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/recursive_carrier_spider
|
||||||
|
name = "Giant Spider - Recursive Carrier"
|
||||||
|
desc = "<font face='comic sans ms'>It's Carriers all the way down.</font>"
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/carrier/recursive
|
/mob/living/simple_mob/animal/giant_spider/carrier/recursive
|
||||||
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes. \
|
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes. \
|
||||||
You have a distinctly <font face='comic sans ms'>bad</font> feeling about this."
|
You have a distinctly <font face='comic sans ms'>bad</font> feeling about this."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/recursive_carrier_spider)
|
||||||
|
|
||||||
swarmling_type = /mob/living/simple_mob/animal/giant_spider/carrier/recursive
|
swarmling_type = /mob/living/simple_mob/animal/giant_spider/carrier/recursive
|
||||||
@@ -1,8 +1,26 @@
|
|||||||
// Electric spiders fire taser-like beams at their enemies.
|
// Electric spiders fire taser-like beams at their enemies.
|
||||||
// TODO: AI
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/electric_spider
|
||||||
|
name = "Giant Spider - Electric"
|
||||||
|
desc = "This specific spider has been catalogued as 'Electric', \
|
||||||
|
and it belongs to the 'Guard' caste. \
|
||||||
|
<br><br>\
|
||||||
|
The spider has a yellow coloration, with a spined back, and possessing bright yellow eyes that flicker. \
|
||||||
|
It has evolved to be able to utilize a form of bioelectrogenesis as a means of attack, discharging painful \
|
||||||
|
bolts of electricity at their prey to subdue it, before closing in. Their body also has strong insulative \
|
||||||
|
properties, presumably to protect the body while using its attack. \
|
||||||
|
<br><br>\
|
||||||
|
The venom they produce is known to be a stimulant, causing increased agility in speed in those bitten, \
|
||||||
|
which would at first appear to hinder the Electric Spider, however the stimulant also causes twitching, \
|
||||||
|
uncontrollable movement, and organ failure, which is accelerated when the bitten prey tries to use their \
|
||||||
|
newfound speed to flee. It is not uncommon for prey to collapse and die shortly after appearing to have \
|
||||||
|
'escaped' the spider, enabling a form of persistance hunting for the Electric Spider."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/electric
|
/mob/living/simple_mob/animal/giant_spider/electric
|
||||||
desc = "Spined and yellow, it makes you shudder to look at it. This one has flickering gold eyes."
|
desc = "Spined and yellow, it makes you shudder to look at it. This one has flickering gold eyes."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/electric_spider)
|
||||||
|
|
||||||
icon_state = "spark"
|
icon_state = "spark"
|
||||||
icon_living = "spark"
|
icon_living = "spark"
|
||||||
icon_dead = "spark_dead"
|
icon_dead = "spark_dead"
|
||||||
@@ -29,7 +47,6 @@
|
|||||||
|
|
||||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged/electric_spider
|
ai_holder_type = /datum/ai_holder/simple_mob/ranged/electric_spider
|
||||||
|
|
||||||
|
|
||||||
/obj/item/projectile/beam/stun/electric_spider
|
/obj/item/projectile/beam/stun/electric_spider
|
||||||
name = "stun beam"
|
name = "stun beam"
|
||||||
agony = 20
|
agony = 20
|
||||||
|
|||||||
@@ -1,7 +1,24 @@
|
|||||||
// Frost spiders inject cryotoxin, slowing people down (which is very bad if trying to run from spiders).
|
// Frost spiders inject cryotoxin, slowing people down (which is very bad if trying to run from spiders).
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/frost_spider
|
||||||
|
name = "Giant Spider - Frost"
|
||||||
|
desc = "This specific spider has been catalogued as 'Frost', \
|
||||||
|
and it belongs to the 'Guard' caste. \
|
||||||
|
The spider is blue, and often has ice hanging off of it. It is also said to have an icy gaze, with its blue eyes. \
|
||||||
|
<br><br>\
|
||||||
|
It has adapted for survival in colder climates, with its body able to insulate itself from colder environments. \
|
||||||
|
Unfortunately for it, this also has given them a vulnerability to heat.\
|
||||||
|
<br><br>\
|
||||||
|
Frost Spider venom causes a sharp decrease in body temperature to those bitten, which causes \
|
||||||
|
hypothermia. It also slows down the victim, making it more difficult to escape by fleeing. \
|
||||||
|
The danger is amplified by the fact that humans that receive the venom are often wearing \
|
||||||
|
thermal insulating clothing, making it more difficult to warm up."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/frost
|
/mob/living/simple_mob/animal/giant_spider/frost
|
||||||
desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes."
|
desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/frost_spider)
|
||||||
|
|
||||||
icon_state = "frost"
|
icon_state = "frost"
|
||||||
icon_living = "frost"
|
icon_living = "frost"
|
||||||
icon_dead = "frost_dead"
|
icon_dead = "frost_dead"
|
||||||
|
|||||||
@@ -2,8 +2,23 @@
|
|||||||
// The leaping attack is somewhat telegraphed and can be dodged if one is paying attention.
|
// The leaping attack is somewhat telegraphed and can be dodged if one is paying attention.
|
||||||
// The AI would've followed up after a successful leap with dragging the downed victim away, but the dragging code was too janky.
|
// The AI would've followed up after a successful leap with dragging the downed victim away, but the dragging code was too janky.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/hunter_spider
|
||||||
|
name = "Giant Spider - Hunter"
|
||||||
|
desc = "This specific spider has been catalogued as 'Hunter', \
|
||||||
|
and it belongs to the 'Hunter' caste. \
|
||||||
|
The spider is entirely black in color, with purple eyes. \
|
||||||
|
<br><br>\
|
||||||
|
The Hunter spider is noted for being one of the most agile types of spiders, being able \
|
||||||
|
to move quickly, and do a short leap in the air. Due to their considerable weight, being leaped on \
|
||||||
|
will often cause the victim to fall over, making this their main hunting tactic. \
|
||||||
|
<br><br>\
|
||||||
|
The venom inside these spiders has no special properties beyond being toxic."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/hunter
|
/mob/living/simple_mob/animal/giant_spider/hunter
|
||||||
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
|
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/hunter_spider)
|
||||||
|
|
||||||
icon_state = "hunter"
|
icon_state = "hunter"
|
||||||
icon_living = "hunter"
|
icon_living = "hunter"
|
||||||
icon_dead = "hunter_dead"
|
icon_dead = "hunter_dead"
|
||||||
|
|||||||
@@ -3,8 +3,27 @@
|
|||||||
// They keep attacking until the stun ends, then retreat to cloak again and repeat the cycle.
|
// They keep attacking until the stun ends, then retreat to cloak again and repeat the cycle.
|
||||||
// Hitting the spider before it does its ambush attack will break the cloak and make the spider flee.
|
// Hitting the spider before it does its ambush attack will break the cloak and make the spider flee.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/lurker_spider
|
||||||
|
name = "Giant Spider - Lurker"
|
||||||
|
desc = "This specific spider has been catalogued as 'Lurker', \
|
||||||
|
and it belongs to the 'Hunter' caste. \
|
||||||
|
The spider is colored white, however it is more often seen being translucent. It has red eyes. \
|
||||||
|
<br><br>\
|
||||||
|
Lurkers are well known for being able to become almost entirely transparent, making them difficult \
|
||||||
|
to see to those distracted or with poor sight. They primarily hunt by sneaking up to unsuspecting prey, \
|
||||||
|
then ambushing them with a single powerful strike to incapacitate, before going for the kill. \
|
||||||
|
Their translucent state appears to require some form of active management, as they become fully visible \
|
||||||
|
after their surprise strike, or if they are harmed while translucent. Lurkers have \
|
||||||
|
a conservative and opportunistic hunting style, fleeing into the shadows if their translucent cloak is compromised \
|
||||||
|
from observant prey, or if their prey is still alive after their initial ambush. \
|
||||||
|
<br><br>\
|
||||||
|
The venom from this spider can cause confusion to those afflicted."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/lurker
|
/mob/living/simple_mob/animal/giant_spider/lurker
|
||||||
desc = "Translucent and white, it makes you shudder to look at it. This one has incandescent red eyes."
|
desc = "Translucent and white, it makes you shudder to look at it. This one has incandescent red eyes."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/lurker_spider)
|
||||||
|
|
||||||
icon_state = "lurker"
|
icon_state = "lurker"
|
||||||
icon_living = "lurker"
|
icon_living = "lurker"
|
||||||
icon_dead = "lurker_dead"
|
icon_dead = "lurker_dead"
|
||||||
|
|||||||
@@ -1,7 +1,31 @@
|
|||||||
// Nurses, they create webs and eggs.
|
// Nurses, they create webs and eggs.
|
||||||
// They're fragile but their attacks can cause horrifying consequences.
|
// They're fragile but their attacks can cause horrifying consequences.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/nurse_spider
|
||||||
|
name = "Giant Spider - Nurse"
|
||||||
|
desc = "This specific spider has been catalogued as 'Nurse', \
|
||||||
|
and it belongs to the 'Nurse' caste. \
|
||||||
|
The spider has a beige coloration, with green eyes. \
|
||||||
|
<br><br>\
|
||||||
|
Nurses primarily spin webs and lay eggs for the other spiders, making them a critical role \
|
||||||
|
for the survival of their species in their local area. Despite this importance, they are \
|
||||||
|
(compared to the other spiders) rather frail and weak, thus requiring protection from the \
|
||||||
|
other spiders. Laying eggs requires considerable amounts of resources, meaning Nurses generally \
|
||||||
|
only lay eggs after they or another spider successfully hunts prey.\
|
||||||
|
<br><br>\
|
||||||
|
Unlike ordinary spiders, Nurses can create vast amounts of web in a short period of time, making \
|
||||||
|
their nest difficult and dangerous to move around in. Their webs also sometimes obscure what is \
|
||||||
|
behind them, giving an advantage to spiders defending their nest, and invoking paranoia in humans \
|
||||||
|
tasked with exterminating the spiders. \
|
||||||
|
<br><br>\
|
||||||
|
Nurse venom causes fatigue and tiredness. They are also able to directly inject spider eggs into \
|
||||||
|
those it bites, which can later hatch spiderlings, causing considerably physical and psychological trauma."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/nurse
|
/mob/living/simple_mob/animal/giant_spider/nurse
|
||||||
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes."
|
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/nurse_spider)
|
||||||
|
|
||||||
icon_state = "nurse"
|
icon_state = "nurse"
|
||||||
icon_living = "nurse"
|
icon_living = "nurse"
|
||||||
icon_dead = "nurse_dead"
|
icon_dead = "nurse_dead"
|
||||||
|
|||||||
@@ -1,7 +1,20 @@
|
|||||||
// Pepper spiders inject condensed capsaicin into their victims.
|
// Pepper spiders inject condensed capsaicin into their victims.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/pepper_spider
|
||||||
|
name = "Giant Spider - Pepper"
|
||||||
|
desc = "This specific spider has been catalogued as 'Pepper', \
|
||||||
|
and it belongs to the 'Guard' caste. \
|
||||||
|
Red makes up a majority of the spider's appearance, including its eyes, with some brown on its body as well. \
|
||||||
|
<br><br>\
|
||||||
|
Pepper spiders are named due to producing capsaicin, and using it as a venom to incapacitate their prey, in an \
|
||||||
|
incredibly painful way. Their raw strength is considerably less than some of the other spiders, however \
|
||||||
|
they share a similar level of endurance with the other spiders in their caste, making them difficult to put down."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/pepper
|
/mob/living/simple_mob/animal/giant_spider/pepper
|
||||||
desc = "Red and brown, it makes you shudder to look at it. This one has glinting red eyes."
|
desc = "Red and brown, it makes you shudder to look at it. This one has glinting red eyes."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/pepper_spider)
|
||||||
|
|
||||||
icon_state = "pepper"
|
icon_state = "pepper"
|
||||||
icon_living = "pepper"
|
icon_living = "pepper"
|
||||||
icon_dead = "pepper_dead"
|
icon_dead = "pepper_dead"
|
||||||
|
|||||||
@@ -1,8 +1,32 @@
|
|||||||
// Phorogenic spiders explode when they die.
|
// Phorogenic spiders explode when they die.
|
||||||
// You really shouldn't melee them.
|
// You really shouldn't melee them.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/phorogenic_spider
|
||||||
|
name = "Giant Spider - Phorogenic"
|
||||||
|
desc = "This specific spider has been catalogued as 'Phorogenic', \
|
||||||
|
and it belongs to the 'Guard' caste. \
|
||||||
|
The spider has a purple, crystalline appearance, with their eyes also purple.\
|
||||||
|
<br><br>\
|
||||||
|
These spiders are very dangerous, and unusual. They have obviously been influenced by the mysterious \
|
||||||
|
material known as phoron, however it is not known if this is the result of arachnids merely being \
|
||||||
|
exposed to naturally-occuring phoron on some alien world, being genetically altered to produce phoron by an unknown party, \
|
||||||
|
or some other unknown cause. \
|
||||||
|
<br><br>\
|
||||||
|
Compared to the other types of spiders in their caste, and even to those outside, this one is the \
|
||||||
|
peak of physical strength. It is very strong, often capable of killing its prey in one or two bites, \
|
||||||
|
with unyielding endurance to match. It also injects trace amounts of liquid phoron into its victim, \
|
||||||
|
which is very toxic to most organic life known. \
|
||||||
|
<br><br>\
|
||||||
|
Phorongenic spiders are also highly explosive, due to their infusion with phoron. \
|
||||||
|
Should one die, it will create a large explosion. This appears to be an automatic response \
|
||||||
|
caused from internal rupturing, as opposed to an intentional act of revenge by the spider, however \
|
||||||
|
the result is the same, oftening ending a fight with both sides dead."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/phorogenic
|
/mob/living/simple_mob/animal/giant_spider/phorogenic
|
||||||
desc = "Crystalline and purple, it makes you shudder to look at it. This one has haunting purple eyes."
|
desc = "Crystalline and purple, it makes you shudder to look at it. This one has haunting purple eyes."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/phorogenic_spider)
|
||||||
|
|
||||||
icon_state = "phoron"
|
icon_state = "phoron"
|
||||||
icon_living = "phoron"
|
icon_living = "phoron"
|
||||||
icon_dead = "phoron_dead"
|
icon_dead = "phoron_dead"
|
||||||
|
|||||||
@@ -1,7 +1,24 @@
|
|||||||
// Thermic spiders inject a special variant of thermite that burns someone from the inside.
|
// Thermic spiders inject a special variant of thermite that burns someone from the inside.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/thermic_spider
|
||||||
|
name = "Giant Spider - Thermic"
|
||||||
|
desc = "This specific spider has been catalogued as 'Thermic', \
|
||||||
|
and it belongs to the 'Guard' caste. \
|
||||||
|
The spider is colored orange, both body and eyes.\
|
||||||
|
<br><br>\
|
||||||
|
Compared to the other spiders in its caste, it has less strength and resilience, but instead has \
|
||||||
|
an adaptation to more easily survive in high temperature environments. This was discovered when a group of \
|
||||||
|
humans had an infestation of these, and their plan to \"kill it with fire\" failed.\
|
||||||
|
<br><br>\
|
||||||
|
The venom Thermic spiders use is very dangerous and unconventional, as it injects a liquid that combusts very \
|
||||||
|
easily, even when inside of another living organism. The result is a gruesome death from literally burning from \
|
||||||
|
the inside out."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/thermic
|
/mob/living/simple_mob/animal/giant_spider/thermic
|
||||||
desc = "Mirage-cloaked and orange, it makes you shudder to look at it. This one has simmering orange eyes."
|
desc = "Mirage-cloaked and orange, it makes you shudder to look at it. This one has simmering orange eyes."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/thermic_spider)
|
||||||
|
|
||||||
icon_state = "pit"
|
icon_state = "pit"
|
||||||
icon_living = "pit"
|
icon_living = "pit"
|
||||||
icon_dead = "pit_dead"
|
icon_dead = "pit_dead"
|
||||||
|
|||||||
@@ -4,8 +4,30 @@
|
|||||||
// If the target moves fast enough, the tunneler can miss, causing it to overshoot.
|
// If the target moves fast enough, the tunneler can miss, causing it to overshoot.
|
||||||
// If the tunneler hits a solid wall, the tunneler will suffer a stun.
|
// If the tunneler hits a solid wall, the tunneler will suffer a stun.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/tunneler_spider
|
||||||
|
name = "Giant Spider - Tunneler"
|
||||||
|
desc = "This specific spider has been catalogued as 'Tunneler', \
|
||||||
|
and it belongs to the 'Hunter' caste. \
|
||||||
|
The spider has a brown appearance, perhaps as camouflage. It also often has pieces of dirt, sand, or rock lying on it. \
|
||||||
|
Their eyes have a bright yellow shine.\
|
||||||
|
<br><br>\
|
||||||
|
Tunnelers generally reside in subterranean environments, as they are able to dig rapidly in soft materials. \
|
||||||
|
They often use this ability as an offensive tactic against prey, burrowing into the ground and tunneling, \
|
||||||
|
towards their target, before striking them from below. This powerful tactic does have a notable flaw, \
|
||||||
|
in that the spider is unable to actually see where they are going while burrowing, instead checking for \
|
||||||
|
increased weight from above as a sign that their prey is above them. This flaw means that Tunnelers \
|
||||||
|
often overshoot if the prey happens to move while it is underground, and can result in a collision if \
|
||||||
|
the prey happened to be standing near something hard and dense. \
|
||||||
|
<br><br>\
|
||||||
|
Tunneler venom is also dangerous, as it is known to both promotes concentrated production of the \
|
||||||
|
serotonin neurotransmitter, as well as causing brain damage. The feeling of happiness a bite causes \
|
||||||
|
afterwards can delay seeking medical treatment, making it extra dangerous."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/tunneler
|
/mob/living/simple_mob/animal/giant_spider/tunneler
|
||||||
desc = "Sandy and brown, it makes you shudder to look at it. This one has glittering yellow eyes."
|
desc = "Sandy and brown, it makes you shudder to look at it. This one has glittering yellow eyes."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/tunneler_spider)
|
||||||
|
|
||||||
icon_state = "tunneler"
|
icon_state = "tunneler"
|
||||||
icon_living = "tunneler"
|
icon_living = "tunneler"
|
||||||
icon_dead = "tunneler_dead"
|
icon_dead = "tunneler_dead"
|
||||||
|
|||||||
@@ -1,6 +1,24 @@
|
|||||||
|
// Webslingers do what their name implies, shoot web at enemies to slow them down.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/giant_spider/webslinger_spider
|
||||||
|
name = "Giant Spider - Webslinger"
|
||||||
|
desc = "This specific spider has been catalogued as 'Webslinger', \
|
||||||
|
and it belongs to the 'Nurse' caste. \
|
||||||
|
The spider is green, with a 'cloak' of webs attached to it. It's eyes are also green. \
|
||||||
|
<br><br>\
|
||||||
|
Webslingers are more aggressive than some of the other spiders in their caste, spinning web to use \
|
||||||
|
as an offensive weapon, however they still serve a 'support' role to the other spiders. \
|
||||||
|
They sling balls of web at prey in order to slow them down, making it easier for other spiders to catch them. \
|
||||||
|
This makes them more dangerous when paired with others, as fleeing may stop being an option once webbed. \
|
||||||
|
<br><br>\
|
||||||
|
Their venom is known to make bitten prey hallucinate, greatly compromising their combat ability."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/giant_spider/webslinger
|
/mob/living/simple_mob/animal/giant_spider/webslinger
|
||||||
desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes, and a cloak of web."
|
desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes, and a cloak of web."
|
||||||
tt_desc = "X Brachypelma phorus balisticus"
|
tt_desc = "X Brachypelma phorus balisticus"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/giant_spider/webslinger_spider)
|
||||||
|
|
||||||
icon_state = "webslinger"
|
icon_state = "webslinger"
|
||||||
icon_living = "webslinger"
|
icon_living = "webslinger"
|
||||||
icon_dead = "webslinger_dead"
|
icon_dead = "webslinger_dead"
|
||||||
|
|||||||
@@ -2,10 +2,22 @@
|
|||||||
// They cooperate with other diyaabs, in order to swarm whoever decides to pick on the little fluffy critter.
|
// They cooperate with other diyaabs, in order to swarm whoever decides to pick on the little fluffy critter.
|
||||||
// A cleaving weapon like an axe will make short work of the pack.
|
// A cleaving weapon like an axe will make short work of the pack.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/diyaab
|
||||||
|
name = "Sivian Fauna - Diyaab"
|
||||||
|
desc = "Classification: S Choeros hirtus\
|
||||||
|
<br><br>\
|
||||||
|
Small, social omnivores with dense seasonal wool fur valued by Sivian colonists for its cold resistance and softness. \
|
||||||
|
The Diyaab lives in packs of anywhere from three to ten individuals, usually comprised of a family unit. Primarily herbivorous browsers, \
|
||||||
|
supplementing their diet with organisms living in tree bark, \
|
||||||
|
Diyaab packs have been observed to hunt prey several times their size during the less plentiful winter months. \
|
||||||
|
Despite their unassuming appearance, the Diyaab possesses remarkably sharp anterior teeth."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/sif/diyaab
|
/mob/living/simple_mob/animal/sif/diyaab
|
||||||
name = "diyaab"
|
name = "diyaab"
|
||||||
desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion."
|
desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion."
|
||||||
tt_desc = "S Choeros hirtus" //diyaab and shantak are technically reletives!
|
tt_desc = "S Choeros hirtus" //diyaab and shantak are technically reletives!
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/diyaab)
|
||||||
|
|
||||||
faction = "diyaab"
|
faction = "diyaab"
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,26 @@
|
|||||||
hopefully prevent chainstuns forever.
|
hopefully prevent chainstuns forever.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/hooligan_crab
|
||||||
|
name = "Sivian Fauna - Hooligan Crab"
|
||||||
|
desc = "A very large, grey crustacean-like creature. They display remarkable curiosity, \
|
||||||
|
often following people around, and occasionally stealing man-made objects, hence their name. \
|
||||||
|
They generally reside at the shoreline in small groups, situated between two sources of food for it, \
|
||||||
|
small marine life in the ocean, and small plant matter near the shore. Larger lifeforms such as humans \
|
||||||
|
are left alone, however they will not hesitate to fight back if provoked.\
|
||||||
|
<br><br>\
|
||||||
|
Hooligans have a characteristic grey shell that is very thick and protective, allowing them to \
|
||||||
|
shrug off nearby attacks from both predators and reckless humans. It pairs its excellent defense with slow, but \
|
||||||
|
powerful offensive, utilizing its weight and size to crush and throw threats. As such, predators generally avoid \
|
||||||
|
Hooligan shorelines."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/sif/hooligan_crab
|
/mob/living/simple_mob/animal/sif/hooligan_crab
|
||||||
name = "hooligan crab"
|
name = "hooligan crab"
|
||||||
desc = "A large, hard-shelled crustacean. This one is mostly grey. \
|
desc = "A large, hard-shelled crustacean. This one is mostly grey. \
|
||||||
You probably shouldn't mess with it."
|
You probably shouldn't mess with it."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/hooligan_crab)
|
||||||
|
|
||||||
icon_state = "sif_crab"
|
icon_state = "sif_crab"
|
||||||
icon_living = "sif_crab"
|
icon_living = "sif_crab"
|
||||||
icon_dead = "sif_crab_dead"
|
icon_dead = "sif_crab_dead"
|
||||||
|
|||||||
@@ -1,11 +1,26 @@
|
|||||||
// Saviks are dangerous, angry creatures that hit hard, and will berserk if losing a fight.
|
// Saviks are dangerous, angry creatures that hit hard, and will berserk if losing a fight.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/savik
|
||||||
|
name = "Sivian Fauna - Savik"
|
||||||
|
desc = "Classification: S Pistris tellus\
|
||||||
|
<br><br>\
|
||||||
|
A predatory warm-blooded reptillian species covered in a layer of insulating down feathers. \
|
||||||
|
The Savik's preferred method of hunting is to burrow under deep snow drifts, and lie in ambush for prey. \
|
||||||
|
The Savik has been known to lie in wait for days at a time, generating heat by vibrating its shoulder plates \
|
||||||
|
at a nigh inperceptable frequency while most of its body enters a state of sopor in order to conserve energy. \
|
||||||
|
<br><br>\
|
||||||
|
Once the Savik detects its prey, it will charge with incredible kinetic force with the two enormous, \
|
||||||
|
angled bony plates on either side of the Savik's upper body acting as a natural snow plow, \
|
||||||
|
allowing frightening ease of movement through deep snow. Due to the long periods between feeding, \
|
||||||
|
the Savik will hunt its prey with absolute perseverence, as failure to catch a suitable meal is likely to \
|
||||||
|
spell death for the animal due to the high energy expenditure of its initial strike. \
|
||||||
|
The Savik has no known predators, and should be avoided at all costs."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/sif/savik
|
/mob/living/simple_mob/animal/sif/savik
|
||||||
name = "savik"
|
name = "savik"
|
||||||
tt_desc = "S Pistris tellus" //landshark
|
tt_desc = "S Pistris tellus" //landshark
|
||||||
player_msg = "You have the ability to <b>berserk at will</b>, which will grant strong physical bonuses for \
|
catalogue_data = list(/datum/category_item/catalogue/fauna/savik)
|
||||||
a short period of time, however it will tire you and you will be much weaker for awhile after it expires."
|
|
||||||
|
|
||||||
faction = "savik"
|
faction = "savik"
|
||||||
|
|
||||||
icon_state = "savik"
|
icon_state = "savik"
|
||||||
@@ -26,6 +41,9 @@
|
|||||||
melee_attack_delay = 1 SECOND
|
melee_attack_delay = 1 SECOND
|
||||||
attacktext = list("mauled")
|
attacktext = list("mauled")
|
||||||
|
|
||||||
|
player_msg = "You have the ability to <b>berserk at will</b>, which will grant strong physical bonuses for \
|
||||||
|
a short period of time, however it will tire you and you will be much weaker for awhile after it expires."
|
||||||
|
|
||||||
say_list_type = /datum/say_list/savik
|
say_list_type = /datum/say_list/savik
|
||||||
ai_holder_type = /datum/ai_holder/simple_mob/savik
|
ai_holder_type = /datum/ai_holder/simple_mob/savik
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,29 @@
|
|||||||
// Shantaks are essentially sif wolves.
|
// Shantaks are essentially sif wolves.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/shantak
|
||||||
|
name = "Sivian Fauna - Shantak"
|
||||||
|
desc = "Classification: S Choeros shantak\
|
||||||
|
<br><br>\
|
||||||
|
The Shantak is easily recognized by its iridescent, crystaline mane. \
|
||||||
|
The creature's specially adapted hairs are hardened by a natural hard mineral coating, \
|
||||||
|
thickest in the mane but present across the whole body. \
|
||||||
|
As well as giving the Shantak a coat nigh-inpenetrable to all but the most specialized predator, \
|
||||||
|
their hard, almost metallic coat gives them a slightly musical accent as they move. \
|
||||||
|
The Shantak uses its powerful foreclaws for both den-building and foraging. \
|
||||||
|
<br><br>\
|
||||||
|
Observed to share several square-mile territories with a small number of other individuals, \
|
||||||
|
the Shantak will rotate between several dens dug deep into the hard earth throughout the year, \
|
||||||
|
while deftly avoiding others of its species outwith mating season. While other wildlife makes use of these dens, \
|
||||||
|
the Shantak is fiercely territorial and will defend itself against any creature it perceives as a threat with reckless abandon. \
|
||||||
|
Their diet consists primarily of fungi and insects found just below the permafrost."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/sif/shantak
|
/mob/living/simple_mob/animal/sif/shantak
|
||||||
name = "shantak"
|
name = "shantak"
|
||||||
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. \
|
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. \
|
||||||
Don't be fooled by its beauty though."
|
Don't be fooled by its beauty though."
|
||||||
tt_desc = "S Choeros shantak"
|
tt_desc = "S Choeros shantak"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/shantak)
|
||||||
|
|
||||||
faction = "shantak"
|
faction = "shantak"
|
||||||
|
|
||||||
@@ -14,6 +33,15 @@
|
|||||||
icon = 'icons/jungle.dmi'
|
icon = 'icons/jungle.dmi'
|
||||||
|
|
||||||
maxHealth = 75
|
maxHealth = 75
|
||||||
|
armor_soak = list(
|
||||||
|
"melee" = 5,
|
||||||
|
"bullet" = 0,
|
||||||
|
"laser" = 0,
|
||||||
|
"energy" = 0,
|
||||||
|
"bomb" = 0,
|
||||||
|
"bio" = 0,
|
||||||
|
"rad" = 0
|
||||||
|
)
|
||||||
|
|
||||||
movement_cooldown = 5
|
movement_cooldown = 5
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,34 @@
|
|||||||
// Space carp show up as a random event to wreck hapless people in space or near windows.
|
// Space carp show up as a random event to wreck hapless people in space or near windows.
|
||||||
// They generally fit the archetype of 'fast but fragile'.
|
// They generally fit the archetype of 'fast but fragile'.
|
||||||
// This is compensated by being in groups (usually).
|
// This is compensated by being in groups (usually).
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/fauna/carp
|
||||||
|
name = "Voidborne Fauna - Space Carp"
|
||||||
|
desc = "A strange descendant of some form of voidborne life, they are the most \
|
||||||
|
common naturally void-faring lifeform found in human territory. They've been named \
|
||||||
|
'Space Carp' by various groups of spacers due to resembling the fish from Earth.\
|
||||||
|
<br><br>\
|
||||||
|
Their lifecycle begins as a fungus-like growth, sometimes found on the walls of spacecraft \
|
||||||
|
and space stations, before growing into a form which allows for independent travel. Even \
|
||||||
|
when fully grown, they can sometimes be found to stow away on the hulls of spaceborne objects, \
|
||||||
|
which might explain how they became widespread across many star systems.\
|
||||||
|
<br><br>\
|
||||||
|
Carp have a special gas bladder inside of them, which they utilize as a means of movement in \
|
||||||
|
space by stategically releasing the gas to propel themselves in a process that resembles \
|
||||||
|
thrusters on a spacecraft. The gas contained inside the carp also allows them \
|
||||||
|
to float when inside an atmosphere. The carp might also spray 'spores' using a similar method.\
|
||||||
|
<br><br>\
|
||||||
|
They are hypercarnivorous to the point of cannibalism, consuming their own dead in order to \
|
||||||
|
sustain themselves during hard times, which are rather frequent due to their prey being \
|
||||||
|
vastly technologically advanced. For human habitats that are well secured, carp are generally \
|
||||||
|
an annoyance. For those unable to adequately protect themselves, however, they can be \
|
||||||
|
rather dangerous, especially if a mass migration of carp arrives."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/mob/living/simple_mob/animal/space/carp
|
/mob/living/simple_mob/animal/space/carp
|
||||||
name = "space carp"
|
name = "space carp"
|
||||||
desc = "A ferocious, fang-bearing creature that resembles a fish."
|
desc = "A ferocious, fang-bearing creature that resembles a fish."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/fauna/carp)
|
||||||
icon_state = "carp"
|
icon_state = "carp"
|
||||||
icon_living = "carp"
|
icon_living = "carp"
|
||||||
icon_dead = "carp_dead"
|
icon_dead = "carp_dead"
|
||||||
|
|||||||
@@ -33,6 +33,8 @@
|
|||||||
appearance = thing_to_copy.appearance
|
appearance = thing_to_copy.appearance
|
||||||
copying = thing_to_copy
|
copying = thing_to_copy
|
||||||
density = thing_to_copy.density // So you can't bump into objects that aren't supposed to be dense.
|
density = thing_to_copy.density // So you can't bump into objects that aren't supposed to be dense.
|
||||||
|
catalogue_data = thing_to_copy.catalogue_data.Copy()
|
||||||
|
catalogue_delay = thing_to_copy.catalogue_delay
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
// Because we can't perfectly duplicate some examine() output, we directly examine the AM it is copying. It's messy but
|
// Because we can't perfectly duplicate some examine() output, we directly examine the AM it is copying. It's messy but
|
||||||
@@ -99,3 +101,16 @@
|
|||||||
/mob/living/simple_mob/illusion/get_nametag_desc(mob/user)
|
/mob/living/simple_mob/illusion/get_nametag_desc(mob/user)
|
||||||
if(copying)
|
if(copying)
|
||||||
return copying.get_nametag_desc(user)
|
return copying.get_nametag_desc(user)
|
||||||
|
|
||||||
|
// Cataloguer stuff. I don't think this will actually come up but better safe than sorry.
|
||||||
|
/mob/living/simple_mob/illusion/get_catalogue_data()
|
||||||
|
if(copying)
|
||||||
|
return copying.get_catalogue_data()
|
||||||
|
|
||||||
|
/mob/living/simple_mob/illusion/can_catalogue()
|
||||||
|
if(copying)
|
||||||
|
return copying.can_catalogue()
|
||||||
|
|
||||||
|
/mob/living/simple_mob/illusion/get_catalogue_delay()
|
||||||
|
if(copying)
|
||||||
|
return copying.get_catalogue_delay()
|
||||||
@@ -4,9 +4,36 @@
|
|||||||
A solid hit with an EMP grenade will kill the shield instantly.
|
A solid hit with an EMP grenade will kill the shield instantly.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/drone/combat_drone
|
||||||
|
name = "Drone - Combat Drone"
|
||||||
|
desc = "Deadly to anyone it perceives as an enemy, this drone model tries to capture the ideal balance \
|
||||||
|
between effectiveness, versatility, and expendability. It possesses sophisticated technology that allows it \
|
||||||
|
to both be dangerous, and be less costly to build compared to alternatives such as exosuits. It was designed \
|
||||||
|
for combat in space, however they are also able to function inside a gravity well, due to a favorable \
|
||||||
|
thrust-to-weight ratio.\
|
||||||
|
<br><br>\
|
||||||
|
One notable feature of this model is its ability to rapidly fire lasers at the target. This is accomplished \
|
||||||
|
with its array of lasers installed on the left and right side of the drone, with each side housing three \
|
||||||
|
laser emitters. The drone cycles between the six different emitters each time it fires a laser, in order to avoid \
|
||||||
|
overheating before the integrated heatsinks are able to remove the heat, \
|
||||||
|
thus allowing for a higher than average rate of fire. This ability allows for the drone to act in a suppressive \
|
||||||
|
manner against personnel, or to provide a general 'shock and awe' factor when swarms of drones are firing at once.\
|
||||||
|
<br><br>\
|
||||||
|
The drone's frame is lightweight, as required due to the type of thrusters integrated into the frame. \
|
||||||
|
Unfortunately, this comes at the cost of being less sturdy. To counteract this vulnerability, the \
|
||||||
|
drone has an integrated shield projector, which is tuned to allow the shield to intercept projectiles, \
|
||||||
|
while allowing its own lasers to pass through unaffected.\
|
||||||
|
<br><br>\
|
||||||
|
Despite these qualities, one significant flaw this model has, is that its source of energy is considerably \
|
||||||
|
less powerful than what is standard, which cuts into the amount of energy that can go into both the lasers and the shields. \
|
||||||
|
Generally, the solution to this flaw is to add more drones until it doesn't matter anymore."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/combat_drone
|
/mob/living/simple_mob/mechanical/combat_drone
|
||||||
name = "combat drone"
|
name = "combat drone"
|
||||||
desc = "An automated combat drone armed with state of the art weaponry and shielding."
|
desc = "An automated combat drone armed with state of the art weaponry and shielding."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/drone/combat_drone)
|
||||||
|
|
||||||
icon_state = "drone"
|
icon_state = "drone"
|
||||||
icon_living = "drone"
|
icon_living = "drone"
|
||||||
icon_dead = "drone_dead"
|
icon_dead = "drone_dead"
|
||||||
|
|||||||
@@ -3,10 +3,78 @@
|
|||||||
// Second special attack fires a projectile that creates a short-lived microsingularity that pulls in everything nearby. Magboots can protect from this.
|
// Second special attack fires a projectile that creates a short-lived microsingularity that pulls in everything nearby. Magboots can protect from this.
|
||||||
// Third special attack creates a dangerous electric field that causes escalating electric damage, before emitting a tesla shock and blinding anyone looking at the mecha.
|
// Third special attack creates a dangerous electric field that causes escalating electric damage, before emitting a tesla shock and blinding anyone looking at the mecha.
|
||||||
// The AI will choose one every ten seconds.
|
// The AI will choose one every ten seconds.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/adv_dark_gygax
|
||||||
|
name = "Exosuit - Advanced Dark Gygax"
|
||||||
|
desc = "This exosuit is an experimental prototype, descended from the Dark Gygax. It retains the \
|
||||||
|
speed that is characteristic of the other models, yet outclasses all of them in durability, \
|
||||||
|
to the point of having a comparable amount of protection to models that placed a higher emphesis \
|
||||||
|
on armor, like the Durand and even the Marauder. It is also much larger in scale, and significantly \
|
||||||
|
heavier than most other exosuits developed by humans, which often causes shockwaves to be felt \
|
||||||
|
whenever it moves. This has been observed to have a demoralizing effect on hostile forces.\
|
||||||
|
<br><br>\
|
||||||
|
<b>Weapons & Power System</b><br>\
|
||||||
|
Attached to the exosuit's chassis are several newly invented mounted weapons, each unique in purpose and capability. \
|
||||||
|
These weapons are integral to the chassis as opposed to the modular equipment that more traditional exosuits utilize. \
|
||||||
|
It is unknown if that is due to simply being an early prototype, or if discarding the modular design is benefitial \
|
||||||
|
to the design of the model.\
|
||||||
|
<br><br>\
|
||||||
|
All the weapons utilize energy, as opposed to consumable projectiles. This appears to have been a conscious decision to \
|
||||||
|
allow for more staying power, by only being limited by availablity of electricity. \
|
||||||
|
In order to supply the needed energy for combat, the ADG contains a miniturized fusion reactor, which is also \
|
||||||
|
considered experimental due to its size. The reactor is powerful enough to power the actuators, electronics, \
|
||||||
|
and the primary weapon. The supplementary weapons, however, cannot be continiously fired and instead draw from \
|
||||||
|
a electrical buffer that is constantly replenished by the reactor.\
|
||||||
|
<br><br>\
|
||||||
|
<b>Homing Energy Bolts</b><br>\
|
||||||
|
The primary weapon is a projector that fires somewhat slow moving blue bolts of energy. The ADG is able to \
|
||||||
|
passively redirect the trajectory of the blue bolts towards the initial target, essentially acting as a \
|
||||||
|
homing projectile. The blue bolt itself is otherwise not very powerful compared to conventional photonic \
|
||||||
|
weaponry or ballistic shells, however the power required to fire the main gun is significantly less \
|
||||||
|
than the other available weapons, and so the ADG uses it as the main weapon.\
|
||||||
|
<br><br>\
|
||||||
|
<b>Self-Supplying Missile Launcher</b><br>\
|
||||||
|
The first supplementary weapon would appear to not be an energy weapon, as it is a missile launcher. \
|
||||||
|
What is not obvious is that the missiles are fabricated inside the exosuit, with the physical \
|
||||||
|
materials also being created from energy, similar to the newer models of Rapid Construction Devices. \
|
||||||
|
Therefore, the ADG does not need to concern itself with running out of missiles. The missiles themselves \
|
||||||
|
are optimized towards harming hard targets, such as other exosuits, but are also still dangerous to soft \
|
||||||
|
targets like infantry.\
|
||||||
|
<br><br>\
|
||||||
|
<b>Electric Defense</b><br>\
|
||||||
|
The second supplementary weapon is not a conventional gun. Instead, the ADG weaponizes its electrical \
|
||||||
|
systems by redirecting power output from its fusion reactor to its exterior shell, becoming a walking \
|
||||||
|
tesla coil. This generates a strong electric field that harms anything unprotected nearby. \
|
||||||
|
The electric field grows in power, until reaching a critical point, after which a blinding flash \
|
||||||
|
of light and arcs of lightning fly out from the exosuit towards its surroundings.\
|
||||||
|
<br><br>\
|
||||||
|
<b>Microsingularity Projector</b><br>\
|
||||||
|
Finally, the third supplementary weapon utilizes gravitation as a weapon, by firing a blue energetic orb \
|
||||||
|
that, upon hitting the ground, collapses and causes a 'microsingularity' to emerge briefly, pulling in \
|
||||||
|
anything unsecured, such as personnel or weapons. The microsingularity lacks the means to gain any energy, meaning it \
|
||||||
|
will dissipate in a few seconds, and so it is <u>probably</u> safe to use on a planetary body.\
|
||||||
|
<br><br>\
|
||||||
|
<b>Flaws</b><br>\
|
||||||
|
It would appear the ADG is poised to take the place of other exosuits like the Marauder, however several \
|
||||||
|
massive flaws exist to make that unlikely. Firstly, this exosuit is almost an order of magnitude more \
|
||||||
|
costly to produce than comparable alternatives, even accounting for being a prototype. \
|
||||||
|
Secondly, a number of weapons integrated into the ADG are dangerous both to enemies and \
|
||||||
|
allies, limiting the ability for a massed assault using ADGs. \
|
||||||
|
Finally, the nature of several weapons used could invoke technological fear, or otherwise \
|
||||||
|
be considered a war crime to utilize, primarily the electrical field and microsingularity \
|
||||||
|
projector.\
|
||||||
|
<br><br>\
|
||||||
|
All of these flaws appear to doom the ADG to becoming another technological marvel that was \
|
||||||
|
overly ambitious and unconstrained to the demands of reality. They will likely be really rare, \
|
||||||
|
and terrifying."
|
||||||
|
value = CATALOGUER_REWARD_SUPERHARD
|
||||||
|
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced
|
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced
|
||||||
name = "advanced dark gygax"
|
name = "advanced dark gygax"
|
||||||
desc = "An experimental exosuit that utilizes advanced materials to allow for greater protection while still being lightweight and fast. \
|
desc = "An experimental exosuit that utilizes advanced materials to allow for greater protection while still being lightweight and fast. \
|
||||||
It also is armed with an array of next-generation weaponry."
|
It also is armed with an array of next-generation weaponry."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/adv_dark_gygax)
|
||||||
icon_state = "darkgygax_adv"
|
icon_state = "darkgygax_adv"
|
||||||
wreckage = /obj/structure/loot_pile/mecha/gygax/dark/adv
|
wreckage = /obj/structure/loot_pile/mecha/gygax/dark/adv
|
||||||
icon_scale = 1.5
|
icon_scale = 1.5
|
||||||
@@ -28,8 +96,9 @@
|
|||||||
special_attack_min_range = 1
|
special_attack_min_range = 1
|
||||||
special_attack_max_range = 7
|
special_attack_max_range = 7
|
||||||
special_attack_cooldown = 10 SECONDS
|
special_attack_cooldown = 10 SECONDS
|
||||||
projectiletype = /obj/item/projectile/force_missile
|
projectiletype = /obj/item/projectile/energy/homing_bolt // We're now a bullet hell game.
|
||||||
projectilesound = 'sound/weapons/wave.ogg'
|
projectilesound = 'sound/weapons/wave.ogg'
|
||||||
|
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||||
var/obj/effect/overlay/energy_ball/energy_ball = null
|
var/obj/effect/overlay/energy_ball/energy_ball = null
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced/Destroy()
|
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced/Destroy()
|
||||||
@@ -39,7 +108,7 @@
|
|||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced/do_special_attack(atom/A)
|
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced/do_special_attack(atom/A)
|
||||||
. = TRUE // So we don't fire a laser as well.
|
. = TRUE // So we don't fire a bolt as well.
|
||||||
switch(a_intent)
|
switch(a_intent)
|
||||||
if(I_DISARM) // Side gun
|
if(I_DISARM) // Side gun
|
||||||
electric_defense(A)
|
electric_defense(A)
|
||||||
@@ -48,6 +117,22 @@
|
|||||||
if(I_GRAB) // Micro-singulo
|
if(I_GRAB) // Micro-singulo
|
||||||
launch_microsingularity(A)
|
launch_microsingularity(A)
|
||||||
|
|
||||||
|
/obj/item/projectile/energy/homing_bolt
|
||||||
|
name = "homing bolt"
|
||||||
|
icon_state = "force_missile"
|
||||||
|
damage = 20
|
||||||
|
damage_type = BURN
|
||||||
|
check_armour = "laser"
|
||||||
|
|
||||||
|
/obj/item/projectile/energy/homing_bolt/launch_projectile(atom/target, target_zone, mob/user, params, angle_override, forced_spread = 0)
|
||||||
|
..()
|
||||||
|
if(target)
|
||||||
|
set_homing_target(target)
|
||||||
|
|
||||||
|
/obj/item/projectile/energy/homing_bolt/fire(angle, atom/direct_target)
|
||||||
|
..()
|
||||||
|
set_pixel_speed(0.5)
|
||||||
|
|
||||||
#define ELECTRIC_ZAP_POWER 20000
|
#define ELECTRIC_ZAP_POWER 20000
|
||||||
|
|
||||||
// Charges a tesla shot, while emitting a dangerous electric field. The exosuit is immune to electric damage while this is ongoing.
|
// Charges a tesla shot, while emitting a dangerous electric field. The exosuit is immune to electric damage while this is ongoing.
|
||||||
|
|||||||
@@ -2,9 +2,23 @@
|
|||||||
// They can also root themselves to become even tankier.
|
// They can also root themselves to become even tankier.
|
||||||
// The AI doesn't do this currently.
|
// The AI doesn't do this currently.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/durand
|
||||||
|
name = "Exosuit - Durand"
|
||||||
|
desc = "The Durand is an old combat exosuit, that was once the most durable exosuit ever developed by humans. \
|
||||||
|
In modern times, this exosuit has been dethroned from that title, yet it remains one of the more well built and armored \
|
||||||
|
exosuits, despite its age.\
|
||||||
|
<br><br>\
|
||||||
|
During the First Contact War against the Unathi, there was a need for various new technologies to be developed \
|
||||||
|
to counter the Unathi war machine. One of many solutions created was the Durand, which was made to be heavy and \
|
||||||
|
well-armored, and be capable of powering the various weapons that could be mounted onto it. Presently, the \
|
||||||
|
Durand now generally serves as corporate asset protection hardware, due to modern militaries moving on to newer, \
|
||||||
|
more advanced war machines."
|
||||||
|
value = CATALOGUER_REWARD_HARD
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/mecha/combat/durand
|
/mob/living/simple_mob/mechanical/mecha/combat/durand
|
||||||
name = "durand"
|
name = "durand"
|
||||||
desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the First Contact War."
|
desc = "An aging combat exosuit utilized by many corporations. It was originally developed to fight in the First Contact War."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/durand)
|
||||||
icon_state = "durand"
|
icon_state = "durand"
|
||||||
movement_cooldown = 10
|
movement_cooldown = 10
|
||||||
wreckage = /obj/structure/loot_pile/mecha/durand
|
wreckage = /obj/structure/loot_pile/mecha/durand
|
||||||
|
|||||||
@@ -1,9 +1,21 @@
|
|||||||
// Gygaxes are tough but also fast.
|
// Gygaxes are tough but also fast.
|
||||||
// Their AI, unlike most, will advance towards their target instead of remaining in place.
|
// Their AI, unlike most, will advance towards their target instead of remaining in place.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/gygax
|
||||||
|
name = "Exosuit - Gygax"
|
||||||
|
desc = "The Gygax is a relatively modern exosuit, built to be lightweight and agile, while still being fairly durable. \
|
||||||
|
These traits have made them rather popular among well funded private and corporate security forces, who desire \
|
||||||
|
the ability to rapidly respond to conflict.\
|
||||||
|
<br><br>\
|
||||||
|
One special feature of this model is that the actuators that \
|
||||||
|
drive the exosuit can have their safeties disabled in order to achieve a short-term burst of unparalleled speed, \
|
||||||
|
at the expense of damaging the exosuit considerably."
|
||||||
|
value = CATALOGUER_REWARD_HARD
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax
|
/mob/living/simple_mob/mechanical/mecha/combat/gygax
|
||||||
name = "gygax"
|
name = "gygax"
|
||||||
desc = "A lightweight, security exosuit. Popular among private and corporate security."
|
desc = "A lightweight, security exosuit. Popular among private and corporate security."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/gygax)
|
||||||
icon_state = "gygax"
|
icon_state = "gygax"
|
||||||
movement_cooldown = 0
|
movement_cooldown = 0
|
||||||
wreckage = /obj/structure/loot_pile/mecha/gygax
|
wreckage = /obj/structure/loot_pile/mecha/gygax
|
||||||
@@ -28,10 +40,23 @@
|
|||||||
|
|
||||||
|
|
||||||
// A stronger variant.
|
// A stronger variant.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/dark_gygax
|
||||||
|
name = "Exosuit - Dark Gygax"
|
||||||
|
desc = "This exosuit is a variant of the regular Gygax. It is generally referred to as the Dark Gygax, \
|
||||||
|
due to being constructed from different materials that give it a darker appearance. Beyond merely looking \
|
||||||
|
cosmetically different, the Dark Gygax also has various upgrades compared to the Gygax. It is much more \
|
||||||
|
resilient, yet retains the agility and speed of the Gygax.\
|
||||||
|
<br><br>\
|
||||||
|
These are relatively rare compared to the other security exosuits, as most security forces are content with \
|
||||||
|
a regular Gygax. Instead, this exosuit is often used by high-end asset protection teams, and mercenaries."
|
||||||
|
value = CATALOGUER_REWARD_HARD
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark
|
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark
|
||||||
name = "dark gygax"
|
name = "dark gygax"
|
||||||
desc = "A significantly upgraded Gygax security mech, often utilized by corporate asset protection teams and \
|
desc = "A significantly upgraded Gygax security mech, often utilized by corporate asset protection teams and \
|
||||||
PMCs."
|
PMCs."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/dark_gygax)
|
||||||
icon_state = "darkgygax"
|
icon_state = "darkgygax"
|
||||||
wreckage = /obj/structure/loot_pile/mecha/gygax/dark
|
wreckage = /obj/structure/loot_pile/mecha/gygax/dark
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,21 @@
|
|||||||
// Ranged, and capable of flight.
|
// Ranged, and capable of flight.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/hoverpod
|
||||||
|
name = "Voidcraft - Hoverpod"
|
||||||
|
desc = "This is a small space-capable craft that has a round design. Can hold up to one pilot, \
|
||||||
|
and sometimes one or two passengers, with the right modifications made. \
|
||||||
|
Hoverpods have existed for a very long time, and the design has remained more or less consistant over its life. \
|
||||||
|
They carved out a niche in short ranged transportation of cargo or crew while in space, \
|
||||||
|
as they were more efficient compared to using a shuttle, and required less infrastructure to use due to being compact enough \
|
||||||
|
to use airlocks. As such, they acted as a sort of bridge between being EVA in a spacesuit, and being inside a 'real' spacecraft.\
|
||||||
|
<br><br>\
|
||||||
|
In recent times, the Hoverpod is seen as outdated by some, as newer solutions to that niche now exist, however it remains an ancient favorite."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/mecha/hoverpod
|
/mob/living/simple_mob/mechanical/mecha/hoverpod
|
||||||
name = "hover pod"
|
name = "hover pod"
|
||||||
desc = "Stubby and round, this space-capable craft is an ancient favorite. It has a jury-rigged welder-laser."
|
desc = "Stubby and round, this space-capable craft is an ancient favorite. It has a jury-rigged welder-laser."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/hoverpod)
|
||||||
icon_state = "engineering_pod"
|
icon_state = "engineering_pod"
|
||||||
movement_sound = 'sound/machines/hiss.ogg'
|
movement_sound = 'sound/machines/hiss.ogg'
|
||||||
wreckage = /obj/structure/loot_pile/mecha/hoverpod
|
wreckage = /obj/structure/loot_pile/mecha/hoverpod
|
||||||
|
|||||||
@@ -1,8 +1,17 @@
|
|||||||
// Marauders are even tougher than Durands.
|
// Marauders are even tougher than Durands.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/marauder
|
||||||
|
name = "Exosuit - Marauder"
|
||||||
|
desc = "Marauders are the more modern descendants of the Durand model. Stronger, faster, and \
|
||||||
|
more resilient than their predecessor, they have replaced the Durand's role entirely, and are generally seen in service \
|
||||||
|
for various militaries across human space. As such, they are generally unavailable to civilians, including \
|
||||||
|
corporations and most Trans-Stellars."
|
||||||
|
value = CATALOGUER_REWARD_HARD
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/mecha/combat/marauder
|
/mob/living/simple_mob/mechanical/mecha/combat/marauder
|
||||||
name = "marauder"
|
name = "marauder"
|
||||||
desc = "A heavy-duty, combat exosuit, developed after the Durand model. This is rarely found among civilian populations."
|
desc = "A heavy-duty, combat exosuit, developed after the Durand model. This is rarely found among civilian populations."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/marauder)
|
||||||
icon_state = "marauder"
|
icon_state = "marauder"
|
||||||
movement_cooldown = 5
|
movement_cooldown = 5
|
||||||
wreckage = /obj/structure/loot_pile/mecha/marauder
|
wreckage = /obj/structure/loot_pile/mecha/marauder
|
||||||
@@ -25,11 +34,25 @@
|
|||||||
projectiletype = /obj/item/projectile/beam/heavylaser
|
projectiletype = /obj/item/projectile/beam/heavylaser
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/seraph
|
||||||
|
name = "Exosuit - Seraph"
|
||||||
|
desc = "The Seraph line of combat exosuit is essentially a Marauder with incremental improvements, making \
|
||||||
|
it slightly better. Due to the relatively minor improvements over its predecessor, and the cost of \
|
||||||
|
said improvements, Seraphs have not made the Marauder obsolute. Instead, they have generally filled the \
|
||||||
|
role of housing important commanders, and as such they generally contain specialized communications \
|
||||||
|
equipment to aid in receiving and relaying orders.\
|
||||||
|
<br><br>\
|
||||||
|
Due to this role, they are generally not expected to see combat frequently. Despite this, they often have \
|
||||||
|
one or more weapons attached, to allow for retaliation in case it is attacked directly."
|
||||||
|
value = CATALOGUER_REWARD_HARD
|
||||||
|
|
||||||
// Slightly stronger, used to allow comdoms to frontline without dying instantly, I guess.
|
// Slightly stronger, used to allow comdoms to frontline without dying instantly, I guess.
|
||||||
/mob/living/simple_mob/mechanical/mecha/combat/marauder/seraph
|
/mob/living/simple_mob/mechanical/mecha/combat/marauder/seraph
|
||||||
name = "seraph"
|
name = "seraph"
|
||||||
desc = "A heavy-duty, combat/command exosuit. This one is specialized towards housing important commanders such as high-ranking \
|
desc = "A heavy-duty, combat/command exosuit. This one is specialized towards housing important commanders such as high-ranking \
|
||||||
military personnel. It's stronger than the regular Marauder model, but not by much."
|
military personnel. It's stronger than the regular Marauder model, but not by much."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/seraph)
|
||||||
icon_state = "seraph"
|
icon_state = "seraph"
|
||||||
wreckage = /obj/structure/loot_pile/mecha/marauder/seraph
|
wreckage = /obj/structure/loot_pile/mecha/marauder/seraph
|
||||||
health = 550
|
health = 550
|
||||||
|
|||||||
@@ -2,9 +2,22 @@
|
|||||||
// They also do this in melee.
|
// They also do this in melee.
|
||||||
// Fortunately they're quite fragile and don't fire that fast.
|
// Fortunately they're quite fragile and don't fire that fast.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/odysseus
|
||||||
|
name = "Exosuit - Odysseus"
|
||||||
|
desc = "A Vey-Medical innovation, the Odysseus was designed to incorporate some of their \
|
||||||
|
other inventions, such as the Sleeper, into a mobile frame. Due to its ability to safely \
|
||||||
|
rescue injured people in potentially hostile environments such as vacuum, as well as its \
|
||||||
|
agility compared to other civilian exosuits, the Odysseus dominates the market for \
|
||||||
|
medical exosuits."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/mecha/odysseus
|
/mob/living/simple_mob/mechanical/mecha/odysseus
|
||||||
name = "odysseus"
|
name = "odysseus"
|
||||||
desc = "These exosuits are developed and produced by Vey-Med. This one has a syringe gun."
|
desc = "These exosuits are developed and produced by Vey-Med. This one has a syringe gun."
|
||||||
|
catalogue_data = list(
|
||||||
|
/datum/category_item/catalogue/technology/odysseus,
|
||||||
|
/datum/category_item/catalogue/information/organization/vey_med
|
||||||
|
)
|
||||||
icon_state = "odysseus"
|
icon_state = "odysseus"
|
||||||
wreckage = /obj/structure/loot_pile/mecha/odysseus
|
wreckage = /obj/structure/loot_pile/mecha/odysseus
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,20 @@
|
|||||||
// Beefy, but somewhat slow.
|
// Beefy, but somewhat slow.
|
||||||
// Melee attack is to bore you with its big drill, which has a lot of armor penetration and strikes rapidly.
|
// Melee attack is to bore you with its big drill, which has a lot of armor penetration and strikes rapidly.
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/ripley
|
||||||
|
name = "Exosuit - APLU"
|
||||||
|
desc = "The Autonomous Power Loader Unit, more commonly designated as the 'Ripley', \
|
||||||
|
is an exosuit that is often described as 'the workhorse of the exosuit world', \
|
||||||
|
due to being designed for industrial use. Featuring a rugged design, they are fairly \
|
||||||
|
resilient to the stresses of operation. As such, they are often used for various roles, \
|
||||||
|
such as mining, construction, heavy lifting, and cargo transportation."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/mecha/ripley
|
/mob/living/simple_mob/mechanical/mecha/ripley
|
||||||
name = "\improper APLU ripley"
|
name = "\improper APLU ripley"
|
||||||
desc = "Autonomous Power Loader Unit. The workhorse of the exosuit world. This one has big drill."
|
desc = "Autonomous Power Loader Unit. The workhorse of the exosuit world. This one has big drill."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/ripley)
|
||||||
icon_state = "ripley"
|
icon_state = "ripley"
|
||||||
wreckage = /obj/structure/loot_pile/mecha/ripley
|
wreckage = /obj/structure/loot_pile/mecha/ripley
|
||||||
|
|
||||||
|
|||||||
@@ -4,9 +4,24 @@
|
|||||||
A weapon that can cleave is very effective against them.
|
A weapon that can cleave is very effective against them.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/drone/viscerator
|
||||||
|
name = "Drone - Viscerator"
|
||||||
|
desc = "Viscerators are fairly simple machines that use very sharp blades as propellers, \
|
||||||
|
which it uses both to fly and to attack enemy targets. Their simple construction generally \
|
||||||
|
means that if one is found, a swarm of others are not too far away.\
|
||||||
|
<br><br>\
|
||||||
|
They are most effective against soft targets such as unarmored personnel, as the propeller \
|
||||||
|
tends to get deflected after slicing into someone's flesh, and as such they tend to not cut deeply. \
|
||||||
|
The simplistic AI inside compensates for this by using the tendency to bounce away after \
|
||||||
|
slicing as an evasive tactic to avoid harm. This allows the viscerator to cut up the target, \
|
||||||
|
fly to the side, and then repeat, potentially causing the target to die from many seperate wounds."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/viscerator
|
/mob/living/simple_mob/mechanical/viscerator
|
||||||
name = "viscerator"
|
name = "viscerator"
|
||||||
desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations."
|
desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/drone/viscerator)
|
||||||
|
|
||||||
icon = 'icons/mob/critter.dmi'
|
icon = 'icons/mob/critter.dmi'
|
||||||
icon_state = "viscerator_attack"
|
icon_state = "viscerator_attack"
|
||||||
icon_living = "viscerator_attack"
|
icon_living = "viscerator_attack"
|
||||||
|
|||||||
@@ -4,8 +4,23 @@
|
|||||||
If AI controlled, they will also warn their faction if they see a hostile entity, acting as floating cameras.
|
If AI controlled, they will also warn their faction if they see a hostile entity, acting as floating cameras.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/technology/drone/ward
|
||||||
|
name = "Drone - Monitor Ward"
|
||||||
|
desc = "This is a small drone that appears to have been designed for a singular purpose, \
|
||||||
|
with little autonomous capability, common among the 'ward' models. This specific ward's \
|
||||||
|
purpose is simply to observe the environment around it, reacting when it detects entities \
|
||||||
|
it judges to be unfriendly. It presumably relays information about what it sees back to \
|
||||||
|
whoever owns the drone.\
|
||||||
|
<br><br>\
|
||||||
|
The sensors onboard the ward are much more advanced than what is typical for drones, \
|
||||||
|
allowing it to detect entities that might otherwise go unnoticed by inferior \
|
||||||
|
observers. If this ward sees such a thing, it fires a beam of energy at the hidden \
|
||||||
|
entity, which exposes them."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/mob/living/simple_mob/mechanical/ward/monitor
|
/mob/living/simple_mob/mechanical/ward/monitor
|
||||||
desc = "It's a little flying drone. This one seems to be watching you..."
|
desc = "It's a little flying drone. This one seems to be watching you..."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/technology/drone/ward)
|
||||||
icon_state = "ward"
|
icon_state = "ward"
|
||||||
glow_color = "#00FF00"
|
glow_color = "#00FF00"
|
||||||
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||||
|
|||||||
@@ -312,6 +312,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
|
|||||||
|
|
||||||
/obj/item/weapon/disk/limb/bishop
|
/obj/item/weapon/disk/limb/bishop
|
||||||
company = "Bishop"
|
company = "Bishop"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/bishop)
|
||||||
|
|
||||||
/obj/item/weapon/disk/limb/cybersolutions
|
/obj/item/weapon/disk/limb/cybersolutions
|
||||||
company = "Cyber Solutions"
|
company = "Cyber Solutions"
|
||||||
@@ -321,21 +322,28 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
|
|||||||
|
|
||||||
/obj/item/weapon/disk/limb/hephaestus
|
/obj/item/weapon/disk/limb/hephaestus
|
||||||
company = "Hephaestus"
|
company = "Hephaestus"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/hephaestus)
|
||||||
|
|
||||||
/obj/item/weapon/disk/limb/morpheus
|
/obj/item/weapon/disk/limb/morpheus
|
||||||
company = "Morpheus"
|
company = "Morpheus"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/morpheus)
|
||||||
|
|
||||||
/obj/item/weapon/disk/limb/veymed
|
/obj/item/weapon/disk/limb/veymed
|
||||||
company = "Vey-Med"
|
company = "Vey-Med"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med)
|
||||||
|
|
||||||
/obj/item/weapon/disk/limb/wardtakahashi
|
/obj/item/weapon/disk/limb/wardtakahashi
|
||||||
company = "Ward-Takahashi"
|
company = "Ward-Takahashi"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/ward_takahashi)
|
||||||
|
|
||||||
/obj/item/weapon/disk/limb/xion
|
/obj/item/weapon/disk/limb/xion
|
||||||
company = "Xion"
|
company = "Xion"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/xion)
|
||||||
|
|
||||||
/obj/item/weapon/disk/limb/zenghu
|
/obj/item/weapon/disk/limb/zenghu
|
||||||
company = "Zeng-Hu"
|
company = "Zeng-Hu"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/zeng_hu)
|
||||||
|
|
||||||
/obj/item/weapon/disk/limb/nanotrasen
|
/obj/item/weapon/disk/limb/nanotrasen
|
||||||
company = "NanoTrasen"
|
company = "NanoTrasen"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/information/organization/nanotrasen)
|
||||||
|
|||||||
@@ -918,14 +918,31 @@ obj/structure/cable/proc/cableColor(var/colorC)
|
|||||||
|
|
||||||
//Endless alien cable coil
|
//Endless alien cable coil
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_wire
|
||||||
|
name = "Precursor Alpha Object - Recursive Spool"
|
||||||
|
desc = "Upon visual inspection, this merely appears to be a \
|
||||||
|
spool for silver-colored cable. If one were to use this for \
|
||||||
|
some time, however, it would become apparent that the cables \
|
||||||
|
inside the spool appear to coil around the spool endlessly, \
|
||||||
|
suggesting an infinite length of wire.\
|
||||||
|
<br><br>\
|
||||||
|
In reality, an infinite amount of something within a finite space \
|
||||||
|
would likely not be able to exist. Instead, the spool likely has \
|
||||||
|
some method of creating new wire as it is unspooled. How this is \
|
||||||
|
accomplished without an apparent source of material would require \
|
||||||
|
further study."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/item/stack/cable_coil/alien
|
/obj/item/stack/cable_coil/alien
|
||||||
name = "alien spool"
|
name = "alien spool"
|
||||||
|
desc = "A spool of cable. No matter how hard you try, you can never seem to get to the end."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_wire)
|
||||||
icon = 'icons/obj/abductor.dmi'
|
icon = 'icons/obj/abductor.dmi'
|
||||||
icon_state = "coil"
|
icon_state = "coil"
|
||||||
amount = MAXCOIL
|
amount = MAXCOIL
|
||||||
max_amount = MAXCOIL
|
max_amount = MAXCOIL
|
||||||
color = COLOR_SILVER
|
color = COLOR_SILVER
|
||||||
desc = "A spool of cable. No matter how hard you try, you can never seem to get to the end."
|
|
||||||
throwforce = 10
|
throwforce = 10
|
||||||
w_class = ITEMSIZE_SMALL
|
w_class = ITEMSIZE_SMALL
|
||||||
throw_speed = 2
|
throw_speed = 2
|
||||||
|
|||||||
@@ -37,9 +37,25 @@
|
|||||||
charge_amount = 160 //Recharges a lot more quickly...
|
charge_amount = 160 //Recharges a lot more quickly...
|
||||||
charge_delay = 100 //... but it takes a while to get started
|
charge_delay = 100 //... but it takes a while to get started
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_void_cell
|
||||||
|
name = "Precursor Alpha Object - Void Cell"
|
||||||
|
desc = "This is a very enigmatic and small machine. It is able to output a direct electrical current \
|
||||||
|
from itself to another device or machine that it is connected to. Its shape has a similar form as \
|
||||||
|
a battery cell, which might imply that the species who created these had a desire for some form of \
|
||||||
|
a modular power supply.\
|
||||||
|
<br><br>\
|
||||||
|
These appear to be limited in throughput, only able to put out so much energy at a time. It is unknown \
|
||||||
|
if this was intentional, or was a design constraint that the creators of this object had to work around. \
|
||||||
|
Regardless, it will likely function inside of various devices which run off of conventional power cells.\
|
||||||
|
<br><br>\
|
||||||
|
Scanning similar objects may yield more information."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/item/weapon/cell/device/weapon/recharge/alien
|
/obj/item/weapon/cell/device/weapon/recharge/alien
|
||||||
name = "void cell"
|
name = "void cell"
|
||||||
desc = "An alien technology that produces energy seemingly out of nowhere. Its small, cylinderal shape means it might be able to be used with human technology, perhaps?"
|
desc = "An alien technology that produces energy seemingly out of nowhere. Its small, cylinderal shape means it might be able to be used with human technology, perhaps?"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_void_cell)
|
||||||
icon = 'icons/obj/abductor.dmi'
|
icon = 'icons/obj/abductor.dmi'
|
||||||
icon_state = "cell"
|
icon_state = "cell"
|
||||||
charge_amount = 120 // 5%.
|
charge_amount = 120 // 5%.
|
||||||
|
|||||||
@@ -56,9 +56,38 @@
|
|||||||
cell_type = null
|
cell_type = null
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol
|
||||||
|
name = "Precursor Alpha Weapon - Appendageheld Laser"
|
||||||
|
desc = "This object strongly resembles a weapon, and if one were to pull the \
|
||||||
|
trigger located on the handle of the object, it would fire a deadly \
|
||||||
|
laser at whatever it was pointed at. The beam fired appears to cause too \
|
||||||
|
much damage to whatever it would hit to have served as a long ranged repair tool, \
|
||||||
|
therefore this object was most likely designed to be a deadly weapon. If so, this \
|
||||||
|
has several implications towards its creators;\
|
||||||
|
<br><br>\
|
||||||
|
Firstly, it implies that these precursors, at some point during their development, \
|
||||||
|
had needed to defend themselves, or otherwise had a need to utilize violence, and \
|
||||||
|
as such created better tools to do so. It is unclear if violence was employed against \
|
||||||
|
themselves as a form of in-fighting, or if violence was exclusive to outside species.\
|
||||||
|
<br><br>\
|
||||||
|
Secondly, the shape and design of the weapon implies that the creators of this \
|
||||||
|
weapon were able to grasp objects, and be able to manipulate the trigger independently \
|
||||||
|
from merely holding onto the weapon, making certain types of appendages like tentacles be \
|
||||||
|
unlikely.\
|
||||||
|
<br><br>\
|
||||||
|
An interesting note about this weapon, when compared to contemporary energy weapons, is \
|
||||||
|
that this gun appears to be inferior to modern laser weapons. The beam fired has less \
|
||||||
|
of an ability to harm, and the power consumption appears to be higher than average for \
|
||||||
|
a human-made energy side-arm. One possible explaination is that the creators of this \
|
||||||
|
weapon, in their later years, had less of a need to optimize their capability for war, \
|
||||||
|
and instead focused on other endeavors. Another explaination is that vast age of the weapon \
|
||||||
|
may have caused it to degrade, yet still remain functional at a reduced capability."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
|
||||||
/obj/item/weapon/gun/energy/alien
|
/obj/item/weapon/gun/energy/alien
|
||||||
name = "alien pistol"
|
name = "alien pistol"
|
||||||
desc = "A weapon that works very similarly to a traditional energy weapon. How this came to be will likely be a mystery for the ages."
|
desc = "A weapon that works very similarly to a traditional energy weapon. How this came to be will likely be a mystery for the ages."
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol)
|
||||||
icon_state = "alienpistol"
|
icon_state = "alienpistol"
|
||||||
item_state = "alienpistol"
|
item_state = "alienpistol"
|
||||||
fire_sound = 'sound/weapons/eLuger.ogg'
|
fire_sound = 'sound/weapons/eLuger.ogg'
|
||||||
|
|||||||
@@ -1,6 +1,34 @@
|
|||||||
|
|
||||||
// Phoron shards have been moved to code/game/objects/items/weapons/shards.dm
|
// Phoron shards have been moved to code/game/objects/items/weapons/shards.dm
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/material/crystals
|
||||||
|
name = "Collection - Crystals"
|
||||||
|
desc = "Occasionally found deep underground are clusters of luminescent crystals, which emit \
|
||||||
|
a fair amount of light. The type of crystal appears to match the environment they are \
|
||||||
|
found at, such as regions with very low temperatures having blue, icy crystals.\
|
||||||
|
<br><br>\
|
||||||
|
The crystals themselves are completely inert, suggesting that they do not adjust the climate they \
|
||||||
|
are found in, instead being acted on by their local surroundings at the time of formation. Crystals \
|
||||||
|
retain their characteristics when moved, even to a location with an 'opposite' environment to the one \
|
||||||
|
it was found in, suggesting that locations where clusters are found have had a fairly consistant environment \
|
||||||
|
for a very long time.\
|
||||||
|
<br><br>\
|
||||||
|
Unfortunately, no useful purpose has been found so far for the crystals, beyond being visually pleasing \
|
||||||
|
to observe. They would likely be valued by jewelers, if it wasn't very difficult to work with the crystal."
|
||||||
|
value = CATALOGUER_REWARD_MEDIUM
|
||||||
|
unlocked_by_all = list(
|
||||||
|
/datum/category_item/catalogue/material/regular_crystal,
|
||||||
|
/datum/category_item/catalogue/material/ice_crystal,
|
||||||
|
/datum/category_item/catalogue/material/magma_crystal
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
/datum/category_item/catalogue/material/regular_crystal
|
||||||
|
name = "Crystal - Subterranean"
|
||||||
|
desc = "This is a luminescent crystalline mass, colored green or purple, and is sometimes found \
|
||||||
|
in average subterranean environments. It does not appear to be able to serve any useful purpose."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
//legacy crystal
|
//legacy crystal
|
||||||
/obj/machinery/crystal
|
/obj/machinery/crystal
|
||||||
name = "crystal"
|
name = "crystal"
|
||||||
@@ -9,6 +37,7 @@
|
|||||||
icon_state = "crystal"
|
icon_state = "crystal"
|
||||||
density = TRUE
|
density = TRUE
|
||||||
anchored = TRUE
|
anchored = TRUE
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/material/regular_crystal)
|
||||||
|
|
||||||
/obj/machinery/crystal/Initialize()
|
/obj/machinery/crystal/Initialize()
|
||||||
randomize_color()
|
randomize_color()
|
||||||
@@ -21,21 +50,38 @@
|
|||||||
else
|
else
|
||||||
set_light(3, 3, "#33CC33")
|
set_light(3, 3, "#33CC33")
|
||||||
|
|
||||||
|
// Icy crystals.
|
||||||
|
/datum/category_item/catalogue/material/ice_crystal
|
||||||
|
name = "Crystal - Ice"
|
||||||
|
desc = "This is a luminescent crystalline mass with a blue, icy appearance, and is sometimes found \
|
||||||
|
in very cold, subterranean environments. It does not appear to be able to serve any useful purpose."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/machinery/crystal/ice //slightly more thematic crystals
|
/obj/machinery/crystal/ice //slightly more thematic crystals
|
||||||
name = "ice crystal"
|
name = "ice crystal"
|
||||||
desc = "A large crystalline ice formation."
|
desc = "A large crystalline ice formation."
|
||||||
icon_state = "icecrystal2"
|
icon_state = "icecrystal2"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/material/ice_crystal)
|
||||||
|
|
||||||
/obj/machinery/crystal/ice/randomize_color()
|
/obj/machinery/crystal/ice/randomize_color()
|
||||||
if(prob(30))
|
if(prob(30))
|
||||||
icon_state = "icecrystal1"
|
icon_state = "icecrystal1"
|
||||||
set_light(3, 3, "#C4FFFF")
|
set_light(3, 3, "#C4FFFF")
|
||||||
|
|
||||||
|
// Magma crystals.
|
||||||
|
/datum/category_item/catalogue/material/magma_crystal
|
||||||
|
name = "Crystal - Magma"
|
||||||
|
desc = "This is a luminescent crystalline mass, colored orange and red, and is sometimes found \
|
||||||
|
in very hot, subterranean environments. It does not appear to be able to serve any useful purpose, \
|
||||||
|
beyond heralding dangerous magma."
|
||||||
|
value = CATALOGUER_REWARD_EASY
|
||||||
|
|
||||||
/obj/machinery/crystal/lava
|
/obj/machinery/crystal/lava
|
||||||
name = "lava crystal"
|
name = "magma crystal"
|
||||||
desc = "A large crystalline formation found near extreme heat."
|
desc = "A large crystalline formation found near extreme heat."
|
||||||
icon_state = "grey_crystal"
|
icon_state = "grey_crystal"
|
||||||
color = "#FCCF64"
|
color = "#FCCF64"
|
||||||
|
catalogue_data = list(/datum/category_item/catalogue/material/magma_crystal)
|
||||||
|
|
||||||
/obj/machinery/crystal/lava/randomize_color()
|
/obj/machinery/crystal/lava/randomize_color()
|
||||||
if(prob(50))
|
if(prob(50))
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 406 KiB After Width: | Height: | Size: 363 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 70 KiB |
@@ -51,7 +51,9 @@
|
|||||||
/obj/item/device/geiger,
|
/obj/item/device/geiger,
|
||||||
/obj/item/weapon/cell/device,
|
/obj/item/weapon/cell/device,
|
||||||
/obj/item/device/radio,
|
/obj/item/device/radio,
|
||||||
/obj/item/stack/marker_beacon/thirty)
|
/obj/item/stack/marker_beacon/thirty,
|
||||||
|
/obj/item/device/cataloguer
|
||||||
|
)
|
||||||
|
|
||||||
/obj/structure/closet/secure_closet/explorer/Initialize()
|
/obj/structure/closet/secure_closet/explorer/Initialize()
|
||||||
if(prob(50))
|
if(prob(50))
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
"aV" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
"aV" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
||||||
"aW" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
"aW" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
||||||
"aX" = (/obj/machinery/computer,/turf/simulated/shuttle/floor/yellow,/area/submap/CrashedMedShuttle)
|
"aX" = (/obj/machinery/computer,/turf/simulated/shuttle/floor/yellow,/area/submap/CrashedMedShuttle)
|
||||||
"aY" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor/yellow,/area/submap/CrashedMedShuttle)
|
"aY" = (/obj/structure/prop/blackbox/crashed_med_shuttle,/turf/simulated/shuttle/floor/yellow,/area/submap/CrashedMedShuttle)
|
||||||
"aZ" = (/obj/effect/spider/stickyweb,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CrashedMedShuttle)
|
"aZ" = (/obj/effect/spider/stickyweb,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CrashedMedShuttle)
|
||||||
"ba" = (/obj/random/mob/spider/mutant,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CrashedMedShuttle)
|
"ba" = (/obj/random/mob/spider/mutant,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CrashedMedShuttle)
|
||||||
"bb" = (/obj/effect/spider/cocoon,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CrashedMedShuttle)
|
"bb" = (/obj/effect/spider/cocoon,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CrashedMedShuttle)
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
"bm" = (/obj/random/medical,/turf/simulated/shuttle/floor/white,/area/submap/CrashedMedShuttle)
|
"bm" = (/obj/random/medical,/turf/simulated/shuttle/floor/white,/area/submap/CrashedMedShuttle)
|
||||||
"bn" = (/mob/living/simple_mob/animal/giant_spider/webslinger,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
"bn" = (/mob/living/simple_mob/animal/giant_spider/webslinger,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
||||||
"bo" = (/obj/effect/spider/cocoon,/obj/structure/lattice,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
"bo" = (/obj/effect/spider/cocoon,/obj/structure/lattice,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
||||||
"bp" = (/obj/structure{anchored = 1; density = 1; desc = "Once an artificial intelligence; now merely a brick of inert metal and circuits."; icon = 'icons/mob/AI.dmi'; icon_state = "ai-empty"; name = "V.I.T.A"},/turf/simulated/shuttle/floor/yellow,/area/submap/CrashedMedShuttle)
|
"bp" = (/obj/structure/prop/fake_ai/dead/crashed_med_shuttle,/turf/simulated/shuttle/floor/yellow,/area/submap/CrashedMedShuttle)
|
||||||
"bq" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
"bq" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
||||||
"br" = (/obj/structure/grille/broken,/obj/item/weapon/material/shard,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
"br" = (/obj/structure/grille/broken,/obj/item/weapon/material/shard,/turf/simulated/floor/outdoors/rocks,/area/submap/CrashedMedShuttle)
|
||||||
"bs" = (/obj/effect/decal/cleanable/blood/drip,/obj/effect/spider/stickyweb,/mob/living/simple_mob/animal/giant_spider/webslinger,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CrashedMedShuttle)
|
"bs" = (/obj/effect/decal/cleanable/blood/drip,/obj/effect/spider/stickyweb,/mob/living/simple_mob/animal/giant_spider/webslinger,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CrashedMedShuttle)
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
"aI" = (/obj/machinery/button{name = "Cargo Hatch"},/turf/simulated/shuttle/wall,/area/submap/cave/qShuttle)
|
"aI" = (/obj/machinery/button{name = "Cargo Hatch"},/turf/simulated/shuttle/wall,/area/submap/cave/qShuttle)
|
||||||
"aJ" = (/obj/machinery/computer,/turf/simulated/shuttle/floor,/area/submap/cave/qShuttle)
|
"aJ" = (/obj/machinery/computer,/turf/simulated/shuttle/floor,/area/submap/cave/qShuttle)
|
||||||
"aK" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/obj/effect/decal/cleanable/vomit,/turf/simulated/shuttle/floor{icon_state = "floor_white"},/area/submap/cave/qShuttle)
|
"aK" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/obj/effect/decal/cleanable/vomit,/turf/simulated/shuttle/floor{icon_state = "floor_white"},/area/submap/cave/qShuttle)
|
||||||
"aL" = (/obj/structure/table/standard,/obj/item/clothing/head/helmet/space/emergency,/obj/item/weapon/paper{desc = "It looks old."; icon_state = "paper_words"; info = "<B>Pilot's Log for Major Bill's Transportation Shuttle MBT-540</B><BR>Routine flight inbound for VIMC Outpost C-12 6:35AM 03/12/2491, Estimated arrival 7:05AM. 16 passengers, 2 crew.<BR><B>V.I.S Traffic Control 06:05:55:</B>Major Bill's MBT-540 you are clear for departure from Dock 6 on departure route Charlie. Have a safe flight.<BR><B>Captain Willis 06:06:33:</B> You too, control. Departing route Charlie.<BR><B>Captain Willis 06:06:48:</B> ...Damn it.<BR> ** <BR><B>Captain Adisu 06:10:23: </B> Hey Ted, I'm seeing a fuel line pressure drop on engine 3?<BR><B>Captain Willis 06:10:50</B>: Yeah, I see it. Heater's fading out, redistributing thrust 30% to compensate.<BR><B>06:12:31: A loud thud is heard.</B><BR><B>Captain Adisu 06:12:34: </B> What the (Expletives)?<BR><B>Captain Adisu 06:12:39:</B> We just lost power to engine- engine two. Hold on... Atmospheric alarm in the cargo bay. Son of a...<BR><B>Captain Willis 06:12:59:</B> Reducing thrust further 30%, do we have a breach Adi, a breach?<BR><B>Captain Adisu 06:13:05:</B>No breach, checking cameras... Looks like- looks like some cargo came loose back there.<BR><B>Captain Willis 06:13:15:</B> (Expletives), I'm turning us around. Put out a distress call to Control, we'll be back in Sif orbit in a couple of minutes. <BR> ** <BR> <BR><B>V.I.S Traffic Control 06:15:49:</B> MBT-540 we are recieving you. Your atmospheric sensors are reading potentially harmful toxins in your cargo bay. Advise locking down interior cargo bay doors. Please stand by.<BR><B>Captain Adisu 06:16:10:</B> Understood. <BR> ** <BR><B>V.I.S Traffic Control 06:27:02: </B> MBT-540, we have no docking bays available at this time, are you equipped for atmospheric re-entry?<BR><B>Captain Willis 06:27:12:</B> We-We are shielded. But we have fuel and air for-<BR><B>V.I.S Traffic Control 06:27:17:</B> Please make an emergency landing at the coordinates provided and standby for further information.<BR> ** <BR><B>Captain Willis 06:36:33:</B> Emergency landing successful. Adi, er Adisu is checking on the passengers but we had a smooth enough landing, are we clear to begin evacu-<BR><B>06:36:50: (Sound of emergency shutters closing)</B><BR><B>Captain Willis 06:36:51: </B>What the hell? Control we just had a remote activation of our emergency shutters, please advise.<BR><B>V.I.S Traffic Control 06:38:10:</B> Captain, please tune to frequency 1493.8 we are passing you on to local emergency response units. Godspeed.<BR><B>Captain Willis 06:38:49:</B> This is Captain Willis of Major Bill's Transportation flight MBT-540 we have eighteen souls aboard and our emergency lockdown shutters have engaged remotely. Do you read?<BR><B>S.D.D.C:</B> This is the Sif Department of Disease Control, your vessel has been identified as carrying highly sensitive materials, and due to the nature of your system's automated alerts you will be asked to remain in quarantine until we are able to determine the nature of the pathogens aboard and whether it has entered the air circulation system. Please remain in your cockpit at this time.<BR> ** </BR><B>Captain Adisu 17:23:58:09:</B> I don't think they're opening those doors Ted. I don't think they're coming.</BR>"; item_state = "paper"; name = "Black Box Transcript MBT-540"},/turf/simulated/shuttle/floor,/area/submap/cave/qShuttle)
|
"aL" = (/obj/structure/prop/blackbox/quarantined_shuttle,/turf/simulated/shuttle/floor,/area/submap/cave/qShuttle)
|
||||||
"aM" = (/obj/item/trash/cheesie,/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor_white"},/area/submap/cave/qShuttle)
|
"aM" = (/obj/item/trash/cheesie,/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor_white"},/area/submap/cave/qShuttle)
|
||||||
"aN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/shuttle/floor{icon_state = "floor_yellow"},/area/submap/cave/qShuttle)
|
"aN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/shuttle/floor{icon_state = "floor_yellow"},/area/submap/cave/qShuttle)
|
||||||
"aO" = (/obj/structure/bed/chair{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/shuttle/floor{icon_state = "floor_yellow"},/area/submap/cave/qShuttle)
|
"aO" = (/obj/structure/bed/chair{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/shuttle/floor{icon_state = "floor_yellow"},/area/submap/cave/qShuttle)
|
||||||
@@ -144,4 +144,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
|||||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
"}
|
"}
|
||||||
|
|
||||||
|
|||||||
@@ -265,6 +265,7 @@
|
|||||||
#include "code\datums\looping_sounds\_looping_sound.dm"
|
#include "code\datums\looping_sounds\_looping_sound.dm"
|
||||||
#include "code\datums\looping_sounds\item_sounds.dm"
|
#include "code\datums\looping_sounds\item_sounds.dm"
|
||||||
#include "code\datums\looping_sounds\machinery_sounds.dm"
|
#include "code\datums\looping_sounds\machinery_sounds.dm"
|
||||||
|
#include "code\datums\looping_sounds\sequence.dm"
|
||||||
#include "code\datums\looping_sounds\weather_sounds.dm"
|
#include "code\datums\looping_sounds\weather_sounds.dm"
|
||||||
#include "code\datums\observation\_debug.dm"
|
#include "code\datums\observation\_debug.dm"
|
||||||
#include "code\datums\observation\_defines.dm"
|
#include "code\datums\observation\_defines.dm"
|
||||||
@@ -1164,10 +1165,13 @@
|
|||||||
#include "code\game\objects\structures\ghost_pods\silicon.dm"
|
#include "code\game\objects\structures\ghost_pods\silicon.dm"
|
||||||
#include "code\game\objects\structures\props\alien_props.dm"
|
#include "code\game\objects\structures\props\alien_props.dm"
|
||||||
#include "code\game\objects\structures\props\beam_prism.dm"
|
#include "code\game\objects\structures\props\beam_prism.dm"
|
||||||
|
#include "code\game\objects\structures\props\blackbox.dm"
|
||||||
|
#include "code\game\objects\structures\props\fake_ai.dm"
|
||||||
#include "code\game\objects\structures\props\nest.dm"
|
#include "code\game\objects\structures\props\nest.dm"
|
||||||
#include "code\game\objects\structures\props\projectile_lock.dm"
|
#include "code\game\objects\structures\props\projectile_lock.dm"
|
||||||
#include "code\game\objects\structures\props\prop.dm"
|
#include "code\game\objects\structures\props\prop.dm"
|
||||||
#include "code\game\objects\structures\props\puzzledoor.dm"
|
#include "code\game\objects\structures\props\puzzledoor.dm"
|
||||||
|
#include "code\game\objects\structures\props\transmitter.dm"
|
||||||
#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm"
|
#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm"
|
||||||
#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm"
|
#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm"
|
||||||
#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm"
|
#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm"
|
||||||
@@ -1377,6 +1381,10 @@
|
|||||||
#include "code\modules\busy_space\air_traffic.dm"
|
#include "code\modules\busy_space\air_traffic.dm"
|
||||||
#include "code\modules\busy_space\loremaster.dm"
|
#include "code\modules\busy_space\loremaster.dm"
|
||||||
#include "code\modules\busy_space\organizations.dm"
|
#include "code\modules\busy_space\organizations.dm"
|
||||||
|
#include "code\modules\catalogue\atoms.dm"
|
||||||
|
#include "code\modules\catalogue\catalogue_data.dm"
|
||||||
|
#include "code\modules\catalogue\cataloguer.dm"
|
||||||
|
#include "code\modules\catalogue\cataloguer_visuals.dm"
|
||||||
#include "code\modules\client\client defines.dm"
|
#include "code\modules\client\client defines.dm"
|
||||||
#include "code\modules\client\client procs.dm"
|
#include "code\modules\client\client procs.dm"
|
||||||
#include "code\modules\client\movement.dm"
|
#include "code\modules\client\movement.dm"
|
||||||
|
|||||||