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
+71 -62
View File
@@ -1,81 +1,90 @@
/obj/item/candle
name = "red candle"
desc = "a candle"
desc = "In Greek myth, Prometheus stole fire from the Gods and gave it to humankind. The jewelry he kept for himself."
icon = 'icons/obj/candle.dmi'
icon_state = "candle1"
item_state = "candle1"
w_class = 1
light_color = "#E09D37"
var/wax = 200
var/lit = 0
proc
light(var/flavor_text = "\red [usr] lights the [name].")
var/infinite = 0
var/start_lit = 0
light_color = "#E09D37"
/obj/item/candle/New()
..()
if(start_lit)
// No visible message
light(show_message = 0)
/obj/item/candle/update_icon()
var/i
if(wax>150)
i = 1
else if(wax>80)
i = 2
else i = 3
icon_state = "candle[i][lit ? "_lit" : ""]"
update_icon()
var/i
if(wax>150)
i = 1
else if(wax>80)
i = 2
else i = 3
icon_state = "candle[i][lit ? "_lit" : ""]"
/obj/item/candle/attackby(obj/item/weapon/W, mob/user, params)
..()
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn()) //Badasses dont get blinded by lighting their candle with a welding tool
light("<span class='notice'>[user] casually lights [src] with [WT], what a badass.")
else if(istype(W, /obj/item/weapon/lighter))
var/obj/item/weapon/lighter/L = W
if(L.lit)
light("<span class='notice'>After some fiddling, [user] manages to light [src] with [L].</span>")
else if(istype(W, /obj/item/weapon/match))
var/obj/item/weapon/match/M = W
if(M.lit)
light("<span class='notice'>[user] lights [src] with [M]</span>")
else if(istype(W, /obj/item/candle))
var/obj/item/candle/C = W
if(C.lit)
light("<span class='notice'>[user] tilts [C] and lights [src] with it.</span>")
attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn()) //Badasses dont get blinded by lighting their candle with a welding tool
light("\red [user] casually lights the [name] with [W], what a badass.")
else if(istype(W, /obj/item/weapon/lighter))
var/obj/item/weapon/lighter/L = W
if(L.lit)
light()
else if(istype(W, /obj/item/weapon/match))
var/obj/item/weapon/match/M = W
if(M.lit)
light()
else if(istype(W, /obj/item/candle))
var/obj/item/candle/C = W
if(C.lit)
light()
/obj/item/candle/fire_act()
if(!lit)
light() //honk
light(var/flavor_text = "\red [usr] lights the [name].")
if(!src.lit)
src.lit = 1
//src.damtype = "fire"
for(var/mob/O in viewers(usr, null))
O.show_message(flavor_text, 1)
set_light(CANDLE_LUM)
processing_objects.Add(src)
process()
if(!lit)
return
wax--
if(!wax)
new/obj/item/trash/candle(src.loc)
if(istype(src.loc, /mob))
var/mob/M = src.loc
M.unEquip(src, 1) //src is being deleted anyway
qdel(src)
/obj/item/candle/proc/light(show_message)
if(!lit)
lit = 1
if(show_message)
usr.visible_message(show_message)
set_light(CANDLE_LUM)
processing_objects.Add(src)
update_icon()
if(istype(loc, /turf)) //start a fire if possible
var/turf/T = loc
T.hotspot_expose(700, 5)
attack_self(mob/user as mob)
if(lit)
lit = 0
update_icon()
set_light(0)
/obj/item/candle/process()
if(!lit)
return
if(!infinite)
wax--
if(!wax)
new/obj/item/trash/candle(src.loc)
if(istype(src.loc, /mob))
var/mob/M = src.loc
M.unEquip(src, 1) //src is being deleted anyway
qdel(src)
update_icon()
if(isturf(loc)) //start a fire if possible
var/turf/T = loc
T.hotspot_expose(700, 5)
/obj/item/candle/attack_self(mob/user)
if(lit)
user.visible_message("<span class='notice'>[user] snuffs out [src].</span>")
lit = 0
update_icon()
set_light(0)
/obj/item/candle/eternal
desc = "A candle. This one seems to have an odd quality about the wax."
wax = 10000
infinite = 1
+6
View File
@@ -18,6 +18,12 @@
ID = new /obj/item/weapon/card/id
ID.access = get_region_accesses(region_access)
/obj/item/weapon/door_remote/Destroy()
if(ID)
qdel(ID)
ID = null
return ..()
/obj/item/weapon/door_remote/attack_self(mob/user)
switch(mode)
if(WAND_OPEN)
@@ -284,4 +284,4 @@
#undef BUGMODE_LIST
#undef BUGMODE_MONITOR
#undef BUGMODE_TRACK
#undef BUGMODE_TRACK
@@ -7,6 +7,8 @@
icon_state = "guitar"
item_state = "guitar"
force = 10
burn_state = FLAMMABLE
burntime = 20
var/datum/song/handheld/song
hitsound = 'sound/effects/guitarsmash.ogg'
@@ -11,7 +11,6 @@
w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter.
origin_tech = "combat=1"
origin_tech = "magnets=2"
var/turf/pointer_loc
var/energy = 5
var/max_energy = 5
var/effectchance = 33
@@ -35,6 +34,12 @@
if(!pointer_icon_state)
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
/obj/item/device/laser_pointer/Destroy()
if(diode)
qdel(diode)
diode = null
return ..()
/obj/item/device/laser_pointer/upgraded/New()
..()
diode = new /obj/item/weapon/stock_parts/micro_laser/ultra
+7 -3
View File
@@ -24,9 +24,13 @@
overlays += "pai-off"
/obj/item/device/paicard/Destroy()
//Will stop people throwing friend pAIs into the singularity so they can respawn
if(!isnull(pai))
pai.death(0)
if(pai)
pai.ghostize()
qdel(pai)
pai = null
if(radio)
qdel(radio)
radio = null
return ..()
/obj/item/device/paicard/attack_self(mob/user)
@@ -410,3 +410,9 @@
radio_text += ", "
radio_desc = radio_text
/obj/item/device/radio/headset/proc/make_syndie() // Turns normal radios into Syndicate radios!
qdel(keyslot1)
keyslot1 = new /obj/item/device/encryptionkey/syndicate
syndie = 1
recalculateChannels()
@@ -124,6 +124,7 @@
return -1
if(!(0 in level))
var/turf/position = get_turf(src)
// TODO: Integrate radio with the space manager
if(isnull(position) || !(position.z in level))
return -1
if(!src.listening)
+1 -1
View File
@@ -172,7 +172,7 @@ REAGENT SCANNER
user.show_message(text("\blue \t []: [][]\blue - []", \
capitalize(org.name), \
(org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \
(org.status & ORGAN_BLEEDING)?"\red <b>\[Bleeding\]</b>":"\t", \
(org.status & ORGAN_BLEEDING)?"<span class='danger'>\[Bleeding\]</span>":"\t", \
(org.burn_dam > 0) ? "<font color='#FFA500'>[org.burn_dam]</font>" :0),1)
else
user.show_message("\blue \t Limbs are OK.",1)
@@ -20,6 +20,12 @@
mytape = new /obj/item/device/tape/random(src)
update_icon()
/obj/item/device/taperecorder/Destroy()
if(mytape)
qdel(mytape)
mytape = null
return ..()
/obj/item/device/taperecorder/examine(mob/user)
if(..(user, 1))
to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].")
@@ -42,6 +48,10 @@
update_icon()
/obj/item/device/taperecorder/fire_act()
mytape.ruin() //Fires destroy the tape
return ..()
/obj/item/device/taperecorder/attack_hand(mob/user)
if(loc == user)
if(mytape)
@@ -253,6 +263,8 @@
var/list/timestamp = list()
var/ruined = 0
/obj/item/device/tape/fire_act()
ruin()
/obj/item/device/tape/attack_self(mob/user)
if(!ruined)
@@ -277,7 +289,8 @@
timestamp.Cut()
/obj/item/device/tape/proc/ruin()
overlays += "ribbonoverlay"
if(!ruined)
overlays += "ribbonoverlay"
ruined = 1
@@ -11,6 +11,18 @@
var/toggle = 1
origin_tech = "materials=1;engineering=1"
/obj/item/device/transfer_valve/Destroy()
if(tank_one)
qdel(tank_one)
tank_one = null
if(tank_two)
qdel(tank_two)
tank_two = null
if(attached_device)
qdel(attached_device)
attached_device = null
return ..()
/obj/item/device/transfer_valve/proc/process_activation(var/obj/item/device/D)
/obj/item/device/transfer_valve/IsAssemblyHolder()
+3 -1
View File
@@ -7,6 +7,8 @@
icon_state = "violin"
item_state = "violin"
force = 10
burn_state = FLAMMABLE
burntime = 20
hitsound = 'sound/weapons/smash.ogg'
var/datum/song/handheld/song
@@ -18,7 +20,7 @@
qdel(song)
song = null
return ..()
/obj/item/device/violin/initialize()
song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded
..()
+44 -69
View File
@@ -1,77 +1,14 @@
/obj/item/flag
icon = 'icons/obj/flag.dmi'
w_class = 4
var/lit = 0
var/burntime = 30
burntime = 20
burn_state = FLAMMABLE
/obj/item/flag/fire_act(null, temperature, volume)
if(!lit)
Ignite()
return
/obj/item/flag/proc/Ignite()
if(lit) return
lit = 1
update_icons()
processing_objects.Add(src)
/obj/item/flag/process()
burntime--
if(burntime < 1)
processing_objects.Remove(src)
if(istype(src.loc,/turf))
new /obj/effect/decal/cleanable/ash(src.loc)
new /obj/item/stack/rods(src.loc)
qdel(src)
return
if(istype(src.loc,/mob/living/carbon))
var/mob/living/carbon/C = src.loc
var/turf/location = get_turf(C)
new /obj/effect/decal/cleanable/ash(location)
new /obj/item/stack/rods(location)
qdel(src)
return
else
qdel(src)
return
/obj/item/flag/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
/obj/item/flag/attackby(obj/item/weapon/W, mob/user, params)
..()
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn())//Badasses dont get blinded while lighting their cig with a welding tool
light("<span class='notice'>[user] casually lights the [name] with [W], what a badass.</span>")
else if(istype(W, /obj/item/weapon/lighter/zippo))
var/obj/item/weapon/lighter/zippo/Z = W
if(Z.lit)
light("<span class='rose'>With a single flick of their wrist, [user] smoothly lights the [name] with their [W]. Damn they're cool.</span>")
else if(istype(W, /obj/item/weapon/lighter))
var/obj/item/weapon/lighter/L = W
if(L.lit)
light("<span class='notice'>After some fiddling, [user] manages to light the [name] with [W].</span>")
else if(istype(W, /obj/item/weapon/match))
var/obj/item/weapon/match/M = W
if(M.lit)
light("<span class='notice'>[user] lights the [name] with their [W].</span>")
else if(istype(W, /obj/item/weapon/melee/energy/sword/saber))
var/obj/item/weapon/melee/energy/sword/saber/S = W
if(S.active)
light("<span class='warning'>[user] swings their [W], barely missing their nose. They light the [name] in the process.</span>")
else if(istype(W, /obj/item/device/assembly/igniter))
light("<span class='notice'>[user] fiddles with [W], and manages to light the [name].</span>")
/obj/item/flag/proc/light(var/flavor_text = "[usr] lights the [name].")
if(!src.lit)
src.lit = 1
var/turf/T = get_turf(src)
T.visible_message(flavor_text)
update_icons()
processing_objects.Add(src)
if(is_hot(W) && burn_state != ON_FIRE)
user.visible_message("<span class='notice'>[user] lights the [name] with [W].</span>")
fire_act()
/obj/item/flag/proc/update_icons()
overlays = null
@@ -219,3 +156,41 @@
name = "Nar'Sie Cultist flag"
desc = "A flag proudly boasting the logo of the cultists, sworn enemies of NT."
icon_state = "cultflag"
//Chameleon
/obj/item/flag/chameleon
name = "Chameleon flag"
desc = "A poor recreation of the official NT flag. It seems to shimmer a little."
icon_state = "ntflag"
origin_tech = "materials=3;magnets=4;syndicate=4"
var/used = 0
/obj/item/flag/chameleon/attack_self(mob/user)
if(used)
return
var/list/flag_types = typesof(/obj/item/flag) - list(src.type, /obj/item/flag)
var/list/flag = list()
for(var/flag_type in flag_types)
var/obj/item/flag/F = new flag_type
flag[capitalize(F.name)] = F
var/list/show_flag = list("EXIT" = null) + sortList(flag)
var/input_flag = input(user, "Choose a flag to disguise as.", "Choose a flag.") in show_flag
if(user && src in user.contents)
var/obj/item/flag/chosen_flag = flag[input_flag]
if(chosen_flag)
name = chosen_flag.name
icon_state = chosen_flag.icon_state
desc = chosen_flag.desc
used = 1
/obj/item/flag/chameleon/burn()
explosion(loc,1,2,4,4, flame_range = 4)
qdel(src)
+6
View File
@@ -11,6 +11,12 @@
var/state
var/datum/gas_mixture/air_contents = null
/obj/item/latexballon/Destroy()
if(air_contents)
qdel(air_contents)
air_contents = null
return ..()
/obj/item/latexballon/proc/blow(obj/item/weapon/tank/tank, mob/user)
if(icon_state == "latexballon_bursted")
return
@@ -0,0 +1,40 @@
///AI Upgrades
//Malf Picker
/obj/item/device/malf_upgrade
name = "combat software upgrade"
desc = "A highly illegal, highly dangerous upgrade for artificial intelligence units, granting them a variety of powers as well as the ability to hack APCs."
icon = 'icons/obj/cloning.dmi'
icon_state = "datadisk3"
/obj/item/device/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
if(!istype(AI))
return
if(AI.malf_picker)
AI.malf_picker.processing_time += 50
to_chat(AI, "<span class='userdanger'>[user] has attempted to upgrade you with combat software that you already possess. You gain 50 points to spend on Malfunction Modules instead.</span>")
else
to_chat(AI, "<span class='userdanger'>[user] has upgraded you with combat software!</span>")
AI.add_malf_picker()
to_chat(user, "<span class='notice'>You upgrade [AI]. [src] is consumed in the process.</span>")
qdel(src)
//Lipreading
/obj/item/device/surveillance_upgrade
name = "surveillance software upgrade"
desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
icon = 'icons/obj/cloning.dmi'
icon_state = "datadisk3"
/obj/item/device/surveillance_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user)
if(!istype(AI))
return
if(AI.eyeobj)
AI.eyeobj.relay_speech = 1
to_chat(AI, "<span class='userdanger'>[user] has upgraded you with surveillance software!</span>")
to_chat(AI, "Via a combination of hidden microphones and lip reading software, you are able to use your cameras to listen in on conversations.")
to_chat(user, "<span class='notice'>You upgrade [AI]. [src] is consumed in the process.</span>")
qdel(src)
@@ -246,8 +246,6 @@
if(!lawsync && !M.syndiemmi)
O.lawupdate = 0
O.make_laws()
if(ticker.mode.config_tag == "malfunction") //Don't let humans get a cyborg on their side during malf, for balance reasons.
O.set_zeroth_law("<span class='danger'>ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*&110010</span>")
M.brainmob.mind.transfer_to(O)
+133 -166
View File
@@ -2,17 +2,19 @@
name = "medical pack"
singular_name = "medical pack"
icon = 'icons/obj/items.dmi'
amount = 5
max_amount = 5
amount = 6
max_amount = 6
w_class = 1
throw_speed = 4
throw_range = 20
throw_speed = 3
throw_range = 7
var/heal_brute = 0
var/heal_burn = 0
var/self_delay = 20
var/unique_handling = 0 //some things give a special prompt, do we want to bypass some checks in parent?
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if(!istype(M))
to_chat(user, "<span class='danger'>\The [src] cannot be applied to [M]!</span>")
/obj/item/stack/medical/attack(mob/living/M, mob/user)
if(!iscarbon(M) && !isanimal(M))
to_chat(user, "<span class='danger'>[src] cannot be applied to [M]!</span>")
return 1
if(!user.IsAdvancedToolUser())
@@ -20,13 +22,12 @@
return 1
if(istype(M, /mob/living/carbon/human))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(isliving(M))
if(!M.can_inject(user, 1))
return 1
if(!H.can_inject(user, 1))
return 1
if(!affecting)
to_chat(user, "<span class='danger'>That limb is missing!</span>")
@@ -36,15 +37,38 @@
to_chat(user, "<span class='danger'>This can't be used on a robotic limb.</span>")
return 1
if(M == user && !unique_handling)
user.visible_message("<span class='notice'>[user] starts to apply [src] on [H]...</span>")
if(!do_mob(user, H, self_delay))
return 1
return
H.UpdateDamageIcon()
if(isanimal(M))
var/mob/living/simple_animal/critter = M
if(!(critter.healable))
to_chat(user, "<span class='notice'>You cannot use [src] on [critter]!</span>")
return
else if (critter.health == critter.maxHealth)
to_chat(user, "<span class='notice'>[critter] is at full health.</span>")
return
else if(heal_brute < 1)
to_chat(user, "<span class='notice'>[src] won't help [critter] at all.</span>")
return
critter.heal_organ_damage(heal_brute, heal_burn)
user.visible_message("<span class='green'>[user] applies [src] on [critter].</span>", \
"<span class='green'>You apply [src] on [critter].</span>")
else
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
user.visible_message("<span class='notice'>[M] has been applied with [src] by [user].</span>","<span class='notice'>You apply \the [src] to [M].</span>")
use(1)
M.updatehealth()
else
M.heal_organ_damage(heal_brute, heal_burn)
M.updatehealth()
user.visible_message("<span class='green'>[user] applies [src] on [M].</span>", \
"<span class='green'>You apply [src] on [M].</span>")
use(1)
//Bruise Packs//
/obj/item/stack/medical/bruise_pack
name = "roll of gauze"
@@ -53,98 +77,11 @@
icon_state = "gauze"
origin_tech = "biotech=1"
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
/obj/item/stack/medical/bruise_pack/attack(mob/living/M, mob/user)
if(..())
return 1
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
if(!affecting.bandage())
to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been bandaged.")
return 1
else
for(var/datum/wound/W in affecting.wounds)
if(W.internal)
continue
if(W.current_stage <= W.max_bleeding_stage)
user.visible_message( "\blue [user] bandages \the [W.desc] on [M]'s [affecting.name].", \
"\blue You bandage \the [W.desc] on [M]'s [affecting.name]." )
else if(istype(W,/datum/wound/bruise))
user.visible_message( "\blue [user] places a bruise patch over \the [W.desc] on [M]'s [affecting.name].", \
"\blue You place a bruise patch over \the [W.desc] on [M]'s [affecting.name]." )
else
user.visible_message( "\blue [user] places a bandaid over \the [W.desc] on [M]'s [affecting.name].", \
"\blue You place a bandaid over \the [W.desc] on [M]'s [affecting.name]." )
affecting.heal_damage(src.heal_brute, src.heal_burn, 0)
use(1)
else
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
use(1)
/obj/item/stack/medical/ointment
name = "ointment"
desc = "Used to treat those nasty burns."
gender = PLURAL
singular_name = "ointment"
icon_state = "ointment"
heal_burn = 1
origin_tech = "biotech=1"
/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
if(!affecting.salve())
to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been salved.")
return 1
else
user.visible_message( "\blue [user] salves the wounds on [M]'s [affecting.name].", \
"\blue You salve the wounds on [M]'s [affecting.name]." )
affecting.heal_damage(src.heal_brute, src.heal_burn, 0)
use(1)
else
to_chat(user, "<span class='notice'>The [affecting.name] is cut open, you'll need more than some ointment!</span>")
/obj/item/stack/medical/bruise_pack/comfrey
name = "\improper Comfrey leaf"
singular_name = "Comfrey leaf"
desc = "A soft leaf that is rubbed on bruises."
icon = 'icons/obj/hydroponics_products.dmi'
icon_state = "alien3-product"
color = "#378C61"
heal_brute = 7
/obj/item/stack/medical/ointment/aloe
name = "\improper Aloe Vera leaf"
singular_name = "Aloe Vera leaf"
desc = "A cold leaf that is rubbed on burns."
icon = 'icons/obj/hydroponics_products.dmi'
icon_state = "ambrosia-product"
color = "#4CC5C7"
heal_burn = 7
/obj/item/stack/medical/advanced/bruise_pack
name = "advanced trauma kit"
singular_name = "advanced trauma kit"
desc = "An advanced trauma kit for severe injuries."
icon_state = "traumakit"
heal_brute = 12
origin_tech = "biotech=1"
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
if(istype(M, /mob/living/carbon/human))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
@@ -153,101 +90,131 @@
var/disinfected = affecting.disinfect()
if(!(bandaged || disinfected))
to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been treated.")
to_chat(user, "<span class='warning'>The wounds on [H]'s [affecting.name] have already been bandaged.</span>")
return 1
else
for(var/datum/wound/W in affecting.wounds)
if(W.internal)
continue
if(W.current_stage <= W.max_bleeding_stage)
user.visible_message( "\blue [user] cleans \the [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \
"\blue You clean and seal \the [W.desc] on [M]'s [affecting.name]." )
//H.add_side_effect("Itch")
else if(istype(W,/datum/wound/bruise))
user.visible_message( "\blue [user] places a medicine patch over \the [W.desc] on [M]'s [affecting.name].", \
"\blue You place a medicine patch over \the [W.desc] on [M]'s [affecting.name]." )
else
user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.name].", \
"\blue You smear some bioglue over [W.desc] on [M]'s [affecting.name]." )
if(bandaged)
affecting.heal_damage(heal_brute,0)
user.visible_message("<span class='green'>[user] bandages the wounds on [H]'s [affecting.name].", \
"<span class='green'>You bandage the wounds on [H]'s [affecting.name].</span>" )
affecting.heal_damage(heal_brute, heal_burn)
H.UpdateDamageIcon()
use(1)
else
to_chat(user, "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>")
to_chat(user, "<span class='warning'>[affecting] is cut open, you'll need more than a bandage!</span>")
/obj/item/stack/medical/advanced/ointment
name = "advanced burn kit"
singular_name = "advanced burn kit"
desc = "An advanced treatment kit for severe burns."
icon_state = "burnkit"
heal_burn = 12
/obj/item/stack/medical/bruise_pack/advanced
name = "advanced trauma kit"
singular_name = "advanced trauma kit"
desc = "An advanced trauma kit for severe injuries."
icon_state = "traumakit"
heal_brute = 25
//Ointment//
/obj/item/stack/medical/ointment
name = "ointment"
desc = "Used to treat those nasty burns."
gender = PLURAL
singular_name = "ointment"
icon_state = "ointment"
origin_tech = "biotech=1"
/obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
/obj/item/stack/medical/ointment/attack(mob/living/M, mob/user)
if(..())
return 1
if(istype(M, /mob/living/carbon/human))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
if(!affecting.salve())
to_chat(user, "\red The wounds on [M]'s [affecting.name] have already been salved.")
to_chat(user, "<span class='warning'>The wounds on [H]'s [affecting.name] have already been salved.</span>")
return 1
else
user.visible_message( "\blue [user] covers the wounds on [M]'s [affecting.name] with regenerative membrane.", \
"\blue You cover the wounds on [M]'s [affecting.name] with regenerative membrane." )
affecting.heal_damage(0,heal_burn)
user.visible_message("<span class='green'>[user] salves the wounds on [H]'s [affecting.name].", \
"<span class='green'>You salve the wounds on [H]'s [affecting.name].</span>" )
affecting.heal_damage(heal_brute, heal_burn)
H.UpdateDamageIcon()
use(1)
else
to_chat(user, "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>")
to_chat(user, "<span class='warning'>[affecting] is cut open, you'll need more than some ointment!</span>")
/obj/item/stack/medical/ointment/advanced
name = "advanced burn kit"
singular_name = "advanced burn kit"
desc = "An advanced treatment kit for severe burns."
icon_state = "burnkit"
heal_burn = 25
//Medical Herbs//
/obj/item/stack/medical/bruise_pack/comfrey
name = "\improper Comfrey leaf"
singular_name = "Comfrey leaf"
desc = "A soft leaf that is rubbed on bruises."
icon = 'icons/obj/hydroponics_products.dmi'
icon_state = "alien3-product"
color = "#378C61"
heal_brute = 12
/obj/item/stack/medical/ointment/aloe
name = "\improper Aloe Vera leaf"
singular_name = "Aloe Vera leaf"
desc = "A cold leaf that is rubbed on burns."
icon = 'icons/obj/hydroponics_products.dmi'
icon_state = "ambrosia-product"
color = "#4CC5C7"
heal_burn = 12
//Splits//
/obj/item/stack/medical/splint
name = "medical splints"
singular_name = "medical splint"
icon_state = "splint"
amount = 5
max_amount = 5
unique_handling = 1
self_delay = 100
/obj/item/stack/medical/splint/single
amount = 1
/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/user as mob)
/obj/item/stack/medical/splint/attack(mob/living/M, mob/user)
if(..())
return 1
if(istype(M, /mob/living/carbon/human))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
var/limb = affecting.name
if(!(affecting.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot")))
to_chat(user, "\red You can't apply a splint there!")
to_chat(user, "<span class='danger'>You can't apply a splint there!</span>")
return
if(affecting.status & ORGAN_SPLINTED)
to_chat(user, "\red [M]'s [limb] is already splinted!")
if(alert(user, "Would you like to remove the splint from [M]'s [limb]?", "Removing.", "Yes", "No") == "Yes")
to_chat(user, "<span class='danger'>[H]'s [limb] is already splinted!</span>")
if(alert(user, "Would you like to remove the splint from [H]'s [limb]?", "Removing.", "Yes", "No") == "Yes")
affecting.status &= ~ORGAN_SPLINTED
to_chat(user, "<span class='notice'>You remove the splint from [M]'s [limb].")
to_chat(user, "<span class='notice'>You remove the splint from [H]'s [limb].</span>")
return
if(M != user)
user.visible_message("\red [user] starts to apply \the [src] to [M]'s [limb].", "\red You start to apply \the [src] to [M]'s [limb].", "\red You hear something being wrapped.")
else
if((!user.hand && affecting.limb_name in list("r_arm", "r_hand")) || (user.hand && affecting.limb_name in list("l_arm", "l_hand")))
to_chat(user, "\red You can't apply a splint to the arm you're using!")
if(M == user)
user.visible_message("<span class='notice'>[user] starts to apply [src] to [H]'s [limb].</span>", \
"<span class='notice'>You start to apply [src] to [H]'s [limb].</span>", \
"<span class='notice'>You hear something being wrapped.</span>")
if(!do_mob(user, H, self_delay))
return
user.visible_message("\red [user] starts to apply \the [src] to their [limb].", "\red You start to apply \the [src] to your [limb].", "\red You hear something being wrapped.")
if(do_after(user, 50, target = M))
if(M != user)
user.visible_message("\red [user] finishes applying \the [src] to [M]'s [limb].", "\red You finish applying \the [src] to [M]'s [limb].", "\red You hear something being wrapped.")
else
if(prob(25))
user.visible_message("\red [user] successfully applies \the [src] to their [limb].", "\red You successfully apply \the [src] to your [limb].", "\red You hear something being wrapped.")
else
user.visible_message("\red [user] fumbles \the [src].", "\red You fumble \the [src].", "\red You hear something being wrapped.")
return
affecting.status |= ORGAN_SPLINTED
use(1)
return
else
user.visible_message("<span class='green'>[user] applies [src] to their [limb].</span>", \
"<span class='green'>You apply [src] to your [limb].</span>", \
"<span class='green'>You hear something being wrapped.</span>")
affecting.status |= ORGAN_SPLINTED
use(1)
@@ -21,16 +21,16 @@
new/obj/item/stack/sheet/glass(user.loc)
if(amount <= 0)
user.unEquip(src, 1)
del(src)
qdel(src)
if(istype(O,/obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = O
M.amount--
if(M.amount <= 0)
user.unEquip(src, 1)
del(M)
qdel(M)
amount--
new/obj/item/stack/tile/light(user.loc)
if(amount <= 0)
user.unEquip(src, 1)
del(src)
qdel(src)
@@ -36,6 +36,7 @@ var/global/list/datum/stack_recipe/uranium_recipes = list ( \
var/global/list/datum/stack_recipe/gold_recipes = list ( \
new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/crown, 5), \
)
var/global/list/datum/stack_recipe/plasma_recipes = list ( \
@@ -125,11 +126,25 @@ var/global/list/datum/stack_recipe/mime_recipes = list ( \
origin_tech = "plasmatech=2;materials=2"
sheettype = "plasma"
materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT)
burn_state = FLAMMABLE
burntime = 5
/obj/item/stack/sheet/mineral/plasma/New()
..()
recipes = plasma_recipes
/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
message_admins("Plasma sheets ignited by [key_name_admin(user)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])")
fire_act()
else
return ..()
/obj/item/stack/sheet/mineral/plasma/fire_act()
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, amount*10)
qdel(src)
/obj/item/stack/sheet/mineral/plastic
name = "Plastic"
icon_state = "sheet-plastic"
+102 -115
View File
@@ -10,156 +10,172 @@
*/
/obj/item/stack
origin_tech = "materials=1"
var/list/datum/stack_recipe/recipes
var/list/recipes = list() // /datum/stack_recipe
var/singular_name
var/amount = 1
var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
/obj/item/stack/New(var/loc, var/amount=null)
/obj/item/stack/New(var/loc, var/amt = null)
..()
if(amount!=null) //Allow for stacks with the amount=0
src.amount=amount
return
if(amt != null) //Allow for stacks with the amount=0
amount = amt
/obj/item/stack/Destroy()
if(usr && usr.machine==src)
if(usr && usr.machine == src)
usr << browse(null, "window=stack")
return ..()
..()
return QDEL_HINT_HARDDEL_NOW // because qdel'd stacks act strange for cyborgs
/obj/item/stack/examine(mob/user)
if(..(user, 1))
to_chat(user, "There are [src.amount] [src.singular_name]\s in the stack.")
to_chat(user, "There are [amount] [singular_name]\s in the stack.")
/obj/item/stack/attack_self(mob/user as mob)
/obj/item/stack/attack_self(mob/user)
list_recipes(user)
/obj/item/stack/proc/list_recipes(mob/user as mob, recipes_sublist)
/obj/item/stack/proc/list_recipes(mob/user, recipes_sublist)
if(!recipes)
return
if(!src || amount<=0)
if(amount <= 0)
user << browse(null, "window=stack")
return
user.set_machine(src) //for correct work of onclose
var/list/recipe_list = recipes
if(recipes_sublist && recipe_list[recipes_sublist] && istype(recipe_list[recipes_sublist], /datum/stack_recipe_list))
var/datum/stack_recipe_list/srl = recipe_list[recipes_sublist]
recipe_list = srl.recipes
var/t1 = "Amount Left: [amount]<br>"
for(var/i=1;i<=recipe_list.len,i++)
for(var/i in 1 to recipe_list.len)
var/E = recipe_list[i]
if(isnull(E))
t1 += "<hr>"
continue
if(i>1 && !isnull(recipe_list[i-1]))
t1+="<br>"
if(i > 1 && !isnull(recipe_list[i - 1]))
t1 += "<br>"
if(istype(E, /datum/stack_recipe_list))
var/datum/stack_recipe_list/srl = E
if(src.amount >= srl.req_amount)
t1 += "<a href='?src=\ref[src];sublist=[i]'>[srl.title] ([srl.req_amount] [src.singular_name]\s)</a>"
if(amount >= srl.req_amount)
t1 += "<a href='?src=\ref[src];sublist=[i]'>[srl.title] ([srl.req_amount] [singular_name]\s)</a>"
else
t1 += "[srl.title] ([srl.req_amount] [src.singular_name]\s)<br>"
t1 += "[srl.title] ([srl.req_amount] [singular_name]\s)<br>"
if(istype(E, /datum/stack_recipe))
var/datum/stack_recipe/R = E
var/max_multiplier = round(src.amount / R.req_amount)
var/title as text
var/title
var/can_build = 1
can_build = can_build && (max_multiplier>0)
can_build = can_build && (max_multiplier > 0)
/*
if(R.one_per_turf)
can_build = can_build && !(locate(R.result_type) in usr.loc)
if(R.on_floor)
can_build = can_build && istype(usr.loc, /turf/simulated/floor)
*/
if(R.res_amount>1)
title+= "[R.res_amount]x [R.title]\s"
if(R.res_amount > 1)
title += "[R.res_amount]x [R.title]\s"
else
title+= "[R.title]"
title+= " ([R.req_amount] [src.singular_name]\s)"
title += "[R.title]"
title += " ([R.req_amount] [src.singular_name]\s)"
if(can_build)
t1 += text("<A href='?src=\ref[src];sublist=[recipes_sublist];make=[i]'>[title]</A> ")
t1 += "<A href='?src=\ref[src];sublist=[recipes_sublist];make=[i]'>[title]</A> "
else
t1 += text("[]", title)
t1 += "[title]"
continue
if(R.max_res_amount>1 && max_multiplier>1)
max_multiplier = min(max_multiplier, round(R.max_res_amount/R.res_amount))
max_multiplier = min(max_multiplier, round(R.max_res_amount / R.res_amount))
t1 += " |"
var/list/multipliers = list(5,10,25)
for(var/n in multipliers)
if(max_multiplier>=n)
t1 += " <A href='?src=\ref[src];make=[i];multiplier=[n]'>[n*R.res_amount]x</A>"
t1 += " <A href='?src=\ref[src];make=[i];multiplier=[n]'>[n * R.res_amount]x</A>"
if(!(max_multiplier in multipliers))
t1 += " <A href='?src=\ref[src];make=[i];multiplier=[max_multiplier]'>[max_multiplier*R.res_amount]x</A>"
t1 += " <A href='?src=\ref[src];make=[i];multiplier=[max_multiplier]'>[max_multiplier * R.res_amount]x</A>"
var/datum/browser/popup = new(user, "stack", name, 400, 400)
popup.set_content(t1)
popup.open(0)
onclose(user, "stack")
return
/obj/item/stack/Topic(href, href_list)
..()
if((usr.restrained() || usr.stat || usr.get_active_hand() != src))
return
if(usr.incapacitated() || usr.get_active_hand() != src)
return 0
if(href_list["sublist"] && !href_list["make"])
list_recipes(usr, text2num(href_list["sublist"]))
if(href_list["make"])
if(src.amount < 1) del(src) //Never should happen
if(amount < 1)
qdel(src) //Never should happen
var/list/recipes_list = recipes
if(href_list["sublist"])
var/datum/stack_recipe_list/srl = recipes_list[text2num(href_list["sublist"])]
recipes_list = srl.recipes
var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])]
var/multiplier = text2num(href_list["multiplier"])
if(!multiplier) multiplier = 1
if(src.amount < R.req_amount*multiplier)
if(R.req_amount*multiplier>1)
to_chat(usr, "\red You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!")
if(!multiplier)
multiplier = 1
if(amount < R.req_amount * multiplier)
if(R.req_amount * multiplier>1)
to_chat(usr, "<span class='warning'>You haven't got enough [src] to build \the [R.req_amount * multiplier] [R.title]\s!</span>")
else
to_chat(usr, "\red You haven't got enough [src] to build \the [R.title]!")
return
to_chat(usr, "<span class='warning'>You haven't got enough [src] to build \the [R.title]!</span>")
return 0
if(R.one_per_turf && (locate(R.result_type) in usr.loc))
to_chat(usr, "\red There is another [R.title] here!")
return
to_chat(usr, "<span class='warning'>There is another [R.title] here!</span>")
return 0
if(R.on_floor && !istype(usr.loc, /turf/simulated))
to_chat(usr, "\red \The [R.title] must be constructed on the floor!")
return
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
return 0
if(R.time)
to_chat(usr, "\blue Building [R.title] ...")
to_chat(usr, "<span class='notice'>Building [R.title] ...</span>")
if(!do_after(usr, R.time, target = usr))
return
if(src.amount < R.req_amount*multiplier)
return 0
if(amount < R.req_amount * multiplier)
return
var/atom/O = new R.result_type( usr.loc )
var/atom/O = new R.result_type(usr.loc)
O.dir = usr.dir
if(R.max_res_amount>1)
if(R.max_res_amount > 1)
var/obj/item/stack/new_item = O
new_item.amount = R.res_amount*multiplier
new_item.amount = R.res_amount * multiplier
//new_item.add_to_stacks(usr)
src.amount-=R.req_amount*multiplier
if(src.amount < 1) // Just in case a stack's amount ends up fractional somehow
R.post_build(src, O)
amount -= R.req_amount * multiplier
if(amount < 1) // Just in case a stack's amount ends up fractional somehow
var/oldsrc = src
src = null //dont kill proc after del()
usr.unEquip(oldsrc, 1)
del(oldsrc) // Not qdel, because qdel'd stacks act strange for cyborgs
if(istype(O,/obj/item))
qdel(oldsrc)
if(istype(O, /obj/item))
usr.put_in_hands(O)
O.add_fingerprint(usr)
//BubbleWrap - so newly formed boxes are empty
if( istype(O, /obj/item/weapon/storage) )
if(istype(O, /obj/item/weapon/storage))
for(var/obj/item/I in O)
del(I)
qdel(I)
//BubbleWrap END
if(src && usr.machine==src) //do not reopen closed window
spawn( 0 )
src.interact(usr)
if(src && usr.machine == src) //do not reopen closed window
spawn(0)
interact(usr)
return
return
/obj/item/stack/proc/use(var/used)
if(amount < used)
@@ -169,19 +185,19 @@
if(usr)
usr.unEquip(src, 1)
spawn()
del(src) // Not qdel, because qdel'd stacks act strange for cyborgs
qdel(src)
update_icon()
return 1
/obj/item/stack/proc/add_to_stacks(mob/usr as mob)
/obj/item/stack/proc/add_to_stacks(mob/usr)
var/obj/item/stack/oldsrc = src
src = null
for(var/obj/item/stack/item in usr.loc)
if(item==oldsrc)
if(item == oldsrc)
continue
if(!istype(item, oldsrc.type))
continue
if(item.amount>=item.max_amount)
if(item.amount >= item.max_amount)
continue
oldsrc.attackby(item, usr)
to_chat(usr, "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s.")
@@ -204,7 +220,7 @@
use(amt)
return F
/obj/item/stack/attack_hand(mob/user as mob)
/obj/item/stack/attack_hand(mob/user)
if(user.get_inactive_hand() == src)
var/obj/item/stack/F = split(user, 1)
user.put_in_hands(F)
@@ -214,14 +230,15 @@
else
..()
/obj/item/stack/attackby(obj/item/W as obj, mob/user as mob, params)
/obj/item/stack/attackby(obj/item/W, mob/user, params)
..()
if(istype(W, src.type))
if(istype(W, type))
var/obj/item/stack/S = W
if(S.amount >= max_amount)
return 1
var/to_transfer as num
if(user.get_inactive_hand()==src)
var/to_transfer
if(user.get_inactive_hand() == src)
var/desired = input("How much would you like to transfer from this stack?", "How much?", 1) as null|num
if(!desired)
return
@@ -229,52 +246,22 @@
to_transfer = max(1,min(desired,S.max_amount-S.amount,src.amount))
else
to_transfer = min(src.amount, S.max_amount-S.amount)
S.amount+=to_transfer
if(S && usr.machine==S)
spawn(0) S.interact(usr)
src.use(to_transfer)
if(src && usr.machine==src)
spawn(0) src.interact(usr)
S.amount += to_transfer
if(S && usr.machine == S)
spawn(0)
S.interact(usr)
use(to_transfer)
if(src && usr.machine == src)
spawn(0)
interact(usr)
S.update_icon()
else return ..()
else
return ..()
/obj/item/stack/proc/copy_evidences(obj/item/stack/from as obj)
src.blood_DNA = from.blood_DNA
src.fingerprints = from.fingerprints
src.fingerprintshidden = from.fingerprintshidden
src.fingerprintslast = from.fingerprintslast
//TODO bloody overlay
/*
* Recipe datum
*/
/datum/stack_recipe
var/title = "ERROR"
var/result_type
var/req_amount = 1
var/res_amount = 1
var/max_res_amount = 1
var/time = 0
var/one_per_turf = 0
var/on_floor = 0
New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0)
src.title = title
src.result_type = result_type
src.req_amount = req_amount
src.res_amount = res_amount
src.max_res_amount = max_res_amount
src.time = time
src.one_per_turf = one_per_turf
src.on_floor = on_floor
/*
* Recipe list datum
*/
/datum/stack_recipe_list
var/title = "ERROR"
var/list/recipes = null
var/req_amount = 1
New(title, recipes, req_amount = 1)
src.title = title
src.recipes = recipes
src.req_amount = req_amount
/obj/item/stack/proc/copy_evidences(obj/item/stack/from)
blood_DNA = from.blood_DNA
fingerprints = from.fingerprints
fingerprintshidden = from.fingerprintshidden
fingerprintslast = from.fingerprintslast
//TODO bloody overlay
@@ -0,0 +1,55 @@
/*
* Recipe datum
*/
/datum/stack_recipe
var/title = "ERROR"
var/result_type
var/req_amount = 1
var/res_amount = 1
var/max_res_amount = 1
var/time = 0
var/one_per_turf = 0
var/on_floor = 0
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0)
src.title = title
src.result_type = result_type
src.req_amount = req_amount
src.res_amount = res_amount
src.max_res_amount = max_res_amount
src.time = time
src.one_per_turf = one_per_turf
src.on_floor = on_floor
/datum/stack_recipe/proc/post_build(var/obj/item/stack/S, var/obj/result)
return
/* Special Recipes */
/datum/stack_recipe/cable_restraints
/datum/stack_recipe/cable_restraints/post_build(var/obj/item/stack/S, var/obj/result)
if(istype(result, /obj/item/weapon/restraints/handcuffs/cable))
result.color = S.color
..()
/datum/stack_recipe/rods
/datum/stack_recipe/rods/post_build(var/obj/item/stack/S, var/obj/result)
if(istype(result, /obj/item/stack/rods))
var/obj/item/stack/rods/R = result
R.update_icon()
..()
/*
* Recipe list datum
*/
/datum/stack_recipe_list
var/title = "ERROR"
var/list/recipes = null
var/req_amount = 1
/datum/stack_recipe_list/New(title, recipes, req_amount = 1)
src.title = title
src.recipes = recipes
src.req_amount = req_amount
@@ -37,6 +37,7 @@
icon_state = "tile_grass"
origin_tech = "biotech=1"
turf_type = /turf/simulated/floor/grass
burn_state = FLAMMABLE
/*
* Wood
@@ -48,6 +49,7 @@
desc = "an easy to fit wood floor tile"
icon_state = "tile-wood"
turf_type = /turf/simulated/floor/wood
burn_state = FLAMMABLE
/*
* Carpets
@@ -58,6 +60,7 @@
desc = "A piece of carpet. It is the same size as a floor tile"
icon_state = "tile-carpet"
turf_type = /turf/simulated/floor/carpet
burn_state = FLAMMABLE
/*
* Plasteel
@@ -100,6 +103,7 @@
desc = "A piece of carpet with a convincing star pattern."
icon_state = "tile_space"
turf_type = /turf/simulated/floor/fakespace
burn_state = FLAMMABLE
/obj/item/stack/tile/fakespace/loaded
amount = 30
+25 -19
View File
@@ -257,31 +257,31 @@
icon = 'icons/obj/toy.dmi'
icon_state = "snappop"
w_class = 1
var/ash_type = /obj/effect/decal/cleanable/ash
/obj/item/toy/snappop/throw_impact(atom/hit_atom)
..()
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
/obj/item/toy/snappop/proc/pop_burst(var/n=3, var/c=1)
var/datum/effect/system/spark_spread/s = new()
s.set_up(n, c, src)
s.start()
new /obj/effect/decal/cleanable/ash(src.loc)
visible_message("<span class='warning'>The [src.name] explodes!</span>","<span class='warning'>You hear a snap!</span>")
new ash_type(loc)
visible_message("<span class='warning'>[src] explodes!</span>",
"<span class='italics'>You hear a snap!</span>")
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
/obj/item/toy/snappop/fire_act()
pop_burst()
/obj/item/toy/snappop/throw_impact(atom/hit_atom)
..()
pop_burst()
/obj/item/toy/snappop/Crossed(H as mob|obj)
if((ishuman(H))) //i guess carp and shit shouldn't set them off
if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off
var/mob/living/carbon/M = H
if(M.m_intent == "run")
to_chat(M, "<span class='warning'>You step on the snap pop!</span>")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(2, 0, src)
s.start()
new /obj/effect/decal/cleanable/ash(src.loc)
visible_message("<span class='warning'>The [name] explodes!</span>","<span class='warning'>You hear a snap!</span>")
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
if(issilicon(H) || M.m_intent == "run")
to_chat(M, "<span class='danger'>You step on the snap pop!</span>")
pop_burst(2, 0)
/*
@@ -394,6 +394,8 @@
obj/item/toy/cards
burn_state = FLAMMABLE
burntime = 5
var/parentdeck = null
var/deckstyle = "nanotrasen"
var/card_hitsound = null
@@ -749,6 +751,7 @@ obj/item/toy/cards/deck/syndicate
card_throw_speed = 3
card_throw_range = 20
card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut")
burn_state = FIRE_PROOF
/*
|| Custom card decks ||
@@ -884,6 +887,7 @@ obj/item/toy/cards/deck/syndicate/black
icon_state = "carpplushie"
attack_verb = list("bitten", "eaten", "fin slapped")
var/bitesound = 'sound/weapons/bite.ogg'
burn_state = FLAMMABLE
// Attack mob
/obj/item/toy/carpplushie/attack(mob/M as mob, mob/user as mob)
@@ -946,6 +950,7 @@ obj/item/toy/cards/deck/syndicate/black
icon = 'icons/obj/toy.dmi'
var/poof_sound = 'sound/weapons/thudswoosh.ogg'
attack_verb = list("poofed", "bopped", "whapped","cuddled","fluffed")
burn_state = FLAMMABLE
/obj/item/toy/plushie/attack(mob/M as mob, mob/user as mob)
playsound(loc, poof_sound, 20, 1) // Play the whoosh sound in local area
@@ -1071,6 +1076,7 @@ obj/item/toy/cards/deck/syndicate/black
item_state = "arm_blade"
attack_verb = list("pricked", "absorbed", "gored")
w_class = 2
burn_state = FLAMMABLE
/*
* Toy/fake flash
@@ -1372,7 +1378,7 @@ obj/item/toy/cards/deck/syndicate/black
is_empty = 1
playsound(src, 'sound/weapons/Gunshot.ogg', 50, 1)
user.visible_message("<span class='danger'>The [src] goes off!</span>")
M.apply_damage(200, "brute", "head", used_weapon = "Self-inflicted gunshot would to the head.", sharp=1)
M.apply_damage(200, BRUTE, "head", sharp =1, used_weapon = "Self-inflicted gunshot would to the head.")
M.death()
else
user.visible_message("<span class='danger'>[user] lowers the [src] from their head.</span>")
+4
View File
@@ -6,6 +6,7 @@
icon = 'icons/obj/trash.dmi'
w_class = 1
desc = "This is rubbish."
burn_state = FLAMMABLE
/obj/item/trash/raisins
name = "4no raisins"
@@ -42,6 +43,7 @@
/obj/item/trash/plate
name = "Plate"
icon_state = "plate"
burn_state = FIRE_PROOF
/obj/item/trash/snack_bowl
name = "Snack bowl"
@@ -58,6 +60,7 @@
/obj/item/trash/tray
name = "Tray"
icon_state = "tray"
burn_state = FIRE_PROOF
/obj/item/trash/candle
name = "candle"
@@ -73,6 +76,7 @@
icon_state = "cola"
var/is_glass = 0
var/is_plastic = 0
burn_state = FIRE_PROOF
/obj/item/trash/gum
name = "chewed gum"
+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)