mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-16 17:43:35 +01:00
Merge branch 'master' of https://github.com/ZomgPonies/Paradise
Conflicts: icons/obj/weapons.dmi maps/cyberiad.dmm
This commit is contained in:
@@ -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.",\
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ///////////
|
||||
//////////////////////////////////
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user