Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cult 2020 Rework #1: Seer #27950

Merged
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions __DEFINES/role_datums_defines.dm
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,13 @@
#define CONVERSION_NOCHOICE 0
#define CONVERSION_ACCEPT 1

#define CONVERTIBLE_ALWAYS 1
#define CONVERTIBLE_CHOICE 2
#define CONVERTIBLE_NEVER 3
#define CONVERTIBLE_NOMIND 4
#define CONVERTIBLE_ALREADY 5
#define CONVERTIBLE_IMPLANT 6

////////////////////////////////////////////////////////////////////////////////

// -- Objectives flags
Expand Down
1 change: 1 addition & 0 deletions __DEFINES/setup.dm
Original file line number Diff line number Diff line change
Expand Up @@ -905,6 +905,7 @@ SEE_PIXELS 256
#define DIAG_HEALTH_HUD "diag_health" // Diagnostic HUD - health bar
#define DIAG_CELL_HUD "diag_cell" // Diagnostic HUD - power cell status for cyborgs, mechs
#define CONSTRUCT_HUD "const_health" // Artificer HUD
#define CONVERSION_HUD "convertibility" // Convertibility HUD

// Hypothermia - using the swiss staging system. - called by the proc undergoing_hypothermia() in handle_hypothermia.dm
#define NO_HYPOTHERMIA 0 // >35C - Fine
Expand Down
65 changes: 65 additions & 0 deletions code/datums/gamemode/factions/bloodcult/bloodcult.dm
Original file line number Diff line number Diff line change
Expand Up @@ -917,6 +917,71 @@ var/static/list/valid_cultpower_slots = list(

return power

/mob/proc/get_convertibility()
if (!mind || isDead())
return CONVERTIBLE_NOMIND

if (iscultist(src))
return CONVERTIBLE_ALREADY

return 0

/mob/living/carbon/get_convertibility()
var/convertibility = ..()

if (!convertibility)
//TODO: chaplain stuff
//this'll do in the meantime
if (mind.assigned_role == "Chaplain")
return CONVERTIBLE_NEVER

var/acceptance = "Never"
if (client)
acceptance = get_role_desire_str(client.prefs.roles[CULTIST])

if (jobban_isbanned(src, CULTIST) || isantagbanned(src) || (acceptance == "Never"))
return CONVERTIBLE_NEVER

for(var/obj/item/weapon/implant/loyalty/I in src)
if(I.implanted)
return CONVERTIBLE_IMPLANT

if (acceptance == "Always" || acceptance == "Yes")
return CONVERTIBLE_ALWAYS

return CONVERTIBLE_CHOICE

return convertibility//no mind, dead, or already a cultist

/mob/living/carbon/proc/update_convertibility()
var/convertibility = get_convertibility()
var/image/I = image('icons/mob/hud.dmi', src, "hudblank")
switch(convertibility)
if (CONVERTIBLE_ALWAYS)
I.icon_state = "convertible"
if (CONVERTIBLE_CHOICE)
I.icon_state = "maybeconvertible"
if (CONVERTIBLE_IMPLANT)
I.icon_state = "unconvertible"
if (CONVERTIBLE_NEVER)
I.icon_state = "unconvertible2"

I.pixel_y = 16 * PIXEL_MULTIPLIER
I.plane = ANTAG_HUD_PLANE

//inspired from the rune color matrix because boy am I proud of it
animate(I, color = list(2,0.67,0.27,0,0.27,2,0.67,0,0.67,0.27,2,0,0,0,0,1,0,0,0,0), time = 2)//9
animate(color = list(1.875,0.56,0.19,0,0.19,1.875,0.56,0,0.56,0.19,1.875,0,0,0,0,1,0,0,0,0), time = 1.7)//8
animate(color = list(1.75,0.45,0.12,0,0.12,1.75,0.45,0,0.45,0.12,1.75,0,0,0,0,1,0,0,0,0), time = 1.4)//7
animate(color = list(1.625,0.35,0.06,0,0.06,1.625,0.35,0,0.35,0.06,1.625,0,0,0,0,1,0,0,0,0), time = 1.1)//6
animate(color = list(1.5,0.27,0,0,0,1.5,0.27,0,0.27,0,1.5,0,0,0,0,1,0,0,0,0), time = 0.8)//5
animate(color = list(1.375,0.19,0,0,0,1.375,0.19,0,0.19,0,1.375,0,0,0,0,1,0,0,0,0), time = 0.5)//4
animate(color = list(1.25,0.12,0,0,0,1.25,0.12,0,0.12,0,1.25,0,0,0,0,1,0,0,0,0), time = 0.2)//3
animate(color = list(1.125,0.06,0,0,0,1.125,0.06,0,0.06,0,1.125,0,0,0,0,1,0,0,0,0), time = 0.1)//2
animate(color = list(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0), time = 5)//1

hud_list[CONVERSION_HUD] = I

//WARNING: setting to "3" will trigger the rise of bloodstones.
/client/proc/set_veil_thickness()
set category = "Special Verbs"
Expand Down
44 changes: 30 additions & 14 deletions code/datums/gamemode/factions/bloodcult/bloodcult_runespells.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1709,23 +1709,23 @@ var/list/blind_victims = list()
//RUNE XI
/datum/rune_spell/blood_cult/seer
name = "Seer"
desc = "See the invisible, the dead, the concealed. If you give them a writing sheet, they may relay a message to you."
desc_talisman = "For a few seconds, you may see the invisible, the dead, the concealed. If you give them a writing sheet, they may relay a message to you."
desc = "See the invisible, the dead, the concealed, as well as the living's propension to serve our agenda."
desc_talisman = "For a whole minute, you may see the invisible, the dead, the concealed, as well as the living's propension to serve our agenda."
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"and the propensity of the living to serve our agenda" is more natural language

Act_restriction = CULT_ACT_I
invocation = "Rash'tla sektath mal'zua. Zasan therium viortia."
rune_flags = RUNE_STAND
talisman_uses = 5
word1 = /datum/runeword/blood_cult/see
word2 = /datum/runeword/blood_cult/hell
word3 = /datum/runeword/blood_cult/join
page = "This rune grants you the ability to see the invisible, including observers and concealed runes and structures. The talisman version has 5 uses, which grant you the ability for 8 seconds each. Remember that runes can still be activated while they are concealed! "
page = "This rune grants you the ability to see the invisible, including observers and concealed runes and structures. The talisman version has 5 uses, which grant you the ability for an entire minute each, allowing you as well to see how likely each crew members are to accept conversion. Remember to activate the talisman where no one can hear you first. Remember also that runes can still be activated while they are concealed! "
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

entire seems extraneous
"each crew member is" to accept conversion, use "is" for singular

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Honestly this whole block of text is awkwardly phrased, with two remembers and separating the part about willingness, just rewrite it

This rune grants the ability to see invisible ghosts, runes, and structures. It also reveals the willingness of crew members to accept conversion. You can activate runes while they are concealed. In talisman form, it has five uses and lasts for a minute each. Activate the talisman before moving into a public.

cost_invoke = 5
var/obj/effect/cult_ritual/seer/seer_ritual = null
var/talisman_duration = 80 //tenths of a second
var/talisman_duration = 60 SECONDS

/datum/rune_spell/blood_cult/seer/Destroy()
destroying_self = 1
if (seer_ritual)
if (seer_ritual && !seer_ritual.talisman)
qdel(seer_ritual)
seer_ritual = null
..()
Expand All @@ -1743,12 +1743,11 @@ var/list/blind_victims = list()
var/mob/living/M = activator
M.see_invisible_override = SEE_INVISIBLE_OBSERVER
M.apply_vision_overrides()
to_chat(M, "<span class='notice'>As the talisman disappears into dust, you find yourself able to see through the gaps in the veil. You can see and interact with the other side, for a few seconds.</span>")
to_chat(M, "<span class='notice'>As the talisman disappears into dust, you find yourself able to see through the gaps in the veil. You can see and interact with the other side for a minute, as well as see the living's likelyhood of accepting conversions.</span>")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

likelihood

anim(target = M, a_icon = 'icons/effects/160x160.dmi', a_icon_state = "rune_seer", lay = ABOVE_OBJ_LAYER, offX = -WORLD_ICON_SIZE*2, offY = -WORLD_ICON_SIZE*2, plane = OBJ_PLANE, invis = INVISIBILITY_OBSERVER, alph = 200, sleeptime = talisman_duration)
var/obj/effect/cult_ritual/seer/ritual = new (activator,activator,null,TRUE)
spawn(talisman_duration)
M.see_invisible_override = 0
M.apply_vision_overrides()
to_chat(M, "<span class='notice'>You can no longer discern through the veil.</span>")
qdel(ritual)
qdel(src)

/obj/effect/cult_ritual/seer
Expand All @@ -1765,10 +1764,13 @@ var/list/blind_victims = list()
flags = PROXMOVE
var/mob/living/caster = null
var/datum/rune_spell/blood_cult/seer/source = null
var/list/propension = list()
var/talisman = FALSE


/obj/effect/cult_ritual/seer/New(var/turf/loc, var/mob/living/user, var/datum/rune_spell/blood_cult/seer/runespell)
/obj/effect/cult_ritual/seer/New(var/turf/loc, var/mob/living/user, var/datum/rune_spell/blood_cult/seer/runespell,var/talisman_ritual = FALSE)
..()
processing_objects.Add(src)
talisman = talisman_ritual
caster = user
source = runespell
if (!caster)
Expand All @@ -1778,10 +1780,12 @@ var/list/blind_victims = list()
return
caster.see_invisible_override = SEE_INVISIBLE_OBSERVER
caster.apply_vision_overrides()
to_chat(caster, "<span class='notice'>You find yourself able to see through the gaps in the veil. You can see and interact with the other side.</span>")
to_chat(caster, "<span class='notice'>You find yourself able to see through the gaps in the veil. You can see and interact with the other side, and also find out the crew's propension to be successfully converted, whether they are <b><font color='green'>Willing</font></b>, <b><font color='orange'>Uncertain</font></b>, or <b><font color='red'>Unconvertible</font></b>.</span>")
Kurfursten marked this conversation as resolved.
Show resolved Hide resolved

/obj/effect/cult_ritual/seer/Destroy()
processing_objects.Remove(src)
if (caster)
caster.client.images -= propension
caster.see_invisible_override = 0
caster.apply_vision_overrides()
to_chat(caster, "<span class='notice'>You can no longer discern through the veil.</span>")
Expand All @@ -1792,8 +1796,20 @@ var/list/blind_victims = list()
..()

/obj/effect/cult_ritual/seer/HasProximity(var/atom/movable/AM)
if (!caster || caster.loc != loc)
qdel(src)
if (!talisman)
if (!caster || caster.loc != loc)
qdel(src)

/obj/effect/cult_ritual/seer/process()
if (caster && caster.client)
caster.client.images -= propension
propension.len = 0

for(var/mob/living/carbon/C in dview(world.view, get_turf(src), INVISIBILITY_MAXIMUM))
C.update_convertibility()
propension += C.hud_list[CONVERSION_HUD]

caster.client.images += propension


//RUNE XII
Expand Down
1 change: 1 addition & 0 deletions code/modules/admin/admin_verbs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ var/list/admin_verbs_debug = list(
/client/proc/cure_disease,
/client/proc/check_bomb,
/client/proc/check_convertables,
/client/proc/toggle_convertibles,
/client/proc/check_spiral,
/client/proc/check_striketeams,
/client/proc/cmd_admin_find_bad_blood_tracks,
Expand Down
18 changes: 18 additions & 0 deletions code/modules/admin/verbs/debug.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1217,6 +1217,24 @@ client/proc/check_convertables()

to_chat(usr, dat)


client/proc/toggle_convertibles()
set name = "Toggle Convertibles HUD (Cult 3.0+)"
set category = "Debug"
set desc = "Displays a marker over crew members showing their propension to get converted."
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

propensity really is more common in English, propension is archaic


var/mob/dead/observer/adminmob = mob
if (!isobserver(adminmob))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure about no adminghost check, do we really want to make it publicly visible everyone's antag prefs at all times?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The verb only appears in the Debug tab and is only given to admins with +DEBUG. Are there exploits that let non-admins use it?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's good to have sanity but if people have a way to call adminverbs we have a bigger issue than this I suppose, since a lot of oldcode stuff has no sanity

alert("Only observers can use this functionality")
return

if(adminmob.conversionHUD)
adminmob.conversionHUD = 0
to_chat(src, "<span class='notice'><B>conversionHUD Disabled</B></span>")
else
adminmob.conversionHUD = 1
to_chat(src, "<span class='notice'><B>conversionHUD Enabled</B></span>")

/client/proc/spawn_datum(var/object as text)
set category = "Debug"
set desc = "(datum path) Spawn a datum (turfs NOT supported)"
Expand Down
29 changes: 26 additions & 3 deletions code/modules/mob/dead/observer/observer.dm
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ var/creating_arena = FALSE
var/selectedHUD = HUD_NONE // HUD_NONE, HUD_MEDICAL or HUD_SECURITY
var/diagHUD = FALSE
var/antagHUD = 0
var/conversionHUD = 0
incorporeal_move = INCORPOREAL_GHOST
var/movespeed = 0.75
var/lastchairspin
Expand Down Expand Up @@ -231,13 +232,29 @@ Works together with spawning an observer, noted above.
return 0

regular_hud_updates()

//cleaning up antagHUD and conversionHUD icons
if(client)
for(var/image/hud in client.images)
if(findtext(hud.icon_state, "convertible") || findtext(hud.icon_state, "-logo"))
client.images -= hud

if(antagHUD)
var/list/target_list = list()
for(var/mob/living/target in oview(src))
if( target.mind&&(target.mind.antag_roles.len > 0 || issilicon(target) || target.hud_list[SPECIALROLE_HUD]) )
target_list += target
if(target_list.len)
assess_targets(target_list, src)
assess_antagHUD(target_list, src)

if(conversionHUD)
var/list/target_list = list()
for(var/mob/living/carbon/target in oview(src))
if(target.mind && target.hud_list[CONVERSION_HUD])
target_list += target
if(target_list.len)
assess_conversionHUD(target_list, src)

if(selectedHUD == HUD_MEDICAL)
process_medHUD(src)
else if(selectedHUD == HUD_SECURITY)
Expand Down Expand Up @@ -348,7 +365,7 @@ Works together with spawning an observer, noted above.
holder.icon_state = "hudhealthy"
C.images += holder

/mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U)
/mob/dead/proc/assess_antagHUD(list/target_list, mob/dead/observer/U)
for(var/mob/living/target in target_list)
if(target.mind)
var/image/I
Expand Down Expand Up @@ -378,7 +395,13 @@ Works together with spawning an observer, noted above.
U.client.images += image('icons/mob/hud.dmi',silicon_target,"hudmalborg")
else
U.client.images += image('icons/mob/hud.dmi',silicon_target,"hudmalai")
return 1

/mob/dead/proc/assess_conversionHUD(list/target_list, mob/dead/observer/U)
for(var/mob/living/carbon/target in target_list)
if(target.mind)
U.client.images -= target.hud_list[CONVERSION_HUD]
target.update_convertibility()
U.client.images += target.hud_list[CONVERSION_HUD]

/mob/proc/ghostize(var/flags = GHOST_CAN_REENTER,var/deafmute = 0)
if(key && !(copytext(key,1,2)=="@"))
Expand Down
4 changes: 4 additions & 0 deletions code/modules/mob/living/carbon/carbon_defines.dm
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@
status_flags = CANSTUN|CANKNOCKDOWN|CANPARALYSE|CANPUSH
var/obj/item/device/station_map/displayed_holomap = null

/mob/living/carbon/New(var/new_loc, var/new_species_name = null, var/delay_ready_dna=0)
..()
hud_list[CONVERSION_HUD] = image('icons/mob/hud.dmi', src, "hudblank")

/mob/living/carbon/Destroy()
if (mutual_handcuffs && mutual_handcuffed_to)
mutual_handcuffs.remove_mutual_cuff_events(mutual_handcuffed_to)
Expand Down
Binary file modified icons/mob/hud.dmi
Binary file not shown.