Merge branch 'master' of github.com:Baystation12/Baystation12 into dev-freeze

Conflicts:
	code/modules/mob/living/say.dm
	code/modules/paperwork/paper.dm
	code/modules/telesci/bscrystal.dm
	html/changelog.html
	icons/mob/uniform.dmi
	maps/tgstation2.dmm
This commit is contained in:
Ccomp5950
2014-04-25 20:40:36 -05:00
79 changed files with 1440 additions and 1715 deletions

View File

@@ -275,7 +275,7 @@ var/global/floorIsLava = 0
I.rank = "N/A"
update_file = 1
dat += "<font color=#008800>[I.content]</font> <i>by [I.author] ([I.rank])</i> on <i><font color=blue>[I.timestamp]</i></font> "
if(I.author == usr.key)
if(I.author == usr.key || I.author == "Adminbot")
dat += "<A href='?src=\ref[src];remove_player_info=[key];remove_index=[i]'>Remove</A>"
dat += "<br><br>"
if(update_file) info << infos

View File

@@ -243,9 +243,6 @@
/client/proc/send_resources()
// preload_vox() //Causes long delays with initial start window and subsequent windows when first logged in.
// Send NanoUI resources to this client
nanomanager.send_resources(src)
getFiles(
'html/search.js',
'html/panels.css',

View File

@@ -555,6 +555,8 @@ datum/preferences
return
proc/SetAntagoptions(mob/user)
if(uplinklocation == "")
uplinklocation = "PDA"
var/HTML = "<body>"
HTML += "<tt><center>"
HTML += "<b>Antagonist Options</b> <hr />"

View File

@@ -25,13 +25,13 @@
/obj/item/clothing/glasses/science
name = "Science Goggles"
desc = "nothing"
desc = "The goggles do nothing!"
icon_state = "purple"
item_state = "glasses"
/obj/item/clothing/glasses/night
name = "Night Vision Goggles"
desc = "You can totally see in the dark now!."
desc = "You can totally see in the dark now!"
icon_state = "night"
item_state = "glasses"
origin_tech = "magnets=2"
@@ -112,13 +112,13 @@
src.flags |= GLASSESCOVERSEYES
flags_inv |= HIDEEYES
icon_state = initial(icon_state)
usr << "You flip the [src] down to protect your eyes."
usr << "You flip \the [src] down to protect your eyes."
else
src.up = !src.up
src.flags &= ~HEADCOVERSEYES
flags_inv &= ~HIDEEYES
icon_state = "[initial(icon_state)]up"
usr << "You push the [src] up out of your face."
usr << "You push \the [src] up out of your face."
usr.update_inv_glasses()

View File

@@ -4,30 +4,25 @@
icon_state = "magboots0"
species_restricted = null
var/magpulse = 0
icon_action_button = "action_blank"
action_button_name = "Toggle the magboots"
// flags = NOSLIP //disabled by default
verb/toggle()
set name = "Toggle Magboots"
set category = "Object"
set src in usr
if(usr.stat)
return
if(src.magpulse)
src.flags &= ~NOSLIP
src.slowdown = SHOES_SLOWDOWN
src.magpulse = 0
attack_self(mob/user)
if(magpulse)
flags &= ~NOSLIP
slowdown = SHOES_SLOWDOWN
magpulse = 0
icon_state = "magboots0"
usr << "You disable the mag-pulse traction system."
user << "You disable the mag-pulse traction system."
else
src.flags |= NOSLIP
src.slowdown = 2
src.magpulse = 1
flags |= NOSLIP
slowdown = 2
magpulse = 1
icon_state = "magboots1"
usr << "You enable the mag-pulse traction system."
usr.update_inv_shoes() //so our mob-overlays update
user << "You enable the mag-pulse traction system."
user.update_inv_shoes() //so our mob-overlays update
examine()
set src in view()
..()

View File

@@ -192,28 +192,44 @@
/obj/item/clothing/shoes/magboots/vox
desc = "A pair of heavy, jagged armoured foot pieces, seemingly suitable for a velociraptor."
name = "vox boots"
name = "vox magclaws"
item_state = "boots-vox"
icon_state = "boots-vox"
species_restricted = list("Vox")
action_button_name = "Toggle the magclaws"
toggle()
//set name = "Toggle Floor Grip"
if(usr.stat)
/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user)
if(src.magpulse)
flags &= ~NOSLIP
magpulse = 0
canremove = 1
user << "You relax your deathgrip on the flooring."
else
//make sure these can only be used when equipped.
if (!is_equipped())
user << "You will have to put on the [src] before you can do that."
return
if(src.magpulse)
src.flags &= ~NOSLIP
src.magpulse = 0
usr << "You relax your deathgrip on the flooring."
else
src.flags |= NOSLIP
src.magpulse = 1
usr << "You dig your claws deeply into the flooring, bracing yourself."
flags |= NOSLIP
magpulse = 1
canremove = 0 //kinda hard to take off magclaws when you are gripping them tightly.
user << "You dig your claws deeply into the flooring, bracing yourself."
user << "It would be hard to take off the [src] without relaxing your grip first."
//In case they somehow come off while enabled.
/obj/item/clothing/shoes/magboots/vox/dropped(mob/user as mob)
..()
if(src.magpulse)
user.visible_message("The [src] go limp as they are removed from [usr]'s feet.", "The [src] go limp as they are removed from your feet.")
flags &= ~NOSLIP
magpulse = 0
canremove = 1
examine()
set src in view()
..()
/obj/item/clothing/shoes/magboots/vox/examine()
set src in view()
..()
if (magpulse)
usr << "It would be hard to take these off without relaxing your grip first." //theoretically this message should only be seen by the wearer when the claws are equipped.
//Species-specific Syndicate rigs.

View File

@@ -43,10 +43,7 @@
if(10)
for(var/i = 0, i < 3, i++)
new/obj/item/weapon/reagent_containers/glass/beaker/noreact(src)
if(11 to 12)
for(var/i = 0, i < 9, i++)
new/obj/item/bluespace_crystal(src)
if(13)
if(11 to 13)
new/obj/item/weapon/melee/classic_baton(src)
if(14)
return

View File

@@ -159,5 +159,5 @@
comment = "tails"
else if(result == 2)
comment = "heads"
user.visible_message("<span class='notice'>[user] has thrown the [src]. It lands on [comment]! </span>", \
"<span class='notice'>You throw the [src]. It lands on [comment]! </span>")
user.visible_message("<span class='notice'>[user] has thrown \the [src]. It lands on [comment]! </span>", \
"<span class='notice'>You throw \the [src]. It lands on [comment]! </span>")

View File

@@ -258,6 +258,8 @@
adjustToxLoss(-(rads))
updatehealth()
return
if(species.flags & IS_SYNTHETIC)
return
var/damage = 0
switch(radiation)
@@ -1003,7 +1005,7 @@
updatehealth() //TODO
if(!in_stasis)
handle_organs() //Optimized.
handle_blood()
handle_blood()
if(health <= config.health_threshold_dead || brain_op_stage == 4.0)
death()
@@ -1081,7 +1083,7 @@
E = get_visible_implants(0)
if(!E.len)
embedded_flag = 0
//Eyes
if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
@@ -1144,7 +1146,7 @@
if(hud_updateflag)
handle_hud_list()
for(var/image/hud in client.images)
if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe
@@ -1311,7 +1313,7 @@
else if(!seer)
see_invisible = SEE_INVISIBLE_LIVING
if(healths)
if (analgesic)
@@ -1456,7 +1458,7 @@
V.activate(src)
// activate may have deleted the virus
if(!V) continue
// check if we're immune
if(V.antigen & src.antibodies)
V.dead = 1

View File

@@ -52,12 +52,11 @@
/datum/robot_component/proc/is_powered()
return (installed == 1) && (brute_damage + electronics_damage < max_damage) && (!energy_consumption || powered)
/datum/robot_component/proc/consume_power()
/datum/robot_component/proc/update_power_state()
if(toggled == 0)
powered = 0
return
if(owner.cell.charge >= energy_consumption)
if(owner.cell && owner.cell.charge >= energy_consumption)
owner.cell.use(energy_consumption)
powered = 1
else
@@ -75,6 +74,10 @@
external_type = /obj/item/robot_parts/robot_component/actuator
max_damage = 50
//A fixed and much cleaner implementation of /tg/'s special snowflake code.
/datum/robot_component/actuator/is_powered()
return (installed == 1) && (brute_damage + electronics_damage < max_damage)
/datum/robot_component/cell
name = "power cell"
max_damage = 50

View File

@@ -25,6 +25,9 @@
else
msg += "Its cover is closed.\n"
if(!has_power)
msg += "<span class='warning'>It appears to be running on backup power.</span>\n"
switch(src.stat)
if(CONSCIOUS)
if(!src.client) msg += "It appears to be in stand-by mode.\n" //afk

View File

@@ -33,29 +33,23 @@
/mob/living/silicon/robot/proc/use_power()
if (is_component_functioning("power cell") && cell)
if(src.cell.charge <= 0)
uneq_all()
src.stat = 1
else
if(src.module_state_1)
src.cell.use(3)
if(src.module_state_2)
src.cell.use(3)
if(src.module_state_3)
src.cell.use(3)
for(var/V in components)
var/datum/robot_component/C = components[V]
C.update_power_state()
for(var/V in components)
var/datum/robot_component/C = components[V]
C.consume_power()
if ( cell && is_component_functioning("power cell") && src.cell.charge > 0 )
if(src.module_state_1)
src.cell.use(3)
if(src.module_state_2)
src.cell.use(3)
if(src.module_state_3)
src.cell.use(3)
if(!is_component_functioning("actuator"))
Paralyse(3)
src.stat = 0
src.has_power = 1
else
uneq_all()
src.stat = 1
if (src.has_power)
src << "\red You are now running on emergency backup power."
src.has_power = 0
/mob/living/silicon/robot/proc/handle_regular_status_updates()
@@ -79,7 +73,7 @@
death()
if (src.stat != 2) //Alive.
if (src.paralysis || src.stunned || src.weakened) //Stunned etc.
if (src.paralysis || src.stunned || src.weakened || !src.has_power) //Stunned etc.
src.stat = 1
if (src.stunned > 0)
AdjustStunned(-1)
@@ -124,6 +118,10 @@
src.druggy--
src.druggy = max(0, src.druggy)
//update the state of modules and components here
if (src.stat != 0)
uneq_all()
if(!is_component_functioning("radio"))
radio.on = 0
else
@@ -133,6 +131,9 @@
src.blinded = 0
else
src.blinded = 1
if(!is_component_functioning("actuator"))
src.Paralyse(3)
return 1
@@ -305,4 +306,4 @@
/mob/living/silicon/robot/update_canmove()
if(paralysis || stunned || weakened || buckled || lockcharge) canmove = 0
else canmove = 1
return canmove
return canmove

View File

@@ -42,6 +42,7 @@
var/emagged = 0
var/wiresexposed = 0
var/locked = 1
var/has_power = 1
var/list/req_access = list(access_robotics)
var/ident = 0
//var/list/laws = list()

View File

@@ -168,6 +168,10 @@
M.show_message("\red [user] gently taps [src] with [O]. ")
/mob/living/simple_animal/construct/armoured/Life()
weakened = 0
..()
/mob/living/simple_animal/construct/armoured/bullet_act(var/obj/item/projectile/P)
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
var/reflectchance = 80 - round(P.damage/3)

View File

@@ -23,9 +23,9 @@
var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it.
//Interaction
var/response_help = "You try to help"
var/response_disarm = "You try to disarm"
var/response_harm = "You try to hurt"
var/response_help = "tries to help"
var/response_disarm = "tries to disarm"
var/response_harm = "tries to hurt"
var/harm_intent_damage = 3
//Temperature effect

View File

@@ -54,4 +54,6 @@
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src
if(H.species && H.species.abilities)
client.verbs |= H.species.abilities
client.verbs |= H.species.abilities
nanomanager.send_resources(client)

View File

@@ -29,5 +29,6 @@
new_player_panel()
spawn(40)
if(client)
nanomanager.send_resources(client)
handle_privacy_poll()
client.playtitlemusic()

View File

@@ -90,7 +90,6 @@
else
E.process()
number_wounds += E.number_wounds
//Robotic limb malfunctions
var/malfunction = 0
if (E.status & ORGAN_ROBOT && prob(E.brute_dam + E.burn_dam))
@@ -109,20 +108,24 @@
I.take_damage(rand(3,5))
//Special effects for limbs.
if(E.name in list("l_hand","l_arm","r_hand","r_arm") && (broken||malfunction))
if(E.name in list("l_hand","l_arm","r_hand","r_arm"))
var/obj/item/c_hand //Getting what's in this hand
var/hand
if(E.name == "l_hand" || E.name == "l_arm")
c_hand = l_hand
hand = "left hand"
if(E.name == "r_hand" || E.name == "r_arm")
c_hand = r_hand
hand = "right hand"
if (c_hand)
u_equip(c_hand)
if(broken)
emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : "screams in pain and"] drops what they were holding in their [E.display_name?"[E.display_name]":"[E]"]!")
u_equip(c_hand)
var/emote_scream = pick("screams in pain and", "let's out a sharp hiss and", "cries out and")
emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : emote_scream ] drops what they were holding in their [hand]!")
if(malfunction)
emote("me", 1, "drops what they were holding, their [E.display_name?"[E.display_name]":"[E]"] malfunctioning!")
u_equip(c_hand)
emote("me", 1, "drops what they were holding, their [hand] malfunctioning!")
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)

View File

@@ -376,20 +376,21 @@ This function completely restores a damaged organ to perfect condition.
// Internal wounds get worse over time. Low temperatures (cryo) stop them.
if(W.internal && !W.is_treated() && owner.bodytemperature >= 170)
if(!owner.reagents.has_reagent("bicaridine")) //bicard stops internal wounds from growing bigger with time, and also stop bleeding
var/bicardose = owner.reagents.get_reagent_amount("bicaridine")
if(!bicardose) //bicard stops internal wounds from growing bigger with time, and also stop bleeding
W.open_wound(0.1 * wound_update_accuracy)
owner.vessel.remove_reagent("blood",0.05 * W.damage * wound_update_accuracy)
if(bicardose >= 30) //overdose of bicaridine begins healing IB
W.damage = max(0, W.damage - 0.2)
if(!owner.reagents.has_reagent("inaprovaline")) //This little copypaste will allow inaprovaline to work too, giving it a much needed buff to help medical.
W.open_wound(0.1 * wound_update_accuracy)
owner.vessel.remove_reagent("blood",0.05 * W.damage * wound_update_accuracy)
owner.vessel.remove_reagent("blood",0.02 * W.damage * wound_update_accuracy)//Bicaridine slows Internal Bleeding
owner.vessel.remove_reagent("blood",0.02 * W.damage * wound_update_accuracy)
if(prob(1 * wound_update_accuracy))
owner.custom_pain("You feel a stabbing pain in your [display_name]!",1)
//overdose of bicaridine begins healing IB
if(owner.reagents.get_reagent_amount("bicaridine") >= 30)
W.damage = max(0, W.damage - 0.2)
// slow healing
var/heal_amt = 0

View File

@@ -129,10 +129,8 @@
// Ethanol and all drinks are bad
if(istype(R, /datum/reagent/ethanol))
owner.adjustToxLoss(0.1 * process_accuracy)
// Can't cope with toxins at all
for(var/toxin in list("toxin", "plasma", "sacid", "pacid", "cyanide", "lexorin", "amatoxin", "chloralhydrate", "carpotoxin", "zombiepowder", "mindbreaker"))
if(owner.reagents.has_reagent(toxin))
// Can't cope with toxins at all
if(istype(R, /datum/reagent/toxin))
owner.adjustToxLoss(0.3 * process_accuracy)
/datum/organ/internal/kidney

View File

@@ -2,7 +2,7 @@
/obj/machinery/power/emitter
name = "Emitter"
desc = "A heavy duty industrial laser"
desc = "It is a heavy duty industrial laser."
icon = 'icons/obj/singularity.dmi'
icon_state = "emitter"
anchored = 0

View File

@@ -43,7 +43,7 @@
damage = 10
damage_type = TOX
nodamage = 0
weaken = 10
agony = 40
stutter = 10

View File

@@ -1227,7 +1227,7 @@
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/spagetti
name = "Spagetti"
name = "Spaghetti"
desc = "A bundle of raw spaghetti."
icon_state = "spagetti"
filling_color = "#EDDD00"
@@ -1807,7 +1807,7 @@
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti
name = "Boiled Spagetti"
name = "Boiled Spaghetti"
desc = "A plain dish of noodles, this sucks."
icon_state = "spagettiboiled"
trash = /obj/item/trash/plate
@@ -1843,7 +1843,7 @@
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/pastatomato
name = "Spagetti"
name = "Spaghetti"
desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!"
icon_state = "pastatomato"
trash = /obj/item/trash/plate
@@ -1856,7 +1856,7 @@
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/meatballspagetti
name = "Spagetti & Meatballs"
name = "Spaghetti & Meatballs"
desc = "Now thats a nic'e meatball!"
icon_state = "meatballspagetti"
trash = /obj/item/trash/plate

View File

@@ -280,6 +280,13 @@
user.put_in_hands(new /obj/item/weapon/bucket_sensor)
user.drop_from_inventory(src)
del(src)
update_icon()
overlays.Cut()
if (!is_open_container())
var/image/lid = image(icon, src, "lid_[initial(icon_state)]")
overlays += lid
// vials are defined twice, what?
/*

View File

@@ -184,7 +184,7 @@
/obj/structure/reagent_dispensers/water_cooler
name = "Water-Cooler"
desc = "A machine that dispenses water to drink"
desc = "A machine that dispenses water to drink."
amount_per_transfer_from_this = 5
icon = 'icons/obj/vending.dmi'
icon_state = "water_cooler"

View File

@@ -121,7 +121,7 @@ When thinking about new stuff, check here to see if there are any slots unfilled
20 |
//BIOTECH
1 | Bruise Pack, Scalple
1 | Bruise Pack, Scalpel
2 | PANDEMIC Board, Mass Spectrometer
3 | AI Core, Brains (MMI)
4 | MMI+Radio

View File

@@ -1,17 +1,18 @@
/obj/item/weapon/book/manual/excavation
name = "Out on the dig"
name = "Out on the Dig"
icon_state = "excavation"
author = "Professor Patrick Mason, Curator of the Antiquities Museum on Ichar VII"
title = "Out on the dig"
title = "Out on the Dig"
dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h1 {font-size: 15px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {list-style: none; margin: 5px; padding: 0px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
body {font-size: 13px; font-family: Verdana;}
</style>
</head>
<body>
@@ -30,81 +31,81 @@
Every digsite I've been to, someone has forgotten something and I've never yet been to a dig that hasn't had me hiking to get to it - so gather your gear
and get it to the site the first time. You learn quick that time is money, when you've got a shipful of bandits searching for you the next valley over,
but don't be afraid to clear some space if there are any inconvenient boulders in the way.<br>
<list>
<li>Floodlights (if it's dark)</li>
<li>Wooden trestle tables (for holding tools and finds)</li>
<li>Suspension field generator</li>
<li>Load bearing servitors (such as a mulebot, or hover-tray)</li>
<li>Spare energy packs</li>
</list><br>
<ul>
<li>Floodlights (if it's dark)</li>
<li>Wooden trestle tables (for holding tools and finds)</li>
<li>Suspension field generator</li>
<li>Load bearing servitors (such as a mulebot, or hover-tray)</li>
<li>Spare energy packs</li>
</ul><br>
<a href="#Contents">Contents</a>
<h1><a name="Tools">Knowing your tools</a></h1>
Every archaeologist has a plethora of tools at their disposal, but here's the important ones:<br>
<list>
<li><b>Picks, pickaxes and brushes</b> - don't underestimate the the smallest or largest in your arsenal, each one clears a different amount
of the rockface so each one has a use.</li>
<li><b>Measuring tape</b> - don't leave home without it, you can use it to measure the depth a rock face has been excavated to.</li>
<li><b>GPS locater</b> - knowing where you are is the first step to not be lost.</li>
<li><b>Core sampler</b> - use this to take core samples from rock faces, which you can then run to the lab for analysis.</li>
<li><b>Depth scanner</b> - uses x-ray diffraction to locate anomalous densities in rock, indicating archaeological deposits or mineral veins.
Comes with a handy reference log containing co-ordinates and time of each scan.</li>
<li><b>Alden-Saraspova counter</b> - uses a patented application of Fourier Transform analysis to determine the difference between background and
exotic radiation. Use it to determine how far you are from anomalous energy sources.</li>
<li><b>Radio beacon locater</b> - leave a beacon at an item of interest, then track it down later with this handy gadget. Watch for interference from other
devices though.</li>
<li><b>Flashlight or portable light source</b> - Self explanatory, I hope.</li>
<li><b>Environmental safety gear</b> - This one's dependant on the environment you're working in, but enclosed footwear and pack of internals
could save your life.</li>
<li><b>Anomaly safety gear</b> - A biosealed and catalysis-resistant suit along with eye shielding, tinted hood and non-reactive disposable gloves are
the best kind of protection you can hope for from the errors our forbears may have unleashed.</li>
<li><b>Personal defence weapon</b> - Never know what you'll find on the dig: pirates, natives, ancient guardians, carnivorous wildlife...
it pays in blood to be prepared.</li>
</list><br>
<ul>
<li><b>Picks, pickaxes, and brushes</b> - don't underestimate the the smallest or largest in your arsenal, each one clears a different amount
of the rockface so each one has a use.</li>
<li><b>Measuring tape</b> - don't leave home without it, you can use it to measure the depth a rock face has been excavated to.</li>
<li><b>GPS locator</b> - knowing where you are is the first step to not be lost.</li>
<li><b>Core sampler</b> - use this to take core samples from rock faces, which you can then run to the lab for analysis.</li>
<li><b>Depth scanner</b> - uses X-ray diffraction to locate anomalous densities in rock, indicating archaeological deposits or mineral veins.
Comes with a handy reference log containing coordinates and time of each scan.</li>
<li><b>Alden-Saraspova counter</b> - uses a patented application of Fourier Transform analysis to determine the difference between background and
exotic radiation. Use it to determine how far you are from anomalous energy sources.</li>
<li><b>Radio beacon locator</b> - leave a beacon at an item of interest, then track it down later with this handy gadget. Watch for interference from other
devices though.</li>
<li><b>Flashlight or portable light source</b> - Self explanatory, I hope.</li>
<li><b>Environmental safety gear</b> - This one's dependent on the environment you're working in, but enclosed footwear and a pack of internals
could save your life.</li>
<li><b>Anomaly safety gear</b> - A biosealed and catalysis-resistant suit along with eye shielding, tinted hood, and non-reactive disposable gloves are
the best kind of protection you can hope for from the errors our forebears may have unleashed.</li>
<li><b>Personal defence weapon</b> - Never know what you'll find on the dig: pirates, natives, ancient guardians, carnivorous wildlife...
it pays in blood to be prepared.</li>
</ul><br>
<a href="#Contents">Contents</a>
<h1><a name="Find">Finding the dig</a></h1>
Wouldn't be an archaeologist without their dig, but everyone has to start somewhere. Here's a basic procedure I go through when cataloguing a new planet:<br>
<list>
<li><b>Get in touch with the locals</b> (in particular geologists, miners and farmers) - Never know what's been turned up by accident, then left to
gather dust on a shelf.</li>
<li><b>Check the obvious areas first</b> - even if you're pressed for time, these ones are the generally easiest to search, and the most likely targets
of your rivals.</li>
<li><b>Do some prospecting</b> - the earth mother isn't in the habit of displaying her secrets to the world (although sometimes you get lucky).
Drop a shaft and clear away a bit of surface rock here and there, you never know what might be lurking below the surface.</li>
<li><b>Tips on unearthing a deposit</b> - How do you know when you're golden? Look for telltale white strata that looks strange or out of place, or if
something has broken under your pick while you're digging. Your depth scanner is your best friend, but even it can't distinguish between
ordinary minerals and ancient leavings, if in doubt then err on the side of caution.</li>
</list><br>
<ul>
<li><b>Get in touch with the locals</b> (in particular geologists, miners, and farmers) - Never know what's been turned up by accident, then left to
gather dust on a shelf.</li>
<li><b>Check the obvious areas first</b> - even if you're pressed for time, these ones are the generally easiest to search, and the most likely targets
of your rivals.</li>
<li><b>Do some prospecting</b> - the earth mother isn't in the habit of displaying her secrets to the world (although sometimes you get lucky).
Drop a shaft and clear away a bit of surface rock here and there, you never know what might be lurking below the surface.</li>
<li><b>Tips on unearthing a deposit</b> - How do you know when you're golden? Look for telltale white strata that looks strange or out of place, or if
something has broken under your pick while you're digging. Your depth scanner is your best friend, but even it can't distinguish between
ordinary minerals and ancient leavings, if in doubt then err on the side of caution.</li>
</ul><br>
<a href="#Contents">Contents</a>
<h1><a name="Analyse">Analysing the contents of a dig</a></h1>
You've found some unusual strata, but it's not all peaches from here. No archaeologist ever managed to pull a bone from the earth without doing thorough
chemical analysis on every two meters of rock face nearby.<br>
<list>
<li><b>Take core samples</b> - Grab a rock core for every 4m^2.</li>
<li><b>Clear around any potential finds</b> - Clear away ordinary rock, leaving your prizes reachable in a clearly marked area.</li>
<li><b>Haul off excess rock</b> - It's easy for a dig to get cluttered, and a neat archaeologist is a successful archaeologist.</li>
<li><b>Don't be afraid to be cautious</b> - It's slower sometimes, but the extra time will be worth the payoff when you find an Exolitic relic.</li>
<li><b>Chemical analysis</b> - I won't go into detail here, but the labwork is essential to any successful extraction. Marshal your core samples, and
send them off to the labcoated geniuses</li>
</list><br>
<ul>
<li><b>Take core samples</b> - Grab a rock core for every 4m^2.</li>
<li><b>Clear around any potential finds</b> - Clear away ordinary rock, leaving your prizes reachable in a clearly marked area.</li>
<li><b>Haul off excess rock</b> - It's easy for a dig to get cluttered, and a neat archaeologist is a successful archaeologist.</li>
<li><b>Don't be afraid to be cautious</b> - It's slower sometimes, but the extra time will be worth the payoff when you find an Exolitic relic.</li>
<li><b>Chemical analysis</b> - I won't go into detail here, but the labwork is essential to any successful extraction. Marshal your core samples, and
send them off to the labcoated geniuses.</li>
</ul><br>
<a href="#Contents">Contents</a>
<h1><a name="Excavate">Extracting your first find</a></h1>
<list>
<li><b>Scan the rock</b> - Use a depth scanner to determine the find's depth and clearance. DON'T FORGET THESE.</li>
<li><b>Choose stasis field</b> - Chemical analysis on a core sample from the rock face will tell you which field is necessary to extract the find safely</li>
<li><b>Setup field gen</b> - Bolt it down, choose the field, check the charge and activate it. If you forget it, you'll wish you hadn't when that priceless
Uryom vase crumbles as it sees the light of day.</li>
<li><b>FUNCTIONAL AND SAFE digging</b> - Dig into the rock until you've cleared away a depth equal to (the anomaly depth MINUS the clearance range). The find
should come loose on it's own, but it will be in the midst of a chunk of rock. Use a welder or miniature excavation tool to clear away the excess.</li>
<li><b>FANCY AND SPEEDY digging</b> - Dig into the rock until you've cleared away a depth equal to the anomaly depth, but without any of your strokes
entering the clearance range.</li>
<li><b>The Big Find</b> - Sometimes, you'll chance upon something big, both literally and figuratively. Giant statues and functioning remnants of Precursor
technology are just as exciting, to the right buyers. If your digging leaves a large boulder behind, dig into it normally and see if anything's hidden
inside.</li>
</list><br>
<ul>
<li><b>Scan the rock</b> - Use a depth scanner to determine the find's depth and clearance. DON'T FORGET THESE.</li>
<li><b>Choose stasis field</b> - Chemical analysis on a core sample from the rock face will tell you which field is necessary to extract the find safely.</li>
<li><b>Setup field gen</b> - Bolt it down, choose the field, check the charge, and activate it. If you forget it, you'll wish you hadn't when that priceless
Uryom vase crumbles as it sees the light of day.</li>
<li><b>FUNCTIONAL AND SAFE digging</b> - Dig into the rock until you've cleared away a depth equal to (the anomaly depth MINUS the clearance range). The find
should come loose on it's own, but it will be in the midst of a chunk of rock. Use a welder or miniature excavation tool to clear away the excess.</li>
<li><b>FANCY AND SPEEDY digging</b> - Dig into the rock until you've cleared away a depth equal to the anomaly depth, but without any of your strokes
entering the clearance range.</li>
<li><b>The big find</b> - Sometimes, you'll chance upon something big, both literally and figuratively. Giant statues and functioning remnants of Precursor
technology are just as exciting, to the right buyers. If your digging leaves a large boulder behind, dig into it normally and see if anything's hidden
inside.</li>
</ul><br>
<a href="#Contents">Contents</a>
</body>
@@ -112,7 +113,7 @@
"}
/obj/item/weapon/book/manual/mass_spectrometry
name = "High power mass spectrometry, a comprehensive guide"
name = "High Power Mass Spectrometry: A Comprehensive Guide"
icon_state = "analysis"
author = "Winton Rice, Chief Mass Spectrometry Technician at the Institute of Applied Sciences on Arcadia"
title = "High powered mass spectrometry, a comprehensive guide"
@@ -120,10 +121,11 @@
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h1 {font-size: 15px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {list-style: none; margin: 5px; padding: 0px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
body {font-size: 13px; font-family: Verdana;}
</style>
</head>
<body>
@@ -138,25 +140,25 @@
<br>
<h1><a name="Terms">A note on terms</a></h1>
<list>
<li><b>Mass spectrometry</b> - MS is the procedure used used to measure and quantify the components of matter. The most prized tool in the field of
'Materials analysis'</li>
<li><b>Radiometric dating</b> - MS applied using the right carrier reagents can be used to accurately determine the age of a sample.</li>
<li><b>Dissonance ratio</b> - This is a pseudoarbitrary value indicating the overal presence of a particular element in a greater composite.
It takes into account volume, density, molecular excitation and isotope spread.</li>
<li><b>Vacuum seal integrity</b> - A reference to how close an airtight seal is to failure.</li>
</list><br>
<ul>
<li><b>Mass spectrometry</b> - MS is the procedure used used to measure and quantify the components of matter. The most prized tool in the field of
'Materials analysis.'</li>
<li><b>Radiometric dating</b> - MS applied using the right carrier reagents can be used to accurately determine the age of a sample.</li>
<li><b>Dissonance ratio</b> - This is a pseudoarbitrary value indicating the overall presence of a particular element in a greater composite.
It takes into account volume, density, molecular excitation and isotope spread.</li>
<li><b>Vacuum seal integrity</b> - A reference to how close an airtight seal is to failure.</li>
</ul><br>
<a href="#Contents">Contents</a>
<h1><a name="Analysis">Analysis progression</a></h1>
Modern mass spectrometry requires constant attention from the diligant researcher in order to be successul. There are many different elements to juggle,
Modern mass spectrometry requires constant attention from the diligent researcher in order to be successful. There are many different elements to juggle,
and later chapters will delve into them. For the spectrometry assistant, the first thing you need to know is that the scanner wavelength is automatically
calculated for you. Just tweak the settings and try to match it with the actual wavelength as closely as possible.<br>
<br>
<a href="#Contents">Contents</a>
<h1><a name="Seal">Seal integrity</a></h1>
In order to maintain sterile and environmentally static procedures, a special chamber is setup inside the spectrometer. It's protected by a proprietary vacuum seal
In order to maintain sterile and environmentally static procedures, a special chamber is set up inside the spectrometer. It's protected by a proprietary vacuum seal
produced by top tier industrial science. It will only last for a certain number of scans before failing outright, but it can be resealed through use of nanite paste.
Unfortunately, it's susceptible to malforming under heat stress so exposing it to higher temperatures will cause it's operation life to drop significantly.<br>
<br>
@@ -182,47 +184,50 @@
"}
/obj/item/weapon/book/manual/anomaly_spectroscopy
name = "Spectroscopy: Analysing the anomalies of the cosmos"
name = "Spectroscopy: Analysing the Anomalies of the Cosmos"
icon_state = "anomaly"
author = "Doctor Martin Boyle, Director Research at the Lower Hydrolian Sector Listening Array"
title = "Spectroscopy: Analysing the anomalies of the cosmos"
title = "Spectroscopy: Analysing the Anomalies of the Cosmos"
dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h1 {font-size: 15px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {list-style: none; margin: 5px; padding: 0px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
body {font-size: 13px; font-family: Verdana;}
</style>
</head>
<body>
<br>
It's perhaps one of the most exciting times to be alive, with the recent breakthroughs in understanding and categorisation of things we may one day no longer call
'anomalies,' but rather 'infrequent or rare occurrences of certain celestial weather or phenomena.' Perhaps a little more long winded, but no less eloquent all the
same! Why, look at the strides we're making in piercing the walls of bluespace or our steadily improving ability to clarify and stabilise subspace emissions; it's
certainly an exciting time to be alive. For the moment the Hydrolian hasn't seen two spatial anomalies alike but the day will come and it is soon, I can feel it.
"}
certainly an exciting time to be alive. For the moment, the Hydrolian hasn't seen two spatial anomalies alike but the day will come and it is soon, I can feel it.
</body>
</html>"}
/obj/item/weapon/book/manual/materials_chemistry_analysis
name = "Materials analysis and the chemical implications"
name = "Materials Analysis and the Chemical Implications"
icon_state = "chemistry"
author = "Jasper Pascal, Senior Lecturer in Materials Analysis at the University of Jol'Nar"
title = "Materials analysis and the chemical implications"
title = "Materials Analysis and the Chemical Implications"
dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h1 {font-size: 15px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {list-style: none; margin: 5px; padding: 0px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
body {font-size: 13px; font-family: Verdana;}
</style>
</head>
<body>
<br>
In today's high tech research fields, leaps and bounds are being made every day. Whether it's great strides forward in our understanding of the physical universe
or the operation of some fancy new piece of equipment, it seems like all the cool fields are producing new toys to play with leaving doddery old fields such as
or the operation of some fancy new piece of equipment, it seems like all the cool fields are producing new toys to play with, leaving doddery old fields such as
materials analysis and chemistry relegated to the previous few centuries, when we were still learning the makeup and structure of the elements.<br>
<br>
Well, when you're out there building the next gryo-whatsitron or isotope mobility thingummy, remember how the field of archaeology experienced a massive new rebirth
@@ -231,25 +236,26 @@
"}
/obj/item/weapon/book/manual/anomaly_testing
name = "Anomalous materials and energies"
name = "Anomalous Materials and Energies"
icon_state = "triangulate"
author = "Norman York, formerly of the Tyrolion Institute on Titan"
title = "Anomalous materials and energies"
title = "Anomalous Materials and Energies"
dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h1 {font-size: 15px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {list-style: none; margin: 5px; padding: 0px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
body {font-size: 13px; font-family: Verdana;}
</style>
</head>
<body>
<h1><a name="Contents">Contents</a></h1>
<ol>
<li><a href="#Anomalies">Forward: Modern attitude towards anomalies</a></li>
<li><a href="#Anomalies">Foreword: Modern attitude towards anomalies</a></li>
<li><a href="#Tri">Triangulating anomalous energy readings</a></li>
<li><a href="#Synthetic">Harvesting and utilising anomalous energy signatures</a></li>
</ol>
@@ -259,7 +265,7 @@
vast and inscrutable mysterious of the cosmos that scholars from such august institutions as the Elysian Institute of the Sciences present
formulas and hypotheses for every few decades.<br>
<br>
Using our vast telescopic array installations and deep space satellite networks, we are able to detect anomalous energy fields and formations in deep space,
Using our vast, telescopic array installations and deep space satellite networks, we are able to detect anomalous energy fields and formations in deep space,
but are limited to those that are large enough to output energy that will stretch across light years worth of distance between stars.<br>
<br>
While some sectors (such as the Hydrolian Rift and Keppel's Run) are replete with inexplicable energetic activity and unique phenomena found nowhere else in
@@ -269,9 +275,9 @@
Indeed, a great source of knowledge and technology has always been those who come before us, in the form of the multitudinous ancient alien precursors that
have left scattered remnants of their great past all over settled (and unexplored) space.<br>
<br>
It is from xenoarchaeologists, high energy materials researchers and technology reconstruction authorities that we are able to theorise on the gifts these
species have left behind, and in some cases even reverse engineer or rebuild the technology in question. My colleague Doctor Raymond Ward of the
Tyrolian Institute on Titan has made great breakthroughs in a related field through his pioneering development of universally reflective materials capable
It is from xenoarchaeologists, high energy materials researchers, and technology reconstruction authorities that we are able to theorise on the gifts these
species have left behind, and in some cases even reverse engineer or rebuild the technology in question. My colleague, Doctor Raymond Ward of the
Tyrolian Institute on Titan, has made great breakthroughs in a related field through his pioneering development of universally reflective materials capable
of harvesting and 'bottling' up virtually any energy emissions yet encountered by spacefaring civilisations.<br>
<br>
And yet, there are some amongst us who do not see the benefits of those who have come before us - indeed, some among them profess the opinion that there
@@ -281,26 +287,26 @@
<a href="#Contents">Contents</a>
<h1><a name="Tri">Triangulating anomalous energy readings</a></h1>
Strong energy emissions, when remaining constant from any one fixed location for millenia, can leave an 'imprint' or distinctive energy signature on other
Strong energy emissions, when remaining constant from any one fixed location for millennia, can leave an 'imprint' or distinctive energy signature on other
matter composites that are spatially fixed relative to the source.<br>
<br>
By taking samples of such 'fixed' matter, we can apply complex analytics such as the modified Fourier Transform Procedure to reverse engineer the path of the
energy, and determine the approximate distance and direction that the energy source is, relative to the sample's point in space. Modern portable devices can do
all this purely by taking readings of local radiation.<br>
<br>
A canny researcher can thusly analyse radiationat pre-chosen points strategically scattered around an area, and if there are any anomalous energy
A canny researcher can thusly analyse radiation at pre-chosen points strategically scattered around an area, and if there are any anomalous energy
emissions in range of those points, combined the researcher can triangulate the source.<br>
<a href="#Contents">Contents</a>
<h1><a name="Synthetic">Harvesting and utilising anomalous energy signatures</a></h1>
As mentioned in the forward, my colleague from the Tyrolian Institute on Saturn's moon of Titan, in the Sol System, Doctor Raymond Ward has made great strides
As mentioned in the foreword, my colleague from the Tyrolian Institute on Saturn's moon of Titan, in the Sol System, Doctor Raymond Ward has made great strides
in the area of harvesting and application of the energy emitted by anomalous phenomena from around the galaxy (although I profess I have not yet seen him
venture further from his birthplace on Earth than the comfortable distance of the Sol Cis-Oort Satellite Sphere).<br>
<br>
By employing a patented semi-phased alloy with unique and fascinating bluespace interaction properties, Ward's contraption is able to 'harvest' energy, store
it and redirect it later at will (with appropriate electronic mechanisms, of course). Although he professes to see or desire no commercial or material gain
for the application and use of said energy once it is harvested, there are no doubt myriad ways we can come to benefit from such things beyond mere research,
such as the reconstruction of torn cartiligenous tissue that a peculiar radiation from an amphibious species on Brachis IV was found to emit.<br>
such as the reconstruction of torn cartilaginous tissue that a peculiar radiation from an amphibious species on Brachis IV was found to emit.<br>
<a href="#Contents">Contents</a>
</body>
@@ -308,39 +314,40 @@
"}
/obj/item/weapon/book/manual/stasis
name = "Cellular suspension, the new Cryogenics?"
name = "Cellular Suspension, the New Cryogenics?"
icon_state = "stasis"
author = "Elvin Schmidt"
title = "Cellular suspension, the new Cryogenics?"
title = "Cellular Suspension, the New Cryogenics?"
dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h1 {font-size: 15px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {list-style: none; margin: 5px; padding: 0px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
body {font-size: 13px; font-family: Verdana;}
</style>
</head>
<body>
<h1><a name="Contents">Contents</a></h1>
<ol>
<li><a href="#Forward">Forward: A replacement for cryosleep?</a></li>
<li><a href="#Foreword">Foreword: A replacement for cryosleep?</a></li>
<li><a href="#Development">The breakthrough</a></li>
<li><a href="#Application">Applying this new principle</a></li>
</ol>
<br>
<h1><a name="Forward">Forward: A replacement for cryosleep?</a></h1>
<h1><a name="Foreword">Foreword: A replacement for cryosleep?</a></h1>
The development of rudimentary cryofreezing in the 20th and 21st centuries was hailed as a crank science by some, but many early visionaries recognised the
potential it had to change the way we approach so many fields, such as medicine, therapeutics and space travel. It was breakthroughs in the field in the 22nd and
later centures that turned the procedure from science fiction to science fact, however. Since then, cryogenics has become a hallmark of modern science, and
potential it had to change the way we approach so many fields, such as medicine, therapeutics, and space travel. It was breakthroughs in the field in the 22nd and
later centuries that turned the procedure from science fiction to science fact, however. Since then, cryogenics has become a hallmark of modern science, and
regarded as one of the great achievements of our era. As with all sciences however, they have their time and are superseded by newer technological miracles when
it is over.<br>
<a href="#Contents">Contents</a>
<h1><a name="Development">The breakthrough</a></h1>
It was in examining the effects of decellerated, blue-space high energy particles when transphased through bluespace that the effects where primarily noticed.
It was in examining the effects of decelerated, bluespace, high energy particles when transphased through bluespace that the effects where primarily noticed.
Due to exigent properties of that dimension, transphasing those particles capable of existing in bluespace with high stability levels has the effect of bringing
some of those effects into realspace. Examining the Hoffman emissions in particular, it was discovered that they exhibited a-entropic behaviour, and in what is
now termed the 'Effete Hoffman Principle,' it was found that metastabilising the Hoffman radiation resulted in the effect being applied across other physical
@@ -352,16 +359,16 @@
effectively identical to cryogenics, and while it consumes vastly more power and requires extremely complex equipment, it's (for all intents and purposes) superior
to cryogenics, all that remains is to 'commercialise' the process by enabling cheaper development and mass production.<br>
The Effete Hoffman Principle can be tweak-combined with other effects however, for different purposes. A division of PMC Research initially developed the application
in prisons as a literal 'suspension field' where convincts are held immobile in the air, and the use quickly spread to numerous other areas.<br>
in prisons as a literal 'suspension field' where convicts are held immobile in the air, and the use quickly spread to numerous other areas.<br>
<br>
By examining the material resonance properties of certain strong waveforms when combined with Hoffman radiation, an effect was produced able to reverse energy
transferral through matter, and to slow the effects of gravity. When combined with energy repulse technology, the triple effects compound themselves into a much
stronger field, although all three componenets do slightly different things. High energy researchers assure me of the following key points:<br>
<ol>
stronger field, although all three components do slightly different things. High energy researchers assure me of the following key points:<br>
<ul>
<li>The energy repulsion factor provides a 'shell' capable of weak suspension.</li>
<li>The Hoffman emissions nullify energy transferral and other kinetic activity, maintaining stability inside the field.</li>
<li>The resonant waveform combines the effects of the above two points, and applies it magnified onto it's synched 'resonance' materials.</li>
</ol>
<li>The resonant waveform combines the effects of the above two points, and applies it magnified onto it's synced 'resonance' materials.</li>
</ul>
As an interesting aside, a carbon waveform was chosen for the field in prison suspension fields, due to it's resonance with organic matter.<br>
<a href="#Contents">Contents</a>

View File

@@ -2,7 +2,7 @@
//changes: rad protection up to 100 from 20/50 respectively
/obj/item/clothing/suit/bio_suit/anomaly
name = "Anomaly suit"
desc = "A sealed bio suit capable of insulating against exotic alien energies"
desc = "A sealed bio suit capable of insulating against exotic alien energies."
icon_state = "engspace_suit"
item_state = "engspace_suit"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)

View File

@@ -1,38 +0,0 @@
// Bluespace crystals, used in telescience and when crushed it will blink you to a random turf.
/obj/item/bluespace_crystal
name = "bluespace crystal"
desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate."
icon = 'icons/obj/telescience.dmi'
icon_state = "bluespace_crystal"
w_class = 2
origin_tech = "bluespace=4;materials=3"
var/blink_range = 8 // The teleport range when crushed/thrown at someone.
/obj/item/bluespace_crystal/New()
..()
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
/obj/item/bluespace_crystal/attack_self(var/mob/user)
blink_mob(user)
user.drop_item()
user.visible_message("<span class='notice'>[user] crushes the [src]!</span>")
del(src)
/obj/item/bluespace_crystal/proc/blink_mob(var/mob/living/L)
do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg')
/obj/item/bluespace_crystal/throw_impact(atom/hit_atom)
..()
if(isliving(hit_atom))
blink_mob(hit_atom)
del(src)
// Artifical bluespace crystal, doesn't give you much research.
/obj/item/bluespace_crystal/artificial
name = "artificial bluespace crystal"
desc = "An artificially made bluespace crystal, it looks delicate."
origin_tech = "bluespace=2"
blink_range = 4 // Not as good as the organic stuff!

View File

@@ -1,70 +0,0 @@
var/list/GPS_list = list()
/obj/item/device/gps
name = "global positioning system"
desc = "Helping lost spacemen find their way through the planets since 2016."
icon = 'icons/obj/telescience.dmi'
icon_state = "gps-c"
w_class = 2.0
flags = FPRINT | TABLEPASS
slot_flags = SLOT_BELT
origin_tech = "programming=2;engineering=2"
var/gpstag = "COM0"
var/emped = 0
/obj/item/device/gps/New()
..()
GPS_list.Add(src)
name = "global positioning system ([gpstag])"
overlays += "working"
/obj/item/device/gps/Del()
GPS_list.Remove(src)
..()
/obj/item/device/gps/emp_act(severity)
emped = 1
overlays -= "working"
overlays += "emp"
spawn(300)
emped = 0
overlays -= "emp"
overlays += "working"
/obj/item/device/gps/attack_self(mob/user as mob)
var/obj/item/device/gps/t = ""
if(emped)
t += "ERROR"
else
t += "<BR><A href='?src=\ref[src];tag=1'>Set Tag</A> "
t += "<BR>Tag: [gpstag]"
for(var/obj/item/device/gps/G in GPS_list)
var/turf/pos = get_turf(G)
var/area/gps_area = get_area(G)
var/tracked_gpstag = G.gpstag
if(G.emped == 1)
t += "<BR>[tracked_gpstag]: ERROR"
else
t += "<BR>[tracked_gpstag]: [format_text(gps_area.name)] ([pos.x], [pos.y], [pos.z])"
var/datum/browser/popup = new(user, "GPS", name, 600, 450)
popup.set_content(t)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
/obj/item/device/gps/Topic(href, href_list)
..()
if(href_list["tag"] )
var/a = input("Please enter desired tag.", name, gpstag) as text
a = uppertext(copytext(sanitize(a), 1, 5))
if(src.loc == usr)
gpstag = a
name = "global positioning system ([gpstag])"
attack_self(usr)
/obj/item/device/gps/science
icon_state = "gps-s"
gpstag = "SCI0"
/obj/item/device/gps/engineering
icon_state = "gps-e"
gpstag = "ENG0"

View File

@@ -1,122 +0,0 @@
///SCI TELEPAD///
/obj/machinery/telepad
name = "telepad"
desc = "A bluespace telepad used for teleporting objects to and from a location."
icon = 'icons/obj/telescience.dmi'
icon_state = "pad-idle"
anchored = 1
use_power = 1
idle_power_usage = 200
active_power_usage = 5000
//CARGO TELEPAD//
/obj/machinery/telepad_cargo
name = "cargo telepad"
desc = "A telepad used by the Rapid Crate Sender."
icon = 'icons/obj/telescience.dmi'
icon_state = "pad-idle"
anchored = 1
use_power = 1
idle_power_usage = 20
active_power_usage = 500
var/stage = 0
/obj/machinery/telepad_cargo/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench))
anchored = 0
playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
anchored = 0
user << "<span class = 'caution'> The [src] can now be moved.</span>"
else if(!anchored)
anchored = 1
user << "<span class = 'caution'> The [src] is now secured.</span>"
if(istype(W, /obj/item/weapon/screwdriver))
if(stage == 0)
playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
user << "<span class = 'caution'> You unscrew the telepad's tracking beacon.</span>"
stage = 1
else if(stage == 1)
playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
user << "<span class = 'caution'> You screw in the telepad's tracking beacon.</span>"
stage = 0
if(istype(W, /obj/item/weapon/weldingtool) && stage == 1)
playsound(src, 'sound/items/Welder.ogg', 50, 1)
user << "<span class = 'caution'> You disassemble the telepad.</span>"
new /obj/item/stack/sheet/metal(get_turf(src))
new /obj/item/stack/sheet/glass(get_turf(src))
del(src)
///TELEPAD CALLER///
/obj/item/device/telepad_beacon
name = "telepad beacon"
desc = "Use to warp in a cargo telepad."
icon = 'icons/obj/radio.dmi'
icon_state = "beacon"
item_state = "signaler"
origin_tech = "bluespace=3"
/obj/item/device/telepad_beacon/attack_self(mob/user as mob)
if(user)
user << "<span class = 'caution'> Locked In</span>"
new /obj/machinery/telepad_cargo(user.loc)
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
del(src)
return
///HANDHELD TELEPAD USER///
/obj/item/weapon/rcs
name = "rapid-crate-sender (RCS)"
desc = "Use this to send crates and closets to cargo telepads."
icon = 'icons/obj/telescience.dmi'
icon_state = "rcs"
flags = FPRINT | TABLEPASS| CONDUCT
force = 10.0
throwforce = 10.0
throw_speed = 1
throw_range = 5
var/rcharges = 10
var/obj/machinery/pad = null
var/last_charge = 30
var/mode = 0
var/rand_x = 0
var/rand_y = 0
var/emagged = 0
var/teleporting = 0
/obj/item/weapon/rcs/New()
..()
processing_objects.Add(src)
/obj/item/weapon/rcs/examine()
desc = "Use this to send crates and closets to cargo telepads. There are [rcharges] charges left."
..()
/obj/item/weapon/rcs/Del()
processing_objects.Remove(src)
..()
/obj/item/weapon/rcs/process()
if(rcharges > 10)
rcharges = 10
if(last_charge == 0)
rcharges++
last_charge = 30
else
last_charge--
/obj/item/weapon/rcs/attack_self(mob/user)
if(emagged)
if(mode == 0)
mode = 1
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
user << "<span class = 'caution'> The telepad locator has become uncalibrated.</span>"
else
mode = 0
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
user << "<span class = 'caution'> You calibrate the telepad locator.</span>"
/obj/item/weapon/rcs/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/card/emag) && emagged == 0)
emagged = 1
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
user << "<span class = 'caution'> You emag the RCS. Click on it to toggle between modes.</span>"
return

View File

@@ -1,312 +0,0 @@
/obj/machinery/computer/telescience
name = "\improper Telepad Control Console"
desc = "Used to teleport objects to and from the telescience telepad."
icon_state = "teleport"
var/sending = 1
var/obj/machinery/telepad/telepad = null
var/temp_msg = "Telescience control console initialized.<BR>Welcome."
// VARIABLES //
var/teles_left // How many teleports left until it becomes uncalibrated
var/datum/projectile_data/last_tele_data = null
var/z_co = 1
var/power_off
var/rotation_off
var/angle_off
var/rotation = 0
var/angle = 45
var/power
// Based on the power used
var/teleport_cooldown = 0
var/list/power_options = list(5, 10, 20, 25, 30, 40, 50, 80, 100) // every index requires a bluespace crystal
var/teleporting = 0
var/starting_crystals = 3
var/list/crystals = list()
/obj/machinery/computer/telescience/New()
..()
link_telepad()
recalibrate()
/obj/machinery/computer/telescience/Del()
eject()
..()
/obj/machinery/computer/telescience/examine()
..()
usr << "There are [crystals.len] bluespace crystals in the crystal ports."
/obj/machinery/computer/telescience/initialize()
..()
link_telepad()
for(var/i = 1; i <= starting_crystals; i++)
crystals += new /obj/item/bluespace_crystal/artificial(null) // starting crystals
power = power_options[1]
/obj/machinery/computer/telescience/proc/link_telepad()
telepad = locate() in range(src, 7)
/obj/machinery/computer/telescience/update_icon()
if(stat & BROKEN)
icon_state = "telescib"
else
if(stat & NOPOWER)
src.icon_state = "teleport0"
stat |= NOPOWER
else
icon_state = initial(icon_state)
stat &= ~NOPOWER
/obj/machinery/computer/telescience/attack_paw(mob/user)
user << "You are too primitive to use this computer."
return
/obj/machinery/computer/telescience/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/bluespace_crystal))
if(crystals.len >= power_options.len)
user << "<span class='warning'>There are not enough crystal ports.</span>"
return
user.drop_item()
crystals += W
W.loc = null
user.visible_message("<span class='notice'>[user] inserts a [W] into the [src]'s crystal port.</span>")
else
..()
/obj/machinery/computer/telescience/attack_ai(mob/user)
src.attack_hand(user)
/obj/machinery/computer/telescience/attack_hand(mob/user)
if(..())
return
interact(user)
/obj/machinery/computer/telescience/interact(mob/user)
user.machine = src
in_use = 1
var/t = "<div class='statusDisplay'>[temp_msg]</div><BR>"
t += "<A href='?src=\ref[src];setrotation=1'>Set Bearing</A>"
t += "<div class='statusDisplay'>[rotation]<5D></div>"
t += "<A href='?src=\ref[src];setangle=1'>Set Elevation</A>"
t += "<div class='statusDisplay'>[angle]<5D></div>"
t += "<span class='linkOn'>Set Power</span>"
t += "<div class='statusDisplay'>"
for(var/i = 1; i <= power_options.len; i++)
if(crystals.len < i)
t += "<span class='linkOff'>[power_options[i]]</span>"
continue
if(power == power_options[i])
t += "<span class='linkOn'>[power_options[i]]</span>"
continue
t += "<A href='?src=\ref[src];setpower=[i]'>[power_options[i]]</A>"
t += "</div>"
t += "<A href='?src=\ref[src];setz=1'>Set Sector</A>"
t += "<div class='statusDisplay'>[z_co ? z_co : "NULL"]</div>"
t += "<BR><A href='?src=\ref[src];send=1'>Send</A>"
t += " <A href='?src=\ref[src];receive=1'>Receive</A>"
t += "<BR><A href='?src=\ref[src];recal=1'>Recalibrate Crystals</A> <A href='?src=\ref[src];eject=1'>Eject Crystals</A>"
// Information about the last teleport
t += "<BR><div class='statusDisplay'>"
if(!last_tele_data)
t += "No teleport data found."
else
t += "Source Location: ([last_tele_data.src_x], [last_tele_data.src_y])<BR>"
//t += "Distance: [round(last_tele_data.distance, 0.1)]m<BR>"
t += "Time: [round(last_tele_data.time, 0.1)] secs<BR>"
t += "</div>"
var/datum/browser/popup = new(user, "telesci", name, 300, 500)
popup.set_content(t)
popup.open()
return
/obj/machinery/computer/telescience/proc/sparks()
if(telepad)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, get_turf(telepad))
s.start()
else
return
/obj/machinery/computer/telescience/proc/telefail()
sparks()
visible_message("<span class='warning'>The telepad weakly fizzles.</span>")
return
/obj/machinery/computer/telescience/proc/doteleport(mob/user)
if(teleport_cooldown > world.time)
temp_msg = "Telepad is recharging power.<BR>Please wait [round((teleport_cooldown - world.time) / 10)] seconds."
return
if(teleporting)
temp_msg = "Telepad is in use.<BR>Please wait."
return
if(telepad)
var/truePower = Clamp(power + power_off, 1, 1000)
var/trueRotation = rotation + rotation_off
var/trueAngle = Clamp(angle + angle_off, 1, 90)
var/datum/projectile_data/proj_data = projectile_trajectory(telepad.x, telepad.y, trueRotation, trueAngle, truePower)
last_tele_data = proj_data
var/trueX = Clamp(round(proj_data.dest_x, 1), 1, world.maxx)
var/trueY = Clamp(round(proj_data.dest_y, 1), 1, world.maxy)
var/spawn_time = round(proj_data.time) * 10
var/turf/target = locate(trueX, trueY, z_co)
var/area/A = get_area(target)
flick("pad-beam", telepad)
if(spawn_time > 15) // 1.5 seconds
playsound(telepad.loc, 'sound/weapons/flash.ogg', 25, 1)
// Wait depending on the time the projectile took to get there
teleporting = 1
temp_msg = "Powering up bluespace crystals.<BR>Please wait."
spawn(round(proj_data.time) * 10) // in seconds
if(!telepad)
return
if(telepad.stat & NOPOWER)
return
teleporting = 0
teleport_cooldown = world.time + (power * 2)
teles_left -= 1
// use a lot of power
use_power(power * 10)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, get_turf(telepad))
s.start()
temp_msg = "Teleport successful.<BR>"
if(teles_left < 10)
temp_msg += "<BR>Calibration required soon."
else
temp_msg += "Data printed below."
investigate_log("[key_name(usr)]/[user] has teleported with Telescience at [trueX],[trueY],[z_co], in [A ? A.name : "null area"].","telesci")
var/sparks = get_turf(target)
var/datum/effect/effect/system/spark_spread/y = new /datum/effect/effect/system/spark_spread
y.set_up(5, 1, sparks)
y.start()
var/turf/source = target
var/turf/dest = get_turf(telepad)
if(sending)
source = dest
dest = target
flick("pad-beam", telepad)
playsound(telepad.loc, 'sound/weapons/emitter2.ogg', 25, 1)
for(var/atom/movable/ROI in source)
// if is anchored, don't let through
if(ROI.anchored)
if(isliving(ROI))
var/mob/living/L = ROI
if(L.buckled)
// TP people on office chairs
if(L.buckled.anchored)
continue
else
continue
else if(!isobserver(ROI))
continue
do_teleport(ROI, dest)
updateDialog()
/obj/machinery/computer/telescience/proc/teleport(mob/user)
if(rotation == null || angle == null || z_co == null)
temp_msg = "ERROR!<BR>Set a angle, rotation and sector."
return
if(power <= 0)
telefail()
temp_msg = "ERROR!<BR>No power selected!"
return
if(angle < 1 || angle > 90)
telefail()
temp_msg = "ERROR!<BR>Elevation is less than 1 or greater than 90."
return
if(z_co == 2 || z_co < 1 || z_co > 6)
telefail()
temp_msg = "ERROR! Sector is less than 1, <BR>greater than 6, or equal to 2."
return
if(teles_left > 0)
doteleport(user)
else
telefail()
temp_msg = "ERROR!<BR>Calibration required."
return
return
/obj/machinery/computer/telescience/proc/eject()
for(var/obj/item/I in crystals)
I.loc = src.loc
crystals -= I
power = 0
/obj/machinery/computer/telescience/Topic(href, href_list)
if(..())
return
if(href_list["setrotation"])
var/new_rot = input("Please input desired bearing in degrees.", name, rotation) as num
if(..()) // Check after we input a value, as they could've moved after they entered something
return
rotation = Clamp(new_rot, -900, 900)
rotation = round(rotation, 0.01)
if(href_list["setangle"])
var/new_angle = input("Please input desired elevation in degrees.", name, angle) as num
if(..())
return
angle = Clamp(round(new_angle, 0.1), 1, 9999)
if(href_list["setpower"])
var/index = href_list["setpower"]
index = text2num(index)
if(index != null && power_options[index])
if(crystals.len >= index)
power = power_options[index]
if(href_list["setz"])
var/new_z = input("Please input desired sector.", name, z_co) as num
if(..())
return
z_co = Clamp(round(new_z), 1, 10)
if(href_list["send"])
sending = 1
teleport(usr)
if(href_list["receive"])
sending = 0
teleport(usr)
if(href_list["recal"])
recalibrate()
sparks()
temp_msg = "NOTICE:<BR>Calibration successful."
if(href_list["eject"])
eject()
temp_msg = "NOTICE:<BR>Bluespace crystals ejected."
updateDialog()
return 1
/obj/machinery/computer/telescience/proc/recalibrate()
teles_left = rand(30, 40)
angle_off = rand(-25, 25)
power_off = rand(-4, 0)
rotation_off = rand(-10, 10)