[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
@@ -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
|
||||
|
||||
|
||||
@@ -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]"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
290
code/datums/gamemode/factions/bloodcult/bloodcult_projectiles.dm
Normal 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
|
||||
@@ -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>",\
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -208,6 +208,9 @@
|
||||
/datum/role/proc/OnPostSetup()
|
||||
return 1
|
||||
|
||||
/datum/role/proc/update_antag_hud()
|
||||
return
|
||||
|
||||
/datum/role/proc/process()
|
||||
return
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>
|
||||
"}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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//
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -64,6 +64,8 @@
|
||||
|
||||
regular_hud_updates()
|
||||
|
||||
update_antag_huds()
|
||||
|
||||
update_action_buttons(TRUE)
|
||||
|
||||
if(round_end_info == "")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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
|
After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 566 KiB After Width: | Height: | Size: 573 KiB |
BIN
icons/mob/cult_tattoos.dmi
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 252 KiB After Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 51 KiB |
BIN
icons/mob/screen1_cult.dmi
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 496 KiB After Width: | Height: | Size: 502 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 312 KiB After Width: | Height: | Size: 308 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 5.0 KiB |
BIN
icons/obj/cult_radial2.dmi
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 18 KiB |
BIN
sound/effects/Mend.ogg
Normal file
BIN
sound/effects/bloodboil.ogg
Normal 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"
|
||||
|
||||