#fake pixel sorting
Explore tagged Tumblr posts
protography0 · 1 month ago
Text
Tumblr media
"Losing Face"
[source/stock image used: x ]
Glitch art/ditherpunk art made in GIMP with a free stock image from pexels.com. Makes use of (fake) pixel sorting. (Open in new tab for best resolution)
I stumbled over 'pixel sorting' and remembered there is a filter in GIMP that gives a similar effect. Played around with it, and looked at glitch art/pixel sorting and the phrase 'losing face' popped into my head, so that was how I got the idea to make this piece.
I then also played around with dithering options and arrived at two versions I really liked, one of which you can see here - the second one will likely be posted in the future.
I think ppl know what it is like to be so embarrased you want to disappear, to mess up in a way that feels like makes you lose a part of your confidence - maybe even your sense of self (in how others perceive us).
Fitting to make this piece in a Glitch Art style then, as this art style (from what I read) is meant to embrace imperfections and mistakes.
20 notes · View notes
abandonedniche · 2 years ago
Text
Tumblr media
18 notes · View notes
clovermusic · 7 months ago
Text
Gotta make a new version of this one I love this song
1 note · View note
insertdisc5 · 1 year ago
Text
📚 A List Of Useful Websites When Making An RPG 📚
My timeloop RPG In Stars and Time is done! Which means I can clear all my ISAT gamedev related bookmarks. But I figured I would show them here, in case they can be useful to someone. These range from "useful to write a story/characters/world" to "these are SUPER rpgmaker focused and will help with the terrible math that comes with making a game".
This is what I used to make my RPG game, but it could be useful for writers, game devs of all genres, DMs, artists, what have you. YIPPEE
Writing (Names)
Behind The Name - Why don't you have this bookmarked already. Search for names and their meanings from all over the world!
Medieval Names Archive - Medieval names. Useful. For ME
City and Town Name Generator - Create "fake" names for cities, generated from datasets from any country you desire! I used those for the couple city names in ISAT. I say "fake" in quotes because some of them do end up being actual city names, especially for french generated ones. Don't forget to double check you're not 1. just taking a real city name or 2. using a word that's like, Very Bad, especially if you don't know the country you're taking inspiration from! Don't want to end up with Poopaville, USA
Writing (Words)
Onym - A website full of websites that are full of words. And by that I mean dictionaries, thesauruses, translators, glossaries, ways to mix up words, and way more. HIGHLY recommend checking this website out!!!
Moby Thesaurus - My thesaurus of choice!
Rhyme Zone - Find words that rhyme with others. Perfect for poets, lyricists, punmasters.
In Different Languages - Search for a word, have it translated in MANY different languages in one page.
ASSETS
In general, I will say: just look up what you want on itch.io. There are SO MANY assets for you to buy on itch.io. You want a font? You want a background? You want a sound effect? You want a plugin? A pixel base? An attack animation? A cool UI?!?!?! JUST GO ON ITCH.IO!!!!!!
Visual Assets (General)
Creative Market - Shop for all kinds of assets, from fonts to mockups to templates to brushes to WHATEVER YOU WANT
Velvetyne - Cool and weird fonts
Chevy Ray's Pixel Fonts - They're good fonts.
Contrast Checker - Stop making your text white when your background is lime green no one can read that shit babe!!!!!!
Visual Assets (Game Focused)
Interface In Game - Screenshots of UI (User Interfaces) from SO MANY GAMES. Shows you everything and you can just look at what every single menu in a game looks like. You can also sort them by game genre! GREAT reference!
Game UI Database - Same as above!
Sound Assets
Zapsplat, Freesound - There are many sound effect websites out there but those are the ones I saved. Royalty free!
Shapeforms - Paid packs for music and sounds and stuff.
Other
CloudConvert - Convert files into other files. MAKE THAT .AVI A .MOV
EZGifs - Make those gifs bigger. Smaller. Optimize them. Take a video and make it a gif. The Sky Is The Limit
Marketing
Press Kitty - Did not end up needing this- this will help with creating a press kit! Useful for ANY indie dev. Yes, even if you're making a tiny game, you should have a press kit. You never know!!!
presskit() - Same as above, but a different one.
Itch.io Page Image Guide and Templates - Make your project pages on itch.io look nice.
MOOMANiBE's IGF post - If you're making indie games, you might wanna try and submit your game to the Independent Game Festival at some point. Here are some tips on how, and why you should.
Game Design (General)
An insightful thread where game developers discuss hidden mechanics designed to make games feel more interesting - Title says it all. Check those comments too.
Game Design (RPGs)
Yanfly "Let's Make a Game" Comics - INCREDIBLY useful tips on how to make RPGs, going from dungeons to towns to enemy stats!!!!
Attack Patterns - A nice post on enemy attack patterns, and what attacks you should give your enemies to make them challenging (but not TOO challenging!) A very good starting point.
How To Balance An RPG - Twitter thread on how to balance player stats VS enemy stats.
Nobody Cares About It But It’s The Only Thing That Matters: Pacing And Level Design In JRPGs - a Good Post.
Game Design (Visual Novels)
Feniks Renpy Tutorials - They're good tutorials.
I played over 100 visual novels in one month and here’s my advice to devs. - General VN advice. Also highly recommend this whole blog for help on marketing your games.
I hope that was useful! If it was. Maybe. You'd like to buy me a coffee. Or maybe you could check out my comics and games. Or just my new critically acclaimed game In Stars and Time. If you want. Ok bye
8K notes · View notes
xx-j4nu5-c4t5-xx · 7 months ago
Text
"An ideal Sims game would have Sims 2's gameplay mechanics, Sims 3's open world, and Sims 4's graphics!"
I absolutely despise this take, and I want to explain why. This is a very long rant and it is full of piss and vinegar directed at everything in the Sims 4. I'm gonna try to keep everything kinda professional as much as I can but I can't guarantee an unbiased opinion.
If you'll let me talk your ears off for a moment, I'd like to explain, from my own experience as an artist and a casual player, my issues with the art style and direction of The Sims 4 compared to The Sims 2. (I'm not really going to comment on 3 because I've never played it.)
I want to start off by explaining the difference between better graphics and higher resolution. The Sims 4 absolutely blows Sims 2 out of the water when it comes to textures and polygon counts on sims, no contest. But I'd argue that the graphics themselves... aren't better. They're worse, even, so much fucking worse. The biggest problems come from the stylization and the animations, in my opinion, so I'll explain what I mean.
Have you ever felt like the Sims in 4 just look... weird? Not quirky, not kinda strange, but off. Distressing. Uncanny. Whatever the fuck the kids call it nowadays. When you strip away the packs and the CC and the shaders, the sims in the base game look bad. They're very close to being human; they walk like us, talk like us, have families like us, but they don't look like us, not exactly. There's always something off about them, no matter how close you try to get. Proportions will be a bit off, or your eyelashes will be like three polygons for some fucking reason, and the jig is up. The illusion is gone.
This is one of the instances where a higher resolution and more detailed models and meshes work against you. You aren't making believe. You are beyond the point of pretending that the pixelated shapes are real clothes and bodies and faces, because at this point, they're close enough that you don't need to. There's no gap to bridge. But that doesn't necessarily mean that they're lifelike, at least, not enough to be completely human. In some ways, they're still tethered to being cartoony and plasticky and fake. Just enough to frighten you. Enough to put you off. They're not using it to their advantage anymore, and instead, it's holding them back.
When the Sims 2 came out in 2004, the developers knew that they weren't going to make a perfectly accurate life simulator. They physically couldn't render every wrinkle in the face or fold in the clothing. In some animations, things clip strangely or the facial expressions are sort of janky or there's just some form of roughness around the edges. But that's okay; your brain doesn't need a perfectly accurate representation this time. That's not what you're here for, anyway.
The Sims 4 is basically Icarus-ing itself into disaster. The entire game sacrifices style for complete realism, a goal that was unachievable ten years ago, and is unachievable now.
The Sims 2 never thought of itself as a completely realistic life sim, though. It has cartoony, low poly meshes and exaggerated proportions and wild, raunchy storylines that would never occur in real life. BECAUSE IT ISN'T REAL LIFE. And it isn't like real life, not because it's failing to be, but because it doesn't want to be!
The Sims 4 is not ever going to completely replicate human looks or interactions or dynamics. And if it's trying to, it's doing a shit job of it. That shouldn't be the goal in the first place. If I wanted to watch a lonely college student talk to himself in the mirror to try and get better at interacting with people, I'd close the computer and go look at myself. It somehow highlights the most mundane parts of life without any of the whimsy and goofiness that the earlier installments had. It takes itself too fucking seriously for its own good, and it's killing both the gameplay and the art style.
The other point I'd like to bring up is the animation. The Sims 4 allows for much more customization of both sim and environments, but at the cost of dynamic animations. How many times is that grab animation reused? How many times is the same set of animations used for sims with wildly different personalities? Your sims barely feel alive with how little they express themselves.
Now, look, I'm a digital artist. I've dabbled in animation, but only briefly, and only in 2D. I've got no clue how 3D animation works, much less how it worked 20 years ago, but I can see the passion in every single animation in the Sims 2. The more niche interactions allowed for more expressive animations than in 4. They could afford to have a distinct animation for mean sims throwing the football extra hard to be assholes, rather than every sim using the same generic football-throwing animation to save time and money. I get where they're coming from. I get the idea. But in one move, you've both made the art style stiffer and less expressive, and you've made the personalities of the sims seem meaningless. Everyone acts the same, regardless of what their moodlets or their traits say. It's hollow. It's stifled. It's a waste of potential.
But for what Sims 2 lacks in polygons, it makes up for in smaller animated details. Quality over quantity. The sims have hair physics, they open the door before they get in the car, they take utensils out of the counters when they cook, they jump on the couch and the cushions smush under their weight. When they dance, the weight is realistic, and when they smile, it tugs at every one of the few dozen shapes that make up their faces. The sims are lively. They dance and sing and love and hate just like humans, and rather than being some strange attempt at mimicry, it's almost a tribute. They were made with love. You can tell that they were drawn up and rigged and animated by a bunch of people working together, studying each other and making faces in the mirror for reference and watching their kids and neighbors and dogs and hands for reference. The sims are not human, and not trying to be, but they're taking the most human parts of us and making them their own.
You could never have a game with the Sims 4's graphics and the Sims 2's gameplay. The gameplay and graphics are inexorably connected, and the Sims 2 just has so much glorious detail baked into it, that you could never really make it work underneath the limitations of the later games. The developers of 2 knew what their limits were, and they worked tirelessly to make the game as full and complex as they could within those limits. The developers for the Sims 4 just did not have those guidelines, and thus, the drive to bend the rules was no longer there. They didn't go wild in rebellion because they were never told they couldn't in the first place. They spent the entire time chasing a goal they couldn't meet, and lost sight of what made the series fun to begin with.
It wasn't the realism you came for; you had realism already surrounding you. It was the caricature of it that made it interesting.
190 notes · View notes
lvciddreqms · 24 days ago
Text
Tumblr media Tumblr media
pairing: Daisuke x reader
warnings: n/a
genre: angst/comfort
a/n: first post hopefully this isn't terrible..
midnight talks
we're making it out... right..?
I've already lost track of how long we've been here. After the crash there was a drastic change in the atmosphere. I think at first everyone just wanted to stay positive for the sake of our sanity. It just gets to a certain point though. Everyone gave up after a while, they knew we weren't getting saved. And at the back of our minds.. I think everyone knew that.
During nights like these.. where it's just too cold for comfort and too silent to sleep I always found myself staring at that fake display of the sky, lost in thought. It was the only thing that provided some sort of comfort for me. Sometimes I don't want to think about anything though. It always ends up with me thinking about our current situation. So when that happens.
I think about that time where I had seen Anya and Curly talking to one another in front of the screen, before the crash. "If you look really, really close, you can see there's a dead pixel in the upper right corner." I always look for it, but I can never seem to find it. Sometimes I wondered if it was even there.
"Hey, cant sleep?" I had heard a voice speak up. I glanced over to be met with Daisuke's familiar gaze. I looked back at the screen before replying. "Yeah.. It's just hard to now.." I replied quietly. He replied with a soft hum, sitting on the couch too. It stayed silent for a short while, the room filled with thought.
"Do you think we're gonna actually get saved..?" He had asked suddenly. I looked over at him. "... I don't know..." I had replied. "... my brain knows that it's impossible, that it isn't going to happen.... but in my heart I wanna believe that there's at least some sorta chance that we'll be okay..." I pulled my knees to my chest with a light sigh.
"I know we're stuck here." He said, a solemn expression plastered onto his normally cheerful face. I couldn't help but frown, looking at his side profile. I had never heard him talk so negatively about something. "I just wish this could've ended on a better note. I wish I could've done something to make myself proud of me..I haven't even thought of what I actually wanted to do for the rest of my life.. there's no point now." He spoke. He was bitter about it and I could tell.
Seeing him so upset made me upset. I wasn't quite sure what I could even say to make him feel at least a little better. I just stared at the screen in front of me with a saddened expression. "... If it makes you feel any better.. I think I was in the same situation you were in..." I finally spoke. "After high school I had absolutely no idea what I had wanted to do...i always used to overthink about the future. I wondered how I was even gonna make it..."
I went quiet for a second, looking down. "I guess what makes me upset now is that being here is what made me find out who I wanted to be.. what I wanted to do..and now that none of it matters anymore.. I just spent so much time worrying for absolutely nothing." I said quietly. I looked over at him to see what he could possibly be thinking. Only to be met with his smile. It wasn't like his normal sort of obnoxious ones either.. It was somehow more genuine and gentle.
"you just somehow always know how to make me feel better about something..." He spoke softly, his gaze lingering on me for maybe a little longer than what was considered normal. I lightly smiled, glancing away from him as I felt my heart beat faster than usual. ".. well.. I'm glad you feel better.." I said quietly. It fell into a comfortable silence, the night ending the exact same, in front of the nighttime screen.
42 notes · View notes
tofupixel · 1 year ago
Note
Hey! I have recently started doing pixel art and I was wondering, how do you use dithering in your art?
hello, good luck in your pixel journey!
personally i don't use dithering that much, but i will tell you what i know. i think of dithering as having purpose, either to create an in-between of two colours, or to create some texture.
generally i prefer to add another colour in my palette instead of using dithering. but for this piece below i consciously made an effort to dither, i also had some guidance from a friend of mine.
Tumblr media
this is just my personal way of doing it, some people are better than me and can dither multiple colours within the same area. i personally try to only do a 2 pixel wide dither to blur the edge between colours, creating sort of a fake gradient
there are more possible dither patterns than these, but these are just what i used. like i said i really don't use it that often because i don't really enjoy the texture that it adds. so i'm not an expert
some other artists who use dither better than me you could check out: @kawaiikimu that artisan
@zaebucca
136 notes · View notes
maryellencarter · 1 year ago
Text
Tumblr media Tumblr media Tumblr media Tumblr media Tumblr media Tumblr media Tumblr media Tumblr media Tumblr media Tumblr media
ACNH creator showcase #8, Mia from Reverie! Creator code is MA-0190-3505-4239. Mia has a solidly incredible eye for fashion and design. The Moon Magic series up there clearly has every single piece designed separately, none of the copypasting to different shapes without adjusting waistlines that you see from some prolific designers. Fortunes Foretold is one of the most accurate Victorian pieces of its type I've ever seen -- I can practically hear the fringe of jet beads jingling when it moves, and feel the texture of the sheer lace apron on Sunset Maiden. The hints of pintucked yoke texture on the bodice of Garden Walk... seriously, I can't. The kind of precision it takes to do this sort of art with joycons.
Do you see the hem stripes on Autumn Cheer? The way they follow the wiggles of the skirt edge? That doesn't happen. The game cuts a curve into the lowest pixel line of your skirt on that design. Mia had to draw those stripes *curved*, following the lines of the curve the game was going to cut, in order to make them look like they were appliqued parallel to the hem. I don't think I can possibly express how much I haven't seen that done anywhere else.
October Dreams is on a kimono pattern, but when you walk, the way the skirt moves around your legs gives the illusion that it's a jumpsuit, with the costume bones placed exactly where your legs are under the fabric. Custom jumpsuits don't exist in this game. Mia faked a jumpsuit with the power of design.
People who know Breath of the Wild have probably already gotten the utter genius that's the Revali's Gale design, but for the rest of y'all -- Revali is an anthropomorphic bird. Mia's using the flappy sleeves of the kimono design to create his wings, and the same visual trick as on October Dreams for his fluffy gray-feathered legs. The colors and textures are a perfect match. Just, the sheer artistry on display here!
(Seriously. Using the kimono sleeves for his wings. I'm not gonna be over that one for A While. It's one of those strokes of genius that seems like it should have been perfectly obvious, and yet there it is and you didn't think of it first. They're the right shape and everything!)
257 notes · View notes
ralfmaximus · 9 months ago
Note
Do you know anything about Glaze and Nightshade, tools to help artists protect their art from AI scraping? I just heard about these
Sure!
The idea behind these tools is to 'poison' the art you publish by embedding pixels within the picture that humans don't notice but AI generators do. They then hoover those extra pixels up as part of the artist 'style'.
Then, when that poisoned data is used to generate new artworks, the output is skewed/distorted/bad. The human who prompted the AI becomes disillusioned, and moves on.
That artist's style has been protected!
And yes, that sort of works. But there are caveats:
it is naïve to assume AI models are only just now discovering your art, after it's been poisoned. these things have been grinding thru the internet for years and years. chances are, the art has already been stolen
same for writing, chats, memes, etc
for example: tumblr put a nice "opt out" switch in your privacy settings, but honestly? AI generators have been consuming tumblr content for years. that particular horse has already left the barn
while Glaze/Nightshade/etc do what they say NOW, the nature of AI generator technology is that it is always evolving. the next gen will be smarter, and see through this kind of protection
it is a war of escalation: AI gets better, Glaze gets better, the AI generation after that breaks the new protection, Glaze gets better again
lather, rinse, repeat
So we're totally fucked, right?
Maybe not.
As more and more AI generated bullshit makes it into the wild, that stuff goes right back into the training data for other/newer AIs. Eventually enough of that training data is mediocre/bad/meh generated bullshit that the output starts looking like that bullshit too.
In 2024 requesting "Bart Simpson as a real human" yields acceptable results. But by 2026? You'll get the hyperattenuated super-duper bad uncanny valley version that screams fake AI. Not what the user wanted at all.
And of course, the guys building these AI systems might figure out a workaround for that but maybe by then people will have figured out that our current fixation on AI is really just a stupid technology bubble, like NFT apes.
Here's hoping.
69 notes · View notes
nblemons · 7 months ago
Note
Tell us about your idea!!
AWAAAGHHG ok so. This is a Somewhat Rough Concept and the characters have no name atm but it goes something like (this ended up way longer than i meant for it to be oops):
The protagonist is a witch, from a famous family known for their very powerful sea magic. In this world, witches come of age around age 14 with a very important ceremony where they get to summon a familiar, with which they will form a very strong bond that helps them focus their magic and control it more easily. This ceremony is also the first step of the Big Important Journey all witches must go on to learn new magic and find their place in the world.
Our witch (whom ill just call Witch for now) is unfortunately a very anxious type and struggles a lot with harnessing her magic. She's unfortunately already failed her summoning ceremony a few times, which means that shes Very Late!! to her magic journey. And coming from such a prestigious family only puts more pressure on her, which messes with the already very weak control she has over her magic.
A few days before the newest attempt at her familiar ceremony, she meets a seagull who claims to be a human who was turned into a bird by a vengeful sea spirit and, having realized that she's a witch, begs for her help in breaking the curse. Witch, tender hearted as she is, wants to help! But, as she explains, curse breaking is advanced magic she can't study yet, as she doesn't have a familiar and is thus not allowed access to the parts of her family's library that would contain information about it.
After Witch finishes explaining her struggles with the ceremony as well, Seagull (placeholder name too)offers a solution: to simply fake a successful summoning, giving the witch access to the information needed to help Seagull, who would in turn help her find a real familiar later on. Witch accepts despite her worries because she's desperate to get this ceremony thing over with and also is kind of a doormat and easily convinced.
Alas, the day of the ceremony Something goes wrong and leads to them being well and truly bonded as master and familiar, with magic so strong and ancient it's generally believed to be impossible to break! And, to Witch's surprise, it turns out that Seagull is not, in fact, a human who was cursed, but rather a sea wind spirit who pissed off a much much stronger spirit and got herself stuck in bird form with no magic.
Seagull is incredibly pissed to be stuck with this doormat of a witch, because her plan was to get into the library, find information on how to break the curse and then ditch the idiot. And instead, here they are, stuck together. But! there is a silver lining: they figure out that through the link, Seagull can use Witch as a sort of battery pack and get access to a fraction of her powers.
They scour the massive library Witch's family owns, and find little to no information about how to break either the curse or the familiar bond, with just a few hints about some Myserious witch who was banished for figuring out how to break their own bond. With that being their only clue, our duo decides to embark on the previously mentioned Big Journey and look for more information.
And so start the adventures of the world's most cringefail sea witch and her mean bossy seagull familiar!
I picture this as like. a cute little adventure game where you have a boat and go from island to island, learning new magic, helping people, and looking for clues about both this banished witch and how to break Seagull's curse. ^_^ Possibly w some bonus uncovering a bigger quest surrounding the myserious witch, who knows. Im not great at coming up w this kind of stuff hsnfnfj
Like i said IDK that it'll ever get anywhere because, as previously mentioned, i'm awful at keeping to projects and also have Absolutely No Knowledge of how video games get made. But it's fun to think about! Daydreaming about cute little pixel sprites for my sillies....
Also here's my current drafts for the sea witch design (still subject to change):
Tumblr media Tumblr media
i have a few design notes on her but i need to go to bed rn HDBFNFH
37 notes · View notes
kyouka-supremacy · 6 months ago
Note
What are the things you like or appreciate about shin soukoku? /gen
(˶ᵔ ᵕ ᵔ˶)
I like sskk! I like everything about them. I feel like there's just so much to unpack about them, and there's no end to it!! After all this time I'm still finding out new possible dynamics and ways to interpret their relationship, it's so much fun. They're both very very complex characters, and their dynamics together are pretty awesome? There's the whole deal– I hate myself, so I have to hate you, because you're just like me. It's sooo cool. It's nice to see characters who hate themselves so much, but who also try to do better (Atsushi), try to be better (Akutagawa). They're both so so complex individually, and I simply adore what becomes of them when they come together. I think that when they're together, their individual characterization shines the brightest, because they're souls precisely created as parts of the same whole. And I've written about this forever ago, but I really like how their journey goes from hating each other to loving each other to loving themselves, I think it's a very nice concept to explore.
It's just a... Low-pressure ship in a lot of ways? It's something very very comforting to think about for me. As a ship, it constantly feels like saying “yeah, you do kind of suck. That doesn't mean you can't be loved.” It's just such a sweet sentiment for me!! It's not saying one shouldn't try to be better, but sometimes you do feel like you're utterly bad and unlovable, and there's no helping it; and sskk is there telling you “look. Here's two of the worst people on earth. One of them is unlovable by definition. And they still have in them to love, and to be loved.'” It's just :')
I genuinely love how both of them are kind of awful people. I mean, there's probably not a single thing about their moral code I agree with. But for some reason that makes them very compelling to explore? It's interesting to engage with characters that share worldviews so strikingly different from mine. Them having such fucked up ideals, so many flaws and selfish goals, makes them feel terribly human, and also makes them very sympathetic, in a way. They're a true mess, but one that reminds me so much of how sloppy and incoherent humans are like. Them being so distant from me greatly adds to their appeal tbh! Generally, I have a very strong moral code, and I try to do the right thing, while they're terribly selfish and self-survival driven. I'm mostly perceived as a woman, and they are two men with superpowers who fight and die for each other. I like reading about characters I can't see anything of myself in! I already have enough of myself irl lol.
Now that I think about it, I really really love how they don't mince words. Again, it's something personal, but I heavily dislike the habit of using euphemisms to sugarcoat reality. Sometimes things are unpleasant and ugly, and trying to deny it feels insulting more often than not. Sskk are always very direct, and never hesitated to tell what they think to the other's face, even if it comes at the cost of throwing insults; weirdly enough, it's something I appreciate. I think deep down, they appreciate it too.
The perspective of having someone who makes your true nature emerge is nice. Again, instead of mincing words and faking it, it's nice to imagine there's someone who could see them for who they really are, and loves them still. It's compelling to explore the true terror anyone would feel from being completely naked in front of someone else, but at the same time the sort of relief that comes with it? “This is the part of me I've always beaten up and suppressed and hidden. Look! Isn't that deeply disgusting? Yet that is nothing but the real me.”
The whole complementary-in-everything thing hits that specific part of my ocd brain that has me do stuff like organize my posts in a coherent string so that every post is connected to the previous, have every post posted at a round number timespan, count the pixels in every single picture I trim etc. Atsushi is mostly white in his design and Akutagawa is mostly black but the colors are reversed when they use their abilities combined. Atsushi is good and Akutagawa is evil. Tiger & dragon & cat & dog. Blue and red. government-affiliated job and mafia. Healthy and regenerating vs. sick and decaying. Loved & hated. Attractive and hideous. One loves reading and the other finds it unnerving, one knows how to cook and the other is a cooking disaster, one likes coffee and the other likes tea, early bird and night owl, so on and so forth. Then, the fact that when they come together they end up looking so deeply similar is kind of neat, it's like there's some sort of Hegelian synthesis in their love.
Their canon moments are truly great and exciting. I care relatively little about the amount of moments a ship has in canon– an interesting dynamic is an interesting dynamic no matter their screentime, right? And you're free to imagine what the characters interacting would be like in your head any time. And while I still like to believe their relationship would still be very compelling even without the moments they share, wow. Their canon screentime is crazy, it's outstanding. I think the depiction of their dynamics in canon is exceptionally good, and extremely well-written. The “the words of your past are fundamentally unrelated to who you are now”, the Atsushi wearing Rashomon, the “you damn fool // hurry up and go”, the “just the two of us?”– they're all such epic and sublime moments, every time they leave the reader gaping and bewildered and, frankly, wondering if that really happened. And their scenes are so consistently homoerotically charged!! From the “it's been reserved solely for you today” to the “the man-tiger's my main dish” to the “their eyes met. Akutagawa's lips moved, mouthing the words I found you” to the “once this is done, I'm going to teach you things other than ‘killing’ ” to the “as long as I can't deny your very being, I'll never be able to move forward” to the “don't touch me! Disgusting!” to the “I'm sorry”. From Akutagawa piercing Atsushi with Rashomon to kicking him to getting unnecessarily close to his face. From every second they've spent admiring each other to the way they call out each other's names with so much passion. The list goes on forever. And chapters 84-88 are short to a masterpiece. The characters' growth is madly well-executed, how we see them go through it almost step-by-step, and it's all so consistent, and it's all so human.
Finally, the picture that made me go “Ah! There's something about them!” for the first time. It's very dear to me :)
Tumblr media
It's got Atsushi being cute and Akutagawa looking at him with a fairly undecipherable expression that yet is distinctively non-hostile, and this precise illustration made my brain go “Wow, what if Akutagawa actually had a soft spot for Atsushi. What if there was tenderness in his eyes.” Then it all went downhill from there ahah
26 notes · View notes
canarysage · 1 year ago
Note
hiii so sorry if this is a stupid question but how do you make icons that aren’t squares? the only canvas i can make Is square 🥲
Tumblr media
how to make shaped icons!
no worries anon! things like this can be a little confusing at first, so i get you. let’s get into it!
first thing’s first is creating a new project in photopea. i tend to make my icons 300x300, but it doesn’t really matter the dimensions as long as they match (so you shouldn’t do 750x700, for example.) make sure your background is set to transparent (no worries if you forgot this step—just delete the colored background layer!)
Tumblr media
next thing is getting the shape! i tend to use photopea’s shape tool for this, since it’s easiest for me, but you can also just google “circle png” or something. (make sure your image is actually transparent, though. click and drag or click and hold and see if the dotted background lingers or goes away!)
Tumblr media
for the first icon, i’m going to use the ellipse tool. feel free to change the color of your shape—i usually set backgrounds later, but that’s up to you. the exact dimensions of this shape don’t matter, but like your canvas, they have to match so the circle is even. click and drag to make your shape
Tumblr media
as you can see, my shape isn’t centered just yet—but i corrected that by using the click and drag tool: the one at very top of your sidebar. photopea will center and align your shape for you if you move it towards the middle
now you have your base! time to start adding backgrounds and such things. i used my usual method for the background, but you can do whatever. one thing to make sure for this step is to set all your layers to clipping mask (putting the shape below all your other layers)
to find clipping mask click the button that says layer at the top
Tumblr media
as you can see, my gradient fill is already clipped mask’ed. if for whatever reason you want your layers un-clipping mask’ed later, just go back and click the clipping mask button again. (i’ve said clipping mask too many times. it feels like a fake word.)
Tumblr media
(hello, haruka!) this is how my icon looks so far! everything is clipped mask’ed to my circle. if you’d like, you can stop here, and download your image. i went ahead and added a psd. unless you’re using a color fill later or something similar in your psd, that doesn’t really need to be clipping mask’ed.
Tumblr media
(the psd i used here is really simple and i didn’t save it, but always put your psds in folders, just to make your life easier.)
now that we’ve got that done, time to export! make sure that you export as a png. otherwise, your icon will still be square.
Tumblr media Tumblr media
the finished product! pretty simple, right? you can use this method for all sorts of shapes. i went ahead and did two other kinds—bordered and faded.
for the border, i copied my original shape (a square in this instance) and switched the fill mode to the icon with an x through it, and switched the stroke mode to a solid color, and set the stroke to seven pixels. i think for bordered icons you can also shift the border so that there’s a space between it and your icon, but i left it where it was this time
Tumblr media
as you can see, i didn’t change any other layers, except that i duplicated my gradient fill! this is the same project i was working on before, just with a different base.
Tumblr media
now for the faded icon! i used a heart shape for this, as that’s pretty standard, “but wait! photopea’s shape tool doesn’t have a heart option!” it does, actually! it’s just hidden. click your shape tool and go down to custom shapes. then scroll at the top until you see the little arrow with the star beneath it (which should be as far right as you can scroll.)
Tumblr media
wow! so many shapes!! i scrolled down until i found the heart, and added it. the heart i didn’t worry too much about the numbers—i just adjusted it until it looked nice.
now to make our heart faded! first thing to do is to rasterize your shape layer. make sure you have your dimensions and everything set before you do this, as you won’t be able to correct them after your shape is rasterized.
Tumblr media
rasterize can be found in the layer drop-down menu, where you found clipping mask. click that, and now you can blur your shape! the blur tool can be found in filter > blur > gaussian blur. you can also use motion blur or radial blur, but i like gaussian blur
Tumblr media
clicking gaussian blur will give you one of our old friends the sliders. just mess with that until it looks about right. click “ok” once you’ve got it set how you want it
Tumblr media
i also adjusted my heart’s sizing a bit by going to edit > free transform and making it bigger. just do what looks good to you!
Tumblr media
and there’s your faded icon!
i hope this is helpful!! feel free to ask if you have any questions :3
sincerely, eos
80 notes · View notes
quillyfied · 8 months ago
Text
Alright, reacting messy and all over the place to this trailer, LET’S GO:
Okay, strong opening: hooded figures (one of whom is checking his watch, which is hilarious, but the skin of the hand also looks red, so probably demons?), red background (good argument for Pride), Blitzo getting IMP out of dodge and then IMMEDIATELY crashing the van, good for you bud I’m so proud (but not as proud as I am of Moxxie chewing Blitzo out without a single “sir” thrown in there). Couldn’t begin to guess when this takes place, but since the van is crunched up later during a bit that is, I am 99% sure, Ghostfuckers, then this is probably Apology Tour. Hooded figures might not have anything to do at all with the gang running for it.
FIZZ THERE IS SUCH A THING AS A SEX TOY THAT IS TOO BIG. I’m not sure if you’ve found it but it’s close :P Lots of fun little clips, though Moxxie dodging a blue fire explosion in Lust doesn’t look good.
DHORKS AND CHERUB WORKING TOGETHER I KNEW IT I HECKING KNEW IT I’M SO MAD I NEVER MADE A POST ABOUT IT BECAUSE I’VE BEEN SO CERTAIN OF IT FOR MONTHS NOW. AAAARGH. AND I CAN’T PROVE IT!! But look at Collin, he looks so unsure compared to the other two. Poor guy. Okay, Blitzo is leaving a card of some sort in front of Agent One, and he’s using the crystal, so this is very much giving me Mastermind vibes (or even Sinsmas, if it's after the conflict and this is just Blitzo messing with them now). Humans being able to open a portal to Hell…that ain’t good!
Something coming at the gang from…looks like their office? And it’s round and spiky…could be whatever it is that’s making them go on the run, whenever that is (Apology Tour is my current guess).
CLETUS IS IRON MAN NOW.
(Listen I’ve been having visions about Blitzo being on trial for stirring up so much crap in the human world that it’s started to have repercussions in Hell so the fact that there seems to be a meeting or trial of some sort later having to do with Stolas is making me think maybe I’m a prophet. I’ll maybe explain more later in a different post but dropping it here bc it’s part of my thought process right now.)
Blitzo why did you give your fake ID such a rack and then neglect it as part of your human disguise XD I’m disappointed in you, babe. I’m also wondering what in the unholy hell a demon wants with a haunted house on Earth (and if that’s Leviathan like many people have been speculating, what is A DEADLY SIN doing in a HAUNTED HOUSE on EARTH???). (Also that is the single most awkward angle of Blitzo of all time, why on earth is he wearing white leggings because if he was naked we would be seeing some pixelation here…unless imps can retract their junk, which I’m open to.)
Ooh, quick shot of Loona operating a machine gun in Lust! Nice! (Hey quick Q where’s Blitzo in all of this??)
Helloooooo, Vassago! Excited to meet you! Really looks like there’s some sort of trial or meeting in Pride and Stolas might be either the topic of discussion or literally on trial, and it wouldn’t surprise me at all to have Andrealphus trying to get Stolas demoted or something similar without Stolas even being there. So Vassago actually wanting him present looks good on him for now. But this is a trailer, things can be misleading, but anyone who looks that fed up when dealing with Andrealphus can’t be all that bad :P Thinking this is also during Mastermind, or possibly Sinsmas.
Okay, first really significant shot I’m noticing of short-sleeve Blitzo makes me think it might be Full Moon, because he’s sort of off to the side while the focus is on Stolas talking about how this transactional thing between them isn’t right anymore. Though. Hmm. Stolas is in full regalia for this. And there’s a shot later of short-sleeve Blitzo trying to go for Stolas’ hand and winding up outside (portal? Didn’t seem like it) and Stolas is in his robe when that happens. Musical number with metaphorical sequences? I am jumping in here to correct myself bc I forgot that Stolas’ fancy cloak and romper are both red. Heck. Why does this show only have two colors XD
Sun/moon seems to be during Apology Tour, if that’s when Stolas and Verosika are on a stage together.
And short-sleeve Blitzo with a Dankee Candle, good on you man XD (that’s been one of the more compelling arguments for short-sleeve Blitzo being during Sinsmas, not Full Moon, because gift-giving, but the bits of deep conversation that keep happening with Blitzo in short sleeves sound very much like a conversation that needs to happen during Full Moon and I can’t imagine they’ll wait an entire season for it).
Now the heart-rending bit that’s definitely during a musical number with kiddo Stolitz and then grownup Stolitz, currently voiced over that heart-stabbing “you think you can toy with our feelings because we’re smaller and less important��� monologe from Blitzo, it’s FINE I’M FINE (Though…looking really closely…I am not sure if that’s when that monologue occurs? The mouth movements ever so slightly don’t match up. But animation technically has some leeway when it comes to that kind of thing.)
OKAY CALLING IT NOW, TEEN BLITZO AND TILLA SCENE IS DURING GHOSTFUCKERS. I don’t even think it’s a flashback, I just think Blitzo’s brain is being fucked with and he’s seeing his mom and visually reverting back to a teenager. The carpet behind Blitzo and the lighting are mostly what I’m basing this on. Also how fucked up would it be if Blitzo sees a ghost of his mom only for it to reflect his internal monologue about how terrible he is back at him, amirite :P
Okay sassy short-robe Stolas is Apology Tour, calling it now; he and Blitzo have “we’re about to hatefuck” energy off the charts and Stolas in particular is being so bitchy and petty-looking. And angry. And kinda sad. Am I ready for their breakup era to be full of bickering? Yes. Yes I am. I’m also skeptical that the smile that’s on Blitzo’s face during Stolas’ sarcastic little bow is going to be the expression on his face when the episode comes out, but I’m ready to be surprised.
HELLOOOOOO NURSE! YES TODAY SATAN! (Deeply curious about who’s the disgrace, have a current bet going on whether it’s Ozzie or possibly even Stolas, but I could be pleasantly surprised and it’s Mammon :P) Pretty sure the trial/meeting is happening during Sinsmas, actually, it would be too funny to call an episode that when introducing a new Sin. Also short moment to appreciate that Mammon brings fidgets to meetings, of course he does. My guy. My dude. Also his reaction is what makes me think Satan is talking to Ozzie, because Mammon would have no reason to look that gleeful at anyone but Ozzie.
WHERE DID BLITZO GET THAT SWORD THO. (AND ALSO HOW BADLY IS IT ACTUALLY GONNA FUCK UP ANDREALPHUS’ WHOLE DAY BECAUSE THAT’S DEFINITELY ANDREALPHUS ABOUT TO COME DOWN ON THEM LIKE A SACK OF FROZEN HAMMERS) Blitzo trying to protect Stolas, kill me ;A; Stolas looks like he’s in regalia, though sans cloak or hat…why is he at Andrealphus’ place, and why is it looking like he can’t fight back? Stripped of his powers, maybe? Anyway this is Sinsmas, no doubt about it, it’s got season finale energy.
If the haunted house guy is actually Leviathan, I have SO MANY QUESTIONS.
Why is IMP in Lust getting attacked by CHERUB/DHORKS? I have more questions.
“Everyone’s shitty, we live in Hell!” Valid, but also, cop-out.
I’m very curious about what is making Blitzo make that face, because it’s not the cake; it looks like Verosika is cutting it but then she’s also sitting next to him on the railing where he’s sitting, so…? Anyway, it’s Apology Tour, and can I just say how EXCITED I am to get to know more about what happened with Blitzo and Verosika and maybe see some closure for them both on that front? Because YIKES their dynamic means there is a good, juicy story behind it. But also, Blitzo why are you wearing a bloodstained sheet?? (Presumably to sneak around but why did he choose THAT OBJECT, is really my question.)
Millie fighting possibly possessed Blitzo and what appears to be a flashback to Millie and Blitzo’s first fight (could be a time skip but it makes more sense for it to be a flashback given Millie’s hair and Blitzo’s fashion) (side note but dammit why are they both so hot) let me know something new about myself, and it’s how very, very much I want to see Millie and Blitzo kicking the crap out of each other XD Blitzo and Moxxie got to spill their guts in a drug-induced hallucination; I want Blitzo and Millie to fight each other bloody. They’re bonding and sharing deep intimate feelings, guys :P
And the Millie voiceover where she’s telling Blitzo how much he takes from others? Probably during whatever weird hallucination (PLEASE be a hallucination) involves Millie with tied wrists, a branch in her hair, and a ton of glass sticking out of her eye. Ghostfuckers, perhaps? Would make the most sense but how much stuff could that episode POSSIBLY have, oh my word.
(Short-sleeved Blitzo dropping a ton of paperwork on Moxxie also makes me think that’s his date outfit for Full Moon; can’t do this mountain of paperwork, sorry Mox, he has a daaaaate)
Panning to Verosika at the part when she gets to “and leave them worse than when you found them” holy HELL
“Do you feel any remorse for the things you do” yeah somehow I think that’s aimed at Blitzo, y’all. Just from what we’ve seen of Stolas in that particular robe and his general expressions and actions that whole time, and the fact that he seems to be talking to Blitzo (if not an imagining of Blitzo) the whole time. But it panning to Andrealphus about to go super Saiyan does make me laugh super hard actually (bc NO THAT BITCH DOES NOT).
ENTIRE MOMENT OF BREATHLESS SILENCE FOR OCTAVIA CALLING STOLAS OUT. It’s been so complexly beautiful to watch this show not shy away from how much self-hatred and low self-worth hurts loved ones too, and especially to watch that play out with how Octavia and Stolas’ relationship is changing and hurting from Stolas himself changing and hurting, but to have it called out so bluntly really makes me wonder what in the high holy heck is about to happen and when this conversation takes place. I have a horror that it’s during Mastermind or whenever the trial/meeting is, because perhaps Andrealphus and Stella manage to turn Via on Stolas and tell her that whatever is about to happen to Stolas is deserved or for the best, but. Uh. Hmm. Hmmmm. (Because all of Stolas’ power and possessions passing to Via doesn’t mean that Via is old enough or prepared for them and giving them to her would put all that power somewhere that is potentially much easier to manipulate/control, but I have a lot of thoughts about how Stella feels about Via and how that colors how Andrealphus treads around the subject of Via when talking to Stella about her and it’s not for this trailer reaction.)
(Apology Tour involving not just apologizing to Verosika, but to Stolas, too? I can only hope, though it’ll be far from simple; I don’t think Stolitz is going to sort out their issues and get together fully this season, but I’m hoping for some steps.)
(Also PLEASE can we get some Stella development that maybe sheds some dimension on her spoiled brat personality)
VIA SONG VIA SONG VIA SONG VIA SONG (maybe about her own magic and her life and how it all kinda fell apart so fast even as she’s growing up so fast poor girl)
Pretty sure the mirrors shattering thing is happening during the Stolas Apology Tour song, but we’ll see. Gosh there’s gonna be a lot of songs this half of the season.
Millie getting a short is such a good thing for her as a character, but I also love that she’s getting an episode with Blitzo, because out of everyone at IMP, I’ve been waiting for her to be the one that Blitzo has a major breakdown in front of; seems like Ghostfuckers is going to give me my wish! I don’t think she’s gonna coddle him or be overly sweet about it, but I do think she has a way of getting through to him and handling him in a way he wouldn’t let Moxxie do and couldn’t handle Loona doing either. Tough love but sweet? Idk man. Unless this is the moment he starts getting possessed. Who knows.
I am SO CURIOUS about who is going through the movie of Blitzo’s past traumas where he ruins the lives of everyone he loves; I’ve heard speculation that it’s haunted house dude, which would match up with Blitzo having a nervous breakdown in Ghostfuckers, but I dunno.
Oh that soft Blitzo look from under the bloodstained sheet. Oh that happy smiling Stolas that I’m now more convinced is taking place in the same general episode, if not sequentially after each other like that. Blitzo goes from looking so miserable to maybe looking more hopeful. Or perhaps yearning. I’m not sure how to interpret the expression, it’s just really heart-wrenching okay. And Stolas is wearing the same outfit as he is when he’s onstage with Verosika so what even IS this episode.
The very businesslike way Stolas says “Thank you, Blitzo” before he softens up makes me think THAT is what’s gonna finish up the Full Moon argument, but it does make me wonder what on earth Blitzo says that gets Stolas acting the way he does in potentially the very next episode.
Overall it’s a well-produced trailer that I’m sure we’re all going to be dissecting frame by frame for a long time! Whee!
16 notes · View notes
andymakesgames · 8 months ago
Text
Balatro-Inspired Spinning Card Tweetcart Breakdown
I recently made a tweetcart of a spinning playing card inspired by finally playing Balatro, the poker roguelike everybody is talking about.
If you don't know what a tweetcart is, it's a type of size-coding where people write programs for the Pico-8 fantasy console where the source code is 280 characters of less, the length of a tweet.
I'm actually not on twitter any more, but I still like 280 characters as a limitation. I posted it on my mastodon and my tumblr.
Here's the tweetcart I'm writing about today:
Tumblr media
And here is the full 279 byte source code for this animation:
a=abs::_::cls()e=t()for r=0,46do for p=0,1,.025do j=sin(e)*20k=cos(e)*5f=1-p h=a(17-p*34)v=a(23-r)c=1+min(23-v,17-h)%5/3\1*6u=(r-1)/80z=a(p-.2)if(e%1<.5)c=a(r-5)<5and z<u+.03and(r==5or z>u)and 8or 8-sgn(h+v-9)/2 g=r+39pset((64+j)*p+(64-j)*f,(g+k)*p+(g-k)*f,c)end end flip()goto _
This post is available with much nicer formatting on the EMMA blog. You can read it here.
You can copy/paste that code into a blank Pico-8 file to try it yourself. I wrote it on Pico-8 version 0.2.6b.
I'm very pleased with this cart! From a strictly technical perspective I think it's my favorite that I've ever made. There is quite a bit going on to make the fake 3D as well as the design on the front and back of the card. In this post I'll be making the source code more readable as well as explaining some tools that are useful if you are making your own tweetcarts or just want some tricks for game dev and algorithmic art.
Expanding the Code
Tweetcarts tend to look completely impenetrable, but they are often less complex than they seem. The first thing to do when breaking down a tweetcart (which I highly recommend doing!) is to just add carriage returns after each command.
Removing these line breaks is a classic tweetcart method to save characters. Lua, the language used in Pico-8, often does not need a new line if a command does not end in a letter, so we can just remove them. Great for saving space, bad for readability. Here's that same code with some line breaks, spaces and indentation added:
a=abs ::_:: cls() e=t() for r=0,46 do for p=0,1,.025 do j=sin(e)*20 k=cos(e)*5 f=1-p h=a(17-p*34) v=a(23-r) c=1+min(23-v,17-h)%5/3\1*6 u=(r-1)/80 z=a(p-.2) if(e%1<.5) c= a(r-5) < 5 and z < u+.03 and (r==5 or z>u) and 8 or 8-sgn(h+v-9)/2 g=r+39 pset((64+j)*p+(64-j)*f,(g+k)*p+(g-k)*f,c) end end flip()goto _
Note: the card is 40 pixels wide and 46 pixels tall. Those number will come up a lot. As will 20 (half of 40) and 23 (half of 46).
Full Code with Variables and Comments
Finally, before I get into what each section is doing, here is an annotated version of the same code. In this code, variables have real names and I added comments:
[editor's note. this one came out terribly on tumblr. Please read the post on my other blog to see it]
This may be all you need to get a sense of how I made this animation, but the rest of this post will be looking at how each section of the code contributes to the final effect. Part of why I wanted to write this post is because I was happy with how many different tools I managed to use in such a small space.
flip() goto_
This pattern shows up in nearly every tweetcart:
::_:: MOST OF THE CODE flip()goto _
This has been written about in Pixienop's Tweetcart Basics which I highly recommend for anybody curious about the medium! The quick version is that using goto is shorter than declaring the full draw function that Pico-8 carts usually use.
Two Spinning Points
The card is drawn in rows starting from the top and going to the bottom. Each of these lines is defined by two points that move around a center point in an elliptical orbit.
The center of the top of the card is x=64 (dead center) and y=39 (a sort of arbitrary number that looked nice).
Then I get the distance away from that center that my two points will be using trigonometry.
x_dist = sin(time)*20 y_dist = cos(time)*5
Here are those points:
Tumblr media
P1 adds x_dist and y_dist to the center point and P2 subtracts those same values.
Those are just the points for the very top row. The outer for loop is the vertical rows. The center x position will be the same each time, but the y position increases with each row like this: y_pos = row+39
Here's how it looks when I draw every 3rd row going down:
Tumblr media
It is worth noting that Pico-8 handles sin() and cos() differently than most languages. Usually the input values for these functions are in radians (0 to two pi), but in Pico-8 it goes from 0 to 1. More info on that here. It takes a little getting used to but it is actually very handy. More info in a minute on why I like values between 0 and 1.
Time
In the shorter code, e is my time variable. I tend to use e for this. In my mind it stands for "elapsed time". In Pico-8 time() returns the current elapsed time in seconds. However, there is a shorter version, t(), which obviously is better for tweetcarts. But because I use the time value a lot, even the 3 characters for t() is often too much, so I store it in the single-letter variable e.
Because it is being used in sine and cosine for this tweetcart, every time e reaches 1, we've reached the end of a cycle. I would have liked to use t()/2 to slow this cart down to be a 2 second animation, but after a lot of fiddling I wound up being one character short. So it goes.
e is used in several places in the code, both to control the angle of the points and to determine which side of the card is facing the camera.
Here you can see how the sine value of e controls the rotation and how we go from showing the front of the card to showing the back when e%1 crosses the threshold of 0.5.
Tumblr media
Drawing and Distorting the Lines
Near the top and bottom of the loop we'll find the code that determines the shape of the card and draws the horizontal lines that make up the card. Here is the loop for drawing a single individual line using the code with expanded variable names:
for prc = 0,1,.025 do x_dist = sin(time)*20 y_dist = cos(time)*5 ... y_pos = row+39 pset( (64+x_dist)*prc + (64-x_dist)*(1-prc), (y_pos+y_dist)*prc + (y_pos-y_dist)*(1-prc), color) end
You might notice that I don't use Pico-8's line function! That's because each line is drawn pixel by pixel.
This tweetcart simulates a 3D object by treating each vertical row of the card as a line of pixels. I generate the points on either side of the card(p1 and p2 in this gif), and then interpolate between those two points. That's why the inner for loop creates a percentage from 0 to 1 instead of pixel positions. The entire card is drawn as individual pixels. I draw them in a line, but the color may change with each one, so they each get their own pset() call.
Here's a gif where I slow down this process to give you a peek at how these lines are being drawn every frame. For each row, I draw many pixels moving across the card between the two endpoints in the row.
Tumblr media
Here's the loop condition again: for prc = 0,1,.025 do
A step of 0.025 means there are 40 steps (0.025 * 40 = 1.0). That's the exact width of the card! When the card is completely facing the camera head-on, I will need 40 steps to make it across without leaving a gap in the pixels. When the card is skinnier, I'm still drawing all 40 pixels, but many of them will be in the same place. That's fine. The most recently drawn one will take priority.
Getting the actual X and Y position
I said that the position of each pixel is interpolated between the two points, but this line of code may be confusing:
y_pos = row+39 pset( (64+x_dist)*prc + (64-x_dist)*(1-prc), (y_pos+y_dist)*prc + (y_pos-y_dist)*(1-prc), color)
So let's unpack it a little bit. If you've ever used a Lerp() function in something like Unity you've used this sort of math. The idea is that we get two values (P1 and P2 in the above example), and we move between them such that a value of 0.0 gives us P1 and 1.0 gives us P2.
Here's a full cart that breaks down exactly what this math is doing:
Tumblr media
::_:: cls() time = t()/8 for row = 0,46 do for prc = 0,1,.025 do x_dist = sin(time)*20 y_dist = cos(time)*5 color = 9 + row % 3 p1x = 64 + x_dist p1y = row+39 + y_dist p2x = 64 - x_dist p2y = row+39 - y_dist x = p2x*prc + p1x*(1-prc) y = p2y*prc + p1y*(1-prc) pset( x, y, color) end end flip()goto _
I'm defining P1 and P2 very explicitly (getting an x and y for both), then I get the actual x and y position that I use by multiplying P2 by prc and P1 by (1-prc) and adding the results together.
This is easiest to understand when prc is 0.5, because then we're just taking an average. In school we learn that to average a set of numbers you add them up and then divide by how many you had. We can think of that as (p1+p2) / 2. This is the same as saying p1*0.5 + p2*0.5.
But the second way of writing it lets us take a weighted average if we want. We could say p1*0.75 + p2*0.25. Now the resulting value will be 75% of p1 and 25% of p2. If you laid the two values out on a number line, the result would be just 25% of the way to p2. As long as the two values being multiplied add up to exactly 1.0 you will get a weighted average between P1 and P2.
I can count on prc being a value between 0 and 1, so the inverse is 1.0 - prc. If prc is 0.8 then 1.0-prc is 0.2. Together they add up to 1!
I use this math everywhere in my work. It's a really easy way to move smoothly between values that might otherwise be tricky to work with.
Compressing
I'm using a little over 400 characters in the above example. But in the real cart, the relevant code inside the loops is this:
j=sin(e)*20 k=cos(e)*5 g=r+39 pset((64+j)*p+(64-j)*f,(g+k)*p+(g-k)*f,c)
which can be further condensed by removing the line breaks:
j=sin(e)*20k=cos(e)*5g=r+39pset((64+j)*p+(64-j)*f,(g+k)*p+(g-k)*f,c)
Because P1, P2 and the resulting interpolated positions x and y are never used again, there is no reason to waste chars by storing them in variables. So all of the interpolation is done in the call to pset().
There are a few parts of the calculation that are used more than once and are four characters or more. Those are stored as variables (j, k & g in this code). These variables tend to have the least helpful names because I usually do them right at the end to save a few chars so they wind up with whatever letters I have not used elsewhere.
Spinning & Drawing
Here's that same example, but with a checker pattern and the card spinning. (Keep in mind, in the real tweetcart the card is fully draw every frame and would not spin mid-draw)
Tumblr media
This technique allows me to distort the lines because I can specify two points and draw my lines between them. Great for fake 3D! Kind of annoying for actually drawing shapes, because now instead of using the normal Pico-8 drawing tools, I have to calculate the color I want based on the row (a whole number between0 and 46) and the x-prc (a float between 0 and 1).
Drawing the Back
Here's the code that handles drawing the back of the card:
h=a(17-p*34) v=a(23-r) c=1+min(23-v,17-h)%5/3\1*6
This is inside the nested for loops, so r is the row and p is a percentage of the way across the horizontal line.
c is the color that we will eventually draw in pset().
h and v are the approximate distance from the center of the card. a was previously assigned as a shorthand for abs() so you can think of those lines like this:
h=abs(17-p*34) v=abs(23-r)
v is the vertical distance. The card is 46 pixels tall so taking the absolute value of 23-r will give us the distance from the vertical center of the card. (ex: if r is 25, abs(23-r) = 2. and if r is 21, abs(23-r) still equals 2 )
As you can probably guess, h is the horizontal distance from the center. The card is 40 pixels wide, but I opted to shrink it a bit by multiplying p by 34 and subtracting that from half of 34 (17). The cardback just looks better with these lower values, and the diamond looks fine.
The next line, where I define c, is where things get confusing. It's a long line doing some clunky math. The critical thing is that when this line is done, I need c to equal 1 (dark blue) or 7 (white) on the Pico-8 color pallette.
Here's the whole thing: c=1+min(23-v,17-h)%5/3\1*6
Here is that line broken down into much more discrete steps.
c = 1 --start with a color of 1 low_dist = min(23-v,17-h) --get the lower inverted distance from center val = low_dist % 5 --mod 5 to bring it to a repeating range of 0 to 5 val = val / 3 --divide by 3. value is now 0 to 1.66 val = flr(val) --round it down. value is now 0 or 1 val = val * 6 --multiply by 6. value is now 0 or 6 c += val --add value to c, making it 1 or 7
The first thing I do is c=1. That means the entire rest of the line will either add 0 or 6 (bumping the value up to 7). No other outcome is acceptable. min(23-v,17-h)%5/3\1*6 will always evaluate to 0 or 6.
I only want the lower value of h and v. This is what will give it the nice box shape. If you color the points inside a rectangle so that ones that are closer to the center on their X are one color and ones that are closer to the center on their Y are a different color you'll get a pattern with clean diagonal lines running from the center towards the corners like this:
Tumblr media
You might think I would just use min(v,h) instead of the longer min(23-v,17-h) in the actual code. I would love to do that, but it results in a pattern that is cool, but doesn't really look like a card back.
Tumblr media
I take the inverted value. Instead of having a v that runs from 0 to 23, I flip it so it runs from 23 to 0. I do the same for h. I take the lower of those two values using min().
Then I use modulo (%) to bring the value to a repeating range of 0 to 5. Then I divide that result by 3 so it is 0 to ~1.66. The exact value doens't matter too much because I am going round it down anyway. What is critical is that it will become 0 or 1 after rounding because then I can multiply it by a specific number without getting any values in between.
Wait? If I'm rounding down, where is flr() in this line: c=1+min(23-v,17-h)%5/3\1*6?
It's not there! That's because there is a sneaky tool in Pico-8. You can use \1 to do the same thing as flr(). This is integer division and it generally saves a 3 characters.
Finally, I multiply the result by 6. If it is 0, we get 0. If it is 1 we get 6. Add it to 1 and we get the color we want!
Here's how it looks with each step in that process turned on or off:
Tumblr media
A Note About Parentheses
When I write tweetcarts I would typically start by writing this type of line like this: c=1+ (((min(23-v,17-h)%5)/3) \1) *6
This way I can figure out if my math makes sense by using parentheses to ensure that my order of operations works. But then I just start deleting them willy nilly to see what I can get away with. Sometimes I'm surprised and I'm able to shave off 2 characters by removing a set of parentheses.
The Face Side
The face side with the diamond and the "A" is a little more complex, but basically works the same way as the back. Each pixel needs to either be white (7) or red (8). When the card is on this side, I'll be overwriting the c value that got defined earlier.
Tumblr media
Here's the code that does it (with added white space). This uses the h and v values defined earlier as well as the r and p values from the nested loops.
u=(r-1)/80 z=a(p-.2) if(e%1<.5) c= a(r-5) < 5 and z < u+.03 and (r==5 or z>u) and 8 or 8-sgn(h+v-9)/2
Before we piece out what this is doing, we need to talk about the structure for conditional logic in tweetcarts.
The Problem with If Statements
The lone line with the if statement is doing a lot of conditional logic in a very cumbersome way designed to avoid writing out a full if statement.
One of the tricky things with Pico-8 tweetcarts is that the loop and conditional logic of Lua is very character intensive. While most programming language might write an if statement like this:
if (SOMETHING){ CODE }
Lua does it like this:
if SOMETHING then CODE end
Using "then" and "end" instead of brackets means we often want to bend over backwards to avoid them when we're trying to save characters.
Luckily, Lua lets you drop "then" and "end" if there is a single command being executed inside the if.
This means we can write
if(e%1 < 0.5) c=5
instead of
if e%1 < 0.5 then c=5 end
This is a huge savings! To take advantage of this, it is often worth doing something in a slightly (or massively) convoluted way if it means we can reduce it to a single line inside the if. This brings us to:
Lua's Weird Ternary Operator
In most programming language there is an inline syntax to return one of two values based on a conditional. It's called the Ternary Operator and in most languages I use it looks like this:
myVar = a>b ? 5 : 10
The value of myVar will be 5 if a is greater than b. Otherwise is will be 10.
Lua has a ternary operator... sort of. You can read more about it here but it looks something like this:
myVar = a>b and 5 or 10
Frankly, I don't understand why this works, but I can confirm that it does.
In this specific instance, I am essentially using it to put another conditional inside my if statement, but by doing it as a single line ternary operation, I'm keeping the whole thing to a single line and saving precious chars.
The Face Broken Out
The conditional for the diamond and the A is a mess to look at. The weird syntax for the ternary operator doesn't help. Neither does the fact that I took out any parentheses that could make sense of it.
Here is the same code rewritten with a cleaner logic flow.
--check time to see if we're on the front half if e%1 < .5 then --this if checks if we're in the A u=(r-1)/80 z=a(p-.2) if a(r-5) < 5 and z < u+.03 and (r==5 or z>u) then c = 8 --if we're not in the A, set c based on if we're in the diamond else c = 8-sgn(h+v-9)/2 end end
The first thing being checked is the time. As I explained further up, because the input value for sin() in Pico-8 goes from 0 to 1, the midpoint is 0.5. We only draw the front of the card if e%1 is less than 0.5.
After that, we check if this pixel is inside the A on the corner of the card or the diamond. Either way, our color value c gets set to either 7 (white) or 8 (red).
Let's start with diamond because it is easier.
The Diamond
This uses the same h and v values from the back of the card. The reason I chose diamonds for my suit is that they are very easy to calculate if you know the vertical and horizontal distance from a point! In fact, I sometimes use this diamond shape instead of proper circular hit detection in size-coded games.
Let's look at the line: c = 8-sgn(h+v-9)/2
This starts with 8, the red color. Since the only other acceptable color is 7 (white), tha means that sgn(h+v-9)/2 has to evaluate to either 1 or 0.
sgn() returns the sign of a number, meaning -1 if the number is negative or 1 if the number is positive. This is often a convenient way to cut large values down to easy-to-work-with values based on a threshold. That's exactly what I'm doing here!
h+v-9 takes the height from the center plus the horizontal distance from the center and checks if the sum is greater than 9. If it is, sgn(h+v-9) will return 1, otherwise -1. In this formula, 9 is the size of the diamond. A smaller number would result in a smaller diamond since that's the threshold for the distance being used. (note: h+v is NOT the actual distance. It's an approximation that happens to make a nice diamond shape.)
OK, but adding -1 or 1 to 8 gives us 7 or 9 and I need 7 or 8.
That's where /2 comes in. Pico-8 defaults to floating point math, so dividing by 2 will turn my -1 or 1 into -0.5 or 0.5. So this line c = 8-sgn(h+v-9)/2 actually sets c to 7.5 or 8.5. Pico-8 always rounds down when setting colors so a value of 7.5 becomes 7 and 8.5 becomes 8. And now we have white for most of the card, and red in the space inside the diamond!
The A
The A on the top corner of the card was the last thing I added. I finished the spinning card with the card back and the diamond and realized that when I condensed the whole thing, I actually had about 50 characters to spare. Putting a letter on the ace seemed like an obvious choice. I struggled for an evening trying to make it happen before deciding that I just couldn't do it. The next day I took another crack at it and managed to get it in, although a lot of it is pretty ugly! Luckily, in the final version the card is spinning pretty fast and it is harder to notice how lopsided it is.
I mentioned earlier that my method of placing pixels in a line between points is great for deforming planes, but makes a lot of drawing harder. Here's a great example. Instead of just being able to call print("a") or even using 3 calls to line() I had to make a convoluted conditional to check if each pixel is "inside" the A and set it to red if it is.
I'll do my best to explain this code, but it was hammered together with a lot of trial and error. I kept messing with it until I found an acceptable balance between how it looked and how many character it ate up.
Here are the relevant bits again:
u=(r-1)/80 z=a(p-.2) if a(r-5) < 5 and z < u+.03 and (r==5 or z>u) then c = 8
The two variables above the if are just values that get used multiple times. Let's give them slightly better names. While I'm making edits, I'll expand a too since that was just a replacement for abs().
slope = (r-1)/80 dist_from_center = abs(p-.2) if abs(r-5) < 5 and dist_from_center < slope+.03 and (r==5 or dist_from_center>slope) then c = 8
Remember that r is the current row and p is the percentage of the way between the two sides where this pixel falls.
u/slope here is basically how far from the center line of the A the legs are at this row. As r increases, so does slope (but at a much smaller rate). The top of the A is very close to the center, the bottom is further out. I'm subtracting 1 so that when r is 0, slope is negative and will not be drawn. Without this, the A starts on the very topmost line of the card and looks bad.
z/dist_from_center is how far this particular p value is from the center of the A (not the center of the card), measured in percentage (not pixels). The center of the A is 20% of the way across the card. This side of the card starts on the right (0% is all the way right, 100% is all the way left), which is why you see the A 20% away from the right side of the card.
Tumblr media
These values are important because the two legs of the A are basically tiny distance checks where the slope for a given r is compared against the dist_from_center. There are 3 checks used to determine if the pixel is part of the A.
if a(r-5) < 5 and z < u+.03 and (r==5 or z>u) then
The first is abs(r-5) < 5. This checks if r is between 1 and 9, the height of my A.
The second is dist_from_center < slope+.03. This is checking if this pixel's x distance from the center of the A is no more than .03 bigger than the current slope value. This is the maximum distance that will be considered "inside" the A. All of this is a percentage, so the center of the A is 0.20 and the slope value will be larger the further down the A we get.
Because I am checking the distance from the center point (the grey line in the image above), this works on either leg of the A. On either side, the pixel can be less than slope+.03 away.
Finally, it checks (r==5 or dist_from_center>slope). If the row is exactly 5, that is the crossbar across the A and should be red. Otherwise, the distance value must be greater than slope (this is the minimum value it can have to be "inside" the A). This also works on both sides thanks to using distance.
Although I am trying to capture 1-pixel-wide lines to draw the shape of the A, I could not think of a cleaner way than doing this bounding check. Ignoring the crossbar on row 5, you can think about the 2nd and 3rd parts of the if statement essentially making sure that dist_from_center fits between slope and a number slightly larger than slope. Something like this:
slope < dist_from_center < slope+0.03
Putting it Together
All of this logic needed to be on a single line to get away with using the short form of the if statement so it got slammed into a single ternary operator. Then I tried removing parentheses one at a time to see what was structurally significant. I wish I could say I was more thoughtful than that but I wasn't. The end result is this beefy line of code:
if(e%1<.5)c=a(r-5)<5and z<u+.03and(r==5or z>u)and 8or 8-sgn(h+v-9)/2
Once we've checked that e (our time value) is in the phase where we show the face, the ternary operator checks if the pixel is inside the A. If it is, c is set to 8 (red). If it isn't, then we set c = 8-sgn(h+v-9)/2, which is the diamond shape described above.
That's It!
Once we've set c the tweetcart uses pset to draw the pixel as described in the section on drawing the lines.
Here's the full code and what it looks like when it runs again. Hopefully now you can pick out more of what's going on!
a=abs::_::cls()e=t()for r=0,46do for p=0,1,.025do j=sin(e)*20k=cos(e)*5f=1-p h=a(17-p*34)v=a(23-r)c=1+min(23-v,17-h)%5/3\1*6u=(r-1)/80z=a(p-.2)if(e%1<.5)c=a(r-5)<5and z<u+.03and(r==5or z>u)and 8or 8-sgn(h+v-9)/2 g=r+39pset((64+j)*p+(64-j)*f,(g+k)*p+(g-k)*f,c)end end flip()goto _
Tumblr media
I hope this was helpful! I had a lot of fun writing this cart and it was fun to break it down. Maybe you can shave off the one additional character needed to slow it down by using e=t()/2 a bit. If you do, please drop me a line on my mastodon or tumblr!
And if you want to try your hand at something like this, consider submitting something to TweetTweetJam which just started! You'll get a luxurious 500 characters to work with!
Links and Resources
There are some very useful posts of tools and tricks for getting into tweetcarts. I'm sure I'm missing many but here are a few that I refer to regularly.
Pixienop's tweetcart basics and tweetcart studies are probably the single best thing to read if you want to learn more.
Trasevol_Dog's Doodle Insights are fascinating, and some of them demonstrate very cool tweetcart techniques.
Optimizing Character Count for Tweetcarts by Eli Piilonen / @2DArray
Guide for Making Tweetcarts by PrincessChooChoo
The official documentation for the hidden P8SCII Control Codes is worth a read. It will let you do wild things like play sound using the print() command.
I have released several size-coded Pico-8 games that have links to heavily annotated code:
Pico-Mace
Cold Sun Surf
1k Jump
Hand Cram
And if you want to read more Pico-8 weirdness from me, I wrote a whole post on creating a networked Pico-8 tribute to Frog Chorus.
16 notes · View notes
maskedtrait · 1 year ago
Text
Tumblr media Tumblr media Tumblr media Tumblr media
image id: [ four pictures of a fake alien sim. he has lilac skin with scale-like light purple markings and an orange overlay that goes down from his forehead to his entire body. he has pointed ears. he has 8 eyes and his biggest eyes have white eyelashes. he has whisker-like appendages coming out from his chin - two on each side - . He has a wide nose and mid sized lips. He is wearing a rainbow stretched septum piercing. He has short straight white hair. He is dressed in rainbowcore fashion. He has rainbow popsicle earrings, rainbow tank top, rainbow mesh top over tank, black fingerless gloves with rainbow designs on them and rainbow pixel patterned shorts. He is wearing a rainbow star shaped bag. ]
extra under cut (sort of naky sim)
Tumblr media
55 notes · View notes
thebluestbluewords · 1 year ago
Text
Mal's video shifts in shaky, pixelated motion. She's smiling. "Eves, slow down. You're going faster than us non-nerds can follow." 
Evie's video is showing in crystal-clear Auradon City reception. She tosses her hair back over one shoulder, but she's grinning bright and cheerful like she never did back home. "Get faster, then! You're supposed to be my future lady-in-waiting, M. I'm going to need you to keep up with me once I'm queen and you're the one taking notes in all of my horribly boring meetings." 
"I'm going to be the worst lady-in-waiting ever then," Mal scoffs. "I'm not taking any notes. You can get your new nerd friends to program you dictation software, and then you'll be one of the nerds who carries a recorder in your purse all the time, and you'll have to design new purses just to fit the thing. It'll be a design challenge." 
Evie looks delighted at the thought. "I should. You're so right, it'll be much more accurate than a human note-taker, and much less awkward to fit in my purse." 
Mal's video is too choppy to see her face, but Jay knows her, and she's probably thinking through the potential liabilities of making Evie carry a recording device all the time. There's a shitload of them, but Mal's also stupid when it comes to things that make Evie happy, so they might end up getting her a recorder anyway. 
"Only if I can record stupid shit on it too," Mal's saying. "If I can't fake my own death on the official Auradon record and then show up to court and act like nothing happened the next day, I don't want it." 
"Babe, you can always fake your death with me. Le petit mort--" Evie makes a rude sort of hand gesture that maybe, probably isn't just an isle thing. Mal laughs so loud that it crackles the speakers of Jay's sort-of-shitty cell phone. 
"If you promise that I'll buy the recorder on my way home!" 
Evie's smile closes down into the flat one she uses when she's secretly mad. Or cold, or tired, or hungry. Jay's pretty practiced with reading his crew's expressions. He knows when an Evie-smile is fake. She's good at pretending everything is fine when she's not, but he's been watching her for years, and his fake-smile is better. "You're coming home? Really, babe? And here I was thinking that you're staying up in the middle of fucking nowhere until the end of the year, like you planned." 
You planned, not we planned. 
Evie's still a little bit mad about Mal's post-graduation roadtrip. 
Jay's not mad at her. He's not mad at Evie either, for being loud and annoyed about it, or Ben for being quiet and careful about enabling it, so that Evie won't be mad at him too. Mal's their leader no matter where she is. They've got cell phones and emails and the Auradon Postal Service now, so it's not like Mal's decided to fuck off and travel outside of where they can reach her. Jay's not even a little bit mad anymore, which he should maybe worry about, actually. He's supposed to be all charming and fun and connected with people, and instead of being that, he's sort of-- 
Well. 
He's sort of tired. 
And like, Jay's not stupid. He pretends sometimes, because it keeps people's expectations of him low, but he's not. He's lived with Mal since they were kids, and he's lived with Evie and Carlos almost as long, and he knows what it's like when they struggle. Mal gets mad, and Evie gets quietly, painfully self-destructive, and Carlos shuts down internally and stops making weird dangerous stuff, which is almost as dangerous as when he is actively making stuff, because half of the shit he steals from the chemistry labs will also explode if it's left untouched for too long. 
Ben just cries when he's upset, which is a lot easier to manage. 
So. Jay's not stupid, and he's well aware of what it looks like when his crew struggles, and he's also aware that they've got a whole fuckin' laundry list of acronyms listing off exactly what's wrong with them from their Auradon-appointed therapists. He's never actually read the list, because yeah, he's still slow at reading tiny text and handwritten notes, and that's what the whole fuckin' therapy files are full of, but he's heard the rundown from Evie. The short version is that they're all fucked from hell and back (home and back, Mal always says) and they're probably going to do some stupidly self-destructive shit and die before they're thirty. 
Jay's not entirely sure what stupid thing he's going to do, but he's pretty sure it's going to happen soon. 
26 notes · View notes