Blood Cult 2: Electric Boogaloo (#14516)

* DMI files

* Progress

* we compiling

* innate cult action, various progress

* Reorganise runes, fix cult dagger action and admin cultist

* Cult tooltips, dagger icons

* Add mirror shield, return runes back to OG circles

* Cult structure lights, pylon update

* bola update, progress..

* cleaning rune fix, girder/structures anchor

* speed up cult walls

* Convert rune update, tweaks

* Add teleport portals

* fix runtimes

* cult objs start

* move current cult objs to backup

* Rework cult objectives, add narsie/singulo interactions

* spacing, admin log and message

* reviewstuff

* refactor cult conceal/reveal

* add a bit of range to reveal

* blood magic tweaks, hallway not in summon areas

* implement structure concealment, offer uncuff

* add parry sound, fix cult airlock reveal appearance

* Update remaining runes

* fix pylon blood restaure, up blood magic cost

* review tweaks and progress

* fix compilation

* fix offering rune bug

* Draw blood rune action refactor

* moar tweaks

* fixes, holy water blood magic clean, icons

* Add cultist hardsuit, tweaks

* reduce needed pylons for cult ghost, cult shield

* spirit realm fixes

* fix dark spirit

* Add blood rites

* exotic blood handling

* spacing, add adminbus dagger, bal. rune health cost

* woops

missed a var

* fix blood rite healing

* emp spell cult immunity

* fix exploit and narsie references

* new rune sprites

* color defines

* SEND_SOUNDS, cult summon areas

* fix soap, barrier, and add CC location on narsie

* cult structure fix

* functional ascendance, undo cult spacesuit changes

* woops

* whetstone qdel, tweaks

* fix empty area selection bug

* cult ascendance numbers

* add cult blade sprite, add sacrificing head/brains

* review stuff

* fix runtime and twisted cons target

* review stuff

* code clarity

* remove unnecessary cultist checks

* Add support for wizard cultists

* cleanip

* fix concealed glass airlocks

* update objs

* remove talisman ref

* fix status procs

* clarifications, remove unnecessary var

* deconflicting

* deconflicting LF

* oops

* readd new icons

* more conflcit stuff

* readd drill and jaws icons

* review stuff

* silence on conversion

* Readd compact sniper icons

* Remove ambiguity

* 2 sacrifices required

* check antag panel improvements, bug fixes

* limits narsie cult ghost cheese

* CC message

* trailing newlines

* Shade/construct update

* bug fixes

* balance bloodboil, update CC message

* add a newline to something i didnt touch

idk ask travis bout it

* remove metastation extra null rod and shard

* fix teleport runes list, update icon

* remove tg cultist icon

* update cult actions with new tome

* Remove mirror shield throw, spell constructs

Add in sacrificing any brain with a mind.

* Fix more conflicts

* Fix double return

* Add descriptions to cult recipes, fix icons

* fix shuttle curse exploit

* Update wall rune, cult shields, runed recipe width

* implement flagellant sprites, misc changes

* Fix conversion rune

* Add cult blood barrage healing

* Trailing line

* fix whitespace

* Remove can_speak check on invoke

* Deconflict pt. 2

* Bugfixes the 1st

Fixes bugs 2 and 4 in the 'Known Issues' section

* cult.dm tweaks

Oh boy, even more commits!

* Fixes blood halberds swapping directions on wield

* Tweaks and stylin'

Changed a few span classes around and added a 'Remaining Charges' display to the Blood Rite spell

* Ritual tweaks (And some other stuff)

Fixes:
Altar stray pixel,
Using 'Twisted Construction' on a cult door,
Rune drawing checks,
probably more idk

* Rune tweaks & fixes

Fixes:
Wraith glowing not turning off while jaunted,
A MASSIVE oversight by me with playsound(),

probably also some other stuff but I've been staring at this file for a week and I've forgot most of what I did.

* Testmerge fixes the 1st

Fixes:
Ascendent is now Ascendant,
The Cultist greeting is now in the correct order,
IPCs now draw oil coloured runes,
No longer able to sacrifice a body multiple times,
Sacrificing a brain or head now gives a soul shard,
Converting an IPC or someone with robotic limbs now heals them correctly,
Probably more.

* Mirror Shield balancing

Being hit by a projectile above a damage threshold (10) now increases the chances of the mirror shield shattering, by 3% per damage point.

This may seem pretty low, but an Energy Gun would have a 30% chance of breaking the shield per hit. (Assuming I did this right, anyway.)

* Insect repairs and more

Changes:

Makes the shuttle curse lines a define,
Comments out the changing construct names,
Made flagellant robes block hair,
Added documentation to the mirror shield (See said documentation for details),
Made the cooldown examine text for cult structures display minutes and seconds,
Removed the ability to sacrifice the same body multiple times,
Cleaned up the soulstone code (and hopefully didn't break anything),

Probably still missed something, oh well!

* Rune opacity and Stun timing

Changes:

Halved all the values of the 'Stun' spell, since it was presumably an oversight. (20 second stun to 10)
The 'mouse_opacity' for runes has been set to 'opaque', this means that clicking on any spot on the tile will select it. (Less fiddly)
The '(REMOVE SPELL)' choice when choosing spells now only shows if there's any spells to remove.
Dunking someones head in the lava forge now only works if they have a head.

Also fixed a whole bunch of typos/gramatical errors.

* Blood Boil, Blood Barrage and EMP Sprites!

Changes:

Overhauled the 'Blood Boil' rune (See documentation)
Added in-hand sprites and red sparks for 'Blood bolt barrage'.
The nar'sie rune now removes all runes around it to prevent clipping.
Fixed runtime when examining the 'Arcane Barrage' spell.

Added new sprites for the EMP spell, courtesy of @kugamo!

Co-Authored-By: Kugamo <thekugamo@gmail.com>

* A few more tweaks

Changes:

Halved the percentages of 'Rise' (Glowing eyes) and 'Ascend' (Halos) to 10% and 20% respectively.
Hopefully fixed shield walls being passable while active.
Changed "Nar-sie" to "Nar'sie" in a few places.

* TM 2 fixes

Changes:

Teleport runes now only show the user when the animation has finished.
Cult shields are now invisible to ghosts when disabled.
Crayon runes now use the new rune sprites.
Construct night vision now actually works.
You can no longer soulstone yourself.
The death message for cult structures is now bigger.
Cult objectives are now displayed at roundstart.
Tweaked the icons for artificer spells.
Tweaked some cult related 'Tip of the round's.
Summoned cult ghosts no longer show in the 'Check Antagonists' panel when dead. (Hopefully)

* Cult members and Deconversion

Changes:

Using the 'Study the Veil' ability now shows how many members the cult has.
Holy water now unequips all cult clothing on deconversion. (Flagellant robe, blindfold, etc.)
Nar'Sie no longer warns admins that it doesn't have a containment field.
Fixed Zealot's Blindfolds not temporarily blinding any non-cultists who touch them.
The 'Summon Cultist' rune description now explains that restrained cultists cannot be summoned.
Fixed Travis (Probably)

* Cult Rise/Ascend balancing V1

The values here will almost certainly need some tweaking, but I feel like it's better than it was before; and certainly more customisable.

* Possibly maybe hopefully (one of) the last commits

Changes:

The cult halo no longer vanishes on relogging.
It's now possible to drag things on to runes again.

* A few minor fixes, and a major one

Changes:

Resetting your action button positions no longer completely breaks blood spells.
The downside to this fix is that Blood spells can no longer be moved around, so sorry sorry about that.

Fixes: #14393
Fixes: #13855

* New weapon sprites!

Adds fancy new sprites for all cult daggers and swords, courtesy of @McRamon!

They will need adjustments for Vox and Kidan at some point, and the Skrell inhand can look a bit odd at times, but those are also problems for every other weapon in the game so that can be fixed later.

Co-Authored-By: McRamon <31545294+McRamon@users.noreply.github.com>

* TM 3 fixes

Changes:

Fixed action button related bugs, including making them movable again! (probably caused a bunch more but eh),
Slightly tweaked threshold for ascendance,
Blood Rites now cleans up slime blood,
The Deconversion message is now bigger,
Flagellant robes now take 5% more damage (Lasers do 30 damage rather than 29),
Teleport runes can no longer be erased while a portal effect is open,
Teleport rune portals now always show the Z-Level if they're not in station space,
Teleporting another player no longer makes you temporarily invisible,
Attempting to summon a restrained cultist now gives said cultist a warning message,
Fixed a runtime when placing a soulstone in a construct,
Cultists now show on the Orbit menu if you have AntagHUD enabled,
Fixed a few typos

Co-authored-by: datlo <quentinkoyote@gmail.com>
Co-authored-by: Kugamo <thekugamo@gmail.com>
Co-authored-by: McRamon <31545294+McRamon@users.noreply.github.com>
This commit is contained in:
SabreML
2020-11-06 20:41:41 -05:00
committed by GitHub
co-authored by datlo Kugamo McRamon
parent 9aa98e2fb2
commit 678435d50a
99 changed files with 3696 additions and 2793 deletions
+26 -5
View File
@@ -442,12 +442,33 @@
dat += check_role_table("Ninjas", ticker.mode.ninjas)*/
if(SSticker.mode.cult.len)
var/datum/game_mode/gamemode = SSticker.mode
var/datum/objective/current_sac_obj = gamemode.cult_objs.current_sac_objective()
dat += check_role_table("Cultists", SSticker.mode.cult)
dat += "<br> use <a href='?src=[UID()];cult_mindspeak=[UID()]'>Cult Mindspeak</a>"
if(GAMEMODE_IS_CULT)
var/datum/game_mode/cult/cult_round = SSticker.mode
if(!cult_round.narsie_condition_cleared)
dat += "<br><a href='?src=[UID()];cult_nextobj=[UID()]'>complete objective (debug)</a>"
if(current_sac_obj)
dat += "<br>Current cult objective: <br>[current_sac_obj.explanation_text]"
else if(gamemode.cult_objs.cult_status == NARSIE_NEEDS_SUMMONING)
dat += "<br>Current cult objective: Summon [SSticker.cultdat ? SSticker.cultdat.entity_name : "Nar'Sie"]"
else if(gamemode.cult_objs.cult_status == NARSIE_HAS_RISEN)
dat += "<br>Current cult objective: Feed [SSticker.cultdat ? SSticker.cultdat.entity_name : "Nar'Sie"]"
else if(gamemode.cult_objs.cult_status == NARSIE_HAS_FALLEN)
dat += "<br>Current cult objective: Kill all non-cultists"
else
dat += "<br>Current cult objective: None! (This is most likely a bug, or var editing gone wrong.)"
dat += "<br>Sacrifice objectives completed: [gamemode.cult_objs.sacrifices_done]"
dat += "<br>Sacrifice objectives needed for summoning: [gamemode.cult_objs.sacrifices_required]"
dat += "<br>Summoning locations: [english_list(gamemode.cult_objs.obj_summon.summon_spots)]"
dat += "<br><a href='?src=[UID()];cult_mindspeak=[UID()]'>Cult Mindspeak</a>"
if(gamemode.cult_objs.cult_status == NARSIE_DEMANDS_SACRIFICE)
dat += "<br><a href='?src=[UID()];cult_adjustsacnumber=[UID()]'>Modify amount of sacrifices required</a>"
dat += "<br><a href='?src=[UID()];cult_newtarget=[UID()]'>Reroll sacrifice target</a>"
else
dat += "<br>Modify amount of sacrifices required (Summon available!)</a>"
dat += "<br>Reroll sacrifice target (Summon available!)</a>"
dat += "<br><a href='?src=[UID()];cult_newsummonlocations=[UID()]'>Reroll summoning locations</a>"
dat += "<br><a href='?src=[UID()];cult_unlocknarsie=[UID()]'>Unlock Nar'Sie summoning</a>"
if(SSticker.mode.traitors.len)
dat += check_role_table("Traitors", SSticker.mode.traitors)
+48 -23
View File
@@ -1676,40 +1676,65 @@
return
SStickets.autoRespond(index)
if(href_list["convert_ticket"])
var/indexNum = text2num(href_list["convert_ticket"])
if(href_list["is_mhelp"])
SSmentor_tickets.convert_to_other_ticket(indexNum)
else
SStickets.convert_to_other_ticket(indexNum)
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 = SSticker.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 [SSticker.cultdat.entity_name]", "Voice of [SSticker.cultdat.entity_name]", "")
var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [SSticker.cultdat.entity_name]", "Voice of [SSticker.cultdat.entity_name]")
if(!input)
return
for(var/datum/mind/H in SSticker.mode.cult)
if (H.current)
to_chat(H.current, "<span class='danger'>[SSticker.cultdat.entity_name]</span> murmurs, <span class='cultlarge'>[input]</span>")
if(H.current)
to_chat(H.current, "<span class='cult'>[SSticker.cultdat.entity_name] murmurs,</span> <span class='cultlarge'>\"[input]\"</span>")
for(var/mob/dead/observer/O in GLOB.player_list)
to_chat(O, "<span class='danger'>[SSticker.cultdat.entity_name]</span> murmurs, <span class='cultlarge'>[input]</span>")
to_chat(O, "<span class='cult'>[SSticker.cultdat.entity_name] murmurs,</span> <span class='cultlarge'>\"[input]\"</span>")
message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [SSticker.cultdat.entity_name].")
log_admin("[key_name(usr)] Voice of [SSticker.cultdat.entity_name]: [input]")
else if(href_list["cult_adjustsacnumber"])
var/amount = input("Adjust the amount of sacrifices required before summoning Nar'Sie", "Sacrifice Adjustment", 2) as null | num
if(amount > 0)
var/datum/game_mode/gamemode = SSticker.mode
var/old = gamemode.cult_objs.sacrifices_required
gamemode.cult_objs.sacrifices_required = amount
message_admins("Admin [key_name_admin(usr)] has modified the amount of cult sacrifices required before summoning from [old] to [amount]")
log_admin("Admin [key_name_admin(usr)] has modified the amount of cult sacrifices required before summoning from [old] to [amount]")
else if(href_list["cult_newtarget"])
if(alert(usr, "Reroll the cult's sacrifice target?", "Cult Debug", "Yes", "No") != "Yes")
return
var/datum/game_mode/gamemode = SSticker.mode
if(!gamemode.cult_objs.find_new_sacrifice_target())
gamemode.cult_objs.ready_to_summon()
message_admins("Admin [key_name_admin(usr)] has rerolled the Cult's sacrifice target.")
log_admin("Admin [key_name_admin(usr)] has rerolled the Cult's sacrifice target.")
else if(href_list["cult_newsummonlocations"])
if(alert(usr, "Reroll the cult's summoning locations?", "Cult Debug", "Yes", "No") != "Yes")
return
var/datum/game_mode/gamemode = SSticker.mode
gamemode.cult_objs.obj_summon.find_summon_locations(TRUE)
if(gamemode.cult_objs.cult_status == NARSIE_NEEDS_SUMMONING) //Only update cultists if they are already have the summon goal since they arent aware of summon spots till then
for(var/datum/mind/cult_mind in gamemode.cult)
if(cult_mind && cult_mind.current)
to_chat(cult_mind.current, "<span class='cult'>The veil has shifted! Our summoning will need to take place elsewhere.</span>")
to_chat(cult_mind.current, "<span class='cult'>Current goal : [gamemode.cult_objs.obj_summon.explanation_text]</span>")
message_admins("Admin [key_name_admin(usr)] has rerolled the Cult's sacrifice target.")
log_admin("Admin [key_name_admin(usr)] has rerolled the Cult's sacrifice target.")
else if(href_list["cult_unlocknarsie"])
if(alert(usr, "Unlock the ability to summon Nar'Sie?", "Cult Debug", "Yes", "No") != "Yes")
return
var/datum/game_mode/gamemode = SSticker.mode
gamemode.cult_objs.ready_to_summon()
message_admins("Admin [key_name_admin(usr)] has unlocked the Cult's ability to summon Nar'Sie.")
log_admin("Admin [key_name_admin(usr)] has unlocked the Cult's ability to summon Nar'Sie.")
else if(href_list["adminplayerobservecoodjump"])
if(!check_rights(R_ADMIN)) return
@@ -178,12 +178,6 @@
H = pick(candidates)
SSticker.mode.add_cultist(H.mind)
candidates.Remove(H)
if(!GLOB.summon_spots.len)
while(GLOB.summon_spots.len < SUMMON_POSSIBILITIES)
var/area/summon = pick(return_sorted_areas() - GLOB.summon_spots)
if(summon && is_station_level(summon.z) && summon.valid_territory)
GLOB.summon_spots += summon
return 1
return 0
@@ -2237,6 +2237,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
character.change_gender(MALE)
character.change_eye_color(e_colour)
character.original_eye_color = e_colour
if(disabilities & DISABILITY_FLAG_FAT)
character.dna.SetSEState(GLOB.fatblock, TRUE, TRUE)
+2 -1
View File
@@ -147,7 +147,7 @@
/obj/item/clothing/shoes/cult
name = "boots"
desc = "A pair of boots worn by the followers of Nar-Sie."
desc = "A pair of boots usually worn by cultists."
icon_state = "cult"
item_state = "cult"
item_color = "cult"
@@ -156,6 +156,7 @@
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
magical = TRUE
/obj/item/clothing/shoes/cyborg
name = "cyborg boots"
@@ -507,7 +507,7 @@
to_chat(user, "You have to open it first.")
return
if(istype(O,/obj/item/paper) || istype(O, /obj/item/photo) && !(istype(O, /obj/item/paper/talisman)))
if(istype(O,/obj/item/paper) || istype(O, /obj/item/photo))
if(held)
to_chat(usr, "[src] already has something inside it.")
else
+3 -3
View File
@@ -47,8 +47,8 @@
dat += "</ol>"
if(src.arcanecheckout)
new /obj/item/tome(src.loc)
to_chat(user, "<span class='warning'>Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it.</span>")
new /obj/item/melee/cultblade/dagger(src.loc)
to_chat(user, "<span class='warning'>Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a strange looking dagger sitting on the desk. You don't really remember where it came from.</span>")
user.visible_message("[user] stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken[user.p_s()] from it, [user.p_they()] look[user.p_s()] a lot older.", 2)
src.arcanecheckout = 0
if(1)
@@ -186,7 +186,7 @@
if(8)
dat += {"<h3>Accessing Forbidden Lore Vault v 1.3</h3>
Are you absolutely sure you want to proceed? EldritchTomes Inc. takes no responsibilities for loss of sanity resulting from this action.<p>
Are you absolutely sure you want to proceed? EldritchArtifacts Inc. takes no responsibilities for loss of sanity resulting from this action.<p>
<A href='?src=[UID()];arccheckout=1'>Yes.</A><BR>
<A href='?src=[UID()];switchscreen=0'>No.</A><BR>"}
+9 -1
View File
@@ -58,7 +58,7 @@
var/mob/M = poi
if(istype(M))
if (isobserver(M))
if(isobserver(M))
ghosts += list(serialized)
else if(M.stat == DEAD)
dead += list(serialized)
@@ -80,16 +80,24 @@
antag_serialized["antag"] = A.name
antagonists += list(antag_serialized)
// Changelings
if(mind.changeling)
var/antag_serialized = serialized.Copy()
antag_serialized["antag"] = "Changeling"
antagonists += list(antag_serialized)
// Vampires
if(mind.vampire)
var/antag_serialized = serialized.Copy()
antag_serialized["antag"] = "Vampire"
antagonists += list(antag_serialized)
// Cultists
if(SSticker.mode.cult && (mind in SSticker.mode.cult))
var/antag_serialized = serialized.Copy()
antag_serialized["antag"] = "Cultist"
antagonists += list(antag_serialized)
// Other antags are not in the list, mostly because I don't know their code well enough,
// and am not sure how to extract the "is this is an antag?" Info easily.
// If you are annoyed by this - datumize them and put under `.antag_datums`!
+9
View File
@@ -263,3 +263,12 @@
return r_hand
return null
//search for a path in inventory and storage items in that inventory (backpack, belt, etc) and return it. Not recursive, so doesnt search storage in storage
/mob/proc/find_item(path)
for(var/obj/item/I in contents)
if(istype(I, /obj/item/storage))
for(var/obj/item/SI in I.contents)
if(istype(SI, path))
return SI
else if(istype(I, path))
return I
@@ -72,3 +72,16 @@
/mob/living/carbon/is_mouth_covered(head_only = FALSE, mask_only = FALSE)
if((!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)))
return TRUE
//Called when drawing cult runes/using cult spells. Deal damage to a random arm/hand, or chest if not there.
/mob/living/carbon/cult_self_harm(damage, rune_message = FALSE)
var/dam_zone = pick("l_arm", "l_hand", "r_arm", "r_hand")
var/obj/item/organ/external/affecting = get_organ(dam_zone)
if(!affecting)
affecting = get_organ("chest")
if(!affecting) //bruh where's your chest
return FALSE
apply_damage(damage, BRUTE, affecting)
if(rune_message)
visible_message("<span class='warning'>[src] cuts open [src.p_their()] [affecting.name] and begins writing in [src.p_their()] own blood!</span>",
"<span class='cultitalic'>You slice open your [affecting.name] and begin drawing a sigil of [SSticker.cultdat.entity_title3].</span>")
@@ -23,6 +23,8 @@
if(wear_mask)
skipface |= wear_mask.flags_inv & HIDEFACE
skipeyes |= wear_mask.flags_inv & HIDEEYES
var/msg = "<span class='info'>*---------*\nThis is "
if(!(skipjumpsuit && skipface) && icon) //big suits/masks/helmets make it hard to tell their gender
@@ -143,11 +145,14 @@
msg += "[p_they(TRUE)] [p_have()] [bicon(wear_mask)] \a [wear_mask] on [p_their()] face.\n"
//eyes
if(glasses && !skipeyes && !(glasses.flags & ABSTRACT))
if(glasses.blood_DNA)
msg += "<span class='warning'>[p_they(TRUE)] [p_have()] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] [glasses.blood_color != "#030303" ? "blood-stained":"oil-stained"] [glasses] covering [p_their()] eyes!</span>\n"
else
msg += "[p_they(TRUE)] [p_have()] [bicon(glasses)] \a [glasses] covering [p_their()] eyes.\n"
if(!skipeyes)
if(glasses && !(glasses.flags & ABSTRACT))
if(glasses.blood_DNA)
msg += "<span class='warning'>[p_they(TRUE)] [p_have()] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] [glasses.blood_color != "#030303" ? "blood-stained":"oil-stained"] [glasses] covering [p_their()] eyes!</span>\n"
else
msg += "[p_they(TRUE)] [p_have()] [bicon(glasses)] \a [glasses] covering [p_their()] eyes.\n"
else if(iscultist(src) && HAS_TRAIT(src, CULT_EYES))
msg += "<span class='boldwarning'>[p_their(TRUE)] eyes are glowing an unnatural red!</span>\n"
//left ear
if(l_ear && !skipears)
@@ -1608,6 +1608,11 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
to_chat(src, "<span class='warning'>\The [S] pulls \the [hand] from your grip!</span>")
apply_effect(current_size * 3, IRRADIATE)
/mob/living/carbon/human/narsie_act()
if(iswizard(src) && iscultist(src)) //Wizard cultists are immune to narsie because it would prematurely end the wiz round that's about to end by the automated shuttle call anyway
return
..()
/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/human/H)
if(H == src)
to_chat(src, "<span class='warning'>You cannot perform CPR on yourself!</span>")
@@ -68,3 +68,4 @@
var/tail // Name of tail image in species effects icon file.
var/list/splinted_limbs = list() //limbs we know are splinted
var/original_eye_color = "#000000"
@@ -78,7 +78,7 @@
var/bodyflags = 0
var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods
var/blood_color = "#A10808" //Red.
var/blood_color = COLOR_BLOOD_BASE //Red.
var/flesh_color = "#d1aa2e" //Gold.
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
var/remains_type = /obj/effect/decal/remains/human //What sort of remains is left behind when the species dusts
@@ -831,6 +831,9 @@ It'll return null if the organ doesn't correspond, so include null checks when u
if(XRAY in H.mutations)
H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
if(H.has_status_effect(STATUS_EFFECT_SUMMONEDGHOST))
H.see_invisible = SEE_INVISIBLE_OBSERVER
H.sync_lighting_plane_alpha()
/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source, method = REAGENT_TOUCH)
@@ -27,7 +27,7 @@
bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS
dietflags = 0 //IPCs can't eat, so no diet
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
blood_color = "#1F181F"
blood_color = COLOR_BLOOD_MACHINE
flesh_color = "#AAAAAA"
//Default styles for created mobs.
@@ -525,6 +525,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
UpdateDamageIcon()
force_update_limbs()
update_tail_layer()
update_halo_layer()
overlays.Cut() // Force all overlays to regenerate
update_fire()
update_icons()
@@ -1264,6 +1265,17 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
apply_overlay(MISC_LAYER)
/mob/living/carbon/human/proc/update_halo_layer()
remove_overlay(HALO_LAYER)
if(iscultist(src) && SSticker.mode.cult_ascendant)
var/istate = pick("halo1", "halo2", "halo3", "halo4", "halo5", "halo6")
var/mutable_appearance/new_halo_overlay = mutable_appearance('icons/effects/32x64.dmi', istate, -HALO_LAYER)
overlays_standing[HALO_LAYER] = new_halo_overlay
apply_overlay(HALO_LAYER)
/mob/living/carbon/human/admin_Freeze(client/admin, skip_overlays = TRUE, mech = null)
if(..())
overlays_standing[FROZEN_LAYER] = mutable_appearance(frozen, layer = -FROZEN_LAYER)
+6 -1
View File
@@ -422,6 +422,11 @@
C.reagents.clear_reagents()
QDEL_LIST(C.reagents.addiction_list)
C.reagents.addiction_threshold_accumulated.Cut()
if(iscultist(src))
if(SSticker.mode.cult_risen)
SSticker.mode.rise(src)
if(SSticker.mode.cult_ascendant)
SSticker.mode.ascend(src)
QDEL_LIST(C.processing_patches)
@@ -835,7 +840,7 @@
/mob/living/narsie_act()
if(client)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, src, null, 1)
make_new_construct(/mob/living/simple_animal/hostile/construct/harvester, src, cult_override = TRUE)
spawn_dust()
gib()
@@ -357,3 +357,6 @@
if(INTENT_DISARM)
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
return TRUE
/mob/living/proc/cult_self_harm(damage, rune_message = FALSE)
return FALSE
@@ -1,4 +1,3 @@
/mob/living/simple_animal/hostile/construct
name = "Construct"
real_name = "Construct"
@@ -13,6 +12,7 @@
a_intent = INTENT_HARM
stop_automated_movement = 1
status_flags = CANPUSH
see_in_dark = 8
attack_sound = 'sound/weapons/punch1.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -44,12 +44,11 @@
for(var/spell in construct_spells)
AddSpell(new spell(null))
if(SSticker.cultdat?.theme == "blood")
updateglow()
set_light(2, 3, l_color = SSticker.cultdat ? SSticker.cultdat.construct_glow : LIGHT_COLOR_BLOOD_MAGIC)
/mob/living/simple_animal/hostile/construct/death(gibbed)
. = ..()
SSticker.mode.remove_cultist(src.mind, FALSE)
SSticker.mode.remove_cultist(mind, FALSE)
/mob/living/simple_animal/hostile/construct/examine(mob/user)
. = ..()
@@ -85,7 +84,6 @@
else if(src != M)
return ..()
/mob/living/simple_animal/hostile/construct/narsie_act()
return
@@ -122,7 +120,6 @@
playstyle_string = "<b>You are a Juggernaut. Though slow, your shell can withstand extreme punishment, \
create shield walls, rip apart enemies and walls alike, and even deflect energy weapons.</b>"
/mob/living/simple_animal/hostile/construct/armoured/hostile //actually hostile, will move around, hit things
AIStatus = AI_ON
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
@@ -160,7 +157,6 @@
melee_damage_lower = 25
melee_damage_upper = 25
attacktext = "slashes"
see_in_dark = 8
attack_sound = 'sound/weapons/bladeslice.ogg'
const_type = "wraith"
construct_spells = list(/obj/effect/proc_holder/spell/targeted/night_vision, /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift)
@@ -257,14 +253,14 @@
/mob/living/simple_animal/hostile/construct/behemoth
name = "Behemoth"
real_name = "Behemoth"
desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult of Nar-Sie's arsenal."
desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult's arsenal."
icon = 'icons/mob/mob.dmi'
icon_state = "behemoth"
icon_living = "behemoth"
maxHealth = 750
health = 750
speak_emote = list("rumbles")
response_harm = "harmlessly punches"
response_harm = "harmlessly punches"
harm_intent_damage = 0
melee_damage_lower = 50
melee_damage_upper = 50
@@ -291,7 +287,7 @@
/mob/living/simple_animal/hostile/construct/harvester
name = "Harvester"
real_name = "Harvester"
desc = "A harbinger of Nar-Sie's enlightenment. It'll be all over soon."
desc = "A harbinger of enlightenment. It'll be all over soon."
icon = 'icons/mob/mob.dmi'
icon_state = "harvester"
icon_living = "harvester"
@@ -301,7 +297,6 @@
melee_damage_upper = 5
attacktext = "prods"
environment_smash = ENVIRONMENT_SMASH_RWALLS
see_in_dark = 8
attack_sound = 'sound/weapons/tap.ogg'
const_type = "harvester"
construct_spells = list(/obj/effect/proc_holder/spell/targeted/night_vision,
@@ -314,23 +309,13 @@
/mob/living/simple_animal/hostile/construct/harvester/Process_Spacemove(var/movement_dir = 0)
return 1
return TRUE
/mob/living/simple_animal/hostile/construct/harvester/hostile //actually hostile, will move around, hit things
AIStatus = AI_ON
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
////////////////Glow////////////////////
/mob/living/simple_animal/hostile/construct/proc/updateglow()
overlays = 0
var/overlay_layer = LIGHTING_LAYER + 1
if(layer != MOB_LAYER)
overlay_layer=TURF_LAYER+0.2
overlays += image(icon,"glow-[icon_state]",overlay_layer)
set_light(2, -2, l_color = "#FFFFFF")
///ui stuff
/mob/living/simple_animal/hostile/construct/armoured/update_health_hud()
@@ -71,3 +71,10 @@
/mob/living/simple_animal/hostile/illusion/escape/AttackingTarget()
return
///////Cult Illusions/////////
/mob/living/simple_animal/hostile/illusion/cult
loot = list(/obj/effect/temp_visual/cult/sparks) // So that they SPARKLE on death
/mob/living/simple_animal/hostile/illusion/escape/cult
loot = list(/obj/effect/temp_visual/cult/sparks)
+18 -17
View File
@@ -20,41 +20,42 @@
maxbodytemp = 4000
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
speed = -1
stop_automated_movement = 1
stop_automated_movement = TRUE
status_flags = 0
pull_force = 0
universal_speak = TRUE
faction = list("cult")
status_flags = CANPUSH
flying = TRUE
loot = list(/obj/item/reagent_containers/food/snacks/ectoplasm)
del_on_death = 1
del_on_death = TRUE
deathmessage = "lets out a contented sigh as their form unwinds."
var/holy = FALSE
/mob/living/simple_animal/shade/death(gibbed)
. = ..()
SSticker.mode.remove_cultist(src.mind, FALSE)
SSticker.mode.remove_cultist(mind, FALSE)
/mob/living/simple_animal/shade/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
/mob/living/simple_animal/shade/attackby(obj/item/O, mob/user) //Marker -Agouri
if(istype(O, /obj/item/soulstone))
O.transfer_soul("SHADE", src, user)
var/obj/item/soulstone/SS = O
SS.transfer_soul("SHADE", src, user)
else
if(O.force)
var/damage = O.force
if(O.damtype == STAMINA)
damage = 0
health -= damage
user.visible_message("<span class='boldwarning'>[src] has been attacked with the [O] by [user]. </span>")
else
user.visible_message("<span class='warning'>[user] gently taps [src] with the [O]. </span>", "<span class='warning'>This weapon is ineffective, it does no damage.</span>")
return
..()
/mob/living/simple_animal/shade/Process_Spacemove()
return TRUE
/mob/living/simple_animal/shade/cult/Initialize(mapload)
. = ..()
name = SSticker.cultdat?.shade_name
real_name = SSticker.cultdat?.shade_name
icon_state = SSticker.cultdat?.shade_icon_state
/mob/living/simple_animal/shade/holy
holy = TRUE
icon_state = "shade_angelic"
/mob/living/simple_animal/shade/sword
universal_speak = 1
faction = list("neutral")
/mob/living/simple_animal/shade/sword/Initialize(mapload)
+2 -2
View File
@@ -371,10 +371,10 @@
// CULTSLURRING
/mob/living/CultSlur(amount)
SetSlur(max(slurring, amount))
SetCultSlur(max(cultslurring, amount))
/mob/living/SetCultSlur(amount)
slurring = max(amount, 0)
cultslurring = max(amount, 0)
/mob/living/AdjustCultSlur(amount, bound_lower = 0, bound_upper = INFINITY)
var/new_value = directional_bounded_sum(cultslurring, amount, bound_lower, bound_upper)
+46 -27
View File
@@ -1,25 +1,28 @@
/obj/singularity/narsie //Moving narsie to a child object of the singularity so it can be made to function differently. --NEO
name = "Nar-sie's Avatar"
name = "Nar'sie's Avatar"
desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."
icon = 'icons/obj/magic_terror.dmi'
pixel_x = -89
pixel_y = -85
current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO
contained = 0 //Are we going to move around?
dissipate = 0 //Do we lose energy over time?
move_self = 1 //Do we move on our own?
grav_pull = 5 //How many tiles out do we pull?
consume_range = 6 //How many tiles out do we eat
contained = FALSE
dissipate = FALSE
move_self = TRUE
grav_pull = 5
consume_range = 6
gender = FEMALE
/obj/singularity/narsie/admin_investigate_setup()
return
/obj/singularity/narsie/large
name = "Nar-Sie"
name = "Nar'Sie"
icon = 'icons/obj/narsie.dmi'
// Pixel stuff centers Narsie.
pixel_x = -236
pixel_y = -256
current_size = 12
move_self = 1 //Do we move on our own?
move_self = TRUE //Do we move on our own?
grav_pull = 10
consume_range = 12 //How many tiles out do we eat
@@ -27,22 +30,38 @@
..()
icon_state = SSticker.cultdat?.entity_icon_state
name = SSticker.cultdat?.entity_name
to_chat(world, "<font size='15' color='red'><b> [name] HAS RISEN</b></font>")
world << pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg'))
to_chat(world, "<font size='15' color='red'><b> [uppertext(name)] HAS RISEN</b></font>")
SEND_SOUND(world, pick('sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg'))
var/datum/game_mode/gamemode = SSticker.mode
if(gamemode)
gamemode.cult_objs.succesful_summon()
var/area/A = get_area(src)
if(A)
var/image/alert_overlay = image('icons/effects/cult_effects.dmi', "ghostalertsie")
notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, action=NOTIFY_ATTACK)
notify_ghosts("[name] has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, action = NOTIFY_ATTACK)
narsie_spawn_animation()
sleep(70)
SSshuttle.emergency.request(null, 0.3) // Cannot recall
SSshuttle.emergency.canRecall = FALSE
sleep(7 SECONDS)
SSshuttle.emergency.request(null, 0.3)
SSshuttle.emergency.canRecall = FALSE // Cannot recall
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, null, 1)
/obj/singularity/narsie/large/Destroy()
to_chat(world, "<font size='15' color='red'><b> [uppertext(name)] HAS FALLEN</b></font>")
SEND_SOUND(world, 'sound/hallucinations/wail.ogg')
var/datum/game_mode/gamemode = SSticker.mode
if(gamemode)
gamemode.cult_objs.narsie_death()
for(var/datum/mind/cult_mind in SSticker.mode.cult)
if(cult_mind && cult_mind.current)
to_chat(cult_mind.current, "<span class='cultlarge'>RETRIBUTION!</span>")
to_chat(cult_mind.current, "<span class='cult'>Current goal: Slaughter the heretics!</span>")
..()
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user)
make_new_construct(/mob/living/simple_animal/hostile/construct/harvester, user, cult_override = TRUE)
new /obj/effect/particle_effect/smoke/sleeping(user.loc)
@@ -63,17 +82,16 @@
godsmack(A)
return
/obj/singularity/narsie/proc/godsmack(var/atom/A)
/obj/singularity/narsie/proc/godsmack(atom/A)
if(istype(A,/obj/))
var/obj/O = A
O.ex_act(1.0)
O.ex_act(1)
if(O) qdel(O)
else if(isturf(A))
var/turf/T = A
T.ChangeTurf(/turf/simulated/floor/engine/cult)
/obj/singularity/narsie/mezzer()
for(var/mob/living/carbon/M in oviewers(8, src))
if(M.stat == CONSCIOUS)
@@ -82,13 +100,14 @@
M.apply_effect(3, STUN)
/obj/singularity/narsie/consume(var/atom/A)
/obj/singularity/narsie/consume(atom/A)
A.narsie_act()
/obj/singularity/narsie/ex_act() //No throwing bombs at it either. --NEO
return
/obj/singularity/narsie/singularity_act() //handled in /obj/singularity/proc/consume
return
/obj/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO
var/list/cultists = list()
@@ -103,11 +122,11 @@
else
noncultists += food
if(cultists.len) //cultists get higher priority
if(length(cultists)) //cultists get higher priority
acquire(pick(cultists))
return
if(noncultists.len)
if(length(noncultists))
acquire(pick(noncultists))
return
@@ -119,12 +138,12 @@
if(pos.z != src.z)
continue
cultists += ghost
if(cultists.len)
if(length(cultists))
acquire(pick(cultists))
return
/obj/singularity/narsie/proc/acquire(var/mob/food)
/obj/singularity/narsie/proc/acquire(mob/food)
if(food == target)
return
if(!target)
@@ -150,8 +169,8 @@
/obj/singularity/narsie/proc/narsie_spawn_animation()
icon = 'icons/obj/narsie_spawn_anim.dmi'
dir = SOUTH
move_self = 0
move_self = FALSE
flick(SSticker.cultdat?.entity_spawn_animation, src)
sleep(11)
move_self = 1
move_self = TRUE
icon = initial(icon)
@@ -280,6 +280,15 @@
name = "supermatter-charged [initial(name)]"
consumedSupermatter = 1
set_light(10)
if(istype(A, /obj/singularity/narsie))
if(current_size == STAGE_SIX)
visible_message("<span class='userdanger'>[SSticker.cultdat?.entity_name] is consumed by [src]!</span>")
qdel(A)
else
visible_message("<span class='userdanger'>[SSticker.cultdat?.entity_name] strikes down [src]!</span>")
investigate_log("has been destroyed by Nar'Sie","singulo")
qdel(src)
return
@@ -42,6 +42,9 @@
projectile_type = pick(typesof(/obj/item/projectile/magic))
..()
/obj/item/ammo_casing/magic/arcane_barrage
projectile_type = /obj/item/projectile/magic/arcane_barrage
/obj/item/ammo_casing/magic/forcebolt
projectile_type = /obj/item/projectile/forcebolt
@@ -258,19 +258,40 @@
..()
guns_left = 0
/obj/item/gun/projectile/shotgun/boltaction/enchanted/attack_self()
return
/obj/item/gun/projectile/shotgun/boltaction/enchanted/shoot_live_shot(mob/living/user, atom/target, pointblank = FALSE, message = TRUE)
..()
if(guns_left)
var/obj/item/gun/projectile/shotgun/boltaction/enchanted/GUN = new
var/obj/item/gun/projectile/shotgun/boltaction/enchanted/GUN = new type
GUN.guns_left = guns_left - 1
user.drop_item()
discard_gun(user)
user.swap_hand()
user.drop_item()
user.put_in_hands(GUN)
else
user.drop_item()
spawn(0)
throw_at(pick(oview(7,get_turf(user))),1,1)
discard_gun(user)
/obj/item/gun/projectile/shotgun/boltaction/enchanted/proc/discard_gun(mob/living/user)
user.visible_message("<span class='warning'>[user] tosses aside the spent rifle!</span>")
user.throw_item(pick(oview(7, get_turf(user))))
/obj/item/gun/projectile/shotgun/boltaction/enchanted/arcane_barrage
name = "arcane barrage"
desc = "Pew Pew Pew."
fire_sound = 'sound/weapons/emitter.ogg'
icon_state = "arcane_barrage"
item_state = "arcane_barrage"
slot_flags = null
flags = NOBLUDGEON | DROPDEL | ABSTRACT
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage
/obj/item/gun/projectile/shotgun/boltaction/enchanted/arcane_barrage/examine(mob/user)
. = desc // Override since magical hand lasers don't have chambers or bolts
/obj/item/gun/projectile/shotgun/boltaction/enchanted/arcane_barrage/discard_gun(mob/living/user)
qdel(src)
// Automatic Shotguns//
@@ -346,3 +346,13 @@
M.Weaken(slip_weaken)
M.Stun(slip_stun)
. = ..()
/obj/item/projectile/magic/arcane_barrage
name = "arcane bolt"
icon_state = "arcane_barrage"
damage = 20
damage_type = BURN
nodamage = FALSE
armour_penetration = 0
flag = "magic"
hitsound = 'sound/weapons/barragespellhit.ogg'
@@ -241,9 +241,14 @@
if(current_cycle >= 30) // 12 units, 60 seconds @ metabolism 0.4 units & tick rate 2.0 sec
M.AdjustStuttering(4, bound_lower = 0, bound_upper = 20)
M.Dizzy(5)
if(iscultist(M) && prob(5))
M.AdjustCultSlur(5)//5 seems like a good number...
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu"))
if(iscultist(M))
for(var/datum/action/innate/cult/blood_magic/BM in M.actions)
for(var/datum/action/innate/cult/blood_spell/BS in BM.spells)
to_chat(M, "<span class='cultlarge'>Your blood rites falter as holy water scours your body!</span>")
qdel(BS)
if(prob(5))
M.AdjustCultSlur(5)//5 seems like a good number...
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu"))
if(current_cycle >= 75 && prob(33)) // 30 units, 150 seconds
M.AdjustConfused(3)
if(isvampirethrall(M))
@@ -259,6 +264,11 @@
M.SetJitter(0)
M.SetStuttering(0)
M.SetConfused(0)
if(ishuman(M)) // Unequip all cult clothing
var/mob/living/carbon/human/H = M
for(var/I in H.contents - (H.bodyparts | H.internal_organs)) // Satanic liver NYI
if(is_type_in_list(I, CULT_CLOTHING))
H.unEquip(I)
return
if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full) && prob(80))
var/mob/living/carbon/V = M