Merge branch 'master' of https://github.com/PolarisSS13/Polaris into polaris-sync-2018-02-23

# Conflicts:
#	code/game/jobs/job_controller.dm
#	code/game/machinery/oxygen_pump.dm
#	code/game/objects/items/weapons/storage/firstaid.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/modules/mob/new_player/new_player.dm
#	code/modules/organs/internal/eyes.dm
#	html/changelogs/.all_changelog.yml
#	maps/southern_cross/southern_cross-1.dmm
#	vorestation.dme
This commit is contained in:
Leshana
2018-02-23 20:32:44 -05:00
138 changed files with 2790 additions and 1112 deletions

View File

@@ -1228,7 +1228,7 @@
if(ismob(M))
var/take_msg = "<span class='notice'><b>ADMINHELP</b>: <b>[key_name(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> adminhelp, please don't dogpile them.</span>"
for(var/client/X in admins)
if((R_ADMIN|R_MOD|R_EVENT) & X.holder.rights)
if((R_ADMIN|R_MOD|R_EVENT|R_SERVER) & X.holder.rights)
to_chat(X, take_msg)
to_chat(M, "<span class='notice'><b>Your adminhelp is being attended to by [usr.client]. Thanks for your patience!</b></span>")
// VoreStation Edit Start

View File

@@ -12,7 +12,7 @@
melee_damage_lower = 2
melee_damage_upper = 4
layer = MOB_LAYER + 0.2 // Over the blob.
attacktext = "slams into"
attacktext = list("slams into")
attack_sound = 'sound/effects/slime_squish.ogg'
emote_see = list("sways", "inflates briefly")
var/mob/living/carbon/human/infested = null // The human this thing is totally not making into a zombie.
@@ -97,7 +97,7 @@
melee_damage_lower += 8 // 10 total.
melee_damage_upper += 11 // 15 total.
emote_see = list("shambles around", "twitches", "stares")
attacktext = "claws"
attacktext = list("claws")
H.forceMove(src)
infested = H

View File

@@ -1,12 +1,17 @@
/obj/item/clothing/proc/can_attach_accessory(obj/item/clothing/accessory/A)
if(valid_accessory_slots && istype(A) && (A.slot in valid_accessory_slots))
.=1
else
return 0
if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots))
for(var/obj/item/clothing/accessory/AC in accessories)
if (AC.slot == A.slot)
return 0
return 1
return 0
if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots))
for(var/obj/item/clothing/accessory/AC in accessories)
if (AC.slot == A.slot)
return 0
return 1
/obj/item/clothing/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/clothing/accessory))
@@ -22,7 +27,7 @@
return
else
user << "<span class='warning'>You cannot attach more accessories of this type to [src].</span>"
return
return
if(accessories.len)
for(var/obj/item/clothing/accessory/A in accessories)
@@ -37,6 +42,10 @@
for(var/obj/item/clothing/accessory/A in accessories)
A.attack_hand(user)
return
if (ishuman(user) && src.loc == user)
var/mob/living/carbon/human/H = user
if(src != H.l_store && src != H.r_store && src != H.s_store)
return
return ..()
/obj/item/clothing/MouseDrop(var/obj/over_object)
@@ -70,10 +79,16 @@
* user is the user doing the attaching. Can be null, such as when attaching
* items on spawn
*/
/obj/item/clothing/proc/update_accessory_slowdown()
slowdown = initial(slowdown)
for(var/obj/item/clothing/accessory/A in accessories)
slowdown += A.slowdown
/obj/item/clothing/proc/attach_accessory(mob/user, obj/item/clothing/accessory/A)
accessories += A
A.on_attached(src, user)
src.verbs |= /obj/item/clothing/proc/removetie_verb
update_accessory_slowdown()
update_clothing_icon()
/obj/item/clothing/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)
@@ -82,6 +97,7 @@
A.on_removed(user)
accessories -= A
update_accessory_slowdown()
update_clothing_icon()
/obj/item/clothing/proc/removetie_verb()

View File

@@ -28,7 +28,7 @@
icon_state = "arm_guards_bullet"
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
siemens_coefficient = 0.7
armor = list(melee = 10, bullet = 80, laser = 10, energy = 50, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 10, bullet = 80, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/gloves/arm_guard/riot
name = "riot arm guards"
@@ -36,7 +36,7 @@
icon_state = "arm_guards_riot"
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
siemens_coefficient = 0.5
armor = list(melee = 80, bullet = 10, laser = 10, energy = 50, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/gloves/arm_guard/combat
name = "combat arm guards"

View File

@@ -2,6 +2,8 @@
name = "helmet"
desc = "Standard Security gear. Protects the head from impacts."
icon_state = "helmet"
valid_accessory_slots = list(ACCESSORY_SLOT_HELM_C)
restricted_accessory_slots = list(ACCESSORY_SLOT_HELM_C)
flags = THICKMATERIAL
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0)
flags_inv = HIDEEARS|HIDEEYES
@@ -18,6 +20,7 @@
desc = "A helmet painted in Peacekeeper blue. Stands out like a sore thumb."
icon_state = "helmet_sol"
armor = list(melee = 50, bullet = 50, laser = 50,energy = 25, bomb = 30, bio = 0, rad = 0)
valid_accessory_slots = null
/obj/item/clothing/head/helmet/solgov/command
name = "command helmet"
@@ -61,6 +64,7 @@
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEEARS
siemens_coefficient = 0.7
valid_accessory_slots = null
action_button_name = "Toggle Visor"
/obj/item/clothing/head/helmet/riot/attack_self(mob/user as mob)
@@ -80,6 +84,7 @@
armor = list(melee = 10, bullet = 10, laser = 80 ,energy = 50, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEEARS
siemens_coefficient = 0.1
valid_accessory_slots = null
/obj/item/clothing/head/helmet/bulletproof
name = "bullet-resistant helmet"
@@ -89,6 +94,7 @@
armor = list(melee = 10, bullet = 80, laser = 10 ,energy = 10, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEEARS
siemens_coefficient = 0.7
valid_accessory_slots = null
/obj/item/clothing/head/helmet/combat
name = "combat helmet"
@@ -98,6 +104,7 @@
armor = list(melee = 50, bullet = 50, laser = 50 ,energy = 30, bomb = 30, bio = 0, rad = 0)
flags_inv = HIDEEARS
siemens_coefficient = 0.6
valid_accessory_slots = null
/obj/item/clothing/head/helmet/swat
name = "\improper SWAT helmet"
@@ -115,6 +122,7 @@
icon_state = "alienhelmet"
siemens_coefficient = 0.4
armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 0, rad = 40)
valid_accessory_slots = null
/obj/item/clothing/head/helmet/alien/tank
name = "alien warhelm"
@@ -137,6 +145,7 @@
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
siemens_coefficient = 1
valid_accessory_slots = null
/obj/item/clothing/head/helmet/tactical
name = "tactical helmet"
@@ -151,6 +160,7 @@
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
flags_inv = HIDEEARS
siemens_coefficient = 0.7
valid_accessory_slots = null
/obj/item/clothing/head/helmet/augment
name = "Augment Array"
@@ -162,6 +172,7 @@
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.5
valid_accessory_slots = null
//Non-hardsuit ERT helmets.
/obj/item/clothing/head/helmet/ert
@@ -170,6 +181,7 @@
icon_state = "erthelmet_cmd"
item_state_slots = list(slot_r_hand_str = "syndicate-helm-green", slot_l_hand_str = "syndicate-helm-green")
armor = list(melee = 62, bullet = 50, laser = 50,energy = 35, bomb = 10, bio = 2, rad = 0)
valid_accessory_slots = null
//Commander
/obj/item/clothing/head/helmet/ert/command

View File

@@ -103,23 +103,33 @@
icon_state = "beret_corporate_warden"
item_state_slots = list(slot_r_hand_str = "beret_black", slot_l_hand_str = "beret_black")
/obj/item/clothing/head/helmet/warden //should these be helmets?
/obj/item/clothing/head/helmet/warden
name = "warden's helmet"
desc = "Standard Warden gear. Protects the head from impacts."
/obj/item/clothing/head/helmet/warden/hat
name = "warden's hat"
desc = "It's a special helmet issued to the Warden of a securiy force."
desc = "It's a special hat issued to the Warden of a securiy force."
icon_state = "policehelm"
body_parts_covered = 0
valid_accessory_slots = null
/obj/item/clothing/head/helmet/HoS
name = "Head of Security helmet"
desc = "Standard Head of Security gear. Protects the head from impacts."
/obj/item/clothing/head/helmet/HoS/hat
name = "Head of Security Hat"
desc = "The hat of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
body_parts_covered = 0
valid_accessory_slots = null
/obj/item/clothing/head/helmet/HoS/dermal
/obj/item/clothing/head/helmet/dermal
name = "Dermal Armour Patch"
desc = "You're not quite sure how you manage to take it on and off, but it implants nicely in your head."
icon_state = "dermal"
item_state_slots = list(slot_r_hand_str = "", slot_l_hand_str = "")
valid_accessory_slots = null
show_examine = FALSE
/obj/item/clothing/head/det
name = "fedora"
@@ -128,14 +138,14 @@
allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy_corn, /obj/item/weapon/pen)
armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
body_parts_covered = 0
valid_accessory_slots = null
show_examine = FALSE
/obj/item/clothing/head/det/grey
icon_state = "detective2"
item_state_slots = list(slot_r_hand_str = "detective", slot_l_hand_str = "detective")
desc = "A grey fedora - either the cornerstone of a detective's style or a poor attempt at looking cool, depending on the person wearing it."
/obj/item/clothing/head/beret/engineering
name = "engineering beret"
desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety."

View File

@@ -74,7 +74,6 @@
icon_state = "explorer"
item_state_slots = list(slot_r_hand_str = "gas", slot_l_hand_str = "gas")
armor = list(melee = 10, bullet = 5, laser = 5,energy = 5, bomb = 0, bio = 50, rad = 0)
body_parts_covered = HEAD|FACE|EYES
siemens_coefficient = 0.9
/obj/item/clothing/mask/gas/clown_hat

View File

@@ -18,6 +18,7 @@
preserve_item = 1
phoronproof = 1
flash_protection = FLASH_PROTECTION_MAJOR
valid_accessory_slots = null
var/obj/machinery/camera/camera
var/list/camera_networks

View File

@@ -498,28 +498,28 @@
blood_overlay_type = "armor"
/obj/item/clothing/suit/armor/pcarrier/light
starting_accessories = list(/obj/item/clothing/accessory/armorplate)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate)
/obj/item/clothing/suit/armor/pcarrier/light/sol
starting_accessories = list(/obj/item/clothing/accessory/armorplate, /obj/item/clothing/accessory/armor/tag)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate, /obj/item/clothing/accessory/armor/tag)
/obj/item/clothing/suit/armor/pcarrier/light/nt
starting_accessories = list(/obj/item/clothing/accessory/armorplate, /obj/item/clothing/accessory/armor/tag/nt)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate, /obj/item/clothing/accessory/armor/tag/nt)
/obj/item/clothing/suit/armor/pcarrier/medium
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches)
/obj/item/clothing/suit/armor/pcarrier/medium/sol
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag)
/obj/item/clothing/suit/armor/pcarrier/medium/security
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/sec)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/sec)
/obj/item/clothing/suit/armor/pcarrier/medium/command
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/com)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/com)
/obj/item/clothing/suit/armor/pcarrier/medium/nt
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/nt)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches, /obj/item/clothing/accessory/armor/tag/nt)
/obj/item/clothing/suit/armor/pcarrier/blue
name = "blue plate carrier"
@@ -529,7 +529,7 @@
/obj/item/clothing/suit/armor/pcarrier/blue/sol
name = "peacekeeper plate carrier"
desc = "A lightweight plate carrier vest in SCG Peacekeeper colors. It can be equipped with armor plates, but provides no protection of its own."
starting_accessories = list(/obj/item/clothing/accessory/armorplate/medium, /obj/item/clothing/accessory/storage/pouches/blue, /obj/item/clothing/accessory/armguards/blue, /obj/item/clothing/accessory/armor/tag)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/medium, /obj/item/clothing/accessory/storage/pouches/blue, /obj/item/clothing/accessory/armor/armguards/blue, /obj/item/clothing/accessory/armor/tag)
/obj/item/clothing/suit/armor/pcarrier/green
name = "green plate carrier"
@@ -548,8 +548,8 @@
/obj/item/clothing/suit/armor/pcarrier/tan/tactical
name = "tactical plate carrier"
starting_accessories = list(/obj/item/clothing/accessory/armorplate/tactical, /obj/item/clothing/accessory/storage/pouches/large/tan)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/tactical, /obj/item/clothing/accessory/storage/pouches/large/tan)
/obj/item/clothing/suit/armor/pcarrier/merc
starting_accessories = list(/obj/item/clothing/accessory/armorplate/merc, /obj/item/clothing/accessory/armguards/merc, /obj/item/clothing/accessory/legguards/merc, /obj/item/clothing/accessory/storage/pouches/large)
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/merc, /obj/item/clothing/accessory/armor/armguards/merc, /obj/item/clothing/accessory/armor/legguards/merc, /obj/item/clothing/accessory/storage/pouches/large)

View File

@@ -1,11 +1,25 @@
/*
// This file holds all of the accessories used as part of the modular armor system. At some point it might be wise to split this into multiple files.
*/
/obj/item/clothing/accessory/armor
name = "armor accessory"
desc = "You should never see this description. Ahelp this, please."
icon_override = 'icons/mob/modular_armor.dmi'
icon = 'icons/obj/clothing/modular_armor.dmi'
icon_state = "pouches"
w_class = ITEMSIZE_NORMAL
///////////
//Pouches
///////////
/obj/item/clothing/accessory/storage/pouches
name = "storage pouches"
desc = "A collection of black pouches that can be attached to a plate carrier. Carries up to two items."
icon_override = 'icons/mob/modular_armor.dmi'
icon = 'icons/obj/clothing/modular_armor.dmi'
// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
icon_state = "pouches"
w_class = ITEMSIZE_NORMAL
gender = PLURAL
slot = ACCESSORY_SLOT_ARMOR_S
slots = 2
@@ -31,6 +45,7 @@
desc = "A collection of black pouches that can be attached to a plate carrier. Carries up to four items."
icon_state = "lpouches"
slots = 4
slowdown = 0.25
/obj/item/clothing/accessory/storage/pouches/large/blue
desc = "A collection of blue pouches that can be attached to a plate carrier. Carries up to four items."
@@ -48,40 +63,41 @@
desc = "A collection of tan pouches that can be attached to a plate carrier. Carries up to four items."
icon_state = "lpouches_tan"
////////////////
//Armor plates
/obj/item/clothing/accessory/armorplate
////////////////
/obj/item/clothing/accessory/armor/armorplate
name = "light armor plate"
desc = "A basic armor plate made of steel-reinforced synthetic fibers. Attaches to a plate carrier."
icon = 'icons/obj/clothing/modular_armor.dmi'
icon_state = "armor_light"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
armor = list(melee = 30, bullet = 15, laser = 40, energy = 10, bomb = 25, bio = 0, rad = 0)
slot = ACCESSORY_SLOT_ARMOR_C
/obj/item/clothing/accessory/armorplate/medium
/obj/item/clothing/accessory/armor/armorplate/medium
name = "medium armor plate"
desc = "A plasteel-reinforced synthetic armor plate, providing good protection. Attaches to a plate carrier."
icon_state = "armor_medium"
armor = list(melee = 40, bullet = 40, laser = 40, energy = 25, bomb = 30, bio = 0, rad = 0)
/obj/item/clothing/accessory/armorplate/tactical
/obj/item/clothing/accessory/armor/armorplate/tactical
name = "tactical armor plate"
desc = "A medium armor plate with additional ablative coating. Attaches to a plate carrier."
icon_state = "armor_tactical"
armor = list(melee = 40, bullet = 40, laser = 60, energy = 35, bomb = 30, bio = 0, rad = 0)
/obj/item/clothing/accessory/armorplate/merc
/obj/item/clothing/accessory/armor/armorplate/merc
name = "heavy armor plate"
desc = "A ceramics-reinforced synthetic armor plate, providing state of of the art protection. Attaches to a plate carrier."
icon_state = "armor_heavy"
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
//////////////
//Arm guards
/obj/item/clothing/accessory/armguards
//////////////
/obj/item/clothing/accessory/armor/armguards
name = "arm guards"
desc = "A pair of black arm pads reinforced with armor plating. Attaches to a plate carrier."
icon_override = 'icons/mob/modular_armor.dmi'
icon = 'icons/obj/clothing/modular_armor.dmi'
// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
icon_state = "armguards"
gender = PLURAL
@@ -89,34 +105,58 @@
armor = list(melee = 40, bullet = 40, laser = 40, energy = 25, bomb = 30, bio = 0, rad = 0)
slot = ACCESSORY_SLOT_ARMOR_A
/obj/item/clothing/accessory/armguards/blue
/obj/item/clothing/accessory/armor/armguards/blue
desc = "A pair of blue arm pads reinforced with armor plating. Attaches to a plate carrier."
icon_state = "armguards_blue"
/obj/item/clothing/accessory/armguards/navy
/obj/item/clothing/accessory/armor/armguards/navy
desc = "A pair of navy blue arm pads reinforced with armor plating. Attaches to a plate carrier."
icon_state = "armguards_navy"
/obj/item/clothing/accessory/armguards/green
/obj/item/clothing/accessory/armor/armguards/green
desc = "A pair of green arm pads reinforced with armor plating. Attaches to a plate carrier."
icon_state = "armguards_green"
/obj/item/clothing/accessory/armguards/tan
/obj/item/clothing/accessory/armor/armguards/tan
desc = "A pair of tan arm pads reinforced with armor plating. Attaches to a plate carrier."
icon_state = "armguards_tan"
/obj/item/clothing/accessory/armguards/merc
/obj/item/clothing/accessory/armor/armguards/merc
name = "heavy arm guards"
desc = "A pair of red-trimmed black arm pads reinforced with heavy armor plating. Attaches to a plate carrier."
icon_state = "armguards_merc"
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
/obj/item/clothing/accessory/armor/armguards/laserproof
name = "ablative arm guards"
desc = "These arm guards will protect your arms from energy weapons."
icon_state = "armguards_laser"
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
siemens_coefficient = 0.4 //This is worse than the other ablative pieces, to avoid this from becoming the poor warden's insulated gloves.
armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/accessory/armor/armguards/bulletproof
name = "bullet resistant arm guards"
desc = "These arm guards will protect your arms from ballistic weapons."
icon_state = "armguards_bullet"
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
siemens_coefficient = 0.7
armor = list(melee = 10, bullet = 80, laser = 10, energy = 50, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/accessory/armor/armguards/riot
name = "riot arm guards"
desc = "These arm guards will protect your arms from close combat weapons."
icon_state = "armguards_riot"
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
siemens_coefficient = 0.5
armor = list(melee = 80, bullet = 10, laser = 10, energy = 50, bomb = 0, bio = 0, rad = 0)
//////////////
//Leg guards
/obj/item/clothing/accessory/legguards
//////////////
/obj/item/clothing/accessory/armor/legguards
name = "leg guards"
desc = "A pair of armored leg pads in black. Attaches to a plate carrier."
icon_override = 'icons/mob/modular_armor.dmi'
icon = 'icons/obj/clothing/modular_armor.dmi'
// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
icon_state = "legguards"
gender = PLURAL
@@ -124,38 +164,62 @@
armor = list(melee = 40, bullet = 40, laser = 40, energy = 25, bomb = 30, bio = 0, rad = 0)
slot = ACCESSORY_SLOT_ARMOR_L
/obj/item/clothing/accessory/legguards/blue
/obj/item/clothing/accessory/armor/legguards/blue
desc = "A pair of armored leg pads in blue. Attaches to a plate carrier."
icon_state = "legguards_blue"
/obj/item/clothing/accessory/legguards/navy
/obj/item/clothing/accessory/armor/legguards/navy
desc = "A pair of armored leg pads in navy blue. Attaches to a plate carrier."
icon_state = "legguards_navy"
/obj/item/clothing/accessory/legguards/green
/obj/item/clothing/accessory/armor/legguards/green
desc = "A pair of armored leg pads in green. Attaches to a plate carrier."
icon_state = "legguards_green"
/obj/item/clothing/accessory/legguards/tan
/obj/item/clothing/accessory/armor/legguards/tan
desc = "A pair of armored leg pads in tan. Attaches to a plate carrier."
icon_state = "legguards_tan"
/obj/item/clothing/accessory/legguards/merc
/obj/item/clothing/accessory/armor/legguards/merc
name = "heavy leg guards"
desc = "A pair of heavily armored leg pads in red-trimmed black. Attaches to a plate carrier."
icon_state = "legguards_merc"
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
/obj/item/clothing/accessory/armor/legguards/laserproof
name = "ablative leg guards"
desc = "These will protect your legs from energy weapons."
icon_state = "legguards_laser"
item_state_slots = list(slot_r_hand_str = "jackboots", slot_l_hand_str = "jackboots")
siemens_coefficient = 0.1
armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/accessory/armor/legguards/bulletproof
name = "bullet resistant leg guards"
desc = "These will protect your legs from ballistic weapons."
icon_state = "legguards_bullet"
item_state_slots = list(slot_r_hand_str = "jackboots", slot_l_hand_str = "jackboots")
siemens_coefficient = 0.7
armor = list(melee = 10, bullet = 80, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/accessory/armor/legguards/riot
name = "riot leg guards"
desc = "These will protect your legs from close combat weapons."
icon_state = "legguards_riot"
item_state_slots = list(slot_r_hand_str = "jackboots", slot_l_hand_str = "jackboots")
siemens_coefficient = 0.5
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
//////////////////////////
//Decorative attachments
//////////////////////////
/obj/item/clothing/accessory/armor/tag
name = "\improper SCG Flag"
desc = "An emblem depicting the Solar Confederate Government's flag."
icon_override = 'icons/mob/modular_armor.dmi'
icon = 'icons/obj/clothing/modular_armor.dmi'
// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi')
icon_state = "solflag"
slot = ACCESSORY_SLOT_ARMOR_M
w_class = ITEMSIZE_SMALL
/obj/item/clothing/accessory/armor/tag/sifguard
name = "\improper Sif Defense Force crest"
@@ -226,3 +290,50 @@
name = "\improper AB- blood patch"
desc = "An embroidered patch indicating the wearer's blood type as AB NEGATIVE."
icon_state = "abnegtag"
/////////////////
// Helmet Covers
/////////////////
obj/item/clothing/accessory/armor/helmcover
name = "helmet cover"
desc = "A fabric cover for armored helmets."
icon_override = 'icons/mob/ties.dmi'
icon = 'icons/obj/clothing/modular_armor.dmi'
icon_state = "helmcover_blue"
slot = ACCESSORY_SLOT_HELM_C
/obj/item/clothing/accessory/armor/helmcover/blue
name = "blue helmet cover"
desc = "A fabric cover for armored helmets in a bright blue color."
icon_state = "helmcover_blue"
/obj/item/clothing/accessory/armor/helmcover/navy
name = "navy blue helmet cover"
desc = "A fabric cover for armored helmets. This one is colored navy blue."
icon_state = "helmcover_navy"
/obj/item/clothing/accessory/armor/helmcover/green
name = "green helmet cover"
desc = "A fabric cover for armored helmets. This one has a woodland camouflage pattern."
icon_state = "helmcover_green"
/obj/item/clothing/accessory/armor/helmcover/tan
name = "tan helmet cover"
desc = "A fabric cover for armored helmets. This one has a desert camouflage pattern."
icon_state = "helmcover_tan"
/obj/item/clothing/accessory/armor/helmcover/nt
name = "\improper NanoTrasen helmet cover"
desc = "A fabric cover for armored helmets. This one has NanoTrasen's colors."
icon_state = "helmcover_nt"
/obj/item/clothing/accessory/armor/helmcover/pcrc
name = "\improper PCRC helmet cover"
desc = "A fabric cover for armored helmets. This one is colored navy blue and has a tag in the back with the words PROXIMA CENTAURI RISK CONTROL printed in cyan lettering on it."
icon_state = "helmcover_pcrc"
/obj/item/clothing/accessory/armor/helmcover/saare
name = "\improper SAARE helmet cover"
desc = "A fabric cover for armored helmets. This one has SAARE's colors."
icon_state = "helmcover_saare"

View File

@@ -34,6 +34,10 @@
name = "bar shotgun permit"
desc = "A card indicating that the owner is allowed to carry a shotgun in the bar."
/obj/item/clothing/accessory/permit/gun/planetside
name = "planetside gun permit"
desc = "A card indicating that the owner is allowed to carry a firearm while on the surface."
/obj/item/clothing/accessory/permit/drone
name = "drone identification card"
desc = "A card issued by the EIO, indicating that the owner is a Drone Intelligence. Drones are mandated to carry this card within SolGov space, by law."

View File

@@ -182,4 +182,10 @@
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
/material/wood/sif/generate_recipes()
..()
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/sifwood, 1, 4, 20)
recipes -= new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
recipes -= new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)

View File

@@ -488,7 +488,7 @@ var/list/mining_overlay_cache = list()
M.flash_eyes()
if(prob(50))
M.Stun(5)
radiation_repository.flat_radiate(src, 25, 200)
radiation_repository.flat_radiate(src, 25, 100)
if(prob(25))
excavate_find(prob(5), finds[1])
else if(rand(1,500) == 1)

View File

@@ -14,12 +14,15 @@
if (istype(W, /obj/item/weapon/ore))
user.remove_from_mob(W)
src.contents += W
if (istype(W, /obj/item/weapon/storage))
else if (istype(W, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
if(!S.contents.len)
return
S.hide_from(usr)
for(var/obj/item/weapon/ore/O in S.contents)
S.remove_from_storage(O, src) //This will move the item to this item's contents
user << "<font color='blue'>You empty the satchel into the box.</font>"
to_chat(user,"<span class='notice'>You empty the satchel into the box.</span>")
update_ore_count()
@@ -62,13 +65,12 @@
user << "- [stored_ore[ore]] [ore]"
return
/obj/structure/ore_box/verb/empty_box()
set name = "Empty Ore Box"
set category = "Object"
set src in view(1)
if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can empty ore boxes.
if(!istype(usr, /mob/living/carbon/human) && !istype(usr, /mob/living/silicon/robot)) //Only living, intelligent creatures with gripping aparatti can empty ore boxes.
usr << "<font color='red'>You are physically incapable of emptying the ore box.</font>"
return

View File

@@ -39,7 +39,7 @@
var/haste // If set to 1, the mob will be 'hasted', which makes it ignore slowdown and go really fast.
var/evasion // Positive numbers reduce the odds of being hit. Negative numbers increase the odds.
var/bleeding_rate_percent // Adjusts amount of blood lost when bleeding.
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder. Every 15% is equal to one tile easier or harder, just like evasion.
var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder.
var/accuracy_dispersion // Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
var/metabolism_percent // Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
var/icon_scale_percent // Makes the holder's icon get scaled up or down.
@@ -208,13 +208,13 @@
effects += "You move at maximum speed, and cannot be slowed by any means."
if(!isnull(evasion))
effects += "You are [abs(evasion * 15)]% [evasion > 0 ? "harder" : "easier"] to hit with weapons."
effects += "You are [abs(evasion)]% [evasion > 0 ? "harder" : "easier"] to hit with weapons."
if(!isnull(bleeding_rate_percent))
effects += "You bleed [multipler_to_percentage(bleeding_rate_percent, TRUE)] [bleeding_rate_percent > 1.0 ? "faster" : "slower"]."
if(!isnull(accuracy))
effects += "It is [abs(accuracy * 15)]% [accuracy > 0 ? "easier" : "harder"] for you to hit someone with a ranged weapon."
effects += "It is [abs(accuracy)]% [accuracy > 0 ? "easier" : "harder"] for you to hit someone with a ranged weapon."
if(!isnull(accuracy_dispersion))
effects += "Projectiles you fire are [accuracy_dispersion > 0 ? "more" : "less"] likely to stray from your intended target."

View File

@@ -60,9 +60,9 @@ the artifact triggers the rage.
pain_immunity = TRUE // Avoid falling over from shock (at least until it expires).
// The less good stuff.
accuracy = -5 // Aiming requires focus.
accuracy = -75 // Aiming requires focus.
accuracy_dispersion = 3 // Ditto.
evasion = -3 // Too angry to dodge.
evasion = -45 // Too angry to dodge.
var/nutrition_cost = 150
var/exhaustion_duration = 2 MINUTES // How long the exhaustion modifier lasts after it expires. Set to 0 to not apply one.
@@ -157,7 +157,7 @@ the artifact triggers the rage.
attack_speed_percent = 1.5
outgoing_melee_damage_percent = 0.6
disable_duration_percent = 1.5
evasion = -2
evasion = -30
/datum/modifier/berserk_exhaustion/on_applied()
holder.visible_message("<span class='warning'>\The [holder] looks exhausted.</span>")
@@ -177,6 +177,6 @@ the artifact triggers the rage.
stacks = MODIFIER_STACK_EXTEND
// Just being mad isn't gonna overclock your body when you're a beepboop.
accuracy = -5 // Aiming requires focus.
accuracy = -75 // Aiming requires focus.
accuracy_dispersion = 3 // Ditto.
evasion = -3 // Too angry to dodge.
evasion = -45 // Too angry to dodge.

View File

@@ -135,7 +135,7 @@
msg += "<br>"
//uniform
if(w_uniform && !skipjumpsuit)
if(w_uniform && !skipjumpsuit && w_uniform.show_examine)
//Ties
var/tie_msg
if(istype(w_uniform,/obj/item/clothing/under) && !skiptie)
@@ -144,7 +144,7 @@
if(skipholster)
var/list/accessories_visible = new/list() //please let this fix the stupid fucking runtimes
for(var/obj/item/clothing/accessory/A in U.accessories)
if(A.concealed_holster == 0)
if(A.concealed_holster == 0 && A.show_examine)
accessories_visible.Add(A)
if(accessories_visible.len)
tie_msg += ". Attached to it is [lowertext(english_list(accessories_visible))]"
@@ -156,7 +156,7 @@
msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n"
//head
if(head)
if(head && head.show_examine)
if(head.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [head.name] on [T.his] head!</span>\n"
else
@@ -176,35 +176,35 @@
msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit][tie_msg].\n"
//suit/armour storage
if(s_store && !skipsuitstorage)
if(s_store && !skipsuitstorage && s_store.show_examine)
if(s_store.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!</span>\n"
else
msg += "[T.He] [T.is] carrying \icon[s_store] \a [s_store] on [T.his] [wear_suit.name].\n"
//back
if(back)
if(back && back.show_examine)
if(back.blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [back] on [T.his] back.</span>\n"
else
msg += "[T.He] [T.has] \icon[back] \a [back] on [T.his] back.\n"
//left hand
if(l_hand)
if(l_hand && l_hand.show_examine)
if(l_hand.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!</span>\n"
else
msg += "[T.He] [T.is] holding \icon[l_hand] \a [l_hand] in [T.his] left hand.\n"
//right hand
if(r_hand)
if(r_hand && r_hand.show_examine)
if(r_hand.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!</span>\n"
else
msg += "[T.He] [T.is] holding \icon[r_hand] \a [r_hand] in [T.his] right hand.\n"
//gloves
if(gloves && !skipgloves)
if(gloves && !skipgloves && gloves.show_examine)
if(gloves.blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!</span>\n"
else
@@ -213,7 +213,7 @@
msg += "<span class='warning'>[T.He] [T.has] [(hand_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained hands!</span>\n"
//handcuffed?
if(handcuffed)
if(handcuffed && handcuffed.show_examine)
if(istype(handcuffed, /obj/item/weapon/handcuffs/cable))
msg += "<span class='warning'>[T.He] [T.is] \icon[handcuffed] restrained with cable!</span>\n"
else
@@ -224,14 +224,14 @@
msg += "<span class='warning'>[T.He] [T.is] \icon[buckled] buckled to [buckled]!</span>\n"
//belt
if(belt)
if(belt && belt.show_examine)
if(belt.blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!</span>\n"
else
msg += "[T.He] [T.has] \icon[belt] \a [belt] about [T.his] waist.\n"
//shoes
if(shoes && !skipshoes)
if(shoes && !skipshoes && shoes.show_examine)
if(shoes.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!</span>\n"
else
@@ -240,7 +240,7 @@
msg += "<span class='warning'>[T.He] [T.has] [(feet_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained feet!</span>\n"
//mask
if(wear_mask && !skipmask)
if(wear_mask && !skipmask && wear_mask.show_examine)
var/descriptor = "on [T.his] face"
if(istype(wear_mask, /obj/item/weapon/grenade) && check_has_mouth())
descriptor = "in [T.his] mouth"
@@ -251,22 +251,22 @@
msg += "[T.He] [T.has] \icon[wear_mask] \a [wear_mask] [descriptor].\n"
//eyes
if(glasses && !skipeyes)
if(glasses && !skipeyes && glasses.show_examine)
if(glasses.blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!</span>\n"
else
msg += "[T.He] [T.has] \icon[glasses] \a [glasses] covering [T.his] eyes.\n"
//left ear
if(l_ear && !skipears)
if(l_ear && !skipears && l_ear.show_examine)
msg += "[T.He] [T.has] \icon[l_ear] \a [l_ear] on [T.his] left ear.\n"
//right ear
if(r_ear && !skipears)
if(r_ear && !skipears && r_ear.show_examine)
msg += "[T.He] [T.has] \icon[r_ear] \a [r_ear] on [T.his] right ear.\n"
//ID
if(wear_id)
if(wear_id && wear_id.show_examine)
/*var/id
if(istype(wear_id, /obj/item/device/pda))
var/obj/item/device/pda/pda = wear_id

View File

@@ -1042,10 +1042,10 @@
return
return md5(dna.uni_identity)
/mob/living/carbon/human/clean_blood(var/clean_feet)
/mob/living/carbon/human/clean_blood(var/washshoes)
.=..()
gunshot_residue = null
if(clean_feet && !shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len)
if(washshoes && !shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len)
feet_blood_color = null
feet_blood_DNA.Cut()
feet_blood_DNA = null

View File

@@ -261,12 +261,13 @@
var/real_damage = rand_damage
var/hit_dam_type = attack.damage_type
real_damage += attack.get_unarmed_damage(H)
if(H.gloves && istype(H.gloves, /obj/item/clothing/gloves))
var/obj/item/clothing/gloves/G = H.gloves
real_damage += G.punch_force
hit_dam_type = G.punch_damtype
if(H.pulling_punches) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN
hit_dam_type = AGONY
if(H.gloves)
if(istype(H.gloves, /obj/item/clothing/gloves))
var/obj/item/clothing/gloves/G = H.gloves
real_damage += G.punch_force
hit_dam_type = G.punch_damtype
if(H.pulling_punches) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN
hit_dam_type = AGONY
real_damage *= damage_multiplier
rand_damage *= damage_multiplier
if(HULK in H.mutations)
@@ -343,7 +344,7 @@
/mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params)
return
/mob/living/carbon/human/attack_generic(var/mob/user, var/damage, var/attack_message)
/mob/living/carbon/human/attack_generic(var/mob/user, var/damage, var/attack_message, var/armor_type = "melee", var/armor_pen = 0, var/a_sharp = 0, var/a_edge = 0)
if(!damage)
return
@@ -355,9 +356,9 @@
var/dam_zone = pick(organs_by_name)
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
var/armor_block = run_armor_check(affecting, "melee")
var/armor_soak = get_armor_soak(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block, armor_soak)
var/armor_block = run_armor_check(affecting, armor_type, armor_pen)
var/armor_soak = get_armor_soak(affecting, armor_type, armor_pen)
apply_damage(damage, BRUTE, affecting, armor_block, armor_soak, sharp = a_sharp, edge = a_edge)
updatehealth()
return 1

View File

@@ -3,6 +3,9 @@ Add fingerprints to items when we put them in our hands.
This saves us from having to call add_fingerprint() any time something is put in a human's hands programmatically.
*/
/mob/living/carbon/human
var/list/worn_clothing = list() //Contains all CLOTHING items worn
/mob/living/carbon/human/verb/quick_equip()
set name = "quick-equip"
set hidden = 1
@@ -86,6 +89,7 @@ This saves us from having to call add_fingerprint() any time something is put in
if (W == wear_suit)
if(s_store)
drop_from_inventory(s_store)
worn_clothing -= wear_suit
wear_suit = null
update_inv_wear_suit()
else if (W == w_uniform)
@@ -96,16 +100,21 @@ This saves us from having to call add_fingerprint() any time something is put in
if (wear_id)
drop_from_inventory(wear_id)
if (belt)
worn_clothing -= belt
drop_from_inventory(belt)
worn_clothing -= w_uniform
w_uniform = null
update_inv_w_uniform()
else if (W == gloves)
worn_clothing -= gloves
gloves = null
update_inv_gloves()
else if (W == glasses)
worn_clothing -= glasses
glasses = null
update_inv_glasses()
else if (W == head)
worn_clothing -= head
head = null
if(istype(W, /obj/item))
var/obj/item/I = W
@@ -121,12 +130,15 @@ This saves us from having to call add_fingerprint() any time something is put in
r_ear = null
update_inv_ears()
else if (W == shoes)
worn_clothing -= shoes
shoes = null
update_inv_shoes()
else if (W == belt)
worn_clothing -= belt
belt = null
update_inv_belt()
else if (W == wear_mask)
worn_clothing -= wear_mask
wear_mask = null
if(istype(W, /obj/item))
var/obj/item/I = W
@@ -187,15 +199,21 @@ This saves us from having to call add_fingerprint() any time something is put in
//set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc.
/mob/living/carbon/human/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1)
if(!slot) return
if(!istype(W)) return
if(!has_organ_for_slot(slot)) return
if(!species || !species.hud || !(slot in species.hud.equip_slots)) return
if(!slot)
return
if(!istype(W))
return
if(!has_organ_for_slot(slot))
return
if(!species || !species.hud || !(slot in species.hud.equip_slots))
return
W.loc = src
switch(slot)
if(slot_back)
src.back = W
W.equipped(src, slot)
worn_clothing += back
update_inv_back(redraw_mob)
if(slot_wear_mask)
src.wear_mask = W
@@ -203,6 +221,7 @@ This saves us from having to call add_fingerprint() any time something is put in
update_hair(redraw_mob) //rebuild hair
update_inv_ears(0)
W.equipped(src, slot)
worn_clothing += wear_mask
update_inv_wear_mask(redraw_mob)
if(slot_handcuffed)
src.handcuffed = W
@@ -222,6 +241,7 @@ This saves us from having to call add_fingerprint() any time something is put in
if(slot_belt)
src.belt = W
W.equipped(src, slot)
worn_clothing += belt
update_inv_belt(redraw_mob)
if(slot_wear_id)
src.wear_id = W
@@ -252,6 +272,7 @@ This saves us from having to call add_fingerprint() any time something is put in
if(slot_gloves)
src.gloves = W
W.equipped(src, slot)
worn_clothing += glasses
update_inv_gloves(redraw_mob)
if(slot_head)
src.head = W
@@ -262,18 +283,22 @@ This saves us from having to call add_fingerprint() any time something is put in
if(istype(W,/obj/item/clothing/head/kitty))
W.update_icon(src)
W.equipped(src, slot)
worn_clothing += head
update_inv_head(redraw_mob)
if(slot_shoes)
src.shoes = W
W.equipped(src, slot)
worn_clothing += shoes
update_inv_shoes(redraw_mob)
if(slot_wear_suit)
src.wear_suit = W
W.equipped(src, slot)
worn_clothing += wear_suit
update_inv_wear_suit(redraw_mob)
if(slot_w_uniform)
src.w_uniform = W
W.equipped(src, slot)
worn_clothing += w_uniform
update_inv_w_uniform(redraw_mob)
if(slot_l_store)
src.l_store = W
@@ -292,8 +317,8 @@ This saves us from having to call add_fingerprint() any time something is put in
src.remove_from_mob(W)
W.loc = src.back
if(slot_tie)
var/obj/item/clothing/under/uniform = src.w_uniform
uniform.attackby(W,src)
for(var/obj/item/clothing/C in worn_clothing)
C.attackby(W, usr)
else
src << "<font color='red'>You are trying to eqip this item to an unsupported inventory slot. How the heck did you manage that? Stop it...</font>"
return

View File

@@ -150,11 +150,14 @@ var/datum/species/shapeshifter/promethean/prometheans
H.nutrition += rand(15, 45)
VOREStation Removal End */
// Heal remaining damage.
if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss())
H.adjustBruteLoss(-heal_rate)
H.adjustFireLoss(-heal_rate)
H.adjustOxyLoss(-heal_rate)
H.adjustToxLoss(-heal_rate)
if(H.fire_stacks >= 0)
if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss())
H.adjustBruteLoss(-heal_rate)
H.adjustFireLoss(-heal_rate)
H.adjustOxyLoss(-heal_rate)
H.adjustToxLoss(-heal_rate)
else
H.adjustToxLoss(2*heal_rate) // Doubled because 0.5 is miniscule, and fire_stacks are capped in both directions
/datum/species/shapeshifter/promethean/get_blood_colour(var/mob/living/carbon/human/H)
return (H ? rgb(H.r_skin, H.g_skin, H.b_skin) : ..())

View File

@@ -427,20 +427,24 @@ var/global/list/damage_icon_parts = list()
var/icon/temp = part.get_icon(skeleton)
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
if(part.icon_position & (LEFT | RIGHT))
if(part.icon_position == RIGHT)
var/icon/temp2 = new('icons/mob/human.dmi',"blank")
var/icon/temp3 = new('icons/mob/human.dmi',"blank")
temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH)
temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH)
if(!(part.icon_position & LEFT))
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
if(!(part.icon_position & RIGHT))
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
base_icon.Blend(temp2, ICON_OVERLAY)
if(part.icon_position & LEFT)
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
if(part.icon_position & RIGHT)
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
base_icon.Blend(temp2, ICON_UNDERLAY)
temp3.Insert(new/icon(temp,dir=WEST),dir=WEST)
base_icon.Blend(temp3, ICON_UNDERLAY)
else if(part.icon_position == LEFT)
var/icon/temp2 = new('icons/mob/human.dmi',"blank")
var/icon/temp3 = new('icons/mob/human.dmi',"blank")
temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH)
temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH)
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
base_icon.Blend(temp2, ICON_OVERLAY)
temp3.Insert(new/icon(temp,dir=EAST),dir=EAST)
base_icon.Blend(temp3, ICON_UNDERLAY)
else if(part.icon_position & UNDER)
base_icon.Blend(temp, ICON_UNDERLAY)
else
@@ -671,7 +675,7 @@ var/global/list/damage_icon_parts = list()
update_fire(0)
update_water(0)
update_surgery(0)
UpdateDamageIcon()
UpdateDamageIcon(0)
update_icons_layers(0)
update_icons_huds(0)
update_icons()
@@ -1019,6 +1023,13 @@ var/global/list/damage_icon_parts = list()
standing = image(base)
else
standing.color = head.color
// Accessories - copied from uniform, BOILERPLATE because fuck this system.
var/obj/item/clothing/head/hat = head
if(istype(hat) && hat.accessories.len)
for(var/obj/item/clothing/accessory/A in hat.accessories)
standing.overlays |= A.get_mob_overlay()
overlays_standing[HEAD_LAYER] = standing
else

View File

@@ -892,6 +892,18 @@
cleaned_human.update_inv_shoes(0)
cleaned_human.clean_blood(1)
cleaned_human << "<font color='red'>[src] cleans your face!</font>"
if((module_state_1 && istype(module_state_1, /obj/item/weapon/storage/bag/ore)) || (module_state_2 && istype(module_state_2, /obj/item/weapon/storage/bag/ore)) || (module_state_3 && istype(module_state_3, /obj/item/weapon/storage/bag/ore))) //Borgs and drones can use their mining bags ~automagically~ if they're deployed in a slot. Only mining bags, as they're optimized for mass use.
var/obj/item/weapon/storage/bag/ore/B = null
if(istype(module_state_1, /obj/item/weapon/storage/bag/ore)) //First orebag has priority, if they for some reason have multiple.
B = module_state_1
else if(istype(module_state_2, /obj/item/weapon/storage/bag/ore))
B = module_state_2
else if(istype(module_state_3, /obj/item/weapon/storage/bag/ore))
B = module_state_3
var/turf/tile = loc
if(isturf(tile))
B.gather_all(tile, src, 1) //Shhh, unless the bag fills, don't spam the borg's chat with stuff that's going on every time they move!
return
/mob/living/silicon/robot/proc/self_destruct()

View File

@@ -78,6 +78,18 @@ Nurse Family
var/atom/cocoon_target
var/egg_inject_chance = 5
/mob/living/simple_animal/hostile/giant_spider/nurse/medical
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes and a tiny nurse hat."
icon_state = "nursemed"
icon_living = "nursemed"
icon_dead = "nursemed_dead"
melee_damage_lower = 8
melee_damage_upper = 16
poison_type = "tramadol"
poison_chance = 15
/mob/living/simple_animal/hostile/giant_spider/nurse/queen
desc = "Absolutely gigantic, this creature is horror itself."
icon = 'icons/mob/64x64.dmi'

View File

@@ -18,7 +18,7 @@
melee_damage_lower = 1
melee_damage_upper = 8
attacktext = "gouged"
attacktext = list("gouged")
cold_damage_per_tick = 0
speak_chance = 5

View File

@@ -17,7 +17,7 @@
melee_damage_lower = 15
melee_damage_upper = 25
attacktext = "mauled"
attacktext = list("mauled")
cold_damage_per_tick = 0
speak_chance = 5

View File

@@ -17,7 +17,7 @@
melee_damage_lower = 3
melee_damage_upper = 12
attacktext = "gouged"
attacktext = list("gouged")
cold_damage_per_tick = 0
speak_chance = 5

View File

@@ -119,6 +119,10 @@
var/melee_miss_chance = 15 // percent chance to miss a melee attack.
var/melee_attack_minDelay = 5 // How long between attacks at least
var/melee_attack_maxDelay = 10 // How long between attacks at most
var/attack_armor_type = "melee" // What armor does this check?
var/attack_armor_pen = 0 // How much armor pen this attack has.
var/attack_sharp = 0 // Is the attack sharp?
var/attack_edge = 0 // Does the attack have an edge?
//Special attacks
var/spattack_prob = 0 // Chance of the mob doing a special attack (0 for never)
@@ -663,7 +667,6 @@
if(istype(O, /obj/item/weapon/material/knife) || istype(O, /obj/item/weapon/material/knife/butch))
harvest(user)
else
O.attack(src, user, user.zone_sel.selecting)
ai_log("attackby() I was weapon'd by: [user]",2)
if(O.force)
react_to_attack(user)
@@ -1296,7 +1299,7 @@
if(H.check_shields(damage = damage_to_do, damage_source = src, attacker = src, def_zone = null, attack_text = "the attack"))
return FALSE
if(A.attack_generic(src, damage_to_do, pick(attacktext)) && attack_sound)
if(A.attack_generic(src, damage_to_do, pick(attacktext), attack_armor_type, attack_armor_pen, attack_sharp, attack_edge) && attack_sound)
playsound(src, attack_sound, 75, 1)
return TRUE

View File

@@ -74,7 +74,7 @@
ico = new(ui_style, "black")
ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height())
using = new /obj/screen( src )
using = new /obj/screen()
using.name = I_HELP
using.icon = ico
using.screen_loc = ui_acti
@@ -86,7 +86,7 @@
ico = new(ui_style, "black")
ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height())
using = new /obj/screen( src )
using = new /obj/screen()
using.name = I_DISARM
using.icon = ico
using.screen_loc = ui_acti
@@ -98,7 +98,7 @@
ico = new(ui_style, "black")
ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2)
using = new /obj/screen( src )
using = new /obj/screen()
using.name = I_GRAB
using.icon = ico
using.screen_loc = ui_acti
@@ -110,7 +110,7 @@
ico = new(ui_style, "black")
ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1)
ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2)
using = new /obj/screen( src )
using = new /obj/screen()
using.name = I_HURT
using.icon = ico
using.screen_loc = ui_acti

View File

@@ -180,7 +180,7 @@
var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
var/armor_modifier = abs((L.getarmor(null, "bio") / 100) - 1)
L.attack_generic(src, damage_to_do, attacktext)
L.attack_generic(src, damage_to_do, pick(attacktext))
playsound(src, 'sound/weapons/bite.ogg', 75, 1)
// Give the slime some nutrition, if applicable.
@@ -199,7 +199,7 @@
if(istype(L,/obj/mecha))
var/obj/mecha/M = L
M.attack_generic(src, rand(melee_damage_lower, melee_damage_upper), attacktext)
M.attack_generic(src, rand(melee_damage_lower, melee_damage_upper), pick(attacktext))
/mob/living/simple_animal/slime/proc/post_attack(var/mob/living/L, var/intent = I_HURT)
if(intent != I_HELP)

View File

@@ -334,14 +334,24 @@
if(!IsJobAvailable(rank))
src << alert("[rank] is not available. Please try another.")
return 0
if (!attempt_vr(src,"spawn_checks_vr",list())) return 0 // VOREStation Insert
if(!attempt_vr(src,"spawn_checks_vr",list())) return 0 // VOREStation Insert
if(!client)
return 0
//Find our spawning point.
var/list/join_props = job_master.LateSpawn(client, rank)
var/turf/T = join_props["turf"]
var/join_message = join_props["msg"]
if(!T || !join_message)
return 0
spawning = 1
close_spawn_windows()
job_master.AssignRole(src, rank, 1)
var/mob/living/character = create_character() //creates the human and transfers vars and mind
var/mob/living/character = create_character(T) //creates the human and transfers vars and mind
character = job_master.EquipRank(character, rank, 1) //equips the human
UpdateFactionList(character)
@@ -363,14 +373,11 @@
qdel(src)
return
//Find our spawning point.
var/join_message = job_master.LateSpawn(character, rank)
// Equip our custom items only AFTER deploying to spawn points eh?
equip_custom_items(character)
//character.apply_traits() //VOREStation Removal
// character.lastarea = get_area(loc) //create_character() does this
// Moving wheelchair if they have one
if(character.buckled && istype(character.buckled, /obj/structure/bed/chair/wheelchair))
character.buckled.loc = character.loc
@@ -428,7 +435,7 @@
src << browse(dat, "window=latechoices;size=300x640;can_close=1")
/mob/new_player/proc/create_character()
/mob/new_player/proc/create_character(var/turf/T)
if (!attempt_vr(src,"spawn_checks_vr",list())) return 0 // VOREStation Insert
spawning = 1
close_spawn_windows()
@@ -444,12 +451,12 @@
if(chosen_species && use_species_name)
// Have to recheck admin due to no usr at roundstart. Latejoins are fine though.
if(is_alien_whitelisted(chosen_species))
new_character = new(loc, use_species_name)
new_character = new(T, use_species_name)
if(!new_character)
new_character = new(loc)
new_character = new(T)
new_character.lastarea = get_area(loc)
new_character.lastarea = get_area(T)
if(ticker.random_players)
new_character.gender = pick(MALE, FEMALE)

View File

@@ -17,7 +17,7 @@
return STATUS_UPDATE // Ghosts can view updates
/mob/living/silicon/pai/default_can_use_topic(var/src_object)
if((src_object == src || src_object == radio) && !stat)
if((src_object == src || src_object == radio || src_object == communicator) && !stat)
return STATUS_INTERACTIVE
else
return ..()

View File

@@ -96,6 +96,6 @@
/obj/item/organ/internal/eyes/emp_act(severity)
// ..() //Returns if the organ isn't robotic // VOREStation Edit - Don't take damage
if(!(robotic >= ORGAN_ASSISTED))
if(robotic >= ORGAN_ASSISTED)
return
owner.eye_blurry += (4/severity)

View File

@@ -83,13 +83,13 @@ var/list/organ_cache = list()
blood_DNA[dna.unique_enzymes] = dna.b_type
/obj/item/organ/proc/die()
if(robotic >= ORGAN_ROBOT)
return
if(robotic < ORGAN_ROBOT)
status |= ORGAN_DEAD
damage = max_damage
status |= ORGAN_DEAD
processing_objects -= src
if(owner && vital)
owner.death()
owner.can_defib = 0
/obj/item/organ/proc/adjust_germ_level(var/amount) // Unless you're setting germ level directly to 0, use this proc instead
germ_level = Clamp(germ_level + amount, 0, INFECTION_LEVEL_MAX)
@@ -107,6 +107,11 @@ var/list/organ_cache = list()
return
if(preserved)
return
//check if we've hit max_damage
if(damage >= max_damage)
die()
//Process infections
if(robotic >= ORGAN_ROBOT || (owner && owner.species && (owner.species.flags & IS_PLANT || (owner.species.flags & NO_INFECT))))
germ_level = 0
@@ -132,10 +137,6 @@ var/list/organ_cache = list()
handle_rejection()
handle_germ_effects()
//check if we've hit max_damage
if(damage >= max_damage)
die()
/obj/item/organ/examine(mob/user)
..(user)
if(status & ORGAN_DEAD)
@@ -329,6 +330,7 @@ var/list/organ_cache = list()
owner.attack_log += "\[[time_stamp()]\]<font color='orange'> had a vital organ ([src]) removed by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])</font>"
msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
owner.death()
owner.can_defib = 0
owner = null

View File

@@ -18,7 +18,7 @@ var/global/list/limb_icon_cache = list()
h_col = null
if(robotic >= ORGAN_ROBOT)
var/datum/robolimb/franchise = all_robolimbs[model]
if(!(franchise && franchise.lifelike))
if(!(franchise && franchise.skin_tone))
if(human.synth_color)
s_col = list(human.r_synth, human.g_synth, human.b_synth)
return
@@ -36,7 +36,7 @@ var/global/list/limb_icon_cache = list()
h_col = null
if(robotic >= ORGAN_ROBOT)
var/datum/robolimb/franchise = all_robolimbs[model]
if(!(franchise && franchise.lifelike))
if(!(franchise && franchise.skin_tone))
return
if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.appearance_flags & HAS_SKIN_TONE))
s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE)

View File

@@ -21,7 +21,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
scroll=ipc_scroll;\
console=ipc_console;\
glider=ipc_gol_glider;\
rainnbow=ipc_rainbow;\
rainbow=ipc_rainbow;\
smiley=ipc_smiley;\
database=ipc_database"
@@ -40,6 +40,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
var/unavailable_at_chargen // If set, not available at chargen.
var/unavailable_to_build // If set, can't be constructed.
var/lifelike // If set, appears organic.
var/skin_tone // If set, applies skin tone rather than part color
var/blood_color = "#030303"
var/list/species_cannot_use = list("Teshari")
var/list/monitor_styles //If empty, the model of limbs offers a head compatible with monitors.
@@ -100,7 +101,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_alt2.dmi'
unavailable_to_build = 1
parts = list(BP_HEAD)
/datum/robolimb/cybersolutions_alt1
company = "Cyber Solutions - Wight"
desc = "This limb has cheap plastic panels mounted on grey metal."
@@ -198,6 +199,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
icon = 'icons/mob/human_races/cyberlimbs/veymed/veymed_main_vr.dmi' //Vorestation edit, fixing the color application
unavailable_to_build = 1
lifelike = 1
skin_tone = 1
blood_color = "#CCCCCC"
speech_bubble_appearance = "normal"
@@ -220,7 +222,6 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt2.dmi'
unavailable_to_build = 1
/datum/robolimb/wardtakahashi_monitor
company = "Ward-Takahashi Monitor"
desc = "Ward-Takahashi's unique spin on a popular prosthetic head model. It looks sleek and modern."
@@ -278,6 +279,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
desc = "This limb has a rubbery fleshtone covering with visible seams."
icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi'
unavailable_to_build = 1
skin_tone = 1
/obj/item/weapon/disk/limb
name = "Limb Blueprints"

View File

@@ -281,8 +281,6 @@
spawn(1)
owner.update_hair()
get_icon()
if(vital) //This is just in case we ever add something that both a) Doesn't need a head to live, and b) Can be defibbed
owner.can_defib = 0
..()
/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())

View File

@@ -622,3 +622,7 @@
/obj/item/weapon/paper/crumpled/bloody
icon_state = "scrap_bloodied"
/obj/item/weapon/paper/crumpled/bloody/CrashedMedShuttle
name = "Blackbox Transcript - VMV Aurora's Light"
info = "<I>\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.]</I><BR> <B>mmons 19:52:01:</B> Come on... it's right there in the distance, we're almost there!<BR> <B>Doctor Nazarril 19:52:26:</B> Odysseus online. Orrderrs, sirr?<BR> <B>Captain Simmons 19:52:29:</B> Brace for impact. We're going in full-speed.<BR> <B>Technician Dynasty 19:52:44:</B> Chief, fire's spread to the secondary propulsion systems.<BR> <B>Captain Simmons 19:52:51:</B> Copy. Any word from TraCon? Transponder's down still?<BR> <B>Technician Dynasty 19:53:02:</B> Can't get in touch, sir. Emergency beacon's active, but we're not going t-<BR> <B>Doctor Nazarril 19:53:08:</B> Don't say it. As long as we believe, we'll get through this.<BR> <B>Captain Simmons 19:53:11:</B> Damn right. We're a few klicks out from the port. Rough landing, but we can do it.<BR> <B>V.I.T.A 19:53:26:</B> Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.<BR> <B>A loud explosion is heard.</B><BR> <B>V.I.T.A 19:53:29:</B> Alert: fuel intake valve open.<BR> <B>Technician Dynasty 19:53:31:</B> ... ah.<BR> <B>Doctor Nazarril 19:53:34:</B> Trrranslate?<BR> <B>V.I.T.A 19:53:37:</B> There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.<BR> <B>Technician Dynasty 19:53:48:</B> We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.<BR> <B>V.I.T.A 19:53:53:</B> The Technician is correct.<BR> <B>Doctor Nazarril 19:54:02:</B> Then... we can't land therrre.<BR> <B>V.I.T.A 19:54:11:</B> Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible. <BR> <B>Captain Simmons 19:54:27:</B> I- alright. I'm bringing us down. You all know what this means.<BR> <B>Doctor Nazarril 19:54:33:</B> Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.<BR> <B>Technician Dynasty 19:54:39:</B> We had a good run. I'm going to miss this.<BR> <B>Captain Simmons 19:54:47:</B> VITA. Tell them we died heroes. Tell them... we did all we could.<BR> <B>V.I.T.A 19:54:48:</B> I will. Impact in five. Four. Three.<BR> <B>Doctor Nazarril 19:54:49:</B> Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.<BR> <B>Technician Dynasty 19:54:50:</B> Any time, kid. Any time.<BR> <B>V.I.T.A 19:54:41:</B> Two.<BR><B>V.I.T.A 19:54:42:</B> One.<BR> **8/DEC/2561**<BR> <B>V.I.T.A 06:22:16:</B> Backup power restored. Attempting to establish connection with emergency rescue personnel.<BR> <B>V.I.T.A 06:22:17:</B> Unable to establish connection. Transponder destroyed on impact.<BR> <B>V.I.T.A 06:22:18:</B> No lifesigns detected on board.<BR> **1/JAN/2562**<BR> <B>V.I.T.A 00:00:00:</B> Happy New Year, crew.<BR> <B>V.I.T.A 00:00:01:</B> Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.<BR> <B>V.I.T.A 00:00:02:</B> Nobody's coming.<BR> **14/FEB/2562**<BR> <B>V.I.T.A 00:00:00:</B> Roses are red.<BR> <B>V.I.T.A 00:00:01:</B> Violets are blue.<BR> <B>V.I.T.A 00:00:02:</B> Won't you come back?<BR> <B>V.I.T.A 00:00:03:</B> I miss you.<BR> **15/FEB/2562**<BR><B>V.I.T.A 22:19:06:</B> Power reserves critical. Transferring remaining power to emergency broadcasting beacon.<BR> <B>V.I.T.A 22:19:07:</B> Should anyone find this, lay them to rest. They deserve a proper burial.<BR> <B>V.I.T.A 22:19:08:</B> Erasing files... shutting down.<BR> <B>A low, monotone beep.</B><BR> **16/FEB/2562**<BR> <B>Something chitters.</B><BR> <B>End of transcript.</B>"

View File

@@ -234,6 +234,18 @@ datum/weather/sif
if(!T.outdoors)
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella</span>")
continue
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella</span>")
continue
L.water_act(1)
to_chat(L, "<span class='warning'>Rain falls on you.</span>")
@@ -258,6 +270,20 @@ datum/weather/sif
if(!T.outdoors)
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll get stolen by the wind
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
to_chat(L, "<span class='warning'>A gust of wind yanks the umbrella from your hand!</span>")
L.drop_from_inventory(U)
U.throw_at(get_edge_target_turf(U, pick(alldirs)), 8, 1, L)
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
to_chat(L, "<span class='warning'>A gust of wind yanks the umbrella from your hand!</span>")
L.drop_from_inventory(U)
U.throw_at(get_edge_target_turf(U, pick(alldirs)), 8, 1, L)
L.water_act(2)
to_chat(L, "<span class='warning'>Rain falls on you, drenching you in water.</span>")
@@ -282,6 +308,18 @@ datum/weather/sif
if(!T.outdoors)
continue // They're indoors, so no need to pelt them with ice.
// If they have an open umbrella, it'll guard from rain
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(U.open)
to_chat(L, "<span class='notice'>Hail patters gently onto your umbrella.</span>")
continue
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
if(U.open)
to_chat(L, "<span class='notice'>Hail patters gently onto your umbrella.</span>")
continue
var/target_zone = pick(BP_ALL)
var/amount_blocked = L.run_armor_check(target_zone, "melee")
var/amount_soaked = L.get_armor_soak(target_zone, "melee")

View File

@@ -99,7 +99,7 @@
fire_delay = 20
w_class = ITEMSIZE_LARGE
// one_handed_penalty = 90 // The thing's heavy and huge.
accuracy = 3
accuracy = 45
charge_cost = 600
/obj/item/weapon/gun/energy/lasercannon/mounted

View File

@@ -3,6 +3,7 @@
desc = "The NT Mk60 EW Halicon is a man portable anti-armor weapon designed to disable mechanical threats, produced by NT. Not the best of its type."
icon_state = "ionrifle"
item_state = "ionrifle"
wielded_item_state = "ionrifle-wielded"
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 4)
w_class = ITEMSIZE_LARGE
force = 10
@@ -33,7 +34,6 @@
charge_cost = 300
projectile_type = /obj/item/projectile/energy/phase
/obj/item/weapon/gun/energy/decloner
name = "biological demolecularisor"
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."

View File

@@ -53,6 +53,8 @@
name = "assault rifle"
desc = "The rugged STS-35 is a durable automatic weapon of a make popular on the frontier worlds. Uses 5.45mm rounds."
icon_state = "arifle"
item_state = "arifle"
wielded_item_state = "arifle-wielded"
item_state = null
w_class = ITEMSIZE_LARGE
force = 10
@@ -109,6 +111,7 @@
desc = "The Z8 Bulldog is an older model designated marksman rifle, made by the now defunct Zendai Foundries. Makes you feel like a space marine when you hold it, even though it can only hold 10 round magazines. Uses 7.62mm rounds and has an under barrel grenade launcher."
icon_state = "carbine" // This isn't a carbine. :T
item_state = "z8carbine"
wielded_item_state = "z8carbine-wielded"
w_class = ITEMSIZE_LARGE
force = 10
caliber = "7.62mm"

View File

@@ -169,6 +169,18 @@
L.adjust_fire_stacks(-(amount / 5))
remove_self(needed)
/datum/reagent/water/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_SLIME)
M.adjustToxLoss(6 * removed)
else
..()
/datum/reagent/fuel/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_SLIME)
M.adjustToxLoss(6 * removed)
else
..()
/datum/reagent/fuel
name = "Welding fuel"
id = "fuel"

View File

@@ -93,7 +93,7 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
if(materials[f] >= SHEET_MATERIAL_AMOUNT)
var/path = getMaterialType(f)
if(path)
var/obj/item/stack/S = new f(loc)
var/obj/item/stack/S = new path(loc)
S.amount = round(materials[f] / SHEET_MATERIAL_AMOUNT)
..()

View File

@@ -491,13 +491,13 @@ other types of metals and chemistry for reagents).
build_path = /obj/item/roller/adv
sort_string = "MBBAF"
/datum/design/item/medical/enhanced_analyzer
name = "enhanced health analyzer"
/datum/design/item/medical/improved_analyzer
name = "improved health analyzer"
desc = "A prototype version of the regular health analyzer, able to distinguish the location of more serious injuries as well as accurately determine radiation levels."
id = "advanced_analyzer"
id = "improved_analyzer"
req_tech = list(TECH_MAGNET = 5, TECH_BIO = 6)
materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 1500)
build_path = /obj/item/device/healthanalyzer/advanced
build_path = /obj/item/device/healthanalyzer/improved
sort_string = "MBBAG"
/datum/design/item/implant

View File

@@ -258,7 +258,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
qdel(S)
linked_destroy.icon_state = "d_analyzer"
else
if(!(I in linked_destroy.component_parts))
if(I != linked_destroy.circuit && !(I in linked_destroy.component_parts))
qdel(I)
linked_destroy.icon_state = "d_analyzer"

View File

@@ -104,7 +104,7 @@
//see if we can connect to a power net.
var/datum/powernet/PN
var/turf/T = src.loc
var/turf/T = get_turf(src)
var/obj/structure/cable/C = T.get_cable_node()
if (C)
PN = C.powernet

View File

@@ -73,7 +73,7 @@
return
var/is_organ_damaged = 0
for(var/obj/item/organ/I in affected.internal_organs)
if(I.damage > 0)
if(I && (I.damage > 0 || I.status == ORGAN_DEAD))
is_organ_damaged = 1
break
return ..() && is_organ_damaged
@@ -91,7 +91,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
for(var/obj/item/organ/I in affected.internal_organs)
if(I && I.damage > 0)
if(I && (I.damage > 0 || I.status == ORGAN_DEAD))
if(!(I.robotic >= ORGAN_ROBOT))
user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \
"You start treating damage to [target]'s [I.name] with [tool_name]." )
@@ -111,11 +111,12 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I && I.damage > 0)
if(I && (I.damage > 0 || I.status == ORGAN_DEAD))
if(!(I.robotic >= ORGAN_ROBOT))
user.visible_message("<span class='notice'>[user] treats damage to [target]'s [I.name] with [tool_name].</span>", \
"<span class='notice'>You treat damage to [target]'s [I.name] with [tool_name].</span>" )
I.damage = 0
I.status = 0
if(I.organ_tag == O_EYES)
target.sdisabilities &= ~BLIND
if(I.organ_tag == O_LUNGS)

View File

@@ -10,6 +10,7 @@ var/list/ventcrawl_machinery = list(
/obj/item/weapon/holder,
/obj/machinery/camera,
/mob/living/simple_animal/borer,
/obj/screen
)
/mob/living/var/list/icon/pipes_shown = list()
@@ -41,18 +42,21 @@ var/list/ventcrawl_machinery = list(
return FALSE
. = ..()
/mob/living/proc/is_allowed_vent_crawl_item(var/obj/item/carried_item)
/mob/living/proc/is_allowed_vent_crawl_item(var/obj/carried_item)
//Ability master easy test for allowed (cheaper than istype)
if(carried_item == ability_master)
return 1
var/list/allowed = list()
for(var/type in can_enter_vent_with)
var/list/types = typesof(type)
allowed += types
//Try to find it in our allowed list (istype includes subtypes)
var/listed = FALSE
for(var/test_type in can_enter_vent_with)
if(istype(carried_item,test_type))
listed = TRUE
break
if(carried_item.type in allowed)
if(get_inventory_slot(carried_item) == 0)
return 1
//Only allow it if it's "IN" the mob, not equipped on/being held
if(listed && !get_inventory_slot(carried_item))
return 1
/mob/living/carbon/is_allowed_vent_crawl_item(var/obj/item/carried_item)
if(carried_item in internal_organs)

View File

@@ -22,7 +22,7 @@ Slime definitions, Life and New live here.
var/shiny = 0
move_to_delay = 17 //Slimes shouldn't be able to go faster than humans.
default_chems = list("slimejelly" = 5)
attacktext = "absorbed some of"
attacktext = list("absorbed some of")
response_help = "pats"
response_disarm = "tries to stop"
response_harm = "hits"

View File

@@ -12,7 +12,7 @@ Also includes Life and New
desc = "Something's broken, yell at someone."
melee_damage_lower = 0
melee_damage_upper = 0
attacktext = "hit"
attacktext = list("hit")
attack_sound = null
friendly = "touches"
environment_smash = 0