diff --git a/__DEFINES/role_datums_defines.dm b/__DEFINES/role_datums_defines.dm index 50d37a15198..af54b09b028 100644 --- a/__DEFINES/role_datums_defines.dm +++ b/__DEFINES/role_datums_defines.dm @@ -146,6 +146,8 @@ #define RITUALABORT_TOOLS "moved talisman" #define RITUALABORT_REMOVED "victim removed" #define RITUALABORT_CONVERT "convert success" +#define RITUALABORT_REFUSED "convert refused" +#define RITUALABORT_NOCHOICE "convert nochoice" #define RITUALABORT_SACRIFICE "convert failure" #define RITUALABORT_FULL "no room" #define RITUALABORT_CONCEAL "conceal" @@ -178,6 +180,7 @@ #define CONVERSION_REFUSE -1 #define CONVERSION_NOCHOICE 0 #define CONVERSION_ACCEPT 1 +#define CONVERSION_BANNED 2 #define CONVERTIBLE_ALWAYS 1 #define CONVERTIBLE_CHOICE 2 @@ -186,6 +189,9 @@ #define CONVERTIBLE_ALREADY 5 #define CONVERTIBLE_IMPLANT 6 +#define DECONVERSION_ACCEPT 1 +#define DECONVERSION_REFUSE 2 + //////////////////////////////////////////////////////////////////////////////// // -- Objectives flags diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a3aa6ff4b1a..2a7ce466418 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1240,6 +1240,8 @@ var/global/list/common_tools = list( if((ishuman(M) || isslime(M)) && M.lying) if(locate(/obj/machinery/optable,M.loc) || locate(/obj/structure/bed/roller/surgery, M.loc)) return 1 + if(iscultist(U) && locate(/obj/structure/cult/altar, M.loc)) + return 1 if(locate(/obj/structure/bed/roller, M.loc) && prob(75)) return 1 var/obj/structure/table/T = locate(/obj/structure/table/, M.loc) diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 9b7ac8bfe9a..cfba04052bf 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -149,6 +149,16 @@ layer = HALLUCINATION_LAYER alpha = 0 +/obj/abstract/screen/fullscreen/confusion_border + icon_state = "conversionoverlay" + layer = HALLUCINATION_LAYER + alpha = 0 + +/obj/abstract/screen/fullscreen/deafmute_border + icon_state = "conversionoverlay" + layer = HALLUCINATION_LAYER + alpha = 0 + /obj/abstract/screen/fullscreen/conversion_red icon = 'icons/mob/screen1.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" diff --git a/code/datums/gamemode/factions/bloodcult/bloodcult.dm b/code/datums/gamemode/factions/bloodcult/bloodcult.dm index 885247c3fa4..de901338c5a 100644 --- a/code/datums/gamemode/factions/bloodcult/bloodcult.dm +++ b/code/datums/gamemode/factions/bloodcult/bloodcult.dm @@ -62,6 +62,8 @@ var/global/global_anchor_bloodstone // Keeps track of what stone becomes the anc var/list/cult_reminders = list() + var/list/bindings = list() + /datum/faction/bloodcult/check_win() return cult_win @@ -188,10 +190,9 @@ var/global/global_anchor_bloodstone // Keeps track of what stone becomes the anc new_obj = new /datum/objective/bloodcult_sacrifice for(var/datum/role/cultist/C in members) var/mob/M = C.antag.current - for(var/obj/item/weapon/implant/loyalty/I in M) - I.forceMove(get_turf(M)) - I.implanted = 0 - M.visible_message("\The [I] pops out of \the [M]'s head.") + if (iscarbon(M)) + var/mob/living/carbon/CARB = M + CARB.implant_pop() if (CULT_ACT_III) var/datum/objective/bloodcult_sacrifice/O = locate() in objective_holder.objectives minor_victory = TRUE // At any rate, we achieve a minor win. @@ -253,6 +254,50 @@ var/global/global_anchor_bloodstone // Keeps track of what stone becomes the anc if (O.IsFulfilled()) stage(CULT_ACT_IV) +/mob/living/carbon/proc/implant_pop() + for(var/obj/item/weapon/implant/loyalty/I in src) + if (I.implanted) + to_chat(src, "Your blood pushes back against the loyalty implant, it will visibly pop out within seconds!") + spawn(10 SECONDS) + I.forceMove(get_turf(src)) + I.implanted = 0 + visible_message("\The [I] pops out of \the [src]'s head.") + +/mob/living/carbon/proc/boxify(var/delete_body = TRUE, var/new_anim = TRUE, var/box_state = "cult")//now its own proc so admins may atomProcCall it if they so desire. + var/turf/T = get_turf(src) + for(var/mob/living/M in dview(world.view, T, INVISIBILITY_MAXIMUM)) + if (M.client) + M.playsound_local(T, 'sound/effects/convert_failure.ogg', 75, 0, -4) + if (new_anim) + var/obj/effect/cult_ritual/conversion/anim = new(T) + anim.icon_state = "" + flick("rune_convert_failure",anim) + anim.Die() + var/obj/item/weapon/storage/cult/coffer = new(T) + coffer.icon_state = box_state + var/obj/item/weapon/reagent_containers/food/drinks/cult/cup = new(coffer) + if (istype(src,/mob/living/carbon/human) && dna) + take_blood(cup, cup.volume)//Up to 60u + cup.on_reagent_change()//so we get the reagentsfillings overlay + new/obj/item/weapon/skull(coffer) + if (isslime(src)) + cup.reagents.add_reagent(SLIMEJELLY, 50) + if (isalien(src))//w/e + cup.reagents.add_reagent(RADIUM, 50) + + for(var/obj/item/weapon/implant/loyalty/I in src) + I.implanted = 0 + + for(var/obj/item/I in src) + u_equip(I) + if(I) + I.forceMove(T) + I.reset_plane_and_layer() + I.dropped(src) + I.forceMove(coffer) + if (delete_body) + qdel(src) + /datum/faction/bloodcult/proc/add_bloody_floor(var/turf/T) if (!istype(T)) return @@ -388,13 +433,11 @@ var/global/global_anchor_bloodstone // Keeps track of what stone becomes the anc if(ishuman(Grab.affecting)) var/mob/living/carbon/human/H = Grab.affecting if(!(H.species.anatomy_flags & NO_BLOOD)) - for(var/datum/organ/external/org in H.organs) - if(org.status & ORGAN_BLEEDING) - var/blood_volume = round(H.vessel.get_reagent_amount(BLOOD)) - var/blood_gathered = min(amount_needed-amount_gathered,blood_volume) - data[BLOODCOST_TARGET_GRAB] = H - data[BLOODCOST_AMOUNT_GRAB] = blood_gathered - amount_gathered += blood_gathered + var/blood_volume = round(H.vessel.get_reagent_amount(BLOOD)) + var/blood_gathered = min(amount_needed-amount_gathered,blood_volume) + data[BLOODCOST_TARGET_GRAB] = H + data[BLOODCOST_AMOUNT_GRAB] = blood_gathered + amount_gathered += blood_gathered if(ismonkey(Grab.affecting) || isalien(Grab.affecting))//Unlike humans, monkeys take oxy damage when blood is taken from them. var/mob/living/carbon/C = Grab.affecting if(!C.isDead()) diff --git a/code/datums/gamemode/factions/bloodcult/bloodcult_buildings.dm b/code/datums/gamemode/factions/bloodcult/bloodcult_buildings.dm index 4b21b80dc52..061c90586f4 100644 --- a/code/datums/gamemode/factions/bloodcult/bloodcult_buildings.dm +++ b/code/datums/gamemode/factions/bloodcult/bloodcult_buildings.dm @@ -557,10 +557,22 @@ var/extra = "" if (H && istype(H)) if (H.isInCrit()) - extra = " - CRITICAL" + extra = " - CRITICAL" else if (H.isDead()) extra = " - DEAD" dat += "