[Cult 3.0] Soul Blade fixes, new Cult Armor, Arcane Tattoos (#19921)

* cult tattoos

* duh

* I just like forgot most of the commits

* coloured dagger

* daazdazdaz
This commit is contained in:
DeityLink
2018-10-04 11:58:11 +02:00
committed by jknpj
parent 140a1a663e
commit 5c5d94b062
63 changed files with 1556 additions and 378 deletions

View File

@@ -62,6 +62,9 @@
#define GREET_CONVERTED "converted"
#define GREET_PAMPHLET "pamphlet"
#define GREET_SOULSTONE "soulstone"
#define GREET_RESURRECT "resurrect"
//////////////////////////////////CULT STUFF////////////////////////////////////
#define CULT_MENDED -1
@@ -109,6 +112,16 @@
#define RITUALABORT_NEAR "near"
#define RITUALABORT_MISSING "missing"
#define TATTOO_POOL "Blood Communion"
#define TATTOO_SILENT "Silent Casting"
#define TATTOO_DAGGER "Blood Dagger"
#define TATTOO_HOLY "Unholy Protection"
#define TATTOO_FAST "Rapid Tracing"
#define TATTOO_CHAT "Dark Communication"
#define TATTOO_MANIFEST "Pale Body"
#define TATTOO_MEMORIZE "Arcane Knowledge"
#define TATTOO_SHORTCUT "Shortcut Tracer"
#define TOME_CLOSED 1
#define TOME_OPEN 2

View File

@@ -207,3 +207,7 @@
#define ui_blob_ping "EAST-1:[24*PIXEL_MULTIPLIER],CENTER+3:[21*PIXEL_MULTIPLIER]"
#define ui_blob_rally "EAST-1:[24*PIXEL_MULTIPLIER],CENTER+4:[25*PIXEL_MULTIPLIER]"
#define ui_blob_taunt "EAST-1:[24*PIXEL_MULTIPLIER],CENTER+5:[29*PIXEL_MULTIPLIER]"
//Cult HUD
#define ui_cult_Act "EAST-1:[28*PIXEL_MULTIPLIER],SOUTH+5:[7*PIXEL_MULTIPLIER]"
#define ui_cult_tattoos "EAST-1:[28*PIXEL_MULTIPLIER], SOUTH+4:[7*PIXEL_MULTIPLIER]"

View File

@@ -20,6 +20,8 @@ var/global/obj/abstract/screen/clicker/catcher = new()
var/obj/abstract/screen/lingchemdisplay
var/obj/abstract/screen/vampire_blood_display // /vg/
var/obj/abstract/screen/cult_Act_display // /vg/
var/obj/abstract/screen/cult_tattoo_display // /vg/
var/list/obj/abstract/screen/hand_hud_objects = list()
var/obj/abstract/screen/action_intent
var/obj/abstract/screen/move_intent
@@ -48,6 +50,8 @@ var/global/obj/abstract/screen/clicker/catcher = new()
help_intent = null
lingchemdisplay = null
vampire_blood_display = null
cult_Act_display = null
cult_tattoo_display = null
hand_hud_objects = null
action_intent = null
move_intent = null

View File

@@ -133,7 +133,7 @@
mymob.client.reset_screen()
mymob.client.screen += list(mymob.healths, mymob.pullin, mymob.zone_sel, mymob.purged, mymob.fire)
mymob.client.screen += list(mymob.healths, mymob.pullin, mymob.zone_sel, mymob.purged)
/datum/hud/proc/borer_hud()
@@ -215,3 +215,41 @@
vampire_blood_display.screen_loc = "EAST-1:[28*PIXEL_MULTIPLIER],CENTER+2:[15*PIXEL_MULTIPLIER]"
mymob.client.screen += list(vampire_blood_display)
/datum/hud/proc/cult_hud(ui_style = 'icons/mob/screen1_cult.dmi')
cult_Act_display = getFromPool(/obj/abstract/screen)
cult_Act_display.icon = ui_style
cult_Act_display.name = "Prologue: The Reunion"
cult_Act_display.icon_state = ""
cult_Act_display.screen_loc = ui_cult_Act
pulse_atom(cult_Act_display)
cult_tattoo_display = getFromPool(/obj/abstract/screen)
cult_tattoo_display.icon = ui_style
cult_tattoo_display.name = "Arcane Tattoos: none"
cult_tattoo_display.icon_state = ""
cult_tattoo_display.screen_loc = ui_cult_tattoos
//pulse_atom(cult_tattoo_display)
if (mymob.client)
mymob.client.screen += list(cult_Act_display,cult_tattoo_display)
/datum/hud/proc/pulse_atom(var/obj/abstract/screen/A)
animate(A, color = list(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0), time = 10, loop = -1)
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 = 2)
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 = 2)
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 = 1.5)
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 = 1.5)
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)
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)
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)
animate(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 = 5)
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)
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)
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)
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 = 1)
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 = 1)
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 = 1)
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 = 1)

View File

@@ -251,7 +251,7 @@
current_user.images -= menu_holder
/datum/radial_menu/proc/wait()
while(current_user && !finished && !selected_choice)
while (!gcDestroyed && current_user && !finished && !selected_choice)
if(istype(custom_check) && next_check < world.time)
if(!INVOKE_EVENT(custom_check, list()))
return
@@ -260,6 +260,7 @@
stoplag(1)
/datum/radial_menu/Destroy()
current_user.radial_menus -= anchor
Reset()
hide()
if(istype(custom_check))
@@ -275,13 +276,14 @@
if(!user || !anchor || !length(choices))
return
if(!uniqueid)
uniqueid = "defmenu_["\ref[user]"]_["\ref[anchor]"]"
if(radial_menus[uniqueid])
var/client/current_user = user.client
if (anchor in current_user.radial_menus)
return
current_user.radial_menus += anchor
var/datum/radial_menu/menu = new(icon_file)
radial_menus[uniqueid] = menu
var/datum/radial_menu/menu = new (icon_file)
if(!user)
user = usr
if(radius)
menu.radius = radius
if(istype(custom_check))
@@ -291,7 +293,7 @@
menu.set_choices(choices,icon_file)
menu.show_to(user)
menu.wait()
var/answer = menu.selected_choice
qdel(menu)
radial_menus -= uniqueid
return answer
if (!menu.gcDestroyed)
var/answer = menu.selected_choice
qdel(menu)
return answer

View File

@@ -13,6 +13,14 @@ var/veil_thickness = CULT_EPILOGUE//REMEMBER TO SET IT BACK TO CULT_PROLOGUE WHE
veil_thickness = input(usr, "Enter a value (default = [CULT_PROLOGUE])", "Debug Veil Thickness", veil_thickness) as num
var/datum/faction/bloodcult/cult = find_active_faction_by_type(/datum/faction/bloodcult)
if (cult)
for (var/datum/role/cultist/C in cult.members)
C.update_cult_hud()
for (var/obj/structure/cult/spire/S in cult_spires)
S.upgrade()
//CULT_PROLOGUE Default thickness, only communication and raise structure runes enabled
//CULT_ACT_I Altar raised. cultists can now convert.
//CULT_ACT_II Cultist amount reached. cultists are now looking for the sacrifice
@@ -235,9 +243,35 @@ var/veil_thickness = CULT_EPILOGUE//REMEMBER TO SET IT BACK TO CULT_PROLOGUE WHE
return data
/proc/use_available_blood(var/mob/user, var/amount_needed = 0,var/previous_result = "")
/proc/use_available_blood(var/mob/user, var/amount_needed = 0,var/previous_result = "", var/tribute = 0)
//Blood Communion
var/communion = 0
var/total_accumulated = 0
var/total_needed = amount_needed
if (!tribute && iscultist(user))
var/datum/role/cultist/mycultist = user.mind.GetRole(CULTIST)
if (mycultist in blood_communion)
communion = 1
amount_needed = max(1,round(amount_needed * 4 / 5))//saving 20% blood
var/list/tributers = list()
for (var/datum/role/cultist/cultist in blood_communion)
if (cultist.antag && cultist.antag.current)
var/mob/living/L = cultist.antag.current
if (istype(L) && L != user)
tributers.Add(L)
var/total_per_tribute = max(1,round(amount_needed/max(1,tributers.len+1)))
var/tributer_size = tributers.len
for (var/i = 1 to tributer_size)
var/mob/living/L = pick(tributers)//so it's not always the first one that pays the first blood unit.
tributers.Remove(L)
var/data = use_available_blood(L, total_per_tribute, "", 1)
if (data[BLOODCOST_RESULT] != BLOODCOST_FAILURE)
total_accumulated += data[BLOODCOST_TOTAL]
if (total_accumulated >= amount_needed - total_per_tribute)//could happen if the cost is less than 1 per tribute
break
//Getting nearby blood sources
var/list/data = get_available_blood(user, amount_needed)
var/list/data = get_available_blood(user, amount_needed-total_accumulated)
var/datum/reagent/blood/blood
@@ -248,7 +282,7 @@ var/veil_thickness = CULT_EPILOGUE//REMEMBER TO SET IT BACK TO CULT_PROLOGUE WHE
blood = new()
blood.data["blood_colour"] = H.hand_blood_color
blood.data["blood_DNA"] = H.blood_DNA
if (previous_result != BLOODCOST_TARGET_HANDS)
if (!tribute && previous_result != BLOODCOST_TARGET_HANDS)
user.visible_message("<span class='warning'>The blood on \the [user]'s hands drips onto the floor!</span>",
"<span class='rose'>You let the blood smeared on your hands join the pool of your summoning.</span>",
"<span class='warning'>You hear a liquid flowing.</span>")
@@ -258,56 +292,57 @@ var/veil_thickness = CULT_EPILOGUE//REMEMBER TO SET IT BACK TO CULT_PROLOGUE WHE
blood.data["blood_colour"] = B.basecolor
blood.data["blood_DNA"] = B.blood_DNA
blood.data["virus2"] = B.virus2
if (previous_result != BLOODCOST_TARGET_SPLATTER)
if (!tribute && previous_result != BLOODCOST_TARGET_SPLATTER)
user.visible_message("<span class='warning'>The blood on the floor bellow \the [user] starts moving!</span>",
"<span class='rose'>You redirect the flow of blood inside the splatters on the floor toward the pool of your summoning.</span>",
"<span class='warning'>You hear a liquid flowing.</span>")
if (BLOODCOST_TARGET_GRAB)
var/mob/living/carbon/human/H = data[BLOODCOST_TARGET_GRAB]
blood = get_blood(H.vessel)
if (previous_result != BLOODCOST_TARGET_GRAB)
if (!tribute && previous_result != BLOODCOST_TARGET_GRAB)
user.visible_message("<span class='warning'>\The [user] stabs their nails inside \the [data[BLOODCOST_TARGET_GRAB]], drawing blood from them!</span>",
"<span class='rose'>You stab your nails inside \the [data[BLOODCOST_TARGET_GRAB]] to draw some blood from them.</span>",
"<span class='warning'>You hear a liquid flowing.</span>")
if (BLOODCOST_TARGET_BLEEDER)
var/mob/living/carbon/human/H = data[BLOODCOST_TARGET_BLEEDER]
blood = get_blood(H.vessel)
if (previous_result != BLOODCOST_TARGET_BLEEDER)
if (!tribute && previous_result != BLOODCOST_TARGET_BLEEDER)
user.visible_message("<span class='warning'>\The [user] dips their fingers inside \the [data[BLOODCOST_TARGET_BLEEDER]]'s wounds!</span>",
"<span class='rose'>You dip your fingers inside \the [data[BLOODCOST_TARGET_BLEEDER]]'s wounds to draw some blood from them.</span>",
"<span class='warning'>You hear a liquid flowing.</span>")
if (BLOODCOST_TARGET_HELD)
var/obj/item/weapon/reagent_containers/G = data[BLOODCOST_TARGET_HELD]
blood = locate() in G.reagents.reagent_list
if (previous_result != BLOODCOST_TARGET_HELD)
if (!tribute && previous_result != BLOODCOST_TARGET_HELD)
user.visible_message("<span class='warning'>\The [user] tips \the [data[BLOODCOST_TARGET_HELD]], pouring blood!</span>",
"<span class='rose'>You tip \the [data[BLOODCOST_TARGET_HELD]] to pour the blood contained inside.</span>",
"<span class='warning'>You hear a liquid flowing.</span>")
if (BLOODCOST_TARGET_BLOODPACK)
var/obj/item/weapon/reagent_containers/blood/B = data[BLOODCOST_TARGET_BLOODPACK]
blood = locate() in B.reagents.reagent_list
if (previous_result != BLOODCOST_TARGET_BLOODPACK)
if (!tribute && previous_result != BLOODCOST_TARGET_BLOODPACK)
user.visible_message("<span class='warning'>\The [user] squeezes \the [data[BLOODCOST_TARGET_BLOODPACK]], pouring blood!</span>",
"<span class='rose'>You squeeze \the [data[BLOODCOST_TARGET_BLOODPACK]] to pour the blood contained inside.</span>",
"<span class='warning'>You hear a liquid flowing.</span>")
if (BLOODCOST_TARGET_CONTAINER)
var/obj/item/weapon/reagent_containers/G = data[BLOODCOST_TARGET_CONTAINER]
blood = locate() in G.reagents.reagent_list
if (previous_result != BLOODCOST_TARGET_CONTAINER)
if (!tribute && previous_result != BLOODCOST_TARGET_CONTAINER)
user.visible_message("<span class='warning'>\The [user] dips their fingers inside \the [data[BLOODCOST_TARGET_CONTAINER]], covering them in blood!</span>",
"<span class='rose'>You dip your fingers inside \the [data[BLOODCOST_TARGET_CONTAINER]], covering them in blood.</span>",
"<span class='warning'>You hear a liquid flowing.</span>")
if (BLOODCOST_TARGET_USER)
if (data[BLOODCOST_HOLES_BLOODPACK])
to_chat(user, "<span class='warning'>You must puncture \the [data[BLOODCOST_TARGET_BLOODPACK]] before you can squeeze blood from it!</span>")
else if (data[BLOODCOST_LID_HELD])
to_chat(user, "<span class='warning'>Remove \the [data[BLOODCOST_TARGET_HELD]]'s lid first!</span>")
else if (data[BLOODCOST_LID_CONTAINER])
to_chat(user, "<span class='warning'>Remove \the [data[BLOODCOST_TARGET_CONTAINER]]'s lid first!</span>")
if (!tribute)
if (data[BLOODCOST_HOLES_BLOODPACK])
to_chat(user, "<span class='warning'>You must puncture \the [data[BLOODCOST_TARGET_BLOODPACK]] before you can squeeze blood from it!</span>")
else if (data[BLOODCOST_LID_HELD])
to_chat(user, "<span class='warning'>Remove \the [data[BLOODCOST_TARGET_HELD]]'s lid first!</span>")
else if (data[BLOODCOST_LID_CONTAINER])
to_chat(user, "<span class='warning'>Remove \the [data[BLOODCOST_TARGET_CONTAINER]]'s lid first!</span>")
var/mob/living/carbon/human/H = user
blood = get_blood(H.vessel)
if (previous_result != BLOODCOST_TARGET_USER)
if(istype(H))
if(!tribute && istype(H))
var/obj/item/weapon/W = H.get_active_hand()
if (W && W.sharpness_flags & SHARP_BLADE)
to_chat(user, "<span class='rose'>You slice open your finger with \the [W] to let a bit of blood flow.</span>")
@@ -318,14 +353,15 @@ var/veil_thickness = CULT_EPILOGUE//REMEMBER TO SET IT BACK TO CULT_PROLOGUE WHE
else
to_chat(user, "<span class='rose'>You bite your finger and let the blood pearl up.</span>")
if (BLOODCOST_FAILURE)
if (data[BLOODCOST_HOLES_BLOODPACK])
to_chat(user, "<span class='danger'>You must puncture \the [data[BLOODCOST_TARGET_BLOODPACK]] before you can squeeze blood from it!</span>")
else if (data[BLOODCOST_LID_HELD])
to_chat(user, "<span class='danger'>Remove \the [data[BLOODCOST_TARGET_HELD]]'s lid first!</span>")
else if (data[BLOODCOST_LID_CONTAINER])
to_chat(user, "<span class='danger'>Remove \the [data[BLOODCOST_TARGET_HELD]]'s lid first!</span>")
else
to_chat(user, "<span class='danger'>There is no blood available. Not even in your own body!</span>")
if (!tribute)
if (data[BLOODCOST_HOLES_BLOODPACK])
to_chat(user, "<span class='danger'>You must puncture \the [data[BLOODCOST_TARGET_BLOODPACK]] before you can squeeze blood from it!</span>")
else if (data[BLOODCOST_LID_HELD])
to_chat(user, "<span class='danger'>Remove \the [data[BLOODCOST_TARGET_HELD]]'s lid first!</span>")
else if (data[BLOODCOST_LID_CONTAINER])
to_chat(user, "<span class='danger'>Remove \the [data[BLOODCOST_TARGET_HELD]]'s lid first!</span>")
else
to_chat(user, "<span class='danger'>There is no blood available. Not even in your own body!</span>")
//Blood is only consumed if there is enough of it
if (!data[BLOODCOST_FAILURE])
@@ -376,6 +412,8 @@ var/veil_thickness = CULT_EPILOGUE//REMEMBER TO SET IT BACK TO CULT_PROLOGUE WHE
to_chat(user, "<span class='sinister'>It will be all over soon.</span>")
H.take_overall_damage(data[BLOODCOST_AMOUNT_USER] ? 0.1 : 0)
if (communion && data[BLOODCOST_TOTAL] + total_accumulated >= amount_needed)
data[BLOODCOST_TOTAL] = max(data[BLOODCOST_TOTAL], total_needed)
data["blood"] = blood
return data

View File

@@ -334,7 +334,7 @@
// CULT SPIRE //Can be used by cultists to acquire arcane tattoos. One of each tier.
// //
///////////////////////////
var/list/cult_spires = list()
/obj/structure/cult/spire
name = "spire"
@@ -354,15 +354,27 @@
/obj/structure/cult/spire/New()
..()
cult_spires.Add(src)
set_light(1)
stage = min(3,max(1,veil_thickness-1))
flick("spire[stage]-spawn",src)
spawn(10)
update_stage()
/obj/structure/cult/spire/Destroy()
cult_spires.Remove(src)
..()
/obj/structure/cult/spire/proc/upgrade()
update_stage()
flick("[icon_state]-morph", src)
var/new_stage = min(3,max(1,veil_thickness-1))
if (new_stage>stage)
stage = new_stage
alpha = 255
overlays.len = 0
color = null
flick("spire[new_stage]-morph", src)
spawn(3)
update_stage()
/obj/structure/cult/spire/proc/update_stage()
animate(src, alpha = 128, color = list(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0), time = 10, loop = -1)
@@ -412,6 +424,83 @@
spawn(10)
update_stage()
/obj/structure/cult/spire/cultist_act(var/mob/user,var/menu="default")
.=..()
if (!.)
return
if (!ishuman(user))
to_chat(user,"<span class='warning'>Only humans can bear the arcane markings granted by this [src]</span>")
return
var/mob/living/carbon/human/H = user
var/datum/role/cultist/C = H.mind.GetRole(CULTIST)
var/list/available_tattoos = list("tier1","tier2","tier3")
for (var/tattoo in C.tattoos)
var/datum/cult_tattoo/CT = C.tattoos[tattoo]
available_tattoos -= "tier[CT.tier]"
var/tattoo_tier = 0
if (available_tattoos.len <= 0)
to_chat(user,"<span class='warning'>You cannot bear any additional mark.</span>")
return
if ("tier1" in available_tattoos)
tattoo_tier = 1
else if ("tier2" in available_tattoos)
tattoo_tier = 2
else if ("tier3" in available_tattoos)
tattoo_tier = 3
if (!tattoo_tier)
return
var/list/optionlist = list()
if (stage >= tattoo_tier)
for (var/subtype in subtypesof(/datum/cult_tattoo))
var/datum/cult_tattoo/T = new subtype
if (T.tier == tattoo_tier)
optionlist.Add(T.name)
to_chat(H, "<span class='danger'>[T.name]</span>: [T.desc]")
else
to_chat(user,"<span class='warning'>Come back to acquire another mark once your cult is a step closer to its goal.</span>")
return
for(var/option in optionlist)
optionlist[option] = image(icon = 'icons/obj/cult_radial2.dmi', icon_state = "[option]")
var/tattoo = show_radial_menu(user,loc,optionlist,'icons/obj/cult_radial2.dmi')//spawning on loc so we aren't offset by pixel_x/pixel_y, or affected by animate()
for (var/tat in C.tattoos)
var/datum/cult_tattoo/CT = C.tattoos[tat]
if (CT.tier == tattoo_tier)//the spire won't let cultists get multiple tattoos of the same tier.
return
if (!Adjacent(user))//stay here you bloke!
return
for (var/subtype in subtypesof(/datum/cult_tattoo))
var/datum/cult_tattoo/T = new subtype
if (T.name == tattoo)
var/datum/cult_tattoo/new_tattoo = T
C.tattoos[new_tattoo.name] = new_tattoo
anim(target = loc, a_icon = 'icons/effects/32x96.dmi', flick_anim = "tattoo_send", lay = NARSIE_GLOW, plane = LIGHTING_PLANE)
spawn (3)
C.update_cult_hud()
new_tattoo.getTattoo(H)
anim(target = H, a_icon = 'icons/effects/32x96.dmi', flick_anim = "tattoo_receive", lay = NARSIE_GLOW, plane = LIGHTING_PLANE)
sleep(1)
H.update_mutations()
var/atom/movable/overlay/tattoo_markings = anim(target = H, a_icon = 'icons/mob/cult_tattoos.dmi', flick_anim = "[new_tattoo.icon_state]_mark", sleeptime = 30, lay = NARSIE_GLOW, plane = LIGHTING_PLANE)
animate(tattoo_markings, alpha = 0, time = 30)
available_tattoos -= "tier[new_tattoo.tier]"
if (available_tattoos.len > 0)
cultist_act(user)
break
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //Spawned from the Raise Structure rune. Available from Act II
// CULT FORGE //Also a source of heat
@@ -440,6 +529,7 @@
var/timeleft = 0
var/timetotal = 0
var/obj/effect/cult_ritual/forge/forging = null
var/image/progbar = null//progress bar
/obj/structure/cult/forge/New()
@@ -507,23 +597,30 @@
if (forging)
if (forger)
if (!Adjacent(forger))
if (forger.client)
forger.client.images -= progbar
forger = null
return
else
timeleft--
update_progbar()
if (timeleft<=0)
playsound(loc, 'sound/effects/forge_over.ogg', 50, 0, -3)
playsound(L, 'sound/effects/forge_over.ogg', 50, 0, -3)
if (forger.client)
forger.client.images -= progbar
qdel(forging)
forging = null
forger = null
var/obj/item/I = new template(loc)
var/obj/item/I = new template(L)
if (istype(I))
I.plane = EFFECTS_PLANE
I.layer = PROJECTILE_LAYER
I.pixel_y = 12
else
I.forceMove(get_turf(forger))
forger = null
template = null
else
playsound(loc, 'sound/effects/forge.ogg', 50, 0, -4)
playsound(L, 'sound/effects/forge.ogg', 50, 0, -4)
forging.overlays.len = 0
var/image/I = image('icons/obj/cult_64x64.dmi',"[forging.icon_state]-mask")
I.plane = LIGHTING_PLANE
@@ -587,6 +684,17 @@
return 1
..()
/obj/structure/cult/forge/proc/update_progbar()
if (!progbar)
progbar = image("icon" = 'icons/effects/doafter_icon.dmi', "loc" = src, "icon_state" = "prog_bar_0")
progbar.pixel_z = WORLD_ICON_SIZE
progbar.plane = HUD_PLANE
progbar.pixel_x = 16 * PIXEL_MULTIPLIER
progbar.pixel_y = 16 * PIXEL_MULTIPLIER
progbar.appearance_flags = RESET_ALPHA|RESET_COLOR
progbar.layer = HUD_ABOVE_ITEM_LAYER
progbar.icon_state = "prog_bar_[round((100 - min(1, timeleft / timetotal) * 100), 10)]"
/obj/structure/cult/forge/cultist_act(var/mob/user,var/menu="default")
.=..()
if (!.)
@@ -594,13 +702,23 @@
if (template)
if (forger)
to_chat(user, "\The [forger] is currently working at this forge already.")
if (forger == user)
to_chat(user, "You are already working at this forge.")
else
to_chat(user, "\The [forger] is currently working at this forge already.")
else
to_chat(user, "You resume working at the forge.")
forger = user
if (forger.client)
forger.client.images |= progbar
return
var/optionlist = list("blade","shell","helmet","armour")
var/optionlist = list(
"Forge Blade",
"Forge Construct Shell",
"Forge Helmet",
"Forge Armor"
)
for(var/option in optionlist)
optionlist[option] = image(icon = 'icons/obj/cult_radial.dmi', icon_state = "radial_[option]")
@@ -609,21 +727,27 @@
return
var/forge_icon = ""
switch (task)
if ("blade")
if ("Forge Blade")
template = /obj/item/weapon/melee/cultblade
timeleft = 20
timeleft = 10
forge_icon = "forge_blade"
if ("armour")
if ("Forge Armor")
template = /obj/item/clothing/suit/space/cult
timeleft = 45
if ("helmet")
timeleft = 23
forge_icon = "forge_armor"
if ("Forge Helmet")
template = /obj/item/clothing/head/helmet/space/cult
timeleft = 15
if ("shell")
timeleft = 8
forge_icon = "forge_helmet"
if ("Forge Construct Shell")
template = /obj/structure/constructshell/cult
timeleft = 50
timeleft = 25
forge_icon = "forge_shell"
timetotal = timeleft
forger = user
update_progbar()
if (forger.client)
forger.client.images |= progbar
forging = new (loc,forge_icon)
/obj/effect/cult_ritual/forge

View File

@@ -23,6 +23,87 @@
/obj/effect/cult_ritual/singularity_act()
return
///////////////////////////////////////SHORTCUT////////////////////////////////////////////////
/obj/effect/cult_shortcut
name = "sigil"
icon = 'icons/obj/cult.dmi'
icon_state = "sigil"
anchored = 1
mouse_opacity = 1
layer = NARSIE_GLOW
plane = LIGHTING_PLANE
var/persist = 0//so mappers can make permanent sigils
/obj/effect/cult_shortcut/New(var/turf/loc, var/atom/model)
..()
if (!persist)
spawn (60 SECONDS)
qdel(src)
/obj/effect/cult_shortcut/attack_hand(var/mob/living/user)
if (!iscultist(user))
to_chat(user, "<span class='warning'>Strange markings on this wall. You don't feel comfortable staring at them.</span>")
return
var/turf/T = get_turf(user)
if (T == loc)
return
var/jump_dir = get_dir(T,loc)
shadow(loc,T,"sigil_jaunt")
spawn(1)
new /obj/effect/red_afterimage(T,user)
user.forceMove(loc)
sleep(1)
new /obj/effect/red_afterimage(loc,user)
user.forceMove(get_step(loc,jump_dir))
/obj/effect/cult_shortcut/cultify()
return
/obj/effect/cult_shortcut/ex_act()
return
/obj/effect/cult_shortcut/emp_act()
return
/obj/effect/cult_shortcut/blob_act()
return
/obj/effect/cult_shortcut/singularity_act()
return
/obj/effect/red_afterimage
icon = null
icon_state = null
anchored = 1
mouse_opacity = 0
/obj/effect/red_afterimage/New(var/turf/loc, var/atom/model)
..()
if(model)
src.appearance = model.appearance
dir = model.dir
color = "red"
layer = NARSIE_GLOW
plane = LIGHTING_PLANE
animate(src,alpha = 0, time = 5)
spawn(5)
qdel(src)
/obj/effect/red_afterimage/cultify()
return
/obj/effect/red_afterimage/ex_act()
return
/obj/effect/red_afterimage/emp_act()
return
/obj/effect/red_afterimage/blob_act()
return
/obj/effect/red_afterimage/singularity_act()
return
///////////////////////////////////////JAUNT////////////////////////////////////////////////
//Cultists ride in those when teleporting
@@ -155,7 +236,6 @@
else
target_y = TRANSITIONEDGE + rand(16,20)
to_chat(world,"target at ([target.x],[target.y],[target.z]), (dx/dy)=([dx]/[dy]) so we're tp'ing at ([target_x],[target_y],[target.z])")
var/turf/T = locate(target_x,target_y,target.z)
starting = T
forceMove(T)

View File

@@ -488,8 +488,10 @@ var/list/arcane_tomes = list()
return 1
var/turf/T = get_turf(user)
playsound(T, 'sound/items/Deconstruct.ogg', 50, 1)
user.drop_item(T, src)
user.drop_item(src,T)
var/obj/item/weapon/melee/soulblade/SB = new (T)
if (fingerprints)
SB.fingerprints = fingerprints.Copy()
spawn(1)
user.put_in_active_hand(SB)
for(var/mob/living/simple_animal/shade/A in I)
@@ -497,7 +499,6 @@ var/list/arcane_tomes = list()
SB.shade = A
break
SB.update_icon()
user.swap_hand()
qdel(I)
qdel(src)
return 1
@@ -553,23 +554,82 @@ var/list/arcane_tomes = list()
var/turf/T = get_turf(src)
if (istype(loc, /obj/item/projectile))
qdel(loc)
if (T)
if (shade)
if (shade)
shade.remove_blade_powers()
if (T)
shade.forceMove(T)
shade.status_flags &= ~GODMODE
shade.canmove = 1
shade.cancel_camera()
var/datum/control/C = shade.control_object[src]
if(C)
C.break_control()
qdel(C)
else
qdel(shade)
if (T)
var/obj/item/weapon/melee/cultblade/nocult/B = new (T)
B.Move(get_step_rand(T))
if (fingerprints)
B.fingerprints = fingerprints.Copy()
new /obj/item/device/soulstone(T)
shade = null
..()
/obj/item/weapon/melee/soulblade/examine(var/mob/user)
..()
if (iscultist(user))
to_chat(user, "<span class='info'>blade blood: [blood]%</span>")
to_chat(user, "<span class='info'>blade health: [round((health/maxHealth)*100)]%</span>")
/obj/item/weapon/melee/soulblade/cultify()
return
/obj/item/weapon/melee/soulblade/attack_self(var/mob/user)
if (!iscultist(user))
to_chat(user,"<span class='warning'>There is a crimson gem encrusted into the blade, but you're not exactly sure how you could remove it.</span>")
return
var/optionlist = list(
"Give Blood",
"Remove Gem"
)
for(var/option in optionlist)
optionlist[option] = image(icon = 'icons/obj/cult_radial.dmi', icon_state = "radial_[option]")
var/task = show_radial_menu(user,user,optionlist,'icons/obj/cult_radial.dmi')//spawning on loc so we aren't offset by pixel_x/pixel_y, or affected by animate()
if (user.get_active_hand() != src)
to_chat(user,"<span class='warning'>You must hold the blade in your active hand.</span>")
return
switch (task)
if ("Give Blood")
var/data = use_available_blood(user, 10)
if (data[BLOODCOST_RESULT] != BLOODCOST_FAILURE)
blood = min(maxblood,blood+20)//reminder that the blade cannot give blood back to their wielder, so this should prevent some exploits
health = min(maxHealth,health+10)
if ("Remove Gem")
var/turf/T = get_turf(user)
playsound(T, 'sound/items/Deconstruct.ogg', 50, 0, -3)
user.drop_item(src,T)
var/obj/item/weapon/melee/cultblade/CB = new (T)
var/obj/item/device/soulstone/gem/SG = new (T)
if (fingerprints)
CB.fingerprints = fingerprints.Copy()
user.put_in_active_hand(CB)
user.put_in_inactive_hand(SG)
if (shade)
shade.forceMove(SG)
shade.remove_blade_powers()
SG.icon_state = "soulstone2"
SG.item_state = "shard-soulstone2"
SG.name = "Soul Stone: [shade.real_name]"
shade = null
loc = null//so we won't drop a broken blade and shard
qdel(src)
/obj/item/weapon/melee/soulblade/attack(var/mob/living/target, var/mob/living/carbon/human/user)
if(!iscultist(user))
user.Paralyse(5)
@@ -577,18 +637,45 @@ var/list/arcane_tomes = list()
var/datum/organ/external/affecting = user.get_active_hand_organ()
if(affecting && affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade.
user.UpdateDamageIcon()
return
..()
if (istype(target, /mob/living/carbon))
if (!shade && istype(target, /mob/living/carbon))
transfer_soul("VICTIM", target, user,1)
update_icon()
/obj/item/weapon/melee/soulblade/afterattack(var/atom/A, var/mob/living/user, var/proximity_flag, var/click_parameters)
if(proximity_flag)
return
if (user.is_pacified(VIOLENCE_SILENT,A,src))
return
if (blood >= 5)
blood = max(0,blood-5)
var/turf/starting = get_turf(user)
var/turf/target = get_turf(A)
var/obj/item/projectile/bloodslash/BS = new (starting)
BS.firer = user
BS.original = target
BS.target = target
BS.current = starting
BS.starting = starting
BS.yo = target.y - starting.y
BS.xo = target.x - starting.x
user.delayNextAttack(4)
if(user.zone_sel)
BS.def_zone = user.zone_sel.selecting
else
BS.def_zone = LIMB_CHEST
BS.OnFired()
playsound(starting, 'sound/effects/forge.ogg', 100, 1)
BS.process()
/obj/item/weapon/melee/soulblade/on_attack(var/atom/attacked, var/mob/user)
..()
if (ismob(attacked))
var/mob/living/M = attacked
M.take_organ_damage(0,5)
playsound(loc, 'sound/items/Welder.ogg', 50, 1)
playsound(loc, 'sound/weapons/welderattack.ogg', 50, 1)
if (iscarbon(M))
var/mob/living/carbon/C = M
if (C.stat != DEAD)
@@ -630,8 +717,9 @@ var/list/arcane_tomes = list()
animate(src, pixel_y = -8 * PIXEL_MULTIPLIER , time = 7, loop = -1, easing = SINE_EASING)
animate(pixel_y = -12 * PIXEL_MULTIPLIER, time = 7, loop = -1, easing = SINE_EASING)
else
plane = initial(plane)
layer = initial(layer)
if (!ismob(loc))
plane = initial(plane)
layer = initial(layer)
item_state = "soulblade"
icon_state = "soulblade"
@@ -713,6 +801,104 @@ var/list/arcane_tomes = list()
..()
takeDamage(P.damage)
///////////////////////////////////////BLOOD DAGGER////////////////////////////////////////////////
/obj/item/weapon/melee/blood_dagger
name = "blood dagger"
icon = 'icons/obj/cult.dmi'
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/swords_axes.dmi', "right_hand" = 'icons/mob/in-hand/right/swords_axes.dmi')
icon_state = "blood_dagger"
item_state = "blood_dagger"
desc = "A knife-shaped hunk of solidified blood."
siemens_coefficient = 0.2
sharpness = 1.5
sharpness_flags = SHARP_TIP | SHARP_BLADE
force = 15.0
w_class = W_CLASS_GIANT//don't want it stored anywhere
attack_verb = list("slashes", "stabs", "slices", "tears", "rips", "dices", "cuts")
hitsound = 'sound/weapons/bladeslice.ogg'
var/mob/originator = null
var/stacks = 0
var/absorbed = 0
/obj/item/weapon/melee/blood_dagger/Destroy()
var/turf/T = get_turf(src)
playsound(T, 'sound/effects/forge_over.ogg', 100, 0, -2)
if (!absorbed && !locate(/obj/effect/decal/cleanable/blood/splatter) in T)
var/obj/effect/decal/cleanable/blood/splatter/S = new (T)//splash
if (color)
S.basecolor = color
S.update_icon()
..()
/obj/item/weapon/melee/blood_dagger/dropped(var/mob/user)
..()
qdel(src)
/obj/item/weapon/melee/blood_dagger/attack(var/mob/living/target, var/mob/living/carbon/human/user)
if(target == user)
if (stacks < 5 && user.take_blood(null,5))
stacks++
playsound(user, 'sound/weapons/bladeslice.ogg', 30, 0, -2)
to_chat(user, "<span class='warning'>The dagger takes a bit of your blood.</span>")
return
..()
/obj/item/weapon/melee/blood_dagger/attack_hand(var/mob/living/user)
if(!ismob(loc))
qdel(src)
return
..()
/obj/item/weapon/melee/blood_dagger/attack_self(var/mob/user)
if (ishuman(user) && iscultist(user))
var/mob/living/carbon/human/H = user
var/datum/reagent/blood/B = get_blood(H.vessel)
if (B)
to_chat(user, "<span class='notice'>You sheath the dagger back inside your body[stacks ? ", along with the stolen blood" : ""].</span>")
H.vessel.add_reagent(BLOOD, 5 + stacks * 5)
H.vessel.update_total()
else
to_chat(user, "<span class='notice'>You sheath the dagger inside your body, but the blood fails to find vessels to occupy.</span>")
absorbed = 1
playsound(H, 'sound/weapons/bloodyslice.ogg', 30, 0, -2)
qdel(src)
/obj/item/weapon/melee/blood_dagger/pre_throw()
absorbed = 1
/obj/item/weapon/melee/blood_dagger/throw_at(var/atom/targ, var/range, var/speed, var/override = 1, var/fly_speed = 0)
var/turf/starting = get_turf(src)
var/turf/target = get_turf(targ)
var/obj/item/projectile/blooddagger/BD = new (starting)
BD.original = target
BD.target = target
BD.current = starting
BD.starting = starting
BD.yo = target.y - starting.y
BD.xo = target.x - starting.x
BD.stacks = stacks
BD.damage = 5 + stacks * 5
BD.icon_state = icon_state
BD.color = color
BD.firer = originator
BD.OnFired()
BD.process()
qdel(src)
/obj/item/weapon/melee/blood_dagger/on_attack(var/atom/attacked, var/mob/user)
..()
if (ismob(attacked))
var/mob/living/M = attacked
if (iscarbon(M))
var/mob/living/carbon/C = M
var/datum/reagent/B = C.take_blood(null,5)
if (B)
if (stacks < 5)
stacks++
to_chat(user, "<span class='warning'>The dagger steals a bit of their blood.</span>")
else if (!locate(/obj/effect/decal/cleanable/blood/splatter) in get_turf(C))
blood_splatter(C,B,1)//no room in the dagger? let's splatter their stolen blood on the floor.
///////////////////////////////////////SOULSTONE////////////////////////////////////////////////
/obj/item/device/soulstone/gem
name = "Soul Gem"
@@ -740,7 +926,7 @@ var/list/arcane_tomes = list()
icon_state = "culthood"
desc = "A hood worn by the followers of Nar-Sie."
flags = FPRINT
armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 30, bullet = 10, laser = 10,energy = 5, bomb = 10, bio = 25, rad = 0)
body_parts_covered = EARS|HEAD
siemens_coefficient = 0
heat_conductivity = SPACESUIT_HEAT_CONDUCTIVITY
@@ -779,8 +965,8 @@ var/list/arcane_tomes = list()
icon_state = "cultrobes"
item_state = "cultrobes"
flags = FPRINT
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
allowed = list(/obj/item/weapon/melee/cultblade,/obj/item/weapon/melee/soulblade,/obj/item/weapon/tome,/obj/item/weapon/talisman,/obj/item/weapon/blood_tesseract)
armor = list(melee = 50, bullet = 30, laser = 30,energy = 20, bomb = 25, bio = 25, rad = 0)
siemens_coefficient = 0
/obj/item/clothing/suit/cultrobes/get_cult_power()
@@ -834,9 +1020,10 @@ var/list/arcane_tomes = list()
/obj/item/clothing/head/helmet/space/cult
name = "cult helmet"
desc = "A space worthy helmet used by the followers of Nar-Sie"
icon_state = "cult_helmet"
item_state = "cult_helmet"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/cultstuff.dmi', "right_hand" = 'icons/mob/in-hand/right/cultstuff.dmi')
icon_state = "culthelmet"
item_state = "culthelmet"
armor = list(melee = 60, bullet = 50, laser = 50,energy = 15, bomb = 50, bio = 30, rad = 30)
siemens_coefficient = 0
/obj/item/clothing/head/helmet/space/cult/get_cult_power()
@@ -849,13 +1036,14 @@ var/list/arcane_tomes = list()
/obj/item/clothing/suit/space/cult
name = "cult armor"
icon_state = "cult_armour"
item_state = "cult_armour"
desc = "A bulky suit of armor bristling with spikes. It looks space proof."
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/cultstuff.dmi', "right_hand" = 'icons/mob/in-hand/right/cultstuff.dmi')
icon_state = "cultarmor"
item_state = "cultarmor"
w_class = W_CLASS_MEDIUM
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_nitrogen)
slowdown = NO_SLOWDOWN
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/melee/soulblade,/obj/item/weapon/tank,/obj/item/weapon/tome,/obj/item/weapon/talisman,/obj/item/weapon/blood_tesseract)
slowdown = HARDSUIT_SLOWDOWN_MED
armor = list(melee = 60, bullet = 50, laser = 50,energy = 15, bomb = 50, bio = 30, rad = 30)
siemens_coefficient = 0
/obj/item/clothing/suit/space/cult/get_cult_power()
@@ -925,7 +1113,7 @@ var/list/arcane_tomes = list()
if (!cult)
cult = ticker.mode.CreateFaction(/datum/faction/bloodcult, null, 1)
cult.HandleRecruitedRole(newCultist)
newCultist.OnPostSetup(FALSE)
newCultist.OnPostSetup()
newCultist.Greet(GREET_PAMPHLET)
//Jaunter: creates a pylon on spawn, lets you teleport to it on use

View File

@@ -0,0 +1,290 @@
//////////////////////////////
// //
// PERFORATING BLADE ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //Used when a filled soul blade performs a perforation
//////////////////////////////
/obj/item/projectile/soulbullet
name = "soul blade"
icon = 'icons/obj/cult_64x64.dmi'
icon_state = "soulbullet"
pixel_x = -16 * PIXEL_MULTIPLIER
pixel_y = -10 * PIXEL_MULTIPLIER
damage = 30//Only affects obj/turf. Mobs take a regular hit from the sword.
phase_type = PROJREACT_MOBS
penetration = -1
fire_sound = null
mouse_opacity = 1
var/turf/secondary_target = null
var/obj/item/weapon/melee/soulblade/blade = null
var/mob/living/simple_animal/shade/shade = null
var/redirected = 0
var/leave_shadows = -1
var/matrix/shadow_matrix = null
/obj/item/projectile/soulbullet/Destroy()
var/turf/T = get_turf(src)
if (T)
if (blade)
blade.forceMove(T)
blade = null
shade = null
..()
/obj/item/projectile/soulbullet/OnFired(var/proj_target = original)
target = get_turf(proj_target)
if (!secondary_target)
secondary_target = target
if (!shade)
icon_state = "soulbullet-empty"
dist_x = abs(target.x - starting.x)
dist_y = abs(target.y - starting.y)
override_starting_X = starting.x
override_starting_Y = starting.y
override_target_X = target.x
override_target_Y = target.y
if (target.x > starting.x)
dx = EAST
else
dx = WEST
if (target.y > starting.y)
dy = NORTH
else
dy = SOUTH
if(dist_x > dist_y)
error = dist_x/2 - dist_y
else
error = dist_y/2 - dist_x
if (target!=secondary_target)
target_angle = round(Get_Angle(target,secondary_target))
blade.dir = get_dir(target,secondary_target)
else
target_angle = round(Get_Angle(starting,target))
blade.dir = get_dir(starting,target)
shadow_matrix = turn(matrix(),target_angle+45)
transform = shadow_matrix
//var/matrix/base_matrix = turn(matrix(),target_angle)
//var/image/I = image('icons/obj/cult_64x64.dmi',"[icon_state]_spin")
//I.transform = base_matrix
if (shade)
icon_state = "soulbullet_spin"
plane = HUD_PLANE
layer = ABOVE_HUD_LAYER
else
icon_state = "soulbullet-empty_spin"
spawn(5)
leave_shadows = 0
/*
if( !("[icon_state]_angle[target_angle]" in bullet_master) )
var/image/I = new('icons/obj/cult_64x64.dmi',"[icon_state]")
//I.transform = base_matrix
bullet_master["[icon_state]_angle[target_angle]"] = I
src.icon = bullet_master["[icon_state]_angle[target_angle]"]
*/
if (shade)
icon_state = "soulbullet"
else
icon_state = "soulbullet-empty"
return 1
/obj/item/projectile/soulbullet/bresenham_step(var/distA, var/distB, var/dA, var/dB)
if (shade && leave_shadows >= 0)
leave_shadows++
if ((leave_shadows%3)==0)
anim(target = loc, a_icon = 'icons/obj/cult_64x64.dmi', flick_anim = "soulblade-shadow", lay = NARSIE_GLOW, offX = pixel_x, offY = pixel_y, plane = LIGHTING_PLANE, trans = shadow_matrix)
if(..())
return 2
else
return 0
/obj/item/projectile/soulbullet/to_bump(var/atom/A)
if (shade)
if (ismob(A))
var/mob/M = A
if (!iscultist(M))
A.attackby(blade,shade)
else if (!M.get_active_hand())//cultists can catch the blade on the fly
blade.forceMove(loc)
blade.attack_hand(M)
blade = null
qdel(src)
else
A.attackby(blade,shade)
else
if (ismob(A))
var/mob/M = A
if (!iscultist(M))
A.hitby(blade)
else
A.hitby(blade)
if(isliving(A))
forceMove(get_step(loc,dir))
bump_original_check()
else
..()
/obj/item/projectile/soulbullet/bump_original_check()
if (loc == target && !redirected)
redirect()
/obj/item/projectile/soulbullet/reset()
..()
secondary_target = target
/obj/item/projectile/soulbullet/proc/redirect()
redirected = 1
projectile_speed = 0.66
if (target == secondary_target)
return
starting = target
target = secondary_target
dist_x = abs(target.x - starting.x)
dist_y = abs(target.y - starting.y)
override_starting_X = starting.x
override_starting_Y = starting.y
override_target_X = target.x
override_target_Y = target.y
if (target.x > starting.x)
dx = EAST
else
dx = WEST
if (target.y > starting.y)
dy = NORTH
else
dy = SOUTH
if(dist_x > dist_y)
error = dist_x/2 - dist_y
else
error = dist_y/2 - dist_x
/obj/item/projectile/soulbullet/cultify()
return
/obj/item/projectile/soulbullet/Cross(var/atom/movable/mover, var/turf/target, var/height=1.5, var/air_group = 0)
if(istype(mover, /obj/item/projectile))
if (prob(30))//less likely to be hit when perforating
return 0
return ..()
/obj/item/projectile/soulbullet/attackby(var/obj/item/I, var/mob/user)
if (blade)
return blade.attackby(I,user)
/obj/item/projectile/soulbullet/hitby(var/atom/movable/AM)
if (blade)
return blade.hitby(AM)
/obj/item/projectile/soulbullet/bullet_act(var/obj/item/projectile/P)
if (blade)
return blade.bullet_act(P)
//////////////////////////////
// //
// BLOOD SLASH ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //Used when a cultist swings a soul blade that has at least 5 blood in it.
//////////////////////////////
/obj/item/projectile/bloodslash
name = "soul blade"
icon = 'icons/obj/projectiles_experimental.dmi'
icon_state = "bloodslash"
damage = 15
damage_type = BURN
flag = "energy"
custom_impact = 1
/obj/item/projectile/bloodslash/Destroy()
var/turf/T = get_turf(src)
playsound(T, 'sound/effects/forge_over.ogg', 100, 1)
if (!locate(/obj/effect/decal/cleanable/blood/splatter) in T)
var/obj/effect/decal/cleanable/blood/splatter/S = new (T)//splash
S.amount = 1
..()
/obj/item/projectile/bloodslash/to_bump(var/atom/A)
if (isliving(A))
forceMove(A.loc)
var/mob/living/M = A
if (!iscultist(M))
..()
qdel(src)
/obj/item/projectile/bloodslash/on_hit(var/atom/target, var/blocked = 0)
if (isliving(target))
var/mob/living/M = target
if(M.flags & INVULNERABLE)
return 0
if (iscultist(M))
return 0
if (M.stat == DEAD)
return 0
to_chat(M, "<span class='warning'>You feel a searing heat inside of you!</span>")
return 1
/obj/item/projectile/bloodslash/cultify()
return
//////////////////////////////
// //
// BLOOD DAGGER ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //Used when a cultist throws a blood dagger
//////////////////////////////
/obj/item/projectile/blooddagger
name = "blood dagger"
icon = 'icons/obj/projectiles_experimental.dmi'
icon_state = "blood_dagger"
damage = 5
flag = "energy"
custom_impact = 1
projectile_speed = 0.66
var/absorbed = 0
var/stacks = 0
/obj/item/projectile/blooddagger/Destroy()
var/turf/T = get_turf(src)
playsound(T, 'sound/effects/forge_over.ogg', 100, 1)
if (!absorbed && !locate(/obj/effect/decal/cleanable/blood/splatter) in T)
var/obj/effect/decal/cleanable/blood/splatter/S = new (T)//splash
if (color)
S.basecolor = color
S.update_icon()
..()
/obj/item/projectile/blooddagger/to_bump(var/atom/A)
if (isliving(A))
forceMove(A.loc)
var/mob/living/M = A
if (!iscultist(M))
..()
else if (ishuman(M))
var/mob/living/carbon/human/H = M
var/datum/reagent/blood/B = get_blood(H.vessel)
if (B)
H.vessel.add_reagent(BLOOD, 5 + stacks * 5)
H.vessel.update_total()
to_chat(H, "<span class='notice'>[firer ? "\The [firer]'s" : "The"] [src] enters your body painlessly, irrigating your vessels with some fresh blood.</span>")
else
to_chat(H, "<span class='notice'>[firer ? "\The [firer]'s" : "The"] [src] enters your body, but you have no vessels to irrigate.</span>")
absorbed = 1
playsound(H, 'sound/weapons/bloodyslice.ogg', 30, 1)
qdel(src)
/obj/item/projectile/blooddagger/on_hit(var/atom/target, var/blocked = 0)
if (isliving(target))
var/mob/living/M = target
if(M.flags & INVULNERABLE)
return 0
if (iscultist(M))
return 0
if (M.stat == DEAD)
return 0
return 1
/obj/item/projectile/blooddagger/cultify()
return

View File

@@ -272,9 +272,7 @@ var/list/uristrune_cache = list()//icon cache, so the whole blending process is
to_chat(user, "<span class='notice'>You disrupt the vile magic with the deadening field of \the [I]!</span>")
qdel(src)
return
if(istype(I, /obj/item/weapon/tome))
trigger(user)
if(istype(I, /obj/item/weapon/melee/cultblade))
if(istype(I, /obj/item/weapon/tome) || istype(I, /obj/item/weapon/melee/cultblade) || istype(I, /obj/item/weapon/melee/soulblade))
trigger(user)
if(istype(I, /obj/item/weapon/talisman))
var/obj/item/weapon/talisman/T = I
@@ -411,13 +409,16 @@ var/list/uristrune_cache = list()//icon cache, so the whole blending process is
to_chat(user, "<span class='danger'>You find yourself unable to focus your mind on the arcane words of the rune.</span>")
return
if(user.is_wearing_item(/obj/item/clothing/mask/muzzle, slot_wear_mask))
to_chat(user, "<span class='danger'>You are unable to speak the words of the rune because of \the [user.wear_mask].</span>")//TODO; SILENT CASTING ALLOWS MUZZLED CAST
return
var/silent_casting = user.checkTattoo(TATTOO_SILENT)
if(user.is_mute())
to_chat(user, "<span class='danger'>You don't have the ability to perform rituals without voicing the incantations, there has to be some way...</span>")
return
if (!silent_casting)
if(user.is_wearing_item(/obj/item/clothing/mask/muzzle, slot_wear_mask))
to_chat(user, "<span class='danger'>You are unable to speak the words of the rune because of \the [user.wear_mask].</span>")
return
if(user.is_mute())
to_chat(user, "<span class='danger'>You don't have the ability to perform rituals without voicing the incantations, there has to be some way...</span>")
return
if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
return fizzle(user)
@@ -439,7 +440,9 @@ var/list/uristrune_cache = list()//icon cache, so the whole blending process is
active_spell = null
/obj/effect/rune/proc/fizzle(var/mob/living/user)
user.say(pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP"))
var/silent = user.checkTattoo(TATTOO_SILENT)
if (!silent)
user.say(pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP"))
one_pulse()
visible_message("<span class='warning'>The markings pulse with a small burst of light, then fall dark.</span>",\
"<span class='warning'>The markings pulse with a small burst of light, then fall dark.</span>",\

View File

@@ -63,6 +63,14 @@
activator = null
..()
/datum/rune_spell/proc/invoke(var/mob/user, var/text="", var/whisper=0)
if (user.checkTattoo(TATTOO_SILENT))
return
if (!whisper)
user.say(text,"C")
else
user.whisper(text)
/datum/rune_spell/proc/pre_cast()
var/mob/living/user = activator
//checking whether we're casting from a rune or a talisman.
@@ -70,10 +78,10 @@
if ((rune_flags & RUNE_STAND) && (user.loc != spell_holder.loc))
abort(RITUALABORT_STAND)
else
user.say(invocation,"C")
invoke(user,invocation)
cast()
else if (istype (spell_holder,/obj/item/weapon/talisman))
user.whisper(invocation)//talisman incantations are whispered
invoke(user,invocation,1)//talisman incantations are whispered
cast_talisman()
/datum/rune_spell/proc/midcast(var/mob/add_cultist)
@@ -369,7 +377,7 @@
if(!message)
return
var/datum/faction/bloodcult = find_active_faction_by_member(activator.mind.GetRole(BLOODCULT))
var/datum/faction/bloodcult = find_active_faction_by_member(activator.mind.GetRole(CULTIST))
for(var/datum/role/cultist/C in bloodcult.members)
var/datum/mind/M = C.antag
to_chat(M.current, "<span class='game say'><b>[activator.real_name]</b>'s voice echoes in your head, <B><span class='sinister'>[message]</span></B></span>")
@@ -382,10 +390,9 @@
qdel(src)
/datum/rune_spell/communication/Destroy()
if (destroying_self)
return
destroying_self = 1
qdel(comms)
if (comms)
qdel(comms)
comms = null
..()
@@ -426,7 +433,7 @@
speaker_name = H.real_name
L = speech.speaker
rendered_message = speech.render_message()
var/datum/faction/bloodcult = find_active_faction_by_member(L.mind.GetRole(BLOODCULT))
var/datum/faction/bloodcult = find_active_faction_by_member(L.mind.GetRole(CULTIST))
for(var/datum/role/cultist/C in bloodcult.members)
var/datum/mind/M = C.antag
if (M.current == speech.speaker)//echoes are annoying
@@ -988,10 +995,10 @@
var/mob/living/user = activator
if (istype (spell_holder,/obj/effect/rune))
user.say(invocation,"C")
invoke(user,invocation)
cast()
else if (istype (spell_holder,/obj/item/weapon/talisman))
user.whisper(invocation)
invoke(user,invocation,1)
cast_talisman()
/datum/rune_spell/stun/cast()
@@ -1011,10 +1018,10 @@
anim(target = M, a_icon = 'icons/effects/64x64.dmi', flick_anim = "touch_stun", lay = NARSIE_GLOW, offX = -WORLD_ICON_SIZE/2, offY = -WORLD_ICON_SIZE/2, plane = LIGHTING_PLANE)
playsound(spell_holder, 'sound/effects/stun_talisman.ogg', 25, 0, -5)
if (prob(5))//for old times' sake
activator.whisper("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
if (prob(15))//for old times' sake
invoke(activator,"Dream sign ''Evil sealing talisman'[pick("'","`")]!",1)
else
activator.whisper(invocation)
invoke(activator,invocation,1)
if(issilicon(M))
to_chat(M, "<span class='danger'>WARNING: Short-circuits detected, Rebooting...</span>")
@@ -1459,10 +1466,9 @@ var/list/blind_victims = list()
var/talisman_duration = 80 //tenths of a second
/datum/rune_spell/seer/Destroy()
if (destroying_self)
return
destroying_self = 1
qdel(seer_ritual)
if (seer_ritual)
qdel(seer_ritual)
seer_ritual = null
..()
@@ -1520,13 +1526,13 @@ var/list/blind_victims = list()
caster.apply_vision_overrides()
to_chat(caster, "<span class='notice'>You can no longer discern through the veil.</span>")
caster = null
if (source)
source.abort()
source = null
..()
/obj/effect/cult_ritual/seer/HasProximity(var/atom/movable/AM)
if (!caster || caster.loc != loc)
if (source)
source.abort(RITUALABORT_GONE)
qdel(src)
@@ -1721,7 +1727,7 @@ var/list/blind_victims = list()
rejoin = alert(activator, "Will you pull them toward you, or pull yourself toward them?","Blood Magnetism","Summon Cultist","Rejoin Cultist") == "Rejoin Cultist"
var/list/possible_targets = list()
var/datum/faction/bloodcult = find_active_faction_by_member(activator.mind.GetRole(BLOODCULT))
var/datum/faction/bloodcult = find_active_faction_by_member(activator.mind.GetRole(CULTIST))
for(var/datum/role/cultist/C in bloodcult.members)
var/datum/mind/M = C.antag
possible_targets.Add(M.current)
@@ -1979,9 +1985,9 @@ var/list/blind_victims = list()
/datum/rune_spell/portalentrance/midcast(var/mob/add_cultist)
if (istype(spell_holder, /obj/item/weapon/talisman))
add_cultist.whisper(invocation)
invoke(add_cultist,invocation,1)
else
add_cultist.say(invocation,"C")
invoke(add_cultist,invocation)
var/turf/destination = null
for (var/datum/rune_spell/portalexit/P in bloodcult_exitportals)
@@ -2087,9 +2093,10 @@ var/list/bloodcult_exitportals = list()
to_chat(add_cultist, "<span class='notice'>You may teleport to this rune by using a Path Entrance, or a talisman attuned to it.</span>")
/datum/rune_spell/portalexit/midcast_talisman(var/mob/add_cultist)
add_cultist.whisper(invocation)
anim(target = get_turf(add_cultist), a_icon = 'icons/effects/effects.dmi', flick_anim = "rune_teleport")
new /obj/effect/bloodcult_jaunt (get_turf(add_cultist), add_cultist, get_turf(spell_holder))
var/turf/T = get_turf(add_cultist)
invoke(add_cultist,invocation,1)
anim(target = T, a_icon = 'icons/effects/effects.dmi', flick_anim = "rune_teleport")
new /obj/effect/bloodcult_jaunt (T, add_cultist, get_turf(spell_holder))
/datum/rune_spell/portalexit/cast_talisman()
var/obj/item/weapon/talisman/T = spell_holder
@@ -2108,7 +2115,7 @@ var/list/bloodcult_exitportals = list()
qdel(src)
return
activator.whisper("[cultwords_rune[cultwords_english.Find(network)]]!")
invoke(activator,"[cultwords_rune[cultwords_english.Find(network)]]!",1)
to_chat(activator, "<span class='notice'>This talisman will now serve as a key to the \"[network]\" Path.</span>")
@@ -2260,6 +2267,10 @@ var/list/bloodcult_exitportals = list()
to_chat(activator, "<span class='warning'>You have the ingredients, now there needs to be a ghost made visible standing above the rune.</span>")
qdel(src)
return
if (ghost.mind && ghost.mind.current && ghost.mind.current.ajourn && (ghost.mind.current.stat != DEAD))
to_chat(activator, "<span class='warning'>This ghost still has a breathing body where to return to.</span>")
qdel(src)
return
if (ghost.invisibility != 0)
to_chat(activator, "<span class='warning'>You have the ingredients, but the ghost needs to be drawn onto our plane first. You already have the tools to do so.</span>")
qdel(src)
@@ -2357,6 +2368,27 @@ var/list/bloodcult_exitportals = list()
vessel.real_name = ghost.real_name
vessel.ckey = ghost.ckey
qdel(husk)
vessel.r_hair = 90
vessel.g_hair = 90
vessel.b_hair = 90
vessel.r_facial = 90
vessel.g_facial = 90
vessel.b_facial = 90
vessel.r_eyes = 255
vessel.g_eyes = 0
vessel.b_eyes = 0
vessel.status_flags &= ~GODMODE
vessel.regenerate_icons()
//Let's not forget to make them cultists as well
var/datum/role/cultist/newCultist = new
newCultist.AssignToRole(vessel.mind,1)
var/datum/faction/bloodcult/cult = find_active_faction_by_type(/datum/faction/bloodcult)
if (!cult)
cult = ticker.mode.CreateFaction(/datum/faction/bloodcult, null, 1)
cult.HandleRecruitedRole(newCultist)
newCultist.OnPostSetup()
newCultist.Greet(GREET_RESURRECT)
else
for(var/mob/living/L in contributors)
to_chat(activator, "<span class='warning'>Something went wrong with the ritual, the soul of the ghost appears to have vanished.</span>")

View File

@@ -7,7 +7,7 @@
//SPELL I
/spell/cult/trace_rune
name = "Trace Rune"
desc = "Use available blood to write down words. Three words form a rune."
desc = "(1 BLOOD) Use available blood to write down words. Three words form a rune."
hud_state = "cult_word"
invocation_type = SpI_NONE
@@ -37,6 +37,9 @@
else
spell = null//so we're not stuck trying to write the same spell over and over again
if (user.checkTattoo(TATTOO_FAST))
cast_delay = 6
var/mob/living/carbon/C = user
var/muted = C.muted()
if (muted)
@@ -49,7 +52,7 @@
return 0
block = 1
var/tome = 0
var/tome = ""
if(!istype(user.loc, /turf))
to_chat(user, "<span class='warning'>You do not have enough space to write a proper rune.</span>")
@@ -57,10 +60,17 @@
var/obj/item/weapon/tome/A = null
A = user.get_active_hand()
tome = (istype(A) && A.state == TOME_OPEN)
if (user.checkTattoo(TATTOO_MEMORIZE))
tome = "Knowledge"
if (!tome)
A = user.get_inactive_hand()
tome = (istype(A) && A.state == TOME_OPEN)
if (!tome)
A = user.get_inactive_hand()
tome = (istype(A) && A.state == TOME_OPEN)
if (tome)
tome = "Tome"
var/turf/T = get_turf(user)
rune = locate() in T
@@ -88,7 +98,7 @@
available_runes.Add("\Roman[i]-[initial(instance.name)]")
available_runes["\Roman[i]-[initial(instance.name)]"] = instance
i++
var/spell_name = input(user,"Draw a rune with the help of the Arcane Tome.", "Trace Complete Rune", null) as null|anything in available_runes
var/spell_name = input(user,"Draw a rune with the help of the Arcane [tome].", "Trace Complete Rune", null) as null|anything in available_runes
spell = available_runes[spell_name]
var/datum/cultword/instance
@@ -130,8 +140,11 @@
"<span class='warning'>You hear some chanting.</span>")
var/datum/cultword/r_word = cultwords[word]
user.whisper("...[r_word.rune]...")
if (user.checkTattoo(TATTOO_SILENT))
return ..()
user.whisper("...[r_word.rune]...")
return ..()
/spell/cult/trace_rune/cast(var/list/targets, var/mob/living/carbon/user)
@@ -175,3 +188,54 @@
to_chat(user, "<span class='notice'>You retrace your steps, carefully undoing the lines of the [removed_word] rune.</span>")
else
to_chat(user, "<span class='warning'>There aren't any rune words left to erase.</span>")
//SPELL III
/spell/cult/blood_dagger
name = "Blood Dagger"
desc = "(5 BLOOD) Solidify some blood into a sharp weapon. Slash at your enemies to steal their blood. Use the dagger to re-absorb the stolen blood."
hud_state = "cult_blooddagger"
invocation_type = SpI_NONE
charge_type = Sp_RECHARGE
charge_max = 10//don't want people going full dio over knocked down bleeding players, stealing and absorbing their blood.
range = 0
spell_flags = null
insufficient_holder_msg = ""
still_recharging_msg = ""
cast_delay = 0
/spell/cult/blood_dagger/choose_targets(var/mob/user = usr)
return list(user)
/spell/cult/blood_dagger/cast(var/list/targets, var/mob/living/carbon/user)
..()
var/mob/living/carbon/human/H = user
var/list/data = use_available_blood(user, 5)
if (data[BLOODCOST_RESULT] == BLOODCOST_FAILURE)
return 0
var/dagger_color = DEFAULT_BLOOD
var/datum/reagent/blood/source = data["blood"]
if (source.data["blood_colour"])
dagger_color = source.data["blood_colour"]
var/good_hand
if(H.can_use_hand(H.active_hand))
good_hand = H.active_hand
else
for(var/i = 1 to H.held_items.len)
if(H.can_use_hand(i))
good_hand = i
break
if(good_hand)
H.drop_item(H.held_items[good_hand], force_drop = 1)
var/obj/item/weapon/melee/blood_dagger/BD = new (H)
BD.originator = user
if (dagger_color != DEFAULT_BLOOD)
BD.icon_state += "-color"
BD.item_state += "-color"
BD.color = dagger_color
H.put_in_hand(good_hand, BD)
H.visible_message("<span class='warning'>\The [user] squeezes the blood in their hand, and it takes the shape of a dagger!</span>",
"<span class='warning'>You squeeze the blood in your hand, and it takes the shape of a dagger.</span>")
playsound(H, 'sound/weapons/bloodyslice.ogg', 30, 0,-2)

View File

@@ -0,0 +1,127 @@
/datum/cult_tattoo
var/name = "cult tattoo"
var/desc = ""
var/tier = 0//1, 2 or 3
var/icon_state = ""
var/mob/bearer = null
var/blood_cost = 0
/datum/cult_tattoo/proc/getTattoo(var/mob/M)
bearer = M
/mob/proc/checkTattoo(var/tattoo_name)
if (!tattoo_name)
return
if (!iscultist(src))
return
var/datum/role/cultist/C = mind.GetRole(CULTIST)
for (var/tattoo in C.tattoos)
var/datum/cult_tattoo/CT = C.tattoos[tattoo]
if (CT.name == tattoo_name)
return CT
return null
///////////////////////////
// //
// TIER 1 //
// //
///////////////////////////
var/list/blood_communion = list()
/datum/cult_tattoo/bloodpool
name = TATTOO_POOL
desc = "All blood costs reduced by 20%. Tributes are split with other bearers of this mark."
icon_state = "bloodpool"
tier = 1
/datum/cult_tattoo/bloodpool/getTattoo(var/mob/M)
..()
if (iscultist(M))
blood_communion.Add(M.mind.GetRole(CULTIST))
/datum/cult_tattoo/silent
name = TATTOO_SILENT
desc = "Cast runes and talismans without having to mouth the invocation."
icon_state = "silent"
tier = 1
/datum/cult_tattoo/dagger
name = TATTOO_DAGGER
desc = "Materialize a sharp dagger in your hand for a small cost in blood. Use to retrieve."
icon_state = "dagger"
tier = 1
/datum/cult_tattoo/dagger/getTattoo(var/mob/M)
..()
if (M.mind && M.mind.GetRole(CULTIST))
M.add_spell(new /spell/cult/blood_dagger, "cult_spell_ready", /obj/abstract/screen/movable/spell_master/bloodcult)
///////////////////////////
// //
// TIER 2 //
// //
///////////////////////////
/datum/cult_tattoo/holy
name = TATTOO_HOLY
desc = "Holy water will now only slow you down a bit, and no longer prevent you from casting."
icon_state = "holy"
tier = 2
/datum/cult_tattoo/fast
name = TATTOO_FAST
desc = "Trace runes 60% faster."
icon_state = "fast"
tier = 2
/datum/cult_tattoo/chat
name = TATTOO_CHAT
desc = "Chat with the cult using :x."
icon_state = "chat"
tier = 2
///////////////////////////
// //
// TIER 3 //
// //
///////////////////////////
/datum/cult_tattoo/manifest
name = TATTOO_MANIFEST
desc = "Acquire a new, fully healed body that cannot feel pain."
icon_state = "manifest"
tier = 3
/datum/cult_tattoo/manifest/getTattoo(var/mob/M)
..()
var/mob/living/carbon/human/H = bearer
if (!istype(H))
return
H.set_species("Manifested")
H.r_hair = 90
H.g_hair = 90
H.b_hair = 90
H.r_facial = 90
H.g_facial = 90
H.b_facial = 90
H.r_eyes = 255
H.g_eyes = 0
H.b_eyes = 0
H.revive(0)
H.status_flags &= ~GODMODE
H.regenerate_icons()
/datum/cult_tattoo/memorize
name = TATTOO_MEMORIZE
desc = "Trace complete runes without having to hold an open tome."
icon_state = "memorize"
tier = 3
/datum/cult_tattoo/shortcut
name = TATTOO_SHORTCUT
desc = "Place sigils on walls that allows cultists to jump right through."
icon_state = "shortcut"
tier = 3
blood_cost = 5

View File

@@ -97,14 +97,14 @@
/obj/item/clothing/head/helmet/space/legacy_cult
name = "cult helmet"
desc = "A space worthy helmet used by the followers of Nar-Sie"
icon_state = "cult_helmet"
icon_state = "culthelmet_old"
item_state = "cult_helmet"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0
/obj/item/clothing/suit/space/legacy_cult
name = "cult armor"
icon_state = "cult_armour"
icon_state = "cultarmor_old"
item_state = "cult_armour"
desc = "A bulky suit of armor bristling with spikes. It looks space proof."
w_class = W_CLASS_MEDIUM

View File

@@ -147,7 +147,7 @@
new_target = M
if(!new_target)
if (!silent)
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like this target's soul went far, far away.</span>")
to_chat(user, "<span class='warning'>\The [src] isn't reacting, looks like this target's soul went far, far away.</span>")
return
else if(!istype(new_target,/mob/dead/observer))
if (!silent)
@@ -199,12 +199,12 @@
if(istype(target, /obj/item/organ/external/head))
var/obj/item/organ/external/head/humanHead = target
if(!humanHead.organ_data)
to_chat(user, "<span class='rose'>The soul stone isn't reacting, looks like their brain was separated from their head.</span>")
to_chat(user, "<span class='rose'>\The [src] isn't reacting, looks like their brain was separated from their head.</span>")
return
var/mob/living/carbon/brain/humanBrainMob = humanHead.brainmob
if(!humanBrainMob.client)
if(!humanBrainMob.mind)
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like this target doesn't have much of a soul.</span>")
to_chat(user, "<span class='warning'>\The [src] isn't reacting, looks like this target doesn't have much of a soul.</span>")
return
else
var/mob/new_target = null
@@ -212,18 +212,18 @@
if(M.key == humanBrainMob.mind.key)
new_target = M
if(!new_target)
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like this target's soul went far, far away.</span>")
to_chat(user, "<span class='warning'>\The [src] isn't reacting, looks like this target's soul went far, far away.</span>")
return
else if(!istype(new_target,/mob/dead/observer))
to_chat(user, "<span class='warning'>The soul stone isn't reacting, looks like this target's soul already reincarnated.</span>")
to_chat(user, "<span class='warning'>\The [src] isn't reacting, looks like this target's soul already reincarnated.</span>")
return
else
to_chat(new_target, "<span class='danger'>You feel your soul getting sucked into the soulstone.</span>")
to_chat(user, "<span class='rose'>The soul stone reacts to the corpse and starts glowing.</span>")
to_chat(new_target, "<span class='danger'>You feel your soul getting sucked into \the [src].</span>")
to_chat(user, "<span class='rose'>\The [src] reacts to the corpse and starts glowing.</span>")
capture_soul_process(user,new_target.client,humanHead,humanHead.origin_body)
else
to_chat(humanBrainMob, "<span class='danger'>You feel your soul getting sucked into the soul stone.</span>")
to_chat(user, "<span class='rose'>The soul stone reacts to the corpse and starts glowing.</span>")
to_chat(humanBrainMob, "<span class='danger'>You feel your soul getting sucked into \the [src].</span>")
to_chat(user, "<span class='rose'>\The [src] reacts to the corpse and starts glowing.</span>")
capture_soul_process(user,humanBrainMob.client,humanHead,humanHead.origin_body)
@@ -243,7 +243,7 @@
else if(istype(add_target,/mob/living/carbon/human))
body = add_target
var/true_name = "Unknown"
var/true_name = "a nobody"
if(body)
true_name = body.real_name
@@ -287,12 +287,23 @@
//Scary sound
playsound(get_turf(src), get_sfx("soulstone"), 50,1)
//Are we capturing a cult-banned player as a cultist? Sucks for them!
if (iscultist(user) && jobban_isbanned(body, ROLE_CULTIST))
to_chat(body, "<span class='danger'>A cultist tried to capture your soul, but due to past behaviour you have been banned from the role. Your body will instead dust away.</span>")
to_chat(user, "<span class='notice'>Their soul wasn't fit for our cult, and wasn't accepted by \the [src].</span>")
//Cleaning up the corpse
qdel(target)
if(add_target)
qdel(add_target)
return
//Creating a shade inside the stone and putting the victim in control
var/mob/living/simple_animal/shade/shadeMob = new(src)//put shade in stone
shadeMob.status_flags |= GODMODE //So they won't die inside the stone somehow
shadeMob.canmove = 0//Can't move out of the soul stone
shadeMob.name = "Shade of [true_name]"
shadeMob.real_name = "Shade of [true_name]"
shadeMob.real_name = "[true_name]"
shadeMob.ckey = targetClient.ckey
shadeMob.cancel_camera()
@@ -301,7 +312,7 @@
icon_state = "soulstone2"
item_state = "shard-soulstone2"
name = "Soul Stone: [true_name]"
else
else if (istype(src, /obj/item/weapon/melee/soulblade))
shadeMob.give_blade_powers()
dir = NORTH
update_icon()
@@ -309,6 +320,17 @@
to_chat(shadeMob, "Your soul has been captured! You are now bound to [user.name]'s will, help them suceed in their goals at all costs.")
to_chat(user, "<span class='notice'>[true_name]'s soul has been ripped from their body and stored within the soul stone.</span>")
//Is our user a cultist? Then you're a cultist too now!
if (iscultist(user))
var/datum/role/cultist/newCultist = new
newCultist.AssignToRole(user.mind,1)
var/datum/faction/bloodcult/cult = find_active_faction_by_type(/datum/faction/bloodcult)
if (!cult)
cult = ticker.mode.CreateFaction(/datum/faction/bloodcult, null, 1)
cult.HandleRecruitedRole(newCultist)
newCultist.OnPostSetup()
newCultist.Greet(GREET_SOULSTONE)
//Pretty particles
var/turf/T1 = get_turf(target)
var/turf/T2 = null
@@ -345,23 +367,37 @@
if("SHADE")
var/mob/living/simple_animal/shade/T = target
var/obj/item/device/soulstone/C = src
if (T.stat == DEAD)
to_chat(U, "<span class='danger'>Capture failed!: </span>The shade has already been banished!")
else
if(C.contents.len)
to_chat(U, "<span class='danger'>Capture failed!: </span>The soul stone is full! Use or free an existing soul to make room.")
if(src.contents.len)
to_chat(U, "<span class='danger'>Capture failed!: </span>\The [src] is full! Use or free an existing soul to make room.")
else
T.forceMove(C) //put shade in stone
T.forceMove(src) //put shade in stone
T.status_flags |= GODMODE
T.canmove = 0
T.health = T.maxHealth
C.icon_state = "soulstone2"
C.item_state = "shard-soulstone2"
if (istype(src, /obj/item/device/soulstone))
icon_state = "soulstone2"
item_state = "shard-soulstone2"
name = "Soul Stone: [T.real_name]"
else if (istype(src, /obj/item/weapon/melee/soulblade))
T.give_blade_powers()
dir = NORTH
update_icon()
U.update_inv_hands()
C.name = "Soul Stone: [T.real_name]"
to_chat(T, "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form")
to_chat(U, "<span class='notice'><b>Capture successful!</b>: </span>[T.name]'s has been recaptured and stored within the soul stone.")
if (iscultist(U) && !iscultist(T))
var/datum/role/cultist/newCultist = new
newCultist.AssignToRole(U.mind,1)
var/datum/faction/bloodcult/cult = find_active_faction_by_type(/datum/faction/bloodcult)
if (!cult)
cult = ticker.mode.CreateFaction(/datum/faction/bloodcult, null, 1)
cult.HandleRecruitedRole(newCultist)
newCultist.OnPostSetup()
newCultist.Greet(GREET_SOULSTONE)
if("CONSTRUCT")
var/obj/structure/constructshell/T = target
var/obj/item/device/soulstone/C = src

View File

@@ -4,6 +4,8 @@
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Head of Personnel", "Internal Affairs Agent")
logo_state = "cult-logo"
greets = list(GREET_DEFAULT,GREET_CUSTOM,GREET_ROUNDSTART,GREET_ADMINTOGGLE)
var/list/tattoos = list()
var/holywarning_cooldown = 0
/datum/role/cultist/New(var/datum/mind/M, var/datum/faction/fac=null, var/new_id)
..()
@@ -14,8 +16,10 @@
if(!.)
return
update_cult_hud()
antag.current.add_language(LANGUAGE_CULT)
if(!(locate(/spell/cult) in antag.current.spell_list))
if(ishuman(antag.current) && !(locate(/spell/cult) in antag.current.spell_list))
antag.current.add_spell(new /spell/cult/trace_rune, "cult_spell_ready", /obj/abstract/screen/movable/spell_master/bloodcult)
antag.current.add_spell(new /spell/cult/erase_rune, "cult_spell_ready", /obj/abstract/screen/movable/spell_master/bloodcult)
@@ -23,8 +27,14 @@
antag.current.remove_language(LANGUAGE_CULT)
for(var/spell/cult/spell_to_remove in antag.current.spell_list)
antag.current.remove_spell(spell_to_remove)
if (src in blood_communion)
blood_communion.Remove(src)
..()
/datum/role/cultist/process()
if (holywarning_cooldown > 0)
holywarning_cooldown--
/datum/role/cultist/Greet(var/greeting,var/custom)
if(!greeting)
return
@@ -50,6 +60,10 @@
to_chat(antag.current, "<span class='sinister'>The Cult of Nar-Sie now counts you as its newest member. Your fellow cultists will guide you. You remember the last three words that Nar-Sie spoke to you: <span class='danger'>See Blood Hell</span></span>")
if (GREET_PAMPHLET)
to_chat(antag.current, "<span class='sinister'>Wow, that pamphlet was very convincing, in fact you're like totally a cultist now, hail Nar-Sie!</span>")//remember, debug item
if (GREET_SOULSTONE)
to_chat(antag.current, "<span class='sinister'>Dark energies corrupt your soul, as the blood stone grants you a window to peer through the veil, you have become a cultist!</span>")
if (GREET_RESURRECT)
to_chat(antag.current, "<span class='sinister'>You were resurrected from beyond the veil by the followers of Nar-Sie, and are already familiar with their rituals! You have now joined their ranks as a cultist.</span>")
else
if (faction && faction.ID == BLOODCULT)
to_chat(antag.current, "<img src='data:image/png;base64,[icon2base64(logo)]' style='position: relative; top: 10;'/> <span class='sinister'>You are cultist, from the cult of Nar-Sie, the Geometer of Blood.</span>")
@@ -59,10 +73,72 @@
to_chat(antag.current, "<span class='info'><a HREF='?src=\ref[antag.current];getwiki=[wikiroute]'>(Wiki Guide)</a></span>")
to_chat(antag.current, "<span class='sinister'>You find yourself to be well-versed in the runic alphabet of the cult.</span>")
/datum/role/cultist/update_antag_hud()
update_cult_hud()
/datum/role/cultist/proc/update_cult_hud()
var/mob/M = antag.current
if(M && M.client && M.hud_used)
if(!M.hud_used.cult_Act_display)
M.hud_used.cult_hud()
if (!(M.hud_used.cult_Act_display in M.client.screen))
M.client.screen += list(M.hud_used.cult_Act_display,M.hud_used.cult_tattoo_display)
M.hud_used.cult_Act_display.overlays.len = 0
M.hud_used.cult_tattoo_display.overlays.len = 0
var/current_act = max(-1,min(5,veil_thickness))
var/image/I_act = image('icons/mob/screen1_cult.dmi',"act")
I_act.appearance_flags |= RESET_COLOR
M.hud_used.cult_Act_display.overlays += I_act
var/image/I_tattoos = image('icons/mob/screen1_cult.dmi',"tattoos")
I_tattoos.appearance_flags |= RESET_COLOR
M.hud_used.cult_tattoo_display.overlays += I_tattoos
var/image/I_act_indicator = image('icons/mob/screen1_cult.dmi',"[current_act]")
if (current_act == CULT_MENDED)
I_act_indicator.appearance_flags |= RESET_COLOR
M.hud_used.cult_Act_display.overlays += I_act_indicator
var/image/I_arrow = image('icons/mob/screen1_cult.dmi',"[current_act]a")
I_arrow.appearance_flags |= RESET_COLOR
M.hud_used.cult_Act_display.overlays += I_arrow
switch (current_act)
if (CULT_MENDED)
M.hud_used.cult_Act_display.name = "..."
if (CULT_PROLOGUE)
M.hud_used.cult_Act_display.name = "Prologue: The Reunion"
if (CULT_ACT_I)
M.hud_used.cult_Act_display.name = "Act I: The Followers"
if (CULT_ACT_II)
M.hud_used.cult_Act_display.name = "Act II: The Sacrifice"
if (CULT_ACT_III)
M.hud_used.cult_Act_display.name = "Act III: The Blood Bath"
if (CULT_ACT_IV)
M.hud_used.cult_Act_display.name = "Act IV: The Tear in Reality"
if (CULT_EPILOGUE)
M.hud_used.cult_Act_display.name = "Epilogue: The Feast"
var/tattoos_names = ""
var/i = 0
for (var/T in tattoos)
var/datum/cult_tattoo/tattoo = tattoos[T]
if (tattoo)
M.hud_used.cult_tattoo_display.overlays += image('icons/mob/screen1_cult.dmi',"t_[tattoo.icon_state]")
tattoos_names += "[i ? ", " : ""][tattoo.name]"
i++
if (!tattoos_names)
tattoos_names = "none"
M.hud_used.cult_tattoo_display.name = "Arcane Tattoos: [tattoos_names]"
if (isshade(M) && M.gui_icons && istype(M.loc,/obj/item/weapon/melee/soulblade))
M.client.screen += list(
M.gui_icons.soulblade_bgLEFT,
M.gui_icons.soulblade_coverLEFT,
M.gui_icons.soulblade_bloodbar,
M.fire,
)
/mob/living/carbon/proc/muted()
if (checkTattoo(TATTOO_HOLY))
return 0
return (iscultist(src) && reagents && reagents.has_reagent(HOLYWATER))
/datum/role/cultist/AdminPanelEntry(var/show_logo = FALSE,var/datum/admins/A)

View File

@@ -208,6 +208,9 @@
/datum/role/proc/OnPostSetup()
return 1
/datum/role/proc/update_antag_hud()
return
/datum/role/proc/process()
return

View File

@@ -389,9 +389,12 @@
-- Helpers --
*/
/datum/role/vampire/update_antag_hud()
update_vamp_hud()
/datum/role/vampire/proc/update_vamp_hud()
var/mob/M = antag.current
if(M.hud_used)
if(M && M.client && M.hud_used)
if(!M.hud_used.vampire_blood_display)
M.hud_used.vampire_hud()
//hud_used.human_hud(hud_used.ui_style)

View File

@@ -1281,6 +1281,7 @@ var/list/datum/dna/hivemind_bank = list()
for(var/i = 1 to held_items.len)
if(H.can_use_hand(i))
good_hand = i
break
if(good_hand)
drop_item(held_items[good_hand], force_drop = 1)
var/obj/item/weapon/armblade/A = new (src)

View File

@@ -1291,3 +1291,6 @@ var/global/list/image/blood_overlays = list()
usr.u_equip(src, TRUE)
usr.put_in_hand(OI.hand_index, src)
add_fingerprint(usr)
/obj/item/proc/pre_throw()
return

View File

@@ -58,6 +58,8 @@
new girder_type(src)
for(var/obj/O in src.contents) //Eject contents!
if(istype(O,/obj/effect/cult_shortcut))
qdel(O)
if(istype(O,/obj/structure/sign/poster))
var/obj/structure/sign/poster/P = O
P.roll_and_drop(src)
@@ -130,6 +132,17 @@
if(rotting)
return src.attack_rotting(user) //Stop there, we aren't slamming our hands on a dirty rotten wall
if (iscultist(user) && !(locate(/obj/effect/cult_shortcut) in src))
var/datum/cult_tattoo/CT = user.checkTattoo(TATTOO_SHORTCUT)
if (CT)
var/data = use_available_blood(user, CT.blood_cost)
if (data[BLOODCOST_RESULT] != BLOODCOST_FAILURE)
if(do_after(user, src, 30))
new /obj/effect/cult_shortcut(src)
user.visible_message("<span class='warning'>[user] has painted a strange sigil on \the [src].</span>", \
"<span class='notice'>You finish drawing the sigil.</span>")
return
user.visible_message("<span class='notice'>[user] pushes \the [src].</span>", \
"<span class='notice'>You push \the [src] but nothing happens!</span>")
playsound(src, 'sound/weapons/Genhit.ogg', 25, 1)
@@ -339,6 +352,9 @@
/turf/simulated/wall/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0, var/allow = 1)
remove_rot()
for(var/obj/effect/E in src)
if(E.name == "sigil")
qdel(E)
..()
/turf/simulated/wall/cultify()

View File

@@ -203,10 +203,11 @@ var/global/floorIsLava = 0
<A href='?src=\ref[src];simplemake=larva;mob=\ref[M]'>Larva</A> \]
<br>\[ Slime: <A href='?src=\ref[src];simplemake=slime;mob=\ref[M]'>Baby</A>,
<A href='?src=\ref[src];simplemake=adultslime;mob=\ref[M]'>Adult</A> \]
<br>\[ Construct: <A href='?src=\ref[src];simplemake=constructarmoured;mob=\ref[M]'>Armoured</A>,
<A href='?src=\ref[src];simplemake=constructbuilder;mob=\ref[M]'>Builder</A>,
<br>\[ Construct: <A href='?src=\ref[src];simplemake=constructarmoured;mob=\ref[M]'>Juggernaut</A>,
<A href='?src=\ref[src];simplemake=constructbuilder;mob=\ref[M]'>Artificer</A>,
<A href='?src=\ref[src];simplemake=constructwraith;mob=\ref[M]'>Wraith</A>,
<A href='?src=\ref[src];simplemake=shade;mob=\ref[M]'>Shade</A> \]
<A href='?src=\ref[src];simplemake=shade;mob=\ref[M]'>Shade</A>,
<A href='?src=\ref[src];simplemake=soulblade;mob=\ref[M]'>Soul Blade</A> \]
<br>
"}

View File

@@ -543,6 +543,17 @@
new_mob = M.change_mob_type( /mob/living/simple_animal/construct/wraith , null, null, delmob )
if("shade")
new_mob = M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob )
if("soulblade")
var/mob/living/simple_animal/shade/new_shade = M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob )
var/obj/item/weapon/melee/soulblade/blade = new(get_turf(M))
blade.blood = blade.maxblood
new_shade.forceMove(blade)
blade.update_icon()
new_shade.status_flags |= GODMODE
new_shade.canmove = 0
new_shade.name = "Shade of [M.real_name]"
new_shade.real_name = "Shade of [M.real_name]"
new_shade.give_blade_powers()
if("blob")
var/obj/effect/blob/core/core = new(loc = get_turf(M), new_overmind = M.client)
new_mob = core.overmind

View File

@@ -22,6 +22,7 @@
var/area = null
var/time_died_as_mouse = null //when the client last died as a mouse
var/datum/tooltip/tooltips //datum that controls the displaying and hiding of tooltips
var/list/radial_menus = list()//keeping track of open menus so we're not gonna have several on top of each others.
///////////////
//SOUND STUFF//

View File

@@ -5,7 +5,7 @@
return
/mob/dead/cultify()
if(icon_state != "ghost-narsie")
if(invisibility != 0 || icon_state != "ghost-narsie")
icon = 'icons/mob/mob.dmi'
icon_state = "ghost-narsie"
overlays = 0
@@ -31,7 +31,7 @@
overlays += H.obj_overlays[HEAD_LAYER]
overlays += H.obj_overlays[HANDCUFF_LAYER]
invisibility = 0
to_chat(src, "<span class='sinister'>Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.</span>")
//to_chat(src, "<span class='sinister'>Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.</span>")
flick("rune_seer",src)
/mob/dead/update_canmove()

View File

@@ -127,19 +127,9 @@
return isAdminGhost(src) ? get_all_accesses() : list()
/mob/dead/attackby(obj/item/W, mob/user)
// Legacy Cult stuff
// Legacy Cult stuff
if(istype(W,/obj/item/weapon/tome_legacy))
var/mob/dead/M = src
if(src.invisibility != 0)
M.invisibility = 0
if(istype(W,/obj/item/weapon/tome))
if(invisibility != 0 || icon_state != "ghost-narsie")
cultify()
user.visible_message(
"<span class='warning'>[user] drags a ghost to our plane of reality!</span>",
"<span class='warning'>You drag a ghost to our plane of reality!</span>"
)
return
cultify()//takes care of making ghosts visible
// Big boy modern Cult 3.0 stuff
if (iscultist(user))
if(istype(W,/obj/item/weapon/tome))

View File

@@ -1,5 +1,8 @@
//Refer to life.dm for caller
/mob/living/carbon/human/feels_pain()
return species.feels_pain
/mob/living/carbon/human/handle_shock()
..()
if(status_flags & GODMODE || !feels_pain())

View File

@@ -405,6 +405,17 @@ var/global/list/damage_icon_parts = list()
O.underlays -= "fire[fat]_s"
O.underlays += "coldfire[fat]_s"
//Cultist tattoos
if (mind && mind.GetRole(CULTIST))
var/datum/role/cultist/C = mind.GetRole(CULTIST)
add_image = 1
for (var/T in C.tattoos)
var/datum/cult_tattoo/tattoo = C.tattoos[T]
if (tattoo)
var/image/I = image(icon = 'icons/mob/cult_tattoos.dmi', icon_state = tattoo.icon_state)
I.blend_mode = BLEND_MULTIPLY
O.overlays += I
if(add_image)
O.icon = standing
O.icon_state = standing.icon_state
@@ -828,8 +839,8 @@ var/global/list/damage_icon_parts = list()
if(s_store.dynamic_overlay["[SUIT_STORE_LAYER]"])
var/image/dyn_overlay = s_store.dynamic_overlay["[SUIT_STORE_LAYER]"]
O.overlays += dyn_overlay
O.pixel_x = species.inventory_offsets["[slot_s_store]"]["pixel_x"] * PIXEL_MULTIPLIER
O.pixel_y = species.inventory_offsets["[slot_s_store]"]["pixel_y"] * PIXEL_MULTIPLIER
O.pixel_x = (species.inventory_offsets["[slot_s_store]"]["pixel_x"] - initial(s_store.pixel_x)) * PIXEL_MULTIPLIER
O.pixel_y = (species.inventory_offsets["[slot_s_store]"]["pixel_y"] - initial(s_store.pixel_y)) * PIXEL_MULTIPLIER
obj_to_plane_overlay(O,SUIT_STORE_LAYER)
//overlays_standing[SUIT_STORE_LAYER] = image("icon" = 'icons/mob/belt_mirror.dmi', "icon_state" = "[t_state]")
s_store.screen_loc = ui_sstore1 //TODO

View File

@@ -144,6 +144,7 @@ var/global/list/whitelisted_species = list("Human")
var/species_intro //What intro you're given when you become this species.
var/feels_pain = 1
/datum/species/New()
..()
@@ -303,6 +304,7 @@ var/global/list/whitelisted_species = list("Human")
deform = 'icons/mob/human_races/r_def_manifested.dmi'
known_languages = list(LANGUAGE_HUMAN)
primitive = /mob/living/carbon/monkey
feels_pain = 0
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
@@ -312,6 +314,7 @@ var/global/list/whitelisted_species = list("Human")
"appendix" = /datum/organ/internal/appendix,
"eyes" = /datum/organ/internal/eyes
)
anatomy_flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT | NO_BLOOD
/datum/species/manifested/handle_death(var/mob/living/carbon/human/H)

View File

@@ -1663,6 +1663,8 @@ Thanks.
to_chat(usr, "<span class='warning'>It's stuck to your hand!</span>")
return FAILED_THROW
I.pre_throw()
remove_from_mob(item)
//actually throw it!

View File

@@ -10,6 +10,9 @@
remove_ventcrawl()
add_ventcrawl(loc)
if(iscultist(src) && hud_used && !hud_used.cult_Act_display)
hud_used.cult_hud()
//Round specific stuff like hud updates
if(ticker && ticker.mode)
switch(ticker.mode.name)

View File

@@ -413,17 +413,23 @@ var/list/department_radio_keys = list(
/mob/living/construct_chat_check(var/setting = 0) //setting: 0 is to speak over general into cultchat, 1 is to speak over channel into cultchat, 2 is to hear cultchat
if(!mind)
return
if(setting == 0) //overridden for constructs
return
var/datum/faction/cult = find_active_faction_by_member(mind.GetRole(LEGACY_CULT))
if(!cult)
return
if(setting == 1)
if(universal_cult_chat == 1)
if (iscultist(src))
if(setting == 1)
if (checkTattoo(TATTOO_CHAT))
return 1
if(setting == 2)
return 1
var/datum/faction/cult = find_active_faction_by_member(mind.GetRole(LEGACY_CULT))
if(cult)
if(setting == 1)
if(universal_cult_chat == 1)
return 1
if(setting == 2)
return 1
if(setting == 2)
return 1
/mob/living/say_quote()
if (stuttering)

View File

@@ -45,7 +45,9 @@
/mob/living/simple_animal/construct/construct_chat_check(setting)
if(!mind)
return
if(find_active_faction_by_member(mind.GetRole(BLOODCULT)))
if(find_active_faction_by_member(mind.GetRole(CULTIST)))
return 1
if(find_active_faction_by_member(mind.GetRole(LEGACY_CULTIST)))
return 1
/mob/living/simple_animal/construct/handle_inherent_channels(var/datum/speech/speech, var/message_mode)

View File

@@ -34,6 +34,13 @@
/mob/living/simple_animal/shade/Login()
..()
hud_used.shade_hud()
if (istype(loc, /obj/item/weapon/melee/soulblade))
client.CAN_MOVE_DIAGONALLY = 1
client.screen += list(
gui_icons.soulblade_bgLEFT,
gui_icons.soulblade_coverLEFT,
gui_icons.soulblade_bloodbar,
)
/mob/living/simple_animal/shade/say(var/message)
. = ..(message, "C")
@@ -93,14 +100,10 @@
purge = 3
adjustBruteLoss(damage)
O.on_attack(src, user)
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("<span class='warning'> <B>[src] has been attacked with [O] by [user].</span></B>")
visible_message("<span class='warning'> <B>[src] has been attacked with [O] by [user].</span></B>")
else
to_chat(usr, "<span class='warning'> This weapon is ineffective, it does no damage.</span>")
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("<span class='warning'> [user] gently taps [src] with [O].</span>")
visible_message("<span class='warning'> [user] gently taps [src] with [O].</span>")
return
/mob/living/simple_animal/shade/shuttle_act()
@@ -125,7 +128,7 @@
/mob/living/simple_animal/shade/regular_hud_updates()
update_pull_icon() //why is this here?
if(istype(loc, /obj/item/weapon/melee/soulblade) && hud_used)
if(istype(loc, /obj/item/weapon/melee/soulblade) && hud_used && gui_icons && gui_icons.soulblade_bloodbar)
var/obj/item/weapon/melee/soulblade/SB = loc
if(fire)
switch(SB.health)
@@ -148,7 +151,7 @@
else
purged.icon_state = "purge0"
if(client)
if(client && hud_used && healths)
switch(health)
if(50 to INFINITY)
healths.icon_state = "shade_health0"

View File

@@ -1,3 +1,10 @@
// SPELLS THAT SHADES GET IN SOUL BLADES ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Giving the spells
/mob/living/simple_animal/shade/proc/give_blade_powers()
if (!istype(loc, /obj/item/weapon/melee/soulblade))
return
@@ -7,6 +14,7 @@
gui_icons.soulblade_bgLEFT,
gui_icons.soulblade_coverLEFT,
gui_icons.soulblade_bloodbar,
fire,
)
var/obj/item/weapon/melee/soulblade/SB = loc
var/datum/control/new_control = new /datum/control/soulblade(src, SB)
@@ -18,19 +26,29 @@
add_spell(new /spell/soulblade/blade_mend, "cult_spell_ready", /obj/abstract/screen/movable/spell_master/bloodcult)
add_spell(new /spell/soulblade/blade_boil, "cult_spell_ready", /obj/abstract/screen/movable/spell_master/bloodcult)
var/datum/role/cultist/C = mind.GetRole(CULTIST)
if (C)
C.logo_state = "shade-blade"
/mob/living/simple_animal/shade/proc/remove_blade_powers()//this should always fire when the shade gets removed from the blade, such as when it gets destroyed
//Removing the spells, this should always fire when the shade gets removed from the blade, such as when it gets destroyed
/mob/living/simple_animal/shade/proc/remove_blade_powers()
if (client)
client.CAN_MOVE_DIAGONALLY = 0
client.screen -= list(
gui_icons.soulblade_bgLEFT,
gui_icons.soulblade_coverLEFT,
gui_icons.soulblade_bloodbar,
fire,
)
if (hud_used && gui_icons && gui_icons.soulblade_coverLEFT)
hud_used.mymob.gui_icons.soulblade_coverLEFT.maptext = ""
for(var/spell/soulblade/spell_to_remove in spell_list)
remove_spell(spell_to_remove)
var/datum/role/cultist/C = mind.GetRole(CULTIST)
if (C)
C.logo_state = "cult-logo"
/spell/soulblade
panel = "Cult"
override_base = "cult"
@@ -56,6 +74,13 @@
shade.hud_used.mymob.gui_icons.soulblade_bloodbar.screen_loc = "WEST,CENTER-[8-round(total_offset/WORLD_ICON_SIZE)]:[total_offset%WORLD_ICON_SIZE]"
shade.hud_used.mymob.gui_icons.soulblade_coverLEFT.maptext = "[SB.blood]"
/////////////////////////////
// //
// SELF TELEKINESIS ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
//////////////////////////////Not a real spell, but informs the player that moving consums blood.
/spell/soulblade/blade_kinesis
name = "Self Telekinesis"
desc = "(1 BLOOD) Move yourself without the need of being held."
@@ -71,6 +96,12 @@
cast_delay = 0
//////////////////////////////Basic attack
// //Can be used by clicking anywhere on the screen for convenience
// SPIN SLASH ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //Attackes EVERY (almost) atoms on your turf, and the one in the direction you're facing.
//////////////////////////////That means unexpected behaviours are likely, for instance you can open doors, harvest meat off dead animals, or break important stuff
/spell/soulblade/blade_spin
name = "Spin Slash"
desc = "(5 BLOOD) Stop your momentum and cut in front of you."
@@ -143,10 +174,20 @@
if (istype(SB.loc,/obj/item/projectile))
var/obj/item/projectile/P = SB.loc
qdel(P)
var/obj/structure/cult/altar/altar = locate() in targets
if (altar)
altar.attackby(SB,user)
return//gotta make sure we're not gonna bug ourselves out of the altar if there's one by hitting a table or something.
flick("soulblade-spin",SB)
for (var/atom/A in targets)
A.attackby(SB,user)
//////////////////////////////Puts the blade inside a bullet that shoots forward.
// //Can be used by drag n dropping from turf A to turf B. Will cause the bullet to fire first toward A then change direction toward B
// PERFORATE ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //You need to hit at least two living mobs to make up for the cost of using this spell
//////////////////////////////The blade moves much faster from A to B than from starting to A
/spell/soulblade/blade_perforate
name = "Perforate"
desc = "(20 BLOOD) Hurl yourself through the air."
@@ -210,182 +251,12 @@
if (BP)
BP.perform(mob,0,list(src_location,over_location))
/obj/item/projectile/soulbullet
name = "soul blade"
icon = 'icons/obj/cult_64x64.dmi'
icon_state = "soulbullet"
pixel_x = -16 * PIXEL_MULTIPLIER
pixel_y = -10 * PIXEL_MULTIPLIER
damage = 30//Only affects obj/turf. Mobs take a regular hit from the sword.
phase_type = PROJREACT_MOBS
penetration = -1
fire_sound = null
mouse_opacity = 1
var/turf/secondary_target = null
var/obj/item/weapon/melee/soulblade/blade = null
var/mob/living/simple_animal/shade/shade = null
var/redirected = 0
var/leave_shadows = -1
var/matrix/shadow_matrix = null
/obj/item/projectile/soulbullet/Destroy()
var/turf/T = get_turf(src)
if (T)
if (blade)
blade.forceMove(T)
blade = null
shade = null
..()
/obj/item/projectile/soulbullet/OnFired(var/proj_target = original)
target = get_turf(proj_target)
if (!secondary_target)
secondary_target = target
if (!shade)
icon_state = "soulbullet-empty"
dist_x = abs(target.x - starting.x)
dist_y = abs(target.y - starting.y)
override_starting_X = starting.x
override_starting_Y = starting.y
override_target_X = target.x
override_target_Y = target.y
if (target.x > starting.x)
dx = EAST
else
dx = WEST
if (target.y > starting.y)
dy = NORTH
else
dy = SOUTH
if(dist_x > dist_y)
error = dist_x/2 - dist_y
else
error = dist_y/2 - dist_x
if (target!=secondary_target)
target_angle = round(Get_Angle(target,secondary_target))
blade.dir = get_dir(target,secondary_target)
else
target_angle = round(Get_Angle(starting,target))
blade.dir = get_dir(starting,target)
shadow_matrix = turn(matrix(),target_angle+45)
transform = shadow_matrix
//var/matrix/base_matrix = turn(matrix(),target_angle)
//var/image/I = image('icons/obj/cult_64x64.dmi',"[icon_state]_spin")
//I.transform = base_matrix
if (shade)
icon_state = "soulbullet_spin"
plane = HUD_PLANE
layer = ABOVE_HUD_LAYER
else
icon_state = "soulbullet-empty_spin"
spawn(5)
leave_shadows = 0
/*
if( !("[icon_state]_angle[target_angle]" in bullet_master) )
var/image/I = new('icons/obj/cult_64x64.dmi',"[icon_state]")
//I.transform = base_matrix
bullet_master["[icon_state]_angle[target_angle]"] = I
src.icon = bullet_master["[icon_state]_angle[target_angle]"]
*/
if (shade)
icon_state = "soulbullet"
else
icon_state = "soulbullet-empty"
return 1
/obj/item/projectile/soulbullet/bresenham_step(var/distA, var/distB, var/dA, var/dB)
if (shade && leave_shadows >= 0)
leave_shadows++
if ((leave_shadows%3)==0)
anim(target = loc, a_icon = 'icons/obj/cult_64x64.dmi', flick_anim = "soulblade-shadow", lay = NARSIE_GLOW, offX = pixel_x, offY = pixel_y, plane = LIGHTING_PLANE, trans = shadow_matrix)
if(..())
return 2
else
return 0
/obj/item/projectile/soulbullet/to_bump(var/atom/A)
if (shade)
if (ismob(A))
var/mob/M = A
if (!iscultist(M))
A.attackby(blade,shade)
else if (!M.get_active_hand())//cultists can catch the blade on the fly
blade.forceMove(loc)
blade.attack_hand(M)
blade = null
qdel(src)
else
A.attackby(blade,shade)
else
if (ismob(A))
var/mob/M = A
if (!iscultist(M))
A.hitby(blade)
else
A.hitby(blade)
if(isliving(A))
forceMove(get_step(loc,dir))
bump_original_check()
else
..()
/obj/item/projectile/soulbullet/bump_original_check()
if (loc == target && !redirected)
redirect()
/obj/item/projectile/soulbullet/reset()
..()
secondary_target = target
/obj/item/projectile/soulbullet/proc/redirect()
redirected = 1
projectile_speed = 0.66
if (target == secondary_target)
return
starting = target
target = secondary_target
dist_x = abs(target.x - starting.x)
dist_y = abs(target.y - starting.y)
override_starting_X = starting.x
override_starting_Y = starting.y
override_target_X = target.x
override_target_Y = target.y
if (target.x > starting.x)
dx = EAST
else
dx = WEST
if (target.y > starting.y)
dy = NORTH
else
dy = SOUTH
if(dist_x > dist_y)
error = dist_x/2 - dist_y
else
error = dist_y/2 - dist_x
/obj/item/projectile/soulbullet/cultify()
return
/obj/item/projectile/soulbullet/Cross(var/atom/movable/mover, var/turf/target, var/height=1.5, var/air_group = 0)
if(istype(mover, /obj/item/projectile))
if (prob(30))//less likely to be hit when perforating
return 0
return ..()
/obj/item/projectile/soulbullet/attackby(var/obj/item/I, var/mob/user)
if (blade)
return blade.attackby(I,user)
/obj/item/projectile/soulbullet/hitby(var/atom/movable/AM)
if (blade)
return blade.hitby(AM)
/obj/item/projectile/soulbullet/bullet_act(var/obj/item/projectile/P)
if (blade)
return blade.bullet_act(P)
//////////////////////////////
// //Spend 10 blood -> Heal 10 brute damage on your wielder and clamp their bleeding wounds. Good trade, yes?
// MEND ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
//////////////////////////////
/spell/soulblade/blade_mend
name = "Mend"
@@ -408,7 +279,12 @@
var/obj/item/weapon/melee/soulblade/SB = user.loc
if (!ismob(SB.loc))
return null
return list(SB.loc)
var/mob/living/wielder = SB.loc
if (wielder.getBruteLoss())
return list(wielder)
else
to_chat(user,"<span class='notice'>Your wielder's wounds are already all closed up.</span>")
return null
/spell/soulblade/blade_mend/before_cast(var/list/targets, var/user)
return targets
@@ -422,14 +298,18 @@
if(temp.status & ORGAN_BLEEDING)
temp.clamp()
if (wielder.getBruteLoss())
wielder.heal_organ_damage(10, 0)
to_chat(user,"You heal some of your wielder's wounds.")
to_chat(wielder,"\The [user] heals some of your wounds.")
else
to_chat(user,"<span class='notice'>Your wielder's wounds are already all closed up.<//span>")
playsound(wielder.loc, 'sound/effects/mend.ogg', 50, 0, -2)
wielder.heal_organ_damage(10, 0)
to_chat(user,"You heal some of your wielder's wounds.")
to_chat(wielder,"\The [user] heals some of your wounds.")
//////////////////////////////
// //Click dat button if a guy you don't like is holding you (aka: a sec officer or a greyshit)
// BLADE BOIL ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //Doesn't actually damage as much as the original cult spell, unless you manage to use it more than once, in which case they're dumb
//////////////////////////////But if you get some idiot to grab you and use it twice, you'll get back to full blood, and they'll be most likely dead.
/spell/soulblade/blade_boil
name = "Blood Boil"
desc = "(FREE) Punish your wielder by using a taboo ritual that drains their blood and burns their flesh."//a much lesser version of the original ritual
@@ -465,6 +345,7 @@
..()
var/mob/living/wielder = pick(targets)
wielder.take_overall_damage(25,25)
playsound(wielder.loc, 'sound/effects/bloodboil.ogg', 50, 0, -1)
to_chat(wielder, "<span class='danger'>Your blood boils!</span>")
user.say("Dedo ol'btoh! Yu'gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!")//both blood boil and blood drain's old invocations
if (iscarbon(wielder))

View File

@@ -64,6 +64,8 @@
regular_hud_updates()
update_antag_huds()
update_action_buttons(TRUE)
if(round_end_info == "")

View File

@@ -250,6 +250,36 @@
client.screen -= zone_sel
zone_sel = null
if(iscultist(src) && hud_used)
if(hud_used.cult_Act_display)
returnToPool(hud_used.cult_Act_display)
if(client)
client.screen -= hud_used.cult_Act_display
hud_used.cult_Act_display = null
if(hud_used.cult_tattoo_display)
returnToPool(hud_used.cult_tattoo_display)
if(client)
client.screen -= hud_used.cult_tattoo_display
hud_used.cult_tattoo_display = null
if (isshade(src) && gui_icons)
if(gui_icons.soulblade_bgLEFT)
returnToPool(gui_icons.soulblade_bgLEFT)
if(client)
client.screen -= gui_icons.soulblade_bgLEFT
gui_icons.soulblade_bgLEFT = null
if(gui_icons.soulblade_bloodbar)
returnToPool(gui_icons.soulblade_bloodbar)
if(client)
client.screen -= gui_icons.soulblade_bloodbar
gui_icons.soulblade_bloodbar = null
if(gui_icons.soulblade_coverLEFT)
returnToPool(gui_icons.soulblade_coverLEFT)
if(client)
client.screen -= gui_icons.soulblade_coverLEFT
gui_icons.soulblade_coverLEFT = null
/mob/proc/cultify()
return
@@ -2162,5 +2192,11 @@ mob/proc/on_foot()
/mob/proc/handle_regular_hud_updates()
return
/mob/proc/update_antag_huds()
if (mind)
for (var/role in mind.antag_roles)
var/datum/role/R = mind.antag_roles[role]
R.update_antag_hud()
#undef MOB_SPACEDRUGS_HALLUCINATING
#undef MOB_MINDBREAKER_HALLUCINATING

View File

@@ -443,7 +443,7 @@
else
if((T && T.holy) && isobserver(mob))
var/mob/dead/observer/observer = mob
if(observer.invisibility == 0 || observer.mind && (find_active_faction_by_member(observer.mind.GetRole(LEGACY_CULTIST)) || find_active_faction_by_member(observer.mind.GetRole(BLOODCULT))))
if(observer.invisibility == 0 || observer.mind && (find_active_faction_by_member(observer.mind.GetRole(LEGACY_CULTIST)) || find_active_faction_by_member(observer.mind.GetRole(CULTIST))))
to_chat(mob, "<span class='warning'>You cannot get past holy grounds while you are in this plane of existence!</span>")
else
mob.forceEnter(get_step(mob, direct))

View File

@@ -29,7 +29,7 @@
var/gender = NEUTER
// Restrict some styles to specific species
var/list/species_allowed = list("Human")
var/list/species_allowed = list("Human","Manifested")
// Whether or not the accessory can be affected by colouration
var/do_colouration = 1
@@ -56,7 +56,7 @@
name = "Bald"
icon_state = "bald"
gender = MALE
species_allowed = list("Human","Unathi","Grey","Plasmaman","Skellington","Diona","Muton","Golem","Skeletal Vox","Horror","Ghoul","Slime","Mushroom")
species_allowed = list("Human","Manifested","Unathi","Grey","Plasmaman","Skellington","Diona","Muton","Golem","Skeletal Vox","Horror","Ghoul","Slime","Mushroom")
short
name = "Short Hair" // try to capatilize the names please~
@@ -151,7 +151,7 @@
name = "Pompadour"
icon_state = "hair_pompadour"
gender = MALE
species_allowed = list("Human","Unathi")
species_allowed = list("Human","Manifested","Unathi")
quiff
name = "Quiff"
@@ -174,19 +174,19 @@
name = "Beehive"
icon_state = "hair_beehive"
gender = FEMALE
species_allowed = list("Human","Unathi")
species_allowed = list("Human","Manifested","Unathi")
bobcurl
name = "Bobcurl"
icon_state = "hair_bobcurl"
gender = FEMALE
species_allowed = list("Human","Unathi")
species_allowed = list("Human","Manifested","Unathi")
bob
name = "Bob"
icon_state = "hair_bobcut"
gender = FEMALE
species_allowed = list("Human","Unathi")
species_allowed = list("Human","Manifested","Unathi")
bowl
name = "Bowl"
@@ -197,7 +197,7 @@
name = "Buzzcut"
icon_state = "hair_buzzcut"
gender = MALE
species_allowed = list("Human","Unathi")
species_allowed = list("Human","Manifested","Unathi")
crew
name = "Crewcut"
@@ -269,7 +269,7 @@
spiky
name = "Spiky"
icon_state = "hair_spikey"
species_allowed = list("Human","Unathi")
species_allowed = list("Human","Manifested","Unathi")
kusangi
name = "Kusanagi Hair"
icon_state = "hair_kusanagi"
@@ -516,7 +516,7 @@
name = "Shaved"
icon_state = "bald"
gender = NEUTER
species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Grey","Plasmaman","Skellington","Diona","Muton","Golem","Skeletal Vox","Horror","Ghoul","Slime","Mushroom")
species_allowed = list("Human","Manifested","Unathi","Tajaran","Skrell","Vox","Grey","Plasmaman","Skellington","Diona","Muton","Golem","Skeletal Vox","Horror","Ghoul","Slime","Mushroom")
watson
name = "Watson Mustache"
@@ -557,7 +557,7 @@
elvis
name = "Elvis Sideburns"
icon_state = "facial_elvis"
species_allowed = list("Human","Unathi")
species_allowed = list("Human","Manifested","Unathi")
abe
name = "Abraham Lincoln Beard"

View File

@@ -389,6 +389,10 @@ var/list/impact_master = list()
target_angle = round(Get_Angle(starting,target))
if(linear_movement)
var/matrix/projectile_matrix = turn(matrix(),target_angle+45)
transform = projectile_matrix
icon_state = "[initial(icon_state)]_pixel"
/*
//If the icon has not been added yet
if( !("[icon_state]_angle[target_angle]" in bullet_master) )
var/icon/I = new(icon,"[icon_state]_pixel") //Generate it.
@@ -396,7 +400,7 @@ var/list/impact_master = list()
I.Turn(target_angle+45)
bullet_master["[icon_state]_angle[target_angle]"] = I //And cache it!
src.icon = bullet_master["[icon_state]_angle[target_angle]"]
*/
return 1
@@ -610,12 +614,16 @@ var/list/impact_master = list()
target_angle = round(newangle)
if(linear_movement)
var/matrix/projectile_matrix = turn(matrix(),target_angle+45)
transform = projectile_matrix
/*
if( !("[icon_state][target_angle]" in bullet_master) )
var/icon/I = new(initial(icon),"[icon_state]_pixel")
if(!lock_angle)
I.Turn(target_angle+45)
bullet_master["[icon_state]_angle[target_angle]"] = I
src.icon = bullet_master["[icon_state]_angle[target_angle]"]
*/
/obj/item/projectile/test //Used to see if you can hit them.
invisibility = 101 //Nope! Can't see me!

View File

@@ -915,7 +915,7 @@
description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality."
reagent_state = REAGENT_STATE_LIQUID
color = "#0064C8" //rgb: 0, 100, 200
custom_metabolism = 5 //High metabolism to prevent extended uncult rolls. Approx 5 units per roll
custom_metabolism = 2 //High metabolism to prevent extended uncult rolls. Approx 5 units per roll
specheatcap = 4.183
/datum/reagent/holywater/reaction_obj(var/obj/O, var/volume)
@@ -934,13 +934,83 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
if (iscultist(H))
H.Dizzy(6)
H.Jitter(12)
if (prob(20))
H.Knockdown(1)
else if (prob(30))
H.confused = 2
H.eye_blurry = max(H.eye_blurry, 3)
var/unholy = H.checkTattoo(TATTOO_HOLY)
var/current_act = max(-1,min(5,veil_thickness))
var/datum/role/cultist/cult = H.mind.GetRole(CULTIST)
if (cult.holywarning_cooldown <= 0)
cult.holywarning_cooldown = 5
if (unholy)
to_chat(H, "<span class='warning'>You feel the unpleasant touch of holy water, but the mark on your back negates its most debilitating effects.</span>")
else
switch (current_act)
if (CULT_MENDED)
to_chat(H, "<span class='danger'>The holy water permeates your skin and consumes your cursed blood like mercury digests gold.</span>")
if (CULT_PROLOGUE)
to_chat(H, "<span class='warning'>You feel the cold touch of holy water, but the veil is still too thick for it to be a real threat.</span>")
if (CULT_ACT_I)
to_chat(H, "<span class='warning'>The touch of holy water troubles your thoughts, you won't be able to cast spells under its effects.</span>")
if (CULT_ACT_II)
to_chat(H, "<span class='danger'>The holy water makes your head spin, you're having trouble walking straight.</span>")
if (CULT_ACT_III)
to_chat(H, "<span class='danger'>The holy water freezes your muscles, you find yourself short of breath.</span>")
if (CULT_ACT_IV)
to_chat(H, "<span class='danger'>The holy water makes you sick to your stomach.</span>")
if (CULT_EPILOGUE)
to_chat(H, "<span class='danger'>Even in these times, holy water proves itself capable of hindering your progression.</span>")
if (unholy)
H.eye_blurry = max(H.eye_blurry, 3)
return
else
switch (current_act)
if (CULT_MENDED)
H.dust()
return
if (CULT_PROLOGUE)
H.eye_blurry = max(H.eye_blurry, 3)
H.Dizzy(3)
if (CULT_ACT_I)
H.eye_blurry = max(H.eye_blurry, 6)
H.Dizzy(6)
H.stuttering = max(H.stuttering, 6)
if (CULT_ACT_II)
H.eye_blurry = max(H.eye_blurry, 12)
H.Dizzy(12)
H.stuttering = max(H.stuttering, 12)
H.Jitter(12)
if (CULT_ACT_III)
H.eye_blurry = max(H.eye_blurry, 16)
H.Dizzy(16)
H.stuttering = max(H.stuttering, 16)
H.Jitter(16)
if (prob(50))
H.Knockdown(1)
else if (prob(50))
H.confused = 2
H.adjustOxyLoss(5)
if (CULT_ACT_IV)
H.eye_blurry = max(H.eye_blurry, 20)
H.Dizzy(20)
H.stuttering = max(H.stuttering, 20)
H.Jitter(20)
if (prob(60))
H.Knockdown(2)
else if (prob(60))
H.confused = 4
H.adjustOxyLoss(10)
M.adjustToxLoss(5)
if (CULT_EPILOGUE)
H.eye_blurry = max(H.eye_blurry, 30)
H.Dizzy(30)
H.stuttering = max(H.stuttering, 30)
H.Jitter(30)
if (prob(70))
H.Knockdown(4)
else if (prob(70))
H.confused = 6
H.adjustOxyLoss(20)
M.adjustToxLoss(10)
if (islegacycultist(H))
if (prob(10))
var/datum/role/legacy_cultist/LC = H.mind.GetRole(LEGACY_CULTIST)
@@ -976,7 +1046,6 @@
H.confused = 3
H.eye_blurry = max(H.eye_blurry, 6)
/*
//Vampires react to this like acid, and it massively spikes their smitecounter. And they are guaranteed to have adverse effects.
var/datum/role/vampire/V = isvampire(H)

BIN
icons/effects/32x96.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 566 KiB

After

Width:  |  Height:  |  Size: 573 KiB

BIN
icons/mob/cult_tattoos.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 KiB

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 51 KiB

BIN
icons/mob/screen1_cult.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 496 KiB

After

Width:  |  Height:  |  Size: 502 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 KiB

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
icons/obj/cult_radial2.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 18 KiB

BIN
sound/effects/Mend.ogg Normal file

Binary file not shown.

BIN
sound/effects/bloodboil.ogg Normal file

Binary file not shown.

View File

@@ -310,6 +310,7 @@
#include "code\datums\gamemode\factions\bloodcult\bloodcult_items.dm"
#include "code\datums\gamemode\factions\bloodcult\bloodcult_mobs_and_constructs.dm"
#include "code\datums\gamemode\factions\bloodcult\bloodcult_narsie.dm"
#include "code\datums\gamemode\factions\bloodcult\bloodcult_projectiles.dm"
#include "code\datums\gamemode\factions\bloodcult\bloodcult_runes.dm"
#include "code\datums\gamemode\factions\bloodcult\bloodcult_runespells.dm"
#include "code\datums\gamemode\factions\bloodcult\bloodcult_spells.dm"