diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 9b890787d7f..cae03f19776 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -677,3 +677,103 @@ desc = "It's an orb of crystalized blood. Can be used to transfer blood between cultists." var/blood = 50 +/obj/item/rune_portaler //I suck with names + name = "reality opener" + icon = 'icons/obj/cult.dmi' + icon_state = "amulet" + desc = "Some ammulet made out of metal, bluespace crystals, and blood. Allows cultists to open portals over teleport runes, destroying the rune in the process." + + +/obj/item/rune_portaler/afterattack(atom/O, mob/user, proximity) + . = ..() + if(!iscultist(user) && ishuman(user)) + var/mob/living/carbon/human/H = user + to_chat(H, "\"So, you want to explore space?\"") + to_chat(H, "Space flashes around you as you are moved somewhere else!") + H.Confused(10) + H.flash_eyes(override_blindness_check = TRUE) + H.EyeBlind(10) + do_teleport(H, get_turf(H), 5, asoundin = 'sound/magic/cult_spell.ogg') + qdel(src) + + if(istype(O, /obj/effect/rune)) + if(!istype(O, /obj/effect/rune/teleport)) + to_chat(user, "[src] only works on teleport runes.") + return + if(!proximity) + to_chat(user, "You are too far away from the teleport rune.") + return + var/obj/effect/rune/teleport/R = O + attempt_portal(R, user) + +/obj/item/rune_portaler/proc/attempt_portal(var/obj/effect/rune/teleport/R, mob/user) + var/list/potential_runes = list() + var/list/teleportnames = list() + var/list/duplicaterunecount = list() + var/turf/T = get_turf(src) //used to tell the other rune where we came from + + for(var/I in GLOB.teleport_runes) + var/obj/effect/rune/teleport/target = I + var/resultkey = target.listkey + if(resultkey in teleportnames) + duplicaterunecount[resultkey]++ + resultkey = "[resultkey] ([duplicaterunecount[resultkey]])" + else + teleportnames += resultkey + duplicaterunecount[resultkey] = 1 + if(target != R && is_level_reachable(target.z)) + potential_runes[resultkey] = target + + if(!length(potential_runes)) + to_chat(user, "There are no valid runes to teleport to!") + return + + if(!is_level_reachable(user.z)) + to_chat(user, "You are not in the right dimension!") + return + + var/input_rune_key = input(user, "Choose a rune to make a portal to.", "Rune to make a portal to") as null|anything in potential_runes //we know what key they picked + var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? + if(QDELETED(R) || QDELETED(actual_selected_rune) ||!Adjacent(user) || user.incapacitated()) + return + + if(is_mining_level(R.z) && !is_mining_level(actual_selected_rune.z)) + actual_selected_rune.handle_portal("lava") + else if(!is_station_level(R.z) || istype(get_area(src), /area/space)) + actual_selected_rune.handle_portal("space", T) + new /obj/effect/portal/cult(get_turf(R), get_turf(actual_selected_rune), src, 4 MINUTES) + to_chat(user, "You use the magic of the amulet to turn [R] into a portal.") + qdel(R) + qdel(src) + +/obj/effect/portal/cult + name = "eldritch portal" + desc = "An evil portal made by dark magics. Suprisingly stable. Destroying the rune, or using a multitool on the portal, should close it." + icon_state = "portal1" + failchance = 0 + precision = FALSE + can_multitool_to_remove = TRUE + var/obj/effect/temp_visual/cult_portal_exit/exit = null + +/obj/effect/portal/cult/New() + ..() + exit = new /obj/effect/temp_visual/cult_portal_exit + exit.forceMove(target) + +/obj/effect/portal/cult/attackby(obj/I, mob/user, params) + if((istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user))) + to_chat(user, "You close the portal with your dagger.") + qdel(src) + return ..() + +/obj/effect/portal/cult/Destroy() + qdel(exit) + return ..() + +/obj/effect/temp_visual/cult_portal_exit + name = "eldritch rift" + desc = "An exit point for some cult portal. Be on guard, more things may come out of it" + icon = 'icons/obj/biomass.dmi' + icon_state = "rift" + duration = 4 MINUTES + color = "red" diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 8eae3876082..9c3ad248ebe 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -304,7 +304,7 @@ GLOBAL_LIST_INIT(blacklisted_pylon_turfs, typecacheof(list( selection_title = "Archives" creation_message = "You invoke the dark magic of the tomes creating a %ITEM%!" choosable_items = list("Shuttle Curse" = /obj/item/shuttle_curse, "Zealot's Blindfold" = /obj/item/clothing/glasses/hud/health/night/cultblind, - "Veil Shifter" = /obj/item/cult_shift) //Add void torch to veil shifter spawn + "Veil Shifter" = /obj/item/cult_shift, "Reality Opener" = /obj/item/rune_portaler) //Add void torch to veil shifter spawn /obj/structure/cult/functional/archives/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index c617860643e..1e3ab35178b 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -375,7 +375,7 @@ GLOBAL_LIST_INIT(cult_recipes, list ( \ new /datum/stack_recipe/cult("runed girder (used to make cult walls)", /obj/structure/girder/cult, 1, time = 10, one_per_turf = TRUE, on_floor = TRUE, no_cult_structure = TRUE), \ new /datum/stack_recipe/cult("pylon (heals nearby cultists)", /obj/structure/cult/functional/pylon, 4, time = 40, one_per_turf = TRUE, on_floor = TRUE, no_cult_structure = TRUE), \ new /datum/stack_recipe/cult("forge (crafts shielded robes, flagellant's robes, and mirror shields)", /obj/structure/cult/functional/forge, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE, no_cult_structure = TRUE), \ - new /datum/stack_recipe/cult("archives (crafts zealot's blindfolds, shuttle curse orbs, and veil shifters)", /obj/structure/cult/functional/archives, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE, no_cult_structure = TRUE), \ + new /datum/stack_recipe/cult("archives (crafts zealot's blindfolds, shuttle curse orbs, veil shifters, and reality openers)", /obj/structure/cult/functional/archives, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE, no_cult_structure = TRUE), \ new /datum/stack_recipe/cult("altar (crafts eldritch whetstones, construct shells, and flasks of unholy water)", /obj/structure/cult/functional/altar, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE, no_cult_structure = TRUE), )) diff --git a/icons/obj/cult.dmi b/icons/obj/cult.dmi index 3990a894f33..cad8f3525ae 100644 Binary files a/icons/obj/cult.dmi and b/icons/obj/cult.dmi differ