Merge branch 'master' into upstream-merge-13313

This commit is contained in:
Nadyr
2022-07-11 21:45:29 -04:00
committed by GitHub
31 changed files with 189 additions and 65 deletions
+6 -5
View File
@@ -59,15 +59,16 @@ SUBSYSTEM_DEF(persist)
var/client/C = M.client
var/wait_in_hours = wait / (1 HOUR)
var/pto_factored = wait_in_hours * J.timeoff_factor
if(J.playtime_only)
pto_factored = 0
LAZYINITLIST(C.department_hours)
LAZYINITLIST(C.play_hours)
var/dept_hours = C.department_hours
var/play_hours = C.play_hours
if(!(J.playtime_only))
if(isnum(dept_hours[department_earning]))
dept_hours[department_earning] += pto_factored
else
dept_hours[department_earning] = pto_factored
if(isnum(dept_hours[department_earning]))
dept_hours[department_earning] += pto_factored
else
dept_hours[department_earning] = pto_factored
// If they're earning PTO they must be in a useful job so are earning playtime in that department
if(J.timeoff_factor > 0)
+9 -4
View File
@@ -50,9 +50,9 @@ var/global/datum/controller/subsystem/ticker/ticker
pregame_timeleft = config.pregame_time
send2mainirc("Server lobby is loaded and open at byond://[config.serverurl ? config.serverurl : (config.server ? config.server : "[world.address]:[world.port]")]")
SSwebhooks.send(
WEBHOOK_ROUNDPREP,
WEBHOOK_ROUNDPREP,
list(
"map" = station_name(),
"map" = station_name(),
"url" = get_world_url()
)
)
@@ -397,14 +397,19 @@ var/global/datum/controller/subsystem/ticker/ticker
if(player && player.ready && player.mind?.assigned_role)
var/datum/job/J = SSjob.get_job(player.mind.assigned_role)
// Ask their new_player mob to spawn them
if(!player.spawn_checks_vr(player.mind.assigned_role))
var/datum/job/job_datum = job_master.GetJob(J.title)
job_datum.current_positions--
player.mind.assigned_role = null
continue //VOREStation Add
// Snowflakey AI treatment
if(J?.mob_type & JOB_SILICON_AI)
player.close_spawn_windows()
player.AIize(move = TRUE)
continue
// Ask their new_player mob to spawn them
if(!player.spawn_checks_vr(player.mind.assigned_role)) continue //VOREStation Add
var/mob/living/carbon/human/new_char = player.create_character()
// Created their playable character, delete their /mob/new_player
+1 -1
View File
@@ -42,7 +42,7 @@
if(C && config.use_playtime_restriction_for_jobs && dept_time_required)
var/remaining_time_needed = dept_time_required
for(var/key in C.play_hours)
if(isnum(C.play_hours[key]))
if(isnum(C.play_hours[key]) && !(key == PTO_TALON))
remaining_time_needed = max(0, remaining_time_needed - C.play_hours[key])
return remaining_time_needed
return 0
@@ -15,18 +15,22 @@
to_chat(user, "<span class='notice'>You [active ? "" : "de"]activate \the [src].</span>")
update()
/obj/item/weapon/implanter/verb/remove_implant(var/mob/user)
/obj/item/weapon/implanter/verb/remove_implant()
set category = "Object"
set name = "Remove Implant"
set src in usr
if(!imp)
return
imp.loc = get_turf(src)
user.put_in_hands(imp)
to_chat(user, "<span class='notice'>You remove \the [imp] from \the [src].</span>")
name = "implanter"
imp = null
if(istype(usr, /mob))
var/mob/M = usr
imp.loc = get_turf(src)
if(M.get_active_hand() == null)
M.put_in_hands(imp)
to_chat(M, "<span class='notice'>You remove \the [imp] from \the [src].</span>")
name = "implanter"
imp = null
update()
return
@@ -638,8 +638,6 @@
</html>
"}
<<<<<<< HEAD
=======
/obj/item/weapon/book/manual/robotics_manual
name = "Guide to Robotics"
icon_state ="evabook"
@@ -657,7 +655,6 @@
</body>
</html>
"}
>>>>>>> 17850170bb... Merge pull request #13313 from FirstSgtDan/Books
/obj/item/weapon/book/manual/robotics_cyborgs
name = "Cyborgs for Dummies"
+2
View File
@@ -102,6 +102,8 @@
notes_add(banckey,banreason,usr)
DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid )
if((bantype == BANTYPE_PERMA || bantype == BANTYPE_TEMP) && playermob.client)
qdel(playermob.client)
else if(href_list["editrights"])
if(!check_rights(R_PERMISSIONS))
@@ -129,3 +129,17 @@ Talon winter coat
/datum/gear/suit/russofurcoat
display_name = "long fur coat"
path = /obj/item/clothing/suit/storage/vest/hoscoat/russofurcoat
//Colorable Hoodie
/datum/gear/suit/hoodie_vr
display_name = "hoodie with hood (colorable)"
path = /obj/item/clothing/suit/storage/hooded/hoodie
/datum/gear/suit/hoodie_vr/New()
var/list/hoodies = list()
for(var/hoodie_style in typesof(/obj/item/clothing/suit/storage/hooded/hoodie))
var/obj/item/clothing/suit/storage/toggle/hoodie/hoodie = hoodie_style
hoodies[initial(hoodie.name)] = hoodie
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(hoodies))
gear_tweaks += gear_tweak_free_color_choice
+8 -1
View File
@@ -203,9 +203,16 @@
name = "techpriest hood"
desc = "A techpriest hood."
icon_state = "techpriesthood"
/obj/item/clothing/head/hood/siffet_hood
name = "siffet hood"
desc = "A hood that looks vaguely like a siffet's head. Guaranteed to traumatize your Promethean coworkers."
icon_state = "siffet"
item_state_slots = list(slot_r_hand_str = "siffet", slot_l_hand_str = "siffet")
/obj/item/clothing/head/hood/hoodie
name = "hood"
desc = "The hood of a hoodie. Cosy!"
icon = 'icons/inventory/head/item_vr.dmi'
icon_override = 'icons/inventory/head/mob_vr.dmi'
icon_state = "hood_plain"
+2
View File
@@ -60,6 +60,8 @@
hood.canremove = FALSE
icon_state = "[toggleicon]_t"
H.update_inv_wear_suit()
if(color != hood.color)
hood.color = color
else
RemoveHood()
+42
View File
@@ -78,3 +78,45 @@
icon_state = "taloncoat"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
hoodtype = /obj/item/clothing/head/hood/winter/talon
//Functional hoodie
/obj/item/clothing/suit/storage/hooded/hoodie
name = "hoodie"
desc = "A warm jacket, now featuring a hood!"
icon = 'icons/inventory/suit/item_vr.dmi'
icon_override = 'icons/inventory/suit/mob_vr.dmi'
icon_state = "hoodie_plain"
item_state_slots = list(slot_r_hand_str = "grey_hoodie", slot_l_hand_str = "grey_hoodie")
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
flags_inv = HIDEHOLSTER
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
hoodtype = /obj/item/clothing/head/hood/hoodie
allowed = list(/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/device/suit_cooling_unit)
/obj/item/clothing/suit/storage/hooded/hoodie/redtrim
name = "red-trimmed hoodie"
desc = "A warm jacket, now featuring a hood and a bold red trim!"
icon_state = "hoodie_redtrim"
/obj/item/clothing/suit/storage/hooded/hoodie/bluetrim
name = "blue-trimmed hoodie"
desc = "A warm jacket, now featuring a hood and a cool blue trim!"
icon_state = "hoodie_bluetrim"
/obj/item/clothing/suit/storage/hooded/hoodie/greentrim
name = "green-trimmed hoodie"
desc = "A warm jacket, now featuring a hood and a chilled green trim!"
icon_state = "hoodie_greentrim"
/obj/item/clothing/suit/storage/hooded/hoodie/purpletrim
name = "purple-trimmed hoodie"
desc = "A warm jacket, now featuring a hood and a smart purple trim!"
icon_state = "hoodie_purpletrim"
/obj/item/clothing/suit/storage/hooded/hoodie/yellowtrim
name = "yellow-trimmed hoodie"
desc = "A warm jacket, now featuring a hood and an eye-catching yellow trim!"
icon_state = "hoodie_yellowtrim"
+13 -10
View File
@@ -23,18 +23,18 @@
price_tag = null
return
/obj/item/weapon/reagent_containers/food/drinks/proc/On_Consume(var/mob/M)
if(!usr)
usr = M
if(!reagents.total_volume)
/obj/item/weapon/reagent_containers/food/drinks/proc/On_Consume(var/mob/M, var/mob/user, var/changed = FALSE)
if(!user)
user = M
if(!reagents.total_volume && changed)
M.visible_message("<span class='notice'>[M] finishes drinking \the [src].</span>","<span class='notice'>You finish drinking \the [src].</span>")
if(trash)
usr.drop_from_inventory(src) //so icons update :[
user.drop_from_inventory(src) //so icons update :[
if(ispath(trash,/obj/item))
var/obj/item/TrashItem = new trash(usr)
usr.put_in_hands(TrashItem)
var/obj/item/TrashItem = new trash(user)
user.put_in_hands(TrashItem)
else if(istype(trash,/obj/item))
usr.put_in_hands(trash)
user.put_in_hands(trash)
qdel(src)
return
@@ -73,8 +73,11 @@
if(!is_open_container())
to_chat(user, "<span class='notice'>You need to open [src]!</span>")
return 1
On_Consume(target,user)
return ..()
var/original_volume = reagents.total_volume
.=..()
var/changed = !(reagents.total_volume == original_volume)
On_Consume(target,user,changed)
return
/obj/item/weapon/reagent_containers/food/drinks/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target)
if(!is_open_container())
+2 -2
View File
@@ -49,7 +49,7 @@ var/global/ingredientLimit = 20000
I.forceMove(src)
if(S.reagents)
S.reagents.trans_to(src,S.reagents.total_volume)
S.reagents.trans_to_holder(reagents,S.reagents.total_volume)
ingredients += S
@@ -142,7 +142,7 @@ var/global/ingredientLimit = 20000
/obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich/attackby(obj/item/I,mob/user)
if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/slice/bread) && !addTop)
I.reagents.trans_to(src,I.reagents.total_volume)
I.reagents.trans_to_holder(reagents,I.reagents.total_volume)
qdel(I)
addTop = 1
src.drawTopping()
+4 -2
View File
@@ -92,7 +92,7 @@
var/list/combined = combine_message(message_pieces, verb, speaker)
var/message = combined["formatted"]
if(message == "")
return
return FALSE
if(sleeping || stat == UNCONSCIOUS)
hear_sleep(multilingual_to_message(message_pieces))
@@ -129,9 +129,11 @@
var/turf/source = speaker ? get_turf(speaker) : get_turf(src)
playsound_local(source, speech_sound, sound_vol, 1)
return TRUE
// Done here instead of on_hear_say() since that is NOT called if the mob is clientless (which includes most AI mobs).
/mob/living/hear_say(var/list/message_pieces, var/verb = "says", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
..()
.=..()
if(has_AI()) // Won't happen if no ai_holder exists or there's a player inside w/o autopilot active.
ai_holder.on_hear_say(speaker, multilingual_to_message(message_pieces))
+10 -10
View File
@@ -366,18 +366,18 @@ var/list/channel_to_radio_key = new
var/runechat_enabled = M.client?.is_preference_enabled(/datum/client_preference/runechat_mob)
if(dst <= message_range || (M.stat == DEAD && !forbid_seeing_deadchat)) //Inside normal message range, or dead with ears (handled in the view proc)
if(M.client && !runechat_enabled)
var/image/I1 = listening[M] || speech_bubble
images_to_clients[I1] |= M.client
M << I1
M.hear_say(message_pieces, verb, italics, src, speech_sound, sound_vol)
if(M.hear_say(message_pieces, verb, italics, src, speech_sound, sound_vol))
if(M.client && !runechat_enabled)
var/image/I1 = listening[M] || speech_bubble
images_to_clients[I1] |= M.client
M << I1
if(whispering && !isobserver(M)) //Don't even bother with these unless whispering
if(dst > message_range && dst <= w_scramble_range) //Inside whisper scramble range
if(M.client && !runechat_enabled)
var/image/I2 = listening[M] || speech_bubble
images_to_clients[I2] |= M.client
M << I2
M.hear_say(stars_all(message_pieces), verb, italics, src, speech_sound, sound_vol*0.2)
if(M.hear_say(stars_all(message_pieces), verb, italics, src, speech_sound, sound_vol*0.2))
if(M.client && !runechat_enabled)
var/image/I2 = listening[M] || speech_bubble
images_to_clients[I2] |= M.client
M << I2
if(dst > w_scramble_range && dst <= world.view) //Inside whisper 'visible' range
M.show_message("<span class='game say'><span class='name'>[name]</span> [w_not_heard].</span>", 2)
+14 -7
View File
@@ -389,14 +389,21 @@
/mob/new_player/proc/IsJobAvailable(rank)
var/datum/job/job = job_master.GetJob(rank)
if(!job) return 0
if(!job.is_position_available()) return 0
if(jobban_isbanned(src,rank)) return 0
if(!job.player_old_enough(src.client)) return 0
if(!job)
return 0
if(!job.is_position_available())
return 0
if(jobban_isbanned(src,rank))
return 0
if(!job.player_old_enough(src.client))
return 0
//VOREStation Add
if(!job.player_has_enough_playtime(src.client)) return 0
if(!is_job_whitelisted(src,rank)) return 0
if(!job.player_has_enough_pto(src.client)) return 0
if(!job.player_has_enough_playtime(src.client))
return 0
if(!is_job_whitelisted(src,rank))
return 0
if(!job.player_has_enough_pto(src.client))
return 0
//VOREStation Add End
return 1
@@ -326,7 +326,7 @@
/mob/living/carbon/brain/caught_soul/hear_say()
if(ext_deaf || !client)
return FALSE
..()
.=..()
/mob/living/carbon/brain/caught_soul/show_message(msg, type, alt, alt_type)
if(ext_blind || !client)
+2 -2
View File
@@ -109,8 +109,8 @@
data["autofocus"] = autofocus
data["buttons"] = buttons
data["message"] = message
data["large_buttons"] = usr.client.prefs.tgui_large_buttons
data["swapped_buttons"] = !usr.client.prefs.tgui_swapped_buttons
data["large_buttons"] = user.client.prefs.tgui_large_buttons
data["swapped_buttons"] = !user.client.prefs.tgui_swapped_buttons
data["title"] = title
return data
+2 -2
View File
@@ -121,9 +121,9 @@
var/list/data = list()
data["init_value"] = default || items[1]
data["items"] = items
data["large_buttons"] = usr.client.prefs.tgui_large_buttons
data["large_buttons"] = user.client.prefs.tgui_large_buttons
data["message"] = message
data["swapped_buttons"] = !usr.client.prefs.tgui_swapped_buttons
data["swapped_buttons"] = !user.client.prefs.tgui_swapped_buttons
data["title"] = title
return data
+2 -2
View File
@@ -113,11 +113,11 @@
/datum/tgui_input_number/tgui_static_data(mob/user)
var/list/data = list()
data["init_value"] = default // Default is a reserved keyword
data["large_buttons"] = usr.client.prefs.tgui_large_buttons
data["large_buttons"] = user.client.prefs.tgui_large_buttons
data["max_value"] = max_value
data["message"] = message
data["min_value"] = min_value
data["swapped_buttons"] = !usr.client.prefs.tgui_swapped_buttons
data["swapped_buttons"] = !user.client.prefs.tgui_swapped_buttons
data["title"] = title
return data
+2 -2
View File
@@ -116,12 +116,12 @@
/datum/tgui_input_text/tgui_static_data(mob/user)
var/list/data = list()
data["large_buttons"] = usr.client.prefs.tgui_large_buttons
data["large_buttons"] = user.client.prefs.tgui_large_buttons
data["max_length"] = max_length
data["message"] = message
data["multiline"] = multiline
data["placeholder"] = default // Default is a reserved keyword
data["swapped_buttons"] = !usr.client.prefs.tgui_swapped_buttons
data["swapped_buttons"] = !user.client.prefs.tgui_swapped_buttons
data["title"] = title
data["prevent_enter"] = prevent_enter
return data
+2 -2
View File
@@ -1084,7 +1084,7 @@
host.vore_selected.can_taste = !host.vore_selected.can_taste
. = TRUE
if("b_bulge_size")
var/new_bulge = tgui_input_number(user, "Choose the required size prey must be to show up on examine, ranging from 25% to 200% Set this to 0 for no text on examine.", "Set Belly Examine Size.", max_value = 200, min_value = 25)
var/new_bulge = tgui_input_number(user, "Choose the required size prey must be to show up on examine, ranging from 25% to 200% Set this to 0 for no text on examine.", "Set Belly Examine Size.", max_value = 200, min_value = 0)
if(new_bulge == null)
return FALSE
if(new_bulge == 0) //Disable.
@@ -1141,7 +1141,7 @@
host.vore_selected.emote_active = !host.vore_selected.emote_active
. = TRUE
if("b_emotetime")
var/new_time = tgui_input_number(user, "Choose the period it takes for idle belly emotes to be shown to prey. Measured in seconds, Minimum 1 minute, Maximum 10 minutes.", "Set Belly Emote Delay.", host.vore_selected.digest_brute, 10, 1)
var/new_time = tgui_input_number(user, "Choose the period it takes for idle belly emotes to be shown to prey. Measured in seconds, Minimum 1 minute, Maximum 10 minutes.", "Set Belly Emote Delay.", host.vore_selected.digest_brute, 600, 60)
if(new_time == null)
return FALSE
var/new_new_time = CLAMP(new_time, 60, 600)
@@ -10,7 +10,7 @@
item_icons = null // No in-hand sprites (for now, anyway, we could totally add some)
pixel_y = 0 // Override value from parent.
/obj/item/weapon/holder/micro/examine(mob/user)
/obj/item/weapon/holder/examine(mob/user)
. = list()
for(var/mob/living/M in contents)
. += M.examine(user)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 109 KiB

+19
View File
@@ -20372,7 +20372,25 @@
/obj/structure/bookcase{
name = "bookcase (Non-Fiction)"
},
<<<<<<< HEAD
/obj/item/weapon/book/codex/lore/robutt,
=======
/obj/item/weapon/book/manual/hydroponics_pod_people,
/obj/item/weapon/book/manual/mass_spectrometry,
/obj/item/weapon/book/manual/materials_chemistry_analysis,
/obj/item/weapon/book/manual/medical_cloning,
/obj/item/weapon/book/manual/medical_diagnostics_manual,
/obj/item/weapon/book/manual/research_and_development,
/obj/item/weapon/book/manual/resleeving,
/obj/item/weapon/book/manual/ripley_build_and_repair,
/obj/item/weapon/book/manual/robotics_cyborgs,
/obj/item/weapon/book/manual/robotics_manual,
/obj/item/weapon/book/manual/rust_engine,
/obj/item/weapon/book/manual/security_space_law,
/obj/item/weapon/book/manual/standard_operating_procedure,
/obj/item/weapon/book/manual/stasis,
/obj/item/weapon/book/manual/supermatter_engine,
>>>>>>> 09a9819f20... Merge pull request #13295 from FirstSgtDan/Books
/turf/simulated/floor/wood,
/area/library)
"aGx" = (
@@ -36890,6 +36908,7 @@
"bkS" = (
/obj/structure/table/standard,
/obj/item/weapon/book/manual/robotics_cyborgs,
/obj/item/weapon/book/manual/robotics_manual,
/obj/item/clothing/glasses/omnihud/rnd,
/obj/machinery/light{
dir = 8
@@ -0,0 +1,14 @@
/mob/living/Crossed(var/atom/movable/AM)
..()
var/mob/living/target = AM
if(istype(target) && src.lying && target.loc && target.buckled != src)
// src.lying being true means that in theory this code shouldn't run at the same time as the existing code for this in Bump. Probably.
// And optionally, this could be gated behind another preference, to prevent stunlock being abused.
if((mob_always_swap || (a_intent == I_HELP || src.restrained()) && (target.a_intent == I_HELP || target.restrained())) && target.canmove && target.handle_micro_bump_helping(src))
return
else if(!(target.a_intent == I_HELP || target.restrained()) && target.handle_micro_bump_other(src))
if(src.step_mechanics_pref && target.step_mechanics_pref)
target.handle_micro_bump_other(src)
else
target.handle_micro_bump_other(src, 1)
return
+5 -1
View File
@@ -347,7 +347,11 @@ const VoreBellySelectionAndCustomization = (props, context) => {
</Section>
</Flex.Item>
<Flex.Item grow>
<Section title={selected.belly_name}>{selected && <VoreSelectedBelly belly={selected} />}</Section>
{selected && (
<Section title={selected.belly_name}>
<VoreSelectedBelly belly={selected} />
</Section>
)}
</Flex.Item>
</Flex>
);
File diff suppressed because one or more lines are too long
+1
View File
@@ -4510,4 +4510,5 @@
#include "modular_chomp\code\modules\power\cells\esoteric_cells.dm"
#include "modular_chomp\code\modules\power\cells\power_cells.dm"
#include "modular_chomp\code\modules\research\designs\power_cells.dm"
#include "modular_chomp\code\modules\vore\resizing\resize.dm"
// END_INCLUDE