Merge branch 'master' of https://github.com/VOREStation/Polaris into aro-sync-05-25-2018

# Conflicts:
#	code/__defines/misc.dm
#	code/controllers/master_controller.dm
#	code/game/machinery/computer3/computers/card.dm
#	code/game/objects/items/devices/communicator/UI.dm
#	code/game/objects/items/stacks/medical.dm
#	code/game/objects/structures/signs.dm
#	code/modules/admin/admin_verbs.dm
#	code/modules/client/client defines.dm
#	code/modules/client/client procs.dm
#	code/modules/clothing/clothing.dm
#	code/modules/clothing/under/accessories/holster.dm
#	code/modules/events/radiation_storm.dm
#	code/modules/mining/machine_processing.dm
#	code/modules/mob/living/carbon/human/species/station/prometheans.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob/living/simple_animal/animals/bear.dm
#	code/modules/mob/living/simple_animal/animals/cat.dm
#	code/modules/mob/living/simple_animal/animals/parrot.dm
#	code/modules/mob/mob.dm
#	code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
#	code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
#	code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
#	code/modules/reagents/reagent_dispenser.dm
#	config/example/config.txt
#	html/changelogs/.all_changelog.yml
#	interface/skin.dmf
#	maps/southern_cross/southern_cross-1.dmm
#	vorestation.dme
This commit is contained in:
Arokha Sieyes
2018-05-25 13:23:47 -04:00
291 changed files with 324089 additions and 16301 deletions
+2
View File
@@ -1,3 +1,5 @@
GLOBAL_LIST_BOILERPLATE(all_portals, /obj/effect/portal)
/obj/effect/portal
name = "portal"
desc = "Looks unstable. Best to test it with the clown."
+1 -1
View File
@@ -46,7 +46,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
var/close = range(world.view+round(devastation_range,1), epicenter)
// to all distanced mobs play a different sound
for(var/mob/M in world)
for(var/mob/M in player_list)
if(M.z == epicenter.z)
if(!(M in close))
// check if the mob can hear
+7 -1
View File
@@ -1,3 +1,5 @@
GLOBAL_LIST_BOILERPLATE(all_items, /obj/item)
/obj/item
name = "item"
icon = 'icons/obj/items.dmi'
@@ -587,7 +589,7 @@ var/list/global/slot_flags_enumeration = list(
I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
//not sure if this is worth it. It attaches the blood_overlay to every item of the same type if they don't have one already made.
for(var/obj/item/A in world)
for(var/obj/item/A in all_items)
if(A.type == type && !A.blood_overlay)
A.blood_overlay = image(I)
@@ -685,6 +687,10 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
/obj/item/proc/is_hot()
return FALSE
// Called when you swap hands away from the item
/obj/item/proc/in_inactive_hand(mob/user)
return
// My best guess as to why this is here would be that it does so little. Still, keep it under all the procs, for sanity's sake.
/obj/item/device
icon = 'icons/obj/device.dmi'
+20 -14
View File
@@ -653,8 +653,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "pda.tmpl", title, 520, 400, state = inventory_state)
// add templates for screens in common with communicator.
ui.add_template("atmosphericScan", "atmospheric_scan.tmpl")
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
ui.open()
@@ -893,7 +894,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if("Toggle Door")
if(cartridge && cartridge.access_remote_door)
for(var/obj/machinery/door/blast/M in world)
for(var/obj/machinery/door/blast/M in machines)
if(M.id == cartridge.remote_door_id)
if(M.density)
M.open()
@@ -1247,19 +1248,24 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(issilicon(usr))
return
if(can_use(usr) && !isnull(cartridge))
cartridge.forceMove(get_turf(src))
if(ismob(loc))
var/mob/M = loc
M.put_in_hands(cartridge)
mode = 0
scanmode = 0
if (cartridge.radio)
cartridge.radio.hostpda = null
to_chat(usr, "<span class='notice'>You remove \the [cartridge] from the [name].</span>")
cartridge = null
else
if(!can_use(usr))
to_chat(usr, "<span class='notice'>You cannot do this while restrained.</span>")
return
if(isnull(cartridge))
to_chat(usr, "<span class='notice'>There's no cartridge to eject.</span>")
return
cartridge.forceMove(get_turf(src))
if(ismob(loc))
var/mob/M = loc
M.put_in_hands(cartridge)
mode = 0
scanmode = 0
if (cartridge.radio)
cartridge.radio.hostpda = null
to_chat(usr, "<span class='notice'>You remove \the [cartridge] from the [name].</span>")
cartridge = null
/obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use.
if(choice == 1)
+4 -4
View File
@@ -468,7 +468,7 @@ var/list/civilian_cartridges = list(
else
JaniData["user_loc"] = list("x" = 0, "y" = 0)
var/MopData[0]
for(var/obj/item/weapon/mop/M in world)
for(var/obj/item/weapon/mop/M in all_mops)
var/turf/ml = get_turf(M)
if(ml)
if(ml.z != cl.z)
@@ -481,7 +481,7 @@ var/list/civilian_cartridges = list(
var/BucketData[0]
for(var/obj/structure/mopbucket/B in world)
for(var/obj/structure/mopbucket/B in all_mopbuckets)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
@@ -493,7 +493,7 @@ var/list/civilian_cartridges = list(
BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
var/CbotData[0]
for(var/mob/living/bot/cleanbot/B in world)
for(var/mob/living/bot/cleanbot/B in mob_list)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
@@ -505,7 +505,7 @@ var/list/civilian_cartridges = list(
if(!CbotData.len)
CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
var/CartData[0]
for(var/obj/structure/janitorialcart/B in world)
for(var/obj/structure/janitorialcart/B in all_janitorial_carts)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
@@ -118,6 +118,8 @@
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 475, 700, state = key_state)
// add templates for screens in common with communicator.
ui.add_template("atmosphericScan", "atmospheric_scan.tmpl")
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
@@ -0,0 +1,219 @@
/obj/item/device/laser_pointer
name = "laser pointer"
desc = "Don't shine it in your eyes!"
icon = 'icons/obj/device.dmi'
icon_state = "pointer"
item_state = "pen"
var/pointer_icon_state
slot_flags = SLOT_BELT
matter = list("glass" = 500,"metal" = 500)
w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter.
origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1)
var/turf/pointer_loc
var/energy = 8
var/max_energy = 8
var/effectchance = 20
var/cooldown = 10
var/last_used_time = 0
var/recharging = 0
var/recharge_locked = 0
var/obj/item/weapon/stock_parts/micro_laser/diode //used for upgrading!
/obj/item/device/laser_pointer/red
pointer_icon_state = "red_laser"
/obj/item/device/laser_pointer/green
pointer_icon_state = "green_laser"
/obj/item/device/laser_pointer/blue
pointer_icon_state = "blue_laser"
/obj/item/device/laser_pointer/purple
pointer_icon_state = "purple_laser"
/obj/item/device/laser_pointer/New()
..()
diode = new(src)
if(!pointer_icon_state)
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
/obj/item/device/laser_pointer/upgraded/New()
..()
diode = new /obj/item/weapon/stock_parts/micro_laser/ultra
/obj/item/device/laser_pointer/attack(mob/living/M, mob/user)
laser_act(M, user)
/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/stock_parts/micro_laser))
if(!diode)
user.drop_item()
W.loc = src
diode = W
to_chat(user, "<span class='notice'>You install a [diode.name] in [src].</span>")
else
to_chat(user, "<span class='notice'>[src] already has a diode.</span>")
else if(istype(W, /obj/item/weapon/screwdriver))
if(diode)
to_chat(user, "<span class='notice'>You remove the [diode.name] from the [src].</span>")
diode.loc = get_turf(src.loc)
diode = null
return
..()
return
/obj/item/device/laser_pointer/afterattack(var/atom/target, var/mob/living/user, flag, params)
if(flag) //we're placing the object on a table or in backpack
return
laser_act(target, user)
/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user)
if(!(user in (viewers(world.view,target))))
return
if(!(world.time - last_used_time >= cooldown))
return
if (!diode)
to_chat(user, "<span class='notice'>You point [src] at [target], but nothing happens!</span>")
return
if (!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
add_fingerprint(user)
//nothing happens if the battery is drained
if(recharge_locked)
to_chat(user, "<span class='notice'>You point [src] at [target], but it's still charging.</span>")
return
var/outmsg
var/turf/targloc = get_turf(target)
//human/alien mobs
if(iscarbon(target))
if(user.zone_sel.selecting == "eyes")
var/mob/living/carbon/C = target
//20% chance to actually hit the eyes
if(prob(effectchance * diode.rating))
add_attack_logs(user,C,"Tried blinding using [src]")
//eye target check, will return -1 to 2
var/eye_prot = C.eyecheck()
if(C.blinded)
eye_prot = 4
var/severity = (rand(0, 1) + diode.rating - eye_prot)
var/mob/living/carbon/human/H = C
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
if(!E)
outmsg = "<span class='notice'>You shine [src] at [C], but they don't seem to have eyes.</span>"
return
outmsg = "<span class='notice'>You shine [src] into [C]'s eyes.</span>"
switch(severity)
if(0)
//rank 1 diode with basic eye protection (like sunglasses), or rank 2 with industrial protection (like welding goggles)
to_chat(C, "<span class='info'>A small, bright dot appears in your vision.</span>")
if(1)
//rank 1 with no protection, rank 2 with basic protection, or rank 3 with industrial protection
to_chat(C, "<span class='notice'>Something bright flashes in the corner of your vision.</span>")
if(2)
//rank 1 or 2 with no protection, rank 2 or 3 with basic protection, or rank 3 with industrial protection
//alternatively, rank 1 with minor vulnerability (like night vision goggles)
flick("flash", C.flash_eyes())
to_chat(C, "<span class='danger'>A bright light shines across your eyes!</span>")
if(3)
//rank 1 with minor vulnerability, rank 2 or 3 with no protection, or rank 3 with basic protection
if(prob(3 * diode.rating))
C.Weaken(1)
flick("flash", C.flash_eyes())
E.damage += 1
to_chat(C, "<span class='danger'>A bright light briefly blinds you!</span>")
if(4)
//rank 3 with no protection, or rank 2 with minor vulnerability
if(prob(5 * diode.rating))
C.Weaken(1)
flick("e_flash", C.flash_eyes())
E.damage += 2
to_chat(C, "<span class='danger'>A blinding light burns your eyes!</span>")
else
outmsg = "<span class='notice'>You shine the [src] at [C], but miss their eyes.</span>"
//robots and AI
else if(issilicon(target))
var/mob/living/silicon/S = target
//20% chance to actually hit the sensors
if(prob(effectchance * diode.rating))
flick("flash", S.flash_eyes(affect_silicon = TRUE))
if (prob(3 * diode.rating))
S.Weaken(1)
to_chat(S, "<span class='warning'>Your sensors were blinded by a laser!</span>")
outmsg = "<span class='notice'>You blind [S] by shining [src] at their sensors.</span>"
add_attack_logs(user,S,"Tried disabling using [src]")
else
outmsg = "<span class='notice'>You shine the [src] at [S], but miss their sensors.</span>"
//cameras
else if(istype(target, /obj/machinery/camera))
var/obj/machinery/camera/C = target
if(prob(effectchance * diode.rating))
C.emp_act(4 - diode.rating)
outmsg = "<span class='notice'>You shine the [src] into the lens of [C].</span>"
add_attack_logs(user,C.name,"Tried disabling using [src]")
else
outmsg = "<span class='info'>You missed the lens of [C] with [src].</span>"
//cats!
for(var/mob/living/simple_animal/cat/C in viewers(1,targloc))
if (!(C.stat || C.buckled))
if(prob(50) && !(C.client))
C.visible_message("<span class='warning'>[C] pounces on the light!</span>", "<span class='warning'>You pounce on the light!</span>")
step_towards(C, targloc)
C.lay_down()
spawn(10)
C.lay_down()
else
C.set_dir(get_dir(C,targloc))
C.visible_message("<span class='notice'>[C] watches the light.</span>", "<span class='notice'>Your attention is drawn to the mysterious glowing dot.</span>")
//laser pointer image
icon_state = "pointer_[pointer_icon_state]"
var/list/showto = list()
for(var/mob/M in viewers(world.view,targloc))
if(M.client)
showto.Add(M.client)
var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,cooldown)
I.plane = PLANE_LIGHTING_ABOVE
I.pixel_x = target.pixel_x + rand(-5,5)
I.pixel_y = target.pixel_y + rand(-5,5)
if(outmsg)
user.visible_message("<span class='info'>[user] points [src] at [target].</span>", outmsg)
else
user.visible_message("<span class='info'>[user] points [src] at [target].</span>", "<span class='info'>You point [src] at [target].</span>")
last_used_time = world.time
energy -= 1
if(energy <= max_energy)
if(!recharging)
recharging = 1
processing_objects.Add(src)
if(energy <= 0)
to_chat(user, "<span class='warning'>You've overused the battery of [src], now it needs time to recharge!</span>")
recharge_locked = 1
flick_overlay(I, showto, cooldown)
spawn(cooldown)
icon_state = "pointer"
/obj/item/device/laser_pointer/process()
if(prob(20 - recharge_locked*5))
energy += 1
if(energy >= max_energy)
energy = max_energy
recharging = 0
recharge_locked = 0
..()
@@ -1,167 +0,0 @@
/obj/item/device/laser_pointer
name = "laser pointer"
desc = "Don't shine it in your eyes!"
icon = 'icons/obj/device_alt.dmi'
icon_state = "pointer"
item_state = "pen"
var/pointer_icon_state
flags = CONDUCT
slot_flags = SLOT_BELT
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500)
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
var/energy = 5
var/max_energy = 5
var/effectchance = 33
var/recharging = 0
var/recharge_locked = 0
var/obj/item/weapon/stock_parts/micro_laser/diode //used for upgrading!
/obj/item/device/laser_pointer/red
pointer_icon_state = "red_laser"
/obj/item/device/laser_pointer/green
pointer_icon_state = "green_laser"
/obj/item/device/laser_pointer/blue
pointer_icon_state = "blue_laser"
/obj/item/device/laser_pointer/purple
pointer_icon_state = "purple_laser"
/obj/item/device/laser_pointer/New()
..()
diode = new(src)
if(!pointer_icon_state)
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
/obj/item/device/laser_pointer/upgraded/New()
..()
diode = new /obj/item/weapon/stock_parts/micro_laser/ultra
/obj/item/device/laser_pointer/Destroy()
qdel_null(diode)
processing_objects -= src
. = ..()
/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/stock_parts/micro_laser))
if(!diode)
user.drop_item()
W.forceMove(src)
diode = W
to_chat(user, "<span class='notice'>You install \a [diode] in [src].</span>")
else
to_chat(user, "<span class='notice'>\The [src] already has a diode installed.</span>")
else if(isscrewdriver(W))
if(diode)
to_chat(user, "<span class='notice'>You remove \the [diode] from \the [src].</span>")
diode.forceMove(drop_location())
diode = null
else
return ..()
/obj/item/device/laser_pointer/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
laser_act(target, user, click_parameters)
/obj/item/device/laser_pointer/proc/laser_act(atom/target, mob/living/user, click_parameters)
if( !(user in (viewers(world.view, target))) )
return
if (!diode)
to_chat(user, "<span class='notice'>You point \the [src] at \the [target], but nothing happens!</span>")
return
if (!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(HULK in H.mutations)
to_chat(user, "<span class='warning'>Your fingers can't press the button!</span>")
return
add_fingerprint(user)
//nothing happens if the battery is drained
if(recharge_locked)
to_chat(user, "<span class='notice'>You point \the [src] at \the [target], but it's still charging.</span>")
return
var/outmsg
var/turf/targloc = get_turf(target)
//human/alien mobs
if(iscarbon(target))
var/mob/living/carbon/C = target
if(user.zone_sel.selecting == O_EYES)
add_attack_logs(user, C, "shone [src] in the eyes")
var/severity = 1
if(prob(33))
severity = 2
else if(prob(50))
severity = 0
//20% chance to actually hit the eyes
if(prob(effectchance * diode.rating) && C.flash_eyes(severity))
outmsg = "<span class='notice'>You blind [C] by shining [src] in their eyes.</span>"
else
outmsg = "<span class='warning'>You fail to blind [C] by shining [src] at their eyes!</span>"
//cameras
else if(istype(target, /obj/machinery/camera))
var/obj/machinery/camera/C = target
if(prob(effectchance * diode.rating))
C.emp_act(1)
outmsg = "<span class='notice'>You hit the lens of [C] with [src], temporarily disabling the camera!</span>"
add_attack_logs(user, C, "EMPed with [src]")
else
outmsg = "<span class='warning'>You miss the lens of [C] with [src]!</span>"
//cats!
for(var/mob/living/simple_animal/cat/C in view(1, targloc))
if(prob(50))
C.visible_message("<span class='notice'>[C] pounces on the light!</span>", "<span class='warning'>LIGHT!</span>")
C.Move(targloc)
C.resting = TRUE
C.update_canmove()
else
C.visible_message("<span class='notice'>[C] looks uninterested in your games.</span>", "<span class='warning'>You spot [user] shining [src] at you. How insulting!</span>")
//laser pointer image
icon_state = "pointer_[pointer_icon_state]"
var/image/I = image('icons/obj/projectiles_vr.dmi', targloc, pointer_icon_state)
I.plane = ABOVE_PLANE
var/list/click_params = params2list(click_parameters)
if(click_params)
if(click_params["icon-x"])
I.pixel_x = (text2num(click_params["icon-x"]) - 16)
if(click_params["icon-y"])
I.pixel_y = (text2num(click_params["icon-y"]) - 16)
else
I.pixel_x = target.pixel_x + rand(-5,5)
I.pixel_y = target.pixel_y + rand(-5,5)
if(outmsg)
to_chat(user, outmsg)
else
to_chat(user, "<span class='info'>You point [src] at [target].</span>")
energy -= 1
if(energy <= max_energy)
if(!recharging)
recharging = 1
processing_objects.Add(src)
if(energy <= 0)
to_chat(user, "<span class='warning'>[src]'s battery is overused, it needs time to recharge!</span>")
recharge_locked = TRUE
flick_overlay_view(I, targloc, 1 SECOND)
sleep(1 SECOND)
icon_state = "pointer"
/obj/item/device/laser_pointer/process()
if(prob(20 - recharge_locked*5))
energy += 1
if(energy >= max_energy)
energy = max_energy
recharging = 0
recharge_locked = FALSE
..()
@@ -1,3 +1,5 @@
GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
/obj/item/device/paicard
name = "personal AI device"
icon = 'icons/obj/pda.dmi'
@@ -6,6 +6,8 @@
var/code = "electronic"
origin_tech = list(TECH_BLUESPACE = 1)
GLOBAL_LIST_BOILERPLATE(all_beacons, /obj/item/device/radio/beacon)
/obj/item/device/radio/beacon/hear_talk()
return
+12 -1
View File
@@ -51,4 +51,15 @@
/obj/item/poi/brokenoldreactor/Destroy()
processing_objects -= src
return ..()
return ..()
//Crashed Cargo Shuttle PoI
/obj/structure/largecrate/animal/crashedshuttle
name = "SCP"
/obj/structure/largecrate/animal/crashedshuttle/New()
held_type = pick(/mob/living/simple_animal/hostile/statue, /obj/item/cursed_marble)
name = pick("Spicy Crust Pizzeria", "Soap and Care Products", "Sally's Computer Parts", "Steve's Chocolate Pastries", "Smith & Christian's Plastics","Standard Containers & Packaging Co.", "Sanitary Chemical Purgation (LTD)")
name += " delivery crate"
..()
+9 -1
View File
@@ -9,6 +9,7 @@
throw_range = 20
var/heal_brute = 0
var/heal_burn = 0
var/apply_sounds
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if (!istype(M))
@@ -65,6 +66,7 @@
icon_state = "brutepack"
origin_tech = list(TECH_BIO = 1)
no_variants = FALSE
apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg')
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -112,6 +114,7 @@
"<span class='notice'>You place a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
// W.disinfect() // VOREStation - Tech1 should not disinfect
playsound(src, pick(apply_sounds), 25)
used++
affecting.update_damages()
if(used == amount)
@@ -130,6 +133,7 @@
heal_burn = 1
origin_tech = list(TECH_BIO = 1)
no_variants = FALSE
apply_sounds = list('sound/effects/ointment.ogg')
/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -159,6 +163,7 @@
"<span class='notice'>You salved wounds on [M]'s [affecting.name].</span>" )
use(1)
affecting.salve()
playsound(src, pick(apply_sounds), 25)
/obj/item/stack/medical/advanced/bruise_pack
name = "advanced trauma kit"
@@ -167,6 +172,7 @@
icon_state = "traumakit"
heal_brute = 3
origin_tech = list(TECH_BIO = 1)
apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg','sound/effects/tape.ogg')
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -212,6 +218,7 @@
W.bandage()
W.disinfect()
W.heal_damage(heal_brute)
playsound(src, pick(apply_sounds), 25)
used++
affecting.update_damages()
if(used == amount)
@@ -228,7 +235,7 @@
icon_state = "burnkit"
heal_burn = 3
origin_tech = list(TECH_BIO = 1)
apply_sounds = list('sound/effects/ointment.ogg')
/obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -258,6 +265,7 @@
affecting.heal_damage(0,heal_burn)
use(1)
affecting.salve()
playsound(src, pick(apply_sounds), 25)
/obj/item/stack/medical/splint
name = "medical splints"
@@ -3,19 +3,20 @@
icon_state = "flashbang"
item_state = "flashbang"
origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 1)
var/max_range = 10 //The maximum range possible, including species effect mods. Cuts off at 7 for normal humans. Should be 3 higher than your intended target range for affecting normal humans.
var/banglet = 0
/obj/item/weapon/grenade/flashbang/prime()
..()
for(var/obj/structure/closet/L in hear(7, get_turf(src)))
for(var/obj/structure/closet/L in hear(max_range, get_turf(src)))
if(locate(/mob/living/carbon/, L))
for(var/mob/living/carbon/M in L)
bang(get_turf(src), M)
for(var/mob/living/carbon/M in hear(7, get_turf(src)))
for(var/mob/living/carbon/M in hear(max_range, get_turf(src)))
bang(get_turf(src), M)
for(var/obj/structure/blob/B in hear(8,get_turf(src))) //Blob damage here
for(var/obj/structure/blob/B in hear(max_range - 2,get_turf(src))) //Blob damage here
var/damage = round(30/(get_dist(B,get_turf(src))+1))
if(B.overmind)
damage *= B.overmind.blob_type.burn_multiplier
@@ -39,13 +40,19 @@
ear_safety = M.get_ear_protection()
//Flashing everyone
if(eye_safety < 1)
var/mob/living/carbon/human/H = M
var/flash_effectiveness = 1
var/bang_effectiveness = 1
if(ishuman(M))
flash_effectiveness = H.species.flash_mod
bang_effectiveness = H.species.sound_mod
if(eye_safety < 1 && get_dist(M, T) <= round(max_range * 0.7 * flash_effectiveness))
M.flash_eyes()
M.Confuse(2)
M.Weaken(5)
M.Confuse(2 * flash_effectiveness)
M.Weaken(5 * flash_effectiveness)
//Now applying sound
if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M))
if((get_dist(M, T) <= round(max_range * 0.3 * bang_effectiveness) || src.loc == M.loc || src.loc == M))
if(ear_safety > 0)
M.Confuse(2)
M.Weaken(1)
@@ -58,20 +65,19 @@
M.ear_damage += rand(0, 5)
M.ear_deaf = max(M.ear_deaf,15)
else if(get_dist(M, T) <= 5)
else if(get_dist(M, T) <= round(max_range * 0.5 * bang_effectiveness))
if(!ear_safety)
M.Confuse(8)
M.ear_damage += rand(0, 3)
M.ear_deaf = max(M.ear_deaf,10)
else if(!ear_safety)
else if(!ear_safety && get_dist(M, T) <= (max_range * 0.7 * bang_effectiveness))
M.Confuse(4)
M.ear_damage += rand(0, 1)
M.ear_deaf = max(M.ear_deaf,5)
//This really should be in mob not every check
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
if (E && E.damage >= E.min_bruised_damage)
M << "<span class='danger'>Your eyes start to burn badly!</span>"
@@ -69,6 +69,8 @@
else
..()
GLOBAL_LIST_BOILERPLATE(all_tracking_implants, /obj/item/weapon/implant/tracking)
/obj/item/weapon/implant/tracking
name = "tracking implant"
desc = "An implant normally given to dangerous criminals. Allows security to track your location."
@@ -309,6 +311,8 @@ Implant Specifics:<BR>"}
explosion(get_turf(imp_in), -1, -1, 1, 3)
qdel(src)
GLOBAL_LIST_BOILERPLATE(all_chem_implants, /obj/item/weapon/implant/chem)
/obj/item/weapon/implant/chem
name = "chemical implant"
desc = "Injects things."
@@ -144,9 +144,9 @@
force = 10
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
force_divisor = 0.5 // 15 when wielded with hardness 15 (glass)
force_divisor = 0.5 // 15 when wielded with hardness 30 (glass)
unwielded_force_divisor = 0.375
thrown_force_divisor = 1.5 // 20 when thrown with weight 15 (glass)
thrown_force_divisor = 1.5 // 22.5 when thrown with weight 15 (glass)
throw_speed = 3
edge = 0
sharp = 1
@@ -156,4 +156,4 @@
applies_material_colour = 0
fragile = 1 //It's a haphazard thing of glass, wire, and steel
reach = 2 // Spears are long.
attackspeed = 14
attackspeed = 14
+2 -1
View File
@@ -1,3 +1,5 @@
GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/weapon/mop)
/obj/item/weapon/mop
desc = "The world of janitalia wouldn't be complete without a mop."
name = "mop"
@@ -12,7 +14,6 @@
var/mopping = 0
var/mopcount = 0
/obj/item/weapon/mop/New()
create_reagents(30)
@@ -47,6 +47,10 @@
max_storage_space = ITEMSIZE_COST_NORMAL * 14 // 56
storage_cost = INVENTORY_STANDARD_SPACE + 1
/obj/item/weapon/storage/backpack/holding/duffle
name = "dufflebag of holding"
icon_state = "holdingduffle"
/obj/item/weapon/storage/backpack/holding/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/storage/backpack/holding))
user << "<span class='warning'>The Bluespace interfaces of the two devices conflict and malfunction.</span>"
@@ -254,6 +254,7 @@
description_antag = "This case will likely contain a charged fuel rod gun, and a few fuel rods to go with it. It can only hold the fuel rod gun, fuel rods, batteries, a screwdriver, and stock machine parts."
force = 12 //Anti-rad lined i.e. Lead, probably gonna hurt a bit if you get bashed with it.
can_hold = list(/obj/item/weapon/gun/magnetic/fuelrod, /obj/item/weapon/fuel_assembly, /obj/item/weapon/cell, /obj/item/weapon/stock_parts, /obj/item/weapon/screwdriver)
cant_hold = list(/obj/item/weapon/screwdriver/power)
starts_with = list(
/obj/item/weapon/gun/magnetic/fuelrod,
/obj/item/weapon/fuel_assembly/deuterium,
@@ -37,6 +37,7 @@
/obj/item/clothing/accessory/permit,
/obj/item/clothing/accessory/badge
)
cant_hold = list(/obj/item/weapon/screwdriver/power)
slot_flags = SLOT_ID
var/obj/item/weapon/card/id/front_id = null
+5
View File
@@ -56,6 +56,7 @@
user.visible_message("<span class='danger'>\The [user] has taped up \the [H]'s eyes!</span>")
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses)
H.update_inv_glasses()
playsound(src, 'sound/effects/tape.ogg',25)
else if(user.zone_sel.selecting == O_MOUTH || user.zone_sel.selecting == BP_HEAD)
if(!H.organs_by_name[BP_HEAD])
@@ -94,6 +95,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask)
H.update_inv_wear_mask()
playsound(src, 'sound/effects/tape.ogg',25)
else if(user.zone_sel.selecting == "r_hand" || user.zone_sel.selecting == "l_hand")
can_place = 0
@@ -109,6 +111,7 @@
return
var/obj/item/weapon/handcuffs/cable/tape/T = new(user)
playsound(src, 'sound/effects/tape.ogg',25)
if(!T.place_handcuffs(H, user))
user.unEquip(T)
@@ -124,6 +127,7 @@
var/obj/item/weapon/ducttape/tape = new(get_turf(src))
tape.attach(W)
user.put_in_hands(tape)
playsound(src, 'sound/effects/tape.ogg',25)
/obj/item/weapon/ducttape
name = "tape"
@@ -188,6 +192,7 @@
return // reduce papers around corners issue.
user.drop_from_inventory(src)
playsound(src, 'sound/effects/tape.ogg',25)
forceMove(source_turf)
if(params)
@@ -60,7 +60,7 @@ Frequency:
if (sr)
src.temp += "<B>Located Beacons:</B><BR>"
for(var/obj/item/device/radio/beacon/W in world)
for(var/obj/item/device/radio/beacon/W in all_beacons)
if (W.frequency == src.frequency)
var/turf/tr = get_turf(W)
if (tr.z == sr.z && tr)
@@ -78,7 +78,7 @@ Frequency:
src.temp += "[W.code]-[dir2text(get_dir(sr, tr))]-[direct]<BR>"
src.temp += "<B>Extranneous Signals:</B><BR>"
for (var/obj/item/weapon/implant/tracking/W in world)
for (var/obj/item/weapon/implant/tracking/W in all_tracking_implants)
if (!W.implanted || !(istype(W.loc,/obj/item/organ/external) || ismob(W.loc) || W.malfunction))
continue
@@ -137,7 +137,7 @@ Frequency:
user << "<span class='notice'>\The [src] is malfunctioning.</span>"
return
var/list/L = list( )
for(var/obj/machinery/teleport/hub/R in world)
for(var/obj/machinery/teleport/hub/R in machines)
var/obj/machinery/computer/teleporter/com = locate(/obj/machinery/computer/teleporter, locate(R.x - 2, R.y, R.z))
if (istype(com, /obj/machinery/computer/teleporter) && com.locked && !com.one_time_use)
if(R.icon_state == "tele1")
@@ -156,7 +156,7 @@ Frequency:
if ((user.get_active_hand() != src || user.stat || user.restrained()))
return
var/count = 0 //num of portals from this teleport in world
for(var/obj/effect/portal/PO in world)
for(var/obj/effect/portal/PO in all_portals)
if(PO.creator == src) count++
if(count >= 3)
user.show_message("<span class='notice'>\The [src] is recharging!</span>")
+1 -1
View File
@@ -172,7 +172,7 @@
item_state = "drill"
matter = list(DEFAULT_WALL_MATERIAL = 150, MAT_SILVER = 50)
origin_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
slot_flags = SLOT_BELT
force = 8
w_class = ITEMSIZE_SMALL
throwforce = 8
+2
View File
@@ -1,3 +1,5 @@
GLOBAL_LIST_BOILERPLATE(all_objs, /obj)
/obj
layer = OBJ_LAYER
plane = OBJ_PLANE
+2 -2
View File
@@ -10,7 +10,7 @@
/obj/structure/Destroy()
if(parts)
new parts(loc)
. = ..()
. = ..()
/obj/structure/attack_hand(mob/user)
if(breakable)
@@ -177,7 +177,7 @@
return 1
/obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb, var/wallbreaker)
if(!breakable || !damage || !wallbreaker)
if(!breakable || damage < 10 || !wallbreaker)
return 0
visible_message("<span class='danger'>[user] [attack_verb] the [src] apart!</span>")
user.do_attack_animation(src)
+4 -3
View File
@@ -1,10 +1,11 @@
// Based on catwalk.dm from https://github.com/Endless-Horizon/CEV-Eris
/obj/structure/catwalk
layer = TURF_LAYER + 0.5
icon = 'icons/turf/catwalks.dmi'
icon_state = "catwalk"
name = "catwalk"
desc = "Cats really don't like these things."
plane = TURF_PLANE
layer = ABOVE_UTILITY
icon = 'icons/turf/catwalks.dmi'
icon_state = "catwalk"
density = 0
var/health = 100
var/maxhealth = 100
@@ -346,7 +346,7 @@
icon_state = icon_opened
/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys", var/wallbreaker)
if(!damage || !wallbreaker)
if(damage < 10 || !wallbreaker)
return
user.do_attack_animation(src)
visible_message("<span class='danger'>[user] [attack_message] the [src]!</span>")
@@ -340,7 +340,7 @@
new /obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral(src)
return
GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/brig)
/obj/structure/closet/secure_closet/brig
name = "brig locker"
+1 -1
View File
@@ -7,7 +7,7 @@
anchored = 1
flags = CONDUCT
pressure_resistance = 5*ONE_ATMOSPHERE
layer = UNDER_JUNK_LAYER
layer = TABLE_LAYER
explosion_resistance = 1
var/health = 10
var/destroyed = 0
+2
View File
@@ -1,3 +1,5 @@
GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart)
/obj/structure/janitorialcart
name = "janitorial cart"
desc = "The ultimate in janitorial carts! Has space for water, mops, signs, trash bags, and more!"
@@ -10,6 +10,7 @@
flags = OPENCONTAINER
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
GLOBAL_LIST_BOILERPLATE(all_mopbuckets, /obj/structure/mopbucket)
/obj/structure/mopbucket/New()
create_reagents(300)
+3 -1
View File
@@ -196,6 +196,8 @@
* Crematorium
*/
GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium)
/obj/structure/morgue/crematorium
name = "crematorium"
desc = "A human incinerator. Works well on barbeque nights."
@@ -342,7 +344,7 @@
if(..())
return
if(src.allowed(user))
for (var/obj/structure/morgue/crematorium/C in world)
for (var/obj/structure/morgue/crematorium/C in all_crematoriums)
if (C.id == id)
if (!C.cremating)
C.cremate(user)
+2 -2
View File
@@ -3,8 +3,8 @@
anchored = 1
opacity = 0
density = 0
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
plane = OBJ_PLANE //VOREStation Edit
layer = ABOVE_JUNK_LAYER //VOREStation Edit
w_class = ITEMSIZE_NORMAL
/obj/structure/sign/ex_act(severity)