April sync (#360)

* Maps and things no code/icons

* helpers defines globalvars

* Onclick world.dm orphaned_procs

* subsystems

Round vote and shuttle autocall done here too

* datums

* Game folder

* Admin - chatter modules

* clothing - mining

* modular computers - zambies

* client

* mob level 1

* mob stage 2 + simple_animal

* silicons n brains

* mob stage 3 + Alien/Monkey

* human mobs

* icons updated

* some sounds

* emitter y u no commit

* update tgstation.dme

* compile fixes

* travis fixes

Also removes Fast digest mode, because reasons.

* tweaks for travis Mentors are broke again

Also fixes Sizeray guns

* oxygen loss fix for vore code.

* removes unused code

* some code updates

* bulk fixes

* further fixes

* outside things

* whoops.

* Maint bar ported

* GLOBs.
This commit is contained in:
Poojawa
2017-04-13 23:37:00 -05:00
committed by GitHub
parent cdc32c98fa
commit 7e9b96a00f
1322 changed files with 174827 additions and 23888 deletions
+13 -13
View File
@@ -8,8 +8,8 @@
return istype(M) && M.has_antag_datum(/datum/antagonist/cultist, TRUE)
/proc/is_sacrifice_target(datum/mind/mind)
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = ticker.mode
if(SSticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = SSticker.mode
if(mind == cult_mode.sacrifice_target)
return 1
return 0
@@ -104,7 +104,7 @@
var/list/possible_targets = get_unconvertables()
if(!possible_targets.len)
message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
for(var/mob/living/carbon/human/player in player_list)
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !(player.mind in cultists_to_cult))
possible_targets += player.mind
if(possible_targets.len > 0)
@@ -175,18 +175,18 @@
return TRUE
/datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind)
var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
var/datum/atom_hud/antag/culthud = GLOB.huds[ANTAG_HUD_CULT]
culthud.join_hud(cult_mind.current)
set_antag_hud(cult_mind.current, "cult")
/datum/game_mode/proc/update_cult_icons_removed(datum/mind/cult_mind)
var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
var/datum/atom_hud/antag/culthud = GLOB.huds[ANTAG_HUD_CULT]
culthud.leave_hud(cult_mind.current)
set_antag_hud(cult_mind.current, null)
/datum/game_mode/cult/proc/get_unconvertables()
var/list/ucs = list()
for(var/mob/living/carbon/human/player in player_list)
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !is_convertable_to_cult(player) && !(player.mind in cultists_to_cult))
ucs += player.mind
return ucs
@@ -198,7 +198,7 @@
if(cult_objectives.Find("eldergod"))
cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once
if(cult_objectives.Find("sacrifice"))
if(sacrifice_target && !sacrificed.Find(sacrifice_target)) //if the target has been sacrificed, ignore this step. otherwise, add 1 to cult_fail
if(sacrifice_target && !GLOB.sacrificed.Find(sacrifice_target)) //if the target has been GLOB.sacrificed, ignore this step. otherwise, add 1 to cult_fail
cult_fail++
return cult_fail //if any objectives aren't met, failure
@@ -237,14 +237,14 @@
if(!check_survive())
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='greenannounce'>Success!</span>"
feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
ticker.news_report = CULT_ESCAPE
SSticker.news_report = CULT_ESCAPE
else
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='boldannounce'>Fail.</span>"
feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]")
ticker.news_report = CULT_FAILURE
SSticker.news_report = CULT_FAILURE
if("sacrifice")
if(sacrifice_target)
if(sacrifice_target in sacrificed)
if(sacrifice_target in GLOB.sacrificed)
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <span class='greenannounce'>Success!</span>"
feedback_add_details("cult_objective","cult_sacrifice|SUCCESS")
else if(sacrifice_target && sacrifice_target.current)
@@ -257,11 +257,11 @@
if(!eldergod)
explanation = "Summon Nar-Sie. <span class='greenannounce'>Success!</span>"
feedback_add_details("cult_objective","cult_narsie|SUCCESS")
ticker.news_report = CULT_SUMMON
SSticker.news_report = CULT_SUMMON
else
explanation = "Summon Nar-Sie. <span class='boldannounce'>Fail.</span>"
feedback_add_details("cult_objective","cult_narsie|FAIL")
ticker.news_report = CULT_FAILURE
SSticker.news_report = CULT_FAILURE
text += "<br><B>Objective #[obj_count]</B>: [explanation]"
to_chat(world, text)
@@ -270,7 +270,7 @@
/datum/game_mode/proc/auto_declare_completion_cult()
if( cult.len || (ticker && istype(ticker.mode,/datum/game_mode/cult)) )
if( cult.len || (SSticker && istype(SSticker.mode,/datum/game_mode/cult)) )
var/text = "<br><font size=3><b>The cultists were:</b></font>"
for(var/datum/mind/cultist in cult)
text += printplayer(cultist)
+4 -9
View File
@@ -17,22 +17,17 @@
return
cultist_commune(usr, input)
return
/proc/cultist_commune(mob/living/user, message)
if(!message)
return
if(!ishuman(user))
user.say("O bidai nabora se[pick("'","`")]sma!")
user.say(html_decode(message))
else
user.whisper("O bidai nabora se[pick("'","`")]sma!")
user.whisper(html_decode(message))
user.whisper("O bidai nabora se[pick("'","`")]sma!")
user.whisper(html_decode(message))
var/my_message = "<span class='cultitalic'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]:</b> [message]</span>"
for(var/mob/M in mob_list)
for(var/mob/M in GLOB.mob_list)
if(iscultist(M))
to_chat(M, my_message)
else if(M in dead_mob_list)
else if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [my_message]")
+2 -3
View File
@@ -328,7 +328,7 @@
return
if(!iscultist(user))
user.dropItemToGround(src, TRUE)
step(src, pick(alldirs))
step(src, pick(GLOB.alldirs))
to_chat(user, "<span class='warning'>\The [src] flickers out of your hands, your connection to this dimension is too strong!</span>")
return
@@ -375,7 +375,7 @@
if(istype(A, /obj/item))
var/list/cultists = list()
for(var/datum/mind/M in ticker.mode.cult)
for(var/datum/mind/M in SSticker.mode.cult)
if(M.current && M.current.stat != DEAD)
cultists |= M.current
var/mob/living/cultist_to_receive = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in (cultists - user)
@@ -403,5 +403,4 @@
else
..()
to_chat(user, "<span class='warning'>\The [src] can only transport items!</span>")
return
+6 -6
View File
@@ -122,12 +122,6 @@
to_chat(user, "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating [N]!</span>")
var/list/blacklisted_pylon_turfs = typecacheof(list(
/turf/closed,
/turf/open/floor/engine/cult,
/turf/open/space,
/turf/open/floor/plating/lava,
/turf/open/chasm))
/obj/structure/destructible/cult/pylon
name = "pylon"
@@ -177,6 +171,12 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
if(istype(T, /turf/open/floor/engine/cult))
cultturfs |= T
continue
var/static/list/blacklisted_pylon_turfs = typecacheof(list(
/turf/closed,
/turf/open/floor/engine/cult,
/turf/open/space,
/turf/open/floor/plating/lava,
/turf/open/chasm))
if(is_type_in_typecache(T, blacklisted_pylon_turfs))
continue
else
+10 -8
View File
@@ -15,11 +15,12 @@ This file contains the arcane tome files.
/obj/item/weapon/tome/New()
..()
if(!LAZYLEN(rune_types))
rune_types = list()
if(!LAZYLEN(GLOB.rune_types))
GLOB.rune_types = list()
var/static/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
for(var/i_can_do_loops_now_thanks_remie in non_revealed_runes)
var/obj/effect/rune/R = i_can_do_loops_now_thanks_remie
rune_types[initial(R.cultist_name)] = R //Uses the cultist name for displaying purposes
GLOB.rune_types[initial(R.cultist_name)] = R //Uses the cultist name for displaying purposes
/obj/item/weapon/tome/examine(mob/user)
..()
@@ -180,10 +181,10 @@ This file contains the arcane tome files.
if(!check_rune_turf(Turf, user))
return
entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in rune_types
entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in GLOB.rune_types
if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user))
return
rune_to_scribe = rune_types[entered_rune_name]
rune_to_scribe = GLOB.rune_types[entered_rune_name]
if(!rune_to_scribe)
return
if(initial(rune_to_scribe.req_keyword))
@@ -196,12 +197,12 @@ This file contains the arcane tome files.
if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user))
return
if(ispath(rune_to_scribe, /obj/effect/rune/narsie))
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = ticker.mode
if(SSticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = SSticker.mode
if(!("eldergod" in cult_mode.cult_objectives))
to_chat(user, "<span class='warning'>Nar-Sie does not wish to be summoned!</span>")
return
if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed))
if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in GLOB.sacrificed))
to_chat(user, "<span class='warning'>The sacrifice is not complete. The portal would lack the power to open if you tried!</span>")
return
if(!cult_mode.eldergod)
@@ -244,6 +245,7 @@ This file contains the arcane tome files.
if(S && !QDELETED(S))
qdel(S)
var/obj/effect/rune/R = new rune_to_scribe(Turf, chosen_keyword)
R.add_mob_blood(user)
to_chat(user, "<span class='cult'>The [lowertext(R.cultist_name)] rune [R.cultist_desc]</span>")
feedback_add_details("cult_runes_scribed", R.cultist_name)
+35 -43
View File
@@ -1,7 +1,7 @@
/var/list/sacrificed = list() //a mixed list of minds and mobs
var/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
var/global/list/rune_types //Every rune that can be drawn by tomes
GLOBAL_LIST_EMPTY(sacrificed) //a mixed list of minds and mobs
GLOBAL_LIST(rune_types) //Every rune that can be drawn by tomes
GLOBAL_LIST_EMPTY(teleport_runes)
GLOBAL_LIST_EMPTY(wall_runes)
/*
This file contains runes.
@@ -58,13 +58,10 @@ To draw a rune, use an arcane tome.
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>")
qdel(src)
return
else if(istype(I, /obj/item/weapon/nullrod))
user.say("BEGONE FOUL MAGIKS!!")
to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>")
qdel(src)
return
return
/obj/effect/rune/attack_hand(mob/living/user)
if(!iscultist(user))
@@ -143,20 +140,20 @@ structure_check() searches for nearby cultist structures required for the invoca
do_invoke_glow()
/obj/effect/rune/proc/do_invoke_glow()
set waitfor = FALSE
var/oldtransform = transform
spawn(0) //animate is a delay, we want to avoid being delayed
animate(src, transform = matrix()*2, alpha = 0, time = 5) //fade out
animate(transform = oldtransform, alpha = 255, time = 0)
animate(src, transform = matrix()*2, alpha = 0, time = 5) //fade out
sleep(5)
animate(src, transform = oldtransform, alpha = 255, time = 0)
/obj/effect/rune/proc/fail_invoke()
//This proc contains the effects of a rune if it is not invoked correctly, through either invalid wording or not enough cultists. By default, it's just a basic fizzle.
visible_message("<span class='warning'>The markings pulse with a \
small flash of red light, then fall dark.</span>")
spawn(0) //animate is a delay, we want to avoid being delayed
var/oldcolor = color
color = rgb(255, 0, 0)
animate(src, color = oldcolor, time = 5)
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5)
var/oldcolor = color
color = rgb(255, 0, 0)
animate(src, color = oldcolor, time = 5)
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5)
//Malformed Rune: This forms if a rune is not drawn correctly. Invoking it does nothing but hurt the user.
/obj/effect/rune/malformed
@@ -179,7 +176,7 @@ structure_check() searches for nearby cultist structures required for the invoca
/mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes
var/obj/item/weapon/nullrod/N = locate() in src
if(N && !ratvar_awakens) //If Nar-Sie or Ratvar are alive, null rods won't protect you
if(N && !GLOB.ratvar_awakens) //If Nar-Sie or Ratvar are alive, null rods won't protect you
return N
return 0
@@ -247,7 +244,6 @@ structure_check() searches for nearby cultist structures required for the invoca
if(!P.info && !istype(P, /obj/item/weapon/paper/talisman))
. |= P
var/list/teleport_runes = list()
/obj/effect/rune/teleport
cultist_name = "Teleport"
cultist_desc = "warps everything above it to another chosen teleport rune."
@@ -262,17 +258,17 @@ var/list/teleport_runes = list()
var/area/A = get_area(src)
var/locname = initial(A.name)
listkey = set_keyword ? "[set_keyword] [locname]":"[locname]"
teleport_runes += src
GLOB.teleport_runes += src
/obj/effect/rune/teleport/Destroy()
teleport_runes -= src
GLOB.teleport_runes -= src
return ..()
/obj/effect/rune/teleport/invoke(var/list/invokers)
var/mob/living/user = invokers[1] //the first invoker is always the user
var/list/potential_runes = list()
var/list/teleportnames = list()
for(var/R in teleport_runes)
for(var/R in GLOB.teleport_runes)
var/obj/effect/rune/teleport/T = R
if(T != src && (T.z <= ZLEVEL_SPACEMAX))
potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
@@ -392,7 +388,7 @@ var/list/teleport_runes = list()
convertee.visible_message("<span class='warning'>[convertee] writhes in pain \
[brutedamage || burndamage ? "even as [convertee.p_their()] wounds heal and close" : "as the markings below [convertee.p_them()] glow a bloody red"]!</span>", \
"<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
ticker.mode.add_cultist(convertee.mind, 1)
SSticker.mode.add_cultist(convertee.mind, 1)
new /obj/item/weapon/tome(get_turf(src))
convertee.mind.special_role = "Cultist"
to_chat(convertee, "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
@@ -410,11 +406,11 @@ var/list/teleport_runes = list()
var/sacrifice_fulfilled = FALSE
if(sacrificial.mind)
sacrificed += sacrificial.mind
GLOB.sacrificed += sacrificial.mind
if(is_sacrifice_target(sacrificial.mind))
sacrifice_fulfilled = TRUE
else
sacrificed += sacrificial
GLOB.sacrificed += sacrificial
new /obj/effect/overlay/temp/cult/sac(get_turf(src))
for(var/M in invokers)
@@ -459,10 +455,10 @@ var/list/teleport_runes = list()
/obj/effect/rune/narsie/New()
. = ..()
poi_list |= src
GLOB.poi_list |= src
/obj/effect/rune/narsie/Destroy()
poi_list -= src
GLOB.poi_list -= src
. = ..()
/obj/effect/rune/narsie/talismanhide() //can't hide this, and you wouldn't want to
@@ -476,8 +472,8 @@ var/list/teleport_runes = list()
var/datum/game_mode/cult/cult_mode
if(ticker.mode.name == "cult")
cult_mode = ticker.mode
if(SSticker.mode.name == "cult")
cult_mode = SSticker.mode
if(!cult_mode && !ignore_gamemode)
for(var/M in invokers)
@@ -486,7 +482,7 @@ var/list/teleport_runes = list()
log_game("Summon Nar-Sie rune failed - gametype is not cult")
return
if(locate(/obj/singularity/narsie) in poi_list)
if(locate(/obj/singularity/narsie) in GLOB.poi_list)
for(var/M in invokers)
to_chat(M, "<span class='warning'>Nar-Sie is already on this plane!</span>")
log_game("Summon Nar-Sie rune failed - already summoned")
@@ -510,15 +506,13 @@ var/list/teleport_runes = list()
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) with a tome")
message_admins("[key_name_admin(user)] erased a Narsie rune with a tome")
..()
return
else
if(istype(I, /obj/item/weapon/nullrod)) //Begone foul magiks. You cannot hinder me.
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) using a null rod")
message_admins("[key_name_admin(user)] erased a Narsie rune with a null rod")
..()
return
//Rite of Resurrection: Requires the corpse of a cultist and that there have been less revives than the number of people sacrificed
//Rite of Resurrection: Requires the corpse of a cultist and that there have been less revives than the number of people GLOB.sacrificed
/obj/effect/rune/raise_dead
cultist_name = "Raise Dead"
cultist_desc = "requires the corpse of a cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be revived."
@@ -531,8 +525,8 @@ var/list/teleport_runes = list()
..()
if(iscultist(user) || user.stat == DEAD)
var/revive_number = 0
if(sacrificed.len)
revive_number = sacrificed.len - revives_used
if(GLOB.sacrificed.len)
revive_number = GLOB.sacrificed.len - revives_used
to_chat(user, "<b>Revives Remaining:</b> [revive_number]")
/obj/effect/rune/raise_dead/invoke(var/list/invokers)
@@ -550,8 +544,8 @@ var/list/teleport_runes = list()
log_game("Raise Dead rune failed - no corpses to revive")
fail_invoke()
return
if(!sacrificed.len || sacrificed.len <= revives_used)
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
if(!GLOB.sacrificed.len || GLOB.sacrificed.len <= revives_used)
to_chat(user, "<span class='warning'>You have GLOB.sacrificed too few people to revive a cultist!</span>")
fail_invoke()
return
if(potential_revive_mobs.len > 1)
@@ -594,7 +588,7 @@ var/list/teleport_runes = list()
fail_invoke()
log_game("Raise Dead rune failed - revival target has no ghost")
return 0
if(!sacrificed.len || sacrificed.len <= revives_used)
if(!GLOB.sacrificed.len || GLOB.sacrificed.len <= revives_used)
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
fail_invoke()
log_game("Raise Dead rune failed - too few sacrificed")
@@ -710,8 +704,6 @@ var/list/teleport_runes = list()
sleep(1)
rune_in_use = 0
var/list/wall_runes = list()
//Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo.
/obj/effect/rune/wall
cultist_name = "Form Barrier"
@@ -725,7 +717,7 @@ var/list/wall_runes = list()
/obj/effect/rune/wall/New()
..()
wall_runes += src
GLOB.wall_runes += src
/obj/effect/rune/wall/examine(mob/user)
..()
@@ -734,7 +726,7 @@ var/list/wall_runes = list()
/obj/effect/rune/wall/Destroy()
density = 0
wall_runes -= src
GLOB.wall_runes -= src
air_update_turf(1)
return ..()
@@ -757,7 +749,7 @@ var/list/wall_runes = list()
C.apply_damage(2, BRUTE, pick("l_arm", "r_arm"))
/obj/effect/rune/wall/proc/spread_density()
for(var/R in wall_runes)
for(var/R in GLOB.wall_runes)
var/obj/effect/rune/wall/W = R
if(W.z == z && get_dist(src, W) <= 2 && !W.density && !W.recharging)
W.density = TRUE
@@ -806,7 +798,7 @@ var/list/wall_runes = list()
/obj/effect/rune/summon/invoke(var/list/invokers)
var/mob/living/user = invokers[1]
var/list/cultists = list()
for(var/datum/mind/M in ticker.mode.cult)
for(var/datum/mind/M in SSticker.mode.cult)
if(!(M.current in invokers) && M.current && M.current.stat != DEAD)
cultists |= M.current
var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in cultists
@@ -992,7 +984,7 @@ var/list/wall_runes = list()
var/obj/structure/emergency_shield/invoker/N = new(T)
new_human.key = ghost_to_spawn.key
ticker.mode.add_cultist(new_human.mind, 0)
SSticker.mode.add_cultist(new_human.mind, 0)
to_chat(new_human, "<span class='cultitalic'><b>You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs.</b></span>")
while(user in T)
+1 -2
View File
@@ -125,7 +125,7 @@
/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
var/list/potential_runes = list()
var/list/teleportnames = list()
for(var/R in teleport_runes)
for(var/R in GLOB.teleport_runes)
var/obj/effect/rune/teleport/T = R
potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
@@ -421,7 +421,6 @@
if(uses <= 0)
user.drop_item()
qdel(src)
return
/obj/item/weapon/restraints/handcuffs/energy/cult //For the talisman of shackling
name = "cult shackles"