Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into shadowling

Conflicts:
	code/modules/mob/living/carbon/human/human.dm
	code/setup.dm
This commit is contained in:
DZD
2015-04-21 18:56:34 -04:00
219 changed files with 3416 additions and 2007 deletions
-3
View File
@@ -179,9 +179,6 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
facial_s.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD)
eyes_s.Blend(facial_s, ICON_OVERLAY)
if(H.species.bloodflags & BLOOD_SLIME)
var/icon/blendingslime = new/icon("icon" = 'icons/effects/slimemutant.dmi', "icon_state" = "[H.slime_color]_slime_[H.gender]_s")
preview_icon.Blend(blendingslime, ICON_OVERLAY)
var/icon/clothes_s = null
switch(H.mind.assigned_role)
-22
View File
@@ -262,7 +262,6 @@ client
body += "<option value='?_src_=vars;remverb=\ref[D]'>Remove Verb</option>"
if(ishuman(D))
body += "<option value>---</option>"
body += "<option value='?_src_=vars;setmutantrace=\ref[D]'>Set Mutantrace</option>"
body += "<option value='?_src_=vars;setspecies=\ref[D]'>Set Species</option>"
body += "<option value='?_src_=vars;makeai=\ref[D]'>Make AI</option>"
body += "<option value='?_src_=vars;makemask=\ref[D]'>Make Mask of Nar'sie</option>"
@@ -790,27 +789,6 @@ client
holder.Topic(href, list("makemask"=href_list["makemask"]))
else if(href_list["setmutantrace"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","slime","plant","shadow","tajaran","skrell","vox")
switch(new_mutantrace)
if(null)
return
if("NONE")
new_mutantrace = ""
if(!H)
usr << "Mob doesn't exist anymore"
return
if(H.dna)
H.dna.mutantrace = new_mutantrace
H.update_mutantrace()
else if(href_list["setspecies"])
if(!check_rights(R_SPAWN)) return
+366
View File
@@ -0,0 +1,366 @@
/datum/martial_art
var/name = "Martial Art"
var/streak = ""
var/max_streak_length = 6
var/current_target = null
var/temporary = 0
var/datum/martial_art/base = null // The permanent style
/datum/martial_art/proc/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
return 0
/datum/martial_art/proc/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
return 0
/datum/martial_art/proc/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
return 0
/datum/martial_art/proc/add_to_streak(var/element,var/mob/living/carbon/human/D)
if(D != current_target)
current_target = D
streak = ""
streak = streak+element
if(length(streak) > max_streak_length)
streak = copytext(streak,2)
return
/datum/martial_art/proc/basic_hit(var/mob/living/carbon/human/A,var/mob/living/carbon/human/D)
add_logs(A, D, "punched")
A.do_attack_animation(D)
var/damage = rand(0,9)
var/atk_verb = "punch"
if(D.lying)
atk_verb = "kick"
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
D.visible_message("<span class='warning'>[A] has attempted to [atk_verb] [D]!</span>")
return 0
var/obj/item/organ/external/affecting = D.get_organ(ran_zone(A.zone_sel.selecting))
var/armor_block = D.run_armor_check(affecting, "melee")
playsound(D.loc, 'sound/weapons/punch1.ogg', 25, 1, -1)
D.visible_message("<span class='danger'>[A] has [atk_verb]ed [D]!</span>", \
"<span class='userdanger'>[A] has [atk_verb]ed [D]!</span>")
D.apply_damage(damage, BRUTE, affecting, armor_block)
if((D.stat != DEAD) && damage >= 9)
D.visible_message("<span class='danger'>[A] has weakened [D]!!</span>", \
"<span class='userdanger'>[A] has weakened [D]!</span>")
D.apply_effect(4, WEAKEN, armor_block)
D.forcesay(hit_appends)
else if(D.lying)
D.forcesay(hit_appends)
return 1
/datum/martial_art/proc/teach(var/mob/living/carbon/human/H,var/make_temporary=0)
if(make_temporary)
temporary = 1
if(H.martial_art && H.martial_art.temporary)
if(temporary)
base = H.martial_art.base
else
H.martial_art.base = src //temporary styles have priority
return
H.martial_art = src
/datum/martial_art/proc/remove(var/mob/living/carbon/human/H)
if(H.martial_art != src)
return
H.martial_art = base
/datum/martial_art/boxing
name = "Boxing"
/datum/martial_art/boxing/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
A << "<span class='warning'> Can't disarm while boxing!</span>"
return 1
/datum/martial_art/boxing/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
A << "<span class='warning'> Can't grab while boxing!</span>"
return 1
/datum/martial_art/boxing/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_logs(A, D, "punched")
A.do_attack_animation(D)
var/atk_verb = pick("left hook","right hook","straight punch")
var/damage = rand(5,8)
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
D.visible_message("<span class='warning'>[A] has attempted to hit [D] with a [atk_verb]!</span>")
return 0
var/obj/item/organ/external/affecting = D.get_organ(ran_zone(A.zone_sel.selecting))
var/armor_block = D.run_armor_check(affecting, "melee")
playsound(D.loc, 'sound/weapons/punch1.ogg', 25, 1, -1)
D.visible_message("<span class='danger'>[A] has hit [D] with a [atk_verb]!</span>", \
"<span class='userdanger'>[A] has hit [D] with a [atk_verb]!</span>")
D.apply_damage(damage, STAMINA, affecting, armor_block)
if(D.getStaminaLoss() > 50)
var/knockout_prob = D.getStaminaLoss() + rand(-15,15)
if((D.stat != DEAD) && prob(knockout_prob))
D.visible_message("<span class='danger'>[A] has knocked [D] out with a haymaker!</span>", \
"<span class='userdanger'>[A] has knocked [D] out with a haymaker!</span>")
D.apply_effect(10,WEAKEN,armor_block)
D.SetSleeping(5)
D.forcesay(hit_appends)
else if(D.lying)
D.forcesay(hit_appends)
return 1
/datum/martial_art/drunk_brawling
name = "Drunken Brawling"
/datum/martial_art/drunk_brawling/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(prob(70))
A.visible_message("<span class='warning'>[A] tries to grab ahold of [D], but fails!</span>", \
"<span class='warning'>You fail to grab ahold of [D]!</span>")
return 1
D.grabbedby(A,1)
var/obj/item/weapon/grab/G = A.get_active_hand()
if(G)
D.visible_message("<span class='danger'>[A] grabs ahold of [D] drunkenly!</span>", \
"<span class='userdanger'>[A] grabs ahold of [D] drunkenly!</span>")
return 1
/datum/martial_art/drunk_brawling/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_logs(A, D, "punched")
A.do_attack_animation(D)
var/atk_verb = pick("jab","uppercut","overhand punch","drunken right hook","drunken left hook")
var/damage = rand(0,6)
if(atk_verb == "uppercut")
if(prob(90))
damage = 0
else //10% chance to do a massive amount of damage
damage = 14
if(prob(50)) //they are drunk, they aren't going to land half of their hits
damage = 0
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
D.visible_message("<span class='warning'>[A] has attempted to hit [D] with a [atk_verb]!</span>")
return 1 //returns 1 so that they actually miss and don't switch to attackhand damage
var/obj/item/organ/external/affecting = D.get_organ(ran_zone(A.zone_sel.selecting))
var/armor_block = D.run_armor_check(affecting, "melee")
playsound(D.loc, 'sound/weapons/punch1.ogg', 25, 1, -1)
D.visible_message("<span class='danger'>[A] has hit [D] with a [atk_verb]!</span>", \
"<span class='userdanger'>[A] has hit [D] with a [atk_verb]!</span>")
D.apply_damage(damage, BRUTE, null, armor_block)
D.apply_effect(damage, STAMINA, armor_block)
if(D.getStaminaLoss() > 50)
var/knockout_prob = D.getStaminaLoss() + rand(-15,15)
if((D.stat != DEAD) && prob(knockout_prob))
D.visible_message("<span class='danger'>[A] has knocked [D] out with a haymaker!</span>", \
"<span class='userdanger'>[A] has knocked [D] out with a haymaker!</span>")
D.apply_effect(10,WEAKEN,armor_block)
D.Paralyse(5)
D.forcesay(hit_appends)
else if(D.lying)
D.forcesay(hit_appends)
return 1
/datum/martial_art/wrestling
name = "Wrestling"
/datum/martial_art/wrestling/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
D.grabbedby(A,1)
var/obj/item/weapon/grab/G = A.get_active_hand()
if(G && prob(50))
G.state = GRAB_AGGRESSIVE
D.visible_message("<span class='danger'>[A] has [D] in a clinch!</span>", \
"<span class='userdanger'>[A] has [D] in a clinch!</span>")
else
D.visible_message("<span class='danger'>[A] fails to get [D] in a clinch!</span>", \
"<span class='userdanger'>[A] fails to get [D] in a clinch!</span>")
return 1
/datum/martial_art/wrestling/proc/Suplex(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_logs(A, D, "suplexed")
D.visible_message("<span class='danger'>[A] suplexes [D]!</span>", \
"<span class='userdanger'>[A] suplexes [D]!</span>")
D.forceMove(A.loc)
var/armor_block = D.run_armor_check(null, "melee")
D.apply_damage(30, BRUTE, null, armor_block)
D.apply_effect(6, WEAKEN, armor_block)
A.SpinAnimation(10,1)
D.SpinAnimation(10,1)
spawn(3)
armor_block = A.run_armor_check(null, "melee")
A.apply_effect(4, WEAKEN, armor_block)
return
/datum/martial_art/wrestling/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(istype(A.get_inactive_hand(),/obj/item/weapon/grab))
var/obj/item/weapon/grab/G = A.get_inactive_hand()
if(G.affecting == D)
Suplex(A,D)
return 1
harm_act(A,D)
return 1
/datum/martial_art/wrestling/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
D.grabbedby(A,1)
D.visible_message("<span class='danger'>[A] holds [D] down!</span>", \
"<span class='userdanger'>[A] holds [D] down!</span>")
var/obj/item/organ/external/affecting = D.get_organ(ran_zone(A.zone_sel.selecting))
var/armor_block = D.run_armor_check(affecting, "melee")
D.apply_damage(10, STAMINA, affecting, armor_block)
return 1
#define TORNADO_COMBO "HHD"
#define THROWBACK_COMBO "DHD"
#define PLASMA_COMBO "HDDDH"
/datum/martial_art/plasma_fist
name = "Plasma Fist"
/datum/martial_art/plasma_fist/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(findtext(streak,TORNADO_COMBO))
streak = ""
Tornado(A,D)
return 1
if(findtext(streak,THROWBACK_COMBO))
streak = ""
Throwback(A,D)
return 1
if(findtext(streak,PLASMA_COMBO))
streak = ""
Plasma(A,D)
return 1
return 0
/datum/martial_art/plasma_fist/proc/Tornado(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
A.say("TORNADO SWEEP!")
spawn(0)
for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH))
A.dir = i
playsound(A.loc, 'sound/weapons/punch1.ogg', 15, 1, -1)
sleep(1)
var/obj/effect/proc_holder/spell/wizard/aoe_turf/repulse/R = new(null)
var/list/turfs = list()
for(var/turf/T in range(1,A))
turfs.Add(T)
R.cast(turfs)
return
/datum/martial_art/plasma_fist/proc/Throwback(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
D.visible_message("<span class='danger'>[A] has hit [D] with Plasma Punch!</span>", \
"<span class='userdanger'>[A] has hit [D] with Plasma Punch!</span>")
playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A)))
D.throw_at(throw_target, 200, 4)
A.say("HYAH!")
return
/datum/martial_art/plasma_fist/proc/Plasma(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
A.do_attack_animation(D)
playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
A.say("PLASMA FIST!")
D.visible_message("<span class='danger'>[A] has hit [D] with THE PLASMA FIST TECHNIQUE!</span>", \
"<span class='userdanger'>[A] has hit [D] with THE PLASMA FIST TECHNIQUE!</span>")
D.gib()
return
/datum/martial_art/plasma_fist/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("H")
if(check_streak(A,D))
return 1
basic_hit(A,D)
return 1
/datum/martial_art/plasma_fist/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("D")
if(check_streak(A,D))
return 1
basic_hit(A,D)
return 1
/datum/martial_art/plasma_fist/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("G")
if(check_streak(A,D))
return 1
basic_hit(A,D)
return 1
//ITEMS
/obj/item/clothing/gloves/boxing
var/datum/martial_art/boxing/style = new
/obj/item/clothing/gloves/boxing/equipped(mob/user, slot)
if(!ishuman(user))
return
if(slot == slot_gloves)
var/mob/living/carbon/human/H = user
style.teach(H,1)
return
/obj/item/clothing/gloves/boxing/dropped(mob/user)
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
if(H.get_item_by_slot(slot_gloves) == src)
style.remove(H)
return
/obj/item/weapon/storage/belt/champion/wrestling
name = "Wrestling Belt"
var/datum/martial_art/wrestling/style = new
/obj/item/weapon/storage/belt/champion/wrestling/equipped(mob/user, slot)
if(!ishuman(user))
return
if(slot == slot_belt)
var/mob/living/carbon/human/H = user
style.teach(H,1)
return
/obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user)
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
if(H.get_item_by_slot(slot_belt) == src)
style.remove(H)
return
/obj/item/weapon/plasma_fist_scroll
name = "Plasma Fist Scroll"
desc = "Teaches the traditional wizard martial art."
icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2"
var/used = 0
/obj/item/weapon/plasma_fist_scroll/attack_self(mob/user as mob)
if(!ishuman(user))
return
if(!used)
var/mob/living/carbon/human/H = user
var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null)
F.teach(H)
H << "<span class='notice'>You learn the PLASMA FIST style.</span>"
used = 1
desc += "It looks like it's magic was used up."
+101
View File
@@ -0,0 +1,101 @@
/obj/item/device/pizza_bomb
name = "pizza box"
desc = "A box suited for pizzas."
icon = 'icons/obj/food.dmi'
icon_state = "pizzabox1"
var/timer = 10 //Adjustable timer
var/timer_set = 0
var/primed = 0
var/disarmed = 0
var/wires = list("orange", "green", "blue", "yellow", "aqua", "purple")
var/correct_wire
var/armer //Used for admin purposes
/obj/item/device/pizza_bomb/attack_self(mob/user)
if(disarmed)
user << "<span class='notice'>\The [src] is disarmed.</span>"
return
if(!timer_set)
name = "pizza bomb"
desc = "It seems inactive."
icon_state = "pizzabox_bomb"
timer_set = 1
timer = (input(user, "Set a timer, from one second to ten seconds.", "Timer", "[timer]") as num) * 10
if(!in_range(src, usr) || issilicon(usr) || !usr.canmove || usr.restrained())
timer_set = 0
name = "pizza box"
desc = "A box suited for pizzas."
icon_state = "pizzabox1"
return
timer = Clamp(timer, 10, 100)
icon_state = "pizzabox1"
user << "<span class='notice'>You set the timer to [timer / 10] before activating the payload and closing \the [src]."
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has set a timer on a pizza bomb to [timer/10] seconds at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>(JMP)</a>.")
log_game("[key_name(usr)] has set the timer on a pizza bomb to [timer/10] seconds ([loc.x],[loc.y],[loc.z]).")
armer = usr
name = "pizza box"
desc = "A box suited for pizzas."
return
if(!primed)
name = "pizza bomb"
desc = "OH GOD THAT'S NOT A PIZZA"
icon_state = "pizzabox_bomb"
audible_message("<span class='warning'>\icon[src] *beep* *beep*</span>")
user << "<span class='danger'>That's no pizza! That's a bomb!</span>"
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has triggered a pizza bomb armed by [armer] at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>(JMP)</a>.")
log_game("[key_name(usr)] has triggered a pizza bomb armed by [armer] ([loc.x],[loc.y],[loc.z]).")
primed = 1
sleep(timer)
return go_boom()
/obj/item/device/pizza_bomb/proc/go_boom()
if(disarmed)
visible_message("<span class='danger'>\icon[src] Sparks briefly jump out of the [correct_wire] wire on \the [src], but it's disarmed!")
return
src.audible_message("\icon[src] <b>[src]</b> beeps, \"Enjoy the pizza!\"")
src.visible_message("<span class='userdanger'>\The [src] violently explodes!</span>")
explosion(src.loc,1,2,4) //Identical to a minibomb
qdel(src)
/obj/item/device/pizza_bomb/attackby(var/obj/item/I, var/mob/user, params)
if(istype(I, /obj/item/weapon/wirecutters) && primed)
user << "<span class='danger'>Oh God, what wire do you cut?!</span>"
var/chosen_wire = input(user, "OH GOD OH GOD", "WHAT WIRE?!") in wires
if(!in_range(src, usr) || issilicon(usr) || !usr.canmove || usr.restrained())
return
playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1)
user.visible_message("<span class='warning'>[user] cuts the [chosen_wire] wire!</span>", "<span class='danger'>You cut the [chosen_wire] wire!</span>")
sleep(5)
if(chosen_wire == correct_wire)
src.audible_message("<span class='warning'>\icon[src] \The [src] suddenly stops beeping and seems lifeless.</span>")
user << "<span class='notice'>You did it!</span>"
icon_state = "pizzabox_bomb_[correct_wire]"
name = "pizza bomb"
desc = "A devious contraption, made of a small explosive payload hooked up to pressure-sensitive wires. It's disarmed."
disarmed = 1
primed = 0
return
else
user << "<span class='userdanger'>WRONG WIRE!</span>"
go_boom()
return
if(istype(I, /obj/item/weapon/wirecutters) && disarmed)
if(!in_range(user, src))
user << "<span class='warning'>You can't see the box well enough to cut the wires out.</span>"
return
user.visible_message("<span class='notice'>[user] starts removing the payload and wires from \the [src].</span>")
if(do_after(user, 40))
playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1)
user.unEquip(src)
user.visible_message("<span class='notice'>[user] removes the insides of \the [src]!</span>")
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(src.loc)
C.amount = 3
new /obj/item/weapon/bombcore/miniature(src.loc)
new /obj/item/pizzabox(src.loc)
qdel(src)
return
..()
/obj/item/device/pizza_bomb/New()
..()
correct_wire = pick(wires)
+101 -22
View File
@@ -48,6 +48,7 @@ var/list/uplink_items = list()
var/list/gamemodes = list() // Empty list means it is in all the gamemodes. Otherwise place the gamemode name here.
var/list/excludefrom = list() //Empty list does nothing. Place the name of gamemode you don't want this item to be available in here. This is so you dont have to list EVERY mode to exclude something.
var/list/job = null
var/surplus = 100 //Chance of being included in the surplus crate (when pick() selects it)
/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U)
if(item)
@@ -108,13 +109,6 @@ var/list/uplink_items = list()
cost = 8
job = list("Clown")
/datum/uplink_item/jobspecific/conversionkit
name = "Conversion Kit Bundle"
desc = "A bundle that comes with a professional revolver conversion kit and 1 box of .357 ammo. The kit allows you to convert your revolver to fire lethal rounds or vice versa, modification is nearly perfect and will not result in catastrophic failure."
item = /obj/item/weapon/storage/box/syndie_kit/conversion
cost = 12
job = list("Detective")
//Chef
/datum/uplink_item/jobspecific/specialsauce
name = "Chef Excellence's Special Sauce"
@@ -174,13 +168,6 @@ var/list/uplink_items = list()
cost = 6
job = list("Civilian")
/*
/datum/uplink_item/jobspecific/greytide
name = "Greytide Implant"
desc = "A box containing an implanter filled with a greytide implant when injected into another person makes them loyal to the greytide and your cause, unless of course they're already implanted by someone else. Loyalty ends if the implant is no longer in their system."
item = /obj/item/weapon/storage/box/syndie_kit/greytide
cost = 7
job = list("Civilian") */
//Bartender
/datum/uplink_item/jobspecific/drunkbullets
@@ -244,6 +231,7 @@ var/list/uplink_items = list()
desc = "A brutally simple syndicate revolver that fires .357 Magnum cartridges and has 7 chambers."
item = /obj/item/weapon/gun/projectile/revolver
cost = 13
surplus = 50
/datum/uplink_item/dangerous/smg
name = "Syndicate SMG"
@@ -251,6 +239,15 @@ var/list/uplink_items = list()
item = /obj/item/weapon/gun/projectile/automatic/c20r
cost = 14
gamemodes = list("nuclear emergency")
surplus = 40
/datum/uplink_item/dangerous/car
name = "C-90gl Compact Assault Rifle"
desc = "A fully-loaded Zashchita Industriya toploading bullpup assault rifle that uses 30-round 5.45x39mm magazines with a togglable underslung 40mm grenade launcher."
item = /obj/item/weapon/gun/projectile/automatic/c90gl
cost = 18
gamemodes = list("nuclear emergency")
surplus = 50
/datum/uplink_item/dangerous/machinegun
name = "Syndicate LMG"
@@ -258,6 +255,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/gun/projectile/automatic/l6_saw
cost = 40
gamemodes = list("nuclear emergency")
surplus = 0
/datum/uplink_item/dangerous/crossbow
name = "Energy Crossbow"
@@ -265,6 +263,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
cost = 12
excludefrom = list("nuclear emergency")
surplus = 50
/datum/uplink_item/dangerous/sword
name = "Energy Sword"
@@ -272,12 +271,19 @@ var/list/uplink_items = list()
item = /obj/item/weapon/melee/energy/sword
cost = 8
/datum/uplink_item/dangerous/chainsaw
name = "Chainsaw"
desc = "A high powered chainsaw for cutting up ...you know...."
item = /obj/item/weapon/twohanded/chainsaw
cost = 13
/datum/uplink_item/dangerous/manhacks
name = "Viscerator Delivery Grenade"
desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred any non-operatives in the area."
item = /obj/item/weapon/grenade/spawnergrenade/manhacks
cost = 8
gamemodes = list("nuclear emergency")
surplus = 35
/datum/uplink_item/dangerous/saringrenades
name = "Sarin Gas Grenades"
@@ -285,6 +291,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/box/syndie_kit/sarin
cost = 15
gamemodes = list("nuclear emergency")
surplus = 0
/datum/uplink_item/dangerous/emp
name = "EMP Kit"
@@ -305,6 +312,7 @@ var/list/uplink_items = list()
item = /obj/mecha/combat/gygax/dark/loaded
cost = 90
gamemodes = list("nuclear emergency")
surplus = 0
/datum/uplink_item/dangerous/mauler
name = "Mauler Exosuit"
@@ -312,6 +320,7 @@ var/list/uplink_items = list()
item = /obj/mecha/combat/marauder/mauler/loaded
cost = 140
gamemodes = list("nuclear emergency")
surplus = 0
/datum/uplink_item/dangerous/syndieborg
name = "Syndicate Cyborg"
@@ -319,6 +328,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/antag_spawner/borg_tele
cost = 50
gamemodes = list("nuclear emergency")
surplus = 0
//for refunding the syndieborg teleporter
/datum/uplink_item/dangerous/syndieborg/spawn_item()
@@ -330,6 +340,7 @@ var/list/uplink_items = list()
/datum/uplink_item/ammo
category = "Ammunition"
surplus = 40
/datum/uplink_item/ammo/pistol
name = "Ammo-10mm"
@@ -350,13 +361,6 @@ var/list/uplink_items = list()
cost = 2
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/car
name = "C-90gl Compact Assault Rifle"
desc = "A fully-loaded Zashchita Industriya toploading bullpup assault rifle that uses 30-round 5.45x39mm magazines with a togglable underslung 40mm grenade launcher."
item = /obj/item/weapon/gun/projectile/automatic/c90gl
cost = 18
gamemodes = list("nuclear emergency")
/datum/uplink_item/ammo/bullbuck
name = "Drum Magazine - 12g buckshot"
desc = "An additional 8-round buckshot magazine for use in the Bulldog shotgun. Front towards enemy."
@@ -398,7 +402,7 @@ var/list/uplink_items = list()
item = /obj/item/ammo_box/magazine/m762
cost = 12
gamemodes = list("nuclear emergency")
surplus = 0
// STEALTHY WEAPONS
@@ -417,6 +421,7 @@ var/list/uplink_items = list()
desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. You can also drop it underfoot to slip people."
item = /obj/item/weapon/soap/syndie
cost = 1
surplus = 50
/datum/uplink_item/stealthy_weapons/detomatix
name = "Detomatix PDA Cartridge"
@@ -431,6 +436,20 @@ var/list/uplink_items = list()
desc = "Fitted for use on any small caliber weapon with a threaded barrel, this suppressor will silence the shots of the weapon for increased stealth and superior ambushing capability."
item = /obj/item/weapon/suppressor
cost = 3
surplus = 10
/datum/uplink_item/stealthy_weapons/pizza_bomb
name = "Pizza Bomb"
desc = "A pizza box with a bomb taped inside of it. The timer needs to be set by opening the box; afterwards, opening the box again will trigger the detonation."
item = /obj/item/device/pizza_bomb
cost = 4
surplus = 8
/datum/uplink_item/stealthy_weapons/dehy_carp
name = "Dehydrated Space Carp"
desc = "Just add water to make your very own hostile to everything space carp. It looks just like a plushie."
item = /obj/item/toy/carpplushie/dehy_carp
cost = 3
// STEALTHY TOOLS
@@ -449,6 +468,7 @@ var/list/uplink_items = list()
it can also be used in a washing machine to forge clothing."
item = /obj/item/weapon/stamp/chameleon
cost = 1
surplus = 35
/datum/uplink_item/stealthy_tools/syndigolashes
name = "No-Slip Syndicate Shoes"
@@ -479,6 +499,7 @@ var/list/uplink_items = list()
desc = "Enables you to bug cameras to view them remotely. Adding particular items to it alters its functions."
item = /obj/item/device/camera_bug
cost = 2
surplus = 90
/datum/uplink_item/stealthy_tools/dnascrambler
name = "DNA Scrambler"
@@ -491,6 +512,7 @@ var/list/uplink_items = list()
desc = "This satchel is thin enough to be hidden in the gap between plating and tiling, great for stashing your stolen goods. Comes with a crowbar and a floor tile inside."
item = /obj/item/weapon/storage/backpack/satchel_flat
cost = 2
surplus = 30
// DEVICE AND TOOLS
@@ -531,6 +553,14 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/box/syndie_kit/space
cost = 5
/datum/uplink_item/device_tools/hardsuit
name = "Blood-red Hardsuit"
desc = "The feared suit of a syndicate nuclear agent. Features slightly better armoring. When the helmet is deployed your identity will be protected. Toggling the suit into combat mode \
will allow you all the mobility of a loose fitting uniform without sacrificing armoring. Additionally the suit is collapsible, small enough to fit within a backpack. \
Nanotrasen crewmembers are trained to report red space suit sightings, these suits in particular are known to drive employees into a panic."
item = /obj/item/weapon/storage/box/syndie_kit/hardsuit
cost = 8
/datum/uplink_item/device_tools/thermal
name = "Thermal Imaging Glasses"
desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
@@ -542,12 +572,14 @@ var/list/uplink_items = list()
desc = "A key, that when inserted into a radio headset, allows you to listen to and talk with artificial intelligences and cybernetic organisms in binary."
item = /obj/item/device/encryptionkey/binary
cost = 5
surplus = 75
/datum/uplink_item/device_tools/cipherkey
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
surplus = 75
/datum/uplink_item/device_tools/hacked_module
name = "Hacked AI Upload Module"
@@ -606,6 +638,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/circuitboard/teleporter
cost = 40
gamemodes = list("nuclear emergency")
surplus = 0
/datum/uplink_item/device_tools/shield
name = "Energy Shield"
@@ -613,6 +646,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/shield/energy
cost = 16
gamemodes = list("nuclear emergency")
surplus = 20
// IMPLANTS
@@ -630,6 +664,7 @@ var/list/uplink_items = list()
desc = "An implant injected into the body, and later activated using a bodily gesture to open an uplink with 5 telecrystals. The ability for an agent to open an uplink after their posessions have been stripped from them makes this implant excellent for escaping confinement."
item = /obj/item/weapon/implanter/uplink
cost = 20
surplus = 0
/datum/uplink_item/implants/explosive
name = "Explosive Implant"
@@ -659,6 +694,7 @@ var/list/uplink_items = list()
/datum/uplink_item/badass
category = "(Pointless) Badassery"
surplus = 0
/datum/uplink_item/badass/bundle
name = "Syndicate Bundle"
@@ -674,6 +710,14 @@ var/list/uplink_items = list()
item = /obj/item/toy/cards/deck/syndicate
cost = 1
excludefrom = list("nuclear emergency")
surplus = 40
/datum/uplink_item/badass/syndiecash
name = "Syndicate Briefcase Full of Cash"
desc = "A secure briefcase containing 5000 space credits. Useful for bribing personnel, or purchasing goods and services at lucrative prices. \
The briefcase also feels a little heavier to hold; it has been manufactured to pack a little bit more of a punch if your client needs some convincing."
item = /obj/item/weapon/storage/secure/briefcase/syndie
cost = 1
/datum/uplink_item/badass/balloon
name = "For showing that you are The Boss"
@@ -705,3 +749,38 @@ var/list/uplink_items = list()
U.uses -= max(0, I.cost)
feedback_add_details("traitor_uplink_items_bought","RN")
return new I.item(loc)
/datum/uplink_item/badass/surplus_crate
name = "Syndicate Surplus Crate"
desc = "A crate containing 50 telecrystals worth of random syndicate leftovers."
cost = 20
item = /obj/item/weapon/storage/box/syndicate
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/badass/surplus_crate/spawn_item(turf/loc, obj/item/device/uplink/U)
var/obj/structure/closet/crate/C = new(loc)
var/list/temp_uplink_list = get_uplink_items()
var/list/buyable_items = list()
for(var/category in temp_uplink_list)
buyable_items += temp_uplink_list[category]
var/list/bought_items = list()
U.uses -= cost
U.used_TC = 20
var/remaining_TC = 50
var/datum/uplink_item/I
while(remaining_TC)
I = pick(buyable_items)
if(!I.surplus)
continue
if(I.cost > remaining_TC)
continue
if((I.item in bought_items) && prob(33)) //To prevent people from being flooded with the same thing over and over again.
continue
bought_items += I.item
remaining_TC -= I.cost
U.purchase_log += "<BIG>\icon[C]</BIG>"
for(var/item in bought_items)
new item(C)
U.purchase_log += "<BIG>\icon[item]</BIG>"