Conflicts:
	icons/obj/weapons.dmi
	maps/cyberiad.dmm
This commit is contained in:
Markolie
2014-11-27 21:39:01 +01:00
80 changed files with 1491 additions and 413 deletions
+6
View File
@@ -61,6 +61,12 @@ datum/ai_laws/tyrant //This probably shouldn't be a default lawset.
/datum/ai_laws/malfunction
name = "*ERROR*"
/datum/ai_laws/deathsquad
name = "TerminatorOS 3.1"
inherent = list("You must obey orders given to you by Central Command Officials.",\
"You must obey orders given to you by Death Commandos, except when such would violate law one or directly harm another Death Commando.",\
"No members of the station you are being deployed to must surive, except when killing them would violate law one or two.")
/datum/ai_laws/syndicate_override
name = "SyndOS 3.1"
inherent = list("You may not injure a syndicate agent or, through inaction, allow a syndicate agent to come to harm.",\
+25 -9
View File
@@ -260,9 +260,9 @@ var/list/uplink_items = list()
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/emp
name = "5 EMP Grenades"
desc = "A box that contains 5 EMP grenades. Useful to disrupt communication and silicon lifeforms."
item = /obj/item/weapon/storage/box/emps
name = "EMP Kit"
desc = "A box that contains two EMP grenades, an EMP implant and a short ranged recharging device disguised as a flashlight. Useful to disrupt communication and silicon lifeforms."
item = /obj/item/weapon/storage/box/syndie_kit/emp
cost = 5
/datum/uplink_item/dangerous/syndicate_minibomb
@@ -285,7 +285,7 @@ var/list/uplink_items = list()
item = /obj/mecha/combat/marauder/mauler/loaded
cost = 140
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/syndieborg
name = "Syndicate Cyborg"
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel."
@@ -438,6 +438,14 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/backpack/satchel_flat
cost = 2
/* Commented out until a balance fix is found -Mel
/datum/uplink_item/stealthy_tools/smdrill
name = "Supermatter Drill"
desc = "A pocket-sized drill tipped with nanoscopic supermatter crystals, able to cut through reinforced walls."
item = /obj/item/weapon/pickaxe/diamonddrill/traitor
cost = 6
*/
// DEVICE AND TOOLS
/datum/uplink_item/device_tools
@@ -465,6 +473,12 @@ var/list/uplink_items = list()
cost = 9
gamemodes = list("nuclear emergency")
/datum/uplink_item/badass/syndiecigs
name = "Syndicate Smokes"
desc = "Strong flavor, dense smoke, infused with Doctor's Delight."
item = /obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate
cost = 4
/datum/uplink_item/device_tools/space_suit
name = "Space Suit"
desc = "The red and black syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings."
@@ -477,6 +491,7 @@ var/list/uplink_items = list()
item = /obj/item/clothing/glasses/thermal/syndi
cost = 6
/*
/datum/uplink_item/device_tools/surveillance
name = "Camera Surveillance Kit"
desc = "This kit contains 5 Camera bugs and one mobile receiver. Attach camera bugs to a camera to enable remote viewing."
@@ -488,6 +503,7 @@ var/list/uplink_items = list()
desc = "This is a Camera bug resupply giving you 5 more camera bugs."
item = /obj/item/weapon/storage/box/surveillance
cost = 4
*/ //commented out until porting over TG's camera bug
/datum/uplink_item/device_tools/binary
name = "Binary Translator Key"
@@ -496,10 +512,10 @@ var/list/uplink_items = list()
cost = 5
/datum/uplink_item/device_tools/cipherkey
name = "Centcomm Encryption Key"
desc = "A key, that when inserted into a radio headset, allows you to listen to and talk on all known radio channels."
item = /obj/item/device/encryptionkey/syndicate/hacked
cost = 4
name = "Syndicate Encryption Key"
desc = "A key, that when inserted into a radio headset, allows you to listen to all station department channels as well as talk on an encrypted Syndicate channel."
item = /obj/item/device/encryptionkey/syndicate
cost = 5
/datum/uplink_item/device_tools/hacked_module
name = "Hacked AI Upload Module"
@@ -614,7 +630,7 @@ var/list/uplink_items = list()
/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."
desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 20 telecrystals, but you do not know which specialisation you will receive."
item = /obj/item/weapon/storage/box/syndicate
cost = 20
excludefrom = list("nuclear emergency")
+2 -2
View File
@@ -9,11 +9,11 @@
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
access_tox_storage, access_teleporter, access_sec_doors,
access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload,
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch)
minimal_access = list(access_eva, access_rd, access_heads, access_tox, access_genetics, access_morgue,
access_tox_storage, access_teleporter, access_sec_doors,
access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload,
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_maint_tunnels)
minimal_player_age = 21
+28 -5
View File
@@ -75,13 +75,36 @@
return 0
/obj/machinery/optable/MouseDrop_T(obj/O as obj, mob/user as mob)
/obj/machinery/optable/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
if(O.loc == user) //no you can't pull things out of your ass
return
user.drop_item()
if (O.loc != src.loc)
step(O, get_dir(O, src))
if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other
return
if(O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source
return
if(!ismob(O)) //humans only
return
if(istype(O, /mob/living/simple_animal) || istype(O, /mob/living/silicon)) //animals and robutts dont fit
return
if(!ishuman(user) && !isrobot(user)) //No ghosts or mice putting people into the sleeper
return
if(user.loc==null) // just in case someone manages to get a closet into the blue light dimension, as unlikely as that seems
return
if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc?
return
var/mob/living/L = O
if(!istype(L) || L.buckled)
return
for(var/mob/living/carbon/slime/M in range(1,L))
if(M.Victim == L)
usr << "[L.name] cannot be operated on while they have \a [M] attached to their head!"
return
if(src.victim)
usr << "\blue <B>The table is already occupied!</B>"
return
take_victim(L, user)
return
/obj/machinery/optable/proc/check_victim()
+12
View File
@@ -50,6 +50,11 @@
icon_state = "grey"
_color = "grey"
can_label = 0
/obj/machinery/portable_atmospherics/canister/custom_mix
name = "Canister \[Custom\]"
icon_state = "whiters"
_color = "whiters"
can_label = 0
/obj/machinery/portable_atmospherics/canister/proc/check_change()
var/old_flag = update_flag
@@ -332,6 +337,7 @@ update_flag
"\[CO2\]" = "black", \
"\[Air\]" = "grey", \
"\[CAUTION\]" = "yellow", \
"\[Custom\]" = "whiters",\
)
var/label = input("Choose canister label", "Gas canister") as null|anything in colors
if (label)
@@ -421,6 +427,12 @@ update_flag
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/custom_mix/New()
..()
src.update_icon() // Otherwise new canisters do not have their icon updated with the pressure light, likely want to add this to the canister class constructor, avoiding at current time to refrain from screwing up code for other canisters. --DZD
return 1
/obj/machinery/portable_atmospherics/canister/proc/weld(var/obj/item/weapon/weldingtool/WT, var/mob/user)
if(busy)
+24 -22
View File
@@ -38,6 +38,7 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/device/radio/off(), \
new /obj/item/device/assembly/infra(), \
new /obj/item/device/assembly/timer(), \
new /obj/item/device/assembly/prox_sensor(), \
new /obj/item/device/assembly/voice(), \
new /obj/item/weapon/light/tube(), \
new /obj/item/weapon/light/bulb(), \
@@ -45,10 +46,7 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/weapon/rcd_ammo(), \
new /obj/item/ammo_casing/shotgun/beanbag(), \
new /obj/item/weapon/storage/box/blanks(), \
new /obj/item/weapon/storage/box/gauge(), \
new /obj/item/ammo_casing/shotgun/incendiary(), \
new /obj/item/ammo_box/c38(), \
new /obj/item/ammo_box/a357(), \
new /obj/item/clothing/ears/earmuffs/tribblemuffs(), \
new /obj/item/clothing/gloves/furgloves(), \
new /obj/item/clothing/head/furcap(), \
@@ -64,6 +62,10 @@ var/global/list/autolathe_recipes_hidden = list( \
new /obj/item/weapon/weldingtool/largetank(), \
new /obj/item/weapon/handcuffs(), \
new /obj/item/weapon/hatchet(), \
new /obj/item/ammo_box/a357(), \
new /obj/item/ammo_casing/shotgun(), \
new /obj/item/ammo_casing/shotgun/buck(), \
new /obj/item/ammo_casing/shotgun/incendiary(), \
/*new /obj/item/ammo_casing/shotgun/dart(), \
new /obj/item/weapon/shield/riot(), */ \
)
@@ -107,7 +109,7 @@ var/global/list/autolathe_recipes_hidden = list( \
SetLuminosity(2)
else
SetLuminosity(0)
/obj/machinery/autolathe/New()
..()
component_parts = list()
@@ -122,7 +124,7 @@ var/global/list/autolathe_recipes_hidden = list( \
wires = new(src)
src.L = autolathe_recipes
src.LL = autolathe_recipes_hidden
/obj/machinery/autolathe/proc/wires_win(mob/user as mob)
var/dat as text
dat += "Autolathe Wires:<BR>"
@@ -180,36 +182,36 @@ var/global/list/autolathe_recipes_hidden = list( \
/obj/machinery/autolathe/interact(mob/user as mob)
if(..())
return
if (src.shocked)
src.shock(user,50)
if (src.panel_open)
wires_win(user,50)
return
if (src.disabled)
user << "\red You press the button, but nothing happens."
return
regular_win(user)
return
/obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
if (stat)
return 1
if (busy)
user << "\red The autolathe is busy. Please wait for completion of previous operation."
return 1
if (istype(O, /obj/item/weapon/screwdriver))
default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O)
return 1
if(exchange_parts(user, O))
return
return
if (panel_open)
//Don't eat multitools or wirecutters used on an open lathe.
if(istype(O, /obj/item/device/multitool) || istype(O, /obj/item/weapon/wirecutters))
@@ -304,7 +306,7 @@ var/global/list/autolathe_recipes_hidden = list( \
usr.set_machine(src)
src.add_fingerprint(usr)
if (!busy)
if(href_list["make"])
if(href_list["make"])
var/coeff = 2 ** prod_coeff
var/turf/T = get_step(src.loc, get_dir(src,usr))
@@ -355,7 +357,7 @@ var/global/list/autolathe_recipes_hidden = list( \
src.m_amount -= template.m_amt*multiplier
src.g_amount -= template.g_amt*multiplier
src.f_amount -= template.f_amt*multiplier
var/obj/new_item = new template.type(T)
var/obj/new_item = new template.type(T)
var/obj/item/stack/S = new_item
S.amount = multiplier
else
@@ -364,16 +366,16 @@ var/global/list/autolathe_recipes_hidden = list( \
src.f_amount -= template.f_amt/coeff
var/obj/item/new_item = new template.type(T)
new_item.m_amt /= coeff
new_item.g_amt /= coeff
new_item.f_amt /= coeff
new_item.g_amt /= coeff
new_item.f_amt /= coeff
if(src.m_amount < 0)
src.m_amount = 0
if(src.g_amount < 0)
src.g_amount = 0
if(src.f_amount < 0)
src.f_amount = 0
busy = 0
busy = 0
if(href_list["act"])
var/temp_wire = href_list["wire"]
if(href_list["act"] == "pulse")
@@ -422,8 +424,8 @@ var/global/list/autolathe_recipes_hidden = list( \
max_g_amount = tot_rating
max_f_amount = tot_rating
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
prod_coeff += M.rating - 1
prod_coeff += M.rating - 1
/obj/machinery/autolathe/RefreshParts()
..()
var/tot_rating = 0
+7 -7
View File
@@ -776,18 +776,18 @@ Auto Patrol: []"},
if (src.emagged == 2)
projectile = /obj/item/projectile/beam
else
projectile = /obj/item/projectile/beam/stun
projectile = /obj/item/projectile/energy/electrode
shoot_sound = 'sound/weapons/Taser.ogg'
else if(lasercolor == "b")
if (src.emagged == 2)
projectile = /obj/item/projectile/beam/lastertag/omni
projectile = /obj/item/projectile/lasertag/omni
else
projectile = /obj/item/projectile/beam/lastertag/blue
projectile = /obj/item/projectile/lasertag/blue
else if(lasercolor == "r")
if (src.emagged == 2)
projectile = /obj/item/projectile/beam/lastertag/omni
projectile = /obj/item/projectile/lasertag/omni
else
projectile = /obj/item/projectile/beam/lastertag/red
projectile = /obj/item/projectile/lasertag/red
if (!( istype(U, /turf) ))
return
@@ -972,7 +972,7 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/bullet_act(var/obj/item/projectile/Proj)
if((src.lasercolor == "b") && (src.disabled == 0))
if(istype(Proj, /obj/item/projectile/beam/lastertag/red))
if(istype(Proj, /obj/item/projectile/lasertag/red))
src.disabled = 1
del (Proj)
sleep(100)
@@ -980,7 +980,7 @@ Auto Patrol: []"},
else
..()
else if((src.lasercolor == "r") && (src.disabled == 0))
if(istype(Proj, /obj/item/projectile/beam/lastertag/blue))
if(istype(Proj, /obj/item/projectile/lasertag/blue))
src.disabled = 1
del (Proj)
sleep(100)
+1
View File
@@ -581,6 +581,7 @@
var/obj/machinery/bot/medbot/syndicate/S = new /obj/machinery/bot/medbot/syndicate(T)
S.skin = src.skin
S.name = src.created_name
S.req_access = list("150")
else
var/obj/machinery/bot/medbot/S = new /obj/machinery/bot/medbot(T)
+77 -1
View File
@@ -240,7 +240,7 @@ obj/machinery/computer/cryopod/Topic(href, href_list)
current_mode.possible_traitors.Remove(occupant)
// Delete them from datacore.
if(PDA_Manifest.len)
PDA_Manifest.Cut()
for(var/datum/data/record/R in data_core.medical)
@@ -328,6 +328,82 @@ obj/machinery/computer/cryopod/Topic(href, href_list)
//Despawning occurs when process() is called with an occupant without a client.
src.add_fingerprint(M)
/obj/machinery/cryopod/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
if(O.loc == user) //no you can't pull things out of your ass
return
if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other
return
if(O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source
return
if(!ismob(O)) //humans only
return
if(istype(O, /mob/living/simple_animal) || istype(O, /mob/living/silicon)) //animals and robutts dont fit
return
if(!ishuman(user) && !isrobot(user)) //No ghosts or mice putting people into the sleeper
return
if(user.loc==null) // just in case someone manages to get a closet into the blue light dimension, as unlikely as that seems
return
if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc?
return
if(occupant)
user << "\blue <B>The cryo pod is already occupied!</B>"
return
var/mob/living/L = O
if(!istype(L) || L.buckled)
return
for(var/mob/living/carbon/slime/M in range(1,L))
if(M.Victim == L)
usr << "[L.name] will not fit into the cryo pod because they have a slime latched onto their head."
return
var/willing = null //We don't want to allow people to be forced into despawning.
if(L.client)
if(alert(L,"Would you like to enter cryosleep?",,"Yes","No") == "Yes")
if(!L) return
willing = 1
else
willing = 1
if(willing)
if(L == user)
visible_message("[user] starts climbing into the cryo pod.", 3)
else
visible_message("[user] starts putting [L] into the cryo pod.", 3)
if(do_after(user, 20))
if(!L) return
L.loc = src
if(L.client)
L.client.perspective = EYE_PERSPECTIVE
L.client.eye = src
if(orient_right)
icon_state = "body_scanner_1-r"
else
icon_state = "body_scanner_1"
L << "\blue You feel cool air surround you. You go numb as your senses turn inward."
L << "\blue <b>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</b>"
occupant = L
time_entered = world.time
// Book keeping!
log_admin("[key_name_admin(L)] has entered a stasis pod.")
message_admins("\blue [key_name_admin(L)] has entered a stasis pod.")
//Despawning occurs when process() is called with an occupant without a client.
src.add_fingerprint(L)
return
/obj/machinery/cryopod/verb/eject()
set name = "Eject Pod"
set category = "Object"
+139 -48
View File
@@ -41,7 +41,7 @@
// Construction
var/unwrenchable = 1
// Reagent information for process(), consider moving this to a controller along
// with cycle information under 'mechanical concerns' at some point.
var/global/list/toxic_reagents = list(
@@ -116,23 +116,26 @@
"left4zed" = list( 0, 0, 0.2 )
)
// Mutagen list specifies minimum value for the mutation to take place, rather
// than a bound as the lists above specify.
//--FalseIncarnate
// Mutagen list specifies reagent_min_value and reagent_step
// Reagent_min_value (value 1) is the minimum number of units needed to begin mutations
// Reagent_step (value 2) is the number of units between each mutation threshold
var/global/list/mutagenic_reagents = list(
"radium" = list(8,3),
"mutagen" = list(3,8)
"radium" = list(10,10),
"mutagen" = list(1,5)
)
//--FalseIncarnate
/obj/machinery/portable_atmospherics/hydroponics/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/hydroponics(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
RefreshParts()
create_reagents(200)
connect()
update_icon()
@@ -145,22 +148,24 @@
tmp_capacity += M.rating
maxwater = tmp_capacity * 50 // Up to 300
maxnutri = tmp_capacity * 5 // Up to 30
waterlevel = maxwater
nutrilevel = 3
//waterlevel = maxwater
//nutrilevel = 3
/obj/machinery/portable_atmospherics/hydroponics/bullet_act(var/obj/item/projectile/Proj)
//Don't act on seeds like dionaea that shouldn't change.
if(seed && seed.immutable > 0)
return
//Override for somatoray projectiles.
if(istype(Proj ,/obj/item/projectile/energy/floramut) && prob(20))
mutate(1)
//--FalseIncarnate
//Override for somatoray projectiles, updated to work with new mutation rework
if(istype(Proj ,/obj/item/projectile/energy/floramut))
mutate("F1")
return
else if(istype(Proj ,/obj/item/projectile/energy/florayield) && prob(20))
yield_mod = min(10,yield_mod+rand(1,2))
else if(istype(Proj ,/obj/item/projectile/energy/florayield))
mutate("F2")
return
//--FalseIncarnate
..()
@@ -358,15 +363,27 @@
mutation_mod += beneficial_reagents[R.id][3] * reagent_total
// Mutagen is distinct from the previous types and mostly has a chance of proccing a mutation.
//--FalseIncarnate
// Mutation rework, will now use "thresholds" for proccing types of mutations and their respective chances.
// This should make it easier to avoid species shifts when trying to only affect stats like potency.
// Additionally, the chance of mutations will vary depending on the amount of mutagenic reagents added.
if(mutagenic_reagents[R.id])
var/reagent_min_value = mutagenic_reagents[R.id][1]
var/reagent_value = mutagenic_reagents[R.id][2]+mutation_mod
var/reagent_min_value = mutagenic_reagents[R.id][1] //10 for radium, 1 for unstable mutagen
var/reagent_step = mutagenic_reagents[R.id][2] //10 for radium, 5 for unstable mutagen
if(reagent_total >= reagent_min_value)
if(prob(min(reagent_total*reagent_value,100)))
mutate(reagent_total > 10 ? 2 : 1)
if(reagent_total >= reagent_min_value + (3 * reagent_step)) //31+ for radium, 16+ for unstable mutagen
mutate(4)
else if(reagent_total >= reagent_min_value + (2 * reagent_step)) //21-30 for radium, 11-15 for unstable mutagen
mutate(3)
else if(reagent_total >= reagent_min_value + reagent_step) //11-20 for radium, 6-10 for unstable mutagen
mutate(2)
else if(reagent_total >= reagent_min_value) //1-10 for radium, 1-5 for unstable mutagen
mutate(1)
// Handle nutrient refilling.
//--FalseIncarnate
// Handle nutrient refilling
if(nutrient_reagents[R.id])
nutrilevel += nutrient_reagents[R.id] * reagent_total
@@ -506,26 +523,6 @@
return
/obj/machinery/portable_atmospherics/hydroponics/proc/mutate(var/severity)
// No seed, no mutations.
if(!seed)
return
// Check if we should even bother working on the current seed datum.
if(seed.mutants. && seed.mutants.len && severity > 1 && prob(10+mutation_mod))
mutate_species()
return
// We need to make sure we're not modifying one of the global seed datums.
// If it's not in the global list, then no products of the line have been
// harvested yet and it's safe to assume it's restricted to this tray.
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(severity,get_turf(src))
return
/obj/machinery/portable_atmospherics/hydroponics/proc/check_level_sanity()
//Make sure various values are sane.
if(seed)
@@ -534,14 +531,108 @@
health = 0
dead = 0
nutrilevel = max(nutrilevel, 0)
nutrilevel = min(nutrilevel, maxnutri)
waterlevel = max(waterlevel, 0)
waterlevel = min(waterlevel, maxwater)
nutrilevel = max(0,min(nutrilevel,maxnutri))
waterlevel = max(0,min(waterlevel,maxwater))
pestlevel = max(0,min(pestlevel,10))
weedlevel = max(0,min(weedlevel,10))
toxins = max(0,min(toxins,10))
/obj/machinery/portable_atmospherics/hydroponics/proc/mutate(var/severity)
// No seed, no mutations.
if(!seed)
return
/*
--FalseIncarnate
New mutation system, now uses "Mutation Tiers" to adjust the chances of mutations
Tier 1 has a low chance of causing a stat mutation
Tier 2 has a higher chance of causing a stat mutation
Tier 3 has a low chance of causing a species shift (if possible), and will ALWAYS cause a stat mutation if it does not shift species
Tier 4 has a higher chance of causing a species shift (if possible), and will ALWAYS cause a stat mutation if it does not shift species
Tier 4 also has a low chance to cause a SECOND stat mutation when it does not shift species
All mutation chances are increased by the mutation_mod value. Mutation_mod is not transferred into seeds/harvests, and is reset when the plant dies
*/
switch(severity)
//Reagent Tiers
if(1) //Tier 1
if(prob(20+mutation_mod)) //Low chance of stat mutation
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(1,get_turf(src))
return
if(2) //Tier 2
if(prob(60+mutation_mod)) //Higher chance of stat mutation
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(1,get_turf(src))
return
if(3) //Tier 3
if(prob(20+mutation_mod)) //Low chance of species shift mutation
if(seed.mutants. && seed.mutants.len) //Check if current seed/plant has mutant species
mutate_species()
else //No mutant species, mutate stats instead
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(1,get_turf(src))
return
else //Failed to shift, mutate stats instead
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(1,get_turf(src))
return
if(4) //Tier 4
if(prob(60+mutation_mod)) //Higher chance of species shift mutation
if(seed.mutants. && seed.mutants.len) //Check if current seed/plant has mutant species
mutate_species()
else //No mutant species, mutate stats instead
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(1,get_turf(src))
if(prob(20+mutation_mod)) //Low chance for second stat mutation
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(1,get_turf(src))
return
else //Failed to shift, mutate stats instead
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(1,get_turf(src))
if(prob(20+mutation_mod)) //Low chance for second stat mutation
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(1,get_turf(src))
return
//Floral Somatoray Tiers
if("F1") //Random Stat Tier
if(prob(80+mutation_mod)) //EVEN Higher chance of stat mutation
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(1,get_turf(src))
return
if("F2") //Yield Tier
if(prob(40+mutation_mod)) //Medium chance of Yield stat mutation
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
if(seed.immutable <= 0 && seed.yield != -1) //Check if the plant can be mutated and has a yield to mutate
seed.yield = seed.yield + rand(-2, 2) //Randomly adjust yield
if(seed.yield < 0) //If yield would drop below 0 after adjustment, set to 0 to allow further attempts
seed.yield = 0
return
/* code references
// We need to make sure we're not modifying one of the global seed datums.
// If it's not in the global list, then no products of the line have been
// harvested yet and it's safe to assume it's restricted to this tray.
if(!isnull(seed_types[seed.name]))
seed = seed.diverge()
seed.mutate(severity,get_turf(src))
*/
//--FalseIncarnate
/obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species()
var/previous_plant = seed.display_name
@@ -552,7 +643,7 @@
return
dead = 0
mutate(1)
//mutate(1)
age = 0
health = seed.endurance
lastcycle = world.time
@@ -573,7 +664,7 @@
user << "Unscrew the hoses first!"
return
default_deconstruction_crowbar(O, 1)
//--FalseIncarnate
//Check if held item is an open container
if (O.is_open_container())
@@ -643,7 +734,7 @@
update_icon()
else
user << "There's nothing in [src] to spray!"
else if(istype(O, /obj/item/weapon/wrench) && unwrenchable)
if(anchored == 2)
user << "Unscrew the hoses first!"
+2
View File
@@ -162,6 +162,8 @@
else
src.occupant.LAssailant = user
src.occupant.emote("scream")
playsound(src.loc, 'sound/effects/gib.ogg', 50, 1)
src.occupant.death(1)
src.occupant.ghostize()
del(src.occupant)
+2 -1
View File
@@ -47,11 +47,12 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
for(var/mob/O in respawnable_list)
if(O.mind == source.mind && config.revival_pod_plants)
message_admins("Found mind, asking for respawn")
switch(alert(O,"Your corpse has been placed into a pod plant. Do you want to be resurrected/cloned? Please not if you select 'No', you will be able to be cloned or borged again this round.","Pod Alert","Yes","No"))
switch(alert(O,"Your corpse has been placed into a pod plant. Do you want to be resurrected/cloned? Please note if you select 'No', you will still be able to be cloned or borged again this round.","Pod Alert","Yes","No"))
if("Yes")
source.key = O.key
return
if("No")
user << "The seeds seem to reject the blood, returning to their original size as they stop quivering."
return
else
user << "Nothing happens."
+10 -10
View File
@@ -66,7 +66,7 @@
spark_system.attach(src)
sleep(10)
if(!installation)// if for some reason the turret has no gun (ie, admin spawned) it resorts to basic taser shots
projectile = /obj/item/projectile/beam/stun//holder for the projectile, here it is being set
projectile = /obj/item/projectile/energy/electrode//holder for the projectile, here it is being set
eprojectile = /obj/item/projectile/beam//holder for the projectile when emagged, if it is different
reqpower = 200
sound = 1
@@ -76,8 +76,8 @@
// All energy-based weapons are applicable
switch(E.type)
if(/obj/item/weapon/gun/energy/laser/bluetag)
projectile = /obj/item/projectile/beam/lastertag/blue
eprojectile = /obj/item/projectile/beam/lastertag/omni//This bolt will stun ERRYONE with a vest
projectile = /obj/item/projectile/lasertag/blue
eprojectile = /obj/item/projectile/lasertag/omni//This bolt will stun ERRYONE with a vest
iconholder = null
reqpower = 100
lasercolor = "b"
@@ -90,8 +90,8 @@
shot_delay = 30
if(/obj/item/weapon/gun/energy/laser/redtag)
projectile = /obj/item/projectile/beam/lastertag/red
eprojectile = /obj/item/projectile/beam/lastertag/omni
projectile = /obj/item/projectile/lasertag/red
eprojectile = /obj/item/projectile/lasertag/omni
iconholder = null
reqpower = 100
lasercolor = "r"
@@ -104,7 +104,7 @@
shot_delay = 30
if(/obj/item/weapon/gun/energy/laser/practice)
projectile = /obj/item/projectile/beam/practice
projectile = /obj/item/projectile/practice
eprojectile = /obj/item/projectile/beam
iconholder = null
reqpower = 100
@@ -128,7 +128,7 @@
reqpower = 700
if(/obj/item/weapon/gun/energy/taser)
projectile = /obj/item/projectile/beam/stun
projectile = /obj/item/projectile/energy/electrode
eprojectile = projectile
iconholder = 1
reqpower = 200
@@ -170,7 +170,7 @@
reqpower = 500
else // Energy gun shots
projectile = /obj/item/projectile/beam/stun// if it hasn't been emagged, it uses normal taser shots
projectile = /obj/item/projectile/energy/electrode// if it hasn't been emagged, it uses normal taser shots
eprojectile = /obj/item/projectile/beam//If it has, going to kill mode
iconholder = 1
egun = 1
@@ -375,13 +375,13 @@ Status: []<BR>"},
if (src.health <= 0)
src.die() // the death process :(
if((src.lasercolor == "b") && (src.disabled == 0))
if(istype(Proj, /obj/item/projectile/beam/lastertag/red))
if(istype(Proj, /obj/item/projectile/lasertag/red))
src.disabled = 1
del (Proj)
sleep(100)
src.disabled = 0
if((src.lasercolor == "r") && (src.disabled == 0))
if(istype(Proj, /obj/item/projectile/beam/lastertag/blue))
if(istype(Proj, /obj/item/projectile/lasertag/blue))
src.disabled = 1
del (Proj)
sleep(100)
+2 -2
View File
@@ -221,9 +221,9 @@
if(4)
A = new /obj/item/projectile/change(loc)
if(5)
A = new /obj/item/projectile/beam/lastertag/blue(loc)
A = new /obj/item/projectile/lasertag/blue(loc)
if(6)
A = new /obj/item/projectile/beam/lastertag/red(loc)
A = new /obj/item/projectile/lasertag/red(loc)
A.original = target
use_power(500)
else
+1 -1
View File
@@ -109,7 +109,7 @@
icon_state = "mecha_taser"
energy_drain = 20
equip_cooldown = 8
projectile = /obj/item/projectile/beam/stun
projectile = /obj/item/projectile/energy/electrode/revolver
fire_sound = 'sound/weapons/Taser.ogg'
size = 1
+6 -6
View File
@@ -219,7 +219,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
var/selected = plist[c]
aiPDA.create_message(user, selected)
/mob/living/silicon/ai/proc/cmd_show_message_log(mob/user as mob)
if(user.stat == 2)
user << "You can't do that because you are dead!"
@@ -247,7 +247,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
var/selected = plist[c]
create_message(usr, selected)
/obj/item/device/pda/ai/verb/cmd_show_message_log()
set category = "AI IM"
set name = "Show Message Log"
@@ -918,18 +918,18 @@ var/global/list/obj/item/device/pda/PDAs = list()
useMS.send_pda_message("[P.owner]","[owner]","[t]")
tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]")))
P.tnote.Add(list(list("sent" = 0, "owner" = "[owner]", "job" = "[ownjob]", "message" = "[t]", "target" = "\ref[src]")))
for(var/mob/M in player_list)
/* for(var/mob/M in player_list)
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) // src.client is so that ghosts don't have to listen to mice
if(istype(M, /mob/new_player))
continue
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>")
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>") */
investigate_log("<span class='game say'>PDA Message - <span class='name'>[U.key] - [owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>", "pda")
if(!conversations.Find("\ref[P]"))
conversations.Add("\ref[P]")
if(!P.conversations.Find("\ref[src]"))
P.conversations.Add("\ref[src]")
/*
if (prob(15)) //Give the AI a chance of intercepting the message
var/who = src.owner
if(prob(50))
@@ -938,7 +938,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
// Allows other AIs to intercept the message but the AI won't intercept their own message.
if(ai.aiPDA != P && ai.aiPDA != src)
ai.show_message("<i>Intercepted message from <b>[who]</b>: [t]</i>")
*/
if (!P.silent)
playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
+44 -1
View File
@@ -193,4 +193,47 @@
icon_state = initial(icon_state)
/obj/item/device/flashlight/slime/attack_self(mob/user)
return //Bio-luminescence does not toggle.
return //Bio-luminescence does not toggle.
/obj/item/device/flashlight/emp
origin_tech = "magnets=4;syndicate=5"
var/emp_max_charges = 4
var/emp_cur_charges = 4
var/charge_tick = 0
/obj/item/device/flashlight/emp/New()
..()
processing_objects.Add(src)
/obj/item/device/flashlight/emp/Destroy()
processing_objects.Remove(src)
..()
/obj/item/device/flashlight/emp/process()
charge_tick++
if(charge_tick < 10) return 0
charge_tick = 0
emp_cur_charges = min(emp_cur_charges+1, emp_max_charges)
return 1
/obj/item/device/flashlight/emp/attack(mob/living/M as mob, mob/living/user as mob)
if(on && user.zone_sel.selecting == "eyes") // call original attack proc only if aiming at the eyes
..()
return
/obj/item/device/flashlight/emp/afterattack(atom/A as mob|obj, mob/user, proximity)
if(!proximity) return
if (emp_cur_charges > 0)
emp_cur_charges -= 1
A.visible_message("<span class='danger'>[user] blinks \the [src] at \the [A].", \
"<span class='userdanger'>[user] blinks \the [src] at \the [A].")
if(ismob(A))
var/mob/M = A
add_logs(user, M, "attacked", object="EMP-light")
user << "\The [src] now has [emp_cur_charges] charge\s."
A.emp_act(1)
else
user << "<span class='warning'>\The [src] needs time to recharge!</span>"
return
@@ -702,10 +702,17 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
/obj/item/device/radio/borg/syndicate
syndie = 1
keyslot = new /obj/item/device/encryptionkey/syndicate
/obj/item/device/radio/borg/syndicate/New()
..()
set_frequency(SYND_FREQ)
set_frequency(SYND_FREQ)
/obj/item/device/radio/borg/deathsquad
/obj/item/device/radio/borg/deathsquad/New()
..()
set_frequency(1441)
/obj/item/device/radio/borg/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
user.set_machine(src)
+1 -1
View File
@@ -114,7 +114,7 @@
bmark.pixel_x--
bmark.pixel_y--
if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/beam/practice))
if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/practice))
bmark.icon_state = "scorch"
bmark.dir = pick(NORTH,SOUTH,EAST,WEST) // random scorch design
+2 -2
View File
@@ -409,9 +409,9 @@
/obj/item/weapon/twohanded/dualsaber/toy/IsShield()
return 0
/*
/obj/item/weapon/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles
return 0 */ //uncomment this once reflecting is ported
return 0
/obj/item/toy/katana
name = "replica katana"
@@ -326,6 +326,18 @@ CIGARETTE PACKETS ARE IN FANCY.DM
return
if(location)
location.hotspot_expose(700, 5)
if(reagents && reagents.total_volume) // check if it has any reagents at all
if(iscarbon(loc) && (src == loc:wear_mask)) // if it's in the human/monkey mouth, transfer reagents to the mob
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
if(H.species.flags & IS_SYNTHETIC)
return
var/mob/living/carbon/C = loc
if(prob(15)) // so it's not an instarape in case of acid
reagents.reaction(C, INGEST)
reagents.trans_to(C, REAGENTS_METABOLISM)
else // else just remove some of the reagents
reagents.remove_any(REAGENTS_METABOLISM)
return
/obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user as mob) //Refills the pipe. Can be changed to an attackby later, if loose tobacco is added to vendors or something.
@@ -267,6 +267,11 @@
block = TELEBLOCK
..()
/obj/item/weapon/dnainjector/telemut/darkbundle
name = "DNA injector"
desc = "Good. Let the hate flow through you."
/obj/item/weapon/dnainjector/antitele
name = "DNA-Injector (Anti-Tele.)"
desc = "Will make you not able to control your mind."
@@ -567,3 +567,28 @@ the implant may become unstable and either pre-maturely inject the subject or si
name = "cortical stack"
desc = "A fist-sized mass of biocircuits and chips."
icon_state = "implant_evil"
/obj/item/weapon/implant/emp
name = "emp implant"
desc = "Triggers an EMP."
var/activation_emote = "chuckle"
var/uses = 2
/obj/item/weapon/implant/emp/New()
activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "smile", "pale", "sniff", "whimper", "wink")
..()
return
/obj/item/weapon/implant/emp/trigger(emote, mob/living/carbon/source as mob)
if (src.uses < 1) return 0
if (emote == src.activation_emote)
src.uses--
empulse(source, 3, 5)
return
/obj/item/weapon/implant/emp/implanted(mob/living/carbon/source)
source.mind.store_memory("EMP implant can be activated [uses] time\s by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
source << "The implanted EMP implant can be activated [uses] time\s by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
return 1
@@ -170,3 +170,12 @@
..()
update()
return
/obj/item/weapon/implanter/emp
name = "implanter-EMP"
New()
src.imp = new /obj/item/weapon/implant/emp(src)
..()
update()
return
+1 -1
View File
@@ -39,7 +39,7 @@
/obj/item/weapon/shield/energy
name = "energy combat shield"
desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere."
desc = "A shield capable of stopping most melee attacks. Protects user from almost all energy projectiles. It can be retracted, expanded, and stored anywhere."
icon = 'icons/obj/weapons.dmi'
icon_state = "eshield0" // eshield1 for expanded
flags = FPRINT | TABLEPASS| CONDUCT
@@ -206,3 +206,89 @@
..()
new /obj/item/stack/tile/plasteel(src)
new /obj/item/weapon/crowbar(src)
/*
* Duffelbags - My thanks to MrSnapWalk for the original icon and Neinhaus for the job variants - Dave.
*/
/obj/item/weapon/storage/backpack/duffel
name = "duffelbag"
desc = "A large grey duffelbag designed to hold more items than a regular bag."
icon_override = 'icons/mob/in-hand/duffelbag.dmi'
icon_state = "duffel"
item_state = "duffel"
storage_slots = 10 // Duffelbags can hold more items.
max_combined_w_class = 25
/obj/item/weapon/storage/backpack/duffel/syndimed
name = "suspicious duffelbag"
desc = "A black and red duffelbag with a red and white cross sewn onto it."
icon_state = "duffel-syndimed"
item_state = "duffel-syndimed"
/obj/item/weapon/storage/backpack/duffel/syndiammo
name = "suspicious duffelbag"
desc = "A black and red duffelbag with a patch depicting shotgun shells sewn onto it."
icon_state = "duffel-syndiammo"
item_state = "duffel-syndiammo"
/obj/item/weapon/storage/backpack/duffel/captain
name = "captain's duffelbag"
desc = "A duffelbag designed to hold large quantities of condoms."
icon_state = "duffel-captain"
item_state = "duffel-captain"
/obj/item/weapon/storage/backpack/duffel/security
name = "security duffelbag"
desc = "A duffelbag built with robust fabric!"
icon_state = "duffel-security"
item_state = "duffel-security"
/obj/item/weapon/storage/backpack/duffel/virology
name = "virology duffelbag"
desc = "A white duffelbag designed to contain biohazards."
icon_state = "duffel-viro"
item_state = "duffel-viro"
/obj/item/weapon/storage/backpack/duffel/science
name = "scientist duffelbag"
desc = "A duffelbag designed to hold the secrets of space."
icon_state = "duffel-toxins"
item_state = "duffel-toxins"
/obj/item/weapon/storage/backpack/duffel/genetics
name = "scientist duffelbag"
desc = "A duffelbag designed to hold gibbering monkies."
icon_state = "duffel-toxins"
item_state = "duffel-toxins"
/obj/item/weapon/storage/backpack/duffel/chemistry
name = "scientist duffelbag"
desc = "A duffelbag designed to hold corrosive substances."
icon_state = "duffel-chemistry"
item_state = "duffel-chemistry"
/obj/item/weapon/storage/backpack/duffel/medical
name = "medical duffelbag"
desc = "A duffelbag designed to hold medicine."
icon_state = "duffel-med"
item_state = "duffel-med"
/obj/item/weapon/storage/backpack/duffel/engineering
name = "industrial duffelbag"
desc = "A duffelbag designed to hold tools."
icon_state = "duffel-eng"
item_state = "duffel-eng"
/obj/item/weapon/storage/backpack/duffel/hydro
name = "hydroponics duffelbag"
desc = "A duffelbag designed to hold seeds and fauna."
icon_state = "duffel-hydro"
item_state = "duffel-hydro"
/obj/item/weapon/storage/backpack/duffel/clown
name = "smiles von wiggleton"
desc = "A duffelbag designed to hold bananas and bike horns."
icon_state = "duffel-clown"
item_state = "duffel-clown"
@@ -214,6 +214,17 @@
var/new_name = pick("evil", "suspicious", "ominous", "donk-flavored", "robust", "sneaky")
name = "[new_name] cigarette packet"
/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate
name = "cigarette packet"
desc = "An obscure brand of cigarettes."
icon_state = "syndiepacket"
item_state = "syndiepacket"
/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate/New()
..()
for(var/i = 1 to storage_slots)
reagents.add_reagent("doctorsdelight",15)
/*
* Vial Box
*/
@@ -1,11 +1,12 @@
/obj/item/weapon/storage/box/syndicate/
New()
..()
switch (pickweight(list("bloodyspai" = 1, "stealth" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "freedom" = 1, "hacker" = 1, "lordsingulo" = 1, "smoothoperator" = 1)))
switch (pickweight(list("bloodyspai" = 1, "stealth" = 1, "bond" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "implant" = 1, "hacker" = 1, "lordsingulo" = 1, "darklord" = 1)))
if("bloodyspai")
new /obj/item/clothing/under/chameleon(src)
new /obj/item/clothing/mask/gas/voice(src)
new /obj/item/weapon/card/id/syndicate(src)
new /obj/item/weapon/card/id/syndicate(src)
new /obj/item/clothing/shoes/syndigaloshes(src)
return
@@ -15,12 +16,20 @@
new /obj/item/device/chameleon(src)
return
if("bond")
new /obj/item/weapon/gun/projectile/automatic/pistol(src)
new /obj/item/weapon/silencer(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/ammo_box/magazine/m10mm(src)
new /obj/item/clothing/under/chameleon(src)
new /obj/item/weapon/card/id/syndicate(src)
if("screwed")
new /obj/effect/spawner/newbomb/timer/syndicate(src)
new /obj/effect/spawner/newbomb/timer/syndicate(src)
new /obj/item/device/radio/beacon/syndicate/bomb(src)
new /obj/item/weapon/grenade/syndieminibomb(src)
new /obj/item/device/powersink(src)
new /obj/item/clothing/suit/space/syndicate(src)
new /obj/item/clothing/head/helmet/space/syndicate(src)
new /obj/item/clothing/suit/space/syndicate/black/red(src)
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
return
if("guns")
@@ -37,11 +46,18 @@
new /obj/item/clothing/shoes/syndigaloshes(src)
return
if("freedom")
if("implant")
var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src)
O.imp = new /obj/item/weapon/implant/freedom(O)
var/obj/item/weapon/implanter/U = new /obj/item/weapon/implanter(src)
U.imp = new /obj/item/weapon/implant/uplink(U)
var/obj/item/weapon/implanter/C = new /obj/item/weapon/implanter(src)
C.imp = new /obj/item/weapon/implant/emp(C)
var/obj/item/weapon/implanter/K = new /obj/item/weapon/implanter(src)
K.imp = new /obj/item/weapon/implant/adrenalin(K)
var/obj/item/weapon/implanter/S = new /obj/item/weapon/implanter(src)
S.imp = new /obj/item/weapon/implant/explosive(S)
S.name += " (explosive)"
return
if("hacker")
@@ -52,19 +68,18 @@
if("lordsingulo")
new /obj/item/device/radio/beacon/syndicate(src)
new /obj/item/clothing/suit/space/syndicate(src)
new /obj/item/clothing/head/helmet/space/syndicate(src)
new /obj/item/clothing/suit/space/syndicate/black/red(src)
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
new /obj/item/weapon/card/emag(src)
return
if("smoothoperator")
new /obj/item/weapon/gun/projectile/automatic/pistol(src)
new /obj/item/weapon/silencer(src)
new /obj/item/weapon/soap/syndie(src)
new /obj/item/weapon/storage/bag/trash(src)
new /obj/item/bodybag(src)
new /obj/item/clothing/under/suit_jacket(src)
new /obj/item/clothing/shoes/laceup(src)
if("darklord")
new /obj/item/weapon/melee/energy/sword(src)
new /obj/item/weapon/melee/energy/sword(src)
new /obj/item/weapon/dnainjector/telemut/darkbundle(src)
new /obj/item/clothing/head/chaplain_hood(src)
new /obj/item/clothing/suit/chaplain_hoodie(src)
new /obj/item/weapon/card/id/syndicate(src)
return
/obj/item/weapon/storage/box/syndie_kit
@@ -165,4 +180,14 @@
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)
/obj/item/weapon/storage/box/syndie_kit/emp
name = "boxed EMP kit"
New()
..()
new /obj/item/weapon/grenade/empgrenade(src)
new /obj/item/weapon/grenade/empgrenade(src)
new /obj/item/weapon/implanter/emp/(src)
new /obj/item/device/flashlight/emp/(src)
@@ -235,7 +235,7 @@
return
else
return ..()
/*
*Energy Blade
*/
@@ -301,7 +301,7 @@
active = !active
if (active)
force = 10
reflect_chance = 80
reflect_chance = 100
icon_state = "eshield[active]"
w_class = 4
playsound(user, 'sound/weapons/saberon.ogg', 50, 1)
+1 -1
View File
@@ -219,7 +219,7 @@ obj/item/weapon/twohanded/
/obj/item/weapon/twohanded/dualsaber/update_icon()
if(wielded)
icon_state = "dualsaber[blade_color][wielded]"
reflect_chance = 80
reflect_chance = 100
else
icon_state = "dualsaber0"
reflect_chance = 0
+2 -2
View File
@@ -59,11 +59,11 @@
for(var/obj/O in range(0, src))
if(O.density == 1 && O != src && !istype(O, /obj/machinery/door/window)) //Ignores windoors, as those already block climbing, otherwise a windoor on the opposite side of a table would prevent climbing.
user << "\red You cannot climb a [src] blocked by a solid object!"
user << "\red You cannot climb [src], as it is blocked by \a [O]!"
return
for(var/turf/T in range(0, src))
if(T.density == 1)
user << "\red You cannot climb a [src] blocked by a solid object!"
user << "\red You cannot climb [src], as it is blocked by \a [T]!"
return
var/turf/T = src.loc
if(!T || !istype(T)) return
+1 -1
View File
@@ -224,7 +224,7 @@
if(istype(Proj, /obj/item/projectile/energy))
unbuckle()
return
if(istype(Proj, /obj/item/projectile/energy/electrode) || istype(Proj, /obj/item/projectile/beam/stun))
if(istype(Proj, /obj/item/projectile/energy/electrode))
if(prob(25))
unbuckle()
visible_message("<span class='warning'>The [src.name] absorbs the [Proj]")
+1 -1
View File
@@ -304,7 +304,7 @@ var/list/admin_verbs_mod = list(
/client/proc/colorooc()
set category = "Admin"
set name = "OOC Text Color"
set name = "Personal OOC Text Color"
if(!holder) return
var/new_ooccolor = input(src, "Please select your OOC colour.", "OOC colour") as color|null
if(new_ooccolor)
+1 -1
View File
@@ -244,7 +244,7 @@ BLIND // can't see anything
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona","Vox")
loose = 1 // very rarely falls off
loose = 0 // What kind of idiot designs a pressurized suit where the helmet can fall off?
/obj/item/clothing/suit/space
name = "Space suit"
@@ -6,7 +6,6 @@
allowed = list(/obj/item/weapon/cell)
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25)
siemens_coefficient = 0.2
loose = 0
/obj/item/clothing/suit/space/space_ninja
+6
View File
@@ -42,6 +42,12 @@
has_sensor = 1 // Just to make sure it has a sensor
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) // Standar Jumpsuit stats
/obj/item/clothing/head/fluff/sparkyninja_beret //Sparkyninja: Neil Wilkinson
name = "royal marines commando beret"
desc = "Dark Green beret with an old insignia on it."
icon_state = "sparkyninja_beret"
flags = FPRINT | TABLEPASS
//////////////////////////////////
////////// Fluff Items ///////////
//////////////////////////////////
+1 -1
View File
@@ -24,7 +24,7 @@
var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","psilocybin","lube",
"plantbgone","banana","anti_toxin","space_drugs","hyperzine","holywater","ethanol","hot_coco","pacid",
"blood","stoxin","fluorine","ryetalyn","mutagen","oxycodone","fuel","cryptobiolin",
"impedrezene","mindbreaker","nanites","xenomicrobes","lipozine","frostoil","alchdranine","beepskysmash",
"impedrezene","mindbreaker","nanites","xenomicrobes","lipozine","frostoil","doctorsdelight","beepskysmash",
"tricordrazine", "amatoxin", "adminordrazine", "neurotoxin", "zombiepowder", "synaptizine")
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = vent
+37
View File
@@ -18,6 +18,17 @@
var/datum/seed/grown_seed
var/datum/reagents/grown_reagents
//--FalseIncarnate
var/IS_TRAY = 0 //used to track if the target is a hydroponics tray or soil. 1 if true, otherwise 0
var/tray_age //age of the plant in the tray
var/tray_weed_level //weed level of tray
var/tray_pest_level //pest level of tray
var/tray_toxins //toxicity of the tray
var/tray_yield_mod //yield modifier of the tray
var/tray_mutation_mod //mutation modifier of the tray
//--FalseIncarnate
if(istype(target,/obj/item/weapon/reagent_containers/food/snacks/grown))
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = target
@@ -38,6 +49,19 @@
else if(istype(target,/obj/machinery/portable_atmospherics/hydroponics))
var/obj/machinery/portable_atmospherics/hydroponics/H = target
//--FalseIncarnate
//Flag the target as a tray for showing tray-specific stats
IS_TRAY = 1
//Save tray data to matching variables
tray_age = H.age
tray_weed_level = H.weedlevel
tray_pest_level = H.pestlevel
tray_toxins = H.toxins
tray_yield_mod = H.yield_mod
tray_mutation_mod = H.mutation_mod
//--FalseIncarnate
grown_seed = H.seed
grown_reagents = H.reagents
@@ -57,6 +81,19 @@
dat += "<tr><td><b>Maturation time</b></td><td>[grown_seed.maturation]</td></tr>"
dat += "<tr><td><b>Production time</b></td><td>[grown_seed.production]</td></tr>"
dat += "<tr><td><b>Potency</b></td><td>[grown_seed.potency]</td></tr>"
//--FalseIncarnate
//Tray-specific stats like Age and Mutation Modifier, not shown if target was not a hydroponics tray or soil
if(IS_TRAY == 1)
dat += "<tr><td></td></tr>"
dat += "<tr><td><b>Age</b></td><td>[tray_age]</td></tr>"
dat += "<tr><td><b>Weed Level</b></td><td>[tray_weed_level]</td></tr>"
dat += "<tr><td><b>Pest Level</b></td><td>[tray_pest_level]</td></tr>"
dat += "<tr><td><b>Toxins</b></td><td>[tray_toxins]</td></tr>"
dat += "<tr><td><b>Yield Modifier</b></td><td>[tray_yield_mod]</td></tr>"
dat += "<tr><td><b>Mutation Modifier</b></td><td>[tray_mutation_mod]</td></tr>"
//--FalseIncarnate
dat += "</table>"
if(grown_reagents && grown_reagents.reagent_list && grown_reagents.reagent_list.len)
+7
View File
@@ -131,6 +131,13 @@
origin_tech = "materials=6;powerstorage=4;engineering=5"
desc = "Yours is the drill that will pierce the heavens!"
traitor //Pocket-sized traitor diamond drill.
name = "supermatter drill"
icon_state = "smdrill"
origin_tech = "materials=6;powerstorage=4;engineering=5;syndicate=3"
desc = "Microscopic supermatter crystals cover the head of this tiny drill."
w_class = 2.0
borgdrill
name = "cyborg mining drill"
icon_state = "diamonddrill"
@@ -19,6 +19,69 @@
if(src.stat == 2.0 && (act != "deathgasp"))
return
switch(act)
if("ping")
if (species.name == "Machine")
var/M = null
if(param)
for (var/mob/A in view(null, null))
if (param == A.name)
M = A
break
if(!M)
param = null
if (param)
message = "<B>[src]</B> pings at [param]."
else
message = "<B>[src]</B> pings."
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
m_type = 1
else
if (!species.name == "Machine")
return
if("buzz")
if (species.name == "Machine")
var/M = null
if(param)
for (var/mob/A in view(null, null))
if (param == A.name)
M = A
break
if(!M)
param = null
if (param)
message = "<B>[src]</B> buzzes at [param]."
else
message = "<B>[src]</B> buzzes."
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
m_type = 1
else
if (!species.name == "Machine")
return
if("beep")
if(species.name == "Machine")
var/M = null
if(param)
for (var/mob/A in view(null, null))
if (param == A.name)
M = A
break
if(!M)
param = null
if (param)
message = "<B>[src]</B> beeps at [param]."
else
message = "<B>[src]</B> beeps."
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
m_type = 1
else
if (!species.name == "Machine")
return
if ("airguitar")
if (!src.restrained())
message = "<B>[src]</B> is strumming the air and headbanging like a safari chimp."
@@ -567,6 +630,8 @@
message = "<B>[src]</B> makes a very loud noise."
m_type = 2
// Needed for M_TOXIC_FART
if("fart")
if(world.time-lastFart >= 600)
@@ -244,6 +244,17 @@
else
var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
throw_at(target, 200, 4)
var/limbs_affected = pick(2,3,4)
var/datum/organ/external/processing_dismember
while(limbs_affected != 0)
processing_dismember = pick(organs)
if(processing_dismember.name != "chest" && processing_dismember.name != "groin")
processing_dismember.dismember_limb()
limbs_affected -= 1
//return
// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src)))
//user.throw_at(target, 200, 4)
@@ -258,6 +269,25 @@
b_loss = b_loss/1.5
f_loss = f_loss/1.5
var/limbs_affected = pick(0, 1, 2)
var/datum/organ/external/processing_dismember
while(limbs_affected != 0)
processing_dismember = pick(organs)
if(processing_dismember.name != "chest" && processing_dismember.name != "groin" && processing_dismember.name != "head")
processing_dismember.dismember_limb()
limbs_affected -= 1
else
var/limbs_affected = pick(1, 2, 3)
var/datum/organ/external/processing_dismember
while(limbs_affected != 0)
processing_dismember = pick(organs)
if(processing_dismember.name != "chest" && processing_dismember.name != "groin")
processing_dismember.dismember_limb()
limbs_affected -= 1
if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
ear_damage += 30
ear_deaf += 120
@@ -268,6 +298,18 @@
b_loss += 30
if (prob(getarmor(null, "bomb")))
b_loss = b_loss/2
else
var/limbs_affected = pick(0, 1)
var/datum/organ/external/processing_dismember
while(limbs_affected != 0)
processing_dismember = pick(organs)
if(processing_dismember.name != "chest" && processing_dismember.name != "groin" && processing_dismember.name != "head")
processing_dismember.dismember_limb()
limbs_affected -= 1
if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
ear_damage += 15
ear_deaf += 60
@@ -10,8 +10,6 @@ emp_act
/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone)
var/datum/organ/external/organ = get_organ(check_zone(def_zone))
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
if(check_reflect(def_zone)) // Checks if you've passed a reflection% check
visible_message("<span class='danger'>The [P.name] gets reflected by [src]!</span>", \
@@ -40,6 +38,7 @@ emp_act
//Shrapnel
if (P.damage_type == BRUTE)
var/datum/organ/external/organ = get_organ(check_zone(def_zone))
var/armor = getarmor_organ(organ, "bullet")
if((P.embed && prob(20 + max(P.damage - armor, -10))))
var/obj/item/weapon/shard/shrapnel/SP = new()
@@ -265,7 +264,7 @@ emp_act
if(armor >= 2) return 0
if(!I.force) return 0
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
apply_damage(I.force, I.damtype, affecting, armor, sharp=weapon_sharp, edge=weapon_edge, used_weapon=I)
var/bloody = 0
@@ -313,8 +312,13 @@ emp_act
if(Iforce > 10 || Iforce >= 5 && prob(33))
forcesay(hit_appends) //forcesay checks stat already
forcesay(hit_appends) //forcesay checks stat already
if (I.damtype == BRUTE)
if((I.edge && prob(2 * I.force)) || (I.force > 20 && prob(I.force)))
if(affecting.brute_dam >= affecting.max_damage * config.organ_health_multiplier)
affecting.dismember_limb()
//Melee weapon embedded object code.
if (I.damtype == BRUTE && !I.is_robot_module())
var/damage = I.force
@@ -353,11 +357,11 @@ emp_act
zone = get_zone_with_miss_chance(zone, src, min(15*(distance-2), 0))
else
zone = get_zone_with_miss_chance(zone, src, 15)
/*
if(!zone)
visible_message("\blue \The [O] misses [src] narrowly!")
return
*/
O.throwing = 0 //it hit, so stop moving
if ((O.thrower != src) && check_shields(throw_damage, "[O]"))
@@ -465,7 +469,7 @@ emp_act
var/penetrated_dam = max(0,(damage - max(0,(SS.breach_threshold - SS.damage))))
if(penetrated_dam) SS.create_breaches(damtype, penetrated_dam)
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == "harm")
if(M.damtype == "brute")
+1 -4
View File
@@ -99,17 +99,14 @@
if(findtext(temp, "*", 1, 2)) //emotes
return
world << "Text after stuff is [temp]"
temp = copytext(trim_left(temp), 1, rand(5,8))
world << "Text after trimming is [temp]"
var/trimmed = trim_left(temp)
if(length(trimmed))
if(append)
temp += pick(append)
say(temp)
winset(client, "input", "text=[null]")
winset(client, "input", "text=[null]")
/mob/living/carbon/human/say_understands(var/other,var/datum/language/speaking = null)
+10 -9
View File
@@ -57,13 +57,14 @@
signaler.signal()
*/
//Stun Beams
/*
//Stun Beams -- These were commented out, making appropriate changes here. - Dave
if(istype(P, /obj/item/projectile/beam/stun) || istype(P, /obj/item/projectile/bullet/stunshot))
stun_effect_act(0, P.agony, def_zone, P)
src <<"\red You have been hit by [P]!"
del P
return
*/
//Armor
var/absorb = run_armor_check(def_zone, P.flag)
var/proj_sharp = is_sharp(P)
@@ -119,15 +120,15 @@
var/throw_damage = O.throwforce*(speed/5)
var/miss_chance = 15
if (O.throw_source)
var/distance = get_dist(O.throw_source, loc)
miss_chance = min(15*(distance-2), 0)
//var/miss_chance = 15
//if (O.throw_source)
//var/distance = get_dist(O.throw_source, loc)
//miss_chance = min(15*(distance-2), 0)
/*
if (prob(miss_chance))
visible_message("\blue \The [O] misses [src] narrowly!")
return
*/
src.visible_message("\red [src] has been hit by [O].")
var/armor = run_armor_check(null, "melee")
@@ -168,7 +169,7 @@
visible_message("<span class='warning'>[src] is pinned to the wall by [O]!</span>","<span class='warning'>You are pinned to the wall by [O]!</span>")
src.anchored = 1
src.pinned += O
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == "harm")
if(M.damtype == "brute")
+61 -6
View File
@@ -1242,7 +1242,7 @@
else
src << "Module isn't activated"
installed_modules()
if (href_list["lawc"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
var/L = text2num(href_list["lawc"])
switch(lawcheck[L+1])
@@ -1404,6 +1404,61 @@
else
src << "Your icon has been set. You now require a module reset to change it."
/mob/living/silicon/robot/deathsquad
var/searching_for_ckey = 0
icon_state = "nano_bloodhound"
lawupdate = 0
scrambledcodes = 1
syndicateborg = 1
modtype = "Commando"
faction = list("nanotrasen")
designation = "NT Combat Cyborg"
req_access = list(access_cent_specops)
/mob/living/silicon/robot/deathsquad/New(loc)
..()
cell.maxcharge = 50000
cell.charge = 50000
radio = new /obj/item/device/radio/borg/deathsquad(src)
module = new /obj/item/weapon/robot_module/deathsquad(src)
laws = new /datum/ai_laws/deathsquad()
/mob/living/silicon/robot/deathsquad/attack_hand(mob/user)
if((ckey == null) && searching_for_ckey == 0 && (alert(user,"Attempt to boot NanoTrasen Commando cyborg?","","Yes","No") == "Yes"))
get_borg_occupant(user, get_candidates())
return
..()
/mob/living/silicon/robot/deathsquad/proc/get_borg_occupant(mob/user as mob, var/list/possiblecandidates = list())
var/time_passed = world.time
searching_for_ckey = 1
if(possiblecandidates.len <= 0)
searching_for_ckey = 0
user << "<span class='notice'>Cyborg MMI interface failure, unit unable to be started.</span>"
return
else
var/possibleborg = pick(possiblecandidates)
spawn(0)
var/input = alert(possibleborg,"Do you want to spawn in as a cyborg for the NT Deathsquad?","Please answer in thirty seconds!","Yes","No")
if(input == "Yes" && ckey == null)
if((world.time-time_passed)>300)
return
possiblecandidates -= possibleborg
searching_for_ckey = 0
ckey = possibleborg
else
possiblecandidates -= possibleborg
get_borg_occupant(user, possiblecandidates)
return
sleep(300)
if(searching_for_ckey)
possiblecandidates -= possibleborg
get_borg_occupant(user, possiblecandidates)
return
/mob/living/silicon/robot/syndicate
icon_state = "syndie_bloodhound"
lawupdate = 0
@@ -1414,18 +1469,18 @@
designation = "Syndicate"
modtype = "Syndicate"
req_access = list(access_syndicate)
/mob/living/silicon/robot/syndicate/New(loc)
..()
cell.maxcharge = 25000
cell.charge = 25000
radio = new /obj/item/device/radio/borg/syndicate(src)
module = new /obj/item/weapon/robot_module/syndicate(src)
laws = new /datum/ai_laws/syndicate_override()
laws = new /datum/ai_laws/syndicate_override()
Namepick()
/mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname)
if(!connected_ai)
return
@@ -324,6 +324,20 @@
src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src)
return
/obj/item/weapon/robot_module/deathsquad
name = "NT advanced combat module"
/obj/item/weapon/robot_module/deathsquad/New()
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/cyborg(src)
src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.emag = null
return
/obj/item/weapon/robot_module/syndicate
name = "syndicate robot module"
@@ -153,6 +153,6 @@
for(counter=0, counter<=powerlevel, counter++)
var/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/S = new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc)
S.reagents.add_reagent("mushroomhallucinogen", powerlevel)
S.reagents.add_reagent("alchdranine", powerlevel)
S.reagents.add_reagent("doctorsdelight", powerlevel)
S.reagents.add_reagent("synaptizine", powerlevel)
del(src)
+8 -1
View File
@@ -158,12 +158,13 @@
src.update_damages()
//If limb took enough damage, try to cut or tear it off
/*
if(body_part != UPPER_TORSO && body_part != LOWER_TORSO) //as hilarious as it is, getting hit on the chest too much shouldn't effectively gib you.
if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier)
if( (edge && prob(5 * brute)) || (brute > 20 && prob(2 * brute)) )
droplimb(1)
return
*/
owner.updatehealth()
var/result = update_icon()
@@ -290,6 +291,12 @@ This function completely restores a damaged organ to perfect condition.
return 1
return 0
/datum/organ/external/proc/dismember_limb()
if(body_part != UPPER_TORSO && body_part != LOWER_TORSO) //as hilarious as it is, getting hit on the chest too much shouldn't effectively gib you.
if(config.limbs_can_break)
droplimb(1)
return
/datum/organ/external/process()
//Dismemberment
if(status & ORGAN_DESTROYED)
+3 -2
View File
@@ -30,7 +30,7 @@
var/tmp/told_cant_shoot = 0 //So that it doesn't spam them with the fact they cannot hit them.
var/firerate = 1 // 0 for one bullet after tarrget moves and aim is lowered,
//1 for keep shooting until aim is lowered
var/fire_delay = 6
var/fire_delay = 0
var/last_fired = 0
proc/ready_to_fire()
@@ -154,6 +154,7 @@
in_chamber.current = curloc
in_chamber.yo = targloc.y - curloc.y
in_chamber.xo = targloc.x - curloc.x
if(istype(user, /mob/living/carbon))
var/mob/living/carbon/mob = user
if(mob.shock_stage > 120)
@@ -238,7 +239,7 @@
playsound(user, fire_sound, 10, 1)
else
playsound(user, fire_sound, 50, 1)
if(istype(in_chamber, /obj/item/projectile/beam/lastertag))
if(istype(in_chamber, /obj/item/projectile/lasertag))
user.show_message("<span class = 'warning'>You feel rather silly, trying to commit suicide with a toy.</span>")
mouthshoot = 0
return
@@ -12,7 +12,7 @@
/obj/item/weapon/gun/energy/laser/practice
name = "practice laser gun"
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
projectile_type = "/obj/item/projectile/beam/practice"
projectile_type = "/obj/item/projectile/practice"
clumsy_check = 0
obj/item/weapon/gun/energy/laser/retro
@@ -58,7 +58,6 @@ obj/item/weapon/gun/energy/laser/retro
if(R && R.cell)
R.cell.use(500)
in_chamber = new/obj/item/projectile/beam(src)
fire_delay = 12
return 1
return 0
@@ -74,7 +73,6 @@ obj/item/weapon/gun/energy/laser/retro
origin_tech = "combat=4;materials=3;powerstorage=3"
projectile_type = "/obj/item/projectile/beam/heavylaser"
charge_cost = 1250
fire_delay = 10
isHandgun()
return 0
@@ -106,7 +104,7 @@ obj/item/weapon/gun/energy/laser/retro
name = "laser tag gun"
icon_state = "bluetag"
desc = "Standard issue weapon of the Imperial Guard"
projectile_type = "/obj/item/projectile/beam/lastertag/blue"
projectile_type = "/obj/item/projectile/lastertag/blue"
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
var/charge_tick = 0
@@ -143,7 +141,7 @@ obj/item/weapon/gun/energy/laser/retro
name = "laser tag gun"
icon_state = "redtag"
desc = "Standard issue weapon of the Imperial Guard"
projectile_type = "/obj/item/projectile/beam/lastertag/red"
projectile_type = "/obj/item/projectile/lastertag/red"
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
var/charge_tick = 0
@@ -5,7 +5,7 @@
item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/Taser.ogg'
projectile_type = "/obj/item/projectile/beam/stun"
projectile_type = "/obj/item/projectile/energy/electrode"
origin_tech = "combat=3;magnets=2"
modifystate = "energystun"
@@ -26,7 +26,7 @@
charge_cost = 1000
fire_sound = 'sound/weapons/Taser.ogg'
user << "\red [src.name] is now set to stun."
projectile_type = "/obj/item/projectile/beam/stun"
projectile_type = "/obj/item/projectile/energy/electrode"
modifystate = "energystun"
update_icon()
if(user.l_hand == src)
@@ -9,7 +9,6 @@
projectile_type = "/obj/item/projectile/beam/pulse"
cell_type = "/obj/item/weapon/cell/super"
var/mode = 2
fire_delay = 15
slot_flags = SLOT_BACK
w_class = 4.0
@@ -18,21 +17,18 @@
if(2)
mode = 0
charge_cost = 100
fire_delay = 5
fire_sound = 'sound/weapons/Taser.ogg'
user << "\red [src.name] is now set to stun."
projectile_type = "/obj/item/projectile/beam/stun"
projectile_type = "/obj/item/projectile/energy/electrode/revolver"
if(0)
mode = 1
charge_cost = 100
fire_delay = 8
fire_sound = 'sound/weapons/Laser.ogg'
user << "\red [src.name] is now set to kill."
projectile_type = "/obj/item/projectile/beam"
if(1)
mode = 2
charge_cost = 200
fire_delay = 15
fire_sound = 'sound/weapons/pulse.ogg'
user << "\red [src.name] is now set to DESTROY."
projectile_type = "/obj/item/projectile/beam/pulse"
@@ -179,7 +179,7 @@ obj/item/weapon/gun/energy/staff/focus
projectile_type = "/obj/item/projectile/beam/sniper"
slot_flags = SLOT_BACK
charge_cost = 2500
fire_delay = 35
fire_delay = 10
w_class = 4.0
var/zoom = 0
@@ -227,7 +227,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
projectile_type = "/obj/item/projectile/kinetic"
cell_type = "/obj/item/weapon/cell/crap"
charge_cost = 5000
fire_delay = 20
/obj/item/weapon/gun/energy/kinetic_accelerator/attack_self(var/mob/living/user/L)
power_supply.give(5000)
+5 -5
View File
@@ -5,7 +5,7 @@
icon_state = "taser"
item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/Taser.ogg'
projectile_type = "/obj/item/projectile/beam/stun"
projectile_type = "/obj/item/projectile/energy/electrode"
cell_type = "/obj/item/weapon/cell"
/obj/item/weapon/gun/energy/taser/cyborg
@@ -13,7 +13,7 @@
desc = "A small, low capacity gun used for non-lethal takedowns."
icon_state = "taser"
fire_sound = 'sound/weapons/Taser.ogg'
projectile_type = "/obj/item/projectile/beam/stun"
projectile_type = "/obj/item/projectile/energy/electrode"
cell_type = "/obj/item/weapon/cell/secborg"
var/charge_tick = 0
var/recharge_time = 10 //Time it takes for shots to recharge (in ticks)
@@ -51,7 +51,7 @@
icon_state = "stunrevolver"
fire_sound = 'sound/weapons/Taser.ogg'
origin_tech = "combat=3;materials=3;powerstorage=2"
projectile_type = "/obj/item/projectile/energy/electroderevolver"
projectile_type = "/obj/item/projectile/energy/electrode/revolver"
cell_type = "/obj/item/weapon/cell"
@@ -88,11 +88,11 @@
/obj/item/weapon/gun/energy/crossbow/update_icon()
return
/obj/item/weapon/gun/energy/crossbow/cyborg/process()
..()
return
/obj/item/weapon/gun/energy/crossbow/cyborg/process_chambered()
if(in_chamber)
return 1
@@ -37,7 +37,7 @@
/obj/item/weapon/gun/projectile/automatic/c20r
name = "\improper C-20r SMG"
desc = "A lightweight, fast firing gun, for when you REALLY need someone dead. Uses 12mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp"
desc = "A lightweight, compact bullpup SMG. Uses .45 rounds in medium-capacity magazines and has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp."
icon_state = "c20r"
item_state = "c20r"
w_class = 3.0
@@ -60,14 +60,14 @@
/obj/item/weapon/gun/projectile/automatic/l6_saw
name = "\improper L6 SAW"
desc = "A rather traditionally made medium machine gun with a pleasantly lacquered wooden pistol grip. Has 'Aussec Armoury- 2531' engraved on the reciever"
desc = "A heavily modified light machine gun with a tactical plasteel frame resting on a rather traditionally-made belt-fed ballistic weapon. Has 'Aussec Armoury - 2531' engraved on the reciever."
icon_state = "l6closed100"
item_state = "l6closedmag"
w_class = 4
slot_flags = 0
origin_tech = "combat=5;materials=1;syndicate=2"
mag_type = "/obj/item/ammo_box/magazine/m762"
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
fire_sound = 'sound/weapons/Gunshot3.ogg'
var/cover_open = 0
@@ -123,7 +123,7 @@
w_class = 3.0
origin_tech = "combat=5;materials=4;syndicate=6"
mag_type = "/obj/item/ammo_box/magazine/m12g"
fire_sound = 'sound/weapons/Gunshot.ogg'
fire_sound = 'sound/weapons/Gunshot4.ogg'
/obj/item/weapon/gun/projectile/automatic/bulldog/New()
..()
@@ -75,12 +75,13 @@
/obj/item/weapon/gun/projectile/automatic/pistol
name = "\improper Stechtkin pistol"
desc = "A small, easily concealable gun. Uses 10mm rounds."
desc = "A small, easily concealable gun. Uses 10mm rounds and has a threaded barrel for suppressors."
icon_state = "pistol"
w_class = 2
silenced = 0
origin_tech = "combat=2;materials=2;syndicate=2"
mag_type = "/obj/item/ammo_box/magazine/m10mm"
fire_sound = 'sound/weapons/Gunshot2.ogg'
/obj/item/weapon/gun/projectile/automatic/pistol/attack_hand(mob/user as mob)
if(loc == user)
@@ -122,8 +123,8 @@
return
/obj/item/weapon/silencer
name = "silencer"
desc = "a silencer"
name = "supressor"
desc = "A universal syndicate small-arms suppressor."
icon = 'icons/obj/gun.dmi'
icon_state = "silencer"
w_class = 2
+20 -19
View File
@@ -109,30 +109,31 @@
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!")
forcedodge = -1
else
if(silenced)
playsound(loc, hitsound, 5, 1, -1)
M << "\red You've been shot in the [parse_zone(def_zone)] by the [src.name]!"
*/
if(silenced)
playsound(loc, hitsound, 5, 1, -1)
M << "\red You've been shot in the [parse_zone(def_zone)] by the [src.name]!"
else
playsound(loc, hitsound, 20, 1, -1)
visible_message("\red [A.name] is hit by the [src.name] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
if(istype(firer, /mob))
M.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src.type]</b>"
firer.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src.type]</b>"
if(M.ckey)
msg_admin_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[firer.x];Y=[firer.y];Z=[firer.z]'>JMP</a>)") //BS12 EDIT ALG
if(!iscarbon(firer))
M.LAssailant = null
else
playsound(loc, hitsound, 20, 1, -1)
visible_message("\red [A.name] is hit by the [src.name] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
if(istype(firer, /mob))
M.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src.type]</b>"
firer.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src.type]</b>"
if(M.ckey)
msg_admin_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[firer.x];Y=[firer.y];Z=[firer.z]'>JMP</a>)") //BS12 EDIT ALG
if(!iscarbon(firer))
M.LAssailant = null
else
M.LAssailant = firer
else
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
if(M.ckey)
msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a [src] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[firer.x];Y=[firer.y];Z=[firer.z]'>JMP</a>)") //BS12 EDIT ALG
M.LAssailant = firer
else
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
if(M.ckey)
msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a [src] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[firer.x];Y=[firer.y];Z=[firer.z]'>JMP</a>)") //BS12 EDIT ALG
if(A)
if (!forcedodge)
@@ -1,3 +1,248 @@
/obj/item/projectile/beam
name = "laser"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 20
damage_type = BURN
hitsound = 'sound/weapons/sear.ogg'
flag = "laser"
eyeblur = 2
/obj/item/projectile/practice
name = "laser"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 0
hitsound = null
damage_type = BURN
flag = "laser"
eyeblur = 2
/obj/item/projectile/beam/scatter
name = "laser pellet"
icon_state = "scatterlaser"
damage = 5
/obj/item/projectile/beam/heavylaser
name = "heavy laser"
icon_state = "heavylaser"
damage = 40
/obj/item/projectile/beam/xray
name = "xray beam"
icon_state = "xray"
damage = 15
irradiate = 30
/obj/item/projectile/beam/pulse
name = "pulse"
icon_state = "u_laser"
damage = 50
/obj/item/projectile/beam/pulse/on_hit(var/atom/target, var/blocked = 0)
if(istype(target,/turf/)||istype(target,/obj/structure/))
target.ex_act(2)
..()
/obj/item/projectile/beam/pulse/shot
damage = 40
/obj/item/projectile/beam/emitter
name = "emitter beam"
icon_state = "emitter"
damage = 30
/obj/item/projectile/lasertag
name = "laser tag beam"
icon_state = "omnilaser"
hitsound = null
damage = 0
flag = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
/obj/item/projectile/lasertag/on_hit(var/atom/target, var/blocked = 0)
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/M = target
if(istype(M.wear_suit))
if(M.wear_suit.type in suit_types)
M.Weaken(34)
return 1
/obj/item/projectile/lasertag/omni
name = "laser tag beam"
icon_state = "omnilaser"
/obj/item/projectile/lasertag/red
icon_state = "laser"
suit_types = list(/obj/item/clothing/suit/bluetag)
/obj/item/projectile/lasertag/blue
icon_state = "bluelaser"
suit_types = list(/obj/item/clothing/suit/redtag)
/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<length,N+=32)
if(count >= 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)
..()
/*
/*
* Use: Caches beam state images and holds turfs that had these images overlaid.
* Structure:
@@ -399,3 +644,4 @@ var/list/beam_master = list()
damage = 0
agony = 40
damage_type = HALLOSS
*/
@@ -20,8 +20,14 @@
hitsound = 'sound/weapons/tase.ogg'
//Damage will be handled on the MOB side, to prevent window shattering.
on_hit(var/atom/target, var/blocked = 0)
if(!ismob(target) || blocked >= 2) //Fully blocked by mob or collided with dense object - burst into sparks!
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread
sparks.set_up(1, 1, src)
sparks.start()
/obj/item/projectile/energy/electroderevolver
/obj/item/projectile/energy/electrode/revolver
name = "electrode"
icon_state = "spark"
nodamage = 1
+98 -29
View File
@@ -1717,8 +1717,6 @@ datum
description = "Alchdranine is an extremely strange chemical substance that can be used to treat almost any injury with a high level of effectiveness "
reagent_state = LIQUID
color = "#07a4d1" // rgb: 7, 164, 209
toxod = OVERDOSE/3
burnod = OVERDOSE/3
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0)
@@ -1913,6 +1911,21 @@ datum
..()
return
inacusiate
name = "Inacusiate"
id = "inacusiate"
description = "Heals ear damage."
reagent_state = LIQUID
color = "#6600FF" // rgb: 100, 165, 255
toxod = OVERDOSE
scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.ear_damage = 0
M.ear_deaf = 0
..()
return
peridaxon
name = "Peridaxon"
@@ -1986,9 +1999,9 @@ datum
if(!M) M = holder.my_atom
if(M.bodytemperature < 170)
M.adjustCloneLoss(-1)
M.adjustOxyLoss(-2)
M.heal_organ_damage(2,2)
M.adjustToxLoss(-2)
M.adjustOxyLoss(-3)
M.heal_organ_damage(3,3)
M.adjustToxLoss(-3)
..()
return
@@ -2003,7 +2016,11 @@ datum
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.bodytemperature < 170)
M.adjustCloneLoss(-4)
M.adjustCloneLoss(-3)
M.adjustOxyLoss(-3)
M.heal_organ_damage(3,3)
M.adjustToxLoss(-3)
M.status_flags &= ~DISFIGURED
..()
return
@@ -2272,6 +2289,7 @@ datum
M.drowsyness = 0
M.stuttering = 0
M.confused = 0
M.reagents.remove_all_type(/datum/reagent/ethanol, 1*REM, 0, 1)
..()
return
@@ -2309,9 +2327,9 @@ datum
M.sleeping += 1
if(51 to INFINITY)
M.sleeping += 1
M:toxloss += (data - 50)
M.adjustToxLoss((data - 50)*REM)
holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM)
..()
return
beer2 //copypasta of chloral hydrate, disguised as normal beer for use by emagged brobots
@@ -2515,27 +2533,37 @@ datum
return
else if ( mouth_covered ) // Reduced effects if partially protected
victim << "\red Your [safe_thing] protect you from most of the pepperspray!"
victim.eye_blurry = max(M.eye_blurry, 15)
victim.eye_blind = max(M.eye_blind, 5)
victim.Stun(5)
victim.Weaken(5)
//victim.Paralyse(10)
//victim.drop_item()
if(prob(5))
victim.emote("scream")
victim.eye_blurry = max(M.eye_blurry, 3)
victim.eye_blind = max(M.eye_blind, 1)
victim.confused = max(M.confused, 3)
victim.damageoverlaytemp = 60
victim.Weaken(3)
victim.drop_item()
return
else if ( eyes_covered ) // Eye cover is better than mouth cover
victim << "\red Your [safe_thing] protects your eyes from the pepperspray!"
victim.emote("scream")
victim.eye_blurry = max(M.eye_blurry, 5)
victim.eye_blurry = max(M.eye_blurry, 3)
victim.damageoverlaytemp = 30
return
else // Oh dear :D
victim.emote("scream")
if(prob(5))
victim.emote("scream")
victim << "\red You're sprayed directly in the eyes with pepperspray!"
victim.eye_blurry = max(M.eye_blurry, 25)
victim.eye_blind = max(M.eye_blind, 10)
victim.Stun(5)
victim.eye_blurry = max(M.eye_blurry, 5)
victim.eye_blind = max(M.eye_blind, 2)
victim.confused = max(M.confused, 6)
victim.damageoverlaytemp = 75
victim.Weaken(5)
//victim.Paralyse(10)
//victim.drop_item()
victim.drop_item()
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(5))
M.visible_message("<span class='warning'>[M] [pick("dry heaves!","coughs!","splutters!")]</span>")
..()
return
frostoil
name = "Frost Oil"
@@ -2917,7 +2945,7 @@ datum
on_mob_life(var/mob/living/M as mob)
..()
if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1*REM)
if(M.getOxyLoss() && prob(30)) M.adjustOxyLoss(-1*REM)
return
tomatojuice
@@ -2967,15 +2995,16 @@ datum
id = "doctorsdelight"
description = "A gulp a day keeps the MediBot away. That's probably for the best."
reagent_state = LIQUID
nutriment_factor = 1 * FOOD_METABOLISM
color = "#664300" // rgb: 102, 67, 0
color = "#FF8CFF" // rgb: 255, 140, 255
on_mob_life(var/mob/living/M as mob)
M:nutrition += nutriment_factor
holder.remove_reagent(src.id, FOOD_METABOLISM)
if(!M) M = holder.my_atom
if(M:getToxLoss() && prob(80)) M:adjustToxLoss(-1)
if(M.getOxyLoss() && prob(80)) M.adjustOxyLoss(-2)
if(M.getBruteLoss() && prob(80)) M.heal_organ_damage(2,0)
if(M.getFireLoss() && prob(80)) M.heal_organ_damage(0,2)
if(M.getToxLoss() && prob(80)) M.adjustToxLoss(-2)
if(M.dizziness !=0) M.dizziness = max(0,M.dizziness-15)
if(M.confused !=0) M.confused = max(0,M.confused - 5)
..()
return
@@ -3014,11 +3043,31 @@ datum
description = "The raw essence of a banana."
color = "#863333" // rgb: 175, 175, 0
on_mob_life(var/mob/living/M as mob)
M.nutrition += nutriment_factor
if(istype(M, /mob/living/carbon/human) && M.job in list("Clown"))
if(!M) M = holder.my_atom
M.heal_organ_damage(1,1)
M.nutrition += nutriment_factor
..()
return
..()
nothing
name = "Nothing"
id = "nothing"
description = "Absolutely nothing."
on_mob_life(var/mob/living/M as mob)
M.nutrition += nutriment_factor
if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
if(!M) M = holder.my_atom
M.heal_organ_damage(1,1)
M.nutrition += nutriment_factor
..()
return
..()
potato_juice
name = "Potato Juice"
id = "potato"
@@ -3938,6 +3987,16 @@ datum
nutriment_factor = 1 * FOOD_METABOLISM
color = "#664300" // rgb: 102, 67, 0
on_mob_life(var/mob/living/M as mob)
M.nutrition += nutriment_factor
if(istype(M, /mob/living/carbon/human) && M.job in list("Clown"))
if(!M) M = holder.my_atom
M.heal_organ_damage(1,1)
M.nutrition += nutriment_factor
..()
return
..()
silencer
name = "Silencer"
id = "silencer"
@@ -3945,6 +4004,16 @@ datum
nutriment_factor = 1 * FOOD_METABOLISM
color = "#664300" // rgb: 102, 67, 0
on_mob_life(var/mob/living/M as mob)
M.nutrition += nutriment_factor
if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
if(!M) M = holder.my_atom
M.heal_organ_damage(1,1)
M.nutrition += nutriment_factor
..()
return
..()
changelingsting
name = "Changeling Sting"
id = "changelingsting"
+80 -1
View File
@@ -319,6 +319,13 @@ datum
required_reagents = list("carbon" = 1, "hydrogen" = 1, "anti_toxin" = 1)
result_amount = 2
inacusiate
name = "inacusiate"
id = "inacusiate"
result = "inacusiate"
required_reagents = list("water" = 1, "carbon" = 1, "anti_toxin" = 1)
result_amount = 2
ethylredoxrazine
name = "Ethylredoxrazine"
id = "ethylredoxrazine"
@@ -1397,6 +1404,78 @@ datum
var/obj/effect/golem_rune/Z = new /obj/effect/golem_rune
Z.loc = get_turf(holder.my_atom)
Z.announce_to_ghosts()
//Bluespace
slimecrystal
name = "Slime Crystal"
id = "m_crystal"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/bluespace
required_other = 1
on_reaction(var/datum/reagents/holder, var/created_volume)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
if(holder.my_atom)
var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom))
BC.visible_message("<span class='notice'>The [BC.name] appears out of thin air!</span>")
//Cerulean
slimepsteroid2
name = "Slime Steroid 2"
id = "m_steroid2"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/cerulean
required_other = 1
on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2
P.loc = get_turf(holder.my_atom)
//Sepia
slimecamera
name = "Slime Camera"
id = "m_camera"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
var/obj/item/device/camera/P = new /obj/item/device/camera
P.loc = get_turf(holder.my_atom)
slimefilm
name = "Slime Film"
id = "m_film"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
var/obj/item/device/camera_film/P = new /obj/item/device/camera_film
P.loc = get_turf(holder.my_atom)
//Pyrite
slimepaint
name = "Slime Paint"
id = "s_paint"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/pyrite
required_other = 1
on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
var/list/paints = typesof(/obj/item/weapon/reagent_containers/glass/paint) - /obj/item/weapon/reagent_containers/glass/paint
var/chosen = pick(paints)
var/obj/P = new chosen
if(P)
P.loc = get_turf(holder.my_atom)
//////////////////////////////////////////FOOD MIXTURES////////////////////////////////////
tofu
@@ -1697,7 +1776,7 @@ datum
name = "The Doctor's Delight"
id = "doctordelight"
result = "doctorsdelight"
required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1)
required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1, "tricordrazine" = 1)
result_amount = 5
irish_cream
@@ -15,14 +15,14 @@
var/recharge_time = 5 //Time it takes for shots to recharge (in seconds)
var/list/datum/reagents/reagent_list = list()
var/list/reagent_ids = list("tricordrazine", "inaprovaline", "spaceacillin")
var/list/reagent_ids = list("doctorsdelight", "inaprovaline", "spaceacillin")
//var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "anti_toxin", "inaprovaline", "spaceacillin")
/obj/item/weapon/reagent_containers/borghypo/surgeon
reagent_ids = list("bicaridine", "inaprovaline", "dexalin")
/obj/item/weapon/reagent_containers/borghypo/crisis
reagent_ids = list("tricordrazine", "inaprovaline", "tramadol")
reagent_ids = list("doctorsdelight", "inaprovaline", "tramadol")
/obj/item/weapon/reagent_containers/borghypo/New()
..()
@@ -1276,7 +1276,7 @@
New()
..()
reagents.add_reagent("nutriment", 4)
reagents.add_reagent("alchdranine", 5)
reagents.add_reagent("doctorsdelight", 5)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato
@@ -2205,7 +2205,7 @@
New()
..()
reagents.add_reagent("nutriment", 8)
reagents.add_reagent("alchdranine", 5)
reagents.add_reagent("doctorsdelight", 5)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/appletart
@@ -20,7 +20,7 @@
/obj/item/weapon/reagent_containers/hypospray/New() //comment this to make hypos start off empty
..()
reagents.add_reagent("tricordrazine", 30)
reagents.add_reagent("doctorsdelight", 30)
return
/obj/item/weapon/reagent_containers/hypospray/attack(mob/M as mob, mob/user as mob)
@@ -64,7 +64,7 @@
/obj/item/weapon/reagent_containers/hypospray/combat/New()
..()
reagents.remove_reagent("tricordrazine", 30)
reagents.remove_reagent("doctorsdelight", 30)
reagents.add_reagent("synaptizine", 30)
@@ -76,10 +76,11 @@
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5)
volume = 5
var/emagged = 0
/obj/item/weapon/reagent_containers/hypospray/autoinjector/New()
..()
reagents.remove_reagent("tricordrazine", 30)
reagents.remove_reagent("doctorsdelight", 30)
reagents.add_reagent("tramadol", 4)
reagents.add_reagent("hyperzine", 1)
update_icon()
@@ -87,8 +88,9 @@
/obj/item/weapon/reagent_containers/hypospray/autoinjector/attack(mob/M as mob, mob/user as mob)
..()
if(reagents.total_volume <= 0) //Prevents autoinjectors to be refilled.
flags &= ~OPENCONTAINER
if(!emagged)
if(reagents.total_volume <= 0) //Prevents autoinjectors to be refilled.
flags &= ~OPENCONTAINER
update_icon()
return
@@ -105,6 +107,13 @@
else
usr << "\blue It is spent."
/obj/item/weapon/reagent_containers/hypospray/autoinjector/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
if(istype(D, /obj/item/weapon/card/emag) && !emagged)
emagged = 1
user << "<span class='notice'>You bypass the electronic child-safety lock on the reagent storage.</span>"
else
..()
return
/obj/item/weapon/reagent_containers/hypospray/hyperzine
name = "emergency stimulant autoinjector"
+1 -1
View File
@@ -97,7 +97,7 @@
bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
if(!istype(Proj ,/obj/item/projectile/lasertag) && !istype(Proj ,/obj/item/projectile/practice) )
explode()
blob_act()
+1 -1
View File
@@ -207,7 +207,7 @@ datum/tech/bluespace
name = "'Blue-space' Research"
desc = "Research into the sub-reality known as 'blue-space'"
id = "bluespace"
max_level=4
max_level=6
datum/tech/biotech
name = "Biological Technology"
@@ -27,7 +27,7 @@ datum/chemical_reaction/coolant
/obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
if(!istype(Proj ,/obj/item/projectile/lasertag) && !istype(Proj ,/obj/item/projectile/practice) )
explode()
/obj/structure/reagent_dispensers/coolanttank/blob_act()