mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-28 14:37:04 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into BookClub
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user