diff --git a/code/__DEFINES/vampire_defines.dm b/code/__DEFINES/vampire_defines.dm index 06ea4179f9a..a0663014e6f 100644 --- a/code/__DEFINES/vampire_defines.dm +++ b/code/__DEFINES/vampire_defines.dm @@ -13,3 +13,6 @@ #define VAMPIRE_NULLIFICATION_CAP 120 // the maximum amount a vampire can be nullified naturally. #define VAMPIRE_COMPLETE_NULLIFICATION 100 // the point of nullification where vampires can no longer use abilities. + +#define NEW_NULLIFICATION 1 //nulifiaction like the new vampires +#define OLD_NULLIFICATION 2 //nulifiaction like the goon vampires diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 74cb7197c53..b147a1b6e84 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -417,7 +417,7 @@ /datum/mind/proc/memory_edit_goon_vampire(mob/living/carbon/human/H) . = _memory_edit_header("goonvampire") - var/datum/antagonist/goon_vampire/g_vamp = has_antag_datum(/datum/antagonist/goon_vampire) + var/datum/antagonist/vampire/g_vamp = has_antag_datum(/datum/antagonist/vampire) if(g_vamp) . += "GOON VAMPIRE|no" . += "
Usable blood: [g_vamp.bloodusable]" @@ -457,7 +457,7 @@ . += _memory_edit_role_enabled(ROLE_VAMPIRE) /** Enthralled ***/ . += "
enthralled: " - if(has_antag_datum(/datum/antagonist/mindslave/thrall) || has_antag_datum(/datum/antagonist/mindslave/goon_thrall)) + if(has_antag_datum(/datum/antagonist/mindslave/thrall)) . += "THRALL|no" else . += "thrall|NO" @@ -1615,7 +1615,7 @@ if(!isvampire(src)) return - remove_goon_vampire_role() + remove_vampire_role() to_chat(current, "Вы ослабли и потеряли свои силы! Вы больше не вампир и теперь останетесь в своей текущей форме!") log_admin("[key_name(usr)] has de-goon-vampired [key_name(current)]") message_admins("[key_name_admin(usr)] has de-goon-vampired [key_name_admin(current)]") @@ -1624,7 +1624,7 @@ if(isvampire(src)) return - var/datum/antagonist/goon_vampire/g_vamp = new() + var/datum/antagonist/vampire/goon_vampire/g_vamp = new() g_vamp.give_objectives = FALSE add_antag_datum(g_vamp) to_chat(usr, "У вампира [key] отсутствуют задания. Вы можете добавить их вручную или сгенерировать случайный набор, кнопкой Randomize!") @@ -1638,7 +1638,7 @@ var/new_usable = input(usr, "Select a new value:", "Modify usable blood") as null|num if(isnull(new_usable) || new_usable < 0) return - var/datum/antagonist/goon_vampire/g_vamp = has_antag_datum(/datum/antagonist/goon_vampire) + var/datum/antagonist/vampire/goon_vampire/g_vamp = has_antag_datum(/datum/antagonist/vampire) g_vamp.bloodusable = new_usable current.update_action_buttons_icon() log_admin("[key_name(usr)] has set [key_name(current)]'s usable blood to [new_usable].") @@ -1652,7 +1652,7 @@ if(isnull(new_total) || new_total < 0) return - var/datum/antagonist/goon_vampire/g_vamp = has_antag_datum(/datum/antagonist/goon_vampire) + var/datum/antagonist/vampire/goon_vampire/g_vamp = has_antag_datum(/datum/antagonist/vampire) if(new_total < g_vamp.bloodtotal) if(alert(usr, "Note that reducing the vampire's total blood may remove some active powers. Continue?", "Confirm New Total", "Yes", "No") == "No") return @@ -1664,7 +1664,7 @@ message_admins("[key_name_admin(usr)] has set [key_name_admin(current)]'s total blood to [new_total].") if("autoobjectives") - var/datum/antagonist/goon_vampire/g_vamp = has_antag_datum(/datum/antagonist/goon_vampire) + var/datum/antagonist/vampire/g_vamp = has_antag_datum(/datum/antagonist/vampire) g_vamp.give_objectives() to_chat(usr, "Для вампира [key] сгенерированы задания. Вы можете отредактировать и объявить их вручную.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") @@ -1685,7 +1685,7 @@ if(isvampire(src)) return - var/datum/antagonist/vampire/vamp = new() + var/datum/antagonist/vampire/new_vampire/vamp = new() vamp.give_objectives = FALSE add_antag_datum(vamp) to_chat(usr, "Vampire [key] has no objectives. You can add custom ones or generate random set by using Randomize! button.") @@ -1862,9 +1862,8 @@ else if(href_list["vampthrall"]) switch(href_list["vampthrall"]) if("clear") - if(has_antag_datum(/datum/antagonist/mindslave/thrall) || has_antag_datum(/datum/antagonist/mindslave/goon_thrall)) + if(has_antag_datum(/datum/antagonist/mindslave/thrall)) remove_antag_datum(/datum/antagonist/mindslave/thrall) - remove_antag_datum(/datum/antagonist/mindslave/goon_thrall) log_admin("[key_name(usr)] has de-vampthralled [key_name(current)]") message_admins("[key_name_admin(usr)] has de-vampthralled [key_name_admin(current)]") @@ -2716,14 +2715,6 @@ remove_antag_datum(chan_datum) -/datum/mind/proc/remove_goon_vampire_role() - var/datum/antagonist/goon_vampire/vamp = has_antag_datum(/datum/antagonist/goon_vampire) - if(!vamp) - return - - remove_antag_datum(vamp) - - /datum/mind/proc/remove_vampire_role() var/datum/antagonist/vampire/vamp = has_antag_datum(/datum/antagonist/vampire) if(!vamp) @@ -2825,7 +2816,6 @@ remove_clocker_role() remove_wizard_role() remove_changeling_role() - remove_goon_vampire_role() remove_vampire_role() remove_syndicate_role() remove_event_role() @@ -2897,12 +2887,12 @@ /datum/mind/proc/make_goon_vampire() if(!isvampire(src)) - add_antag_datum(/datum/antagonist/goon_vampire) + add_antag_datum(/datum/antagonist/vampire/goon_vampire) /datum/mind/proc/make_vampire() if(!isvampire(src)) - add_antag_datum(/datum/antagonist/vampire) + add_antag_datum(/datum/antagonist/vampire/new_vampire) /datum/mind/proc/make_Nuke() diff --git a/code/datums/spell_handler/vampire_spell_handler.dm b/code/datums/spell_handler/vampire_spell_handler.dm index ecb1281ebc3..430edbc9b7d 100644 --- a/code/datums/spell_handler/vampire_spell_handler.dm +++ b/code/datums/spell_handler/vampire_spell_handler.dm @@ -12,30 +12,31 @@ if(isvampirecoffin(user.loc)) if(show_message) - to_chat(user, span_warning("You can't use this ability inside the coffin!")) + to_chat(user, span_warning("Вы не можете использовать эту способность, будучи в гробу!")) return FALSE var/fullpower = vampire.get_ability(/datum/vampire_passive/full) if(user.stat >= DEAD) // TODO check if needed if(show_message) - to_chat(user, span_warning("Not while you're dead!")) + to_chat(user, span_warning("Но вы же мертвы!")) return FALSE - if(vampire.nullified >= VAMPIRE_COMPLETE_NULLIFICATION && !fullpower) // above 100 nullification vampire powers are useless + if(((vampire.nullified >= VAMPIRE_COMPLETE_NULLIFICATION) || \ + (vampire.nullification == OLD_NULLIFICATION && vampire.nullified)) && !fullpower) // above 100 nullification vampire powers are useless if(show_message) - to_chat(user, span_warning("Something is blocking your powers!")) + to_chat(user, span_warning("Что-то блокирует ваши силы!")) return FALSE if(vampire.bloodusable < required_blood) if(show_message) - to_chat(user, span_warning("You require at least [required_blood] units of usable blood to do that!")) + to_chat(user, span_warning("Для этого вам потребуется не менее [required_blood] единиц крови!")) return FALSE //chapel check if(is_type_in_typecache(get_area(user), GLOB.holy_areas) && !fullpower) if(show_message) - to_chat(user, span_warning("Your powers are useless on this holy ground.")) + to_chat(user, span_warning("Ваши силы не действуют на этой святой земле.")) return FALSE return TRUE @@ -44,13 +45,13 @@ if(!required_blood || !deduct_blood_on_cast) //don't take the blood yet if this is false! return - var/datum/antagonist/vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/vampire) + var/datum/antagonist/vampire/vampire = user?.mind?.has_antag_datum(/datum/antagonist/vampire) - vampire.bloodusable -= calculate_blood_cost(vampire) + vampire?.bloodusable -= calculate_blood_cost(vampire) /datum/spell_handler/vampire/proc/calculate_blood_cost(datum/antagonist/vampire/vampire) - var/blood_cost_modifier = 1 + vampire.nullified / 100 + var/blood_cost_modifier = 1 + (vampire.nullification == OLD_NULLIFICATION)? 0 : vampire.nullified / 100 var/blood_cost = round(required_blood * blood_cost_modifier) return clamp(blood_cost, 0, vampire.bloodusable) @@ -63,6 +64,9 @@ var/datum/antagonist/vampire/vampire = user?.mind?.has_antag_datum(/datum/antagonist/vampire) if(!vampire) return - to_chat(user, span_boldnotice("You have [vampire.bloodusable] blood left to use.")) + to_chat(user, span_boldnotice("У Вас осталось [vampire.bloodusable] единиц крови.")) SSblackbox.record_feedback("tally", "vampire_powers_used", 1, "[spell]") // Only log abilities which require blood +/datum/spell_handler/vampire/goon/revert_cast(mob/living/carbon/user, obj/effect/proc_holder/spell/spell) + var/datum/antagonist/vampire/vampire = user?.mind?.has_antag_datum(/datum/antagonist/vampire) + vampire?.bloodusable += required_blood diff --git a/code/game/gamemodes/antag_paradise/antag_paradise.dm b/code/game/gamemodes/antag_paradise/antag_paradise.dm index bb3a9932ed1..460ed81b9e1 100644 --- a/code/game/gamemodes/antag_paradise/antag_paradise.dm +++ b/code/game/gamemodes/antag_paradise/antag_paradise.dm @@ -317,7 +317,7 @@ log_and_message_admins("[antag] was not assigned for AI role. Report this to coders.") if(ROLE_VAMPIRE) - antag.add_antag_datum(/datum/antagonist/vampire) + antag.add_antag_datum(/datum/antagonist/vampire/new_vampire) if(ROLE_CHANGELING) antag.add_antag_datum(/datum/antagonist/changeling) if(ROLE_TRAITOR) @@ -330,7 +330,7 @@ for(var/datum/mind/antag as anything in pre_double_antags) switch(pre_double_antags[antag]) if(ROLE_VAMPIRE) - antag.add_antag_datum(/datum/antagonist/vampire) + antag.add_antag_datum(/datum/antagonist/vampire/new_vampire) if(ROLE_CHANGELING) antag.add_antag_datum(/datum/antagonist/changeling) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index b6b6b30af43..4491a7d96be 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -1142,10 +1142,6 @@ GLOBAL_LIST_EMPTY(admin_objective_list) if(vampire && (vampire.bloodtotal >= target_amount)) return TRUE - var/datum/antagonist/goon_vampire/g_vampire = player.has_antag_datum(/datum/antagonist/goon_vampire) - if(g_vampire && (g_vampire.bloodtotal >= target_amount)) - return TRUE - return FALSE diff --git a/code/game/gamemodes/vampire/goon_vampire.dm b/code/game/gamemodes/vampire/goon_vampire.dm index d39f65d8312..ca50b58ccb3 100644 --- a/code/game/gamemodes/vampire/goon_vampire.dm +++ b/code/game/gamemodes/vampire/goon_vampire.dm @@ -55,7 +55,7 @@ /datum/game_mode/goon_vampire/post_setup() for(var/datum/mind/vampire in pre_vampires) - vampire.add_antag_datum(/datum/antagonist/goon_vampire) + vampire.add_antag_datum(/datum/antagonist/vampire/goon_vampire) ..() diff --git a/code/game/gamemodes/vampire/thief_vamp.dm b/code/game/gamemodes/vampire/thief_vamp.dm index 0c8f25e4f93..b34b71c112a 100644 --- a/code/game/gamemodes/vampire/thief_vamp.dm +++ b/code/game/gamemodes/vampire/thief_vamp.dm @@ -36,5 +36,5 @@ /datum/game_mode/thief/vampire/post_setup() for(var/datum/mind/vampire in pre_vampires) - vampire.add_antag_datum(/datum/antagonist/vampire) + vampire.add_antag_datum(/datum/antagonist/vampire/new_vampire) ..() diff --git a/code/game/gamemodes/vampire/traitor_vamp.dm b/code/game/gamemodes/vampire/traitor_vamp.dm index 702b07eb55c..2dc3afd4555 100644 --- a/code/game/gamemodes/vampire/traitor_vamp.dm +++ b/code/game/gamemodes/vampire/traitor_vamp.dm @@ -39,6 +39,6 @@ /datum/game_mode/traitor/vampire/post_setup() for(var/datum/mind/vampire in pre_vampires) - vampire.add_antag_datum(/datum/antagonist/vampire) + vampire.add_antag_datum(/datum/antagonist/vampire/new_vampire) ..() diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index f90cd323620..0434e246cac 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -51,7 +51,7 @@ /datum/game_mode/vampire/post_setup() for(var/datum/mind/vampire in pre_vampires) - vampire.add_antag_datum(/datum/antagonist/vampire) + vampire.add_antag_datum(/datum/antagonist/vampire/new_vampire) ..() diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 7174ca0b6e2..5b845bc62bd 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -49,13 +49,13 @@ var/datum/antagonist/vampire/vamp = target.mind?.has_antag_datum(/datum/antagonist/vampire) if(ishuman(user) && vamp && !vamp.get_ability(/datum/vampire_passive/full) && user.mind.isholy) to_chat(target, span_warning("The nullrod's power interferes with your own!")) - vamp.adjust_nullification(30 + sanctify_force, 15 + sanctify_force) - return . + switch(vamp.nullification) + if(OLD_NULLIFICATION) + vamp.base_nullification() - var/datum/antagonist/goon_vampire/g_vamp = target.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(ishuman(user) && g_vamp && !g_vamp.get_ability(/datum/goon_vampire_passive/full)) - to_chat(target, span_warning("The nullrod's power interferes with your own!")) - g_vamp.nullified = max(5, g_vamp.nullified + 2) + if(NEW_NULLIFICATION) + vamp.adjust_nullification(30 + sanctify_force, 15 + sanctify_force) + return . /obj/item/nullrod/pickup(mob/living/user) @@ -553,6 +553,7 @@ ) praying = TRUE + if(!do_after(user, 15 SECONDS, target)) to_chat(user, span_notice("Your prayer to [SSticker.Bible_deity_name] was interrupted.")) praying = FALSE @@ -567,18 +568,16 @@ SSticker.mode.remove_clocker(target.mind) praying = FALSE return .|ATTACK_CHAIN_SUCCESS - + var/datum/antagonist/vampire/vamp = target.mind?.has_antag_datum(/datum/antagonist/vampire) if(vamp && !vamp.get_ability(/datum/vampire_passive/full)) // Getting a full prayer off on a vampire will interrupt their powers for a large duration. - vamp.adjust_nullification(120, 50) - to_chat(target, span_userdanger("[user]'s prayer to [SSticker.Bible_deity_name] has interfered with your power!")) - praying = FALSE - return .|ATTACK_CHAIN_SUCCESS + switch(vamp.nullification) + if(OLD_NULLIFICATION) + vamp.adjust_nullification(120, 120) - var/datum/antagonist/goon_vampire/g_vamp = target.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(g_vamp && !g_vamp.get_ability(/datum/goon_vampire_passive/full)) - g_vamp.nullified = max(120, g_vamp.nullified + 120) - to_chat(target, span_userdanger("[user]'s prayer to [SSticker.Bible_deity_name] has interfered with your power!")) + if(NEW_NULLIFICATION) + vamp.adjust_nullification(120, 50) + to_chat(target, "[user]'s prayer to [SSticker.Bible_deity_name] has interfered with your power!") praying = FALSE return .|ATTACK_CHAIN_SUCCESS @@ -603,15 +602,13 @@ var/mob/living/carbon/human/holder = loc if(!holder.l_hand == src && !holder.r_hand == src) // Holding this in your hand will return - for(var/mob/living/carbon/human/target in range(5, loc)) - var/datum/antagonist/goon_vampire/g_vamp = target.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(g_vamp && !g_vamp.get_ability(/datum/goon_vampire_passive/full)) - g_vamp.nullified = max(5, g_vamp.nullified + 2) + var/datum/antagonist/vampire/vamp = target.mind?.has_antag_datum(/datum/antagonist/vampire) + if(vamp && vamp.nullification == OLD_NULLIFICATION && !vamp.get_ability(/datum/vampire_passive/full)) + vamp.adjust_nullification(5, 2) if(prob(10)) to_chat(target, "Being in the presence of [holder]'s [src] is interfering with your powers!") - /obj/item/nullrod/salt name = "Holy Salt" icon = 'icons/obj/food/containers.dmi' diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index f6e0edaad4c..57389b8bd81 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -730,10 +730,6 @@ GLOBAL_VAR_INIT(nologevent, 0) antag_list += "Changeling" if(M.mind in SSticker.mode.abductors) antag_list += "Abductor" - if(M.mind.has_antag_datum(/datum/antagonist/goon_vampire)) - antag_list += "Goon Vampire" - if(M.mind.has_antag_datum(/datum/antagonist/mindslave/goon_thrall)) - antag_list += "Goon Vampire Thrall" if(M.mind.has_antag_datum(/datum/antagonist/vampire)) antag_list += "Vampire" if(M.mind.has_antag_datum(/datum/antagonist/mindslave/thrall)) diff --git a/code/modules/antagonists/goon_vampire/goon_vampire_datum.dm b/code/modules/antagonists/goon_vampire/goon_vampire_datum.dm deleted file mode 100644 index c57d2b19822..00000000000 --- a/code/modules/antagonists/goon_vampire/goon_vampire_datum.dm +++ /dev/null @@ -1,357 +0,0 @@ -/datum/antagonist/goon_vampire - name = "Goon-Vampire" - antag_hud_type = ANTAG_HUD_VAMPIRE - antag_hud_name = "hudvampire" - special_role = SPECIAL_ROLE_VAMPIRE - /// Total blood drained by vampire over round. - var/bloodtotal = 0 - /// Current amount of blood. - var/bloodusable = 0 - /// Handles the vampire cloak toggle. - var/iscloaking = FALSE - /// List of available powers and passives. - var/list/powers = list() - /// Who the vampire is draining of blood. - var/mob/living/carbon/human/draining - /// Nullrod makes them useless for a short while. - var/nullified = 0 - /// List of the peoples UIDs that we have drained, and how much blood from each one. - var/list/drained_humans = list() - /// A list of powers that vampires unlock. - var/list/upgrade_tiers = list( - /obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate = 0, - /obj/effect/proc_holder/spell/goon_vampire/targetted/hypnotise = 0, - /obj/effect/proc_holder/spell/goon_vampire/glare = 0, - /datum/goon_vampire_passive/vision = 100, - /obj/effect/proc_holder/spell/goon_vampire/self/shapeshift = 100, - /obj/effect/proc_holder/spell/goon_vampire/self/cloak = 150, - /obj/effect/proc_holder/spell/goon_vampire/targetted/disease = 150, - /obj/effect/proc_holder/spell/goon_vampire/bats = 200, - /obj/effect/proc_holder/spell/goon_vampire/self/screech = 200, - /datum/goon_vampire_passive/regen = 200, - /obj/effect/proc_holder/spell/goon_vampire/shadowstep = 250, - /obj/effect/proc_holder/spell/goon_vampire/self/jaunt = 300, - /obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall = 300, - /datum/goon_vampire_passive/full = 500) - - -/datum/antagonist/goon_vampire/Destroy(force) - owner.current.create_log(CONVERSION_LOG, "De-goon-vampired") - draining = null - return ..() - - -/datum/antagonist/goon_vampire/add_owner_to_gamemode() - SSticker.mode.goon_vampires += owner - - -/datum/antagonist/goon_vampire/remove_owner_from_gamemode() - SSticker.mode.goon_vampires -= owner - - -/datum/antagonist/goon_vampire/greet() - var/dat - SEND_SOUND(owner.current, 'sound/ambience/antag/vampalert.ogg') - dat = "Вы — вампир!
" - dat += {"Чтобы укусить кого-то, нацельтесь в голову, выберите намерение вреда (4) и ударьте пустой рукой. Пейте кровь, чтобы получать новые силы.
Вы уязвимы перед святостью и звёздным светом. Не выходите в космос, избегайте священника, церкви и, особенно, святой воды."} - to_chat(owner.current, dat) - - -/datum/antagonist/goon_vampire/farewell() - if(issilicon(owner.current)) - to_chat(owner.current, span_userdanger("Вы превратились в робота! Вы чувствуете как вампирские силы исчезают…")) - else - to_chat(owner.current, span_userdanger("Ваш разум очищен! Вы больше не вампир.")) - - -/datum/antagonist/goon_vampire/give_objectives() - add_objective(/datum/objective/blood) - add_objective(/datum/objective/maroon) - add_objective(/datum/objective/steal) - - if(prob(20)) // 20% chance of getting survive. 80% chance of getting escape. - add_objective(/datum/objective/survive) - else - add_objective(/datum/objective/escape) - - -/datum/antagonist/goon_vampire/apply_innate_effects(mob/living/mob_override) - mob_override = ..() - if(!owner.som) //thralls and mindslaves - owner.som = new() - owner.som.masters += owner - - mob_override.dna.species.hunger_type = "vampire" - mob_override.dna.species.hunger_icon = 'icons/mob/screen_hunger_vampire.dmi' - check_vampire_upgrade(FALSE) - - -/datum/antagonist/goon_vampire/remove_innate_effects(mob/living/mob_override) - mob_override = ..() - remove_all_powers() - var/datum/hud/hud = mob_override.hud_used - if(hud?.vampire_blood_display) - hud.remove_vampire_hud() - mob_override.dna.species.hunger_type = initial(mob_override.dna.species.hunger_type) - mob_override.dna.species.hunger_icon = initial(mob_override.dna.species.hunger_icon) - animate(mob_override, alpha = 255) - - if(mob_override.mind.som) - var/datum/mindslaves/slaved = mob_override.mind.som - slaved.masters -= mob_override.mind - slaved.serv -= mob_override.mind - slaved.leave_serv_hud(mob_override.mind) - mob_override.mind.som = null - - -/datum/antagonist/goon_vampire/proc/handle_vampire() - if(owner.current.hud_used) - var/datum/hud/hud = owner.current.hud_used - if(!hud.vampire_blood_display) - hud.vampire_blood_display = new /atom/movable/screen() - hud.vampire_blood_display.name = "Доступная кровь" - hud.vampire_blood_display.icon_state = "blood_display" - hud.vampire_blood_display.screen_loc = "WEST:6,CENTER-1:15" - hud.static_inventory += hud.vampire_blood_display - hud.show_hud(hud.hud_version) - hud.vampire_blood_display.maptext = "
[bloodusable]
" - - handle_vampire_cloak() - - if(isspaceturf(get_turf(owner.current))) - check_sun() - - if(is_type_in_typecache(get_area(owner.current), GLOB.holy_areas) && !get_ability(/datum/goon_vampire_passive/full)) - vamp_burn(7) - - nullified = max(0, nullified - 1) - - -/datum/antagonist/goon_vampire/proc/handle_vampire_cloak() - if(!ishuman(owner.current)) - animate(owner.current, time = 5, alpha = 255) - return - var/turf/simulated/T = get_turf(owner.current) - var/light_available = T.get_lumcount(0.5) * 10 - - if(!istype(T)) - return - - if(!iscloaking || owner.current.on_fire) - animate(owner.current, time = 5, alpha = 255) - return - - if(light_available <= 2) - animate(owner.current, time = 5, alpha = 38) // round(255 * 0.15) - return - - animate(owner.current, time = 5, alpha = 204) // 255 * 0.80 - - -/datum/antagonist/goon_vampire/proc/vamp_burn(burn_chance) - if(prob(burn_chance) && owner.current.health >= 50) - switch(owner.current.health) - if(75 to 100) - to_chat(owner.current, span_warning("Ваша кожа дымится…")) - if(50 to 75) - to_chat(owner.current, span_warning("Ваша кожа шипит!")) - owner.current.adjustFireLoss(3) - else if(owner.current.health < 50) - if(!owner.current.on_fire) - to_chat(owner.current, span_danger("Ваша кожа загорается!")) - owner.current.emote("scream") - else - to_chat(owner.current, span_danger("Вы продолжаете гореть!")) - owner.current.adjust_fire_stacks(5) - owner.current.IgniteMob() - - -/datum/antagonist/goon_vampire/proc/check_sun() - var/ax = owner.current.x - var/ay = owner.current.y - - for(var/i = 1 to 20) - ax += SSsun.dx - ay += SSsun.dy - - var/turf/T = locate(round(ax, 0.5), round(ay, 0.5), owner.current.z) - - if(!T) - return - - if(T.x == 1 || T.x == world.maxx || T.y == 1 || T.y == world.maxy) - break - - if(T.density) - return - if(bloodusable >= 10) //burn through your blood to tank the light for a little while - to_chat(owner.current, span_warning("Свет звёзд жжётся и истощает ваши силы!")) - bloodusable -= 10 - vamp_burn(10) - else //You're in trouble, get out of the sun NOW - to_chat(owner.current, span_userdanger("Ваше тело обугливается, превращаясь в пепел! Укройтесь от звёздного света!")) - owner.current.adjustCloneLoss(10) //I'm melting! - vamp_burn(85) - - -/datum/antagonist/goon_vampire/proc/remove_all_powers() - for(var/power in powers) - remove_ability(power) - - -/datum/antagonist/goon_vampire/proc/check_vampire_upgrade(announce = TRUE) - var/list/old_powers = powers.Copy() - - for(var/ptype in upgrade_tiers) - var/level = upgrade_tiers[ptype] - if(bloodtotal >= level) - var/obj/effect/proc_holder/spell/goon_vampire/spell = add_ability(ptype) - if(spell) - for(var/datum/action/spell_action/action in owner.current.actions) - action.UpdateButtonIcon() - - if(announce) - announce_new_power(old_powers) - - -/datum/antagonist/goon_vampire/proc/announce_new_power(list/old_powers) - for(var/p in powers) - if(!(p in old_powers)) - if(istype(p, /obj/effect/proc_holder/spell/goon_vampire)) - var/obj/effect/proc_holder/spell/goon_vampire/power = p - to_chat(owner.current, span_boldnotice("[power.gain_desc]")) - else if(istype(p, /datum/goon_vampire_passive)) - var/datum/goon_vampire_passive/power = p - to_chat(owner.current, span_boldnotice("[power.gain_desc]")) - - -/datum/antagonist/goon_vampire/proc/get_ability(path) - for(var/datum/power as anything in powers) - if(power.type == path) - return power - return null - - -/datum/antagonist/goon_vampire/proc/add_ability(path) - if(!get_ability(path)) - return force_add_ability(path) - - -/datum/antagonist/goon_vampire/proc/force_add_ability(path) - var/spell = new path(owner) - if(istype(spell, /obj/effect/proc_holder/spell)) - owner.AddSpell(spell) - - powers += spell - owner.current.update_sight() - return spell - - -/datum/antagonist/goon_vampire/proc/remove_ability(ability) - if(ability && (ability in powers)) - powers -= ability - if(istype(ability, /obj/effect/proc_holder/spell)) - owner.RemoveSpell(ability) - else if(istype(ability, /datum/goon_vampire_passive)) - qdel(ability) - owner.current.update_sight() - - -/datum/antagonist/goon_vampire/proc/handle_bloodsucking(mob/living/carbon/human/H) - draining = H - var/unique_suck_id = H.UID() - var/blood = 0 - var/blood_limit_exceeded = FALSE - var/old_bloodtotal = 0 //used to see if we increased our blood total - var/old_bloodusable = 0 //used to see if we increased our blood usable - var/blood_volume_warning = 9999 //Blood volume threshold for warnings - if(owner.current.is_muzzled()) - var/mob/living/carbon/mask_owner = owner - to_chat(owner.current, span_warning("[mask_owner.wear_mask] мешает вам укусить [H]!")) - draining = null - return - add_attack_logs(owner.current, H, "vampirebit & is draining their blood.", ATKLOG_ALMOSTALL) - owner.current.visible_message(span_danger("[owner.current] грубо хватает шею [H] и вонзает в неё клыки!"), \ - span_danger("Вы вонзаете клыки в шею [H] и начинаете высасывать [genderize_ru(H.gender, "его", "её", "его", "их")] кровь."), \ - span_italics("Вы слышите тихий звук прокола и влажные хлюпающие звуки.")) - if(!iscarbon(owner.current)) - H.LAssailant = null - else - H.LAssailant = owner.current - while(do_after(owner.current, 5 SECONDS, H, NONE, interaction_key = DOAFTER_SOURCE_VAMPIRE_SUCKING, max_interact_count = 1)) - if(!isvampire(owner)) - to_chat(owner.current, span_userdanger("Ваши клыки исчезают!")) - return - old_bloodtotal = bloodtotal - old_bloodusable = bloodusable - if(unique_suck_id in drained_humans) - if(drained_humans[unique_suck_id] >= BLOOD_DRAIN_LIMIT) - to_chat(owner.current, span_warning("Вы поглотили всю жизненную эссенцию [H], дальнейшее питьё крови будет только утолять голод")) - blood_limit_exceeded = TRUE - - if(H.stat < DEAD) - if(H.ckey || H.player_ghosted) //Requires ckey regardless if monkey or humanoid, or the body has been ghosted before it died - blood = min(20, H.blood_volume) / 2 // if they have less than 20 blood, give them the remnant else they get 20 blood - if(!blood_limit_exceeded) - bloodtotal += blood //divide by 2 to counted the double suction since removing cloneloss -Melandor0 - bloodusable += blood - else - if(H.ckey || H.player_ghosted) - blood = min(10, H.blood_volume) / 2 // The dead only give 5 blood - if(!blood_limit_exceeded) - bloodtotal += blood - - if(old_bloodtotal != bloodtotal) - if(H.ckey || H.player_ghosted) // Requires ckey regardless if monkey or human, and has not ghosted, otherwise no power - to_chat(owner.current, span_boldnotice("Вы накопили [bloodtotal] единиц[declension_ru(bloodtotal, "у", "ы", "")] крови[bloodusable != old_bloodusable ? ", и теперь вам доступно [bloodusable] единиц[declension_ru(bloodusable, "а", "ы", "")] крови" : ""].")) - - check_vampire_upgrade() - H.blood_volume = max(H.blood_volume - 25, 0) - if(!(unique_suck_id in drained_humans)) - drained_humans[unique_suck_id] = 0 - - if(drained_humans[unique_suck_id] < BLOOD_DRAIN_LIMIT) - drained_humans[unique_suck_id] += blood - - //Blood level warnings (Code 'borrowed' from Fulp) - if(H.blood_volume) - if(H.blood_volume <= BLOOD_VOLUME_BAD && blood_volume_warning > BLOOD_VOLUME_BAD) - to_chat(owner.current, span_danger("У вашей жертвы остаётся опасно мало крови!")) - else if(H.blood_volume <= BLOOD_VOLUME_OKAY && blood_volume_warning > BLOOD_VOLUME_OKAY) - to_chat(owner.current, span_warning("У вашей жертвы остаётся тревожно мало крови.")) - blood_volume_warning = H.blood_volume //Set to blood volume, so that you only get the message once - else - to_chat(owner.current, span_warning("Вы выпили свою жертву досуха!")) - break - - if(ishuman(owner.current)) - var/mob/living/carbon/human/V = owner.current - if(!H.ckey && !H.player_ghosted)//Only runs if there is no ckey and the body has not being ghosted while alive - to_chat(V, span_boldnotice("Питьё крови у [H] насыщает вас, но доступной крови от этого вы не получаете.")) - V.set_nutrition(min(NUTRITION_LEVEL_WELL_FED, V.nutrition + 5)) - else - V.set_nutrition(min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2))) - - draining = null - to_chat(owner.current, span_notice("Вы прекращаете пить кровь [H.name].")) - - -/datum/antagonist/goon_vampire/vv_edit_var(var_name, var_value) - . = ..() - check_vampire_upgrade(TRUE) - - -/datum/antagonist/mindslave/goon_thrall - name = "Vampire Thrall" - antag_hud_type = ANTAG_HUD_VAMPIRE - antag_hud_name = "vampthrall" - master_hud_icon = "vampire" - - -/datum/antagonist/mindslave/goon_thrall/add_owner_to_gamemode() - SSticker.mode.goon_vampire_enthralled += owner - - -/datum/antagonist/mindslave/goon_thrall/remove_owner_from_gamemode() - SSticker.mode.goon_vampire_enthralled -= owner - diff --git a/code/modules/antagonists/space_ninja/ninja_datum.dm b/code/modules/antagonists/space_ninja/ninja_datum.dm index 1d5db66cfbe..f205a635cbd 100644 --- a/code/modules/antagonists/space_ninja/ninja_datum.dm +++ b/code/modules/antagonists/space_ninja/ninja_datum.dm @@ -392,7 +392,7 @@ /datum/antagonist/ninja/proc/generate_vampires() for(var/datum/mind/vampire in pre_antags) - vampire.add_antag_datum(/datum/antagonist/vampire) + vampire.add_antag_datum(/datum/antagonist/vampire/new_vampire) /datum/antagonist/ninja/proc/generate_changelings() diff --git a/code/modules/antagonists/vampire/goon_vampire_datum.dm b/code/modules/antagonists/vampire/goon_vampire_datum.dm new file mode 100644 index 00000000000..e63a76373b0 --- /dev/null +++ b/code/modules/antagonists/vampire/goon_vampire_datum.dm @@ -0,0 +1,57 @@ +/datum/antagonist/vampire/goon_vampire + name = "Goon-Vampire" + nullification = OLD_NULLIFICATION + is_garlic_affected = TRUE + dust_in_space = FALSE + antag_datum_blacklist = list(/datum/antagonist/vampire/new_vampire) + upgrade_tiers = list( + /obj/effect/proc_holder/spell/vampire/goon/self/rejuvenate = 0, + /obj/effect/proc_holder/spell/vampire/goon/targetted/hypnotise = 0, + /obj/effect/proc_holder/spell/vampire/goon/glare = 0, + /datum/vampire_passive/vision = 100, + /obj/effect/proc_holder/spell/vampire/goon/self/shapeshift = 100, + /obj/effect/proc_holder/spell/vampire/goon/self/cloak = 150, + /obj/effect/proc_holder/spell/vampire/goon/targetted/disease = 150, + /obj/effect/proc_holder/spell/vampire/goon/bats = 200, + /obj/effect/proc_holder/spell/vampire/goon/self/screech = 200, + /datum/vampire_passive/regen = 200, + /obj/effect/proc_holder/spell/vampire/goon/shadowstep = 250, + /obj/effect/proc_holder/spell/vampire/goon/self/jaunt = 300, + /obj/effect/proc_holder/spell/vampire/goon/targetted/enthrall = 300, + /datum/vampire_passive/xray = 500, + /datum/vampire_passive/full = 500) + + +/datum/antagonist/vampire/goon_vampire/add_owner_to_gamemode() + SSticker.mode.goon_vampires += owner + + +/datum/antagonist/vampire/goon_vampire/remove_owner_from_gamemode() + SSticker.mode.goon_vampires -= owner + + + +/datum/antagonist/mindslave/thrall/goon_thrall/add_owner_to_gamemode() + SSticker.mode.goon_vampire_enthralled += owner + + +/datum/antagonist/mindslave/thrall/goon_thrall/remove_owner_from_gamemode() + SSticker.mode.goon_vampire_enthralled -= owner + + +/proc/is_goon_vampire(datum/source) + if(!source) + return FALSE + + if(istype(source, /datum/mind)) + var/datum/mind/our_mind = source + return our_mind.has_antag_datum(/datum/antagonist/vampire/goon_vampire) + + if(!ismob(source)) + return FALSE + + var/mob/mind_holder = source + if(!mind_holder.mind) + return FALSE + + return mind_holder.mind.has_antag_datum(/datum/antagonist/vampire/goon_vampire) diff --git a/code/modules/antagonists/vampire/new_vampire_datum.dm b/code/modules/antagonists/vampire/new_vampire_datum.dm new file mode 100644 index 00000000000..6722d570807 --- /dev/null +++ b/code/modules/antagonists/vampire/new_vampire_datum.dm @@ -0,0 +1,37 @@ +/datum/antagonist/vampire/new_vampire + name = "Vampire" + nullification = NEW_NULLIFICATION + is_garlic_affected = FALSE + dust_in_space = TRUE + antag_datum_blacklist = list(/datum/antagonist/vampire/goon_vampire) + upgrade_tiers = list(/obj/effect/proc_holder/spell/vampire/self/rejuvenate = 0, + /obj/effect/proc_holder/spell/vampire/glare = 0, + /datum/vampire_passive/vision = 100, + /obj/effect/proc_holder/spell/vampire/self/specialize = 150, + /datum/vampire_passive/regen = 200) + +/datum/antagonist/vampire/new_vampire/add_owner_to_gamemode() + SSticker.mode.vampires += owner + + +/datum/antagonist/vampire/new_vampire/remove_owner_from_gamemode() + SSticker.mode.vampires -= owner + +/datum/antagonist/mindslave/thrall/new_thrall/add_owner_to_gamemode() + SSticker.mode.vampire_enthralled += owner + + +/datum/antagonist/mindslave/thrall/new_thrall/remove_owner_from_gamemode() + SSticker.mode.vampire_enthralled -= owner + +/datum/antagonist/mindslave/thrall/new_thrall/remove_innate_effects(mob/living/mob_override) + var/mob/living/user = ..() + if(!mob_override) + user.mind?.RemoveSpell(/obj/effect/proc_holder/spell/vampire/thrall_commune) + return user + +/datum/antagonist/mindslave/thrall/new_thrall/apply_innate_effects(mob/living/mob_override) + var/mob/living/user = ..() + if(!mob_override) + user.mind?.AddSpell(new /obj/effect/proc_holder/spell/vampire/thrall_commune) + return user diff --git a/code/modules/antagonists/vampire/vampire_datum.dm b/code/modules/antagonists/vampire/vampire_datum.dm index 08366021988..0a62c74c6bf 100644 --- a/code/modules/antagonists/vampire/vampire_datum.dm +++ b/code/modules/antagonists/vampire/vampire_datum.dm @@ -6,12 +6,16 @@ special_role = SPECIAL_ROLE_VAMPIRE wiki_page_name = "Vampire" russian_wiki_name = "Вампир" + /// Total blood drained by vampire over round. var/bloodtotal = 0 + /// Current amount of blood. var/bloodusable = 0 /// What vampire subclass the vampire is. var/datum/vampire_subclass/subclass /// Handles the vampire cloak toggle. var/iscloaking = FALSE + /// Handles the goon vampire cloak toggle. + var/is_goon_cloak = FALSE /// List of available powers and passives. var/list/powers = list() /// Who the vampire is draining of blood. @@ -20,12 +24,14 @@ var/nullified = 0 /// Time between each suck iteration. var/suck_rate = 5 SECONDS + /// Indicates the type of nullification (old or new) + var/nullification = NEW_NULLIFICATION + /// Does garlic affect vampire? + var/is_garlic_affected = FALSE + /// Does a vampire turn to dust after dying from space? + var/dust_in_space = FALSE /// List of powers that all vampires unlock and at what blood level they unlock them, the rest of their powers are found in the vampire_subclass datum. - var/list/upgrade_tiers = list(/obj/effect/proc_holder/spell/vampire/self/rejuvenate = 0, - /obj/effect/proc_holder/spell/vampire/glare = 0, - /datum/vampire_passive/vision = 100, - /obj/effect/proc_holder/spell/vampire/self/specialize = 150, - /datum/vampire_passive/regen = 200) + var/list/upgrade_tiers = list() /// List of the peoples UIDs that we have drained, and how much blood from each one. var/list/drained_humans = list() @@ -53,18 +59,17 @@ /datum/antagonist/vampire/greet() var/list/messages = list() SEND_SOUND(owner.current, sound('sound/ambience/antag/vampalert.ogg')) - messages.Add("You are a Vampire!
") - messages.Add("To bite someone, target the head and use harm intent with an empty hand. Drink blood to gain new powers. \ - You are weak to holy things, starlight and fire. Don't go into space and avoid the Chaplain, the chapel and especially Holy Water.") + messages.Add("Вы — вампир!
") + messages.Add("Чтобы укусить кого-то, нацельтесь в голову, выберите намерение вреда (4) и ударьте пустой рукой. Пейте кровь, чтобы получать новые силы. \ + Вы уязвимы перед святостью, огнем и звёздным светом. Не выходите в космос, избегайте священника, церкви и, особенно, святой воды.") return messages /datum/antagonist/vampire/farewell() if(issilicon(owner.current)) - to_chat(owner.current, span_userdanger("Being a robot you fill how your vampiric powers fade away...")) + to_chat(owner.current, span_userdanger("Вы превратились в робота! Вы чувствуете как вампирские силы исчезают…")) else - to_chat(owner.current, span_userdanger("Your mind is cleansed. You are no longer a vampire.")) - + to_chat(owner.current, span_userdanger("Ваш разум очищен! Вы больше не вампир.")) /datum/antagonist/vampire/give_objectives() add_objective(/datum/objective/blood) @@ -77,14 +82,6 @@ add_objective(/datum/objective/escape) -/datum/antagonist/vampire/add_owner_to_gamemode() - SSticker.mode.vampires += owner - - -/datum/antagonist/vampire/remove_owner_from_gamemode() - SSticker.mode.vampires -= owner - - /datum/antagonist/vampire/on_body_transfer(mob/living/old_body, mob/living/new_body) if(isvampireanimal(new_body)) remove_innate_effects(old_body, transformation = TRUE) @@ -106,6 +103,13 @@ user.faction |= ROLE_VAMPIRE user.dna?.species?.hunger_type = "vampire" user.dna?.species?.hunger_icon = 'icons/mob/screen_hunger_vampire.dmi' + //goon vampire slaves code + //if(mob_override.mind.som) + //var/datum/mindslaves/slaved = mob_override.mind.som + //slaved.masters -= mob_override.mind + //slaved.serv -= mob_override.mind + //slaved.leave_serv_hud(mob_override.mind) + //.mind.som = null /datum/antagonist/vampire/remove_innate_effects(mob/living/mob_override, transformation = FALSE) @@ -199,6 +203,8 @@ var/time_per_action var/vampire_dir = get_dir(owner.current, target) + var/old_bloodusable = 0 //used to see if we increased our blood usable + var/suck_rate_final if(suck_rate_override) suck_rate_final = suck_rate_override @@ -206,7 +212,7 @@ suck_rate_final = suck_rate if(owner.current.is_muzzled()) - to_chat(owner.current, span_warning("[owner.current.wear_mask] prevents you from biting [target]!")) + to_chat(owner.current, span_warning("[owner.current.wear_mask] мешает вам укусить [target]!")) draining = null return @@ -233,31 +239,31 @@ while(do_after(owner.current, time_per_action, target, NONE, interaction_key = DOAFTER_SOURCE_VAMPIRE_SUCKING, max_interact_count = 1)) cycle_counter++ owner.current.face_atom(target) - + old_bloodusable = bloodusable switch(cycle_counter) if(STATE_CLOSING_IN) - owner.current.visible_message(span_danger("[owner.current] gets closer to [target]"), \ - span_danger("You getting closer to [target]")) + owner.current.visible_message(span_danger("[owner.current] приближается к [target]"), \ + span_danger("Вы приближаетесь к [target]")) getting_closer_animation(target, STATE_CLOSING_IN, vampire_dir) time_per_action = suck_rate_final*GRABBING_TIME_MOD continue if(STATE_GRABBING) - owner.current.visible_message(span_danger("[owner.current] grabs [target]'s neck harshly"), \ - span_danger("You grabs [target]'s neck harshly")) + owner.current.visible_message(span_danger("[owner.current] грубо хватает шею [target]"), \ + span_danger("Вы грубо хватает шею [target]")) getting_closer_animation(target, STATE_GRABBING, vampire_dir) time_per_action = suck_rate_final*BITE_TIME_MOD continue if(STATE_BITE) - owner.current.visible_message(span_danger("[owner.current] sinks in [owner.current.p_their()] fangs!"), \ - span_danger("You sink your fangs into [target] and begin to drain [target.p_their()] blood."), \ - span_italics("You hear a soft puncture and a wet sucking noise.")) + owner.current.visible_message(span_danger("[owner.current] вонзает [genderize_ru(owner.current.gender, "его", "её", "его", "их")] клыки!"), \ + span_danger("Вы вонзаете клыки в шею [target] и начинаете высасывать [genderize_ru(target.gender, "его", "её", "его", "их")] кровь."), \ + span_italics("Вы слышите тихий звук прокола и влажные хлюпающие звуки.")) bite_animation(target, vampire_dir) time_per_action = suck_rate_final continue if(unique_suck_id in drained_humans) if(drained_humans[unique_suck_id] >= BLOOD_DRAIN_LIMIT) - to_chat(owner.current, span_warning("You have drained most of the life force from [target]'s blood, and you will get no more useable blood from them!")) + to_chat(owner.current, span_warning("Вы поглотили всю жизненную эссенцию [target], дальнейшее питьё крови будет только утолять голод!")) target.blood_volume = max(target.blood_volume - 25, 0) owner.current.set_nutrition(min(NUTRITION_LEVEL_WELL_FED, owner.current.nutrition + 5)) continue @@ -267,25 +273,25 @@ if(target.ckey || target.player_ghosted) //Requires ckey regardless if monkey or humanoid, or the body has been ghosted before it died blood = min(20, target.blood_volume) adjust_blood(target, blood * BLOOD_GAINED_MODIFIER) - to_chat(owner.current, span_boldnotice("You have accumulated [bloodtotal] unit\s of blood, and have [bloodusable] left to use.")) + to_chat(owner.current, span_boldnotice("Вы накопили [bloodtotal] единиц[declension_ru(bloodtotal, "у", "ы", "")] крови[bloodusable != old_bloodusable ? ", и теперь вам доступно [bloodusable] единиц[declension_ru(bloodusable, "а", "ы", "")] крови" : ""].")) target.blood_volume = max(target.blood_volume - 25, 0) //Blood level warnings (Code 'borrowed' from Fulp) if(target.blood_volume) if(target.blood_volume <= BLOOD_VOLUME_BAD && blood_volume_warning > BLOOD_VOLUME_BAD) - to_chat(owner.current, span_danger("Your victim's blood volume is dangerously low.")) + to_chat(owner.current, span_danger("У вашей жертвы остаётся опасно мало крови!")) else if(target.blood_volume <= BLOOD_VOLUME_OKAY && blood_volume_warning > BLOOD_VOLUME_OKAY) - to_chat(owner.current, span_warning("Your victim's blood is at an unsafe level.")) + to_chat(owner.current, span_warning("У вашей жертвы остаётся тревожно мало крови!")) blood_volume_warning = target.blood_volume //Set to blood volume, so that you only get the message once else - to_chat(owner.current, span_warning("You have bled your victim dry!")) + to_chat(owner.current, span_warning("Вы выпили свою жертву досуха!")) break if(!target.ckey && !target.player_ghosted)//Only runs if there is no ckey and the body has not being ghosted while alive - to_chat(owner.current, span_boldnotice("Feeding on [target] reduces your thirst, but you get no usable blood from them.")) + to_chat(owner.current, span_boldnotice("Питьё крови у [target] насыщает вас, но доступной крови от этого вы не получаете.")) owner.current.set_nutrition(min(NUTRITION_LEVEL_WELL_FED, owner.current.nutrition + 5)) else @@ -340,7 +346,7 @@ /datum/antagonist/vampire/proc/stop_sucking() if(draining) - to_chat(owner.current, span_notice("You stop draining [draining.name] of blood.")) + to_chat(owner.current, span_notice("Вы прекращаете пить кровь [draining.name].")) draining = null owner.current.pixel_x = owner.current.base_pixel_x + owner.current.body_position_pixel_x_offset owner.current.pixel_y = owner.current.base_pixel_y + owner.current.body_position_pixel_y_offset @@ -369,7 +375,6 @@ var/datum/vampire_passive/passive = spell passive.owner = owner.current passive.on_apply(src) - powers += spell owner.current.update_sight() // Life updates conditionally, so we need to update sight here in case the vamp gets new vision based on his powers. Maybe one day refactor to be more OOP and on the vampire's ability datum. return spell @@ -416,6 +421,8 @@ add_ability(ptype) if(!subclass) + if(announce) + announce_new_power(old_powers) return subclass.add_subclass_ability(src) @@ -467,15 +474,15 @@ return if(bloodusable >= 10) //burn through your blood to tank the light for a little while - to_chat(owner.current, span_warning("The starlight saps your strength!")) + to_chat(owner.current, span_warning("Свет звёзд жжётся и истощает ваши силы!")) bloodusable -= 10 vamp_burn(10) else //You're in trouble, get out of the sun NOW - to_chat(owner.current, span_userdanger("Your body is turning to ash, get out of the light now!")) + to_chat(owner.current, span_userdanger("Ваше тело обугливается, превращаясь в пепел! Укройтесь от звёздного света!")) owner.current.adjustCloneLoss(10) //I'm melting! vamp_burn(85) - if(owner.current.cloneloss >= 100) + if(owner.current.cloneloss >= 100 && dust_in_space) owner.current.dust() @@ -485,11 +492,11 @@ var/half_health = round(owner.current.maxHealth / 2) if(prob(burn_chance) && owner.current.health >= half_health) - to_chat(owner.current, span_warning("You feel incredible heat!")) + to_chat(owner.current, span_warning("Вы чувствуете нестерпимый жар!")) owner.current.adjustFireLoss(3) else if(owner.current.health < half_health) - to_chat(owner.current, span_warning("You are melting!")) + to_chat(owner.current, span_warning("Вы плавитесь!")) owner.current.adjustFireLoss(8) return @@ -497,17 +504,17 @@ if(prob(burn_chance) && owner.current.health >= 50) switch(owner.current.health) if(75 to 100) - to_chat(owner.current, span_warning("Your skin flakes away...")) + to_chat(owner.current, span_warning("Ваша кожа дымится…")) if(50 to 75) - to_chat(owner.current, span_warning("Your skin sizzles!")) + to_chat(owner.current, span_warning("Ваша кожа шипит!")) owner.current.adjustFireLoss(3) else if(owner.current.health < 50) if(!owner.current.on_fire) - to_chat(owner.current, span_danger("Your skin catches fire!")) + to_chat(owner.current, span_danger("Ваша кожа загорается!")) owner.current.emote("scream") else - to_chat(owner.current, span_danger("You continue to burn!")) + to_chat(owner.current, span_danger("Вы продолжаете гореть!")) owner.current.adjust_fire_stacks(5) owner.current.IgniteMob() @@ -521,8 +528,12 @@ if(is_type_in_typecache(get_area(owner.current), GLOB.holy_areas) && !get_ability(/datum/vampire_passive/full) && bloodtotal > 0) vamp_burn(7) + switch(nullification) + if(OLD_NULLIFICATION) + nullified = max(0, nullified - 1) - nullified = max(0, nullified - 2) + if(NEW_NULLIFICATION) + nullified = max(0, nullified - 2) /datum/antagonist/vampire/proc/draw_HUD() @@ -532,7 +543,7 @@ if(!hud.vampire_blood_display) hud.vampire_blood_display = new /atom/movable/screen() - hud.vampire_blood_display.name = "Usable Blood" + hud.vampire_blood_display.name = "Доступная кровь" hud.vampire_blood_display.icon_state = "blood_display" hud.vampire_blood_display.screen_loc = "WEST:6,CENTER-1:15" hud.static_inventory += hud.vampire_blood_display @@ -545,21 +556,21 @@ animate(owner.current, time = 5, alpha = 255) return var/turf/simulated/owner_turf = get_turf(owner.current) - var/light_available = owner_turf.get_lumcount() * 10 + var/light_available = ((iscloaking)?owner_turf.get_lumcount():owner_turf.get_lumcount(0.5)) * 10 if(!istype(owner_turf)) return - if(!iscloaking || owner.current.on_fire) + if(!iscloaking && !is_goon_cloak || owner.current.on_fire) animate(owner.current, time = 5, alpha = 255) owner.current.remove_movespeed_modifier(/datum/movespeed_modifier/vampire_cloak) return if(light_available <= 2) - animate(owner.current, time = 5, alpha = 38) // round(255 * 0.15) - owner.current.add_movespeed_modifier(/datum/movespeed_modifier/vampire_cloak) + animate(owner.current, time = 5, alpha = 38) + if(iscloaking) + owner.current.add_movespeed_modifier(/datum/movespeed_modifier/vampire_cloak) return - owner.current.remove_movespeed_modifier(/datum/movespeed_modifier/vampire_cloak) animate(owner.current, time = 5, alpha = 204) // 255 * 0.80 @@ -576,7 +587,21 @@ /datum/antagonist/vampire/proc/adjust_nullification(base, extra) // First hit should give full nullification, while subsequent hits increase the value slower - nullified = clamp(nullified + extra, base, VAMPIRE_NULLIFICATION_CAP) + switch(nullification) + if(OLD_NULLIFICATION) + nullified = max(base, nullified + extra) + + if(NEW_NULLIFICATION) + nullified = clamp(nullified + extra, base, VAMPIRE_NULLIFICATION_CAP) + + +/datum/antagonist/vampire/proc/base_nullification() + switch(nullification) + if(OLD_NULLIFICATION) + adjust_nullification(5, 2) + + if(NEW_NULLIFICATION) + adjust_nullification(20, 4) /** @@ -588,7 +613,7 @@ if(istype(source, /datum/mind)) var/datum/mind/our_mind = source - return our_mind.has_antag_datum(/datum/antagonist/vampire) || our_mind.has_antag_datum(/datum/antagonist/goon_vampire) + return our_mind.has_antag_datum(/datum/antagonist/vampire) if(!ismob(source)) return FALSE @@ -597,7 +622,7 @@ if(!mind_holder.mind) return FALSE - return mind_holder.mind.has_antag_datum(/datum/antagonist/vampire) || mind_holder.mind.has_antag_datum(/datum/antagonist/goon_vampire) + return mind_holder.mind.has_antag_datum(/datum/antagonist/vampire) /** @@ -609,7 +634,7 @@ if(istype(source, /datum/mind)) var/datum/mind/our_mind = source - return our_mind.has_antag_datum(/datum/antagonist/mindslave/thrall) || our_mind.has_antag_datum(/datum/antagonist/mindslave/goon_thrall) + return our_mind.has_antag_datum(/datum/antagonist/mindslave/thrall) if(!isliving(source)) return FALSE @@ -618,7 +643,7 @@ if(!mind_holder.mind) return FALSE - return mind_holder.mind.has_antag_datum(/datum/antagonist/mindslave/thrall) || mind_holder.mind.has_antag_datum(/datum/antagonist/mindslave/goon_thrall) + return mind_holder.mind.has_antag_datum(/datum/antagonist/mindslave/thrall) /datum/antagonist/mindslave/thrall @@ -627,25 +652,23 @@ antag_hud_name = "vampthrall" master_hud_icon = "vampire" +/datum/antagonist/mindslave/thrall/greet() + var/greet_text = "Вы были очарованы [master.current.real_name]. Следуйте каждому [genderize_ru(master.current.gender, "его", "её", "его", "их")] приказу." + return span_dangerbigger(greet_text) -/datum/antagonist/mindslave/thrall/add_owner_to_gamemode() - SSticker.mode.vampire_enthralled += owner - - -/datum/antagonist/mindslave/thrall/remove_owner_from_gamemode() - SSticker.mode.vampire_enthralled -= owner - +/datum/antagonist/mindslave/thrall/farewell() + if(issilicon(owner.current)) + to_chat(owner.current, span_userdanger("Вы превратились в робота! Вы больше не очарованы…")) + else + to_chat(owner.current, span_userdanger("Ваш разум очищен! Вы больше не очарованы.")) /datum/antagonist/mindslave/thrall/apply_innate_effects(mob/living/mob_override) var/mob/living/user = ..() user.faction |= ROLE_VAMPIRE - if(!mob_override) - user.mind?.AddSpell(new /obj/effect/proc_holder/spell/vampire/thrall_commune) + return user /datum/antagonist/mindslave/thrall/remove_innate_effects(mob/living/mob_override) var/mob/living/user = ..() user.faction -= ROLE_VAMPIRE - if(!mob_override) - user.mind?.RemoveSpell(/obj/effect/proc_holder/spell/vampire/thrall_commune) - + return user diff --git a/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm b/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm index 423bcb0968f..50e9edf132b 100644 --- a/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/dantalion_powers.dm @@ -81,8 +81,7 @@ if(!istype(H)) return FALSE - var/greet_text = "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command." - H.mind.add_antag_datum(new /datum/antagonist/mindslave/thrall(user.mind, greet_text)) + H.mind.add_antag_datum(new /datum/antagonist/mindslave/thrall/new_thrall(user.mind)) if(jobban_isbanned(H, ROLE_VAMPIRE)) SSticker.mode.replace_jobbanned_player(H, SPECIAL_ROLE_VAMPIRE_THRALL) H.Stun(4 SECONDS) diff --git a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm b/code/modules/antagonists/vampire/vampire_powers/goon_vampire_powers.dm similarity index 73% rename from code/modules/antagonists/goon_vampire/goon_vampire_powers.dm rename to code/modules/antagonists/vampire/vampire_powers/goon_vampire_powers.dm index aa80d124da2..f4fd1721bff 100644 --- a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/goon_vampire_powers.dm @@ -1,133 +1,41 @@ -/** - * Goon Vampire spell handler. - */ -/datum/spell_handler/goon_vampire - var/required_blood - - -/datum/spell_handler/goon_vampire/can_cast(mob/user, charge_check, show_message, obj/effect/proc_holder/spell/spell) - - var/datum/antagonist/goon_vampire/vampire = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - - if(!vampire) - return FALSE - - var/fullpower = vampire.get_ability(/datum/goon_vampire_passive/full) - - if(user.stat >= DEAD) - if(show_message) - to_chat(user, span_warning("Но вы же мертвы!")) - return FALSE - - if(vampire.nullified && !fullpower) - if(show_message) - to_chat(user, span_warning("Что-то блокирует ваши силы!")) - return FALSE - - if(vampire.bloodusable < required_blood) - if(show_message) - to_chat(user, span_warning("Для этого вам потребуется не менее [required_blood] единиц крови!")) - return FALSE - - //chapel check - if(is_type_in_typecache(get_area(user), GLOB.holy_areas) && !fullpower) - if(show_message) - to_chat(user, span_warning("Ваши силы не действуют на этой святой земле.")) - return FALSE - - return TRUE - - -/datum/spell_handler/goon_vampire/spend_spell_cost(mob/user, obj/effect/proc_holder/spell/spell) - for(var/datum/action/spell_action/action in user.actions) - action.UpdateButtonIcon() - - if(!required_blood) //don't take the blood yet if this is false! - return - - var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - vamp?.bloodusable -= required_blood - - -/datum/spell_handler/goon_vampire/revert_cast(mob/living/carbon/user, obj/effect/proc_holder/spell/spell) - var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - vamp?.bloodusable += required_blood - - -/datum/spell_handler/goon_vampire/after_cast(list/targets, mob/user, obj/effect/proc_holder/spell/spell) - - SSblackbox.record_feedback("tally", "goon_vampire_powers_used", 1, "[spell]") - - if(!required_blood) - return - - var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - to_chat(user, span_boldnotice("У Вас осталось [vamp.bloodusable] единиц крови.")) - - -/******************* - * Spell handler end. - ******************/ - - /** * Basis of all vampire spells. */ -/obj/effect/proc_holder/spell/goon_vampire - name = "Report Me" - desc = "You shouldn't see this!" - school = "vampire" +/obj/effect/proc_holder/spell/vampire/goon action_background_icon_state = "bg_vampire_old" - human_req = TRUE - clothes_req = FALSE base_cooldown = 3 MINUTES gain_desc = "" - /// How much blood this ability costs to use - var/required_blood -/obj/effect/proc_holder/spell/goon_vampire/after_spell_init() - update_name() - - -/obj/effect/proc_holder/spell/goon_vampire/update_name(updates = ALL, mob/user) - . = ..() - if(required_blood) - var/new_name = "[name] ([required_blood])" - name = new_name - action?.name = new_name - action?.UpdateButtonIcon() - - -/obj/effect/proc_holder/spell/goon_vampire/create_new_handler() - var/datum/spell_handler/goon_vampire/H = new() +/obj/effect/proc_holder/spell/vampire/goon/create_new_handler() + var/datum/spell_handler/vampire/goon/H = new H.required_blood = required_blood return H -/obj/effect/proc_holder/spell/goon_vampire/self/create_new_targeting() +/obj/effect/proc_holder/spell/vampire/goon/self/create_new_targeting() return new /datum/spell_targeting/self -/obj/effect/proc_holder/spell/goon_vampire/targetted +/obj/effect/proc_holder/spell/vampire/goon/targetted var/range = 1 -/obj/effect/proc_holder/spell/goon_vampire/targetted/create_new_targeting() +/obj/effect/proc_holder/spell/vampire/goon/targetted/create_new_targeting() var/datum/spell_targeting/targeted/T = new() T.range = range return T -/obj/effect/proc_holder/spell/goon_vampire/proc/affects(mob/target, mob/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/proc/affects(mob/target, mob/user = usr) //Other vampires aren't affected if(isvampire(target)) return FALSE //Vampires who have reached their full potential can affect nearly everything - var/datum/antagonist/goon_vampire/vampire = user.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(vampire?.get_ability(/datum/goon_vampire_passive/full)) + var/datum/antagonist/vampire/vampire = user.mind?.has_antag_datum(/datum/antagonist/vampire) + if(vampire?.get_ability(/datum/vampire_passive/full)) return TRUE //Holy characters are resistant to vampire powers @@ -139,7 +47,7 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////// -/obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate +/obj/effect/proc_holder/spell/vampire/goon/self/rejuvenate name = "Восстановление" desc= "Используйте накопленную кровь, чтобы влить в тело новые силы, устраняя любое ошеломление" action_icon_state = "vampire_rejuvinate_old" @@ -149,7 +57,7 @@ var/counter = 0 -/obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate/cast(list/targets, mob/living/carbon/human/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/self/rejuvenate/cast(list/targets, mob/living/carbon/human/user = usr) user.SetWeakened(0) user.SetStunned(0) user.SetKnockdown(0) @@ -159,12 +67,12 @@ user.set_resting(FALSE, instant = TRUE) user.get_up(instant = TRUE) to_chat(user, span_notice("Ваше тело наполняется чистой кровью, снимая все ошеломляющие эффекты.")) - var/datum/antagonist/goon_vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/goon_vampire) - if(vampire?.get_ability(/datum/goon_vampire_passive/regen)) + var/datum/antagonist/vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/vampire) + if(vampire?.get_ability(/datum/vampire_passive/regen)) effect_timer = addtimer(CALLBACK(src, PROC_REF(rejuvenate_effect), user), 3.5 SECONDS, TIMER_STOPPABLE|TIMER_LOOP) -/obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate/proc/rejuvenate_effect(mob/living/carbon/human/user) +/obj/effect/proc_holder/spell/vampire/goon/self/rejuvenate/proc/rejuvenate_effect(mob/living/carbon/human/user) if(QDELETED(user) || counter > 5) deltimer(effect_timer) effect_timer = null @@ -179,14 +87,14 @@ user.updatehealth() -/obj/effect/proc_holder/spell/goon_vampire/targetted/hypnotise +/obj/effect/proc_holder/spell/vampire/goon/targetted/hypnotise name = "Гипноз" desc= "Пронзающий взгляд, ошеломляющий жертву на довольно долгое время" action_icon_state = "vampire_hypnotise" required_blood = 25 -/obj/effect/proc_holder/spell/goon_vampire/targetted/hypnotise/cast(list/targets, mob/living/carbon/human/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/targetted/hypnotise/cast(list/targets, mob/living/carbon/human/user = usr) var/mob/living/carbon/human/target = targets[1] user.visible_message(span_warning("Глаза [user] ярко вспыхивают, когда он[genderize_ru(user.gender,"","а","о","и")] пристально смотр[genderize_ru(user.gender,"ит","ит","ит","ят")] в глаза [target].")) @@ -203,7 +111,7 @@ to_chat(user, span_warning("Вы смотрите в никуда.")) -/obj/effect/proc_holder/spell/goon_vampire/targetted/disease +/obj/effect/proc_holder/spell/vampire/goon/targetted/disease name = "Заражающее касание" desc = "Ваше касание инфицирует кровь жертвы, заражая её могильной лихорадкой. Пока лихорадку не вылечат, жертва будет с трудом держаться на ногах, а её кровь будет наполняться токсинами." gain_desc = "Вы получили способность «Заражающее касание». Она позволит вам ослаблять тех, кого вы коснётесь до тех пор, пока их не вылечат." @@ -211,7 +119,7 @@ required_blood = 50 -/obj/effect/proc_holder/spell/goon_vampire/targetted/disease/cast(list/targets, mob/living/carbon/human/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/targetted/disease/cast(list/targets, mob/living/carbon/human/user = usr) var/mob/living/carbon/human/target = targets[1] to_chat(user, span_warning("Вы незаметно инфицируете [target] заражающим касанием.")) @@ -224,7 +132,7 @@ virus.Contract(target) -/obj/effect/proc_holder/spell/goon_vampire/glare +/obj/effect/proc_holder/spell/vampire/goon/glare name = "Вспышка" desc = "Вы сверкаете глазами, ненадолго ошеломляя всех людей вокруг" action_icon_state = "vampire_glare_old" @@ -232,14 +140,14 @@ stat_allowed = UNCONSCIOUS -/obj/effect/proc_holder/spell/goon_vampire/glare/create_new_targeting() +/obj/effect/proc_holder/spell/vampire/goon/glare/create_new_targeting() var/datum/spell_targeting/aoe/T = new() T.range = 1 T.allowed_type = /mob/living/carbon return T -/obj/effect/proc_holder/spell/goon_vampire/glare/cast(list/targets, mob/living/carbon/human/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/glare/cast(list/targets, mob/living/carbon/human/user = usr) if(!length(targets)) revert_cast(user) return @@ -270,7 +178,7 @@ target.apply_status_effect(STATUS_EFFECT_STAMINADOT) -/obj/effect/proc_holder/spell/goon_vampire/self/shapeshift +/obj/effect/proc_holder/spell/vampire/goon/self/shapeshift name = "Превращение" desc = "Изменяет ваше имя и внешность, тратя 50 крови, с откатом в 3 минуты." gain_desc = "Вы получили способность «Превращение», позволяющую навсегда обернуться другим обликом, затратив часть накопленной крови." @@ -278,7 +186,7 @@ required_blood = 50 -/obj/effect/proc_holder/spell/goon_vampire/self/shapeshift/cast(list/targets, mob/living/carbon/human/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/self/shapeshift/cast(list/targets, mob/living/carbon/human/user = usr) user.visible_message(span_warning("[user] transforms!")) scramble(TRUE, user, 100) @@ -292,7 +200,7 @@ user.update_icons() -/obj/effect/proc_holder/spell/goon_vampire/self/screech +/obj/effect/proc_holder/spell/vampire/goon/self/screech name = "Визг рукокрылых" desc = "Невероятно громкий визг, разбивающий стёкла и ошеломляющий окружающих." gain_desc = "Вы получили способность «Визг рукокрылых», в большом радиусе оглушающую всех, кто может слышать, и раскалывающую стёкла." @@ -300,7 +208,7 @@ required_blood = 30 -/obj/effect/proc_holder/spell/goon_vampire/self/screech/cast(list/targets, mob/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/self/screech/cast(list/targets, mob/user = usr) playsound(user.loc, 'sound/effects/creepyshriek.ogg', 100, TRUE) user.visible_message(span_warning("[user] издаёт душераздирающий визг!"), \ @@ -339,7 +247,7 @@ window.deconstruct(FALSE) -/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall +/obj/effect/proc_holder/spell/vampire/goon/targetted/enthrall name = "Порабощение" desc = "Вы используете большую часть своей силы, вынуждая тех, кто ещё никому не служит, служить только вам." gain_desc = "Вы получили способность «Порабощение», которая тратит много крови, но позволяет вам поработить человека, который ещё никому не служит, на случайный период времени." @@ -347,7 +255,7 @@ required_blood = 300 -/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall/cast(list/targets, mob/living/carbon/human/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/targetted/enthrall/cast(list/targets, mob/living/carbon/human/user = usr) var/mob/living/carbon/human/target = targets[1] @@ -369,7 +277,7 @@ -/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall/proc/can_enthrall(mob/living/carbon/human/user, mob/living/carbon/target) +/obj/effect/proc_holder/spell/vampire/goon/targetted/enthrall/proc/can_enthrall(mob/living/carbon/human/user, mob/living/carbon/target) var/enthrall_safe = FALSE for(var/obj/item/implant/mindshield/implant in target) @@ -415,12 +323,11 @@ return TRUE -/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall/proc/handle_enthrall(mob/living/user, mob/living/carbon/human/target) +/obj/effect/proc_holder/spell/vampire/goon/targetted/enthrall/proc/handle_enthrall(mob/living/user, mob/living/carbon/human/target) if(!istype(target)) return FALSE - var/greet_text = "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command." - target.mind.add_antag_datum(new /datum/antagonist/mindslave/goon_thrall(user.mind, greet_text)) + target.mind.add_antag_datum(new /datum/antagonist/mindslave/thrall/goon_thrall(user.mind)) if(jobban_isbanned(target, ROLE_VAMPIRE)) SSticker.mode.replace_jobbanned_player(target, SPECIAL_ROLE_VAMPIRE_THRALL) target.Stun(4 SECONDS) @@ -429,7 +336,7 @@ target.create_log(CONVERSION_LOG, "was vampire enthralled", user) -/obj/effect/proc_holder/spell/goon_vampire/self/cloak +/obj/effect/proc_holder/spell/vampire/goon/self/cloak name = "Покров тьмы" desc = "Переключается, маскируя вас в темноте" gain_desc = "Вы получили способность «Покров тьмы», которая, будучи включённой, делает вас практически невидимым в темноте." @@ -437,29 +344,29 @@ base_cooldown = 1 SECONDS -/obj/effect/proc_holder/spell/goon_vampire/self/cloak/update_name(updates = ALL, mob/user) +/obj/effect/proc_holder/spell/vampire/goon/self/cloak/update_name(updates = ALL, mob/user) . = ..() - var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) + var/datum/antagonist/vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/vampire) if(!vamp) return - var/new_name = "[initial(name)] ([vamp.iscloaking ? "Выключить" : "Включить"])" + var/new_name = "[initial(name)] ([vamp.is_goon_cloak ? "Выключить" : "Включить"])" name = new_name action?.name = new_name action?.UpdateButtonIcon() -/obj/effect/proc_holder/spell/goon_vampire/self/cloak/cast(list/targets, mob/living/carbon/human/user = usr) - var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) +/obj/effect/proc_holder/spell/vampire/goon/self/cloak/cast(list/targets, mob/living/carbon/human/user = usr) + var/datum/antagonist/vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/vampire) if(!vamp) return - vamp.iscloaking = !vamp.iscloaking + vamp.is_goon_cloak = !vamp.is_goon_cloak update_name(user = user) - to_chat(user, span_notice("Теперь вас будет [vamp.iscloaking ? "не видно" : "видно"] в темноте.")) + to_chat(user, span_notice("Теперь вас будет [vamp.is_goon_cloak ? "не видно" : "видно"] в темноте.")) -/obj/effect/proc_holder/spell/goon_vampire/bats +/obj/effect/proc_holder/spell/vampire/goon/bats name = "Дети ночи" desc = "Вы вызываете пару космолетучих мышей, которые будут биться насмерть со всеми вокруг" gain_desc = "Вы получили способность «Дети ночи», призывающую летучих мышей." @@ -469,7 +376,7 @@ var/num_bats = 2 -/obj/effect/proc_holder/spell/goon_vampire/bats/create_new_targeting() +/obj/effect/proc_holder/spell/vampire/goon/bats/create_new_targeting() var/datum/spell_targeting/aoe/turf/T = new() T.selection_type = SPELL_SELECTION_RANGE T.use_turf_of_user = TRUE @@ -477,7 +384,7 @@ return T -/obj/effect/proc_holder/spell/goon_vampire/bats/valid_target(turf/target, user) +/obj/effect/proc_holder/spell/vampire/goon/bats/valid_target(turf/target, user) if(target.density) return FALSE @@ -488,7 +395,7 @@ return TRUE -/obj/effect/proc_holder/spell/goon_vampire/bats/cast(list/targets, mob/living/carbon/human/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/bats/cast(list/targets, mob/living/carbon/human/user = usr) if(length(targets) < num_bats) revert_cast(user) return @@ -499,7 +406,7 @@ new /mob/living/simple_animal/hostile/scarybat(target_turf, user) -/obj/effect/proc_holder/spell/goon_vampire/self/jaunt +/obj/effect/proc_holder/spell/vampire/goon/self/jaunt name = "Облик тумана" desc = "Вы на короткое время превращаетесь в облако тумана" gain_desc = "Вы получили способность «Облик тумана», которая позволит вам превращаться в облако тумана и проходить сквозь любые препятствия." @@ -510,7 +417,7 @@ var/jaunt_duration = 5 SECONDS //in deciseconds -/obj/effect/proc_holder/spell/goon_vampire/self/jaunt/cast(list/targets, mob/living/carbon/human/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/self/jaunt/cast(list/targets, mob/living/carbon/human/user = usr) spawn(0) var/turf/originalloc = get_turf(user.loc) var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt(originalloc) @@ -568,7 +475,7 @@ // Blink for vamps // Less smoke spam. -/obj/effect/proc_holder/spell/goon_vampire/shadowstep +/obj/effect/proc_holder/spell/vampire/goon/shadowstep name = "Шаг в тень" desc = "Растворитесь в тенях" gain_desc = "Вы получили способность «Шаг в тень», позволяющую вам, затратив часть крови, оказаться в ближайшей доступной тени." @@ -585,7 +492,7 @@ var/max_lum = 1 -/obj/effect/proc_holder/spell/goon_vampire/shadowstep/create_new_targeting() +/obj/effect/proc_holder/spell/vampire/goon/shadowstep/create_new_targeting() var/datum/spell_targeting/aoe/turf/T = new() T.selection_type = SPELL_SELECTION_RANGE T.use_turf_of_user = TRUE @@ -593,7 +500,7 @@ return T -/obj/effect/proc_holder/spell/goon_vampire/shadowstep/valid_target(turf/target, user) +/obj/effect/proc_holder/spell/vampire/goon/shadowstep/valid_target(turf/target, user) if(target in range(user, inner_tele_radius)) return FALSE @@ -617,7 +524,7 @@ return TRUE -/obj/effect/proc_holder/spell/goon_vampire/shadowstep/cast(list/targets, mob/living/carbon/human/user = usr) +/obj/effect/proc_holder/spell/vampire/goon/shadowstep/cast(list/targets, mob/living/carbon/human/user = usr) if(!length(targets)) revert_cast(user) to_chat(user, span_warning("Поблизости нет теней, куда можно было бы шагнуть.")) @@ -639,25 +546,3 @@ spawn(1 SECONDS) qdel(animation) - -/datum/goon_vampire_passive - var/gain_desc - - -/datum/goon_vampire_passive/New() - ..() - if(!gain_desc) - gain_desc = "Вы получили способность «[src]»." - - -/datum/goon_vampire_passive/regen - gain_desc = "Ваша способность «Восстановление» улучшена. Теперь она будет постепенно исцелять вас после использования." - - -/datum/goon_vampire_passive/vision - gain_desc = "Ваше вампирское зрение улучшено." - - -/datum/goon_vampire_passive/full - gain_desc = "Вы достигли полной силы и ничто святое больше не может ослабить вас. Ваше зрение значительно улучшилось." - diff --git a/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm b/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm index 77bd4796ec8..96381501944 100644 --- a/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm @@ -23,7 +23,7 @@ /datum/vampire_passive/New() ..() if(!gain_desc) - gain_desc = "You can now use [src]." + gain_desc = "Вы получили способность «[src]»." /datum/vampire_passive/Destroy(force) @@ -36,18 +36,20 @@ /datum/vampire_passive/regen - gain_desc = "Your rejuvenation abilities have improved and will now heal you over time when used." + gain_desc = "Ваша способность «Восстановление» улучшена. Теперь она будет постепенно исцелять вас после использования." /datum/vampire_passive/vision - gain_desc = "Your vampiric vision has improved." + gain_desc = "Ваше вампирское зрение улучшено." /datum/vampire_passive/full - gain_desc = "You have reached your full potential. You are no longer weak to the effects of anything holy and your vision has improved greatly." + gain_desc = "Вы достигли полной силы и ничто святое больше не может ослабить вас. Ваше зрение значительно улучшилось." /obj/effect/proc_holder/spell/vampire + name = "Report Me" + desc = "You shouldn't see this!" school = "vampire" action_background_icon_state = "bg_vampire" human_req = TRUE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 291ded8c744..277b30a69ae 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -236,13 +236,8 @@ var/datum/antagonist/vampire/vamp = mind.has_antag_datum(/datum/antagonist/vampire) if(vamp) - status_tab_data[++status_tab_data.len] = list("Total Blood:", "[vamp.bloodtotal]") - status_tab_data[++status_tab_data.len] = list("Usable Blood:", "[vamp.bloodusable]") - - var/datum/antagonist/goon_vampire/g_vamp = mind.has_antag_datum(/datum/antagonist/goon_vampire) - if(g_vamp) - status_tab_data[++status_tab_data.len] = list("Всего крови", "[g_vamp.bloodtotal]") - status_tab_data[++status_tab_data.len] = list("Доступная кровь", "[g_vamp.bloodusable]") + status_tab_data[++status_tab_data.len] = list("Всего крови:", "[vamp.bloodtotal]") + status_tab_data[++status_tab_data.len] = list("Доступная кровь:", "[vamp.bloodusable]") if(isclocker(mind.current)) status_tab_data[++status_tab_data.len] = list("Total Power", "[GLOB.clockwork_power]") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d06fc0bab36..a51162383aa 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -39,12 +39,6 @@ if(vamp && life_tick == 1) regenerate_icons() // Make sure the inventory updates - var/datum/antagonist/goon_vampire/g_vamp = mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(g_vamp) - g_vamp.handle_vampire() - if(life_tick == 1) - regenerate_icons() - var/datum/antagonist/ninja/ninja = mind?.has_antag_datum(/datum/antagonist/ninja) if(ninja) ninja.handle_ninja() diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index eb8a3eca47b..8e9fc491f78 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -489,36 +489,19 @@ var/datum/antagonist/vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/vampire) if(vamp && !vamp.draining && user.zone_selected == BODY_ZONE_HEAD && target != user) if(HAS_TRAIT(target, TRAIT_NO_BLOOD) || HAS_TRAIT(target, TRAIT_EXOTIC_BLOOD) || !target.blood_volume) - to_chat(user, "They have no blood!") + to_chat(user, span_warning("Отсутствует кровь!")) return if(target.mind && (target.mind.has_antag_datum(/datum/antagonist/vampire) || target.mind.has_antag_datum(/datum/antagonist/mindslave/thrall))) - to_chat(user, "Your fangs fail to pierce [target.name]'s cold flesh") + to_chat(user, span_warning("[pluralize_ru(user.gender,"Твои","Ваши")] клыки не могут пронзить холодную плоть [target.declent_ru(GENITIVE)].")) return if(HAS_TRAIT(target, TRAIT_SKELETON)) - to_chat(user, "There is no blood in a skeleton!") + to_chat(user, span_warning("В скелете нет ни капли крови!")) return //we're good to suck the blood, blaah vamp.handle_bloodsucking(target) add_attack_logs(user, target, "vampirebit") return - //Goon Vampire Dupe code - var/datum/antagonist/goon_vampire/g_vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(g_vamp && !g_vamp.draining && user.zone_selected == BODY_ZONE_HEAD && target != user) - if(HAS_TRAIT(target, TRAIT_NO_BLOOD) || HAS_TRAIT(target, TRAIT_EXOTIC_BLOOD) || !target.blood_volume) - to_chat(user, "Отсутствует кровь!") - return - if(target.mind?.has_antag_datum(/datum/antagonist/goon_vampire)) - to_chat(user, "[pluralize_ru(user.gender,"Твои","Ваши")] клыки не могут пронзить холодную плоть [target.declent_ru(GENITIVE)].") - return - if(HAS_TRAIT(target, TRAIT_SKELETON)) - to_chat(user, "В скелете нет ни капли крови!") - return - g_vamp.handle_bloodsucking(target) - add_attack_logs(user, target, "vampirebit") - return - //end vampire codes - var/message = "[target.declent_ru(NOMINATIVE)] блокиру[pluralize_ru(target.gender,"ет","ют")] атаку [user.declent_ru(GENITIVE)]!" if(target.check_martial_art_defense(target, user, null, message)) return FALSE @@ -1083,15 +1066,6 @@ It'll return null if the organ doesn't correspond, so include null checks when u H.nightvision += 1 // base of 2, 2+1 is 3 H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - var/datum/antagonist/goon_vampire/g_vamp = H.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(g_vamp) - if(g_vamp.get_ability(/datum/goon_vampire_passive/full)) - H.add_sight(SEE_TURFS|SEE_MOBS|SEE_OBJS) - H.nightvision = 8 - H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - else if(g_vamp.get_ability(/datum/goon_vampire_passive/vision)) - H.add_sight(SEE_MOBS) - H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE for(var/obj/item/organ/internal/cyberimp/eyes/cyber_eyes in H.internal_organs) H.add_sight(cyber_eyes.vision_flags) diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 8bf2778b0b5..a28c3fe0840 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -7,7 +7,6 @@ mind.remove_antag_datum(/datum/antagonist/ninja) mind.remove_antag_datum(/datum/antagonist/changeling) mind.remove_antag_datum(/datum/antagonist/vampire) - mind.remove_antag_datum(/datum/antagonist/goon_vampire) mind.remove_antag_datum(/datum/antagonist/thief) SSticker.mode.remove_thrall(mind, 0) SSticker.mode.remove_shadowling(mind) diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index c37d3bd0217..5af02464a3a 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -480,8 +480,8 @@ var/update_flags = STATUS_UPDATE_NONE if(ishuman(M)) var/mob/living/carbon/human/H = M - var/datum/antagonist/goon_vampire/g_vamp = H.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(g_vamp && !g_vamp.get_ability(/datum/goon_vampire_passive/full)) //incapacitating but not lethal. + var/datum/antagonist/vampire/vamp = H.mind?.has_antag_datum(/datum/antagonist/vampire) + if(vamp && vamp.is_garlic_affected && !vamp.get_ability(/datum/vampire_passive/full)) //incapacitating but not lethal. if(prob(min(25, current_cycle))) to_chat(H, "You can't get the scent of garlic out of your nose! You can barely think...") H.Weaken(2 SECONDS) diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 54d40c8f4b5..5fd11c8fd4c 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -300,7 +300,6 @@ GLOBAL_LIST_INIT(diseases_carrier_reagents, list( M.AdjustConfused(6 SECONDS) if(isvampirethrall(M)) M.mind.remove_antag_datum(/datum/antagonist/mindslave/thrall) - M.mind.remove_antag_datum(/datum/antagonist/mindslave/goon_thrall) holder.remove_reagent(id, volume) M.visible_message("[M] recoils, their skin flushes with colour, regaining their sense of control!") M.SetJitter(0) @@ -341,22 +340,24 @@ GLOBAL_LIST_INIT(diseases_carrier_reagents, list( update_flags |= M.adjustStaminaLoss(5, FALSE) if(prob(20)) M.emote("scream") - vamp.adjust_nullification(20, 4) + vamp.base_nullification() vamp.bloodusable = max(vamp.bloodusable - 3,0) + var/vomit_stun = (vamp.nullification == OLD_NULLIFICATION)? 8 SECONDS : FALSE if(vamp.bloodusable) - V.vomit(0, TRUE, FALSE) - V.adjustBruteLoss(3) + V.vomit(0, TRUE, vomit_stun) + if(!vomit_stun) + V.adjustBruteLoss(3) else holder.remove_reagent(id, volume) - V.vomit(0, FALSE, FALSE) + V.vomit(0, FALSE, vomit_stun) return else - if(!vamp.bloodtotal) + if(!vamp.bloodtotal && vamp.nullification == NEW_NULLIFICATION) return ..() | update_flags switch(current_cycle) if(1 to 4) to_chat(M, "Something sizzles in your veins!") - vamp.adjust_nullification(20, 4) + vamp.base_nullification() if(5 to 12) to_chat(M, "You feel an intense burning inside of you!") update_flags |= M.adjustFireLoss(1, FALSE) @@ -364,7 +365,7 @@ GLOBAL_LIST_INIT(diseases_carrier_reagents, list( M.Jitter(40 SECONDS) if(prob(20)) M.emote("scream") - vamp.adjust_nullification(20, 4) + vamp.base_nullification() if(13 to INFINITY) M.visible_message("[M] suddenly bursts into flames!", "You suddenly ignite in a holy fire!") @@ -375,49 +376,7 @@ GLOBAL_LIST_INIT(diseases_carrier_reagents, list( M.Jitter(60 SECONDS) if(prob(40)) M.emote("scream") - vamp.adjust_nullification(20, 4) - - var/datum/antagonist/goon_vampire/g_vamp = M.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(ishuman(M) && g_vamp && !g_vamp.get_ability(/datum/goon_vampire_passive/full) && prob(80)) - var/mob/living/carbon/V = M - if(g_vamp.bloodusable) - M.Stuttering(2 SECONDS) - M.Jitter(60 SECONDS) - update_flags |= M.adjustStaminaLoss(5, FALSE) - if(prob(20)) - M.emote("scream") - g_vamp.nullified = max(5, g_vamp.nullified + 2) - g_vamp.bloodusable = max(g_vamp.bloodusable - 3,0) - if(g_vamp.bloodusable) - V.vomit(0,1) - else - holder.remove_reagent(id, volume) - V.vomit(0,0) - return - else - switch(current_cycle) - if(1 to 4) - to_chat(M, "Something sizzles in your veins!") - g_vamp.nullified = max(5, g_vamp.nullified + 2) - if(5 to 12) - to_chat(M, "You feel an intense burning inside of you!") - update_flags |= M.adjustFireLoss(1, FALSE) - M.Stuttering(2 SECONDS) - M.Jitter(40 SECONDS) - if(prob(20)) - M.emote("scream") - g_vamp.nullified = max(5, g_vamp.nullified + 2) - if(13 to INFINITY) - M.visible_message("[M] suddenly bursts into flames!", - "You suddenly ignite in a holy fire!") - M.fire_stacks = min(5,M.fire_stacks + 3) - M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire - update_flags |= M.adjustFireLoss(3, FALSE) //Hence the other damages... ain't I a bastard? - M.Stuttering(2 SECONDS) - M.Jitter(60 SECONDS) - if(prob(40)) - M.emote("scream") - g_vamp.nullified = max(5, g_vamp.nullified + 2) + vamp.base_nullification() if(ishuman(M) && !M.mind?.isholy) switch(current_cycle) @@ -452,19 +411,6 @@ GLOBAL_LIST_INIT(diseases_carrier_reagents, list( to_chat(target, "Something holy interferes with your powers!") vamp.adjust_nullification(5, 2) - var/datum/antagonist/goon_vampire/g_vamp = target.mind.has_antag_datum(/datum/antagonist/goon_vampire) - if(g_vamp && !g_vamp.get_ability(/datum/goon_vampire_passive/full)) - - if(method == REAGENT_TOUCH) - if(target.wear_mask) - to_chat(target, "Your mask protects you from the holy water!") - return - else if(target.head) - to_chat(target, "Your helmet protects you from the holy water!") - return - else - to_chat(target, "Something holy interferes with your powers!") - g_vamp.nullified = max(5, g_vamp.nullified + 2) /datum/reagent/holywater/reaction_turf(turf/simulated/T, volume) diff --git a/paradise.dme b/paradise.dme index f366916ad88..2a5ef4443d5 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1586,8 +1586,6 @@ #include "code\modules\antagonists\changeling\powers\swap_form.dm" #include "code\modules\antagonists\changeling\powers\tiny_prick.dm" #include "code\modules\antagonists\changeling\powers\transform.dm" -#include "code\modules\antagonists\goon_vampire\goon_vampire_datum.dm" -#include "code\modules\antagonists\goon_vampire\goon_vampire_powers.dm" #include "code\modules\antagonists\malf_ai\malf_ai_datum.dm" #include "code\modules\antagonists\space_dragon\action.dm" #include "code\modules\antagonists\space_dragon\carp.dm" @@ -1683,11 +1681,14 @@ #include "code\modules\antagonists\traitor\contractor\items\contractor_pinpointer.dm" #include "code\modules\antagonists\traitor\contractor\items\contractor_uplink.dm" #include "code\modules\antagonists\traitor\contractor\items\extraction_items.dm" +#include "code\modules\antagonists\vampire\goon_vampire_datum.dm" +#include "code\modules\antagonists\vampire\new_vampire_datum.dm" #include "code\modules\antagonists\vampire\vampire_datum.dm" #include "code\modules\antagonists\vampire\vampire_subclasses.dm" #include "code\modules\antagonists\vampire\vampire_powers\bestia_powers.dm" #include "code\modules\antagonists\vampire\vampire_powers\dantalion_powers.dm" #include "code\modules\antagonists\vampire\vampire_powers\gargantua_powers.dm" +#include "code\modules\antagonists\vampire\vampire_powers\goon_vampire_powers.dm" #include "code\modules\antagonists\vampire\vampire_powers\hemomancer_powers.dm" #include "code\modules\antagonists\vampire\vampire_powers\umbrae_powers.dm" #include "code\modules\antagonists\vampire\vampire_powers\vampire_powers.dm"