Keeping up to date with ZomgPonies/Paradise
@@ -225,6 +225,7 @@
|
||||
#include "code\datums\wires\particle_accelerator.dm"
|
||||
#include "code\datums\wires\radio.dm"
|
||||
#include "code\datums\wires\robot.dm"
|
||||
#include "code\datums\wires\syndicatebomb.dm"
|
||||
#include "code\datums\wires\vending.dm"
|
||||
#include "code\datums\wires\wires.dm"
|
||||
#include "code\defines\obj.dm"
|
||||
@@ -418,6 +419,7 @@
|
||||
#include "code\game\machinery\status_display.dm"
|
||||
#include "code\game\machinery\suit_storage_unit.dm"
|
||||
#include "code\game\machinery\syndicatebeacon.dm"
|
||||
#include "code\game\machinery\syndicatebomb.dm"
|
||||
#include "code\game\machinery\telepad.dm"
|
||||
#include "code\game\machinery\teleporter.dm"
|
||||
#include "code\game\machinery\transformer.dm"
|
||||
@@ -646,6 +648,7 @@
|
||||
#include "code\game\objects\items\weapons\cosmetics.dm"
|
||||
#include "code\game\objects\items\weapons\dice.dm"
|
||||
#include "code\game\objects\items\weapons\dna_injector.dm"
|
||||
#include "code\game\objects\items\weapons\dnascrambler.dm"
|
||||
#include "code\game\objects\items\weapons\explosives.dm"
|
||||
#include "code\game\objects\items\weapons\extinguisher.dm"
|
||||
#include "code\game\objects\items\weapons\flamethrower.dm"
|
||||
@@ -684,6 +687,7 @@
|
||||
#include "code\game\objects\items\weapons\grenades\grenade.dm"
|
||||
#include "code\game\objects\items\weapons\grenades\smokebomb.dm"
|
||||
#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm"
|
||||
#include "code\game\objects\items\weapons\grenades\syndieminibomb.dm"
|
||||
#include "code\game\objects\items\weapons\implants\deadman.dm"
|
||||
#include "code\game\objects\items\weapons\implants\implant.dm"
|
||||
#include "code\game\objects\items\weapons\implants\implantcase.dm"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -190,18 +208,24 @@ 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
|
||||
cost = 20
|
||||
gamemodes = list("nuclear emergency")
|
||||
|
||||
|
||||
@@ -211,6 +235,12 @@ var/list/uplink_items = list()
|
||||
item = /obj/item/ammo_box/a357
|
||||
cost = 2
|
||||
|
||||
/datum/uplink_item/dangerous/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."
|
||||
@@ -218,19 +248,18 @@ var/list/uplink_items = list()
|
||||
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 = 6
|
||||
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"
|
||||
@@ -239,10 +268,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"
|
||||
@@ -250,6 +288,12 @@ 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
|
||||
|
||||
|
||||
// STEALTHY WEAPONS
|
||||
|
||||
@@ -280,8 +324,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
|
||||
|
||||
@@ -294,6 +337,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."
|
||||
@@ -318,6 +368,12 @@ 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
|
||||
|
||||
/datum/uplink_item/stealthy_tools/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."
|
||||
@@ -411,6 +467,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."
|
||||
@@ -418,6 +495,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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
.()
|
||||
@@ -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" : "."]"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -116,7 +116,6 @@ var/list/support_positions = list(
|
||||
"Mime",
|
||||
"Barber",
|
||||
"Magistrate",
|
||||
"Nanotrasen Representative",
|
||||
"Nanotrasen Recruiter"
|
||||
)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(), */ \
|
||||
)
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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())
|
||||
|
||||
|
||||
@@ -0,0 +1,307 @@
|
||||
/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)
|
||||
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))
|
||||
holder.open_panel = 0
|
||||
if(holder.wires)
|
||||
holder.wires.Shuffle()
|
||||
holder.defused = 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...</span>")
|
||||
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
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -151,51 +152,9 @@
|
||||
//canremove==0 means that object may not be removed. You can still wear it. This only applies to clothing. /N
|
||||
if(!src.canremove)
|
||||
return 0
|
||||
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
if(istype(src, /obj/item/clothing/suit/space/rig)) // If the item to be unequipped is a rigid suit
|
||||
if(user.delay_clothing_u_equip(src) == 0)
|
||||
return 0
|
||||
else
|
||||
user.u_equip(src)
|
||||
else
|
||||
user.u_equip(src)
|
||||
|
||||
/*
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(src, /obj/item/clothing/suit/space/rig)) // If the item to unequip item is a rigid suit
|
||||
if(! istype(H.head, /obj/item/clothing/head/helmet/space/rig)) // If the person is NOT wearing a rigid suit helmet
|
||||
var/tempX = H.x
|
||||
var/tempY = H.y
|
||||
H << "\blue You unfastening the seals and clambering out of the [src]. (This will take a while)."
|
||||
var/obj/item/clothing/head/helmet/space/rig/this_rig = src
|
||||
var/equip_time = round(this_rig.equip_time/10)
|
||||
var/i
|
||||
for(i=1; i<=equip_time; i++)
|
||||
sleep (10) // Check if they've moved every 10 time units
|
||||
if ((tempX != usr.x) || (tempY != usr.y))
|
||||
H << "\red \The [src] is too fiddly to remove whilst moving."
|
||||
return 0
|
||||
H << "\blue You finish removing the [src]."
|
||||
else
|
||||
H << "\red You must remove \the [H.head] first."
|
||||
return 0
|
||||
|
||||
if(istype(src, /obj/item/clothing/head/helmet/space/rig)) // If the item to unequip is a rigid suit helmet
|
||||
var/tempX = H.x
|
||||
var/tempY = H.y
|
||||
H << "\blue You start unfastening the [src]. (This will take a while)."
|
||||
var/obj/item/clothing/suit/space/rig/this_helmet = src
|
||||
var/equip_time = round(this_helmet.equip_time/10)
|
||||
var/i
|
||||
for(i=1; i<=equip_time; i++)
|
||||
sleep (10) // Check if they've moved every 10 time units
|
||||
if ((tempX != usr.x) || (tempY != usr.y))
|
||||
H << "\red \The [src] is too fiddly to remove whilst moving."
|
||||
return 0
|
||||
H << "\blue You finish removing the [src]."
|
||||
*/
|
||||
else
|
||||
if(isliving(src.loc))
|
||||
return 0
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -14,64 +14,43 @@
|
||||
origin_tech = "materials=1"
|
||||
var/dispenser = 0
|
||||
var/breakouttime = 1200 //Deciseconds = 120s = 2 minutes
|
||||
var/cuff_sound = 'sound/weapons/handcuffs.ogg'
|
||||
|
||||
|
||||
/obj/item/weapon/handcuffs/attack(mob/living/carbon/C as mob, mob/user as mob)
|
||||
if (!istype(user, /mob/living/carbon/human))
|
||||
user << "\red You don't have the dexterity to do this!"
|
||||
return
|
||||
if ((M_CLUMSY in usr.mutations) && prob(50))
|
||||
user << "\red Uh ... how do those things work?!"
|
||||
place_handcuffs(user, user)
|
||||
return
|
||||
if(!C.handcuffed)
|
||||
if (C == user)
|
||||
place_handcuffs(user, user)
|
||||
/obj/item/weapon/handcuffs/attack(mob/living/carbon/C, mob/user)
|
||||
if(M_CLUMSY in user.mutations && prob(50))
|
||||
user << "<span class='warning'>Uh... how do those things work?!</span>"
|
||||
if(!C.handcuffed)
|
||||
user.drop_item()
|
||||
loc = C
|
||||
C.handcuffed = src
|
||||
C.update_inv_handcuffed()
|
||||
return
|
||||
|
||||
//check for an aggressive grab
|
||||
for (var/obj/item/weapon/grab/G in C.grabbed_by)
|
||||
if (G.loc == user && G.state >= GRAB_AGGRESSIVE)
|
||||
place_handcuffs(C, user)
|
||||
|
||||
var/cable = 0
|
||||
if(istype(src, /obj/item/weapon/handcuffs/cable))
|
||||
cable = 1
|
||||
|
||||
if(!C.handcuffed)
|
||||
C.visible_message("<span class='danger'>[user] is trying to put handcuffs on [C]!</span>", \
|
||||
"<span class='danger'>[user] is trying to put handcuffs on [C]!</span>")
|
||||
|
||||
if(cable)
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
else
|
||||
playsound(loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2)
|
||||
|
||||
if(do_mob(user, C, 30))
|
||||
if(C.handcuffed)
|
||||
return
|
||||
user << "\red You need to have a firm grip on [C] before you can put \the [src] on!"
|
||||
user.drop_item()
|
||||
loc = C
|
||||
C.handcuffed = src
|
||||
C.update_inv_handcuffed()
|
||||
if(cable)
|
||||
feedback_add_details("handcuffs","C")
|
||||
else
|
||||
feedback_add_details("handcuffs","H")
|
||||
|
||||
/obj/item/weapon/handcuffs/proc/place_handcuffs(var/mob/living/carbon/target, var/mob/user)
|
||||
playsound(src.loc, cuff_sound, 30, 1, -2)
|
||||
|
||||
if (ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been handcuffed (attempt) by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Attempted to handcuff [H.name] ([H.ckey])</font>")
|
||||
msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(H)]")
|
||||
|
||||
var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
|
||||
O.source = user
|
||||
O.target = H
|
||||
O.item = user.get_active_hand()
|
||||
O.s_loc = user.loc
|
||||
O.t_loc = H.loc
|
||||
O.place = "handcuff"
|
||||
H.requests += O
|
||||
spawn( 0 )
|
||||
feedback_add_details("handcuffs","H")
|
||||
O.process()
|
||||
return
|
||||
|
||||
if (ismonkey(target))
|
||||
var/mob/living/carbon/monkey/M = target
|
||||
var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( )
|
||||
O.source = user
|
||||
O.target = M
|
||||
O.item = user.get_active_hand()
|
||||
O.s_loc = user.loc
|
||||
O.t_loc = M.loc
|
||||
O.place = "handcuff"
|
||||
M.requests += O
|
||||
spawn( 0 )
|
||||
O.process()
|
||||
return
|
||||
add_logs(user, C, "handcuffed")
|
||||
|
||||
var/last_chew = 0
|
||||
/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
|
||||
@@ -105,7 +84,6 @@ var/last_chew = 0
|
||||
desc = "Looks like some cables tied together. Could be used to tie something up."
|
||||
icon_state = "cuff_red"
|
||||
breakouttime = 300 //Deciseconds = 30s
|
||||
cuff_sound = 'sound/weapons/cablecuff.ogg'
|
||||
|
||||
/obj/item/weapon/handcuffs/cable/red
|
||||
icon_state = "cuff_red"
|
||||
@@ -150,17 +128,3 @@ var/last_chew = 0
|
||||
user << "<span class='notice'>You wrap the cable restraint around the top of the rod.</span>"
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/handcuffs/cyborg
|
||||
dispenser = 1
|
||||
|
||||
/obj/item/weapon/handcuffs/cyborg/attack(mob/living/carbon/C as mob, mob/user as mob)
|
||||
if(!C.handcuffed)
|
||||
var/turf/p_loc = user.loc
|
||||
var/turf/p_loc_m = C.loc
|
||||
playsound(src.loc, cuff_sound, 30, 1, -2)
|
||||
user.visible_message("\red <B>[user] is trying to put handcuffs on [C]!</B>")
|
||||
spawn(30)
|
||||
if(!C) return
|
||||
if(p_loc == user.loc && p_loc_m == C.loc)
|
||||
C.handcuffed = new /obj/item/weapon/handcuffs(C)
|
||||
C.update_inv_handcuffed()
|
||||
|
||||
@@ -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
|
||||
@@ -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!"
|
||||
|
||||
@@ -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)"
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
new /obj/item/weapon/cell/high(src)
|
||||
new /obj/item/weapon/card/id/syndicate(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/weapon/shield/energy(src)
|
||||
new /obj/item/clothing/shoes/magboots(src)
|
||||
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@ var/list/adminlog = list()
|
||||
var/list/powernets = list()
|
||||
|
||||
var/Debug = 0 // global debug switch
|
||||
var/Debug2 = 0
|
||||
var/Debug2 = 1 // enables detailed job debug file in secrets
|
||||
|
||||
var/datum/debug/debugobj
|
||||
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
/obj/item/clothing
|
||||
name = "clothing"
|
||||
var/list/species_restricted = null //Only these species can wear this kit.
|
||||
var/equip_time = 0
|
||||
var/equipping = 0
|
||||
var/rig_restrict_helmet = 0 // Stops the user from equipping a rig helmet without attaching it to the suit first.
|
||||
|
||||
//BS12: Species-restricted clothing check.
|
||||
/obj/item/clothing/mob_can_equip(M as mob, slot)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
/obj/item/clothing/glasses/hud/health_advanced
|
||||
name = "Advanced Health Scanner HUD"
|
||||
desc = "A heads-up display that scans the humans in view and provides accurate data about their health status. Includes anti-flash filter."
|
||||
icon_state = "healthhud"
|
||||
icon_state = "advmedhud"
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -69,7 +69,6 @@
|
||||
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
|
||||
icon_state = "rig0-engineering"
|
||||
item_state = "eng_helm"
|
||||
rig_restrict_helmet = 1
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80)
|
||||
allowed = list(/obj/item/device/flashlight)
|
||||
var/brightness_on = 4 //luminosity when on
|
||||
@@ -115,8 +114,7 @@
|
||||
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
|
||||
icon_state = "rig-engineering"
|
||||
item_state = "eng_hardsuit"
|
||||
equip_time = 100 // Bone White - time to equip/unequip. see /obj/item/attack_hand (items.dm) and /obj/item/clothing/mob_can_equip (clothing.dm)
|
||||
slowdown = 4
|
||||
slowdown = 1
|
||||
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
@@ -374,7 +372,6 @@
|
||||
flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE | ONESIZEFITSALL
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 80)
|
||||
sprite_sheets = null
|
||||
slowdown = 2
|
||||
|
||||
//Singuloth armor
|
||||
/obj/item/clothing/head/helmet/space/rig/singuloth
|
||||
@@ -441,7 +438,7 @@
|
||||
name = "blood-red hardsuit"
|
||||
desc = "An advanced suit that protects against injuries during special operations. Property of Gorlex Marauders."
|
||||
item_state = "syndie_hardsuit"
|
||||
slowdown = 2
|
||||
slowdown = 1
|
||||
w_class = 3
|
||||
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/device/suit_cooling_unit)
|
||||
|
||||
@@ -319,6 +319,7 @@
|
||||
throw_range = 4
|
||||
sharp = 1
|
||||
edge = 1
|
||||
m_amt = 10000
|
||||
origin_tech = "materials=2;combat=1"
|
||||
attack_verb = list("chopped", "torn", "cut")
|
||||
|
||||
|
||||
@@ -146,28 +146,6 @@
|
||||
update_icons()
|
||||
return
|
||||
|
||||
/mob/proc/delay_clothing_u_equip(obj/item/clothing/X as obj) // Bone White - delays unequipping by parameter. Requires W to be /obj/item/clothing/
|
||||
|
||||
if(!istype(X)) return 0
|
||||
|
||||
if(X.equipping == 1) return 0 // Item is already being (un)equipped
|
||||
|
||||
var/tempX = usr.x
|
||||
var/tempY = usr.y
|
||||
usr << "\blue You start unequipping the [X]."
|
||||
X.equipping = 1
|
||||
var/equip_time = round(X.equip_time/10)
|
||||
var/i
|
||||
for(i=1; i<=equip_time; i++)
|
||||
sleep (10) // Check if they've moved every 10 time units
|
||||
if ((tempX != usr.x) || (tempY != usr.y))
|
||||
src << "\red \The [X] is too fiddly to unequip whilst moving."
|
||||
X.equipping = 0
|
||||
return 0
|
||||
u_equip(X)
|
||||
usr << "\blue You have finished unequipping the [X]."
|
||||
X.equipping = 0
|
||||
|
||||
/mob/proc/u_equip(W as obj)
|
||||
if (W == r_hand)
|
||||
r_hand = null
|
||||
|
||||
@@ -165,16 +165,17 @@
|
||||
m_type = 1
|
||||
|
||||
if ("cough")
|
||||
if(miming)
|
||||
message = "<B>[src]</B> appears to cough!"
|
||||
m_type = 1
|
||||
else
|
||||
if (!muzzled)
|
||||
message = "<B>[src]</B> coughs!"
|
||||
m_type = 2
|
||||
if(!reagents.has_reagent("dextromethorphan"))
|
||||
if(miming)
|
||||
message = "<B>[src]</B> appears to cough!"
|
||||
m_type = 1
|
||||
else
|
||||
message = "<B>[src]</B> makes a strong noise."
|
||||
m_type = 2
|
||||
if (!muzzled)
|
||||
message = "<B>[src]</B> coughs!"
|
||||
m_type = 2
|
||||
else
|
||||
message = "<B>[src]</B> makes a strong noise."
|
||||
m_type = 2
|
||||
|
||||
if ("frown")
|
||||
message = "<B>[src]</B> frowns."
|
||||
|
||||
@@ -191,7 +191,7 @@ emp_act
|
||||
|
||||
if(user == src) // Attacking yourself can't miss
|
||||
target_zone = user.zone_sel.selecting
|
||||
if(!target_zone && !src.stat)
|
||||
if(!target_zone && !src.stat && !I.discrete)
|
||||
visible_message("\red <B>[user] misses [src] with \the [I]!")
|
||||
return 0
|
||||
|
||||
@@ -239,11 +239,11 @@ emp_act
|
||||
emag.uses--
|
||||
affecting.sabotaged = 1
|
||||
return 1
|
||||
|
||||
if(I.attack_verb.len)
|
||||
visible_message("\red <B>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!</B>")
|
||||
else
|
||||
visible_message("\red <B>[src] has been attacked in the [hit_area] with [I.name] by [user]!</B>")
|
||||
if(! I.discrete)
|
||||
if(I.attack_verb.len)
|
||||
visible_message("\red <B>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!</B>")
|
||||
else
|
||||
visible_message("\red <B>[src] has been attacked in the [hit_area] with [I.name] by [user]!</B>")
|
||||
|
||||
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].")
|
||||
var/weapon_sharp = is_sharp(I)
|
||||
|
||||
@@ -1,28 +1,9 @@
|
||||
/mob/living/carbon/human/movement_delay()
|
||||
var/tally = 0
|
||||
|
||||
if(wear_suit)
|
||||
if(wear_suit.slowdown > 0)
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
var/local_pressure = environment.return_pressure()
|
||||
switch (local_pressure)
|
||||
if(20 to 40)
|
||||
tally = min(1,wear_suit.slowdown)
|
||||
if(40 to 60)
|
||||
tally = min(2,wear_suit.slowdown)
|
||||
if(60 to 80)
|
||||
tally = min(3,wear_suit.slowdown)
|
||||
if(80 to INFINITY)
|
||||
tally = min(4,wear_suit.slowdown)
|
||||
|
||||
tally = min(wear_suit.slowdown, tally) // Initial slow will never get more powerful than the slowdown on the suit.
|
||||
|
||||
if(species && species.flags & IS_SLOW) //Bone White - added additional slow for wearing a rig suit. Species who have IS_SLOW (Diona) do not gain a speed buff now
|
||||
if(species && species.flags & IS_SLOW)
|
||||
tally = 5
|
||||
|
||||
//if(wear_suit) // These two lines are now redundant due to comment above
|
||||
// tally += wear_suit.slowdown
|
||||
|
||||
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
|
||||
|
||||
if(embedded_flag)
|
||||
@@ -43,6 +24,8 @@
|
||||
var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
|
||||
if (hungry >= 70) tally += hungry/50
|
||||
|
||||
if(wear_suit)
|
||||
tally += wear_suit.slowdown
|
||||
|
||||
if(!buckled || (buckled && !istype(buckled, /obj/structure/stool/bed/chair/wheelchair)))
|
||||
if(shoes)
|
||||
|
||||
@@ -10,17 +10,6 @@
|
||||
H << "<span class='notice'>You are not holding anything to equip.</span>"
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/clothing/head/helmet/space/rig)) // If the item to be equipped is a rigid suit helmet
|
||||
src << "\red You must fasten the helmet to a hardsuit first. (Target the head)" // Stop eva helms equipping.
|
||||
return 0
|
||||
|
||||
|
||||
if(istype(I, /obj/item/clothing/suit/space/rig)) // If the item to be equipped is a rigid suit
|
||||
var/obj/item/clothing/suit/space/rig/J = I
|
||||
if(J.equip_time > 0)
|
||||
delay_clothing_equip_to_slot_if_possible(J, 13) // 13 = suit slot
|
||||
return 0
|
||||
|
||||
if(H.equip_to_appropriate_slot(I))
|
||||
if(hand)
|
||||
update_inv_l_hand(0)
|
||||
@@ -703,16 +692,6 @@ It can still be worn/put on as normal.
|
||||
slot_to_process = slot_handcuffed
|
||||
if (target.handcuffed)
|
||||
strip_item = target.handcuffed
|
||||
else if (source != target && ishuman(source))
|
||||
//check that we are still grabbing them
|
||||
var/grabbing = 0
|
||||
for (var/obj/item/weapon/grab/G in target.grabbed_by)
|
||||
if (G.loc == source && G.state >= GRAB_AGGRESSIVE)
|
||||
grabbing = 1
|
||||
if (!grabbing)
|
||||
slot_to_process = null
|
||||
source << "\red Your grasp was broken before you could restrain [target]!"
|
||||
|
||||
if("legcuff")
|
||||
slot_to_process = slot_legcuffed
|
||||
if (target.legcuffed)
|
||||
|
||||
@@ -105,21 +105,8 @@
|
||||
/mob/proc/attack_ui(slot)
|
||||
var/obj/item/W = get_active_hand()
|
||||
|
||||
//if(istype(W))
|
||||
// equip_to_slot_if_possible(W, slot)
|
||||
|
||||
if(istype(W))
|
||||
if (istype(W, /obj/item/clothing))
|
||||
var/obj/item/clothing/C = W
|
||||
if(C.rig_restrict_helmet)
|
||||
src << "\red You must fasten the helmet to a hardsuit first. (Target the head)" // Stop eva helms equipping.
|
||||
else
|
||||
if(C.equip_time > 0)
|
||||
delay_clothing_equip_to_slot_if_possible(C, slot)
|
||||
else
|
||||
equip_to_slot_if_possible(C, slot)
|
||||
else
|
||||
equip_to_slot_if_possible(W, slot)
|
||||
equip_to_slot_if_possible(W, slot)
|
||||
|
||||
if(ishuman(src) && W == src:head)
|
||||
src:update_hair()
|
||||
@@ -131,30 +118,9 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
//This is a SAFE proc. Use this instead of equip_to_splot()!
|
||||
/mob/proc/delay_clothing_equip_to_slot_if_possible(obj/item/clothing/X as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1, delay_time = 0)
|
||||
if(!istype(X)) return 0
|
||||
|
||||
if(X.equipping == 1) return 0 // Item is already being equipped
|
||||
|
||||
var/tempX = usr.x
|
||||
var/tempY = usr.y
|
||||
usr << "\blue You start equipping the [X]."
|
||||
X.equipping = 1
|
||||
var/equip_time = round(X.equip_time/10)
|
||||
var/i
|
||||
for(i=1; i<=equip_time; i++)
|
||||
sleep (10) // Check if they've moved every 10 time units
|
||||
if ((tempX != usr.x) || (tempY != usr.y))
|
||||
src << "\red \The [X] is too fiddly to fasten whilst moving."
|
||||
X.equipping = 0
|
||||
return 0
|
||||
equip_to_slot_if_possible(X, slot)
|
||||
usr << "\blue You have finished equipping the [X]."
|
||||
X.equipping = 0
|
||||
|
||||
|
||||
//This is a SAFE proc. Use this instead of equip_to_splot()!
|
||||
//This is a SAFE proc. Use this instead of equip_to_slot()!
|
||||
//set del_on_fail to have it delete W if it fails to equip
|
||||
//set disable_warning to disable the 'you are unable to equip that' warning.
|
||||
//unset redraw_mob to prevent the mob from being redrawn at the end.
|
||||
|
||||
@@ -13,7 +13,7 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list()
|
||||
var/urge = ""
|
||||
var/favor = FAVOR_INDIFFERENT
|
||||
var/cult_name = null
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/New(var/mob/target)
|
||||
owner = target
|
||||
@@ -53,7 +53,7 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list()
|
||||
set desc = "Reach out for your gods presence."
|
||||
set name = "Reach Out"
|
||||
set src in usr
|
||||
|
||||
|
||||
for(var/mob/spirit/mask/currentMask in spirits)
|
||||
if (currentMask.is_active())
|
||||
owner << "\red \b You feel the reassuring presence of your god."
|
||||
@@ -61,8 +61,8 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list()
|
||||
return
|
||||
owner << "\b You feel a chilling absence."
|
||||
handle_missing_mask()
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/verb/check_favor()
|
||||
set category = "Cult"
|
||||
set desc = "Check your favor with your god."
|
||||
@@ -82,46 +82,46 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list()
|
||||
set desc = "Pray to your god"
|
||||
set name = "Pray to Nar'Sie"
|
||||
set src in usr
|
||||
|
||||
|
||||
var/input = stripped_input(usr, "Please choose a message to say to your god.", "Pray to Nar'Sie", "")
|
||||
if(!input)
|
||||
return
|
||||
|
||||
|
||||
cult_log("[key_name(usr,0)](Pray):[input]")
|
||||
owner << "<span class='cultspeech'><b>You pray to Nar'Sie</b>: [input]</span>"
|
||||
|
||||
|
||||
for(var/mob/spirit/spirit in spirits)
|
||||
spirit << "<span class='cultspeech'><span class='name'><a href='byond://?src=\ref[spirit];track2=\ref[spirit];track=\ref[usr]'>[get_display_name()]</a> prays : </span><span class='message'>[input]</span></span>"
|
||||
|
||||
|
||||
// PROCS
|
||||
/obj/cult_viewpoint/proc/set_favor(var/newFavor)
|
||||
favor = newFavor
|
||||
check_favor()
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/proc/set_urge(var/newUrge)
|
||||
if (!newUrge)
|
||||
src.urge = null
|
||||
src.urge = copytext(newUrge, 1, MAX_MESSAGE_LEN)
|
||||
check_urge()
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/proc/can_use()
|
||||
if (owner.stat != DEAD)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/proc/can_see()
|
||||
return hear(view_range, get_turf(owner))
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/proc/get_cult_name()
|
||||
if (cult_name)
|
||||
return cult_name
|
||||
return "An Unknown Servent"
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/proc/set_cult_name(var/newName)
|
||||
if (!owner)
|
||||
return FALSE
|
||||
@@ -131,47 +131,51 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list()
|
||||
else
|
||||
cult_name = null
|
||||
owner << "\red \b Your god has taken your secret name."
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/proc/get_display_name()
|
||||
if (!owner)
|
||||
return
|
||||
if (cult_name)
|
||||
return cult_name
|
||||
return owner.name
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/proc/become_mask()
|
||||
set category = "Cult"
|
||||
set name = "Become Mask"
|
||||
set desc = "Sacrifice your life and become a Mask of Nar'sie."
|
||||
set src in usr
|
||||
|
||||
|
||||
cult_log("[key_name(usr,0)] has tried to become a Mask of Nar'sie.")
|
||||
|
||||
|
||||
if (!active_mask())
|
||||
var/transformation_type = alert(owner.client, "You are about to become a Mask. Do you want it to be subtle or violent?", "Mask", "Subtle", "Violent")
|
||||
if(!active_mask())
|
||||
cult_log("[key_name(usr,0)] has become a Mask of Nar'sie.")
|
||||
if (transformation_type=="Subtle")
|
||||
log_admin("[key_name_admin(owner)] has subtly become a Mask of Nar'sie")
|
||||
owner.make_into_mask(0,0)
|
||||
else
|
||||
log_admin("[key_name_admin(owner)] has violently become a Mask of Nar'sie")
|
||||
owner.make_into_mask(1,1)
|
||||
var/confirm = alert(owner.client, "You are about to become a Mask of Nar'sie. This will destroy your body, and you will only be able to guide the other cultists through communication. Are you sure?", "Confirm Your Sacrifice", "Yes", "No")
|
||||
if(confirm == "Yes")
|
||||
var/transformation_type = alert(owner.client, "You are about to become a Mask. Do you want it to be subtle or violent?", "Mask", "Subtle", "Violent")
|
||||
if(!active_mask())
|
||||
cult_log("[key_name(usr,0)] has become a Mask of Nar'sie.")
|
||||
if (transformation_type=="Subtle")
|
||||
log_admin("[key_name_admin(owner)] has subtly become a Mask of Nar'sie")
|
||||
owner.make_into_mask(0,0)
|
||||
else
|
||||
log_admin("[key_name_admin(owner)] has violently become a Mask of Nar'sie")
|
||||
owner.make_into_mask(1,1)
|
||||
else
|
||||
return
|
||||
else
|
||||
owner << "\b You cannot become a mask of Nar'Sie because a Mask already exists."
|
||||
mask_has_been_found()
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/proc/active_mask()
|
||||
for(var/mob/spirit/mask/currentMask in spirits)
|
||||
if (currentMask.is_active())
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/proc/handle_missing_mask()
|
||||
if (active_mask())
|
||||
mask_has_been_found()
|
||||
@@ -183,19 +187,19 @@ var/obj/cult_viewpoint/list/cult_viewpoints = list()
|
||||
for(var/obj/cult_viewpoint/viewpoint in cult_viewpoints)
|
||||
if (viewpoint.verbs.Find(/obj/cult_viewpoint/proc/become_mask))
|
||||
viewpoint.verbs-=/obj/cult_viewpoint/proc/become_mask
|
||||
|
||||
|
||||
|
||||
/obj/cult_viewpoint/proc/mask_is_missing()
|
||||
for(var/obj/cult_viewpoint/viewpoint in cult_viewpoints)
|
||||
if (!viewpoint.verbs.Find(/obj/cult_viewpoint/proc/become_mask))
|
||||
viewpoint.verbs+=/obj/cult_viewpoint/proc/become_mask
|
||||
|
||||
|
||||
|
||||
|
||||
/proc/getCultViewpoint(var/mob/currentMob)
|
||||
for(var/obj/cult_viewpoint/currentView in currentMob)
|
||||
return currentView
|
||||
return FALSE
|
||||
|
||||
|
||||
|
||||
#undef FAVOR_PLEASED
|
||||
#undef FAVOR_INDIFFERENT
|
||||
|
||||
@@ -87,21 +87,11 @@
|
||||
/*
|
||||
* Parapens
|
||||
*/
|
||||
/obj/item/weapon/pen/paralysis
|
||||
/obj/item/weapon/pen/paralysis
|
||||
flags = FPRINT | TABLEPASS | OPENCONTAINER
|
||||
origin_tech = "materials=2;syndicate=5"
|
||||
|
||||
|
||||
/obj/item/weapon/pen/paralysis/attack(mob/M as mob, mob/user as mob)
|
||||
if(!ismob(M))
|
||||
return
|
||||
..()
|
||||
msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
if(reagents.total_volume)
|
||||
if(M.reagents) reagents.trans_to(M, 50)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/pen/paralysis/New()
|
||||
var/datum/reagents/R = new/datum/reagents(50)
|
||||
reagents = R
|
||||
@@ -111,16 +101,12 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/pen/paralysis/attackby(var/obj/item/O as obj, var/mob/user as mob) //courtesy of FalseIncarnate!
|
||||
|
||||
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]."
|
||||
/obj/item/weapon/pen/paralysis/attack(mob/M as mob, mob/user as mob)
|
||||
if(!ismob(M))
|
||||
return
|
||||
..()
|
||||
msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
if(reagents.total_volume)
|
||||
if(M.reagents) reagents.trans_to(M, 50) //used to be 150
|
||||
return
|
||||
@@ -70,4 +70,29 @@
|
||||
_color = "centcom"
|
||||
|
||||
/obj/item/weapon/stamp/attack_paw(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
return attack_hand(user)
|
||||
|
||||
// Syndicate stamp to forge documents.
|
||||
|
||||
/obj/item/weapon/stamp/chameleon/attack_self(mob/user as mob)
|
||||
|
||||
var/list/stamp_types = typesof(/obj/item/weapon/stamp) - src.type // Get all stamp types except our own
|
||||
var/list/stamps = list()
|
||||
|
||||
// Generate them into a list
|
||||
for(var/stamp_type in stamp_types)
|
||||
var/obj/item/weapon/stamp/S = new stamp_type
|
||||
stamps[capitalize(S.name)] = S
|
||||
|
||||
var/list/show_stamps = list("EXIT" = null) + sortList(stamps) // the list that will be shown to the user to pick from
|
||||
|
||||
var/input_stamp = input(user, "Choose a stamp to disguise as.", "Choose a stamp.") in show_stamps
|
||||
|
||||
if(user && src in user.contents)
|
||||
|
||||
var/obj/item/weapon/stamp/chosen_stamp = stamps[capitalize(input_stamp)]
|
||||
|
||||
if(chosen_stamp)
|
||||
name = chosen_stamp.name
|
||||
icon_state = chosen_stamp.icon_state
|
||||
_color = chosen_stamp._color
|
||||
@@ -206,8 +206,19 @@
|
||||
icon_state = "crossbow-nocked"
|
||||
return
|
||||
|
||||
else
|
||||
..()
|
||||
else if (istype(W,/obj/item/weapon/arrow))
|
||||
user.visible_message("\The [src] only takes baguettes.")
|
||||
return
|
||||
else if(istype(W,/obj/item/stack/rods))
|
||||
user.visible_message("\The [src] only takes baguettes.")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/cell))
|
||||
user.visible_message("The [src] is too simple be adapted with a cell.")
|
||||
return
|
||||
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/gun/launcher/crossbow/french/increase_tension(var/mob/user as mob)
|
||||
|
||||
|
||||
@@ -209,7 +209,7 @@
|
||||
B.loc = src
|
||||
user << "You set [B] on the machine."
|
||||
nanomanager.update_uis(src) // update all UIs attached to src
|
||||
icon_state = "[icon_state]2"
|
||||
icon_state = "[initial(icon_state)]2"
|
||||
return
|
||||
|
||||
/obj/machinery/chem_dispenser/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
|
||||
|
||||
@@ -0,0 +1,158 @@
|
||||
//Cough medicine.
|
||||
/datum/reagent/antidepressant/dextromethorphan
|
||||
name = "Dextromethorphan"
|
||||
id = "dextromethorphan"
|
||||
description = "Cough medicine."
|
||||
reagent_state = LIQUID
|
||||
color = "#FF1111"
|
||||
custom_metabolism = 0.05
|
||||
data = 0
|
||||
var/message = 0
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(!data) data = 0
|
||||
if(!message) message = 0
|
||||
data += custom_metabolism
|
||||
switch(data + src.volume)
|
||||
if(1 to 5)
|
||||
if(message == 0)
|
||||
M << "\red Your throat feels better and you stop coughing."
|
||||
//The coughing check is made in carbon/human/emote.dm where it checks after this reagent.
|
||||
message = 1
|
||||
if(5 to 12.5)
|
||||
if(message < 2)
|
||||
M << "\red You feel full of strength and energy! You're getting restless!"
|
||||
message = 2
|
||||
if(prob(5)) M.emote(pick("twitch_s"))
|
||||
if(12.5 to 25)
|
||||
if(message < 3)
|
||||
M << "\red Your heartrate is racing. You feel euphoric!"
|
||||
message = 3
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(prob(5)) M.emote(pick("twitch_s","moan"))
|
||||
if(25 to INFINITY)
|
||||
if(message < 4)
|
||||
M << "\red Your heart is racing and your body won't respond properly. You almost feel like you're on autopilot."
|
||||
message = 4
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(prob(10)) M.emote(pick("twitch","moan","drool"))
|
||||
if(prob(10)) M:weakened = max(M:weakened, 10)
|
||||
if(prob(5)) M.hallucination = max(M.hallucination, 5)
|
||||
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/dextromethorphan
|
||||
name = "Dextromethorphan"
|
||||
id = "dextromethorphan"
|
||||
result = "dextromethorphan"
|
||||
required_reagents = list("cryptobiolin" = 1, "hydrogen" = 1, "carbon" = 1)
|
||||
result_amount = 3
|
||||
|
||||
//MDMA
|
||||
/datum/reagent/antidepressant/mdma
|
||||
name = "MDMA"
|
||||
id = "mdma"
|
||||
description = "MDMA is one of the most popular recreational psychoactives, most commonly sold in the form of 'ecstasy' tablets. It is known for its empathogenic, euphoric, and stimulant effects, and has also been used in psychotherapy."
|
||||
reagent_state = LIQUID
|
||||
color = "#EEEEEE"
|
||||
custom_metabolism = 0.1
|
||||
data = 0
|
||||
var/message = 0
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(!data) data = 0
|
||||
if(!message) message = 0
|
||||
data += custom_metabolism
|
||||
switch(data + src.volume)
|
||||
if(1 to 5)
|
||||
if(message == 0)
|
||||
M << "\red Your heart rate increases. Your senses all seem more amplified. You start to feel... euphoric."
|
||||
message = 1
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(prob(5)) M.emote(pick("giggle","moan"))
|
||||
if(5 to 10)
|
||||
if(message < 2)
|
||||
M << "\red Your heart rate increases. Your senses all seem more amplified. You start to feel... euphoric."
|
||||
message = 2
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(prob(5)) M.emote(pick("giggle","moan"))
|
||||
if(10 to 20)
|
||||
if(message < 3)
|
||||
M << "\red Your heart rate increases. Your senses all seem more amplified. You start to feel... euphoric."
|
||||
message = 3
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(prob(5)) M.emote(pick("giggle","moan"))
|
||||
if(20 to INFINITY)
|
||||
if(message < 4)
|
||||
M << "\red That was probably too much..."
|
||||
message = 4
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(prob(10)) M.emote(pick("twitch","giggle","moan"))
|
||||
if(prob(10)) M.emote(pick("drool"))
|
||||
if(prob(10)) M:weakened = max(M:weakened, 10)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/mdma
|
||||
name = "MDMA"
|
||||
id = "mdma"
|
||||
result = "mdma"
|
||||
required_reagents = list("cryptobiolin" = 1, "inaprovaline" = 1, "sugar" = 1)
|
||||
result_amount = 3
|
||||
|
||||
//Meth
|
||||
/datum/reagent/antidepressant/meth
|
||||
name = "Methamphetamine"
|
||||
id = "meth"
|
||||
description = "Methamphetamine is a neurotoxin and potent psychostimulant of the phenethylamine and amphetamine classes that is used as a recreational drug and, rarely, to treat attention deficit hyperactivity disorder (ADHD) and obesity."
|
||||
reagent_state = LIQUID
|
||||
color = "#000088"
|
||||
custom_metabolism = 0.1
|
||||
data = 0
|
||||
var/message = 0
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if(!data) data = 0
|
||||
if(!message) message = 0
|
||||
data += custom_metabolism
|
||||
switch(data + src.volume)
|
||||
if(1 to 5)
|
||||
if(message == 0)
|
||||
M << "\red You feel an intense euphoria wash over you."
|
||||
message = 1
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(prob(10)) M.emote(pick("giggle","moan"))
|
||||
if(5 to 10)
|
||||
if(message < 2)
|
||||
M << "\red The euphoria washing over you is accompanied by an intense restlessness. You need something to do... badly."
|
||||
message = 2
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(prob(10)) M.emote(pick("giggle", "moan", "twitch_s", "twitch"))
|
||||
if(10 to 20)
|
||||
if(message < 3)
|
||||
M << "\red The euphoria you're feeling is accompanied by equal parts restlessness and discomfort as your heartbeat goes all over the place."
|
||||
message = 3
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(prob(10)) M.emote(pick("giggle", "moan", "twitch_s", "twitch"))
|
||||
if(20 to INFINITY)
|
||||
if(message < 4)
|
||||
M << "\red Your heartbeat becomes highly irregular all of a sudden. The world seems a blur around you. Your head is aching."
|
||||
message = 4
|
||||
M.druggy = max(M.druggy, 15)
|
||||
if(prob(10)) M.emote(pick("giggle", "moan", "twitch_s", "twitch"))
|
||||
if(prob(10)) M.emote(pick("drool"))
|
||||
if(prob(10)) M:weakened = max(M:weakened, 10)
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/chemical_reaction/meth
|
||||
name = "Methamphetamine"
|
||||
id = "meth"
|
||||
result = "meth"
|
||||
required_reagents = list("water" = 1, "dextromethorphan" = 1, "potassium" = 1)
|
||||
required_catalysts = list("fuel" = 5)
|
||||
result_amount = 3
|
||||
@@ -1122,7 +1122,8 @@ datum
|
||||
// 1 volume = ~2% chance
|
||||
// 10 volume = ~17% chance
|
||||
// 30 volume = ~38% chance
|
||||
if (rand(0, 50+volume) > 50 && ishuman(M))
|
||||
//if (rand(0, 50+volume) > 50 && ishuman(M))
|
||||
if (volume >= 1 && ishuman(M))
|
||||
for(var/block=1;block<=DNA_SE_LENGTH;block++)
|
||||
M.dna.SetSEState(block,0)
|
||||
genemutcheck(M,block,null,MUTCHK_FORCED)
|
||||
@@ -2275,6 +2276,21 @@ datum
|
||||
..()
|
||||
return
|
||||
|
||||
Spores
|
||||
name = "Spores"
|
||||
id = "spores"
|
||||
description = "A toxic spore cloud which blocks vision when ingested."
|
||||
reagent_state = LIQUID
|
||||
color = "#9ACD32" // rgb: 0, 51, 51
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.adjustToxLoss(0.5*REM)
|
||||
..()
|
||||
M.damageoverlaytemp = 60
|
||||
M.eye_blurry = max(M.eye_blurry, 3)
|
||||
return
|
||||
|
||||
chloralhydrate //Otherwise known as a "Mickey Finn"
|
||||
name = "Chloral Hydrate"
|
||||
id = "chloralhydrate"
|
||||
@@ -2287,10 +2303,10 @@ datum
|
||||
if(!data) data = 1
|
||||
data++
|
||||
switch(data)
|
||||
if(1)
|
||||
if(1 to 10)
|
||||
M.confused += 2
|
||||
M.drowsyness += 2
|
||||
if(2 to 50)
|
||||
if(10 to 50)
|
||||
M.sleeping += 1
|
||||
if(51 to INFINITY)
|
||||
M.sleeping += 1
|
||||
|
||||
@@ -236,6 +236,14 @@
|
||||
log_game("[key_name(user)] fired Space lube from a chem sprayer.")
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror/New()
|
||||
..()
|
||||
reagents.add_reagent("spores", 150)
|
||||
reagents.add_reagent("cryptobiolin", 150)
|
||||
reagents.add_reagent("mutagen", 150)
|
||||
reagents.add_reagent("chloralhydrate", 150)
|
||||
|
||||
|
||||
// Plant-B-Gone
|
||||
/obj/item/weapon/reagent_containers/spray/plantbgone // -- Skie
|
||||
name = "Plant-B-Gone"
|
||||
|
||||
@@ -1442,6 +1442,47 @@ datum/design/noreactbeaker
|
||||
reliability_base = 76
|
||||
build_path = "/obj/item/weapon/reagent_containers/glass/beaker/noreact"
|
||||
category = "Misc"
|
||||
|
||||
datum/design/implanter
|
||||
name = "Implanter"
|
||||
desc = "A basic implanter for injecting implants"
|
||||
id = "implanter"
|
||||
req_tech = list("materials" = 2, "biotech" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 50, "$glass" = 50)
|
||||
build_path = "/obj/item/weapon/implanter"
|
||||
|
||||
|
||||
datum/design/implant_free
|
||||
name = "Freedom Implant"
|
||||
desc = "Use this to escape from those evil Red Shirts."
|
||||
id = "implant_free"
|
||||
req_tech = list("syndicate" = 2, "biotech" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 50, "$glass" = 50)
|
||||
build_path = "/obj/item/weapon/implantcase/freedom"
|
||||
|
||||
datum/design/implant_chem
|
||||
name = "Chemical Implant"
|
||||
desc = "Injects things."
|
||||
id = "implant_chem"
|
||||
req_tech = list("materials" = 2, "biotech" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 50, "$glass" = 50)
|
||||
build_path = "/obj/item/weapon/implantcase/chem"
|
||||
locked = 1
|
||||
|
||||
datum/design/implant_loyal
|
||||
name = "Loyalty Implant"
|
||||
desc = "Makes you loyal or such."
|
||||
id = "implant_loyal"
|
||||
req_tech = list("materials" = 2, "biotech" = 3)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 7000, "$glass" = 7000)
|
||||
build_path = "/obj/item/weapon/implantcase/loyalty"
|
||||
locked = 1
|
||||
|
||||
|
||||
/////////////////////////////////////////
|
||||
/////////////////Weapons/////////////////
|
||||
/////////////////////////////////////////
|
||||
@@ -1505,6 +1546,7 @@ datum/design/rapidsyringe
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 5000, "$glass" = 1000)
|
||||
build_path = "/obj/item/weapon/gun/syringe/rapidsyringe"
|
||||
locked = 1
|
||||
|
||||
datum/design/largecrossbow
|
||||
name = "Energy Crossbow"
|
||||
@@ -1517,7 +1559,7 @@ datum/design/largecrossbow
|
||||
|
||||
datum/design/temp_gun
|
||||
name = "Temperature Gun"
|
||||
desc = "A gun that shoots temperature bullet energythings to change temperature."//Change it if you want
|
||||
desc = "A gun that shoots temperature bullet energy things to change temperature."//Change it if you want
|
||||
id = "temp_gun"
|
||||
req_tech = list("combat" = 3, "materials" = 4, "powerstorage" = 3, "magnets" = 2)
|
||||
build_type = PROTOLATHE
|
||||
@@ -1534,15 +1576,6 @@ datum/design/flora_gun
|
||||
materials = list("$metal" = 2000, "$glass" = 500, "mutagen" = 50)
|
||||
build_path = "/obj/item/weapon/gun/energy/floragun"
|
||||
|
||||
datum/design/portaseed
|
||||
name = "Portaseeder"
|
||||
desc = "An advanced hydroponics tool used for harvesting produce and extracting seeds."
|
||||
id = "portaseed"
|
||||
req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 2)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 500, "$glass" = 500)
|
||||
build_path = "/obj/item/weapon/storage/bag/plants/portaseeder"
|
||||
|
||||
datum/design/large_grenade
|
||||
name = "Large Grenade"
|
||||
desc = "A grenade that affects a larger area and use larger containers."
|
||||
@@ -1618,6 +1651,7 @@ datum/design/plasmapistol
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 5000, "$glass" = 1000, "$plasma" = 3000)
|
||||
build_path = "/obj/item/weapon/gun/energy/toxgun"
|
||||
locked = 1
|
||||
|
||||
/////////////////////////////////////////
|
||||
/////////////////Armor///////////////////
|
||||
@@ -1631,6 +1665,7 @@ datum/design/powerarmor
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 7500, "$plasteel" = 4000)
|
||||
build_path = /obj/item/clothing/suit/space/powered
|
||||
locked = 1
|
||||
|
||||
datum/design/powerarmor_helmet
|
||||
name = "Powered armor helmet"
|
||||
@@ -1640,6 +1675,7 @@ datum/design/powerarmor_helmet
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 3750, "$glass" = 3750, "$plasteel" = 2000)
|
||||
build_path = /obj/item/clothing/head/space/powered
|
||||
locked = 1
|
||||
|
||||
datum/design/powerarmor_gloves
|
||||
name = "Powered armor gloves"
|
||||
@@ -1649,6 +1685,7 @@ datum/design/powerarmor_gloves
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 7500, "$plasteel" = 2000)
|
||||
build_path = /obj/item/clothing/gloves/powered
|
||||
locked = 1
|
||||
|
||||
datum/design/powerarmor_boots
|
||||
name = "Powered armor boots"
|
||||
@@ -1658,6 +1695,7 @@ datum/design/powerarmor_boots
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 7500, "$plasteel" = 2000)
|
||||
build_path = /obj/item/clothing/shoes/powered
|
||||
locked = 1
|
||||
|
||||
datum/design/powerarmor_plasma
|
||||
name = "Powered armor miniaturized plasma generator"
|
||||
@@ -1667,6 +1705,7 @@ datum/design/powerarmor_plasma
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 7500, "$plasma" = 4000)
|
||||
build_path = /obj/item/powerarmor/power/plasma
|
||||
locked = 1
|
||||
|
||||
datum/design/powerarmor_cell
|
||||
name = "Powered armor powercell interface"
|
||||
@@ -1676,6 +1715,7 @@ datum/design/powerarmor_cell
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 7500, "$silver" = 4000)
|
||||
build_path = /obj/item/powerarmor/power/powercell
|
||||
locked = 1
|
||||
|
||||
datum/design/powerarmor_nuclear
|
||||
name = "Powered armor miniaturized nuclear generator"
|
||||
@@ -1685,6 +1725,7 @@ datum/design/powerarmor_nuclear
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 7500, "$uranium" = 4000)
|
||||
build_path = /obj/item/powerarmor/power/nuclear
|
||||
locked = 1
|
||||
|
||||
datum/design/powerarmor_reactive
|
||||
name = "Powered armor reactive plating"
|
||||
@@ -1694,6 +1735,7 @@ datum/design/powerarmor_reactive
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 7500, "$diamond" = 4000)
|
||||
build_path = /obj/item/powerarmor/reactive
|
||||
locked = 1
|
||||
|
||||
datum/design/powerarmor_servos
|
||||
name = "Powered armor servos"
|
||||
@@ -1703,6 +1745,7 @@ datum/design/powerarmor_servos
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 7500, "$plasteel" = 4000)
|
||||
build_path = /obj/item/powerarmor/servos
|
||||
locked = 1
|
||||
|
||||
datum/design/powerarmor_atmoseal
|
||||
name = "Powered armor atmospheric seal"
|
||||
@@ -1712,6 +1755,7 @@ datum/design/powerarmor_atmoseal
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 7500, "$plasteel" = 4000)
|
||||
build_path = /obj/item/powerarmor/atmoseal
|
||||
locked = 1
|
||||
|
||||
/////////////////////////////////////////
|
||||
/////////////////Mining//////////////////
|
||||
@@ -1854,7 +1898,6 @@ datum/design/security_hud
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 50, "$glass" = 50)
|
||||
build_path = "/obj/item/clothing/glasses/hud/security"
|
||||
locked = 1
|
||||
|
||||
/////////////////////////////////////////
|
||||
//////////////////Test///////////////////
|
||||
|
||||
@@ -391,10 +391,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
|
||||
new_item.investigate_log("built by [key]","singulo")
|
||||
new_item.reliability = being_built.reliability
|
||||
if(linked_lathe.hacked) being_built.reliability = max((reliability / 2), 0)
|
||||
/* if(being_built.locked)
|
||||
if(being_built.locked)
|
||||
var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc)
|
||||
new_item.loc = L
|
||||
L.name += " ([new_item.name])"*/
|
||||
L.name += " ([new_item.name])"
|
||||
else
|
||||
new_item.loc = linked_lathe.loc
|
||||
linked_lathe.busy = 0
|
||||
|
||||
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.9 KiB |
@@ -131,9 +131,6 @@
|
||||
<div class='item'>
|
||||
<div id="all-value.jobs" style='display: none;'>
|
||||
<table>
|
||||
<tr>
|
||||
<th></th><th>Command</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Special</th>
|
||||
<td>
|
||||
@@ -157,14 +154,6 @@
|
||||
{{/for}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="color: '#800080';">Science</th>
|
||||
<td>
|
||||
{{for data.science_jobs}}
|
||||
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
|
||||
{{/for}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="color: '#DD0000';">Security</th>
|
||||
<td>
|
||||
@@ -174,6 +163,22 @@
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<th style="color: '#C060C0';">Science</th>
|
||||
<td>
|
||||
{{for data.science_jobs}}
|
||||
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
|
||||
{{/for}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th style="color: '#A0A0A0';">Support</th>
|
||||
<td>
|
||||
{{for data.support_jobs}}
|
||||
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
|
||||
{{/for}}
|
||||
</td>
|
||||
</tr>
|
||||
<th style="color: '#808080';">Civilian</th>
|
||||
<td>
|
||||
{{for data.civilian_jobs}}
|
||||
|
||||