Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
140 commits
Select commit Hold shift + click to select a range
41f522e
Vampire: The Touchening
Absolucy Mar 4, 2026
f92d9fe
i have been told by tco that it's alright to do balancing with the as…
Absolucy Mar 4, 2026
36baf92
brainwashing refactor so command works better. also proper alert icons
Absolucy Mar 4, 2026
0bc1207
forgot to also do that
Absolucy Mar 4, 2026
9ac89a3
the part where i blow the crafting unit test up
Absolucy Mar 4, 2026
3d3b872
fix typo in comment
Absolucy Mar 4, 2026
3708737
why was that the check
Absolucy Mar 4, 2026
158942e
return of Sol!
Absolucy Mar 5, 2026
2a0f364
dont use keep timing that might be a bad idea
Absolucy Mar 5, 2026
0b5b2a6
im not sadistic enough to make a sol weakness hemophage-vampire deal …
Absolucy Mar 5, 2026
94b7458
do that
Absolucy Mar 5, 2026
5907901
add Voice of Domination
Absolucy Mar 5, 2026
3551762
prefs menu categories
Absolucy Mar 5, 2026
723613f
that doesn't need `RULESET_VARIATION`
Absolucy Mar 5, 2026
1a3343c
some stuff from testing it locally
Absolucy Mar 5, 2026
bff7335
screenshots for the unit test
Absolucy Mar 5, 2026
e7a5448
RUN CI STUPID GITHUB MICROSLOP SHIT
Absolucy Mar 5, 2026
04fda52
this is the part where I beat the github actions servers with a hammer
Absolucy Mar 5, 2026
f20c664
voice of domination tweaks
Absolucy Mar 5, 2026
1ac4d22
update antag info guide
Absolucy Mar 5, 2026
888d746
Rename lairs to havens (more vtm accurate, sounds less edgy tbh)
Absolucy Mar 5, 2026
dcdbc73
make the ui look better
Absolucy Mar 5, 2026
a897a44
remove vassalization objective
Absolucy Mar 5, 2026
2faf61e
make that override properly modular (and make it actually work lol)
Absolucy Mar 5, 2026
6de4515
module documentation!
Absolucy Mar 5, 2026
fa82671
get slime vamp revival working
Absolucy Mar 6, 2026
6874432
properly delete the old HUD elements in `remove_hud_elements`
Absolucy Mar 6, 2026
5a0c33a
Fix a small bug with Voice of Domination displaying the wrong icon in…
Absolucy Mar 6, 2026
ab1610a
remove vars for a thing i never bothered to implement
Absolucy Mar 6, 2026
5f2c810
fix duplicated vars
Absolucy Mar 6, 2026
22b6e9d
sol weakness quirk also plays the warning sounds now
Absolucy Mar 6, 2026
74552fe
use `MESSAGE_TYPE_WARNING` for vamp sol warnings for consistency's sake
Absolucy Mar 6, 2026
c03d283
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Mar 6, 2026
f601efc
touches up some upkeep costs (port of https://github.com/BeeStation/B…
Absolucy Mar 6, 2026
94cbd09
fix that stupid thing that snuck thru somehow
Absolucy Mar 6, 2026
0024cf0
i think i got the tracking arrow working
Absolucy Mar 7, 2026
7ae81f7
give archive of the kindred to the curator
Absolucy Mar 7, 2026
4008296
eh
Absolucy Mar 7, 2026
9e3345c
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Mar 7, 2026
c9cd2fb
slime revival won't progress during Sol (unless the core is in a coffin)
Absolucy Mar 7, 2026
7371306
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Mar 7, 2026
456427a
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Mar 7, 2026
cab5cc1
i mispelled oculis
Absolucy Mar 7, 2026
1bc92ad
fix grammar
Absolucy Mar 7, 2026
79ce8a0
small fix there
Absolucy Mar 7, 2026
eaea4b0
whoopsie daisy!!!
Absolucy Mar 7, 2026
60a1d9b
hm
Absolucy Mar 7, 2026
068849e
fix runtime for picking prince
Absolucy Mar 7, 2026
d86ad98
allow vamps to view exploitables
Absolucy Mar 8, 2026
6681fed
ashtongue causing pwoblems once mowe!
Absolucy Mar 8, 2026
53df4d4
hmmmm i wonder if that was causing issues?
Absolucy Mar 8, 2026
cb31591
little bit of mercy for Distress - it can't knock you into crit. barely.
Absolucy Mar 9, 2026
6ebdfc8
Ensure objectives show up properly for vassals and brainwashed
Absolucy Mar 9, 2026
b965079
OH DEAR GOD THAT'S A CRITICAL BUG
Absolucy Mar 9, 2026
58721c3
actually the sol damage is devastating enough anyways
Absolucy Mar 9, 2026
0dadc7f
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Mar 9, 2026
6dc73d8
prompt for vampires similar to traitors. also, if a midround/latejoin…
Absolucy Mar 9, 2026
3d21f28
change weight and fix roundstart `max_antag_cap`
Absolucy Mar 9, 2026
8ba4b1c
no more torture
Absolucy Mar 9, 2026
3ff3eb9
lower max vassal count
Absolucy Mar 9, 2026
90e7c0f
`selected_bodypart` is unused, whoops
Absolucy Mar 9, 2026
e65cd17
ranks from vassalization no longer increase ur vitae goal for that fo…
Absolucy Mar 9, 2026
c631f5c
blood bolt and blood drain now count as potential masquerade breacher…
Absolucy Mar 9, 2026
1836261
breaking lockers and doors with brawn is also a masq breach
Absolucy Mar 9, 2026
933be08
so triue...
Absolucy Mar 9, 2026
046d656
maybe fix wonkiness with blood drain?
Absolucy Mar 9, 2026
2790a26
just do that lol
Absolucy Mar 9, 2026
e164dd4
actuallly not confident in those yet
Absolucy Mar 9, 2026
563f7e4
Merge branch 'master' into vampires-can-touch-me-anytime-uwu
flleeppyy Mar 9, 2026
c00295f
fix out-of-order dme
Absolucy Mar 9, 2026
2c43226
being in an ash storm now shields from sol
Absolucy Mar 9, 2026
189fb61
mmm
Absolucy Mar 9, 2026
9433641
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Mar 9, 2026
485fbe8
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Mar 10, 2026
4c875ed
adjust vampire midround stuff
Absolucy Mar 10, 2026
e805f61
opfor vampires? why not.
Absolucy Mar 11, 2026
a97a74a
reset limb extra damage
Absolucy Mar 11, 2026
ea86b2f
whatever it'll never be worth it anyways
Absolucy Mar 11, 2026
48c74a9
weight stays same except for midnight sun i guess
Absolucy Mar 11, 2026
97f19d3
thing
Absolucy Mar 11, 2026
42ed374
commented out in a better way imo
Absolucy Mar 11, 2026
97f9933
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Mar 11, 2026
8c332d0
scourge self-objective stuff
Absolucy Mar 11, 2026
72c7a6f
qol code for exactitude to avoid accidentally punching allies in the …
Absolucy Mar 11, 2026
7020690
use `has_ally`
Absolucy Mar 11, 2026
1285dd5
remove guardian check bc holoparas are basic and thus don't count any…
Absolucy Mar 11, 2026
77c5acd
use blood volume helpers
Absolucy Mar 12, 2026
2fd8f31
raise weights
Absolucy Mar 13, 2026
6a83db7
guh? guh.
Absolucy Mar 13, 2026
1f0adf5
fix vassals not getting sol warning messages
Absolucy Mar 13, 2026
b86cc02
vampires and vassals are now desensitized
Absolucy Mar 13, 2026
ec5c72a
everything's gonna be okay... probably...
Absolucy Mar 13, 2026
8263fd2
these should all be hidden.
Absolucy Mar 13, 2026
c841d3b
helper for this
Absolucy Mar 13, 2026
646affa
frenzy logging
Absolucy Mar 13, 2026
0bbd784
make night last 45 mins, sol lasts 3 minutes
Absolucy Mar 13, 2026
c162f84
raise command to 10 characters max
Absolucy Mar 13, 2026
6067c3a
frenzy status effect gets removed if you are un-vampired
Absolucy Mar 13, 2026
5215a67
fix a small whoopsie
Absolucy Mar 13, 2026
c8b01d8
fix for oversized vamps.
Absolucy Mar 13, 2026
6272483
prevent vamps from accidentally getting stuck in their own coffin if …
Absolucy Mar 13, 2026
c30ce9d
safety check
Absolucy Mar 13, 2026
58da978
oopsie daisy
Absolucy Mar 13, 2026
460ee8f
playsound src
Absolucy Mar 13, 2026
0464166
add centcom to sol shielded areas
Absolucy Mar 13, 2026
80848d5
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Mar 13, 2026
bf1bd66
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Mar 13, 2026
5337450
implement negative moodlets for vassals
Absolucy Mar 13, 2026
31afa3e
coffin relaymove
Absolucy Mar 13, 2026
618c64e
oh wait i should just do that.
Absolucy Mar 13, 2026
4cadeee
some jittering if you're away for too long
Absolucy Mar 13, 2026
bfca1d3
remove from client screen too
Absolucy Mar 13, 2026
7bb497f
Revert "remove from client screen too" - that's not the issue anyways…
Absolucy Mar 13, 2026
1c6c2cb
temp fixes for upstream merge
Absolucy Mar 13, 2026
5c40b8c
tm compatibility
Absolucy Mar 14, 2026
6310c0b
fix
Absolucy Mar 14, 2026
ce8169a
maybe?
Absolucy Mar 14, 2026
e45dde7
fix that
Absolucy Mar 14, 2026
171e1c6
rename vampire dynamic rulesets, split between singular vamp and mass…
Absolucy Mar 14, 2026
09e4096
meow
Absolucy Mar 14, 2026
d1f9f18
fix test failure
Absolucy Mar 14, 2026
82e7903
"SNAP OUT OF IT!" *slap*
Absolucy Mar 14, 2026
df1d9e7
use `TRAIT_NOBLOOD` when determining if someone can be succed
Absolucy Mar 15, 2026
550e447
allow blood bolt to open windoors
Absolucy Mar 15, 2026
d69a2b8
no slapping yourself out of it
Absolucy Mar 15, 2026
8e754d1
logging for vampire stuff
Absolucy Mar 15, 2026
702d566
meow
Absolucy Mar 15, 2026
94d94cb
fix that
Absolucy Mar 16, 2026
12b68bd
alright
Absolucy Mar 16, 2026
3db8f47
HOLY SHIT NO
Absolucy Mar 17, 2026
61e7ff9
frenzy stuff
Absolucy Mar 17, 2026
d271cbc
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Jun 8, 2026
12cfc14
hudshit
Absolucy Jun 8, 2026
c0ec5bb
fix the rest of the hud stuff
Absolucy Jun 8, 2026
49641c8
port over a lot of my mrp2 improvements. sol to be removed later.
Absolucy Jun 8, 2026
12cbad3
that files commented out now anyways
Absolucy Jun 8, 2026
9b73cf1
whoopsie daisy i forgot about that
Absolucy Jun 9, 2026
3070d83
rename "Masquerade" ability to "Feign Life"
Absolucy Jun 10, 2026
9ac529e
Merge branch 'master' of https://github.com/Monkestation/OculisStatio…
Absolucy Jun 12, 2026
d71336c
remove Sol.
Absolucy Jun 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions code/__DEFINES/~~oculis_defines/antagonists.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/// Checks if the given mob is a vampire
#define IS_VAMPIRE(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/vampire))
/// Checks if the given mob is a vassal
#define IS_VASSAL(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/vassal))
1 change: 1 addition & 0 deletions code/__DEFINES/~~oculis_defines/crafting.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#define CAT_VAMPIRE "Vampire"
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/// From base of /mob/living/simple_animal/attack_hand() and /mob/living/basic/attack_hand() when petting (non-combat): (mob/living/pet)
#define COMSIG_LIVING_PET_ANIMAL "living_pet_animal"
/// From base of carbon_defense.dm when hugging: (mob/living/carbon/hugged)
#define COMSIG_LIVING_HUG_CARBON "living_hug_carbon"
/// From base of /datum/element/art when appraising art: (atom/art_piece)
#define COMSIG_LIVING_APPRAISE_ART "living_appraise_art"
2 changes: 2 additions & 0 deletions code/__DEFINES/~~oculis_defines/do_afters.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define DOAFTER_SOURCE_ARCHIVE_OF_THE_KINDRED "doafter_archive_of_the_kindred"
#define DOAFTER_SOURCE_PERSUASION_RACK "doafter_persuasion_rack"
1 change: 1 addition & 0 deletions code/__DEFINES/~~oculis_defines/factions.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#define FACTION_VAMPIRE "Vampire"
5 changes: 5 additions & 0 deletions code/__DEFINES/~~oculis_defines/hud.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#define HUD_VAMPIRE_BLOOD "vampire_blood"
#define HUD_VAMPIRE_RANK "vampire_rank"
#define HUD_VAMPIRE_HUMANITY "vampire_humanity"
#define HUD_VAMPIRE_SUNLIGHT "vampire_sunlight"
#define HUD_VASSAL_TRACKER "vassal_tracker"
2 changes: 2 additions & 0 deletions code/__DEFINES/~~oculis_defines/language.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define LANGUAGE_VAMPIRE "vampire"
#define LANGUAGE_VASSAL "vassal"
6 changes: 6 additions & 0 deletions code/__DEFINES/~~oculis_defines/role_preferences.dm
Original file line number Diff line number Diff line change
@@ -1,2 +1,8 @@
#define ROLE_HERETIC_SMUGGLER "Heretic Smuggler"
#define ROLE_FORBIDDENCALLING "Forbidden Calling"

#define ROLE_VAMPIRE "Vampire"
#define ROLE_VAMPIRIC_ACCIDENT "Vampiric Accident"
#define ROLE_VAMPIRE_BREAKOUT "Vampire Breakout"

#define ROLE_VASSAL "Vassal"
2 changes: 2 additions & 0 deletions code/__DEFINES/~~oculis_defines/span.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define span_awe(str) ("<span class='awe'>" + str + "</span>")
#define span_vampire_master(str) ("<span class='vampire_master'>" + str + "</span>")
10 changes: 10 additions & 0 deletions code/__DEFINES/~~oculis_defines/traits/declarations.dm
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,14 @@
#define TRAIT_AMNESTICS "trait_amnestics"
#define TRAIT_MNESTICS "trait_mnestics"

/// Hides TRAIT_GENELESS.
#define TRAIT_FAKEGENES "fakegenes"

/// The user is "vampire aligned" - i.e a vampire or vassal.
/// Basically just check for `HAS_MIND_TRAIT(user, TRAIT_VAMPIRE_ALIGNED)` instead of `IS_VAMPIRE(user) || IS_VASSAL(user)`
#define TRAIT_VAMPIRE_ALIGNED "vampire_aligned"

/// Slimepeople with this trait will not lose limbs from low blood/nutrition.
#define TRAIT_SLIME_NO_CANNIBALIZE "slime_no_cannibalize"

// END TRAIT DEFINES
208 changes: 208 additions & 0 deletions code/__DEFINES/~~oculis_defines/vampires.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
/// Uncomment this to enable testing of Vampire features (such as vassalizing people with a mind instead of a client).
//#define VAMPIRE_TESTING
#if defined(VAMPIRE_TESTING) && defined(CIBUILDING)
#error VAMPIRE_TESTING is enabled, disable this!
#endif
#ifdef TESTING
#define VAMPIRE_TESTING
#endif

// Blood-level defines
/// Determines Vampire regeneration rate
#define BS_BLOOD_VOLUME_MAX_REGEN 700
/// Cost to vassalize someone halfway, in blood. Called twice for full cost.
#define VASSALIZATION_BLOOD_HALF_COST 8
/// Cost to convert someone after successful vassalization, in blood.
#define VASSALIZATION_CONVERSION_COST 50
/// Once blood is this low, will enter a Frenzy
#define FRENZY_THRESHOLD_ENTER 25
/// Once blood is this high, will exit the Frenzy. Intentionally high, we want to kill the person we feed off of
#define FRENZY_THRESHOLD_EXIT 500
/// How much blood drained from the vampire each lifetick
#define VAMPIRE_PASSIVE_BLOOD_DRAIN 0.1
/// The number that incoming levels are divided by when comitting the Amaranth. Example: 2 would divide the victims level by 2, and give that to the diablerist
#define DIABLERIE_DIVISOR 1.5
/// Amount of vitae drunk from another player required to level up.
#define VITAE_GOAL_STANDARD 250

/// Default amount of damage the vampire's punch/kick damage increases with each level.
#define VAMPIRE_UNARMED_DMG_INCREASE_ON_RANKUP 0.5

/// How many starting levels do we want each one to have?
#define VAMPIRE_STARTING_LEVELS 3
/// How many free levels the vampire gets gradually.
#define VAMPIRE_FREE_LEVELS 3
/// Vampire's default stamina resist.
#define VAMPIRE_INHERENT_STAMINA_RESIST 0.75

/// When do we warn them about their low blood?
#define VAMPIRE_LOW_BLOOD_WARNING 300

/// How much blood drained from the vampire each tick during sol
#define VAMPIRE_SOL_BURN 15
/// We don't go below this threshold when in a shielded area during sol
#define VAMPIRE_SOL_SHIELD_THRESHOLD 500

/// Minimum blood required for vampire slimes to auto-revive.
#define SLIME_MIN_REVIVE_BLOOD_THRESHOLD (FRENZY_THRESHOLD_ENTER * 5)
/// How long it takes for a vampire slime to auto-revive, when left alone.
#define SLIME_VAMPIRE_REVIVE_TIME (1.5 MINUTES)
/// How many times faster a slime vampire will revive if their core is being held by a non-vampire/non-ally.
#define SLIME_VAMPIRE_REVIVE_HELD_MULTIPLIER 0.5
/// How many times faster a slime vampire will revive if their core is being held by an ally.
#define SLIME_VAMPIRE_REVIVE_ALLY_MULTIPLIER 1.2
/// How many times faster a slime vampire will revive if their core is in a coffin.
#define SLIME_VAMPIRE_REVIVE_COFFIN_MULTIPLIER 2.5

// vassal defines
/// If someone passes all checks and can be vassalized
#define VASSALIZATION_ALLOWED 0
/// If someone has to accept vassalization
#define VASSALIZATION_DISLOYAL 1
/// If someone is not allowed under any circimstances to become a vassal
#define VASSALIZATION_BANNED 2

/// How long Sol lasts
#define TIME_VAMPIRE_DAY 180 // 3 minutes
/// The grace period inbetween Sol
#define TIME_VAMPIRE_NIGHT 2700 // 45 minutes
/// First audio warning that Sol is coming
#define TIME_VAMPIRE_DAY_WARN_1 90
/// Second audio warning that Sol is coming
#define TIME_VAMPIRE_DAY_WARN_2 30
/// Final audio warning that Sol is coming
#define TIME_VAMPIRE_DAY_WARN_3 15

///How much time Sol can be 'off' by, keeping the time inconsistent.
#define TIME_VAMPIRE_SOL_DELAY 120

// Humanity gains (The actual tracking lists and such are in the datum duh)
// These are supposed to be somewhat nontrivial, to the point of sometimes not being viable.
/// Hugging of separate people
#define HUMANITY_HUGGING_TYPE "hug"

/// Petting of separate animals
#define HUMANITY_PETTING_TYPE "pet"

/// Watching of art
#define HUMANITY_ART_TYPE "art"

#define HUMANITY_GAIN_TYPES list(HUMANITY_HUGGING_TYPE, HUMANITY_PETTING_TYPE, HUMANITY_ART_TYPE)

/// Default Humanity
#define VAMPIRE_DEFAULT_HUMANITY 7

// List of areas that are shielded from sol.
#define VAMPIRE_SOL_SHIELDED list(/area/station/maintenance, /area/station/medical/morgue, /area/station/security/prison, /area/shuttle, /area/centcom)

// Cooldown defines
// Used to prevent spamming vampires
/// Spam prevention for healing messages.
#define VAMPIRE_SPAM_HEALING 15 SECONDS
/// Spam prevention for Sol Masquerade messages.
#define VAMPIRE_SPAM_MASQUERADE 60 SECONDS

/// Spam prevention for Sol messages.
#define VAMPIRE_SPAM_SOL 30 SECONDS

// Clan defines
#define CLAN_BRUJAH "Brujah Clan"
#define CLAN_TOREADOR "Toreador Clan"
#define CLAN_NOSFERATU "Nosferatu Clan"
#define CLAN_TREMERE "Tremere Clan"
#define CLAN_GANGREL "Gangrel Clan"
#define CLAN_VENTRUE "Ventrue Clan"
#define CLAN_MALKAVIAN "Malkavian Clan"
#define CLAN_TZIMISCE "Tzimisce Clan"
#define CLAN_HECATA "Hecata Clan"
#define CLAN_LASOMBRA "Lasombra Clan"

// Power defines
/// This Power can't be used in Torpor
#define BP_CANT_USE_IN_TORPOR (1<<0)
/// This Power can't be used in Frenzy.
#define BP_CANT_USE_IN_FRENZY (1<<1)
/// This Power can't be used with a stake in you
#define BP_CANT_USE_WHILE_STAKED (1<<2)
/// This Power can't be used while incapacitated
#define BP_CANT_USE_WHILE_INCAPACITATED (1<<3)
/// This Power can't be used while unconscious
#define BP_CANT_USE_WHILE_UNCONSCIOUS (1<<4)
/// This Power CAN be used while silver cuffed
#define BP_ALLOW_WHILE_SILVER_CUFFED (1<<5)

/// This is a Default Power that all Vampires get.
#define VAMPIRE_DEFAULT_POWER (1<<1)

/// This Power is a Toggled Power
#define BP_AM_TOGGLE (1<<0)
/// This Power is a Single-Use Power
#define BP_AM_SINGLEUSE (1<<1)
/// This Power has a Static cooldown
#define BP_AM_STATIC_COOLDOWN (1<<2)
/// This Power doesn't cost bloot to run while unconscious
#define BP_AM_COSTLESS_UNCONSCIOUS (1<<3)
/// This Power has a cooldown that is more dynamic than a typical power
#define BP_AM_VERY_DYNAMIC_COOLDOWN (1<<4)

///Called when a Vampire reaches Final Death.
#define COMSIG_VAMPIRE_FINAL_DEATH "vampire_final_death"
///Whether the vampire should not be dusted when arriving Final Death
#define DONT_DUST (1<<0)

// Vampire Signals
/// Called when a Vampire breaks the Masquerade
#define COMSIG_VAMPIRE_BROKE_MASQUERADE "comsig_vampire_broke_masquerade"

// Signals & Defines
/// Sent every Sol tick.
#define COMSIG_SOL_TICK "comsig_sol_tick"
/// Sent every Sol tick while the sun is up.
#define COMSIG_SOL_RISE_TICK "comsig_sol_rise_tick"
/// Sent 90 seconds before Sol begins
#define COMSIG_SOL_NEAR_START "comsig_sol_near_start"
/// Sent at the end of Sol
#define COMSIG_SOL_END "comsig_sol_end"
/// Sent 15 seconds before Sol ends
#define COMSIG_SOL_NEAR_END "comsig_sol_near_end"
/// Sent when a warning for Sol is meant to go out: (danger_level, vampire_warning_message, vassal_warning_message)
#define COMSIG_SOL_WARNING_GIVEN "comsig_sol_warning_given"
/// Sent when tracking humanity gain progress: (type, subject)
#define COMSIG_VAMPIRE_TRACK_HUMANITY_GAIN "comsig_vampire_track_humanity_gain"

#define DANGER_LEVEL_FIRST_WARNING 1
#define DANGER_LEVEL_SECOND_WARNING 2
#define DANGER_LEVEL_THIRD_WARNING 3
#define DANGER_LEVEL_SOL_ROSE 4
#define DANGER_LEVEL_SOL_ENDED 5

/// Called on the mind when a Vampire chooses a clan: (datum/antagonist/vampire, datum/vampire_clan)
#define COMSIG_VAMPIRE_CLAN_CHOSEN "vampire_clan_chosen"

// Clan defines
/// Drinks blood the normal Vampire way.
#define VAMPIRE_DRINK_NORMAL "vampire_drink_normal"
/// Drinks blood but is snobby, refusing to drink from mindless
#define VAMPIRE_DRINK_SNOBBY "vampire_drink_snobby"
// Masquerade ability given at this point or above
#define VAMPIRE_HUMANITY_MASQUERADE_POWER 7

// Traits
/// Falsifies Health analyzer blood levels
#define TRAIT_FEIGN_LIFE "feign_life"
/// For people in the middle of being staked
#define TRAIT_BEINGSTAKED "beingstaked"
/// This vampire is currently in a frenzy,
#define TRAIT_FRENZY "frenzy"
/// This vampire is currently in torpor.
#define TRAIT_TORPOR "torpor"
/// This vampire can tell if another vampire has committed diablere on examine.
#define TRAIT_SEE_DIABLERIE "see_diablerie"

// Trait sources
/// Source trait for all vampire traits
#define TRAIT_VAMPIRE "trait_vampire"

// Macros
#define IS_CURATOR(mob) istype(mob?.mind?.assigned_role, /datum/job/curator)
// #define IS_CURATOR(mob) (IS_CURATOR(mob) || IS_MONSTERHUNTER(mob))
15 changes: 15 additions & 0 deletions code/__HELPERS/~~oculis_helpers/view.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//Returns an in proportion scaled out view, with zoom_amt extra tiles on the y axis.
/proc/get_zoomed_view(view, zoom_amt)
var/view_x
var/view_y
if(IS_FINITE(view))
return view + zoom_amt
else
var/list/viewrangelist = splittext(view, "x")
view_x = text2num(viewrangelist[1])
view_y = text2num(viewrangelist[2])
var/proportion = view_x / view_x
view_x += zoom_amt * proportion
view_y += zoom_amt
//God, I hate that we have to round this.
return "[round(view_x, 1)]x[round(view_y, 1)]"
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
add_fingerprint(user)

//no scanning if its a husk or DNA-less Species
if (!HAS_TRAIT(interacting_with, TRAIT_GENELESS) && !HAS_TRAIT(interacting_with, TRAIT_BADDNA))
if ((!HAS_TRAIT(interacting_with, TRAIT_GENELESS) || HAS_TRAIT(interacting_with, TRAIT_FAKEGENES)) && !HAS_TRAIT(interacting_with, TRAIT_BADDNA)) // OCULIS EDIT CHANGE - VAMPIRES - ORIGINAL: if (!HAS_TRAIT(interacting_with, TRAIT_GENELESS) && !HAS_TRAIT(interacting_with, TRAIT_BADDNA))
user.visible_message(span_notice("[user] analyzes [interacting_with]'s genetic sequence."))
balloon_alert(user, "sequence analyzed")
playsound(user, 'sound/items/healthanalyzer.ogg', 50) // close enough
Expand Down
5 changes: 5 additions & 0 deletions code/modules/admin/sql_ban_system.dm
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,11 @@
ROLE_BORER,
ROLE_ASSAULT_OPERATIVE,
// NOVA EDIT ADDITION END
// OCULIS EDIT ADDITION START - VAMPIRES
ROLE_VAMPIRE,
ROLE_VAMPIRIC_ACCIDENT,
ROLE_VAMPIRE_BREAKOUT,
// OCULIS EDIT ADDITION END
),
// NOVA EDIT ADDITION START - EXTRA_BANS
"Nova Ban Options" = list(
Expand Down
4 changes: 4 additions & 0 deletions code/modules/antagonists/_common/antag_datum.dm
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,10 @@ GLOBAL_LIST_EMPTY(antagonists)
/datum/objective/survive,
///datum/objective/martyr, // NOVA EDIT REMOVAL
/datum/objective/exile,
// OCULIS EDIT ADDITION START - VAMPIRES
/datum/objective/vampire/scourge,
/datum/objective/vampire/prince,
// OCULIS EDIT ADDITION END
)
for (var/datum/objective/check_objective in objectives)
if (is_type_in_list(check_objective, escape_objectives))
Expand Down
54 changes: 52 additions & 2 deletions code/modules/antagonists/brainwashing/brainwashing.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/proc/brainwash(mob/living/brainwash_victim, directives)
/proc/brainwash(mob/living/brainwash_victim, directives, source) // OCULIS EDIT - original: /proc/brainwash(mob/living/brainwash_victim, directives, source)
. = list() // OCULIS EDIT ADDITION - brainwashing refactor
if(!brainwash_victim.mind)
return
if(!islist(directives))
Expand All @@ -8,16 +9,27 @@
if(brainwashed_datum)
for(var/O in directives)
var/datum/objective/brainwashing/objective = new(O)
// OCULIS EDIT ADDITION START
if(source)
objective.source = source
. += WEAKREF(objective)
// OCULIS EDIT ADDITION END
brainwashed_datum.objectives += objective
brainwashed_datum.greet()
else
brainwashed_datum = new()
for(var/O in directives)
var/datum/objective/brainwashing/objective = new(O)
// OCULIS EDIT ADDITION START
if(source)
objective.source = source
. += WEAKREF(objective)
// OCULIS EDIT ADDITION END
brainwashed_datum.objectives += objective
brainwash_mind.add_antag_datum(brainwashed_datum)

var/begin_message = " has been brainwashed with the following objectives: "
var/source_message = source ? " by [source]" : "" // OCULIS EDIT ADDITION
var/begin_message = " has been brainwashed with the following objective[length(directives) > 1 ? "s" : ""][source_message]: " // OCULIS EDIT CHANGE - ORIGINAL: var/begin_message = " has been brainwashed with the following objectives: "
var/obj_message = english_list(directives)
var/rendered = begin_message + obj_message
if(!(rendered[length(rendered)] in list(",",":",";",".","?","!","\'","-")))
Expand All @@ -26,6 +38,43 @@
if(check_holidays(APRIL_FOOLS))
// Note: most of the time you're getting brainwashed you're unconscious
brainwash_victim.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in. (April Fools)")
brainwashed_datum.update_static_data_for_all_viewers() // OCULIS EDIT ADDITION - ensure that objectives show up properly

// OCULIS EDIT ADDITION START - add unbrainwash proc. kept in here so that it's right next to /proc/brainwash
/// Removes objectives from someone's brainwash.
/proc/unbrainwash(mob/living/victim, list/directives)
var/datum/antagonist/brainwashed/brainwash = victim?.mind?.has_antag_datum(/datum/antagonist/brainwashed)
if(!brainwash)
return FALSE
if(directives)
if(!isnull(directives) && !islist(directives))
directives = list(directives)
var/list/removed_objectives = list()
var/list/objective_texts = list()
for(var/datum/objective/directive as anything in directives)
if(istype(directive, /datum/weakref))
var/datum/weakref/directive_weakref = directive
directive = directive_weakref.resolve()
if(!istype(directive))
continue
brainwash.objectives -= directive
removed_objectives += directive
objective_texts += "\"[directive.explanation_text]\""
log_admin("[key_name(victim)] had the following brainwashing objective[length(removed_objectives) > 1 ? "s" : ""] removed: [english_list(objective_texts)].")
if(LAZYLEN(brainwash.objectives))
to_chat(victim, span_userdanger("[length(removed_objectives) > 1 ? "Some" : "One"] of your Directives fade away! You only have to obey the remaining Directives now.</b></span></big>"))
victim.mind.announce_objectives()
else
victim.mind.remove_antag_datum(/datum/antagonist/brainwashed)
QDEL_LIST(removed_objectives)
else
var/list/objective_texts = list()
for(var/datum/objective/directive as anything in brainwash.objectives)
objective_texts += "\"[directive.explanation_text]\""
log_admin("[key_name(victim)] had all of their brainwashing objectives removed: [english_list(objective_texts)].")
QDEL_LIST(brainwash.objectives)
victim.mind.remove_antag_datum(/datum/antagonist/brainwashed)
// OCULIS EDIT ADDITION END

/datum/antagonist/brainwashed
name = "\improper Brainwashed Victim"
Expand Down Expand Up @@ -84,3 +133,4 @@

/datum/objective/brainwashing
completed = TRUE
var/source // OCULIS EDIT ADDITION
Loading
Loading