Merge pull request #118 from ZomgPonies/master

Sync
This commit is contained in:
melandor0
2014-11-06 18:07:07 +01:00
382 changed files with 23129 additions and 21487 deletions
+5
View File
@@ -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"
@@ -475,6 +477,7 @@
#include "code\game\machinery\computer\station_alert.dm"
#include "code\game\machinery\computer\store.dm"
#include "code\game\machinery\computer\syndicate_specops_shuttle.dm"
#include "code\game\machinery\computer\telecrystalconsoles.dm"
#include "code\game\machinery\computer\telescience.dm"
#include "code\game\machinery\computer\xenos_shuttle.dm"
#include "code\game\machinery\doors\airlock.dm"
@@ -646,6 +649,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 +688,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"
+213 -83
View File
@@ -15,6 +15,8 @@ var/list/uplink_items = list()
continue
if(I.gamemodes.len && ticker && !(ticker.mode.name in I.gamemodes))
continue
if(I.excludefrom.len && ticker && (ticker.mode.name in I.excludefrom))
continue
if(I.last)
last += I
continue
@@ -44,6 +46,7 @@ var/list/uplink_items = list()
var/last = 0 // Appear last
var/abstract = 0
var/list/gamemodes = list() // Empty list means it is in all the gamemodes. Otherwise place the gamemode name here.
var/list/excludefrom = list() //Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something.
var/list/job = null
/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U)
@@ -102,7 +105,7 @@ var/list/uplink_items = list()
name = "1 Banana Grenade"
desc = "A grenade that explodes into HONK! brand banana peels that are genetically modified to be extra slippery and extrude caustic acid when stepped on"
item = /obj/item/weapon/grenade/clown_grenade
cost = 4
cost = 8
job = list("Clown")
//Detective
@@ -110,14 +113,14 @@ var/list/uplink_items = list()
name = "Evidence Forger"
desc = "An evidence scanner that allows you forge evidence by setting the output before scanning the item."
item = /obj/item/device/detective_scanner/forger
cost = 3
cost = 6
job = list("Detective")
/datum/uplink_item/jobspecific/conversionkit
name = "Conversion Kit Bundle"
desc = "A bundle that comes with a professional revolver conversion kit and 1 box of .357 ammo. The kit allows you to convert your revolver to fire lethal rounds or vice versa, modification is nearly perfect and will not result in catastrophic failure."
item = /obj/item/weapon/storage/box/syndie_kit/conversion
cost = 6
cost = 12
job = list("Detective")
//Chef
@@ -125,14 +128,14 @@ var/list/uplink_items = list()
name = "Chef Excellence's Special Sauce"
desc = "A custom made sauce made from the toxin glands of 1000 space carp, if somebody ingests enough they'll be dead in 3 minutes or less guaranteed."
item = /obj/item/weapon/reagent_containers/food/condiment/syndisauce
cost = 2
cost = 4
job = list("Chef")
/datum/uplink_item/jobspecific/meatcleaver
name = "Meat Cleaver"
desc = "A mean looking meat cleaver that does damage comparable to an Energy Sword but with the added benefit of chopping your victim into hunks of meat after they've died and the chance to stun when thrown."
item = /obj/item/weapon/butch/meatcleaver
cost = 5
cost = 10
job = list("Chef")
//Janitor
@@ -141,7 +144,7 @@ var/list/uplink_items = list()
name = "Proximity Mine"
desc = "An Anti-Personnel proximity mine cleverly disguised as a wet floor caution sign that is triggered by running past it, activate it to start the 15 second timer and activate again to disarm."
item = /obj/item/weapon/caution/proximity_sign
cost = 2
cost = 4
job = list("Janitor")
//Medical
@@ -151,15 +154,16 @@ var/list/uplink_items = list()
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
cost = 6
job = list(
"Chief Medical Officer",
"Medical Doctor",
//"Geneticist",
//"Psychiatrist",
//"Chemist",
//"Paramedic",
"Virologist"
"Geneticist",
"Psychiatrist",
"Chemist",
"Paramedic",
"Virologist",
"Brig Physician"
)
//Assistant
@@ -168,7 +172,7 @@ var/list/uplink_items = list()
name = "Pickpocket's Gloves"
desc = "A pair of sleek gloves to aid in pickpocketing, while wearing these you can see inside the pockets of any unsuspecting mark, loot the ID or pockets without them knowing, and pickpocketing puts the item directly into your hand."
item = /obj/item/clothing/gloves/black/thief
cost = 3
cost = 6
job = list("Civilian")
/*
@@ -184,7 +188,7 @@ var/list/uplink_items = list()
name = "Boozey Shotgun Shells"
desc = "A box containing 6 shotgun shells that simulate the effects of extreme drunkeness on the target, more effective for each type of alcohol in the target's system."
item = /obj/item/weapon/storage/box/syndie_kit/boolets
cost = 3
cost = 6
job = list("Bartender")
//Engineer
@@ -193,7 +197,7 @@ var/list/uplink_items = list()
name = "Power Gloves"
desc = "Insulated gloves that can utilize the power of the station to deliver a short arc of electricity at a target. Must be standing on a powered cable to use."
item = /obj/item/clothing/gloves/yellow/power
cost = 7
cost = 14
job = list("Station Engineer","Chief Engineer")
// DANGEROUS WEAPONS
@@ -205,67 +209,134 @@ var/list/uplink_items = list()
name = "Fully Loaded Revolver"
desc = "A traditional handgun which fires .357 rounds. Has 7 chambers. Can down an unarmoured target with two shots."
item = /obj/item/weapon/gun/projectile/revolver
cost = 6
cost = 13
/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 = 9
/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 = 14
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/machinegun
name = "L6 Squad Automatic Weapon"
desc = "A traditionally constructed machine gun made by AA-2531. This deadly weapon has a massive 50-round magazine of 7.62×51mm ammunition."
item = /obj/item/weapon/gun/projectile/automatic/l6_saw
cost = 10
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/ammo
name = "Ammo-357"
desc = "Seven additional rounds for the revolver. Reports indicate the presence of machinery aboard Nanotrasen space stations suitable for producing extra .357 cartridges."
item = /obj/item/ammo_box/a357
cost = 2
/datum/uplink_item/ammo/smg
name = "Ammo-12mm"
desc = "A 20-round 12mm magazine for use in the C-20r submachine gun."
item = /obj/item/ammo_box/magazine/m12mm
cost = 1
gamemodes = list("nuclear emergency")
/datum/uplink_item/ammo/machinegun
name = "Ammo-7.62×51mm"
desc = "A 50-round magazine of 7.62×51mm ammunition for use in the L6 SAW machinegun. By the time you need to use this, you'll already be on a pile of corpses."
item = /obj/item/ammo_box/magazine/m762
cost = 3
cost = 40
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 = 12
excludefrom = list("nuclear emergency")
/datum/uplink_item/dangerous/sword
name = "Energy Sword"
desc = "The esword is an edged weapon with a blade of pure energy. The sword is small enough to be pocketed when inactive. Activating it produces a loud, distinctive noise."
item = /obj/item/weapon/melee/energy/sword
cost = 4
cost = 8
/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 = 8
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 = 20
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/emp
name = "5 EMP Grenades"
desc = "A box that contains 5 EMP grenades. Useful to disrupt communication and silicon lifeforms."
item = /obj/item/weapon/storage/box/emps
cost = 5
/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 = 6
/datum/uplink_item/dangerous/gygax
name = "Gygax Exosuit"
desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent for hit-and-run style attacks. \
This model lacks a method of space propulsion, and therefore it is advised to repair the mothership's teleporter if you wish to make use of it."
item = /obj/mecha/combat/gygax/dark/loaded
cost = 90
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/mauler
name = "Mauler Exosuit"
desc = "A massive and incredibly deadly Syndicate exosuit. Features long-range targetting, thrust vectoring, and deployable smoke."
item = /obj/mecha/combat/marauder/mauler/loaded
cost = 140
gamemodes = list("nuclear emergency")
// Ammunition
/datum/uplink_item/ammo
category = "Ammunition"
/datum/uplink_item/ammo/revolver
name = "Ammo-357"
desc = "A box that contains seven additional rounds for the revolver, made using an automatic lathe."
item = /obj/item/ammo_box/a357
cost = 4
/datum/uplink_item/ammo/pistol
name = "Ammo-10mm"
desc = "An additional 8-round 10mm magazine for use in the Stetchkin pistol."
item = /obj/item/ammo_box/magazine/m10mm
cost = 1
/datum/uplink_item/ammo/smg
name = "Ammo-12mm"
desc = "A 20-round 12mm magazine for use in the C-20r submachine gun."
item = /obj/item/ammo_box/magazine/m12mm
cost = 2
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 = 12
gamemodes = list("nuclear emergency")
/datum/uplink_item/ammo/bullstun
name = "Ammo-12g Stun Slug"
desc = "An additional 8-round stun slug magazine for use in the Bulldog shotgun. Saying that they're non-lethal would be lying."
item = /obj/item/ammo_box/magazine/m12g
cost = 2
gamemodes = list("nuclear emergency")
/datum/uplink_item/ammo/bullbuck
name = "Ammo-12g Buckshot"
desc = "An alternative 8-round buckshot magazine for use in the Bulldog shotgun. Front towards enemy."
item = /obj/item/ammo_box/magazine/m12g/buckshot
cost = 2
gamemodes = list("nuclear emergency")
/datum/uplink_item/ammo/bulldragon
name = "Ammo-12g Dragon's Breath"
desc = "An alternative 8-round dragon's breath magazine for use in the Bulldog shotgun. I'm a fire starter, twisted fire starter!"
item = /obj/item/ammo_box/magazine/m12g/dragon
cost = 3
gamemodes = list("nuclear emergency")
// STEALTHY WEAPONS
@@ -277,7 +348,8 @@ var/list/uplink_items = list()
name = "Paralysis Pen"
desc = "A syringe disguised as a functional pen, filled with a neuromuscular-blocking drug that renders a target mute on injection that will eventually cause them to pass out. The pen holds one dose of paralyzing agent,though it can be refilled."
item = /obj/item/weapon/pen/paralysis
cost = 4
cost = 8
excludefrom = list("nuclear emergency")
/datum/uplink_item/stealthy_weapons/soap
name = "Syndicate Soap"
@@ -289,7 +361,7 @@ var/list/uplink_items = list()
name = "Detomatix PDA Cartridge"
desc = "When inserted into a personal digital assistant, this cartridge gives you five opportunities to detonate PDAs of crewmembers who have their message feature enabled. The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer. It has a chance to detonate your PDA."
item = /obj/item/weapon/cartridge/syndicate
cost = 3 */
cost = 6 */
// Commented out until a fix can be found, currently doesn't work with the PDA NanoUI and people keep wasting Telecrystals on it. -- Dave
@@ -297,8 +369,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 = 3
// STEALTHY TOOLS
@@ -309,37 +380,50 @@ var/list/uplink_items = list()
name = "Chameleon Jumpsuit"
desc = "A jumpsuit used to imitate the uniforms of Nanotrasen crewmembers."
item = /obj/item/clothing/under/chameleon
cost = 3
cost = 4
/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."
item = /obj/item/clothing/shoes/syndigaloshes
cost = 2
cost = 4
/datum/uplink_item/stealthy_tools/agent_card
name = "Agent ID Card"
desc = "Agent cards prevent artificial intelligences from tracking the wearer, and can copy access from other identification cards. The access is cumulative, so scanning one card does not erase the access gained from another."
item = /obj/item/weapon/card/id/syndicate
cost = 2
cost = 3
/datum/uplink_item/stealthy_tools/voice_changer
name = "Voice Changer"
desc = "A conspicuous gas mask that mimics the voice named on your identification card. When no identification is worn, the mask will render your voice unrecognizable."
item = /obj/item/clothing/mask/gas/voice
cost = 4
cost = 5
/datum/uplink_item/stealthy_tools/chameleon_proj
name = "Chameleon-Projector"
desc = "Projects an image across a user, disguising them as an object scanned with it, as long as they don't move the projector from their hand. The disguised user cannot run and rojectiles pass over them."
item = /obj/item/device/chameleon
cost = 7
/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 = 4
/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."
item = /obj/item/weapon/storage/box/syndie_kit/mindslave
cost = 5
/datum/uplink_item/stealthy_tools/smugglersatchel
name = "Smuggler's Satchel"
desc = "This satchel is thin enough to be hidden in the gap between plating and tiling, great for stashing your stolen goods. Comes with a crowbar and a floor tile inside."
item = /obj/item/weapon/storage/backpack/satchel_flat
cost = 2
// DEVICE AND TOOLS
@@ -351,7 +435,7 @@ var/list/uplink_items = list()
name = "Cryptographic Sequencer"
desc = "The emag is a small card that unlocks hidden functions in electronic devices, subverts intended functions and characteristically breaks security mechanisms."
item = /obj/item/weapon/card/emag
cost = 3
cost = 6
/datum/uplink_item/device_tools/toolbox
name = "Fully Loaded Toolbox"
@@ -362,79 +446,112 @@ var/list/uplink_items = list()
/datum/uplink_item/device_tools/medkit
name = "Syndicate Medical Supply Kit"
desc = "A basic medical kit for treating injuries in the field."
item = /obj/item/weapon/storage/firstaid/adv
cost = 3
desc = "The syndicate medkit is a suspicious black and red. Included is a combat stimulant injector for rapid healing, a medical hud for quick identification of injured comrades, \
and other medical supplies helpful for a medical field operative."
item = /obj/item/weapon/storage/firstaid/tactical
cost = 9
gamemodes = list("nuclear emergency")
/datum/uplink_item/device_tools/space_suit
name = "Space Suit"
desc = "The red syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings."
desc = "The red and black syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings."
item = /obj/item/weapon/storage/box/syndie_kit/space
cost = 3
cost = 5
/datum/uplink_item/device_tools/thermal
name = "Thermal Imaging Glasses"
desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
item = /obj/item/clothing/glasses/thermal/syndi
cost = 3
cost = 6
/datum/uplink_item/device_tools/surveillance
name = "Camera Surveillance Kit"
desc = "This kit contains 5 Camera bugs and one mobile receiver. Attach camera bugs to a camera to enable remote viewing."
item = /obj/item/weapon/storage/box/syndie_kit/surveillance
cost = 3
cost = 5
/datum/uplink_item/device_tools/camerabugs
name = "Camera Bugs"
desc = "This is a Camera bug resupply giving you 5 more camera bugs."
item = /obj/item/weapon/storage/box/surveillance
cost = 2
cost = 4
/datum/uplink_item/device_tools/binary
name = "Binary Translator Key"
desc = "A key, that when inserted into a radio headset, allows you to listen to and talk with artificial intelligences and cybernetic organisms in binary."
item = /obj/item/device/encryptionkey/binary
cost = 3
cost = 5
/datum/uplink_item/device_tools/cipherkey
name = "Centcomm Encryption Key"
desc = "A key, that when inserted into a radio headset, allows you to listen to and talk on all known radio channels."
item = /obj/item/device/encryptionkey/syndicate/hacked
cost = 2
cost = 4
/datum/uplink_item/device_tools/hacked_module
name = "Hacked AI Upload Module"
desc = "When used with an upload console, this module allows you to upload priority laws to an artificial intelligence. Be careful with their wording, as artificial intelligences may look for loopholes to exploit."
item = /obj/item/weapon/aiModule/syndicate
cost = 7
cost = 14
/datum/uplink_item/device_tools/plastic_explosives
name = "Composition C-4"
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls, attach it to organisms to destroy them, or connect a signaler to its wiring to make it remotely detonable. It has a modifiable timer with a minimum setting of 10 seconds."
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls or connect a signaler to its wiring to make it remotely detonable. It has a modifiable timer with a minimum setting of 10 seconds."
item = /obj/item/weapon/plastique
cost = 2
cost = 1
/datum/uplink_item/device_tools/powersink
name = "Power sink"
desc = "When screwed to wiring attached to an electric grid, then activated, this large device places excessive load on the grid, causing a stationwide blackout. The sink cannot be carried because of its excessive size. Ordering this sends you a small beacon that will teleport the power sink to your location on activation."
item = /obj/item/device/powersink
cost = 5
cost = 10
/datum/uplink_item/device_tools/singularity_beacon
name = "Singularity Beacon"
desc = "When screwed to wiring attached to an electric grid, then activated, this large device pulls the singularity towards it. Does not work when the singularity is still in containment. A singularity beacon can cause catastrophic damage to a space station, leading to an emergency evacuation. Because of its size, it cannot be carried. Ordering this sends you a small beacon that will teleport the larger beacon to your location on activation."
item = /obj/item/device/radio/beacon/syndicate
cost = 7
cost = 14
/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 = 11
/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 = 3
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 = 4
/datum/uplink_item/device_tools/ai_detector
name = "Artificial Intelligence Detector" // changed name in case newfriends thought it detected disguised ai's
desc = "A functional multitool that turns red when it detects an artificial intelligence watching it or its holder. Knowing when an artificial intelligence is watching you is useful for knowing when to maintain cover."
item = /obj/item/device/multitool/ai_detect
cost = 1
/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."
item = /obj/item/weapon/circuitboard/teleporter
cost = 20
cost = 40
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 = 16
gamemodes = list("nuclear emergency")
// IMPLANTS
@@ -445,26 +562,37 @@ var/list/uplink_items = list()
name = "Freedom Implant"
desc = "An implant injected into the body and later activated using a bodily gesture to attempt to slip restraints."
item = /obj/item/weapon/storage/box/syndie_kit/imp_freedom
cost = 3
cost = 5
/datum/uplink_item/implants/uplink
name = "Uplink Implant"
desc = "An implant injected into the body, and later activated using a bodily gesture to open an uplink with 5 telecrystals. The ability for an agent to open an uplink after their posessions have been stripped from them makes this implant excellent for escaping confinement."
item = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
cost = 10
cost = 20
/datum/uplink_item/implants/explosive
name = "Explosive Implant"
desc = "An implant injected into the body, and later activated using a vocal command to cause a large explosion from the implant."
item = /obj/item/weapon/storage/box/syndie_kit/imp_explosive
cost = 6
cost = 12
/datum/uplink_item/implants/compression
name = "Compressed Matter Implant"
desc = "An implant injected into the body, and later activated using a bodily gesture to retrieve an item that was earlier compressed."
item = /obj/item/weapon/storage/box/syndie_kit/imp_compress
cost = 4
cost = 8
/datum/uplink_item/implants/mindslave
name = "Mindslave Implant"
desc = "A box containing an implanter filled with a mindslave implant that when injected into another person makes them loyal to you and your cause, unless of course they're already implanted by someone else. Loyalty ends if the implant is no longer in their system."
item = /obj/item/weapon/storage/box/syndie_kit/mindslave
cost = 10
/datum/uplink_item/implants/adrenal
name = "Adrenal Implant"
desc = "An implant injected into the body, and later activated using a bodily gesture to inject a chemical cocktail, which has a mild healing effect along with removing all stuns and increasing his speed."
item = /obj/item/weapon/storage/box/syndie_kit/imp_adrenal
cost = 8
// POINTLESS BADASSERY
@@ -475,20 +603,22 @@ var/list/uplink_items = list()
name = "Syndicate Bundle"
desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 10 telecrystals, but you do not know which specialisation you will receive."
item = /obj/item/weapon/storage/box/syndicate
cost = 10
cost = 20
excludefrom = list("nuclear emergency")
/datum/uplink_item/badass/syndiecards
name = "Syndicate Playing Cards"
desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, making them lethal weapons both when wielded as a blade and when thrown. \
You can also play card games with them."
item = /obj/item/toy/cards/deck/syndicate
cost = 2
cost = 1
excludefrom = list("nuclear emergency")
/datum/uplink_item/badass/balloon
name = "For showing that you are The Boss"
desc = "A useless red balloon with the syndicate logo on it, which can blow the deepest of covers."
item = /obj/item/toy/syndicateballoon
cost = 10
cost = 20
/datum/uplink_item/badass/random
name = "Random Item"
+19 -20
View File
@@ -9,24 +9,29 @@ var/const/WIRE_DELAY = 4 // Raises the timer on pulse, does nothing on cut
var/const/WIRE_PROCEED = 8 // Lowers the timer, explodes if cut while the bomb is active
var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut
/datum/wires/syndicatebomb/CanUse(var/mob/living/L)
var/obj/machinery/syndicatebomb/P = holder
if(P.open_panel)
return 1
return 0
/datum/wires/syndicatebomb/UpdatePulsed(var/index)
var/obj/machinery/syndicatebomb/P = holder
if(P.degutted)
return
switch(index)
if(WIRE_BOOM)
if (P.active)
P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-")
P.loc.visible_message("<span class='danger'>\icon[holder] An alarm sounds! It's go-</span>")
P.timer = 0
if(WIRE_UNBOLT)
P.loc.visible_message("\blue \icon[holder] The bolts spin in place for a moment.")
P.loc.visible_message("<span class='notice'>\icon[holder] The bolts spin in place for a moment.</span>")
if(WIRE_DELAY)
playsound(P.loc, 'sound/machines/chime.ogg', 30, 1)
P.loc.visible_message("\blue \icon[holder] The bomb chirps.")
P.loc.visible_message("<span class='notice'>\icon[holder] The bomb chirps.</span>")
P.timer += 10
if(WIRE_PROCEED)
playsound(P.loc, 'sound/machines/buzz-sigh.ogg', 30, 1)
P.loc.visible_message("\red \icon[holder] The bomb buzzes ominously!")
P.loc.visible_message("<span class='danger'>\icon[holder] The bomb buzzes ominously!</span>")
if (P.timer >= 61) //Long fuse bombs can suddenly become more dangerous if you tinker with them
P.timer = 60
if (P.timer >= 21)
@@ -36,26 +41,20 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
if(WIRE_ACTIVATE)
if(!P.active && !P.defused)
playsound(P.loc, 'sound/machines/click.ogg', 30, 1)
P.loc.visible_message("\red \icon[holder] You hear the bomb start ticking!")
P.loc.visible_message("<span class='danger'>\icon[holder] You hear the bomb start ticking!</span>")
P.active = 1
if(!P.open_panel) //Needs to exist in case the wire is pulsed with a signaler while the panel is closed
P.icon_state = "syndicate-bomb-active"
else
P.icon_state = "syndicate-bomb-active-wires"
processing_objects.Add(P)
P.icon_state = "[initial(P.icon_state)]-active[P.open_panel ? "-wires" : ""]"
else
P.loc.visible_message("\blue \icon[holder] The bomb seems to hesitate for a moment.")
P.loc.visible_message("<span class='notice'>\icon[holder] The bomb seems to hesitate for a moment.</span>")
P.timer += 5
/datum/wires/syndicatebomb/UpdateCut(var/index, var/mended)
var/obj/machinery/syndicatebomb/P = holder
if(P.degutted)
return
switch(index)
if(WIRE_EXPLODE)
if(!mended)
if(P.active)
P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-")
P.loc.visible_message("<span class='danger'>\icon[holder] An alarm sounds! It's go-</span>")
P.timer = 0
else
P.defused = 1
@@ -64,15 +63,15 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
if(WIRE_UNBOLT)
if (!mended && P.anchored)
playsound(P.loc, 'sound/effects/stealthoff.ogg', 30, 1)
P.loc.visible_message("\blue \icon[holder] The bolts lift out of the ground!")
P.loc.visible_message("<span class='notice'>\icon[holder] The bolts lift out of the ground!</span>")
P.anchored = 0
if(WIRE_PROCEED)
if(!mended && P.active)
P.loc.visible_message("\red \icon[holder] An alarm sounds! It's go-")
P.loc.visible_message("<span class='danger'>\icon[holder] An alarm sounds! It's go-</span>")
P.timer = 0
if(WIRE_ACTIVATE)
if (!mended && P.active)
P.loc.visible_message("\blue \icon[holder] The timer stops! The bomb has been defused!")
P.icon_state = "syndicate-bomb-inactive-wires" //no cutting possible with the panel closed
P.loc.visible_message("<span class='notice'>\icon[holder] The timer stops! The bomb has been defused!</span>")
P.icon_state = "[initial(P.icon_state)]-inactive[P.open_panel ? "-wires" : ""]"
P.active = 0
P.defused = 1
+9 -1
View File
@@ -278,4 +278,12 @@ var/const/POWER = 8
/datum/wires/proc/IsAllCut()
if(wires_status == (1 << wire_count) - 1)
return 1
return 0
return 0
//
//Shuffle and Mend
//
/datum/wires/proc/Shuffle()
wires_status = 0
GenerateWires()
+2 -1
View File
@@ -122,9 +122,10 @@
item_state = "card-id"
w_class = 1.0
/*
/obj/item/weapon/disk/nuclear/pickup(mob/living/user as mob)
if(issyndicate(user))
set_security_level(3)
set_security_level(3)*/ //Nuke Ops rework makes stealth approach significantly harder; this makes it damn near impossible; besides, it's horrendously meta.
/*
/obj/item/weapon/game_kit
+6
View File
@@ -463,3 +463,9 @@ its easier to just keep the beam vertical.
/atom/proc/checkpass(passflag)
return pass_flags&passflag
/atom/proc/isinspace()
if(istype(get_turf(src), /turf/space))
return 1
else
return 0
+1 -1
View File
@@ -15,7 +15,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
recommended_enemies = 2
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10
uplink_uses = 20
var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time
var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
+1 -1
View File
@@ -29,7 +29,7 @@
recommended_enemies = 4
uplink_welcome = "Nar-Sie Uplink Console:"
uplink_uses = 10
uplink_uses = 20
var/datum/mind/sacrifice_target = null
var/finished = 0
+1 -1
View File
@@ -4,7 +4,7 @@
required_players = 0
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10
uplink_uses = 20
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800
+2 -2
View File
@@ -295,9 +295,9 @@ Implants;
// If they're a traitor or likewise, give them extra TC in exchange.
var/obj/item/device/uplink/hidden/suplink = man.mind.find_syndicate_uplink()
if(suplink)
var/extra = 4
var/extra = 0 //was 4; with the TC rebalance, this isn't really needed, anymore
suplink.uses += extra
man << "\red We have received notice that enemy intelligence suspects you to be linked with us. We have thus invested significant resources to increase your uplink's capacity."
man << "\red We have received notice that enemy intelligence suspects you to be linked with us. We recommend adjusting your plans and equipment accordingly."
else
// Give them a warning!
man << "\red They are on to you!"
+31 -9
View File
@@ -8,12 +8,12 @@ proc/issyndicate(mob/living/M as mob)
name = "nuclear emergency"
config_tag = "nuclear"
required_players = 6
required_players_secret = 15 // 25 players - 5 players to be the nuke ops = 20 players remaining
required_enemies = 3
recommended_enemies = 4
required_players_secret = 20 // 20 players - 5 players to be the nuke ops = 15 players remaining
required_enemies = 5
recommended_enemies = 5
uplink_welcome = "Corporate Backed Uplink Console:"
uplink_uses = 40
uplink_uses = 120
var/const/agents_possible = 5 //If we ever need more syndicate agents.
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
@@ -128,7 +128,7 @@ proc/issyndicate(mob/living/M as mob)
for(var/datum/mind/synd_mind in syndicates)
if(spawnpos > synd_spawn.len)
spawnpos = 1
spawnpos = 2
synd_mind.current.loc = synd_spawn[spawnpos]
forge_syndicate_objectives(synd_mind)
@@ -162,6 +162,18 @@ proc/issyndicate(mob/living/M as mob)
spawn(1)
// NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen
synd_mind.current.real_name = "[pick(first_names_male)] [pick(last_names)]"
synd_mind.current << "<B>You are the Syndicate leader for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.</B>"
synd_mind.current << "<B>If you feel you are not up to this task, give your ID to another operative.</B>"
var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/weapon/card/id)
if(foundIDs.len)
for(var/obj/item/weapon/card/id/ID in foundIDs)
ID.name = "lead agent card"
ID.access += access_syndicate_leader
else
message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!")
if (nuke_code)
synd_mind.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
synd_mind.current << "The nuclear authorization code is: <B>[nuke_code]</B>"
@@ -210,18 +222,20 @@ proc/issyndicate(mob/living/M as mob)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(synd_mob), slot_w_uniform)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(synd_mob), slot_shoes)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(synd_mob), slot_gloves)
synd_mob.equip_or_collect(new /obj/item/clothing/gloves/combat(synd_mob), slot_gloves)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate(synd_mob), slot_wear_id)
if(synd_mob.backbag == 2) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(synd_mob), slot_back)
if(synd_mob.backbag == 3) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(synd_mob), slot_back)
if(synd_mob.backbag == 4) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(synd_mob), slot_back)
synd_mob.equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m10mm(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m10mm(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m10mm(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(synd_mob), slot_in_backpack)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(synd_mob), slot_belt)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(synd_mob.back), slot_in_backpack)
var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(synd_mob)
U.hidden_uplink.uplink_owner="[synd_mob.key]"
U.hidden_uplink.uses = 20
synd_mob.equip_to_slot_or_del(U, slot_in_backpack)
var/obj/item/clothing/suit/space/rig/syndi/new_suit = new(synd_mob)
var/obj/item/clothing/head/helmet/space/rig/syndi/new_helmet = new(synd_mob)
@@ -232,10 +246,13 @@ proc/issyndicate(mob/living/M as mob)
switch(race)
if("Unathi")
new_suit.species_restricted = list("Unathi")
new_helmet.species_restricted = list("Unathi")
if("Tajaran")
new_suit.species_restricted = list("Tajaran")
new_helmet.species_restricted = list("Tajaran")
if("Skrell")
new_suit.species_restricted = list("Skrell")
new_helmet.species_restricted = list("Skrell")
if("Vox" || "Vox Armalis")
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(synd_mob), slot_wear_mask)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(synd_mob), slot_l_hand)
@@ -243,6 +260,7 @@ proc/issyndicate(mob/living/M as mob)
if (synd_mob.internals)
synd_mob.internals.icon_state = "internal1"
new_suit.species_restricted = list ("Vox", "Vox Armalis")
new_helmet.species_restricted = list ("Vox", "Vox Armalis")
synd_mob.equip_to_slot_or_del(new_suit, slot_wear_suit)
@@ -252,6 +270,7 @@ proc/issyndicate(mob/living/M as mob)
var/obj/item/weapon/implant/dexplosive/E = new/obj/item/weapon/implant/dexplosive(synd_mob)
E.imp_in = synd_mob
E.implanted = 1
synd_mob.faction |= "syndicate"
synd_mob.update_icons()
return 1
@@ -365,6 +384,9 @@ proc/issyndicate(mob/living/M as mob)
text += "(Syndicates used [TC_uses] TC) [purchases]"
if(TC_uses==0 && station_was_nuked && !is_operatives_are_dead())
text += "<BIG><IMG CLASS=icon SRC=\ref['icons/BadAss.dmi'] ICONSTATE='badass'></BIG>"
world << text
return 1
+78 -1
View File
@@ -266,4 +266,81 @@
if(16 to INFINITY)
icon_state = "pinonfar"
spawn(5) .()
spawn(5) .()
/obj/item/weapon/pinpointer/pdapinpointer
name = "pda pinpointer"
desc = "A pinpointer that has been illegally modified to track the PDA of a crewmember for malicious reasons."
var/obj/target = null
var/used = 0
attack_self()
if(!active)
active = 1
point_at(target)
usr << "\blue You activate the pinpointer"
else
active = 0
icon_state = "pinoff"
usr << "\blue You deactivate the pinpointer"
verb/select_pda()
set category = "Object"
set name = "Select pinpointer target"
set src in view(1)
if(used)
usr << "Target has already been set!"
return
var/list/L = list()
L["Cancel"] = "Cancel"
var/length = 1
for (var/obj/item/device/pda/P in world)
if(P.name != "\improper PDA")
L[text("([length]) [P.name]")] = P
length++
var/t = input("Select pinpointer target. WARNING: Can only set once.") as null|anything in L
if(t == "Cancel")
return
target = L[t]
if(!target)
usr << "Failed to locate [target]!"
return
active = 1
point_at(target)
usr << "You set the pinpointer to locate [target]"
used = 1
examine()
..()
if (target)
usr << "\blue Tracking [target]"
proc/point_at(atom/target)
if(!active)
return
if(!target)
icon_state = "pinonnull"
return
var/turf/T = get_turf(target)
var/turf/L = get_turf(src)
if(T.z != L.z)
icon_state = "pinonnull"
else
dir = get_dir(L, T)
switch(get_dist(L, T))
if(-1)
icon_state = "pinondirect"
if(1 to 8)
icon_state = "pinonclose"
if(9 to 16)
icon_state = "pinonmedium"
if(16 to INFINITY)
icon_state = "pinonfar"
spawn(5)
.()
+1 -1
View File
@@ -23,7 +23,7 @@
uplink_welcome = "Revolutionary Uplink Console:"
uplink_uses = 10
uplink_uses = 20
var/finished = 0
var/checkwin_counter = 0
@@ -9,7 +9,7 @@
recommended_enemies = 3
uplink_welcome = "Revolutionary Uplink Console:"
uplink_uses = 5
uplink_uses = 10
newscaster_announcements = /datum/news_announcement/revolution_inciting_event
+1 -1
View File
@@ -15,7 +15,7 @@
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10
uplink_uses = 20
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
+7 -7
View File
@@ -7,15 +7,15 @@
/datum/game_mode/vampire
name = "vampire"
config_tag = "vampire"
restricted_jobs = list("AI", "Cyborg", "Mobile MMI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Security Pod Pilot", "Nanotrasen Recruiter", "Magistrate") //Consistent screening has filtered all infiltration attempts on high value jobs
protected_jobs = list()
required_players = 1
required_players_secret = 15
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Nanotrasen Recruiter", "Magistrate", "Chaplain")
required_players = 2
required_players_secret = 10
required_enemies = 1
recommended_enemies = 4
recommended_enemies = 2
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10
uplink_uses = 20
var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time
var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
@@ -56,7 +56,7 @@
if(player.assigned_role == job)
possible_vampires -= player
vampire_amount = max(1,round(num_players() / 10)) //1 + round(num_players() / 10)
vampire_amount = 1 + round(num_players() / 10)
if(possible_vampires.len>0)
for(var/i = 0, i < vampire_amount, i++)
+1 -1
View File
@@ -10,7 +10,7 @@
recommended_enemies = 1
uplink_welcome = "Wizardly Uplink Console:"
uplink_uses = 10
uplink_uses = 20
var/finished = 0
+1
View File
@@ -101,6 +101,7 @@
//The Syndicate
/var/const/access_syndicate = 150//General Syndicate Access
/var/const/access_syndicate_leader = 151//Nuke Op Leader Access
//MONEY
/var/const/access_crate_cash = 200
+1 -1
View File
@@ -1,7 +1,7 @@
/datum/job/civilian
title = "Civilian"
flag = CIVILIAN
department_flag = CIVILIAN
department_flag = SUPPORT
total_positions = -1
spawn_positions = -1
supervisors = "absolutely everyone"
+11 -11
View File
@@ -87,18 +87,18 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_or_collect(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
H.equip_or_collect(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
H.equip_or_collect(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
H.equip_or_collect(new /obj/item/device/pda/botanist(H), slot_wear_pda)
switch(H.backbag)
if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
if(1) H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back)
if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
+2
View File
@@ -100,6 +100,7 @@ var/global/datum/controller/occupations/job_master
Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
var/list/candidates = list()
for(var/mob/new_player/player in unassigned)
Debug(" - Player: [player] Banned: [jobban_isbanned(player, job.title)] Old Enough: [!job.player_old_enough(player.client)] Flag && Be Special: [flag] && [player.client.prefs.be_special] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Flag: [job.flag] Job Department Flag = [job.department_flag]")
if(jobban_isbanned(player, job.title))
Debug("FOC isbanned failed, Player: [player]")
continue
@@ -331,6 +332,7 @@ var/global/datum/controller/occupations/job_master
// If the job isn't filled
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
Debug("DO pass, Player: [player], Level:[level], Job:[job.title]")
Debug(" - Job Flag: [job.flag] Job Department: [player.client.prefs.GetJobDepartment(job, level)] Job Current Pos: [job.current_positions] Job Spawn Positions = [job.spawn_positions]")
AssignRole(player, job.title)
unassigned -= player
break
-1
View File
@@ -116,7 +116,6 @@ var/list/support_positions = list(
"Mime",
"Barber",
"Magistrate",
"Nanotrasen Representative",
"Nanotrasen Recruiter"
)
+1
View File
@@ -107,6 +107,7 @@
data["science_jobs"] = format_jobs(science_positions)
data["security_jobs"] = format_jobs(security_positions)
data["support_jobs"] = format_jobs(support_positions)
data["civilian_jobs"] = format_jobs(civilian_positions)
data["special_jobs"] = format_jobs(whitelisted_positions)
data["centcom_jobs"] = format_jobs(get_all_centcom_jobs())
@@ -0,0 +1,221 @@
#define NUKESCALINGMODIFIER 1
var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","Foxtrot","Zero", "Niner")
/obj/machinery/computer/telecrystals
name = "\improper Telecrystal assignment station"
desc = "A device used to manage telecrystals during group operations. You shouldn't be looking at this particular one..."
icon_state = "tcstation"
/////////////////////////////////////////////
/obj/machinery/computer/telecrystals/uplinker
name = "\improper Telecrystal upload/recieve station"
desc = "A device used to manage telecrystals during group operations. To use, simply insert your uplink. With your uplink installed \
you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant."
icon_state = "tcstation"
var/obj/item/uplinkholder = null
var/obj/machinery/computer/telecrystals/boss/linkedboss = null
/obj/machinery/computer/telecrystals/uplinker/New()
..()
var/ID
if(possible_uplinker_IDs.len)
ID = pick(possible_uplinker_IDs)
possible_uplinker_IDs -= ID
name = "[name] [ID]"
else
name = "[name] [rand(1,999)]"
/obj/machinery/computer/telecrystals/uplinker/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, /obj/item))
if(uplinkholder)
user << "<span class='notice'>The [src] already has an uplink in it.</span>"
return
if(O.hidden_uplink)
var/obj/item/P = user.get_active_hand()
user.drop_item()
uplinkholder = P
P.loc = src
P.add_fingerprint(user)
update_icon()
updateUsrDialog()
else
user << "<span class='notice'>The [O] doesn't appear to be an uplink...</span>"
/obj/machinery/computer/telecrystals/uplinker/update_icon()
overlays.Cut()
if(uplinkholder)
overlays += "[initial(icon_state)]-closed"
/obj/machinery/computer/telecrystals/uplinker/proc/ejectuplink()
if(uplinkholder)
uplinkholder.loc = get_turf(src.loc)
uplinkholder = null
update_icon()
/obj/machinery/computer/telecrystals/uplinker/proc/donateTC(var/amt, var/addLog = 1)
if(uplinkholder && linkedboss)
if(amt <= uplinkholder.hidden_uplink.uses)
uplinkholder.hidden_uplink.uses -= amt
linkedboss.storedcrystals += amt
if(addLog)
linkedboss.logTransfer("[src] donated [amt] telecrystals to [linkedboss].")
/obj/machinery/computer/telecrystals/uplinker/proc/giveTC(var/amt, var/addLog = 1)
if(uplinkholder && linkedboss)
if(amt <= linkedboss.storedcrystals)
uplinkholder.hidden_uplink.uses += amt
linkedboss.storedcrystals -= amt
if(addLog)
linkedboss.logTransfer("[src] recieved [amt] telecrystals from [linkedboss].")
///////
/obj/machinery/computer/telecrystals/uplinker/attack_hand(mob/user as mob)
if(..())
return
src.add_fingerprint(user)
user.set_machine(src)
var/dat = ""
if(linkedboss)
dat += "[linkedboss] has [linkedboss.storedcrystals] telecrystals available for distribution. <BR><BR>"
else
dat += "No linked management consoles detected. Scan for uplink stations using the management console.<BR><BR>"
if(uplinkholder)
dat += "[uplinkholder.hidden_uplink.uses] telecrystals remain in this uplink.<BR>"
if(linkedboss)
dat += "Donate TC: <a href='byond://?src=\ref[src];donate1=1'>1</a> | <a href='byond://?src=\ref[src];donate5=1'>5</a>"
dat += "<br><a href='byond://?src=\ref[src];eject=1'>Eject Uplink</a>"
var/datum/browser/popup = new(user, "computer", "Telecrystal Upload/Recieve Station", 700, 500)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
return
/obj/machinery/computer/telecrystals/uplinker/Topic(href, href_list)
if(..())
return
if(href_list["donate1"])
donateTC(1)
if(href_list["donate5"])
donateTC(5)
if(href_list["eject"])
ejectuplink()
src.updateUsrDialog()
/////////////////////////////////////////
/obj/machinery/computer/telecrystals/boss
name = "team Telecrystal management console"
desc = "A device used to manage telecrystals during group operations. To use, simply initialize the machine by scanning for nearby uplink stations. \
Once the consoles are linked up, you can assign any telecrystals amongst your operatives; be they donated by your agents or rationed to the squad \
based on the danger rating of the mission."
icon_state = "tcboss"
var/virgin = 1
var/scanrange = 10
var/storedcrystals = 0
var/list/TCstations = list()
var/list/transferlog = list()
/obj/machinery/computer/telecrystals/boss/proc/logTransfer(var/logmessage)
transferlog += ("<b>[worldtime2text()]</b> [logmessage]")
/obj/machinery/computer/telecrystals/boss/proc/scanUplinkers()
for(var/obj/machinery/computer/telecrystals/uplinker/A in range(scanrange, src.loc))
if(!A.linkedboss)
TCstations += A
A.linkedboss = src
if(virgin)
getDangerous()
virgin = 0
/obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population.
..()
var/danger
danger = player_list.len
while(!IsMultiple(++danger,10))//Just round up to the nearest multiple of ten.
scaleTC(danger)
/obj/machinery/computer/telecrystals/boss/proc/scaleTC(var/amt)//Its own proc, since it'll probably need a lot of tweaks for balance, use a fancier algorhithm, etc.
storedcrystals += amt * NUKESCALINGMODIFIER
/////////
/obj/machinery/computer/telecrystals/boss/attack_hand(var/mob/user as mob)
if(..())
return
src.add_fingerprint(user)
user.set_machine(src)
var/dat = ""
dat += "<a href='byond://?src=\ref[src];scan=1'>Scan for TC stations.</a><BR>"
dat += "This [src] has [storedcrystals] telecrystals available for distribution. <BR>"
dat += "<BR><BR>"
for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations)
dat += "[A.name] | "
if(A.uplinkholder)
dat += "[A.uplinkholder.hidden_uplink.uses] telecrystals."
if(storedcrystals)
dat+= "<BR>Add TC: <a href ='?src=\ref[src];give1=\ref[A]'>1</a> | <a href ='?src=\ref[src];give5=\ref[A]'>5</a>"
dat += "<BR>"
if(TCstations.len)
dat += "<BR><BR><a href='byond://?src=\ref[src];distrib=1'>Evenly distribute remaining TC.</a><BR><BR>"
for(var/entry in transferlog)
dat += "<small>[entry]</small><BR>"
var/datum/browser/popup = new(user, "computer", "Team Telecrystal Management Console", 700, 500)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
return
/obj/machinery/computer/telecrystals/boss/Topic(href, href_list)
if(..())
return
if(href_list["scan"])
scanUplinkers()
if(href_list["give1"])
var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give1"])
A.giveTC(1)
if(href_list["give5"])
var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give5"])
A.giveTC(5)
if(href_list["distrib"])
var/sanity = 0
while(storedcrystals && sanity < 100)
for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations)
A.giveTC(1,0)
sanity++
logTransfer("[src] evenly distributed telecrystals.")
src.updateUsrDialog()
return
#undef NUKESCALINGMODIFIER
+40 -23
View File
@@ -34,23 +34,33 @@
src.attack_hand()
/obj/machinery/computer/telescience/attack_hand(mob/user)
ui_interact(user)
/obj/machinery/computer/telescience/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(..())
return
if(stat & (NOPOWER|BROKEN))
return
var/t = ""
t += "<A href='?src=\ref[src];setx=1'>Set X</A>"
t += "<A href='?src=\ref[src];sety=1'>Set Y</A>"
t += "<A href='?src=\ref[src];setz=1'>Set Z</A>"
t += "<BR><BR>Current set coordinates:"
t += "([x_co], [y_co], [z_co])"
t += "<BR><BR><A href='?src=\ref[src];send=1'>Send</A>"
t += " <A href='?src=\ref[src];receive=1'>Receive</A>"
t += "<BR><BR><A href='?src=\ref[src];recal=1'>Recalibrate</A>"
var/datum/browser/popup = new(user, "telesci", name, 640, 480)
popup.set_content(t)
popup.open()
return
// On first use, the coordinates are null. Rather than displaying null, we'll set them to unset.
if(!x_co)
x_co = "Unset"
if(!y_co)
y_co = "Unset"
if(!z_co)
z_co = "Unset"
var/data[0]
data["coordx"] = x_co
data["coordy"] = y_co
data["coordz"] = z_co
// Set up the Nano UI
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "telescience_console.tmpl", "Telescience Console UI", 640, 480)
ui.set_initial_data(data)
ui.open()
/obj/machinery/computer/telescience/proc/telefail(var/level)
var/teleturf = get_turf(telepad)
@@ -63,7 +73,7 @@
s.start()
if(2)
for(var/mob/living/carbon/human/M in viewers(telepad, null))
if(M.loc.loc == telepad.loc.loc) //stops the geneticists with xray vision getting irradiated
if(M.loc.loc == telepad.loc.loc) // Stops the geneticists with X-Ray vision getting irradiated
M.apply_effect((rand(50, 100)), IRRADIATE, 0)
M << "\red You feel irradiated."
if(3)
@@ -174,14 +184,14 @@
/obj/machinery/computer/telescience/proc/checkFail()
var/fail = 0
if(x_co == "")
usr << "\red Error: set X coordinates."
if(x_co == "" || x_co == "Unset")
usr << "\red Error: set X coordinate."
fail = 1
if(y_co == "")
usr << "\red Error: set Y coordinates."
if(y_co == "" || y_co == "Unset")
usr << "\red Error: set Y coordinate."
fail = 1
if(z_co == "")
usr << "\red Error: set Z coordinates."
if(z_co == "" || z_co == "Unset")
usr << "\red Error: set Z coordinate."
fail = 1
if(x_co < 11 || x_co > 245)
usr << "\red Error: X is less than 11 or greater than 245."
@@ -208,30 +218,36 @@
a = copytext(sanitize(a), 1, 20)
x_co = a
x_co = text2num(x_co)
nanomanager.update_uis(src)
return
if(href_list["sety"])
var/b = input("Please input desired Y coordinate.", name, y_co) as num
b = copytext(sanitize(b), 1, 20)
y_co = b
y_co = text2num(y_co)
nanomanager.update_uis(src)
return
if(href_list["setz"])
var/c = input("Please input desired Z coordinate.", name, z_co) as num
c = copytext(sanitize(c), 1, 20)
z_co = c
z_co = text2num(z_co)
nanomanager.update_uis(src)
return
if(href_list["send"])
teleprep(0)
nanomanager.update_uis(src)
return
if(href_list["receive"])
teleprep(1)
nanomanager.update_uis(src)
return
if(href_list["recal"])
if(telepad == null)
for(var/obj/machinery/telepad/T in range(src,10))
telepad = T
if(!telepad) return
if(!telepad)
return
var/teleturf = get_turf(telepad)
teles_left = rand(8,12)
x_off = rand(-10,10)
@@ -240,12 +256,13 @@
s.set_up(5, 1, teleturf)
s.start()
usr << "\blue Calibration successful."
nanomanager.update_uis(src)
return
/obj/machinery/computer/telescience/attackby(I as obj, user as mob) //Emagging.
/obj/machinery/computer/telescience/attackby(I as obj, user as mob) // Emagging
if(istype(I,/obj/item/weapon/card/emag))
if (src.emagged == 0)
user << "\blue You scramble the Telescience authentication key to an unknown signal, you should be able to teleport to more places now!"
user << "\blue You scramble the Telescience authentication key to an unknown signal. You should be able to teleport to more places now!"
src.emagged = 1
else
user << "\red The machine seems unaffected by the card swipe..."
+310
View File
@@ -0,0 +1,310 @@
/obj/machinery/syndicatebomb
icon = 'icons/obj/assemblies.dmi'
name = "syndicate bomb"
icon_state = "syndicate-bomb"
desc = "A large and menacing device. Can be bolted down with a wrench."
anchored = 0
density = 0
layer = MOB_LAYER - 0.1 //so people can't hide it and it's REALLY OBVIOUS
unacidable = 1
var/datum/wires/syndicatebomb/wires = null
var/timer = 60
var/open_panel = 0 //are the wires exposed?
var/active = 0 //is the bomb counting down?
var/defused = 0 //is the bomb capable of exploding?
var/obj/item/weapon/bombcore/payload = /obj/item/weapon/bombcore/
var/beepsound = 'sound/items/timer.ogg'
/obj/machinery/syndicatebomb/process()
if(active && !defused && (timer > 0)) //Tick Tock
var/volume = (timer <= 10 ? 30 : 5) // Tick louder when the bomb is closer to being detonated.
playsound(loc, beepsound, volume, 0)
timer--
if(active && !defused && (timer <= 0)) //Boom
active = 0
timer = 60
update_icon()
if(payload in src)
payload.detonate()
return
if(!active || defused) //Counter terrorists win
if(defused && payload in src)
payload.defuse()
return
/obj/machinery/syndicatebomb/New()
wires = new(src)
payload = new payload(src)
update_icon()
..()
/obj/machinery/syndicatebomb/examine()
..()
usr << "A digital display on it reads \"[timer]\"."
/obj/machinery/syndicatebomb/update_icon()
icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]"
/obj/machinery/syndicatebomb/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/weapon/wrench))
if(!anchored)
if(!isturf(src.loc) || istype(src.loc, /turf/space))
user << "<span class='notice'>The bomb must be placed on solid ground to attach it</span>"
else
user << "<span class='notice'>You firmly wrench the bomb to the floor</span>"
playsound(loc, 'sound/items/ratchet.ogg', 50, 1)
anchored = 1
if(active)
user << "<span class='notice'>The bolts lock in place</span>"
else
if(!active)
user << "<span class='notice'>You wrench the bomb from the floor</span>"
playsound(loc, 'sound/items/ratchet.ogg', 50, 1)
anchored = 0
else
user << "<span class='warning'>The bolts are locked down!</span>"
else if(istype(I, /obj/item/weapon/screwdriver))
open_panel = !open_panel
update_icon()
user << "<span class='notice'>You [open_panel ? "open" : "close"] the wire panel.</span>"
else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler ))
if(open_panel)
wires.Interact(user)
else if(istype(I, /obj/item/weapon/crowbar))
if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE))
if(payload)
user << "<span class='notice'>You carefully pry out [payload].</span>"
payload.loc = user.loc
payload = null
else
user << "<span class='notice'>There isn't anything in here to remove!</span>"
else if (open_panel)
user << "<span class='notice'>The wires conneting the shell to the explosives are holding it down!</span>"
else
user << "<span class='notice'>The cover is screwed on, it won't pry off!</span>"
else if(istype(I, /obj/item/weapon/bombcore))
if(!payload)
payload = I
user << "<span class='notice'>You place [payload] into [src].</span>"
user.drop_item()
payload.loc = src
else
user << "<span class='notice'>[payload] is already loaded into [src], you'll have to remove it first.</span>"
else
..()
/obj/machinery/syndicatebomb/attack_hand(var/mob/user)
interact(user)
/obj/machinery/syndicatebomb/attack_ai()
return
/obj/machinery/syndicatebomb/interact(var/mob/user)
if(wires)
wires.Interact(user)
if(!open_panel)
if(!active)
spawn()
settings(user)
return
else if(anchored)
user << "<span class='notice'>The bomb is bolted to the floor!</span>"
return
/obj/machinery/syndicatebomb/proc/settings(var/mob/user)
var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num
newtime = Clamp(newtime, 60, 60000)
if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station
timer = newtime
src.loc.visible_message("<span class='notice'>\icon[src] timer set for [timer] seconds.</span>")
if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user))
if(defused || active)
if(defused)
src.loc.visible_message("<span class='notice'>\icon[src] Device error: User intervention required.</span>")
return
else
src.loc.visible_message("<span class='danger'>\icon[src] [timer] seconds until detonation, please clear the area.</span>")
playsound(loc, 'sound/machines/click.ogg', 30, 1)
active = 1
update_icon()
add_fingerprint(user)
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
if(payload && !istype(payload, /obj/item/weapon/bombcore/training))
message_admins("[key_name(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> has primed a [name] ([payload]) for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
payload.adminlog = "The [src.name] that [key_name(user)] had primed detonated!"
/obj/machinery/syndicatebomb/proc/isWireCut(var/index)
return wires.IsIndexCut(index)
///Bomb Subtypes///
/obj/machinery/syndicatebomb/training
name = "training bomb"
icon_state = "training-bomb"
desc = "A salvaged syndicate device gutted of its explosives to be used as a training aid for aspiring bomb defusers."
payload = /obj/item/weapon/bombcore/training/
/obj/machinery/syndicatebomb/badmin
name = "generic summoning badmin bomb"
desc = "Oh god what is in this thing?"
payload = /obj/item/weapon/bombcore/badmin/summon/
/obj/machinery/syndicatebomb/badmin/clown
name = "clown bomb"
icon_state = "clown-bomb"
desc = "HONK."
payload = /obj/item/weapon/bombcore/badmin/summon/clown
beepsound = 'sound/items/bikehorn.ogg'
/obj/machinery/syndicatebomb/badmin/varplosion
payload = /obj/item/weapon/bombcore/badmin/explosion/
///Bomb Cores///
/obj/item/weapon/bombcore
name = "bomb payload"
desc = "A powerful secondary explosive of syndicate design and unknown composition, it should be stable under normal conditions..."
icon = 'icons/obj/assemblies.dmi'
icon_state = "bombcore"
item_state = "eshield0"
w_class = 3.0
origin_tech = "syndicate=6;combat=5"
var/adminlog = null
/obj/item/weapon/bombcore/ex_act(severity) //Little boom can chain a big boom
src.detonate()
/obj/item/weapon/bombcore/proc/detonate()
if(adminlog)
message_admins(adminlog)
log_game(adminlog)
explosion(get_turf(src),2,5,11)
del(src)
/obj/item/weapon/bombcore/proc/defuse()
//Note: Because of how var/defused is used you shouldn't override this UNLESS you intend to set the var to 0 or
// otherwise remove the core/reset the wires before the end of defuse(). It will repeatedly be called otherwise.
///Bomb Core Subtypes///
/obj/item/weapon/bombcore/training
name = "dummy payload"
desc = "A nanotrasen replica of a syndicate payload. Its not intended to explode but to announce that it WOULD have exploded, then rewire itself to allow for more training."
origin_tech = null
var/defusals = 0
var/attempts = 0
/obj/item/weapon/bombcore/training/proc/reset()
var/obj/machinery/syndicatebomb/holder = src.loc
if(istype(holder))
if(holder.wires)
holder.wires.Shuffle()
holder.defused = 0
holder.open_panel = 0
holder.update_icon()
holder.updateDialog()
/obj/item/weapon/bombcore/training/detonate()
var/obj/machinery/syndicatebomb/holder = src.loc
if(istype(holder))
attempts++
holder.loc.visible_message("<span class='danger'>\icon[holder] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...</span>")
reset()
else
del(src)
/obj/item/weapon/bombcore/training/defuse()
var/obj/machinery/syndicatebomb/holder = src.loc
if(istype(holder))
attempts++
defusals++
holder.loc.visible_message("<span class='notice'>\icon[holder] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds...</span>")
sleep(50) //Just in case someone is trying to remove the bomb core this gives them a little window to crowbar it out
if(istype(holder))
reset()
/obj/item/weapon/bombcore/badmin
name = "badmin payload"
desc = "If you're seeing this someone has either made a mistake or gotten dangerously savvy with var editing!"
origin_tech = null
/obj/item/weapon/bombcore/badmin/defuse() //because we wouldn't want them being harvested by players
var/obj/machinery/syndicatebomb/B = src.loc
del(B)
del(src)
/obj/item/weapon/bombcore/badmin/summon/
var/summon_path = /obj/item/weapon/reagent_containers/food/snacks/cookie
var/amt_summon = 1
/obj/item/weapon/bombcore/badmin/summon/detonate()
var/obj/machinery/syndicatebomb/B = src.loc
for(var/i = 0; i < amt_summon; i++)
var/atom/movable/X = new summon_path
X.loc = get_turf(src)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(X, pick(NORTH,SOUTH,EAST,WEST))
del(B)
del(src)
/obj/item/weapon/bombcore/badmin/summon/clown
summon_path = /mob/living/simple_animal/hostile/retaliate/clown
amt_summon = 100
/obj/item/weapon/bombcore/badmin/summon/clown/defuse()
playsound(src.loc, 'sound/misc/sadtrombone.ogg', 50)
..()
/obj/item/weapon/bombcore/badmin/explosion/
var/HeavyExplosion = 2
var/MediumExplosion = 5
var/LightExplosion = 11
/obj/item/weapon/bombcore/badmin/explosion/detonate()
explosion(get_turf(src),HeavyExplosion,MediumExplosion,LightExplosion)
///Syndicate Detonator (aka the big red button)///
/obj/item/device/syndicatedetonator
name = "big red button"
desc = "Nothing good can come of pressing a button this garish..."
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
item_state = "electronic"
w_class = 1.0
origin_tech = "syndicate=2"
var/cooldown = 0
var/detonated = 0
var/existant = 0
/obj/item/device/syndicatedetonator/attack_self(mob/user as mob)
if(!cooldown)
for(var/obj/machinery/syndicatebomb/B in machines)
if(B.active)
B.timer = 0
detonated++
existant++
playsound(user, 'sound/machines/click.ogg', 20, 1)
user << "<span class='notice'>[existant] found, [detonated] triggered.</span>"
if(detonated)
var/turf/T = get_turf(src)
var/area/A = get_area(T)
detonated--
var/log_str = "[key_name(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>."
bombers += log_str
message_admins(log_str)
log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name]([T.x],[T.y],[T.z])")
detonated = 0
existant = 0
cooldown = 1
spawn(30) cooldown = 0
+12 -11
View File
@@ -5,8 +5,8 @@
initial_icon = "gygax"
step_in = 3
dir_in = 1 //Facing North.
health = 300
deflect_chance = 15
health = 250
deflect_chance = 5
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
max_temperature = 25000
infra_luminosity = 6
@@ -15,8 +15,9 @@
wreckage = /obj/effect/decal/mecha_wreckage/gygax
internal_damage_threshold = 35
max_equip = 3
maxsize = 1
maxsize = 2
force = 10
step_energy_drain = 3
/obj/mecha/combat/gygax/loaded/New()
..()
@@ -27,25 +28,25 @@
return
/obj/mecha/combat/gygax/dark
desc = "A lightweight exosuit used by Nanotrasen Death Squads. A significantly upgraded Gygax security mech."
desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications."
name = "Dark Gygax"
icon_state = "darkgygax"
initial_icon = "darkgygax"
health = 400
deflect_chance = 25
health = 300
deflect_chance = 15
damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8)
max_temperature = 45000
max_temperature = 35000
overload_coeff = 1
operation_req_access = list(access_syndicate)
wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark
max_equip = 4
maxsize = 2
step_energy_drain = 5
/obj/mecha/combat/gygax/dark/New()
/obj/mecha/combat/gygax/dark/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter
ME.attach(src)
+17 -1
View File
@@ -43,7 +43,23 @@
operation_req_access = list(access_syndicate)
wreckage = /obj/effect/decal/mecha_wreckage/mauler
/obj/mecha/combat/marauder/New()
/obj/mecha/combat/marauder/mauler/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
src.smoke_system.set_up(3, 0, src)
src.smoke_system.attach(src)
return
/obj/mecha/combat/marauder/loaded/New()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
ME.attach(src)
+41 -9
View File
@@ -201,13 +201,45 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
name = "\improper FNX-66 Carbine"
name = "FNX-66 Carbine"
icon_state = "mecha_carbine"
equip_cooldown = 5
projectile = /obj/item/projectile/bullet/incendiary/mech
projectiles = 12
projectile = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath
fire_sound = 'sound/weapons/Gunshot.ogg'
projectiles = 24
projectile_energy_cost = 15
var/projectiles_per_shot = 1
var/deviation = 0.0
action(atom/target)
if(!action_checks(target)) return
var/turf/targloc = get_turf(target)
var/target_x = targloc.x
var/target_y = targloc.y
var/target_z = targloc.z
targloc = null
spawn for(var/i=1 to min(projectiles, projectiles_per_shot))
if(!chassis) break
var/turf/curloc = get_turf(chassis)
targloc = locate(target_x+GaussRandRound(deviation,1),target_y+GaussRandRound(deviation,1),target_z)
if (!targloc || !curloc)
continue
if (targloc == curloc)
continue
playsound(chassis, fire_sound, 50, 1)
var/obj/item/projectile/A = new projectile(curloc)
src.projectiles--
A.original = target
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
A.process()
sleep(2)
set_ready_state(0)
log_message("Fired from [src.name], targeting [target].")
do_after_cooldown()
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
name = "\improper S.H.H. \"Quietus\" Carbine"
@@ -222,7 +254,7 @@
name = "LBX AC 10 \"Scattershot\""
icon_state = "mecha_scatter"
equip_cooldown = 20
projectile = /obj/item/projectile/bullet/midbullet10
projectile = /obj/item/projectile/bullet/midbullet12
fire_sound = 'sound/weapons/Gunshot.ogg'
projectiles = 40
projectile_energy_cost = 25
@@ -263,7 +295,7 @@
equip_cooldown = 10
projectile = /obj/item/projectile/bullet/weakbullet
fire_sound = 'sound/weapons/Gunshot.ogg'
projectiles = 50
projectiles = 300
projectile_energy_cost = 20
var/projectiles_per_shot = 3
var/deviation = 0.3
@@ -299,11 +331,11 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
name = "SRM-4 Missile Rack"
name = "SRM-8 Missile Rack"
icon_state = "mecha_missilerack"
projectile = /obj/item/missile
fire_sound = 'sound/effects/bang.ogg'
projectiles = 4
projectiles = 8
projectile_energy_cost = 1000
equip_cooldown = 60
var/missile_speed = 2
@@ -331,7 +363,7 @@
throw_impact(atom/hit_atom)
if(primed)
explosion(hit_atom,1,2,2)
explosion(hit_atom, 0, 0, 2, 4)
del(src)
else
..()
@@ -345,7 +377,7 @@
projectiles = 6
missile_speed = 1.5
projectile_energy_cost = 800
equip_cooldown = 150
equip_cooldown = 60
var/det_time = 20
size=1
action(target)
+41 -1
View File
@@ -18,4 +18,44 @@
m_amt = 50
g_amt = 20
origin_tech = "magnets=1;engineering=1"
var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
/obj/item/device/multitool/ai_detect
var/track_delay = 0
/obj/item/device/multitool/ai_detect/New()
..()
processing_objects += src
/obj/item/device/multitool/ai_detect/Del()
processing_objects -= src
..()
/obj/item/device/multitool/ai_detect/process()
if(track_delay > world.time)
return
var/found_eye = 0
for(var/mob/aiEye/A in living_mob_list)
var/turf/our_turf = get_turf(src)
var/turf/eye_turf = get_turf(A)
if(get_dist(our_turf, eye_turf) < 9)
found_eye = 1
break
if(found_eye)
icon_state = "[initial(icon_state)]_red"
else
icon_state = initial(icon_state)
track_delay = world.time + 10 // 1 second
return
@@ -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
+1 -1
View File
@@ -277,4 +277,4 @@ var/list/world_uplinks = list()
/obj/item/device/radio/headset/uplink/New()
..()
hidden_uplink = new(src)
hidden_uplink.uses = 10
hidden_uplink.uses = 20
+15 -385
View File
@@ -7,396 +7,26 @@
icon_state = "violin"
item_state = "violin"
force = 10
var/datum/song/song
var/playing = 0
var/help = 0
var/edit = 1
var/repeat = 0
var/datum/song/handheld/song
/obj/item/device/violin/proc/playnote(var/note as text)
//world << "Note: [note]"
var/soundfile
/*BYOND loads resource files at compile time if they are ''. This means you can't really manipulate them dynamically.
Tried doing it dynamically at first but its more trouble than its worth. Would have saved many lines tho.*/
switch(note)
if("Cn1") soundfile = 'sound/violin/Cn1.mid'
if("C#1") soundfile = 'sound/violin/C#1.mid'
if("Db1") soundfile = 'sound/violin/Db1.mid'
if("Dn1") soundfile = 'sound/violin/Dn1.mid'
if("D#1") soundfile = 'sound/violin/D#1.mid'
if("Eb1") soundfile = 'sound/violin/Eb1.mid'
if("En1") soundfile = 'sound/violin/En1.mid'
if("E#1") soundfile = 'sound/violin/E#1.mid'
if("Fb1") soundfile = 'sound/violin/Fb1.mid'
if("Fn1") soundfile = 'sound/violin/Fn1.mid'
if("F#1") soundfile = 'sound/violin/F#1.mid'
if("Gb1") soundfile = 'sound/violin/Gb1.mid'
if("Gn1") soundfile = 'sound/violin/Gn1.mid'
if("G#1") soundfile = 'sound/violin/G#1.mid'
if("Ab1") soundfile = 'sound/violin/Ab1.mid'
if("An1") soundfile = 'sound/violin/An1.mid'
if("A#1") soundfile = 'sound/violin/A#1.mid'
if("Bb1") soundfile = 'sound/violin/Bb1.mid'
if("Bn1") soundfile = 'sound/violin/Bn1.mid'
if("B#1") soundfile = 'sound/violin/B#1.mid'
if("Cb2") soundfile = 'sound/violin/Cb2.mid'
if("Cn2") soundfile = 'sound/violin/Cn2.mid'
if("C#2") soundfile = 'sound/violin/C#2.mid'
if("Db2") soundfile = 'sound/violin/Db2.mid'
if("Dn2") soundfile = 'sound/violin/Dn2.mid'
if("D#2") soundfile = 'sound/violin/D#2.mid'
if("Eb2") soundfile = 'sound/violin/Eb2.mid'
if("En2") soundfile = 'sound/violin/En2.mid'
if("E#2") soundfile = 'sound/violin/E#2.mid'
if("Fb2") soundfile = 'sound/violin/Fb2.mid'
if("Fn2") soundfile = 'sound/violin/Fn2.mid'
if("F#2") soundfile = 'sound/violin/F#2.mid'
if("Gb2") soundfile = 'sound/violin/Gb2.mid'
if("Gn2") soundfile = 'sound/violin/Gn2.mid'
if("G#2") soundfile = 'sound/violin/G#2.mid'
if("Ab2") soundfile = 'sound/violin/Ab2.mid'
if("An2") soundfile = 'sound/violin/An2.mid'
if("A#2") soundfile = 'sound/violin/A#2.mid'
if("Bb2") soundfile = 'sound/violin/Bb2.mid'
if("Bn2") soundfile = 'sound/violin/Bn2.mid'
if("B#2") soundfile = 'sound/violin/B#2.mid'
if("Cb3") soundfile = 'sound/violin/Cb3.mid'
if("Cn3") soundfile = 'sound/violin/Cn3.mid'
if("C#3") soundfile = 'sound/violin/C#3.mid'
if("Db3") soundfile = 'sound/violin/Db3.mid'
if("Dn3") soundfile = 'sound/violin/Dn3.mid'
if("D#3") soundfile = 'sound/violin/D#3.mid'
if("Eb3") soundfile = 'sound/violin/Eb3.mid'
if("En3") soundfile = 'sound/violin/En3.mid'
if("E#3") soundfile = 'sound/violin/E#3.mid'
if("Fb3") soundfile = 'sound/violin/Fb3.mid'
if("Fn3") soundfile = 'sound/violin/Fn3.mid'
if("F#3") soundfile = 'sound/violin/F#3.mid'
if("Gb3") soundfile = 'sound/violin/Gb3.mid'
if("Gn3") soundfile = 'sound/violin/Gn3.mid'
if("G#3") soundfile = 'sound/violin/G#3.mid'
if("Ab3") soundfile = 'sound/violin/Ab3.mid'
if("An3") soundfile = 'sound/violin/An3.mid'
if("A#3") soundfile = 'sound/violin/A#3.mid'
if("Bb3") soundfile = 'sound/violin/Bb3.mid'
if("Bn3") soundfile = 'sound/violin/Bn3.mid'
if("B#3") soundfile = 'sound/violin/B#3.mid'
if("Cb4") soundfile = 'sound/violin/Cb4.mid'
if("Cn4") soundfile = 'sound/violin/Cn4.mid'
if("C#4") soundfile = 'sound/violin/C#4.mid'
if("Db4") soundfile = 'sound/violin/Db4.mid'
if("Dn4") soundfile = 'sound/violin/Dn4.mid'
if("D#4") soundfile = 'sound/violin/D#4.mid'
if("Eb4") soundfile = 'sound/violin/Eb4.mid'
if("En4") soundfile = 'sound/violin/En4.mid'
if("E#4") soundfile = 'sound/violin/E#4.mid'
if("Fb4") soundfile = 'sound/violin/Fb4.mid'
if("Fn4") soundfile = 'sound/violin/Fn4.mid'
if("F#4") soundfile = 'sound/violin/F#4.mid'
if("Gb4") soundfile = 'sound/violin/Gb4.mid'
if("Gn4") soundfile = 'sound/violin/Gn4.mid'
if("G#4") soundfile = 'sound/violin/G#4.mid'
if("Ab4") soundfile = 'sound/violin/Ab4.mid'
if("An4") soundfile = 'sound/violin/An4.mid'
if("A#4") soundfile = 'sound/violin/A#4.mid'
if("Bb4") soundfile = 'sound/violin/Bb4.mid'
if("Bn4") soundfile = 'sound/violin/Bn4.mid'
if("B#4") soundfile = 'sound/violin/B#4.mid'
if("Cb5") soundfile = 'sound/violin/Cb5.mid'
if("Cn5") soundfile = 'sound/violin/Cn5.mid'
if("C#5") soundfile = 'sound/violin/C#5.mid'
if("Db5") soundfile = 'sound/violin/Db5.mid'
if("Dn5") soundfile = 'sound/violin/Dn5.mid'
if("D#5") soundfile = 'sound/violin/D#5.mid'
if("Eb5") soundfile = 'sound/violin/Eb5.mid'
if("En5") soundfile = 'sound/violin/En5.mid'
if("E#5") soundfile = 'sound/violin/E#5.mid'
if("Fb5") soundfile = 'sound/violin/Fb5.mid'
if("Fn5") soundfile = 'sound/violin/Fn5.mid'
if("F#5") soundfile = 'sound/violin/F#5.mid'
if("Gb5") soundfile = 'sound/violin/Gb5.mid'
if("Gn5") soundfile = 'sound/violin/Gn5.mid'
if("G#5") soundfile = 'sound/violin/G#5.mid'
if("Ab5") soundfile = 'sound/violin/Ab5.mid'
if("An5") soundfile = 'sound/violin/An5.mid'
if("A#5") soundfile = 'sound/violin/A#5.mid'
if("Bb5") soundfile = 'sound/violin/Bb5.mid'
if("Bn5") soundfile = 'sound/violin/Bn5.mid'
if("B#5") soundfile = 'sound/violin/B#5.mid'
if("Cb6") soundfile = 'sound/violin/Cb6.mid'
if("Cn6") soundfile = 'sound/violin/Cn6.mid'
if("C#6") soundfile = 'sound/violin/C#6.mid'
if("Db6") soundfile = 'sound/violin/Db6.mid'
if("Dn6") soundfile = 'sound/violin/Dn6.mid'
if("D#6") soundfile = 'sound/violin/D#6.mid'
if("Eb6") soundfile = 'sound/violin/Eb6.mid'
if("En6") soundfile = 'sound/violin/En6.mid'
if("E#6") soundfile = 'sound/violin/E#6.mid'
if("Fb6") soundfile = 'sound/violin/Fb6.mid'
if("Fn6") soundfile = 'sound/violin/Fn6.mid'
if("F#6") soundfile = 'sound/violin/F#6.mid'
if("Gb6") soundfile = 'sound/violin/Gb6.mid'
if("Gn6") soundfile = 'sound/violin/Gn6.mid'
if("G#6") soundfile = 'sound/violin/G#6.mid'
if("Ab6") soundfile = 'sound/violin/Ab6.mid'
if("An6") soundfile = 'sound/violin/An6.mid'
if("A#6") soundfile = 'sound/violin/A#6.mid'
if("Bb6") soundfile = 'sound/violin/Bb6.mid'
if("Bn6") soundfile = 'sound/violin/Bn6.mid'
if("B#6") soundfile = 'sound/violin/B#6.mid'
if("Cb7") soundfile = 'sound/violin/Cb7.mid'
if("Cn7") soundfile = 'sound/violin/Cn7.mid'
if("C#7") soundfile = 'sound/violin/C#7.mid'
if("Db7") soundfile = 'sound/violin/Db7.mid'
if("Dn7") soundfile = 'sound/violin/Dn7.mid'
if("D#7") soundfile = 'sound/violin/D#7.mid'
if("Eb7") soundfile = 'sound/violin/Eb7.mid'
if("En7") soundfile = 'sound/violin/En7.mid'
if("E#7") soundfile = 'sound/violin/E#7.mid'
if("Fb7") soundfile = 'sound/violin/Fb7.mid'
if("Fn7") soundfile = 'sound/violin/Fn7.mid'
if("F#7") soundfile = 'sound/violin/F#7.mid'
if("Gb7") soundfile = 'sound/violin/Gb7.mid'
if("Gn7") soundfile = 'sound/violin/Gn7.mid'
if("G#7") soundfile = 'sound/violin/G#7.mid'
if("Ab7") soundfile = 'sound/violin/Ab7.mid'
if("An7") soundfile = 'sound/violin/An7.mid'
if("A#7") soundfile = 'sound/violin/A#7.mid'
if("Bb7") soundfile = 'sound/violin/Bb7.mid'
if("Bn7") soundfile = 'sound/violin/Bn7.mid'
if("B#7") soundfile = 'sound/violin/B#7.mid'
if("Cb8") soundfile = 'sound/violin/Cb8.mid'
if("Cn8") soundfile = 'sound/violin/Cn8.mid'
if("C#8") soundfile = 'sound/violin/C#8.mid'
if("Db8") soundfile = 'sound/violin/Db8.mid'
if("Dn8") soundfile = 'sound/violin/Dn8.mid'
if("D#8") soundfile = 'sound/violin/D#8.mid'
if("Eb8") soundfile = 'sound/violin/Eb8.mid'
if("En8") soundfile = 'sound/violin/En8.mid'
if("E#8") soundfile = 'sound/violin/E#8.mid'
if("Fb8") soundfile = 'sound/violin/Fb8.mid'
if("Fn8") soundfile = 'sound/violin/Fn8.mid'
if("F#8") soundfile = 'sound/violin/F#8.mid'
if("Gb8") soundfile = 'sound/violin/Gb8.mid'
if("Gn8") soundfile = 'sound/violin/Gn8.mid'
if("G#8") soundfile = 'sound/violin/G#8.mid'
if("Ab8") soundfile = 'sound/violin/Ab8.mid'
if("An8") soundfile = 'sound/violin/An8.mid'
if("A#8") soundfile = 'sound/violin/A#8.mid'
if("Bb8") soundfile = 'sound/violin/Bb8.mid'
if("Bn8") soundfile = 'sound/violin/Bn8.mid'
if("B#8") soundfile = 'sound/violin/B#8.mid'
if("Cb9") soundfile = 'sound/violin/Cb9.mid'
if("Cn9") soundfile = 'sound/violin/Cn9.mid'
else return
/obj/item/device/violin/New()
song = new("violin", src)
song.instrumentExt = "ogg"
hearers(15, get_turf(src)) << sound(soundfile)
/obj/item/device/violin/proc/playsong()
do
var/cur_oct[7]
var/cur_acc[7]
for(var/i = 1 to 7)
cur_oct[i] = "3"
cur_acc[i] = "n"
for(var/line in song.lines)
//world << line
for(var/beat in text2list(lowertext(line), ","))
//world << "beat: [beat]"
var/list/notes = text2list(beat, "/")
for(var/note in text2list(notes[1], "-"))
//world << "note: [note]"
if(!playing || !isliving(loc))//If the violin is playing, or isn't held by a person
playing = 0
return
if(lentext(note) == 0)
continue
//world << "Parse: [copytext(note,1,2)]"
var/cur_note = text2ascii(note) - 96
if(cur_note < 1 || cur_note > 7)
continue
for(var/i=2 to lentext(note))
var/ni = copytext(note,i,i+1)
if(!text2num(ni))
if(ni == "#" || ni == "b" || ni == "n")
cur_acc[cur_note] = ni
else if(ni == "s")
cur_acc[cur_note] = "#" // so shift is never required
else
cur_oct[cur_note] = ni
playnote(uppertext(copytext(note,1,2)) + cur_acc[cur_note] + cur_oct[cur_note])
if(notes.len >= 2 && text2num(notes[2]))
sleep(song.tempo / text2num(notes[2]))
else
sleep(song.tempo)
if(repeat > 0)
repeat-- //Infinite loops are baaaad.
while(repeat > 0)
playing = 0
/obj/item/device/violin/Destroy()
del(song)
song = null
..()
/obj/item/device/violin/attack_self(mob/user as mob)
if(!isliving(user) || user.stat || user.restrained() || user.lying) return
user.set_machine(src)
interact(user)
var/dat = "<HEAD><TITLE>Violin</TITLE></HEAD><BODY>"
if(song)
if(song.lines.len > 0 && !(playing))
dat += "<A href='?src=\ref[src];play=1'>Play Song</A><BR><BR>"
dat += "<A href='?src=\ref[src];repeat=1'>Repeat Song: [repeat] times.</A><BR><BR>"
if(playing)
dat += "<A href='?src=\ref[src];stop=1'>Stop Playing</A><BR>"
dat += "Repeats left: [repeat].<BR><BR>"
if(!edit)
dat += "<A href='?src=\ref[src];edit=2'>Show Editor</A><BR><BR>"
else
dat += "<A href='?src=\ref[src];edit=1'>Hide Editor</A><BR>"
dat += "<A href='?src=\ref[src];newsong=1'>Start a New Song</A><BR>"
dat += "<A href='?src=\ref[src];import=1'>Import a Song</A><BR><BR>"
if(song)
var/calctempo = (10/song.tempo)*60
dat += "Tempo : <A href='?src=\ref[src];tempo=10'>-</A><A href='?src=\ref[src];tempo=1'>-</A> [calctempo] BPM <A href='?src=\ref[src];tempo=-1'>+</A><A href='?src=\ref[src];tempo=-10'>+</A><BR><BR>"
var/linecount = 0
for(var/line in song.lines)
linecount += 1
dat += "Line [linecount]: [line] <A href='?src=\ref[src];deleteline=[linecount]'>Delete Line</A> <A href='?src=\ref[src];modifyline=[linecount]'>Modify Line</A><BR>"
dat += "<A href='?src=\ref[src];newline=1'>Add Line</A><BR><BR>"
if(help)
dat += "<A href='?src=\ref[src];help=1'>Hide Help</A><BR>"
dat += {"
Lines are a series of chords, separated by commas (,), each with notes seperated by hyphens (-).<br>
Every note in a chord will play together, with chord timed by the tempo.<br>
<br>
Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.<br>
By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.<br>
Example: <i>C,D,E,F,G,A,B</i> will play a C major scale.<br>
After a note has an accidental placed, it will be remembered: <i>C,C4,C,C3</i> is C3,C4,C4,C3</i><br>
Chords can be played simply by seperating each note with a hyphon: <i>A-C#,Cn-E,E-G#,Gn-B</i><br>
A pause may be denoted by an empty chord: <i>C,E,,C,G</i><br>
To make a chord be a different time, end it with /x, where the chord length will be length<br>
defined by tempo / x: <i>C,G/2,E/4</i><br>
Combined, an example is: <i>E-E4/4,/2,G#/8,B/8,E3-E4/4</i>
<br>
Lines may be up to 50 characters.<br>
A song may only contain up to 50 lines.<br>
"}
else
dat += "<A href='?src=\ref[src];help=2'>Show Help</A><BR>"
dat += "</BODY></HTML>"
user << browse(dat, "window=violin;size=700x300")
onclose(user, "violin")
/obj/item/device/violin/Topic(href, href_list)
if(!in_range(src, usr) || issilicon(usr) || !isliving(usr) || !usr.canmove || usr.restrained())
usr << browse(null, "window=violin;size=700x300")
onclose(usr, "violin")
/obj/item/device/violin/interact(mob/user as mob)
if(!user)
return
if(href_list["newsong"])
song = new()
else if(song)
if(href_list["repeat"]) //Changing this from a toggle to a number of repeats to avoid infinite loops.
if(playing) return //So that people cant keep adding to repeat. If the do it intentionally, it could result in the server crashing.
var/tempnum = input("How many times do you want to repeat this piece? (max:10)") as num|null
if(tempnum > 10)
tempnum = 10
if(tempnum < 0)
tempnum = 0
repeat = round(tempnum)
if(!isliving(user) || user.stat || user.restrained() || user.lying)
return
else if(href_list["tempo"])
song.tempo += round(text2num(href_list["tempo"]))
if(song.tempo < 1)
song.tempo = 1
else if(href_list["play"])
if(song)
playing = 1
spawn() playsong()
else if(href_list["newline"])
var/newline = html_encode(input("Enter your line: ", "violin") as text|null)
if(!newline)
return
if(song.lines.len > 50)
return
if(lentext(newline) > 50)
newline = copytext(newline, 1, 50)
song.lines.Add(newline)
else if(href_list["deleteline"])
var/num = round(text2num(href_list["deleteline"]))
if(num > song.lines.len || num < 1)
return
song.lines.Cut(num, num+1)
else if(href_list["modifyline"])
var/num = round(text2num(href_list["modifyline"]),1)
var/content = html_encode(input("Enter your line: ", "violin", song.lines[num]) as text|null)
if(!content)
return
if(lentext(content) > 50)
content = copytext(content, 1, 50)
if(num > song.lines.len || num < 1)
return
song.lines[num] = content
else if(href_list["stop"])
playing = 0
else if(href_list["help"])
help = text2num(href_list["help"]) - 1
else if(href_list["edit"])
edit = text2num(href_list["edit"]) - 1
else if(href_list["import"])
var/t = ""
do
t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", name), t) as message)
if(!in_range(src, usr))
return
if(lentext(t) >= 3072)
var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no")
if(cont == "no")
break
while(lentext(t) > 3072)
//split into lines
spawn()
var/list/lines = text2list(t, "\n")
var/tempo = 5
if(copytext(lines[1],1,6) == "BPM: ")
tempo = 600 / text2num(copytext(lines[1],6))
lines.Cut(1,2)
if(lines.len > 50)
usr << "Too many lines!"
lines.Cut(51)
var/linenum = 1
for(var/l in lines)
if(lentext(l) > 50)
usr << "Line [linenum] too long!"
lines.Remove(l)
else
linenum++
song = new()
song.lines = lines
song.tempo = tempo
add_fingerprint(usr)
for(var/mob/M in viewers(1, loc))
if((M.client && M.machine == src))
attack_self(M)
return
/obj/item/device/violin/guitar
name = "engraved guitar"
desc = "An aged wooden acoustic guitar It has an engraving on the back: \"For my loyal robotic companion, S.A.M. -LWK\"."
icon = 'icons/obj/musician.dmi'
icon_state = "guitar"
item_state = "guitar"
slot_flags = SLOT_BACK
user.set_machine(src)
song.interact(user)
+10 -5
View File
@@ -927,9 +927,9 @@ obj/item/toy/cards/deck/syndicate
desc = "A deck of space-grade playing cards. They seem unusually rigid."
deckstyle = "syndicate"
card_hitsound = 'sound/weapons/bladeslice.ogg'
card_force = 15
card_throwforce = 15
card_throw_speed = 6
card_force = 5
card_throwforce = 10
card_throw_speed = 3
card_throw_range = 20
card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut")
@@ -952,13 +952,18 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/nuke/attack_self(mob/user)
if (cooldown < world.time)
cooldown = world.time + 3000 //5 minutes
cooldown = world.time + 1800 //3 minutes
user.visible_message("<span class='warning'>[user] presses a button on [src]</span>", "<span class='notice'>You activate [src], it plays a loud noise!</span>", "<span class='notice'>You hear the click of a button.</span>")
spawn(5) //gia said so
icon_state = "nuketoy"
playsound(src, 'sound/machines/Alarm.ogg', 100, 0, surround = 0)
playsound(src, 'sound/machines/Alarm.ogg', 100, 0, 0)
sleep(135)
icon_state = "nuketoycool"
sleep(cooldown - world.time)
icon_state = "nuketoyidle"
else
var/timeleft = (cooldown - world.time)
user << "<span class='alert'>Nothing happens, and '</span>[round(timeleft/10)]<span class='alert'>' appears on a small display.</span>"
/obj/item/toy/therapy_red
@@ -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
+6 -10
View File
@@ -55,6 +55,8 @@
/obj/item/weapon/plastique/attack_self(mob/user as mob)
var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num
if(newtime < 10)
newtime = 10
if(newtime > 60000)
newtime = 60000
timer = newtime
@@ -64,16 +66,9 @@
/obj/item/weapon/plastique/afterattack(atom/target as obj|turf, mob/user as mob, flag)
if (!flag)
return
if (istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage/) || istype(target, /obj/machinery/door/airlock/hatch/gamma))
if (ismob(target) || istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage/) || istype(target, /obj/machinery/door/airlock/hatch/gamma))
return
user << "Planting explosives..."
if(ismob(target))
user.attack_log += "\[[time_stamp()]\] <font color='red'> [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])</font>"
if(target:ckey)
msg_admin_attack("[user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
user.visible_message("\red [user.name] is trying to plant some kind of explosive on [target.name]!")
if(do_after(user, 50) && in_range(user, target))
user.drop_item()
@@ -102,11 +97,12 @@
if(!target)
target = src
if(location)
explosion(location, 0, 1, 3, 6)
explosion(location, -1, -1, 4, 4)
if(target)
if (istype(target, /turf/simulated/wall))
target:dismantle_wall(1)
var/turf/simulated/wall/W = target
W.dismantle_wall(1)
else
target.ex_act(1)
if (isobj(target))
@@ -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)
@@ -405,7 +405,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/adrenalin
name = "adrenalin"
desc = "Removes all stuns and knockdowns."
var/uses
var/uses = 3
get_data()
var/dat = {"
@@ -414,8 +414,8 @@ the implant may become unstable and either pre-maturely inject the subject or si
<b>Life:</b> Five days.<BR>
<b>Important Notes:</b> <font color='red'>Illegal</font><BR>
<HR>
<b>Implant Details:</b> Subjects injected with implant can activate a massive injection of adrenalin.<BR>
<b>Function:</b> Contains nanobots to stimulate body to mass-produce Adrenalin.<BR>
<b>Implant Details:</b> Subjects injected with implant can activate an injection of medical cocktails.<BR>
<b>Function:</b> Removes stuns, increases speed, and has a mild healing effect.<BR>
<b>Special Features:</b> Will prevent and cure most forms of brainwashing.<BR>
<b>Integrity:</b> Implant can only be used three times before the nanobots are depleted."}
return dat
@@ -429,6 +429,12 @@ the implant may become unstable and either pre-maturely inject the subject or si
source.SetStunned(0)
source.SetWeakened(0)
source.SetParalysis(0)
source.lying = 0
source.update_canmove()
source.reagents.add_reagent("synaptizine", 10)
source.reagents.add_reagent("tricordrazine", 10)
source.reagents.add_reagent("hyperzine", 10)
return
@@ -6,7 +6,7 @@
/obj/item/weapon/implant/uplink/New()
activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
hidden_uplink = new(src)
hidden_uplink.uses = 5
hidden_uplink.uses = 10
..()
return
@@ -180,4 +180,29 @@
name = "captain's satchel"
desc = "An exclusive satchel for Nanotrasen officers."
icon_state = "satchel-cap"
item_state = "captainpack"
item_state = "captainpack"
/obj/item/weapon/storage/backpack/satchel_flat
name = "smuggler's satchel"
desc = "A very slim satchel that can easily fit into tight spaces."
icon_state = "satchel-flat"
w_class = 3 //Can fit in backpacks itself.
storage_slots = 5
max_combined_w_class = 15
level = 1
cant_hold = list(/obj/item/weapon/storage/backpack/satchel_flat) //muh recursive backpacks
/obj/item/weapon/storage/backpack/satchel_flat/hide(var/intact)
if(intact)
invisibility = 101
anchored = 1 //otherwise you can start pulling, cover it, and drag around an invisible backpack.
icon_state = "[initial(icon_state)]2"
else
invisibility = initial(invisibility)
anchored = 0
icon_state = initial(icon_state)
/obj/item/weapon/storage/backpack/satchel_flat/New()
..()
new /obj/item/stack/tile/plasteel(src)
new /obj/item/weapon/crowbar(src)
@@ -158,3 +158,9 @@
can_hold = list(
"/obj/item/clothing/mask/luchador"
)
/obj/item/weapon/storage/belt/military
name = "military belt"
desc = "A syndicate belt designed to be used by boarding parties. Its style is modeled after the hardsuits they wear."
icon_state = "militarybelt"
item_state = "military"
@@ -198,6 +198,21 @@
new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/weapon/grenade/flashbang(src)
/obj/item/weapon/storage/box/teargas
name = "box of tear gas grenades (WARNING)"
desc = "<B>WARNING: These devices are extremely dangerous and can cause blindness and skin irritation.</B>"
icon_state = "flashbang"
/obj/item/weapon/storage/box/teargas/New()
..()
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/grenade/chem_grenade/teargas(src)
/obj/item/weapon/storage/box/emps
name = "emp grenades"
desc = "A box with 5 emp grenades."
@@ -110,6 +110,25 @@
new /obj/item/stack/medical/advanced/ointment(src)
new /obj/item/stack/medical/splint(src)
return
/obj/item/weapon/storage/firstaid/tactical
name = "first-aid kit"
icon_state = "bezerk"
desc = "I hope you've got insurance."
max_w_class = 3
/obj/item/weapon/storage/firstaid/tactical/New()
..()
if (empty) return
new /obj/item/clothing/tie/stethoscope( src )
new /obj/item/weapon/surgicaldrill(src)
new /obj/item/weapon/reagent_containers/hypospray/combat(src)
new /obj/item/weapon/reagent_containers/pill/bicaridine(src)
new /obj/item/weapon/reagent_containers/pill/dermaline(src)
new /obj/item/weapon/reagent_containers/ld50_syringe(src)
new /obj/item/clothing/glasses/hud/health/night(src)
return
/*
* Pill Bottles
*/
@@ -109,12 +109,14 @@
return
/obj/item/weapon/storage/box/syndie_kit/space
name = "Space Suit and Helmet"
name = "Boxed Space Suit and Helmet"
can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red)
max_w_class = 3
/obj/item/weapon/storage/box/syndie_kit/space/New()
..()
new /obj/item/clothing/suit/space/syndicate(src)
new /obj/item/clothing/head/helmet/space/syndicate(src)
new /obj/item/clothing/suit/space/syndicate/black/red(src)
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
return
/obj/item/weapon/storage/box/syndie_kit/surveillance
@@ -135,6 +137,15 @@
new /obj/item/ammo_box/a357(src)
return
/obj/item/weapon/storage/box/syndie_kit/imp_adrenal
name = "boxed adrenal implant (with injector)"
New()
..()
var/obj/item/weapon/implanter/O = new(src)
O.imp = new /obj/item/weapon/implant/adrenalin(O)
O.update()
/obj/item/weapon/storage/box/syndie_kit/mindslave
name = "box (MS)"
+8
View File
@@ -50,6 +50,14 @@
if (!can_touch(user) || !climbable)
return
for(var/obj/O in range(0, src))
if(O.density == 1 && O != src && !istype(O, /obj/machinery/door/window)) //Ignores windoors, as those already block climbing, otherwise a windoor on the opposite side of a table would prevent climbing.
user << "\red You cannot climb a [src] blocked by a solid object!"
return
for(var/turf/T in range(0, src))
if(T.density == 1)
user << "\red You cannot climb a [src] blocked by a solid object!"
return
var/turf/T = src.loc
if(!T || !istype(T)) return
@@ -42,7 +42,7 @@
/obj/structure/closet/proc/can_close()
for(var/obj/structure/closet/closet in get_turf(src))
if(closet != src)
if(closet != src && closet.anchored != 1)
return 0
return 1
@@ -129,9 +129,7 @@
return 1
/obj/structure/closet/proc/toggle(mob/user as mob)
var/orig = src.opened
. = src.opened ? src.close() : src.open()
if(. == orig)
if(!(src.opened ? src.close() : src.open()))
user << "<span class='notice'>It won't budge!</span>"
return
@@ -274,6 +272,9 @@
return
else if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(src == user.loc)
user << "<span class='notice'>You can not [welded?"unweld":"weld"] the locker from inside.</span>"
return
if(!WT.remove_fuel(0,user))
user << "<span class='notice'>You need more welding fuel to complete this task.</span>"
return
@@ -1,5 +1,5 @@
/obj/structure/closet/secure_closet/personal
desc = "It's a secure locker for personell. The first card swiped gains control."
desc = "It's a secure locker for personnel. The first card swiped gains control."
name = "personal closet"
req_access = list(access_all_personal_lockers)
var/registered_name = null
@@ -68,7 +68,9 @@
return
var/obj/item/weapon/card/id/I = W
if(!I || !I.registered_name) return
if(src.allowed(user) || !src.registered_name || (istype(I) && (src.registered_name == I.registered_name)))
if(src == user.loc)
user << "<span class='notice'>You can't reach the lock from inside.</span>"
else if(src.allowed(user) || !src.registered_name || (istype(I) && (src.registered_name == I.registered_name)))
//they can open all lockers, or nobody owns this, or they own this locker
src.locked = !( src.locked )
if(src.locked) src.icon_state = src.icon_locked
@@ -10,44 +10,50 @@
desc = "It's a storage unit for operative gear."
/obj/structure/closet/syndicate/personal/New()
..()
sleep(2)
new /obj/item/clothing/under/syndicate(src)
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/clothing/head/helmet/swat(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/weapon/storage/belt/military(src)
new /obj/item/weapon/crowbar/red(src)
new /obj/item/clothing/glasses/night(src)
/obj/structure/closet/syndicate/suits
desc = "It's a storage unit for operative space gear. Not fancy..."
/obj/structure/closet/syndicate/suits/New()
..()
sleep(2)
new /obj/item/weapon/tank/jetpack/oxygen(src)
new /obj/item/clothing/mask/gas/syndicate(src)
new /obj/item/clothing/under/syndicate(src)
new /obj/item/clothing/head/helmet/space/rig/syndi(src)
new /obj/item/clothing/suit/space/rig/syndi(src)
new /obj/item/weapon/crowbar/red(src)
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)
/obj/structure/closet/syndicate/nuclear
desc = "It's a storage unit for nuclear-operative gear."
desc = "It's a storage unit for a Syndicate boarding party.."
/obj/structure/closet/syndicate/nuclear/New()
..()
sleep(2)
new /obj/item/ammo_box/magazine/m12mm(src)
new /obj/item/ammo_box/magazine/m12mm(src)
new /obj/item/weapon/storage/box/handcuffs(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/weapon/storage/box/teargas(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/device/pda/syndicate(src)
var/obj/item/device/radio/uplink/U = new(src)
U.hidden_uplink.uses = 40
return
/obj/structure/closet/syndicate/resources/
+268 -343
View File
@@ -5,223 +5,86 @@
var/list/lines = new()
var/tempo = 5
/obj/structure/device/piano
name = "space minimoog"
icon = 'icons/obj/musician.dmi'
icon_state = "minimoog"
anchored = 1
density = 1
var/datum/song/song
var/playing = 0
var/help = 0
var/edit = 1
var/repeat = 0
var/playing = 0 // if we're playing
var/help = 0 // if help is open
var/edit = 1 // if we're in editing mode
var/repeat = 0 // number of times remaining to repeat
var/max_repeats = 10 // maximum times we can repeat
/obj/structure/device/piano/New()
if(prob(50))
name = "space minimoog"
desc = "This is a minimoog, like a space piano, but more spacey!"
icon_state = "minimoog"
var/instrumentDir = "piano" // the folder with the sounds
var/instrumentExt = "ogg" // the file extension
var/obj/instrumentObj = null // the associated obj playing the sound
/datum/song/New(dir, obj)
instrumentDir = dir
instrumentObj = obj
/datum/song/proc/Destroy()
instrumentObj = null
return
// note is a number from 1-7 for A-G
// acc is either "b", "n", or "#"
// oct is 1-8 (or 9 for C)
/datum/song/proc/playnote(var/note, var/acc as text, var/oct)
// handle accidental -> B<>C of E<>F
if(acc == "b" && (note == 3 || note == 6)) // C or F
if(note == 3)
oct--
note--
acc = "n"
else if(acc == "#" && (note == 2 || note == 5)) // B or E
if(note == 2)
oct++
note++
acc = "n"
else if(acc == "#" && (note == 7)) //G#
note = 1
acc = "b"
else if(acc == "#") // mass convert all sharps to flats, octave jump already handled
acc = "b"
note++
// check octave, C is allowed to go to 9
if(oct < 1 || (note == 3 ? oct > 9 : oct > 8))
return
// now generate name
var/soundfile = "sound/[instrumentDir]/[ascii2text(note+64)][acc][oct].[instrumentExt]"
soundfile = file(soundfile)
// make sure the note exists
if(!fexists(soundfile))
return
// and play
var/turf/source = get_turf(instrumentObj)
for(var/mob/M in hearers(15, source))
M.playsound_local(source, soundfile, 100, falloff = 5)
/datum/song/proc/updateDialog(mob/user as mob)
instrumentObj.updateDialog() // assumes it's an object in world, override if otherwise
/datum/song/proc/shouldStopPlaying()
if(instrumentObj)
return !instrumentObj.anchored // add special cases to stop in subclasses
else
name = "space piano"
desc = "This is a space piano, like a regular piano, but always in tune! Even if the musician isn't."
icon_state = "piano"
return 1
/obj/structure/device/piano/proc/playnote(var/note as text)
//world << "Note: [note]"
var/soundfile
/*BYOND loads resource files at compile time if they are ''. This means you can't really manipulate them dynamically.
Tried doing it dynamically at first but its more trouble than its worth. Would have saved many lines tho.*/
switch(note)
if("Cn1") soundfile = 'sound/piano/Cn1.ogg'
if("C#1") soundfile = 'sound/piano/C#1.ogg'
if("Db1") soundfile = 'sound/piano/Db1.ogg'
if("Dn1") soundfile = 'sound/piano/Dn1.ogg'
if("D#1") soundfile = 'sound/piano/D#1.ogg'
if("Eb1") soundfile = 'sound/piano/Eb1.ogg'
if("En1") soundfile = 'sound/piano/En1.ogg'
if("E#1") soundfile = 'sound/piano/E#1.ogg'
if("Fb1") soundfile = 'sound/piano/Fb1.ogg'
if("Fn1") soundfile = 'sound/piano/Fn1.ogg'
if("F#1") soundfile = 'sound/piano/F#1.ogg'
if("Gb1") soundfile = 'sound/piano/Gb1.ogg'
if("Gn1") soundfile = 'sound/piano/Gn1.ogg'
if("G#1") soundfile = 'sound/piano/G#1.ogg'
if("Ab1") soundfile = 'sound/piano/Ab1.ogg'
if("An1") soundfile = 'sound/piano/An1.ogg'
if("A#1") soundfile = 'sound/piano/A#1.ogg'
if("Bb1") soundfile = 'sound/piano/Bb1.ogg'
if("Bn1") soundfile = 'sound/piano/Bn1.ogg'
if("B#1") soundfile = 'sound/piano/B#1.ogg'
if("Cb2") soundfile = 'sound/piano/Cb2.ogg'
if("Cn2") soundfile = 'sound/piano/Cn2.ogg'
if("C#2") soundfile = 'sound/piano/C#2.ogg'
if("Db2") soundfile = 'sound/piano/Db2.ogg'
if("Dn2") soundfile = 'sound/piano/Dn2.ogg'
if("D#2") soundfile = 'sound/piano/D#2.ogg'
if("Eb2") soundfile = 'sound/piano/Eb2.ogg'
if("En2") soundfile = 'sound/piano/En2.ogg'
if("E#2") soundfile = 'sound/piano/E#2.ogg'
if("Fb2") soundfile = 'sound/piano/Fb2.ogg'
if("Fn2") soundfile = 'sound/piano/Fn2.ogg'
if("F#2") soundfile = 'sound/piano/F#2.ogg'
if("Gb2") soundfile = 'sound/piano/Gb2.ogg'
if("Gn2") soundfile = 'sound/piano/Gn2.ogg'
if("G#2") soundfile = 'sound/piano/G#2.ogg'
if("Ab2") soundfile = 'sound/piano/Ab2.ogg'
if("An2") soundfile = 'sound/piano/An2.ogg'
if("A#2") soundfile = 'sound/piano/A#2.ogg'
if("Bb2") soundfile = 'sound/piano/Bb2.ogg'
if("Bn2") soundfile = 'sound/piano/Bn2.ogg'
if("B#2") soundfile = 'sound/piano/B#2.ogg'
if("Cb3") soundfile = 'sound/piano/Cb3.ogg'
if("Cn3") soundfile = 'sound/piano/Cn3.ogg'
if("C#3") soundfile = 'sound/piano/C#3.ogg'
if("Db3") soundfile = 'sound/piano/Db3.ogg'
if("Dn3") soundfile = 'sound/piano/Dn3.ogg'
if("D#3") soundfile = 'sound/piano/D#3.ogg'
if("Eb3") soundfile = 'sound/piano/Eb3.ogg'
if("En3") soundfile = 'sound/piano/En3.ogg'
if("E#3") soundfile = 'sound/piano/E#3.ogg'
if("Fb3") soundfile = 'sound/piano/Fb3.ogg'
if("Fn3") soundfile = 'sound/piano/Fn3.ogg'
if("F#3") soundfile = 'sound/piano/F#3.ogg'
if("Gb3") soundfile = 'sound/piano/Gb3.ogg'
if("Gn3") soundfile = 'sound/piano/Gn3.ogg'
if("G#3") soundfile = 'sound/piano/G#3.ogg'
if("Ab3") soundfile = 'sound/piano/Ab3.ogg'
if("An3") soundfile = 'sound/piano/An3.ogg'
if("A#3") soundfile = 'sound/piano/A#3.ogg'
if("Bb3") soundfile = 'sound/piano/Bb3.ogg'
if("Bn3") soundfile = 'sound/piano/Bn3.ogg'
if("B#3") soundfile = 'sound/piano/B#3.ogg'
if("Cb4") soundfile = 'sound/piano/Cb4.ogg'
if("Cn4") soundfile = 'sound/piano/Cn4.ogg'
if("C#4") soundfile = 'sound/piano/C#4.ogg'
if("Db4") soundfile = 'sound/piano/Db4.ogg'
if("Dn4") soundfile = 'sound/piano/Dn4.ogg'
if("D#4") soundfile = 'sound/piano/D#4.ogg'
if("Eb4") soundfile = 'sound/piano/Eb4.ogg'
if("En4") soundfile = 'sound/piano/En4.ogg'
if("E#4") soundfile = 'sound/piano/E#4.ogg'
if("Fb4") soundfile = 'sound/piano/Fb4.ogg'
if("Fn4") soundfile = 'sound/piano/Fn4.ogg'
if("F#4") soundfile = 'sound/piano/F#4.ogg'
if("Gb4") soundfile = 'sound/piano/Gb4.ogg'
if("Gn4") soundfile = 'sound/piano/Gn4.ogg'
if("G#4") soundfile = 'sound/piano/G#4.ogg'
if("Ab4") soundfile = 'sound/piano/Ab4.ogg'
if("An4") soundfile = 'sound/piano/An4.ogg'
if("A#4") soundfile = 'sound/piano/A#4.ogg'
if("Bb4") soundfile = 'sound/piano/Bb4.ogg'
if("Bn4") soundfile = 'sound/piano/Bn4.ogg'
if("B#4") soundfile = 'sound/piano/B#4.ogg'
if("Cb5") soundfile = 'sound/piano/Cb5.ogg'
if("Cn5") soundfile = 'sound/piano/Cn5.ogg'
if("C#5") soundfile = 'sound/piano/C#5.ogg'
if("Db5") soundfile = 'sound/piano/Db5.ogg'
if("Dn5") soundfile = 'sound/piano/Dn5.ogg'
if("D#5") soundfile = 'sound/piano/D#5.ogg'
if("Eb5") soundfile = 'sound/piano/Eb5.ogg'
if("En5") soundfile = 'sound/piano/En5.ogg'
if("E#5") soundfile = 'sound/piano/E#5.ogg'
if("Fb5") soundfile = 'sound/piano/Fb5.ogg'
if("Fn5") soundfile = 'sound/piano/Fn5.ogg'
if("F#5") soundfile = 'sound/piano/F#5.ogg'
if("Gb5") soundfile = 'sound/piano/Gb5.ogg'
if("Gn5") soundfile = 'sound/piano/Gn5.ogg'
if("G#5") soundfile = 'sound/piano/G#5.ogg'
if("Ab5") soundfile = 'sound/piano/Ab5.ogg'
if("An5") soundfile = 'sound/piano/An5.ogg'
if("A#5") soundfile = 'sound/piano/A#5.ogg'
if("Bb5") soundfile = 'sound/piano/Bb5.ogg'
if("Bn5") soundfile = 'sound/piano/Bn5.ogg'
if("B#5") soundfile = 'sound/piano/B#5.ogg'
if("Cb6") soundfile = 'sound/piano/Cb6.ogg'
if("Cn6") soundfile = 'sound/piano/Cn6.ogg'
if("C#6") soundfile = 'sound/piano/C#6.ogg'
if("Db6") soundfile = 'sound/piano/Db6.ogg'
if("Dn6") soundfile = 'sound/piano/Dn6.ogg'
if("D#6") soundfile = 'sound/piano/D#6.ogg'
if("Eb6") soundfile = 'sound/piano/Eb6.ogg'
if("En6") soundfile = 'sound/piano/En6.ogg'
if("E#6") soundfile = 'sound/piano/E#6.ogg'
if("Fb6") soundfile = 'sound/piano/Fb6.ogg'
if("Fn6") soundfile = 'sound/piano/Fn6.ogg'
if("F#6") soundfile = 'sound/piano/F#6.ogg'
if("Gb6") soundfile = 'sound/piano/Gb6.ogg'
if("Gn6") soundfile = 'sound/piano/Gn6.ogg'
if("G#6") soundfile = 'sound/piano/G#6.ogg'
if("Ab6") soundfile = 'sound/piano/Ab6.ogg'
if("An6") soundfile = 'sound/piano/An6.ogg'
if("A#6") soundfile = 'sound/piano/A#6.ogg'
if("Bb6") soundfile = 'sound/piano/Bb6.ogg'
if("Bn6") soundfile = 'sound/piano/Bn6.ogg'
if("B#6") soundfile = 'sound/piano/B#6.ogg'
if("Cb7") soundfile = 'sound/piano/Cb7.ogg'
if("Cn7") soundfile = 'sound/piano/Cn7.ogg'
if("C#7") soundfile = 'sound/piano/C#7.ogg'
if("Db7") soundfile = 'sound/piano/Db7.ogg'
if("Dn7") soundfile = 'sound/piano/Dn7.ogg'
if("D#7") soundfile = 'sound/piano/D#7.ogg'
if("Eb7") soundfile = 'sound/piano/Eb7.ogg'
if("En7") soundfile = 'sound/piano/En7.ogg'
if("E#7") soundfile = 'sound/piano/E#7.ogg'
if("Fb7") soundfile = 'sound/piano/Fb7.ogg'
if("Fn7") soundfile = 'sound/piano/Fn7.ogg'
if("F#7") soundfile = 'sound/piano/F#7.ogg'
if("Gb7") soundfile = 'sound/piano/Gb7.ogg'
if("Gn7") soundfile = 'sound/piano/Gn7.ogg'
if("G#7") soundfile = 'sound/piano/G#7.ogg'
if("Ab7") soundfile = 'sound/piano/Ab7.ogg'
if("An7") soundfile = 'sound/piano/An7.ogg'
if("A#7") soundfile = 'sound/piano/A#7.ogg'
if("Bb7") soundfile = 'sound/piano/Bb7.ogg'
if("Bn7") soundfile = 'sound/piano/Bn7.ogg'
if("B#7") soundfile = 'sound/piano/B#7.ogg'
if("Cb8") soundfile = 'sound/piano/Cb8.ogg'
if("Cn8") soundfile = 'sound/piano/Cn8.ogg'
if("C#8") soundfile = 'sound/piano/C#8.ogg'
if("Db8") soundfile = 'sound/piano/Db8.ogg'
if("Dn8") soundfile = 'sound/piano/Dn8.ogg'
if("D#8") soundfile = 'sound/piano/D#8.ogg'
if("Eb8") soundfile = 'sound/piano/Eb8.ogg'
if("En8") soundfile = 'sound/piano/En8.ogg'
if("E#8") soundfile = 'sound/piano/E#8.ogg'
if("Fb8") soundfile = 'sound/piano/Fb8.ogg'
if("Fn8") soundfile = 'sound/piano/Fn8.ogg'
if("F#8") soundfile = 'sound/piano/F#8.ogg'
if("Gb8") soundfile = 'sound/piano/Gb8.ogg'
if("Gn8") soundfile = 'sound/piano/Gn8.ogg'
if("G#8") soundfile = 'sound/piano/G#8.ogg'
if("Ab8") soundfile = 'sound/piano/Ab8.ogg'
if("An8") soundfile = 'sound/piano/An8.ogg'
if("A#8") soundfile = 'sound/piano/A#8.ogg'
if("Bb8") soundfile = 'sound/piano/Bb8.ogg'
if("Bn8") soundfile = 'sound/piano/Bn8.ogg'
if("B#8") soundfile = 'sound/piano/B#8.ogg'
if("Cb9") soundfile = 'sound/piano/Cb9.ogg'
if("Cn9") soundfile = 'sound/piano/Cn9.ogg'
else return
hearers(15, src) << sound(soundfile)
/obj/structure/device/piano/proc/playsong()
do
/datum/song/proc/playsong(mob/user as mob)
while(repeat >= 0)
var/cur_oct[7]
var/cur_acc[7]
for(var/i = 1 to 7)
cur_oct[i] = "3"
cur_oct[i] = 3
cur_acc[i] = "n"
for(var/line in song.lines)
for(var/line in lines)
//world << line
for(var/beat in text2list(lowertext(line), ","))
//world << "beat: [beat]"
var/list/notes = text2list(beat, "/")
for(var/note in text2list(notes[1], "-"))
//world << "note: [note]"
if(!playing || !anchored)//If the piano is playing, or is loose
if(!playing || shouldStopPlaying())//If the instrument is playing, or special case
playing = 0
return
if(lentext(note) == 0)
@@ -238,48 +101,52 @@
else if(ni == "s")
cur_acc[cur_note] = "#" // so shift is never required
else
cur_oct[cur_note] = ni
playnote(uppertext(copytext(note,1,2)) + cur_acc[cur_note] + cur_oct[cur_note])
cur_oct[cur_note] = text2num(ni)
playnote(cur_note, cur_acc[cur_note], cur_oct[cur_note])
if(notes.len >= 2 && text2num(notes[2]))
sleep(song.tempo / text2num(notes[2]))
sleep(tempo / text2num(notes[2]))
else
sleep(song.tempo)
if(repeat > 0)
repeat-- //Infinite loops are baaaad.
while(repeat > 0)
sleep(tempo)
repeat--
if(repeat >= 0) // don't show the last -1 repeat
updateDialog(user)
playing = 0
updateUsrDialog()
repeat = 0
updateDialog(user)
/obj/structure/device/piano/attack_hand(var/mob/user as mob)
if(!anchored)
return
/datum/song/proc/interact(mob/user as mob)
var/dat = ""
usr.machine = src
var/dat = "<HEAD><TITLE>Piano</TITLE></HEAD><BODY>"
if(song)
if(song.lines.len > 0 && !(playing))
dat += "<A href='?src=\ref[src];play=1'>Play Song</A><BR><BR>"
dat += "<A href='?src=\ref[src];repeat=1'>Repeat Song: [repeat] times.</A><BR><BR>"
if(playing)
dat += "<A href='?src=\ref[src];stop=1'>Stop Playing</A><BR>"
dat += "Repeats left: [repeat].<BR><BR>"
if(lines.len > 0)
dat += "<H3>Playback</H3>"
if(!playing)
dat += "<A href='?src=\ref[src];play=1'>Play</A> <SPAN CLASS='linkOn'>Stop</SPAN><BR><BR>"
dat += "Repeat Song: "
dat += repeat > 0 ? "<A href='?src=\ref[src];repeat=-10'>-</A><A href='?src=\ref[src];repeat=-1'>-</A>" : "<SPAN CLASS='linkOff'>-</SPAN><SPAN CLASS='linkOff'>-</SPAN>"
dat += " [repeat] times "
dat += repeat < max_repeats ? "<A href='?src=\ref[src];repeat=1'>+</A><A href='?src=\ref[src];repeat=10'>+</A>" : "<SPAN CLASS='linkOff'>+</SPAN><SPAN CLASS='linkOff'>+</SPAN>"
dat += "<BR>"
else
dat += "<SPAN CLASS='linkOn'>Play</SPAN> <A href='?src=\ref[src];stop=1'>Stop</A><BR>"
dat += "Repeats left: <B>[repeat]</B><BR>"
if(!edit)
dat += "<A href='?src=\ref[src];edit=2'>Show Editor</A><BR><BR>"
dat += "<BR><B><A href='?src=\ref[src];edit=2'>Show Editor</A></B><BR>"
else
dat += "<A href='?src=\ref[src];edit=1'>Hide Editor</A><BR>"
dat += "<A href='?src=\ref[src];newsong=1'>Start a New Song</A><BR>"
dat += "<A href='?src=\ref[src];import=1'>Import a Song</A><BR><BR>"
if(song)
var/calctempo = (10/song.tempo)*60
dat += "Tempo : <A href='?src=\ref[src];tempo=10'>-</A><A href='?src=\ref[src];tempo=1'>-</A> [calctempo] BPM <A href='?src=\ref[src];tempo=-1'>+</A><A href='?src=\ref[src];tempo=-10'>+</A><BR><BR>"
var/linecount = 0
for(var/line in song.lines)
linecount += 1
dat += "Line [linecount]: [line] <A href='?src=\ref[src];deleteline=[linecount]'>Delete Line</A> <A href='?src=\ref[src];modifyline=[linecount]'>Modify Line</A><BR>"
dat += "<A href='?src=\ref[src];newline=1'>Add Line</A><BR><BR>"
dat += "<H3>Editing</H3>"
dat += "<B><A href='?src=\ref[src];edit=1'>Hide Editor</A></B>"
dat += " <A href='?src=\ref[src];newsong=1'>Start a New Song</A>"
dat += " <A href='?src=\ref[src];import=1'>Import a Song</A><BR><BR>"
var/calctempo = round(600 / tempo)
var/calcstep = tempo - 600 / (calctempo+1)
var/calcstep_b = tempo - 600 / (calctempo+10)
dat += "Tempo: <A href='?src=\ref[src];tempo=[calcstep_b]'>-</A><A href='?src=\ref[src];tempo=[calcstep]'>-</A> [calctempo] BPM <A href='?src=\ref[src];tempo=-[calcstep]'>+</A><A href='?src=\ref[src];tempo=-[calcstep_b]'>+</A><BR><BR>"
var/linecount = 0
for(var/line in lines)
linecount += 1
dat += "Line [linecount]: <A href='?src=\ref[src];modifyline=[linecount]'>Edit</A> <A href='?src=\ref[src];deleteline=[linecount]'>X</A> [line]<BR>"
dat += "<A href='?src=\ref[src];newline=1'>Add Line</A><BR><BR>"
if(help)
dat += "<A href='?src=\ref[src];help=1'>Hide Help</A><BR>"
dat += "<B><A href='?src=\ref[src];help=1'>Hide Help</A></B><BR>"
dat += {"
Lines are a series of chords, separated by commas (,), each with notes seperated by hyphens (-).<br>
Every note in a chord will play together, with chord timed by the tempo.<br>
@@ -292,140 +159,198 @@
A pause may be denoted by an empty chord: <i>C,E,,C,G</i><br>
To make a chord be a different time, end it with /x, where the chord length will be length<br>
defined by tempo / x: <i>C,G/2,E/4</i><br>
Combined, an example is: <i>E-E4/4,/2,G#/8,B/8,E3-E4/4</i>
Combined, an example is: <i>E-E4/4,F#/2,G#/8,B/8,E3-E4/4</i>
<br>
Lines may be up to 50 characters.<br>
A song may only contain up to 50 lines.<br>
"}
else
dat += "<A href='?src=\ref[src];help=2'>Show Help</A><BR>"
dat += "</BODY></HTML>"
user << browse(dat, "window=piano;size=700x300")
onclose(user, "piano")
dat += "<B><A href='?src=\ref[src];help=2'>Show Help</A></B><BR>"
/obj/structure/device/piano/Topic(href, href_list)
var/datum/browser/popup = new(user, "instrument", instrumentObj.name, 700, 500)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(instrumentObj.icon, instrumentObj.icon_state))
popup.open()
if(!in_range(src, usr) || issilicon(usr) || !anchored || !usr.canmove || usr.restrained())
usr << browse(null, "window=piano;size=700x300")
onclose(usr, "piano")
/datum/song/Topic(href, href_list)
if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || !usr.canmove || usr.restrained())
usr << browse(null, "window=instrument")
usr.unset_machine()
return
instrumentObj.add_fingerprint(usr)
if(href_list["newsong"])
song = new()
else if(song)
if(href_list["repeat"]) //Changing this from a toggle to a number of repeats to avoid infinite loops.
if(playing) return //So that people cant keep adding to repeat. If the do it intentionally, it could result in the server crashing.
var/tempnum = input("How many times do you want to repeat this piece? (max:10)") as num|null
if(tempnum > 10)
tempnum = 10
if(tempnum < 0)
tempnum = 0
repeat = round(tempnum)
lines = new()
tempo = 5 // default 120 BPM
name = ""
else if(href_list["tempo"])
song.tempo += round(text2num(href_list["tempo"]))
if(song.tempo < 1)
song.tempo = 1
else if(href_list["play"])
if(song)
playing = 1
spawn() playsong()
else if(href_list["newline"])
var/newline = html_encode(input("Enter your line: ", "Piano") as text|null)
if(!newline)
else if(href_list["import"])
var/t = ""
do
t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", name), t) as message)
if(!in_range(instrumentObj, usr))
return
if(song.lines.len > 50)
return
if(lentext(newline) > 50)
newline = copytext(newline, 1, 50)
song.lines.Add(newline)
else if(href_list["deleteline"])
var/num = round(text2num(href_list["deleteline"]))
if(num > song.lines.len || num < 1)
return
song.lines.Cut(num, num+1)
if(lentext(t) >= 3072)
var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no")
if(cont == "no")
break
while(lentext(t) > 3072)
else if(href_list["modifyline"])
var/num = round(text2num(href_list["modifyline"]),1)
var/content = html_encode(input("Enter your line: ", "Piano", song.lines[num]) as text|null)
if(!content)
return
if(lentext(content) > 50)
content = copytext(content, 1, 50)
if(num > song.lines.len || num < 1)
return
song.lines[num] = content
//split into lines
spawn()
lines = text2list(t, "\n")
if(copytext(lines[1],1,6) == "BPM: ")
tempo = 600 / max(1, text2num(copytext(lines[1],6)))
lines.Cut(1,2)
else
tempo = 5 // default 120 BPM
if(lines.len > 50)
usr << "Too many lines!"
lines.Cut(51)
var/linenum = 1
for(var/l in lines)
if(lentext(l) > 50)
usr << "Line [linenum] too long!"
lines.Remove(l)
else
linenum++
updateDialog(usr) // make sure updates when complete
else if(href_list["stop"])
playing = 0
else if(href_list["help"])
help = text2num(href_list["help"]) - 1
else if(href_list["help"])
help = text2num(href_list["help"]) - 1
else if(href_list["edit"])
edit = text2num(href_list["edit"]) - 1
else if(href_list["edit"])
edit = text2num(href_list["edit"]) - 1
if(href_list["repeat"]) //Changing this from a toggle to a number of repeats to avoid infinite loops.
if(playing)
return //So that people cant keep adding to repeat. If the do it intentionally, it could result in the server crashing.
repeat += round(text2num(href_list["repeat"]))
if(repeat < 0)
repeat = 0
if(repeat > max_repeats)
repeat = max_repeats
else if(href_list["import"])
var/t = ""
do
t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", src.name), t) as message)
if (!in_range(src, usr))
return
else if(href_list["tempo"])
tempo += text2num(href_list["tempo"])
if(tempo < 1)
tempo = 1
if(tempo > 600)
tempo = 600
if(lentext(t) >= 3072)
var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no")
if(cont == "no")
break
while(lentext(t) > 3072)
else if(href_list["play"])
playing = 1
spawn()
playsong(usr)
//split into lines
spawn()
var/list/lines = text2list(t, "\n")
var/tempo = 5
if(copytext(lines[1],1,6) == "BPM: ")
tempo = 600 / text2num(copytext(lines[1],6))
lines.Cut(1,2)
if(lines.len > 50)
usr << "Too many lines!"
lines.Cut(51)
var/linenum = 1
for(var/l in lines)
if(lentext(l) > 50)
usr << "Line [linenum] too long!"
lines.Remove(l)
else
linenum++
song = new()
song.lines = lines
song.tempo = tempo
updateUsrDialog()
else if(href_list["newline"])
var/newline = html_encode(input("Enter your line: ", instrumentObj.name) as text|null)
if(!newline || !in_range(instrumentObj, usr))
return
if(lines.len > 50)
return
if(lentext(newline) > 50)
newline = copytext(newline, 1, 50)
lines.Add(newline)
add_fingerprint(usr)
updateUsrDialog()
else if(href_list["deleteline"])
var/num = round(text2num(href_list["deleteline"]))
if(num > lines.len || num < 1)
return
lines.Cut(num, num+1)
else if(href_list["modifyline"])
var/num = round(text2num(href_list["modifyline"]),1)
var/content = html_encode(input("Enter your line: ", instrumentObj.name, lines[num]) as text|null)
if(!content || !in_range(instrumentObj, usr))
return
if(lentext(content) > 50)
content = copytext(content, 1, 50)
if(num > lines.len || num < 1)
return
lines[num] = content
else if(href_list["stop"])
playing = 0
updateDialog(usr)
return
/obj/structure/device/piano/attackby(obj/item/O as obj, mob/user as mob)
// subclass for handheld instruments, like violin
/datum/song/handheld
/datum/song/handheld/updateDialog(mob/user as mob)
instrumentObj.interact(user)
/datum/song/handheld/shouldStopPlaying()
if(instrumentObj)
return !isliving(instrumentObj.loc)
else
return 1
//////////////////////////////////////////////////////////////////////////
/obj/structure/piano
name = "space minimoog"
icon = 'icons/obj/musician.dmi'
icon_state = "minimoog"
anchored = 1
density = 1
var/datum/song/song
/obj/structure/piano/New()
song = new("piano", src)
if(prob(50))
name = "space minimoog"
desc = "This is a minimoog, like a space piano, but more spacey!"
icon_state = "minimoog"
else
name = "space piano"
desc = "This is a space piano, like a regular piano, but always in tune! Even if the musician isn't."
icon_state = "piano"
/obj/structure/piano/Destroy()
del(song)
song = null
..()
/obj/structure/piano/attack_hand(mob/user as mob)
interact(user)
/obj/structure/piano/interact(mob/user as mob)
if(!user || !anchored)
return
user.set_machine(src)
song.interact(user)
/obj/structure/piano/attackby(obj/item/O as obj, mob/user as mob)
if (istype(O, /obj/item/weapon/wrench))
if (anchored)
if (!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to loosen \the [src]'s casters..."
if (do_after(user, 40))
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
"\blue You have loosened \the [src]. Now it can be pulled somewhere else.", \
"You hear ratchet.")
src.anchored = 0
else
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "\blue You begin to tighten \the [src] to the floor..."
user << "<span class='notice'> You begin to tighten \the [src] to the floor...</span>"
if (do_after(user, 20))
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
"\blue You have tightened \the [src]'s casters. Now it can be played again.", \
"<span class='notice'> You have tightened \the [src]'s casters. Now it can be played again.</span>", \
"You hear ratchet.")
src.anchored = 1
anchored = 1
else if(anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "<span class='notice'> You begin to loosen \the [src]'s casters...</span>"
if (do_after(user, 40))
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
"<span class='notice'> You have loosened \the [src]. Now it can be pulled somewhere else.</span>", \
"You hear ratchet.")
anchored = 0
else
..()
+1 -1
View File
@@ -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 -2
View File
@@ -49,8 +49,7 @@
icon_state = "night"
item_state = "glasses"
origin_tech = "magnets=2"
vision_flags = SEE_TURFS
darkness_view = 3
darkness_view = 8
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
+12 -1
View File
@@ -20,7 +20,12 @@
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 = "advmedhud"
/obj/item/clothing/glasses/hud/health/night
name = "Night Vision Health Scanner HUD"
desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
icon_state = "healthhudnight"
item_state = "glasses"
darkness_view = 8
/obj/item/clothing/glasses/hud/health/process_hud(var/mob/M)
if(!M) return
@@ -57,6 +62,12 @@
vision_flags = SEE_MOBS
invisa_view = 2
/obj/item/clothing/glasses/hud/security/night
name = "Night Vision Security HUD"
desc = "An advanced heads-up display which provides id data and vision in complete darkness."
icon_state = "securityhudnight"
darkness_view = 8
/obj/item/clothing/glasses/hud/security/process_hud(var/mob/M)
if(!M) return
+3 -3
View File
@@ -76,9 +76,9 @@
loose = 80 // allowing for awkward come-ons when he/she drops his/her hat and you get it for him/her.
/obj/item/clothing/head/syndicatefake
name = "red space-helmet replica"
icon_state = "syndicate"
item_state = "syndicate"
name = "black and red space-helmet replica"
icon_state = "syndicate-helm-black-red"
item_state = "syndicate-helm-black-red"
desc = "A plastic replica of a syndicate agent's space helmet, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
flags = FPRINT | TABLEPASS | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+3 -3
View File
@@ -112,9 +112,9 @@
/obj/item/clothing/suit/syndicatefake
name = "red space suit replica"
icon_state = "syndicate"
item_state = "space_suit_syndicate"
name = "black and red space suit replica"
icon_state = "syndicate-black-red"
item_state = "syndicate-black-red"
desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
w_class = 3
flags = FPRINT | TABLEPASS
@@ -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
+5 -2
View File
@@ -1181,7 +1181,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe
client.images.Remove(hud)
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask/*, global_hud.nvg*/)
client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask,/* global_hud.nvg*/)
update_action_buttons()
@@ -1319,7 +1319,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
sight |= G.vision_flags
if(!druggy)
see_invisible = SEE_INVISIBLE_MINIMUM
if(istype(G,/obj/item/clothing/glasses/night))
see_invisible = SEE_INVISIBLE_MINIMUM
/* HUD shit goes here, as long as it doesn't modify sight flags */
// The purpose of this is to stop xray and w/e from preventing you from using huds -- Love, Doohl
@@ -1335,6 +1336,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
O.process_hud(src)
if(!druggy)
see_invisible = SEE_INVISIBLE_LIVING
if(istype(O,/obj/item/clothing/glasses/hud/security/night) || istype(O,/obj/item/clothing/glasses/hud/health/night))
see_invisible = SEE_INVISIBLE_MINIMUM
else if(!seer)
see_in_dark = species.darksight
see_invisible = SEE_INVISIBLE_LIVING
@@ -37,7 +37,8 @@
if (is_component_functioning("power cell") && cell)
if(src.cell.charge <= 0)
uneq_all()
src.stat = 1
src.stat = 1
Paralyse(3)
else
if(src.module_state_1)
src.cell.use(3)
@@ -56,7 +57,8 @@
src.stat = 0
else
uneq_all()
src.stat = 1
src.stat = 1
Paralyse(3)
/mob/living/silicon/robot/proc/handle_regular_status_updates()
@@ -129,12 +131,12 @@
if (src.stat != 0)
uneq_all()
if(!is_component_functioning("radio"))
if(!is_component_functioning("radio") || src.stat == 1)
radio.on = 0
else
radio.on = 1
if(is_component_functioning("camera"))
if(is_component_functioning("camera") && src.stat == 0)
src.blinded = 0
else
src.blinded = 1
@@ -23,4 +23,9 @@
return tally+config.robot_delay
/mob/living/silicon/robot/Move()
..()
if (!is_component_functioning("actuator") || !is_component_functioning("power cell") || !cell)
return
else
if (src.cell.charge > 0)
..()
+2 -1
View File
@@ -897,6 +897,7 @@ var/list/slot_equipment_priority = list( \
if("holdervar")
statpanel(S.panel,"[S.holder_var_type] [S.holder_var_amount]",S)
/* // Why have a duplicate set of turfs in the stat panel?
if(listed_turf)
if(get_dist(listed_turf,src) > 1)
listed_turf = null
@@ -906,7 +907,7 @@ var/list/slot_equipment_priority = list( \
if(A.invisibility > see_invisible)
continue
statpanel(listed_turf.name,A.name,A)
*/
// facing verbs
+26 -1
View File
@@ -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
+12 -6
View File
@@ -66,9 +66,9 @@
name = "buckshot shell"
desc = "A 12 gauge buckshot shell."
icon_state = "gshell"
projectile_type = /obj/item/projectile/bullet/buck
buck = 4
deviation = 1
projectile_type = "/obj/item/projectile/bullet/buck"
buck = 5
deviation = 0.8
/obj/item/ammo_casing/shotgun/birdshot
name = "birdshot shell"
@@ -98,17 +98,23 @@
name = "stun shell"
desc = "A stunning shell."
icon_state = "stunshell"
projectile_type = "/obj/item/projectile/bullet/stunshot"
projectile_type = "/obj/item/projectile/bullet/stunslug"
m_amt = 2500
/obj/item/ammo_casing/shotgun/incendiary
name = "incendiary shell"
desc = "An incendiary shell"
icon_state = "ishell"
projectile_type = /obj/item/projectile/bullet/incendiary/shell
projectile_type = "/obj/item/projectile/bullet/incendiary/shell"
m_amt = 12500
/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
name = "dragonsbreath shell"
desc = "A shotgun shell which fires a spread of incendiary pellets."
icon_state = "ishell2"
projectile_type = "/obj/item/projectile/bullet/incendiary/shell/dragonsbreath"
buck = 4
deviation = 0.9
/obj/item/ammo_casing/shotgun/dart
name = "shotgun dart"
@@ -144,4 +144,30 @@
/obj/item/ammo_box/magazine/m762/update_icon()
..()
icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]"
icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]"
//TG Bulldog Automatic Shotty
/obj/item/ammo_box/magazine/m12g
name = "shotgun magazine (12g taser slugs)"
icon_state = "m12gs"
origin_tech = "combat=3;syndicate=1"
ammo_type = "/obj/item/ammo_casing/shotgun/stunshell"
caliber = "shotgun"
max_ammo = 8
/obj/item/ammo_box/magazine/m12g/update_icon()
..()
icon_state = "[initial(icon_state)]-[Ceiling(ammo_count(0)/8)*8]"
/obj/item/ammo_box/magazine/m12g/buckshot
name = "shotgun magazine (12g buckshot)"
icon_state = "m12gb"
ammo_type = "/obj/item/ammo_casing/shotgun/buck"
/obj/item/ammo_box/magazine/m12g/dragon
name = "shotgun magazine (12g dragon's breath)"
icon_state = "m12gf"
ammo_type = "/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath"
+1 -1
View File
@@ -9,7 +9,7 @@
origin_tech = "combat=2;materials=2"
w_class = 3.0
m_amt = 1000
recoil = 1
// recoil = 1
var/mag_type = "/obj/item/ammo_box/magazine/m10mm" //Removes the need for max_ammo and caliber info
var/obj/item/ammo_box/magazine/magazine
// var/obj/item/ammo_casing/chambered = null // The round (not bullet) that is in the chamber.
@@ -114,6 +114,42 @@
..()
/obj/item/weapon/gun/projectile/automatic/bulldog
name = "\improper Bulldog shotgun"
desc = "A compact, mag-fed semi-automatic shotgun for combat in narrow corridors. Compatible only with specialized magazines."
icon_state = "bulldog"
item_state = "bulldog"
w_class = 3.0
origin_tech = "combat=5;materials=4;syndicate=6"
mag_type = "/obj/item/ammo_box/magazine/m12g"
fire_sound = 'sound/weapons/Gunshot.ogg'
/obj/item/weapon/gun/projectile/automatic/bulldog/New()
..()
update_icon()
return
/obj/item/weapon/gun/projectile/automatic/bulldog/proc/update_magazine()
if(magazine)
src.overlays = 0
overlays += "[magazine.icon_state]"
return
/obj/item/weapon/gun/projectile/automatic/bulldog/update_icon()
src.overlays = 0
update_magazine()
icon_state = "bulldog[chambered ? "" : "-e"]"
return
/obj/item/weapon/gun/projectile/automatic/bulldog/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)
..()
if(!chambered && !get_ammo() && !alarmed)
playsound(user, 'sound/weapons/smg_empty_alarm.ogg', 40, 1)
update_icon()
alarmed = 1
return
/* The thing I found with guns in ss13 is that they don't seem to simulate the rounds in the magazine in the gun.
Afaik, since projectile.dm features a revolver, this would make sense since the magazine is part of the gun.
However, it looks like subsequent guns that use removable magazines don't take that into account and just get
+28 -8
View File
@@ -8,13 +8,17 @@
embed = 1
sharp = 1
on_hit(var/atom/target, var/blocked = 0)
/* on_hit(var/atom/target, var/blocked = 0)
if (..(target, blocked))
var/mob/living/L = target
shake_camera(L, 3, 2)
return 1
return 0
return 0 */
/obj/item/projectile/bullet/weakbullet
damage = 5
stun = 5
weaken = 5
/obj/item/projectile/bullet/slug
name = "slug"
@@ -49,7 +53,7 @@
/obj/item/projectile/bullet/midbullet12
damage = 25
damage = 20
stun = 5
weaken = 5
@@ -90,13 +94,21 @@
embed = 0
edge = 1
/obj/item/projectile/bullet/stunshot
name = "stunshot"
damage = 5
stun = 10
weaken = 10
stutter = 10
stun = 5
weaken = 5
stutter = 5
embed = 0
sharp = 0
/obj/item/projectile/bullet/stunslug
name = "stunslug"
damage = 5
stun = 5
weaken = 5
stutter = 5
embed = 0
sharp = 0
@@ -107,15 +119,23 @@
/obj/item/projectile/bullet/incendiary
/obj/item/projectile/bullet/incendiary/on_hit(var/atom/target, var/blocked = 0)
..()
if(istype(target, /mob/living/carbon))
var/mob/living/carbon/M = target
M.adjust_fire_stacks(1)
M.IgniteMob()
/obj/item/projectile/bullet/incendiary/shell
name = "incendiary slug"
damage = 20
/obj/item/projectile/bullet/incendiary/mech
/obj/item/projectile/bullet/incendiary/shell/Move()
..()
var/turf/location = get_turf(src)
location.hotspot_expose(700, 50, 1)
/obj/item/projectile/bullet/incendiary/shell/dragonsbreath
name = "dragonsbreath round"
damage = 5
/obj/item/projectile/bullet/mime
+1 -1
View File
@@ -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)
+24 -10
View File
@@ -408,8 +408,8 @@ datum
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(4)
M.adjustOxyLoss(4)
M.adjustToxLoss(3)
M.adjustOxyLoss(3)
M.sleeping += 1
..()
return
@@ -510,14 +510,14 @@ datum
description = "An effective hypnotic used to treat insomnia."
reagent_state = LIQUID
color = "#E895CC" // rgb: 232, 149, 204
oxyod = 100
toxod = 100
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(!data) data = 1
switch(data)
if(1 to 15)
if(1 to 12)
if(prob(5)) M.emote("yawn")
if(12 to 15)
M.eye_blurry = max(M.eye_blurry, 10)
if(15 to 25)
M.drowsyness = max(M.drowsyness, 20)
@@ -2077,8 +2077,8 @@ datum
M.status_flags &= ~FAKEDEATH
M.adjustOxyLoss(0.5*REM)
M.adjustToxLoss(0.5*REM)
M.Weaken(10)
M.silent = max(M.silent, 10)
M.Weaken(5)
M.silent = max(M.silent, 5)
M.tod = worldtime2text()
..()
return
@@ -2107,7 +2107,6 @@ datum
description = "A powerful hallucinogen. Not a thing to be messed with."
reagent_state = LIQUID
color = "#B31008" // rgb: 139, 166, 233
custom_metabolism = 0.05
addictiveness = 15
on_mob_life(var/mob/living/M)
@@ -2276,6 +2275,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"
@@ -2288,10 +2302,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
@@ -54,6 +54,20 @@
return
/obj/item/weapon/reagent_containers/hypospray/combat
name = "combat stimulant injector"
desc = "A modified air-needle autoinjector, used by support operatives to quickly heal injuries in combat."
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(10)
icon_state = "combat_hypo"
volume = 60
/obj/item/weapon/reagent_containers/hypospray/combat/New()
..()
reagents.remove_reagent("tricordrazine", 30)
reagents.add_reagent("synaptizine", 30)
/obj/item/weapon/reagent_containers/hypospray/autoinjector
name = "emergency autoinjector"
desc = "A potent mix of pain killers and muscle stimulants."
@@ -155,6 +155,14 @@
..()
reagents.add_reagent("kelotane", 30)
/obj/item/weapon/reagent_containers/pill/dermaline
name = "Dermaline pill"
desc = "Used to treat severe burns."
icon_state = "pill12"
New()
..()
reagents.add_reagent("dermaline", 30)
/obj/item/weapon/reagent_containers/pill/tramadol
name = "Tramadol pill"
desc = "A simple painkiller."
@@ -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"
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 546 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 307 KiB

After

Width:  |  Height:  |  Size: 307 KiB

+1 -1
View File
@@ -154,7 +154,7 @@
"cX" = (/obj/effect/landmark/corpse/mime,/turf/simulated/floor,/area/planet/clown)
"cY" = (/obj/structure/rack,/obj/item/clothing/head/bowlerhat,/turf/simulated/floor,/area/planet/clown)
"cZ" = (/obj/effect/landmark/corpse/clown,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
"da" = (/obj/structure/table,/obj/item/weapon/crossbow/french,/turf/simulated/floor,/area/planet/clown)
"da" = (/obj/structure/table,/obj/item/weapon/gun/launcher/crossbow/french,/turf/simulated/floor,/area/planet/clown)
"db" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/planet/clown)
"dc" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/baguette,/obj/item/weapon/reagent_containers/food/snacks/baguette,/obj/item/weapon/reagent_containers/food/snacks/baguette,/turf/simulated/floor,/area/planet/clown)
"dd" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/simulated/floor,/area/planet/clown)
+2 -2
View File
@@ -190,7 +190,7 @@
"dH" = (/turf/simulated/floor/wood{tag = "icon-wood-broken3"; icon_state = "wood-broken3"},/area/planet/clown)
"dI" = (/obj/effect/landmark/corpse/mime,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/wood,/area/planet/clown)
"dJ" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor,/area/planet/clown)
"dK" = (/obj/structure/device/piano,/turf/simulated/floor{icon_state = "dark"},/area/planet/clown)
"dK" = (/obj/structure/piano,/turf/simulated/floor{icon_state = "dark"},/area/planet/clown)
"dL" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/obj/effect/decal/cleanable/blood,/turf/simulated/floor{icon_state = "dark"},/area/planet/clown)
"dM" = (/obj/effect/decal/cleanable/blood,/obj/item/weapon/bananapeel,/obj/effect/landmark/corpse/mime,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor/plating/snow,/area/planet/clown)
"dN" = (/obj/effect/decal/snow/clean/edge{tag = "icon-snow_corner (EAST)"; icon_state = "snow_corner"; dir = 4},/obj/effect/landmark/corpse/mime,/turf/unsimulated/floor/plating/snow/concrete,/area/planet/clown)
@@ -245,7 +245,7 @@
"eK" = (/obj/item/device/violin,/turf/simulated/floor{icon_state = "dark"},/area/planet/clown)
"eL" = (/obj/effect/decal/snow/clean/edge,/turf/simulated/floor{icon_state = "solarpanel"},/area/planet/clown)
"eM" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/wood,/area/planet/clown)
"eN" = (/obj/structure/device/piano{icon_state = "piano"; name = "space piano"},/turf/simulated/floor{icon_state = "dark"},/area/planet/clown)
"eN" = (/obj/structure/piano{icon_state = "piano"; name = "space piano"},/turf/simulated/floor{icon_state = "dark"},/area/planet/clown)
"eO" = (/obj/structure/stool/bed/chair/wood/normal{tag = "icon-wooden_chair (WEST)"; icon_state = "wooden_chair"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/planet/clown)
"eP" = (/obj/item/flag/mime,/turf/simulated/floor{icon_state = "dark"},/area/planet/clown)
"eQ" = (/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/planet/clown)
+13842 -12989
View File
File diff suppressed because it is too large Load Diff
+7457 -7458
View File
File diff suppressed because it is too large Load Diff
+17 -19
View File
@@ -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>
@@ -173,13 +162,26 @@
{{/for}}
</td>
</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>
<tr>
<th style="color: '#808080';">Civilian</th>
<td>
{{for data.civilian_jobs}}
{{if index && index % 6 === 0}}
</td></tr><tr><th></th><td>
{{/if}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{/for}}
</td>
@@ -189,10 +191,6 @@
<th style="color: '#A52A2A';">CentCom</th>
<td>
{{for data.centcom_jobs}}
{{if index % 6 === 0}}
</td></tr><tr><th></th><td>
{{/if}}
{{:helper.link(value.display_name, '', {'choice' : 'assign', 'assign_target' : value.job}, data.target_rank == value.job ? 'disabled' : null)}}
{{/for}}
</td>
@@ -209,7 +207,7 @@
<div class='item' style='width: 100%'>
{{for data.all_centcom_access}}
<div class='itemContentWide'>
{{:helper.link(value.desc, '', {'choice' : 'access', 'access_target' : value.ref, 'allowed' : allowed}, null, value.allowed ? 'selected' : null)}}
{{:helper.link(value.desc, '', {'choice' : 'access', 'access_target' : value.ref, 'allowed' : value.allowed}, null, value.allowed ? 'selected' : null)}}
</div>
{{/for}}
</div>
+3 -3
View File
@@ -1,6 +1,6 @@
<!--
Title: Telescience Control UI
Used In File(s): \code\modules\telesci\telesci_computer.dm
Used In File(s): \code\game\machinery\computer\telescience.dm
-->
<div class="item">
<div class="itemLabel">Coordinates:</div>
@@ -13,8 +13,8 @@ Used In File(s): \code\modules\telesci\telesci_computer.dm
<div class="item">
<div class="itemLabel">Controls:</div>
<div class="itemContent">
{{:helper.link('Send', 'gear', {'send': 1}, null, (data.coordx != null && data.coordy != null && data.coordz != null) ? '' : 'disabled')}}
{{:helper.link('Receive', 'gear', {'receive': 1}, null, (data.coordx != null && data.coordy != null && data.coordz != null) ? '' : 'disabled')}}
{{:helper.link('Send', 'gear', {'send': 1}, null, (data.coordx != 'Unset' && data.coordy != 'Unset' && data.coordz != 'Unset') ? '' : 'disabled')}}
{{:helper.link('Receive', 'gear', {'receive': 1}, null, (data.coordx != 'Unset' && data.coordy != 'Unset' && data.coordz != 'Unset') ? '' : 'disabled')}}
{{:helper.link('Recalibrate', 'gear', {'recal': 1})}}
</div>
</div>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

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