diff --git a/_maps/map_files/shuttles/emergency_narnar.dmm b/_maps/map_files/shuttles/emergency_narnar.dmm index 537d0f5ba82..f36caa90e27 100644 --- a/_maps/map_files/shuttles/emergency_narnar.dmm +++ b/_maps/map_files/shuttles/emergency_narnar.dmm @@ -37,15 +37,15 @@ "aK" = (/obj/effect/rune,/mob/living/simple_animal/hostile/construct/wraith,/turf/simulated/floor/engine/cult,/area/shuttle/escape) "aL" = (/mob/living/simple_animal/hostile/construct/armoured,/turf/simulated/floor/engine/cult,/area/shuttle/escape) "aM" = (/obj/effect/decal/cleanable/blood/innards,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/engine/cult,/area/shuttle/escape) -"aN" = (/mob/living/simple_animal/construct/wraith,/mob/living/simple_animal/hostile/construct/builder,/turf/simulated/floor/engine/cult,/area/shuttle/escape) -"aO" = (/mob/living/simple_animal/construct/builder,/mob/living/simple_animal/hostile/construct/behemoth,/turf/simulated/floor/engine/cult,/area/shuttle/escape) +"aN" = (/mob/living/simple_animal/hostile/construct/builder,/turf/simulated/floor/engine/cult,/area/shuttle/escape) +"aO" = (/mob/living/simple_animal/hostile/construct/behemoth,/turf/simulated/floor/engine/cult,/area/shuttle/escape) "aP" = (/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/extinguisher,/obj/item/weapon/crowbar,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor/engine/cult,/area/shuttle/escape) "aQ" = (/obj/effect/decal/cleanable/blood/writing,/obj/effect/decal/cleanable/blood/writing,/turf/simulated/floor/engine/cult,/area/shuttle/escape) "aR" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/obj/effect/spawner/window/reinforced{color = "red"},/turf/simulated/wall/cult,/area/shuttle/escape) "aS" = (/obj/machinery/status_display{pixel_y = -30},/obj/machinery/light/spot,/turf/simulated/floor/engine/cult,/area/shuttle/escape) "aT" = (/obj/machinery/door/airlock/cult/friendly,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape) "aU" = (/obj/effect/spawner/window/reinforced{color = "red"},/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/escape) -"aV" = (/mob/living/simple_animal/construct/armoured,/mob/living/simple_animal/hostile/construct/harvester,/turf/simulated/floor/engine/cult,/area/shuttle/escape) +"aV" = (/mob/living/simple_animal/hostile/construct/harvester,/turf/simulated/floor/engine/cult,/area/shuttle/escape) "aW" = (/obj/structure/dresser,/turf/simulated/floor/engine/cult,/area/shuttle/escape) "aX" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/turf/simulated/floor/engine/cult,/area/shuttle/escape) "aY" = (/obj/effect/decal/cleanable/blood/tracks/footprints,/turf/simulated/floor/engine/cult,/area/shuttle/escape) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 30066bb6bc9..1bff905116f 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -106,14 +106,6 @@ var/global/list/all_cults = list() /datum/game_mode/cult/post_setup() modePlayer += cult acolytes_needed = acolytes_needed + round((num_players_started() / 10)) - if("sacrifice" in objectives) - var/list/possible_targets = get_unconvertables() - if(!possible_targets.len) - for(var/mob/living/carbon/human/player in player_list) - if(player.mind && !(player.mind in cult)) - possible_targets += player.mind - if(possible_targets.len > 0) - sacrifice_target = pick(possible_targets) for(var/datum/mind/cult_mind in cult) equip_cultist(cult_mind.current) @@ -187,6 +179,9 @@ var/global/list/all_cults = list() if(jobban_isbanned(cult_mind.current, ROLE_CULTIST)) replace_jobbaned_player(cult_mind.current, ROLE_CULTIST) update_cult_icons_added(cult_mind) + if(GAMEMODE_IS_CULT) + var/datum/game_mode/cult/cult_mode = ticker.mode + cult_mode.check_numbers() return 1 @@ -327,7 +322,7 @@ var/global/list/all_cults = list() feedback_add_details("cult_objective","cult_demons|FAIL") if("convert")//convert half the crew - if(obj_count < objectives.len) + if(cult.len >= convert_target) explanation = "Convert [convert_target] crewmembers ([cult.len] cultists at round end). Success!" feedback_add_details("cult_objective","cult_convertion|SUCCESS") else @@ -335,7 +330,7 @@ var/global/list/all_cults = list() feedback_add_details("cult_objective","cult_convertion|FAIL") if("bloodspill")//cover a large portion of the station in blood - if(obj_count < objectives.len) + if(max_spilled_blood >= spilltarget) explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). Success!" feedback_add_details("cult_objective","cult_bloodspill|SUCCESS") else diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index de13c11d852..bfe25eba5d5 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -34,6 +34,6 @@ if(iscultist(M)) to_chat(M, my_message) else if(M in dead_mob_list) - to_chat(M, " (F) [my_message] ") + to_chat(M, " (F) [my_message] ") log_say("[user.real_name]/[user.key] : [message]") \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm index 3449e4a1c95..2fe00023c20 100644 --- a/code/game/gamemodes/cult/cult_objectives.dm +++ b/code/game/gamemodes/cult/cult_objectives.dm @@ -155,13 +155,11 @@ if(!sacrificed.len) var/list/possible_targets = list() for(var/mob/living/carbon/human/player in player_list) - if(is_secure_level(player.z)) //We can't sacrifice people that are on the centcom z-level - continue if(player.mind && !is_convertable_to_cult(player.mind) && (player.stat != DEAD)) possible_targets += player.mind if(!possible_targets.len) - //There are no living Unconvertables on the station. Looking for a Sacrifice Target among the ordinary crewmembers + //There are no living Unconvertables on the station. Looking for a Sacrifice Target among the ordinary crewmembers for(var/mob/living/carbon/human/player in player_list) if(is_secure_level(player.z)) //We can't sacrifice people that are on the centcom z-level continue @@ -172,8 +170,7 @@ sacrifice_target = pick(possible_targets) possible_objectives |= "sacrifice" else - message_admins("Didn't find a suitable sacrifice target...what the hell? Shout at a coder.") - log_admin("Didn't find a suitable sacrifice target...what the hell? Shout at a coder.") + log_runtime(EXCEPTION("Didn't find a suitable sacrifice target...what the hell? Shout at a coder.")) if(!mass_convert) var/living_crew = 0 @@ -194,7 +191,7 @@ log_admin("There are [total] players, too little for the mass convert objective!") else possible_objectives |= "convert" - convert_target = round(total / 2) + convert_target = rand(9,15) if(!possible_objectives.len)//No more possible objectives, time to summon Nar-Sie message_admins("No suitable objectives left! Nar-Sie objective unlocked.") diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index c6062e1a16b..af488fdb028 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -975,6 +975,7 @@ var/list/teleport_runes = list() var/mob/living/carbon/human/new_human = new(get_turf(src)) new_human.real_name = ghost_to_spawn.real_name new_human.alpha = 150 //Makes them translucent + new_human.color = "grey" //heh..cult greytide...litterly... ..() visible_message("A cloud of red mist forms above [src], and from within steps... a man.") to_chat(user, "Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...") diff --git a/code/game/magic/Uristrunes.dm b/code/game/magic/Uristrunes.dm index 5cb7dc4127e..ed881c71fb1 100644 --- a/code/game/magic/Uristrunes.dm +++ b/code/game/magic/Uristrunes.dm @@ -17,7 +17,10 @@ var/runetype = "rune" /proc/get_rune(symbol_bits, animated = 0) var/lookup = "[symbol_bits]-[animated]" - if(ticker.mode.cultdat.theme == "fire") + + if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + runetype = "rune" + else if(ticker.mode.cultdat.theme == "fire") runetype = "fire-rune" if(lookup in rune_cache) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 2e76bcea6a2..763ca6c3191 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -489,6 +489,11 @@ if(ticker.mode.cult.len) dat += check_role_table("Cultists", ticker.mode.cult, 0) + dat += "
use Cult Mindspeak" + if(GAMEMODE_IS_CULT) + var/datum/game_mode/cult/cult_round = ticker.mode + if(!cult_round.narsie_condition_cleared) + dat += "
complete objective (debug)" if(ticker.mode.traitors.len) dat += check_role_table("Traitors", ticker.mode.traitors) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 1efb3567828..bef30d63e55 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1533,6 +1533,34 @@ else if(href_list["check_antagonist"]) check_antagonists() + else if(href_list["cult_nextobj"]) + if(alert(usr, "Validate the current Cult objective and unlock the next one?", "Cult Cheat Code", "Yes", "No") != "Yes") + return + + if(!GAMEMODE_IS_CULT) + alert("Couldn't locate cult mode datum! This shouldn't ever happen, tell a coder!") + return + + var/datum/game_mode/cult/cult_round = ticker.mode + cult_round.bypass_phase() + message_admins("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.") + log_admin("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.") + + else if(href_list["cult_mindspeak"]) + var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [ticker.mode.cultdat.entity_name]", "Voice of [ticker.mode.cultdat.entity_name]", "") + if(!input) + return + + for(var/datum/mind/H in ticker.mode.cult) + if (H.current) + to_chat(H.current, "[ticker.mode.cultdat.entity_name] murmurs, [input]") + + for(var/mob/dead/observer/O in player_list) + to_chat(O, "[ticker.mode.cultdat.entity_name] murmurs, [input]") + + message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [ticker.mode.cultdat.entity_name].") + log_admin("[key_name(usr)] Voice of [ticker.mode.cultdat.entity_name]: [input]") + else if(href_list["adminplayerobservecoodjump"]) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 5f1418fcae5..fd1b35efeca 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -29,10 +29,17 @@ /mob/living/simple_animal/hostile/construct/New() ..() - name = "[ticker.mode.cultdat.get_name(const_type)] ([rand(1, 1000)])" - real_name = ticker.mode.cultdat.get_name(const_type) - icon_living = ticker.mode.cultdat.get_icon(const_type) - icon_state = ticker.mode.cultdat.get_icon(const_type) + if(!ticker.mode)//work around for maps with runes and cultdat is not loaded all the way + name = "[const_type] ([rand(1, 1000)])" + real_name = const_type + icon_living = const_type + icon_state = const_type + else + name = "[ticker.mode.cultdat.get_name(const_type)] ([rand(1, 1000)])" + real_name = ticker.mode.cultdat.get_name(const_type) + icon_living = ticker.mode.cultdat.get_icon(const_type) + icon_state = ticker.mode.cultdat.get_icon(const_type) + for(var/spell in construct_spells) AddSpell(new spell(null)) diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 86a544fa278..7c50369b1f9 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ