diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index be1e671756..179f501fd1 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -63,7 +63,7 @@ require only minor tweaks. #define ZTRAITS_CENTCOM list(ZTRAIT_CENTCOM = TRUE) #define ZTRAITS_STATION list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_STATION = TRUE) #define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE) -#define ZTRAITS_LAVALAND list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 2) +#define ZTRAITS_LAVALAND list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 5) #define ZTRAITS_REEBE list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5) #define DL_NAME "name" diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 4d72f0a8e2..84e5ba4f82 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -55,7 +55,7 @@ if(AH) message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.") - var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null + var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as message|null if (!msg) message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.") return @@ -112,7 +112,7 @@ //get message text, limit it's length.and clean/escape html if(!msg) - msg = input(src,"Message:", "Private message to [key_name(recipient, 0, 0)]") as text|null + msg = input(src,"Message:", "Private message to [key_name(recipient, 0, 0)]") as message|null msg = trim(msg) if(!msg) return diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index c69a5873b1..e7e0922f62 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -51,7 +51,7 @@ Head of Security suit_store = /obj/item/gun/energy/e_gun r_pocket = /obj/item/assembly/flash/handheld l_pocket = /obj/item/restraints/handcuffs - backpack_contents = list(/obj/item/melee/baton/loaded=1) + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1) backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 47e248f681..209a8118fc 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -26,11 +26,13 @@ new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500), new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500), new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 500), - new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600), new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750), new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750), new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), + new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 800), + new /datum/data/mining_equipment("Burn First-Aid Kit", /obj/item/storage/firstaid/fire, 800), + new /datum/data/mining_equipment("First-Aid Kit", /obj/item/storage/firstaid/regular, 800), new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800), new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800), new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000), diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 67005fad31..80b2838167 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -25,10 +25,6 @@ mutanteyes = /obj/item/organ/eyes/night_vision/mushroom use_skintones = FALSE var/datum/martial_art/mushpunch/mush - blacklisted = TRUE //See comment below about locking it out of roundstart. The species is not intended to be available to players yet - and this means wizards, too. - -/datum/species/mush/check_roundstart_eligible() - return FALSE //hard locked out of roundstart on the order of design lead kor, this can be removed in the future when planetstation is here OR SOMETHING but right now we have a problem with races. /datum/species/mush/after_equip_job(datum/job/J, mob/living/carbon/human/H) H.grant_language(/datum/language/mushroom) //pomf pomf diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index aaa7e30de0..671e62a9e6 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -345,6 +345,7 @@ C.hal_screwyhud = SCREWYHUD_HEALTHY C.adjustBruteLoss(-0.25*REM, 0) C.adjustFireLoss(-0.25*REM, 0) + C.adjustStaminaLoss(-0.5*REM, 0) ..() return TRUE @@ -883,7 +884,7 @@ M.AdjustStun(-60, 0) M.AdjustKnockdown(-60, 0) M.AdjustUnconscious(-60, 0) - M.adjustStaminaLoss(-5*REM, 0) + M.adjustStaminaLoss(-20*REM, 0) ..() . = 1 @@ -1053,9 +1054,35 @@ M.adjustToxLoss(-5*REM, 0) M.adjustBrainLoss(-15*REM) M.adjustCloneLoss(-3*REM, 0) + M.adjustStaminaLoss(-20*REM,0) ..() . = 1 +/datum/reagent/medicine/neo_jelly + name = "Neo Jelly" + id = "neo_jelly" + description = "Gradually regenerates all types of damage, without harming slime anatomy.Can OD" + reagent_state = LIQUID + metabolization_rate = 1 * REAGENTS_METABOLISM + color = "#91D865" + overdose_threshold = 30 + taste_description = "jelly" + +/datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M) + M.adjustBruteLoss(-1.5*REM, 0) + M.adjustFireLoss(-1.5*REM, 0) + M.adjustOxyLoss(-1.5*REM, 0) + M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs + . = 1 + ..() + +/datum/reagent/medicine/neo_jelly/overdose_process(mob/living/M) + M.adjustOxyLoss(2.6*REM, 0) + M.adjustBruteLoss(3.5*REM, 0) + M.adjustFireLoss(3.5*REM, 0) + ..() + . = 1 + /datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants name = "Earthsblood" id = "earthsblood" @@ -1136,12 +1163,12 @@ M.AdjustUnconscious(-20, 0) M.AdjustStun(-20, 0) M.AdjustKnockdown(-20, 0) - M.adjustStaminaLoss(-1, 0) + M.adjustStaminaLoss(-30, 0) ..() return TRUE /datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/M as mob) - M.adjustToxLoss(1, 0) + M.adjustToxLoss(5, 0) //let's make this mildly more toxic because of the stamina buff ..() return TRUE @@ -1220,7 +1247,7 @@ M.AdjustStun(-5, 0) M.AdjustKnockdown(-5, 0) M.AdjustUnconscious(-5, 0) - M.adjustStaminaLoss(-0.5*REM, 0) + M.adjustStaminaLoss(-1*REM, 0) M.Jitter(1) metabolization_rate = 0.01 * REAGENTS_METABOLISM * rand(5,20) // randomizes metabolism between 0.02 and 0.08 per tick . = TRUE diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 1fa8b408cd..b88f680dbb 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -156,9 +156,9 @@ name = "survival medipen" desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. WARNING: Do not inject more than one pen in quick succession." icon_state = "stimpen" - volume = 57 - amount_per_transfer_from_this = 57 - list_reagents = list("salbutamol" = 10, "leporazine" = 15, "tricordrazine" = 15, "epinephrine" = 10, "lavaland_extract" = 2, "omnizine" = 5) + volume = 52 + amount_per_transfer_from_this = 52 + list_reagents = list("salbutamol" = 10, "leporazine" = 15, "neo_jelly" = 15, "epinephrine" = 10, "lavaland_extract" = 2) /obj/item/reagent_containers/hypospray/medipen/species_mutator name = "species mutator medipen" diff --git a/html/changelogs/AutoChangeLog-pr-7559.yml b/html/changelogs/AutoChangeLog-pr-7559.yml new file mode 100644 index 0000000000..2f881b5565 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7559.yml @@ -0,0 +1,4 @@ +author: "Poojawa" +delete-after: True +changes: + - bugfix: "Fixes APCs being replaced in maint from counting Maint as their wall turff" diff --git a/html/changelogs/AutoChangeLog-pr-7560.yml b/html/changelogs/AutoChangeLog-pr-7560.yml new file mode 100644 index 0000000000..cf5dc1e4a7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7560.yml @@ -0,0 +1,4 @@ +author: "izzyinbox" +delete-after: True +changes: + - tweak: "changes the admin-pm input box from single line to multi-line" diff --git a/html/changelogs/AutoChangeLog-pr-7567.yml b/html/changelogs/AutoChangeLog-pr-7567.yml new file mode 100644 index 0000000000..ec086fdd41 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7567.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - rscadd: "mushroom people are now roundstart on live" diff --git a/html/changelogs/AutoChangeLog-pr-7569.yml b/html/changelogs/AutoChangeLog-pr-7569.yml new file mode 100644 index 0000000000..e63badc693 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7569.yml @@ -0,0 +1,4 @@ +author: "Tupinambis" +delete-after: True +changes: + - tweak: "By popular request, makes the Head of Security spawn with a telebaton instead of a stun baton." diff --git a/html/changelogs/AutoChangeLog-pr-7582.yml b/html/changelogs/AutoChangeLog-pr-7582.yml new file mode 100644 index 0000000000..619d36b2f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7582.yml @@ -0,0 +1,4 @@ +author: "izzyinbox" +delete-after: True +changes: + - bugfix: "Tennis balls now equip and show up in the correct slots" diff --git a/html/changelogs/AutoChangeLog-pr-7583.yml b/html/changelogs/AutoChangeLog-pr-7583.yml new file mode 100644 index 0000000000..ddf4225679 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7583.yml @@ -0,0 +1,4 @@ +author: "izzyinbox" +delete-after: True +changes: + - rscadd: "Adds option in the hide/expose genitals verb to hide genitals even without clothes" diff --git a/html/changelogs/AutoChangeLog-pr-7587.yml b/html/changelogs/AutoChangeLog-pr-7587.yml new file mode 100644 index 0000000000..c82480e06e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7587.yml @@ -0,0 +1,4 @@ +author: "Poojawa" +delete-after: True +changes: + - rscadd: "Added Vore based moodlets, primitive and ain't gunna adapt for not belly things but w/e" diff --git a/modular_citadel/code/datums/mood_events/generic_negative_events.dm b/modular_citadel/code/datums/mood_events/generic_negative_events.dm index cc7e714819..c0f2591656 100644 --- a/modular_citadel/code/datums/mood_events/generic_negative_events.dm +++ b/modular_citadel/code/datums/mood_events/generic_negative_events.dm @@ -9,3 +9,13 @@ description = "A plush I tried to pet had no stuffing...\n" mood_change = -1 timeout = 1200 + +/datum/mood_event/emptypred + description = "I had to let someone out.\n" + mood_change = -2 + timeout = 600 + +/datum/mood_event/emptyprey + description = "It feels quite cold out here.\n" + mood_change = -2 + timeout = 600 \ No newline at end of file diff --git a/modular_citadel/code/datums/mood_events/generic_positive_events.dm b/modular_citadel/code/datums/mood_events/generic_positive_events.dm index 798d77db99..4c581d8184 100644 --- a/modular_citadel/code/datums/mood_events/generic_positive_events.dm +++ b/modular_citadel/code/datums/mood_events/generic_positive_events.dm @@ -23,4 +23,12 @@ /datum/mood_event/orgasm description = "I came!" //funny meme haha mood_change = 3 - timeout = 1000 \ No newline at end of file + timeout = 1000 + +/datum/mood_event/fedpred + description = "I've devoured someone!\n" + mood_change = 3 + +/datum/mood_event/fedprey + description = "It feels quite cozy in here.\n" + mood_change = 3 \ No newline at end of file diff --git a/modular_citadel/code/game/objects/items/balls.dm b/modular_citadel/code/game/objects/items/balls.dm index 4095a4bb20..79552bff6d 100644 --- a/modular_citadel/code/game/objects/items/balls.dm +++ b/modular_citadel/code/game/objects/items/balls.dm @@ -16,7 +16,7 @@ righthand_file = 'modular_citadel/icons/mob/inhands/balls_right.dmi' item_state = "tennis_classic" alternate_worn_icon = 'modular_citadel/icons/mob/mouthball.dmi' - slot_flags = SLOT_HEAD | SLOT_NECK | SLOT_EARS //Fluff item, put it wherever you want! + slot_flags = ITEM_SLOT_HEAD | ITEM_SLOT_NECK | ITEM_SLOT_EARS //Fluff item, put it wherever you want! throw_range = 14 w_class = WEIGHT_CLASS_SMALL diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index ea44c6d671..a9e8744975 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -57,9 +57,3 @@ color = "#[skintone2hex(H.skin_tone)]" else color = "#[owner.dna.features["breasts_color"]]" - -/obj/item/organ/genital/breasts/is_exposed() - . = ..() - if(.) - return TRUE - return owner.is_chest_exposed() diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index ee706fa7f9..b43f17e58a 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -19,6 +19,7 @@ var/obj/item/organ/genital/linked_organ var/through_clothes = FALSE var/internal = FALSE + var/hidden = FALSE /obj/item/organ/genital/Initialize() . = ..() @@ -47,18 +48,39 @@ /obj/item/organ/genital/proc/is_exposed() if(!owner) return FALSE + if(hidden) + return FALSE if(internal) return FALSE if(through_clothes) return TRUE -/obj/item/organ/genital/proc/toggle_through_clothes() - if(through_clothes) - through_clothes = FALSE - owner.exposed_genitals -= src - else - through_clothes = TRUE - owner.exposed_genitals += src + switch(zone) //update as more genitals are added + if("chest") + return owner.is_chest_exposed() + if("groin") + return owner.is_groin_exposed() + + return FALSE + +/obj/item/organ/genital/proc/toggle_visibility(visibility) + switch(visibility) + if("Always visible") + through_clothes = TRUE + hidden = FALSE + if(!(src in owner.exposed_genitals)) + owner.exposed_genitals += src + if("Hidden by clothes") + through_clothes = FALSE + hidden = FALSE + if(src in owner.exposed_genitals) + owner.exposed_genitals -= src + if("Always hidden") + through_clothes = FALSE + hidden = TRUE + if(src in owner.exposed_genitals) + owner.exposed_genitals -= src + if(ishuman(owner)) //recast to use update genitals proc var/mob/living/carbon/human/H = owner H.update_genitals() @@ -78,9 +100,10 @@ return //Full list of exposable genitals created var/obj/item/organ/genital/picked_organ - picked_organ = input(src, "Expose/Hide genitals", "Choose which genitalia to expose/hide", null) in genital_list + picked_organ = input(src, "Choose which genitalia to expose/hide", "Expose/Hide genitals", null) in genital_list if(picked_organ) - picked_organ.toggle_through_clothes() + var/picked_visibility = input(src, "Choose visibility setting", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden") + picked_organ.toggle_visibility(picked_visibility) return @@ -251,6 +274,8 @@ return if(NOGENITALS in species_traits)//golems and such return + if(H.has_trait(TRAIT_HUSK)) + return var/list/genitals_to_add = list() var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) @@ -260,8 +285,6 @@ for(var/L in relevant_layers) //Less hardcode H.remove_overlay(L) - if(H.has_trait(TRAIT_HUSK)) - return //start scanning for genitals //var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again for(var/obj/item/organ/O in H.internal_organs) diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index ae58aabf51..38e8e44f39 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -58,9 +58,3 @@ if(linked_organ) linked_organ.linked_organ = null linked_organ = null - -/obj/item/organ/genital/penis/is_exposed() - . = ..() - if(.) - return TRUE - return owner.is_groin_exposed() diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm index 4d9eedb1cf..228c3141e3 100644 --- a/modular_citadel/code/modules/arousal/organs/vagina.dm +++ b/modular_citadel/code/modules/arousal/organs/vagina.dm @@ -64,9 +64,3 @@ if(linked_organ) linked_organ.linked_organ = null linked_organ = null - -/obj/item/organ/genital/vagina/is_exposed() - . = ..() - if(.) - return TRUE - return owner.is_groin_exposed() diff --git a/modular_citadel/code/modules/clothing/under/trek_under.dm b/modular_citadel/code/modules/clothing/under/trek_under.dm index 8abe564176..00f84b7583 100644 --- a/modular_citadel/code/modules/clothing/under/trek_under.dm +++ b/modular_citadel/code/modules/clothing/under/trek_under.dm @@ -241,7 +241,6 @@ icon_state = "fedcapofficer" alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi' item_state = "fedcapofficer_mob" - armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 0) //Variants /obj/item/clothing/head/caphat/formal/fedcover/medsci diff --git a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm index f026bd1045..a651541870 100644 --- a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm +++ b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm @@ -183,11 +183,16 @@ var/atom/movable/AM = thing if(isliving(AM)) var/mob/living/L = AM + var/mob/living/OW = owner if(L.absorbed && !include_absorbed) continue L.absorbed = FALSE L.stop_sound_channel(CHANNEL_PREYLOOP) L.cure_blind("belly_[REF(src)]") + SEND_SIGNAL(OW, COMSIG_CLEAR_MOOD_EVENT, "fedpred", /datum/mood_event/fedpred) + SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "fedprey", /datum/mood_event/fedprey) + SEND_SIGNAL(OW, COMSIG_ADD_MOOD_EVENT, "emptypred", /datum/mood_event/emptypred) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "emptyprey", /datum/mood_event/emptyprey) AM.forceMove(destination) // Move the belly contents into the same location as belly's owner. count++ for(var/mob/M in get_hearers_in_view(5, get_turf(owner))) @@ -219,6 +224,11 @@ var/mob/living/OW = owner ML.stop_sound_channel(CHANNEL_PREYLOOP) ML.cure_blind("belly_[REF(src)]") + SEND_SIGNAL(OW, COMSIG_CLEAR_MOOD_EVENT, "fedpred", /datum/mood_event/fedpred) + SEND_SIGNAL(ML, COMSIG_CLEAR_MOOD_EVENT, "fedprey", /datum/mood_event/fedprey) + SEND_SIGNAL(OW, COMSIG_ADD_MOOD_EVENT, "emptypred", /datum/mood_event/emptypred) + SEND_SIGNAL(ML, COMSIG_ADD_MOOD_EVENT, "emptyprey", /datum/mood_event/emptyprey) + if(ML.absorbed) ML.absorbed = FALSE if(ishuman(M) && ishuman(OW)) @@ -242,7 +252,14 @@ return if (prey.buckled) prey.buckled.unbuckle_mob(prey,TRUE) - + + if(!isbelly(prey.loc)) + SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "fedpred", /datum/mood_event/fedpred) + SEND_SIGNAL(prey, COMSIG_ADD_MOOD_EVENT, "fedprey", /datum/mood_event/fedprey) + else + SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "emptypred", /datum/mood_event/emptypred) + SEND_SIGNAL(prey, COMSIG_CLEAR_MOOD_EVENT, "emptyprey", /datum/mood_event/emptyprey) + prey.forceMove(src) var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE) if(!silent) diff --git a/strings/cas_white.txt b/strings/cas_white.txt index 6ff7dbddc7..8cf224d1db 100644 --- a/strings/cas_white.txt +++ b/strings/cas_white.txt @@ -293,4 +293,5 @@ A salt overdose. Mindswap. Potassium in the toilet bowls. Giving head to the heads. -A lizard wearing cat ears. \ No newline at end of file +A lizard wearing cat ears. +DOOR STUCK!!