Merge branch 'master' into master

This commit is contained in:
Andrew
2017-06-25 18:10:33 -05:00
committed by GitHub
62 changed files with 1105 additions and 277 deletions
+29 -6
View File
@@ -3,17 +3,40 @@
set name = "AOOC"
set desc = "Antagonist OOC"
if(!check_rights(R_ADMIN|R_MOD)) return
var/is_admin = check_rights(R_ADMIN|R_MOD, show_msg = 0)
var/is_antag = usr.mind && usr.mind.special_role
if(!is_antag && !is_admin) // Non-antagonists and non-admins have no business using this.
to_chat(usr, "<span class='warning'>Sorry, but only certain antagonists or administrators can use this verb.</span>")
return
else if(is_antag && !is_admin) // Is an antag, and not an admin, meaning we need to check if their antag type allows AOOC.
var/datum/antagonist/A = get_antag_data(usr.mind.special_role)
if(!A || !A.can_use_aooc)
to_chat(usr, "<span class='warning'>Sorry, but your antagonist type is not allowed to speak in AOOC.</span>")
return
msg = sanitize(msg)
if(!msg) return
if(!msg)
return
// Name shown to admins.
var/display_name = src.key
if(holder && holder.fakekey)
display_name = holder.fakekey
if(holder)
if(holder.fakekey)
display_name = usr.client.holder.fakekey
// Name shown to other players. Admins whom are not also antags have their rank displayed.
var/player_display = (is_admin && !is_antag) ? "[display_name]([usr.client.holder.rank])" : display_name
for(var/mob/M in mob_list)
if((M.mind && M.mind.special_role && M.client) || check_rights((R_ADMIN|R_MOD), 0, M))
M << "<font color='#960018'><span class='ooc'>" + create_text_tag("aooc", "Antag-OOC:", M.client) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>"
if(check_rights(R_ADMIN|R_MOD, 0, M)) // Staff can see AOOC unconditionally, and with more details.
to_chat(M, "<span class='ooc'><span class='aooc'>[create_text_tag("aooc", "Antag-OOC:", M.client)] <EM>[get_options_bar(src, 0, 1, 1)]([admin_jump_link(usr, M.client.holder)]):</EM> <span class='message'>[msg]</span></span></span>")
else if(M.client) // Players can only see AOOC if observing, or if they are an antag type allowed to use AOOC.
var/datum/antagonist/A = null
if(M.mind) // Observers don't have minds, but they should still see AOOC.
A = get_antag_data(M.mind.special_role)
if((M.mind && M.mind.special_role && A && A.can_use_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
to_chat(M, "<span class='ooc'><span class='aooc'>[create_text_tag("aooc", "Antag-OOC:", M.client)] <EM>[player_display]:</EM> <span class='message'>[msg]</span></span></span>")
log_ooc("(ANTAG) [key] : [msg]")
@@ -391,4 +391,38 @@
/datum/gear/suit/miscellaneous/peacoat/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/suit/snowsuit
display_name = "snowsuit"
path = /obj/item/clothing/suit/storage/snowsuit
/datum/gear/suit/snowsuit/command
display_name = "snowsuit, command"
path = /obj/item/clothing/suit/storage/snowsuit/command
allowed_roles = list("Colony Director","Research Director","Head of Personnel","Head of Security","Chief Engineer","Command Secretary")
/datum/gear/suit/snowsuit/security
display_name = "snowsuit, security"
path = /obj/item/clothing/suit/storage/snowsuit/security
allowed_roles = list("Security Officer", "Head of Security", "Warden", "Detective")
/datum/gear/suit/snowsuit/medical
display_name = "snowsuit, medical"
path = /obj/item/clothing/suit/storage/snowsuit/medical
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
/datum/gear/suit/snowsuit/science
display_name = "snowsuit, science"
path = /obj/item/clothing/suit/storage/snowsuit/science
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
/datum/gear/suit/snowsuit/engineering
display_name = "snowsuit, engineering"
path = /obj/item/clothing/suit/storage/snowsuit/engineering
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Station Engineer")
/datum/gear/suit/snowsuit/cargo
display_name = "snowsuit, supply"
path = /obj/item/clothing/suit/storage/snowsuit/cargo
allowed_roles = list("Quartermaster","shaft Miner","Cargo Technician","Head of Personnel")
@@ -13,7 +13,7 @@
offline_slowdown = 10
vision_restriction = 1
offline_vision_restriction = 2
siemens_coefficient = 0.75
chest_type = /obj/item/clothing/suit/space/rig/breacher
helm_type = /obj/item/clothing/head/helmet/space/rig/breacher
boot_type = /obj/item/clothing/shoes/magboots/rig/breacher
@@ -25,6 +25,7 @@
icon_state = "breacher_rig"
armor = list(melee = 90, bullet = 90, laser = 90, energy = 90, bomb = 90, bio = 100, rad = 80) //Takes TEN TIMES as much damage to stop someone in a breacher. In exchange, it's slow.
vision_restriction = 0
siemens_coefficient = 0.2
/obj/item/clothing/head/helmet/space/rig/breacher
species_restricted = list("Unathi")
@@ -11,6 +11,7 @@
helm_type = /obj/item/clothing/head/helmet/space/rig/ert
req_access = list(access_cent_specops)
siemens_coefficient= 0.5
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
@@ -30,7 +31,7 @@
suit_type = "ERT engineer"
icon_state = "ert_engineer_rig"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
siemens_coefficient = 0
glove_type = /obj/item/clothing/gloves/gauntlets/rig/eva
initial_modules = list(
/obj/item/rig_module/ai_container,
@@ -71,6 +72,8 @@
suit_type = "heavy asset protection"
icon_state = "asset_protection_rig"
armor = list(melee = 60, bullet = 50, laser = 50,energy = 40, bomb = 40, bio = 100, rad = 100)
siemens_coefficient= 0.3
glove_type = /obj/item/clothing/gloves/gauntlets/rig/eva
initial_modules = list(
/obj/item/rig_module/ai_container,
@@ -11,7 +11,8 @@
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
siemens_coefficient = 0.3
glove_type = /obj/item/clothing/gloves/gauntlets/rig/eva
helm_type = /obj/item/clothing/head/helmet/space/rig/merc
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs)
@@ -65,6 +65,7 @@
offline_slowdown = 10
offline_vision_restriction = 2
emp_protection = -20
siemens_coefficient= 0.75
helm_type = /obj/item/clothing/head/helmet/space/rig/industrial
@@ -92,6 +93,7 @@
slowdown = 0
offline_slowdown = 1
offline_vision_restriction = 1
siemens_coefficient= 0.75
helm_type = /obj/item/clothing/head/helmet/space/rig/eva
glove_type = /obj/item/clothing/gloves/gauntlets/rig/eva
@@ -128,6 +130,7 @@
slowdown = 0
offline_slowdown = 0
offline_vision_restriction = 0
siemens_coefficient= 0.75
helm_type = /obj/item/clothing/head/helmet/space/rig/ce
glove_type = /obj/item/clothing/gloves/gauntlets/rig/ce
@@ -163,6 +166,7 @@
armor = list(melee = 45, bullet = 5, laser = 45, energy = 80, bomb = 60, bio = 100, rad = 100)
slowdown = 1
offline_vision_restriction = 1
siemens_coefficient= 0.75
helm_type = /obj/item/clothing/head/helmet/space/rig/hazmat
@@ -190,6 +194,7 @@
armor = list(melee = 30, bullet = 15, laser = 20, energy = 60, bomb = 30, bio = 100, rad = 100)
slowdown = 1
offline_vision_restriction = 1
siemens_coefficient= 0.75
helm_type = /obj/item/clothing/head/helmet/space/rig/medical
@@ -219,6 +224,7 @@
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
siemens_coefficient= 0.7
helm_type = /obj/item/clothing/head/helmet/space/rig/hazard
@@ -951,3 +951,38 @@ obj/item/clothing/suit/storage/toggle/peacoat
body_parts_covered = UPPER_TORSO|ARMS
flags_inv = HIDEHOLSTER
/obj/item/clothing/suit/storage/snowsuit
name = "snowsuit"
desc = "A suit made to keep you nice and toasty on cold winter days. Or at least alive."
icon_state = "snowsuit"
item_state_slots = list(slot_r_hand_str = "labcoat", slot_l_hand_str = "labcoat")
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
flags_inv = HIDEHOLSTER
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask)
/obj/item/clothing/suit/storage/snowsuit/command
name = "command snowsuit"
icon_state = "snowsuit_command"
/obj/item/clothing/suit/storage/snowsuit/security
name = "security snowsuit"
icon_state = "snowsuit_security"
/obj/item/clothing/suit/storage/snowsuit/medical
name = "medical snowsuit"
icon_state = "snowsuit_medical"
/obj/item/clothing/suit/storage/snowsuit/engineering
name = "engineering snowsuit"
icon_state = "snowsuit_engineering"
/obj/item/clothing/suit/storage/snowsuit/cargo
name = "cargo snowsuit"
icon_state = "snowsuit_cargo"
/obj/item/clothing/suit/storage/snowsuit/science
name = "science snowsuit"
icon_state = "snowsuit_science"
@@ -20,7 +20,7 @@
if(stat!=DEAD) //If not dead.
death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA
ghostize() //Ghostize checks for key so nothing else is necessary.
..()
return ..()
say_understands(var/other)//Goddamn is this hackish, but this say code is so odd
if (istype(other, /mob/living/silicon/ai))
@@ -313,4 +313,104 @@
name = "mobility module"
desc = "By retracting limbs and tucking in its head, a combat android can roll at high speeds."
icon = 'icons/obj/decals.dmi'
icon_state = "shock"
icon_state = "shock"
/obj/item/weapon/inflatable_dispenser
name = "inflatables dispenser"
desc = "Hand-held device which allows rapid deployment and removal of inflatables."
icon = 'icons/obj/storage.dmi'
icon_state = "inf_deployer"
w_class = ITEMSIZE_LARGE
var/stored_walls = 5
var/stored_doors = 2
var/max_walls = 5
var/max_doors = 2
var/mode = 0 // 0 - Walls 1 - Doors
/obj/item/weapon/inflatable_dispenser/robot
w_class = ITEMSIZE_HUGE
stored_walls = 10
stored_doors = 5
max_walls = 10
max_doors = 5
/obj/item/weapon/inflatable_dispenser/examine(var/mob/user)
if(!..(user))
return
to_chat(user, "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored.")
to_chat(user, "It is set to deploy [mode ? "doors" : "walls"]")
/obj/item/weapon/inflatable_dispenser/attack_self()
mode = !mode
to_chat(usr, "You set \the [src] to deploy [mode ? "doors" : "walls"].")
/obj/item/weapon/inflatable_dispenser/afterattack(var/atom/A, var/mob/user)
..(A, user)
if(!user)
return
if(!user.Adjacent(A))
to_chat(user, "You can't reach!")
return
if(istype(A, /turf))
try_deploy_inflatable(A, user)
if(istype(A, /obj/item/inflatable) || istype(A, /obj/structure/inflatable))
pick_up(A, user)
/obj/item/weapon/inflatable_dispenser/proc/try_deploy_inflatable(var/turf/T, var/mob/living/user)
if(mode) // Door deployment
if(!stored_doors)
to_chat(user, "\The [src] is out of doors!")
return
if(T && istype(T))
new /obj/structure/inflatable/door(T)
stored_doors--
else // Wall deployment
if(!stored_walls)
to_chat(user, "\The [src] is out of walls!")
return
if(T && istype(T))
new /obj/structure/inflatable(T)
stored_walls--
playsound(T, 'sound/items/zip.ogg', 75, 1)
to_chat(user, "You deploy the inflatable [mode ? "door" : "wall"]!")
/obj/item/weapon/inflatable_dispenser/proc/pick_up(var/obj/A, var/mob/living/user)
if(istype(A, /obj/structure/inflatable))
if(!istype(A, /obj/structure/inflatable/door))
if(stored_walls >= max_walls)
to_chat(user, "\The [src] is full.")
return
stored_walls++
qdel(A)
else
if(stored_doors >= max_doors)
to_chat(user, "\The [src] is full.")
return
stored_doors++
qdel(A)
playsound(loc, 'sound/machines/hiss.ogg', 75, 1)
visible_message("\The [user] deflates \the [A] with \the [src]!")
return
if(istype(A, /obj/item/inflatable))
if(!istype(A, /obj/item/inflatable/door))
if(stored_walls >= max_walls)
to_chat(user, "\The [src] is full.")
return
stored_walls++
qdel(A)
else
if(stored_doors >= max_doors)
to_chat(usr, "\The [src] is full!")
return
stored_doors++
qdel(A)
visible_message("\The [user] picks up \the [A] with \the [src]!")
return
to_chat(user, "You fail to pick up \the [A] with \the [src]")
return
@@ -400,6 +400,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.modules += new /obj/item/device/floor_painter(src)
src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src)
src.emag = new /obj/item/weapon/melee/baton/robot/arm(src)
src.modules += new /obj/item/device/geiger(src)
src.modules += new /obj/item/weapon/rcd/borg(src)
@@ -408,7 +409,8 @@ var/global/list/robot_modules = list(
var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000)
var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000)
var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel()
var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel(20000)
var/datum/matter_synth/wire = new /datum/matter_synth/wire()
synths += metal
synths += glass
@@ -436,12 +438,12 @@ var/global/list/robot_modules = list(
C.synths = list(wire)
src.modules += C
var/obj/item/stack/tile/floor/cyborg/F = new /obj/item/stack/tile/floor/cyborg(src)
F.synths = list(metal)
src.modules += F
var/obj/item/stack/material/cyborg/plasteel/P = new (src)
P.synths = list(plasteel)
src.modules += P
var/obj/item/stack/material/cyborg/plasteel/S = new (src)
S.synths = list(plasteel)
var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src)
S.synths = list(metal)
src.modules += S
var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src)
+2 -2
View File
@@ -65,7 +65,7 @@
/obj/item/ammo_magazine
name = "magazine"
desc = "A magazine for some kind of gun."
icon_state = "357"
icon_state = ".357"
icon = 'icons/obj/ammo.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -78,7 +78,7 @@
var/list/stored_ammo = list()
var/mag_type = SPEEDLOADER //ammo_magazines can only be used with compatible guns. This is not a bitflag, the load_method var on guns is.
var/caliber = "357"
var/caliber = ".357"
var/max_ammo = 7
var/ammo_type = /obj/item/ammo_casing //ammo type that is initially loaded
@@ -30,7 +30,7 @@
name = "speedloader (.357)"
desc = "A speedloader for .357 revolvers."
icon_state = "38"
caliber = "357"
caliber = ".357"
ammo_type = /obj/item/ammo_casing/a357
matter = list(DEFAULT_WALL_MATERIAL = 1260)
max_ammo = 6
@@ -381,28 +381,28 @@
/obj/item/ammo_magazine/m556saw/empty
initial_ammo = 0
///////// .50 AE /////////
///////// .44 Magnum /////////
/obj/item/ammo_magazine/m50
name = "magazine (.50 AE)"
icon_state = "50ae"
/obj/item/ammo_magazine/m44
name = "magazine (.44)"
icon_state = ".44"
origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
caliber = ".50AE"
caliber = ".44"
matter = list(DEFAULT_WALL_MATERIAL = 1260)
ammo_type = /obj/item/ammo_casing/a50ae
ammo_type = /obj/item/ammo_casing/a44
max_ammo = 7
multiple_sprites = 1
/obj/item/ammo_magazine/m50/empty
/obj/item/ammo_magazine/m44/empty
initial_ammo = 0
/obj/item/ammo_magazine/clip/c50
name = "ammo clip (.50 AE)"
/obj/item/ammo_magazine/clip/c44
name = "ammo clip (.44)"
icon_state = "clip_pistol"
desc = "A stripper clip for reloading .50 Action Express rounds into magazines."
caliber = ".50AE"
ammo_type = /obj/item/ammo_casing/a50ae
desc = "A stripper clip for reloading .44 rounds into magazines."
caliber = ".44"
ammo_type = /obj/item/ammo_casing/a44
matter = list(DEFAULT_WALL_MATERIAL = 1620) // metal costs are very roughly based around one .50 casing = 180 metal
max_ammo = 9
multiple_sprites = 1
@@ -25,7 +25,7 @@
/obj/item/ammo_casing/a357
desc = "A .357 bullet casing."
caliber = "357"
caliber = ".357"
projectile_type = /obj/item/projectile/bullet/pistol/strong
/*
@@ -54,9 +54,9 @@
* .50 Action Express
*/
/obj/item/ammo_casing/a50ae
desc = "A .50AE bullet casing."
caliber = ".50AE"
/obj/item/ammo_casing/a44
desc = "A .44 bullet casing."
caliber = ".44"
projectile_type = /obj/item/projectile/bullet/pistol/strong
/*
+1 -1
View File
@@ -11,7 +11,7 @@
matter = list(DEFAULT_WALL_MATERIAL = 1000)
recoil = 1
var/caliber = "357" //determines which casings will fit
var/caliber = ".357" //determines which casings will fit
var/handle_casings = EJECT_CASINGS //determines how spent casings should be handled
var/load_method = SINGLE_CASING|SPEEDLOADER //1 = Single shells, 2 = box or quick loader, 3 = magazine
var/obj/item/ammo_casing/chambered = null
@@ -116,15 +116,15 @@
/obj/item/weapon/gun/projectile/deagle
name = "desert eagle"
desc = "A robust handgun that uses .50 AE rounds."
desc = "The perfect handgun for shooters with a need to hit targets through a wall and behind a fridge in your neighbor's house. Uses .44 rounds."
icon_state = "deagle"
item_state = "deagle"
force = 14.0
caliber = ".50AE"
caliber = ".44"
load_method = MAGAZINE
fire_sound = 'sound/weapons/deagle.ogg'
magazine_type = /obj/item/ammo_magazine/m50
allowed_magazines = list(/obj/item/ammo_magazine/m50)
magazine_type = /obj/item/ammo_magazine/m44
allowed_magazines = list(/obj/item/ammo_magazine/m44)
/obj/item/weapon/gun/projectile/deagle/update_icon()
..()
@@ -134,12 +134,12 @@
icon_state = "[initial(icon_state)]-e"
/obj/item/weapon/gun/projectile/deagle/gold
desc = "A gold plated gun folded over a million times by superior martian gunsmiths. Uses .50 AE rounds."
desc = "A gold plated gun folded over a million times by superior martian gunsmiths. Uses .44 rounds."
icon_state = "deagleg"
item_state = "deagleg"
/obj/item/weapon/gun/projectile/deagle/camo
desc = "A Deagle brand Deagle for operators operating operationally. Uses .50 AE rounds."
desc = "A Deagle brand Deagle for operators operating operationally. Uses .44 rounds."
icon_state = "deaglecamo"
item_state = "deagleg"
@@ -259,14 +259,14 @@
/obj/item/ammo_casing/a9mmf = "9mm",
/obj/item/ammo_casing/a45f = ".45",
/obj/item/ammo_casing/a10mm = "10mm",
/obj/item/ammo_casing/a12g = "12 gauge",
/obj/item/ammo_casing/a12g = "12 gauge",
/obj/item/ammo_casing/a12g/pellet = "12 gauge",
/obj/item/ammo_casing/a12g/pellet = "12 gauge",
/obj/item/ammo_casing/a12g/pellet = "12 gauge",
/obj/item/ammo_casing/a12g/beanbag = "12 gauge",
/obj/item/ammo_casing/a12g/stunshell = "12 gauge",
/obj/item/ammo_casing/a12g/flash = "12 gauge",
/obj/item/ammo_casing/a12g = "12g",
/obj/item/ammo_casing/a12g = "12g",
/obj/item/ammo_casing/a12g/pellet = "12g",
/obj/item/ammo_casing/a12g/pellet = "12g",
/obj/item/ammo_casing/a12g/pellet = "12g",
/obj/item/ammo_casing/a12g/beanbag = "12g",
/obj/item/ammo_casing/a12g/stunshell = "12g",
/obj/item/ammo_casing/a12g/flash = "12g",
/obj/item/ammo_casing/a762 = "7.62mm",
/obj/item/ammo_casing/a556 = "5.56mm"
)
@@ -3,7 +3,7 @@
desc = "The Lumoco Arms HE Colt is a choice revolver for when you absolutely, positively need to put a hole in the other guy. Uses .357 rounds."
icon_state = "revolver"
item_state = "revolver"
caliber = "357"
caliber = ".357"
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
handle_casings = CYCLE_CASINGS
max_shells = 6
+1 -1
View File
@@ -130,7 +130,7 @@
break_to_parts()
return
if(istype(W, /obj/item/weapon/melee/arm_blade))
if(istype(W, /obj/item/weapon/melee/changeling/arm_blade))
user.visible_message("<span class='danger'>\The [src] was sliced apart by [user]!</span>")
break_to_parts()
return
@@ -15,10 +15,10 @@
/obj/machinery/artifact_harvester/New()
..()
//connect to a nearby scanner pad
owned_scanner = locate(/obj/machinery/artifact_scanpad) in get_step(src, dir)
if(!owned_scanner)
owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src)
spawn(50) //Delay so the scan pad has time to actually spawn in
owned_scanner = locate(/obj/machinery/artifact_scanpad) in get_step(src, dir) //connect to a nearby scanner pad
if(!owned_scanner)
owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src)
/obj/machinery/artifact_harvester/attackby(var/obj/I as obj, var/mob/user as mob)
if(istype(I,/obj/item/weapon/anobattery))