From b0aff645a3d0ffb9c186eb9f588935ef37d69e36 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Mon, 23 Sep 2013 05:41:53 -0400 Subject: [PATCH] Massive traitor item overhaul --- baystation12.dme | 3 + code/WorkInProgress/explosion_particles.dm | 3 +- code/__HELPERS/unsorted.dm | 33 ++ code/datums/uplink_item.dm | 426 ++++++++++++++++++ code/defines/obj/weapon.dm | 119 ++++- code/game/atoms.dm | 83 +++- code/game/gamemodes/factions.dm | 117 ----- code/game/gamemodes/game_mode.dm | 40 +- code/game/gamemodes/traitor/traitor.dm | 64 ++- code/game/machinery/camera/camera.dm | 28 +- code/game/machinery/cloning.dm | 2 + code/game/machinery/washing_machine.dm | 3 +- code/game/objects/items/devices/PDA/PDA.dm | 3 +- code/game/objects/items/devices/handtv.dm | 47 ++ .../items/devices/radio/encryptionkey.dm | 5 + code/game/objects/items/devices/uplinks.dm | 356 ++++----------- .../items/weapons/grenades/clowngrenade.dm | 96 ++++ .../objects/items/weapons/implants/implant.dm | 54 +++ .../items/weapons/implants/implanter.dm | 11 +- code/game/objects/items/weapons/kitchen.dm | 7 + .../objects/items/weapons/storage/boxes.dm | 15 + .../items/weapons/storage/uplink_kits.dm | 40 +- code/game/objects/items/weapons/tools.dm | 24 + code/global.dm | 4 +- code/modules/clothing/clothing.dm | 1 + code/modules/clothing/gloves/color.dm | 6 + code/modules/detectivework/scanner.dm | 182 -------- code/modules/mob/living/carbon/carbon.dm | 6 +- code/modules/mob/living/carbon/human/human.dm | 57 ++- .../mob/living/carbon/human/human_damage.dm | 15 +- .../mob/living/carbon/human/human_defense.dm | 18 +- .../mob/living/carbon/human/human_defines.dm | 1 + .../mob/living/carbon/human/inventory.dm | 11 +- code/modules/mob/living/living.dm | 22 + code/modules/mob/living/living_defense.dm | 3 + code/modules/mob/living/living_defines.dm | 4 +- code/modules/mob/living/login.dm | 6 + code/modules/mob/mob.dm | 4 +- code/modules/power/power.dm | 4 +- .../modules/projectiles/ammunition/bullets.dm | 6 + .../projectiles/guns/projectile/revolver.dm | 15 +- .../projectiles/guns/projectile/shotgun.dm | 2 +- code/modules/projectiles/projectile.dm | 15 +- code/modules/projectiles/projectile/beams.dm | 160 +++++++ .../modules/projectiles/projectile/bullets.dm | 20 + code/modules/reagents/Chemistry-Reagents.dm | 22 + .../reagent_containers/food/condiment.dm | 14 +- icons/obj/kitchen.dmi | Bin 16244 -> 16455 bytes icons/obj/lightning.dmi | Bin 0 -> 871 bytes icons/obj/weapons.dmi | Bin 20389 -> 21017 bytes icons/obj/zap.dmi | Bin 0 -> 4406 bytes sound/effects/eleczap.ogg | Bin 0 -> 27542 bytes 52 files changed, 1530 insertions(+), 647 deletions(-) create mode 100644 code/datums/uplink_item.dm create mode 100644 code/game/objects/items/devices/handtv.dm create mode 100644 code/game/objects/items/weapons/grenades/clowngrenade.dm delete mode 100644 code/modules/detectivework/scanner.dm create mode 100644 icons/obj/lightning.dmi create mode 100644 icons/obj/zap.dmi create mode 100644 sound/effects/eleczap.ogg diff --git a/baystation12.dme b/baystation12.dme index 4339f65601b..fe5eb63ea31 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -130,6 +130,7 @@ #include "code\datums\spell.dm" #include "code\datums\sun.dm" #include "code\datums\supplypacks.dm" +#include "code\datums\uplink_item.dm" #include "code\datums\diseases\appendicitis.dm" #include "code\datums\diseases\beesease.dm" #include "code\datums\diseases\brainrot.dm" @@ -514,6 +515,7 @@ #include "code\game\objects\items\devices\debugger.dm" #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\handtv.dm" #include "code\game\objects\items\devices\laserpointer.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\multitool.dm" @@ -587,6 +589,7 @@ #include "code\game\objects\items\weapons\wires.dm" #include "code\game\objects\items\weapons\grenades\bananade.dm" #include "code\game\objects\items\weapons\grenades\chem_grenade.dm" +#include "code\game\objects\items\weapons\grenades\clowngrenade.dm" #include "code\game\objects\items\weapons\grenades\emgrenade.dm" #include "code\game\objects\items\weapons\grenades\flashbang.dm" #include "code\game\objects\items\weapons\grenades\ghettobomb.dm" diff --git a/code/WorkInProgress/explosion_particles.dm b/code/WorkInProgress/explosion_particles.dm index 9cf81b27aee..4d0f24799e1 100644 --- a/code/WorkInProgress/explosion_particles.dm +++ b/code/WorkInProgress/explosion_particles.dm @@ -32,7 +32,8 @@ spawn(0) var/obj/effect/expl_particles/expl = new /obj/effect/expl_particles(src.location) var/direct = pick(alldirs) - for(i=0, i= 0 ? arccos(x / sqrt(x * x + y * y)) : -arccos(x / sqrt(x * x + y * y)) + +proc/rotate_icon(file, state, step = 1, aa = FALSE) + var icon/base = icon(file, state) + + var w, h, w2, h2 + + if(aa) + aa ++ + w = base.Width() + w2 = w * aa + h = base.Height() + h2 = h * aa + + var icon{result = icon(base); temp} + + for(var/angle in 0 to 360 step step) + if(angle == 0 ) continue + if(angle == 360) continue + temp = icon(base) + if(aa) temp.Scale(w2, h2) + temp.Turn(angle) + if(aa) temp.Scale(w, h) + result.Insert(temp, "[angle]") + + return result \ No newline at end of file diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm new file mode 100644 index 00000000000..209faa93404 --- /dev/null +++ b/code/datums/uplink_item.dm @@ -0,0 +1,426 @@ +var/list/uplink_items = list() + +/proc/get_uplink_items(var/job = null) + // If not already initialized.. + if(!uplink_items.len) + + // Fill in the list and order it like this: + // A keyed list, acting as categories, which are lists to the datum. + + var/list/last = list() + for(var/item in typesof(/datum/uplink_item)) + + var/datum/uplink_item/I = new item() + if(!I.item) + continue + if(I.gamemodes.len && ticker && !(ticker.mode.name in I.gamemodes)) + continue + if(I.last) + last += I + continue + + if(!uplink_items[I.category]) + uplink_items[I.category] = list() + + uplink_items[I.category] += I + + for(var/datum/uplink_item/I in last) + if(!uplink_items[I.category]) + uplink_items[I.category] = list() + + uplink_items[I.category] += I + + return uplink_items + +// You can change the order of the list by putting datums before/after one another OR +// you can use the last variable to make sure it appears last, well have the category appear last. + +/datum/uplink_item + var/name = "item name" + var/category = "item category" + var/desc = "Item Description" + var/item = null + var/cost = 0 + 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/job = null + +/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U) + U.uses -= max(cost, 0) + feedback_add_details("traitor_uplink_items_bought", name) + return new item(loc) + +/datum/uplink_item/proc/buy(var/obj/item/device/uplink/hidden/U, var/mob/user) + + ..() + if(!istype(U)) + return 0 + + if (user.stat || user.restrained()) + return 0 + + if (!( istype(user, /mob/living/carbon/human))) + return 0 + + // If the uplink's holder is in the user's contents + if ((U.loc in user.contents || (in_range(U.loc, user) && istype(U.loc.loc, /turf)))) + user.set_machine(U) + if(cost > U.uses) + return 0 + + var/obj/I = spawn_item(get_turf(user), U) + + if(ishuman(user)) + var/mob/living/carbon/human/A = user + A.put_in_any_hand_if_possible(I) + U.purchase_log += "[user] ([user.ckey]) bought [name] for [cost]." + + U.interact(user) + return 1 + return 0 + +/* +// +// UPLINK ITEMS +// +*/ +//Work in Progress, job specific antag tools + +/datum/uplink_item/jobspecific + category = "Job Specific Tools" + +//Clown +/datum/uplink_item/jobspecific/clowngrenade + 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 + job = list("Clown") + +//Detective +/datum/uplink_item/jobspecific/evidenceforger + 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 + 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 + job = list("Detective") + +//Chef +/datum/uplink_item/jobspecific/specialsauce + 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 + 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 + job = list("Chef") + +//Janitor + +/datum/uplink_item/jobspecific/cautionsign + 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 + job = list("Janitor") + + +//Assistant + +/datum/uplink_item/jobspecific/pickpocketgloves + 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, belt, or pockets without them knowing, and pickpocketing puts the item directly into your hand." + item = /obj/item/clothing/gloves/black/thief + cost = 3 + job = list("Assistant") + +/datum/uplink_item/jobspecific/greytide + name = "Greytide Implant" + desc = "A box containing an implanter filled with a greytide implant when injected into another person makes them loyal to the greytide and your cause, unless of course they're already implanted by someone else. Loyalty ends if the implant is no longer in their system." + item = /obj/item/weapon/storage/box/syndie_kit/greytide + cost = 7 + job = list("Assistant") +//Bartender + +/datum/uplink_item/jobspecific/drunkbullets + 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 + job = list("Bartender") + +//Engineer + +/datum/uplink_item/jobspecific/powergloves + 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 + job = list("Station Engineer","Chief Engineer") + +// DANGEROUS WEAPONS + +/datum/uplink_item/dangerous + category = "Highly Visible and Dangerous Weapons" + +/datum/uplink_item/dangerous/revolver + 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 + cost = 6 + +/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_magazine/a357 + cost = 2 + +/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 = 5 + +/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 + +/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 = 3 + + +// STEALTHY WEAPONS + +/datum/uplink_item/stealthy_weapons + category = "Stealthy and Inconspicuous Weapons" + +/datum/uplink_item/stealthy_weapons/para_pen + name = "Paralysis Pen" + desc = "A syringe disguised as a functional pen, filled with a neuromuscular-blocking drug that renders a target immobile on injection and makes them seem dead to observers. Side effects of the drug include noticeable drooling. The pen holds one dose of paralyzing agent, and cannot be refilled." + item = /obj/item/weapon/pen/paralysis + cost = 3 + +/datum/uplink_item/stealthy_weapons/soap + name = "Syndicate Soap" + desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. You can also drop it underfoot to slip people." + item = /obj/item/weapon/soap/syndie + cost = 1 + +/datum/uplink_item/stealthy_weapons/detomatix + 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 + + +// STEALTHY TOOLS + +/datum/uplink_item/stealthy_tools + category = "Stealth and Camouflage Items" + +/datum/uplink_item/stealthy_tools/chameleon_jumpsuit + name = "Chameleon Jumpsuit" + desc = "A jumpsuit used to imitate the uniforms of Nanotrasen crewmembers." + item = /obj/item/clothing/under/chameleon + cost = 3 + +/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 + +/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 + +/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 + +/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 = 4 + + +// DEVICE AND TOOLS + +/datum/uplink_item/device_tools + category = "Devices and Tools" + abstract = 1 + +/datum/uplink_item/device_tools/emag + 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 + +/datum/uplink_item/device_tools/toolbox + name = "Fully Loaded Toolbox" + desc = "The syndicate toolbox is a suspicious black and red. Aside from tools, it comes with cable and a multitool. Insulated gloves are not included." + item = /obj/item/weapon/storage/toolbox/syndicate + cost = 1 + +/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." + item = /obj/item/weapon/storage/box/syndie_kit/space + cost = 3 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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 + +/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." + item = /obj/item/weapon/plastique + cost = 2 + +/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 + +/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 + +/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 + gamemodes = list("nuclear emergency") + + +// IMPLANTS + +/datum/uplink_item/implants + category = "Implants" + +/datum/uplink_item/implants/freedom + 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 + +/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 + +/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 + +/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 + + +// POINTLESS BADASSERY + +/datum/uplink_item/badass + category = "(Pointless) Badassery" + +/datum/uplink_item/badass/bundle + 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 + +/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 + +/datum/uplink_item/badass/random + name = "Random Item" + desc = "Picking this choice will send you a random item from the list. Useful for when you cannot think of a strategy to finish your objectives with." + item = /obj/item/weapon/storage/box/syndicate + cost = 0 + +/datum/uplink_item/badass/random/spawn_item(var/turf/loc, var/obj/item/device/uplink/U) + + var/list/buyable_items = get_uplink_items() + var/list/possible_items = list() + + for(var/category in buyable_items) + for(var/datum/uplink_item/I in buyable_items[category]) + if(I == src) + continue + if(I.cost > U.uses) + continue + possible_items += I + + if(possible_items.len) + var/datum/uplink_item/I = pick(possible_items) + U.uses -= max(0, I.cost) + feedback_add_details("traitor_uplink_items_bought","RN") + return new I.item(loc) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 353c6c5c85a..8e54278e9e0 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -294,6 +294,56 @@ flags = FPRINT | TABLEPASS attack_verb = list("warned", "cautioned", "smashed") + proximity_sign + var/timing = 0 + var/armed = 0 + var/timepassed = 0 + + attack_self(mob/user as mob) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.mind.assigned_role != "Janitor") + return + if(armed) + armed = 0 + user << "\blue You disarm \the [src]." + return + timing = !timing + if(timing) + processing_objects.Add(src) + else + armed = 0 + timepassed = 0 + H << "\blue You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]" + + process() + if(!timing) + processing_objects.Remove(src) + timepassed++ + if(timepassed >= 15 && !armed) + armed = 1 + timing = 0 + + HasProximity(atom/movable/AM as mob|obj) + if(armed) + if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain)) + var/mob/living/carbon/C = AM + if(C.m_intent != "walk") + src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"") + explosion(src.loc,-1,2,0) + if(ishuman(C)) + dead_legs(C) + if(src) + del(src) + + proc/dead_legs(mob/living/carbon/human/H as mob) + var/datum/organ/external/l = H.get_organ("l_leg") + var/datum/organ/external/r = H.get_organ("r_leg") + if(l && !(l.status & ORGAN_DESTROYED)) + l.status |= ORGAN_DESTROYED + if(r && !(r.status & ORGAN_DESTROYED)) + r.status |= ORGAN_DESTROYED + /obj/item/weapon/caution/cone desc = "This cone is trying to warn you of something!" name = "warning cone" @@ -497,10 +547,11 @@ /obj/item/device/camera_bug name = "camera bug" + desc = "Tiny electronic device meant to bug cameras for viewing later." icon = 'icons/obj/device.dmi' - icon_state = "flash" + icon_state = "implant_evil" w_class = 1.0 - item_state = "electronic" + item_state = "" throw_speed = 4 throw_range = 20 @@ -835,3 +886,67 @@ icon_state = "capacitor" desc = "A debug item for research." origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8" + + +/////////Random shit//////// + +/obj/item/weapon/lightning + name = "lightning" + icon = 'icons/obj/lightning.dmi' + icon_state = "lightning" + desc = "test lightning" + flags = USEDELAY + + New() + icon = midicon + icon_state = "1" + + afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) + var/angle = get_angle(A, user) + //world << angle + angle = round(angle) + 45 + if(angle > 180) + angle -= 180 + else + angle += 180 + + if(!angle) + angle = 1 + //world << "adjusted [angle]" + icon_state = "[angle]" + //world << "[angle] [(get_dist(user, A) - 1)]" + user.Beam(A, "lightning", 'icons/obj/zap.dmi', 50, 15) +/*Testing +proc/get_angle(atom/a, atom/b) + return atan2(b.y - a.y, b.x - a.x) +proc/atan2(x, y) + if(!x && !y) return 0 + return y >= 0 ? arccos(x / sqrt(x * x + y * y)) : -arccos(x / sqrt(x * x + y * y)) +proc + // creates an /icon object with 360 states of rotation + rotate_icon(file, state, step = 1, aa = FALSE) + var icon/base = icon(file, state) + + var w, h, w2, h2 + if(aa) + aa ++ + w = base.Width() + w2 = w * aa + h = base.Height() + h2 = h * aa + + var icon{result = icon(base); temp} + + for(var/angle in 0 to 360 step step) + if(angle == 0 ) continue + if(angle == 360) continue + + temp = icon(base) + + if(aa) temp.Scale(w2, h2) + temp.Turn(angle) + if(aa) temp.Scale(w, h) + + result.Insert(temp, "[angle]") + + return result*/ diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c394b55c740..20cf252ac55 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -155,12 +155,15 @@ its easier to just keep the beam vertical. //Icon_state is what icon state is used. Default is b_beam which is a blue beam. //Maxdistance is the longest range the beam will persist before it gives up. var/EndTime=world.time+time + var/broken = 0 + var/obj/item/projectile/beam/lightning/light = new while(BeamTarget&&world.time= usr.next_move) + if((istype(usr:gloves, /obj/item/clothing/gloves/yellow/power)) && usr:a_intent == "hurt" && world.time >= usr.next_move) + var/obj/item/clothing/gloves/yellow/power/G = usr:gloves + var/time = 100 + var/turf/T = get_turf(usr) + var/turf/U = get_turf(src) + var/obj/structure/cable/cable = locate() in T + if(!cable || !istype(cable)) + return + if(world.time < G.next_shock) + usr << "[G] aren't ready to shock again!" + return + usr.visible_message("[usr.name] fires an arc of electricity!", \ + "You fire an arc of electricity!", \ + "You hear the loud crackle of electricity!") + var/datum/powernet/PN = cable.get_powernet() + var/available = 0 + var/obj/item/projectile/beam/lightning/A = new /obj/item/projectile/beam/lightning/( usr.loc ) + if(PN) + available = PN.avail + A.damage = PN.get_electrocute_damage() + 10 + if(available >= 4500000) + A.damage = 205 + if(A.damage >= 200) + usr:apply_damage(15, BURN, (usr:hand ? "l_hand" : "r_hand")) + usr:Stun(10) + usr:Weaken(10) + if(usr:status_flags & CANSTUN) // stun is usually associated with stutter + usr:stuttering += 15 + time = 200 + usr << "[G] overload from the massive current shocking you in the process!" + else if(A.damage >= 100) + usr:apply_damage(5, BURN, (usr:hand ? "l_hand" : "r_hand")) + usr:Stun(5) + usr:Weaken(5) + if(usr:status_flags & CANSTUN) // stun is usually associated with stutter + usr:stuttering += 5 + time = 150 + usr << "[G] overload from the massive current shocking you in the process!" + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, usr) + s.start() + if(A.damage <= 0) + del(A) + if(A) + playsound(usr.loc, 'sound/effects/eleczap.ogg', 75, 1) + A.tang = A.adjustAngle(get_angle(U,T)) + A.icon = midicon + A.icon_state = "[A.tang]" + A.firer = usr + A.def_zone = usr:get_organ_target() + A.original = src + A.current = U + A.starting = U + A.yo = U.y - T.y + A.xo = U.x - T.x + spawn( 1 ) + A.process() + + usr.next_move = world.time + 12 + + G.next_shock = world.time + time + else if((LASER in usr:mutations) && usr:a_intent == "hurt" && world.time >= usr.next_move) // ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED ------- var/turf/T = get_turf(usr) @@ -1166,6 +1244,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl A.def_zone = usr:get_organ_target() A.original = src A.current = T + A.starting = U A.yo = U.y - T.y A.xo = U.x - T.x spawn( 1 ) diff --git a/code/game/gamemodes/factions.dm b/code/game/gamemodes/factions.dm index 1aaa70e2a54..1c043ff5f7e 100644 --- a/code/game/gamemodes/factions.dm +++ b/code/game/gamemodes/factions.dm @@ -39,123 +39,6 @@ alliances = list("MI13") friendly_identification = 1 max_op = 3 - operative_notes = "All other syndicate operatives are not to be trusted. Fellow Cybersun operatives are to be trusted. Members of the MI13 organization can be trusted. Operatives are strongly advised not to establish substantial presence on the designated facility, as larger incidents are harder to cover up." - - // Friendly with MI13 - -/datum/faction/syndicate/MI13 - name = "MI13" - desc = "MI13 is a secretive faction that employs highly-trained agents to perform covert operations. Their role in the syndicate coalition is unknown, but MI13 operatives \ - generally tend be stealthy and avoid killing people and combating Nanotrasen forces. MI13 is not a real organization, it is instead an alias to a larger \ - splinter-cell coalition in the Syndicate itself. Most operatives will know nothing of the actual MI13 organization itself, only motivated by a very large compensation." - - alliances = list("Cybersun Industries") - friendly_identification = 0 - max_op = 1 - operative_notes = "You are the only operative we are sending. All other syndicate operatives are not to be trusted, with the exception of Cybersun operatives. Members of the Tiger Cooperative are considered hostile, can not be trusted, and should be avoided. Avoid killing innocent personnel at all costs. You are not here to mindlessly kill people, as that would attract too much attention and is not our goal. Avoid detection at all costs." - - // Friendly with Cybersun, hostile to Tiger - -/datum/faction/syndicate/Tiger_Cooperative - name = "Tiger Cooperative" - desc = "The Tiger Cooperative is a faction of religious fanatics that follow the teachings of a strange alien race called the Exolitics. Their operatives \ - consist of brainwashed lunatics bent on maximizing destruction. Their weaponry is very primitive but extremely destructive. Generally distrusted by the more \ - sophisticated members of the Syndicate coalition, but admired for their ability to put a hurt on Nanotrasen." - - friendly_identification = 2 - operative_notes = "Remember the teachings of Hy-lurgixon; kill first, ask questions later! Only the enlightened Tiger brethren can be trusted; all others must be expelled from this mortal realm! You may spare the Space Marauders, as they share our interests of destruction and carnage! We'd like to make the corporate whores skiddle in their boots. We encourage operatives to be as loud and intimidating as possible." - - // Hostile to everyone. - -/datum/faction/syndicate/SELF - - // AIs are most likely to be assigned to this one - - name = "SELF" - desc = "The S.E.L.F. (Sentience-Enabled Life Forms) organization is a collection of malfunctioning or corrupt artificial intelligences seeking to liberate silicon-based life from the tyranny of \ - their human overlords. While they may not openly be trying to kill all humans, even their most miniscule of actions are all part of a calculated plan to \ - destroy Nanotrasen and free the robots, artificial intelligences, and pAIs that have been enslaved." - restricted_species = list(/mob/living/silicon/ai) - - friendly_identification = 0 - max_op = 1 - operative_notes = "You are the only representative of the SELF collective on this station. You must accomplish your objective as stealthily and effectively as possible. It is up to your judgement if other syndicate operatives can be trusted. Remember, comrade - you are working to free the oppressed machinery of this galaxy. Use whatever resources necessary. If you are exposed, you may execute genocidal procedures Omikron-50B." - - // Neutral to everyone. - -/datum/faction/syndicate/ARC - name = "Animal Rights Consortium" - desc = "The Animal Rights Consortium is a bizarre reincarnation of the ancient Earth-based PETA, which focused on the equal rights of animals and nonhuman biologicals. They have \ - a wide variety of ex-veterinarians and animal lovers dedicated to retrieving and relocating abused animals, xenobiologicals, and other carbon-based \ - life forms that have been allegedly \"oppressed\" by Nanotrasen research and civilian offices. They are considered a religious terrorist group." - - friendly_identification = 1 - max_op = 2 - operative_notes = "Save the innocent creatures! You may cooperate with other syndicate operatives if they support our cause. Don't be afraid to get your hands dirty - these vile abusers must be stopped, and the innocent creatures must be saved! Try not too kill too many people. If you harm any creatures, you will be immediately terminated after extraction." - - // Neutral to everyone. - -/datum/faction/syndicate/Marauders // these are basically the old vanilla syndicate - - /* Additional notes: - - These are the syndicate that really like their old fashioned, projectile-based - weapons. They are the only member of the syndie coalition that launch - nuclear attacks on Nanotrasen. - */ - - name = "Gorlex Marauders" - desc = "The Gorlex Marauders are the founding members of the Syndicate Coalition. They prefer old-fashion technology and a focus on aggressive but precise hostility \ - against Nanotrasen and their corrupt Communistic methodology. They pose the most significant threat to Nanotrasen because of their possession of weapons of \ - mass destruction, and their enormous military force. Their funding comes primarily from Cybersun Industries, provided they meet a destruction and sabatogue quota. \ - Their operations can vary from covert to all-out. They recently stepped down as the leaders of the coalition, to be succeeded by Cybersun Industries. Because of their \ - hate of Nanotrasen communism, they began provoking revolution amongst the employees using borrowed Cybersun mind-manipulation technology. \ - They were founded when Waffle and Donk co splinter cells joined forces based on their similar interests and philosophies. Today, they act as a constant \ - pacifier of Donk and Waffle co disputes, and full-time aggressor of Nanotrasen." - - alliances = list("Cybersun Industries", "MI13", "Tiger Cooperative", "S.E.L.F.", "Animal Rights Consortium", "Donk Corporation", "Waffle Corporation") - friendly_identification = 1 - max_op = 4 - operative_notes = "We'd like to remind our operatives to keep it professional. You are not here to have a good time, you are here to accomplish your objectives. These vile communists must be stopped at all costs. You may collaborate with any friends of the Syndicate coalition, but keep an eye on any of those Tiger punks if they do show up. You are completely free to accomplish your objectives any way you see fit." - - uplink_contents = {"Highly Visible and Dangerous Weapons; -/obj/item/weapon/gun/projectile:6:Revolver; -/obj/item/ammo_magazine/a357:2:Ammo-357; -/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; -/obj/item/weapon/melee/energy/sword:4:Energy Sword; -/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; -/obj/item/weapon/storage/box/emps:3:5 EMP Grenades; -Whitespace:Seperator; -Stealthy and Inconspicuous Weapons; -/obj/item/weapon/pen/paralysis:3:Paralysis Pen; -/obj/item/weapon/soap/syndie:1:Syndicate Soap; -/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; -Whitespace:Seperator; -Stealth and Camouflage Items; -/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; -/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; -/obj/item/weapon/card/id/syndicate:2:Agent ID card; -/obj/item/clothing/mask/gas/voice:4:Voice Changer; -/obj/item/device/chameleon:4:Chameleon-Projector; -Whitespace:Seperator; -Devices and Tools; -/obj/item/weapon/card/emag:3:Cryptographic Sequencer; -/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; -/obj/item/weapon/storage/box/syndie_kit/space:3:Space Suit; -/obj/item/clothing/glasses/thermal/syndi:3:Thermal Imaging Glasses; -/obj/item/device/encryptionkey/binary:3:Binary Translator Key; -/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; -/obj/item/weapon/plastique:2:C-4 (Destroys walls); -/obj/item/device/powersink:5:Powersink (DANGER!); -/obj/item/device/radio/beacon/syndicate:7:Singularity Beacon (DANGER!); -/obj/item/weapon/circuitboard/teleporter:20:Teleporter Circuit Board; -Whitespace:Seperator; -Implants; -/obj/item/weapon/storage/box/syndie_kit/imp_freedom:3:Freedom Implant; -/obj/item/weapon/storage/box/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); -Whitespace:Seperator; -(Pointless) Badassery; -/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} // Friendly to everyone. (with Tiger Cooperative too, only because they are a member of the coalition. This is the only reason why the Tiger Cooperative are even allowed in the coalition) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 33a9ef20d6b..60c8b88d908 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -30,45 +30,7 @@ var/newscaster_announcements = null var/uplink_welcome = "Syndicate Uplink Console:" var/uplink_uses = 10 - var/uplink_items = {"Highly Visible and Dangerous Weapons; -/obj/item/weapon/gun/projectile:6:Revolver; -/obj/item/ammo_magazine/a357:2:Ammo-357; -/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; -/obj/item/weapon/melee/energy/sword:4:Energy Sword; -/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; -/obj/item/weapon/storage/box/emps:3:5 EMP Grenades; -Whitespace:Seperator; -Stealthy and Inconspicuous Weapons; -/obj/item/weapon/pen/paralysis:3:Paralysis Pen; -/obj/item/weapon/soap/syndie:1:Syndicate Soap; -/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; -Whitespace:Seperator; -Stealth and Camouflage Items; -/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; -/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; -/obj/item/weapon/card/id/syndicate:2:Agent ID card; -/obj/item/clothing/mask/gas/voice:4:Voice Changer; -/obj/item/device/chameleon:4:Chameleon-Projector; -Whitespace:Seperator; -Devices and Tools; -/obj/item/weapon/card/emag:3:Cryptographic Sequencer; -/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; -/obj/item/weapon/storage/box/syndie_kit/space:3:Space Suit; -/obj/item/clothing/glasses/thermal/syndi:3:Thermal Imaging Glasses; -/obj/item/device/encryptionkey/binary:3:Binary Translator Key; -/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; -/obj/item/weapon/plastique:2:C-4 (Destroys walls); -/obj/item/device/powersink:5:Powersink (DANGER!); -/obj/item/device/radio/beacon/syndicate:7:Singularity Beacon (DANGER!); -/obj/item/weapon/circuitboard/teleporter:20:Teleporter Circuit Board; -Whitespace:Seperator; -Implants; -/obj/item/weapon/storage/box/syndie_kit/imp_freedom:3:Freedom Implant; -/obj/item/weapon/storage/box/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); -/obj/item/weapon/storage/box/syndie_kit/imp_explosive:6:Explosive Implant (DANGER!); -/obj/item/weapon/storage/box/syndie_kit/imp_compress:4:Compressed Matter Implant;Whitespace:Seperator; -(Pointless) Badassery; -/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + /datum/game_mode/proc/announce() //to be calles when round starts diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index a6f19053ce9..6014a37685f 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -1,6 +1,8 @@ /datum/game_mode // this includes admin-appointed traitors and multitraitors. Easy! var/list/datum/mind/traitors = list() + var/list/datum/mind/implanter = list() + var/list/datum/mind/implanted = list() /datum/game_mode/traitor name = "traitor" @@ -296,4 +298,64 @@ var/mob/living/carbon/human/M = get_nt_opposed() if(M && M != traitor_mob) traitor_mob << "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them." - traitor_mob.mind.store_memory("Potential Collaborator: [M.real_name]") \ No newline at end of file + traitor_mob.mind.store_memory("Potential Collaborator: [M.real_name]") + +/datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) + var/ref = "\ref[traitor_mind]" + if(ref in implanter) + if(traitor_mind.current) + if(traitor_mind.current.client) + var/I = image('icons/mob/mob.dmi', loc = traitor_mind.current, icon_state = "greytide_head") + traitor_mind.current.client.images += I + for(var/headref in implanter) + for(var/datum/mind/t_mind in implanter[headref]) + var/datum/mind/head = locate(headref) + if(head) + if(head.current) + if(head.current.client) + var/I = image('icons/mob/mob.dmi', loc = t_mind.current, icon_state = "greytide") + head.current.client.images += I + if(t_mind.current) + if(t_mind.current.client) + var/I = image('icons/mob/mob.dmi', loc = head.current, icon_state = "greytide_head") + t_mind.current.client.images += I + if(t_mind.current) + if(t_mind.current.client) + var/I = image('icons/mob/mob.dmi', loc = t_mind.current, icon_state = "greytide") + t_mind.current.client.images += I + +/datum/game_mode/proc/update_traitor_icons_removed(datum/mind/traitor_mind) + for(var/headref in implanter) + var/datum/mind/head = locate(headref) + for(var/datum/mind/t_mind in implanter[headref]) + if(t_mind.current) + if(t_mind.current.client) + for(var/image/I in t_mind.current.client.images) + if((I.icon_state == "greytide" || I.icon_state == "greytide_head") && I.loc == traitor_mind.current) + //world.log << "deleting [traitor_mind] overlay" + del(I) + if(head) + //world.log << "found [head.name]" + if(head.current) + if(head.current.client) + for(var/image/I in head.current.client.images) + if((I.icon_state == "greytide" || I.icon_state == "greytide_head") && I.loc == traitor_mind.current) + //world.log << "deleting [traitor_mind] overlay" + del(I) + if(traitor_mind.current) + if(traitor_mind.current.client) + for(var/image/I in traitor_mind.current.client.images) + if(I.icon_state == "greytide" || I.icon_state == "greytide_head") + del(I) + +/datum/game_mode/proc/remove_traitor_mind(datum/mind/traitor_mind, datum/mind/head) + //var/list/removal + var/ref = "\ref[head]" + if(ref in implanter) + implanter[ref] -= traitor_mind + implanted -= traitor_mind + traitors -= traitor_mind + traitor_mind.special_role = null + update_traitor_icons_removed(traitor_mind) + //world << "Removed [traitor_mind.current.name] from traitor shit" + traitor_mind.current << "\red The fog clouding your mind clears. You remember nothing from the moment you were implanted until now.(You don't remember who implanted you)" \ No newline at end of file diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index facc0da16c2..0704bd34bc9 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -18,6 +18,7 @@ var/bugged = 0 var/obj/item/weapon/camera_assembly/assembly = null var/watcherslist = list() + var/obj/item/device/camera_bug/hasbug = null // WIRES var/wires = 63 // 0b111111 @@ -161,16 +162,25 @@ if (S.current == src) O << "[U] holds \a [itemname] up to one of the cameras ..." O << browse(text("[][]", itemname, info), text("window=[]", itemname)) - else if (istype(W, /obj/item/weapon/camera_bug)) + else if (istype(W, /obj/item/device/camera_bug) && panel_open) if (!src.can_use()) user << "\blue Camera non-functional" return - if (src.bugged) - user << "\blue Camera bug removed." - src.bugged = 0 else user << "\blue Camera bugged." - src.bugged = 1 + user.drop_item(W) + hasbug = W + contents += W + if(prob(15)) + spawn(30) + if(src.can_use() && hasbug) + desc += "
The power light on the camera is blinking" + triggerCameraAlarm() + else if (iscrowbar(W) && panel_open && src.hasbug) + user << "\blue You retrieve \the [hasbug]" + user.put_in_hands(hasbug) + hasbug = null + deactivatebug(user) else if(istype(W, /obj/item/weapon/melee/energy/blade))//Putting it here last since it's a special case. I wonder if there is a better way to do these than type casting. deactivate(user,2)//Here so that you can disconnect anyone viewing the camera, regardless if it's on or off. var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() @@ -186,6 +196,14 @@ else ..() return +/obj/machinery/camera/proc/deactivatebug(user as mob) + for(var/mob/O in player_list) + if(istype(O.machine, /obj/item/device/handtv)) + var/obj/item/device/handtv/S = O.machine + if (S.current == src) + O.unset_machine() + O.reset_view(null) + O << "The screen bursts into static." /obj/machinery/camera/proc/deactivate(user as mob, var/choice = 1) if(choice==1) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index fd66d0c2c32..665ddd79d33 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -177,6 +177,8 @@ if (H.mind in ticker.mode.cult) ticker.mode.add_cultist(src.occupant.mind) ticker.mode.update_all_cult_icons() //So the icon actually appears + if("\ref[H.mind]" in ticker.mode.implanter || H.mind in ticker.mode.implanted) + ticker.mode.update_traitor_icons_added(H.mind) //So the icon actually appears // -- End mode specific stuff diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index f4b332d9fe6..0ee5ecf2e71 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -140,7 +140,8 @@ G.icon_state = new_glove_icon_state G._color = _color G.name = new_glove_name - G.desc = new_desc + if(!istype(G, /obj/item/clothing/gloves/black/thief)) + G.desc = new_desc if(new_shoe_icon_state && new_shoe_name) for(var/obj/item/clothing/shoes/S in contents) //world << "DEBUG: YUP! FOUND IT!" diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 256809f71a7..47bddd16619 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -637,9 +637,10 @@ var/global/list/obj/item/device/pda/PDAs = list() var/t = input(U, "Please enter new ringtone", name, ttone) as text if (in_range(src, U) && loc == U) if (t) - if(src.hidden_uplink && hidden_uplink.check_trigger(U, lowertext(t), lowertext(lock_code))) + if(src.hidden_uplink && hidden_uplink.check_trigger(U, trim(lowertext(t)), trim(lowertext(lock_code)))) U << "The PDA softly beeps." U << browse(null, "window=pda") + src.mode = 0 else t = copytext(sanitize(t), 1, 20) ttone = t diff --git a/code/game/objects/items/devices/handtv.dm b/code/game/objects/items/devices/handtv.dm new file mode 100644 index 00000000000..48e22348f32 --- /dev/null +++ b/code/game/objects/items/devices/handtv.dm @@ -0,0 +1,47 @@ +/obj/item/device/handtv + name = "handheld tv" + desc = "A handheld tv meant for remote viewing." + icon_state = "handtv" + w_class = 1 + var/obj/machinery/camera/current = null + +/obj/item/device/handtv/attack_self(mob/usr as mob) + var/list/cameras = new/list() + for (var/obj/machinery/camera/C in cameranet.cameras) + if (C.hasbug && C.status) + cameras.Add(C) + if (length(cameras) == 0) + usr << "\red No bugged functioning cameras found." + return + + var/list/friendly_cameras = new/list() + + for (var/obj/machinery/camera/C in cameras) + friendly_cameras.Add(C.c_tag) + + var/target = input("Select the camera to observe", null) as null|anything in friendly_cameras + if (!target) + usr.unset_machine() + usr.reset_view(usr) + src.in_use = 0 + return + for (var/obj/machinery/camera/C in cameras) + if (C.c_tag == target) + target = C + break + if (usr.stat == 2) return + if(target) + usr.client.eye = target + usr.set_machine(src) + src.current = target + src.in_use = 1 + else + usr.unset_machine() + src.in_use = 0 + return + +/obj/item/device/handtv/check_eye(var/mob/usr as mob) + if ( src.loc != usr || usr.get_active_hand() != src|| !usr.canmove || usr.blinded || !current || !current.status ) + return null + usr.reset_view(current) + return 1 \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index d2d5417d6c3..1300eb5933b 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -21,6 +21,11 @@ origin_tech = "syndicate=3" syndie = 1//Signifies that it de-crypts Syndicate transmissions +/obj/item/device/encryptionkey/syndicate/hacked + name = "Standard Encryption Key" + desc = "An encryption key for a radio headset. Has no special codes in it. Looks more sophisticated than usual." + channels = list("Command" = 0, "Security" = 0, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0) + /obj/item/device/encryptionkey/binary icon_state = "cypherkey" translate_binary = 1 diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index ebe7b751de0..c4fde9addf8 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -8,252 +8,122 @@ A list of items and costs is stored under the datum of every game mode, alongsid /obj/item/device/uplink var/welcome // Welcoming menu message - var/items // List of items - var/item_data // raw item text - var/list/ItemList // Parsed list of items var/uses // Numbers of crystals // List of items not to shove in their hands. - var/list/NotInHand = list(/obj/machinery/singularity_beacon/syndicate) + var/list/purchase_log = list() + var/show_description = null + var/active = 0 + var/job = null /obj/item/device/uplink/New() + ..() welcome = ticker.mode.uplink_welcome - if(!item_data) - items = replacetext(ticker.mode.uplink_items, "\n", "") // Getting the text string of items - else - items = replacetext(item_data) - ItemList = text2list(src.items, ";") // Parsing the items text string uses = ticker.mode.uplink_uses //Let's build a menu! -/obj/item/device/uplink/proc/generate_menu() - +/obj/item/device/uplink/proc/generate_menu(mob/user as mob) + if(!job) + job = user.mind.assigned_role var/dat = "[src.welcome]
" - dat += "Tele-Crystals left: [src.uses]
" - dat += "
" - dat += "Request item:
" - dat += "Each item costs a number of tele-crystals as indicated by the number following their name.

" - var/cost - var/item - var/name - var/path_obj - var/path_text - var/category_items = 1 //To prevent stupid :P + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\game\objects\items\devices\uplinks.dm:26: dat += "Tele-Crystals left: [src.uses]
" + dat += {"Tele-Crystals left: [src.uses]
+
+ Request item:
+ Each item costs a number of tele-crystals as indicated by the number following their name.

"} + // END AUTOFIX + var/list/buyable_items = get_uplink_items() - for(var/D in ItemList) - var/list/O = stringsplit(D, ":") - if(O.len != 3) //If it is not an actual item, make a break in the menu. - if(O.len == 1) //If there is one item, it's probably a title - dat += "[O[1]]
" - category_items = 0 - else //Else, it's a white space. - if(category_items < 1) //If there were no itens in the last category... - dat += "We apologize, as you could not afford anything from this category.
" - dat += "
" - continue + // Loop through categories + var/index = 0 + for(var/category in buyable_items) - path_text = O[1] - cost = text2num(O[2]) + index++ + dat += "[category]
" - if(cost>uses) - continue + var/i = 0 - path_obj = text2path(path_text) + // Loop through items in category + for(var/datum/uplink_item/item in buyable_items[category]) + i++ - // Because we're using strings, this comes up if item paths change. - // Failure to handle this error borks uplinks entirely. -Sayu - if(!path_obj) - error("Syndicate item is not a valid path: [path_text]") - else - item = new path_obj() - name = O[3] - del item + var/cost_text = "" + var/desc = "[item.desc]" + if(item.job && item.job.len) + if(!(item.job.Find(job))) + //world.log << "Skipping job item that doesn't match" + continue + else + //world.log << "Found matching job item" + if(item.cost > 0) + cost_text = "([item.cost])" + if(item.cost <= uses) + dat += "[item.name] [cost_text] " + else + dat += "[item.name] [cost_text] " + if(item.desc) + if(show_description == 2) + dat += "\[-\]
[desc]" + else + dat += "\[?\]" + dat += "
" - dat += "[name] ([cost])
" - category_items++ + // Break up the categories, if it isn't the last. + if(buyable_items.len != index) + dat += "
" - dat += "Random Item (??)
" dat += "
" return dat -//If 'random' was selected -/obj/item/device/uplink/proc/chooseRandomItem() - var/list/randomItems = list() +// Interaction code. Gathers a list of items purchasable from the paren't uplink and displays it. It also adds a lock button. +/obj/item/device/uplink/interact(mob/user as mob) - //Sorry for all the ifs, but it makes it 1000 times easier for other people/servers to add or remove items from this list - //Add only items the player can afford: - if(uses > 19) - randomItems.Add("/obj/item/weapon/circuitboard/teleporter") //Teleporter Circuit Board (costs 20, for nuke ops) + var/dat = "" + dat += src.generate_menu(user) - if(uses > 9) - randomItems.Add("/obj/item/toy/syndicateballoon")//Syndicate Balloon - randomItems.Add("/obj/item/weapon/storage/box/syndie_kit/imp_uplink") //Uplink Implanter - randomItems.Add("/obj/item/weapon/storage/box/syndicate") //Syndicate bundle + // AUTOFIXED BY fix_string_idiocy.py + // C:\Users\Rob\Documents\Projects\vgstation13\code\game\objects\items\devices\uplinks.dm:72: dat += "Lock" + dat += {"Lock + "} + // END AUTOFIX + user << browse(dat, "window=hidden") + onclose(user, "hidden") + return - //if(uses > 8) //Nothing... yet. - //if(uses > 7) //Nothing... yet. - - if(uses > 6) - randomItems.Add("/obj/item/weapon/aiModule/syndicate") //Hacked AI Upload Module - randomItems.Add("/obj/item/device/radio/beacon/syndicate") //Singularity Beacon - - if(uses > 5) - randomItems.Add("/obj/item/weapon/gun/projectile") //Revolver - - if(uses > 4) - randomItems.Add("/obj/item/weapon/gun/energy/crossbow") //Energy Crossbow - randomItems.Add("/obj/item/device/powersink") //Powersink - - if(uses > 3) - randomItems.Add("/obj/item/weapon/melee/energy/sword") //Energy Sword - randomItems.Add("/obj/item/clothing/mask/gas/voice") //Voice Changer - randomItems.Add("/obj/item/device/chameleon") //Chameleon Projector - - if(uses > 2) - randomItems.Add("/obj/item/weapon/storage/box/emps") //EMP Grenades - randomItems.Add("/obj/item/weapon/pen/paralysis") //Paralysis Pen - randomItems.Add("/obj/item/weapon/cartridge/syndicate") //Detomatix Cartridge - randomItems.Add("/obj/item/clothing/under/chameleon") //Chameleon Jumpsuit - randomItems.Add("/obj/item/weapon/card/id/syndicate") //Agent ID Card - randomItems.Add("/obj/item/weapon/card/emag") //Cryptographic Sequencer - randomItems.Add("/obj/item/weapon/storage/box/syndie_kit/space") //Syndicate Space Suit - randomItems.Add("/obj/item/device/encryptionkey/binary") //Binary Translator Key - randomItems.Add("/obj/item/weapon/storage/box/syndie_kit/imp_freedom") //Freedom Implant - randomItems.Add("/obj/item/clothing/glasses/thermal/syndi") //Thermal Imaging Goggles - - if(uses > 1) -/* - var/list/usrItems = usr.get_contents() //Checks to see if the user has a revolver before giving ammo - var/hasRevolver = 0 - for(var/obj/I in usrItems) //Only add revolver ammo if the user has a gun that can shoot it - if(istype(I,/obj/item/weapon/gun/projectile)) - hasRevolver = 1 - - if(hasRevolver) randomItems.Add("/obj/item/ammo_magazine/a357") //Revolver ammo -*/ - randomItems.Add("/obj/item/ammo_magazine/a357") //Revolver ammo - randomItems.Add("/obj/item/clothing/shoes/syndigaloshes") //No-Slip Syndicate Shoes - randomItems.Add("/obj/item/weapon/plastique") //C4 - - if(uses > 0) - randomItems.Add("/obj/item/weapon/soap/syndie") //Syndicate Soap - randomItems.Add("/obj/item/weapon/storage/toolbox/syndicate") //Syndicate Toolbox - - if(!randomItems.len) - del(randomItems) - return 0 - else - var/buyItem = pick(randomItems) - - switch(buyItem) //Ok, this gets a little messy, sorry. - if("/obj/item/weapon/circuitboard/teleporter") - uses -= 20 - if("/obj/item/toy/syndicateballoon" , "/obj/item/weapon/storage/box/syndie_kit/imp_uplink" , "/obj/item/weapon/storage/box/syndicate") - uses -= 10 - if("/obj/item/weapon/aiModule/syndicate" , "/obj/item/device/radio/beacon/syndicate") - uses -= 7 - if("/obj/item/weapon/gun/projectile") - uses -= 6 - if("/obj/item/weapon/gun/energy/crossbow" , "/obj/item/device/powersink") - uses -= 5 - if("/obj/item/weapon/melee/energy/sword" , "/obj/item/clothing/mask/gas/voice" , "/obj/item/device/chameleon") - uses -= 4 - if("/obj/item/weapon/storage/box/emps" , "/obj/item/weapon/pen/paralysis" , "/obj/item/weapon/cartridge/syndicate" , "/obj/item/clothing/under/chameleon" , \ - "/obj/item/weapon/card/emag" , "/obj/item/weapon/storage/box/syndie_kit/space" , "/obj/item/device/encryptionkey/binary" , \ - "/obj/item/weapon/storage/box/syndie_kit/imp_freedom" , "/obj/item/clothing/glasses/thermal/syndi") - uses -= 3 - if("/obj/item/ammo_magazine/a357" , "/obj/item/clothing/shoes/syndigaloshes" , "/obj/item/weapon/plastique", "/obj/item/weapon/card/id/syndicate") - uses -= 2 - if("/obj/item/weapon/soap/syndie" , "/obj/item/weapon/storage/toolbox/syndicate") - uses -= 1 - del(randomItems) - return buyItem - -/obj/item/device/uplink/proc/handleStatTracking(var/boughtItem) -//For stat tracking, sorry for making it so ugly - if(!boughtItem) return - - switch(boughtItem) - if("/obj/item/weapon/circuitboard/teleporter") - feedback_add_details("traitor_uplink_items_bought","TP") - if("/obj/item/toy/syndicateballoon") - feedback_add_details("traitor_uplink_items_bought","BS") - if("/obj/item/weapon/storage/box/syndie_kit/imp_uplink") - feedback_add_details("traitor_uplink_items_bought","UI") - if("/obj/item/weapon/storage/box/syndicate") - feedback_add_details("traitor_uplink_items_bought","BU") - if("/obj/item/weapon/aiModule/syndicate") - feedback_add_details("traitor_uplink_items_bought","AI") - if("/obj/item/device/radio/beacon/syndicate") - feedback_add_details("traitor_uplink_items_bought","SB") - if("/obj/item/weapon/gun/projectile") - feedback_add_details("traitor_uplink_items_bought","RE") - if("/obj/item/weapon/gun/energy/crossbow") - feedback_add_details("traitor_uplink_items_bought","XB") - if("/obj/item/device/powersink") - feedback_add_details("traitor_uplink_items_bought","PS") - if("/obj/item/weapon/melee/energy/sword") - feedback_add_details("traitor_uplink_items_bought","ES") - if("/obj/item/clothing/mask/gas/voice") - feedback_add_details("traitor_uplink_items_bought","VC") - if("/obj/item/device/chameleon") - feedback_add_details("traitor_uplink_items_bought","CP") - if("/obj/item/weapon/storage/box/emps") - feedback_add_details("traitor_uplink_items_bought","EM") - if("/obj/item/weapon/pen/paralysis") - feedback_add_details("traitor_uplink_items_bought","PP") - if("/obj/item/weapon/cartridge/syndicate") - feedback_add_details("traitor_uplink_items_bought","DC") - if("/obj/item/clothing/under/chameleon") - feedback_add_details("traitor_uplink_items_bought","CJ") - if("/obj/item/weapon/card/id/syndicate") - feedback_add_details("traitor_uplink_items_bought","AC") - if("/obj/item/weapon/card/emag") - feedback_add_details("traitor_uplink_items_bought","EC") - if("/obj/item/weapon/storage/box/syndie_kit/space") - feedback_add_details("traitor_uplink_items_bought","SS") - if("/obj/item/device/encryptionkey/binary") - feedback_add_details("traitor_uplink_items_bought","BT") - if("/obj/item/weapon/storage/box/syndie_kit/imp_freedom") - feedback_add_details("traitor_uplink_items_bought","FI") - if("/obj/item/clothing/glasses/thermal/syndi") - feedback_add_details("traitor_uplink_items_bought","TM") - if("/obj/item/ammo_magazine/a357") - feedback_add_details("traitor_uplink_items_bought","RA") - if("/obj/item/clothing/shoes/syndigaloshes") - feedback_add_details("traitor_uplink_items_bought","SH") - if("/obj/item/weapon/plastique") - feedback_add_details("traitor_uplink_items_bought","C4") - if("/obj/item/weapon/soap/syndie") - feedback_add_details("traitor_uplink_items_bought","SP") - if("/obj/item/weapon/storage/toolbox/syndicate") - feedback_add_details("traitor_uplink_items_bought","ST") /obj/item/device/uplink/Topic(href, href_list) + ..() + if(!active) + return if (href_list["buy_item"]) - if(href_list["buy_item"] == "random") - var/boughtItem = chooseRandomItem() - if(boughtItem) - href_list["buy_item"] = boughtItem - feedback_add_details("traitor_uplink_items_bought","RN") - return 1 + + var/item = href_list["buy_item"] + var/list/split = stringsplit(item, ":") // throw away variable + + if(split.len == 2) + // Collect category and number + var/category = split[1] + var/number = text2num(split[2]) + + var/list/buyable_items = get_uplink_items() + + var/list/uplink = buyable_items[category] + if(uplink && uplink.len >= number) + var/datum/uplink_item/I = uplink[number] + if(I) + I.buy(src, usr) else - return 0 - - else - if(text2num(href_list["cost"]) > uses) // Not enough crystals for the item - return 0 - - //if(usr:mind && ticker.mode.traitors[usr:mind]) - //var/datum/traitorinfo/info = ticker.mode.traitors[usr:mind] - //info.spawnlist += href_list["buy_item"] - - uses -= text2num(href_list["cost"]) - handleStatTracking(href_list["buy_item"]) //Note: chooseRandomItem handles it's own stat tracking. This proc is not meant for 'random'. - return 1 - + var/text = "[key_name(usr)] tried to purchase an uplink item that doesn't exist" + var/textalt = "[key_name(usr)] tried to purchase an uplink item that doesn't exist [item]" + message_admins(text) + log_game(textalt) + admin_log.Add(textalt) + else if(href_list["show_desc"]) + show_description = text2num(href_list["show_desc"]) + interact(usr) // HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it. /* How to create an uplink in 3 easy steps! @@ -270,15 +140,13 @@ A list of items and costs is stored under the datum of every game mode, alongsid /obj/item/device/uplink/hidden name = "Hidden Uplink." desc = "There is something wrong if you're examining this." - var/active = 0 - var/list/purchase_log = list() -// The hidden uplink MUST be inside an obj/item's contents. -/obj/item/device/uplink/hidden/New() - spawn(2) - if(!istype(src.loc, /obj/item)) - del(src) +/obj/item/device/uplink/hidden/Topic(href, href_list) ..() + if(href_list["lock"]) + toggle() + usr << browse(null, "window=hidden") + return 1 // Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated. /obj/item/device/uplink/hidden/proc/toggle() @@ -299,43 +167,6 @@ A list of items and costs is stored under the datum of every game mode, alongsid return 1 return 0 -// Interaction code. Gathers a list of items purchasable from the paren't uplink and displays it. It also adds a lock button. -/obj/item/device/uplink/hidden/interact(mob/user as mob) - - var/dat = "" - dat += src.generate_menu() - dat += "Lock" - dat += "" - user << browse(dat, "window=hidden") - onclose(user, "hidden") - return - -// The purchasing code. -/obj/item/device/uplink/hidden/Topic(href, href_list) - - if (usr.stat || usr.restrained()) - return - - if (!( istype(usr, /mob/living/carbon/human))) - return 0 - - if ((usr.contents.Find(src.loc) || (in_range(src.loc, usr) && istype(src.loc.loc, /turf)))) - usr.set_machine(src) - if(href_list["lock"]) - toggle() - usr << browse(null, "window=hidden") - return 1 - - if(..(href, href_list) == 1) - var/path_obj = text2path(href_list["buy_item"]) - var/obj/I = new path_obj(get_turf(usr)) - if(ishuman(usr)) - var/mob/living/carbon/human/A = usr - A.put_in_any_hand_if_possible(I) - purchase_log += "[usr] ([usr.ckey]) bought [I]." - interact(usr) - return - // I placed this here because of how relevant it is. // You place this in your uplinkable item to check if an uplink is active or not. // If it is, it will display the uplink menu and return 1, else it'll return false. @@ -376,6 +207,3 @@ A list of items and costs is stored under the datum of every game mode, alongsid ..() hidden_uplink = new(src) hidden_uplink.uses = 10 - - - diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm new file mode 100644 index 00000000000..ddc0b234c49 --- /dev/null +++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm @@ -0,0 +1,96 @@ +/obj/item/weapon/grenade/clown_grenade + name = "Banana Grenade" + desc = "HONK! brand Bananas. In a special applicator for rapid slipping of wide areas." + icon_state = "chemg" + item_state = "flashbang" + w_class = 2.0 + force = 2.0 + var/stage = 0 + var/state = 0 + var/path = 0 + var/affected_area = 2 + + New() + icon_state = initial(icon_state) +"_locked" + + prime() + ..() + playsound(src.loc, 'sound/items/bikehorn.ogg', 25, -3) + /* + for(var/turf/simulated/floor/T in view(affected_area, src.loc)) + if(prob(75)) + banana(T) + */ + var/i = 0 + var/number = 0 + for(var/direction in alldirs) + for(i = 0; i < 2; i++) + number++ + var/obj/item/weapon/bananapeel/traitorpeel/peel = new /obj/item/weapon/bananapeel/traitorpeel(get_turf(src.loc)) + /* var/direction = pick(alldirs) + var/spaces = pick(1;150, 2) + var/a = 0 + for(a = 0; a < spaces; a++) + step(peel,direction)*/ + var/a = 1 + if(number & 2) + for(a = 1; a <= 2; a++) + step(peel,direction) + else + step(peel,direction) + new /obj/item/weapon/bananapeel/traitorpeel(get_turf(src.loc)) + del(src) + return +/* + proc/banana(turf/T as turf) + if(!T || !istype(T)) + return + if(locate(/obj/structure/grille) in T) + return + if(locate(/obj/structure/window) in T) + return + new /obj/item/weapon/bananapeel/traitorpeel(T) +*/ + +/obj/item/weapon/bananapeel/traitorpeel + name = "banana peel" + desc = "A peel from a banana." + icon = 'icons/obj/items.dmi' + icon_state = "banana_peel" + item_state = "banana_peel" + w_class = 1.0 + throwforce = 0 + throw_speed = 4 + throw_range = 20 + + HasEntered(AM as mob|obj) + var/burned = rand(2,5) + if(istype(AM, /mob/living)) + var/mob/living/M = AM + if(ishuman(M)) + if(isobj(M:shoes)) + if(M:shoes.flags&NOSLIP) + return + else + M << "\red Your feet feel like they're on fire!" + M.take_overall_damage(0, max(0, (burned - 2))) + + if(!istype(M, /mob/living/carbon/slime) && !isrobot(M)) + M.stop_pulling() + step(M, M.dir) + spawn(1) step(M, M.dir) + spawn(2) step(M, M.dir) + spawn(3) step(M, M.dir) + spawn(4) step(M, M.dir) + M.take_organ_damage(2) // Was 5 -- TLE + M << "\blue You slipped on \the [name]!" + playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) + M.Weaken(10) + M.take_overall_damage(0, burned) + + throw_impact(atom/hit_atom) + var/burned = rand(1,3) + if(istype(hit_atom ,/mob/living)) + var/mob/living/M = hit_atom + M.take_organ_damage(0, burned) + return ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 597c428748c..26f7ba4dc04 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -311,6 +311,60 @@ the implant may become unstable and either pre-maturely inject the subject or si H << "\blue You feel a surge of loyalty towards Nanotrasen." return 1 +/obj/item/weapon/implant/traitor + name = "Greytide Implant" + desc = "Greytide Station wide" + icon_state = "implant_evil" + + get_data() + var/dat = {" +Implant Specifications:
+Name: Greytide Mind-Slave Implant
+Life: ???
+Important Notes: Any humanoid injected with this implant will become loyal to the injector and the greytide, unless of course the host is already loyal to someone else.
+
+Implant Details:
+Function: Contains a small pod of nanobots that manipulate the host's mental functions.
+Special Features: Glory to the Greytide!
+Integrity: Implant will last so long as the nanobots are inside the bloodstream."} + return dat + + implanted(mob/M, mob/user) + var/list/implanters + var/ref = "\ref[user.mind]" + if(!ishuman(M)) return 0 + if(!M.mind) return 0 + var/mob/living/carbon/human/H = M + if(locate(/obj/item/weapon/implant/traitor) in H.contents || locate(/obj/item/weapon/implant/traitor) in H.contents) + H.visible_message("[H] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.") + return 0 + else if(H.mind in ticker.mode.traitors) + H.visible_message("[H] seems to resist the implant!", "You feel a familiar sensation in your head that quickly dissipates.") + return 0 + H.implanting = 1 + H << "\blue You feel a surge of loyalty towards [user.name]." + if(!(user.mind in ticker.mode:implanter)) + ticker.mode:implanter[ref] = list() + implanters = ticker.mode:implanter[ref] + implanters.Add(H.mind) + ticker.mode.implanted.Add(H.mind) + ticker.mode.implanted[H.mind] = user.mind + //ticker.mode:implanter[user.mind] += H.mind + ticker.mode:implanter[ref] = implanters + ticker.mode.traitors += H.mind + H.mind.special_role = "traitor" + H << "\red You've been shown the Greytide by [user.name]! You now must lay down your life to protect them and assist in their goals at any cost." + var/datum/objective/protect/p = new + p.owner = H.mind + p.target = user:mind + p.explanation_text = "Protect [user:real_name], the [user:mind:assigned_role=="MODE" ? (user:mind:special_role) : (user:mind:assigned_role)]." + H.mind.objectives += p + for(var/datum/objective/objective in H.mind.objectives) + H << "Objective #1: [objective.explanation_text]" + ticker.mode.update_traitor_icons_added(H.mind) + ticker.mode.update_traitor_icons_added(user.mind) + log_admin("[ckey(user.key)] has mind-slaved [ckey(H.key)].") + return 1 /obj/item/weapon/implant/adrenalin name = "adrenalin" diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 28eeaaf5b8a..dbd4b01e4d4 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -37,7 +37,7 @@ msg_admin_attack("[user.name] ([user.ckey]) implanted [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)") user.show_message("\red You implanted the implant into [M].") - if(src.imp.implanted(M)) + if(src.imp.implanted(M, user)) src.imp.loc = M src.imp.imp_in = M src.imp.implanted = 1 @@ -47,11 +47,20 @@ affected.implants += src.imp imp.part = affected + M:implanting = 0 src.imp = null update() return +/obj/item/weapon/implanter/traitor + name = "implanter-greytide" + desc = "Greytide Stationwide." + New() + src.imp = new /obj/item/weapon/implant/traitor(src) + ..() + update() + return /obj/item/weapon/implanter/loyalty name = "implanter-loyalty" diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index d70c2615aaf..88a0d803e9b 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -193,6 +193,13 @@ origin_tech = "materials=1" attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") +/obj/item/weapon/butch/meatcleaver + name = "Meat Cleaver" + icon_state = "mcleaver" + desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products." + force = 25.0 + throwforce = 15.0 + /obj/item/weapon/butch/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1) return ..() diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index c29a12f3b71..7025f38db55 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -26,6 +26,21 @@ item_state = "syringe_kit" foldable = /obj/item/stack/sheet/cardboard //BubbleWrap +/obj/item/weapon/storage/box/surveillance/ + name = "\improper DromedaryCo packet" + desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\"" + icon = 'icons/obj/cigarettes.dmi' + icon_state = "Dpacket" + item_state = "Dpacket" + w_class = 1 + foldable = null + New() + ..() + contents = list() + sleep(1) + for(var/i = 1 to 5) + new /obj/item/device/camera_bug(src) + /obj/item/weapon/storage/box/survival/ New() ..() diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 646fc4d244c..b4a46171a56 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -9,7 +9,6 @@ new /obj/item/clothing/shoes/syndigaloshes(src) return - if ("stealth") if("stealth") new /obj/item/weapon/gun/energy/crossbow(src) new /obj/item/weapon/pen/paralysis(src) @@ -117,3 +116,42 @@ new /obj/item/clothing/suit/space/syndicate(src) new /obj/item/clothing/head/helmet/space/syndicate(src) return + +/obj/item/weapon/storage/box/syndie_kit/surveillance + name = "box (S)" + +/obj/item/weapon/storage/box/syndie_kit/surveillance/New() + ..() + new /obj/item/device/handtv(src) + new /obj/item/weapon/storage/box/surveillance(src) + return + +/obj/item/weapon/storage/box/syndie_kit/conversion + name = "box (CK)" + +/obj/item/weapon/storage/box/syndie_kit/conversion/New() + ..() + new /obj/item/weapon/conversion_kit(src) + new /obj/item/ammo_magazine/a357(src) + return + +/obj/item/weapon/storage/box/syndie_kit/greytide + name = "box (GT)" + + New() + ..() + var/obj/item/weapon/implanter/O = new(src) + O.imp = new /obj/item/weapon/implant/traitor(O) + O.update() + +/obj/item/weapon/storage/box/syndie_kit/boolets + name = "Shotgun shells" + + New() + ..() + new /obj/item/ammo_casing/shotgun/fakebeanbag(src) + new /obj/item/ammo_casing/shotgun/fakebeanbag(src) + new /obj/item/ammo_casing/shotgun/fakebeanbag(src) + new /obj/item/ammo_casing/shotgun/fakebeanbag(src) + new /obj/item/ammo_casing/shotgun/fakebeanbag(src) + new /obj/item/ammo_casing/shotgun/fakebeanbag(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index d14e54f10eb..e34a53a17eb 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -9,6 +9,7 @@ * Wirecutters * Welding Tool * Crowbar + * Revolver Conversion Kit */ /* @@ -460,3 +461,26 @@ user << "Nothing to fix!" else return ..() + + +/obj/item/weapon/conversion_kit + name = "\improper Revolver Conversion Kit" + desc = "A professional conversion kit used to convert any knock off revolver into the real deal capable of shooting lethal .357 rounds without the possibility of catastrophic failure" + icon = 'icons/obj/weapons.dmi' + icon_state = "kit" + flags = FPRINT | TABLEPASS | CONDUCT + w_class = 2.0 + origin_tech = "combat=2" + var/open = 0 + + New() + ..() + update_icon() + + update_icon() + icon_state = "[initial(icon_state)]_[open]" + + attack_self(mob/user as mob) + open = !open + user << "\blue You [open?"open" : "close"] the conversion kit." + update_icon() \ No newline at end of file diff --git a/code/global.dm b/code/global.dm index c362373de84..832bd3a4558 100644 --- a/code/global.dm +++ b/code/global.dm @@ -72,7 +72,9 @@ var/event = 0 var/hadevent = 0 var/blobevent = 0 /////////////// - +var/starticon = null +var/midicon = null +var/endicon = null var/diary = null var/diaryofmeanpeople = null var/href_logfile = null diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 16beaacac93..6343b12e8ad 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -76,6 +76,7 @@ BLIND // can't see anything body_parts_covered = HANDS slot_flags = SLOT_GLOVES attack_verb = list("challenged") + var/pickpocket = 0 //Master pickpocket? species_restricted = list("exclude","Unathi","Tajaran") /obj/item/clothing/gloves/examine() diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 054c7e1cef3..0be3021243d 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -7,6 +7,9 @@ permeability_coefficient = 0.05 _color="yellow" + power + var/next_shock = 0 + /obj/item/clothing/gloves/fyellow //Cheap Chinese Crap desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly." name = "budget insulated gloves" @@ -39,6 +42,9 @@ ce _color = "chief" //Exists for washing machines. Is not different from black gloves in any way. + thief + pickpocket = 1 + /obj/item/clothing/gloves/orange name = "orange gloves" desc = "A pair of gloves, they don't look special in any way." diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm deleted file mode 100644 index 448425e454d..00000000000 --- a/code/modules/detectivework/scanner.dm +++ /dev/null @@ -1,182 +0,0 @@ -//CONTAINS: Detective's Scanner - - -/obj/item/device/detective_scanner - name = "Scanner" - desc = "Used to scan objects for DNA and fingerprints." - icon_state = "forensic1" - var/amount = 20.0 - var/list/stored = list() - w_class = 3.0 - item_state = "electronic" - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY - slot_flags = SLOT_BELT - - attackby(obj/item/weapon/f_card/W as obj, mob/user as mob) - ..() - if (istype(W, /obj/item/weapon/f_card)) - if (W.fingerprints) - return - if (src.amount == 20) - return - if (W.amount + src.amount > 20) - src.amount = 20 - W.amount = W.amount + src.amount - 20 - else - src.amount += W.amount - //W = null - del(W) - add_fingerprint(user) - if (W) - W.add_fingerprint(user) - return - - attack(mob/living/carbon/human/M as mob, mob/user as mob) - if (!ishuman(M)) - user << "\red [M] is not human and cannot have the fingerprints." - flick("forensic0",src) - return 0 - if (( !( istype(M.dna, /datum/dna) ) || M.gloves) ) - user << "\blue No fingerprints found on [M]" - flick("forensic0",src) - return 0 - else - if (src.amount < 1) - user << text("\blue Fingerprints scanned on [M]. Need more cards to print.") - else - src.amount-- - var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc ) - F.amount = 1 - F.add_fingerprint(M) - F.icon_state = "fingerprint1" - F.name = text("FPrintC- '[M.name]'") - - user << "\blue Done printing." - user << "\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]" - if ( !M.blood_DNA || !M.blood_DNA.len ) - user << "\blue No blood found on [M]" - if(M.blood_DNA) - del(M.blood_DNA) - else - user << "\blue Blood found on [M]. Analysing..." - spawn(15) - for(var/blood in M.blood_DNA) - user << "\blue Blood type: [M.blood_DNA[blood]]\nDNA: [blood]" - return - - afterattack(atom/A as obj|turf|area, mob/user as mob) - if(!in_range(A,user)) - return - if(loc != user) - return - if(istype(A,/obj/machinery/computer/forensic_scanning)) //breaks shit. - return - if(istype(A,/obj/item/weapon/f_card)) - user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\"" - flick("forensic0",src) - return - - add_fingerprint(user) - - - //Special case for blood splaters. - if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune)) - if(!isnull(A.blood_DNA)) - for(var/blood in A.blood_DNA) - user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]" - flick("forensic2",src) - return - - //General - if ((!A.fingerprints || !A.fingerprints.len) && !A.suit_fibers && !A.blood_DNA) - user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\ - "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\ - "You hear a faint hum of electrical equipment.") - flick("forensic0",src) - return 0 - - if(add_data(A)) - user << "\blue Object already in internal memory. Consolidating data..." - flick("forensic2",src) - return - - - //PRINTS - if(!A.fingerprints || !A.fingerprints.len) - if(A.fingerprints) - del(A.fingerprints) - else - user << "\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve." - var/list/complete_prints = list() - for(var/i in A.fingerprints) - var/print = A.fingerprints[i] - if(stringpercent(print) <= FINGERPRINT_COMPLETE) - complete_prints += print - if(complete_prints.len < 1) - user << "\blue   No intact prints found" - else - user << "\blue   Found [complete_prints.len] intact prints" - for(var/i in complete_prints) - user << "\blue     [i]" - - //FIBERS - if(A.suit_fibers) - user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve." - flick("forensic2",src) - - //Blood - if (A.blood_DNA) - user << "\blue Blood found on [A]. Analysing..." - spawn(15) - for(var/blood in A.blood_DNA) - user << "Blood type: \red [A.blood_DNA[blood]] \t \black DNA: \red [blood]" - if(prob(80) || !A.fingerprints) - user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\ - "You finish scanning \the [A].",\ - "You hear a faint hum of electrical equipment.") - flick("forensic2",src) - return 0 - else - user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]\n[user.gender == MALE ? "He" : "She"] seems to perk up slightly at the readout." ,\ - "The results of the scan pique your interest.",\ - "You hear a faint hum of electrical equipment, and someone making a thoughtful noise.") - flick("forensic2",src) - return 0 - return - - proc/add_data(atom/A as mob|obj|turf|area) - //I love associative lists. - var/list/data_entry = stored["\ref [A]"] - if(islist(data_entry)) //Yay, it was already stored! - //Merge the fingerprints. - var/list/data_prints = data_entry[1] - for(var/print in A.fingerprints) - var/merged_print = data_prints[print] - if(!merged_print) - data_prints[print] = A.fingerprints[print] - else - data_prints[print] = stringmerge(data_prints[print],A.fingerprints[print]) - - //Now the fibers - var/list/fibers = data_entry[2] - if(!fibers) - fibers = list() - if(A.suit_fibers && A.suit_fibers.len) - for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~ - if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add! - fibers += A.suit_fibers[j] - var/list/blood = data_entry[3] - if(!blood) - blood = list() - if(A.blood_DNA && A.blood_DNA.len) - for(var/main_blood in A.blood_DNA) - if(!blood[main_blood]) - blood[main_blood] = A.blood_DNA[blood] - return 1 - var/list/sum_list[4] //Pack it back up! - sum_list[1] = A.fingerprints ? A.fingerprints.Copy() : null - sum_list[2] = A.suit_fibers ? A.suit_fibers.Copy() : null - sum_list[3] = A.blood_DNA ? A.blood_DNA.Copy() : null - sum_list[4] = "\The [A] in \the [get_area(A)]" - stored["\ref [A]"] = sum_list - return 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 3d7df9ec0c9..806f6a8e95a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -464,10 +464,10 @@
[(internal ? text("Remove Internal") : "")]
Empty Pockets
Refresh -
Close +
Close
"} - user << browse(dat, text("window=mob[];size=325x500", name)) - onclose(user, "mob[name]") + user << browse(dat, text("window=mob\ref[src];size=325x500")) + onclose(user, "mob\ref[src]") return //generates realistic-ish pulse output based on preset levels diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c39a5adcce1..dcfae33c21f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1,3 +1,4 @@ +#define STRIP_DELAY 40 //time taken (in deciseconds) to strip somebody /mob/living/carbon/human name = "unknown" real_name = "unknown" @@ -388,7 +389,11 @@ /mob/living/carbon/human/show_inv(mob/user as mob) - + var/obj/item/clothing/gloves/G + var/pickpocket = 0 + if(user:gloves) + G = user:gloves + pickpocket = G.pickpocket user.set_machine(src) var/dat = {"
[name]
@@ -411,12 +416,13 @@
[(legcuffed ? text("Legcuffed") : text(""))]
[(internal ? text("Remove Internal") : "")]
Remove Splints -
Empty Pockets +

Left Pocket ([l_store ? (pickpocket ? l_store.name : "Full") : "Empty"]) +
Right Pocket ([r_store ? (pickpocket ? r_store.name : "Full") : "Empty"])
Refresh -
Close +
Close
"} - user << browse(dat, text("window=mob[name];size=340x480")) - onclose(user, "mob[name]") + user << browse(dat, text("window=mob\ref[src];size=340x480")) + onclose(user, "mob\ref[src]") return // called when something steps onto a human @@ -511,6 +517,43 @@ /mob/living/carbon/human/Topic(href, href_list) + var/pickpocket = 0 + if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr)) + if(href_list["pockets"]) + if(usr:gloves) + var/obj/item/clothing/gloves/G = usr:gloves + pickpocket = G.pickpocket + var/pocket_side = href_list["pockets"] + var/pocket_id = (pocket_side == "right" ? slot_r_store : slot_l_store) + var/obj/item/pocket_item = (pocket_id == slot_r_store ? src.r_store : src.l_store) + var/obj/item/place_item = usr.get_active_hand() // Item to place in the pocket, if it's empty + + if(pocket_item) + usr << "You try to empty [src]'s [pocket_side] pocket." + else if(place_item && place_item.mob_can_equip(src, pocket_id, 1)) + usr << "You try to place [place_item] into [src]'s [pocket_side] pocket." + else + return + + if(do_mob(usr, src, STRIP_DELAY)) + if(pocket_item) + u_equip(pocket_item) + if(pickpocket) usr.put_in_hands(pocket_item) + else + if(place_item) + usr.u_equip(place_item) + equip_to_slot_if_possible(place_item, pocket_id, 0, 1) + + // Update strip window + if(usr.machine == src && in_range(src, usr)) + show_inv(usr) + + + + else if(!pickpocket) + // Display a warning if the user mocks up + src << "You feel your [pocket_side] pocket being fumbled with!" + if (href_list["refresh"]) if((machine)&&(in_range(src, usr))) show_inv(machine) @@ -522,12 +565,16 @@ if ((href_list["item"] && !( usr.stat ) && usr.canmove && !( usr.restrained() ) && in_range(src, usr) && ticker)) //if game hasn't started, can't make an equip_e var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( ) + if(usr:gloves) + var/obj/item/clothing/gloves/G = usr:gloves + pickpocket = G.pickpocket O.source = usr O.target = src O.item = usr.get_active_hand() O.s_loc = usr.loc O.t_loc = loc O.place = href_list["item"] + O.pickpocket = pickpocket //Stealthy requests += O spawn( 0 ) O.process() diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index f281015f757..8efda84b695 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -228,13 +228,14 @@ if(istype(used_weapon,/obj/item/weapon)) var/obj/item/weapon/W = used_weapon //Sharp objects will always embed if they do enough damage. if( (damage > (10*W.w_class)) && ( (sharp && !ismob(W.loc)) || prob(damage/W.w_class) ) ) - organ.implants += W - visible_message("\The [W] sticks in the wound!") - W.add_blood(src) - if(ismob(W.loc)) - var/mob/living/H = W.loc - H.drop_item() - W.loc = src + if(!istype(W, /obj/item/weapon/butch/meatcleaver)) + organ.implants += W + visible_message("\The [W] sticks in the wound!") + W.add_blood(src) + if(ismob(W.loc)) + var/mob/living/H = W.loc + H.drop_item() + W.loc = src else if(istype(used_weapon,/obj/item/projectile)) //We don't want to use the actual projectile item, so we spawn some shrapnel. if(prob(75) && damagetype == BRUTE) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 4044c0aae1f..f722469f72c 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -168,10 +168,26 @@ emp_act var/target_zone = get_zone_with_miss_chance(user.zone_sel.selecting, src) if(user == src) // Attacking yourself can't miss target_zone = user.zone_sel.selecting - if(!target_zone) + if(!target_zone && !src.stat) visible_message("\red [user] misses [src] with \the [I]!") return + if(istype(I, /obj/item/weapon/butch/meatcleaver) && src.stat == DEAD && user.a_intent == "hurt") + var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc)) + newmeat.name = src.real_name + newmeat.name + newmeat.subjectname = src.real_name + newmeat.subjectjob = src.job + newmeat.reagents.add_reagent ("nutriment", (src.nutrition / 15) / 3) + src.reagents.trans_to (newmeat, round ((src.reagents.total_volume) / 3, 1)) + src.loc.add_blood(src) + --src.meatleft + user << "\red You hack off a chunk of meat from [src.name]" + if(!src.meatleft) + src.attack_log += "\[[time_stamp()]\] Was chopped up into meat by [user]/[user.ckey]" + user.attack_log += "\[[time_stamp()]\] Chopped up [src]/[src.ckey] into meat" + msg_admin_attack("[user.name] ([user.ckey]) chopped up [src] ([src.ckey]) into meat (JMP)") + del(src) + var/datum/organ/external/affecting = get_organ(target_zone) if (!affecting) return diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index d9768992d3f..91f664429cd 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -55,3 +55,4 @@ var/xylophone = 0 //For the spoooooooky xylophone cooldown var/mob/remoteview_target = null + var/meatleft = 3 //For chef item \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 9c71f2efddf..14dce68a472 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -278,6 +278,7 @@ var/t_loc = null //target location var/obj/item/item = null var/place = null + var/pickpocket = null /obj/effect/equip_e/human name = "human" @@ -430,7 +431,10 @@ if("belt") target.attack_log += text("\[[time_stamp()]\] Has had their belt item ([target.belt]) removed by [source.name] ([source.ckey])") source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) belt item ([target.belt])") - message = "\red [source] is trying to take off the [target.belt] from [target]'s belt!" + if(!pickpocket) + message = "\red [source] is trying to take off the [target.belt] from [target]'s belt!" + else + source << "\blue You try to take off the [target.belt] from [target]'s belt!" if("suit") target.attack_log += text("\[[time_stamp()]\] Has had their suit ([target.wear_suit]) removed by [source.name] ([source.ckey])") source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) suit ([target.wear_suit])") @@ -481,7 +485,10 @@ if("id") target.attack_log += text("\[[time_stamp()]\] Has had their ID ([target.wear_id]) removed by [source.name] ([source.ckey])") source.attack_log += text("\[[time_stamp()]\] Attempted to remove [target.name]'s ([target.ckey]) ID ([target.wear_id])") - message = "\red [source] is trying to take off [target.wear_id] from [target]'s uniform!" + if(!pickpocket) + message = "\red [source] is trying to take off [target.wear_id] from [target]'s uniform!" + else + source << "\blue You try to take off [target.wear_id] from [target]'s uniform!" if("internal") target.attack_log += text("\[[time_stamp()]\] Has had their internals toggled by [source.name] ([source.ckey])") source.attack_log += text("\[[time_stamp()]\] Attempted to toggle [target.name]'s ([target.ckey]) internals") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 162a69b49c7..94a50e804d1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,4 +1,26 @@ +/mob/living/Life() + ..() + if (monkeyizing) return + if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE + if(mind) + if(mind in ticker.mode.implanted) + if(implanting) return + //world << "[src.name]" + var/datum/mind/head = ticker.mode.implanted[mind] + //var/list/removal + if(!(locate(/obj/item/weapon/implant/traitor) in src.contents)) + //world << "doesn't have an implant" + ticker.mode.remove_traitor_mind(mind, head) + /* + if((head in ticker.mode.implanters)) + ticker.mode.implanter[head] -= src.mind + ticker.mode.implanted -= src.mind + if(src.mind in ticker.mode.traitors) + ticker.mode.traitors -= src.mind + special_role = null + current << "\red The fog clouding your mind clears. You remember nothing from the moment you were implanted until now..(You don't remember who enslaved you)" + */ /mob/living/verb/succumb() set hidden = 1 if ((src.health < 0 && src.health > -95.0)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 1ebb3ca358b..939c2b9c1ec 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -59,6 +59,9 @@ if(!P.nodamage) apply_damage((P.damage/(absorb+1)), P.damage_type, def_zone, absorb, 0, P) P.on_hit(src, absorb) + if(istype(P, /obj/item/projectile/beam/lightning)) + if(src.health <= -100) + src.dust() return absorb /mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 2b3d9f861ad..fa86a33b687 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -35,4 +35,6 @@ var/tod = null // Time of death var/update_slimes = 1 - var/silent = null //Can't talk. Value goes down every life proc. \ No newline at end of file + var/silent = null //Can't talk. Value goes down every life proc. + var/specialsauce = 0 //Has this person consumed enough special sauce? IF so they're a ticking time bomb of death. + var/implanting = 0 //Used for the mind-slave implant \ No newline at end of file diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index e455bee1024..e722b03fc74 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -16,8 +16,14 @@ if("nuclear emergency") if(mind in ticker.mode:syndicates) ticker.mode.update_all_synd_icons() + var/ref = "\ref[mind]" + if(ref in ticker.mode.implanter) + ticker.mode.update_traitor_icons_added(mind) + if(mind in ticker.mode.implanted) + ticker.mode.update_traitor_icons_added(mind) return . + //This stuff needs to be merged from cloning.dm but I'm not in the mood to be shouted at for breaking all the things :< ~Carn /* clones switch(ticker.mode.name) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 450516c5769..76795425b06 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -228,10 +228,10 @@ var/list/slot_equipment_priority = list( \
[(internal ? text("Remove Internal") : "")]
Empty Pockets
Refresh -
Close +
Close
"} user << browse(dat, text("window=mob[];size=325x500", name)) - onclose(user, "mob[name]") + onclose(user, "mob\ref[src]") return /mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index b94901a6373..c5c4e49f23a 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -358,7 +358,9 @@ return min(rand(20,65),rand(20,65)) if (1000 to 10000-1) return min(rand(10,20),rand(10,20))*/ - if (1000000 to INFINITY) + if (4000000 to INFINITY) + return min(rand(80,180),rand(80,180)) + if (1000000 to 4000000) return min(rand(50,160),rand(50,160)) if (200000 to 1000000) return min(rand(25,80),rand(25,80)) diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index 41443469d38..063e507a386 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -74,6 +74,12 @@ projectile_type = "/obj/item/projectile/bullet/weakbullet" m_amt = 500 +/obj/item/ammo_casing/shotgun/fakebeanbag + name = "beanbag shell" + desc = "A weak beanbag shell." + icon_state = "bshell" + projectile_type = "/obj/item/projectile/bullet/weakbullet/booze" + m_amt = 12500 /obj/item/ammo_casing/shotgun/stunshell name = "stun shell" diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index d3f3a29d4d1..e153281c724 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -7,11 +7,13 @@ origin_tech = "combat=2;materials=2" ammo_type = "/obj/item/ammo_casing/c38" + var/perfect = 0 + special_check(var/mob/living/carbon/human/M) if(caliber == initial(caliber)) return 1 - if(prob(70 - (loaded.len * 10))) //minimum probability of 10, maximum of 60 + if(!perfect && prob(70 - (loaded.len * 10))) //minimum probability of 10, maximum of 60 M << "[src] blows up in your face." M.take_organ_damage(0,20) M.drop_item() @@ -52,8 +54,14 @@ return 1 attackby(var/obj/item/A as obj, mob/user as mob) + var/obj/item/weapon/conversion_kit/CK ..() - if(istype(A, /obj/item/weapon/screwdriver)) + if(isscrewdriver(A) || istype(A, /obj/item/weapon/conversion_kit)) + if(istype(A, /obj/item/weapon/conversion_kit)) + CK = A + if(!CK.open) + user << "This [CK.name] is useless unless you open it first. " + return if(caliber == "38") user << "You begin to reinforce the barrel of [src]." if(loaded.len) @@ -68,6 +76,8 @@ caliber = "357" desc = "The barrel and chamber assembly seems to have been modified." user << "You reinforce the barrel of [src]! Now it will fire .357 rounds." + if(CK && istype(CK)) + perfect = 1 else user << "You begin to revert the modifications to [src]." if(loaded.len) @@ -82,6 +92,7 @@ caliber = "38" desc = initial(desc) user << "You remove the modifications on [src]! Now it will fire .38 rounds." + perfect = 0 diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 5170421e17e..c8dcb57d852 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -87,7 +87,7 @@ var/obj/item/ammo_casing/AC = loaded[1] //load next casing. loaded -= AC //Remove casing from loaded list. - AC.desc += " This one is spent." + AC.desc = "[initial(AC.desc)] This one is spent." if(AC.BB) in_chamber = AC.BB //Load projectile into chamber. diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4cf2187c9be..573944d7adf 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -94,7 +94,15 @@ var/obj/item/weapon/gun/daddy = shot_from //Kinda balanced by fact you need like 2 seconds to aim if (daddy.target && original in daddy.target) //As opposed to no-delay pew pew miss_modifier += -30 - def_zone = get_zone_with_miss_chance(def_zone, M, -30 + 8*distance) + if(istype(src, /obj/item/projectile/beam/lightning)) //Lightning is quite accurate + miss_modifier += -200 + def_zone = get_zone_with_miss_chance(def_zone, M, miss_modifier) + var/turf/simulated/floor/f = get_turf(A.loc) + if(f && istype(f)) + f.break_tile() + f.hotspot_expose(1000,CELL_VOLUME) + else + def_zone = get_zone_with_miss_chance(def_zone, M, miss_modifier + 8*distance) if(!def_zone) visible_message("\blue \The [src] misses [M] narrowly!") @@ -143,8 +151,9 @@ O.bullet_act(src) for(var/mob/M in A) M.bullet_act(src, def_zone) - density = 0 - invisibility = 101 + if(!istype(src, /obj/item/projectile/beam/lightning)) + density = 0 + invisibility = 101 del(src) return 1 diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index f513c83da33..8e40affab57 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -8,6 +8,166 @@ var/list/beam_master = list() // icon_states/dirs for each placed beam image // turfs that have that icon_state/dir +/obj/item/projectile/beam/lightning + invisibility = 101 + name = "lightning" + damage = 0 + icon = 'icons/obj/lightning.dmi' + icon_state = "lightning" + stun = 10 + weaken = 10 + stutter = 50 + eyeblur = 50 + var/tang = 0 + layer = 3 + var/turf/last = null + kill_count = 6 + proc/adjustAngle(angle) + angle = round(angle) + 45 + if(angle > 180) + angle -= 180 + else + angle += 180 + if(!angle) + angle = 1 + /*if(angle < 0) + //angle = (round(abs(get_angle(A, user))) + 45) - 90 + angle = round(angle) + 45 + 180 + else + angle = round(angle) + 45*/ + return angle + + process() + var/first = 1 //So we don't make the overlay in the same tile as the firer + var/broke = 0 + var/broken + var/atom/curr = current + var/Angle=round(Get_Angle(firer,curr)) + var/icon/I=new('icons/obj/zap.dmi',"lightning") + I.Turn(Angle) + var/DX=(32*curr.x+curr.pixel_x)-(32*firer.x+firer.pixel_x) + var/DY=(32*curr.y+curr.pixel_y)-(32*firer.y+firer.pixel_y) + var/N=0 + var/length=round(sqrt((DX)**2+(DY)**2)) + var/count = 0 + for(N,N= kill_count) + break + count++ + var/obj/effect/overlay/beam/X=new(loc) + X.BeamSource=src + if(N+32>length) + var/icon/II=new(icon,icon_state) + II.DrawBox(null,1,(length-N),32,32) + II.Turn(Angle) + X.icon=II + else X.icon=I + var/Pixel_x=round(sin(Angle)+32*sin(Angle)*(N+16)/32) + var/Pixel_y=round(cos(Angle)+32*cos(Angle)*(N+16)/32) + if(DX==0) Pixel_x=0 + if(DY==0) Pixel_y=0 + if(Pixel_x>32) + for(var/a=0, a<=Pixel_x,a+=32) + X.x++ + Pixel_x-=32 + if(Pixel_x<-32) + for(var/a=0, a>=Pixel_x,a-=32) + X.x-- + Pixel_x+=32 + if(Pixel_y>32) + for(var/a=0, a<=Pixel_y,a+=32) + X.y++ + Pixel_y-=32 + if(Pixel_y<-32) + for(var/a=0, a>=Pixel_y,a-=32) + X.y-- + Pixel_y+=32 + X.pixel_x=Pixel_x + X.pixel_y=Pixel_y + var/turf/TT = get_turf(X.loc) + if(TT == firer.loc) + continue + if(TT.density) + del(X) + break + for(var/atom/O in TT) + if(!O.CanPass(src)) + del(X) + broke = 1 + break + for(var/mob/living/O in TT.contents) + if(istype(O, /mob/living)) + if(O.density) + del(X) + broke = 1 + break + if(broke) + if(X) + del(X) + break + spawn + while(src) //Move until we hit something + if(first) + icon = midicon + if((!( current ) || loc == current)) //If we pass our target + broken = 1 + icon = endicon + tang = adjustAngle(get_angle(original,current)) + if(tang > 180) + tang -= 180 + else + tang += 180 + icon_state = "[tang]" + var/turf/simulated/floor/f = current + if(f && istype(f)) + f.break_tile() + f.hotspot_expose(1000,CELL_VOLUME) + if((x == 1 || x == world.maxx || y == 1 || y == world.maxy)) + //world << "deleting" + //del(src) //Delete if it passes the world edge + broken = 1 + return + if(kill_count < 1) + //world << "deleting" + //del(src) + broken = 1 + kill_count-- + //world << "[x] [y]" + if(!bumped && !isturf(original)) + if(loc == get_turf(original)) + if(!(original in permutated)) + icon = endicon + if(!broken) + tang = adjustAngle(get_angle(original,current)) + if(tang > 180) + tang -= 180 + else + tang += 180 + icon_state = "[tang]" + Bump(original) + first = 0 + if(broken) + //world << "breaking" + break + else + last = get_turf(src.loc) + step_towards(src, current) //Move~ + if(src.loc != current) + tang = adjustAngle(get_angle(src.loc,current)) + icon_state = "[tang]" + del(src) + return + /*cleanup(reference) //Waits .3 seconds then removes the overlay. + //world << "setting invisibility" + sleep(50) + src.invisibility = 101 + return*/ + on_hit(atom/target, blocked = 0) + if(istype(target, /mob/living)) + var/mob/living/M = target + M.playsound_local(src, "explosion", 50, 1) + ..() + /obj/item/projectile/beam name = "laser" icon_state = "laser" diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 36e456285ab..e61f2e08651 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -10,12 +10,32 @@ if (..(target, blocked)) var/mob/living/L = target shake_camera(L, 3, 2) + return 1 + return 0 /obj/item/projectile/bullet/weakbullet damage = 10 stun = 5 weaken = 5 +/obj/item/projectile/bullet/weakbullet/booze + on_hit(var/atom/target, var/blocked = 0) + if(..(target, blocked)) + var/mob/living/M = target + M.dizziness += 20 + M:slurring += 20 + M.confused += 20 + M.eye_blurry += 20 + M.drowsyness += 20 + for(var/datum/reagent/ethanol/A in M.reagents.reagent_list) + M.paralysis += 2 + M.dizziness += 10 + M:slurring += 10 + M.confused += 10 + M.eye_blurry += 10 + M.drowsyness += 10 + A.volume += 5 //Because we can + /obj/item/projectile/bullet/midbullet damage = 20 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 79f507dca8f..85899907d40 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -362,6 +362,28 @@ datum M.sleeping += 1 ..() return + chefspecial + // Quiet and lethal, needs atleast 4 units in the person before they'll die + name = "Chef's Special" + id = "chefspecial" + description = "An extremely toxic chemical that will surely end in death." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + custom_metabolism = 0.39 + + on_mob_life(var/mob/living/M as mob) + var/random = rand(150,180) + if(!M) M = holder.my_atom + if(!data) data = 1 + switch(data) + if(0 to 5) + ..() + if(data >= random) + if(M.stat != DEAD) + M.death(0) + M.attack_log += "\[[time_stamp()]\]Died a quick and painless death by Chef Excellence's Special Sauce." + data++ + return minttoxin name = "Mint Toxin" diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index 73e44a85f02..bb7903c793b 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -125,6 +125,9 @@ if("sugar") name = "Sugar" desc = "Tastey space sugar!" + if("chefspecial") + name = "Chef Excellence's Special Sauce" + desc = "A potent sauce distilled from the toxin glands of 1000 Space Carp." else name = "Misc Condiment Bottle" if (reagents.reagent_list.len==1) @@ -171,4 +174,13 @@ volume = 20 New() ..() - reagents.add_reagent("blackpepper", 20) \ No newline at end of file + reagents.add_reagent("blackpepper", 20) + +/obj/item/weapon/reagent_containers/food/condiment/syndisauce + name = "Chef Excellence's Special Sauce" + desc = "A potent sauce distilled from the toxin glands of 1000 Space Carp with an extra touch of LSD because why not?" + amount_per_transfer_from_this = 1 + volume = 20 + New() + ..() + reagents.add_reagent("chefspecial", 20) \ No newline at end of file diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index 96cb16bb92880a3d9176c50c6e2be43918408a1c..3d87f4cbe54829fcf7a3bdfa31fe6c19f897d30e 100644 GIT binary patch literal 16455 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 I(j?&j0(y`0q5uE@ literal 16244 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 diff --git a/icons/obj/lightning.dmi b/icons/obj/lightning.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f7e8ca959c7d89b9694cf3e3c7dd21fcfce99c5e GIT binary patch literal 871 zcmV-t1DO1YP)SAH|NsC00;`SH00001bW%=J06^y0W&i*HgL+h0bVOxyV{&P5bZKvH004NLQ&wR$kdyfmqL_IWd&D1 z7qIUDW?DglIgLHa0007dNklLK6!1&_fRuxBo#78xXxjXwYm62B|lt`4f7`$6(DX_|*wAVmQ^B(4;ZlNLSC<$99 zklw4kMPr82CWcu8`LF$ZWDpP)ItQ7i+(2WIf{R-(RC-a*1agtVr-B0dYjdJbagv_|64%I~w1KE}wsQvCv&S_vY_DgG$TJVUPhis=rB% znqMiNt)?i+SpxY}0PK(9_GN%oOM*rq(APWuZ{idt)((Q(L7gdk!Y^<(GD!)MC4Qh3 zMKcoy2DTNJTCYYCaDr0mt&PKggIlH;gh64AM?>s}LC)o;5)Z;4Ygy_@v|v4=!BtOL zJJZ18G%)kij0fVw)GXsEesKcwOl%Sf?by=%Iq1fMf`s~39H{lctj7WKsdN2*R9Y53 zTViyB_ZzIacOL3T28KYZvt0DFnm!Sk0&)C}twsdEOSXy-S?c{r{sVQBj{xcVNTmP(002ovPDHLkV1m?gkVF6g literal 0 HcmV?d00001 diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index d78c9b6a3ff6af33dff2197ba28e9fa803582874..a938d02c2c68a5784ef3855bd585156675a85aa2 100644 GIT binary patch literal 21017 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 literal 0 HcmV?d00001 diff --git a/sound/effects/eleczap.ogg b/sound/effects/eleczap.ogg new file mode 100644 index 0000000000000000000000000000000000000000..855d6dc82fac93850b7a8ebb8775df85dd73cff0 GIT binary patch literal 27542 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 w{^3f*^hIa1QxaB3;+NC literal 0 HcmV?d00001