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

This commit is contained in:
Aurorablade
2016-08-16 02:23:20 -04:00
740 changed files with 18761 additions and 24292 deletions
+25 -13
View File
@@ -91,13 +91,13 @@ RCD
data["max_matter"] = max_matter
data["one_access"] = one_access
data["locked"] = locked
if(menu == 2)
var/list/door_types_list = list()
for(var/type in allowed_door_types)
door_types_list[++door_types_list.len] = list("name" = allowed_door_types[type], "type" = type)
data["allowed_door_types"] = door_types_list
data["door_accesses"] = door_accesses_list
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
@@ -110,14 +110,14 @@ RCD
/obj/item/weapon/rcd/Topic(href, href_list, nowindow, state)
if(..())
return 1
if(prob(20))
spark_system.start()
if(href_list["mode"])
mode = text2num(href_list["mode"])
. = 1
if(href_list["door_type"])
var/new_door_type = text2path(href_list["door_type"])
if(!(new_door_type in allowed_door_types))
@@ -125,11 +125,11 @@ RCD
return
door_type = new_door_type
. = 1
if(href_list["menu"])
menu = text2num(href_list["menu"])
. = 1
if(href_list["login"])
if(istype(usr,/mob/living/silicon))
locked = 0
@@ -142,15 +142,15 @@ RCD
if(istype(ID) && ID && check_access(ID))
locked = 0
. = 1
if(href_list["logout"])
locked = 1
. = 1
if(href_list["toggle_one_access"] && !locked)
one_access = !one_access
. = 1
if(href_list["toggle_access"] && !locked)
var/href_access = text2num(href_list["toggle_access"])
if(href_access in door_accesses)
@@ -251,10 +251,10 @@ RCD
qdel(A)
return 1
return 0
if(istype(A, /obj/structure/window)) // You mean the grille of course, do you?
A = locate(/obj/structure/grille) in A.loc
if(istype(A, /obj/structure/grille))
if(!checkResource(2, user))
return 0
@@ -326,7 +326,7 @@ RCD
else
to_chat(user, "ERROR: RCD in MODE: [mode] attempted use by [user]. Send this text #coderbus or an admin.")
return 0
nanomanager.update_uis(src)
/obj/item/weapon/rcd/proc/useResource(var/amount, var/mob/user)
@@ -354,6 +354,18 @@ RCD
desc = "A device used to rapidly build and deconstruct walls and floors."
canRwall = 1
/obj/item/weapon/rcd/proc/detonate_pulse()
audible_message("<span class='danger'><b>[src] begins to vibrate and \
buzz loudly!</b></span>","<span class='danger'><b>[src] begins \
vibrating violently!</b></span>")
// 5 seconds to get rid of it
addtimer(src, "detonate_pulse_explode", 50)
/obj/item/weapon/rcd/proc/detonate_pulse_explode()
explosion(src, 0, 0, 3, 1, flame_range = 1)
qdel(src)
/obj/item/weapon/rcd/combat
name = "combat RCD"
max_matter = 500
@@ -64,7 +64,7 @@
//Play sound through the station intercomms, so everyone knows the doom you have wrought.
for(var/O in global_intercoms)
var/obj/item/device/radio/intercom/I = O
if(I.z != ZLEVEL_STATION) //Only broadcast to the station intercoms
if(!is_station_level(I.z)) //Only broadcast to the station intercoms
continue
if(!I.on) //Only broadcast to active intercoms (powered, switched on)
continue
@@ -75,4 +75,4 @@
var/mob/living/simple_animal/hostile/poison/bees/syndi/B = new /mob/living/simple_animal/hostile/poison/bees/syndi(null)
B.master_and_friends = blood_list //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood
B.forceMove(get_turf(user)) //RELEASE THE BEES!
bees_left -= 5
bees_left -= 5
+36 -5
View File
@@ -105,13 +105,13 @@
var/photo
var/dat
var/stamped = 0
var/obj/item/weapon/card/id/guest/guest_pass = null // Guest pass attached to the ID
/obj/item/weapon/card/id/New()
..()
spawn(30)
if(ishuman(loc))
if(ishuman(loc) && blood_type == "\[UNSET\]")
var/mob/living/carbon/human/H = loc
SetOwnerInfo(H)
@@ -242,10 +242,10 @@
set name = "Remove Guest Pass"
set category = "Object"
set src in range(0)
if(usr.stat || !usr.canmove || usr.restrained())
return
if(guest_pass)
to_chat(usr, "<span class='notice'>You remove the guest pass from this ID.</span>")
guest_pass.forceMove(get_turf(src))
@@ -253,6 +253,37 @@
else
to_chat(usr, "<span class='warning'>There is no guest pass attached to this ID</span>")
/obj/item/weapon/card/id/serialize()
var/list/data = ..()
data["sex"] = sex
data["age"] = age
data["btype"] = blood_type
data["dna_hash"] = dna_hash
data["fprint_hash"] = fingerprint_hash
data["access"] = access
data["job"] = assignment
data["account"] = associated_account_number
data["owner"] = registered_name
data["mining"] = mining_points
return data
/obj/item/weapon/card/id/deserialize(list/data)
sex = data["sex"]
age = data["age"]
blood_type = data["btype"]
dna_hash = data["dna_hash"]
fingerprint_hash = data["fprint_hash"]
access = data["access"] // No need for a copy, the list isn't getting touched
assignment = data["job"]
associated_account_number = data["account"]
registered_name = data["owner"]
mining_points = data["mining"]
// We'd need to use icon serialization(b64) to save the photo, and I don't feel like i
UpdateName()
RebuildHTML()
..()
/obj/item/weapon/card/id/silver
name = "identification card"
desc = "A silver card which shows honour and dedication."
@@ -767,4 +798,4 @@
if("TDgreen")
return "Thunderdome Green"
else
return capitalize(skin)
return capitalize(skin)
+1
View File
@@ -23,6 +23,7 @@ var/global/list/moneytypes=list(
throw_speed = 1
throw_range = 2
w_class = 1
burn_state = FLAMMABLE
var/access = list()
access = access_crate_cash
var/worth = 1 // Per chip
+11 -6
View File
@@ -59,6 +59,9 @@ LIGHTERS ARE IN LIGHTERS.DM
return ..()
/obj/item/clothing/mask/cigarette/fire_act()
light()
/obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/weapon/weldingtool))
@@ -110,7 +113,7 @@ LIGHTERS ARE IN LIGHTERS.DM
to_chat(user, "<span class='notice'>[src] is full.</span>")
/obj/item/clothing/mask/cigarette/proc/light(var/flavor_text = "[usr] lights the [name].")
/obj/item/clothing/mask/cigarette/proc/light(flavor_text = null)
if(!src.lit)
src.lit = 1
damtype = "fire"
@@ -136,8 +139,9 @@ LIGHTERS ARE IN LIGHTERS.DM
reagents.handle_reactions()
icon_state = icon_on
item_state = icon_on
var/turf/T = get_turf(src)
T.visible_message(flavor_text)
if(flavor_text)
var/turf/T = get_turf(src)
T.visible_message(flavor_text)
set_light(2, 0.25, "#E38F46")
processing_objects.Add(src)
@@ -321,14 +325,15 @@ LIGHTERS ARE IN LIGHTERS.DM
..()
reagents.add_reagent("nicotine", chem_volume)
/obj/item/clothing/mask/cigarette/pipe/light(var/flavor_text = "[usr] lights the [name].")
/obj/item/clothing/mask/cigarette/pipe/light(flavor_text = null)
if(!src.lit)
src.lit = 1
damtype = "fire"
icon_state = icon_on
item_state = icon_on
var/turf/T = get_turf(src)
T.visible_message(flavor_text)
if(flavor_text)
var/turf/T = get_turf(src)
T.visible_message(flavor_text)
processing_objects.Add(src)
/obj/item/clothing/mask/cigarette/pipe/process()
+25 -1
View File
@@ -105,4 +105,28 @@
desc = "Damn son, where'd you find this?"
icon_state = "air_horn"
honk_sound = 'sound/items/AirHorn2.ogg'
cooldowntime = 50
cooldowntime = 50
/obj/item/weapon/bikehorn/golden
name = "golden bike horn"
desc = "Golden? Clearly, its made with bananium! Honk!"
icon_state = "gold_horn"
item_state = "gold_horn"
/obj/item/weapon/bikehorn/golden/attack()
flip_mobs()
return ..()
/obj/item/weapon/bikehorn/golden/attack_self(mob/user)
flip_mobs()
..()
/obj/item/weapon/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user)
if(!spam_flag)
var/turf/T = get_turf(src)
for(M in ohearers(7, T))
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf)
continue
M.emote("flip")
@@ -11,6 +11,7 @@
throwforce = 6.0
w_class = 2
attack_verb = list("bashed", "battered", "judged", "whacked")
burn_state = FLAMMABLE
/obj/item/weapon/gavelhammer/suicide_act(mob/user)
user.visible_message("<span class='warning'>[user] has sentenced \himself to death with the [src.name]! It looks like \he's trying to commit suicide.</span>")
@@ -25,6 +26,7 @@
force = 2.0
throwforce = 2.0
w_class = 1
burn_state = FLAMMABLE
/obj/item/weapon/gavelblock/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/gavelhammer))
+1 -1
View File
@@ -69,7 +69,7 @@
ratio = Ceiling(ratio*4) * 25
overlays += "[icon_state]-charge[ratio]"
/obj/item/weapon/defibrillator/CheckParts()
/obj/item/weapon/defibrillator/CheckParts(list/parts_list)
..()
bcell = locate(/obj/item/weapon/stock_parts/cell) in contents
update_icon()
@@ -23,12 +23,12 @@
return
if(M == user)
user.visible_message("\red <b>[user.name] injects \himself with [src]!</b>")
user.visible_message("<span class='danger'>[user.name] injects \himself with [src]!</span>")
src.injected(user,user)
else
user.visible_message("\red <b>[user.name] is trying to inject [M.name] with [src]!</b>")
user.visible_message("<span class='danger'>[user.name] is trying to inject [M.name] with [src]!</span>")
if(do_mob(user,M,30))
user.visible_message("\red <b>[user.name] injects [M.name] with [src].</b>")
user.visible_message("<span class='danger'>[user.name] injects [M.name] with [src].</span>")
src.injected(M, user)
else
to_chat(user, "\red You failed to inject [M.name].")
@@ -164,10 +164,13 @@
update_icon()
return
/obj/item/weapon/flamethrower/CheckParts()
/obj/item/weapon/flamethrower/CheckParts(list/parts_list)
..()
weldtool = locate(/obj/item/weapon/weldingtool) in contents
igniter = locate(/obj/item/device/assembly/igniter) in contents
weldtool.status = 0
igniter.secured = 0
status = 1
update_icon()
//Called from turf.dm turf/dblclick
@@ -13,6 +13,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "gift1"
item_state = "gift1"
burn_state = FLAMMABLE
/obj/item/weapon/a_gift/New()
..()
@@ -139,6 +140,7 @@
flags = NOBLUDGEON
amount = 25
max_amount = 25
burn_state = FLAMMABLE
/obj/item/stack/wrapping_paper/attack_self(mob/user)
to_chat(user, "<span class='notice'>You need to use it on a package that has already been wrapped!</span>")
@@ -0,0 +1,24 @@
/obj/item/weapon/grenade/gas
name = "Plasma Fire Grenade"
desc = "A compressed plasma grenade, used to start horrific plasma fires."
origin_tech = "materials=3;magnets=4;syndicate=4"
icon = 'icons/obj/grenade.dmi'
icon_state = "syndicate"
item_state = "flashbang"
var/spawn_contents = SPAWN_HEAT | SPAWN_TOXINS
var/spawn_amount = 100
/obj/item/weapon/grenade/gas/prime()
var/turf/simulated/target_turf = get_turf(src)
if(istype(target_turf))
target_turf.atmos_spawn_air(spawn_contents, spawn_amount)
target_turf.air_update_turf()
qdel(src)
/obj/item/weapon/grenade/gas/knockout
name = "Knockout Grenade"
desc = "A grenade that completely removes all air and heat from its detonation area."
spawn_contents = SPAWN_20C | SPAWN_N2O
@@ -242,6 +242,16 @@
desc = "Reserved for those pesky request."
payload = /mob/living/simple_animal/crab
/obj/item/weapon/grenade/clusterbuster/plasma
name = "Plasma Cluster Grenade"
desc = "For when everything needs to die in a fire."
payload = /obj/item/weapon/grenade/gas
/obj/item/weapon/grenade/clusterbuster/n2o
name = "N2O Cluster Grenade"
desc = "For when you need to knock out EVERYONE."
payload = /obj/item/weapon/grenade/gas/knockout
////////////Clusterbuster of Clusterbusters////////////
/obj/item/weapon/grenade/clusterbuster/mega_fox
@@ -93,7 +93,7 @@
else
range = pick(2,2,2,3,3,3,4)
/obj/item/weapon/grenade/iedcasing/CheckParts()
/obj/item/weapon/grenade/iedcasing/CheckParts(list/parts_list)
..()
var/obj/item/weapon/reagent_containers/food/drinks/cans/can = locate() in contents
if(can)
@@ -9,6 +9,8 @@
throw_range = 20
flags = CONDUCT
slot_flags = SLOT_BELT
burn_state = FLAMMABLE
burntime = 5
var/active = 0
var/det_time = 50
var/display_timer = 1
+16 -2
View File
@@ -66,7 +66,7 @@
name = "cable restraints"
desc = "Looks like some cables tied together. Could be used to tie something up."
icon_state = "cuff_white"
item_state = "coil_red"
materials = list(MAT_METAL=150, MAT_GLASS=75)
breakouttime = 300 //Deciseconds = 30s
cuffsound = 'sound/weapons/cablecuff.ogg'
@@ -114,14 +114,28 @@
to_chat(user, "<span class='notice'>You wrap the cable restraint around the top of the rod.</span>")
qdel(src)
else
to_chat(user, "<span class='warning'>You need one rod to make a wired rod.</span>")
to_chat(user, "<span class='warning'>You need one rod to make a wired rod!</span>")
else if(istype(I, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = I
if(M.amount < 6)
to_chat(user, "<span class='warning'>You need at least six metal sheets to make good enough weights!</span>")
return
to_chat(user, "<span class='notice'>You begin to apply [I] to [src]...</span>")
if(do_after(user, 35, target = src))
var/obj/item/weapon/restraints/legcuffs/bola/S = new /obj/item/weapon/restraints/legcuffs/bola
M.use(6)
user.put_in_hands(S)
to_chat(user, "<span class='notice'>You make some weights out of [I] and tie them to [src].</span>")
if(!remove_item_from_storage(user))
user.unEquip(src)
qdel(src)
/obj/item/weapon/restraints/handcuffs/cable/zipties
name = "zipties"
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
icon_state = "cuff_white"
breakouttime = 450 //Deciseconds = 45s
materials = list()
trashtype = /obj/item/weapon/restraints/handcuffs/cable/zipties/used
/obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user)
@@ -212,7 +212,7 @@
if(candidates.len)
theghost = pick(candidates)
var/mob/living/simple_animal/shade/S = new(src)
var/mob/living/simple_animal/shade/sword/S = new(src)
S.real_name = name
S.name = name
S.ckey = theghost.ckey
@@ -227,7 +227,7 @@
possessed = FALSE
/obj/item/weapon/nullrod/scythe/talking/Destroy()
for(var/mob/living/simple_animal/shade/S in contents)
for(var/mob/living/simple_animal/shade/sword/S in contents)
to_chat(S, "You were destroyed!")
S.ghostize()
qdel(S)
@@ -54,7 +54,7 @@
//ticker.mode:implanter[user.mind] += H.mind
ticker.mode:implanter[ref] = implanters
ticker.mode.traitors += H.mind
H.mind.special_role = "traitor"
H.mind.special_role = SPECIAL_ROLE_TRAITOR
to_chat(H, "<span class='warning'><B>You're now completely loyal to [user.name]!</B> You now must lay down your life to protect them and assist in their goals at any cost.</span>")
var/datum/objective/protect/mindslave/MS = new
MS.owner = H.mind
+80 -95
View File
@@ -15,12 +15,17 @@
name = "bear trap"
throw_speed = 1
throw_range = 1
icon_state = "beartrap0"
icon_state = "beartrap"
desc = "A trap used to catch bears and other legged creatures."
var/armed = 0
var/trap_damage = 20
var/obj/item/weapon/grenade/iedcasing/IED = null
var/obj/item/device/assembly/signaler/sig = null
/obj/item/weapon/restraints/legcuffs/beartrap/New()
..()
icon_state = "[initial(icon_state)][armed]"
/obj/item/weapon/restraints/legcuffs/beartrap/Destroy()
if(IED)
qdel(IED)
@@ -35,14 +40,14 @@
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return (BRUTELOSS)
/obj/item/weapon/restraints/legcuffs/beartrap/attack_self(mob/user as mob)
/obj/item/weapon/restraints/legcuffs/beartrap/attack_self(mob/user)
..()
if(ishuman(user) && !user.stat && !user.restrained())
armed = !armed
icon_state = "beartrap[armed]"
icon_state = "[initial(icon_state)][armed]"
to_chat(user, "<span class='notice'>[src] is now [armed ? "armed" : "disarmed"]</span>")
/obj/item/weapon/restraints/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive.
/obj/item/weapon/restraints/legcuffs/beartrap/attackby(obj/item/I, mob/user) //Let's get explosive.
if(istype(I, /obj/item/weapon/grenade/iedcasing))
if(IED)
to_chat(user, "<span class='warning'>This beartrap already has an IED hooked up to it!</span>")
@@ -101,7 +106,7 @@
if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/hostile/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
var/mob/living/L = AM
armed = 0
icon_state = "beartrap0"
icon_state = "[initial(icon_state)][armed]"
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
L.visible_message("<span class='danger'>[L] triggers \the [src].</span>", \
"<span class='userdanger'>You trigger \the [src]!</span>")
@@ -122,105 +127,85 @@
if(ishuman(AM))
var/mob/living/carbon/H = AM
if(H.lying)
H.apply_damage(20,BRUTE,"chest")
H.apply_damage(trap_damage, BRUTE,"chest")
else
H.apply_damage(20,BRUTE,(pick("l_leg", "r_leg")))
H.apply_damage(trap_damage, BRUTE,(pick("l_leg", "r_leg")))
if(!H.legcuffed) //beartrap can't cuff you leg if there's already a beartrap or legcuffs.
H.legcuffed = src
src.loc = H
H.update_inv_legcuffed(0)
forceMove(H)
H.update_inv_legcuffed()
feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart.
else
L.apply_damage(20,BRUTE)
L.apply_damage(trap_damage, BRUTE)
..()
/obj/item/weapon/restraints/legcuffs/beartrap/energy
name = "energy snare"
armed = 1
icon_state = "e_snare"
trap_damage = 0
/obj/item/weapon/legcuffs/bolas
name = "bolas"
desc = "An entangling bolas. Throw at your foes to trip them and prevent them from running."
/obj/item/weapon/restraints/legcuffs/beartrap/energy/New()
..()
spawn(100)
if(!istype(loc, /mob))
var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
sparks.set_up(1, 1, src)
sparks.start()
qdel(src)
/obj/item/weapon/restraints/legcuffs/beartrap/energy/dropped()
..()
qdel(src)
/obj/item/weapon/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
Crossed(user) //honk
/obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg
breakouttime = 20 // Cyborgs shouldn't have a strong restraint
/obj/item/weapon/restraints/legcuffs/bola
name = "bola"
desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly."
icon_state = "bola"
breakouttime = 35//easy to apply, easy to break out of
gender = NEUTER
icon = 'icons/obj/weapons.dmi'
icon_state = "bolas"
slot_flags = SLOT_BELT
throwforce = 2
origin_tech = "engineering=3;combat=1"
var/weaken = 0
/obj/item/weapon/restraints/legcuffs/bola/throw_impact(atom/hit_atom)
if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
return//abort
var/mob/living/carbon/C = hit_atom
if(!C.legcuffed)
visible_message("<span class='danger'>[src] ensnares [C]!</span>")
C.legcuffed = src
forceMove(C)
C.update_inv_legcuffed()
feedback_add_details("handcuffs","B")
to_chat(C, "<span class='userdanger'>[src] ensnares you!</span>")
C.Weaken(weaken)
/obj/item/weapon/restraints/legcuffs/bola/tactical //traitor variant
name = "reinforced bola"
desc = "A strong bola, made with a long steel chain. It looks heavy, enough so that it could trip somebody."
icon_state = "bola_r"
breakouttime = 70
origin_tech = "engineering=4;combat=3"
weaken = 1
/obj/item/weapon/restraints/legcuffs/bola/energy //For Security
name = "energy bola"
desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
icon_state = "ebola"
hitsound = 'sound/weapons/tase.ogg'
w_class = 2
origin_tech = "materials=1"
attack_verb = list("lashed", "bludgeoned", "whipped")
force = 4
breakouttime = 50 //10 seconds
throw_speed = 1
throw_range = 10
var/dispenser = 0
var/throw_sound = 'sound/weapons/whip.ogg'
var/trip_prob = 60
var/thrown_from
breakouttime = 60
/obj/item/weapon/legcuffs/bolas/suicide_act(mob/living/user)
to_chat(viewers(user), "<span class='danger'>[user] is wrapping the [src.name] around \his neck! It looks like \he's trying to commit suicide.</span>")
return(OXYLOSS)
/obj/item/weapon/legcuffs/bolas/throw_at(var/atom/A, throw_range, throw_speed)
if(usr && !istype(thrown_from, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas)) //if there is a user, but not a mech
if(istype(usr, /mob/living/carbon/human)) //if the user is human
var/mob/living/carbon/human/H = usr
if((CLUMSY in H.mutations) && prob(50))
to_chat(H, "<span class='warning'>You smack yourself in the face while swinging the [src]!</span>")
H.Stun(2)
H.drop_item(src)
return
if(!thrown_from && usr) //if something hasn't set it already (like a mech does when it launches)
thrown_from = usr //then the user must have thrown it
if(!istype(thrown_from, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas))
playsound(src, throw_sound, 20, 1) //because mechs play the sound anyways
var/turf/target = get_turf(A)
var/atom/movable/adjtarget = new /atom/movable
var/xadjust = 0
var/yadjust = 0
var/scaler = 0 //used to changed the normalised vector to the proper size
scaler = throw_range / max(abs(target.x - src.x), abs(target.y - src.y)) //whichever is larger magnitude is what we normalise to
if(target.x - src.x != 0) //just to avoid fucking with math for no reason
xadjust = round((target.x - src.x) * scaler) //normalised vector is now scaled up to throw_range
adjtarget.x = src.x + xadjust //the new target at max range
else
adjtarget.x = src.x
if(target.y - src.y != 0)
yadjust = round((target.y - src.y) * scaler)
adjtarget.y = src.y + yadjust
else
adjtarget.y = src.y
// log_admin("Adjusted target of [adjtarget.x] and [adjtarget.y], adjusted with [xadjust] and [yadjust] from [scaler]")
..(get_turf(adjtarget), throw_range, throw_speed)
thrown_from = null
/obj/item/weapon/legcuffs/bolas/throw_impact(atom/hit_atom) //Pomf was right, I was wrong - Comic
if(isliving(hit_atom) && hit_atom != usr) //if the target is a live creature other than the thrower
var/mob/living/M = hit_atom
if(ishuman(M)) //if they're a human species
var/mob/living/carbon/human/H = M
if(H.legcuffed) //if the target is already legcuffed (has to be walking)
throw_failed()
return
if(prob(trip_prob)) //this probability is up for change and mostly a placeholder - Comic
step(H, H.dir)
H.visible_message("<span class='warning'>[H] was tripped by the bolas!</span>","<span class='warning'>Your legs have been tangled!</span>");
H.Stun(2) //used instead of setting damage in vars to avoid non-human targets being affected
H.Weaken(4)
H.legcuffed = src //applies legcuff properties inherited through legcuffs
src.loc = H
H.update_inv_legcuffed()
if(!H.legcuffed) //in case it didn't happen, we need a safety net
throw_failed()
else
M.Stun(2) //minor stun damage to anything not human
throw_failed()
return
/obj/item/weapon/legcuffs/bolas/proc/throw_failed() //called when the throw doesn't entangle
//log_admin("Logged as [thrown_from]")
if(!thrown_from || !istype(thrown_from, /mob/living)) //in essence, if we don't know whether a person threw it
qdel(src) //destroy it, to stop infinite bolases
/obj/item/weapon/legcuffs/bolas/Bump()
..()
throw_failed() //allows a mech bolas to be destroyed
/obj/item/weapon/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
if(iscarbon(hit_atom))
var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
B.Crossed(hit_atom)
qdel(src)
..()
@@ -20,6 +20,28 @@
to_chat(viewers(user), "<span class='suicide'>[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.</span>")
return (OXYLOSS)
/obj/item/weapon/melee/rapier
name = "captain's rapier"
desc = "An elegant weapon, for a more civilized age."
icon_state = "rapier"
item_state = "rapier"
flags = CONDUCT
force = 15
throwforce = 10
w_class = 4
block_chance = 50
armour_penetration = 75
sharp = 1
edge = 1
origin_tech = "combat=5"
attack_verb = list("lunged at", "stabbed")
hitsound = 'sound/weapons/slash.ogg'
materials = list(MAT_METAL = 1000)
/obj/item/weapon/melee/rapier/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
if(attack_type == PROJECTILE_ATTACK)
final_block_chance = 0 //Don't bring a sword to a gunfight
return ..()
/obj/item/weapon/melee/icepick
name = "ice pick"
+1
View File
@@ -11,6 +11,7 @@
throw_range = 7
w_class = 3
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
burn_state = FLAMMABLE
var/mopping = 0
var/mopcount = 0
var/mopcap = 5
+43 -206
View File
@@ -1,7 +1,5 @@
//NEVER USE THIS IT SUX -PETETHEGOAT
var/global/list/cached_icons = list()
/obj/item/weapon/reagent_containers/glass/paint
desc = "It's a paint bucket."
name = "paint bucket"
@@ -10,220 +8,59 @@ var/global/list/cached_icons = list()
item_state = "paintcan"
materials = list(MAT_METAL=200)
w_class = 3
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(10,20,30,50,70)
burn_state = FLAMMABLE
burntime = 5
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5,10,20,30,50,70)
volume = 70
flags = OPENCONTAINER
var/paint_type = ""
afterattack(turf/simulated/target, mob/user, proximity)
if(!proximity) return
if(istype(target) && reagents.total_volume > 5)
for(var/mob/O in viewers(user))
O.show_message("\red \The [target] has been splashed with something by [user]!", 1)
spawn(5)
reagents.reaction(target, TOUCH)
reagents.remove_any(5)
else
return ..()
New()
if(paint_type == "remover")
name = "paint remover bucket"
else if(paint_type && lentext(paint_type) > 0)
name = paint_type + " " + name
..()
reagents.add_reagent("paint_[paint_type]", volume)
red
icon_state = "paint_red"
paint_type = "red"
green
icon_state = "paint_green"
paint_type = "green"
blue
icon_state = "paint_blue"
paint_type = "blue"
yellow
icon_state = "paint_yellow"
paint_type = "yellow"
violet
icon_state = "paint_violet"
paint_type = "violet"
black
icon_state = "paint_black"
paint_type = "black"
white
icon_state = "paint_white"
paint_type = "white"
remover
paint_type = "remover"
/*
/obj/item/weapon/paint
name = "Paint Can"
desc = "Used to recolor floors and walls. Can not be removed by the janitor."
icon = 'icons/obj/items.dmi'
icon_state = "paint_neutral"
color = "FFFFFF"
item_state = "paintcan"
w_class = 3
/obj/item/weapon/paint/red
name = "Red paint"
color = "FF0000"
icon_state = "paint_red"
/obj/item/weapon/paint/green
name = "Green paint"
color = "00FF00"
icon_state = "paint_green"
/obj/item/weapon/paint/blue
name = "Blue paint"
color = "0000FF"
icon_state = "paint_blue"
/obj/item/weapon/paint/yellow
name = "Yellow paint"
color = "FFFF00"
icon_state = "paint_yellow"
/obj/item/weapon/paint/violet
name = "Violet paint"
color = "FF00FF"
icon_state = "paint_violet"
/obj/item/weapon/paint/black
name = "Black paint"
color = "333333"
icon_state = "paint_black"
/obj/item/weapon/paint/white
name = "White paint"
color = "FFFFFF"
icon_state = "paint_white"
/obj/item/weapon/paint/anycolor
name = "Any color"
icon_state = "paint_neutral"
attack_self(mob/user as mob)
var/t1 = input(user, "Please select a color:", "Locking Computer", null) in list( "red", "blue", "green", "yellow", "black", "white")
if((user.get_active_hand() != src || user.stat || user.restrained()))
return
switch(t1)
if("red")
color = "FF0000"
if("blue")
color = "0000FF"
if("green")
color = "00FF00"
if("yellow")
color = "FFFF00"
if("violet")
color = "FF00FF"
if("white")
color = "FFFFFF"
if("black")
color = "333333"
icon_state = "paint_[t1]"
add_fingerprint(user)
/obj/item/weapon/reagent_containers/glass/paint/afterattack(turf/simulated/target, mob/user, proximity)
if(!proximity)
return
/obj/item/weapon/paint/afterattack(turf/target, mob/user as mob, proximity)
if(!proximity) return
if(!istype(target) || istype(target, /turf/space))
return
var/ind = "[initial(target.icon)][color]"
if(!cached_icons[ind])
var/icon/overlay = new/icon(initial(target.icon))
overlay.Blend("#[color]",ICON_MULTIPLY)
overlay.SetIntensity(1.4)
target.icon = overlay
cached_icons[ind] = target.icon
if(istype(target) && reagents.total_volume >= 5)
user.visible_message("<span class='warning'>[target] has been splashed with something by [user]!</span>")
spawn(5)
reagents.reaction(target, TOUCH)
reagents.remove_any(5)
else
target.icon = cached_icons[ind]
return
return ..()
/obj/item/weapon/paint/paint_remover
name = "Paint remover"
icon_state = "paint_neutral"
/obj/item/weapon/reagent_containers/glass/paint/red
name = "red paint bucket"
icon_state = "paint_red"
list_reagents = list("paint_red" = 70)
afterattack(turf/target, mob/user as mob)
if(istype(target) && target.icon != initial(target.icon))
target.icon = initial(target.icon)
return
*/
/obj/item/weapon/reagent_containers/glass/paint/green
name = "green paint bucket"
icon_state = "paint_green"
list_reagents = list("paint_green" = 70)
datum/reagent/paint
name = "Paint"
id = "paint_"
description = "Floor paint is used to color floor tiles."
reagent_state = 2
color = "#808080"
/obj/item/weapon/reagent_containers/glass/paint/blue
name = "blue paint bucket"
icon_state = "paint_blue"
list_reagents = list("paint_blue" = 70)
reaction_turf(var/turf/T, var/volume)
if(!istype(T) || istype(T, /turf/space))
return
T.color = color
/obj/item/weapon/reagent_containers/glass/paint/yellow
name = "yellow paint bucket"
icon_state = "paint_yellow"
list_reagents = list("paint_yellow" = 70)
reaction_obj(var/obj/O, var/volume)
..()
if(istype(O,/obj/item/weapon/light))
O.color = color
/obj/item/weapon/reagent_containers/glass/paint/violet
name = "violet paint bucket"
icon_state = "paint_violet"
list_reagents = list("paint_violet" = 70)
red
name = "Red Paint"
id = "paint_red"
color = "#FF0000"
/obj/item/weapon/reagent_containers/glass/paint/black
name = "black paint bucket"
icon_state = "paint_black"
list_reagents = list("paint_black" = 70)
green
name = "Green Paint"
color = "#00FF00"
id = "paint_green"
/obj/item/weapon/reagent_containers/glass/paint/white
name = "white paint bucket"
icon_state = "paint_white"
list_reagents = list("paint_white" = 70)
blue
name = "Blue Paint"
color = "#0000FF"
id = "paint_blue"
yellow
name = "Yellow Paint"
color = "#FFFF00"
id = "paint_yellow"
violet
name = "Violet Paint"
color = "#FF00FF"
id = "paint_violet"
black
name = "Black Paint"
color = "#333333"
id = "paint_black"
white
name = "White Paint"
color = "#FFFFFF"
id = "paint_white"
datum/reagent/paint_remover
name = "Paint Remover"
id = "paint_remover"
description = "Paint remover is used to remove floor paint from floor tiles."
reagent_state = 2
color = "#808080"
reaction_turf(var/turf/T, var/volume)
if(istype(T) && T.icon != initial(T.icon))
T.icon = initial(T.icon)
return
/obj/item/weapon/reagent_containers/glass/paint/remover
name = "paint remover bucket"
list_reagents = list("paint_remover" = 70)
@@ -16,6 +16,14 @@
var/list/loadedItems = list() //The items loaded into the cannon that will be fired out
var/pressureSetting = 1 //How powerful the cannon is - higher pressure = more gas but more powerful throws
/obj/item/weapon/pneumatic_cannon/Destroy()
if(tank)
qdel(tank)
tank = null
for(var/obj/item/I in loadedItems)
qdel(I)
loadedItems.Cut()
return ..()
/obj/item/weapon/pneumatic_cannon/examine(mob/user)
..()
@@ -141,6 +149,7 @@
/obj/item/stack/packageWrap = 8,
/obj/item/pipe = 2)
time = 300
category = CAT_WEAPON
/obj/item/weapon/pneumatic_cannon/proc/updateTank(obj/item/weapon/tank/thetank, removing = 0, mob/living/carbon/human/user)
if(removing)
@@ -9,6 +9,7 @@
throw_speed = 4
throw_range = 20
origin_tech = "bluespace=4"
burn_state = FLAMMABLE
/obj/item/weapon/teleportation_scroll/apprentice
name = "lesser scroll of teleportation"
+3 -3
View File
@@ -16,8 +16,8 @@
hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/weapon/shard/suicide_act(mob/user)
to_chat(viewers(user), pick("\red <b>[user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.</b>",
"\red <b>[user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.</b>"))
to_chat(viewers(user), pick("<span class='danger'>[user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.</span>",
"<span class='danger'>[user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.</span>"))
return (BRUTELOSS)
/obj/item/weapon/shard/New()
@@ -55,7 +55,7 @@
var/mob/living/M = AM
if(M.incorporeal_move || M.flying)//you are incorporal or flying..no shard stepping!
return
to_chat(M, "\red <B>You step on \the [src]!</B>")
to_chat(M, "<span class='danger'>You step on \the [src]!</span>")
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -44,6 +44,7 @@
icon_state = "buckler"
item_state = "buckler"
materials = list()
burn_state = FLAMMABLE
block_chance = 30
/obj/item/weapon/shield/energy
+3 -1
View File
@@ -6,6 +6,7 @@
force = 5
w_class = 4
attack_verb = list("bashed","smacked")
burn_state = FLAMMABLE
var/delayed = 0 //used to do delays
@@ -40,4 +41,5 @@
result = /obj/item/weapon/picket_sign
reqs = list(/obj/item/stack/rods = 1,
/obj/item/stack/sheet/cardboard = 2)
time = 80
time = 80
category = CAT_MISC
+1
View File
@@ -10,6 +10,7 @@
w_class = 2
armour_penetration = 100
attack_verb = list("bludgeoned", "whacked", "disciplined")
burn_state = FLAMMABLE
/obj/item/weapon/twohanded/staff/broom
name = "broom"
@@ -15,6 +15,8 @@
max_w_class = 3
max_combined_w_class = 21
storage_slots = 21
burn_state = FLAMMABLE
burntime = 20
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/back.dmi'
@@ -22,7 +24,7 @@
/obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
playsound(src.loc, "rustle", 50, 1, -5)
..()
return ..()
/*
* Backpack Types
@@ -35,6 +37,7 @@
icon_state = "holdingpack"
max_w_class = 5
max_combined_w_class = 35
burn_state = FIRE_PROOF
New()
..()
@@ -123,12 +126,14 @@
desc = "It's a special backpack made exclusively for Nanotrasen officers."
icon_state = "captainpack"
item_state = "captainpack"
burn_state = FIRE_PROOF
/obj/item/weapon/storage/backpack/industrial
name = "industrial backpack"
desc = "It's a tough backpack for the daily grind of station life."
icon_state = "engiepack"
item_state = "engiepack"
burn_state = FIRE_PROOF
/obj/item/weapon/storage/backpack/botany
name = "botany backpack"
@@ -153,6 +158,7 @@
desc = "A specially designed backpack. It's fire resistant and smells vaguely of plasma."
icon_state = "toxpack"
item_state = "toxpack"
burn_state = FIRE_PROOF
/obj/item/weapon/storage/backpack/virology
name = "virology backpack"
@@ -168,6 +174,7 @@
name = "leather satchel"
desc = "It's a very fancy satchel made with fine leather."
icon_state = "satchel"
burn_state = FIRE_PROOF
/obj/item/weapon/storage/backpack/satcheldeluxe
name = "leather satchel"
@@ -188,6 +195,7 @@
name = "industrial satchel"
desc = "A tough satchel with extra pockets."
icon_state = "satchel-eng"
burn_state = FIRE_PROOF
/obj/item/weapon/storage/backpack/satchel_med
name = "medical satchel"
@@ -213,6 +221,7 @@
name = "scientist satchel"
desc = "Useful for holding research materials."
icon_state = "satchel-tox"
burn_state = FIRE_PROOF
/obj/item/weapon/storage/backpack/satchel_sec
name = "security satchel"
@@ -228,6 +237,7 @@
name = "captain's satchel"
desc = "An exclusive satchel for Nanotrasen officers."
icon_state = "satchel-cap"
burn_state = FIRE_PROOF
/obj/item/weapon/storage/backpack/satchel_flat
name = "smuggler's satchel"
@@ -266,8 +276,8 @@
slowdown = 1
/obj/item/weapon/storage/backpack/duffel/syndie
name = "suspicious looking dufflebag"
desc = "A large dufflebag for holding extra tactical supplies."
name = "suspicious looking duffelbag"
desc = "A large duffelbag for holding extra tactical supplies."
icon_state = "duffel-syndi"
item_state = "duffel-syndimed"
origin_tech = "syndicate=1"
@@ -287,7 +297,7 @@
item_state = "duffel-syndiammo"
/obj/item/weapon/storage/backpack/duffel/syndie/ammo/loaded
desc = "A large dufflebag, packed to the brim with Bulldog shotgun ammo."
desc = "A large duffelbag, packed to the brim with Bulldog shotgun ammo."
/obj/item/weapon/storage/backpack/duffel/syndie/ammo/loaded/New()
..()
@@ -302,10 +312,10 @@
new /obj/item/ammo_box/magazine/m12g/dragon(src)
/obj/item/weapon/storage/backpack/duffel/syndie/surgery
name = "surgery dufflebag"
desc = "A suspicious looking dufflebag for holding surgery tools."
name = "surgery duffelbag"
desc = "A suspicious looking duffelbag for holding surgery tools."
icon_state = "duffel-syndimed"
item_state = "duffle-syndimed"
item_state = "duffel-syndimed"
/obj/item/weapon/storage/backpack/duffel/syndie/surgery/New()
..()
@@ -323,10 +333,10 @@
new /obj/item/device/mmi/syndie(src)
/obj/item/weapon/storage/backpack/duffel/syndie/surgery_fake //for maint spawns
name = "surgery dufflebag"
desc = "A suspicious looking dufflebag for holding surgery tools."
name = "surgery duffelbag"
desc = "A suspicious looking duffelbag for holding surgery tools."
icon_state = "duffel-syndimed"
item_state = "duffle-syndimed"
item_state = "duffel-syndimed"
/obj/item/weapon/storage/backpack/duffel/syndie/surgery_fake/New()
..()
@@ -346,6 +356,7 @@
desc = "A duffelbag designed to hold large quantities of condoms."
icon_state = "duffel-captain"
item_state = "duffel-captain"
burn_state = FIRE_PROOF
/obj/item/weapon/storage/backpack/duffel/security
name = "security duffelbag"
@@ -388,6 +399,7 @@
desc = "A duffelbag designed to hold tools."
icon_state = "duffel-eng"
item_state = "duffel-eng"
burn_state = FIRE_PROOF
/obj/item/weapon/storage/backpack/duffel/hydro
name = "hydroponics duffelbag"
@@ -162,7 +162,7 @@
max_w_class = 3
w_class = 1
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/grown","/obj/item/seeds","/obj/item/weapon/grown", "/obj/item/stack/tile/grass","/obj/item/stack/medical/ointment/aloe","/obj/item/stack/medical/bruise_pack/comfrey", "/obj/item/weapon/reagent_containers/honeycomb")
burn_state = FLAMMABLE
/obj/item/weapon/storage/bag/plants/portaseeder
name = "portable seed extractor"
@@ -375,7 +375,8 @@
max_combined_w_class = 21
max_w_class = 3
w_class = 4 //Bigger than a book because physics
can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/spellbook") //No bibles, consistent with bookcase
can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/storage/bible", "/obj/item/weapon/tome", "/obj/item/weapon/spellbook")
burn_state = FLAMMABLE
/*
* Trays - Agouri
@@ -484,7 +485,7 @@
max_combined_w_class = 200
w_class = 1
can_hold = list("/obj/item/weapon/reagent_containers/food/pill","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle")
burn_state = FLAMMABLE
/*
* Biowaste bag (mostly for xenobiologists)
*/
@@ -497,4 +498,5 @@
storage_slots = 25
max_combined_w_class = 200
w_class = 1
can_hold = list("/obj/item/slime_extract","/obj/item/weapon/reagent_containers/food/snacks/monkeycube","/obj/item/weapon/reagent_containers/syringe","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle","/obj/item/weapon/reagent_containers/blood","/obj/item/weapon/reagent_containers/hypospray/autoinjector")
can_hold = list("/obj/item/slime_extract","/obj/item/weapon/reagent_containers/food/snacks/monkeycube","/obj/item/weapon/reagent_containers/syringe","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle","/obj/item/weapon/reagent_containers/blood","/obj/item/weapon/reagent_containers/hypospray/autoinjector")
burn_state = FLAMMABLE
@@ -37,7 +37,9 @@
src.add_fingerprint(usr)
return
/obj/item/weapon/storage/belt/deserialize(list/data)
..()
update_icon()
/obj/item/weapon/storage/belt/utility
name = "tool-belt" //Carn: utility belt is nicer, but it bamboozles the text parsing.
@@ -181,8 +183,8 @@
"/obj/item/weapon/melee/classic_baton",
"/obj/item/device/flashlight/seclite",
"/obj/item/taperoll/police",
"/obj/item/weapon/melee/classic_baton/telescopic"
)
"/obj/item/weapon/melee/classic_baton/telescopic",
"/obj/item/weapon/restraints/legcuffs/bola")
/obj/item/weapon/storage/belt/security/sec/New()
..()
@@ -312,6 +314,10 @@
"/obj/item/ammo_casing/shotgun"
)
/obj/item/weapon/storage/belt/bandolier/New()
..()
update_icon()
/obj/item/weapon/storage/belt/bandolier/full/New()
..()
new /obj/item/ammo_casing/shotgun/beanbag(src)
@@ -435,6 +441,31 @@
icon_state = "fannypack_yellow"
item_state = "fannypack_yellow"
/obj/item/weapon/storage/belt/rapier
name = "rapier sheath"
desc = "Can hold rapiers."
icon_state = "sheath"
item_state = "sheath"
storage_slots = 1
max_w_class = 4
can_hold = list("/obj/item/weapon/melee/rapier")
/obj/item/weapon/storage/belt/rapier/update_icon()
icon_state = "[initial(icon_state)]"
item_state = "[initial(item_state)]"
if(contents.len)
icon_state = "[initial(icon_state)]-rapier"
item_state = "[initial(item_state)]-rapier"
if(isliving(loc))
var/mob/living/L = loc
L.update_inv_belt()
..()
/obj/item/weapon/storage/belt/rapier/New()
..()
new /obj/item/weapon/melee/rapier(src)
update_icon()
// -------------------------------------
// Bluespace Belt
// -------------------------------------
@@ -476,7 +507,7 @@
allow_quick_empty = 1
can_hold = list(
"/obj/item/weapon/grenade/smokebomb",
"/obj/item/weapon/legcuffs/bolas"
"/obj/item/weapon/restraints/legcuffs/bola"
)
flags = NODROP
@@ -492,8 +523,8 @@
new /obj/item/weapon/grenade/smokebomb(src)
new /obj/item/weapon/grenade/smokebomb(src)
new /obj/item/weapon/grenade/smokebomb(src)
new /obj/item/weapon/legcuffs/bolas(src)
new /obj/item/weapon/legcuffs/bolas(src)
new /obj/item/weapon/restraints/legcuffs/bola(src)
new /obj/item/weapon/restraints/legcuffs/bola(src)
processing_objects.Add(src)
cooldown = world.time
@@ -504,7 +535,7 @@
for(S in src)
smokecount++
bolacount = 0
var/obj/item/weapon/legcuffs/bolas/B
var/obj/item/weapon/restraints/legcuffs/bola/B
for(B in src)
bolacount++
if(smokecount < 4)
@@ -513,7 +544,7 @@
smokecount++
if(bolacount < 2)
while(bolacount < 2)
new /obj/item/weapon/legcuffs/bolas(src)
new /obj/item/weapon/restraints/legcuffs/bola(src)
bolacount++
cooldown = world.time
update_icon()
@@ -5,6 +5,7 @@
throw_speed = 1
throw_range = 5
w_class = 3
burn_state = FLAMMABLE
var/mob/affecting = null
var/deity_name = "Christ"
@@ -77,7 +78,7 @@
if((istype(M, /mob/living/carbon/human) && prob(60)))
bless(M)
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] heals [] with the power of [src.deity_name]!</B>", user, M), 1)
O.show_message(text("<span class='danger'>[] heals [] with the power of [src.deity_name]!</span>", user, M), 1)
to_chat(M, "\red May the power of [src.deity_name] compel you to be healed!")
playsound(src.loc, "punch", 25, 1, -1)
else
@@ -85,11 +86,11 @@
M.adjustBrainLoss(10)
to_chat(M, "\red You feel dumber.")
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] beats [] over the head with []!</B>", user, M, src), 1)
O.show_message(text("<span class='danger'>[] beats [] over the head with []!</span>", user, M, src), 1)
playsound(src.loc, "punch", 25, 1, -1)
else if(M.stat == 2)
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] smacks []'s lifeless corpse with [].</B>", user, M, src), 1)
O.show_message(text("<span class='danger'>[] smacks []'s lifeless corpse with [].</span>", user, M, src), 1)
playsound(src.loc, "punch", 25, 1, -1)
return
@@ -24,6 +24,7 @@
desc = "It's just an ordinary box."
icon_state = "box"
item_state = "syringe_kit"
burn_state = FLAMMABLE
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
/obj/item/weapon/storage/box/large
@@ -705,3 +706,73 @@
new /obj/item/weapon/lipstick/green(src)
new /obj/item/weapon/lipstick/blue(src)
new /obj/item/weapon/lipstick/white(src)
#define NODESIGN "None"
#define NANOTRASEN "NanotrasenStandard"
#define SYNDI "SyndiSnacks"
#define HEART "Heart"
#define SMILE "SmileyFace"
/obj/item/weapon/storage/box/papersack
name = "paper sack"
desc = "A sack neatly crafted out of paper."
icon_state = "paperbag_None"
item_state = "paperbag_None"
foldable = null
var/design = NODESIGN
/obj/item/weapon/storage/box/papersack/update_icon()
if(!contents.len)
icon_state = "[item_state]"
else icon_state = "[item_state]_closed"
/obj/item/weapon/storage/box/papersack/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/pen))
//if a pen is used on the sack, dialogue to change its design appears
if(contents.len)
to_chat(user, "<span class='warning'>You can't modify [src] with items still inside!</span>")
return
var/list/designs = list(NODESIGN, NANOTRASEN, SYNDI, HEART, SMILE)
var/switchDesign = input("Select a Design:", "Paper Sack Design", designs[1]) as null|anything in designs
if(!switchDesign)
return
if(get_dist(usr, src) > 1 && !usr.incapacitated())
to_chat(usr, "<span class='warning'>You have moved too far away!</span>")
return
if(design == switchDesign)
return
to_chat(usr, "<span class='notice'>You make some modifications to [src] using your pen.</span>")
design = switchDesign
icon_state = "paperbag_[design]"
item_state = "paperbag_[design]"
switch(design)
if(NODESIGN)
desc = "A sack neatly crafted out of paper."
if(NANOTRASEN)
desc = "A standard Nanotrasen paper lunch sack for loyal employees on the go."
if(SYNDI)
desc = "The design on this paper sack is a remnant of the notorious 'SyndieSnacks' program."
if(HEART)
desc = "A paper sack with a heart etched onto the side."
if(SMILE)
desc = "A paper sack with a crude smile etched onto the side."
return
else if(is_sharp(W))
if(!contents.len)
if(item_state == "paperbag_None")
to_chat(user, "<span class='notice'>You cut eyeholes into [src].</span>")
new /obj/item/clothing/head/papersack(user.loc)
qdel(src)
return
else if(item_state == "paperbag_SmileyFace")
to_chat(user, "<span class='notice'>You cut eyeholes into [src] and modify the design.</span>")
new /obj/item/clothing/head/papersack/smiley(user.loc)
qdel(src)
return
return ..()
#undef NODESIGN
#undef NANOTRASEN
#undef SYNDI
#undef HEART
#undef SMILE
@@ -12,6 +12,8 @@
max_w_class = 3
max_combined_w_class = 21
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
burn_state = FLAMMABLE
burntime = 20
/obj/item/weapon/storage/briefcase/New()
..()
@@ -17,6 +17,7 @@
icon = 'icons/obj/food/food.dmi'
icon_state = "donutbox6"
name = "donut box"
burn_state = FLAMMABLE
var/icon_type = "donut"
/obj/item/weapon/storage/fancy/update_icon(var/itemremoved = 0)
@@ -138,15 +138,15 @@
/obj/item/weapon/storage/firstaid/adv/New()
..()
if(empty) return
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
new /obj/item/stack/medical/advanced/bruise_pack(src)
new /obj/item/stack/medical/advanced/bruise_pack(src)
new /obj/item/stack/medical/advanced/bruise_pack(src)
new /obj/item/stack/medical/advanced/ointment(src)
new /obj/item/stack/medical/advanced/ointment(src)
new /obj/item/stack/medical/splint(src)
return
if(empty)
return
new /obj/item/stack/medical/bruise_pack(src)
new /obj/item/stack/medical/bruise_pack/advanced(src)
new /obj/item/stack/medical/bruise_pack/advanced(src)
new /obj/item/stack/medical/ointment/advanced(src)
new /obj/item/stack/medical/ointment/advanced(src)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src)
new /obj/item/device/healthanalyzer(src)
/obj/item/weapon/storage/firstaid/adv/empty
empty = 1
@@ -323,7 +323,7 @@
return 1
//Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target
/obj/item/weapon/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location)
/obj/item/weapon/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location, burn = 0)
if(!istype(W)) return 0
if(istype(src, /obj/item/weapon/storage/fancy))
@@ -357,8 +357,14 @@
W.on_exit_storage(src)
update_icon()
W.mouse_opacity = initial(W.mouse_opacity)
if(burn)
W.fire_act()
return 1
/obj/item/weapon/storage/empty_object_contents(burn, loc)
for(var/obj/item/Item in contents)
remove_from_storage(Item, loc, burn)
//This proc is called when you want to place an item into the storage item.
/obj/item/weapon/storage/attackby(obj/item/W as obj, mob/user as mob, params)
..()
@@ -541,3 +547,34 @@
return depth
/obj/item/weapon/storage/serialize()
var data = ..()
var/list/content_list = list()
data["content"] = content_list
data["slots"] = storage_slots
data["max_w_class"] = max_w_class
data["max_c_w_class"] = max_combined_w_class
for(var/thing in contents)
var/atom/movable/AM = thing
// This code does not watch out for infinite loops
// But then again a tesseract would destroy the server anyways
// Also I wish I could just insert a list instead of it reading it the wrong way
content_list.len++
content_list[content_list.len] = AM.serialize()
return data
/obj/item/weapon/storage/deserialize(list/data)
if(isnum(data["slots"]))
storage_slots = data["slots"]
if(isnum(data["max_w_class"]))
max_w_class = data["max_w_class"]
if(isnum(data["max_c_w_class"]))
max_combined_w_class = data["max_c_w_class"]
for(var/thing in contents)
qdel(thing) // out with the old
for(var/thing in data["content"])
if(islist(thing))
list_to_object(thing, src)
else
log_debug("Non-list thing: [thing]. We are a [name]")
..()
@@ -195,4 +195,13 @@
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
new /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane(src)
new /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/cane(src)
/obj/item/weapon/storage/box/syndie_kit/atmosgasgrenades
name = "Atmos Grenades"
/obj/item/weapon/storage/box/syndie_kit/atmosgasgrenades/New()
..()
new /obj/item/weapon/grenade/clusterbuster/plasma(src)
new /obj/item/weapon/grenade/clusterbuster/n2o(src)
@@ -5,6 +5,7 @@
icon = 'icons/obj/wallets.dmi'
icon_state = "wallet"
w_class = 2
burn_state = FLAMMABLE
can_hold = list(
"/obj/item/weapon/spacecash",
"/obj/item/weapon/card",
+11 -13
View File
@@ -23,7 +23,13 @@
update_icon()
return
/obj/item/weapon/melee/baton/CheckParts()
/obj/item/weapon/melee/baton/Destroy()
if(bcell)
qdel(bcell)
bcell = null
return ..()
/obj/item/weapon/melee/baton/CheckParts(list/parts_list)
..()
bcell = locate(/obj/item/weapon/stock_parts/cell) in contents
update_icon()
@@ -47,11 +53,11 @@
/obj/item/weapon/melee/baton/update_icon()
if(status)
icon_state = "[initial(icon_state)]_active"
icon_state = "[initial(name)]_active"
else if(!bcell)
icon_state = "[initial(icon_state)]_nocell"
icon_state = "[initial(name)]_nocell"
else
icon_state = "[initial(icon_state)]"
icon_state = "[initial(name)]"
/obj/item/weapon/melee/baton/examine(mob/user)
..(user)
@@ -198,12 +204,4 @@
throwforce = 5
stunforce = 5
hitcost = 3750
slot_flags = null
/obj/item/weapon/melee/baton/cattleprod/update_icon()
if(status)
icon_state = "stunprod_active"
else if(!bcell)
icon_state = "stunprod_nocell"
else
icon_state = "stunprod"
slot_flags = null
@@ -40,6 +40,7 @@
icon_state = "wood_tableparts"
flags = null
upgradable = 0
burn_state = FLAMMABLE
result = /obj/structure/table/woodentable
parts = list(
/obj/item/stack/sheet/wood,
@@ -26,7 +26,7 @@
examine(mob/user)
if(..(user, 0))
if(air_contents.oxygen < 10)
to_chat(user, text("\red <B>The meter on the [src.name] indicates you are almost out of air!</B>"))
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"))
//playsound(usr, 'sound/effects/alert.ogg', 50, 1)
@@ -71,7 +71,7 @@
examine(mob/user)
if(..(user, 0))
if(air_contents.oxygen < 1 && loc==usr)
to_chat(user, "\red <B>The meter on the [src.name] indicates you are almost out of air!</B>")
to_chat(user, "<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>")
user << sound('sound/effects/alert.ogg')
/obj/item/weapon/tank/air/New()
@@ -123,7 +123,7 @@
/obj/item/weapon/tank/plasma/plasmaman/examine(mob/user)
if(..(user, 0))
if(air_contents.toxins < 0.2 && loc==usr)
to_chat(user, text("\red <B>The meter on the [src.name] indicates you are almost out of plasma!</B>"))
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of plasma!</span>"))
user << sound('sound/effects/alert.ogg')
/*
@@ -150,7 +150,7 @@
examine(mob/user)
if(..(user, 0))
if(air_contents.oxygen < 0.2 && loc==usr)
to_chat(user, text("\red <B>The meter on the [src.name] indicates you are almost out of air!</B>"))
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"))
user << sound('sound/effects/alert.ogg')
/obj/item/weapon/tank/emergency_oxygen/engi
@@ -191,7 +191,7 @@
/obj/item/weapon/tank/nitrogen/examine(mob/user)
if(..(user, 0))
if(air_contents.nitrogen < 10)
to_chat(user, text("\red <B>The meter on the [src.name] indicates you are almost out of air!</B>"))
to_chat(user, text("<span class='danger'>The meter on the [src.name] indicates you are almost out of air!</span>"))
//playsound(usr, 'sound/effects/alert.ogg', 50, 1)
@@ -35,6 +35,7 @@
/obj/item/weapon/tank/Destroy()
if(air_contents)
qdel(air_contents)
air_contents = null
processing_objects.Remove(src)
@@ -373,7 +373,8 @@
V.visible_message("<span class='danger'>[V] was frozen shut!</span>")
for(var/mob/living/L in T)
L.ExtinguishMob()
return
for(var/obj/item/Item in T)
Item.extinguish()
/datum/effect/system/freezing_smoke_spread
@@ -48,7 +48,7 @@ Frequency:
return 1
var/turf/current_location = get_turf(usr)//What turf is the user on?
if(!current_location ||( current_location.z in config.admin_levels))//If turf was not found or they're on z level 2.
if(!current_location || is_admin_level(current_location.z))//If turf was not found or they're in the admin zone
to_chat(usr, "<span class='warning'>\The [src] is malfunctioning.</span>")
return 1
@@ -107,7 +107,7 @@ Frequency:
/obj/item/weapon/hand_tele/attack_self(mob/user as mob)
var/turf/current_location = get_turf(user)//What turf is the user on?
if(!current_location||(current_location.z in config.admin_levels)||current_location.z>=7)//If turf was not found or they're on z level 2 or >7 which does not currently exist.
if(!current_location||!is_teleport_allowed(current_location.z))//If turf was not found or they're somewhere teleproof
to_chat(user, "<span class='notice'>\The [src] is malfunctioning.</span>")
return
var/list/L = list( )
@@ -0,0 +1,18 @@
/obj/item/weapon/melee/baton/cattleprod/teleprod
name = "teleprod"
desc = "A prod with a bluespace crystal on the end. The crystal doesn't look too fun to touch."
icon_state = "teleprod_nocell"
item_state = "teleprod"
origin_tech = "combat=2;bluespace=4;materials=3"
/obj/item/weapon/melee/baton/cattleprod/teleprod/attack(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit
..()
if(status)
if((CLUMSY in user.mutations) && prob(50))
user.visible_message("<span class='danger'>[user] accidentally hits themself with [src]!</span>", \
"<span class='userdanger'>You accidentally hit yourself with [src]!</span>")
user.Weaken(stunforce*3)
deductcharge(hitcost)
do_teleport(user, get_turf(user), 50)//honk honk
else if(iscarbon(M) && !M.anchored)
do_teleport(M, get_turf(M), 15)
+179 -9
View File
@@ -140,7 +140,7 @@
if(get_dist(src,user) > 1)
return 0
if(H != null)
user.visible_message("<span class='notice'>[src.name] is too cumbersome to carry in one hand!</span>")
to_chat(user, "<span class='notice'>[src.name] is too cumbersome to carry in one hand!</span>")
return
var/obj/item/weapon/twohanded/offhand/O = new(user)
user.put_in_inactive_hand(O)
@@ -283,20 +283,91 @@
w_class = 4
slot_flags = SLOT_BACK
force_unwielded = 10
force_wielded = 18 // Was 13, Buffed - RR
force_wielded = 18
throwforce = 20
throw_speed = 3
throw_speed = 4
armour_penetration = 10
no_spin_thrown = 1 // Thrown spears that spin look dumb. -Fox
materials = list(MAT_METAL=1150, MAT_GLASS=2075)
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
sharp = 1
edge = 1
no_spin_thrown = 1
var/obj/item/weapon/grenade/explosive = null
var/war_cry = "AAAAARGH!!!"
/obj/item/weapon/twohanded/spear/update_icon()
icon_state = "spearglass[wielded]"
return
if(explosive)
icon_state = "spearbomb[wielded]"
else
icon_state = "spearglass[wielded]"
/obj/item/weapon/twohanded/spear/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
/obj/item/weapon/twohanded/spear/afterattack(atom/movable/AM, mob/user, proximity)
if(!proximity)
return
if(isturf(AM)) //So you can actually melee with it
return
if(explosive && wielded)
user.say("[war_cry]")
explosive.forceMove(AM)
explosive.prime()
qdel(src)
/obj/item/weapon/twohanded/spear/throw_impact(atom/target)
. = ..()
if(explosive)
explosive.prime()
qdel(src)
/obj/item/weapon/twohanded/spear/AltClick(mob/user)
..()
if(!explosive)
return
if(ismob(loc))
var/mob/M = loc
var/input = stripped_input(M, "What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50)
if(input)
war_cry = input
/obj/item/weapon/twohanded/spear/CheckParts(list/parts_list)
..()
if(explosive)
explosive.forceMove(get_turf(loc))
explosive = null
update_icon()
var/obj/item/weapon/grenade/G = locate() in contents
if(G)
explosive = G
name = "explosive lance"
desc = "A makeshift spear with [G] attached to it. Alt+click on the spear to set your war cry!"
update_icon()
//GREY TIDE
/obj/item/weapon/twohanded/spear/grey_tide
icon_state = "spearglass0"
name = "\improper Grey Tide"
desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces."
force_unwielded = 15
force_wielded = 25
throwforce = 20
throw_speed = 4
attack_verb = list("gored")
/obj/item/weapon/twohanded/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity)
..()
if(!proximity)
return
user.faction |= "greytide(\ref[user])"
if(isliving(AM))
var/mob/living/L = AM
if(istype (L, /mob/living/simple_animal/hostile/illusion))
return
if(!L.stat && prob(50))
var/mob/living/simple_animal/hostile/illusion/M = new(user.loc)
M.faction = user.faction.Copy()
M.attack_sound = hitsound
M.Copy_Parent(user, 100, user.health/2.5, 12, 30)
M.GiveTarget(L)
//Putting heads on spears
/obj/item/organ/external/head/attackby(var/obj/item/weapon/W, var/mob/living/user, params)
@@ -348,6 +419,53 @@
name = "Kidan spear"
desc = "A spear brought over from the Kidan homeworld."
// DIY CHAINSAW
/obj/item/weapon/twohanded/required/chainsaw
name = "chainsaw"
desc = "A versatile power tool. Useful for limbing trees and delimbing humans."
icon_state = "gchainsaw_off"
flags = CONDUCT
force = 13
w_class = 5
throwforce = 13
throw_speed = 2
throw_range = 4
materials = list(MAT_METAL=13000)
origin_tech = "materials=3;engineering=4;combat=2"
attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered")
hitsound = "swing_hit"
sharp = 1
edge = 1
actions_types = list(/datum/action/item_action/startchainsaw)
var/on = 0
/obj/item/weapon/twohanded/required/chainsaw/attack_self(mob/user)
on = !on
to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]")
if(on)
playsound(loc, 'sound/weapons/chainsawstart.ogg', 50, 1)
force = on ? 21 : 13
throwforce = on ? 21 : 13
icon_state = "gchainsaw_[on ? "on" : "off"]"
if(hitsound == "swing_hit")
hitsound = 'sound/weapons/chainsaw.ogg'
else
hitsound = "swing_hit"
if(src == user.get_active_hand()) //update inhands
user.update_inv_l_hand()
user.update_inv_r_hand()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/weapon/twohanded/required/chainsaw/doomslayer
name = "OOOH BABY"
desc = "<span class='warning'>VRRRRRRR!!!</span>"
armour_penetration = 100
///CHAINSAW///
/obj/item/weapon/twohanded/chainsaw
icon_state = "chainsaw0"
@@ -576,3 +694,55 @@
Z.ex_act(2)
charged = 3
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
// Energized Fire axe
/obj/item/weapon/twohanded/energizedfireaxe
name = "energized fire axe"
desc = "Someone with a love for fire axes decided to turn one into a single-charge energy weapon. Seems excessive."
icon_state = "fireaxe0"
force = 5
throwforce = 15
sharp = 1
edge = 1
w_class = 5
armour_penetration = 20
slot_flags = SLOT_BACK
force_unwielded = 5
force_wielded = 30
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
var/charged = 1
/obj/item/weapon/twohanded/energizedfireaxe/update_icon()
if(wielded)
icon_state = "fireaxe2"
else
icon_state = "fireaxe0"
/obj/item/weapon/twohanded/energizedfireaxe/afterattack(atom/A, mob/user, proximity)
if(!proximity)
return
if(wielded)
if(istype(A, /mob/living))
var/mob/living/Z = A
if(charged)
charged--
Z.take_organ_damage(0,30)
user.visible_message("<span class='danger'>[user] slams the charged axe into [Z.name] with all their might!</span>")
playsound(loc, 'sound/magic/lightningbolt.ogg', 5, 1)
var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
sparks.set_up(1, 1, src)
sparks.start()
if(A && wielded && (istype(A, /obj/structure/window) || istype(A, /obj/structure/grille)))
if(istype(A, /obj/structure/window))
var/obj/structure/window/W = A
W.destroy()
if(prob(4))
charged++
user.visible_message("<span class='notice'>The axe starts to emit an electric buzz!</span>")
else
qdel(A)
if(prob(4))
charged++
user.visible_message("<span class='notice'>The axe starts to emit an electric buzz!</span>")
+1 -1
View File
@@ -12,7 +12,7 @@
attack_verb = list("whipped", "lashed", "disciplined", "tickled")
suicide_act(mob/user)
to_chat(viewers(user), "\red <b>[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.</b>")
to_chat(viewers(user), "<span class='danger'>[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.</span>")
return (OXYLOSS)