Details
-
AboutChief Procrastination Officer, Keeper of The Keys to My Father's Flat, proud holder of a mediocre BSc. Analytical fundamentalist Manufactured: Budapest, 2001 Calories: 70,000 May contain traces of other viewpoints Matrix: @lbfalvy.matrix.org
-
SkillsTypescript, C#, Rust, Orchid, goofy altlangs, group theory
-
LocationBudapest, HU
-
Website
-
Github
Joined devRant on 5/18/2018
Join devRant
Do all the things like
++ or -- rants, post your own rants, comment on others' rants and build your customized dev avatar
Sign Up
Pipeless API
From the creators of devRant, Pipeless lets you power real-time personalized recommendations and activity feeds using a simple API
Learn More
-
Have you ever applied for a job and then spiraled after a few days of not hearing anything back?
Me too! 🙄😭😭😭5 -
I am SOOOO tired of outdated, easily circumvented, methods of attempting to find rule breaking culprits...
especially when they can't even come up with anything more specific than 'suspecting' "unusual activity".13 -
Here is my idea for a time machine which can only send one bit of information back in time.
@Wisecrack has asked me about it and I didn’t want to write it in comments because of the character limit.
So here we go.
The DCQE (delayed-choice quantum eraser) is an experiment that has been successfully performed by many people in small scale.
You can read about it on wikipedia but I'll try to explain it here.
https://en.wikipedia.org/wiki/...
First I need to quickly explain the double slit experiment because DCQE is based on that.
The double slit experiment shows that a particle, like a photon, seems to go through both slits at the same time and interfere with itself as a wave to finally contribute to an interference pattern when hit on a screen. Many photons will result in a visible interference pattern.
However, if we install a detector somewhere between the particle emitter an the screen, so that we know which path the particle must have taken (which slit it has passed through), then there will be no interference pattern on the screen because the particle will not behave as a wave.
For the time machine, we will interpret the interference pattern as bit 1 and no interference pattern as bit 0.
Now the DCQE:
This device lets us choose if we know the path of the particle or if we want wo erase this knowledge. And we can make this decision after the particle hit the screen (that is the "delayed" part), with the help of quantum entanglement.
How does it work?
Each particle send out by the emitter will pass through a crystal which will split it into an entangled pair of particles. This pair shares the same quantum state in space and time. If we know the path of one of the particle "halves", we also know the path of the other one. Remember the knowledge about the path determines if we will see the interference pattern. Now one of the particle "halves" goes directly into the screen by a short path. The other one takes a longer path.
The longer path has a switch that we can operate (this is the "choice" part). The switch changes the path that the particle takes so that it either goes through a detector or it doesn't, determining if it will contribute to the intererence pattern on the screen or not. And this choice will be done for the short path particle-half because their are entangeld.
The path of the first half particle is short, so it will hit the screen earlier.
After that happened, we still have time to make the choice for the second half, since its path is longer. But making the choice also affects the first half, which has already hit the screen. So we can retroactively change what we will see (or have seen) on the screen.
Remember this has already been tested and verified. It works.
The time machine:
We need enough photons to distinguish the patterns on the screen for one single bit of information.
And the insanely difficult part is to make the path for the second half long enough to have something practical.
Also, those photons need to stay coherent during their journey on that path and are not allowed to interact with each other.
We could use two mirrors, to let the photons bounce between them to extend the path (or the travel duration), but those need to be insanely pricise for reasonable amounts of time.
Just as an example, for 1 second of time travel, we would need a path length about the distance of the moon to the earth. And 1 second isn't very practical. To win the lottery we would need at least many hours.
Also, we would need to build the whole thing multiple times, one for each bit of information.
How to operate the time machine:
Turn on the particle emitter and look at the screen. If you see an interference pattern, write down a 1, otherwise a 0.
This is the information that your future you has sent you.
Repeat this process with the other time machines for more bits of information.
Then wait the time which corresponds to the path length (maybe send in your lottery numbers) and then (this part is very important) make sure to flip the switch corresponsing to the bit that you wrote down, so that your past you receives that info in the past.
I hope that helps :)4 -
I was curious about the geographical distribution of Top Tech Jobs (i.e. how many FAANG jobs are in Europe, where they are mostly focused, etc)... So I came up with a draft (prototype) of the Tech Jobs Radar:
https://jobs-radar.com/
I'm sharing it here just in case someone else is curious about analyzing such data7 -
"You're a real programmer only when you first encounter a segfault"
I had the most demotivating segfault in my life. Every functions in my project returns a segfault, except the one to init and create a window. I/O. Audio. Frame Buffers. Everything. AAAH.
It is on glX (X11) so i'm planning to remove it's support and instead work on WASM then use Electron to render those apps on X11 and rpi.14 -
Procastinator's tricks to be productive: Schedule messages
I hate to write people. They could answer. My whole plan might be thrown off. But when is the best time to answer them? The day after tomorrow? Too late. Tomorrow. Around 10? Thank you to all messengers that allow me to schedule a message. Instead of procrastinating, I answer, I schedule, and if I am in a bad mood, I later come back and abort and rewrite the message nicer.
Went perfectly swimmingly with my happy new year messages. Everyone got them at 00:00. Yes my friend, you're obviously the most important thing in my life, first thing I did was writing you!3 -
Bulgaria and Romania are now part of the schengen area, maybe I should buy myself a gypsy wife as my way outta third world 🤔12
-
you ever habituate yourself to reflexively do something and then forget you ever did that and don't even notice you're doing it therefore can't turn it off because you're too oblivious to understand the problem
and for amusement what is it?8 -
Working on creating an asyncio UDP server/client. Going to have it talk to another server/client. Why? Because I don't want there to be a round trip to my data. I want send and forget.
So I created a combo server/client in C++. I am testing out the client and I find that it connects and sends data with zero errors as a client even if there is no endpoint (server) active. Okay, well its connection-less so it kinda makes sense. So I am not even sure what connection means at this point. I figured it was sending data into the ether. Fine, I don't have to worry about dropped endpoints or some shit. The server does see messages once it creates itself (tested with Python server). Not old messages, just the ones currently being sent.
So I do the same thing in Python and use asyncio to create server/client with opposite ports to talk to my C++ server/client. However, if C++ server doesn't exist the Python client throws an error. Okay, wtf... So Python UDP client is gonna be extra steps because why? Because fuck you! That's why! lol
UDP Client Comparison:
C++: I don't give a shit, if you don't get the data then fuck off. I won't error no matter what.
Python: Oh shit, there is no server, so I won't even run. Because fuck you and wanting to send messages to the ether.
Now I need to do the same thing in C# and see what kind of "fuck you's" it will have.
What did I learn? I learned Python has a nice asyncio system similar to asio from boost.11 -
*Reading a bug report's summary*
'Object x is displayed incorrectly when playing on PC in resolution 1024x768 or Android tablets w/ 4:3 Aspect Ratio'
*facepalms*
You, sir, are failing at basic math && basic logic, among other things.
1024x768 _has_ an Aspect Ratio of 4:3.
If only you had bothered checking, you would've know that the issue is purely related to the Aspect Ratio && !just that one resolution.7 -
I'm delirious so here's your daily dose of fuck:
```fasm
; --- * --- * ---
; 64-bit byte-by-byte mash
macro clamp_u8 {
mov cl,$08;
mov rdx,rax;
rept 8 \{
rol rdx,cl;
xor al,dl;
\};
};
; --- * --- * ---
; give 8-bit random seed
macro prng_u8 {
rdtsc;
shl rdx,32;
or rax,rdx;
clamp_u8;
};
; --- * --- * ---
; roll dice
d20: prng_u8;
; x%20, according to gcc ;>
mov edi,eax;
mov eax,-51;
mul dil;
shr ax,12;
lea eax,[rax+rax*4];
lea edx,[0+rax*4];
mov eax,edi;
sub eax,edx;
; discard high and give
and rax,$FF;
ret;
```
I guess `d20` could be inlined too but I thought it'd be too much.
Is it faster than straight C? Probably not. But it's way lighter, so it loads faster. Below five hundred bytes mother fucker.
Now if you'll excuse me, I'll go sit in the darkness repeteadly typing roll 1d20 on the terminal. For reasons.9 -
Figure I can simplify the code if I have the compiler handle *some* of the register allocation.
Eh? What do you mean "NP-hard"? Dafuq's an ENN-PEE?
**frantically reads wiki**
I can proudly say that I understood absolutely nothing; CS stands for cocksucker or rather abysmal failure at the most basic forms of communication, I don't just sit here all day expecting you to flawlessly prove my point with every swallow of breath you draw, yet here we are.
Perhaps one factor involved in producing the generalized cluelessness of my colleagues, I mean their "imposter s*ndrome", has a bit to do with how fucking thick you've formulated this glorified bollocks you call theory. Were not for your incompetence, arcane crackheads like me would simply __not__ be capable of rising to the top of this field entirely via determination and a big salami, therefore I owe you both a debt of gratitude as well as every last word and sign of total disrespect.
As interesting as the study of computational complexity can be, if done correctly that is, you idiots are stuck in a mathematician's abstract mindset in a field entirely devoted to application of ideas rather than *just* the ideas themselves.
To answer my own question, it means there's no known efficient solution. That's it. The part about nondeterministic polynomial convolution of an irreductible rectosigmoid junction can apparently be skipped altogether. Anyway, I solved the problem with the computational equivalent of pizza sticks while you were out in the field mentally jacking off to λ.
Lecture is over, now go clean up the ethereal masturbatory residue if you will, I have mystical el Khwarizmi type-shit to solve via further clubbing of abstraction through liverwurst bologna of immense proportions. ^D3 -
It's not the "age of AI" you dissecated nutsack munching buffoon, you could lick and suckle my delicious tits with that grandiose old tongue you have, if only it wasn't so profoundly infected with feces of every consistency and color.
Your word, for the two shits it's worth, is still better spent elsewhere than promoting falsehood, giving importance to that which has none, or spreading the belief that a demonstrably unscalable approach still has, somehow, room to grow. It's no fucking s*ndrome but full on imp*sterhood, truly a grand fellowship of pauseless jackoffs.
This is it -- a glorified, disobedient, largely unpredictable autocomplete. A probabilistic bullshit machine. It wouldn't be able to replace you, if only you weren't so fucking stupid.
And yes, I *am* contradicting myself by addressing the incredibly cost inefficient overclocked melting minerstack in the room, but I can hardly make the point without doing it, so shush.
Back to the stone age with this shit. Now pass the fucking joint.1 -
So, I applied for a job. People tend *not* to answer my applications, probably because my resume very clearly states I implemented malloc in fasm, among other things.
I imagine them going like "Sir, this is a Wendy's", or rather "we're looking for a 10X rockstar AnalScript ZAZQUACH mongoose-deus puffery quarter-stack developer". Fair enough, I certainly don't fit that bill.
But this time I not only got an answer, the guy went like "I'm impressed". Is this... recognition? From a human? What?
Fellas, I cannot process this emotion. Being frank, it's not even about the job. But willfully going against the idiocy of the industry standard, and then seeing that utterly deranged move actually amounting to something -- no matter how small -- is quite uncanny.
And of fucking course, it's a Perl job. Figures. Great minds think alike.3 -
I'm unironically VERY excited. In the last month, TWO real people, both of them into devops according to their profiles, have begun watching avtomat (https://github.com/Liebranca/...), and yes I WILL continue spamming the link if this keeps up. Would you like me to stop? Then give me a dislike and tit-slap the "unsubscribe" button NOW to end my suffering!4
-
I'm in a big fat fucking stinking rut, as in progress on this project has absolutely stagnanted.
Gonna rubber face your duck now **UNZIPS** excepts I don't have zippers, as joggers are the one true way; fake Adidas til I fucking drop.
Brain damage aside, I understand both how I've layed out the data and what I'm supposed to do with it. We have a virtual machine, an array of instructions and arguments for a given process within it, and we need to walk this array and map values to registers.
We also need to spill values inside registers to stack, IF they are required at a further point within that block. This also isn't terribly complex. We simply look forward in the array and see if the value is an argument to any instruction that *needs* this value to be loaded (ie, within a register).
So this implies multiple iterations; we need to better understand how one particular value is used throughout an F before we can make a final decision on how many registers and stack space are actually needed for the whole block.
Here's where it gets tricky. If there's a call, we need to be certain that the symbol being invoked has already been fully processed. Besides the obvious fact that recursion fucks me up, there's another matter: say a private method gets invoked by another private method. We can take advantage of this, by which I mean, sacrilege incoming so put on this toga.
Looking at the output for C compilers, it would seem this is not done in practice, I would assume because it's a pain in the ass. But when you have the guarantee that F will only be called internally, as that's what "private" means, there's two ways it can go:
0. It's well below the 13-20 cycle threshold, so you inline the fucker. No suprises there.
1. It's a more involved affaire, and invoked in more than one place, so you don't inline it. Codesize matters.
Recursion and [1] are the big deal things holding me back. Not because it's too hard, like I said this is kindergarten level abstraction. I'm just slow and fanatical, which is how I prefer to spell "constant obsessive paranoid delusions". I can see the potential optimization I can pull here, so I'm stuck trying to figure it out.
Idea would be, handling the register allocation and stack spill for an internal-internal (or deep internal; what we like to call a "guts" method) in synchronization with the *calling* processes. This is, fundamentally, violating all conventions -- but so under the hood no one will notice.
Let me give you an example. If we were to pass some value to a function, expecting to mutate it and get a different value back, in a lot of cases it'd be stupid to make an implicit copy by using two registers, one for input and another for the output. Dude, it's one cycle. Multiply it by a million, say sixty times per second, for every time you __needlessly__ make a copy of a value that we've already stated is mutable.
Clearly unacceptable. This is, in the strictest sense, everywhere in every single codebase. Premature micro optimization is the root of all goodness, God is great and praiseworthy. So how do we go about it?
Answer is I know and I don't know. By which I mean to say, this very thing I've done by hand. Assembly is fun. Now the issue is teaching a calculator how to do it. Not so fun.
There is a dependency chain between processes, as I believe I've kind of alluded to. I'm trying to make decisions on the side of the caller depending on the details of the callee, which is why recursion is rawdogging my soul. This is the same situation, it's inverting the direction of one or more links in the dependency chain, which makes no fucking sense.
And yet it does.
Brain, explain yourself.
How do *you* handle this without crashing?
Brain?
<<ME STEWPED; BEEP-BOOP>>
Alright then, that was a useless attempt at fuckery. Let's have a nap then, maybe it'll come to me in the morning. That's what I've been saying to myself for almost a month now.
Perhaps it is a hardcoded fuk.1 -
Was a tad depressed yesterday and couldn't get any serious work done, so I start doing random chores to distract myself. Fixed my urxvt extension to correctly toggle fullscreen on and off, and then I remember that the reason I have a black desktop background is I couldn't stretch the terminal to cover the whole screen, so it looked weird.
Well, not a problem anymore, so let's have something more colorful. I have this image of the eastern veil nebula laying around, for no real reason other than I thought it looked pretty. Used to be my desktop background. Let's make it so once more, enable terminal transparency, turn opacity down to 82%; now I have something other than code and the void to look at.
But curious as to what this nebula is, I g*^gle it out. I don't believe in astromambo, but I do find it funny that it's in Cygnus, because that's a swan, and the mascot for my projects is a swan too -- not because of the constellation, but because I suck at drawing.
See, my mom is a sabuner, I mean soaper. She makes olive oil soap. And we had an old box of Nablus soap in the house, which we kept because it's pretty, and the front of this box had a picture of an ostrich, drawn in bright red. I tried to base my logo on it but it ended up looking more like a swan than an ostrich; I accepted my failure and decided then and there that this would be the mascot.
It's a multitude of little relationships between things I never really thought I could relate to one another. This is utterly random shit and it cheers me up.
Anyhoo moral of the story is nebulae are fucking cool. -
YGGG IM SO CLOSE I CAN ALMOST TASTE IT.
Register allocation pretty much done: you can still juggle registers manually if you want, but you don't have to -- declaring a variable and using it as operand instead of a register is implicitly telling the compiler to handle it for you.
Whats more, spilling to stack is done automatically, keeping track of whether a value is or isnt required so its only done when absolutely necessary. And variables are handled differently depending on wheter they are input, output, or both, so we can eliminate making redundant copies in some cases.
Its a thing of beauty, defenestrating the difficult aspects of assembly, while still writting pure assembly... well, for the most part. There's some C-like sugar that's just too convenient for me not to include.
(x,y)=*F arg0,argN. This piece of shit is the distillation of my very profound meditations on fuckerous thoughtlessness, so let me break it down:
- (x,y)=; fuck you in the ass I can return as many values as I want. You dont need the parens if theres only a single return.
- *F args; some may have thought I was dereferencing a pointer but Im calling F and passing it arguments; the asterisk indicates I want to jump to a symbol rather than read its address or the value stored at it.
To the virtual machine, this is three instructions:
- bind x,y; overwrite these values with Fs output.
- pass arg0,argN; setup the damn parameters.
- call F; you know this one, so perform the deed.
Everything else is generated; these are macro-instructions with some logic attached to them, and theres a step in the compilation dedicated to walking the stupid program for the seventh fucking time that handles the expansion and optimization.
So whats left? Ah shit, classes. Disinfect and open wide mother fucker we're doing OOP without a condom.
Now, obviously, we have to sanitize a lot of what OOP stands for. In general, you can consider every textbook shit, so much so that wiping your ass with their pages would defeat the point of wiping your ass.
Lets say, for simplicity, that every program is a data transform (see: computation) broken down into a multitude of classes that represent the layout and quantity of memory required at different steps, plus the operations performed on said memory.
That is most if not all of the paradigm's merit right there. Everything else that I thought to have found use for was in the end nothing but deranged ways of deriving one thing from another. Telling you I want the size of this worth of space is such an act, and is indeed useful; telling you I want to utilize this as base for that when this itself cannot be directly used is theoretically a poorly worded and overly verbose bitch slap.
Plainly, fucktoys and abstract classes are a mistake, autocorrect these fucking misspelled testicle sax.
None of the remaining deeper lore, or rather sleazy fanfiction, that forms the larger cannon of object oriented as taught by my colleagues makes sufficient sense at this level for me to even consider dumping a steaming fat shit down it's execrable throat, and so I will spare you bearing witness to the inevitable forced coprophagia.
This is what we're left with: structures and procedures. Easy as gobblin pie.
Any F taking pointer-to-struc as it's first argument that is declared within the same namespace can be fetched by an instance of the structure in question. The sugar: x ->* F arg0,argN
Where ->* stands for failed abortion. No, the arrow by itself means fetch me a symbol; the asterisk wants to jump there. So fetch and do. We make it work for all symbols just to be dicks about it.
Anyway, invoking anything like this passes the caller to the callee. If you use the name of the struc rather than a pointer, you get it as a string. Because fuck you, I like Perl.
What else is there to discuss? My mind seems blank, but it is truly blank.
Allocating multitudes of structures, with same or different types, should be done in one go whenever possible. I know I want to do this, and I know whichever way we settle for has to be intuitive, else this entire project has failed.
So my version of new always takes an argument, dont you just love slurping diarrhea. If zero it means call malloc for this one, else it's an address where this instance is to be stored.
What's the big idea? Only the topmost instance in any given hierarchy will trigger an allocation. My compiler could easily perform this analysis because I am unemployed.
So where do you want it on the stack on the heap yyou want to reutilize any piece of ass, where buttocks stands for some adequately sized space in memory -- entirely within the realm of possibility. Furthermore, evicting shit you don't need and replacing it with something else.
Let me tell you, I will give your every object an allocator if you give the chance. I will -- nevermind. This is not for your orifices, porridges, oranges, morpheousness.
Walruses.16 -
Well, look at that, I fixed the bug and it's the end of my shift. Alright then, let's PR this shit and clock out!
CHECKS FAILED
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHSDJAGSJAGJR -
So now I have to pay taxes because I'm employed. Fair enough, sounds reasonable.
Go to the government's diseased scrotum of a webapp to tramit some ID stuff and shit. All good. Then I go to the bank, so I can open an account, so that I can receive the money, so that I can pay the government.
What happens? The guy at the bank tells me he can't access my ID, so he can't open my account. Understandable. I go once again to the gonorrhea infected maggotsoup that is the government's mother fucking webapp. THEY BLOCKED MY ID.
Problem? I had to attach images of some documentation, they say the images are illegible. I try again with a clearer image, ten fucking times the resoulution.
Is that good enough? NOOOOOOOOOO0=00=======0===000 oo O O OO O O, I am the government, my sole purpose in life is to be a dick in your asshole.
So what do I do? I, calmly, grab the documentation, go to the nearest office, and politely explain the situation to the dude behind the counter. Surely, he can verify himself that my papers are in order, no?
NO. HE CANNOT.
IT CAN ONLY BE DONE THROUGH THE APP.
ARE YOU FUCKING KIDDING ME.
WE ARE DOOMED AS A SPECIES.
LISTEN TO ME, DEAR GOVERNMENT.
AND DEAR TAXMEN.
AND ASSOCIATED BUREAUCRATS.
PLEASE HEAR ME OUT.
IF YOU DON'T UNBLOCK MY ID, I CANNOT OPEN A BANK ACCOUNT.
IF I DO NOT HAVE A BANK ACCOUNT, I CANNOT RECEIVE ANY MONEY.
IF I CANNOT RECEIVE ANY MONEY, THEN I CANNOT PAY **YOU**.
SEE HOW THAT WORKS?
ITS OK.
JUST SUSPEND THE PAYMENT I OWE.
YOU KNOW, THE ONE THAT'S DUE IN A FEW DAYS??
OH RIGHT!
YOU'RE STILL ASKING ME FOR THAT MONEY.
SILLY ME.
I THOUGHT I MAY BE EXEMPT.
SINCE YOU YOURSELF HAVE FORBIDDEN ME FROM PAYING.
ARRHGHHGGHGHGHGHGH!!!!!!!!
YOU IRREDEEMABLY STUPID FUCK.15 -
For reasons I won't disclose, I am just switching off reality in a pretty hardcore way.
Hours, and I mean almost half the fucking day, spent soloing my own TTRPG. It's actually the most fun I've had in years, I think I'm becoming slightly addicted. Dude, I have an abyss of grimdark lore, it's fucking crazy. I'm just bending the space-time continuum with my sorcerous ways, turns out the piece of shit $2 mechanics I designed are so flexible the game simply takes no effort to enjoy.
Anyway, I don't feel bad for this specifically. I do my daily work hours so I'm at peace, and allow myself to just do what I want to do.
Everything else is what gets me down. Fucking shit, man. I'd be ashamed of complaning, as I have it very good. I like my job and I like my game too. No problems there.
But the fact that I cannot go anywhere beyond those two things does raise little bit of an alarm, buried somewhere deep beneath the hundred tomes of forbidden spells I'm collecting on the alcove, down by my quarters on the cursed tower.
Tomorrow night, I'm going on more mystical adventures together with my vampire homegirl. She's a total boss. I was at 1 HP with both my fucking legs broken and no mana, just sitting on the sidelines trying not to die, while she fended off an inquisitor two times her level, all by herself. I know she's a fictional character but I said thank you for real a couple times, just to be nice, as she totally saved my arcane ass.
Now, you get me, right? It's escapism, and I'm great at it, a little bit too much. Honestly, once I'm done with my responsibilities for the day, I just don't feel like doing much of anything else, and I'm not crazy enough (yet) to not notice the downside, that being, no fucking life outside of working and locking myself up inside dark fantasy wonderland.
I suppose this is my roundabout way to say this better than sex, but I don't know if you would understand the sentiment.
Anyway, shutting off reality again in twelve or so hours, can't fucking wait.5 -
!dev
Vampire homegirl and I got into bit of a pickle last time we went out marauding around the City of the Dead. We collected payment for a hit on a merchant, but a large portion of the money was discounted, as unbeknown to us, there was a witness to our bloody crime.
Soon enough, we were being hunted down by a rival sect, encroaching on our territory. Their High Priest sent some dogs our way, and we felt right into their ambush, at a crossroads within the southern alleways. I took down three of those sons of bitches, with two crossbow bolts stuck on my back, before finally being knocked down by a shield slammed to my face.
Got both my fucking legs mauled with a flail and almost put out of commission. Luckily, my vampiric companion was there to save my skin. She fought a desperate duel against the last one of our foes left standing: an inquisitor, sent to either capture, or more likely, kill us both.
This fucker was tougher than any adversary either of us had ever fought against. Fully clad in silver armor, wearing an enchanted crimson cloak, her face hidden behind a terrifying iron mask. My companion stood her ground, but throughout the fight, she was constantly on the defensive, hesitant to close too much distance against the enemy.
Our foe launched one devilishly mighty blow, that my partner in crime fortunately managed to block. However, her blade was pulverized by the sheer weight of the inquisitor's strike, nearly shattering her ribcage. In a last ditch effort to survive the encounter, she lunged at her opponent with what remained of her sword, and stabbed the hunter right in her fucking eye, to then sink her fangs into the ecclesiastical bitch's neck.
Having temporarily incapacitated the inquisitor, we made our escape. My companion carried me back to our safehouse, where we would plan our next move... but our masters were one step ahead of us.
At our hideout, we were intercepted by them, at the behest of the Matriarch. We were to be smuggled out of the city inside a funeral carriage, to then be safely transported back to our sacred order's sanctuary.
Uppon arriving, we were confronted and reprimanded for our failures, past and present. I was forcefully separated from my esteemed nocturnal friend, as way our masters put it, our growing affections were cause for concern. Longing to be reunited, we schemed for weeks through our mutual acquaintances in the monastery, delivering small coded messages.
Through our cunning subterfuge, we finally managed to meet in an ancient grotto underneath a cedrus tree, on a hill overlooking the sanctuary. I was ready to plan a daring escape, but to my suprise, she had her mind made up to a wildly different course of action. We were to play by their rules -- go through with their dark cleansing rituals, meant to re-educate us before admitting us back into the order as fully-fledged acolytes.
And so, in the penumbra of that age-old grotto, a pact was made.
I am now riding south on a black stallion, falchion in hand, and a trail of witches' blood in my wake. I carry with me orders from the Matriarch herself: purify the nearby catacombs and prove my devotion to the utter blackness of our faith. Should I not return, my companion will be up next.
Failure is not an option. As I evade the twisted creatures that guard the entrance, and descend the staircase down into the tomb, I wonder what kind of horrors await me inside...
OH GOD FUCKING SHIT I JUST STEPPED ON A TRAP
** TO BE CONTINUED **