Merge branch 'master' into upstream-merge-11715
@@ -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"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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'
|
||||
@@ -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)]"
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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!"
|
||||
|
||||
32
code/game/objects/items/weapons/tools/brass.dm
Normal 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)
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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. \
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -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())
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ///
|
||||
//////////////////////////
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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////////////////
|
||||
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 876 B After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 867 B After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 264 KiB After Width: | Height: | Size: 264 KiB |
|
Before Width: | Height: | Size: 947 B After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
BIN
icons/turf/fancy_shuttles/tether_cargo.dmi
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
icons/turf/fancy_shuttles/tether_cargo_preview.dmi
Normal file
|
After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 67 KiB |
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
@@ -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"
|
||||
|
||||