Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.

Commit 7b62be8

Browse files
committed
more work
1 parent 329a421 commit 7b62be8

File tree

8 files changed

+88
-265
lines changed

8 files changed

+88
-265
lines changed

code/__DEFINES/bloodsuckers.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@
120120
#define BP_AM_SINGLEUSE (1<<1)
121121
/// This Power has a Static cooldown
122122
#define BP_AM_STATIC_COOLDOWN (1<<2)
123-
/// This Power doesn't cost bloot to run while unconscious
123+
/// This Power doesn't cost blood to run while unconscious
124124
#define BP_AM_COSTLESS_UNCONSCIOUS (1<<3)
125125

126126
/**

code/modules/antagonists/bloodsuckers/powers/_powers.dm

Lines changed: 0 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -43,178 +43,6 @@
4343
///Path to the ascended version of the power. For Lasombra bloodsucker powers
4444
var/ascended_power = null
4545

46-
47-
// Modify description to add cost.
48-
/datum/action/cooldown/bloodsucker/New(Target)
49-
. = ..()
50-
UpdateDesc()
51-
52-
/datum/action/cooldown/bloodsucker/proc/UpdateDesc()
53-
desc = initial(desc)
54-
if(length(additional_text) > 0)
55-
desc += "<br><br><b>ASCENDED</b>: [additional_text]"
56-
if(bloodcost > 0)
57-
desc += "<br><br><b>COST:</b> [bloodcost] Blood"
58-
if(constant_bloodcost > 0)
59-
desc += "<br><br><b>CONSTANT COST:</b><i> [name] costs [constant_bloodcost] Blood maintain active.</i>"
60-
if(power_flags & BP_AM_SINGLEUSE)
61-
desc += "<br><br><b>SINGLE USE:</br><i> [name] can only be used once per night.</i>"
62-
if(level_current > 0)
63-
desc += "<br><br><b>LEVEL:</b><i> [name] is currently level [level_current].</i>"
64-
if(cooldown_time > 0)
65-
desc += "<br><br><b>COOLDOWN:</b><i> [name] has a cooldown of [cooldown_time / 10] seconds.</i>"
66-
67-
/datum/action/cooldown/bloodsucker/Destroy()
68-
bloodsuckerdatum_power = null
69-
return ..()
70-
71-
/datum/action/cooldown/bloodsucker/IsAvailable(feedback = FALSE)
72-
return next_use_time <= world.time
73-
74-
/datum/action/cooldown/bloodsucker/Grant(mob/user)
75-
. = ..()
76-
var/datum/antagonist/bloodsucker/bloodsuckerdatum = IS_BLOODSUCKER(owner)
77-
if(bloodsuckerdatum)
78-
bloodsuckerdatum_power = bloodsuckerdatum
79-
80-
//This is when we CLICK on the ability Icon, not USING.
81-
/datum/action/cooldown/bloodsucker/Trigger(trigger_flags)
82-
if(active && can_deactivate()) // Active? DEACTIVATE AND END!
83-
DeactivatePower()
84-
return FALSE
85-
if(!can_pay_cost() || !CanUse(owner))
86-
return FALSE
87-
pay_cost()
88-
ActivatePower()
89-
if(!(power_flags & BP_AM_TOGGLE) || !active)
90-
StartCooldown()
91-
return TRUE
92-
93-
///Called when the Power is upgraded.
94-
/datum/action/cooldown/bloodsucker/proc/upgrade_power()
95-
level_current++
96-
97-
///Checks if the Power is available to use.
98-
/datum/action/cooldown/bloodsucker/proc/CanUse(mob/living/carbon/user)
99-
if(!owner)
100-
return FALSE
101-
if(!isliving(user))
102-
return FALSE
103-
// Torpor?
104-
if((check_flags & BP_CANT_USE_IN_TORPOR) && HAS_TRAIT(user, TRAIT_NODEATH))
105-
to_chat(user, span_warning("Not while you're in Torpor."))
106-
return FALSE
107-
// Frenzy?
108-
if((check_flags & BP_CANT_USE_IN_FRENZY) && (bloodsuckerdatum_power?.frenzied))
109-
to_chat(user, span_warning("You cannot use powers while in a Frenzy!"))
110-
return FALSE
111-
// Stake?
112-
if((check_flags & BP_CANT_USE_WHILE_STAKED) && user.am_staked())
113-
to_chat(user, span_warning("You have a stake in your chest! Your powers are useless."))
114-
return FALSE
115-
// Conscious? -- We use our own (AB_CHECK_CONSCIOUS) here so we can control it more, like the error message.
116-
if((check_flags & BP_CANT_USE_WHILE_UNCONSCIOUS) && user.stat != CONSCIOUS)
117-
to_chat(user, span_warning("You can't do this while you are unconscious!"))
118-
return FALSE
119-
// Incapacitated?
120-
if((check_flags & BP_CANT_USE_WHILE_INCAPACITATED) && (user.incapacitated(ignore_restraints = TRUE, ignore_grab = TRUE)))
121-
to_chat(user, span_warning("Not while you're incapacitated!"))
122-
return FALSE
123-
// Constant Cost (out of blood)
124-
if(!bloodsuckerdatum_power)
125-
var/mob/living/living_owner = owner
126-
if(living_owner.blood_volume < bloodcost)
127-
to_chat(owner, span_warning("You need at least [bloodcost] blood to activate [name]"))
128-
return FALSE
129-
return TRUE
130-
if(constant_bloodcost && bloodsuckerdatum_power.bloodsucker_blood_volume <= 0)
131-
to_chat(user, span_warning("You don't have the blood to upkeep [src]."))
132-
return FALSE
133-
return TRUE
134-
135-
/// NOTE: With this formula, you'll hit half cooldown at level 8 for that power.
136-
/datum/action/cooldown/bloodsucker/StartCooldown()
137-
// Calculate Cooldown (by power's level)
138-
if(power_flags & BP_AM_STATIC_COOLDOWN)
139-
cooldown_time = initial(cooldown_time)
140-
else
141-
cooldown_time = max(initial(cooldown_time) / 2, initial(cooldown_time) - (initial(cooldown_time) / 16 * (level_current-1)))
142-
143-
return ..()
144-
145-
/datum/action/cooldown/bloodsucker/proc/can_deactivate()
146-
return TRUE
147-
148-
/datum/action/cooldown/bloodsucker/is_action_active()
149-
return active
150-
151-
/datum/action/cooldown/bloodsucker/proc/pay_cost()
152-
// Non-bloodsuckers will pay in other ways.
153-
if(!bloodsuckerdatum_power)
154-
var/mob/living/carbon/living_owner = owner
155-
if(!LAZYFIND(living_owner.dna.species.species_traits, NOBLOOD))
156-
living_owner.blood_volume -= bloodcost
157-
return
158-
// Bloodsuckers in a Frenzy don't have enough Blood to pay it, so just don't.
159-
if(bloodsuckerdatum_power.frenzied)
160-
return
161-
bloodsuckerdatum_power.bloodsucker_blood_volume -= bloodcost
162-
bloodsuckerdatum_power?.update_hud()
163-
164-
/datum/action/cooldown/bloodsucker/proc/ActivatePower()
165-
active = TRUE
166-
if(power_flags & BP_AM_TOGGLE)
167-
START_PROCESSING(SSprocessing, src)
168-
169-
owner.log_message("used [src][bloodcost != 0 ? " at the cost of [bloodcost]" : ""].", LOG_ATTACK, color="red")
170-
build_all_button_icons()
171-
172-
/datum/action/cooldown/bloodsucker/proc/DeactivatePower()
173-
if(!active) //Already inactive? Return
174-
return
175-
if(power_flags & BP_AM_TOGGLE)
176-
STOP_PROCESSING(SSprocessing, src)
177-
if(power_flags & BP_AM_SINGLEUSE)
178-
remove_after_use()
179-
return
180-
active = FALSE
181-
StartCooldown()
182-
build_all_button_icons()
183-
184-
///Used by powers that are continuously active (That have BP_AM_TOGGLE flag)
185-
/datum/action/cooldown/bloodsucker/process(seconds_per_tick)
186-
SHOULD_CALL_PARENT(TRUE) //Need this to call parent so the cooldown system works
187-
. = ..()
188-
if(!ContinueActive(owner)) // We can't afford the Power? Deactivate it.
189-
DeactivatePower()
190-
return FALSE
191-
// We can keep this up (For now), so Pay Cost!
192-
if(!(power_flags & BP_AM_COSTLESS_UNCONSCIOUS) && owner.stat != CONSCIOUS)
193-
if(bloodsuckerdatum_power)
194-
bloodsuckerdatum_power.AddBloodVolume(-constant_bloodcost)
195-
else
196-
var/mob/living/living_owner = owner
197-
living_owner.blood_volume -= constant_bloodcost
198-
return TRUE
199-
200-
/// Checks to make sure this power can stay active
201-
/datum/action/cooldown/bloodsucker/proc/ContinueActive(mob/living/user, mob/living/target)
202-
if(!user)
203-
return FALSE
204-
if(!constant_bloodcost > 0)
205-
return TRUE
206-
if(bloodsuckerdatum_power?.bloodsucker_blood_volume)
207-
return TRUE
208-
if(user.blood_volume)
209-
return TRUE
210-
211-
/// Used to unlearn Single-Use Powers
212-
/datum/action/cooldown/bloodsucker/proc/remove_after_use()
213-
bloodsuckerdatum_power?.powers -= src
214-
Remove(owner)
215-
216-
217-
21846
/datum/bloodsucker_power
21947
var/ability_path
22048
var/datum/action/cooldown/spell/instance
Lines changed: 45 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,40 @@
1-
/datum/action/cooldown/bloodsucker/cloak
1+
/datum/action/cooldown/spell/toggle/cloak
22
name = "Cloak of Darkness"
33
desc = "Blend into the shadows and become invisible to the untrained and Artificial eye."
4+
5+
background_icon = 'icons/mob/actions/actions_bloodsucker.dmi'
6+
background_icon_state = "vamp_power_off"
7+
button_icon = 'icons/mob/actions/actions_bloodsucker.dmi'
48
button_icon_state = "power_cloak"
5-
power_explanation = "Cloak of Darkness<:\n\
6-
Activate this Power in the shadows and you will slowly turn nearly invisible.\n\
7-
While using Cloak of Darkness, attempting to run will crush you.\n\
8-
Additionally, while Cloak is active, you are completely invisible to the AI.\n\
9-
Higher levels will increase how invisible you are."
10-
power_flags = BP_AM_TOGGLE
9+
buttontooltipstyle = "cult"
10+
transparent_when_unavailable = TRUE
11+
12+
// power_explanation = "Cloak of Darkness<:\n\
13+
// Activate this Power in the shadows and you will slowly turn nearly invisible.\n\
14+
// While using Cloak of Darkness, attempting to run will crush you.\n\
15+
// Additionally, while Cloak is active, you are completely invisible to the AI.\n\
16+
// Higher levels will increase how invisible you are."
17+
1118
check_flags = BP_CANT_USE_IN_TORPOR|BP_CANT_USE_IN_FRENZY|BP_CANT_USE_WHILE_UNCONSCIOUS
1219
purchase_flags = BLOODSUCKER_CAN_BUY|VASSAL_CAN_BUY
13-
bloodcost = 5
14-
constant_bloodcost = 0.2
20+
resource_costs = list(ANTAG_RESOURCE_BLOODSUCKER = 5)
21+
maintain_costs = list(ANTAG_RESOURCE_BLOODSUCKER = 0.2)
1522
cooldown_time = 5 SECONDS
16-
ascended_power = /datum/action/cooldown/bloodsucker/cloak/shadow
1723
var/was_running
1824
var/runbound = TRUE
1925

2026
/// Must have nobody around to see the cloak
21-
/datum/action/cooldown/bloodsucker/cloak/CanUse(mob/living/carbon/user)
27+
/datum/action/cooldown/spell/toggle/cloak/can_cast_spell(feedback)
2228
. = ..()
2329
if(!.)
2430
return FALSE
2531
for(var/mob/living/watchers in viewers(9, owner) - owner)
26-
owner.balloon_alert(owner, "you can only vanish unseen.")
32+
if(feedback)
33+
owner.balloon_alert(owner, "you can only vanish unseen.")
2734
return FALSE
2835
return TRUE
2936

30-
/datum/action/cooldown/bloodsucker/cloak/ActivatePower()
31-
. = ..()
32-
var/mob/living/user = owner
33-
was_running = (user.m_intent == MOVE_INTENT_RUN)
34-
if(runbound)
35-
if(was_running)
36-
user.toggle_move_intent()
37-
user.digitalinvis = 1
38-
user.digitalcamo = 1
39-
user.balloon_alert(user, "cloak turned on.")
40-
41-
/datum/action/cooldown/bloodsucker/cloak/process()
37+
/datum/action/cooldown/spell/toggle/cloak/process()
4238
// Checks that we can keep using this.
4339
. = ..()
4440
if(!.)
@@ -54,18 +50,18 @@
5450
user.toggle_move_intent()
5551
user.adjustBruteLoss(rand(5,15))
5652

57-
/datum/action/cooldown/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target)
53+
/datum/action/cooldown/spell/toggle/cloak/Enable()
5854
. = ..()
59-
if(!.)
60-
return FALSE
61-
/// Must be CONSCIOUS
62-
if(user.stat != CONSCIOUS)
63-
to_chat(owner, span_warning("Your Cloak of Darkness fell off due to you falling unconscious!"))
64-
return FALSE
65-
return TRUE
55+
var/mob/living/user = owner
56+
was_running = (user.m_intent == MOVE_INTENT_RUN)
57+
if(runbound)
58+
if(was_running)
59+
user.toggle_move_intent()
60+
user.digitalinvis = 1
61+
user.digitalcamo = 1
62+
user.balloon_alert(user, "cloak turned on.")
6663

67-
/datum/action/cooldown/bloodsucker/cloak/DeactivatePower()
68-
. = ..()
64+
/datum/action/cooldown/spell/toggle/cloak/Disable()
6965
var/mob/living/user = owner
7066
animate(user, alpha = 255, time = 1 SECONDS)
7167
user.digitalinvis = 0
@@ -75,7 +71,7 @@
7571
user.toggle_move_intent()
7672
user.balloon_alert(user, "cloak turned off.")
7773

78-
/datum/action/cooldown/bloodsucker/cloak/shadow
74+
/datum/action/cooldown/spell/toggle/cloak/shadow
7975
name = "Cloak of Shadows"
8076
desc = "Empowered to the abyss, fortitude will now grant you a shadow armor, making your grip harder to escape and reduce projectile damage while in darkness."
8177
background_icon = 'icons/mob/actions/actions_lasombra_bloodsucker.dmi'
@@ -85,17 +81,25 @@
8581
button_icon_state = "power_state"
8682
additional_text = "Additionally allows you to run during cloak and gain a physical cloak while in darkness."
8783
purchase_flags = LASOMBRA_CAN_BUY
88-
constant_bloodcost = 0.3
8984
runbound = FALSE
90-
ascended_power = null
85+
86+
/datum/action/cooldown/spell/toggle/cloak/shadow/Enable()
87+
. = ..()
88+
var/turf/T = get_turf(owner)
89+
var/light_amount = T.get_lumcount()
90+
if(light_amount <= LIGHTING_TILE_IS_DARK)
91+
if(!owner.get_item_by_slot(ITEM_SLOT_NECK))
92+
owner.equip_to_slot_or_del( new /obj/item/clothing/neck/yogs/sith_cloak/cloak(null), ITEM_SLOT_NECK)
93+
94+
/datum/action/cooldown/spell/toggle/cloak/shadow/Disable()
95+
. = ..()
96+
var/obj/item/I = owner.get_item_by_slot(ITEM_SLOT_NECK)
97+
if(istype(I, /obj/item/clothing/neck/yogs/sith_cloak/cloak))
98+
qdel(I)
9199

92100
/obj/item/clothing/neck/yogs/sith_cloak/cloak
93101
name = "cloak of shadows"
94102
desc = "Fancy stuff."
95-
icon = 'icons/obj/vamp_obj.dmi'
96-
worn_icon = 'icons/obj/vamp_obj.dmi'
97-
icon_state = "cloak"
98-
item_state = "cloak"
99103
armor = list(MELEE = 0, BULLET = 0, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 10, ACID = 100) //good if you haven nothing
100104

101105
/obj/item/clothing/neck/yogs/sith_cloak/cloak/Initialize(mapload)
@@ -111,16 +115,3 @@
111115
STOP_PROCESSING(SSobj, src)
112116
src.visible_message(span_warning("The cape desintegrates as the light contacts it's surface!"))
113117

114-
/datum/action/cooldown/bloodsucker/cloak/shadow/ActivatePower()
115-
. = ..()
116-
var/turf/T = get_turf(owner)
117-
var/light_amount = T.get_lumcount()
118-
if(light_amount <= LIGHTING_TILE_IS_DARK)
119-
if(!owner.get_item_by_slot(ITEM_SLOT_NECK))
120-
owner.equip_to_slot_or_del( new /obj/item/clothing/neck/yogs/sith_cloak/cloak(null), ITEM_SLOT_NECK)
121-
122-
/datum/action/cooldown/bloodsucker/cloak/shadow/DeactivatePower()
123-
. = ..()
124-
var/obj/item/I = owner.get_item_by_slot(ITEM_SLOT_NECK)
125-
if(istype(I, /obj/item/clothing/neck/yogs/sith_cloak/cloak))
126-
qdel(I)
Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
1-
/datum/action/cooldown/bloodsucker/distress
1+
/datum/action/cooldown/spell/distress
22
name = "Distress"
33
desc = "Injure yourself, allowing you to make a desperate call for help to your Master."
4+
transparent_when_unavailable = TRUE
5+
buttontooltipstyle = "cult"
6+
7+
background_icon = 'icons/mob/actions/actions_bloodsucker.dmi'
8+
background_icon_state = "vamp_power_off"
9+
button_icon = 'icons/mob/actions/actions_bloodsucker.dmi'
410
button_icon_state = "power_distress"
5-
power_explanation = "Distress:\n\
6-
Use this Power from anywhere and your Master Bloodsucker will instnatly be alerted of your location."
7-
power_flags = NONE
11+
12+
//power_explanation = "Distress:Use this Power from anywhere and your Master Bloodsucker will instantly be alerted of your location."
813
check_flags = NONE
9-
purchase_flags = NONE
10-
bloodcost = 10
14+
resource_costs = list(ANTAG_RESOURCE_BLOODSUCKER = 10)
1115
cooldown_time = 10 SECONDS
1216

13-
/datum/action/cooldown/bloodsucker/distress/ActivatePower()
17+
/datum/action/cooldown/spell/distress/cast()
1418
. = ..()
1519
var/turf/open/floor/target_area = get_area(owner)
1620
var/datum/antagonist/vassal/vassaldatum = owner.mind.has_antag_datum(/datum/antagonist/vassal)
1721

1822
to_chat(owner, "You call out for your master!")
19-
to_chat(vassaldatum.master.owner, "<span class='userdanger'>[owner], your loyal Vassal, is desperately calling for aid at [target_area]!</span>")
23+
to_chat(vassaldatum.master.owner, span_userdanger("[owner], your loyal Vassal, is desperately calling for aid at [target_area]!"))
2024

2125
var/mob/living/user = owner
2226
user.adjustBruteLoss(10)

0 commit comments

Comments
 (0)