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

@@ -1263,10 +1263,6 @@
#include "code\modules\surgery\ribcage.dm"
#include "code\modules\surgery\robolimbs.dm"
#include "code\modules\surgery\surgery.dm"
#include "code\modules\telesci\bscrystal.dm"
#include "code\modules\telesci\gps.dm"
#include "code\modules\telesci\telepad.dm"
#include "code\modules\telesci\telesci_computer.dm"
#include "code\modules\virus2\analyser.dm"
#include "code\modules\virus2\antibodies.dm"
#include "code\modules\virus2\centrifuge.dm"

View File

@@ -104,7 +104,7 @@
var/datum/gas_mixture/environment = loc.return_air()
if(scrubbing)
if((environment.toxins>0) || (environment.carbon_dioxide>0) || (environment.trace_gases.len>0))
if((environment.toxins>0.001) || (environment.carbon_dioxide>0.001) || (environment.trace_gases.len>0))
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles()
//Take a gas sample

View File

@@ -54,8 +54,6 @@ datum/pipe_network
for(var/datum/pipeline/line_member in giver.line_members)
line_member.network = src
del(giver)
update_network_gases()
return 1

View File

@@ -53,6 +53,13 @@
H:updatehealth()
return ..()
/turf/proc/hasbelow()
var/turf/controllerlocation = locate(1, 1, z)
for(var/obj/effect/landmark/zcontroller/controller in controllerlocation)
if(controller.down)
return 1
return 0
/turf/simulated/floor/open/proc/getbelow()
var/turf/controllerlocation = locate(1, 1, z)
for(var/obj/effect/landmark/zcontroller/controller in controllerlocation)
@@ -73,7 +80,7 @@
//overwrite the attackby of space to transform it to openspace if necessary
/turf/space/attackby(obj/item/C as obj, mob/user as mob)
if (istype(C, /obj/item/weapon/cable_coil))
if (istype(C, /obj/item/weapon/cable_coil) && src.hasbelow())
var/turf/simulated/floor/open/W = src.ChangeTurf(/turf/simulated/floor/open)
W.attackby(C, user)
return

View File

@@ -8,7 +8,7 @@
/obj/structure/filingcabinet/attackby(obj/item/weapon/paper/P,mob/M)
if(istype(P))
M << "You put the [P] in the [src]."
M << "You put \the [P] in the [src]."
M.drop_item()
P.loc = src
else

View File

@@ -173,7 +173,6 @@
if(connections) connections.update_all()
/turf/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
del(giver)
return 0
/turf/return_air()

View File

@@ -5,7 +5,7 @@
//BIG NOTE: Don't add living things to crates, that's bad, it will break the shuttle.
//NEW NOTE: Do NOT set the price of any crates below 7 points. Doing so allows infinite points.
var/list/all_supply_groups = list("Operations","Security","Hospitality","Engineering","Medical / Science","Hydroponics")
var/list/all_supply_groups = list("Operations","Security","Hospitality","Engineering","Medical / Science","Hydroponics", "Supply", "Miscellaneous")
/datum/supply_packs
var/name = null
@@ -44,7 +44,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
hidden = 1
/datum/supply_packs/food
name = "Food crate"
name = "Kitchen supply crate"
contains = list(/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
@@ -61,7 +61,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
cost = 10
containertype = /obj/structure/closet/crate/freezer
containername = "Food crate"
group = "Hospitality"
group = "Supply"
/datum/supply_packs/monkey
name = "Monkey crate"
@@ -113,7 +113,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Security"
/datum/supply_packs/toner
name = "Toner Cartridges"
name = "Toner cartridges"
contains = list(/obj/item/device/toner,
/obj/item/device/toner,
/obj/item/device/toner,
@@ -122,8 +122,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/device/toner)
cost = 10
containertype = /obj/structure/closet/crate
containername = "Toner Cartridges"
group = "Operations"
containername = "Toner cartridges"
group = "Supply"
/datum/supply_packs/party
name = "Party equipment"
@@ -176,7 +176,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/clothing/mask/gas)
cost = 35
containertype = /obj/structure/closet/crate/internals
containername = "Emergency Crate"
containername = "Emergency crate"
group = "Engineering"
/datum/supply_packs/evacuation
@@ -208,7 +208,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
cost = 10
containertype = /obj/structure/closet/crate
containername = "Janitorial supplies"
group = "Operations"
group = "Supply"
/datum/supply_packs/lightbulbs
name = "Replacement lights"
@@ -229,7 +229,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
cost = 20
containertype = /obj/structure/closet/crate
containername = "Wizard costume crate"
group = "Operations"
group = "Miscellaneous"
/datum/supply_packs/mule
name = "MULEbot Crate"
@@ -266,38 +266,39 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
//farm animals - useless and annoying, but potentially a good source of food
/datum/supply_packs/cow
name = "Cow Crate"
name = "Cow crate"
cost = 30
containertype = /obj/structure/largecrate/cow
containername = "Cow Crate"
containername = "Cow crate"
access = access_hydroponics
group = "Hydroponics"
/datum/supply_packs/goat
name = "Goat Crate"
name = "Goat crate"
cost = 25
containertype = /obj/structure/largecrate/goat
containername = "Goat Crate"
containername = "Goat crate"
access = access_hydroponics
group = "Hydroponics"
/datum/supply_packs/chicken
name = "Chicken Crate"
name = "Chicken crate"
cost = 20
containertype = /obj/structure/largecrate/chick
containername = "Chicken Crate"
containername = "Chicken crate"
access = access_hydroponics
group = "Hydroponics"
/datum/supply_packs/lisa
name = "Corgi Crate"
name = "Corgi crate"
contains = list()
cost = 50
containertype = /obj/structure/largecrate/lisa
containername = "Corgi Crate"
containername = "Corgi crate"
group = "Hydroponics"
/datum/supply_packs/seeds
name = "Seeds Crate"
name = "Seeds crate"
contains = list(/obj/item/seeds/chiliseed,
/obj/item/seeds/berryseed,
/obj/item/seeds/cornseed,
@@ -322,7 +323,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Hydroponics"
/datum/supply_packs/weedcontrol
name = "Weed Control Crate"
name = "Weed control crate"
contains = list(/obj/item/weapon/scythe,
/obj/item/clothing/mask/gas,
/obj/item/weapon/grenade/chem_grenade/antiweed,
@@ -334,7 +335,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Hydroponics"
/datum/supply_packs/exoticseeds
name = "Exotic Seeds Crate"
name = "Exotic seeds crate"
contains = list(/obj/item/seeds/nettleseed,
/obj/item/seeds/replicapod,
/obj/item/seeds/replicapod,
@@ -373,7 +374,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Medical / Science"
/datum/supply_packs/virus
name = "Virus crate"
name = "Virus sample crate"
/* contains = list(/obj/item/weapon/reagent_containers/glass/bottle/flu_virion,
/obj/item/weapon/reagent_containers/glass/bottle/cold,
/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion,
@@ -392,12 +393,12 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/virusdish/random)
cost = 25
containertype = "/obj/structure/closet/crate/secure"
containername = "Virus crate"
containername = "Virus sample crate"
access = access_cmo
group = "Medical / Science"
/datum/supply_packs/metal50
name = "50 Metal Sheets"
name = "50 metal sheets"
contains = list(/obj/item/stack/sheet/metal)
amount = 50
cost = 10
@@ -406,7 +407,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Engineering"
/datum/supply_packs/glass50
name = "50 Glass Sheets"
name = "50 glass sheets"
contains = list(/obj/item/stack/sheet/glass)
amount = 50
cost = 10
@@ -415,7 +416,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Engineering"
/datum/supply_packs/wood50
name = "50 Wooden Planks"
name = "50 wooden planks"
contains = list(/obj/item/stack/sheet/wood)
amount = 50
cost = 10
@@ -506,7 +507,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/paper/solar)
cost = 20
containertype = /obj/structure/closet/crate
containername = "solar pack crate"
containername = "Solar pack crate"
group = "Engineering"
/datum/supply_packs/engine
@@ -582,7 +583,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/robotics
name = "Robotics Assembly Crate"
name = "Robotics assembly crate"
contains = list(/obj/item/device/assembly/prox_sensor,
/obj/item/device/assembly/prox_sensor,
/obj/item/device/assembly/prox_sensor,
@@ -595,7 +596,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/cell/high)
cost = 10
containertype = /obj/structure/closet/crate/secure/gear
containername = "Robotics Assembly"
containername = "Robotics assembly"
access = access_robotics
group = "Engineering"
@@ -764,14 +765,14 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Security"
/datum/supply_packs/securitybarriers
name = "Security Barriers"
name = "Security barrier crate"
contains = list(/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier,
/obj/machinery/deployable/barrier)
cost = 20
containertype = /obj/structure/closet/crate/secure/gear
containername = "Security Barriers crate"
containername = "Security barrier crate"
group = "Security"
/datum/supply_packs/securitybarriers
@@ -812,7 +813,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
cost = 200
containertype = /obj/structure/closet/crate
containername = "Collectable hats crate! Brought to you by Bass.inc!"
group = "Operations"
group = "Miscellaneous"
/datum/supply_packs/randomised/New()
manifest += "Contains any [num_contained] of:"
@@ -858,7 +859,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Operations"
/datum/supply_packs/boxes
name = "Empty Box supplies"
name = "Empty boxes"
contains = list(/obj/item/weapon/storage/box,
/obj/item/weapon/storage/box,
/obj/item/weapon/storage/box,
@@ -871,8 +872,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/storage/box)
cost = 10
containertype = "/obj/structure/closet/crate"
containername = "Empty Box crate"
group = "Operations"
containername = "Empty box crate"
group = "Supply"
/datum/supply_packs/surgery
name = "Surgery crate"
@@ -910,7 +911,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/pizzabox/mushroom,
/obj/item/pizzabox/meat,
/obj/item/pizzabox/vegetable)
name = "Surprise pack of five dozen pizzas"
name = "Surprise pack of five pizzas"
cost = 15
containertype = /obj/structure/closet/crate/freezer
containername = "Pizza crate"
@@ -950,7 +951,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containertype = /obj/structure/closet/crate/secure
containername = "Actor Costumes"
access = access_theatre
group = "Operations"
group = "Miscellaneous"
/datum/supply_packs/formal_wear
contains = list(/obj/item/clothing/head/bowler,
@@ -971,7 +972,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
cost = 30
containertype = /obj/structure/closet
containername = "Formalwear for the best occasions."
group = "Operations"
group = "Miscellaneous"
/datum/supply_packs/rust_injector
contains = list(/obj/machinery/power/rust_fuel_injector)
@@ -1052,7 +1053,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
cost = 10
containertype = /obj/structure/closet/crate
containername = "EFTPOS crate"
group = "Operations"
group = "Miscellaneous"
/datum/supply_packs/teg
contains = list(/obj/machinery/power/generator)
@@ -1091,7 +1092,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
access = access_atmospherics
/datum/supply_packs/bee_keeper
name = "Beekeeping Crate"
name = "Beekeeping crate"
contains = list(/obj/item/beezeez,
/obj/item/weapon/bee_net,
/obj/item/apiary,

View File

@@ -1167,7 +1167,7 @@
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || (istype(W, /obj/item/weapon/twohanded/fireaxe) && W:wielded) || istype(W, /obj/item/weapon/melee/energy))
user.show_message("<span class='notice'>You make planks out of the [src]!</span>", 1)
user.show_message("<span class='notice'>You make planks out of \the [src]!</span>", 1)
for(var/i=0,i<2,i++)
var/obj/item/stack/sheet/wood/NG = new (user.loc)
for (var/obj/item/stack/sheet/wood/G in user.loc)

View File

@@ -1382,10 +1382,6 @@ var/list/ghostteleportlocs = list()
name = "\improper Miscellaneous Research"
icon_state = "toxmisc"
/area/toxins/telesci
name = "\improper Telescience Lab"
icon_state = "toxmisc"
/area/toxins/server
name = "\improper Server Room"
icon_state = "server"

View File

@@ -44,7 +44,6 @@
/atom/proc/assume_air(datum/gas_mixture/giver)
del(giver)
return null
/atom/proc/remove_air(amount)

View File

@@ -57,7 +57,7 @@
return
if(changeling.geneticdamage > max_genetic_damage)
src << "<span class='warning'>Our geneomes are still reassembling. We need time to recover first.</span>"
src << "<span class='warning'>Our genomes are still reassembling. We need time to recover first.</span>"
return
return changeling

View File

@@ -119,11 +119,11 @@ var/list/datum/power/changeling/powerinstances = list()
genomecost = 10
verbpath = /mob/proc/changeling_DEATHsting
/datum/power/changeling/unfat_sting
name = "Unfat Sting"
desc = "We silently sting a human, forcing them to rapidly metobolize their fat."
genomecost = 1
verbpath = /mob/proc/changeling_unfat_sting
///datum/power/changeling/unfat_sting
// name = "Unfat Sting"
// desc = "We silently sting a human, forcing them to rapidly metabolize their fat."
// genomecost = 1
// verbpath = /mob/proc/changeling_unfat_sting
/datum/power/changeling/boost_range
name = "Boost Range"

View File

@@ -811,7 +811,7 @@ var/list/sacrificed = list()
if (cultist == user) //just to be sure.
return
if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
user << "\red You cannot summon the [cultist], for his shackles of blood are strong"
user << "\red You cannot summon \the [cultist], for his shackles of blood are strong."
return fizzle()
cultist.loc = src.loc
cultist.lying = 1

View File

@@ -262,9 +262,42 @@ var/global/list/autolathe_recipes_hidden = list( \
if (!busy)
if(href_list["make"])
var/turf/T = get_step(src.loc, get_dir(src,usr))
var/obj/template = locate(href_list["make"])
// critical exploit fix start -walter0o
var/obj/item/template = null
var/attempting_to_build = locate(href_list["make"])
if(!attempting_to_build)
return
if(locate(attempting_to_build, src.L) || locate(attempting_to_build, src.LL)) // see if the requested object is in one of the construction lists, if so, it is legit -walter0o
template = attempting_to_build
else // somebody is trying to exploit, alert admins -walter0o
var/turf/LOC = get_turf(usr)
message_admins("[key_name_admin(usr)] tried to exploit an autolathe to duplicate <a href='?_src_=vars;Vars=\ref[attempting_to_build]'>[attempting_to_build]</a> ! ([LOC ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[LOC.x];Y=[LOC.y];Z=[LOC.z]'>JMP</a>" : "null"])", 0)
log_admin("EXPLOIT : [key_name(usr)] tried to exploit an autolathe to duplicate [attempting_to_build] !")
return
// now check for legit multiplier, also only stacks should pass with one to prevent raw-materials-manipulation -walter0o
var/multiplier = text2num(href_list["multiplier"])
if (!multiplier) multiplier = 1
var/max_multiplier = 1
if(istype(template, /obj/item/stack)) // stacks are the only items which can have a multiplier higher than 1 -walter0o
var/obj/item/stack/S = template
max_multiplier = min(S.max_amount, S.m_amt?round(m_amount/S.m_amt):INFINITY, S.g_amt?round(g_amount/S.g_amt):INFINITY) // pasta from regular_win() to make sure the numbers match -walter0o
if( (multiplier > max_multiplier) || (multiplier <= 0) ) // somebody is trying to exploit, alert admins-walter0o
var/turf/LOC = get_turf(usr)
message_admins("[key_name_admin(usr)] tried to exploit an autolathe with multiplier set to <u>[multiplier]</u> on <u>[template]</u> ! ([LOC ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[LOC.x];Y=[LOC.y];Z=[LOC.z]'>JMP</a>" : "null"])" , 0)
log_admin("EXPLOIT : [key_name(usr)] tried to exploit an autolathe with multiplier set to [multiplier] on [template] !")
return
var/power = max(2000, (template.m_amt+template.g_amt)*multiplier/5)
if(src.m_amount >= template.m_amt*multiplier && src.g_amount >= template.g_amt*multiplier)
busy = 1

View File

@@ -102,18 +102,19 @@
h1 {font-size: 18px; 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>
<h3>Raising Bees</h3>
<h1>Raising Bees</h1>
Bees are loving but fickle creatures. Don't mess with their hive and stay away from any clusters of them, and you'll avoid their ire.
Sometimes, you'll need to dig around in there for those delicious sweeties though - in that case make sure you wear sealed protection gear
and carry an extinguisher or smoker with you - any bees chasing you, once calmed down, can thusly be netted and returned safely to the hive.<br.
<br>
Beezeez is a cure-all panacea for them, but use it too much and the hive may grow to apocalyptic proportions. Other than that, bees are excellent pets
BeezEez is a cure-all panacea for them, but use it too much and the hive may grow to apocalyptic proportions. Other than that, bees are excellent pets
for all the family and are excellent caretakers of one's garden: having a hive or two around will aid in the longevity and growth rate of plants,
and aid them in fighting off poisons and disease.

View File

@@ -315,7 +315,7 @@
if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve
return
for(var/mob/M in range(3,src))
M.show_message("\b ERROR. Recalibrating projetion apparatus.")
M.show_message("\b ERROR. Recalibrating projection apparatus.")
last_change = world.time
return
@@ -448,6 +448,8 @@
if(isrobot(user))
return
..()
/obj/structure/table/holotable/wood
name = "table"
desc = "A square piece of wood standing on four wooden legs. It can not move."
@@ -489,7 +491,7 @@
damtype = HALLOSS
/obj/item/weapon/holo/esword
desc = "May the force be within you. Sorta"
desc = "May the force be within you. Sorta."
icon_state = "sword0"
force = 3.0
throw_speed = 1
@@ -607,11 +609,11 @@
power_channel = ENVIRON
/obj/machinery/readybutton/attack_ai(mob/user as mob)
user << "The station AI is not to interact with these devices"
user << "The station AI is not to interact with these devices!"
return
/obj/machinery/readybutton/attack_paw(mob/user as mob)
user << "You are too primitive to use this device"
user << "You are too primitive to use this device."
return
/obj/machinery/readybutton/New()

View File

@@ -180,7 +180,7 @@
/obj/machinery/computer/security/telescreen/entertainment
name = "entertainment monitor"
desc = "Damn, they better have /tg/thechannel on these things."
desc = "Damn, why do they never have anything interesting on these things?"
icon = 'icons/obj/status_display.dmi'
icon_state = "entertainment"

View File

@@ -255,7 +255,7 @@
if (authenticated)
var/t1 = href_list["assign_target"]
if(t1 == "Custom")
var/temp_t = copytext(sanitize(input("Enter a custom job assignment.","Assignment")),1,MAX_MESSAGE_LEN)
var/temp_t = copytext(sanitize(input("Enter a custom job assignment.","Assignment")),1,45)
//let custom jobs function as an impromptu alt title, mainly for sechuds
if(temp_t && modify)
modify.assignment = temp_t

View File

@@ -68,11 +68,11 @@ for reference:
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/stack/sheet/wood))
if (src.health < src.maxhealth)
visible_message("\red [user] begins to repair the [src]!")
visible_message("\red [user] begins to repair \the [src]!")
if(do_after(user,20))
src.health = src.maxhealth
W:use(1)
visible_message("\red [user] repairs the [src]!")
visible_message("\red [user] repairs \the [src]!")
return
else
return
@@ -181,7 +181,7 @@ for reference:
if (src.emagged == 0)
src.emagged = 1
src.req_access = null
user << "You break the ID authentication lock on the [src]."
user << "You break the ID authentication lock on \the [src]."
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
@@ -189,7 +189,7 @@ for reference:
return
else if (src.emagged == 1)
src.emagged = 2
user << "You short out the anchoring mechanism on the [src]."
user << "You short out the anchoring mechanism on \the [src]."
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, src)
s.start()
@@ -200,12 +200,12 @@ for reference:
src.health = src.maxhealth
src.emagged = 0
src.req_access = list(access_security)
visible_message("\red [user] repairs the [src]!")
visible_message("\red [user] repairs \the [src]!")
return
else if (src.emagged > 0)
src.emagged = 0
src.req_access = list(access_security)
visible_message("\red [user] repairs the [src]!")
visible_message("\red [user] repairs \the [src]!")
return
return
else

View File

@@ -783,6 +783,15 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
del(src)
return
/obj/machinery/hydroponics/attack_tk(mob/user as mob)
if(harvest)
myseed.harvest(src)
else if(dead)
planted = 0
dead = 0
usr << text("You remove the dead plant from the [src].")
del(myseed)
updateicon()
/obj/machinery/hydroponics/attack_hand(mob/user as mob)
if(istype(usr,/mob/living/silicon)) //How does AI know what plant is?

View File

@@ -8,7 +8,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
/obj/machinery/requests_console
name = "Requests Console"
desc = "A console intended to send requests to diferent departments on the station."
desc = "A console intended to send requests to different departments on the station."
anchored = 1
icon = 'icons/obj/terminals.dmi'
icon_state = "req_comp0"

View File

@@ -48,7 +48,7 @@
if (src.health <= 0)
visible_message("\blue The [src] dissapates")
visible_message("\blue The [src] dissipates!")
del(src)
return
@@ -61,7 +61,7 @@
src.health -= max_health*0.75 //3/4 health as damage
if(src.health <= 0)
visible_message("\blue The [src] dissapates")
visible_message("\blue The [src] dissipates!")
del(src)
return
@@ -73,7 +73,7 @@
health -= Proj.damage
..()
if(health <=0)
visible_message("\blue The [src] dissapates")
visible_message("\blue The [src] dissipates!")
del(src)
return
opacity = 1
@@ -122,7 +122,7 @@
//Handle the destruction of the shield
if (src.health <= 0)
visible_message("\blue The [src] dissapates")
visible_message("\blue The [src] dissipates!")
del(src)
return
@@ -500,7 +500,7 @@
else
src.add_fingerprint(user)
visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!")
visible_message("\red The [src.name] has been hit with \the [W.name] by [user.name]!")
/obj/machinery/shieldwallgen/proc/cleanup(var/NSEW)
var/obj/machinery/shieldwall/F

View File

@@ -648,7 +648,7 @@
/obj/machinery/vending/snack
name = "Getmore Chocolate Corp"
desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars"
desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars."
product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
icon_state = "snack"
@@ -681,7 +681,7 @@
//This one's from bay12
/obj/machinery/vending/cart
name = "PTech"
desc = "Cartridges for PDAs"
desc = "Cartridges for PDAs."
product_slogans = "Carts to go!"
icon_state = "cart"
icon_deny = "cart-deny"
@@ -692,7 +692,7 @@
/obj/machinery/vending/cigarette
name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating
desc = "If you want to get cancer, might as well do it in style"
desc = "If you want to get cancer, might as well do it in style!"
product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs."
vend_delay = 34
@@ -750,7 +750,7 @@
/obj/machinery/vending/security
name = "SecTech"
desc = "A security equipment vendor"
desc = "A security equipment vendor."
product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?"
icon_state = "sec"
icon_deny = "sec-deny"
@@ -761,7 +761,7 @@
/obj/machinery/vending/hydronutrients
name = "NutriMax"
desc = "A plant nutrients vendor"
desc = "A plant nutrients vendor."
product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!"
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
icon_state = "nutri"
@@ -779,7 +779,7 @@
products = list(/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/chantermycelium = 3,/obj/item/seeds/chiliseed = 3,
/obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/replicapod = 3,/obj/item/seeds/soyaseed = 3,
/obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3,
/obj/item/seeds/poppyseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/limeseed = 3,
/obj/item/seeds/poppyseed = 3,/obj/item/seeds/sugarcaneseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/limeseed = 3,
/obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3,/obj/item/seeds/plumpmycelium = 2,
/obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3)
contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/mtearseed = 2,
@@ -800,7 +800,7 @@
/obj/machinery/vending/dinnerware
name = "Dinnerware"
desc = "A kitchen and restaurant equipment vendor"
desc = "A kitchen and restaurant equipment vendor."
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2)
@@ -808,7 +808,7 @@
/obj/machinery/vending/sovietsoda
name = "BODA"
desc = "Old sweet water vending machine"
desc = "An old sweet water vending machine,how did this end up here?"
icon_state = "sovietsoda"
product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
products = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda = 30)

View File

@@ -628,7 +628,7 @@
/obj/mecha/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
src.log_message("Attacked by [W]. Attacker - [user]")
if(prob(src.deflect_chance))
user << "\red The [W] bounces off [src.name] armor."
user << "\red \The [W] bounces off [src.name]."
src.log_append_to_last("Armor saved.")
/*
for (var/mob/V in viewers(src))

View File

@@ -15,7 +15,7 @@
/obj/structure/closet/walllocker/emerglocker
name = "emergency locker"
desc = "A wall mounted locker with emergency supplies"
desc = "A wall mounted locker with emergency supplies."
var/list/spawnitems = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath)
var/amount = 2 // spawns each items X times.
icon_state = "emerg"

View File

@@ -237,6 +237,18 @@
/obj/item/proc/equipped(var/mob/user, var/slot)
return
//returns 1 if the item is equipped by a mob, 0 otherwise.
//This might need some error trapping, not sure if get_equipped_items() is safe for non-human mobs.
/obj/item/proc/is_equipped()
if(!ismob(loc))
return 0
var/mob/M = loc
if(src in M.get_equipped_items())
return 1
else
return 0
//the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't.
//If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen.
//Set disable_warning to 1 if you wish it to not give you outputs.

View File

@@ -11,7 +11,7 @@
/obj/item/stack/tile/grass
name = "grass tile"
singular_name = "grass floor tile"
desc = "A patch of grass like they often use on golf courses"
desc = "A patch of grass like they often use on golf courses."
icon_state = "tile_grass"
w_class = 3.0
force = 1.0
@@ -28,7 +28,7 @@
/obj/item/stack/tile/wood
name = "wood floor tile"
singular_name = "wood floor tile"
desc = "an easy to fit wood floor tile"
desc = "An easy to fit wooden floor tile."
icon_state = "tile-wood"
w_class = 3.0
force = 1.0
@@ -44,7 +44,7 @@
/obj/item/stack/tile/carpet
name = "carpet"
singular_name = "carpet"
desc = "A piece of carpet. It is the same size as a floor tile"
desc = "A piece of carpet. It is the same size as a normal floor tile!"
icon_state = "tile-carpet"
w_class = 3.0
force = 1.0

View File

@@ -167,7 +167,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM
location.hotspot_expose(700, 5)
if(reagents && reagents.total_volume) // check if it has any reagents at all
if(iscarbon(loc) && (src == loc:wear_mask)) // if it's in the human/monkey mouth, transfer reagents to the mob
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
if(H.species.flags & IS_SYNTHETIC)
return
var/mob/living/carbon/C = loc
if(prob(15)) // so it's not an instarape in case of acid
reagents.reaction(C, INGEST)
reagents.trans_to(C, REAGENTS_METABOLISM)
@@ -201,9 +206,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/cigar
name = "premium cigar"
desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!"
icon_state = "cigaroff"
icon_on = "cigaron"
icon_off = "cigaroff"
icon_state = "cigar2off"
icon_on = "cigar2on"
icon_off = "cigar2off"
type_butt = /obj/item/weapon/cigbutt/cigarbutt
throw_speed = 0.5
item_state = "cigaroff"
@@ -219,7 +224,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/cigar/havana
name = "premium Havanian cigar"
desc = "A cigar fit for only the best for the best."
desc = "A cigar fit for only the best of the best."
icon_state = "cigar2off"
icon_on = "cigar2on"
icon_off = "cigar2off"
@@ -247,10 +252,33 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/cigar/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/match))
..()
else
user << "<span class='notice'>\The [src] straight out REFUSES to be lit by such uncivilized means.</span>"
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn())
light("<span class='notice'>[user] insults [name] by lighting it with [W].</span>")
else if(istype(W, /obj/item/weapon/lighter/zippo))
var/obj/item/weapon/lighter/zippo/Z = W
if(Z.lit)
light("<span class='rose'>With a flick of their wrist, [user] lights their [name] with their [W].</span>")
else if(istype(W, /obj/item/weapon/lighter))
var/obj/item/weapon/lighter/L = W
if(L.lit)
light("<span class='notice'>[user] manages to offend their [name] by lighting it with [W].</span>")
else if(istype(W, /obj/item/weapon/match))
var/obj/item/weapon/match/M = W
if(M.lit)
light("<span class='notice'>[user] lights their [name] with their [W].</span>")
else if(istype(W, /obj/item/weapon/melee/energy/sword))
var/obj/item/weapon/melee/energy/sword/S = W
if(S.active)
light("<span class='warning'>[user] swings their [W], barely missing their nose. They light their [name] in the process.</span>")
else if(istype(W, /obj/item/device/assembly/igniter))
light("<span class='notice'>[user] fiddles with [W], and manages to light their [name] with the power of science.</span>")
/////////////////
//SMOKING PIPES//
@@ -306,10 +334,28 @@ CIGARETTE PACKETS ARE IN FANCY.DM
return
/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/match))
..()
else
user << "<span class='notice'>\The [src] straight out REFUSES to be lit by such means.</span>"
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn())//
light("<span class='notice'>[user] recklessly lights [name] with [W].</span>")
else if(istype(W, /obj/item/weapon/lighter/zippo))
var/obj/item/weapon/lighter/zippo/Z = W
if(Z.lit)
light("<span class='rose'>With much care, [user] lights their [name] with their [W].</span>")
else if(istype(W, /obj/item/weapon/lighter))
var/obj/item/weapon/lighter/L = W
if(L.lit)
light("<span class='notice'>[user] manages to light their [name] with [W].</span>")
else if(istype(W, /obj/item/weapon/match))
var/obj/item/weapon/match/M = W
if(M.lit)
light("<span class='notice'>[user] lights their [name] with their [W].</span>")
else if(istype(W, /obj/item/device/assembly/igniter))
light("<span class='notice'>[user] fiddles with [W], and manages to light their [name] with the power of science.</span>")
/obj/item/clothing/mask/cigarette/pipe/cobpipe
name = "corn cob pipe"

File diff suppressed because it is too large Load Diff

View File

@@ -10,12 +10,7 @@
/obj/item/weapon/storage/belt/proc/can_use()
if(!ismob(loc)) return 0
var/mob/M = loc
if(src in M.get_equipped_items())
return 1
else
return 0
return is_equipped()
/obj/item/weapon/storage/belt/MouseDrop(obj/over_object as obj, src_location, over_location)

View File

@@ -261,7 +261,7 @@
if(!prevent_warning && !istype(W, /obj/item/weapon/gun/energy/crossbow))
for(var/mob/M in viewers(usr, null))
if (M == usr)
usr << "<span class='notice'>You put the [W] into [src].</span>"
usr << "<span class='notice'>You put \the [W] into [src].</span>"
else if (M in range(1)) //If someone is standing close enough, they can tell what it is...
M.show_message("<span class='notice'>[usr] puts [W] into [src].</span>")
else if (W && W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance...
@@ -449,6 +449,10 @@
del(src)
//BubbleWrap END
/obj/item/weapon/storage/hear_talk(mob/M as mob, text)
for (var/atom/A in src)
if(istype(A,/obj/))
var/obj/O = A
O.hear_talk(M, text)

View File

@@ -16,7 +16,7 @@
*/
/obj/item/weapon/wrench
name = "wrench"
desc = "A wrench with common uses. Can be found in your hand."
desc = "A wrench with many common uses. Can be usually found in your hand."
icon = 'icons/obj/items.dmi'
icon_state = "wrench"
flags = FPRINT | TABLEPASS| CONDUCT
@@ -357,6 +357,8 @@
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
var/datum/organ/internal/eyes/E = H.internal_organs["eyes"]
if(H.species.flags & IS_SYNTHETIC)
return
switch(safety)
if(1)
usr << "\red Your eyes sting a little."
@@ -428,7 +430,7 @@
/obj/item/weapon/crowbar
name = "crowbar"
desc = "Used to hit floors"
desc = "Used to remove floors and to pry open doors."
icon = 'icons/obj/items.dmi'
icon_state = "crowbar"
flags = FPRINT | TABLEPASS| CONDUCT

View File

@@ -46,7 +46,7 @@
icon_state = "atmos"
item_to_spawn()
return pick(prob(5);/obj/item/device/t_scanner,\
prob(2);/obj/item/device/radio/intercom,\
prob(2);/obj/item/device/radio,\
prob(5);/obj/item/device/analyzer)
@@ -71,7 +71,8 @@
item_to_spawn()
return pick(/obj/item/device/assembly/igniter,\
/obj/item/device/assembly/prox_sensor,\
/obj/item/device/assembly/signaler)
/obj/item/device/assembly/signaler,\
/obj/item/device/multitool)
/obj/random/toolbox

View File

@@ -217,8 +217,12 @@
O.emp_act(severity)
..()
/*
/obj/item/clothing/suit/hear_talk(mob/M, var/msg)
for (var/atom/A in src)
if(istype(A,/obj/))
var/obj/O = A
O.hear_talk(M, msg)
*/

View File

@@ -285,3 +285,9 @@
overlays += "welded"
else
icon_state = icon_opened
/obj/structure/closet/hear_talk(mob/M as mob, text)
for (var/atom/A in src)
if(istype(A,/obj/))
var/obj/O = A
O.hear_talk(M, text)

View File

@@ -41,7 +41,7 @@
if(HULK in user.mutations)
health -= 5
else
health -= 3
health -= 1
healthcheck()
/obj/structure/grille/attack_alien(mob/user as mob)

View File

@@ -82,57 +82,57 @@
/obj/structure/sign/biohazard
name = "\improper BIOHAZARD"
desc = "A warning sign which reads 'BIOHAZARD'"
desc = "A warning sign which reads 'BIOHAZARD'."
icon_state = "bio"
/obj/structure/sign/electricshock
name = "\improper HIGH VOLTAGE"
desc = "A warning sign which reads 'HIGH VOLTAGE'"
desc = "A warning sign which reads 'HIGH VOLTAGE'."
icon_state = "shock"
/obj/structure/sign/examroom
name = "\improper EXAM"
desc = "A guidance sign which reads 'EXAM ROOM'"
desc = "A guidance sign which reads 'EXAM ROOM'."
icon_state = "examroom"
/obj/structure/sign/vacuum
name = "\improper HARD VACUUM AHEAD"
desc = "A warning sign which reads 'HARD VACUUM AHEAD'"
desc = "A warning sign which reads 'HARD VACUUM AHEAD'."
icon_state = "space"
/obj/structure/sign/deathsposal
name = "\improper DISPOSAL LEADS TO SPACE"
desc = "A warning sign which reads 'DISPOSAL LEADS TO SPACE'"
desc = "A warning sign which reads 'DISPOSAL LEADS TO SPACE'."
icon_state = "deathsposal"
/obj/structure/sign/pods
name = "\improper ESCAPE PODS"
desc = "A warning sign which reads 'ESCAPE PODS'"
desc = "A warning sign which reads 'ESCAPE PODS'."
icon_state = "pods"
/obj/structure/sign/fire
name = "\improper DANGER: FIRE"
desc = "A warning sign which reads 'DANGER: FIRE'"
desc = "A warning sign which reads 'DANGER: FIRE'."
icon_state = "fire"
/obj/structure/sign/nosmoking_1
name = "\improper NO SMOKING"
desc = "A warning sign which reads 'NO SMOKING'"
desc = "A warning sign which reads 'NO SMOKING'."
icon_state = "nosmoking"
/obj/structure/sign/nosmoking_2
name = "\improper NO SMOKING"
desc = "A warning sign which reads 'NO SMOKING'"
desc = "A warning sign which reads 'NO SMOKING'."
icon_state = "nosmoking2"
/obj/structure/sign/redcross
name = "medbay"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here.'"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
icon_state = "redcross"
/obj/structure/sign/greencross
name = "medbay"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here.'"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
icon_state = "greencross"
/obj/structure/sign/goldenplaque
@@ -162,40 +162,40 @@
/obj/structure/sign/science //These 3 have multiple types, just var-edit the icon_state to whatever one you want on the map
name = "\improper SCIENCE!"
desc = "A warning sign which reads 'SCIENCE!'"
desc = "A warning sign which reads 'SCIENCE!'."
icon_state = "science1"
/obj/structure/sign/chemistry
name = "\improper CHEMISTRY"
desc = "A warning sign which reads 'CHEMISTRY'"
desc = "A warning sign which reads 'CHEMISTRY'."
icon_state = "chemistry1"
/obj/structure/sign/botany
name = "\improper HYDROPONICS"
desc = "A warning sign which reads 'HYDROPONICS'"
desc = "A warning sign which reads 'HYDROPONICS'."
icon_state = "hydro1"
/obj/structure/sign/directions/science
name = "\improper Science department"
desc = "A direction sign, pointing out which way Science department is."
desc = "A direction sign, pointing out which way the Science department is."
icon_state = "direction_sci"
/obj/structure/sign/directions/engineering
name = "\improper Engineering department"
desc = "A direction sign, pointing out which way Engineering department is."
desc = "A direction sign, pointing out which way the Engineering department is."
icon_state = "direction_eng"
/obj/structure/sign/directions/security
name = "\improper Security department"
desc = "A direction sign, pointing out which way Security department is."
desc = "A direction sign, pointing out which way the Security department is."
icon_state = "direction_sec"
/obj/structure/sign/directions/medical
name = "\improper Medical Bay"
desc = "A direction sign, pointing out which way Meducal Bay is."
desc = "A direction sign, pointing out which way the Medical Bay is."
icon_state = "direction_med"
/obj/structure/sign/directions/evac
name = "\improper Escape Arm"
desc = "A direction sign, pointing out which way escape shuttle dock is."
desc = "A direction sign, pointing out which way the escape shuttle dock is."
icon_state = "direction_evac"

View File

@@ -155,7 +155,7 @@
if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
if(!ishuman(usr)) return
if(buckled_mob) return 0
visible_message("[usr] collapses \the [src.name]")
visible_message("[usr] collapses \the [src.name].")
new/obj/item/roller(get_turf(src))
spawn(0)
del(src)

View File

@@ -154,7 +154,7 @@
attack_generic(user, rand(10, 15))
/obj/structure/window/attackby(obj/item/weapon/W as obj, mob/user as mob)
/obj/structure/window/attackby(obj/item/W as obj, mob/user as mob)
if(!istype(W)) return//I really wish I did not need this
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)

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,29 +4,24 @@
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)
return
/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user)
if(src.magpulse)
src.flags &= ~NOSLIP
src.magpulse = 0
usr << "You relax your deathgrip on the flooring."
flags &= ~NOSLIP
magpulse = 0
canremove = 1
user << "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."
//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
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."
examine()
//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
/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)

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,11 +33,11 @@
/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
for(var/V in components)
var/datum/robot_component/C = components[V]
C.update_power_state()
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)
@@ -45,17 +45,11 @@
if(src.module_state_3)
src.cell.use(3)
for(var/V in components)
var/datum/robot_component/C = components[V]
C.consume_power()
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
@@ -134,6 +132,9 @@
else
src.blinded = 1
if(!is_component_functioning("actuator"))
src.Paralyse(3)
return 1

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

@@ -55,3 +55,5 @@
var/mob/living/carbon/human/H = src
if(H.species && 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))
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

@@ -281,6 +281,13 @@
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?
/*
/obj/item/weapon/reagent_containers/glass/beaker/vial

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,43 +31,43 @@
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>
<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>
</list><br>
</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
<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 locater</b> - knowing where you are is the first step to not be lost.</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 co-ordinates and time of each scan.</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 locater</b> - leave a beacon at an item of interest, then track it down later with this handy gadget. Watch for interference from other
<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 dependant on the environment you're working in, but enclosed footwear and pack of internals
<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 forbears may have unleashed.</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>
</list><br>
</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
<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>
@@ -75,36 +76,36 @@
<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><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>
<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>
</list><br>
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>
<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
<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
<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><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>
<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>
'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.
<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>
</list><br>
</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)

View File

@@ -61,6 +61,26 @@ should be listed in the changelog upon commit though. Thanks. -->
<h3 class='author'>RavingManiac updated:</h3>
<ul class='changes bgimages16'>
<li class='rscadd'>Inflatable walls and doors added. Useful for sealing off hull breaches, but easily punctured by sharp objects and Tajarans.</li>
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>11 April 2014</h2>
<h3 class='author'>Jarcolr updated:</h3>
<ul class='changes bgimages16'> <li class='rscadd'>You can now flip coins like a D2</li>
<li class='tweak'>Miscellaneous cargo crates got a tiny buff, Standard Costume crate is now Costume Crate</li>
<li class='tweak'>Grammar patch,telekinesis/amputated arm exploit fixes,more in the future</li>
<li class='tweak'>Grille kicking now does less damage</li>
<li class='tweak'>TELESCOPIC baton no longer knocks anybody down,still got a lot of force though</li>
<li class='tweak'>Other small-ish changes and fixes that aren't worth mentioning</li> </ul> </div>
<div class='commit sansserif'>
<h2 class='date'>6 April 2014</h2>
<h3 class='author'>RavingManiac updated:</h3>
<ul class='changes bgimages16'>
<li class='tweak'>Tape recorders and station-bounced radios now work inside containers and closets.</li>
</ul>
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -37,6 +37,9 @@
<i>None</i>
{{/if}}
{{:~link('Remove', 'eject', {'rem_device' : 1}, valveAttachment ? null : 'disabled')}}
{{if valveAttachment}}
{{:~link('View', 'wrench', {'device' : 1})}}
{{/if}}
</div>
</div>