Merge branch 'master' into upstream-merge-11715

This commit is contained in:
Nadyr
2021-10-27 20:25:43 -04:00
committed by GitHub
91 changed files with 2753 additions and 607 deletions

View File

@@ -130,5 +130,21 @@
user.drop_item()
src.throw_at(target, throw_range, throw_speed, user)
/obj/item/weapon/beach_ball/dodgeball
icon = 'icons/obj/balls_vr.dmi'
icon_state = "dodgeball"
item_state = "dodgeball"
item_icons = list(slot_l_hand_str = 'icons/mob/items/lefthand_balls_vr.dmi', slot_r_hand_str = 'icons/mob/items/righthand_balls_vr.dmi')
name = "dodgeball"
desc = "Think fast, chucklenuts!"
w_class = ITEMSIZE_LARGE //Stops people from hiding it in their bags/pockets
force = 0.1
throwforce = 0.1
throw_speed = 5
throw_range = 15
drop_sound = 'sound/items/drop/rubber.ogg'
pickup_sound = 'sound/items/pickup/rubber.ogg'
hitsound = 'sound/weapons/dodgeball.ogg'
/obj/effect/spawner
name = "object spawner"

View File

@@ -221,7 +221,8 @@
"Actor" = /datum/alt_title/actor, "Dancer" = /datum/alt_title/dancer, "Singer" = /datum/alt_title/singer,
"Magician" = /datum/alt_title/magician, "Comedian" = /datum/alt_title/comedian, "Tragedian" = /datum/alt_title/tragedian,
"Clown" = /datum/alt_title/clown, "Jester" = /datum/alt_title/clown/jester,"Fool" = /datum/alt_title/clown/fool,
"Mime"= /datum/alt_title/mime,"Poseur"= /datum/alt_title/mime/poseur) //CHOMPEDIT: Adding clown + mime and their alts as alts of entertainer
"Mime"= /datum/alt_title/mime,"Poseur"= /datum/alt_title/mime/poseur, //CHOMPEDIT: Adding clown + mime and their alts as alts of entertainer
"Artist" = /datum/alt_title/artist)
// Entertainer Alt Titles
/datum/alt_title/actor
@@ -259,3 +260,7 @@
/datum/alt_title/tragedian
title = "Tragedian"
title_blurb = "A Tragedian will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?"
/datum/alt_title/artist
title = "Artist"
title_blurb = "An Artist's calling is to create beautiful arts! Whatever form may they take, create and have people astonished with your creativity."

View File

@@ -166,11 +166,12 @@
///Assigns minimum age by race & brain type. Code says Positronic = mechanical and Drone = digital because nothing can be simple.
///Will first check based on brain type, then based on species.
/datum/job/proc/get_min_age(species_name, brain_type)
return 18 // VOREStation Edit - Minimum character age by rules anyway, might as well return 18 instead of 0 or 1 or whatever.
//return (brain_type && LAZYACCESS(min_age_by_species, brain_type)) || LAZYACCESS(min_age_by_species, species_name) || minimum_character_age //VOREStation Edit
return minimum_character_age // VOREStation Edit - Minimum character age by rules is 18, return default which is standard for all species
//return (brain_type && LAZYACCESS(min_age_by_species, brain_type)) || LAZYACCESS(min_age_by_species, species_name) || minimum_character_age //VOREStation Removal
/datum/job/proc/get_ideal_age(species_name, brain_type)
return (brain_type && LAZYACCESS(ideal_age_by_species, brain_type)) || LAZYACCESS(ideal_age_by_species, brain_type) || ideal_character_age
return ideal_character_age // VOREStation Edit - Minimum character age by rules is 18, return default which is standard for all species
//return (brain_type && LAZYACCESS(ideal_age_by_species, brain_type)) || LAZYACCESS(ideal_age_by_species, brain_type) || ideal_character_age //VOREStation Removal
/datum/job/proc/is_species_banned(species_name, brain_type)
return FALSE // VOREStation Edit - Any species can be any job.

View File

@@ -100,6 +100,10 @@ var/list/whitelist = list()
if(!M || !module)
return 0
//Module is not even whitelisted
if(!(module in whitelisted_module_types))
return 1
//If we have a loaded file, search it
if(alien_whitelist)
for (var/s in alien_whitelist)

View File

@@ -95,7 +95,7 @@
data["real_name"] = user.real_name
data["allow_items"] = allow_items
data["crew"] = frozen_crew
var/list/items = list()
if(allow_items)
for(var/F in frozen_items)
@@ -250,6 +250,10 @@
/obj/machinery/cryopod/robot/door/dorms
name = "Residential District Elevator"
desc = "A small elevator that goes down to the deeper section of the colony."
icon = 'icons/obj/Cryogenic2_vr.dmi'
icon_state = "lift_closed"
base_icon_state = "lift_open"
occupied_icon_state = "lift_closed"
on_store_message = "has departed for the residential district."
on_store_name = "Residential Oversight"
on_enter_occupant_message = "The elevator door closes slowly, ready to bring you down to the residential district."
@@ -259,6 +263,10 @@
/obj/machinery/cryopod/robot/door/travel
name = "Passenger Elevator"
desc = "A small elevator that goes down to the passenger section of the vessel."
icon = 'icons/obj/Cryogenic2_vr.dmi'
icon_state = "lift_closed"
base_icon_state = "lift_open"
occupied_icon_state = "lift_closed"
on_store_message = "is slated to depart from the colony."
on_store_name = "Travel Oversight"
on_enter_occupant_message = "The elevator door closes slowly, ready to bring you down to the hell that is economy class travel."
@@ -491,7 +499,7 @@
for(var/datum/data/record/G in data_core.general)
if((G.fields["name"] == to_despawn.real_name))
qdel(G)
// Also check the hidden version of each datacore, if they're an offmap role.
var/datum/job/J = SSjob.get_job(job)
if(J?.offmap_spawn)

View File

@@ -4,7 +4,7 @@
w_class = ITEMSIZE_NORMAL
blocks_emissive = EMISSIVE_BLOCK_GENERIC
matter = list(MAT_STEEL = 1)
//matter = list(MAT_STEEL = 1)
var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
var/randpixel = 6
@@ -251,7 +251,7 @@
var/obj/item/weapon/storage/S = src.loc
if(!S.remove_from_storage(src))
return
src.pickup(user)
src.throwing = 0
if (src.loc == user)
@@ -260,7 +260,7 @@
else
if(isliving(src.loc))
return
if(user.put_in_active_hand(src))
if(isturf(old_loc))
var/obj/effect/temporary_effect/item_pickup_ghost/ghost = new(old_loc)
@@ -834,7 +834,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
if(!inhands)
apply_blood(standing) //Some items show blood when bloodied
apply_accessories(standing) //Some items sport accessories like webbing
//Apply overlays to our...overlay
apply_overlays(standing)

View File

@@ -1,3 +1,16 @@
/*
* Contains:
* Flashlights
* Lamps
* Flares
* Chemlights
* Slime Extract
*/
/*
* Flashlights
*/
/obj/item/device/flashlight
name = "flashlight"
desc = "A hand-held emergency light."
@@ -7,15 +20,15 @@
slot_flags = SLOT_BELT
matter = list(MAT_STEEL = 50,MAT_GLASS = 20)
action_button_name = "Toggle Flashlight"
light_system = MOVABLE_LIGHT_DIRECTIONAL
light_range = 4 //luminosity when on
light_power = 0.8 //lighting power when on
light_color = "#FFFFFF" //LIGHT_COLOR_INCANDESCENT_FLASHLIGHT //lighting colour when on
light_cone_y_offset = -7
var/on = 0
var/obj/item/weapon/cell/cell
var/cell_type = /obj/item/weapon/cell/device
var/power_usage = 1
@@ -26,7 +39,7 @@
if(power_use && cell_type)
cell = new cell_type(src)
update_brightness()
/obj/item/device/flashlight/Destroy()
@@ -232,24 +245,34 @@
w_class = ITEMSIZE_TINY
power_use = 0
/obj/item/device/flashlight/color //Default color is blue, just roll with it.
/obj/item/device/flashlight/color //Default color is blue
name = "blue flashlight"
desc = "A hand-held emergency light. This one is blue."
desc = "A small flashlight. This one is blue."
icon_state = "flashlight_blue"
/obj/item/device/flashlight/color/green
name = "green flashlight"
desc = "A small flashlight. This one is green."
icon_state = "flashlight_green"
/obj/item/device/flashlight/color/purple
name = "purple flashlight"
desc = "A small flashlight. This one is purple."
icon_state = "flashlight_purple"
/obj/item/device/flashlight/color/red
name = "red flashlight"
desc = "A hand-held emergency light. This one is red."
desc = "A small flashlight. This one is red."
icon_state = "flashlight_red"
/obj/item/device/flashlight/color/orange
name = "orange flashlight"
desc = "A hand-held emergency light. This one is orange."
desc = "A small flashlight. This one is orange."
icon_state = "flashlight_orange"
/obj/item/device/flashlight/color/yellow
name = "yellow flashlight"
desc = "A hand-held emergency light. This one is yellow."
desc = "A small flashlight. This one is yellow."
icon_state = "flashlight_yellow"
/obj/item/device/flashlight/maglight
@@ -273,7 +296,11 @@
w_class = ITEMSIZE_TINY
power_use = 0
// the desk lamps are a bit special
/*
* Lamps
*/
// pixar desk lamp
/obj/item/device/flashlight/lamp
name = "desk lamp"
desc = "A desk lamp with an adjustable mount."
@@ -286,14 +313,6 @@
on = 1
light_system = STATIC_LIGHT
// green-shaded desk lamp
/obj/item/device/flashlight/lamp/green
desc = "A classic green-shaded desk lamp."
icon_state = "lampgreen"
center_of_mass = list("x" = 15,"y" = 11)
light_color = "#FFC58F"
/obj/item/device/flashlight/lamp/verb/toggle_light()
set name = "Toggle light"
set category = "Object"
@@ -302,7 +321,23 @@
if(!usr.stat)
attack_self(usr)
// FLARES
// green-shaded desk lamp
/obj/item/device/flashlight/lamp/green
desc = "A classic green-shaded desk lamp."
icon_state = "lampgreen"
center_of_mass = list("x" = 15,"y" = 11)
light_color = "#FFC58F"
// clown lamp
/obj/item/device/flashlight/lamp/clown
desc = "A whacky banana peel shaped lamp."
icon_state = "bananalamp"
center_of_mass = list("x" = 15,"y" = 11)
/*
* Flares
*/
/obj/item/device/flashlight/flare
name = "flare"
@@ -368,18 +403,20 @@
START_PROCESSING(SSobj, src)
return 1
//Glowsticks
/*
* Chemlights
*/
/obj/item/device/flashlight/glowstick
name = "green glowstick"
desc = "A green military-grade glowstick."
desc = "A green military-grade chemical light."
w_class = ITEMSIZE_SMALL
light_system = MOVABLE_LIGHT
light_range = 4
light_power = 0.9
light_color = "#49F37C"
icon_state = "glowstick"
item_state = "glowstick"
icon_state = "glowstick_green"
item_state = "glowstick_green"
var/fuel = 0
power_use = 0
@@ -414,32 +451,45 @@
/obj/item/device/flashlight/glowstick/red
name = "red glowstick"
desc = "A red military-grade glowstick."
desc = "A red military-grade chemical light."
light_color = "#FC0F29"
icon_state = "glowstick_red"
item_state = "glowstick_red"
/obj/item/device/flashlight/glowstick/blue
name = "blue glowstick"
desc = "A blue military-grade glowstick."
desc = "A blue military-grade chemical light."
light_color = "#599DFF"
icon_state = "glowstick_blue"
item_state = "glowstick_blue"
/obj/item/device/flashlight/glowstick/orange
name = "orange glowstick"
desc = "A orange military-grade glowstick."
desc = "A orange military-grade chemical light."
light_color = "#FA7C0B"
icon_state = "glowstick_orange"
item_state = "glowstick_orange"
/obj/item/device/flashlight/glowstick/yellow
name = "yellow glowstick"
desc = "A yellow military-grade glowstick."
desc = "A yellow military-grade chemical light."
light_color = "#FEF923"
icon_state = "glowstick_yellow"
item_state = "glowstick_yellow"
/obj/item/device/flashlight/glowstick/radioisotope
name = "radioisotope glowstick"
desc = "A radioisotope powered chemical light. Escaping particles light up the area far brighter on similar levels to flares and for longer"
icon_state = "glowstick_isotope"
item_state = "glowstick_isotope"
light_range = 8
light_power = 0.1
light_color = "#49F37C"
/*
* Slime Extract
*/
/obj/item/device/flashlight/slime
gender = PLURAL

View File

@@ -1,9 +0,0 @@
/obj/item/device/flashlight/glowstick/radioisotope
name = "radioisotope glowstick"
desc = "A radioisotope powered glowstick. Escaping particles light up the area far brighter on similar levels to flares and for longer"
icon_state = "glowstick_blue"
item_state = "glowstick_blue"
light_range = 8
light_power = 0.1
light_color = "#599DFF"

View File

@@ -249,6 +249,12 @@
drop_sound = 'sound/items/drop/soda.ogg'
pickup_sound = 'sound/items/pickup/soda.ogg'
/obj/item/trash/tomato
name = "empty tomato soup can"
icon_state = "tomato"
drop_sound = 'sound/items/drop/soda.ogg'
pickup_sound = 'sound/items/pickup/soda.ogg'
/obj/item/trash/spinach
name = "empty spinach can"
icon_state = "spinach"
@@ -410,3 +416,14 @@
name = "burrito packaging"
icon_state = "smolburrito"
/obj/item/trash/brainzsnax
name = "\improper BrainzSnax can"
icon_state = "brainzsnax"
drop_sound = 'sound/items/drop/soda.ogg'
pickup_sound = 'sound/items/pickup/soda.ogg'
/obj/item/trash/brainzsnaxred
name = "\improper BrainzSnax RED can"
icon_state = "brainzsnaxred"
drop_sound = 'sound/items/drop/soda.ogg'
pickup_sound = 'sound/items/pickup/soda.ogg'

View File

@@ -207,8 +207,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
to_chat(M, "<span class='notice'>Your [name] goes out.</span>")
M.remove_from_mob(src) //un-equip it so the overlays can update
M.update_inv_wear_mask(0)
M.update_inv_l_hand(0)
M.update_inv_r_hand(1)
qdel(src)
else
new /obj/effect/decal/cleanable/ash(T)
@@ -221,8 +219,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_state = initial(icon_state)
item_state = initial(item_state)
M.update_inv_wear_mask(0)
M.update_inv_l_hand(0)
M.update_inv_r_hand(1)
smoketime = 0
reagents.clear_reagents()
name = "empty [initial(name)]"

View File

@@ -17,4 +17,6 @@
build_path = /obj/machinery/mining/brace
board_type = new /datum/frame/frame_types/machine
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
req_components = list()
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 1
)

View File

@@ -25,3 +25,14 @@
/obj/item/weapon/storage/secure/briefcase/trashmoney
starts_with = list(/obj/item/weapon/spacecash/c200 = 10)
/obj/item/weapon/storage/box/brainzsnax
name = "\improper BrainzSnax box"
icon_state = "brainzsnax_box"
desc = "A box designed to hold canned food. This one has BrainzSnax branding printed on it."
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/canned)
max_storage_space = ITEMSIZE_COST_NORMAL * 6
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax = 6)
/obj/item/weapon/storage/box/brainzsnax/red
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red = 6)

View File

@@ -69,6 +69,7 @@
throwforce = 2
slot_flags = SLOT_BELT
max_storage_space = ITEMSIZE_COST_TINY * 5 //CHOMPEdit
can_hold = list(/obj/item/weapon/flame/candle)
starts_with = list(/obj/item/weapon/flame/candle = 5)
/obj/item/weapon/storage/fancy/whitecandle_box
@@ -81,6 +82,7 @@
throwforce = 2
slot_flags = SLOT_BELT
max_storage_space = ITEMSIZE_COST_TINY * 5 //CHOMPEdit
can_hold = list(/obj/item/weapon/flame/candle)
starts_with = list(/obj/item/weapon/flame/candle/white = 5)
/obj/item/weapon/storage/fancy/blackcandle_box
@@ -93,6 +95,7 @@
throwforce = 2
slot_flags = SLOT_BELT
max_storage_space = ITEMSIZE_COST_TINY * 5 //CHOMPEdit
can_hold = list(/obj/item/weapon/flame/candle)
starts_with = list(/obj/item/weapon/flame/candle/black = 5)

View File

@@ -1,7 +1,10 @@
/*
* Toolboxes
*/
/obj/item/weapon/storage/toolbox
name = "toolbox"
desc = "Danger. Very robust."
icon = 'icons/obj/storage.dmi'
icon = 'icons/obj/storage_vr.dmi'
icon_state = "red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
center_of_mass = list("x" = 16,"y" = 11)
@@ -18,8 +21,10 @@
drop_sound = 'sound/items/drop/toolbox.ogg'
pickup_sound = 'sound/items/pickup/toolbox.ogg'
//Emergency
/obj/item/weapon/storage/toolbox/emergency
name = "emergency toolbox"
icon = 'icons/obj/storage_vr.dmi'
icon_state = "red"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
starts_with = list(
@@ -34,8 +39,10 @@
new /obj/item/device/flashlight/flare(src)
. = ..()
//Mechanical
/obj/item/weapon/storage/toolbox/mechanical
name = "mechanical toolbox"
icon = 'icons/obj/storage_vr.dmi'
icon_state = "blue"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
starts_with = list(
@@ -47,8 +54,10 @@
/obj/item/weapon/tool/wirecutters
)
//Electrical
/obj/item/weapon/storage/toolbox/electrical
name = "electrical toolbox"
icon = 'icons/obj/storage_vr.dmi'
icon_state = "yellow"
item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow")
starts_with = list(
@@ -67,8 +76,10 @@
new /obj/item/stack/cable_coil/random(src,30)
calibrate_size()
//Syndicate
/obj/item/weapon/storage/toolbox/syndicate
name = "black and red toolbox"
icon = 'icons/obj/storage_vr.dmi'
icon_state = "syndicate"
item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi")
origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1)
@@ -94,9 +105,43 @@
/obj/item/device/analyzer
)
//Brass
/obj/item/weapon/storage/toolbox/brass
name = "brass toolbox"
icon = 'icons/obj/storage_vr.dmi'
icon_state = "brass"
item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow")
starts_with = list(
/obj/item/weapon/tool/crowbar/brass,
/obj/item/weapon/tool/wirecutters/brass,
/obj/item/weapon/tool/screwdriver/brass,
/obj/item/weapon/tool/wrench/brass,
/obj/item/weapon/weldingtool/brass
)
//Hydro
/obj/item/weapon/storage/toolbox/hydro
name = "hydroponic toolbox"
icon = 'icons/obj/storage_vr.dmi'
icon_state = "green"
item_state_slots = list(slot_r_hand_str = "toolbox_green", slot_l_hand_str = "toolbox_green")
starts_with = list(
/obj/item/device/analyzer/plant_analyzer,
/obj/item/weapon/material/minihoe,
/obj/item/weapon/material/knife/machete/hatchet,
/obj/item/weapon/tool/wirecutters/clippers/trimmers,
/obj/item/weapon/reagent_containers/spray/plantbgone,
/obj/item/weapon/reagent_containers/glass/beaker
)
/*
* Lunchboxes
*/
/obj/item/weapon/storage/toolbox/lunchbox
max_storage_space = ITEMSIZE_COST_SMALL * 4 //slightly smaller than a toolbox
name = "rainbow lunchbox"
icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_rainbow"
item_state_slots = list(slot_r_hand_str = "toolbox_pink", slot_l_hand_str = "toolbox_pink")
desc = "A little lunchbox. This one is the colors of the rainbow!"
@@ -125,6 +170,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/heart
name = "heart lunchbox"
icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_lovelyhearts"
item_state_slots = list(slot_r_hand_str = "toolbox_pink", slot_l_hand_str = "toolbox_pink")
desc = "A little lunchbox. This one has cute little hearts on it!"
@@ -134,6 +180,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/cat
name = "cat lunchbox"
icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_sciencecatshow"
item_state_slots = list(slot_r_hand_str = "toolbox_green", slot_l_hand_str = "toolbox_green")
desc = "A little lunchbox. This one has a cute little science cat from a popular show on it!"
@@ -143,6 +190,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/nt
name = "NanoTrasen brand lunchbox"
icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_nanotrasen"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
desc = "A little lunchbox. This one is branded with the NanoTrasen logo!"
@@ -152,6 +200,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/mars
name = "\improper Mojave university lunchbox"
icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_marsuniversity"
item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red")
desc = "A little lunchbox. This one is branded with the Mojave university logo!"
@@ -161,6 +210,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/cti
name = "\improper CTI lunchbox"
icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_cti"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
desc = "A little lunchbox. This one is branded with the CTI logo!"
@@ -170,6 +220,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/nymph
name = "\improper Diona nymph lunchbox"
icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_dionanymph"
item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow")
desc = "A little lunchbox. This one is an adorable Diona nymph on the side!"
@@ -179,6 +230,7 @@
/obj/item/weapon/storage/toolbox/lunchbox/syndicate
name = "black and red lunchbox"
icon = 'icons/obj/storage.dmi'
icon_state = "lunchbox_syndie"
item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi")
desc = "A little lunchbox. This one is a sleek black and red, made of a durable steel!"

View File

@@ -0,0 +1,32 @@
/*
* Brass Tools
*/
//Crowbar
/obj/item/weapon/tool/crowbar/brass
icon_state = "crowbar_brass"
item_state = "crowbar"
//Cutters
/obj/item/weapon/tool/wirecutters/brass
icon_state = "cutters_brass"
item_state = "cutters_yellow"
//Screwdriver
/obj/item/weapon/tool/screwdriver/brass
icon_state = "screwdriver_brass"
item_state = "screwdriver_black"
//Wrench
/obj/item/weapon/tool/wrench/brass
icon_state = "wrench_brass"
item_state = "wrench_brass"
//Welder
/obj/item/weapon/weldingtool/brass
name = "brass welding tool"
desc = "A welder made from brass fittings."
icon_state = "brasswelder"
max_fuel = 20
origin_tech = list(TECH_ENGINEERING = 2, TECH_PHORON = 2)
matter = list(MAT_STEEL = 70, MAT_GLASS = 60)

View File

@@ -1,7 +1,6 @@
/*
* Crowbar
*/
/obj/item/weapon/tool/crowbar
name = "crowbar"
desc = "Used to remove floors and to pry open doors."
@@ -27,6 +26,10 @@
icon_state = "red_crowbar"
item_state = "crowbar_red"
/obj/item/weapon/tool/crowbar/old
icon = 'icons/obj/tools.dmi'
icon_state = "old_crowbar"
item_state = "crowbar"
/datum/category_item/catalogue/anomalous/precursor_a/alien_crowbar
name = "Precursor Alpha Object - Hard Light Pry Tool"

View File

@@ -7,11 +7,11 @@
desc = "A steel bar with a wedge, designed specifically for opening unpowered doors in an emergency. It comes in a variety of configurations - collect them all!"
icon = 'icons/obj/tools_vr.dmi'
icon_state = "prybar"
item_state = "crowbar"
slot_flags = SLOT_BELT
force = 4
throwforce = 5
pry = 1
item_state = "crowbar"
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_ENGINEERING = 1)
matter = list(MAT_STEEL = 30)

View File

@@ -21,7 +21,7 @@
//R&D tech level
origin_tech = list(TECH_ENGINEERING = 1)
tool_qualities = list(TOOL_WELDER)
//Welding tool specific stuff
@@ -375,7 +375,7 @@
/obj/item/weapon/weldingtool/hugetank
name = "upgraded welding tool"
desc = "A much larger welder with a huge tank."
icon_state = "indwelder"
icon_state = "upindwelder"
max_fuel = 80
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_ENGINEERING = 3)
@@ -392,6 +392,9 @@
toolspeed = 2
eye_safety_modifier = 1 // Safer on eyes.
/obj/item/weapon/weldingtool/mini/two
icon_state = "miniwelder2"
/datum/category_item/catalogue/anomalous/precursor_a/alien_welder
name = "Precursor Alpha Object - Self Refueling Exothermic Tool"
desc = "An unwieldly tool which somewhat resembles a weapon, due to \

View File

@@ -6,6 +6,7 @@
desc = "This cuts wires."
icon = 'icons/obj/tools.dmi'
icon_state = "cutters"
item_state = "cutters"
center_of_mass = list("x" = 18,"y" = 10)
slot_flags = SLOT_BELT
force = 6
@@ -26,9 +27,20 @@
var/random_color = TRUE
/obj/item/weapon/tool/wirecutters/New()
if(random_color && prob(50))
icon_state = "cutters-y"
item_state = "cutters_yellow"
if(random_color)
switch(pick("red","blue","yellow"))
if ("red")
icon_state = "cutters"
item_state = "cutters"
if ("blue")
icon_state = "cutters-b"
item_state = "cutters_blue"
if ("yellow")
icon_state = "cutters-y"
item_state = "cutters_yellow"
if (prob(75))
src.pixel_y = rand(0, 16)
..()
/obj/item/weapon/tool/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob)

View File

@@ -25,6 +25,14 @@
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.5
/obj/item/weapon/tool/wrench/pipe
name = "pipe wrench"
desc = "A wrench used for plumbing. Can make a good makeshift weapon."
icon_state = "pipe_wrench"
slot_flags = SLOT_BELT
force = 8
throwforce = 10
/obj/item/weapon/tool/wrench/hybrid // Slower and bulkier than normal power tools, but it has the power of reach. If reach even worked half the time.
name = "strange wrench"
desc = "A wrench with many common uses. Can be usually found in your hand."
@@ -40,7 +48,6 @@
toolspeed = 0.5
reach = 2
/datum/category_item/catalogue/anomalous/precursor_a/alien_wrench
name = "Precursor Alpha Object - Fastener Torque Tool"
desc = "This is an object that has a distinctive tool shape. \

View File

@@ -8,14 +8,21 @@
/obj/random/empty_or_lootable_crate/item_to_spawn()
return pick(/obj/random/crate,
/obj/random/multiple/corp_crate)
/obj/random/forgotten_tram
name = "random forgotten tram item"
desc = "Spawns a random item that someone might accidentally leave on a tram. Sometimes spawns nothing."
spawn_nothing_percentage = 30
/obj/random/forgotten_tram/item_to_spawn()
return pick(prob(2);/obj/item/device/flashlight,
return pick(
prob(2);/obj/item/device/flashlight,
prob(2);/obj/item/device/flashlight/color,
prob(2);/obj/item/device/flashlight/color/green,
prob(2);/obj/item/device/flashlight/color/purple,
prob(2);/obj/item/device/flashlight/color/red,
prob(2);/obj/item/device/flashlight/color/orange,
prob(2);/obj/item/device/flashlight/color/yellow,
prob(2);/obj/item/device/flashlight/glowstick,
prob(2);/obj/item/device/flashlight/glowstick/blue,
prob(1);/obj/item/device/flashlight/glowstick/orange,

View File

@@ -972,3 +972,21 @@
prob(5);/obj/item/weapon/storage/pouch/baton/full,
prob(1);/obj/item/weapon/storage/pouch/holding
)
/obj/random/flashlight
name = "Random Flashlight"
desc = "This is a random storage pouch."
icon = 'icons/obj/lighting.dmi'
icon_state = "random_flashlight"
/obj/random/flashlight/item_to_spawn()
return pick(
prob(8);/obj/item/device/flashlight,
prob(6);/obj/item/device/flashlight/color,
prob(6);/obj/item/device/flashlight/color/green,
prob(6);/obj/item/device/flashlight/color/purple,
prob(6);/obj/item/device/flashlight/color/red,
prob(6);/obj/item/device/flashlight/color/orange,
prob(6);/obj/item/device/flashlight/color/yellow,
prob(2);/obj/item/device/flashlight/maglight
)

View File

@@ -301,6 +301,16 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
/obj/effect/fancy_shuttle_floor_preview/delivery
icon = 'icons/turf/fancy_shuttles/delivery_preview.dmi'
/**
* Tether Cargo shuttle
* North facing: W:8, H:12
*/
/obj/effect/fancy_shuttle/tether_cargo
icon = 'icons/turf/fancy_shuttles/tether_cargo_preview.dmi'
split_file = 'icons/turf/fancy_shuttles/tether_cargo.dmi'
/obj/effect/fancy_shuttle_floor_preview/tether_cargo
icon = 'icons/turf/fancy_shuttles/tether_cargo_preview.dmi'
/**
* Wagon
* North facing: W:5, H:13

View File

@@ -9,4 +9,9 @@
icon_state = "rockvault"
/turf/unsimulated/floor/shuttle_ceiling
icon_state = "reinforced"
icon_state = "reinforced"
/turf/unsimulated/elevator_shaft
name = "floor"
icon = 'icons/turf/floors.dmi'
icon_state = "elevatorshaft"

View File

@@ -52,8 +52,16 @@
alpha = 0xFF
VIRGO3B_SET_ATMOS
//other set - for map building
/turf/unsimulated/wall2/planetary/virgo3b_better
icon_state = "riveted2"
/turf/unsimulated/wall/planetary/virgo3b_better
name = "facility wall"
desc = "An eight-meter tall carbyne wall. For when the wildlife on your planet is mostly militant megacorps."
alpha = 0xFF
VIRGO3BB_SET_ATMOS
//other set - for map building
/turf/unsimulated/wall2/planetary/virgo3b_better
icon_state = "riveted2"

View File

@@ -6,10 +6,22 @@
density = TRUE
blocks_air = TRUE
//other set - for map building
/turf/unsimulated/wall/wall1
icon_state = "riveted1"
/turf/unsimulated/wall/wall2
icon_state = "riveted2"
/turf/unsimulated/wall/fakeglass
name = "window"
icon_state = "fakewindows"
opacity = 0
//other set - for map building
/turf/unsimulated/wall/fakeglass2
icon_state = "fakewindows2"
opacity = 0
/turf/unsimulated/wall/other
icon_state = "r_wall"

View File

@@ -4,12 +4,12 @@
var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
/datum/lore/atc_controller
var/delay_min = 25 MINUTES //How long between ATC traffic
var/delay_max = 35 MINUTES //Adjusted to give approx 2 per hour, will work out to 10-14 over a full shift
var/delay_min = 20 MINUTES //How long between ATC traffic, minimum
var/delay_max = 30 MINUTES //Ditto, maximum
//Shorter delays means more traffic, which gives the impression of a busier system, but also means a lot more radio noise
var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins.
var/initial_delay = 2 MINUTES //How long to wait before sending the first message of the shift.
var/next_message = 30 MINUTES //When the next message should happen in world.time - Making it default to min value
var/next_message = 20 MINUTES //When the next message should happen in world.time - Making it default to min value
var/force_chatter_type //Force a specific type of messages
var/squelched = 0 //If ATC is squelched currently
@@ -77,18 +77,15 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/mission = source.ship_prefixes[prefix] //The value of the prefix is the mission type that prefix does
var/shipname = pick(source.ship_names) //Pick a random ship name
var/destname = pick(source.destination_names) //destination is where?
var/law_abiding = source.lawful //do we fully observe system law (or are we otherwise favored by the system owners, i.e. NT)?
var/law_breaker = source.hostile //or are we part of a pirate group
var/system_defense = source.sysdef //are we actually system law/SDF? unlocks the SDF-specific events
var/slogan = pick(source.slogans) //god help you all
var/org_type = source.org_type //which group do we belong to?
//pick our second ship
//var/secondname = secondary.name //not used atm, commented out to suppress errors
var/secondowner = secondary.short_name
var/secondprefix = pick(secondary.ship_prefixes) //Pick a random prefix
var/secondshipname = pick(secondary.ship_names) //Pick a random ship name
var/law_abiding2 = secondary.lawful
var/law_breaker2 = secondary.hostile
var/system_defense2 = secondary.sysdef //mostly here as a secondary check to ensure SDF don't interrogate other SDF
var/org_type2 = secondary.org_type
var/combined_first_name = "[owner][prefix] |[shipname]|"
var/combined_second_name = "[secondowner][secondprefix] |[secondshipname]|"
@@ -102,7 +99,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/requests = list(
"special flight rules" = list("authorizing special flight rules", "denying special flight rules, not allowed for your traffic class"),
"current solar weather info" = list("sending you the relevant information via tightbeam", "your request has been queued, stand by"),
"aerospace priority" = list("affirmative, aerospace priority is yours", "negative, another vessel has priority right now"),
"sector aerospace priority" = list("affirmative, sector aerospace priority is yours", "negative, another vessel in your sector has priority right now"),
"system traffic info" = list("sending you current traffic info", "request queued, please hold"),
"refueling information" = list("sending refueling information now", "depots currently experiencing fuel shortages, advise you move on"),
"a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"),
@@ -113,30 +110,38 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/chatter_type = "normal"
if(force_chatter_type)
chatter_type = force_chatter_type
else if(law_abiding && !system_defense) //I have to offload this from the chatter_type switch below and do it here, otherwise BYOND throws a shitfit for no discernable reason
else if((org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate" || org_type == "system defense") && org_type2 == "pirate") //this is ugly but when I tried to do it with !='s it fired for pirate-v-pirate, still not sure why. might as well stick it up here so it takes priority over other combos.
chatter_type = "distress"
else if(org_type == "corporate") //corporate-specific subset for the slogan event. despite the relatively high weight it was still quite rare in tests.
chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed",300;"slogan")
else if((org_type == "government" || org_type == "neutral" || org_type == "military"))
chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed")
//the following filters *always* fire their 'unique' event when they're tripped, simply because the conditions behind them are quite rare to begin with
else if(name == "Smugglers" && !system_defense2) //just straight up funnel smugglers into always being caught, otherwise we get them asking for traffic info and stuff
else if(org_type == "smuggler" && org_type2 != "system defense") //just straight up funnel smugglers into always being caught, otherwise we get them asking for traffic info and stuff
chatter_type = "policeflee"
else if(name == "Smugglers" && system_defense2) //ditto, if an SDF ship catches them
else if(org_type == "smuggler" && org_type2 == "system defense") //ditto, if an SDF ship catches them
chatter_type = "policeshipflee"
else if(law_abiding && law_breaker2) //on the offchance that we manage to roll a goodguy and a badguy, run a new distress event - it's like emerg but better
chatter_type = "distress"
else if(law_breaker && system_defense2) //if we roll this combo instead, time for the SDF to do their fucking job
else if((org_type == "smuggler" || org_type == "pirate") && org_type2 == "system defense") //if we roll this combo instead, time for the SDF to do their fucking job
chatter_type = "policeshipcombat"
else if(law_breaker && !system_defense2) //but if we roll THIS combo, time to alert the SDF to get off their asses
else if((org_type == "smuggler" || org_type == "pirate") && org_type2 != "system defense") //but if we roll THIS combo, time to alert the SDF to get off their asses
chatter_type = "hostiledetected"
//SDF-specific events that need to filter based on the second party (basically just the following SDF-unique list with the soft-result ship scan thrown in)
else if(system_defense && law_abiding2 && !system_defense2) //let's see if we can narrow this down, I didn't see many ship-to-ship scans
else if(org_type == "system defense" && (org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate")) //let's see if we can narrow this down, I didn't see many ship-to-ship scans
chatter_type = pick(75;"policeshipscan","sdfpatrolupdate",75;"sdfendingpatrol",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",75;"sdfbeginpatrol",50;"normal")
//SDF-specific events that don't require the secondary at all, in the event that we manage to roll SDF + hostile/smuggler or something
else if(system_defense)
else if(org_type == "system defense")
chatter_type = pick("sdfpatrolupdate",60;"sdfendingpatrol",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",80;"sdfbeginpatrol","normal")
//if we somehow don't match any of the other existing filters once we've run through all of them
else
chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestdenied",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest",30;"undockingdenied",30;"undockingdelayed","normal")
//I probably should do some kind of pass here to work through all the possible combinations of major factors and see if the filtering list needs reordering or modifying, but I really can't be arsed
//DEBUG BLOCK
//to_world("DEBUG OUTPUT 1: [name], [owner], [prefix], [mission], [shipname], [org_type], [destname]")
//to_world("DEBUG OUTPUT 2: [secondowner], [secondprefix], [secondshipname], [org_type2]")
//to_world("DEBUG OUTPUT 3: Chose [chatter_type]")
//DEBUG BLOCK ENDS
var/yes = prob(90) //Chance for them to say yes vs no
var/request = pick(requests)
@@ -167,7 +172,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
switch(chatter_type)
//mayday call
if("emerg")
var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have asteroids impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke in the cockpit","We have unidentified boarders","Our life support has failed")
var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have [pick("asteroids","space debris")] impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke in the cockpit","We have unidentified boarders","Our RCS are malfunctioning and we're losing stability","Our life support [pick("is failing","has failed")]")
msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! [problem]!","[prefix] [shipname]")
sleep(5 SECONDS)
msg("[combined_first_name], this is [using_map.dock_name] Control, copy. Switch to emergency responder channel [ertchannel].")
@@ -175,7 +180,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
msg("Understood [using_map.dock_name] Control, switching now.","[prefix] [shipname]")
//Control scan event: soft outcome
if("policescan")
var/confirm = pick("Understood","Roger that","Affirmative")
var/confirm = pick("Understood","Roger that","Affirmative","Very well","Copy that")
var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?")
var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear, move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.")
msg("[combined_first_name], this is [using_map.dock_name] Control, your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.")
@@ -190,7 +195,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
//Control scan event: hard outcome
if("policeflee")
var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, Control.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!")
msg("Unknown [pick("ship","vessel","starship")], this is [using_map.dock_name] Control, identify yourself and submit to a full inspection. Flying without an active transponder is a violation of system regulations.")
msg("Unknown [pick("ship","vessel","starship")], this is [using_map.dock_name] Control, identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.")
sleep(5 SECONDS)
msg("[uhoh]","[shipname]")
sleep(5 SECONDS)
@@ -212,11 +217,11 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
//SDF scan event: hard outcome
if("policeshipflee")
var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, |[shipname]|.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!")
msg("Unknown [pick("ship","vessel","starship")], this is [combined_second_name], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of system regulations.","[secondprefix] [secondshipname]")
msg("Unknown [pick("ship","vessel","starship")], this is [combined_second_name], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.","[secondprefix] [secondshipname]")
sleep(5 SECONDS)
msg("[uhoh]","[shipname]")
sleep(5 SECONDS)
msg("[using_map.starsys_name] Defense Control, this is [combined_second_name], we have a situation here, please advise.","[secondprefix] [secondshipname]")
msg("[using_map.starsys_name] Defense Control, this is [combined_second_name]. We have a situation here, please advise.","[secondprefix] [secondshipname]")
sleep(5 SECONDS)
msg("Defense Control copies, [combined_second_name], reinforcements are en route. Switch further communications to encrypted band [sdfchannel].","[using_map.starsys_name] Defense Control")
//SDF scan event: engage primary in combat! fairly rare since it needs a pirate/vox + SDF roll
@@ -282,7 +287,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
if("dockingrequestdenied")
var/reason = pick("we don't have any landing pads large enough for your vessel","we don't have the necessary facilities for your vessel type or class")
var/disappointed = pick("That's unfortunate. [combined_first_name], out.","Damn shame. We'll just have to keep moving. [combined_first_name], out.","[combined_first_name], out.")
msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_move].","[prefix] [shipname]")
msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]")
sleep(5 SECONDS)
msg("[combined_first_name], this is [using_map.dock_name] Control. Request denied, [reason].")
sleep(5 SECONDS)
@@ -388,6 +393,10 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
msg("[combined_first_name], this is [using_map.dock_name] Control. Everything appears to be in order now, permission granted. Docking clamps released. [safetravels].")
sleep(5 SECONDS)
msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]")
if("slogan")
msg("The following is a sponsored message from [name].","Facility PA")
sleep (5 SECONDS)
msg("[slogan]","Facility PA")
else //time for generic message
msg("[callname], this is [combined_first_name] on [mission] [pick(mission_noun)] to [destname], requesting [request].","[prefix] [shipname]")
sleep(5 SECONDS)

View File

@@ -14,7 +14,7 @@
//how does it work? simple: if you have complex tasks enabled, it goes; PREFIX + TASK_TYPE + FLIGHT_TYPE
//e.g. NDV = Asset Protection + Patrol + Flight
//this allows you to use the ship prefix for subfactions (warbands, religions, whatever) within a faction, and define task_types at the faction level
//this overrides the standard PREFIX = TASK logic and allows you to use the ship prefix for subfactions (warbands, religions, whatever) within a faction, and define task_types at the faction level
//task_types are picked from completely at random in air_traffic.dm, much like flight_types, so be careful not to potentially create combos that make no sense!
var/list/task_types = list(
@@ -86,14 +86,114 @@
"Falcon",
"Casper",
"Orion",
"Columbia",
"Atlantis",
"Enterprise",
"Challenger",
"Pathfinder",
"Buran",
"Aldrin",
"Armstrong",
"Tranquility",
"Nostrodamus",
"Soyuz",
"Cosmos",
"Sputnik",
"Belka",
"Strelka",
"Gagarin",
"Shepard",
"Tereshkova",
"Leonov",
"Vostok",
"Apollo",
"Mir",
"Titan",
"Serenity",
"Andiamo",
"Aurora",
"Phoenix",
"Lucky",
"Raven",
"Valkyrie",
"Halcyon",
"Nakatomi",
"Cutlass",
"Unicorn",
"Sheepdog",
"Arcadia",
"Gigantic",
"Goliath",
"Pequod",
"Poseidon",
"Venture",
"Evergreen",
"Natal",
"Maru",
"Djinn",
"Witch",
"Wolf",
"Lone Star",
"Grey Fox",
"Dutchman",
"Sultana",
"Siren",
"Venus",
"Anastasia",
"Rasputin",
"Stride",
"Suzaku",
"Hathor",
"Dream",
"Gaia",
"Ibis",
"Progress",
"Olympic",
"Venture",
"Brazil",
"Tiger",
"Hedgehog",
"Potemkin",
"Fountainhead",
"Sinbad",
"Esteban",
"Mumbai",
"Shanghai",
"Madagascar",
"Kampala",
"Bangkok",
"Emerald",
"Guo Hong",
"Shun Kai",
"Fu Xing",
"Zhenyang",
"Da Qing",
"Rascal",
"Flamingo",
"Jackal",
"Andromeda",
"Ferryman",
"Panchatantra",
"Nunda",
"Fortune",
"New Dawn",
"Fionn MacCool",
"Red Bird",
"Star Rat",
"Cwn Annwn",
"Morning Swan",
"Black Cat",
"Challenger"
)
var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly.
var/lawful = TRUE //Are we exempt from routine inspections? to avoid incidents where SysDef appears to go rogue -- defaults to TRUE now (regular ships always get the "soft" result)
var/hostile = FALSE //Are we explicitly lawless, hostile, or otherwise bad? allows for a finer alignment system, since my last checks weren't working properly
var/org_type = "neutral" //Valid options are "neutral", "corporate", "government", "system defense", "military, "smuggler", & "pirate"
var/sysdef = FALSE //Are we the space cops?
var/autogenerate_destination_names = TRUE //Pad the destination lists with some extra random ones? see the proc below for info on that
var/slogans = list("This is a placeholder slogan, ding dong!") //Advertising slogans. Who doesn't want more obnoxiousness on the radio? Picked at random each time the slogan event fires. This has a placeholder so it doesn't runtime on trying to draw from a 0-length list in the event that new corps are added without full support.
/datum/lore/organization/New()
..()
@@ -213,7 +313,7 @@
and therapy.\
<br><br>\
NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \
It also boasts an prosthetic line, which is provided to its employees as needed, and is used as an incentive \
It also boasts a prosthetic line, which is provided to its employees as needed, and is used as an incentive \
for newly tested posibrains to remain with the company. \
<br><br>\
NT's ships are named for famous scientists."
@@ -222,6 +322,12 @@
headquarters = "Luna, Sol"
motto = ""
org_type = "corporate"
slogans = list(
"NanoTrasen - Phoron Makes The Galaxy Go 'Round.",
"NanoTrasen - Join for the Medical, stay for the Company.",
"NanoTrasen - Advancing Humanity."
)
ship_prefixes = list("NTV" = "a general operations", "NEV" = "an exploration", "NGV" = "a hauling", "NDV" = "a patrol", "NRV" = "an emergency response", "NDV" = "an asset protection")
//Scientist naming scheme
ship_names = list(
@@ -247,13 +353,11 @@
"Nye",
"Hawking",
"Aristotle",
"Von Braun",
"Kaku",
"Oppenheimer",
"Renwick",
"Hubble",
"Alcubierre",
"Robineau",
"Glass"
)
// Note that the current station being used will be pruned from this list upon being instantiated
@@ -297,6 +401,12 @@
headquarters = "Luna, Sol"
motto = ""
org_type = "corporate"
slogans = list(
"Hephaestus Arms - When it comes to personal protection, nobody does it better.",
"Hephaestus Arms - Peace through Superior Firepower.",
"Hephaestus Arms - Don't be caught firing blanks."
)
ship_prefixes = list("HCV" = "a general operations", "HTV" = "a freight", "HLV" = "a munitions resupply", "HDV" = "an asset protection", "HDV" = "a preemptive deployment")
//War God Theme, updated
ship_names = list(
@@ -401,6 +511,12 @@
headquarters = "Toledo, New Ohio"
motto = ""
org_type = "corporate"
slogans = list(
"Vey-Medical. Medical care you can trust.",
"Vey-Medical. Only the finest in surgical equipment.",
"Vey-Medical. Because your patients deserve the best."
)
ship_prefixes = list("VMV" = "a general operations", "VTV" = "a transportation", "VHV" = "a medical resupply", "VSV" = "a research", "VRV" = "an emergency medical support")
// Diona names, mostly
ship_names = list(
@@ -415,6 +531,9 @@
"Fire Blown Out By Wind",
"Star That Fades From View",
"Eyes Which Turn Inwards",
"Still Water Upon An Endless Shore",
"Sunlight Glitters Upon Tranquil Sands",
"Growth Within The Darkest Abyss",
"Joy Without Which The World Would Come Undone",
"A Thousand Thousand Planets Dangling From Branches",
"Light Streaming Through Interminable Branches",
@@ -447,6 +566,13 @@
headquarters = "Earth, Sol"
motto = ""
org_type = "corporate"
slogans = list(
"Zeng-Hu! WE make the medicines that YOU need!",
"Zeng-Hu! Having acid reflux problems? Consult your local physician to see if Dylovene is right for YOU!",
"Zeng-Hu! Tired of getting left in the dust? Try Hyperzine! You'll never fall behind again!",
"Zeng-Hu! Life's aches and pains getting to you? Try Tramadol - available at any good pharmacy!"
)
ship_prefixes = list("ZHV" = "a general operations", "ZTV" = "a transportation", "ZMV" = "a medical resupply", "ZRV" = "a medical research")
//ship names: a selection of famous physicians who advanced the cause of medicine
ship_names = list(
@@ -527,6 +653,12 @@
headquarters = ""
motto = ""
org_type = "corporate"
slogans = list(
"Takahashi Appliances - keeping your home running smoothly.",
"W-T Automotive - keeping you on time, all the time.",
"Ward-Takahashi Electronics - keeping you in touch with the galaxy."
)
ship_prefixes = list("WTV" = "a general operations", "WTFV" = "a freight", "WTGV" = "a transport", "WTDV" = "an asset protection")
ship_names = list(
"Comet",
@@ -560,6 +692,8 @@
"Curtain",
"Planetar",
"Quasar",
"Blazar",
"Corona",
"Binary"
)
destination_names = list()
@@ -581,6 +715,12 @@
headquarters = ""
motto = ""
org_type = "corporate"
slogans = list(
"Bishop Cybernetics - only the best in personal augmentation.",
"Bishop Cybernetics - why settle for flesh when you can have metal?",
"Bishop Cybernetics - make a statement."
)
ship_prefixes = list("BCV" = "a general operations", "BCTV" = "a transportation", "BCSV" = "a research exchange")
//famous mechanical engineers
ship_names = list(
@@ -660,6 +800,10 @@
headquarters = "Shelf flotilla"
motto = ""
org_type = "neutral" //disables slogans for morpheus as they don't advertise, per the description above
/*
slogans = list()
*/
ship_prefixes = list("MCV" = "a general operations", "MTV" = "a freight", "MDV" = "a market protection", "MSV" = "an outreach")
//periodic elements; something 'unusual' for the posibrain TSC without being full on 'quirky' culture ship names (much as I love them, they're done to death)
ship_names = list(
@@ -749,6 +893,12 @@
headquarters = ""
motto = ""
org_type = "corporate"
slogans = list(
"Xion Manufacturing - We have what you need.",
// "Xion Manufacturing - The #1 choice of the SolGov Engineer's Union for 150 years.", // CHOMPedit, year mismatch
"Xion Manufacturing - Our products are as bulletproof as our contracts."
)
ship_prefixes = list("XMV" = "a general operations", "XTV" = "a hauling", "XFV" = "a bulk transport", "XIV" = "a resupply")
//martian mountains
ship_names = list(
@@ -803,6 +953,12 @@
headquarters = ""
motto = ""
org_type = "corporate"
slogans = list(
"The FTU. We look out for the little guy.",
"There's no Trade like Free Trade.",
"Join the Free Trade Union. Because anything worth doing, is worth doing for money." //rule of acquisition #13
)
ship_prefixes = list("FTV" = "a general operations", "FTRP" = "a trade protection", "FTRR" = "a piracy suppression", "FTLV" = "a logistical support", "FTTV" = "a mercantile", "FTDV" = "a market establishment")
//famous merchants and traders, taken from Civ6's Great Merchants, plus the TSC's founder
ship_names = list(
@@ -846,6 +1002,12 @@
headquarters = "Mars, Sol"
motto = "With Major Bill's, you won't pay major bills!"
org_type = "corporate"
slogans = list(
"With Major Bill's, you won't pay major bills!",
"Major Bill's - Private Couriers - General Shipping!",
"Major Bill's got you covered, now get out there!"
)
ship_prefixes = list("TTV" = "a general operations", "TTV" = "a transport", "TTV" = "a luxury transit", "TTV" = "a priority transit", "TTV" = "a secure data courier")
//ship names: big rivers
ship_names = list (
@@ -916,6 +1078,12 @@
headquarters = "Mars, Sol"
motto = ""
org_type = "corporate"
slogans = list(
"Grayson Mining - It's An Ore Effort, For The War Effort!",
"Grayson Mining - Winning The War On Ore!",
"Grayson Mining - Come On Down To Our Ore Chasm!"
)
ship_prefixes = list("GMV" = "a general operations", "GMT" = "a transport", "GMR" = "a resourcing", "GMS" = "a surveying", "GMH" = "a bulk transit")
//rocks
ship_names = list(
@@ -976,6 +1144,12 @@
headquarters = ""
motto = "Dum spiro spero"
org_type = "corporate"
slogans = list(
"Aether A&R - We're Absolutely Breathtaking.",
"Aether A&R - You Can Breathe Easy With Us!",
"Aether A&R - The SolGov's #1 Environmental Systems Provider." // CHOMPedit
)
ship_prefixes = list("AARV" = "a general operations", "AARE" = "a resource extraction", "AARG" = "a gas transport", "AART" = "a transport")
//weather systems/patterns
ship_names = list (
@@ -1025,6 +1199,12 @@
headquarters = ""
motto = ""
org_type = "corporate"
slogans = list(
"Focal Point Energistics - Sustainable Power for a Sustainable Future.",
"Focal Point Energistics - Powering The Future Before It Even Happens.",
"Focal Point Energistics - Let There Be Light."
)
ship_prefixes = list("FPV" = "a general operations", "FPH" = "a transport", "FPC" = "an energy relay", "FPT" = "a fuel transport")
//famous electrical engineers
ship_names = list (
@@ -1085,6 +1265,12 @@
headquarters = "Spin Aerostat, Jupiter"
motto = "Sic itur ad astra"
org_type = "corporate"
slogans = list(
"StarFlight - travel the stars.",
"StarFlight - bringing you to new horizons.",
"StarFlight - getting you where you need to be since 2137."
)
ship_prefixes = list("SFI-X" = "a VIP liner", "SFI-L" = "a luxury liner", "SFI-B" = "a business liner", "SFI-E" = "an economy liner", "SFI-M" = "a mixed class liner", "SFI-S" = "a sightseeing", "SFI-M" = "a wedding", "SFI-O" = "a marketing", "SFI-S" = "a safari", "SFI-A" = "an aquatic adventure")
flight_types = list( //no military-sounding ones here
"flight",
@@ -1143,6 +1329,12 @@
headquarters = ""
motto = "News from all across the spectrum"
org_type = "corporate"
slogans = list(
"Oculum - All News, All The Time.",
"Oculum - We Keep An Eye Out.",
"Oculum - Your Eye On The Galaxy."
)
ship_prefixes = list("OBV" = "an investigation", "OBV" = "a distribution", "OBV" = "a journalism", "OBV" = "a general operations")
destination_names = list(
"Oculus HQ"
@@ -1158,6 +1350,12 @@
headquarters = "Alpha Centauri"
motto = "The largest brands of food and drink - most of them are Centauri."
org_type = "corporate"
slogans = list(
"Centauri Provisions Bread Tubes - They're Not Just Edible, They're |Breadible!|",
"Centauri Provisions SkrellSnax - Not |Just| For Skrell!",
"Centauri Provisions Space Mountain Wind - It'll Take Your |Breath| Away!"
)
ship_prefixes = list("CPTV" = "a transport", "CPCV" = "a catering", "CPRV" = "a resupply", "CPV" = "a general operations")
destination_names = list(
"Centauri Provisions HQ",
@@ -1175,6 +1373,12 @@
headquarters = ""
motto = "Engine designs, emergency generators, and old memories"
org_type = "corporate"
slogans = list(
"Einstein Engines - you don't have to be Einstein to use |our| engines!",
"Einstein Engines - bringing power to the people.",
"Einstein Engines - because it's the smart thing to do."
)
ship_prefixes = list("EETV" = "a transport", "EERV" = "a research", "EEV" = "a general operations")
destination_names = list(
"Einstein HQ"
@@ -1190,6 +1394,12 @@
headquarters = ""
motto = "We build it - you fly it"
org_type = "corporate"
slogans = list(
"Wulf Aeronautics. We build it - you fly it.",
// "Wulf Aeronautics, the Commonwealth's favorite shipwrights.", // CHOMPedit
"Wulf Aeronautics, building tomorrow's ships today."
)
ship_prefixes = list("WATV" = "a transport", "WARV" = "a repair", "WAV" = "a general operations")
destination_names = list(
"Wulf Aeronautics HQ",
@@ -1207,6 +1417,12 @@
headquarters = ""
motto = ""
org_type = "corporate"
slogans = list(
"Why choose |luxury| when you can choose |Gilthari|?",
"|Gilthari|. Because |you're| worth it.",
"|Gilthari|. Why settle for |anything| less?"
)
ship_prefixes = list("GETV" = "a transport", "GECV" = "a luxury catering", "GEV" = "a general operations")
//precious stones
ship_names = list(
@@ -1283,6 +1499,12 @@
headquarters = "N/A"
motto = "one man's trash is another man's treasure"
org_type = "corporate"
slogans = list(
"Coyote Salvage Corp. 'cause your trash ain't gonna clean itself.",
"Coyote Salvage Corp. 'cause one man's trash is another man's treasure.",
"Coyote Salvage Corp. We'll take your scrap - but not your crap."
)
ship_prefixes = list("CSV" = "a salvage", "CRV" = "a recovery", "CTV" = "a transport", "CSV" = "a shipbreaking", "CHV" = "a towing")
//mostly-original, maybe some references, and more than a few puns
ship_names = list(
@@ -1351,6 +1573,12 @@
headquarters = "Titan, Sol"
motto = "the whole is greater than the sum of its parts"
org_type = "corporate"
slogans = list(
"Chimera Genetics. Find your true self today!",
"Chimera Genetics. Bring us your genes and we'll clean them right up.",
"Chimera Genetics. Better bodies for a better tomorrow."
)
ship_prefixes = list("CGV" = "a general operations", "CGT" = "a transport", "CGT" = "a delivery", "CGH" = "a medical")
//edgy mythological critters!
ship_names = list(
@@ -1506,6 +1734,7 @@
sysdef = TRUE //we're the space law, we don't impersonate people and stuff
autogenerate_destination_names = FALSE //don't add extra destinations to our pool, or else we leave the system which makes no sense
org_type = "system defense"
ship_prefixes = list ("SDB" = "a patrol", "SDF" = "a patrol", "SDV" = "a patrol", "SDB" = "an escort", "SDF" = "an escort", "SDV" = "an escort", "SAR" = "a search and rescue", "SDT" = "a logistics", "SDT" = "a resupply", "SDJ" = "a prisoner transport") //b = boat, f = fleet (generic), v = vessel, t = tender
//ship names: weapons
ship_names = list(
@@ -1605,6 +1834,7 @@
sysdef = FALSE
autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes.
org_type = "smuggler"
ship_prefixes = list ("suspected smuggler" = "an illegal smuggling", "possible smuggler" = "an illegal smuggling") //as assigned by control, second part shouldn't even come up
//blank out our shipnames for redesignation
ship_names = list(
@@ -1781,6 +2011,7 @@
hostile = TRUE
autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes.
org_type = "pirate"
ship_prefixes = list ("known pirate" = "a piracy", "suspected pirate" = "a piracy", "rogue privateer" = "a piracy", "Cartel enforcer" = "a piracy", "known outlaw" = "a piracy", "bandit" = "a piracy", "roving corsair" = "a piracy", "illegal salvager" = "an illegal salvage", "rogue mercenary" = "a mercenary") //as assigned by control, second part shouldn't even come up, but it exists to avoid hiccups/weirdness just in case
ship_names = list(
"Morally Bankrupt",
@@ -1953,6 +2184,7 @@
hostile = TRUE
autogenerate_destination_names = TRUE
org_type = "pirate"
ship_prefixes = list("Ue-Katish pirate" = "a raiding", "Ue-Katish bandit" = "a raiding", "Ue-Katish raider" = "a raiding", "Ue-Katish enforcer" = "an enforcement")
ship_names = list(
"Keqxuer'xeu's Prize",
@@ -1987,6 +2219,7 @@
hostile = TRUE
autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need *some* entries to avoid runtimes.
org_type = "pirate"
ship_prefixes = list("vox marauder" = "a marauding", "vox raider" = "a raiding", "vox ravager" = "a raiding", "vox corsair" = "a raiding") //as assigned by control, second part shouldn't even come up
//blank out our shipnames for redesignation
ship_names = list(
@@ -2063,6 +2296,7 @@
motto = "Nil Mortalibus Ardui Est" // Latin, because latin. Says 'Nothing is too steep for mortals'
autogenerate_destination_names = TRUE
org_type = "government"
ship_prefixes = list("CWS-A" = "an administrative", "CWS-T" = "a transportation", "CWS-D" = "a diplomatic", "CWS-F" = "a freight", "CWS-J" = "a prisoner transfer")
//earth's biggest impact craters
ship_names = list(
@@ -2158,6 +2392,7 @@
headquarters = "Paraiso a Àstrea"
motto = "Liberty to the Stars!"
org_type = "government"
ship_prefixes = list("UFHV" = "military", "FFHV" = "classified")
ship_names = list(
"Bulwark of the Free",
@@ -2236,6 +2471,7 @@
headquarters = ""
motto = ""
org_type = "government"
ship_prefixes = list("ECS-M" = "a military", "ECS-T" = "a transport", "ECS-T" = "a special transport", "ECS-D" = "a diplomatic") //The Special Transport is SLAAAAVES. but let's not advertise that openly.
ship_names = list(
"Bring Me Wine!",
@@ -2291,6 +2527,7 @@
headquarters = "The Pact, Myria"
motto = ""
org_type = "government"
ship_prefixes = list("SFM-M" = "a military", "SFM-M" = "a patrol") // The Salthans don't do anything else.
flight_types = list(
"mission",
@@ -2394,6 +2631,7 @@
motto = ""
autogenerate_destination_names = TRUE //big list of own holdings to come
org_type = "government"
//the tesh expeditionary fleet's closest analogue in modern terms would be the US Army Corps of Engineers, just with added combat personnel as well
ship_prefixes = list("TEF" = "a diplomatic", "TEF" = "a peacekeeping", "TEF" = "an escort", "TEF" = "an exploration", "TEF" = "a survey", "TEF" = "an expeditionary", "TEF" = "a pioneering")
//TODO: better ship names? I just took a bunch of random teshnames from the Random Name button and added a word.
@@ -2441,6 +2679,7 @@
motto = "Si Vis Pacem Para Bellum" //if you wish for peace, prepare for war
autogenerate_destination_names = TRUE
org_type = "military"
ship_prefixes = list ("USDF" = "a logistical", "USDF" = "a training", "USDF" = "a patrol", "USDF" = "a piracy suppression", "USDF" = "a peacekeeping", "USDF" = "a relief", "USDF" = "an escort", "USDF" = "a search and rescue", "USDF" = "a classified")
flight_types = list(
"mission",
@@ -2539,6 +2778,7 @@
motto = ""
autogenerate_destination_names = TRUE
org_type = "military"
ship_prefixes = list("PCRC" = "a risk control", "PCRC" = "a private security")
flight_types = list(
"flight",
@@ -2602,6 +2842,7 @@
motto = "Strength in Numbers"
autogenerate_destination_names = TRUE
org_type = "military"
ship_prefixes = list("HPF" = "a secure freight", "HPT" = "a training", "HPS" = "a logistics", "HPV" = "a patrol", "HPH" = "a bounty hunting", "HPX" = "an experimental", "HPC" = "a command", "HPI" = "a mercy")
flight_types = list(
"flight",
@@ -2686,6 +2927,7 @@
motto = "Aut Neca Aut Necare"
autogenerate_destination_names = TRUE
org_type = "military"
ship_prefixes = list("SAARE" = "a secure freight", "SAARE" = "a training", "SAARE" = "a logistics", "SAARE" = "a patrol", "SAARE" = "a security", "SAARE" = "an experimental", "SAARE" = "a command", "SAARE" = "a classified")
flight_types = list(
"flight",

View File

@@ -34,6 +34,7 @@
for(var/language in pref.alternate_languages)
var/datum/language/L = GLOB.all_languages[language]
if(!istype(L) || (L.flags & RESTRICTED) || (!(language in S.secondary_langs) && pref.client && !is_lang_whitelisted(pref.client, L)))
testing("LANGSANI: Removed [L?.name || "lang not found"] from [pref.client]'s character [pref.real_name || "-name not yet loaded-"] because it failed allowed checks")
pref.alternate_languages -= language
if(isnull(pref.language_prefixes) || !pref.language_prefixes.len)

View File

@@ -29,19 +29,6 @@
/datum/gear/mask/plaguedoctor2
display_name = "golden plague doctor's mask"
path = /obj/item/clothing/mask/gas/plaguedoctor/gold
<<<<<<< HEAD
cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage.
||||||| parent of d86c1ee773... Merge pull request #11715 from PastelPrinceDan/gaitersecondtry
cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage.
/datum/gear/mask/papermask
display_name = "paper mask"
path = /obj/item/clothing/mask/paper
/datum/gear/mask/emotionalmask
display_name = "emotional mask"
path = /obj/item/clothing/mask/emotions
=======
cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage.
/datum/gear/mask/papermask
@@ -63,5 +50,4 @@
for(var/gaiter in typesof(/obj/item/clothing/mask/gaiter))
var/obj/item/clothing/mask/gaiter_type = gaiter
gaiters[initial(gaiter_type.name)] = gaiter_type
gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc))
>>>>>>> d86c1ee773... Merge pull request #11715 from PastelPrinceDan/gaitersecondtry
gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc))

View File

@@ -89,37 +89,37 @@
display_name = "flashlight"
path = /obj/item/device/flashlight
/datum/gear/utility/flashlight_blue
display_name = "flashlight, blue"
path = /obj/item/device/flashlight/color
/datum/gear/utility/flashlight_orange
display_name = "flashlight, orange"
path = /obj/item/device/flashlight/color/orange
/datum/gear/utility/flashlight_red
display_name = "flashlight, red"
path = /obj/item/device/flashlight/color/red
/datum/gear/utility/flashlight_yellow
display_name = "flashlight, yellow"
path = /obj/item/device/flashlight/color/yellow
/datum/gear/utility/maglight
display_name = "flashlight, maglight"
path = /obj/item/device/flashlight/maglight
cost = 2
/datum/gear/utility/flashlight/color
display_name = "flashlight, small (selection)"
path = /obj/item/device/flashlight/color
/datum/gear/utility/flashlight/color/New()
..()
var/list/flashlights = list(
"Blue Flashlight" = /obj/item/device/flashlight/color,
"Red Flashlight" = /obj/item/device/flashlight/color/red,
"Green Flashlight" = /obj/item/device/flashlight/color/green,
"Yellow Flashlight" = /obj/item/device/flashlight/color/yellow,
"Purple Flashlight" = /obj/item/device/flashlight/color/purple,
"Orange Flashlight" = /obj/item/device/flashlight/color/orange
)
gear_tweaks += new/datum/gear_tweak/path(flashlights)
/datum/gear/utility/battery
display_name = "cell, device"
path = /obj/item/weapon/cell/device
/datum/gear/utility/pen
display_name = "Fountain Pen"
display_name = "fountain pen"
path = /obj/item/weapon/pen/fountain
/datum/gear/utility/umbrella
display_name = "Umbrella"
display_name = "umbrella"
path = /obj/item/weapon/melee/umbrella
cost = 3
@@ -131,7 +131,7 @@
display_name = "wheelchair selection"
path = /obj/item/wheelchair
cost = 4
/datum/gear/utility/wheelchair/New()
..()
gear_tweaks += gear_tweak_free_color_choice

View File

@@ -1,6 +1,6 @@
/mob/var/suiciding = 0
/mob/living/carbon/human/verb/suicide()
/mob/living/carbon/human/verb/suicide() /// At best, useful for admins to see if it's being called.
set hidden = 1
if (stat == DEAD)
@@ -10,83 +10,9 @@
if (!ticker)
to_chat(src, "You can't commit suicide before the game starts!")
return
if(!player_is_antag(mind))
message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1)
to_chat(src, "No. Adminhelp if there is a legitimate reason.")
return
if (suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
var/confirm = tgui_alert(usr, "Are you sure you want to commit suicide?", "Confirm Suicide", list("Yes", "No"))
if(confirm == "Yes")
if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))")
return
suiciding = 15
does_not_breathe = 0 //Prevents ling-suicide zombies, or something
var/obj/item/held_item = get_active_hand()
if(held_item)
var/damagetype = held_item.suicide_act(src)
if(damagetype)
log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]")
var/damage_mod = 1
switch(damagetype) //Sorry about the magic numbers.
//brute = 1, burn = 2, tox = 4, oxy = 8
if(15) //4 damage types
damage_mod = 4
if(6, 11, 13, 14) //3 damage types
damage_mod = 3
if(3, 5, 7, 9, 10, 12) //2 damage types
damage_mod = 2
if(1, 2, 4, 8) //1 damage type
damage_mod = 1
else //This should not happen, but if it does, everything should still work
damage_mod = 1
//Do 175 damage divided by the number of damage types applied.
if(damagetype & BRUTELOSS)
adjustBruteLoss(30/damage_mod) //hack to prevent gibbing
adjustOxyLoss(145/damage_mod)
if(damagetype & FIRELOSS)
adjustFireLoss(175/damage_mod)
if(damagetype & TOXLOSS)
adjustToxLoss(175/damage_mod)
if(damagetype & OXYLOSS)
adjustOxyLoss(175/damage_mod)
//If something went wrong, just do normal oxyloss
if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS))
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
return
log_and_message_admins("[key_name(src)] commited suicide")
var/datum/gender/T = gender_datums[get_visible_gender()]
var/suicidemsg
suicidemsg = pick("<span class='danger'>[src] is attempting to bite [T.his] tongue off! It looks like [T.he] [T.is] trying to commit suicide.</span>", \
"<span class='danger'>[src] is jamming [T.his] thumbs into [T.his] eye sockets! It looks like [T.he] [T.is] trying to commit suicide.</span>", \
"<span class='danger'>[src] is twisting [T.his] own neck! It looks like [T.he] [T.is] trying to commit suicide.</span>", \
"<span class='danger'>[src] is holding [T.his] breath! It looks like [T.he] [T.is] trying to commit suicide.</span>")
if(isSynthetic())
suicidemsg = "<span class='danger'>[src] is attempting to switch [T.his] power off! It looks like [T.he] [T.is] trying to commit suicide.</span>"
visible_message(suicidemsg)
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
to_chat(src, "<span class='warning'>No. Adminhelp if there is a legitimate reason, and please review our server rules.</span>")
message_admins("[ckey] has tried to trigger the suicide verb as human, but it is currently disabled.")
/mob/living/carbon/brain/verb/suicide()
set hidden = 1

View File

@@ -292,6 +292,12 @@ BLIND // can't see anything
item_state_slots = list(slot_r_hand_str = "glasses", slot_l_hand_str = "glasses")
body_parts_covered = 0
/obj/item/clothing/glasses/artist
name = "4-D Glasses"
desc = "You can see in every dimension, and get four times the amount of headache!"
icon_state = "artist"
item_state = "artist_glasses"
/obj/item/clothing/glasses/gglasses
name = "green glasses"
desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme."
@@ -590,3 +596,4 @@ BLIND // can't see anything
to_chat(usr, "You push \the [src] up from in front of your eyes.")
update_clothing_icon()
usr.update_action_buttons()

View File

@@ -294,77 +294,6 @@
desc = "A black veil, typically worn at funerals or by goths."
w_class = ITEMSIZE_TINY
body_parts_covered = FACE
<<<<<<< HEAD
icon_state = "veil"
||||||| parent of d86c1ee773... Merge pull request #11715 from PastelPrinceDan/gaitersecondtry
icon_state = "veil"
/obj/item/clothing/mask/paper
name = "paper mask"
desc = "A neat, circular mask made out of paper. Perhaps you could try drawing on it with a pen!"
w_class = ITEMSIZE_SMALL
body_parts_covered = FACE
icon_state = "papermask"
/obj/item/clothing/mask/paper/attackby(obj/item/I as obj, mob/living/user as mob, proximity)
if(!proximity) return
if(istype(I, /obj/item/weapon/pen))
var/drawtype = tgui_alert(user, "Choose what you'd like to draw.", "Faces", list("blank","neutral","eyes","sleeping", "heart", "core", "plus", "square", "bullseye", "vertical", "horizontal", "X", "bug eyes", "double", "mark" ))
switch(drawtype)
if("blank")
src.icon_state = "papermask"
if("neutral")
src.icon_state = "neutralmask"
if("eyes")
src.icon_state = "eyemask"
if("sleeping")
src.icon_state = "sleepingmask"
if("heart")
src.icon_state = "heartmask"
if("core")
src.icon_state = "coremask"
if("plus")
src.icon_state = "plusmask"
if("square")
src.icon_state = "squaremask"
if("bullseye")
src.icon_state = "bullseyemask"
if("vertical")
src.icon_state = "verticalmask"
if("horizontal")
src.icon_state = "horizontalmask"
if("X")
src.icon_state = "xmask"
if("bug eyes")
src.icon_state = "bugmask"
if("double")
src.icon_state = "doublemask"
if("mark")
src.icon_state = "markmask"
return
/obj/item/clothing/mask/emotions
name = "emotional mask"
desc = "Express your happiness or hide your sorrows with this modular cutout. Draw your current emotions onto it with a pen!"
w_class = ITEMSIZE_SMALL
body_parts_covered = FACE
icon_state = "joy"
/obj/item/clothing/mask/emotions/attackby(obj/item/I as obj, mob/living/user as mob, proximity)
if(!proximity) return
if(istype(I, /obj/item/weapon/pen))
var/drawtype = tgui_alert(user, "Choose what emotions you'd like to display.", "Emotions", list("joy","pensive","angry","flushed" ))
switch(drawtype)
if("joy")
src.icon_state = "joy"
if("pensive")
src.icon_state = "pensive"
if("angry")
src.icon_state = "angry"
if("flushed")
src.icon_state = "flushed"
return
=======
icon_state = "veil"
/obj/item/clothing/mask/paper
@@ -458,5 +387,4 @@
/obj/item/clothing/mask/gaiter/green
name = "green neck gaiter"
icon_state = "gaiter_green"
>>>>>>> d86c1ee773... Merge pull request #11715 from PastelPrinceDan/gaitersecondtry
icon_state = "gaiter_green"

View File

@@ -524,7 +524,7 @@
/obj/item/clothing/suit/storage/toggle/bomber/retro
name = "retro bomber jacket"
desc = "A retro style, fur-lined leather bomber jacket that invokes the early days of space exploration when spacemen were spacemen, and laser guns had funny little antennae on them."
icon_state = "retro_bomber"
icon_state = "retrojacket"
/obj/item/clothing/suit/storage/bomber/alt
name = "bomber jacket"

View File

@@ -1,6 +1,6 @@
/obj/item/clothing/accessory/holster/waist/kinetic_accelerator
name = "KA holster"
desc = "A specialized holster, made specifically for Kinetic Accelerator."
desc = "A specialized holster, made specifically for Kinetic Accelerators."
can_hold = list(/obj/item/weapon/gun/energy/kinetic_accelerator)
/obj/item/clothing/accessory/holster/machete/rapier

View File

@@ -34,6 +34,11 @@
/// Packaged meals switch to this state when opened, if set
var/package_open_state
/// If this is canned. If true, it will print a message and ask you to open it
var/canned = FALSE
/// Canned food switch to this state when opened, if set
var/canned_open_state
/obj/item/weapon/reagent_containers/food/snacks/Initialize()
. = ..()
if(nutriment_amt)
@@ -63,6 +68,9 @@
if(package && !user.incapacitated())
unpackage(user)
if(canned && !user.incapacitated())
uncan(user)
/obj/item/weapon/reagent_containers/food/snacks/attack(mob/living/M as mob, mob/user as mob, def_zone)
if(reagents && !reagents.total_volume)
to_chat(user, "<span class='danger'>None of [src] left!</span>")
@@ -74,6 +82,10 @@
to_chat(M, "<span class='warning'>How do you expect to eat this with the package still on?</span>")
return FALSE
if(canned)
to_chat(M, "<span class='warning'>How do you expect to eat this without opening it?</span>")
return FALSE
if(istype(M, /mob/living/carbon))
//TODO: replace with standard_feed_mob() call.
@@ -257,6 +269,13 @@
if(package_open_state)
icon_state = package_open_state
/obj/item/weapon/reagent_containers/food/snacks/proc/uncan(mob/user)
canned = FALSE
to_chat(user, "<span class='notice'>You unseal \the [src] with a crack of metal.</span>")
playsound(loc,'sound/effects/tincanopen.ogg', rand(10,50), 1)
if(canned_open_state)
icon_state = canned_open_state
////////////////////////////////////////////////////////////////////////////////
/// FOOD END
////////////////////////////////////////////////////////////////////////////////
@@ -4224,10 +4243,12 @@
desc = "Musical fruit in a slightly less musical container."
filling_color = "#FC6F28"
icon_state = "bakedbeans"
nutriment_amt = 4
nutriment_desc = list("beans" = 4)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/berrymuffin/berry/Initialize()
. = ..()
reagents.add_reagent("bean_protein", 6)
/obj/item/weapon/reagent_containers/food/snacks/sugarcookie
name = "sugar cookie"
desc = "Just like your little sister used to make."
@@ -6745,34 +6766,8 @@
//////////////////////Canned Foods - crack open and eat (ADDED 04/11/2021)//////////////////////
/obj/item/weapon/reagent_containers/food/snacks/canned
name = "void can"
icon = 'icons/obj/food_canned.dmi'
flags = 0
var/sealed = TRUE
/obj/item/weapon/reagent_containers/food/snacks/canned/Initialize()
. = ..()
if(!sealed)
unseal()
/obj/item/weapon/reagent_containers/food/snacks/canned/examine(mob/user)
. = ..()
to_chat(user, "It is [sealed ? "" : "un"]sealed.")
/obj/item/weapon/reagent_containers/food/snacks/canned/proc/unseal()
flags |= OPENCONTAINER
sealed = FALSE
update_icon()
/obj/item/weapon/reagent_containers/food/snacks/canned/attack_self(var/mob/user)
if(sealed)
playsound(loc,'sound/effects/tincanopen.ogg', rand(10,50), 1)
to_chat(user, "<span class='notice'>You unseal \the [src] with a crack of metal.</span>")
unseal()
/obj/item/weapon/reagent_containers/food/snacks/canned/update_icon()
if(!sealed)
icon_state = "[initial(icon_state)]-open"
canned = TRUE
//////////Just a short line of Canned Consumables, great for treasure in faraway abandoned outposts//////////
@@ -6781,6 +6776,7 @@
icon_state = "beef"
desc = "A can of premium preserved vat-grown holstein beef. Now 99.9% bone free!"
trash = /obj/item/trash/beef
canned_open_state = "beef-open"
filling_color = "#663300"
center_of_mass = list("x"=15, "y"=9)
nutriment_desc = list("beef" = 1)
@@ -6789,54 +6785,54 @@
/obj/item/weapon/reagent_containers/food/snacks/canned/beef/Initialize()
.=..()
reagents.add_reagent("protein", 4)
reagents.add_reagent("sodiumchloride", 1)
reagents.add_reagent("sodiumchloride", 2)
/obj/item/weapon/reagent_containers/food/snacks/canned/beans
name = "baked beans"
icon_state = "beans"
desc = "Luna Colony beans. Carefully synthethized from soy."
trash = /obj/item/trash/beans
canned_open_state = "beans-open"
filling_color = "#ff6633"
center_of_mass = list("x"=15, "y"=9)
nutriment_desc = list("beans" = 1, "tomato sauce" = 1)
nutriment_amt = 15
bitesize = 2
///obj/item/weapon/reagent_containers/food/snacks/canned/tomato (NEED TO SEE HOW TO CHANGE EATING SOUND)
// name = "tomato soup"
// icon_state = "tomato"
// desc = "Plain old unseasoned tomato soup. This can has no use-by date."
// trash = "/obj/item/trash/tomato"
// filling_color = "#ae0000"
// center_of_mass = list("x"=15, "y"=9)
// nutriment_desc = list("tomato" = 1)
// bitesize = 3
// eat_sound = 'sound/items/drink.ogg'
//
///obj/item/weapon/reagent_containers/food/snacks/canned/tomato/Initialize()
// .=..()
// reagents.add_reagent(/datum/reagent/drink/juice/tomato, 12)
//
//
///obj/item/weapon/reagent_containers/food/snacks/canned/tomato/feed_sound(var/mob/user)
// playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1)
/obj/item/weapon/reagent_containers/food/snacks/canned/beans/Initialize()
.=..()
reagents.add_reagent("bean_protein", 5)
reagents.add_reagent("tomatojuice", 5)
/obj/item/weapon/reagent_containers/food/snacks/canned/tomato
name = "tomato soup"
icon_state = "tomato"
desc = "Plain old unseasoned tomato soup. This can has no use-by date."
trash = /obj/item/trash/tomato
package_open_state = "tomato-open"
filling_color = "#ae0000"
center_of_mass = list("x"=15, "y"=9)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/canned/tomato/Initialize()
.=..()
reagents.add_reagent("tomatojuice", 12)
/obj/item/weapon/reagent_containers/food/snacks/canned/spinach
name = "spinach"
icon_state = "spinach"
desc = "Wup-Az! Brand canned spinach. Notably has less iron in it than a watermelon."
trash = /obj/item/trash/spinach
canned_open_state = "spinach-open"
filling_color = "#003300"
center_of_mass = list("x"=15, "y"=9)
nutriment_amt = 5
nutriment_desc = list("soggy" = 1, "vegetable" = 1)
bitesize = 5
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/canned/spinach/Initialize()
.=..()
reagents.add_reagent("adrenaline", 5)
reagents.add_reagent("hyperzine", 5)
reagents.add_reagent("iron", 5)
reagents.add_reagent("adrenaline", 4)
reagents.add_reagent("hyperzine", 4)
reagents.add_reagent("iron", 4)
//////////////////////////////Advanced Canned Food//////////////////////////////
@@ -6845,30 +6841,30 @@
icon_state = "fisheggs"
desc = "Terran caviar, or space carp eggs. Carefully faked using alginate, artificial flavoring and salt. Skrell approved!"
trash = /obj/item/trash/fishegg
canned_open_state = "fisheggs-open"
filling_color = "#000000"
center_of_mass = list("x"=15, "y"=9)
nutriment_desc = list("fish" = 1, "salt" = 1)
nutriment_amt = 6
nutriment_desc = list("salt" = 1)
bitesize = 1
/obj/item/weapon/reagent_containers/food/snacks/caviar/Initialize()
/obj/item/weapon/reagent_containers/food/snacks/canned/caviar/Initialize()
. = ..()
reagents.add_reagent("protein", 5)
reagents.add_reagent("seafood", 5)
/obj/item/weapon/reagent_containers/food/snacks/canned/caviar/true
name = "\improper Classic Terran Caviar"
icon_state = "carpeggs"
desc = "Terran caviar, or space carp eggs. Banned by the Vir Food Health Administration for exceeding the legally set amount of carpotoxins in food stuffs."
trash = /obj/item/trash/carpegg
canned_open_state = "carpeggs-open"
filling_color = "#330066"
center_of_mass = list("x"=15, "y"=9)
nutriment_desc = list("fish" = 1, "salt" = 1, "a numbing sensation" = 1)
nutriment_amt = 6
nutriment_desc = list("salt" = 1, "a numbing sensation" = 1)
bitesize = 1
/obj/item/weapon/reagent_containers/food/snacks/caviar/true/Initialize()
/obj/item/weapon/reagent_containers/food/snacks/canned/caviar/true/Initialize()
. = ..()
reagents.add_reagent("protein", 4)
reagents.add_reagent("seafood", 4)
reagents.add_reagent("carpotoxin", 1)
/obj/item/weapon/reagent_containers/food/snacks/canned/maps
@@ -6876,13 +6872,12 @@
icon_state = "maps"
desc = "A re-branding of a classic Terran snack! Contains mostly edible ingredients."
trash = /obj/item/trash/maps
canned_open_state = "maps-open"
filling_color = "#330066"
center_of_mass = list("x"=15, "y"=9)
nutriment_desc = list("meat" = 1, "salt" = 1)
nutriment_amt = 8
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/maps/Initialize()
/obj/item/weapon/reagent_containers/food/snacks/canned/maps/Initialize()
. = ..()
reagents.add_reagent("protein", 6)
reagents.add_reagent("sodiumchloride", 2)
@@ -6892,10 +6887,10 @@
icon_state = "appleberry"
desc = "A classic snack favored by Sol astronauts. Made from dried apple-hybidized berries grown on the lunar colonies."
trash = /obj/item/trash/appleberry
canned_open_state = "appleberry-open"
filling_color = "#FFFFFF"
center_of_mass = list("x"=15, "y"=9)
nutriment_desc = list("apple" = 1, "sweetness" = 1)
nutriment_amt = 8
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/appleberry/Initialize()
@@ -6907,16 +6902,50 @@
icon_state = "ntbeans"
desc = "Musical fruit in a slightly less musical container. Now with bacon!"
trash = /obj/item/trash/ntbeans
canned_open_state = "ntbeans-open"
filling_color = "#FC6F28"
center_of_mass = list("x"=15, "y"=9)
nutriment_desc = list("beans" = 4)
nutriment_amt = 6
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/canned/ntbeans/Initialize()
. = ..()
reagents.add_reagent("bean_protein", 6)
reagents.add_reagent("protein", 2)
/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax
name = "\improper BrainzSnax"
icon_state = "brainzsnax"
desc = "A can of grey matter marketed for xenochimeras."
description_fluff = "As the cartoon brain with limbs proudly proclaims, \"It's meat. Eat it!\" On the can is printed \"Rich in limbic system\" and \
under that in infinitely small letters, \"Warning, product must be eaten within two hours of opening. May contain prion disease. \
GrubCo LTD is not liable for any brain damage occuring after consumption of product.\""
trash = /obj/item/trash/brainzsnax
canned_open_state = "brainzsnax-open"
filling_color = "#caa3c9"
center_of_mass = list("x"=15, "y"=9)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/Initialize()
. = ..()
reagents.add_reagent("brain_protein", 10)
/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red
name = "\improper BrainzSnax RED"
icon_state = "brainzsnaxred"
desc = "A can of grey matter marketed for xenochimeras. This one has added tomato sauce."
description_fluff = "As the cartoonish brain with limbs proudly proclaims, \"It's meat. Eat it!\" On the can is printed \"Yummy red stuff!\" and \
under that in infinitely small letters, \"Warning, product must be eaten within two hours of opening. May contain prion disease. \
GrubCo LTD is not liable for any brain damage occuring after consumption of product.\""
trash = /obj/item/trash/brainzsnaxred
canned_open_state = "brainzsnaxred-open"
filling_color = "#a6898d"
center_of_mass = list("x"=15, "y"=9)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red/Initialize()
. = ..()
reagents.add_reagent("red_brain_protein", 10)
//////////////Packaged Food - break open and eat//////////////
/obj/item/weapon/reagent_containers/food/snacks/packaged
@@ -7008,7 +7037,7 @@
/obj/item/weapon/reagent_containers/food/snacks/packaged/meatration/Initialize()
. = ..()
reagents.add_reagent("protein", 3)
reagents.add_reagent("protein", 4)
/obj/item/weapon/reagent_containers/food/snacks/packaged/vegration
name = "veggie ration"

View File

@@ -358,7 +358,7 @@
//BASKETBALL OBJECTS
/obj/item/weapon/beach_ball/holoball
icon = 'icons/obj/basketball.dmi'
icon = 'icons/obj/balls_vr.dmi'
icon_state = "basketball"
name = "basketball"
desc = "Here's your chance, do your dance at the Space Jam."
@@ -370,7 +370,7 @@
/obj/structure/holohoop
name = "basketball hoop"
desc = "Boom, Shakalaka!"
icon = 'icons/obj/basketball.dmi'
icon = 'icons/obj/32x64.dmi'
icon_state = "hoop"
anchored = TRUE
density = TRUE
@@ -406,7 +406,6 @@
return FALSE
return ..()
/obj/machinery/readybutton
name = "Ready Declaration Device"
desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!"

View File

@@ -11,11 +11,13 @@
icon_state = "mining_drill"
circuit = /obj/item/weapon/circuitboard/miningdrill
var/braces_needed = 2
var/list/supports = list()
var/list/obj/machinery/mining/brace/supports = list()
var/supported = 0
var/active = 0
var/list/resource_field = list()
var/obj/item/device/radio/intercom/faultreporter
var/drill_range = 5
var/offset = 2
var/list/ore_types = list(
"hematite" = /obj/item/weapon/ore/iron,
@@ -242,10 +244,14 @@
harvest_speed = 0
capacity = 0
charge_use = 50
drill_range = 5
offset = 2
for(var/obj/item/weapon/stock_parts/P in component_parts)
if(istype(P, /obj/item/weapon/stock_parts/micro_laser))
harvest_speed = P.rating
if(P.rating >= 5)
harvest_speed *= 2
exotic_drilling = P.rating - 1
if(exotic_drilling >= 1)
ore_types |= ore_types_uncommon
@@ -254,6 +260,14 @@
else
ore_types -= ore_types_uncommon
ore_types -= ore_types_rare
if(P.rating > 3) // are we t4+?
// default drill range 5, offset 2
if(P.rating >= 5) // t5
drill_range = 9
offset = 4
else if(P.rating >= 4) // t4
drill_range = 7
offset = 3
if(istype(P, /obj/item/weapon/stock_parts/matter_bin))
capacity = 200 * P.rating
if(istype(P, /obj/item/weapon/stock_parts/capacitor))
@@ -271,8 +285,12 @@
else
anchored = TRUE
if(supports && supports.len >= braces_needed)
supported = 1
if(supports)
if(supports.len >= braces_needed)
supported = 1
else for(var/obj/machinery/mining/brace/check in supports)
if(check.brace_tier > 3)
supported = 1
update_icon()
@@ -293,11 +311,11 @@
var/turf/T = get_turf(src)
if(!istype(T)) return
var/tx = T.x - 2
var/ty = T.y - 2
var/tx = T.x - offset
var/ty = T.y - offset
var/turf/simulated/mine_turf
for(var/iy = 0,iy < 5, iy++)
for(var/ix = 0, ix < 5, ix++)
for(var/iy = 0,iy < drill_range, iy++)
for(var/ix = 0, ix < drill_range, ix++)
mine_turf = locate(tx + ix, ty + iy, T.z)
if(!istype(mine_turf, /turf/space/))
if(mine_turf && mine_turf.has_resources)
@@ -334,12 +352,23 @@
desc = "A machinery brace for an industrial drill. It looks easily two feet thick."
icon_state = "mining_brace"
circuit = /obj/item/weapon/circuitboard/miningdrillbrace
var/brace_tier = 1
var/obj/machinery/mining/drill/connected
/obj/machinery/mining/brace/New()
..()
/obj/machinery/mining/brace/examine(mob/user)
. = ..()
if(brace_tier > 3)
. += SPAN_NOTICE("The internals of the brace look resilient enough to support a drill by itself.")
component_parts = list()
/obj/machinery/mining/brace/Initialize()
. = ..()
default_apply_parts()
/obj/machinery/mining/brace/RefreshParts()
..()
brace_tier = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
brace_tier += M.rating
/obj/machinery/mining/brace/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(connected && connected.active)
@@ -350,6 +379,8 @@
return
if(default_deconstruction_crowbar(user, W))
return
if(default_part_replacement(user,W))
return
if(W.is_wrench())

View File

@@ -246,7 +246,7 @@
slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi',
)
item_state = "c-machete"
w_class = ITEMSIZE_SMALL
w_class = ITEMSIZE_NORMAL
attack_verb = list("cleaved", "chopped", "pulped", "stabbed", "skewered")
can_cleave = TRUE
requires_wield = FALSE

View File

@@ -63,34 +63,33 @@
for(var/ore in stored_ore)
. += "- [stored_ore[ore]] [ore]"
/obj/structure/ore_box/verb/empty_box()
set name = "Empty Ore Box"
set category = "Object"
set src in view(1)
if(!ishuman(usr) && !isrobot(usr)) //Only living, intelligent creatures with gripping aparatti can empty ore boxes.
to_chat(usr, "<span class='warning'>You are physically incapable of emptying the ore box.</span>")
return
if(usr.stat || usr.restrained())
return
if(!Adjacent(usr)) //You can only empty the box if you can physically reach it
to_chat(usr, "You cannot reach the ore box.")
return
add_fingerprint(usr)
if(contents.len < 1)
to_chat(usr, "<span class='warning'>The ore box is empty.</span>")
return
for (var/obj/item/weapon/ore/O in contents)
contents -= O
O.loc = src.loc
to_chat(usr, "<span class='notice'>You empty the ore box.</span>")
return
// /obj/structure/ore_box/verb/empty_box()
// set name = "Empty Ore Box"
// set category = "Object"
// set src in view(1)
//
// if(!ishuman(usr) && !isrobot(usr)) //Only living, intelligent creatures with gripping aparatti can empty ore boxes.
// to_chat(usr, "<span class='warning'>You are physically incapable of emptying the ore box.</span>")
// return
// if(usr.stat || usr.restrained())
// return
//
// if(!Adjacent(usr)) //You can only empty the box if you can physically reach it
// to_chat(usr, "You cannot reach the ore box.")
// return
//
// add_fingerprint(usr)
//
// if(contents.len < 1)
// to_chat(usr, "<span class='warning'>The ore box is empty.</span>")
// return
//
// for (var/obj/item/weapon/ore/O in contents)
// contents -= O
// O.loc = src.loc
// to_chat(usr, "<span class='notice'>You empty the ore box.</span>")
//
// return
/obj/structure/ore_box/ex_act(severity)
if(severity == 1.0 || (severity < 3.0 && prob(50)))

View File

@@ -76,7 +76,7 @@
EQUIPMENT("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 900),
EQUIPMENT("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
EQUIPMENT("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
EQUIPMENT("KA Efficiency Increase", /obj/item/borg/upgrade/modkit/efficiency, 1200),
EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1200),
EQUIPMENT("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
EQUIPMENT("KA Holster", /obj/item/clothing/accessory/holster/waist/kinetic_accelerator, 350),

View File

@@ -7,7 +7,7 @@
colour = "soghun"
key = "q"
machine_understands = 0
flags = RESTRICTED
flags = WHITELISTED // RESTRICTED would make this completely unavailable from character select
syllables = list("hs","zt","kr","st","sh")
/datum/language/diona_local/get_random_name()
@@ -20,7 +20,7 @@
desc = "A complex language known instinctively by Dionaea, 'spoken' by emitting modulated radio waves. This version uses low frequency waves for slow communication at long ranges."
key = "w"
machine_understands = 0
flags = RESTRICTED | HIVEMIND
flags = WHITELISTED | HIVEMIND // RESTRICTED would make this completely unavailable from character select
/datum/language/unathi
name = LANGUAGE_UNATHI

View File

@@ -452,7 +452,7 @@
return treatment_emag
// If they're injured, we're using a beaker, and they don't have on of the chems in the beaker
if(reagent_glass && use_beaker && ((H.getBruteLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getOxyLoss() >= (heal_threshold + 15))))
if(reagent_glass && use_beaker && ((H.getBruteLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getFireLoss() >= heal_threshold) || (H.getOxyLoss() >= (heal_threshold + 15))))
for(var/datum/reagent/R in reagent_glass.reagents.reagent_list)
if(!H.reagents.has_reagent(R))
return 1

View File

@@ -173,7 +173,8 @@ This saves us from having to call add_fingerprint() any time something is put in
if(I.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR))
update_hair(0) //rebuild hair
update_inv_ears(0)
if(internal)
// If this is how the internals are connected, disable them
if(internal && !(head?.item_flags & AIRTIGHT))
if(internals)
internals.icon_state = "internal0"
internal = null

View File

@@ -122,6 +122,7 @@
sleep(5) //The duration of the TP animation
canmove = original_canmove
alpha = initial(alpha)
remove_modifiers_of_type(/datum/modifier/shadekin_phase_vision)
//Potential phase-in vore
if(can_be_drop_pred) //Toggleable in vore panel
@@ -170,6 +171,7 @@
var/obj/effect/temp_visual/shadekin/phase_out/phaseanim = new /obj/effect/temp_visual/shadekin/phase_out(src.loc)
phaseanim.dir = dir
alpha = 0
add_modifier(/datum/modifier/shadekin_phase_vision)
sleep(5)
invisibility = INVISIBILITY_LEVEL_TWO
see_invisible = INVISIBILITY_LEVEL_TWO
@@ -182,6 +184,10 @@
density = FALSE
force_max_speed = TRUE
/datum/modifier/shadekin_phase_vision
name = "Shadekin Phase Vision"
vision_flags = SEE_THRU
//////////////////////////
/// REGENERATE OTHER ///
//////////////////////////

View File

@@ -490,7 +490,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/image/em_block_ears
if(ears_s)
if(ears_s.Height() > face_standing.Height()) // Tol ears
face_standing.Crop(face_standing.Width(), ears_s.Height())
face_standing.Crop(1, 1, face_standing.Width(), ears_s.Height())
face_standing.Blend(ears_s, ICON_OVERLAY)
if(ear_style?.em_block)
em_block_ears = em_block_image_generic(image(ears_s))

View File

@@ -612,7 +612,6 @@
for(var/tech in tech_item.origin_tech)
files.UpdateTech(tech, tech_item.origin_tech[tech])
synced = FALSE
drain(-50 * digested)
if(volume)
water.add_charge(volume)
if(recycles && T.matter)

View File

@@ -124,7 +124,7 @@
vore_icons = 0
/mob/living/simple_mob/animal/space/carp/large/huge
vore_icons = 0
/mob/living/simple_mob/animal/space/carp/holographic
/mob/living/simple_mob/animal/space/carp/holodeck
vore_icons = 0
/* //VOREStation AI Temporary removal

View File

@@ -18,13 +18,13 @@
// Returns TRUE if the stairs are a complete and connected unit, FALSE if a piece is missing or obstructed
// Will attempt to reconnect broken pieces
// Parameters:
// Parameters:
// - B1: Loc of bottom stair
// - B2: Loc of middle stair
// - T1: Openspace over bottom stair
// - T2: Loc of top stair, over middle stair
/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null,
var/obj/structure/stairs/middle/M = null,
/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null,
var/obj/structure/stairs/middle/M = null,
var/obj/structure/stairs/top/T = null,
var/turf/simulated/open/O = null)
@@ -91,14 +91,14 @@
var/obj/structure/stairs/middle/M = null,
var/obj/structure/stairs/top/T = null,
var/turf/simulated/open/O = null)
// In the case where we're provided all the pieces, just try connecting them.
// In order: all exist, they are appropriately adjacent, and they can connect
if(istype(B) && istype(M) && istype(T) && istype(O) && \
B.Adjacent(M) && (GetBelow(O) == get_turf(B)) && T.Adjacent(O) && \
..())
return TRUE
// If we're already configured, just check those
else if(istype(top) && istype(middle))
O = locate(/turf/simulated/open) in GetAbove(src)
@@ -118,7 +118,7 @@
// If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work
// Everything is simply linked in our original direction
if(istype(M) && istype(T) && ..(src, M, T, O))
if(istype(M) && istype(T) && ..(src, M, T, O))
return TRUE
// Else, we have to look in other directions
@@ -127,12 +127,12 @@
T2 = GetAbove(B2)
if(!istype(B2) || !istype(T2))
continue
T = locate(/obj/structure/stairs/top) in T2
M = locate(/obj/structure/stairs/middle) in B2
if(..(src, M, T, O))
return TRUE
// Out of the dir check, we have no valid neighbors, and thus are not complete.
return FALSE
@@ -143,18 +143,18 @@
use_stairs(AM, oldloc)
..()
/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc)
/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc)
// If we're coming from the top of the stairs, don't trap us in an infinite staircase
// Or if we fell down the openspace
if((top in oldloc) || oldloc == GetAbove(src))
return
if(isobserver(AM)) // Ghosts have their own methods for going up and down
return
if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs
return
if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to
return
@@ -173,7 +173,7 @@
pulling |= L.pulling
for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand))
pulling |= G.affecting
// If the stairs aren't broken, go up.
if(check_integrity())
AM.dir = src.dir
@@ -185,7 +185,7 @@
// Move to Top
AM.forceMove(get_turf(top))
// If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays
for(var/atom/movable/P in pulling)
P.forceMove(get_turf(top)) // Just bring it along directly, no fussing with animation timing
@@ -202,16 +202,18 @@
if(isliving(AM))
var/mob/living/L = AM
if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs.
return
if(L.has_buckled_mobs())
return
if(L.buckled)
L.buckled.forceMove(get_turf(top))
L.forceMove(get_turf(top))
// If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so.
if(L.pulling && !L.pulling.anchored)
var/atom/movable/P = L.pulling
@@ -220,8 +222,7 @@
for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand))
G.affecting.forceMove(get_turf(top))
L.forceMove(get_turf(top))
if(L.client)
L.client.Process_Grab()
else
@@ -255,10 +256,10 @@
// These are necessarily fairly similar, but because the positional relations are different, we have to copy-pasta a fair bit
/obj/structure/stairs/middle/check_integrity(var/obj/structure/stairs/bottom/B = null,
var/obj/structure/stairs/middle/M = null,
var/obj/structure/stairs/middle/M = null,
var/obj/structure/stairs/top/T = null,
var/turf/simulated/open/O = null)
// In the case where we're provided all the pieces, just try connecting them.
// In order: all exist, they are appropriately adjacent, and they can connect
if(istype(B) && istype(M) && istype(T) && istype(O) && \
@@ -281,7 +282,7 @@
// Top is static for Middle stair, if it's invalid we can't do much
if(!istype(T))
return FALSE
// If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work
// Everything is simply linked in our original direction
if(istype(B1) && istype(T2) && istype(O) && ..(B, src, T, O))
@@ -293,11 +294,11 @@
O = GetAbove(B1)
if(!istype(B1) || !istype(O))
continue
B = locate(/obj/structure/stairs/bottom) in B1
if(..(B, src, T, O))
return TRUE
// The middle stair has some further special logic, in that it can be climbed, and so is technically valid if only the top exists
// T is enforced by a prior if
T.middle = src
@@ -341,7 +342,7 @@
var/obj/structure/stairs/middle/M = null,
var/obj/structure/stairs/top/T = null,
var/turf/simulated/open/O = null)
// In the case where we're provided all the pieces, just try connecting them.
// In order: all exist, they are appropriately adjacent, and they can connect
if(istype(B) && istype(M) && istype(T) && istype(O) && \
@@ -377,11 +378,11 @@
B1 = GetBelow(O)
if(!istype(B1) || !istype(O))
continue
B = locate(/obj/structure/stairs/bottom) in B1
if((. = ..(B, M, src, O)))
return
// Out of the dir check, we have no valid neighbors, and thus are not complete. `.` was set by ..()
return
@@ -403,13 +404,13 @@
// Or if we climb up the middle
if((bottom in oldloc) || oldloc == GetBelow(src))
return
if(isobserver(AM)) // Ghosts have their own methods for going up and down
return
if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs
return
if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to
return
@@ -428,7 +429,7 @@
pulling |= L.pulling
for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand))
pulling |= G.affecting
// If the stairs aren't broken, go up.
if(check_integrity())
AM.dir = turn(src.dir, 180)
@@ -438,7 +439,7 @@
// Move to Top
AM.forceMove(get_turf(bottom))
// If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays
for(var/atom/movable/P in pulling)
P.forceMove(get_turf(bottom)) // Just bring it along directly, no fussing with animation timing
@@ -455,16 +456,18 @@
if(isliving(AM))
var/mob/living/L = AM
if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs.
return
if(L.has_buckled_mobs())
return
if(L.buckled)
L.buckled.forceMove(get_turf(bottom))
L.forceMove(get_turf(bottom))
// If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so.
if(L.pulling && !L.pulling.anchored)
var/atom/movable/P = L.pulling
@@ -473,8 +476,6 @@
for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand))
G.affecting.forceMove(get_turf(bottom))
L.forceMove(get_turf(bottom))
if(L.client)
L.client.Process_Grab()
@@ -493,14 +494,14 @@
var/turf/B2 = get_turf(src)
var/turf/T1 = GetAbove(B1)
var/turf/T2 = GetAbove(B2)
if(!istype(B1) || !istype(B2))
warning("Stair created at invalid loc: ([loc.x], [loc.y], [loc.z])")
return INITIALIZE_HINT_QDEL
if(!istype(T1) || !istype(T2))
warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])")
return INITIALIZE_HINT_QDEL
// Spawn the stairs
// Railings sold separately
var/turf/simulated/open/O = T1
@@ -516,7 +517,7 @@
B.check_integrity(B, M, T, O)
return INITIALIZE_HINT_QDEL
// For ease of spawning. While you *can* spawn the base type and set its dir, this is useful for adminbus and a little bit quicker to map in
/obj/structure/stairs/spawner/north
dir = NORTH

View File

@@ -14,6 +14,8 @@
throw_speed = 3
throw_range = 5
w_class = ITEMSIZE_NORMAL
/// Are we EMP immune?
var/emp_proof = FALSE
var/static/cell_uid = 1 // Unique ID of this power cell. Used to reduce bunch of uglier code in nanoUI.
var/c_uid
var/charge = 0 // note %age conveted to actual charge in New
@@ -189,6 +191,8 @@
rigged = 1 //broken batterys are dangerous
/obj/item/weapon/cell/emp_act(severity)
if(emp_proof)
return
//remove this once emp changes on dev are merged in
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc

View File

@@ -69,6 +69,9 @@
update_icon()
//CHOMP Add end
/obj/item/weapon/cell/device/weapon/empproof
emp_proof = TRUE
/obj/item/weapon/cell/device/weapon/recharge
name = "self-charging weapon power cell"
desc = "A small power cell designed to power handheld weaponry. This one recharges itself."

View File

@@ -21,6 +21,7 @@
var/recharge_time = 4
var/charge_tick = 0
var/charge_delay = 75 //delay between firing and charging
var/shot_counter = TRUE // does this gun tell you how many shots it has?
var/battery_lock = 0 //If set, weapon cannot switch batteries
@@ -175,14 +176,15 @@
/obj/item/weapon/gun/energy/examine(mob/user)
. = ..()
if(power_supply)
if(charge_cost)
var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia
. += "Has [shots_remaining] shot\s remaining."
if(shot_counter)
if(power_supply)
if(charge_cost)
var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia
. += "Has [shots_remaining] shot\s remaining."
else
. += "Has infinite shots remaining."
else
. += "Has infinite shots remaining."
else
. += "Does not have a power cell."
. += "Does not have a power cell."
/obj/item/weapon/gun/energy/update_icon(var/ignore_inhands)
if(power_supply == null)

View File

@@ -1,51 +1,126 @@
#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
#define HEATMODE_ATMOSPHERE 312.1 //kPa. basically virgo 2's
#define HEATMODE_TEMP 612 //kelvin. basically virgo 2's
/**
* This is here for now
*/
/proc/lavaland_environment_check(turf/simulated/T)
. = TRUE
if(!istype(T))
return
var/datum/gas_mixture/environment = T.return_air()
if(!istype(environment))
return
var/pressure = environment.return_pressure()
if(pressure > LAVALAND_EQUIPMENT_EFFECT_PRESSURE)
. = FALSE
if(environment.temperature < (T20C - 30))
. = TRUE
/proc/virgotwo_environment_check(turf/simulated/T)
. = TRUE
if(!istype(T))
return
var/datum/gas_mixture/environment = T.return_air()
if(!istype(environment))
return
var/pressure = environment.return_pressure()
if(pressure < HEATMODE_ATMOSPHERE - 20)
. = FALSE
if(environment.temperature > HEATMODE_TEMP - 30)
. = TRUE
/obj/item/weapon/gun/energy/kinetic_accelerator
name = "proto-kinetic accelerator"
desc = "A self recharging, ranged mining tool that does increased damage in low temperature. Capable of holding up to six slots worth of mod kits."
desc = "A self recharging, ranged mining tool that does increased damage in low pressure."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "kineticgun"
item_state = "kineticgun"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi')
slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi',
)
item_state = "kineticgun"
// ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
cell_type = /obj/item/weapon/cell/device/weapon/empproof
item_flags = NONE
charge_meter = FALSE
// obj_flags = UNIQUE_RENAME
// weapon_weight = WEAPON_LIGHT
// can_flashlight = 1
// flight_x_offset = 15
// flight_y_offset = 9
// automatic_charge_overlays = FALSE
projectile_type = /obj/item/projectile/kinetic
origin_tech = list(TECH_COMBAT = 3, TECH_POWER = 3, TECH_ENGINEERING = 3)
can_flashlight = TRUE
flight_x_offset = 15
flight_y_offset = 9
charge_cost = 120 // 20 shots on weapon power cell
fire_delay = 16
self_recharge = TRUE
recharge_time = 10 // every 20*2 seconds will get 20% power restored
charge_cost = 1200
battery_lock = TRUE
fire_sound = 'sound/weapons/kenetic_accel.ogg'
var/overheat_time = 16
var/holds_charge = FALSE
var/unique_frequency = FALSE // modified by KA modkits
var/overheat = FALSE
var/emptystate = "kineticgun_empty"
shot_counter = FALSE
// can_bayonet = TRUE
// knife_x_offset = 20
// knife_y_offset = 12
var/max_mod_capacity = 100
var/list/modkits = list()
var/empty_state = "kineticgun_empty"
var/recharge_timerid
/obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile()
if(overheat)
return
. = ..()
if(.)
var/obj/item/projectile/P = .
modify_projectile(P)
/obj/item/weapon/gun/energy/kinetic_accelerator/handle_post_fire(mob/user, atom/target, pointblank, reflex)
. = ..()
attempt_reload()
/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka
name = "premium accelerator"
desc = "A premium kinetic accelerator fitted with an extended barrel and increased pressure tank."
icon_state = "premiumgun"
item_state = "premiumgun"
projectile_type = /obj/item/projectile/kinetic/premium
/obj/item/weapon/gun/energy/kinetic_accelerator/examine(mob/user)
. = ..()
if(Adjacent(user) && max_mod_capacity)
if(max_mod_capacity)
. += "<b>[get_remaining_mod_capacity()]%</b> mod capacity remaining."
for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits())
. += "<span class='notice'>There is a [M.name] mod installed, using <b>[M.cost]%</b> capacity.</span>"
for(var/A in get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
. += "<span class='notice'>There is \a [M] installed, using <b>[M.cost]%</b> capacity.</span>"
/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user)
if(istype(A, /obj/item/weapon/tool/crowbar))
/obj/item/weapon/gun/energy/kinetic_accelerator/Exited(atom/movable/AM)
. = ..()
if((AM in modkits) && istype(AM, /obj/item/borg/upgrade/modkit))
var/obj/item/borg/upgrade/modkit/M = AM
M.uninstall(src, FALSE)
/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user)
if(I.has_tool_quality(TOOL_CROWBAR))
if(modkits.len)
to_chat(user, "<span class='notice'>You pry the modifications out.</span>")
playsound(src, A.usesound, 100, 1)
playsound(loc, I.usesound, 100, 1)
for(var/obj/item/borg/upgrade/modkit/M in modkits)
M.uninstall(src)
else
to_chat(user, "<span class='notice'>There are no modifications currently installed.</span>")
else if(istype(A, /obj/item/borg/upgrade/modkit))
var/obj/item/borg/upgrade/modkit/MK = A
if(istype(I, /obj/item/borg/upgrade/modkit))
var/obj/item/borg/upgrade/modkit/MK = I
MK.install(src, user)
else
..()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity()
var/current_capacity_used = 0
for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits())
for(var/A in get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
current_capacity_used += M.cost
return max_mod_capacity - current_capacity_used
@@ -55,134 +130,243 @@
. += A
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K)
for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits())
K.kinetic_gun = src //do something special on-hit, easy!
for(var/A in get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
M.modify_projectile(K)
/obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile()
var/obj/item/projectile/kinetic/BB = ..()
if(!istype(BB))
return
modify_projectile(BB)
/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
holds_charge = TRUE
unique_frequency = TRUE
var/turf/proj_turf = get_turf(src)
if(!isturf(proj_turf))
return
var/datum/gas_mixture/environment = proj_turf.return_air()
if(environment.temperature > 250)
BB.name = "weakened [BB.name]"
BB.damage *= BB.pressure_decrease
return BB
/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/Destroy()
for(var/obj/item/borg/upgrade/modkit/M in modkits)
M.uninstall(src)
return ..()
/obj/item/weapon/gun/energy/kinetic_accelerator/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0)
/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka/cyborg
holds_charge = TRUE
unique_frequency = TRUE
/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka/cyborg/Destroy()
for(var/obj/item/borg/upgrade/modkit/M in modkits)
M.uninstall(src)
return ..()
/obj/item/weapon/gun/energy/kinetic_accelerator/minebot
// trigger_guard = TRIGGER_GUARD_ALLOW_ALL
overheat_time = 20
holds_charge = TRUE
unique_frequency = TRUE
/obj/item/weapon/gun/energy/kinetic_accelerator/Initialize()
. = ..()
spawn(fire_delay)
if(power_supply && power_supply.check_charge(charge_cost))
playsound(src, 'sound/weapons/kenetic_reload.ogg', 60, 1)
if(!holds_charge)
empty()
AddElement(/datum/element/conflict_checking, CONFLICT_ELEMENT_KA)
/obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user)
. = ..()
if(power_supply.charge < charge_cost)
attempt_reload()
/obj/item/weapon/gun/energy/kinetic_accelerator/dropped(mob/user)
. = ..()
if(!QDELING(src) && !holds_charge)
// Put it on a delay because moving item from slot to hand
// calls dropped().
addtimer(CALLBACK(src, .proc/empty_if_not_held), 2)
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty_if_not_held()
if(!ismob(loc) && !istype(loc, /obj/item/integrated_circuit))
empty()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
if(power_supply)
power_supply.use(power_supply.charge)
update_icon()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time)
if(!power_supply)
return
if(overheat)
return
if(!recharge_time)
recharge_time = overheat_time
overheat = TRUE
update_icon()
var/carried = max(1, loc.ConflictElementCount(CONFLICT_ELEMENT_KA))
deltimer(recharge_timerid)
recharge_timerid = addtimer(CALLBACK(src, .proc/reload), recharge_time * carried, TIMER_STOPPABLE)
/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
return
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
power_supply.give(power_supply.maxcharge)
// process_chamber()
// if(!suppressed)
playsound(src, 'sound/weapons/kenetic_reload.ogg', 60, 1)
// else
// to_chat(loc, "<span class='warning'>[src] silently charges up.</span>")
overheat = FALSE
update_icon()
/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
cut_overlays()
if(!power_supply || !power_supply.check_charge(charge_cost))
add_overlay(empty_state)
if(can_flashlight)
var/iconF = "flight"
if(gun_light)
iconF = "flight_on"
add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
if(overheat || (power_supply.charge == 0))
add_overlay(emptystate)
#define KA_ENVIRO_TYPE_COLD 0
#define KA_ENVIRO_TYPE_HOT 1
//Projectiles
/obj/item/projectile/kinetic
name = "kinetic force"
icon = 'icons/obj/projectiles_vr.dmi'
icon_state = null
damage = 32
damage = 30
damage_type = BRUTE
check_armour = "bomb"
range = 3 // Our "range" var is named "kill_count". Yes it is.
range = 4
// log_override = TRUE
var/pressure_decrease = 0.25
var/turf_aoe = FALSE
var/mob_aoe = FALSE
var/list/hit_overlays = list()
var/pressure_decrease_active = FALSE
var/pressure_decrease = 1/3
var/environment = KA_ENVIRO_TYPE_COLD
var/obj/item/weapon/gun/energy/kinetic_accelerator/kinetic_gun
// /obj/item/projectile/kinetic/pod
// kill_count = 4
//
// /obj/item/projectile/kinetic/pod/regular
// damage = 50
// pressure_decrease = 0.5
//
// /obj/item/projectile/kinetic/pod/enhanced
// turf_aoe = TRUE
// mob_aoe = TRUE
/obj/item/projectile/kinetic/premium
damage = 40
damage_type = BRUTE
range = 5
/obj/item/projectile/kinetic/on_impact(var/atom/A)
strike_thing(A)
. = ..()
/obj/item/projectile/kinetic/Destroy()
kinetic_gun = null
return ..()
/obj/item/projectile/kinetic/on_hit(var/atom/target)
/obj/item/projectile/kinetic/Bump(atom/target)
if(kinetic_gun)
var/list/mods = kinetic_gun.get_modkits()
for(var/obj/item/borg/upgrade/modkit/M in mods)
M.projectile_prehit(src, target, kinetic_gun)
if(!pressure_decrease_active)
if(environment == KA_ENVIRO_TYPE_COLD)
if(!lavaland_environment_check(get_turf(src)))
name = "weakened [name]"
damage = damage * pressure_decrease
pressure_decrease_active = TRUE
else if(environment == KA_ENVIRO_TYPE_HOT)
if(!virgotwo_environment_check(get_turf(src)))
name = "weakened [name]"
damage = damage * pressure_decrease
pressure_decrease_active = TRUE
return ..()
/obj/item/projectile/kinetic/attack_mob(mob/living/target_mob, distance, miss_modifier)
if(!pressure_decrease_active)
if(environment == KA_ENVIRO_TYPE_COLD)
if(!lavaland_environment_check(get_turf(src)))
name = "weakened [name]"
damage = damage * pressure_decrease
pressure_decrease_active = TRUE
else if(environment == KA_ENVIRO_TYPE_HOT)
if(!virgotwo_environment_check(get_turf(src)))
name = "weakened [name]"
damage = damage * pressure_decrease
pressure_decrease_active = TRUE
return ..()
/obj/item/projectile/kinetic/on_range()
strike_thing()
..()
/obj/item/projectile/kinetic/on_hit(atom/target)
strike_thing(target)
. = ..()
/obj/item/projectile/kinetic/on_impact(atom/A)
. = ..()
strike_thing(A)
/obj/item/projectile/kinetic/proc/strike_thing(atom/target)
if(!pressure_decrease_active)
if(environment == KA_ENVIRO_TYPE_COLD)
if(!lavaland_environment_check(get_turf(src)))
name = "weakened [name]"
damage = damage * pressure_decrease
pressure_decrease_active = TRUE
else if(environment == KA_ENVIRO_TYPE_HOT)
if(!virgotwo_environment_check(get_turf(src)))
name = "weakened [name]"
damage = damage * pressure_decrease
pressure_decrease_active = TRUE
var/turf/target_turf = get_turf(target)
if(!target_turf)
target_turf = get_turf(src)
if(istype(target_turf, /turf/simulated/mineral))
if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate.
var/list/mods = kinetic_gun.get_modkits()
for(var/obj/item/borg/upgrade/modkit/M in mods)
M.projectile_strike_predamage(src, target_turf, target, kinetic_gun)
for(var/obj/item/borg/upgrade/modkit/M in mods)
M.projectile_strike(src, target_turf, target, kinetic_gun)
if(ismineralturf(target_turf))
var/turf/simulated/mineral/M = target_turf
M.GetDrilled()
M.GetDrilled(TRUE)
var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf)
K.color = color
for(var/type in hit_overlays)
new type(target_turf)
if(turf_aoe)
for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
if(istype(T, /turf/simulated/mineral))
var/turf/simulated/mineral/M = T
M.GetDrilled()
if(mob_aoe)
for(var/mob/living/L in range(1, target_turf) - firer - target)
var/armor = L.run_armor_check(def_zone, check_armour)
L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor)
to_chat(L, "<span class='userdanger'>You're struck by a [name]!</span>")
//Modkits
/obj/item/borg/upgrade/modkit
name = "modification kit"
name = "kinetic accelerator modification kit"
desc = "An upgrade for kinetic accelerators."
icon = 'icons/obj/objects_vr.dmi'
icon_state = "modkit"
origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 4)
w_class = ITEMSIZE_SMALL
require_module = 1
// var/module_type = /obj/item/robot_module/miner
usesound = 'sound/items/Screwdriver.ogg'
// module_type = list(/obj/item/robot_module/miner)
var/denied_type = null
var/maximum_of_type = 1
var/cost = 30
var/modifier = 1 //For use in any mod kit that has numerical modifiers
var/minebot_upgrade = TRUE
var/minebot_exclusive = FALSE
/obj/item/borg/upgrade/modkit/examine(mob/user)
. = ..()
if(Adjacent(user))
. += "<span class='notice'>Occupies <b>[cost]%</b> of mod capacity.</span>"
. += "<span class='notice'>Occupies <b>[cost]%</b> of mod capacity.</span>"
/obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user)
if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator) && !issilicon(user))
if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator))
install(A, user)
else
..()
/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R)
if(..())
return
/*
/obj/item/borg/upgrade/modkit/afterInstall(mob/living/silicon/robot/R)
for(var/obj/item/weapon/gun/energy/kinetic_accelerator/H in R.module.modules)
return install(H, usr)
if(install(H, R)) //It worked
return
to_chat(R, "<span class='alert'>Upgrade error - Aborting Kinetic Accelerator linking.</span>") //No applicable KA found, insufficient capacity, or some other problem.
*/
/obj/item/borg/upgrade/modkit/proc/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
. = TRUE
if(src in KA.modkits) // Sanity check to prevent installing the same modkit twice thanks to occasional click/lag delays.
return FALSE
// if(minebot_upgrade)
// if(minebot_exclusive && !istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone))
// to_chat(user, "<span class='notice'>The modkit you're trying to install is only rated for minebot use.</span>")
// return FALSE
// else if(istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone))
// to_chat(user, "<span class='notice'>The modkit you're trying to install is not rated for minebot use.</span>")
// return FALSE
if(denied_type)
var/number_of_denied = 0
for(var/obj/item/borg/upgrade/modkit/M as anything in KA.get_modkits())
for(var/A in KA.get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
if(istype(M, denied_type))
number_of_denied++
if(number_of_denied >= maximum_of_type)
@@ -190,10 +374,11 @@
break
if(KA.get_remaining_mod_capacity() >= cost)
if(.)
user.drop_from_inventory(src, KA)
// if(!user.transferItemToLoc(src, KA))
// return FALSE
to_chat(user, "<span class='notice'>You install the modkit.</span>")
playsound(src, usesound, 100, 1)
user.unEquip(src)
forceMove(KA)
playsound(loc, 'sound/items/screwdriver.ogg', 100, 1)
KA.modkits += src
else
to_chat(user, "<span class='notice'>The modkit you're trying to install would conflict with an already installed modkit. Use a crowbar to remove existing modkits.</span>")
@@ -201,19 +386,26 @@
to_chat(user, "<span class='notice'>You don't have room(<b>[KA.get_remaining_mod_capacity()]%</b> remaining, [cost]% needed) to install this modkit. Use a crowbar to remove existing modkits.</span>")
. = FALSE
/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
forceMove(get_turf(KA))
/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA, forcemove = TRUE)
KA.modkits -= src
if(forcemove)
forceMove(get_turf(KA))
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
return
//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure
/obj/item/borg/upgrade/modkit/proc/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
//use this one for effects you want to trigger before mods that do damage
/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
//and this one for things that don't need to trigger before other damage-dealing mods
/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
//Range
/obj/item/borg/upgrade/modkit/range
name = "range increase"
desc = "Increases the range of a kinetic accelerator when installed."
modifier = 1
cost = 24 //so you can fit four plus a tracer cosmetic
cost = 25
/obj/item/borg/upgrade/modkit/range/modify_projectile(obj/item/projectile/kinetic/K)
K.range += modifier
@@ -228,55 +420,87 @@
/obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/item/projectile/kinetic/K)
K.damage += modifier
//Cooldown - CHOMPstation re-addition start
//Cooldown
/obj/item/borg/upgrade/modkit/cooldown
name = "cooldown decrease"
desc = "Decreases the cooldown of a kinetic accelerator."
desc = "Decreases the cooldown of a kinetic accelerator. Not rated for minebot use."
modifier = 2.5
minebot_upgrade = FALSE
var/decreased
/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
. = ..()
if(.)
KA.fire_delay -= modifier
var/old = KA.overheat_time
KA.overheat_time = max(0, KA.overheat_time - modifier)
decreased = old - KA.overheat_time
/obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
KA.fire_delay += modifier
KA.overheat_time += decreased
..()
//Cooldown - CHOMPstation re-addition end
/obj/item/borg/upgrade/modkit/efficiency
name = "energy efficiency"
desc = "Decreases the energy use of a kinetic accelerator."
modifier = 20
/obj/item/borg/upgrade/modkit/cooldown/minebot
name = "minebot cooldown decrease"
desc = "Decreases the cooldown of a kinetic accelerator. Only rated for minebot use."
icon_state = "door_electronics"
icon = 'icons/obj/module.dmi'
denied_type = /obj/item/borg/upgrade/modkit/cooldown/minebot
modifier = 10
cost = 0
minebot_upgrade = TRUE
minebot_exclusive = TRUE
/obj/item/borg/upgrade/modkit/efficiency/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
. = ..()
if(.)
KA.charge_cost -= modifier
/obj/item/borg/upgrade/modkit/efficiency/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
KA.charge_cost += modifier
..()
//AoE blasts
/obj/item/borg/upgrade/modkit/aoe
modifier = 0
var/turf_aoe = FALSE
var/stats_stolen = FALSE
/obj/item/borg/upgrade/modkit/aoe/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
. = ..()
if(.)
for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits) //make sure only one of the aoe modules has values if somebody has multiple
if(AOE.stats_stolen || AOE == src)
continue
modifier += AOE.modifier //take its modifiers
AOE.modifier = 0
turf_aoe += AOE.turf_aoe
AOE.turf_aoe = FALSE
AOE.stats_stolen = TRUE
/obj/item/borg/upgrade/modkit/aoe/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
..()
modifier = initial(modifier) //get our modifiers back
turf_aoe = initial(turf_aoe)
stats_stolen = FALSE
/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K)
K.name = "kinetic explosion"
if(!K.turf_aoe && !K.mob_aoe)
K.hit_overlays += /obj/effect/temp_visual/explosion/fast
K.mob_aoe += modifier
/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
if(stats_stolen)
return
new /obj/effect/temp_visual/explosion/fast(target_turf)
if(turf_aoe)
for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
if(ismineralturf(T))
var/turf/simulated/mineral/M = T
M.GetDrilled(TRUE)
if(modifier)
for(var/mob/living/L in range(1, target_turf) - K.firer - target)
var/armor = L.run_armor_check(K.def_zone, K.check_armour)
// var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration)
L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor)
// L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor)
to_chat(L, "<span class='userdanger'>You're struck by a [K.name]!</span>")
/obj/item/borg/upgrade/modkit/aoe/turfs
name = "mining explosion"
desc = "Causes the kinetic accelerator to destroy rock in an AoE."
denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs
/obj/item/borg/upgrade/modkit/aoe/turfs/modify_projectile(obj/item/projectile/kinetic/K)
..()
K.turf_aoe = TRUE
turf_aoe = TRUE
/obj/item/borg/upgrade/modkit/aoe/turfs/andmobs
name = "offensive mining explosion"
@@ -289,19 +513,150 @@
desc = "Causes the kinetic accelerator to damage mobs in an AoE."
modifier = 0.2
//Minebot passthrough
/obj/item/borg/upgrade/modkit/minebot_passthrough
name = "minebot passthrough"
desc = "Causes kinetic accelerator shots to pass through minebots."
cost = 0
//Tendril-unique modules
/obj/item/borg/upgrade/modkit/cooldown/repeater
name = "rapid repeater"
desc = "Quarters the kinetic accelerator's cooldown on striking a living target, but greatly increases the base cooldown."
denied_type = /obj/item/borg/upgrade/modkit/cooldown/repeater
modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss.
cost = 50
/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
var/valid_repeat = FALSE
if(isliving(target))
var/mob/living/L = target
if(L.stat != DEAD)
valid_repeat = TRUE
if(ismineralturf(target_turf))
valid_repeat = TRUE
if(valid_repeat)
KA.overheat = FALSE
KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds.
/*
/obj/item/borg/upgrade/modkit/lifesteal
name = "lifesteal crystal"
desc = "Causes kinetic accelerator shots to slightly heal the firer on striking a living target."
icon_state = "modkit_crystal"
modifier = 2.5 //Not a very effective method of healing.
cost = 20
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
/obj/item/borg/upgrade/modkit/lifesteal/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
if(isliving(target) && isliving(K.firer))
var/mob/living/L = target
if(L.stat == DEAD)
return
L = K.firer
L.heal_ordered_damage(modifier, damage_heal_order)
*/
/obj/item/borg/upgrade/modkit/resonator_blasts
name = "resonator blast"
desc = "Causes kinetic accelerator shots to leave and detonate resonator blasts."
denied_type = /obj/item/borg/upgrade/modkit/resonator_blasts
cost = 30
modifier = 0.25 //A bonus 15 damage if you burst the field on a target, 60 if you lure them into it.
/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
if(target_turf && !ismineralturf(target_turf)) //Don't make fields on mineral turfs.
var/obj/effect/resonance/R = locate(/obj/effect/resonance) in target_turf
if(R)
R.resonance_damage *= modifier
R.burst()
return
new /obj/effect/resonance(target_turf, K.firer, 30)
/*
/obj/item/borg/upgrade/modkit/bounty
name = "death syphon"
desc = "Killing or assisting in killing a creature permanently increases your damage against that type of creature."
denied_type = /obj/item/borg/upgrade/modkit/bounty
modifier = 1.25
cost = 30
var/maximum_bounty = 25
var/list/bounties_reaped = list()
/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
if(isliving(target))
var/mob/living/L = target
var/list/existing_marks = L.has_status_effect_list(STATUS_EFFECT_SYPHONMARK)
for(var/i in existing_marks)
var/datum/status_effect/syphon_mark/SM = i
if(SM.reward_target == src) //we want to allow multiple people with bounty modkits to use them, but we need to replace our own marks so we don't multi-reward
SM.reward_target = null
qdel(SM)
L.apply_status_effect(STATUS_EFFECT_SYPHONMARK, src)
/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
if(isliving(target))
var/mob/living/L = target
if(bounties_reaped[L.type])
var/kill_modifier = 1
if(K.pressure_decrease_active)
kill_modifier *= K.pressure_decrease
var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration)
L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor)
/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L)
var/bonus_mod = 1
if(ismegafauna(L)) //megafauna reward
bonus_mod = 4
if(!bounties_reaped[L.type])
bounties_reaped[L.type] = min(modifier * bonus_mod, maximum_bounty)
else
bounties_reaped[L.type] = min(bounties_reaped[L.type] + (modifier * bonus_mod), maximum_bounty)
*/
//Indoors
/obj/item/borg/upgrade/modkit/indoors
name = "decrease pressure penalty"
desc = "Increases the damage a kinetic accelerator does in a high pressure environment."
desc = "A remarkably illegal modification kit that increases the damage a kinetic accelerator does in pressurized environments."
modifier = 2
denied_type = /obj/item/borg/upgrade/modkit/indoors
maximum_of_type = 2
cost = 40
cost = 35
/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K)
K.pressure_decrease *= modifier
// Atmospheric
/obj/item/borg/upgrade/modkit/heater
name = "temperature modulator"
desc = "A remarkably unusual modification kit that makes kinetic accelerators more usable in hot, overpressurized environments, \
in exchange for making them weak elsewhere, like the cold or in space."
denied_type = /obj/item/borg/upgrade/modkit/indoors
maximum_of_type = 1
cost = 30
/obj/item/borg/upgrade/modkit/heater/modify_projectile(obj/item/projectile/kinetic/K)
K.environment = KA_ENVIRO_TYPE_HOT
//Trigger Guard
/*
/obj/item/borg/upgrade/modkit/trigger_guard
name = "modified trigger guard"
desc = "Allows creatures normally incapable of firing guns to operate the weapon when installed."
cost = 20
denied_type = /obj/item/borg/upgrade/modkit/trigger_guard
/obj/item/borg/upgrade/modkit/trigger_guard/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
. = ..()
if(.)
KA.trigger_guard = TRIGGER_GUARD_ALLOW_ALL
/obj/item/borg/upgrade/modkit/trigger_guard/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
KA.trigger_guard = TRIGGER_GUARD_NORMAL
..()
*/
//Cosmetic
/obj/item/borg/upgrade/modkit/chassis_mod
@@ -342,7 +697,7 @@
/obj/item/borg/upgrade/modkit/tracer/adjustable
name = "adjustable tracer bolts"
desc = "Causes kinetic accelerator bolts to have a adjustably-colored tracer trail and explosion. Use in-hand to change color."
desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color."
/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user)
bolt_color = input(user,"Choose Color") as color
bolt_color = input(user,"","Choose Color",bolt_color) as color|null

View File

@@ -36,7 +36,7 @@
if(rockets.len)
var/obj/item/ammo_casing/rocket/I = rockets[1]
rockets -= I
return
return new I.projectile_type(src)
return null
/obj/item/weapon/gun/launcher/rocket/handle_post_fire(mob/user, atom/target)

View File

@@ -316,6 +316,13 @@
color = "#664330"
allergen_type = ALLERGEN_FISH //Murkfin is fish
/datum/reagent/nutriment/protein/bean
name = "beans"
id = "bean_protein"
taste_description = "beans"
color = "#562e0b"
allergen_type = ALLERGEN_BEANS //Made from soy beans
/datum/reagent/nutriment/honey
name = "Honey"
id = "honey"

View File

@@ -155,15 +155,12 @@
if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein
M.adjust_nutrition(alt_nutriment_factor * removed)
/datum/reagent/nutriment/magicdust/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
playsound(M, 'sound/items/hooh.ogg', 50, 1, -1)
if(prob(5))
to_chat(M, "<span class='warning'>You feel like you've been gnomed...</span>")
/datum/reagent/ethanol/galacticpanic
name = "Galactic Panic Attack"
id = "galacticpanic"
@@ -515,4 +512,34 @@
glass_name = "Shambler's Juice"
glass_desc = "A glass of something shambly"
glass_special = list(DRINK_FIZZ)
glass_special = list(DRINK_FIZZ)
////////////////START BrainzSnax Reagents////////////////
/datum/reagent/nutriment/protein/brainzsnax
name = "grey matter"
id = "brain_protein"
taste_description = "fatty, mushy meat and allspice"
color = "#caa3c9"
/datum/reagent/nutriment/protein/brainzsnax/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
if(prob(5) && !(alien == IS_CHIMERA || alien == IS_SLIME || alien == IS_PLANT || alien == IS_DIONA || alien == IS_SHADEKIN && !M.isSynthetic()))
M.adjustBrainLoss(removed) //Any other species risks prion disease.
M.Confuse(5)
M.hallucination = max(M.hallucination, 25)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.feral > 0 && H.nutrition > 100 && H.traumatic_shock < min(60, H.nutrition/10) && H.jitteriness < 100) //Same check as feral triggers to stop them immediately re-feralling
H.feral -= removed * 3 //Should calm them down quick, provided they're actually in a state to STAY calm.
if(H.feral <=0) //Check if they're unferalled
H.feral = 0
to_chat(H, "<span class='info'>Your mind starts to clear, soothed into a state of clarity as your senses return.</span>")
log_and_message_admins("is no longer feral.", H)
/datum/reagent/nutriment/protein/brainzsnax/red
id = "red_brain_protein"
taste_description = "fatty, mushy meat and cheap tomato sauce"
color = "#a6898d"
////////////////END BrainzSnax Reagents////////////////

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 876 B

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 867 B

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 947 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 67 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -473,6 +473,5 @@ var/global/list/latejoin_tram = list()
prob_fall = 50
mobs_to_pick_from = list(
/mob/living/simple_mob/animal/passive/gaslamp = 300,
/mob/living/simple_mob/animal/space/goose/virgo3b = 100,
/mob/living/simple_mob/vore/alienanimals/teppi = 5
/mob/living/simple_mob/vore/alienanimals/teppi = 4
)

View File

@@ -219,14 +219,9 @@ var/list/all_maps = list()
// Get a list of 'nearby' or 'connected' zlevels.
// You should at least return a list with the given z if nothing else.
/datum/map/proc/get_map_levels(var/srcz, var/long_range = FALSE, var/om_range = -1)
//Overmap behavior
if(use_overmap)
//Get what sector we're in
var/obj/effect/overmap/visitable/O = get_overmap_sector(srcz)
if(!istype(O))
//Not in a sector, just the passed zlevel
return list(srcz)
//Get what sector we're in
var/obj/effect/overmap/visitable/O = get_overmap_sector(srcz)
if(istype(O))
//Just the sector we're in
if(om_range == -1)
return O.map_z.Copy()
@@ -239,7 +234,7 @@ var/list/all_maps = list()
connections += V.map_z // Adding list to list adds contents
return connections
//Traditional behavior
//Traditional behavior, if not in an overmap sector
else
//If long range, and they're at least in contact levels, return contact levels.
if (long_range && (srcz in contact_levels))

BIN
sound/weapons/dodgeball.ogg Normal file

Binary file not shown.

View File

@@ -1230,7 +1230,6 @@
#include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flash_vr.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\flashlight_vr.dm"
#include "code\game\objects\items\devices\floor_painter.dm"
#include "code\game\objects\items\devices\geiger.dm"
#include "code\game\objects\items\devices\gps.dm"
@@ -1497,6 +1496,7 @@
#include "code\game\objects\items\weapons\tanks\tank_types.dm"
#include "code\game\objects\items\weapons\tanks\tank_types_vr.dm"
#include "code\game\objects\items\weapons\tanks\tanks.dm"
#include "code\game\objects\items\weapons\tools\brass.dm"
#include "code\game\objects\items\weapons\tools\crowbar.dm"
#include "code\game\objects\items\weapons\tools\crowbar_vr.dm"
#include "code\game\objects\items\weapons\tools\screwdriver.dm"