mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-29 06:57:42 +01:00
Merge branch 'master' of https://github.com/ZomgPonies/Paradise
Conflicts: icons/obj/weapons.dmi maps/cyberiad.dmm
This commit is contained in:
@@ -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]")
|
||||
|
||||
Reference in New Issue
Block a user