#okay *actual* last note. i'm totally hanging this in my room when its done
Explore tagged Tumblr posts
Text
B2:S - Chapter 5
Much of this series will be about the differences and additions in the novel version, and how they contribute to my understanding of story canon. But there will be character appreciation, the odd theory and headcanon, and suchlike as well.
Here be lots of Viren deets, Best Boy Soren deets, some writing/continuity stuff, worldbuilding appreciation and half of a theory, Detective Rayla, Moon Temple geeking, Claudium and dark magic, and more!
Spoilers for Book Two: Sky below.
(I know for darn sure that I wrote up a post for chapter 4, but I can't find it anywhere so I guess Tumblr ate it and I'll have to redo it at some point, but today is not that day)
Viren, my evil dude, my bad guy, coming in clutch with the worldbuilding and backstory again! If you want to know decades of information, you gotta talk to Viren. Or read his scenes, at least. Here, he seems to not sleep much when he has a big problem to analyze his way through. Solutions trump pretty much everything else in this guy's life, and he's had a really hard week with a lot of new and complicated problems. Of course he's getting sleep-deprived trying to find his way through them all.
Harrow put so much trust in Viren when he made him High Mage! He just threw himself extra hard at that Lady Justice blindfold, didn't he? Didn't really want to see what Viren was doing in his magic study, so he left Viren to his devices. And Viren has a lot of devices.
Also, this is fascinating: Viren made the secret passage to his "less official study" in Katolis Castle! And he was inspired to do so by the way his own mentor kept the Puzzle House. What else could a Puzzle House be, except a place with secret passages? Yay! secret headcanon that "the Puzzle House" is just "Katolis Castle" from Kid Viren's perspective tho
So either Viren built all of those passageways, or at least the ones to his dungeon. Which means he has to have, or know where to get, a stash of those glowing blue Moonshadow crystals. Hmmm.
I can't wait to learn more about Kpp'Ar and young Viren, btw. From this description of Viren and all his literal secret ways, it feels like another parallel between Viren and Runaan, with the whole "secretive paths, members only, insider knowledge" type stuff. Only the really cool members of this cult club get to know the secrets, and guess what, kid, you're cool now but you can never tell anyone, okay? Our secret.
Yeahhh, that'll never backfire in any way for either of them.
Kpp'Ar calling puzzles and secrets "man-made magic," though. Yes sir, knowledge is indeed power.
This chapter mentions Runaan by name, from Viren's perspective. Generally that would imply that Viren knows his name, even though assassins do not share their names, and Runaan didn't seem to give his to Viren in the first book. However, there was a scene in book one where the last paragraph switched perspective from Viren to Runaan - a technique that's very common in visual media like movies and shows and gives you that "ohoho they left the room and didn't notice this, but you do!" vibe. Using Runaan's name there in book one, where Viren couldn't see it but readers could, helps them keep track of the assassin's story arc while maintaining Viren's racism.
So in book two, in which Runaan has no onscreen scenes (alas), using his name in a scene that calls back to the events in book one helps us remember what happened in that dungeon cell. It would be a bit muddier to recall the specifics if Viren kept thinking about Runaan as "Elf." So I'm cool with the perspective nudge because it serves a narrative purpose: clarity. But I'm also enjoying the angst of considering that, somehow, Viren learned Runaan's name either during or after the coining spell. Mwa ha ha haaa. (Obligatory "Keep my pretty name outta your mouth" goes here)
Okay, back to Viren's scheming! He took the mirror because it was human-sized in a dragon lair. He knew it didn't really fit there, and that made it interesting, so he stole it. But he realized it was really powerful when Runaan wouldn't tell him squat about it - the assassin's instinct to protect Xadian secrets from human hands meant that Viren was holding a very powerful Xadian secret. And that just made him want it all the more. Ah, Runaan, if only your relationship with lying was, like, the exact opposite of what it is. Nyx could've spun Viren a believable tale in 2 minutes flat.
Also of interest: Viren considers his cursed coins to be a final fate. He expects Runaan to remain in his coin forever. With the Chekhov's coins still extant in the storyline, we can assume that they'll come up again eventually, but Viren has no current plans to do anything with his elf money except carry it around.
It's worth noting that Viren admits that he got impatient when he trapped Runaan in the coin. Runaan's first fate in Katolis was supposed to be death at Soren's hands, but Claudia "saved" him from that. His next fate was to become spell components, but Viren's frustration with his stubbornness "saved" him from that fate, too. So now he's in a coin, where no one can chop him up at all. Yay? No, boo!
We get one last line about Runaan before Viren shifts gears: he makes a point of noting for us that Runaan's shackles are still locked shut. However much of Runaan made it into that coin - body, soul, hair care products - he was magicked there, pulled right out of his restraints.
The creepy black liquid that Viren pours right into his eyes is the last of a powerful potion he got from Kpp'Ar, and its recipe is ancient! Humans used it back in the age of Elarion to see through the illusions of the world. And we get a delightfully creepy bit of description about the preparation of this serum, which makes it abundantly clear that it's a Moon magic-based concoction, harvested from eyeless vipers on a moonless night, with the threat of irrevocable madness ("madness" by whose definition, though) if it's done wrong-
Hang on. Hold up. This is a Plato's Cave reference. OH MY GOD.
No no I'm fine, this is brilliant. Sorry, sorry, I couldn't figure why there was so much description for a potion prep that Viren didn't even have to perform himself. But now I get it. I see the light. HA. I should make a separate post for this, it's amazing.
Anyway, for reference, the humans who used this serum were called the Oracles of Ophidia, and Ophidia is a taxonomy group that includes all modern snakes. Can you say "creepy ancient snake rites"? I can! Woo!
Viren activates the serum with a spell, but apparently he's never done it before. He's not sure if it's supposed to be hot and bubbly, and he worries that it's been tainted by moonlight.
Oh, I do hope so.
The magic potion hurts, a lot. Viren will do just about anything, to himself or anyone, to do what he believes is necessary. He just risked madness and blindness to find out what this mirror does! Viren. Can you just. Take a nap or something. Have a Snickers.
This chapter gives us a fun clue that I don't remember from the show: when Viren's vision clears and he can see, his reflection has white pupils and the room reflected in the mirror has inverted colors. You know where else has inverted colors?

You know who else got white pupils for a hot second?

Okay, now it makes sense! Viren and Lujanne were both seeing into the realm beyond life and death. Him with his moon magic potion, and her with her moon powers on a full moon night at the Moon Nexus. Which is Very Interesting! Is it a direct hint about Aaravos's location, or just a separate cool detail? Orrr, does it look like a direct hint because Aaravos is actually trapped in the world beyond life and death, but it's actually separate and we'll see something about white pupils again later on?
Viren really does have self-esteem issues, we all picked up on it with his rant at his reflection. He throws a fit when he catches himself wondering if he's actually worthless. In the book version of his tantrum, he shoves the mirror and hurls a candelabra instead of flipping a table. He didn't need to shove the mirror to set the fire, but it's in here. Foreshadowing that perhaps, if push comes to shove, Viren will choose himself over Aaravos? Giving Aaravos time to peek through and see that the coast is clear?
Soren, my boyyyyy. He has a rough night at the Moon Nexus because two sides of him are fighting with each other. He struggles to understand Callum's friendship with Rayla, and he also fantasizes about chopping off Rayla's head. One of these is a pretty ordinary thing to do. The other is Soren's internalization of what he needs to do to gain his father's approval. If he brought his dad a chopped off elf head every week, he'd probably feel a lot more confident because Viren would praise him a lot more.
Okay, okay, omg, is it just me, or does the "Moonshadow Madness" story, as it's told in the book, seem like Soren just doesn't know what a monsterfucker is? He thinks an elf bite puts humans under a spell. But vampires are sexy, and some people want them to do more to them than just bite them. A passionate kiss under the moonlight could look very bitey, especially if one of the participants has horns and you're already culturally trained to hate them. No yeah, I'm already headcanoning an actual human-elf kiss that got misunderstood by an observer long ago.
it's Lujanne isn't it, we all know, because what is a love spell but a sweet soft illusion, I mean how else does she get supplies for her Caldera, I ask you, and also Corvus was totally sent to investigate once and he told Soren at camp what he saw
And then back to magefam angst: Soren pretending that his sister's nose-tapping is stupid, even though he actually thinks it's cool, just because their dad thinks it's stupid. Viren, istg. Let your kids like harmless things. It's so cute that Soren taps his nose back at her, though! Like they have their own sibling code. I hope we get to see the nose tap again, especially now that they've chosen different sides. It could mean so much, that they're not too far apart yet.
Rayla knows what buttery pancakes smell like. I love this. Do Moonshadow elves have butter and pancakes, does Rayla eat a stack of eight giant pancakes in the morning? Orrrr it is just illusion food? I don't care, let Rayla have pancakes! Everyone loves pancakes. Pancakes will save the world. this message brought to you by the fact that I can't eat pancakes rn, send help
I love that Rayla is both sus of the pancakes and hungry, and that combines into a very motivated "I will get to the bottom of this" attitude. She kind of goes into Poirot Mode when she inserts herself into Soren and Ellis's conversation about Ava, explaining about the wolf's illusion leg and segueing into her claim that the pancakes taste sus. Claudia confirms she used dark magic, and Rayla is furious. It's different than the show's version in that it puts Rayla in detective mode, as the only Moonshadow elf in the scene, and boy does she take that role seriously. Also, she doesn't actually swallow the dark magic pancake bite. It ends up on the ground just like Lujanne's grubs from that earlier meal. These poor kids are so nutrient-starved. You guys gotta eat!!
Rayla's determination and prejudices and the fact that she super knows Harrow is dead all dovetail to make her try repeatedly to persuade Callum that Soren and Claudia are Not To Be Trusted. It's nice that the book keeps taking the time to point out that Rayla is Well Intentioned But Flawed, just like Callum and pretty much every other character in the show. No one is Right All The Time, no one Knows More Than Everyone Else.
Callum loving the sound of Claudia's unique voice is so wholesome. When you like someone, it only makes sense that you like all the things about them that they can't change - like the sound of Claudia's voice. Her choices with dark magic, not so much!
Claudia seems to have the same concerns Soren does about Callum's relationship with Rayla, but she comes out and asks him. The inherent possession implied in "your elf" is interesting, though. Elves are not people to Claudia. They're enemies who can be disassembled for the magic inside them. So maybe more like robots than living beings, if she knew what a robot was. Maybe she heard Soren's "Moonshadow Madness" story and realized he totally missed the kissing implications - but she didn't, and now she's genuinely worried that Rayla could kiss Callum under a full moon and enchant him to do her will. Good thing it's only a half moon, then!
Okay, Callum nervously making a puppet hand and then not knowing what to do with his hands and freaking out about itching and moving and pointy elbows is such a ND mood. The sudden stress of knowing that someone else is noticing your existence and maybe you're Not Existing Right, amirite? Ugh, poor Callum.
The Moon Temple! Omg it's so pretty in the description! Made to be beautiful and useful, full of knowledge but also allowing light and life inside (butterflies and vines). Lujanne, when can I move in, please? Also, it's all the more angsty because Lujanne is the only one who gets to see this beautiful place, but it has lots of chairs and shelves and tables, and it was meant to be used by lots of people. :(((
Claudia knows some of the runes on the walls. She isn't in a hurry to copy the rest of them down or anything, either. Her spellwriting is very precise, and she's a skilled mage. Her father would have made sure she was aware of the dangers of drawing sloppy runes, as much as he made her aware of the dangers of doing dark magic wrong. And the whole point of dark magic is that it's easier to learn than primal magic. Claudia supports her dad and their shared knowledge and life path. She's not gonna go nuts over an elf library she can't translate.
Side note: Between Claudia knowing some Moon runes and Viren building a secret passageway and a dungeon and lighting it with the same blue crystals that Lujanne and Ethari use for light--and Claudia exclaiming that she loves ruins--I wonder once more if there are really Moonshadow ruins somewhere in Katolis, which Viren has found and looted. Father-daughter relic hunting trip, maybe while Soren is away at camp? Omgsh that would be so wild!
Callum out here having a Viren moment with his "I feel powerless unless I've got magic that lets me help" vibes. God. I love their complicated mirroring. One of the hard differences between them is that Callum is very sure dark magic is bad because you have to kill stuff and take its power to cast spells, and he doesn't want to be a person who kills and takes like that. The line he walks to be nice to Claudia on their tour of the Cursed Caldera because he likes her, while telling her that he doesn't want to do her magic, like, ever, is so fine that it might as well be a shifting shadow on the ground. It's a very fitting conversation to be having during the half moon, with its tricks and little white lies.
Callum being out of the castle and his comfort zone, having to deal with the fact that the Claudia he loves is not quite the Claudia who's chasing him down across the kingdom, but of the two of them, he's the only one with a problem with this.
They say that if you really want to get to know someone, you should spend time with them outside their comfort zone - in heavy traffic, with a small baby, taking care of a new pet, trying a new skill, following unfamiliar directions, etc. While the castle is familiar territory for them both, Callum's never really found his comfort zone yet, while Claudia is pretty comfortable with her growing skill set. The creepy part starts to kick in when Callum begins to realize that Claudia's comfort zone encompasses a whole bunch of stuff that seems like it should make her uncomfortable... but it doesn't. But that'll be for a future chapter!
#book two: sky spoilers#book two: sky#b2:s#tdp spoilers#viren#harrow#rayla#runaan#callum#claudia#soren#lujanne#moonshadow elves#aaravos
25 notes
·
View notes
Text
025 // Distractions III: External Random Item Drop Generator
So you may be wondering what happened to last week's post, and the answer is that I never wrote it because I was too busy trying to finish this side project I have been working on. And I finished it!
I think I might have offered to explain it a while ago, so I will do that now, since I have very little new art to offer at the moment (it is probably not why you are here but please bear with me).
This one is a bit long and is all about code..
For the last few weeks, I have been working on an external random item dropper for a couple of friends who want to start their own thing, and doing that required me to either construct an entire user interface arrangement in Pygame (which I have done twice already and have my own modules for but am not really super-de-duper into) or to learn at least enough Tkinter to make something I am not totally ashamed of (which is a lot of learning because I know-- which is to say, knew-- almost exactly nothing about Tkinter, not counting some stuff with Listboxes.
I opted for the latter and, in truth, it was pretty easy to learn. It was a bit frustrating at times because there are problems with Tkinter's 'widgets' (graphic interface objects) that can occur and lock up the software in a way that Tkinter considers normal and not an error and why would it tell you about it? For instance, if you try to use a "grid" arrangement in the same Frame (an object Tkinter uses to create layers of widget organization) as a "pack" arrangement, it will "Tkinter will happily spend the rest of your lifetime trying to negotiate a solution that both managers are happy with," or how replacing Variable objects with new ones that have the same name sometimes causes the whole affair to silently stop working and leave you clicking a button to no effect, wondering what is going on and why.
Problems which I overcame! Quickly and with some difficulty! Most of my time was spent on the interface, actually, since it was the part I knew the least about. The design was pretty easy (or it was easy in the extent that I produced an interface experience that I, personally, found satisfying, and which failed to produce a/any complaint(s) from the people for whom I made it) but the actual construction took a lot of learning when it came to displaying and updating the right variables in the right places and when. There are many values shared between user input boxes (Tk.Entry), where the user enters various bits of data, lists (Tk.Listbox), which have selectable entries and a lot of straight-forward appearance parameters, labels (Tk.Label), which display values either as static text or from various types of Variable, and, of course, the item data sheet that the user provides (read using ConfigParser from an simple external text document I can tell you how to make, and internally, as a chaotic dictionary of lists and Variables and strings and numbers). Incidentally, I ended up extending (adding my own functions and attributes to) a few of Tkinter's basic classes, and this part of the project was actually one of the most interesting. A great many parts of the original module have been deliberately constructed in a way that simplifies that kind of extension, and while I had to go outside of that on an occasion or two, it was absolutely a worthwhile lesson!
The Variables were the most perplexing part, because Tkinter is the least forthright about them and because they are more flexible than they let on. These variables can be equipped with callback functions that allow them to alter their contents, or the contents of other widgets, or do some other crazy third thing, whenever they are altered, or even just whenever something looks at their values. That part was easy and extremely useful once I got the hang of it! They can also be given specific names by which other functions and widgets may identify them, and while I found this quite useful as well, its lack of stability was somewhat less endearing since Tkinter will not tolerate two variables with the same name (a legitimate and preventable issue!) and will not necessarily tell you when this has happened or where (I am less okay with this).
Another interesting thing about Tkinter is that it offers multiple obvious ways of accomplishing the same thing, which is a bit of a problem for "The Zen of Python," a sort of mantra that a lot of people in the community take quite seriously. As an example, you may almost always alter the configuration of a widget in at least two ways: - Use Widget.config(some_attr = value) and change one or several attributes at once using arguments, or - Setting them using attribute names as keys, like so: Widget['some_attr'] = value. - There are other ways too but none spring to mind.
Also, widgets can be stored in attributes, but you can also call them up using their names: a widget created in the line
myObject.my_widj = Label(master=tk_root, text='Yo, babe(l), I am a Label!', name='lbl_annoyinglabel')
..can be accessed directly either by way of some object attribute reference:
myObject.my_widj.config(text = "Hey, id'jit, I'm a widget!")
..which is absolutely normal in Python, or by calling it by name from its master object:
tk_root.nametowidget('lbl_annoyinglabel')['text'] = 'Please stop talking.'.
Naturally, you would probably want to use the first method as often as possible, because it involves fewer operations and would probably be easier to maintain. But the second way, more elaborate though it may be, lets you save on assigning attributes by tracking widgets using Tcl's internal structure. (n.b.: I cannot say I have ever found myself running out of room for attributes in a namespace but I am also a complete amateur as a programmer so please bear with me. <3 )
Interestingly, actual structure of the input sheets was the next-most time-consuming part. Trying to find a data format that would be easily comprehensible by anyone who picked it up (probably only going to be two people, plus myself, if even that many) and which also met with ConfigParser's profoundly elusive approval was a somewhat complex task. It turned out to be exactly as hard as I thought it would be, at least, and there were no surprises here. You can see a blank template of the input sheet here!
The actual drop generator code-- the element which takes the user-supplied data and returns a random selection of items from it, according to their initial and supplemental parameters; the single element that the entire program is built to support-- only took an hour to complete, actually. I did it last and by then, all of the parameters and variables and their names and locations had become obvious, and since it was a pretty plain function to start with, it was done quickly. It was interesting to note how much more effort it was to pack this simple function up into a pretty interface than it took to build the core element itself. I suppose we see this everywhere: a car is just self-propelled chairs; a human is just a gangly, leaky chariot for a suite of genitalia; this software is just 'arbitrary decisions' packed in a pretty box. A very pretty box that I will no doubt look back on in two years and wonder what I was thinking, I hope!~ <3
Anyway I completed it and delivered it and it is my first free-standing piece of software that some other person might actually use for their purposes, and that is a sense of accomplishment I have not felt since the WSDOT departmental library people told me they wanted to include my undergraduate thesis in their stacks.
As an aside, I had considered making a companion tool to go with the drop generator that simplified drop sheet creation. It would not be over-hard to make: all it is liable to be is another Listbox with a text entry field attached, a button or two to add and remove entries, a few other configurables, and a ConfigParser set up to save it all out, but I feel as though the drop sheet format-- sensitive as it is to typographical problems and formatting issues-- is probably easy enough to use. Also there are two people using it and I am in touch with one of them almost every day. Still, food for future thought!
Anyway, back to my game, now! It has been a long time and I am ready to face it again with fresh eyes and fewer .. days.. to live.. I guess! Hm..
See you next time! :y
#development#python#tkinter#distractions#code solutions#random drops#ConfigParser#inform#completed#longpost
3 notes
·
View notes