This commit is contained in:
SamCroswell
2014-11-04 21:00:57 -05:00
594 changed files with 54696 additions and 28879 deletions
@@ -1,7 +1,7 @@
obj/machinery/atmospherics/trinary/filter
icon = 'icons/obj/atmospherics/filter.dmi'
icon_state = "intact_off"
density = 1
density = 0
name = "Gas filter"
@@ -1,7 +1,7 @@
obj/machinery/atmospherics/trinary/mixer
icon = 'icons/obj/atmospherics/mixer.dmi'
icon_state = "intact_off"
density = 1
density = 0
name = "Gas mixer"
+42 -3
View File
@@ -4,6 +4,7 @@ obj/machinery/atmospherics/pipe
var/datum/pipeline/parent
var/volume = 0
var/frozen = 0 //used by the pipe freezer
force = 20
layer = 2.4 //under wires with their 2.44
@@ -1176,6 +1177,7 @@ obj/machinery/atmospherics/pipe
obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (istype(src, /obj/machinery/atmospherics/pipe/tank))
return ..()
if (istype(src, /obj/machinery/atmospherics/pipe/vent))
@@ -1203,18 +1205,55 @@ obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/u
update_icon()
return 1
if (istype(W, /obj/item/device/pipe_freezer))
if(!src.frozen) // If the pipe is not already frozen
user << "\red You begin to freeze the [src]"
if (do_after(user, 60))
user.visible_message( \
"[user] freezes \the [src].", \
"\blue You finished freezing \the [src].", \
"You hear the hiss of gas.")
src.frozen = 1
spawn (200)
src.frozen = 0
src.visible_message( \
"\the ice arounds the [src] melts.", \
"\blue Your frozen [src] has thawed.", \
"You hear dripping water.")
add_fingerprint(user)
return 1
if (!istype(W, /obj/item/weapon/wrench))
return ..()
var/turf/T = src.loc
if (level==1 && isturf(T) && T.intact)
user << "\red You must remove the plating first."
return 1
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = loc.return_air()
if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
if (!src.frozen) // If the pipe is not frozen
user << "\red You cannot unwrench this [src], it too exerted due to internal pressure."
add_fingerprint(user)
return 1
else // If the pipe is frozen
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src] between the frozen segments..."
if (do_after(user, 40))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
"You hear ratchet.")
new /obj/item/pipe(loc, make_from=src)
for (var/obj/machinery/meter/meter in T)
if (meter.target == src)
new /obj/item/pipe_meter(T)
del(meter)
qdel(src)
return 1
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to unfasten \the [src]..."
if (do_after(user, 40))
@@ -81,7 +81,7 @@
/datum/medical_effect/headache
name = "Headache"
triggers = list("cryoxadone" = 10, "bicaridine" = 15, "tricordrazine" = 15)
cures = list("alkysine", "tramadol")
cures = list("alkysine", "tramadol", "paracetamol", "oxycodone")
cure_message = "Your head stops throbbing..."
/datum/medical_effect/headache/on_life(mob/living/carbon/human/H, strength)
@@ -0,0 +1,32 @@
//Clothing
/obj/item/clothing/suit/storage/centcomm_jacket
name = "Central Command Jacket"
desc = "A black jacket embroidered with the Central Command dress print."
icon = 'code/WorkInProgress/IndexLP/indexlp_icons.dmi'
icon_state = "mob_centcomm_jacket_open"
item_state = "mob_centcomm_jacket"
sprite_sheets = list(
"Human" = 'code/WorkInProgress/IndexLP/indexlp_icons.dmi'
)
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
verb/toggle()
set name = "Toggle Coat Buttons"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
switch(icon_state)
if("mob_centcomm_jacket_open")
src.icon_state = "mob_centcomm_jacket"
usr << "You button up the jacket."
if("mob_centcomm_jacket")
src.icon_state = "mob_centcomm_jacket_open"
usr << "You unbutton the jacket."
else
usr << "You attempt to button-up your [src], before promptly realising how retarded you are."
return
usr.update_inv_wear_suit() //so our overlays update
Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

File diff suppressed because it is too large Load Diff
+3
View File
@@ -210,6 +210,9 @@
if("viewperipheral" in href_list) // open drive, show status of peripheral
var/obj/item/part/computer/C = locate(href_list["viewperipheral"])
if(!istype(C) || (C.loc != src.computer))
return
if(istype(C,/obj/item/part/computer/storage))
current = C
interact()
@@ -258,10 +258,11 @@
if("show" in href_list)
var/obj/machinery/camera/C = locate(href_list["show"])
current = C
usr.reset_view(C)
interact()
return
if(istype(C) && C.status)
current = C
usr.reset_view(C)
interact()
return
if("keyselect" in href_list)
current = null
@@ -73,25 +73,29 @@
if(href_list["inject1"])
var/obj/item/weapon/implant/I = locate(href_list["inject1"])
if(I) I.activate(1)
if(istype(I))
I.activate(1)
else if(href_list["inject5"])
var/obj/item/weapon/implant/I = locate(href_list["inject5"])
if(I) I.activate(5)
if(istype(I))
I.activate(5)
else if(href_list["inject10"])
var/obj/item/weapon/implant/I = locate(href_list["inject10"])
if(I) I.activate(10)
if(istype(I))
I.activate(10)
else if(href_list["lock"])
screen = !screen
else if(href_list["warn"])
var/warning = copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN)
var/warning = trim(copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN))
if(!warning) return
var/obj/item/weapon/implant/I = locate(href_list["warn"])
if((I)&&(I.imp_in))
if( istype(I) && I.imp_in)
var/mob/living/carbon/R = I.imp_in
log_say("PrisonComputer3 message: [key_name(usr)]->[key_name(R)] : [warning]")
R << "\green You hear a voice in your head saying: '[warning]'"
interact()
+18 -11
View File
@@ -55,15 +55,20 @@
del src
return
if(!stored_computer.manipulating)
stored_computer.manipulating = 1
stored_computer.loc = loc
stored_computer.stat &= ~MAINT
stored_computer.update_icon()
loc = null
usr << "You open \the [src]."
stored_computer.loc = loc
stored_computer.stat &= ~MAINT
stored_computer.update_icon()
loc = null
usr << "You open \the [src]."
spawn(5)
stored_computer.manipulating = 0
del src
else
usr << "\red You are already opening the computer!"
spawn(5)
del src
AltClick()
if(Adjacent(usr))
@@ -112,6 +117,7 @@
pixel_y = -3
show_keyboard = 0
var/manipulating = 0 // To prevent disappearing bug
var/obj/item/device/laptop/portable = null
New(var/L, var/built = 0)
@@ -147,10 +153,11 @@
portable=new
portable.stored_computer = src
portable.loc = loc
loc = portable
stat |= MAINT
usr << "You close \the [src]."
if(!manipulating)
portable.loc = loc
loc = portable
stat |= MAINT
usr << "You close \the [src]."
auto_use_power()
if(stat&MAINT)
+1 -1
View File
@@ -239,7 +239,7 @@ Programs are a file that can be executed
//
if("runfile" in href_list)
var/datum/file/F = locate(href_list["runfile"])
if(F && F.computer == computer)
if(istype(F) && F.computer == computer)
F.execute(src)
return 1
+1 -1
View File
@@ -126,7 +126,7 @@ obj/var/contaminated = 0
/mob/living/carbon/human/proc/burn_eyes()
//The proc that handles eye burning.
if(prob(20)) src << "\red Your eyes burn!"
var/datum/organ/internal/eyes/E = internal_organs["eyes"]
var/datum/organ/internal/eyes/E = internal_organs_by_name["eyes"]
E.damage += 2.5
eye_blurry = min(eye_blurry+1.5,50)
if (prob(max(0,E.damage - 15) + 1) && !eye_blind)
+2 -3
View File
@@ -15,9 +15,8 @@
// Run all strings to be used in an SQL query through this proc first to properly escape out injection attempts.
/proc/sanitizeSQL(var/t as text)
var/sanitized_text = replacetext(t, "'", "\\'")
sanitized_text = replacetext(sanitized_text, "\"", "\\\"")
return sanitized_text
var/sqltext = dbcon.Quote(t);
return copytext(sqltext, 2, lentext(sqltext)-1);//Quote() adds quotes around input, we already do that
/*
* Text sanitization
+1
View File
@@ -195,6 +195,7 @@ datum/hud/New(mob/owner)
blob_hud()
else if(mymob.mind && mymob.mind.vampire)
vampire_hud()
human_hud('icons/mob/screen1_Vampire.dmi')
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
/mob/verb/button_pressed_F12(var/full = 0 as null)
+3 -4
View File
@@ -24,13 +24,12 @@
/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
if (!istype(M)) // not sure if this is the right thing...
return
return 0
var/messagesource = M
if (can_operate(M)) //Checks if mob is lying down on table for surgery
if (do_surgery(M,user,src))
return
return 0
if (istype(M,/mob/living/carbon/brain))
messagesource = M:container
if (hitsound && force > 0)
@@ -145,7 +144,7 @@
if(istype(M, /mob/living/carbon/human))
return M:attacked_by(src, user, def_zone)
return M:attacked_by(src, user, def_zone) //make sure to return whether we have hit or miss
else
switch(damtype)
if("brute")
+1 -1
View File
@@ -79,7 +79,7 @@
var/wikiurl = "http://baystation12.net/wiki"
var/forumurl = "http://baystation12.net/forums/"
var/media_base_url = "http://80.244.78.90/media" // http://ss13.nexisonline.net/media
var/media_base_url = "http://nanotrasen.se/media" // http://ss13.nexisonline.net/media
//Alert level description
var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
@@ -63,7 +63,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
//calls the shuttle for an emergency evacuation
/datum/emergency_shuttle_controller/proc/call_evac()
if(!can_call()) return
if(!can_call()) return 0
//set the launch timer
autopilot = 1
@@ -80,6 +80,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
if(istype(A, /area/hallway))
A.readyalert()
return 1
//calls the shuttle for a routine crew transfer
/datum/emergency_shuttle_controller/proc/call_transfer()
if(!can_call()) return
@@ -134,8 +136,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
return 1
/datum/emergency_shuttle_controller/proc/get_shuttle_prep_time()
// During mutiny rounds, the shuttle takes twice as long.
if(ticker && istype(ticker.mode,/datum/game_mode/mutiny))
// During mutiny rounds, the shuttle takes longer. Unless of course the directive is finished.
if(!ticker) return SHUTTLE_PREPTIME
var/datum/game_mode/mutiny/m = ticker.mode
if(istype(m) && !m.ead.activated)
return SHUTTLE_PREPTIME * 3 //15 minutes
return SHUTTLE_PREPTIME
@@ -261,4 +265,4 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
var/obj/effect/bgstar/S = new/obj/effect/bgstar(locate(x,y,z))
S.direction = spawndir
spawn()
S.startmove()
S.startmove()
+1 -15
View File
@@ -1257,18 +1257,7 @@ datum/mind
brigged_since = -1
return 0
var/is_currently_brigged = 0
if(istype(T.loc,/area/security/brig))
is_currently_brigged = 1
for(var/obj/item/weapon/card/id/card in current)
is_currently_brigged = 0
break // if they still have ID they're not brigged
for(var/obj/item/device/pda/P in current)
if(P.id)
is_currently_brigged = 0
break // if they still have ID they're not brigged
var/is_currently_brigged = current.is_in_brig()
if(!is_currently_brigged)
brigged_since = -1
return 0
@@ -1278,9 +1267,6 @@ datum/mind
return (duration <= world.time - brigged_since)
//Initialisation procs
/mob/proc/mind_initialize()
if(mind)
+7 -1
View File
@@ -48,11 +48,17 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/icon_power_button
var/power_button_name
/obj/effect/proc_holder/spell/wizard/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
/obj/effect/proc_holder/spell/wizard/proc/cast_check(skipcharge = 0, mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell
if(!(src in user.spell_list))
user << "<span class='warning'>You shouldn't have this spell! Something's wrong.</span>"
return 0
if (istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/caster = user
if(caster.remoteview_target)
caster.remoteview_target = null
caster.reset_view(0)
return 0
if(user.z == 2 && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
return 0
+29 -2
View File
@@ -257,7 +257,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/cargotrain
name = "Cargo Train Tug"
contains = list(/obj/vehicle/train/cargo/engine)
cost = 30
cost = 45
containertype = /obj/structure/largecrate
containername = "Cargo Train Tug Crate"
group = "Operations"
@@ -265,7 +265,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/cargotrailer
name = "Cargo Train Trolley"
contains = list(/obj/vehicle/train/cargo/trolley)
cost = 20
cost = 15
containertype = /obj/structure/largecrate
containername = "Cargo Train Trolley Crate"
group = "Operations"
@@ -1095,3 +1095,30 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containertype = /obj/structure/closet/crate
containername = "mafia supply crate"
group = "Operations"
/datum/supply_packs/fabric
name = "Fabric crate"
contains = list(/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric,
/obj/item/weapon/ore/fabric)
cost = 30
containertype = /obj/structure/closet/crate
containername = "Fabric crate"
group = "Operations"
+147 -34
View File
@@ -144,6 +144,24 @@ var/list/uplink_items = list()
cost = 2
job = list("Janitor")
//Medical
/datum/uplink_item/jobspecific/rad_laser
name = "Radiation Laser"
desc = "A radiation laser concealed inside of a Health Analyser, After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyzer, only appears like one. May not function correctly on radiation resistent humanoids!"
item = /obj/item/device/rad_laser
cost = 3
job = list(
"Chief Medical Officer",
"Medical Doctor",
"Geneticist",
"Psychiatrist",
"Chemist",
"Paramedic",
"Virologist",
"Brig Physician"
)
//Assistant
@@ -154,12 +172,13 @@ var/list/uplink_items = list()
cost = 3
job = list("Civilian")
/*
/datum/uplink_item/jobspecific/greytide
name = "Greytide Implant"
desc = "A box containing an implanter filled with a greytide implant when injected into another person makes them loyal to the greytide and your cause, unless of course they're already implanted by someone else. Loyalty ends if the implant is no longer in their system."
item = /obj/item/weapon/storage/box/syndie_kit/greytide
cost = 7
job = list("Civilian")
job = list("Civilian") */
//Bartender
/datum/uplink_item/jobspecific/drunkbullets
@@ -189,47 +208,31 @@ var/list/uplink_items = list()
item = /obj/item/weapon/gun/projectile/revolver
cost = 6
/datum/uplink_item/dangerous/pistol
name = "Stechkin Pistol"
desc = "A small, easily concealable handgun that uses 10mm magazines and is compatible with suppressors."
item = /obj/item/weapon/gun/projectile/automatic/pistol
cost = 4
/datum/uplink_item/dangerous/smg
name = "C-20r Submachine Gun"
desc = "A fully-loaded Scarborough Arms-developed submachine gun that fires 12mm automatic rounds with a 20-round magazine."
item = /obj/item/weapon/gun/projectile/automatic/c20r
cost = 6
cost = 7
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/machinegun
name = "L6 Squad Automatic Weapon"
desc = "A traditionally constructed machine gun made by AA-2531. This deadly weapon has a massive 50-round magazine of 7.62×51mm ammunition."
item = /obj/item/weapon/gun/projectile/automatic/l6_saw
cost = 10
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/ammo
name = "Ammo-357"
desc = "Seven additional rounds for the revolver. Reports indicate the presence of machinery aboard Nanotrasen space stations suitable for producing extra .357 cartridges."
item = /obj/item/ammo_box/a357
cost = 2
/datum/uplink_item/ammo/smg
name = "Ammo-12mm"
desc = "A 20-round 12mm magazine for use in the C-20r submachine gun."
item = /obj/item/ammo_box/magazine/m12mm
cost = 1
gamemodes = list("nuclear emergency")
/datum/uplink_item/ammo/machinegun
name = "Ammo-7.62×51mm"
desc = "A 50-round magazine of 7.62×51mm ammunition for use in the L6 SAW machinegun. By the time you need to use this, you'll already be on a pile of corpses."
item = /obj/item/ammo_box/magazine/m762
cost = 3
cost = 20
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/crossbow
name = "Energy Crossbow"
desc = "A miniature energy crossbow that is small enough both to fit into a pocket and to slip into a backpack unnoticed by observers. Fires bolts tipped with toxin, a poisonous substance that is the product of a living organism. Stuns enemies for a short period of time. Recharges automatically."
item = /obj/item/weapon/gun/energy/crossbow
cost = 7
cost = 5
/datum/uplink_item/dangerous/sword
name = "Energy Sword"
@@ -238,10 +241,19 @@ var/list/uplink_items = list()
cost = 4
/datum/uplink_item/dangerous/manhacks
name = "Manhack Delivery Grenade"
desc = "The manhack grenade is a highly specialized grenades that, once thrown, will deploy a swarm of Viscerators to attack any nearby crewmembers. WARNING: Viscerator progrmaming does not include safeties. They may turn on you!"
name = "Viscerator Delivery Grenade"
desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred any non-operatives in the area."
item = /obj/item/weapon/grenade/spawnergrenade/manhacks
cost = 7
cost = 4
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/bioterror
name = "Biohazardous Chemical Sprayer"
desc = "A chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger Cooperative, the deadly blend it comes stocked with will disorient, damage, and disable your foes... \
Use with extreme caution, to prevent exposure to yourself and your fellow operatives."
item = /obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror
cost = 10
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/emp
name = "5 EMP Grenades"
@@ -249,6 +261,58 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/box/emps
cost = 3
/datum/uplink_item/dangerous/syndicate_minibomb
name = "Syndicate Minibomb"
desc = "The Minibomb is a grenade with a five-second fuse."
item = /obj/item/weapon/grenade/syndieminibomb
cost = 3
/datum/uplink_item/dangerous/gygax
name = "Gygax Exosuit"
desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent for hit-and-run style attacks. \
This model lacks a method of space propulsion, and therefore it is advised to repair the mothership's teleporter if you wish to make use of it."
item = /obj/mecha/combat/gygax/dark/loaded
cost = 45
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/mauler
name = "Mauler Exosuit"
desc = "A massive and incredibly deadly Syndicate exosuit. Features long-range targetting, thrust vectoring, and deployable smoke."
item = /obj/mecha/combat/marauder/mauler/loaded
cost = 70
gamemodes = list("nuclear emergency")
// Ammunition
/datum/uplink_item/ammo
category = "Ammunition"
/datum/uplink_item/ammo/revolver
name = "Ammo-357"
desc = "A box that contains seven additional rounds for the revolver, made using an automatic lathe."
item = /obj/item/ammo_box/a357
cost = 2
/datum/uplink_item/ammo/pistol
name = "Ammo-10mm"
desc = "An additional 8-round 10mm magazine for use in the Stetchkin pistol."
item = /obj/item/ammo_box/magazine/m10mm
cost = 1
/datum/uplink_item/ammo/smg
name = "Ammo-12mm"
desc = "A 20-round 12mm magazine for use in the C-20r submachine gun."
item = /obj/item/ammo_box/magazine/m12mm
cost = 1
gamemodes = list("nuclear emergency")
/datum/uplink_item/ammo/machinegun
name = "Ammo-7.62×51mm"
desc = "A 50-round magazine of 7.62×51mm ammunition for use in the L6 SAW machinegun. By the time you need to use this, you'll already be on a pile of corpses."
item = /obj/item/ammo_box/magazine/m762
cost = 6
gamemodes = list("nuclear emergency")
// STEALTHY WEAPONS
@@ -257,9 +321,9 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_weapons/para_pen
name = "Paralysis Pen"
desc = "A syringe disguised as a functional pen, filled with a neuromuscular-blocking drug that renders a target immobile on injection and makes them seem dead to observers. Side effects of the drug include noticeable drooling. The pen holds one dose of paralyzing agent, and cannot be refilled."
desc = "A syringe disguised as a functional pen, filled with a neuromuscular-blocking drug that renders a target mute on injection that will eventually cause them to pass out. The pen holds one dose of paralyzing agent,though it can be refilled."
item = /obj/item/weapon/pen/paralysis
cost = 3
cost = 4
/datum/uplink_item/stealthy_weapons/soap
name = "Syndicate Soap"
@@ -279,8 +343,7 @@ var/list/uplink_items = list()
name = "Stetchkin Silencer"
desc = "Fitted for use on the Stetchkin pistol, this silencer will make its shots quieter when equipped onto it."
item = /obj/item/weapon/silencer
cost = 1
gamemodes = list("nuclear emergency")
cost = 2
// STEALTHY TOOLS
@@ -293,6 +356,13 @@ var/list/uplink_items = list()
item = /obj/item/clothing/under/chameleon
cost = 3
/datum/uplink_item/stealthy_tools/chameleon_stamp
name = "Chameleon Stamp"
desc = "A stamp that can be activated to imitate an official Nanotrasen Stamp™. The disguised stamp will work exactly like the real stamp and will allow you to forge false documents to gain access or equipment; \
it can also be used in a washing machine to forge clothing."
item = /obj/item/weapon/stamp/chameleon
cost = 1
/datum/uplink_item/stealthy_tools/syndigolashes
name = "No-Slip Syndicate Shoes"
desc = "These allow you to run on wet floors. They do not work on lubricated surfaces."
@@ -317,6 +387,11 @@ var/list/uplink_items = list()
item = /obj/item/device/chameleon
cost = 4
/datum/uplink_item/stealthy_tools/dnascrambler
name = "DNA Scrambler"
desc = "A syringe with one injection that randomizes appearance and name upon use. A cheaper but less versatile alternative to an agent card and voice changer."
item = /obj/item/weapon/dnascrambler
cost = 2
// DEVICE AND TOOLS
@@ -405,6 +480,27 @@ var/list/uplink_items = list()
item = /obj/item/device/radio/beacon/syndicate
cost = 7
/datum/uplink_item/device_tools/syndicate_bomb
name = "Syndicate Bomb"
desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \
You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb."
item = /obj/item/device/radio/beacon/syndicate/bomb
cost = 6
/datum/uplink_item/device_tools/syndicate_detonator
name = "Syndicate Detonator"
desc = "The Syndicate Detonator is a companion device to the Syndicate Bomb. Simply press the included button and an encrypted radio frequency will instruct all live syndicate bombs to detonate. \
Useful for when speed matters or you wish to synchronize multiple bomb blasts. Be sure to stand clear of the blast radius before using the detonator."
item = /obj/item/device/syndicatedetonator
cost = 1
gamemodes = list("nuclear emergency")
/datum/uplink_item/device_tools/pdapinpointer
name = "PDA Pinpointer"
desc = "A pinpointer that tracks any PDA on the station. Useful for locating assassination targets or other high-value targets that you can't find. WARNING: Can only set once."
item = /obj/item/weapon/pinpointer/pdapinpointer
cost = 2
/datum/uplink_item/device_tools/teleporter
name = "Teleporter Circuit Board"
desc = "A printed circuit board that completes the teleporter onboard the mothership. Advise you test fire the teleporter before entering it, as malfunctions can occur."
@@ -412,6 +508,12 @@ var/list/uplink_items = list()
cost = 20
gamemodes = list("nuclear emergency")
/datum/uplink_item/device_tools/shield
name = "Energy Shield"
desc = "An incredibly useful personal shield projector, capable of reflecting energy projectiles and defending against other attacks."
item = /obj/item/weapon/shield/energy
cost = 8
gamemodes = list("nuclear emergency")
// IMPLANTS
@@ -442,6 +544,17 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/box/syndie_kit/imp_compress
cost = 4
/datum/uplink_item/implants/mindslave
name = "Mindslave Implant"
desc = "A box containing an implanter filled with a mindslave implant that when injected into another person makes them loyal to you and your cause, unless of course they're already implanted by someone else. Loyalty ends if the implant is no longer in their system."
item = /obj/item/weapon/storage/box/syndie_kit/mindslave
cost = 5
/datum/uplink_item/implants/adrenal
name = "Adrenal Implant"
desc = "An implant injected into the body, and later activated using a bodily gesture to inject a chemical cocktail, which has a mild healing effect along with removing all stuns and increasing his speed."
item = /obj/item/weapon/storage/box/syndie_kit/imp_adrenal
cost = 4
// POINTLESS BADASSERY
@@ -459,7 +572,7 @@ var/list/uplink_items = list()
desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, making them lethal weapons both when wielded as a blade and when thrown. \
You can also play card games with them."
item = /obj/item/toy/cards/deck/syndicate
cost = 2
cost = 1
/datum/uplink_item/badass/balloon
name = "For showing that you are The Boss"
+19 -20
View File
@@ -9,24 +9,29 @@ var/const/WIRE_DELAY = 4 // Raises the timer on pulse, does nothing on cut
var/const/WIRE_PROCEED = 8 // Lowers the timer, explodes if cut while the bomb is active
var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut
/datum/wires/syndicatebomb/CanUse(var/mob/living/L)
var/obj/machinery/syndicatebomb/P = holder
if(P.open_panel)
return 1
return 0
/datum/wires/syndicatebomb/UpdatePulsed(var/index)
var/obj/machinery/syndicatebomb/P = holder
if(P.degutted)
return
switch(index)
if(WIRE_BOOM)
if (P.active)
P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-")
P.loc.visible_message("<span class='danger'>\icon[holder] An alarm sounds! It's go-</span>")
P.timer = 0
if(WIRE_UNBOLT)
P.loc.visible_message("\blue \icon[holder] The bolts spin in place for a moment.")
P.loc.visible_message("<span class='notice'>\icon[holder] The bolts spin in place for a moment.</span>")
if(WIRE_DELAY)
playsound(P.loc, 'sound/machines/chime.ogg', 30, 1)
P.loc.visible_message("\blue \icon[holder] The bomb chirps.")
P.loc.visible_message("<span class='notice'>\icon[holder] The bomb chirps.</span>")
P.timer += 10
if(WIRE_PROCEED)
playsound(P.loc, 'sound/machines/buzz-sigh.ogg', 30, 1)
P.loc.visible_message("\red \icon[holder] The bomb buzzes ominously!")
P.loc.visible_message("<span class='danger'>\icon[holder] The bomb buzzes ominously!</span>")
if (P.timer >= 61) //Long fuse bombs can suddenly become more dangerous if you tinker with them
P.timer = 60
if (P.timer >= 21)
@@ -36,26 +41,20 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
if(WIRE_ACTIVATE)
if(!P.active && !P.defused)
playsound(P.loc, 'sound/machines/click.ogg', 30, 1)
P.loc.visible_message("\red \icon[holder] You hear the bomb start ticking!")
P.loc.visible_message("<span class='danger'>\icon[holder] You hear the bomb start ticking!</span>")
P.active = 1
if(!P.open_panel) //Needs to exist in case the wire is pulsed with a signaler while the panel is closed
P.icon_state = "syndicate-bomb-active"
else
P.icon_state = "syndicate-bomb-active-wires"
processing_objects.Add(P)
P.icon_state = "[initial(P.icon_state)]-active[P.open_panel ? "-wires" : ""]"
else
P.loc.visible_message("\blue \icon[holder] The bomb seems to hesitate for a moment.")
P.loc.visible_message("<span class='notice'>\icon[holder] The bomb seems to hesitate for a moment.</span>")
P.timer += 5
/datum/wires/syndicatebomb/UpdateCut(var/index, var/mended)
var/obj/machinery/syndicatebomb/P = holder
if(P.degutted)
return
switch(index)
if(WIRE_EXPLODE)
if(!mended)
if(P.active)
P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-")
P.loc.visible_message("<span class='danger'>\icon[holder] An alarm sounds! It's go-</span>")
P.timer = 0
else
P.defused = 1
@@ -64,15 +63,15 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
if(WIRE_UNBOLT)
if (!mended && P.anchored)
playsound(P.loc, 'sound/effects/stealthoff.ogg', 30, 1)
P.loc.visible_message("\blue \icon[holder] The bolts lift out of the ground!")
P.loc.visible_message("<span class='notice'>\icon[holder] The bolts lift out of the ground!</span>")
P.anchored = 0
if(WIRE_PROCEED)
if(!mended && P.active)
P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-")
P.loc.visible_message("<span class='danger'>\icon[holder] An alarm sounds! It's go-</span>")
P.timer = 0
if(WIRE_ACTIVATE)
if (!mended && P.active)
P.loc.visible_message("\blue \icon[holder] The timer stops! The bomb has been defused!")
P.icon_state = "syndicate-bomb-inactive-wires" //no cutting possible with the panel closed
P.loc.visible_message("<span class='notice'>\icon[holder] The timer stops! The bomb has been defused!</span>")
P.icon_state = "[initial(P.icon_state)]-inactive[P.open_panel ? "-wires" : ""]"
P.active = 0
P.defused = 1
+9 -1
View File
@@ -278,4 +278,12 @@ var/const/POWER = 8
/datum/wires/proc/IsAllCut()
if(wires_status == (1 << wire_count) - 1)
return 1
return 0
return 0
//
//Shuffle and Mend
//
/datum/wires/proc/Shuffle()
wires_status = 0
GenerateWires()
+1 -46
View File
@@ -280,29 +280,6 @@
flags = FPRINT | TABLEPASS| CONDUCT
m_amt = 3750
/obj/item/weapon/shard
name = "shard"
icon = 'icons/obj/shards.dmi'
icon_state = "large"
sharp = 1
edge = 1
desc = "Could probably be used as ... a throwing weapon?"
w_class = 1.0
force = 5.0
throwforce = 8.0
item_state = "shard-glass"
g_amt = 3750
attack_verb = list("stabbed", "slashed", "sliced", "cut")
suicide_act(mob/user)
viewers(user) << pick("\red <b>[user] is slitting \his wrists with the shard of glass! It looks like \he's trying to commit suicide.</b>", \
"\red <b>[user] is slitting \his throat with the shard of glass! It looks like \he's trying to commit suicide.</b>")
return (BRUTELOSS)
/obj/item/weapon/shard/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
/*/obj/item/weapon/syndicate_uplink
name = "station bounced radio"
desc = "Remain silent about this..."
@@ -322,28 +299,6 @@
m_amt = 100
origin_tech = "magnets=2;syndicate=3"*/
/obj/item/weapon/shard/shrapnel
name = "shrapnel"
icon = 'icons/obj/shards.dmi'
icon_state = "shrapnellarge"
desc = "A bunch of tiny bits of shattered metal."
/obj/item/weapon/shard/shrapnel/New()
src.icon_state = pick("shrapnellarge", "shrapnelmedium", "shrapnelsmall")
switch(src.icon_state)
if("shrapnelsmall")
src.pixel_x = rand(-12, 12)
src.pixel_y = rand(-12, 12)
if("shrapnelmedium")
src.pixel_x = rand(-8, 8)
src.pixel_y = rand(-8, 8)
if("shrapnellarge")
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
else
return
/obj/item/weapon/SWF_uplink
name = "station-bounced radio"
desc = "used to comunicate it appears."
@@ -894,4 +849,4 @@ proc
name = "Kidan homeworld globe"
icon = 'icons/obj/decorations.dmi'
icon_state = "kidanglobe"
desc = "A globe of the Kidan homeworld."
desc = "A globe of the Kidan homeworld."
+41
View File
@@ -1806,6 +1806,47 @@ var/list/ghostteleportlocs = list()
icon_state = "dancebar"
//Traitor Station
/area/traitor/rnd
name = "\improper Syndicate Research and Development"
icon_state = "syndie_rnd"
/area/traitor/chem
name = "\improper Syndicate Chemistry"
icon_state = "syndie_chem"
/area/traitor/tox
name = "\improper Syndicate Toxins"
icon_state = "syndie_tox"
/area/traitor/atmos
name = "\improper Syndicate Atmos"
icon_state = "syndie_atmo"
/area/traitor/inter
name = "\improper Syndicate Interrogation"
icon_state = "syndie_inter"
/area/traitor/radio
name = "\improper Syndicate Eavesdropping Booth"
icon_state = "syndie_radio"
/area/traitor/surgery
name = "\improper Syndicate Surgery Theatre"
icon_state = "syndie_surgery"
/area/traitor/hall
name = "\improper Syndicate Station"
icon_state = "syndie_hall"
/area/traitor/kitchen
name = "\improper Syndicate Kitchen"
icon_state = "syndie_kitchen"
/area/traitor/empty
name = "\improper Syndicate Project Room"
icon_state = "syndie_empty"
//AI
+11 -4
View File
@@ -400,12 +400,19 @@
return
if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == "run")).
M.AdjustStunned(5)
M.AdjustWeakened(5)
//M.AdjustStunned(5)
//M.AdjustWeakened(5)
if(M.stunned <= 5) M.stunned = 5
if(M.weakened <= 5) M.weakened = 5
else if (istype(M,/mob/living/carbon/human/))
M.AdjustStunned(2)
M.AdjustWeakened(2)
//M.AdjustStunned(2)
//M.AdjustWeakened(2)
if(M.stunned <= 2) M.stunned = 2
if(M.weakened <= 2) M.weakened = 2
M << "Gravity!"
+6
View File
@@ -463,3 +463,9 @@ its easier to just keep the beam vertical.
/atom/proc/checkpass(passflag)
return pass_flags&passflag
/atom/proc/isinspace()
if(istype(get_turf(src), /turf/space))
return 1
else
return 0
+11
View File
@@ -67,6 +67,10 @@ var/global/list/bad_blocks[0]
var/struc_enzymes="" // Encoded SE
var/unique_enzymes="" // MD5 of player name
// Original Encoded SE, for use with Ryetalin
var/struc_enzymes_original="" // Encoded SE
var/list/SE_original[DNA_SE_LENGTH]
// Internal dirtiness checks
var/dirtyUI=0
var/dirtySE=0
@@ -89,6 +93,7 @@ var/global/list/bad_blocks[0]
/datum/dna/proc/Clone()
var/datum/dna/new_dna = new()
new_dna.unique_enzymes=unique_enzymes
new_dna.struc_enzymes_original=struc_enzymes_original // will make clone's SE the same as the original, do we want this?
new_dna.b_type=b_type
new_dna.mutantrace=mutantrace
new_dna.real_name=real_name
@@ -362,10 +367,16 @@ var/global/list/bad_blocks[0]
// BACK-COMPAT!
// Initial DNA setup. I'm kind of wondering why the hell this doesn't just call the above.
// ready_dna is (hopefully) only used on mob creation, and sets the struc_enzymes_original and SE_original only once - Bone White
/datum/dna/proc/ready_dna(mob/living/carbon/human/character)
ResetUIFrom(character)
ResetSE()
struc_enzymes_original = struc_enzymes // sets the original struc_enzymes when ready_dna is called
SE_original = SE
unique_enzymes = md5(character.real_name)
reg_dna[unique_enzymes] = character.real_name
+5 -1
View File
@@ -320,7 +320,11 @@
icon_power_button = "genetic_incendiary"
/obj/effect/proc_holder/spell/wizard/targeted/immolate/cast(list/targets)
var/mob/living/L = usr
if(!targets.len)
usr << "<span class='notice'>No target found in range.</span>"
return
var/mob/living/carbon/L = targets[1]
L.adjust_fire_stacks(0.5) // Same as walking into fire. Was 100 (goon fire)
L.visible_message("\red <b>[L.name]</b> suddenly bursts into flames!")
+6 -5
View File
@@ -230,8 +230,8 @@
var/list/types_allowed=list(/obj/item,/mob/living/simple_animal, /mob/living/carbon/monkey, /mob/living/carbon/human)
/obj/effect/proc_holder/spell/wizard/targeted/eat/choose_targets(mob/user = usr)
var/list/targets = list()
var/list/possible_targets = list()
var/list/targets = new /list()
var/list/possible_targets = new /list()
for(var/atom/movable/O in view_or_range(range, user, selection_type))
if(is_type_in_list(O,types_allowed))
@@ -476,7 +476,6 @@
activation_messages = list("You suddenly notice more about others than you did before.")
deactivation_messages = list("You no longer feel able to sense intentions.")
instability=1
mutation=M_EMPATH
New()
@@ -486,7 +485,7 @@
/obj/effect/proc_holder/spell/wizard/targeted/empath
name = "Read Mind"
desc = "Read the minds of others for information."
charge_max = 1800
charge_max = 180
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
@@ -496,9 +495,11 @@
icon_power_button = "genetic_empath"
/obj/effect/proc_holder/spell/wizard/targeted/empath/choose_targets(mob/user = usr)
var/list/targets
var/list/targets = new /list()
targets += input("Choose the target to spy on.", "Targeting") as mob in range(7,usr)
perform(targets)
/obj/effect/proc_holder/spell/wizard/targeted/empath/cast(list/targets)
if(!ishuman(usr)) return
+5 -1
View File
@@ -108,7 +108,10 @@
var/mob/living/carbon/human/O
if(Mo.greaterform)
O = new(src, Mo.greaterform)
var/greatform = lowertext(Mo.greaterform)
var/typepath = "/mob/living/carbon/human/"
typepath += greatform
O = new typepath(src, greatform)
else
O = new(src)
@@ -152,6 +155,7 @@
continue
else
O.real_name = randomname
O.dna.real_name = randomname
i++
O.UpdateAppearance()
O.take_overall_damage(M.getBruteLoss(), M.getFireLoss())
+8 -3
View File
@@ -114,7 +114,8 @@ Obviously, requires DNA2.
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
range = 1
range = -1
include_user = 1
selection_type = "range"
icon_power_button = "genetic_morph"
@@ -219,9 +220,11 @@ Obviously, requires DNA2.
icon_power_button = "genetic_project"
/obj/effect/proc_holder/spell/wizard/targeted/remotetalk/choose_targets(mob/user = usr)
var/list/targets
var/list/targets = new /list()
targets += input("Choose the target to talk to.", "Targeting") as mob in living_mob_list
perform(targets)
/obj/effect/proc_holder/spell/wizard/targeted/remotetalk/cast(list/targets)
if(!ishuman(usr)) return
@@ -264,9 +267,11 @@ Obviously, requires DNA2.
icon_power_button = "genetic_view"
/obj/effect/proc_holder/spell/wizard/targeted/remoteview/choose_targets(mob/user = usr)
var/list/targets
var/list/targets = new /list()
targets += input("Choose the target to spy on.", "Targeting") as mob in living_mob_list
perform(targets)
/obj/effect/proc_holder/spell/wizard/targeted/remoteview/cast(list/targets)
var/mob/living/carbon/human/user
if(ishuman(usr))
@@ -502,7 +502,8 @@
O.trace_chemicals = list()
O.wounds = list()
O.wound_update_accuracy = 1
for(var/datum/organ/internal/IO in H.internal_organs)
for(var/n in H.internal_organs_by_name)
var/datum/organ/internal/IO = H.internal_organs_by_name[n]
IO.damage = 0
IO.trace_chemicals = list()
H.updatehealth()
+7 -1
View File
@@ -533,7 +533,13 @@ var/list/sacrificed = list()
return 0
// record this
cult_log("[key_name(usr,0)] says : [input]")
//cult_log("[key_name(usr,0)] says : [input]")
var/F = investigate_subject2file("cult")
if(!F)
return 0
F << "<small>[time2text(world.timeofday,"hh:mm")] \ref[usr] ([usr.x],[usr.y],[usr.z])</small> || [usr] communicates: [input]<br>"
var/obj/cult_viewpoint/vp = getCultViewpoint(usr)
if (!vp)
+167 -29
View File
@@ -86,35 +86,173 @@
if (usr.stat || usr.restrained() || !in_range(src, usr)) return
if (href_list["rune"])
switch(href_list["rune"])
if("newtome")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
T.imbue = "newtome"
if("teleport")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
T.imbue = "[pick("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri", "orkan", "allaq")]"
T.info = "[T.imbue]"
if("emp")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
T.imbue = "emp"
if("conceal")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
T.imbue = "conceal"
if("communicate")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
T.imbue = "communicate"
if("runestun")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
T.imbue = "runestun"
if("armor")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
T.imbue = "armor"
if("soulstone")
new /obj/item/device/soulstone(get_turf(usr))
if("construct")
new /obj/structure/constructshell(get_turf(usr))
src.uses--
supply()
if (istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/M = usr
switch(href_list["rune"])
if("newtome")
var/obj/item/weapon/paper/talisman/T = new(M)
T.imbue = "newtome"
var/list/slots = list (
"backpack" = slot_in_backpack,
"left pocket" = slot_l_store,
"right pocket" = slot_r_store,
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
var/where = M.equip_in_one_of_slots(T, slots)
if (!where)
M << "You need a space in your backpack, pocket or hand for the new paper."
else
M << "The [href_list["rune"]] talisman in your [where]"
M.update_icons()
src.uses--
supply()
if("teleport")
var/obj/item/weapon/paper/talisman/T = new(M)
T.imbue = "[pick("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri", "orkan", "allaq")]"
T.info = "[T.imbue]"
var/list/slots = list (
"backpack" = slot_in_backpack,
"left pocket" = slot_l_store,
"right pocket" = slot_r_store,
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
var/where = M.equip_in_one_of_slots(T, slots)
if (!where)
M << "You need a space in your backpack, pocket or hand for the new paper."
else
M << "The [href_list["rune"]] talisman in your [where]"
M.update_icons()
src.uses--
supply()
if("emp")
var/obj/item/weapon/paper/talisman/T = new(M)
T.imbue = "emp"
var/list/slots = list (
"backpack" = slot_in_backpack,
"left pocket" = slot_l_store,
"right pocket" = slot_r_store,
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
var/where = M.equip_in_one_of_slots(T, slots)
if (!where)
M << "You need a space in your backpack, pocket or hand for the new paper."
else
M << "The [href_list["rune"]] talisman in your [where]"
M.update_icons()
src.uses--
supply()
if("conceal")
var/obj/item/weapon/paper/talisman/T = new(M)
T.imbue = "conceal"
var/list/slots = list (
"backpack" = slot_in_backpack,
"left pocket" = slot_l_store,
"right pocket" = slot_r_store,
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
var/where = M.equip_in_one_of_slots(T, slots)
if (!where)
M << "You need a space in your backpack, pocket or hand for the new paper."
else
M << "The [href_list["rune"]] talisman in your [where]"
M.update_icons()
src.uses--
supply()
if("communicate")
var/obj/item/weapon/paper/talisman/T = new(M)
T.imbue = "communicate"
var/list/slots = list (
"backpack" = slot_in_backpack,
"left pocket" = slot_l_store,
"right pocket" = slot_r_store,
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
var/where = M.equip_in_one_of_slots(T, slots)
if (!where)
M << "You need a space in your backpack, pocket or hand for the new paper."
else
M << "The [href_list["rune"]] talisman in your [where]"
M.update_icons()
src.uses--
supply()
if("runestun")
var/obj/item/weapon/paper/talisman/T = new(M)
T.imbue = "runestun"
var/list/slots = list (
"backpack" = slot_in_backpack,
"left pocket" = slot_l_store,
"right pocket" = slot_r_store,
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
var/where = M.equip_in_one_of_slots(T, slots)
if (!where)
M << "You need a space in your backpack, pocket or hand for the new paper."
else
M << "The [href_list["rune"]] talisman in your [where]"
M.update_icons()
src.uses--
supply()
if("armor")
var/obj/item/weapon/paper/talisman/T = new(M)
T.imbue = "armor"
var/list/slots = list (
"backpack" = slot_in_backpack,
"left pocket" = slot_l_store,
"right pocket" = slot_r_store,
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
var/where = M.equip_in_one_of_slots(T, slots)
if (!where)
M << "You need a space in your backpack, pocket or hand for the new paper."
else
M << "The [href_list["rune"]] talisman in your [where]"
M.update_icons()
src.uses--
supply()
if("soulstone")
new /obj/item/device/soulstone(get_turf(usr))
src.uses--
supply()
if("construct")
new /obj/structure/constructshell(get_turf(usr))
src.uses--
supply()
else
return
return
@@ -553,8 +553,11 @@ ________________________________________________________________________________
var/damage = min(cell.charge, rand(50,150))//Uses either the current energy left over or between 50 and 150.
if(damage>1)//So they don't spam it when energy is a factor.
spark_system.start()//SPARKS THERE SHALL BE SPARKS
U.electrocute_act(damage, src,0.1,1)//The last argument is a safety for the human proc that checks for gloves.
cell.charge -= damage
U.electrocute_act(damage, src, 0.1)
if(cell.charge < damage)
cell.use(cell.charge)
else
cell.use(damage)
else
A << "\red <b>ERROR</b>: \black Not enough energy remaining."
+12 -42
View File
@@ -4,8 +4,12 @@
command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure")
for(var/mob/M in player_list)
M << sound('sound/AI/poweroff.ogg')
for(var/obj/machinery/power/smes/S in world)
if(istype(get_area(S), /area/turret_protected) || S.z != 1)
var/list/skipped_areas = list(/area/turret_protected/ai)
for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
if(current_area.type in skipped_areas || S.z != 1)
continue
S.charge = 0
S.output = 0
@@ -13,64 +17,30 @@
S.updateicon()
S.power_change()
var/list/skipped_areas = list(/area/engine/engineering, /area/turret_protected/ai)
for(var/area/A in world)
if( !A.requires_power || A.always_unpowered )
continue
var/skip = 0
for(var/area_type in skipped_areas)
if(istype(A,area_type))
skip = 1
break
if(A.contents)
for(var/atom/AT in A.contents)
if(AT.z != 1) //Only check one, it's enough.
skip = 1
break
if(skip) continue
A.power_light = 0
A.power_equip = 0
A.power_environ = 0
A.power_change()
for(var/obj/machinery/power/apc/C in world)
if(C.cell && C.z == 1)
var/area/A = get_area(C)
var/skip = 0
for(var/area_type in skipped_areas)
if(istype(A,area_type))
skip = 1
break
if(skip) continue
C.cell.charge = 0
/proc/power_restore(var/announce = 1)
var/list/skipped_areas = list(/area/turret_protected/ai)
if(announce)
command_alert("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal")
for(var/mob/M in player_list)
M << sound('sound/AI/poweron.ogg')
for(var/obj/machinery/power/apc/C in world)
for(var/obj/machinery/power/apc/C in machines)
if(C.cell && C.z == 1)
C.cell.charge = C.cell.maxcharge
for(var/obj/machinery/power/smes/S in world)
if(S.z != 1)
for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
if(current_area.type in skipped_areas || S.z != 1)
continue
S.charge = S.capacity
S.output = 200000
S.online = 1
S.updateicon()
S.power_change()
for(var/area/A in world)
if(A.name != "Space" && A.name != "Engine Walls" && A.name != "Chemical Lab Test Chamber" && A.name != "space" && A.name != "Escape Shuttle" && A.name != "Arrival Area" && A.name != "Arrival Shuttle" && A.name != "start area" && A.name != "Engine Combustion Chamber")
A.power_light = 1
A.power_equip = 1
A.power_environ = 1
A.power_change()
/proc/power_restore_quick(var/announce = 1)
@@ -78,7 +48,7 @@
command_alert("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal")
for(var/mob/M in player_list)
M << sound('sound/AI/poweron.ogg')
for(var/obj/machinery/power/smes/S in world)
for(var/obj/machinery/power/smes/S in machines)
if(S.z != 1)
continue
S.charge = S.capacity
@@ -0,0 +1,111 @@
datum/directive/vox_heist
var/list/vox = list()
var/list/sympathizers = list()
proc/get_vox_candidates()
var/list/candidates[0]
for(var/mob/M in player_list)
if(M.is_ready() && is_vox(M))
candidates.Add(M)
return candidates
proc/get_sympathizer_candidates()
var/list/candidates[0]
for(var/mob/M in player_list)
if(M.is_ready() && !is_vox(M) && !M.is_mechanical() && M.mind.assigned_role != "Captain")
candidates[M] = get_weight(M)
return candidates
proc/is_vox(mob/M)
return M.get_species() == "Vox"
proc/get_weight(mob/M)
// You will have a high chance of being regarded as a vox sympathizer if your
// relationship with NanoTrasen is negative. Otherwise, command and security
// staff are pretty well trusted and maltreated alien races are easy suspects.
var/relation = M.client.prefs.nanotrasen_relation
if(relation == "Opposed")
return 8
if(relation == "Skeptical")
return 5
if(command_positions.Find(M.mind.assigned_role))
return 1
var/species = M.get_species()
if(species == "Tajaran" || species == "Unathi")
return 5
if(security_positions.Find(M.mind.assigned_role))
return 2
return 3
datum/directive/vox_heist/get_description()
return {"
<p>
A vox warship has commandeered a NanoTrasen transport carrying 2,500 cubic meters of liquid plasma.
The raiders are willing to return the stolen cargo in exchange for the capture or execution of so-called "vox pariah" that are stationed aboard [station_name()].
If the transport is not recovered, the estimated loss of profits is a threat to the solvency of the company.
Predictive analysis has identified certain members of the crew as sympathetic to the vox pariah. Detain the sympathizers to guarantee a successful exchange.
Lethal force is authorized by the High Command Department of Security. Further information is classified.
</p>
"}
datum/directive/vox_heist/initialize()
var/list/vox_candidates = get_vox_candidates()
for(var/mob/pariah in vox_candidates)
vox.Add(pariah.mind)
special_orders = list(
"Brig or kill all Vox Pariah.")
var/list/sympathizer_candidates = get_sympathizer_candidates()
var/list/sympathizer_names = list()
var/sympathizer_count = min(rand(2,4), sympathizer_candidates.len)
for(var/i=0, i < sympathizer_count, i++)
if(!sympathizer_candidates.len)
break
var/mob/candidate = pickweight(sympathizer_candidates)
sympathizer_candidates.Remove(candidate)
sympathizers.Add(candidate.mind)
sympathizer_names.Add("[candidate.mind.assigned_role] [candidate.mind.name]")
if(sympathizers.len)
special_orders.Add("Brig the following sympathizers: [list2text(sympathizer_names, ", ")]")
datum/directive/vox_heist/meets_prerequisites()
var/list/candidates = get_vox_candidates()
return candidates.len >= 2
datum/directive/vox_heist/directives_complete()
if(!vox.len && !sympathizers.len)
return 1
for(var/datum/mind/pariah in vox)
if(!pariah.current.is_in_brig())
return 0
for(var/datum/mind/sympathizer in sympathizers)
if(!sympathizer.current.is_in_brig())
return 0
return 1
datum/directive/vox_heist/get_remaining_orders()
var/text = ""
for(var/datum/mind/pariah in vox)
if(!pariah.current.is_in_brig())
text += "<li>Brig or Kill [pariah]</li>"
for(var/datum/mind/sympathizer in sympathizers)
if(!sympathizer.current.is_in_brig())
text += "<li>Brig [sympathizer]</li>"
return text
/hook/death/proc/vox_or_sympathizer_killed(mob/living/carbon/human/deceased, gibbed)
var/datum/directive/vox_heist/D = get_directive("vox_heist")
if(!D) return 1
var/datum/mind/M = deceased.mind
if(M in D.vox)
D.vox.Remove(M)
if(M in D.sympathizers)
D.sympathizers.Remove(M)
return 1
@@ -37,6 +37,13 @@
else
return "Inactive"
proc/launch_shuttle()
spawn(rand(5 SECONDS, 45 SECONDS))
if(emergency_shuttle.call_evac())
spawn(20 SECONDS)
var/text = "[station_name()], we have confirmed your completion of Directive X. An evacuation shuttle is en route to receive your crew for debriefing."
command_alert(text, "Emergency Transmission")
/obj/machinery/emergency_authentication_device/attack_hand(mob/user)
if(activated)
user << "\blue \The [src] is already active!"
@@ -51,6 +58,7 @@
activated = 1
user << "\blue You activate \the [src]!"
state("Command acknowledged. Initiating quantum entanglement relay to NanoTrasen High Command.")
launch_shuttle()
return
if(!captains_key && !secondary_key)
+1 -1
View File
@@ -193,7 +193,7 @@ datum/game_mode/mutiny
proc/unbolt_vault_door()
var/obj/machinery/door/airlock/vault = locate(/obj/machinery/door/airlock/vault)
vault.lock()
vault.unlock(1)
proc/make_secret_transcript()
var/obj/machinery/computer/telecomms/server/S = locate(/obj/machinery/computer/telecomms/server)
+3
View File
@@ -22,6 +22,9 @@ datum/game_mode/nations
split_teams()
spawn_flags()
populate_vars()
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player))
M << sound('sound/effects/purge_siren.ogg')
return ..()
/datum/game_mode/nations/send_intercept()
+7 -2
View File
@@ -13,7 +13,7 @@ proc/issyndicate(mob/living/M as mob)
recommended_enemies = 4
uplink_welcome = "Corporate Backed Uplink Console:"
uplink_uses = 40
uplink_uses = 55
var/const/agents_possible = 5 //If we ever need more syndicate agents.
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
@@ -210,7 +210,7 @@ proc/issyndicate(mob/living/M as mob)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(synd_mob), slot_w_uniform)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(synd_mob), slot_shoes)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(synd_mob), slot_gloves)
synd_mob.equip_or_collect(new /obj/item/clothing/gloves/combat(synd_mob), slot_gloves)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate(synd_mob), slot_wear_id)
if(synd_mob.backbag == 2) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(synd_mob), slot_back)
if(synd_mob.backbag == 3) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(synd_mob), slot_back)
@@ -232,10 +232,13 @@ proc/issyndicate(mob/living/M as mob)
switch(race)
if("Unathi")
new_suit.species_restricted = list("Unathi")
new_helmet.species_restricted = list("Unathi")
if("Tajaran")
new_suit.species_restricted = list("Tajaran")
new_helmet.species_restricted = list("Tajaran")
if("Skrell")
new_suit.species_restricted = list("Skrell")
new_helmet.species_restricted = list("Skrell")
if("Vox" || "Vox Armalis")
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(synd_mob), slot_wear_mask)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(synd_mob), slot_l_hand)
@@ -243,6 +246,7 @@ proc/issyndicate(mob/living/M as mob)
if (synd_mob.internals)
synd_mob.internals.icon_state = "internal1"
new_suit.species_restricted = list ("Vox", "Vox Armalis")
new_helmet.species_restricted = list ("Vox", "Vox Armalis")
synd_mob.equip_to_slot_or_del(new_suit, slot_wear_suit)
@@ -252,6 +256,7 @@ proc/issyndicate(mob/living/M as mob)
var/obj/item/weapon/implant/dexplosive/E = new/obj/item/weapon/implant/dexplosive(synd_mob)
E.imp_in = synd_mob
E.implanted = 1
synd_mob.faction |= "syndicate"
synd_mob.update_icons()
return 1
+78 -1
View File
@@ -266,4 +266,81 @@
if(16 to INFINITY)
icon_state = "pinonfar"
spawn(5) .()
spawn(5) .()
/obj/item/weapon/pinpointer/pdapinpointer
name = "pda pinpointer"
desc = "A pinpointer that has been illegally modified to track the PDA of a crewmember for malicious reasons."
var/obj/target = null
var/used = 0
attack_self()
if(!active)
active = 1
point_at(target)
usr << "\blue You activate the pinpointer"
else
active = 0
icon_state = "pinoff"
usr << "\blue You deactivate the pinpointer"
verb/select_pda()
set category = "Object"
set name = "Select pinpointer target"
set src in view(1)
if(used)
usr << "Target has already been set!"
return
var/list/L = list()
L["Cancel"] = "Cancel"
var/length = 1
for (var/obj/item/device/pda/P in world)
if(P.name != "\improper PDA")
L[text("([length]) [P.name]")] = P
length++
var/t = input("Select pinpointer target. WARNING: Can only set once.") as null|anything in L
if(t == "Cancel")
return
target = L[t]
if(!target)
usr << "Failed to locate [target]!"
return
active = 1
point_at(target)
usr << "You set the pinpointer to locate [target]"
used = 1
examine()
..()
if (target)
usr << "\blue Tracking [target]"
proc/point_at(atom/target)
if(!active)
return
if(!target)
icon_state = "pinonnull"
return
var/turf/T = get_turf(target)
var/turf/L = get_turf(src)
if(T.z != L.z)
icon_state = "pinonnull"
else
dir = get_dir(L, T)
switch(get_dist(L, T))
if(-1)
icon_state = "pinondirect"
if(1 to 8)
icon_state = "pinonclose"
if(9 to 16)
icon_state = "pinonmedium"
if(16 to INFINITY)
icon_state = "pinonfar"
spawn(5)
.()
+2 -2
View File
@@ -1,9 +1,9 @@
/datum/hud/proc/vampire_hud(ui_style = 'icons/mob/screen1_Midnight.dmi')
/datum/hud/proc/vampire_hud(ui_style = 'icons/mob/screen1_Vampire.dmi')
vampire_blood_display = new /obj/screen()
vampire_blood_display.name = "Vampire Blood"
vampire_blood_display.icon_state = "dark128"
vampire_blood_display.screen_loc = "14:28,9:15"
vampire_blood_display.screen_loc = "16:28,9:15"
vampire_blood_display.layer = 20
mymob.client.screen += list(vampire_blood_display)
+12 -12
View File
@@ -7,12 +7,12 @@
/datum/game_mode/vampire
name = "vampire"
config_tag = "vampire"
restricted_jobs = list("AI", "Cyborg", "Mobile MMI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Security Pod Pilot", "Nanotrasen Recruiter", "Magistrate") //Consistent screening has filtered all infiltration attempts on high value jobs
protected_jobs = list()
required_players = 1
required_players_secret = 15
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Nanotrasen Recruiter", "Magistrate", "Chaplain")
required_players = 2
required_players_secret = 10
required_enemies = 1
recommended_enemies = 4
recommended_enemies = 2
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10
@@ -56,7 +56,7 @@
if(player.assigned_role == job)
possible_vampires -= player
vampire_amount = max(1,round(num_players() / 10)) //1 + round(num_players() / 10)
vampire_amount = 1 + round(num_players() / 10)
if(possible_vampires.len>0)
for(var/i = 0, i < vampire_amount, i++)
@@ -279,12 +279,12 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
src << "\red They've got no blood left to give."
break
if(H.stat < 2) //alive
blood = min(10, H.vessel.get_reagent_amount("blood"))// if they have less than 10 blood, give them the remnant else they get 10 blood
src.mind.vampire.bloodtotal += blood
src.mind.vampire.bloodusable += blood
H.adjustCloneLoss(10) // beep boop 10 damage
blood = min(20, H.vessel.get_reagent_amount("blood")) // if they have less than 20 blood, give them the remnant else they get 20 blood
src.mind.vampire.bloodtotal += blood/2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0
src.mind.vampire.bloodusable += blood/2
//H.adjust CloneLoss(10) No cloneloss -Melandor0
else
blood = min(5, H.vessel.get_reagent_amount("blood"))// The dead only give 5 bloods
blood = min(5, H.vessel.get_reagent_amount("blood")) // The dead only give 5 bloods
src.mind.vampire.bloodtotal += blood
if(bloodtotal != src.mind.vampire.bloodtotal)
src << "\blue <b>You have accumulated [src.mind.vampire.bloodtotal] [src.mind.vampire.bloodtotal > 1 ? "units" : "unit"] of blood[src.mind.vampire.bloodusable != bloodusable ?", and have [src.mind.vampire.bloodusable] left to use" : "."]"
@@ -486,7 +486,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
if(hud_used)
if(!hud_used.vampire_blood_display)
hud_used.vampire_hud()
//hud_used.human_hud(hud_used.ui_style)
hud_used.human_hud('icons/mob/screen1_Vampire.dmi')
hud_used.vampire_blood_display.maptext_width = 64
hud_used.vampire_blood_display.maptext_height = 26
hud_used.vampire_blood_display.maptext = "<div align='left' valign='top' style='position:relative; top:0px; left:6px'> U:<font color='#33FF33' size='1'>[mind.vampire.bloodusable]</font><br> T:<font color='#FFFF00' size='1'>[mind.vampire.bloodtotal]</font></div>"
+1 -1
View File
@@ -1,7 +1,7 @@
/datum/job/civilian
title = "Civilian"
flag = CIVILIAN
department_flag = CIVILIAN
department_flag = SUPPORT
total_positions = -1
spawn_positions = -1
supervisors = "absolutely everyone"
+21 -12
View File
@@ -10,10 +10,10 @@
req_admin_notify = 1
access = list(access_medical, access_morgue, access_genetics, access_heads,
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
access_keycard_auth, access_sec_doors, access_psychiatrist)
access_keycard_auth, access_sec_doors, access_psychiatrist, access_paramedic)
minimal_access = list(access_eva, access_medical, access_morgue, access_genetics, access_heads,
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
access_keycard_auth, access_sec_doors, access_psychiatrist, access_maint_tunnels)
access_keycard_auth, access_sec_doors, access_psychiatrist, access_maint_tunnels, access_paramedic)
minimal_player_age = 21
equip(var/mob/living/carbon/human/H)
@@ -197,18 +197,24 @@
minimal_access = list(access_medical, access_psychiatrist, access_maint_tunnels)
alt_titles = list("Psychologist","Therapist")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_or_collect(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
switch(H.backbag)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_or_collect(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/device/pda/medical(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if (H.mind.role_alt_title)
switch(H.mind.role_alt_title)
if("Psychiatrist")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform)
if("Psychologist")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform)
else
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
H.equip_or_collect(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
@@ -224,8 +230,8 @@
spawn_positions = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
access = list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks)
minimal_access=list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks)
access = list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks, access_morgue)
minimal_access=list(access_paramedic, access_medical, access_sec_doors, access_maint_tunnels, access_external_airlocks, access_morgue)
minimal_player_age = 3
@@ -247,3 +253,6 @@
H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack)
H.equip_or_collect(new /obj/item/device/healthanalyzer(H.back), slot_in_backpack)
return 1
+1
View File
@@ -284,6 +284,7 @@
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
alt_titles = list("Lawyer","Public Defender")
minimal_player_age = 21
equip(var/mob/living/carbon/human/H)
if(!H) return 0
+12 -12
View File
@@ -87,18 +87,18 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_or_collect(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
H.equip_or_collect(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
H.equip_or_collect(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
H.equip_or_collect(new /obj/item/device/pda/botanist(H), slot_wear_pda)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
if(1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back)
if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
@@ -182,7 +182,7 @@
H.equip_or_collect(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/device/pda/shaftminer(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_or_collect(new /obj/item/weapon/pickaxe/drill(H), slot_r_hand)
H.equip_or_collect(new /obj/item/weapon/pickaxe/drill(H), slot_belt)
// H.equip_or_collect(new /obj/item/clothing/gloves/black(H), slot_gloves)
if(H.backbag == 1)
H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
+2
View File
@@ -100,6 +100,7 @@ var/global/datum/controller/occupations/job_master
Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
var/list/candidates = list()
for(var/mob/new_player/player in unassigned)
Debug(" - Player: [player] Banned: [jobban_isbanned(player, job.title)] Old Enough: [!job.player_old_enough(player.client)] Flag && Be Special: [flag] && [player.client.prefs.be_special] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Flag: [job.flag] Job Department Flag = [job.department_flag]")
if(jobban_isbanned(player, job.title))
Debug("FOC isbanned failed, Player: [player]")
continue
@@ -331,6 +332,7 @@ var/global/datum/controller/occupations/job_master
// If the job isn't filled
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
Debug("DO pass, Player: [player], Level:[level], Job:[job.title]")
Debug(" - Job Flag: [job.flag] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Current Pos: [job.current_positions] Job Spawn Positions = [job.spawn_positions]")
AssignRole(player, job.title)
unassigned -= player
break
-1
View File
@@ -116,7 +116,6 @@ var/list/support_positions = list(
"Mime",
"Barber",
"Magistrate",
"Nanotrasen Representative",
"Nanotrasen Recruiter"
)
+16 -8
View File
@@ -160,8 +160,8 @@
anchored = 1
var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r"
var/mob/living/carbon/human/occupant = null
var/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin")
var/amounts = list(10, 20)
var/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin")
var/amounts = list(5, 10)
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/filtering = 0
@@ -320,13 +320,21 @@
proc/inject_chemical(mob/living/user as mob, chemical, amount)
if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 40)
src.occupant.reagents.add_reagent(chemical, amount)
user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in his/her bloodstream."
if(src.occupant)
if(src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 40)
src.occupant.reagents.add_reagent(chemical, amount)
user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in his/her bloodstream."
return
else
user << "Medical overdose safeties restrict you injecting any more of this chemical."
return
else
user << "The patient rejects the chemicals!"
return
user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
else
user << "There's no occupant in the sleeper!"
return
proc/check(mob/living/user as mob)
+3 -7
View File
@@ -393,13 +393,9 @@
else
dat += "<td>[e.display_name]</td><td>-</td><td>-</td><td>Not Found</td>"
dat += "</tr>"
for(var/datum/organ/internal/i in occupant.internal_organs)
var/mech = ""
if(i.robotic == 1)
mech = "Assisted:"
if(i.robotic == 2)
mech = "Mechanical:"
for(var/n in occupant.internal_organs_by_name)
var/datum/organ/internal/i = occupant.internal_organs_by_name[n]
var/mech = i.desc
var/infection = "None"
switch (i.germ_level)
if (1 to INFECTION_LEVEL_ONE + 200)
+2 -1
View File
@@ -45,7 +45,7 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/weapon/rcd_ammo(), \
new /obj/item/ammo_casing/shotgun/beanbag(), \
new /obj/item/weapon/storage/box/blanks(), \
new /obj/item/ammo_casing/shotgun(), \
new /obj/item/weapon/storage/box/gauge(), \
new /obj/item/ammo_casing/shotgun/incendiary(), \
new /obj/item/ammo_box/c38(), \
new /obj/item/ammo_box/a357(), \
@@ -63,6 +63,7 @@ var/global/list/autolathe_recipes_hidden = list( \
new /obj/item/device/radio/electropack(), \
new /obj/item/weapon/weldingtool/largetank(), \
new /obj/item/weapon/handcuffs(), \
new /obj/item/weapon/hatchet(), \
/*new /obj/item/ammo_casing/shotgun/dart(), \
new /obj/item/weapon/shield/riot(), */ \
)
+225 -230
View File
@@ -1,231 +1,226 @@
/obj/machinery/biogenerator
name = "Biogenerator"
desc = ""
icon = 'icons/obj/biogenerator.dmi'
icon_state = "biogen-stand"
density = 1
anchored = 1
use_power = 1
idle_power_usage = 40
var/processing = 0
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/points = 0
var/menustat = "menu"
New()
..()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
l_color = "#7BF9FF"
power_change()
..()
if(!(stat & (BROKEN|NOPOWER)))
SetLuminosity(2)
else
SetLuminosity(0)
on_reagent_change() //When the reagents change, change the icon as well.
update_icon()
update_icon()
if(!src.beaker)
icon_state = "biogen-empty"
else if(!src.processing)
icon_state = "biogen-stand"
else
icon_state = "biogen-work"
return
/obj/machinery/biogenerator/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, /obj/item/weapon/reagent_containers/glass))
if(beaker)
user << "\red The biogenerator is already loaded."
else
user.before_take_item(O)
O.loc = src
beaker = O
updateUsrDialog()
else if(processing)
user << "\red The biogenerator is currently processing."
else if(istype(O, /obj/item/weapon/storage/bag/plants))
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
if(i >= 10)
user << "\red The biogenerator is already full! Activate it."
else
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
G.loc = src
i++
if(i >= 10)
user << "\blue You fill the biogenerator to its capacity."
break
if(i<10)
user << "\blue You empty the plant bag into the biogenerator."
else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
user << "\red You cannot put this in [src.name]"
else
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
if(i >= 10)
user << "\red The biogenerator is full! Activate it."
else
user.before_take_item(O)
O.loc = src
user << "\blue You put [O.name] in [src.name]"
update_icon()
return
/obj/machinery/biogenerator/interact(mob/user as mob)
if(stat & BROKEN)
return
user.set_machine(src)
var/dat = "<TITLE>Biogenerator</TITLE>Biogenerator:<BR>"
if (processing)
dat += "<FONT COLOR=red>Biogenerator is processing! Please wait...</FONT>"
else
dat += "Biomass: [points] points.<HR>"
switch(menustat)
if("menu")
if (beaker)
dat += "<A href='?src=\ref[src];action=activate'>Activate Biogenerator!</A><BR>"
dat += "<A href='?src=\ref[src];action=detach'>Detach Container</A><BR><BR>"
dat += "Food<BR>"
dat += "<A href='?src=\ref[src];action=create;item=milk;cost=20'>10 milk</A> <FONT COLOR=blue>(20)</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=meat;cost=50'>Slab of meat</A> <FONT COLOR=blue>(50)</FONT><BR>"
dat += "Nutrient<BR>"
dat += "<A href='?src=\ref[src];action=create;item=ez;cost=10'>E-Z-Nutrient</A> <FONT COLOR=blue>(10)</FONT> | <A href='?src=\ref[src];action=create;item=ez5;cost=50'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=l4z;cost=20'>Left 4 Zed</A> <FONT COLOR=blue>(20)</FONT> | <A href='?src=\ref[src];action=create;item=l4z5;cost=100'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=rh;cost=25'>Robust Harvest</A> <FONT COLOR=blue>(25)</FONT> | <A href='?src=\ref[src];action=create;item=rh5;cost=125'>x5</A><BR>"
dat += "Leather<BR>"
dat += "<A href='?src=\ref[src];action=create;item=wallet;cost=100'>Wallet</A> <FONT COLOR=blue>(100)</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=gloves;cost=250'>Botanical gloves</A> <FONT COLOR=blue>(250)</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=tbelt;cost=300'>Utility belt</A> <FONT COLOR=blue>(300)</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=satchel;cost=400'>Leather Satchel</A> <FONT COLOR=blue>(400)</FONT><BR>"
//dat += "Other<BR>"
//dat += "<A href='?src=\ref[src];action=create;item=monkey;cost=500'>Monkey</A> <FONT COLOR=blue>(500)</FONT><BR>"
else
dat += "<BR><FONT COLOR=red>No beaker inside. Please insert a beaker.</FONT><BR>"
if("nopoints")
dat += "You do not have biomass to create products.<BR>Please, put growns into reactor and activate it.<BR>"
dat += "<A href='?src=\ref[src];action=menu'>Return to menu</A>"
if("complete")
dat += "Operation complete.<BR>"
dat += "<A href='?src=\ref[src];action=menu'>Return to menu</A>"
if("void")
dat += "<FONT COLOR=red>Error: No growns inside.</FONT><BR>Please, put growns into reactor.<BR>"
dat += "<A href='?src=\ref[src];action=menu'>Return to menu</A>"
user << browse(dat, "window=biogenerator")
onclose(user, "biogenerator")
return
/obj/machinery/biogenerator/attack_hand(mob/user as mob)
interact(user)
/obj/machinery/biogenerator/proc/activate()
if (usr.stat != 0)
return
if (src.stat != 0) //NOPOWER etc
return
if(src.processing)
usr << "\red The biogenerator is in the process of working."
return
var/S = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents)
S += 5
if(I.reagents.get_reagent_amount("nutriment") < 0.1)
points += 1
else points += I.reagents.get_reagent_amount("nutriment")*10
del(I)
if(S)
processing = 1
update_icon()
updateUsrDialog()
playsound(get_turf(src), 'sound/machines/blender.ogg', 50, 1)
use_power(S*30)
sleep(S+15)
processing = 0
update_icon()
else
menustat = "void"
return
/obj/machinery/biogenerator/proc/create_product(var/item,var/cost)
if(cost > points)
menustat = "nopoints"
return 0
processing = 1
update_icon()
updateUsrDialog()
points -= cost
sleep(30)
switch(item)
if("milk")
beaker.reagents.add_reagent("milk",10)
if("meat")
new/obj/item/weapon/reagent_containers/food/snacks/meat(src.loc)
if("ez")
new/obj/item/nutrient/ez(src.loc)
if("l4z")
new/obj/item/nutrient/l4z(src.loc)
if("rh")
new/obj/item/nutrient/rh(src.loc)
if("ez5") //It's not an elegant method, but it's safe and easy. -Cheridan
new/obj/item/nutrient/ez(src.loc)
new/obj/item/nutrient/ez(src.loc)
new/obj/item/nutrient/ez(src.loc)
new/obj/item/nutrient/ez(src.loc)
new/obj/item/nutrient/ez(src.loc)
if("l4z5")
new/obj/item/nutrient/l4z(src.loc)
new/obj/item/nutrient/l4z(src.loc)
new/obj/item/nutrient/l4z(src.loc)
new/obj/item/nutrient/l4z(src.loc)
new/obj/item/nutrient/l4z(src.loc)
if("rh5")
new/obj/item/nutrient/rh(src.loc)
new/obj/item/nutrient/rh(src.loc)
new/obj/item/nutrient/rh(src.loc)
new/obj/item/nutrient/rh(src.loc)
new/obj/item/nutrient/rh(src.loc)
if("wallet")
new/obj/item/weapon/storage/wallet(src.loc)
if("gloves")
new/obj/item/clothing/gloves/botanic_leather(src.loc)
if("tbelt")
new/obj/item/weapon/storage/belt/utility(src.loc)
if("satchel")
new/obj/item/weapon/storage/backpack/satchel(src.loc)
if("monkey")
new/mob/living/carbon/monkey(src.loc)
processing = 0
menustat = "complete"
update_icon()
return 1
/obj/machinery/biogenerator/Topic(href, href_list)
if(stat & BROKEN) return
if(usr.stat || usr.restrained()) return
if(!in_range(src, usr)) return
usr.set_machine(src)
switch(href_list["action"])
if("activate")
activate()
if("detach")
if(beaker)
beaker.loc = src.loc
beaker = null
update_icon()
if("create")
create_product(href_list["item"],text2num(href_list["cost"]))
if("menu")
menustat = "menu"
/obj/machinery/biogenerator
name = "Biogenerator"
desc = ""
icon = 'icons/obj/biogenerator.dmi'
icon_state = "biogen-stand"
density = 1
anchored = 1
use_power = 1
idle_power_usage = 40
var/processing = 0
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/points = 0
var/menustat = "menu"
New()
..()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
on_reagent_change() //When the reagents change, change the icon as well.
update_icon()
update_icon()
if(!src.beaker)
icon_state = "biogen-empty"
else if(!src.processing)
icon_state = "biogen-stand"
else
icon_state = "biogen-work"
return
/obj/machinery/biogenerator/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, /obj/item/weapon/reagent_containers/glass))
if(beaker)
user << "\red The biogenerator is already loaded."
else
user.before_take_item(O)
O.loc = src
beaker = O
updateUsrDialog()
else if(processing)
user << "\red The biogenerator is currently processing."
else if(istype(O, /obj/item/weapon/storage/bag/plants))
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
if(i >= 10)
user << "\red The biogenerator is already full! Activate it."
else
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
G.loc = src
i++
if(i >= 10)
user << "\blue You fill the biogenerator to its capacity."
break
if(i<10)
user << "\blue You empty the plant bag into the biogenerator."
else if(!istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
user << "\red You cannot put this in [src.name]"
else
var/i = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents)
i++
if(i >= 10)
user << "\red The biogenerator is full! Activate it."
else
user.before_take_item(O)
O.loc = src
user << "\blue You put [O.name] in [src.name]"
update_icon()
return
/obj/machinery/biogenerator/interact(mob/user as mob)
if(stat & BROKEN)
return
user.set_machine(src)
var/dat = "<TITLE>Biogenerator</TITLE>Biogenerator:<BR>"
if (processing)
dat += "<FONT COLOR=red>Biogenerator is processing! Please wait...</FONT>"
else
dat += "Biomass: [points] points.<HR>"
switch(menustat)
if("menu")
if (beaker)
dat += "<A href='?src=\ref[src];action=activate'>Activate Biogenerator!</A><BR>"
dat += "<A href='?src=\ref[src];action=detach'>Detach Container</A><BR><BR>"
dat += "Food<BR>"
dat += "<A href='?src=\ref[src];action=create;item=milk;cost=20'>10 milk</A> <FONT COLOR=blue>(20)</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=meat;cost=50'>Slab of meat</A> <FONT COLOR=blue>(50)</FONT><BR>"
dat += "Nutrient<BR>"
dat += "<A href='?src=\ref[src];action=create;item=ez;cost=10'>E-Z-Nutrient</A> <FONT COLOR=blue>(10)</FONT> | <A href='?src=\ref[src];action=create;item=ez5;cost=50'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=l4z;cost=20'>Left 4 Zed</A> <FONT COLOR=blue>(20)</FONT> | <A href='?src=\ref[src];action=create;item=l4z5;cost=100'>x5</A><BR>"
dat += "<A href='?src=\ref[src];action=create;item=rh;cost=25'>Robust Harvest</A> <FONT COLOR=blue>(25)</FONT> | <A href='?src=\ref[src];action=create;item=rh5;cost=125'>x5</A><BR>"
dat += "Leather<BR>"
dat += "<A href='?src=\ref[src];action=create;item=wallet;cost=100'>Wallet</A> <FONT COLOR=blue>(100)</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=gloves;cost=250'>Botanical gloves</A> <FONT COLOR=blue>(250)</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=tbelt;cost=300'>Utility belt</A> <FONT COLOR=blue>(300)</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=satchel;cost=400'>Leather Satchel</A> <FONT COLOR=blue>(400)</FONT><BR>"
dat += "<A href='?src=\ref[src];action=create;item=cashbag;cost=400'>Cash Bag</A> <FONT COLOR=blue>(400)</FONT><BR>"
//dat += "Other<BR>"
//dat += "<A href='?src=\ref[src];action=create;item=monkey;cost=500'>Monkey</A> <FONT COLOR=blue>(500)</FONT><BR>"
else
dat += "<BR><FONT COLOR=red>No beaker inside. Please insert a beaker.</FONT><BR>"
if("nopoints")
dat += "You do not have biomass to create products.<BR>Please, put growns into reactor and activate it.<BR>"
dat += "<A href='?src=\ref[src];action=menu'>Return to menu</A>"
if("complete")
dat += "Operation complete.<BR>"
dat += "<A href='?src=\ref[src];action=menu'>Return to menu</A>"
if("void")
dat += "<FONT COLOR=red>Error: No growns inside.</FONT><BR>Please, put growns into reactor.<BR>"
dat += "<A href='?src=\ref[src];action=menu'>Return to menu</A>"
user << browse(dat, "window=biogenerator")
onclose(user, "biogenerator")
return
/obj/machinery/biogenerator/attack_hand(mob/user as mob)
interact(user)
/obj/machinery/biogenerator/proc/activate()
if (usr.stat != 0)
return
if (src.stat != 0) //NOPOWER etc
return
if(src.processing)
usr << "\red The biogenerator is in the process of working."
return
var/S = 0
for(var/obj/item/weapon/reagent_containers/food/snacks/grown/I in contents)
S += 5
if(I.reagents.get_reagent_amount("nutriment") < 0.1)
points += 1
else points += I.reagents.get_reagent_amount("nutriment")*10
del(I)
if(S)
processing = 1
update_icon()
updateUsrDialog()
playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
use_power(S*30)
sleep(S+15)
processing = 0
update_icon()
else
menustat = "void"
return
/obj/machinery/biogenerator/proc/create_product(var/item,var/cost)
if(cost > points)
menustat = "nopoints"
return 0
processing = 1
update_icon()
updateUsrDialog()
points -= cost
sleep(30)
switch(item)
if("milk")
beaker.reagents.add_reagent("milk",10)
if("meat")
new/obj/item/weapon/reagent_containers/food/snacks/meat(src.loc)
if("ez")
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
if("l4z")
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
if("rh")
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
if("ez5") //It's not an elegant method, but it's safe and easy. -Cheridan
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
if("l4z5")
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
if("rh5")
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
if("wallet")
new/obj/item/weapon/storage/wallet(src.loc)
if("gloves")
new/obj/item/clothing/gloves/botanic_leather(src.loc)
if("tbelt")
new/obj/item/weapon/storage/belt/utility(src.loc)
if("satchel")
new/obj/item/weapon/storage/backpack/satchel(src.loc)
if("cashbag")
new/obj/item/weapon/storage/bag/cash(src.loc)
if("monkey")
new/mob/living/carbon/monkey(src.loc)
processing = 0
menustat = "complete"
update_icon()
return 1
/obj/machinery/biogenerator/Topic(href, href_list)
if(stat & BROKEN) return
if(usr.stat || usr.restrained()) return
if(!in_range(src, usr)) return
usr.set_machine(src)
switch(href_list["action"])
if("activate")
activate()
if("detach")
if(beaker)
beaker.loc = src.loc
beaker = null
update_icon()
if("create")
create_product(href_list["item"],text2num(href_list["cost"]))
if("menu")
menustat = "menu"
updateUsrDialog()
+1 -1
View File
@@ -1002,5 +1002,5 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/proc/declare_arrest()
var/area/location = get_area(src)
for(var/mob/living/carbon/human/human in world)
if((human.z == src.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security) && !human.blinded)
if((human.z == src.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security) || istype(human.glasses, /obj/item/clothing/glasses/sunglasses/sechud) && !human.blinded)
human << "<span class='info'>\icon[human.glasses] [src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] <b>[target]</b> in <b>[location]</b></span>"
+1 -1
View File
@@ -782,5 +782,5 @@ Auto Patrol: []"},
/obj/machinery/bot/secbot/proc/declare_arrest()
var/area/location = get_area(src)
for(var/mob/living/carbon/human/human in world)
if((human.z == src.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security) && !human.blinded)
if((human.z == src.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security) || istype(human.glasses, /obj/item/clothing/glasses/sunglasses/sechud) && !human.blinded)
human << "<span class='info'>\icon[human.glasses] [src.name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] <b>[target]</b> in <b>[location]</b></span>"
+1
View File
@@ -201,6 +201,7 @@
if(H.mind in ticker.mode.syndicates)
ticker.mode.update_all_synd_icons()
if (H.mind in ticker.mode.cult)
ticker.mode.add_cult_viewpoint(H)
ticker.mode.add_cultist(src.occupant.mind)
ticker.mode.update_all_cult_icons() //So the icon actually appears
if(("\ref[H.mind]" in ticker.mode.implanter) || (H.mind in ticker.mode.implanted))
+1
View File
@@ -107,6 +107,7 @@
data["science_jobs"] = format_jobs(science_positions)
data["security_jobs"] = format_jobs(security_positions)
data["support_jobs"] = format_jobs(support_positions)
data["civilian_jobs"] = format_jobs(civilian_positions)
data["special_jobs"] = format_jobs(whitelisted_positions)
data["centcom_jobs"] = format_jobs(get_all_centcom_jobs())
+1 -1
View File
@@ -343,7 +343,7 @@
return
/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob)
if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (subject.flags & NO_SCAN))
if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (subject.species.flags & NO_SCAN))
scantemp = "Error: Unable to locate valid genetic data."
return
if (subject.brain_op_stage == 4.0)
+5 -2
View File
@@ -199,7 +199,10 @@
else if (href_list["magbot"])
if(src.allowed(usr))
var/mob/living/silicon/robot/R = locate(href_list["magbot"])
if(R)
// whatever weirdness this is supposed to be, but that is how the href gets added, so here it is again
if(istype(R) && istype(usr, /mob/living/silicon) && usr.mind.special_role && (usr.mind.original == usr) && !R.emagged)
var/choice = input("Are you certain you wish to hack [R.name]?") in list("Confirm", "Abort")
if(choice == "Confirm")
if(R && istype(R))
@@ -229,4 +232,4 @@
if(!R.scrambledcodes && !istype(R, /mob/living/silicon/robot/drone))
R.self_destruct()
return
return
+15 -2
View File
@@ -190,8 +190,11 @@
usr << "\red Error: Y is less than 11 or greater than 245."
fail = 1
if(z_co == 2 || z_co < 1 || z_co > 6)
usr << "\red Error: Z is less than 1, greater than 6, or equal to 2."
fail = 1
if (z_co == 7 & src.emagged == 1)
// This should be empty, allows for it to continue if the z-level is 7 and the machine is emagged.
else
usr << "\red Error: Z is less than 1, greater than [src.emagged ? "7" : "6"], or equal to 2."
fail = 1
if(istype(get_area(locate(x_co,y_co,z_co)), /area/security/armoury/gamma))
usr << "\red Error: Attempting to access telescience-protected area."
fail = 1
@@ -238,3 +241,13 @@
s.start()
usr << "\blue Calibration successful."
return
/obj/machinery/computer/telescience/attackby(I as obj, user as mob) //Emagging.
if(istype(I,/obj/item/weapon/card/emag))
if (src.emagged == 0)
user << "\blue You scramble the Telescience authentication key to an unknown signal, you should be able to teleport to more places now!"
src.emagged = 1
else
user << "\red The machine seems unaffected by the card swipe..."
else
return attack_hand(user)
+17 -14
View File
@@ -492,23 +492,26 @@ About the new airlock wires panel:
return wires.IsIndexCut(wireIndex)
/obj/machinery/door/airlock/proc/canAIControl()
return ((src.aiControlDisabled!=1) && (!src.isAllPowerCut()));
return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss()));
/obj/machinery/door/airlock/proc/canAIHack(var/user as mob)
return (isAI(user) && src.aiControlDisabled==1 && !hackProof && !src.isAllPowerCut());
/obj/machinery/door/airlock/proc/canAIHack()
return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss()));
/obj/machinery/door/airlock/proc/arePowerSystemsOn()
if (stat & NOPOWER)
return 0
return (src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0)
/obj/machinery/door/airlock/requiresID()
return !(src.isWireCut(AIRLOCK_WIRE_IDSCAN) || aiDisabledIdScanner)
/obj/machinery/door/airlock/proc/isAllPowerCut()
var/retval=0
/obj/machinery/door/airlock/proc/isAllPowerLoss()
if(stat & NOPOWER)
return 1
if(src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1) || src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2))
if(src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1) || src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2))
retval=1
return retval
return 1
return 0
/obj/machinery/door/airlock/proc/regainMainPower()
if(src.secondsMainPowerLost > 0)
@@ -1102,7 +1105,7 @@ About the new airlock wires panel:
beingcrowbarred = 1 //derp, Agouri
else
beingcrowbarred = 0
if( beingcrowbarred && (density && welded && !operating && src.p_open && (!src.arePowerSystemsOn() || stat & NOPOWER) && !src.locked) )
if( beingcrowbarred && src.p_open && (operating == -1 || (density && welded && operating != 1 && !src.arePowerSystemsOn() && !src.locked)) )
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
if(do_after(user,40))
@@ -1139,7 +1142,7 @@ About the new airlock wires panel:
del(src)
return
else if(arePowerSystemsOn() && !(stat & NOPOWER))
else if(arePowerSystemsOn())
user << "\blue The airlock's motors resist your efforts to force it."
else if(locked)
user << "\blue The airlock's bolts prevent it from being forced."
@@ -1175,7 +1178,7 @@ About the new airlock wires panel:
if( operating || welded || locked )
return 0
if(!forced)
if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) )
if( !arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) )
return 0
use_power(50)
if(forced)
@@ -1203,7 +1206,7 @@ About the new airlock wires panel:
if(operating || welded || locked)
return
if(!forced)
if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS) )
if( !arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS) )
return
if(safe)
for(var/turf/turf in locs)
@@ -1251,7 +1254,7 @@ About the new airlock wires panel:
return
/obj/machinery/door/airlock/proc/lock(var/forced=0)
if (src.locked) return
if (operating || src.locked) return
src.locked = 1
for(var/mob/M in range(1,src))
@@ -1259,9 +1262,9 @@ About the new airlock wires panel:
update_icon()
/obj/machinery/door/airlock/proc/unlock(var/forced=0)
if (!src.locked) return 0
if (operating || !src.locked) return
if(forced || src.arePowerSystemsOn()) //only can raise bolts if power's on
if (forced || (src.arePowerSystemsOn())) //only can raise bolts if power's on
src.locked = 0
for(var/mob/M in range(1,src))
M.show_message("You hear a click from the bottom of the door.", 2)
+9 -3
View File
@@ -9,16 +9,19 @@ obj/machinery/door/airlock
var/cur_command = null //the command the door is currently attempting to complete
obj/machinery/door/airlock/proc/can_radio()
if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_AI_CONTROL) )
if(!arePowerSystemsOn())
return 0
return 1
obj/machinery/door/airlock/process()
..()
execute_current_command()
if (arePowerSystemsOn())
execute_current_command()
obj/machinery/door/airlock/receive_signal(datum/signal/signal)
if (!can_radio()) return
if (!arePowerSystemsOn()) return //no power
if (!can_radio()) return //no radio
if(!signal || signal.encryption) return
@@ -28,6 +31,9 @@ obj/machinery/door/airlock/receive_signal(datum/signal/signal)
execute_current_command()
obj/machinery/door/airlock/proc/execute_current_command()
if(operating)
return //emagged or busy doing something else
if (!cur_command)
return
+277 -241
View File
@@ -6,6 +6,8 @@
icon_state = "hydrotray3"
density = 1
anchored = 1
flags = OPENCONTAINER
var/draw_warnings = 1 //Set to 0 to stop it from drawing the alert lights.
// Plant maintenance vars.
@@ -30,96 +32,104 @@
var/lastcycle = 0 // Cycle timing/tracking var.
var/cycledelay = 150 // Delay per cycle.
var/closed_system // If set, the tray will attempt to take atmos from a pipe.
var/force_update
var/force_update // Set this to bypass the cycle time check.
// Seed details/line data.
var/datum/seed/seed = null // The currently planted seed
// Reagent information for attackby(), consider moving this to a controller along
// Reagent information for process(), consider moving this to a controller along
// with cycle information under 'mechanical concerns' at some point.
// For all following lists, when called in attackby() the relevant value will be increased
// by 1,val if val>0 or decreased by 1,val if val<0.
var/global/list/toxic_reagents = list(
"anti_toxin" = -2,
"toxin" = 2,
"fluorine" = 2.5,
"chlorine" = 1.5,
"sacid" = 1.5,
"pacid" = 3,
"plantbgone" = 3,
"cryoxadone" = -3,
"radium" = 2
"anti_toxin" = -2,
"toxin" = 2,
"fluorine" = 2.5,
"chlorine" = 1.5,
"sacid" = 1.5,
"pacid" = 3,
"plantbgone" = 3,
"cryoxadone" = -3,
"radium" = 2
)
var/global/list/nutrient_reagents = list(
"milk" = 0.1,
"beer" = 0.25,
"phosphorus" = 0.1,
"sugar" = 0.1,
"sodawater" = 0.1,
"ammonia" = 1,
"diethylamine" = 2,
"nutriment" = 1,
"adminordrazine" = 1
"milk" = 0.1,
"beer" = 0.25,
"phosphorus" = 0.1,
"sugar" = 0.1,
"sodawater" = 0.1,
"ammonia" = 1,
"diethylamine" = 2,
"nutriment" = 1,
"adminordrazine" = 1,
"eznutrient" = 1,
"robustharvest" = 1,
"left4zed" = 1
)
var/global/list/weedkiller_reagents = list(
"fluorine" = -4,
"chlorine" = -3,
"phosphorus" = -2,
"sugar" = 2,
"sacid" = -2,
"pacid" = -4,
"plantbgone" = -8,
"fluorine" = -4,
"chlorine" = -3,
"phosphorus" = -2,
"sugar" = 2,
"sacid" = -2,
"pacid" = -4,
"plantbgone" = -8,
"adminordrazine" = -5
)
var/global/list/pestkiller_reagents = list(
"sugar" = 2,
"diethylamine" = -2,
"sugar" = 2,
"diethylamine" = -2,
"adminordrazine" = -5
)
var/global/list/beneficial_reagents = list(
"beer" = -0.05,
"fluorine" = -2,
"chlorine" = -1,
"phosphorus" = -0.75,
"sodawater" = 0.1,
"sacid" = -1,
"pacid" = -2,
"plantbgone" = -2,
"cryoxadone" = 3,
"ammonia" = 0.5,
"diethylamine" = 1,
"nutriment" = 0.5,
"radium" = -1.5,
"adminordrazine" = 1
)
var/global/list/water_reagents = list(
"adminordrazine" = 1,
"milk" = 0.9,
"beer" = 0.7,
"flourine" = -0.5,
"chlorine" = -0.5,
"phosphorus" = -0.5,
"water" = 1,
"sodawater" = 1,
"water" = 1,
"adminordrazine" = 1,
"milk" = 0.9,
"beer" = 0.7,
"flourine" = -0.5,
"chlorine" = -0.5,
"phosphorus" = -0.5,
"water" = 1,
"sodawater" = 1,
)
// Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order).
var/global/list/beneficial_reagents = list(
"beer" = list( -0.05, 0, 0 ),
"fluorine" = list( -2, 0, 0 ),
"chlorine" = list( -1, 0, 0 ),
"phosphorus" = list( -0.75, 0, 0 ),
"sodawater" = list( 0.1, 0, 0 ),
"sacid" = list( -1, 0, 0 ),
"pacid" = list( -2, 0, 0 ),
"plantbgone" = list( -2, 0, 0.2 ),
"cryoxadone" = list( 3, 0, 0 ),
"ammonia" = list( 0.5, 0, 0 ),
"diethylamine" = list( 1, 0, 0 ),
"nutriment" = list( 0.5, 1, 0 ),
"radium" = list( -1.5, 0, 0.2 ),
"adminordrazine" = list( 1, 1, 1 ),
"robustharvest" = list( 0, 0.2, 0 ),
"left4zed" = list( 0, 0, 0.2 )
)
// Mutagen list specifies minimum value for the mutation to take place, rather
// than a bound as the lists above specify.
var/global/list/mutagenic_reagents = list(
"radium" = 8,
"mutagen" = 3
"radium" = list(8,3),
"mutagen" = list(3,8)
)
/obj/machinery/portable_atmospherics/hydroponics/New()
..()
create_reagents(200)
connect()
update_icon()
if(closed_system)
flags &= ~OPENCONTAINER
/obj/machinery/portable_atmospherics/hydroponics/bullet_act(var/obj/item/projectile/Proj)
//Don't act on seeds like dionaea that shouldn't change.
if(seed && seed.immutable)
if(seed && seed.immutable > 0)
return
//Override for somatoray projectiles.
@@ -142,12 +152,14 @@
/obj/machinery/portable_atmospherics/hydroponics/process()
//Do this even if we're not ready for a plant cycle.
process_reagents()
// Update values every cycle rather than every process() tick.
if(force_update)
force_update = 0
else if(world.time < (lastcycle + cycledelay))
return
lastcycle = world.time
// Weeds like water and nutrients, there's a chance the weed population will increase.
@@ -169,6 +181,11 @@
// Advance plant age.
if(prob(25)) age += 1 * HYDRO_SPEED_MULTIPLIER
//Highly mutable plants have a chance of mutating every tick.
if(seed.immutable == -1)
var/mut_prob = rand(1,100)
if(mut_prob <= 5) mutate(mut_prob == 1 ? 2 : 1)
// Maintain tray nutrient and water levels.
if(seed.nutrient_consumption > 0 && nutrilevel > 0 && prob(25))
nutrilevel -= max(0,seed.nutrient_consumption * HYDRO_SPEED_MULTIPLIER)
@@ -197,8 +214,22 @@
if(!environment)
if(istype(T))
environment = T.return_air()
if(!environment) //We're in a crate or nullspace, bail out.
return
if(!environment) return
/*
// Handle gas consumption.
if(seed.consume_gasses && seed.consume_gasses.len)
var/missing_gas = 0
for(var/gas in seed.consume_gasses)
if(environment && environment.gas && environment.gas[gas] && \
environment.gas[gas] >= seed.consume_gasses[gas])
environment.adjust_gas(gas,-seed.consume_gasses[gas],1)
else
missing_gas++
if(missing_gas > 0)
health -= missing_gas * HYDRO_SPEED_MULTIPLIER
// Process it.
var/pressure = environment.return_pressure()
@@ -208,6 +239,13 @@
if(abs(environment.temperature - seed.ideal_heat) > seed.heat_tolerance)
health -= healthmod
// Handle gas production.
if(seed.exude_gasses && seed.exude_gasses.len)
for(var/gas in seed.exude_gasses)
environment.adjust_gas(gas, max(1,round((seed.exude_gasses[gas]*seed.potency)/seed.exude_gasses.len)))
*/
// Handle light requirements.
var/area/A = T.loc
if(A)
@@ -257,17 +295,73 @@
pestlevel = 0
// If enough time (in cycles, not ticks) has passed since the plant was harvested, we're ready to harvest again.
else if(age > seed.production && (age - lastproduce) > seed.production && (!harvest && !dead))
else if(seed.products && seed.products.len && age > seed.production && \
(age - lastproduce) > seed.production && (!harvest && !dead))
harvest = 1
lastproduce = age
if(prob(5)) // On each tick, there's a 5 percent chance the pest population will increase
if(prob(3)) // On each tick, there's a chance the pest population will increase
pestlevel += 1 * HYDRO_SPEED_MULTIPLIER
check_level_sanity()
update_icon()
return
//Process reagents being input into the tray.
/obj/machinery/portable_atmospherics/hydroponics/proc/process_reagents()
if(!reagents) return
if(reagents.total_volume <= 0)
return
for(var/datum/reagent/R in reagents.reagent_list)
var/reagent_total = reagents.get_reagent_amount(R.id)
if(seed && !dead)
//Handle some general level adjustments.
if(toxic_reagents[R.id])
toxins += toxic_reagents[R.id] * reagent_total
if(weedkiller_reagents[R.id])
weedlevel += weedkiller_reagents[R.id] * reagent_total
if(pestkiller_reagents[R.id])
pestlevel += pestkiller_reagents[R.id] * reagent_total
// Beneficial reagents have a few impacts along with health buffs.
if(beneficial_reagents[R.id])
health += beneficial_reagents[R.id][1] * reagent_total
yield_mod += beneficial_reagents[R.id][2] * reagent_total
mutation_mod += beneficial_reagents[R.id][3] * reagent_total
// Mutagen is distinct from the previous types and mostly has a chance of proccing a mutation.
if(mutagenic_reagents[R.id])
var/reagent_min_value = mutagenic_reagents[R.id][1]
var/reagent_value = mutagenic_reagents[R.id][2]+mutation_mod
if(reagent_total >= reagent_min_value)
if(prob(min(reagent_total*reagent_value,100)))
mutate(reagent_total > 10 ? 2 : 1)
// Handle nutrient refilling.
if(nutrient_reagents[R.id])
nutrilevel += nutrient_reagents[R.id] * reagent_total
// Handle water and water refilling.
var/water_added = 0
if(water_reagents[R.id])
var/water_input = water_reagents[R.id] * reagent_total
water_added += water_input
waterlevel += water_input
if(water_added > 0)
toxins -= round(water_added/4)
reagents.clear_reagents()
check_level_sanity()
update_icon()
//Harvests the product of a plant.
/obj/machinery/portable_atmospherics/hydroponics/proc/harvest(var/mob/user)
@@ -280,6 +374,10 @@
return
seed.harvest(user,yield_mod)
//Increases harvest count for round-end score
//Currently per-plant (not per-item) harvested
// --FalseIncarnate
score_stuffharvested++
// Reset values.
harvest = 0
@@ -420,7 +518,6 @@
weedlevel = max(0,min(weedlevel,10))
toxins = max(0,min(toxins,10))
/obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species()
var/previous_plant = seed.display_name
@@ -445,6 +542,79 @@
/obj/machinery/portable_atmospherics/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
//--FalseIncarnate
//Check if held item is an open container
if (O.is_open_container())
//Check if container is of the "glass" subtype (includes buckets, beakers, vials)
if(istype(O, /obj/item/weapon/reagent_containers/glass))
var/obj/item/weapon/reagent_containers/glass/C = O
//Check if container is empty
if(!C.reagents.total_volume)
user << "\red [C] is empty."
return
//Container not empty, transfer contents to tray
var/trans = C.reagents.trans_to(src, C.amount_per_transfer_from_this)
user << "\blue You transfer [trans] units of the solution to [src]."
check_level_sanity()
process_reagents()
update_icon()
//Check if container is one of the botany sprays (defined in hydro_tools.dm)
else if(istype(O, /obj/item/weapon/plantspray))
//Check if spray is pest-spray
if(istype(O, /obj/item/weapon/plantspray/pests))
var/obj/item/weapon/plantspray/P = O
user.drop_item(O)
toxins += P.toxicity
pestlevel -= P.pest_kill_str
weedlevel -= P.weed_kill_str
user << "You spray [src] with [O]."
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
del(O)
check_level_sanity()
update_icon()
//Check if spray is weed-spray (un-obtainable, fixed for possible repurposing?)
else if(istype(O, /obj/item/weapon/plantspray/weeds))
var/obj/item/weapon/plantspray/W = O
user.drop_item(O)
toxins += W.toxicity
pestlevel -= W.pest_kill_str
weedlevel -= W.weed_kill_str
user << "You spray [src] with [O]."
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
del(O)
check_level_sanity()
update_icon()
//Check if container is Plant-B-Gone spray (doesn't work with other sprays, may add in future)
else if (istype(O, /obj/item/weapon/reagent_containers/spray/plantbgone))
//Check if there is a plant in the tray
if(seed)
health -= rand(5,20)
if(pestlevel > 0)
pestlevel -= 2
if(weedlevel > 0)
weedlevel -= 3
toxins += 4
check_level_sanity()
visible_message("\red <B>\The [src] has been sprayed with \the [O][(user ? " by [user]." : ".")]")
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
update_icon()
else
user << "There's nothing in [src] to spray!"
//--FalseIncarnate
//Held item is not an open container, check to see if it can be used (this code was already here) --FalseIncarnate
if(istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/weapon/scalpel))
if(!seed)
@@ -460,153 +630,23 @@
return
else if (istype(O, /obj/item/weapon/reagent_containers/glass))
var/b_amount = O.reagents.get_reagent_amount("water")
if(b_amount > 0 && waterlevel < 100)
if(b_amount + waterlevel > 100)
b_amount = 100 - waterlevel
O.reagents.remove_reagent("water", b_amount)
waterlevel += b_amount
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
user << "You fill \the [src] with [round(b_amount,0.1)] units of water."
// The more water you put in, the more diluted the toxins become.
toxins -= round(b_amount/4)
else if(waterlevel >= 100)
user << "\red \The [src] is already full."
else
user << "\red \The [O] is not filled with water."
check_level_sanity()
update_icon()
// Nutrient fluid replacement. TODO: Consider rolling this into a proper reagent-processing proc.
else if ( istype(O, /obj/item/nutrient) )
var/obj/item/nutrient/nutrient = O
user.u_equip(O)
nutrilevel = 10
yield_mod = nutrient.yieldmod
mutation_mod = nutrient.mutmod
user << "You replace the nutrient solution in the [src]."
del(O)
update_icon()
// Syringe stuff
else if(istype(O, /obj/item/weapon/reagent_containers/syringe))
var/obj/item/weapon/reagent_containers/syringe/S = O
if(seed)
// Injecting into the plant.
if (S.mode == 1)
if(!S.reagents.total_volume)
user << "\red [O] is empty."
return
user << "\red You inject the [seed.display_name] with a chemical solution."
// Uuuuuugh this whole chunk is going to be awful. TODO: condense it down somehow.
// Run through the various reagents in the lists and apply their effects as needed.
for(var/datum/reagent/R in S.reagents.reagent_list)
var/reagent_value = 0
if(toxic_reagents[R.id])
reagent_value = toxic_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
toxins += reagent_value
else
toxins += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
toxins += reagent_value
else
toxins -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
if(nutrient_reagents[R.id])
reagent_value = nutrient_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
nutrilevel += reagent_value
else
nutrilevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
nutrilevel += reagent_value
else
nutrilevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
if(weedkiller_reagents[R.id])
reagent_value = weedkiller_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
weedlevel += reagent_value
else
weedlevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
weedlevel += reagent_value
else
weedlevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
if(pestkiller_reagents[R.id])
reagent_value = pestkiller_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
pestlevel += reagent_value
else
pestlevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
pestlevel += reagent_value
else
pestlevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
if(beneficial_reagents[R.id])
reagent_value = beneficial_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
health += reagent_value
else
health += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
health += reagent_value
else
health -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
if(water_reagents[R.id])
reagent_value = water_reagents[R.id]
if(reagent_value > 0)
if(reagent_value < 1)
waterlevel += reagent_value
else
waterlevel += round(S.reagents.get_reagent_amount(R.id)*rand(1,reagent_value))
else
if(reagent_value > -1)
waterlevel += reagent_value
else
waterlevel -= abs(round(S.reagents.get_reagent_amount(R.id)*rand(1,abs(reagent_value))))
// Mutagen is distinct from the previous types and mostly has a chance of proccing a mutation.
if(mutagenic_reagents[R.id])
var/reagent_total = S.reagents.get_reagent_amount(R.id)
reagent_value = mutagenic_reagents[R.id]+mutation_mod
if(reagent_total >= reagent_value)
if(prob(min(reagent_total*reagent_value,100)))
mutate(reagent_total > 10 ? 2 : 1)
S.reagents.clear_reagents()
if (S.mode == 1)
if(seed)
return ..()
else
user << "You can't get any extract out of this plant."
user << "There's no plant in the tray to inject."
return 1
else
user << "There's nothing to inject the solution into."
check_level_sanity()
update_icon()
if(seed)
//Leaving this in in case we want to extract from plants later.
user << "You can't get any extract out of this plant."
else
user << "There's nothing in the tray to draw something from."
return 1
else if (istype(O, /obj/item/seeds))
@@ -638,6 +678,7 @@
age = 1
//Snowflakey, maybe move this to the seed datum
health = (istype(S, /obj/item/seeds/cutting) ? round(seed.endurance/rand(2,5)) : seed.endurance)
lastcycle = world.time
del(O)
@@ -648,26 +689,6 @@
else
user << "\red \The [src] already has seeds in it!"
else if (istype(O, /obj/item/weapon/reagent_containers/spray/plantbgone))
if(seed)
health -= rand(5,20)
if(pestlevel > 0)
pestlevel -= 2
if(weedlevel > 0)
weedlevel -= 3
toxins += 4
check_level_sanity()
visible_message("\red <B>\The [src] has been sprayed with \the [O][(user ? " by [user]." : ".")]")
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
update_icon()
else
user << "There's nothing in [src] to spray!"
else if (istype(O, /obj/item/weapon/minihoe)) // The minihoe
//var/deweeding
if(weedlevel > 0)
@@ -687,20 +708,6 @@
return
S.handle_item_insertion(G, 1)
else if ( istype(O, /obj/item/weapon/plantspray) )
var/obj/item/weapon/plantspray/spray = O
user.drop_item(O)
toxins += spray.toxicity
pestlevel -= spray.pest_kill_str
weedlevel -= spray.weed_kill_str
user << "You spray [src] with [O]."
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
del(O)
check_level_sanity()
update_icon()
else if(istype(O, /obj/item/weapon/wrench))
//If there's a connector here, the portable_atmospherics setup can handle it.
@@ -757,7 +764,31 @@
usr << "[src] is \red filled with weeds!"
if(pestlevel >= 5)
usr << "[src] is \red filled with tiny worms!"
usr << text ("")
if(!istype(src,/obj/machinery/portable_atmospherics/hydroponics/soil))
var/turf/T = loc
var/datum/gas_mixture/environment
if(closed_system && (connected_port || holding))
environment = air_contents
if(!environment)
if(istype(T))
environment = T.return_air()
if(!environment) //We're in a crate or nullspace, bail out.
return
var/area/A = T.loc
var/light_available
if(A)
if(A.lighting_use_dynamic)
light_available = max(0,min(10,T.lighting_lumcount)-5)
else
light_available = 5
usr << "The tray's sensor suite is reporting a light level of [light_available] lumens and a temperature of [environment.temperature]K."
/obj/machinery/portable_atmospherics/hydroponics/verb/close_lid()
set name = "Toggle Tray Lid"
@@ -769,6 +800,11 @@
closed_system = !closed_system
usr << "You [closed_system ? "close" : "open"] the tray's lid."
if(closed_system)
flags &= ~OPENCONTAINER
else
flags |= OPENCONTAINER
update_icon()
/obj/machinery/portable_atmospherics/hydroponics/soil
+35 -3
View File
@@ -96,7 +96,7 @@
nanomanager.update_uis(src)
else if(istype(O, /obj/item/weapon/storage/bag/plants))
else if(istype(O, /obj/item/weapon/storage/bag/plants) || istype(O, /obj/item/weapon/storage/belt/medical))
var/obj/item/weapon/storage/bag/plants/P = O
var/plants_loaded = 0
for(var/obj/G in P.contents)
@@ -121,6 +121,7 @@
nanomanager.update_uis(src)
else
user << "<span class='notice'>\The [src] smartly refuses [O].</span>"
return 1
@@ -138,6 +139,39 @@
ui_interact(user)
//Drag pill bottle to fridge to empty it into the fridge
/obj/machinery/smartfridge/MouseDrop_T(obj/over_object as obj, mob/user as mob)
if(!istype(over_object, /obj/item/weapon/storage/pill_bottle)) //Only pill bottles, please
return
if(!src.ispowered)
user << "<span class='notice'>\The [src] is unpowered and useless.</span>"
return
var/obj/item/weapon/storage/box/pillbottles/P = over_object
var/items_loaded = 0
for(var/obj/G in P.contents)
if(accept_check(G))
if(contents.len >= max_n_of_items)
user << "<span class='notice'>\The [src] is full.</span>"
return 1
else
P.remove_from_storage(G,src)
if(item_quants[G.name])
item_quants[G.name]++
else
item_quants[G.name] = 1
items_loaded++
if(items_loaded)
user.visible_message( \
"<span class='notice'>[user] empties \the [P] into \the [src].</span>", \
"<span class='notice'>You empty \the [P] into \the [src].</span>")
if(P.contents.len > 0)
user << "<span class='notice'>Some items are refused.</span>"
nanomanager.update_uis(src)
updateUsrDialog()
/*******************
* SmartFridge Menu
********************/
@@ -201,5 +235,3 @@
return 0
+310
View File
@@ -0,0 +1,310 @@
/obj/machinery/syndicatebomb
icon = 'icons/obj/assemblies.dmi'
name = "syndicate bomb"
icon_state = "syndicate-bomb"
desc = "A large and menacing device. Can be bolted down with a wrench."
anchored = 0
density = 0
layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS
unacidable = 1
var/datum/wires/syndicatebomb/wires = null
var/timer = 60
var/open_panel = 0 //are the wires exposed?
var/active = 0 //is the bomb counting down?
var/defused = 0 //is the bomb capable of exploding?
var/obj/item/weapon/bombcore/payload = /obj/item/weapon/bombcore/
var/beepsound = 'sound/items/timer.ogg'
/obj/machinery/syndicatebomb/process()
if(active && !defused && (timer > 0)) //Tick Tock
var/volume = (timer <= 10 ? 30 : 5) // Tick louder when the bomb is closer to being detonated.
playsound(loc, beepsound, volume, 0)
timer--
if(active && !defused && (timer <= 0)) //Boom
active = 0
timer = 60
update_icon()
if(payload in src)
payload.detonate()
return
if(!active || defused) //Counter terrorists win
if(defused && payload in src)
payload.defuse()
return
/obj/machinery/syndicatebomb/New()
wires = new(src)
payload = new payload(src)
update_icon()
..()
/obj/machinery/syndicatebomb/examine()
..()
usr << "A digital display on it reads \"[timer]\"."
/obj/machinery/syndicatebomb/update_icon()
icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]"
/obj/machinery/syndicatebomb/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/weapon/wrench))
if(!anchored)
if(!isturf(src.loc) || istype(src.loc, /turf/space))
user << "<span class='notice'>The bomb must be placed on solid ground to attach it</span>"
else
user << "<span class='notice'>You firmly wrench the bomb to the floor</span>"
playsound(loc, 'sound/items/ratchet.ogg', 50, 1)
anchored = 1
if(active)
user << "<span class='notice'>The bolts lock in place</span>"
else
if(!active)
user << "<span class='notice'>You wrench the bomb from the floor</span>"
playsound(loc, 'sound/items/ratchet.ogg', 50, 1)
anchored = 0
else
user << "<span class='warning'>The bolts are locked down!</span>"
else if(istype(I, /obj/item/weapon/screwdriver))
open_panel = !open_panel
update_icon()
user << "<span class='notice'>You [open_panel ? "open" : "close"] the wire panel.</span>"
else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler ))
if(open_panel)
wires.Interact(user)
else if(istype(I, /obj/item/weapon/crowbar))
if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE))
if(payload)
user << "<span class='notice'>You carefully pry out [payload].</span>"
payload.loc = user.loc
payload = null
else
user << "<span class='notice'>There isn't anything in here to remove!</span>"
else if (open_panel)
user << "<span class='notice'>The wires conneting the shell to the explosives are holding it down!</span>"
else
user << "<span class='notice'>The cover is screwed on, it won't pry off!</span>"
else if(istype(I, /obj/item/weapon/bombcore))
if(!payload)
payload = I
user << "<span class='notice'>You place [payload] into [src].</span>"
user.drop_item()
payload.loc = src
else
user << "<span class='notice'>[payload] is already loaded into [src], you'll have to remove it first.</span>"
else
..()
/obj/machinery/syndicatebomb/attack_hand(var/mob/user)
interact(user)
/obj/machinery/syndicatebomb/attack_ai()
return
/obj/machinery/syndicatebomb/interact(var/mob/user)
if(wires)
wires.Interact(user)
if(!open_panel)
if(!active)
spawn()
settings(user)
return
else if(anchored)
user << "<span class='notice'>The bomb is bolted to the floor!</span>"
return
/obj/machinery/syndicatebomb/proc/settings(var/mob/user)
var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num
newtime = Clamp(newtime, 60, 60000)
if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station
timer = newtime
src.loc.visible_message("<span class='notice'>\icon[src] timer set for [timer] seconds.</span>")
if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user))
if(defused || active)
if(defused)
src.loc.visible_message("<span class='notice'>\icon[src] Device error: User intervention required.</span>")
return
else
src.loc.visible_message("<span class='danger'>\icon[src] [timer] seconds until detonation, please clear the area.</span>")
playsound(loc, 'sound/machines/click.ogg', 30, 1)
active = 1
update_icon()
add_fingerprint(user)
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
if(payload && !istype(payload, /obj/item/weapon/bombcore/training))
message_admins("[key_name(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> has primed a [name] ([payload]) for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
payload.adminlog = "The [src.name] that [key_name(user)] had primed detonated!"
/obj/machinery/syndicatebomb/proc/isWireCut(var/index)
return wires.IsIndexCut(index)
///Bomb Subtypes///
/obj/machinery/syndicatebomb/training
name = "training bomb"
icon_state = "training-bomb"
desc = "A salvaged syndicate device gutted of its explosives to be used as a training aid for aspiring bomb defusers."
payload = /obj/item/weapon/bombcore/training/
/obj/machinery/syndicatebomb/badmin
name = "generic summoning badmin bomb"
desc = "Oh god what is in this thing?"
payload = /obj/item/weapon/bombcore/badmin/summon/
/obj/machinery/syndicatebomb/badmin/clown
name = "clown bomb"
icon_state = "clown-bomb"
desc = "HONK."
payload = /obj/item/weapon/bombcore/badmin/summon/clown
beepsound = 'sound/items/bikehorn.ogg'
/obj/machinery/syndicatebomb/badmin/varplosion
payload = /obj/item/weapon/bombcore/badmin/explosion/
///Bomb Cores///
/obj/item/weapon/bombcore
name = "bomb payload"
desc = "A powerful secondary explosive of syndicate design and unknown composition, it should be stable under normal conditions..."
icon = 'icons/obj/assemblies.dmi'
icon_state = "bombcore"
item_state = "eshield0"
w_class = 3.0
origin_tech = "syndicate=6;combat=5"
var/adminlog = null
/obj/item/weapon/bombcore/ex_act(severity) //Little boom can chain a big boom
src.detonate()
/obj/item/weapon/bombcore/proc/detonate()
if(adminlog)
message_admins(adminlog)
log_game(adminlog)
explosion(get_turf(src),2,5,11)
del(src)
/obj/item/weapon/bombcore/proc/defuse()
//Note: Because of how var/defused is used you shouldn't override this UNLESS you intend to set the var to 0 or
// otherwise remove the core/reset the wires before the end of defuse(). It will repeatedly be called otherwise.
///Bomb Core Subtypes///
/obj/item/weapon/bombcore/training
name = "dummy payload"
desc = "A nanotrasen replica of a syndicate payload. Its not intended to explode but to announce that it WOULD have exploded, then rewire itself to allow for more training."
origin_tech = null
var/defusals = 0
var/attempts = 0
/obj/item/weapon/bombcore/training/proc/reset()
var/obj/machinery/syndicatebomb/holder = src.loc
if(istype(holder))
if(holder.wires)
holder.wires.Shuffle()
holder.defused = 0
holder.open_panel = 0
holder.update_icon()
holder.updateDialog()
/obj/item/weapon/bombcore/training/detonate()
var/obj/machinery/syndicatebomb/holder = src.loc
if(istype(holder))
attempts++
holder.loc.visible_message("<span class='danger'>\icon[holder] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...</span>")
reset()
else
del(src)
/obj/item/weapon/bombcore/training/defuse()
var/obj/machinery/syndicatebomb/holder = src.loc
if(istype(holder))
attempts++
defusals++
holder.loc.visible_message("<span class='notice'>\icon[holder] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds...</span>")
sleep(50) //Just in case someone is trying to remove the bomb core this gives them a little window to crowbar it out
if(istype(holder))
reset()
/obj/item/weapon/bombcore/badmin
name = "badmin payload"
desc = "If you're seeing this someone has either made a mistake or gotten dangerously savvy with var editing!"
origin_tech = null
/obj/item/weapon/bombcore/badmin/defuse() //because we wouldn't want them being harvested by players
var/obj/machinery/syndicatebomb/B = src.loc
del(B)
del(src)
/obj/item/weapon/bombcore/badmin/summon/
var/summon_path = /obj/item/weapon/reagent_containers/food/snacks/cookie
var/amt_summon = 1
/obj/item/weapon/bombcore/badmin/summon/detonate()
var/obj/machinery/syndicatebomb/B = src.loc
for(var/i = 0; i < amt_summon; i++)
var/atom/movable/X = new summon_path
X.loc = get_turf(src)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(X, pick(NORTH,SOUTH,EAST,WEST))
del(B)
del(src)
/obj/item/weapon/bombcore/badmin/summon/clown
summon_path = /mob/living/simple_animal/hostile/retaliate/clown
amt_summon = 100
/obj/item/weapon/bombcore/badmin/summon/clown/defuse()
playsound(src.loc, 'sound/misc/sadtrombone.ogg', 50)
..()
/obj/item/weapon/bombcore/badmin/explosion/
var/HeavyExplosion = 2
var/MediumExplosion = 5
var/LightExplosion = 11
/obj/item/weapon/bombcore/badmin/explosion/detonate()
explosion(get_turf(src),HeavyExplosion,MediumExplosion,LightExplosion)
///Syndicate Detonator (aka the big red button)///
/obj/item/device/syndicatedetonator
name = "big red button"
desc = "Nothing good can come of pressing a button this garish..."
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
item_state = "electronic"
w_class = 1.0
origin_tech = "syndicate=2"
var/cooldown = 0
var/detonated = 0
var/existant = 0
/obj/item/device/syndicatedetonator/attack_self(mob/user as mob)
if(!cooldown)
for(var/obj/machinery/syndicatebomb/B in machines)
if(B.active)
B.timer = 0
detonated++
existant++
playsound(user, 'sound/machines/click.ogg', 20, 1)
user << "<span class='notice'>[existant] found, [detonated] triggered.</span>"
if(detonated)
var/turf/T = get_turf(src)
var/area/A = get_area(T)
detonated--
var/log_str = "[key_name(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>."
bombers += log_str
message_admins(log_str)
log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name]([T.x],[T.y],[T.z])")
detonated = 0
existant = 0
cooldown = 1
spawn(30) cooldown = 0
+16 -2
View File
@@ -113,8 +113,11 @@
var/turf/T = get_turf(R)
if (!T)
continue
if(T.z == 2 || T.z > 7)
continue
if(T.z == 2 || T.z > 6)
if (T.z == 7 & src.emagged == 1)
// This should be empty, allows for it to continue if the z-level is 7 and the machine.
else
continue
var/tmpname = T.loc.name
if(areaindex[tmpname])
tmpname = "[tmpname] ([++areaindex[tmpname]])"
@@ -401,3 +404,14 @@
/atom/proc/laserhit(L as obj)
return 1
/obj/machinery/computer/teleporter/attackby(I as obj, user as mob) //Emagging.
if(istype(I,/obj/item/weapon/card/emag))
if (src.emagged == 0)
user << "\blue You scramble the Teleporter's circuits. You should be able to teleport to more places now!"
src.emagged = 1
else
user << "\red The machine seems unaffected by the card swipe..."
else
return attack_hand(user)
+2 -2
View File
@@ -801,7 +801,7 @@
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
icon_state = "nutri"
icon_deny = "nutri-deny"
products = list(/obj/item/nutrient/ez = 35,/obj/item/nutrient/l4z = 25,/obj/item/nutrient/rh = 15,/obj/item/weapon/plantspray/pests = 20,
products = list(/obj/item/weapon/reagent_containers/glass/fertilizer/ez = 35,/obj/item/weapon/reagent_containers/glass/fertilizer/l4z = 25,/obj/item/weapon/reagent_containers/glass/fertilizer/rh = 15,/obj/item/weapon/plantspray/pests = 20,
/obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/storage/bag/plants = 5)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
@@ -862,7 +862,7 @@
/obj/item/clothing/under/sexyclown = 1,/obj/item/clothing/mask/gas/sexymime = 1,/obj/item/clothing/under/sexymime = 1,/obj/item/clothing/suit/apron/overalls = 1,
/obj/item/clothing/head/rabbitears =1) //Pretty much everything that had a chance to spawn.
contraband = list(/obj/item/clothing/suit/cardborg = 1,/obj/item/clothing/head/cardborg = 1,/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1)
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1)
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1)
refill_canister = /obj/item/weapon/vending_refill/autodrobe
/obj/machinery/vending/dinnerware
name = "Dinnerware"
+11 -10
View File
@@ -5,8 +5,8 @@
initial_icon = "gygax"
step_in = 3
dir_in = 1 //Facing North.
health = 300
deflect_chance = 15
health = 250
deflect_chance = 5
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
max_temperature = 25000
infra_luminosity = 6
@@ -17,6 +17,7 @@
max_equip = 3
maxsize = 1
force = 10
step_energy_drain = 3
/obj/mecha/combat/gygax/loaded/New()
..()
@@ -27,25 +28,25 @@
return
/obj/mecha/combat/gygax/dark
desc = "A lightweight exosuit used by Nanotrasen Death Squads. A significantly upgraded Gygax security mech."
desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications."
name = "Dark Gygax"
icon_state = "darkgygax"
initial_icon = "darkgygax"
health = 400
deflect_chance = 25
health = 300
deflect_chance = 15
damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8)
max_temperature = 45000
max_temperature = 35000
overload_coeff = 1
operation_req_access = list(access_syndicate)
wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark
max_equip = 4
maxsize = 2
step_energy_drain = 5
/obj/mecha/combat/gygax/dark/New()
/obj/mecha/combat/gygax/dark/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter
ME.attach(src)
+17 -1
View File
@@ -43,7 +43,23 @@
operation_req_access = list(access_syndicate)
wreckage = /obj/effect/decal/mecha_wreckage/mauler
/obj/mecha/combat/marauder/New()
/obj/mecha/combat/marauder/mauler/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
src.smoke_system.set_up(3, 0, src)
src.smoke_system.attach(src)
return
/obj/mecha/combat/marauder/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
ME.attach(src)
+43 -11
View File
@@ -52,10 +52,10 @@
fire_sound = 'sound/weapons/Laser.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
equip_cooldown = 15
equip_cooldown = 10
name = "CH-LC \"Solaris\" Laser Cannon"
icon_state = "mecha_laser"
energy_drain = 50
energy_drain = 40
projectile = /obj/item/projectile/beam/heavylaser
fire_sound = 'sound/weapons/lasercannonfire.ogg'
@@ -201,13 +201,45 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
name = "\improper FNX-66 Carbine"
name = "FNX-66 Carbine"
icon_state = "mecha_carbine"
equip_cooldown = 5
projectile = /obj/item/projectile/bullet/incendiary/mech
projectiles = 12
projectile = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath
fire_sound = 'sound/weapons/Gunshot.ogg'
projectiles = 24
projectile_energy_cost = 15
var/projectiles_per_shot = 1
var/deviation = 0.0
action(atom/target)
if(!action_checks(target)) return
var/turf/targloc = get_turf(target)
var/target_x = targloc.x
var/target_y = targloc.y
var/target_z = targloc.z
targloc = null
spawn for(var/i=1 to min(projectiles, projectiles_per_shot))
if(!chassis) break
var/turf/curloc = get_turf(chassis)
targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
if (!targloc || !curloc)
continue
if (targloc == curloc)
continue
playsound(chassis, fire_sound, 50, 1)
var/obj/item/projectile/A = new projectile(curloc)
src.projectiles--
A.original = target
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
A.process()
sleep(2)
set_ready_state(0)
log_message("Fired from [src.name], targeting [target].")
do_after_cooldown()
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
name = "\improper S.H.H. \"Quietus\" Carbine"
@@ -222,7 +254,7 @@
name = "LBX AC 10 \"Scattershot\""
icon_state = "mecha_scatter"
equip_cooldown = 20
projectile = /obj/item/projectile/bullet/midbullet10
projectile = /obj/item/projectile/bullet/midbullet12
fire_sound = 'sound/weapons/Gunshot.ogg'
projectiles = 40
projectile_energy_cost = 25
@@ -263,7 +295,7 @@
equip_cooldown = 10
projectile = /obj/item/projectile/bullet/weakbullet
fire_sound = 'sound/weapons/Gunshot.ogg'
projectiles = 50
projectiles = 300
projectile_energy_cost = 20
var/projectiles_per_shot = 3
var/deviation = 0.3
@@ -299,11 +331,11 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
name = "SRM-4 Missile Rack"
name = "SRM-8 Missile Rack"
icon_state = "mecha_missilerack"
projectile = /obj/item/missile
fire_sound = 'sound/effects/bang.ogg'
projectiles = 4
projectiles = 8
projectile_energy_cost = 1000
equip_cooldown = 60
var/missile_speed = 2
@@ -331,7 +363,7 @@
throw_impact(atom/hit_atom)
if(primed)
explosion(hit_atom,1,2,2)
explosion(hit_atom, 0, 0, 2, 4)
del(src)
else
..()
@@ -345,7 +377,7 @@
projectiles = 6
missile_speed = 1.5
projectile_energy_cost = 800
equip_cooldown = 150
equip_cooldown = 60
var/det_time = 20
size=1
action(target)
+5 -2
View File
@@ -1,6 +1,7 @@
/obj/item
name = "item"
icon = 'icons/obj/items.dmi'
var/discrete = 0 // used in item_attack.dm to make an item not show an attack message to viewers
var/icon/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
var/blood_overlay_color = null
var/abstract = 0
@@ -153,10 +154,12 @@
return 0
else
user.u_equip(src)
else
if(isliving(src.loc))
return 0
user.next_move = max(user.next_move+2,world.time + 2)
src.pickup(user)
add_fingerprint(user)
user.put_in_active_hand(src)
@@ -616,10 +619,10 @@
var/datum/organ/internal/eyes/eyes = H.internal_organs_by_name["eyes"]
if(!eyes)
return
eyes.damage += rand(3,4)
eyes.take_damage(rand(3,4), 1)
if(eyes.damage >= eyes.min_bruised_damage)
if(M.stat != 2)
if(eyes.robotic <= 1) //robot eyes bleeding might be a bit silly
if(!(istype(eyes, /datum/organ/internal/eyes/robotic)) || istype(eyes, /datum/organ/internal/eyes/assisted)) //robot eyes bleeding might be a bit silly
M << "\red Your eyes start to bleed profusely!"
if(prob(50))
if(M.stat != 2)
+1 -1
View File
@@ -121,7 +121,7 @@ move an amendment</a> to the drawing.</p>
return
var/area/A = new
A.name = str
A.tag="[A.type]_[md5(str)]" // without this dynamic light system ruin everithing
A.tagbase="[A.type]_[md5(str)]" // without this dynamic light system ruins everything
//var/ma
//ma = A.master ? "[A.master]" : "(null)"
//world << "DEBUG: create_area: <br>A.name=[A.name]<br>A.tag=[A.tag]<br>A.master=[ma]"
@@ -0,0 +1,5 @@
/obj/item/device/pipe_freezer
name = "Pipe Freezer"
icon = 'icons/obj/items.dmi'
icon_state = "pipe_freezer"
item_state = "flight"
@@ -48,6 +48,18 @@
del(src)
return
/obj/item/device/radio/beacon/syndicate/bomb
name = "suspicious beacon"
desc = "A label on it reads: <i>Warning: Activating this device will send a high-ordinance explosive to your location</i>."
origin_tech = "bluespace=1;syndicate=7"
/obj/item/device/radio/beacon/syndicate/bomb/attack_self(mob/user as mob)
if(user)
user << "\blue Locked In"
new /obj/machinery/syndicatebomb( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
del(src)
return
/obj/item/device/telepad_beacon
+18 -2
View File
@@ -19,6 +19,21 @@ REAGENT SCANNER
item_state = "electronic"
m_amt = 150
origin_tech = "magnets=1;engineering=1"
var/scan_range = 1
var/pulse_duration = 10
/obj/item/device/t_scanner/longer_pulse
origin_tech = "magnets=2;engineering=2"
pulse_duration = 50
/obj/item/device/t_scanner/extended_range
origin_tech = "magnets=1;engineering=3"
scan_range = 3
/obj/item/device/t_scanner/extended_range/longer_pulse
origin_tech = "magnets=2;engineering=3"
scan_range = 3
pulse_duration = 50
/obj/item/device/t_scanner/Destroy()
if(on)
@@ -39,7 +54,7 @@ REAGENT SCANNER
processing_objects.Remove(src)
return null
for(var/turf/T in range(1, src.loc) )
for(var/turf/T in range(scan_range, src.loc) )
if(!T.intact)
continue
@@ -51,7 +66,7 @@ REAGENT SCANNER
if(O.invisibility == 101)
O.invisibility = 0
spawn(10)
spawn(pulse_duration)
if(O)
var/turf/U = O.loc
if(U.intact)
@@ -65,6 +80,7 @@ REAGENT SCANNER
M.alpha = oldalpha
var/mob/living/M = locate() in T
if(M && M.invisibility == 2)
M.invisibility = 0
spawn(2)
@@ -60,5 +60,92 @@ effective or pretty fucking useless.
icon_state = "battererburnt"
/*
The radioactive microlaser, a device disguised as a health analyzer used to irradiate people.
The strength of the radiation is determined by the 'intensity' setting, while the delay between
the scan and the irradiation kicking in is determined by the wavelength.
Each scan will cause the microlaser to have a brief cooldown period. Higher intensity will increase
the cooldown, while higher wavelength will decrease it.
Wavelength is also slightly increased by the intensity as well.
*/
/obj/item/device/rad_laser
name = "Health Analyzer"
icon_state = "health"
item_state = "analyzer"
desc = "A hand-held body scanner able to distinguish vital signs of the subject. A strange microlaser is hooked on to the scanning end."
flags = FPRINT | TABLEPASS | CONDUCT
slot_flags = SLOT_BELT
discrete = 1 // Makes the item not give an attack log message for viewers.
throwforce = 3
w_class = 1.0
throw_speed = 5
throw_range = 10
m_amt = 200
origin_tech = "magnets=3;biotech=5;syndicate=3"
var/intensity = 5 // how much damage the radiation does
var/wavelength = 10 // time it takes for the radiation to kick in, in seconds
var/used = 0 // is it cooling down?
/obj/item/device/rad_laser/attack(mob/living/M as mob, mob/living/user as mob)
if(!used)
..()
user.visible_message("<span class='notice'> [user] has analyzed [M]'s vitals.","<span class='notice'> You have analyzed [M]'s vitals.")
var/cooldown = round(max(100,(((intensity*8)-(wavelength/2))+(intensity*2))*10))
used = 1
icon_state = "health1"
handle_cooldown(cooldown) // splits off to handle the cooldown while handling wavelength
spawn((wavelength+(intensity*4))*10)
if(M)
if(intensity >= 5)
M.apply_effect(round(intensity/1.5), PARALYZE)
M.apply_effect(intensity*10, IRRADIATE)
else
user << "<span class='danger'>The radioactive microlaser is still recharging.</span>"
/obj/item/device/rad_laser/proc/handle_cooldown(var/cooldown)
spawn(cooldown)
used = 0
icon_state = "health"
/obj/item/device/rad_laser/attack_self(mob/user as mob)
..()
interact(user)
/obj/item/device/rad_laser/interact(mob/user as mob)
user.set_machine(src)
var/cooldown = round(max(10,((intensity*8)-(wavelength/2))+(intensity*2)))
var/dat = {"
Radiation Intensity: <A href='?src=\ref[src];radint=-5'>-</A><A href='?src=\ref[src];radint=-1'>-</A> [intensity] <A href='?src=\ref[src];radint=1'>+</A><A href='?src=\ref[src];radint=5'>+</A><BR>
Radiation Wavelength: <A href='?src=\ref[src];radwav=-5'>-</A><A href='?src=\ref[src];radwav=-1'>-</A> [(wavelength+(intensity*4))] <A href='?src=\ref[src];radwav=1'>+</A><A href='?src=\ref[src];radwav=5'>+</A><BR>
Laser Cooldown: [cooldown] Seconds<BR>
"}
var/datum/browser/popup = new(user, "radlaser", "Radioactive Microlaser Interface", 400, 240)
popup.set_content(dat)
popup.open()
/obj/item/device/rad_laser/Topic(href, href_list)
if(!in_range(src, usr) || issilicon(usr) || !usr.canmove || usr.restrained())
return 1
usr.set_machine(src)
if(href_list["radint"])
var/amount = text2num(href_list["radint"])
amount += intensity
intensity = max(1,(min(10,amount)))
else if(href_list["radwav"])
var/amount = text2num(href_list["radwav"])
amount += wavelength
wavelength = max(1,(min(120,amount)))
//updateUsrDialog()
interact(usr)
add_fingerprint(usr)
return
+15 -385
View File
@@ -7,396 +7,26 @@
icon_state = "violin"
item_state = "violin"
force = 10
var/datum/song/song
var/playing = 0
var/help = 0
var/edit = 1
var/repeat = 0
var/datum/song/handheld/song
/obj/item/device/violin/proc/playnote(var/note as text)
//world << "Note: [note]"
var/soundfile
/*BYOND loads resource files at compile time if they are ''. This means you can't really manipulate them dynamically.
Tried doing it dynamically at first but its more trouble than its worth. Would have saved many lines tho.*/
switch(note)
if("Cn1") soundfile = 'sound/violin/Cn1.mid'
if("C#1") soundfile = 'sound/violin/C#1.mid'
if("Db1") soundfile = 'sound/violin/Db1.mid'
if("Dn1") soundfile = 'sound/violin/Dn1.mid'
if("D#1") soundfile = 'sound/violin/D#1.mid'
if("Eb1") soundfile = 'sound/violin/Eb1.mid'
if("En1") soundfile = 'sound/violin/En1.mid'
if("E#1") soundfile = 'sound/violin/E#1.mid'
if("Fb1") soundfile = 'sound/violin/Fb1.mid'
if("Fn1") soundfile = 'sound/violin/Fn1.mid'
if("F#1") soundfile = 'sound/violin/F#1.mid'
if("Gb1") soundfile = 'sound/violin/Gb1.mid'
if("Gn1") soundfile = 'sound/violin/Gn1.mid'
if("G#1") soundfile = 'sound/violin/G#1.mid'
if("Ab1") soundfile = 'sound/violin/Ab1.mid'
if("An1") soundfile = 'sound/violin/An1.mid'
if("A#1") soundfile = 'sound/violin/A#1.mid'
if("Bb1") soundfile = 'sound/violin/Bb1.mid'
if("Bn1") soundfile = 'sound/violin/Bn1.mid'
if("B#1") soundfile = 'sound/violin/B#1.mid'
if("Cb2") soundfile = 'sound/violin/Cb2.mid'
if("Cn2") soundfile = 'sound/violin/Cn2.mid'
if("C#2") soundfile = 'sound/violin/C#2.mid'
if("Db2") soundfile = 'sound/violin/Db2.mid'
if("Dn2") soundfile = 'sound/violin/Dn2.mid'
if("D#2") soundfile = 'sound/violin/D#2.mid'
if("Eb2") soundfile = 'sound/violin/Eb2.mid'
if("En2") soundfile = 'sound/violin/En2.mid'
if("E#2") soundfile = 'sound/violin/E#2.mid'
if("Fb2") soundfile = 'sound/violin/Fb2.mid'
if("Fn2") soundfile = 'sound/violin/Fn2.mid'
if("F#2") soundfile = 'sound/violin/F#2.mid'
if("Gb2") soundfile = 'sound/violin/Gb2.mid'
if("Gn2") soundfile = 'sound/violin/Gn2.mid'
if("G#2") soundfile = 'sound/violin/G#2.mid'
if("Ab2") soundfile = 'sound/violin/Ab2.mid'
if("An2") soundfile = 'sound/violin/An2.mid'
if("A#2") soundfile = 'sound/violin/A#2.mid'
if("Bb2") soundfile = 'sound/violin/Bb2.mid'
if("Bn2") soundfile = 'sound/violin/Bn2.mid'
if("B#2") soundfile = 'sound/violin/B#2.mid'
if("Cb3") soundfile = 'sound/violin/Cb3.mid'
if("Cn3") soundfile = 'sound/violin/Cn3.mid'
if("C#3") soundfile = 'sound/violin/C#3.mid'
if("Db3") soundfile = 'sound/violin/Db3.mid'
if("Dn3") soundfile = 'sound/violin/Dn3.mid'
if("D#3") soundfile = 'sound/violin/D#3.mid'
if("Eb3") soundfile = 'sound/violin/Eb3.mid'
if("En3") soundfile = 'sound/violin/En3.mid'
if("E#3") soundfile = 'sound/violin/E#3.mid'
if("Fb3") soundfile = 'sound/violin/Fb3.mid'
if("Fn3") soundfile = 'sound/violin/Fn3.mid'
if("F#3") soundfile = 'sound/violin/F#3.mid'
if("Gb3") soundfile = 'sound/violin/Gb3.mid'
if("Gn3") soundfile = 'sound/violin/Gn3.mid'
if("G#3") soundfile = 'sound/violin/G#3.mid'
if("Ab3") soundfile = 'sound/violin/Ab3.mid'
if("An3") soundfile = 'sound/violin/An3.mid'
if("A#3") soundfile = 'sound/violin/A#3.mid'
if("Bb3") soundfile = 'sound/violin/Bb3.mid'
if("Bn3") soundfile = 'sound/violin/Bn3.mid'
if("B#3") soundfile = 'sound/violin/B#3.mid'
if("Cb4") soundfile = 'sound/violin/Cb4.mid'
if("Cn4") soundfile = 'sound/violin/Cn4.mid'
if("C#4") soundfile = 'sound/violin/C#4.mid'
if("Db4") soundfile = 'sound/violin/Db4.mid'
if("Dn4") soundfile = 'sound/violin/Dn4.mid'
if("D#4") soundfile = 'sound/violin/D#4.mid'
if("Eb4") soundfile = 'sound/violin/Eb4.mid'
if("En4") soundfile = 'sound/violin/En4.mid'
if("E#4") soundfile = 'sound/violin/E#4.mid'
if("Fb4") soundfile = 'sound/violin/Fb4.mid'
if("Fn4") soundfile = 'sound/violin/Fn4.mid'
if("F#4") soundfile = 'sound/violin/F#4.mid'
if("Gb4") soundfile = 'sound/violin/Gb4.mid'
if("Gn4") soundfile = 'sound/violin/Gn4.mid'
if("G#4") soundfile = 'sound/violin/G#4.mid'
if("Ab4") soundfile = 'sound/violin/Ab4.mid'
if("An4") soundfile = 'sound/violin/An4.mid'
if("A#4") soundfile = 'sound/violin/A#4.mid'
if("Bb4") soundfile = 'sound/violin/Bb4.mid'
if("Bn4") soundfile = 'sound/violin/Bn4.mid'
if("B#4") soundfile = 'sound/violin/B#4.mid'
if("Cb5") soundfile = 'sound/violin/Cb5.mid'
if("Cn5") soundfile = 'sound/violin/Cn5.mid'
if("C#5") soundfile = 'sound/violin/C#5.mid'
if("Db5") soundfile = 'sound/violin/Db5.mid'
if("Dn5") soundfile = 'sound/violin/Dn5.mid'
if("D#5") soundfile = 'sound/violin/D#5.mid'
if("Eb5") soundfile = 'sound/violin/Eb5.mid'
if("En5") soundfile = 'sound/violin/En5.mid'
if("E#5") soundfile = 'sound/violin/E#5.mid'
if("Fb5") soundfile = 'sound/violin/Fb5.mid'
if("Fn5") soundfile = 'sound/violin/Fn5.mid'
if("F#5") soundfile = 'sound/violin/F#5.mid'
if("Gb5") soundfile = 'sound/violin/Gb5.mid'
if("Gn5") soundfile = 'sound/violin/Gn5.mid'
if("G#5") soundfile = 'sound/violin/G#5.mid'
if("Ab5") soundfile = 'sound/violin/Ab5.mid'
if("An5") soundfile = 'sound/violin/An5.mid'
if("A#5") soundfile = 'sound/violin/A#5.mid'
if("Bb5") soundfile = 'sound/violin/Bb5.mid'
if("Bn5") soundfile = 'sound/violin/Bn5.mid'
if("B#5") soundfile = 'sound/violin/B#5.mid'
if("Cb6") soundfile = 'sound/violin/Cb6.mid'
if("Cn6") soundfile = 'sound/violin/Cn6.mid'
if("C#6") soundfile = 'sound/violin/C#6.mid'
if("Db6") soundfile = 'sound/violin/Db6.mid'
if("Dn6") soundfile = 'sound/violin/Dn6.mid'
if("D#6") soundfile = 'sound/violin/D#6.mid'
if("Eb6") soundfile = 'sound/violin/Eb6.mid'
if("En6") soundfile = 'sound/violin/En6.mid'
if("E#6") soundfile = 'sound/violin/E#6.mid'
if("Fb6") soundfile = 'sound/violin/Fb6.mid'
if("Fn6") soundfile = 'sound/violin/Fn6.mid'
if("F#6") soundfile = 'sound/violin/F#6.mid'
if("Gb6") soundfile = 'sound/violin/Gb6.mid'
if("Gn6") soundfile = 'sound/violin/Gn6.mid'
if("G#6") soundfile = 'sound/violin/G#6.mid'
if("Ab6") soundfile = 'sound/violin/Ab6.mid'
if("An6") soundfile = 'sound/violin/An6.mid'
if("A#6") soundfile = 'sound/violin/A#6.mid'
if("Bb6") soundfile = 'sound/violin/Bb6.mid'
if("Bn6") soundfile = 'sound/violin/Bn6.mid'
if("B#6") soundfile = 'sound/violin/B#6.mid'
if("Cb7") soundfile = 'sound/violin/Cb7.mid'
if("Cn7") soundfile = 'sound/violin/Cn7.mid'
if("C#7") soundfile = 'sound/violin/C#7.mid'
if("Db7") soundfile = 'sound/violin/Db7.mid'
if("Dn7") soundfile = 'sound/violin/Dn7.mid'
if("D#7") soundfile = 'sound/violin/D#7.mid'
if("Eb7") soundfile = 'sound/violin/Eb7.mid'
if("En7") soundfile = 'sound/violin/En7.mid'
if("E#7") soundfile = 'sound/violin/E#7.mid'
if("Fb7") soundfile = 'sound/violin/Fb7.mid'
if("Fn7") soundfile = 'sound/violin/Fn7.mid'
if("F#7") soundfile = 'sound/violin/F#7.mid'
if("Gb7") soundfile = 'sound/violin/Gb7.mid'
if("Gn7") soundfile = 'sound/violin/Gn7.mid'
if("G#7") soundfile = 'sound/violin/G#7.mid'
if("Ab7") soundfile = 'sound/violin/Ab7.mid'
if("An7") soundfile = 'sound/violin/An7.mid'
if("A#7") soundfile = 'sound/violin/A#7.mid'
if("Bb7") soundfile = 'sound/violin/Bb7.mid'
if("Bn7") soundfile = 'sound/violin/Bn7.mid'
if("B#7") soundfile = 'sound/violin/B#7.mid'
if("Cb8") soundfile = 'sound/violin/Cb8.mid'
if("Cn8") soundfile = 'sound/violin/Cn8.mid'
if("C#8") soundfile = 'sound/violin/C#8.mid'
if("Db8") soundfile = 'sound/violin/Db8.mid'
if("Dn8") soundfile = 'sound/violin/Dn8.mid'
if("D#8") soundfile = 'sound/violin/D#8.mid'
if("Eb8") soundfile = 'sound/violin/Eb8.mid'
if("En8") soundfile = 'sound/violin/En8.mid'
if("E#8") soundfile = 'sound/violin/E#8.mid'
if("Fb8") soundfile = 'sound/violin/Fb8.mid'
if("Fn8") soundfile = 'sound/violin/Fn8.mid'
if("F#8") soundfile = 'sound/violin/F#8.mid'
if("Gb8") soundfile = 'sound/violin/Gb8.mid'
if("Gn8") soundfile = 'sound/violin/Gn8.mid'
if("G#8") soundfile = 'sound/violin/G#8.mid'
if("Ab8") soundfile = 'sound/violin/Ab8.mid'
if("An8") soundfile = 'sound/violin/An8.mid'
if("A#8") soundfile = 'sound/violin/A#8.mid'
if("Bb8") soundfile = 'sound/violin/Bb8.mid'
if("Bn8") soundfile = 'sound/violin/Bn8.mid'
if("B#8") soundfile = 'sound/violin/B#8.mid'
if("Cb9") soundfile = 'sound/violin/Cb9.mid'
if("Cn9") soundfile = 'sound/violin/Cn9.mid'
else return
/obj/item/device/violin/New()
song = new("violin", src)
song.instrumentExt = "ogg"
hearers(15, get_turf(src)) << sound(soundfile)
/obj/item/device/violin/proc/playsong()
do
var/cur_oct[7]
var/cur_acc[7]
for(var/i = 1 to 7)
cur_oct[i] = "3"
cur_acc[i] = "n"
for(var/line in song.lines)
//world << line
for(var/beat in text2list(lowertext(line), ","))
//world << "beat: [beat]"
var/list/notes = text2list(beat, "/")
for(var/note in text2list(notes[1], "-"))
//world << "note: [note]"
if(!playing || !isliving(loc))//If the violin is playing, or isn't held by a person
playing = 0
return
if(lentext(note) == 0)
continue
//world << "Parse: [copytext(note,1,2)]"
var/cur_note = text2ascii(note) - 96
if(cur_note < 1 || cur_note > 7)
continue
for(var/i=2 to lentext(note))
var/ni = copytext(note,i,i+1)
if(!text2num(ni))
if(ni == "#" || ni == "b" || ni == "n")
cur_acc[cur_note] = ni
else if(ni == "s")
cur_acc[cur_note] = "#" // so shift is never required
else
cur_oct[cur_note] = ni
playnote(uppertext(copytext(note,1,2)) + cur_acc[cur_note] + cur_oct[cur_note])
if(notes.len >= 2 && text2num(notes[2]))
sleep(song.tempo / text2num(notes[2]))
else
sleep(song.tempo)
if(repeat > 0)
repeat-- //Infinite loops are baaaad.
while(repeat > 0)
playing = 0
/obj/item/device/violin/Destroy()
del(song)
song = null
..()
/obj/item/device/violin/attack_self(mob/user as mob)
if(!isliving(user) || user.stat || user.restrained() || user.lying) return
user.set_machine(src)
interact(user)
var/dat = "<HEAD><TITLE>Violin</TITLE></HEAD><BODY>"
if(song)
if(song.lines.len > 0 && !(playing))
dat += "<A href='?src=\ref[src];play=1'>Play Song</A><BR><BR>"
dat += "<A href='?src=\ref[src];repeat=1'>Repeat Song: [repeat] times.</A><BR><BR>"
if(playing)
dat += "<A href='?src=\ref[src];stop=1'>Stop Playing</A><BR>"
dat += "Repeats left: [repeat].<BR><BR>"
if(!edit)
dat += "<A href='?src=\ref[src];edit=2'>Show Editor</A><BR><BR>"
else
dat += "<A href='?src=\ref[src];edit=1'>Hide Editor</A><BR>"
dat += "<A href='?src=\ref[src];newsong=1'>Start a New Song</A><BR>"
dat += "<A href='?src=\ref[src];import=1'>Import a Song</A><BR><BR>"
if(song)
var/calctempo = (10/song.tempo)*60
dat += "Tempo : <A href='?src=\ref[src];tempo=10'>-</A><A href='?src=\ref[src];tempo=1'>-</A> [calctempo] BPM <A href='?src=\ref[src];tempo=-1'>+</A><A href='?src=\ref[src];tempo=-10'>+</A><BR><BR>"
var/linecount = 0
for(var/line in song.lines)
linecount += 1
dat += "Line [linecount]: [line] <A href='?src=\ref[src];deleteline=[linecount]'>Delete Line</A> <A href='?src=\ref[src];modifyline=[linecount]'>Modify Line</A><BR>"
dat += "<A href='?src=\ref[src];newline=1'>Add Line</A><BR><BR>"
if(help)
dat += "<A href='?src=\ref[src];help=1'>Hide Help</A><BR>"
dat += {"
Lines are a series of chords, separated by commas (,), each with notes seperated by hyphens (-).<br>
Every note in a chord will play together, with chord timed by the tempo.<br>
<br>
Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.<br>
By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.<br>
Example: <i>C,D,E,F,G,A,B</i> will play a C major scale.<br>
After a note has an accidental placed, it will be remembered: <i>C,C4,C,C3</i> is C3,C4,C4,C3</i><br>
Chords can be played simply by seperating each note with a hyphon: <i>A-C#,Cn-E,E-G#,Gn-B</i><br>
A pause may be denoted by an empty chord: <i>C,E,,C,G</i><br>
To make a chord be a different time, end it with /x, where the chord length will be length<br>
defined by tempo / x: <i>C,G/2,E/4</i><br>
Combined, an example is: <i>E-E4/4,/2,G#/8,B/8,E3-E4/4</i>
<br>
Lines may be up to 50 characters.<br>
A song may only contain up to 50 lines.<br>
"}
else
dat += "<A href='?src=\ref[src];help=2'>Show Help</A><BR>"
dat += "</BODY></HTML>"
user << browse(dat, "window=violin;size=700x300")
onclose(user, "violin")
/obj/item/device/violin/Topic(href, href_list)
if(!in_range(src, usr) || issilicon(usr) || !isliving(usr) || !usr.canmove || usr.restrained())
usr << browse(null, "window=violin;size=700x300")
onclose(usr, "violin")
/obj/item/device/violin/interact(mob/user as mob)
if(!user)
return
if(href_list["newsong"])
song = new()
else if(song)
if(href_list["repeat"]) //Changing this from a toggle to a number of repeats to avoid infinite loops.
if(playing) return //So that people cant keep adding to repeat. If the do it intentionally, it could result in the server crashing.
var/tempnum = input("How many times do you want to repeat this piece? (max:10)") as num|null
if(tempnum > 10)
tempnum = 10
if(tempnum < 0)
tempnum = 0
repeat = round(tempnum)
if(!isliving(user) || user.stat || user.restrained() || user.lying)
return
else if(href_list["tempo"])
song.tempo += round(text2num(href_list["tempo"]))
if(song.tempo < 1)
song.tempo = 1
else if(href_list["play"])
if(song)
playing = 1
spawn() playsong()
else if(href_list["newline"])
var/newline = html_encode(input("Enter your line: ", "violin") as text|null)
if(!newline)
return
if(song.lines.len > 50)
return
if(lentext(newline) > 50)
newline = copytext(newline, 1, 50)
song.lines.Add(newline)
else if(href_list["deleteline"])
var/num = round(text2num(href_list["deleteline"]))
if(num > song.lines.len || num < 1)
return
song.lines.Cut(num, num+1)
else if(href_list["modifyline"])
var/num = round(text2num(href_list["modifyline"]),1)
var/content = html_encode(input("Enter your line: ", "violin", song.lines[num]) as text|null)
if(!content)
return
if(lentext(content) > 50)
content = copytext(content, 1, 50)
if(num > song.lines.len || num < 1)
return
song.lines[num] = content
else if(href_list["stop"])
playing = 0
else if(href_list["help"])
help = text2num(href_list["help"]) - 1
else if(href_list["edit"])
edit = text2num(href_list["edit"]) - 1
else if(href_list["import"])
var/t = ""
do
t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", name), t) as message)
if(!in_range(src, usr))
return
if(lentext(t) >= 3072)
var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no")
if(cont == "no")
break
while(lentext(t) > 3072)
//split into lines
spawn()
var/list/lines = text2list(t, "\n")
var/tempo = 5
if(copytext(lines[1],1,6) == "BPM: ")
tempo = 600 / text2num(copytext(lines[1],6))
lines.Cut(1,2)
if(lines.len > 50)
usr << "Too many lines!"
lines.Cut(51)
var/linenum = 1
for(var/l in lines)
if(lentext(l) > 50)
usr << "Line [linenum] too long!"
lines.Remove(l)
else
linenum++
song = new()
song.lines = lines
song.tempo = tempo
add_fingerprint(usr)
for(var/mob/M in viewers(1, loc))
if((M.client && M.machine == src))
attack_self(M)
return
/obj/item/device/violin/guitar
name = "engraved guitar"
desc = "An aged wooden acoustic guitar It has an engraving on the back: \"For my loyal robotic companion, S.A.M. -LWK\"."
icon = 'icons/obj/musician.dmi'
icon_state = "guitar"
item_state = "guitar"
slot_flags = SLOT_BACK
user.set_machine(src)
song.interact(user)
+68 -111
View File
@@ -6,6 +6,8 @@
* Plasma Glass Sheets
* Reinforced Plasma Glass Sheets (AKA Holy fuck strong windows)
Todo: Create a unified construct_window(sheet, user, created_window, full_window)
*/
/*
@@ -98,6 +100,7 @@
W = new /obj/structure/window/basic( user.loc, 0 )
W.dir = dir_to_set
W.ini_dir = W.dir
W.state = 0
W.anchored = 0
src.use(1)
if("Full Window")
@@ -110,6 +113,7 @@
user << "\red There is a full window in the way."
return 1
var/obj/structure/window/W = new full_window( user.loc, 0 )
W.state = 0
W.anchored = 0
src.use(2)
return 0
@@ -126,6 +130,8 @@
g_amt = 3750
m_amt = 1875
origin_tech = "materials=2"
var/created_window = /obj/structure/window/reinforced
var/full_window = /obj/structure/window/full/reinforced
/obj/item/stack/sheet/rglass/cyborg
name = "reinforced glass"
@@ -190,11 +196,8 @@
if(locate(/obj/structure/window/full) in user.loc)
user << "\red There is a window in the way."
return 1
var/obj/structure/window/W
W = new /obj/structure/window/reinforced( user.loc, 1 )
var/obj/structure/window/W = new full_window( user.loc, 0 )
W.state = 0
W.dir = SOUTHWEST
W.ini_dir = SOUTHWEST
W.anchored = 0
src.use(2)
@@ -237,106 +240,6 @@
return 0
/*
* Glass shards - TODO: Move this into code/game/object/item/weapons
*/
/obj/item/weapon/shard
resetVariables()
var/list/exclude = list("pixel_y", "pixel_x", "icon_state")
exclude += args
..(exclude)
/obj/item/weapon/shard/Bump()
spawn( 0 )
if (prob(20))
src.force = 15
else
src.force = 4
..()
return
return
/obj/item/weapon/shard
name = "shard"
desc = "A nasty looking shard of glass."
icon = 'icons/obj/shards.dmi'
icon_state = "large"
w_class = 1.0
force = 5.0
throwforce = 15.0
item_state = "shard-glass"
g_amt = 3750
attack_verb = list("stabbed", "slashed", "sliced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
suicide_act(mob/user)
viewers(user) << pick("<span class='suicide'>[user] is slitting \his wrists with the shard of glass! It looks like \he's trying to commit suicide.</span>", \
"<span class='suicide'>[user] is slitting \his throat with the shard of glass! It looks like \he's trying to commit suicide.</span>")
return (BRUTELOSS)
/obj/item/weapon/shard/New()
src.icon_state = pick("large", "medium", "small")
switch(src.icon_state)
if("small")
src.pixel_x = rand(-12, 12)
src.pixel_y = rand(-12, 12)
if("medium")
src.pixel_x = rand(-8, 8)
src.pixel_y = rand(-8, 8)
if("large")
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
else
return
/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if ( istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
var/obj/item/stack/sheet/glass/NG = new (user.loc)
for (var/obj/item/stack/sheet/glass/G in user.loc)
if(G==NG)
continue
if(G.amount>=G.max_amount)
continue
G.attackby(NG, user)
usr << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheets."
//SN src = null
returnToPool(src)
return
return ..()
/obj/item/weapon/shard/Crossed(AM as mob|obj)
if(ismob(AM))
var/mob/M = AM
M << "\red <B>You step in the broken glass!</B>"
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
return
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(affecting.status & ORGAN_ROBOT)
return
H.Weaken(3)
if(affecting.take_damage(5, 0))
H.UpdateDamageIcon()
H.updatehealth()
..()
/*
* Plasma Glass sheets
*/
/obj/item/stack/sheet/plasmaglass
name = "plasma glass"
@@ -349,7 +252,7 @@
var/full_window = /obj/structure/window/full/plasmabasic
/obj/item/stack/sheet/glass/plasmaglass/attack_self(mob/user as mob)
/obj/item/stack/sheet/plasmaglass/attack_self(mob/user as mob)
construct_window(user)
/obj/item/stack/sheet/plasmaglass/attackby(obj/item/W, mob/user)
@@ -375,7 +278,7 @@
if(!user.IsAdvancedToolUser())
user << "\red You don't have the dexterity to do this!"
return 0
var/title = "Sheet-PlasmaGlass"
var/title = "Plasma-glass alloy"
title += " ([src.amount] sheet\s left)"
switch(alert(title, "Would you like full tile glass or one direction?", "One Direction", "Full Window", "Cancel", null))
if("One Direction")
@@ -406,6 +309,7 @@
W = new /obj/structure/window/plasmabasic( user.loc, 0 )
W.dir = dir_to_set
W.ini_dir = W.dir
W.state = 0
W.anchored = 0
src.use(1)
if("Full Window")
@@ -417,10 +321,8 @@
if(locate(/obj/structure/window) in user.loc)
user << "\red There is a window in the way."
return 1
var/obj/structure/window/W
W = new /obj/structure/window/plasmabasic( user.loc, 0 )
W.dir = SOUTHWEST
W.ini_dir = SOUTHWEST
var/obj/structure/window/W = new full_window( user.loc, 0 )
W.state = 0
W.anchored = 0
src.use(2)
return 0
@@ -440,5 +342,60 @@
var/full_window = /obj/structure/window/full/plasmareinforced
/obj/item/stack/sheet/glass/plasmarglass/attack_self(mob/user as mob)
/obj/item/stack/sheet/plasmarglass/attack_self(mob/user as mob)
construct_window(user)
/obj/item/stack/sheet/plasmarglass/proc/construct_window(mob/user as mob)
if(!user || !src) return 0
if(!istype(user.loc,/turf)) return 0
if(!user.IsAdvancedToolUser())
user << "\red You don't have the dexterity to do this!"
return 0
var/title = "Reinforced plasma-glass alloy"
title += " ([src.amount] sheet\s left)"
switch(alert(title, "Would you like full tile glass or one direction?", "One Direction", "Full Window", "Cancel", null))
if("One Direction")
if(!src) return 1
if(src.loc != user) return 1
var/list/directions = new/list(cardinal)
var/i = 0
for (var/obj/structure/window/win in user.loc)
i++
if(i >= 4)
user << "\red There are too many windows in this location."
return 1
directions-=win.dir
if(!(win.ini_dir in cardinal))
user << "\red Can't let you do that."
return 1
//Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc.
var/dir_to_set = 2
for(var/direction in list( user.dir, turn(user.dir,90), turn(user.dir,180), turn(user.dir,270) ))
var/found = 0
for(var/obj/structure/window/WT in user.loc)
if(WT.dir == direction)
found = 1
if(!found)
dir_to_set = direction
break
var/obj/structure/window/W
W = new /obj/structure/window/plasmareinforced( user.loc, 0 )
W.dir = dir_to_set
W.ini_dir = W.dir
W.state = 0
W.anchored = 0
src.use(1)
if("Full Window")
if(!src) return 1
if(src.loc != user) return 1
if(src.amount < 2)
user << "\red You need more glass to do that."
return 1
if(locate(/obj/structure/window) in user.loc)
user << "\red There is a window in the way."
return 1
var/obj/structure/window/W = new full_window( user.loc, 0 )
W.state = 0
W.anchored = 0
src.use(2)
return 0
+11 -6
View File
@@ -424,7 +424,7 @@
desc = "Your palm is oozing this stuff!"
icon = 'icons/mob/slimes.dmi'
icon_state = "red slime extract"
throwforce = 30.0
throwforce = 5.0
throw_speed = 10
throw_range = 30
w_class = 1
@@ -927,9 +927,9 @@ obj/item/toy/cards/deck/syndicate
desc = "A deck of space-grade playing cards. They seem unusually rigid."
deckstyle = "syndicate"
card_hitsound = 'sound/weapons/bladeslice.ogg'
card_force = 15
card_throwforce = 15
card_throw_speed = 6
card_force = 5
card_throwforce = 10
card_throw_speed = 3
card_throw_range = 20
card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut")
@@ -952,13 +952,18 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/nuke/attack_self(mob/user)
if (cooldown < world.time)
cooldown = world.time + 3000 //5 minutes
cooldown = world.time + 1800 //3 minutes
user.visible_message("<span class='warning'>[user] presses a button on [src]</span>", "<span class='notice'>You activate [src], it plays a loud noise!</span>", "<span class='notice'>You hear the click of a button.</span>")
spawn(5) //gia said so
icon_state = "nuketoy"
playsound(src, 'sound/machines/Alarm.ogg', 100, 0, surround = 0)
playsound(src, 'sound/machines/Alarm.ogg', 100, 0, 0)
sleep(135)
icon_state = "nuketoycool"
sleep(cooldown - world.time)
icon_state = "nuketoyidle"
else
var/timeleft = (cooldown - world.time)
user << "<span class='alert'>Nothing happens, and '</span>[round(timeleft/10)]<span class='alert'>' appears on a small display.</span>"
/obj/item/toy/therapy_red
@@ -297,7 +297,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = "pipeoff"
icon_on = "pipeon" //Note - these are in masks.dmi
icon_off = "pipeoff"
smoketime = 100
smoketime = 1000
chem_volume = 50
/obj/item/clothing/mask/cigarette/pipe/light(var/flavor_text = "[usr] lights the [name].")
if(!src.lit)
@@ -353,7 +354,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = "cobpipeoff"
icon_on = "cobpipeon" //Note - these are in masks.dmi
icon_off = "cobpipeoff"
smoketime = 400
smoketime = 800
chem_volume = 40
@@ -0,0 +1,47 @@
/obj/item/weapon/dnascrambler
name = "dna scrambler"
desc = "An illegal genetic serum designed to randomize the user's identity."
icon = 'icons/obj/syringe.dmi'
item_state = "syringe_0"
icon_state = "b10"
var/used = null
update_icon()
if(used)
icon_state = "b0"
else
icon_state = "b10"
attack(mob/M as mob, mob/user as mob)
if(!M || !user)
return
if(!ishuman(M) || !ishuman(user))
return
if(src.used)
return
if(M == user)
user.visible_message("\red <b>[user.name] injects \himself with [src]!</b>")
src.injected(user,user)
else
user.visible_message("\red <b>[user.name] is trying to inject [M.name] with [src]!</b>")
if (do_mob(user,M,30))
user.visible_message("\red <b>[user.name] injects [M.name] with [src].</b>")
src.injected(M, user)
else
user << "\red You failed to inject [M.name]."
proc/injected(var/mob/living/carbon/target, var/mob/living/carbon/user)
target.generate_name()
target.real_name = target.name
scramble(1, target, 100)
log_attack("[key_name(user)] injected [key_name(target)] with the [name]")
log_game("[key_name_admin(user)] injected [key_name_admin(target)] with the [name]")
src.used = 1
src.update_icon()
src.name = "used " + src.name
@@ -35,7 +35,7 @@
/obj/item/weapon/grenade/spawnergrenade/manhacks
name = "manhack delivery grenade"
spawner_type = /mob/living/simple_animal/hostile/viscerator
deliveryamt = 3
deliveryamt = 5
origin_tech = "materials=3;magnets=4;syndicate=4"
/obj/item/weapon/grenade/spawnergrenade/spesscarp
@@ -0,0 +1,12 @@
/obj/item/weapon/grenade/syndieminibomb
desc = "A syndicate manufactured explosive used to sow destruction and chaos"
name = "syndicate minibomb"
icon = 'icons/obj/grenade.dmi'
icon_state = "syndicate"
item_state = "flashbang"
origin_tech = "materials=3;magnets=4;syndicate=4"
/obj/item/weapon/grenade/syndieminibomb/prime()
update_mob()
explosion(src.loc,1,2,4)
del(src)
@@ -343,20 +343,20 @@ the implant may become unstable and either pre-maturely inject the subject or si
return 1
/obj/item/weapon/implant/traitor
name = "Greytide Implant"
desc = "Greytide Station wide"
name = "Mindslave Implant"
desc = "Divide and Conquer"
icon_state = "implant_evil"
get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> Greytide Mind-Slave Implant<BR>
<b>Name:</b> Mind-Slave Implant<BR>
<b>Life:</b> ??? <BR>
<b>Important Notes:</b> Any humanoid injected with this implant will become loyal to the injector and the greytide, unless of course the host is already loyal to someone else.<BR>
<b>Important Notes:</b> Any humanoid injected with this implant will become loyal to the injector, unless of course the host is already loyal to someone else.<BR>
<HR>
<b>Implant Details:</b><BR>
<b>Function:</b> Contains a small pod of nanobots that manipulate the host's mental functions.<BR>
<b>Special Features:</b> Glory to the Greytide!<BR>
<b>Special Features:</b> Diplomacy was never so easy.<BR>
<b>Integrity:</b> Implant will last so long as the nanobots are inside the bloodstream."}
return dat
@@ -367,9 +367,9 @@ the implant may become unstable and either pre-maturely inject the subject or si
if(!M.mind) return 0
var/mob/living/carbon/human/H = M
if(M == user)
user << "<span class='notice'>You feel quite stupid for doing that.</span>"
user << "<span class='notice'>Making yourself loyal to yourself was a great idea! Perhaps the best idea, ever! Actually, you just feel like an idiot.</span>"
if(isliving(user))
user:brainloss += 10
user:brainloss += 20
return
if(locate(/obj/item/weapon/implant/traitor) in H.contents || locate(/obj/item/weapon/implant/traitor) in H.contents)
H.visible_message("[H] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.")
@@ -389,7 +389,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
ticker.mode:implanter[ref] = implanters
ticker.mode.traitors += H.mind
H.mind.special_role = "traitor"
H << "<B>\red You've been shown the Greytide by [user.name]!</B> You now must lay down your life to protect them and assist in their goals at any cost."
H << "<B>\red You're now completely loyal to [user.name]!</B> You now must lay down your life to protect them and assist in their goals at any cost."
var/datum/objective/protect/p = new
p.owner = H.mind
p.target = user:mind
@@ -405,7 +405,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/adrenalin
name = "adrenalin"
desc = "Removes all stuns and knockdowns."
var/uses
var/uses = 3
get_data()
var/dat = {"
@@ -414,8 +414,8 @@ the implant may become unstable and either pre-maturely inject the subject or si
<b>Life:</b> Five days.<BR>
<b>Important Notes:</b> <font color='red'>Illegal</font><BR>
<HR>
<b>Implant Details:</b> Subjects injected with implant can activate a massive injection of adrenalin.<BR>
<b>Function:</b> Contains nanobots to stimulate body to mass-produce Adrenalin.<BR>
<b>Implant Details:</b> Subjects injected with implant can activate an injection of medical cocktails.<BR>
<b>Function:</b> Removes stuns, increases speed, and has a mild healing effect.<BR>
<b>Special Features:</b> Will prevent and cure most forms of brainwashing.<BR>
<b>Integrity:</b> Implant can only be used three times before the nanobots are depleted."}
return dat
@@ -429,6 +429,12 @@ the implant may become unstable and either pre-maturely inject the subject or si
source.SetStunned(0)
source.SetWeakened(0)
source.SetParalysis(0)
source.lying = 0
source.update_canmove()
source.reagents.add_reagent("synaptizine", 10)
source.reagents.add_reagent("tricordrazine", 10)
source.reagents.add_reagent("hyperzine", 10)
return
@@ -138,3 +138,14 @@
src.imp = new /obj/item/weapon/implant/death_alarm( src )
..()
return
/obj/item/weapon/implantcase/freedom
name = "Glass Case- 'Freedom'"
desc = "A case containing a freedom implant."
icon = 'icons/obj/items.dmi'
icon_state = "implantcase-b"
New()
src.imp = new /obj/item/weapon/implant/freedom( src )
..()
return
@@ -54,8 +54,8 @@
/obj/item/weapon/implanter/traitor
name = "implanter-greytide"
desc = "Greytide Stationwide."
name = "implanter-mindslave"
desc = "Divide and Conquer."
New()
src.imp = new /obj/item/weapon/implant/traitor(src)
+1 -1
View File
@@ -676,7 +676,7 @@
</head>
<body>
<iframe width='100%' height='97%' src="http://80.244.78.90/wiki/index.php?title=Space_law&printable=yes" frameborder="0" id="main_frame"></iframe> </body>
<iframe width='100%' height='97%' src="http://nanotrasen.se/wiki/index.php?title=Space_law&printable=yes" frameborder="0" id="main_frame"></iframe> </body>
</html>
+114
View File
@@ -0,0 +1,114 @@
// Glass shards
/obj/item/weapon/shard
name = "glass shard"
icon = 'icons/obj/shards.dmi'
icon_state = "large"
sharp = 1
edge = 1
desc = "Could probably be used as ... a throwing weapon?"
w_class = 2.0
force = 5.0
throwforce = 8.0
item_state = "shard-glass"
// matter = list("glass" = 3750)
attack_verb = list("stabbed", "slashed", "sliced", "cut")
/obj/item/weapon/shard/suicide_act(mob/user)
viewers(user) << pick("\red <b>[user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.</b>", \
"\red <b>[user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.</b>")
return (BRUTELOSS)
/obj/item/weapon/shard/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
/obj/item/weapon/shard/Bump()
spawn( 0 )
if (prob(20))
src.force = 15
else
src.force = 4
..()
return
return
/obj/item/weapon/shard/New()
src.icon_state = pick("large", "medium", "small")
switch(src.icon_state)
if("small")
src.pixel_x = rand(-12, 12)
src.pixel_y = rand(-12, 12)
if("medium")
src.pixel_x = rand(-8, 8)
src.pixel_y = rand(-8, 8)
if("large")
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
else
return
/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if ( istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
var/obj/item/stack/sheet/glass/NG = new (user.loc)
for (var/obj/item/stack/sheet/glass/G in user.loc)
if(G==NG)
continue
if(G.amount>=G.max_amount)
continue
G.attackby(NG, user)
usr << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheets."
//SN src = null
del(src)
return
return ..()
/obj/item/weapon/shard/Crossed(AM as mob|obj)
if(ismob(AM))
var/mob/M = AM
M << "\red <B>You step on \the [src]!</B>"
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
return
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(affecting.status & ORGAN_ROBOT)
return
H.Weaken(3)
if(affecting.take_damage(5, 0))
H.UpdateDamageIcon()
H.updatehealth()
..()
// Shrapnel
/obj/item/weapon/shard/shrapnel
name = "shrapnel"
icon = 'icons/obj/shards.dmi'
icon_state = "shrapnellarge"
desc = "A bunch of tiny bits of shattered metal."
/obj/item/weapon/shard/shrapnel/New()
src.icon_state = pick("shrapnellarge", "shrapnelmedium", "shrapnelsmall")
switch(src.icon_state)
if("shrapnelsmall")
src.pixel_x = rand(-12, 12)
src.pixel_y = rand(-12, 12)
if("shrapnelmedium")
src.pixel_x = rand(-8, 8)
src.pixel_y = rand(-8, 8)
if("shrapnellarge")
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
else
return
@@ -38,11 +38,6 @@
if(crit_fail)
user << "\red The Bluespace generator isn't working."
return
if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
user << "\red The Bluespace interfaces of the two devices conflict and malfunction."
del(W)
return
//BoH+BoH=Singularity, commented out.
if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
investigate_log("has become a singularity. Caused by [user.key]","singulo")
user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!"
@@ -72,6 +72,7 @@
/obj/item/weapon/storage/belt/medical
use_to_pickup = 1 //Allow medical belt to pick up medicine
name = "medical belt"
desc = "Can hold various medical equipment."
icon_state = "medicalbelt"
@@ -124,7 +125,8 @@
"/obj/item/device/radio/headset",
"/obj/item/weapon/melee",
"/obj/item/taperoll/police",
"/obj/item/weapon/gun/energy/taser"
"/obj/item/weapon/gun/energy/taser",
"/obj/item/weapon/gun/energy/stunrevolver"
)
/obj/item/weapon/storage/belt/soulstone
@@ -12,8 +12,10 @@
autoignition_temperature = 522 // Kelvin
suicide_act(mob/user)
viewers(user) << "\red <b>[user] is farting lightly on the [src.name]! It looks like \he's trying to commit suicide!</b>"
return (user.death(1))
user.emote("fart")
viewers(user) << "\red <b>[user] farts on the [src.name]!</b>"
viewers(user) << "\blue <b>A mysterious force smites [user]!</b>"
return (user.gib(1))
/obj/item/weapon/storage/bible/booze
@@ -167,6 +167,21 @@
new /obj/item/ammo_casing/shotgun/birdshot(src)
/obj/item/weapon/storage/box/gauge
name = "box of 12 gauge slugs"
desc = "It has a picture of a gun and several warning symbols on the front."
m_amt = 50000
New()
..()
new /obj/item/ammo_casing/shotgun(src)
new /obj/item/ammo_casing/shotgun(src)
new /obj/item/ammo_casing/shotgun(src)
new /obj/item/ammo_casing/shotgun(src)
new /obj/item/ammo_casing/shotgun(src)
new /obj/item/ammo_casing/shotgun(src)
new /obj/item/ammo_casing/shotgun(src)
/obj/item/weapon/storage/box/flashbangs
name = "box of flashbangs (WARNING)"
@@ -183,6 +198,21 @@
new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/weapon/grenade/flashbang(src)
/obj/item/weapon/storage/box/teargas
name = "box of tear gas grenades (WARNING)"
desc = "<B>WARNING: These devices are extremely dangerous and can cause blindness and skin irritation.</B>"
icon_state = "flashbang"
/obj/item/weapon/storage/box/teargas/New()
..()
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
/obj/item/weapon/storage/box/emps
name = "emp grenades"
desc = "A box with 5 emp grenades."
@@ -439,8 +469,8 @@
new /obj/item/weapon/handcuffs(src)
/obj/item/weapon/storage/box/mousetraps
name = "box of Pest-B-Gon Mousetraps"
desc = "<B><FONT=red>WARNING:</FONT></B> <I>Keep out of reach of children</I>."
name = "box of Pest-B-Gon mousetraps"
desc = "<B><FONT color='red'>WARNING:</FONT></B> <I>Keep out of reach of children</I>."
icon_state = "mousetraps"
New()
@@ -135,8 +135,17 @@
new /obj/item/ammo_box/a357(src)
return
/obj/item/weapon/storage/box/syndie_kit/greytide
name = "box (GT)"
/obj/item/weapon/storage/box/syndie_kit/imp_adrenal
name = "boxed adrenal implant (with injector)"
New()
..()
var/obj/item/weapon/implanter/O = new(src)
O.imp = new /obj/item/weapon/implant/adrenalin(O)
O.update()
/obj/item/weapon/storage/box/syndie_kit/mindslave
name = "box (MS)"
New()
..()
+82 -57
View File
@@ -8,21 +8,23 @@
force = 10
throwforce = 7
w_class = 3
var/stunforce = 10
var/status = 0
var/mob/foundmob = "" //Used in throwing proc.
var/obj/item/weapon/cell/high/bcell = 0
var/hitcost = 1500
origin_tech = "combat=2"
attack_verb = list("beaten")
var/stunforce = 0
var/agonyforce = 60
var/status = 0 //whether the thing is on or not
var/obj/item/weapon/cell/high/bcell = null
var/mob/foundmob = "" //Used in throwing proc.
var/hitcost = 1500 //oh god why do power cells carry so much charge? We probably need to make a distinction between "industrial" sized power cells for APCs and power cells for everything else.
suicide_act(mob/user)
viewers(user) << "<span class='suicide'>[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.</span>"
return (FIRELOSS)
/obj/item/weapon/melee/baton/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is putting the live [name] in \his mouth! It looks like \he's trying to commit suicide.</span>")
return (FIRELOSS)
/obj/item/weapon/melee/baton/loaded/New()
/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed.
..()
bcell = new(src)
bcell = new/obj/item/weapon/cell/high(src)
update_icon()
return
@@ -116,51 +118,54 @@
..()
return
var/mob/living/carbon/human/H = M
var/agony = agonyforce
var/stun = stunforce
var/mob/living/L = M
var/target_zone = check_zone(user.zone_sel.selecting)
if(user.a_intent == "hurt")
if(!..()) return
H.visible_message("<span class='danger'>[M] has been beaten with the [src] by [user]!</span>")
if (!..()) //item/attack() does it's own messaging and logs
return 0 // item/attack() will return 1 if they hit, 0 if they missed.
agony *= 0.5 //whacking someone causes a much poorer contact than prodding them.
stun *= 0.5
//we can't really extract the actual hit zone from ..(), unfortunately. Just act like they attacked the area they intended to.
else
//copied from human_defense.dm - human defence code should really be refactored some time.
if (ishuman(L))
user.lastattacked = L //are these used at all, if we have logs?
L.lastattacker = user
user.attack_log += "\[[time_stamp()]\]<font color='red'> Beat [H.name] ([H.ckey]) with [src.name]</font>"
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Beaten by [user.name] ([user.ckey]) with [src.name]</font>"
msg_admin_attack("[user.name] ([user.ckey]) beat [H.name] ([H.ckey]) with [src.name] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if (user != L) // Attacking yourself can't miss
target_zone = get_zone_with_miss_chance(user.zone_sel.selecting, L)
playsound(src.loc, "swing_hit", 50, 1, -1)
if(!target_zone)
L.visible_message("\red <B>[user] misses [L] with \the [src]!")
return 0
else if(!status)
H.visible_message("<span class='warning'>[H] has been prodded with [src] by [user]. Luckily it was off.</span>")
return
var/stunroll = (rand(1,100))
if(status)
user.lastattacked = H
H.lastattacker = user
if(user == H) // Attacking yourself can't miss
stunroll = 100
if(stunroll < 40)
H.visible_message("\red <B>[user] misses [H] with \the [src]!")
msg_admin_attack("[key_name(user)] attempted to stun [key_name(H)] with the [src].")
return
H.Stun(stunforce)
H.Weaken(stunforce)
H.apply_effect(STUTTER, stunforce)
H.visible_message("<span class='danger'>[H] has been stunned with [src] by [user]!</span>")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
msg_admin_attack("[key_name(user)] stunned [key_name(H)] with the [src].")
user.attack_log += "\[[time_stamp()]\]<font color='red'> Stunned [H.name] ([H.ckey]) with [src.name]</font>"
H.attack_log += "\[[time_stamp()]\]<font color='orange'> Stunned by [user.name] ([user.ckey]) with [src.name]</font>"
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc
if(R && R.cell)
R.cell.use(hitcost)
var/mob/living/carbon/human/H = L
var/datum/organ/external/affecting = H.get_organ(target_zone)
if (affecting)
if(!status)
L.visible_message("<span class='warning'>[L] has been prodded in the [affecting.display_name] with [src] by [user]. Luckily it was off.</span>")
return 1
else
H.visible_message("<span class='danger'>[L] has been prodded in the [affecting.display_name] with [src] by [user]!</span>")
else
deductcharge(hitcost)
if(!status)
L.visible_message("<span class='warning'>[L] has been prodded with [src] by [user]. Luckily it was off.</span>")
return 1
else
L.visible_message("<span class='danger'>[L] has been prodded with [src] by [user]!</span>")
//stun effects
L.stun_effect_act(stun, agony, target_zone, src)
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
msg_admin_attack("[key_name(user)] stunned [key_name(L)] with the [src].")
deductcharge(hitcost)
return 1
/obj/item/weapon/melee/baton/throw_impact(atom/hit_atom)
@@ -169,9 +174,19 @@
if(istype(hit_atom, /mob/living))
var/mob/living/carbon/human/H = hit_atom
if(status)
H.Stun(stunforce)
H.Weaken(stunforce)
H.apply_effect(STUTTER, stunforce)
//stun effects
if (stunforce)
H.Stun(stunforce)
H.Weaken(stunforce)
H.apply_effect(STUTTER, stunforce)
if (agonyforce)
//Siemens coefficient?
//TODO: Merge this with taser effects
H.apply_effect(agonyforce,AGONY,0)
H.apply_effect(STUTTER, agonyforce/10)
H.apply_effect(EYE_BLUR, agonyforce/10)
H.flash_pain()
deductcharge(hitcost)
@@ -196,11 +211,19 @@
/obj/item/weapon/melee/baton/emp_act(severity)
if(bcell)
deductcharge(1000 / severity)
if(bcell.reliability != 100 && prob(50/severity))
bcell.reliability -= 10 / severity
bcell.emp_act(severity) //let's not duplicate code everywhere if we don't have to please.
..()
//secborg stun baton module
/obj/item/weapon/melee/baton/robot/attack_self(mob/user)
//try to find our power cell
var/mob/living/silicon/robot/R = loc
if (istype(R))
bcell = R.cell
return ..()
/obj/item/weapon/melee/baton/robot/attackby(obj/item/weapon/W, mob/user)
return
/obj/item/weapon/melee/baton/loaded/ntcane
name = "fancy cane"
@@ -216,8 +239,10 @@
item_state = "prod"
force = 3
throwforce = 5
stunforce = 5
stunforce = 0
agonyforce = 60 //same force as a stunbaton, but uses way more charge.
hitcost = 2500
attack_verb = list("poked")
slot_flags = null
/obj/item/weapon/melee/baton/cattleprod/update_icon()
@@ -137,7 +137,7 @@ Frequency:
/obj/item/weapon/hand_tele/attack_self(mob/user as mob)
var/turf/current_location = get_turf(user)//What turf is the user on?
if(!current_location||current_location.z==2||current_location.z>=7)//If turf was not found or they're on z level 2 or >7 which does not currently exist.
if(!current_location||current_location.z==2||current_location.z>=8)//If turf was not found or they're on z level 2 or >8 which does not currently exist.
user << "<span class='notice'>\The [src] is malfunctioning.</span>"
return
var/list/L = list( )
+3
View File
@@ -477,6 +477,9 @@
if(S.brute_dam)
S.heal_damage(15,0,0,1)
user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src].")
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
H.updatehealth()
return
else
user << "Nothing to fix!"
+8
View File
@@ -50,6 +50,14 @@
if (!can_touch(user) || !climbable)
return
for(var/obj/O in range(0, src))
if(O.density == 1 && O != src && !istype(O, /obj/machinery/door/window)) //Ignores windoors, as those already block climbing, otherwise a windoor on the opposite side of a table would prevent climbing.
user << "\red You cannot climb a [src] blocked by a solid object!"
return
for(var/turf/T in range(0, src))
if(T.density == 1)
user << "\red You cannot climb a [src] blocked by a solid object!"
return
var/turf/T = src.loc
if(!T || !istype(T)) return

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