Merge branch 'master' into upstream-merge-13313
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 109 KiB |
@@ -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
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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
|
||||
|
||||