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