Merge remote-tracking branch 'origin/master' into perlin-genny

This commit is contained in:
LetterN
2021-03-31 08:19:31 +08:00
91 changed files with 1114 additions and 1071 deletions
@@ -8,7 +8,7 @@
desc = "A resilient shield made out of brass.. It feels warm to the touch."
var/clockwork_desc = "A powerful shield of ratvarian making. It absorbs blocked attacks to charge devastating bashes."
armor = list("melee" = 80, "bullet" = 70, "laser" = -10, "energy" = -20, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
shield_flags = SHIELD_FLAGS_DEFAULT
shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_KINETIC_STRONG | SHIELD_ENERGY_WEAK
max_integrity = 300 //High integrity, extremely strong against melee / bullets, but still quite easy to destroy with lasers and energy
repair_material = /obj/item/stack/tile/brass
var/dam_absorbed = 0
@@ -69,7 +69,7 @@
/datum/action/innate/heretic_shatter/Activate()
if(do_after(holder,10, target = holder))
var/turf/safe_turf = find_safe_turf(zlevels = sword.z, extended_safety_checks = TRUE)
do_teleport(holder,safe_turf,forceMove = TRUE)
do_teleport(holder,safe_turf,forceMove = TRUE,channel=TELEPORT_CHANNEL_MAGIC)
to_chat(holder,"<span class='warning'>You feel a gust of energy flow through your body... the Rusted Hills heard your call...</span>")
qdel(sword)
@@ -178,7 +178,7 @@
/datum/eldritch_knowledge/summon/stalker
name = "Lonely Ritual"
gain_text = "I was able to combine my greed and desires to summon an eldritch beast I had never seen before. An ever shapeshifting mass of flesh, it knew well my goals."
desc = "You can now summon a Stalker by transmutating a pair of eyes, a candle, a pen and a piece of paper. Stalkers can shapeshift into harmless animals to get close to the victim."
desc = "You can now summon a Stalker by transmutating a kitchen knife, a candle, a pen and a piece of paper. Stalkers can shapeshift into harmless animals to get close to the victim."
cost = 1
required_atoms = list(/obj/item/kitchen/knife,/obj/item/candle,/obj/item/pen,/obj/item/paper)
mob_to_summon = /mob/living/simple_animal/hostile/eldritch/stalker
@@ -7,7 +7,21 @@
earliest_start = 1 HOURS
min_players = 20
/datum/round_event_control/slaughter/canSpawnEvent()
weight = initial(src.weight)
var/list/allowed_turf_typecache = typecacheof(/turf/open) - typecacheof(/turf/open/space)
var/list/allowed_z_cache = list()
for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION))
allowed_z_cache[num2text(z)] = TRUE
for(var/obj/effect/decal/cleanable/C in world)
if(!C.loc || QDELETED(C))
continue
if(!C.can_bloodcrawl_in())
continue
if(!SSpersistence.IsValidDebrisLocation(C.loc, allowed_turf_typecache, allowed_z_cache, C.type, FALSE))
continue
weight += 0.05
return ..()
/datum/round_event/ghost_role/slaughter
minimum_required = 1
-64
View File
@@ -262,70 +262,6 @@
/obj/item/assembly/flash/armimplant/proc/cooldown()
overheat = FALSE
/obj/item/assembly/flash/shield
name = "strobe shield"
desc = "A shield with a built in, high intensity light capable of blinding and disorienting suspects. Takes regular handheld flashes as bulbs."
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "flashshield"
item_state = "flashshield"
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
slot_flags = ITEM_SLOT_BACK
force = 10
throwforce = 5
throw_speed = 2
throw_range = 3
w_class = WEIGHT_CLASS_BULKY
custom_materials = list(/datum/material/glass=7500, /datum/material/iron=1000)
attack_verb = list("shoved", "bashed")
block_chance = 50
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
/obj/item/assembly/flash/shield/flash_recharge(interval=10)
if(times_used >= 4)
burn_out()
return FALSE
return TRUE
/obj/item/assembly/flash/shield/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/assembly/flash/handheld))
var/obj/item/assembly/flash/handheld/flash = W
if(flash.crit_fail)
to_chat(user, "No sense replacing it with a broken bulb.")
return
else
to_chat(user, "You begin to replace the bulb.")
if(do_after(user, 20, target = src))
if(flash.crit_fail || !flash || QDELETED(flash))
return
crit_fail = FALSE
times_used = 0
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
update_icon()
flash.crit_fail = TRUE
flash.update_icon()
return
..()
/obj/item/assembly/flash/shield/update_icon(flash = FALSE)
icon_state = "flashshield"
item_state = "flashshield"
if(crit_fail)
icon_state = "riot"
item_state = "riot"
else if(flash)
icon_state = "flashshield_flash"
item_state = "flashshield_flash"
addtimer(CALLBACK(src, /atom/.proc/update_icon), 5)
if(holder)
holder.update_icon()
/obj/item/assembly/flash/shield/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
activate()
return ..()
//ported from tg - check to make sure it can't appear where it's not supposed to.
/obj/item/assembly/flash/hypnotic
desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance."
@@ -17,7 +17,7 @@
/datum/blackmarket_item/New()
if(isnull(price))
price = rand(price_min, price_max)
price = round(rand(price_min, price_max), 5)
if(isnull(stock))
stock = rand(stock_min, stock_max)
@@ -51,5 +51,30 @@
item = /obj/item/clothing/head/chameleon/broken
price_min = 100
price_max = 200
stock_max = 2
availability_prob = 70
stock_min = 3
stock_max = 7
availability_prob = 100
/datum/blackmarket_item/clothing/earmuffs
name = "Earmuffs"
desc = "Protect your precious ears from security's flashbangs with this handy device."
item = /obj/item/clothing/ears/earmuffs
price_min = 100
price_max = 200
stock_min = 3
stock_max = 7
availability_prob = 100
/* commented out until someone wants to port the actual boots
* i am unsure they are in accordance with server design ideals
/datum/blackmarket_item/clothing/rocket_boots
name = "Rocket Boots"
desc = "We found a pair of jump boots and overclocked the hell out of them. No liability for grevious harm to or with a body."
item = /obj/item/clothing/shoes/bhop/rocket
price_min = 1500
price_max = 3000
stock_max = 1
availability_prob = 30
*/
@@ -14,11 +14,11 @@
name = "Box of Donk Pockets"
desc = "A well packaged box containing the favourite snack of every spacefarer."
item = /obj/item/storage/box/donkpockets
stock_min = 2
stock_max = 5
price_min = 325
price_max = 400
availability_prob = 80
stock_min = 5
stock_max = 10
price_min = 250
price_max = 350
availability_prob = 100
/datum/blackmarket_item/consumable/suspicious_pills
name = "Bottle of Suspicious Pills"
@@ -46,13 +46,43 @@
stock_max = 35
price_min = 10
price_max = 60
availability_prob = 50
availability_prob = 70
/datum/blackmarket_item/consumable/pumpup
name = "Shoddy Stimulants"
desc = "Feel the energy inside each needle!"
item = /obj/item/reagent_containers/hypospray/medipen/stimpack
stock_max = 5
price_min = 50
price_max = 150
availability_prob = 90
price_min = 80
price_max = 170
availability_prob = 70
/datum/blackmarket_item/consumable/stray_drink
name = "A random drink"
desc = "A surprise drink direcly from the counter. No refunds if the glass breaks." // it will always break if it's launched at the station
item = /obj/item/reagent_containers/food/drinks/drinkingglass
stock_min = 10
stock_max = 15
price_min = 100
price_max = 200
availability_prob = 100
// add new drinks here
var/list/counter = list(
/datum/reagent/consumable/ethanol/gintonic,
/datum/reagent/consumable/ethanol/cuba_libre,
/datum/reagent/consumable/ethanol/martini,
/datum/reagent/consumable/ethanol/b52,
/datum/reagent/consumable/ethanol/manhattan,
/datum/reagent/consumable/ethanol/bahama_mama,
/datum/reagent/consumable/ethanol/syndicatebomb,
/datum/reagent/consumable/ethanol/quadruple_sec
)
// i found no other way to fill a glass with a random reagent at runtime. and i definitely was not going to do the same done in bottle.dm
/datum/blackmarket_item/consumable/stray_drink/spawn_item(loc)
var/obj/item/reagent_containers/food/drinks/drinkingglass/drink = new item(loc)
var/picked = pick(counter)
drink.list_reagents = list()
drink.list_reagents[picked] = 50
drink.add_initial_reagents()
return drink
@@ -10,6 +10,15 @@
stock_max = 6
availability_prob = 80
/datum/blackmarket_item/misc/clear_pda
name = "Clear PDA"
desc = "Show off your style with this limited edition clear PDA!."
item = /obj/item/pda/clear
price_min = 250
price_max = 600
stock_max = 4
availability_prob = 50
/datum/blackmarket_item/misc/shoulder_holster
name = "Shoulder holster"
desc = "Yeehaw, hardboiled friends! This holster is the first step in your dream of becoming a detective and being allowed to shoot real guns!"
@@ -37,11 +46,11 @@
name = "Strange Seeds"
desc = "An Exotic Variety of seed that can contain anything from glow to acid."
item = /obj/item/seeds/random
price_min = 320
price_max = 360
price_min = 450
price_max = 650
stock_min = 2
stock_max = 5
availability_prob = 50
availability_prob = 100
/datum/blackmarket_item/misc/smugglers_satchel
name = "Smuggler's Satchel"
@@ -51,3 +60,14 @@
price_max = 1000
stock_max = 2
availability_prob = 30
/datum/blackmarket_item/misc/internals_box
name = "Internals Box"
desc = "The same one Nanotrasen gives you before starting the shift. Totally not stolen from a dead space-man floating in space."
item = /obj/item/storage/box/survival
price_min = 250
price_max = 350
stock_min = 3
stock_max = 6
availability_prob = 100
@@ -59,7 +59,7 @@
name = "Thermite Bottle"
desc = "30 units of Thermite to assist in creating a quick access point or get away!"
item = /obj/item/reagent_containers/glass/bottle/thermite
price_min = 500
price_min = 750
price_max = 1500
stock_max = 3
availability_prob = 30
@@ -68,7 +68,18 @@
name = "Science Goggles"
desc = "These glasses scan the contents of containers and projects their contents to the user in an easy-to-read format."
item = /obj/item/clothing/glasses/science
price_min = 150
price_max = 200
stock_max = 3
availability_prob = 50
price_min = 200
price_max = 300
stock_min = 3
stock_max = 7
availability_prob = 100
/datum/blackmarket_item/tool/meson_goggles
name = "Meson Goggles"
desc = "These let you see through walls and inspect other structures."
item = /obj/item/clothing/glasses/meson
price_min = 200
price_max = 300
stock_min = 3
stock_max = 7
availability_prob = 100
@@ -28,14 +28,23 @@
item = /obj/item/spear/bonespear
price_min = 200
price_max = 300
stock_max = 3
availability_prob = 60
stock_max = 0
availability_prob = 0
/datum/blackmarket_item/weapon/emp_grenade
name = "EMP Grenade"
desc = "Use this grenade for SHOCKING results!"
item = /obj/item/grenade/empgrenade
price_min = 100
price_max = 400
price_min = 300
price_max = 600
stock_max = 2
availability_prob = 50
availability_prob = 20
/datum/blackmarket_item/weapon/smoke_grenade
name = "Smoke Grenade"
desc = "Used for obcuring a large area with thick smoke."
item = /obj/item/grenade/smokebomb
price_min = 100
price_max = 300
stock_max = 3
availability_prob = 40
@@ -1,5 +1,6 @@
/obj/item/blackmarket_uplink
name = "Black Market Uplink"
desc = "A mishmash of a subspace amplifier, a radio, and an analyzer. Somehow able to access the black market, with a variable inventory in limited stock at inflated prices. No refunds, customer responsible for pick-ups."
icon = 'icons/obj/blackmarket.dmi'
icon_state = "uplink"
// UI variables.
+1 -1
View File
@@ -23,7 +23,7 @@
name = "Strobe Shield"
description = "One of our Emergency Response Agents thinks there's vampires in a local station. Send him something to help with his fear of the dark and protect him, too."
reward = 3000
wanted_types = list(/obj/item/assembly/flash/shield)
wanted_types = list(/obj/item/shield/riot/flash)
/datum/bounty/item/security/sechuds
name = "Sec HUDs"
+2 -2
View File
@@ -16,7 +16,7 @@
/datum/export/weapon/riot_shield
cost = 70
unit_name = "flash shield"
export_types = list(/obj/item/assembly/flash/shield)
export_types = list(/obj/item/shield/riot/flash)
/datum/export/weapon/tele_shield
cost = 100
@@ -138,7 +138,7 @@
export_types = list(/obj/item/gun/energy/xray)
/datum/export/weapon/ioncarbine
cost = 200
cost = 200
unit_name = "ion carbine"
export_types = list(/obj/item/gun/energy/ionrifle/carbine)
+1 -1
View File
@@ -171,7 +171,7 @@
/datum/supply_pack/service/replacementdb
name = "Replacement Defensive Bar Shotgun"
desc = "Someone stole the Bartender's twin-barreled possession? Give them another one at a significant markup. Comes with one unused double-barrel shotgun, shells not included. Requires bartender access to open."
desc = "Someone stole the Bartender's twin-barreled possession? Give them another one at a significant markup. Comes with one unused double-barrel shotgun, additional shells not included. Requires bartender access to open."
cost = 2200
access = ACCESS_BAR
contraband = TRUE
+17 -17
View File
@@ -148,11 +148,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//Job preferences 2.0 - indexed by job title , no key or value implies never
var/list/job_preferences = list()
// Want randomjob if preferences already filled - Donkie
// Want randomjob if preferences already filled - Donkie
var/joblessrole = BERANDOMJOB //defaults to 1 for fewer assistants
// 0 = character settings, 1 = game preferences
var/current_tab = 0
var/current_tab = SETTINGS_TAB
var/unlock_content = 0
@@ -274,13 +274,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
update_preview_icon(current_tab)
var/list/dat = list("<center>")
dat += "<a href='?_src_=prefs;preference=tab;tab=0' [current_tab == 0 ? "class='linkOn'" : ""]>Character Settings</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=2' [current_tab == 2 ? "class='linkOn'" : ""]>Character Appearance</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=3' [current_tab == 3 ? "class='linkOn'" : ""]>Character Speech</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=4' [current_tab == 4 ? "class='linkOn'" : ""]>Loadout</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=1' [current_tab == 1 ? "class='linkOn'" : ""]>Game Preferences</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=5' [current_tab == 5 ? "class='linkOn'" : ""]>Content Preferences</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=6' [current_tab == 6 ? "class='linkOn'" : ""]>Keybindings</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=[SETTINGS_TAB]' [current_tab == SETTINGS_TAB ? "class='linkOn'" : ""]>Character Settings</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=[APPEARANCE_TAB]' [current_tab == APPEARANCE_TAB ? "class='linkOn'" : ""]>Character Appearance</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=[SPEECH_TAB]' [current_tab == SPEECH_TAB ? "class='linkOn'" : ""]>Character Speech</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=[LOADOUT_TAB]' [current_tab == LOADOUT_TAB ? "class='linkOn'" : ""]>Loadout</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=[GAME_PREFERENCES_TAB]' [current_tab == GAME_PREFERENCES_TAB ? "class='linkOn'" : ""]>Game Preferences</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=[CONTENT_PREFERENCES_TAB]' [current_tab == CONTENT_PREFERENCES_TAB ? "class='linkOn'" : ""]>Content Preferences</a>"
dat += "<a href='?_src_=prefs;preference=tab;tab=[KEYBINDINGS_TAB]' [current_tab == KEYBINDINGS_TAB ? "class='linkOn'" : ""]>Keybindings</a>"
if(!path)
dat += "<div class='notice'>Please create an account to save your preferences</div>"
@@ -290,7 +290,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<HR>"
switch(current_tab)
if (0) // Character Settings#
if(SETTINGS_TAB) // Character Settings#
if(path)
var/savefile/S = new /savefile(path)
if(S)
@@ -366,7 +366,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "</tr></table>"
//Character Appearance
if(2)
if(APPEARANCE_TAB)
if(path)
var/savefile/S = new /savefile(path)
if(S)
@@ -670,7 +670,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "</td>"
dat += "</tr></table>"
if(3)
if(SPEECH_TAB)
if(path)
var/savefile/S = new /savefile(path)
if(S)
@@ -700,7 +700,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "</td>"
dat += "</tr></table>"
if (1) // Game Preferences
if(GAME_PREFERENCES_TAB) // Game Preferences
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
dat += "<h2>General Settings</h2>"
dat += "<b>UI Style:</b> <a href='?_src_=prefs;task=input;preference=ui'>[UI_style]</a><br>"
@@ -871,7 +871,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<br>"
if(4)
if(LOADOUT_TAB)
//calculate your gear points from the chosen item
gear_points = CONFIG_GET(number/initial_gear_points)
var/list/chosen_gear = loadout_data["SAVE_[loadout_slot]"]
@@ -990,7 +990,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "</td><td><font size=2><i>[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]</i></font></td></tr>"
dat += "</table>"
if(5) // Content preferences
if(CONTENT_PREFERENCES_TAB) // Content preferences
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
dat += "<h2>Fetish content prefs</h2>"
dat += "<b>Arousal:</b><a href='?_src_=prefs;preference=arousable'>[arousable == TRUE ? "Enabled" : "Disabled"]</a><BR>"
@@ -1014,7 +1014,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<b>Automatic Wagging:</b> <a href='?_src_=prefs;preference=auto_wag'>[(cit_toggles & NO_AUTO_WAG) ? "Disabled" : "Enabled"]</a><br>"
dat += "</tr></table>"
dat += "<br>"
if(6) // Custom keybindings
if(KEYBINDINGS_TAB) // Custom keybindings
dat += "<b>Keybindings:</b> <a href='?_src_=prefs;preference=hotkeys'>[(hotkeys) ? "Hotkeys" : "Input"]</a><br>"
dat += "Keybindings mode controls how the game behaves with tab and map/input focus.<br>If it is on <b>Hotkeys</b>, the game will always attempt to force you to map focus, meaning keypresses are sent \
directly to the map instead of the input. You will still be able to use the command bar, but you need to tab to do it every time you click on the game map.<br>\
@@ -2721,7 +2721,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
save_character()
if("tab")
if (href_list["tab"])
if(href_list["tab"])
current_tab = text2num(href_list["tab"])
if(href_list["preference"] == "gear")
if(href_list["clear_loadout"])
+1 -1
View File
@@ -277,7 +277,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/under/chameleon)
item_state = "bl_suit"
desc = "It's a plain jumpsuit. It has a small dial on the wrist."
sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle??
random_sensor = FALSE
sensor_flags = NONE
resistance_flags = NONE
can_adjust = FALSE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+3 -5
View File
@@ -233,7 +233,7 @@
/obj/item/clothing/examine(mob/user)
. = ..()
if(damaged_clothes == CLOTHING_SHREDDED)
. += "<span class='warning'><b>It is completely shredded and requires mending before it can be worn again!</b></span>"
. += "<span class='warning'><b>It is completely shredded and requires mending!</b></span>"
return
for(var/zone in damage_by_parts)
var/pct_damage_part = damage_by_parts[zone] / limb_integrity * 100
@@ -437,12 +437,10 @@ BLIND // can't see anything
damaged_clothes = CLOTHING_SHREDDED
body_parts_covered = NONE
name = "shredded [initial(name)]"
slot_flags = NONE
update_clothes_damaged_state()
update_clothes_damaged_state(CLOTHING_SHREDDED)
if(ismob(loc))
var/mob/M = loc
M.visible_message("<span class='danger'>[M]'s [src.name] falls off, completely shredded!</span>", "<span class='warning'><b>Your [src.name] falls off, completely shredded!</b></span>", vision_distance = COMBAT_MESSAGE_RANGE)
M.dropItemToGround(src)
M.visible_message("<span class='danger'>[M]'s [src.name] is completely shredded!</span>", "<span class='userdanger'>Your [src.name] is completely shredded!</span>", vision_distance = COMBAT_MESSAGE_RANGE)
else
..()
+32 -2
View File
@@ -78,10 +78,40 @@
speech_args[SPEECH_MESSAGE] = trim(message)
/obj/item/clothing/mask/joy
name = "joy mask"
desc = "Express your happiness or hide your sorrows with this laughing face with crying tears of joy cutout."
name = "Emotional Mask"
desc = "Express your happiness or hide your sorrows with this modular cutout."
icon_state = "joy"
clothing_flags = ALLOWINTERNALS
mutantrace_variation = STYLE_MUZZLE
actions_types = list(/datum/action/item_action/adjust)
var/static/list/joymask_designs = list()
/obj/item/clothing/mask/joy/Initialize(mapload)
. = ..()
joymask_designs = list(
"Joy" = image(icon = src.icon, icon_state = "joy"),
"Flushed" = image(icon = src.icon, icon_state = "flushed"),
"Pensive" = image(icon = src.icon, icon_state = "pensive"),
"Angry" = image(icon = src.icon, icon_state = "angry"),
)
/obj/item/clothing/mask/joy/ui_action_click(mob/user)
if(!istype(user) || user.incapacitated())
return
var/static/list/options = list("Joy" = "joy", "Flushed" = "flushed", "Pensive" = "pensive","Angry" ="angry")
var/choice = show_radial_menu(user, src, joymask_designs, custom_check = FALSE, radius = 36, require_near = TRUE)
if(src && choice && !user.incapacitated() && in_range(user,src))
icon_state = options[choice]
user.update_inv_wear_mask()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
to_chat(user, "<span class='notice'>Your Joy mask now has a [choice] Emotion!</span>")
return 1
/obj/item/clothing/mask/pig
name = "pig mask"
+104 -25
View File
@@ -7,11 +7,14 @@
slot_flags = ITEM_SLOT_ICLOTHING
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK
limb_integrity = 30
limb_integrity = 120
var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women
var/has_sensor = HAS_SENSORS // For the crew computer
var/random_sensor = TRUE
var/sensor_flags = SENSOR_RANDOM
var/sensor_mode = NO_SENSORS
var/sensor_mode_intended = NO_SENSORS //if sensors become damaged and are repaired later, it will revert to the user's intended preferences
var/sensormaxintegrity = 200 //if this is zero, then our sensors can only be destroyed by shredded clothing
var/sensordamage = 0 //how much damage did our sensors take?
var/can_adjust = TRUE
var/adjusted = NORMAL_STYLE
var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only
@@ -31,30 +34,76 @@
. += accessory_overlay
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil))
if(damaged_clothes)
to_chat(user,"<span class='warning'>You should repair the damage done to [src] first.</span>")
if((sensordamage || (has_sensor < HAS_SENSORS && has_sensor != NO_SENSORS)) && istype(I, /obj/item/stack/cable_coil))
if(damaged_clothes == CLOTHING_SHREDDED)
to_chat(user,"<span class='warning'>[src] is too damaged to have its suit sensors repaired! Repair it first.</span>")
return 0
var/obj/item/stack/cable_coil/C = I
I.use_tool(src, user, 0, 1)
has_sensor = HAS_SENSORS
sensordamage = 0
sensor_mode = sensor_mode_intended
to_chat(user,"<span class='notice'>You repair the suit sensors on [src] with [C].</span>")
return 1
if(!attach_accessory(I, user))
return ..()
/obj/item/clothing/under/take_damage_zone(def_zone, damage_amount, damage_type, armour_penetration)
..()
if(sensormaxintegrity == 0 || has_sensor == NO_SENSORS || sensordamage >= sensormaxintegrity) return //sensors are invincible if max integrity is 0
var/damage_dealt = take_damage(damage_amount * 0.1, damage_type, armour_penetration, FALSE) * 10 // only deal 10% of the damage to the general integrity damage, then multiply it by 10 so we know how much to deal to limb
sensordamage += damage_dealt
var/integ = has_sensor
var/newinteg = sensorintegrity()
if(newinteg != integ)
if(newinteg < integ && iscarbon(src.loc)) //the first check is to see if for some inexplicable reason the attack healed our suit sensors
var/mob/living/carbon/C = src.loc
switch(newinteg)
if(DAMAGED_SENSORS_VITALS)
to_chat(C,"<span class='warning'>Your tracking beacon on your suit sensors have shorted out!</span>")
if(DAMAGED_SENSORS_LIVING)
to_chat(C,"<span class='warning'>Your vital tracker on your suit sensors have shorted out!</span>")
if(BROKEN_SENSORS)
to_chat(C,"<span class='userdanger'>Your suit sensors have shorted out completely!</span>")
updatesensorintegrity(newinteg)
/obj/item/clothing/under/proc/sensorintegrity()
var/percentage = sensordamage/sensormaxintegrity //calculate the percentage of how much damage taken
if(percentage < SENSOR_INTEGRITY_COORDS) return HAS_SENSORS
else if(percentage < SENSOR_INTEGRITY_VITALS) return DAMAGED_SENSORS_VITALS
else if(percentage < SENSOR_INTEGRITY_BINARY) return DAMAGED_SENSORS_LIVING
else return BROKEN_SENSORS
/obj/item/clothing/under/proc/updatesensorintegrity(integ = HAS_SENSORS)
if(sensormaxintegrity == 0 || has_sensor == NO_SENSORS) return //sanity check
has_sensor = integ
switch(has_sensor)
if(HAS_SENSORS)
sensor_mode = sensor_mode_intended
if(DAMAGED_SENSORS_VITALS)
if(sensor_mode > SENSOR_VITALS) sensor_mode = SENSOR_VITALS
if(DAMAGED_SENSORS_LIVING)
if(sensor_mode > SENSOR_LIVING) sensor_mode = SENSOR_LIVING
if(BROKEN_SENSORS)
sensor_mode = NO_SENSORS
/obj/item/clothing/under/update_clothes_damaged_state()
..()
if(ismob(loc))
var/mob/M = loc
M.update_inv_w_uniform()
if(has_sensor > NO_SENSORS)
if(has_sensor > NO_SENSORS && damaged_clothes == CLOTHING_SHREDDED)
has_sensor = BROKEN_SENSORS
sensordamage = sensormaxintegrity
/obj/item/clothing/under/New()
if(random_sensor)
if(sensor_flags & SENSOR_RANDOM)
//make the sensor mode favor higher levels, except coords.
sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS, SENSOR_COORDS)
sensor_mode_intended = sensor_mode
..()
/obj/item/clothing/under/equipped(mob/user, slot)
@@ -143,9 +192,14 @@
. += "Alt-click on [src] to wear it normally."
else
. += "Alt-click on [src] to wear it casually."
if (has_sensor == BROKEN_SENSORS)
. += "Its sensors appear to be shorted out."
else if(has_sensor > NO_SENSORS)
switch(has_sensor)
if(BROKEN_SENSORS)
. += "<span class='warning'>Its sensors appear to be shorted out completely. It can be repaired using cable.</span>"
if(DAMAGED_SENSORS_LIVING)
. += "<span class='warning'>Its sensors appear to have its tracking beacon and vital tracker broken. It can be repaired using cable.</span>"
if(DAMAGED_SENSORS_VITALS)
. += "<span class='warning'>Its sensors appear to have its tracking beacon broken. It can be repaired using cable.</span>"
if(has_sensor > NO_SENSORS)
switch(sensor_mode)
if(SENSOR_OFF)
. += "Its sensors appear to be disabled."
@@ -167,12 +221,12 @@
return
if (!can_use(M))
return
if(src.has_sensor == LOCKED_SENSORS)
to_chat(usr, "The controls are locked.")
return 0
if(src.has_sensor == BROKEN_SENSORS)
to_chat(usr, "The sensors have shorted out!")
return 0
if(src.sensor_flags & SENSOR_LOCKED)
to_chat(usr, "The controls are locked.")
return 0
if(src.has_sensor <= NO_SENSORS)
to_chat(usr, "This suit does not have any sensors.")
return 0
@@ -182,18 +236,34 @@
if(get_dist(usr, src) > 1)
to_chat(usr, "<span class='warning'>You have moved too far away!</span>")
return
sensor_mode = modes.Find(switchMode) - 1
sensor_mode_intended = modes.Find(switchMode) - 1
if (src.loc == usr)
switch(sensor_mode)
switch(sensor_mode_intended)
if(0)
to_chat(usr, "<span class='notice'>You disable your suit's remote sensing equipment.</span>")
sensor_mode = sensor_mode_intended
if(1)
to_chat(usr, "<span class='notice'>Your suit will now only report whether you are alive or dead.</span>")
sensor_mode = sensor_mode_intended
if(2)
to_chat(usr, "<span class='notice'>Your suit will now only report your exact vital lifesigns.</span>")
if(src.has_sensor == DAMAGED_SENSORS_LIVING)
to_chat(usr, "<span class='warning'>Your suit's vital tracker is broken, so it will only report whether you are alive or dead.</span>")
sensor_mode = SENSOR_LIVING
else
to_chat(usr, "<span class='notice'>Your suit will now only report your exact vital lifesigns.</span>")
sensor_mode = sensor_mode_intended
if(3)
to_chat(usr, "<span class='notice'>Your suit will now report your exact vital lifesigns as well as your coordinate position.</span>")
switch(src.has_sensor)
if(DAMAGED_SENSORS_LIVING)
to_chat(usr, "<span class='warning'>Your suit's tracking beacon and vital tracker is broken, so it will only report whether you are alive or dead.</span>")
sensor_mode = SENSOR_LIVING
if(DAMAGED_SENSORS_VITALS)
to_chat(usr, "<span class='warning'>Your suit's tracking beacon is broken, so it will only report your vital lifesigns.</span>")
sensor_mode = SENSOR_VITALS
if(HAS_SENSORS)
to_chat(usr, "<span class='notice'>Your suit will now report your exact vital lifesigns as well as your coordinate position.</span>")
sensor_mode = sensor_mode_intended
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
@@ -210,19 +280,28 @@
if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
if(has_sensor == LOCKED_SENSORS)
to_chat(user, "The controls are locked.")
return
if(has_sensor == BROKEN_SENSORS)
to_chat(user, "The sensors have shorted out!")
return
if(src.has_sensor == BROKEN_SENSORS)
to_chat(usr, "The sensors have shorted out!")
return 0
if(src.sensor_flags & SENSOR_LOCKED)
to_chat(usr, "The controls are locked.")
return 0
if(has_sensor <= NO_SENSORS)
to_chat(user, "This suit does not have any sensors.")
return
sensor_mode = SENSOR_COORDS
sensor_mode_intended = SENSOR_COORDS
to_chat(user, "<span class='notice'>Your suit will now report your exact vital lifesigns as well as your coordinate position.</span>")
switch(src.has_sensor)
if(DAMAGED_SENSORS_LIVING)
to_chat(usr, "<span class='warning'>Your suit's tracking beacon and vital tracker is broken, so it will only report whether you are alive or dead.</span>")
sensor_mode = SENSOR_LIVING
if(DAMAGED_SENSORS_VITALS)
to_chat(usr, "<span class='warning'>Your suit's tracking beacon is broken, so it will only report your vital lifesigns.</span>")
sensor_mode = SENSOR_VITALS
if(HAS_SENSORS)
to_chat(usr, "<span class='notice'>Your suit will now report your exact vital lifesigns as well as your coordinate position.</span>")
sensor_mode = sensor_mode_intended
if(ishuman(user))
var/mob/living/carbon/human/H = user
@@ -59,7 +59,7 @@
item_state = "captain_envirosuit"
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "wound" = 15)
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
sensor_flags = NONE
/obj/item/clothing/under/plasmaman/mime
name = "mime envirosuit"
@@ -5,7 +5,7 @@
item_state = "security_envirosuit"
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "wound" = 10)
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
sensor_flags = NONE
/obj/item/clothing/under/plasmaman/security/warden
name = "warden plasma envirosuit"
+1 -1
View File
@@ -5,7 +5,7 @@
item_state = "b_suit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 15)
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
sensor_flags = NONE
/obj/item/clothing/under/rank/captain/util
name = "command utility uniform"
+1 -1
View File
@@ -12,7 +12,7 @@
strip_delay = 50
alt_covers_chest = TRUE
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
sensor_flags = NONE
/obj/item/clothing/under/rank/security/officer
name = "security jumpsuit"
+4 -4
View File
@@ -23,16 +23,15 @@
name = "prison jumpsuit"
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
icon_state = "prisoner"
item_state = "o_suit"
has_sensor = LOCKED_SENSORS
item_state = "prisoner"
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
sensor_flags = SENSOR_LOCKED
/obj/item/clothing/under/rank/prisoner/skirt
name = "prison jumpskirt"
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
icon_state = "prisoner_skirt"
item_state = "o_suit"
item_state = "prisoner_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
@@ -166,6 +165,7 @@
/obj/item/clothing/under/misc/gear_harness
name = "gear harness"
desc = "A simple, inconspicuous harness replacement for a jumpsuit."
limb_integrity = 180
icon_state = "gear_harness"
item_state = "gear_harness"
can_adjust = TRUE
+10 -9
View File
@@ -25,7 +25,7 @@
supernova.power_mod = 0
/datum/round_event/supernova/announce()
var/message = "Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux. [power > 4 ? "Short burts of radiation may be possible, so please prepare accordingly." : ""]"
var/message = "Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux. [power > 1 ? "Short burts of radiation may be possible, so please prepare accordingly." : ""]"
if(prob(power * 25))
priority_announce(message)
else
@@ -47,12 +47,11 @@
/datum/round_event/supernova/tick()
var/midpoint = round((endWhen-startWhen)/2)
switch(activeFor)
if(startWhen to midpoint)
supernova.power_mod = min(supernova.power_mod*1.2, power)
if(endWhen-10 to endWhen)
supernova.power_mod /= 4
if(prob(round(supernova.power_mod / 2)) && storm_count < 4 && !SSweather.get_weather_by_type(/datum/weather/rad_storm))
if(activeFor < midpoint)
supernova.power_mod = min(supernova.power_mod*1.2, power)
if(activeFor > endWhen-10)
supernova.power_mod /= 4
if(prob(round(supernova.power_mod)) && prob(5) && storm_count < 5 && !SSweather.get_weather_by_type(/datum/weather/rad_storm))
SSweather.run_weather(/datum/weather/rad_storm/supernova)
storm_count++
@@ -63,5 +62,7 @@
/datum/weather/rad_storm/supernova
weather_duration_lower = 50
weather_duration_upper = 100
telegraph_duration = 100
radiation_intensity = 50
telegraph_duration = 200
radiation_intensity = 1000
weather_sound = null
telegraph_message = "<span class='userdanger'>The air begins to grow very warm!</span>"
@@ -36,7 +36,7 @@
desc = "It's watching you suspiciously."
/obj/structure/closet/crate/necropolis/tendril/magic/PopulateContents()
var/loot = rand(1,10)
var/loot = rand(1,9)
switch(loot)
if(1)
new /obj/item/soulstone/anybody(src)
@@ -57,10 +57,6 @@
new /obj/item/immortality_talisman(src)
if(9)
new /obj/item/gun/magic/wand/book/healing(src)
if(10)
new /obj/item/reagent_containers/glass/bottle/ichor/red(src)
new /obj/item/reagent_containers/glass/bottle/ichor/blue(src)
new /obj/item/reagent_containers/glass/bottle/ichor/green(src)
/obj/structure/closet/crate/necropolis/tendril/weapon_armor/PopulateContents()
var/loot = rand(1,11)
@@ -132,7 +128,7 @@
new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src)
/obj/structure/closet/crate/necropolis/tendril/all/PopulateContents()
var/loot = rand(1,29)
var/loot = rand(1,28)
switch(loot)
if(1)
new /obj/item/shared_storage/red(src)
@@ -196,10 +192,6 @@
new /obj/item/immortality_talisman(src)
if(28)
new /obj/item/gun/magic/wand/book/healing(src)
if(29)
new /obj/item/reagent_containers/glass/bottle/ichor/red(src)
new /obj/item/reagent_containers/glass/bottle/ichor/blue(src)
new /obj/item/reagent_containers/glass/bottle/ichor/green(src)
//KA modkit design discs
/obj/item/disk/design_disk/modkit_disc
@@ -27,7 +27,7 @@
age = rand(AGE_MIN,AGE_MAX)
/datum/preferences/proc/update_preview_icon(current_tab)
var/equip_job = (current_tab != 2)
var/equip_job = (current_tab != APPEARANCE_TAB)
// Determine what job is marked as 'High' priority, and dress them up as such.
var/datum/job/previewJob = get_highest_job()
@@ -46,7 +46,7 @@
mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER))
copy_to(mannequin, initial_spawn = TRUE)
if(current_tab == 3)
if(current_tab == LOADOUT_TAB)
//give it its loadout if not on the appearance tab
SSjob.equip_loadout(parent.mob, mannequin, FALSE, bypass_prereqs = TRUE, can_drop = FALSE)
else
@@ -514,6 +514,20 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/human/triple_kitsune
name = "Triple Kitsune Tails"
icon_state = "3sune"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/human/triple_kitsune
name = "Triple Kitsune Tails"
icon_state = "3sune"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/human/tentacle
name = "Tentacle"
icon_state = "tentacle"
@@ -965,6 +979,16 @@
icon_state = "9sune"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/mam_tails/triple_kitsune
name = "Triple Kitsune Tails"
icon_state = "3sune"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/mam_tails_animated/triple_kitsune
name = "Triple Kitsune Tails"
icon_state = "3sune"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/mam_tails/tentacle
name = "Tentacle"
icon_state = "tentacle"
+1 -1
View File
@@ -87,7 +87,7 @@
addtimer(CALLBACK(src, .proc/med_hud_set_status), (DEFIB_TIME_LIMIT * 10) + 1)
stop_pulling()
var/signal = SEND_SIGNAL(src, COMSIG_MOB_DEATH, gibbed)
var/signal = SEND_SIGNAL(src, COMSIG_MOB_DEATH, gibbed) | SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_DEATH, src, gibbed)
var/turf/T = get_turf(src)
if(mind && mind.name && mind.active && !istype(T.loc, /area/ctf) && !(signal & COMPONENT_BLOCK_DEATH_BROADCAST))
@@ -55,3 +55,9 @@
name = "triple-barrel shotgun internal magazine"
ammo_type = /obj/item/ammo_casing/shotgun/incapacitate
max_ammo = 3
/obj/item/ammo_box/magazine/internal/shot/levergun
name = "levergun internal magazine"
ammo_type = /obj/item/ammo_casing/c38 // they're rubber by default, i guess
caliber = "38"
max_ammo = 7
+6 -1
View File
@@ -8,6 +8,7 @@
var/obj/item/ammo_box/magazine/magazine
var/casing_ejector = TRUE //whether the gun ejects the chambered casing
var/magazine_wording = "magazine"
var/sawn_item_state = "gun"
/obj/item/gun/ballistic/Initialize()
. = ..()
@@ -198,13 +199,17 @@
name = "sawn-off [src.name]"
desc = sawn_desc
w_class = WEIGHT_CLASS_NORMAL
item_state = "gun"
item_state = sawn_item_state
slot_flags &= ~ITEM_SLOT_BACK //you can't sling it on your back
slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
sawn_off = TRUE
update_icon()
return 1
/// is something supposed to happen here?
/obj/item/gun/ballistic/proc/on_sawoff(mob/user)
return
// Sawing guns related proc
/obj/item/gun/ballistic/proc/blow_up(mob/user)
. = 0
@@ -12,6 +12,7 @@
casing_ejector = FALSE
var/recentpump = 0 // to prevent spammage
weapon_weight = WEAPON_HEAVY
sawn_item_state = "sawnshotgun"
/obj/item/gun/ballistic/shotgun/attackby(obj/item/A, mob/user, params)
. = ..()
@@ -335,3 +336,34 @@
//our hook gun!
var/obj/item/gun/magic/hook/bounty/hook
var/toggled = FALSE
// hey you kids like
// LEVER GUNS?
/obj/item/gun/ballistic/shotgun/leveraction
name = "lever-action rifle"
desc = "While lever-actions have been horribly out of date for hundreds of years now, \
the reported potential versatility of .38 Special is worth paying attention to."
fire_sound = "sound/weapons/revolvershot.ogg"
mag_type = /obj/item/ammo_box/magazine/internal/shot/levergun
icon_state = "levercarabine"
item_state = "leveraction"
sawn_item_state = "maresleg"
/obj/item/gun/ballistic/shotgun/leveraction/attackby(obj/item/A, mob/user, params)
..()
if(A.tool_behaviour == TOOL_SAW || istype(A, /obj/item/gun/energy/plasmacutter))
sawoff(user)
if(istype(A, /obj/item/melee/transforming/energy))
var/obj/item/melee/transforming/energy/W = A
if(W.active)
sawoff(user)
/obj/item/gun/ballistic/shotgun/leveraction/on_sawoff(mob/user)
magazine.max_ammo-- // sawing off drops from 7+1 to 6+1
/obj/item/gun/ballistic/shotgun/leveraction/update_icon_state()
if(current_skin)
icon_state = "[unique_reskin[current_skin]][sawn_off ? "-sawn" : ""][chambered ? "" : "-e"]"
else
icon_state = "[initial(icon_state)][sawn_off ? "-sawn" : ""][chambered ? "" : "-e"]"
@@ -85,7 +85,7 @@
name = "Machine Design (Automatic Hydroponics Tray Board)"
desc = "The circuit board for an automatic hydroponics tray. GIVE ME THE PLANT, CAPTAIN."
id = "autohydrotray"
build_path = /obj/machinery/hydroponics/constructable/automagic
build_path = /obj/item/circuitboard/machine/hydroponics/automagic
category = list ("Hydroponics Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_MEDICAL
@@ -457,23 +457,23 @@
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/laser_shield
name = "Laser Resistant Riot Shield"
desc = "An advanced riot shield made of darker glasses to prevent laser fire from passing through."
/datum/design/energy_shield
name = "Energy Resistant Shield"
desc = "An ablative shield designed to stop energy-based attacks dead in their tracks, but shatter easily against kinetic blows."
id = "laser_shield"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 4000, /datum/material/silver = 800, /datum/material/titanium = 600, /datum/material/plasma = 5000)
build_path = /obj/item/shield/riot/laser_proof
build_path = /obj/item/shield/riot/energy_proof
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/bullet_shield
name = "Bullet Resistant Riot Shield"
desc = "An advanced riot shield made bullet resistant plastics and heavy metals to protect against projectile harm."
/datum/design/kinetic_shield
name = "Kinetic Resistant Shield"
desc = "An advanced polymer shield designed to stop kinetic-based attacks with ease, but splinter apart against energy-based attacks."
id = "bullet_shield"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/silver = 2000, /datum/material/titanium = 1200, /datum/material/plastic = 2500)
build_path = /obj/item/shield/riot/bullet_proof
build_path = /obj/item/shield/riot/kinetic_proof
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+1 -1
View File
@@ -50,7 +50,7 @@
custom_materials = list(/datum/material/iron=12000)
/obj/item/ingot/diamond
custom_materials = list(/datum/material/diamond=12000) //yeah ok
custom_materials = list(/datum/material/diamond=12000)
/obj/item/ingot/uranium
custom_materials = list(/datum/material/uranium=12000)
@@ -93,12 +93,14 @@
active_phylacteries++
GLOB.poi_list |= src
START_PROCESSING(SSobj, src)
RegisterSignal(SSactivity, COMSIG_THREAT_CALC, .proc/get_threat)
set_light(lon_range)
if(initial(SSticker.mode.round_ends_with_antag_death))
SSticker.mode.round_ends_with_antag_death = FALSE
/obj/item/phylactery/Destroy(force=FALSE)
STOP_PROCESSING(SSobj, src)
UnregisterSignal(SSactivity, COMSIG_THREAT_CALC)
active_phylacteries--
GLOB.poi_list -= src
if(!active_phylacteries)
@@ -113,6 +115,12 @@
if(!mind.current || (mind.current && mind.current.stat == DEAD))
addtimer(CALLBACK(src, .proc/rise), respawn_time, TIMER_UNIQUE)
/obj/item/phylactery/proc/get_threat(list/threat_list)
if(mind?.current?.stat == DEAD)
if(!("phylactery" in threat_list))
threat_list["phylactery"] = 0
threat_list["phylactery"] += 25
/obj/item/phylactery/proc/rise()
if(mind.current && mind.current.stat != DEAD)
return "[mind] already has a living body: [mind.current]"
+10 -1
View File
@@ -99,6 +99,9 @@
var/generic_bleedstacks
/// If we have a gauze wrapping currently applied (not including splints)
var/obj/item/stack/current_gauze
/// does this limb have replacement capability, despite probably not being robotic?
// see code\modules\surgery\limb_augmentation.dm, or code\game\machinery\limbgrower.dm
var/forcereplace = FALSE
/obj/item/bodypart/examine(mob/user)
. = ..()
@@ -240,7 +243,13 @@
wounding_dmg *= (easy_dismember ? 1 : 0.75)
if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus))
return
// note that there's no handling for BIO_JUST_FLESH since we don't have any that are that right now (slimepeople maybe someday)
// if we're flesh only, all blunt attacks become weakened slashes in terms of wound damage
if(BIO_JUST_FLESH)
if(wounding_type == WOUND_BLUNT)
wounding_type = WOUND_SLASH
wounding_dmg *= (easy_dismember ? 1 : 0.3)
if((mangled_state & BODYPART_MANGLED_FLESH) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus))
return
// standard humanoids
if(BIO_FLESH_BONE)
// if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate
+18 -8
View File
@@ -10,7 +10,7 @@
if(istype(tool, /obj/item/organ_storage) && istype(tool.contents[1], /obj/item/bodypart))
tool = tool.contents[1]
var/obj/item/bodypart/aug = tool
if(!aug.is_robotic_limb())
if(!aug.is_robotic_limb() && !aug.forcereplace) // forcereplace used here to allow for replacing limbs with synthflesh variants
to_chat(user, "<span class='warning'>That's not an augment, silly!</span>")
return -1
if(aug.body_zone != target_zone)
@@ -18,9 +18,14 @@
return -1
L = surgery.operated_bodypart
if(L)
display_results(user, target, "<span class ='notice'>You begin to augment [target]'s [parse_zone(user.zone_selected)]...</span>",
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug].",
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)].")
if(aug.is_robotic_limb())
display_results(user, target, "<span class ='notice'>You begin to augment [target]'s [parse_zone(user.zone_selected)]...</span>",
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug].",
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)].")
else
display_results(user, target, "<span class ='notice'>You begin to replace [target]'s [parse_zone(user.zone_selected)]...</span>",
"[user] begins to replace [target]'s [parse_zone(user.zone_selected)] with [aug].",
"[user] begins to replace [target]'s [parse_zone(user.zone_selected)].")
else
user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "<span class ='notice'>You look for [target]'s [parse_zone(user.zone_selected)]...</span>")
@@ -47,10 +52,15 @@
tool = tool.contents[1]
if(istype(tool) && user.temporarilyRemoveItemFromInventory(tool))
tool.replace_limb(target, TRUE)
display_results(user, target, "<span class='notice'>You successfully augment [target]'s [parse_zone(target_zone)].</span>",
"[user] successfully augments [target]'s [parse_zone(target_zone)] with [tool]!",
"[user] successfully augments [target]'s [parse_zone(target_zone)]!")
log_combat(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
if(tool.is_robotic_limb())
display_results(user, target, "<span class='notice'>You successfully augment [target]'s [parse_zone(target_zone)].</span>",
"[user] successfully augments [target]'s [parse_zone(target_zone)] with [tool]!",
"[user] successfully augments [target]'s [parse_zone(target_zone)]!")
else
display_results(user, target, "<span class='notice'>You successfully replace [target]'s [parse_zone(target_zone)].</span>",
"[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!",
"[user] successfully replaces [target]'s [parse_zone(target_zone)]!")
log_combat(user, target, "augmented", addition="by giving them a new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
else
to_chat(user, "<span class='warning'>[target] has no organic [parse_zone(target_zone)] there!</span>")
return TRUE