Merge branch 'master' into upstream-merge-12164

This commit is contained in:
Nadyr
2022-02-06 21:38:32 -05:00
committed by GitHub
37 changed files with 50102 additions and 50247 deletions
@@ -88,7 +88,8 @@
/datum/category_item/player_setup_item/general/flavor/proc/SetFlavorText(mob/user)
var/HTML = "<body>"
HTML += "<tt><center>"
HTML += "<b>Set Flavour Text</b> <hr />"
HTML += "<b>Set Flavor Text</b> <hr />"
HTML += "Note: This is not *literal* flavor of your character. This is visual description of what they look like. <hr />"
HTML += "<br></center>"
HTML += "<a href='?src=\ref[src];flavor_text=general'>General:</a> "
HTML += TextPreview(pref.flavor_texts["general"])
@@ -1216,3 +1216,9 @@
display_name = "Nehi's Radio"
ckeywhitelist = list("zodiacshadow")
character_name = list("Nehi Maximus")
/datum/gear/fluff/lucky_amour
path = /obj/item/device/modkit_conversion/crusader_luck
display_name = "Lucky's amour"
ckeywhitelist = list ("thedavestdave")
character_name = list("Lucky")
+219
View File
@@ -0,0 +1,219 @@
/obj/machinery/item_bank
name = "electronic lockbox"
desc = "A place to store things you might want later!"
icon = 'icons/obj/stationobjs_vr.dmi'
icon_state = "item_bank"
idle_power_usage = 1
active_power_usage = 5
anchored = TRUE
density = FALSE
var/busy_bank = FALSE
var/static/list/item_takers = list()
/obj/machinery/item_bank/proc/persist_item_savefile_path(mob/user)
return "data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/persist_item.sav"
/obj/machinery/item_bank/proc/persist_item_savefile_save(mob/user, obj/item/O)
if(IsGuestKey(user.key))
return 0
var/savefile/F = new /savefile(src.persist_item_savefile_path(user))
F["persist item"] << O.type
F["persist name"] << initial(O.name)
return 1
/obj/machinery/item_bank/proc/persist_item_savefile_load(mob/user, thing)
if (IsGuestKey(user.key))
return 0
var/path = src.persist_item_savefile_path(user)
if (!fexists(path))
return 0
var/savefile/F = new /savefile(path)
if(!F) return 0
var/persist_item
F["persist item"] >> persist_item
if (isnull(persist_item) || !ispath(persist_item))
fdel(path)
tgui_alert_async(user, "An item could not be retrieved.")
return 0
if(thing == "type")
return persist_item
if(thing == "name")
var/persist_name
F["persist name"] >> persist_name
return persist_name
/obj/machinery/item_bank/Initialize()
. = ..()
/obj/machinery/item_bank/attack_hand(mob/living/user)
. = ..()
if(!ishuman(user))
return
if(istype(user) && Adjacent(user))
if(inoperable() || panel_open)
to_chat(user, "<span class='warning'>\The [src] seems to be nonfunctional...</span>")
else
start_using(user)
/obj/machinery/item_bank/proc/start_using(mob/living/user)
if(!ishuman(user))
return
if(busy_bank)
to_chat(user, "<span class='warning'>\The [src] is already in use.</span>")
return
busy_bank = TRUE
var/I = persist_item_savefile_load(user, "type")
var/Iname = persist_item_savefile_load(user, "name")
var/choice = tgui_alert(user, "What would you like to do [src]?", "[src]", list("Check contents", "Retrieve item", "Info", "Cancel"), timeout = 10 SECONDS)
if(!choice || choice == "Cancel" || !Adjacent(user) || inoperable() || panel_open)
busy_bank = FALSE
return
else if(choice == "Check contents" && I)
to_chat(user, "<span class='notice'>\The [src] has \the [Iname] for you!</span>")
busy_bank = FALSE
else if(choice == "Retrieve item" && I)
if(user.hands_are_full())
to_chat(user,"<span class='notice'>Your hands are full!</span>")
busy_bank = FALSE
return
if(user.ckey in item_takers)
to_chat(user, "<span class='warning'>You have already taken something out of \the [src] this shift.</span>")
busy_bank = FALSE
return
choice = tgui_alert(user, "If you remove this item from the bank, it will be unable to be stored again. Do you still want to remove it?", "[src]", list("No", "Yes"), timeout = 10 SECONDS)
icon_state = "item_bank_o"
if(!choice || choice == "No" || !Adjacent(user) || inoperable() || panel_open)
busy_bank = FALSE
icon_state = "item_bank"
return
else if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
busy_bank = FALSE
icon_state = "item_bank"
return
var/obj/N = new I(get_turf(src))
log_admin("[key_name_admin(user)] retrieved [N] from the item bank.")
visible_message("<span class='notice'>\The [src] dispenses the [N] to \the [user].</span>")
user.put_in_hands(N)
N.persist_storable = FALSE
var/path = src.persist_item_savefile_path(user)
var/savefile/F = new /savefile(src.persist_item_savefile_path(user))
F["persist item"] << null
F["persist name"] << null
fdel(path)
item_takers += user.ckey
busy_bank = FALSE
icon_state = "item_bank"
else if(choice == "Info")
to_chat(user, "<span class='notice'>\The [src] can store a single item for you between shifts! Anything that has been retrieved from the bank cannot be stored again in the same shift. Anyone can withdraw from the bank one time per shift. Some items are not able to be accepted by the bank.</span>")
busy_bank = FALSE
return
else if(!I)
to_chat(user, "<span class='warning'>\The [src] doesn't seem to have anything for you...</span>")
busy_bank = FALSE
/obj/machinery/item_bank/attackby(obj/item/O, mob/living/user)
if(!ishuman(user))
return
if(busy_bank)
to_chat(user, "<span class='warning'>\The [src] is already in use.</span>")
return
busy_bank = TRUE
var/I = persist_item_savefile_load(user, "type")
if(!istool(O) && O.persist_storable)
if(ispath(I))
to_chat(user, "<span class='warning'>You cannot store \the [O]. You already have something stored.</span>")
busy_bank = FALSE
return
user.visible_message("<span class='notice'>\The [user] begins storing \the [O] in \the [src].</span>","<span class='notice'>You begin storing \the [O] in \the [src].</span>")
icon_state = "item_bank_o"
if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
busy_bank = FALSE
icon_state = "item_bank"
return
src.persist_item_savefile_save(user, O)
user.visible_message("<span class='notice'>\The [user] stores \the [O] in \the [src].</span>","<span class='notice'>You stored \the [O] in \the [src].</span>")
log_admin("[key_name_admin(user)] stored [O] in the item bank.")
qdel(O)
busy_bank = FALSE
icon_state = "item_bank"
else
to_chat(user, "<span class='warning'>You cannot store \the [O]. \The [src] either does not accept that, or it has already been retrieved from storage this shift.</span>")
busy_bank = FALSE
/////STORABLE ITEMS AND ALL THAT JAZZ/////
//I am only really intending this to be used for single items. Mostly stuff you got right now, but can't/don't want to use right now.
//It is not at all intended to be a thing that just lets you hold on to stuff forever, but just until it's the right time to use it.
/obj
var/persist_storable = TRUE //If this is true, this item can be stored in the item bank.
//This is automatically set to false when an item is removed from storage
/////LIST OF STUFF WE DON'T WANT PEOPLE STORING/////
/obj/item/device/pda
persist_storable = FALSE
/obj/item/device/communicator
persist_storable = FALSE
/obj/item/weapon/card
persist_storable = FALSE
/obj/item/weapon/holder
persist_storable = FALSE
/obj/item/device/radio
persist_storable = FALSE
/obj/item/device/encryptionkey
persist_storable = FALSE
/obj/item/weapon/storage //There are lots of things that have stuff that we may not want people to just have. And this is mostly intended for a single thing.
persist_storable = FALSE //And it would be annoying to go through and consider all of them, so default to disabled.
/obj/item/weapon/storage/backpack //But we can enable some where it makes sense. Backpacks and their variants basically never start with anything in them, as an example.
persist_storable = TRUE
/obj/item/weapon/reagent_containers/hypospray/vial
persist_storable = FALSE
/obj/item/weapon/cmo_disk_holder
persist_storable = FALSE
/obj/item/device/defib_kit/compact/combat
persist_storable = FALSE
/obj/item/clothing/glasses/welding/superior
persist_storable = FALSE
/obj/item/clothing/shoes/magboots/adv
persist_storable = FALSE
/obj/item/weapon/rig
persist_storable = FALSE
/obj/item/clothing/head/helmet/space/void
persist_storable = FALSE
/obj/item/clothing/suit/space/void
persist_storable = FALSE
/obj/item/weapon/grab
persist_storable = FALSE
/obj/item/weapon/grenade
persist_storable = FALSE
/obj/item/weapon/hand_tele
persist_storable = FALSE
/obj/item/weapon/paper/dockingcodes
persist_storable = FALSE
/obj/item/weapon/backup_implanter
persist_storable = FALSE
/obj/item/weapon/disk/nuclear
persist_storable = FALSE
/obj/item/weapon/gun/energy/locked //These are guns with security measures on them, so let's say the box won't let you put them in there.
persist_storable = FALSE //(otherwise explo will just put their locker/vendor guns into it every round)
/obj/item/device/retail_scanner
persist_storable = FALSE
/obj/item/weapon/telecube
persist_storable = FALSE
/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine
persist_storable = FALSE
/obj/item/weapon/gun/energy/sizegun/admin
persist_storable = FALSE
/obj/item/weapon/gun/energy/sizegun/abductor
persist_storable = FALSE
@@ -238,3 +238,14 @@
icon_state = "summerdress3"
/obj/item/clothing/under/summerdress/blue
icon_state = "summerdress2"
/obj/item/clothing/under/dress/dress_cap/femformal // formal in the loosest sense. because it's going to be taken off. or something. funnier in my head i swear
name = "site manager's feminine formalwear"
desc = "Essentially a skimpy...dress? Leotard? Whatever it is, it has the coloration and markings suitable for a site manager or rough equivalent."
icon = 'icons/inventory/uniform/item_vr.dmi'
default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi'
icon_state = "lewdcap"
item_state = "lewdcap"
rolled_sleeves = -1
rolled_down = -1
body_parts_covered = UPPER_TORSO // frankly this thing's a fucking embarassment
+1 -1
View File
@@ -295,7 +295,7 @@
if(supports.len >= braces_needed)
supported = 1
else for(var/obj/machinery/mining/brace/check in supports)
if(check.brace_tier > 3)
if(check.brace_tier >= 3)
supported = 1
for(var/obj/machinery/mining/brace/check in supports)
total_brace_tier += check.brace_tier
@@ -123,6 +123,7 @@
EQUIPMENT("Plush Toy", /obj/random/plushie, 300),
EQUIPMENT("Soap", /obj/item/weapon/soap/nanotrasen, 200),
EQUIPMENT("Thalers - 100", /obj/item/weapon/spacecash/c100, 1000),
EQUIPMENT("Thalers - 1000", /obj/item/weapon/spacecash/c1000, 10000),
EQUIPMENT("Umbrella", /obj/item/weapon/melee/umbrella/random, 200),
EQUIPMENT("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 125),
)
@@ -57,7 +57,7 @@
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
var/allergens = null // Things that will make this species very sick
var/allergen_reaction = AG_TOX_DMG|AG_OXY_DMG|AG_EMOTE|AG_PAIN|AG_WEAKEN // What type of reactions will you have? These the 'main' options and are intended to approximate anaphylactic shock at high doses.
var/allergen_damage_severity = 1.2 // How bad are reactions to the allergen? Touch with extreme caution.
var/allergen_damage_severity = 3.6 // How bad are reactions to the allergen? Touch with extreme caution.
var/allergen_disable_severity = 3 // Whilst this determines how long nonlethal effects last and how common emotes are.
var/min_age = 17
@@ -270,10 +270,17 @@
/datum/trait/neutral/allergen_reduced_effect
name = "Reduced Allergen Reaction"
desc = "This trait halves the lethality of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to nonlethal reactions or special reactions (such as unathi drowsiness from sugars)."
desc = "This trait drastically reduces the lethality of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to nonlethal reactions or special reactions (such as unathi drowsiness from sugars)."
cost = 0
custom_only = FALSE
var_changes = list("allergen_damage_severity" = 0.6)
var_changes = list("allergen_damage_severity" = 1.2)
/datum/trait/neutral/allergen_increased_effect
name = "Increased Allergen Reaction"
desc = "This trait drastically increases the lethality of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to nonlethal reactions or special reactions (such as unathi drowsiness from sugars)."
cost = 0
custom_only = FALSE
var_changes = list("allergen_damage_severity" = 7.2)
// Spicy Food Traits, from negative to positive.
/datum/trait/neutral/spice_intolerance_extreme
+1
View File
@@ -341,6 +341,7 @@
t = replacetext(t, "\[/u\]", "</U>")
t = replacetext(t, "\[time\]", "[stationtime2text()]")
t = replacetext(t, "\[date\]", "[stationdate2text()]")
t = replacetext(t, "\[station\]", "[station_name()]")
t = replacetext(t, "\[large\]", "<font size=\"4\">")
t = replacetext(t, "\[/large\]", "</font>")
if(findtext(t, "\[sign\]"))
+6 -4
View File
@@ -577,21 +577,23 @@
build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid
/* These are way too OP to be buildable
*/ //CHOMPEdit upstream whines too much.
/datum/design/item/mecha/combat_shield
name = "linear combat shield"
desc = "Linear shield projector. Deploys a large, familiar, and rectangular shield in one direction at a time."
id = "mech_shield_droid"
req_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_ILLEGAL = 4)
materials = list(MAT_STEEL = 8000, MAT_GOLD = 2000, MAT_SILVER = 3000, MAT_PHORON = 5000, MAT_GLASS = 3750)
req_tech = list(TECH_PHORON = 5, TECH_MAGNET = 7, TECH_ILLEGAL = 5) //Chompedit bumped up a little
materials = list(MAT_STEEL = 8000, MAT_GOLD = 2000, MAT_SILVER = 3000, MAT_PHORON = 5000, MAT_VERDANTIUM = 2000, MAT_GLASS = 3750) //Chompedit Also bumped up a little
build_path = /obj/item/mecha_parts/mecha_equipment/combat_shield
/datum/design/item/mecha/omni_shield
name = "Omni Shield"
desc = "Integral shield projector. Can only protect the exosuit, but has no weak angles."
id = "mech_shield_omni"
req_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_ILLEGAL = 4)
materials = list(MAT_STEEL = 8000, MAT_GOLD = 2000, MAT_SILVER = 3000, MAT_PHORON = 5000, MAT_GLASS = 3750)
req_tech = list(TECH_PHORON = 5, TECH_MAGNET = 7, TECH_ILLEGAL = 5) //Chompedit bumped up a little
materials = list(MAT_STEEL = 8000, MAT_GOLD = 2000, MAT_SILVER = 3000, MAT_PHORON = 5000, MAT_VERDANTIUM = 2000, MAT_GLASS = 3750) //Chompedit Also bumped up a little
build_path = /obj/item/mecha_parts/mecha_equipment/omni_shield
/* //CHOMPEdit closing comment.
*/
/datum/design/item/mecha/crisis_drone
+53 -1
View File
@@ -56,4 +56,56 @@
id = "scarab_right_legs"
build_path = /obj/item/mecha_parts/part/scarab_right_legs
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 30000)
materials = list(DEFAULT_WALL_MATERIAL = 30000)
/datum/design/item/mechfab/phazon
category = list("Phazon")
req_tech = list(TECH_MATERIAL = 7, TECH_BLUESPACE = 5, TECH_MAGNET = 6, TECH_PHORON = 3, TECH_ARCANE = 1)
/datum/design/item/mechfab/phazon/chassis
name = "Phazon Chassis"
id = "phazon_chassis"
build_path = /obj/item/mecha_parts/chassis/phazon
time = 10
materials = list(DEFAULT_WALL_MATERIAL = 30000, MAT_DURASTEEL = 4000, MAT_PHORON = 4000, MAT_GOLD = 5000, MAT_VERDANTIUM = 4000)
/datum/design/item/mechfab/phazon/torso
name = "Phazon Torso"
id = "phazon_torso"
build_path = /obj/item/mecha_parts/part/phazon_torso
time = 30
materials = list(DEFAULT_WALL_MATERIAL = 30000, MAT_DURASTEEL = 2000, MAT_PHORON = 6000, MAT_GOLD = 6000, MAT_VERDANTIUM = 2000)
/datum/design/item/mechfab/phazon/head
name = "Phazon Head"
id = "phazon_head"
build_path = /obj/item/mecha_parts/part/phazon_head
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 10000, MAT_DURASTEEL = 1000, MAT_PHORON = 4000, MAT_GOLD = 4000, MAT_VERDANTIUM = 500)
/datum/design/item/mechfab/phazon/left_arm
name = "Phazon Left Arm"
id = "phazon_left_arm"
build_path = /obj/item/mecha_parts/part/phazon_left_arm
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 15000, MAT_PHORON = 2000, MAT_GOLD = 2000, MAT_VERDANTIUM = 500)
/datum/design/item/mechfab/phazon/right_arm
name = "Phazon Right Arm"
id = "phazon_right_arm"
build_path = /obj/item/mecha_parts/part/phazon_right_arm
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 15000, MAT_PHORON = 2000, MAT_GOLD = 2000, MAT_VERDANTIUM = 500)
/datum/design/item/mechfab/phazon/left_leg
name = "Phazon Left Legs"
id = "phazon_left_legs"
build_path = /obj/item/mecha_parts/part/phazon_left_leg
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 15000, MAT_PHORON = 2000, MAT_GOLD = 2000, MAT_VERDANTIUM = 500)
/datum/design/item/mechfab/phazon/right_leg
name = "Phazon Right Legs"
id = "phazon_right_legs"
build_path = /obj/item/mecha_parts/part/phazon_right_leg
time = 20
materials = list(DEFAULT_WALL_MATERIAL = 15000, MAT_PHORON = 2000, MAT_GOLD = 2000, MAT_VERDANTIUM = 500)
@@ -1416,4 +1416,24 @@ End CHOMP Removal*/
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "stamp-midhorror"
stamptext = "This paper has been certified by The Council of Mid Horror"
//thedavestdave Lucky
///I know this is pretty bodgey but if it stupid and it works it isn't stupid
/obj/item/clothing/suit/storage/hooded/explorer/lucky
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "luck"
icon_override = 'icons/vore/custom_clothes_vr.dmi'
item_state = "luck"
name = "Lucky's armor"
desc = "A chain mail suit with a badly drawn one eared cat on the front."
/obj/item/device/modkit_conversion/crusader_luck
skip_content_check = TRUE
name = "Lucky's armor"
desc = "A chain mail suit with a badly drawn one eared cat on the front."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "modkit"
from_suit = /obj/item/clothing/suit/storage/hooded/explorer
to_suit = /obj/item/clothing/suit/storage/hooded/explorer/lucky