wirelyre's recent activity

  1. Comment on Super Mario 64's invisible walls explained once and for all in ~games

    wirelyre
    Link
    Summary Super Mario 64 has "invisible walls" which obstruct Mario. They're caused by the physics engine and minor errors in the level geometry: Physics is calculated using 16-bit integer...

    Summary

    • Super Mario 64 has "invisible walls" which obstruct Mario.
    • They're caused by the physics engine and minor errors in the level geometry:
      • Physics is calculated using 16-bit integer coordinates.
      • Some static level geometry doesn't correctly cover all physics coordinates.
      • Lots of dynamic geometry (moving platforms) rounds strangely to physics coordinates, leaving small holes.

    Specific causes of invisible walls

    • Geometry with no drawn texture (a real invisible wall)
    • Ceilings with no floor above
    • Edge of the game course (intentional)
    • Vertex coordinate rounding leaving holes
    • Floors incorrectly making holes in other floors

    Bonus information

    • Whether a physics triangle is wall, floor, or ceiling is decided by its normal vector. These three kinds of triangles behave completely differently.

    • Most invisible walls are super thin because they're rounding errors. This means that it's very possible to go straight through them, since the physics engine will never register that they've been hit. In fact, they often don't cover contiguous horizontal areas.

    • There isn't necessarily geometry at the edge of a stage. Mario simply isn't allowed to be anywhere unless there's a floor below him. For stages he can fall off, there are death planes far below which are valid floor (so he can yolo out into space) but which kill him if he gets close. If Mario moves out of bounds, he's pushed right back in. And if he's still out of bounds, he dies immediately.

    • Mario's hat disappears if he manages to sneak out of bounds (and then instantly dies). Every frame, his hat is removed, then his position is checked, then it's put back on.

    • "Parallel universes", used in TASes, happen because of physics rounding too. When Mario interacts with floor geometry, his position is clamped by taking the least significant part of his horizontal coordinates. This means that if he can get really far away from a stage, he can still stand on things; it's like there's loads of copies of the floors at horizontal intervals in space. But in order to get there, he has to travel unfathomably fast — around 4 times the maximum stage size per frame.

    11 votes
  2. Comment on Disney announces Moana 2 set to release November 2024 in ~movies

    wirelyre
    Link Parent
    I know exactly what you mean about Shiny, it's so bizarre! It's so incredibly uncomfortable to listen to, I love it. I've never been able to take it apart and figure out exactly why. The...

    I know exactly what you mean about Shiny, it's so bizarre!

    It's so incredibly uncomfortable to listen to, I love it. I've never been able to take it apart and figure out exactly why. The accompaniment is super busy, Clement's voice is slightly too dull to hear, there's not a great beat, or even much of a harmonic progression, the lyrics are stagnant and meandering, the tone is trite, etc. It's a perfect storm and it makes it sound sharp to me, like just listening to it hurts me a little.

    For my money it also stands out as the character is actively attempting murder while singing about fashion.

    I don't think they meant to make it like that. I don't think you could if you tried. But it does make me feel a certain way.

    It makes me feel ✨shiny✨.

    6 votes
  3. Comment on Koka - A Functional Language with Effect Types and Handlers in ~comp

    wirelyre
    Link Parent
    I won't pretend to be an expert but I'll note that, to summarize the paper, basically FBIP and prior work are pretty tricky. Once you decide to generate a modify-in-place control path you've got a...

    I won't pretend to be an expert but I'll note that, to summarize the paper, basically FBIP and prior work are pretty tricky. Once you decide to generate a modify-in-place control path you've got a whole tangle of linear constraints in your compiler IR that simply don't exist in the source language. (Unless they do, in which case you get ATS.)

    Deciding to reuse an allocation at runtime means you have to know it's not going to be accessed later — in Koka that's done through reference counting, but OCaml and F♯ need garbage collectors because they can have self-references. So it's natural to track values starting from their constructors and try to inline functions / beta-reduce to put non-escaping allocations on the stack. Well, OCaml does that and I'm positive F♯ and its JIT do too.

    You can do different stuff with different language semantics. Koka is a squeaky-clean slate with simple values and a precise effect system. It's also a research language. By contrast, the Haskell compiler can get away with murder because of laziness and the fact that it basically has no effects at all.

    5 votes
  4. Comment on Just intonation keyboard – play music without knowing music in ~music

    wirelyre
    Link
    This is really cool! It's a shame keyboards aren't four-dimensional, that way you could have the green keys laid out a little better. They would probably be harder to type on though. This would be...

    This is really cool!

    It's a shame keyboards aren't four-dimensional, that way you could have the green keys laid out a little better. They would probably be harder to type on though.

    This would be bad for the instrument as a performing device, but it would be cool to have a few commas accessible on the purple keys.

    7 votes
  5. Comment on Self-taught guitar players: How did you do it? What do you wish you could go back and do differently when you were learning? in ~music

    wirelyre
    Link
    This isn't exactly the encouragement kind of advice. But from the way you're talking I think you're in a pretty healthy place overall, you're just in a dip. So, when you're in a problem-solving...

    This isn't exactly the encouragement kind of advice. But from the way you're talking I think you're in a pretty healthy place overall, you're just in a dip. So, when you're in a problem-solving mood:

    Record yourself. Lots. And listen to your recordings.

    Listening to and watching yourself play is some of the easiest practicing you'll ever do. Well, or the hardest but most productive. Depends on the day. You'll see some pretty wild stuff if you're looking.

    Personally, I know I've improved the most when I'm getting productive feedback from someone else — teachers, friends, enemies.*(Try not to make enemies.) And someone else includes me, if it's through a recording rather than live practice.

    Remember that we live in the future and that you can record yourself doing something wrong for five seconds for free. It's not a big deal. I still lie to myself, "oh, it's not really worth it for this bit." That's bargaining, and I'm always wrong.

    So when you've put fresh coats of paint and sealant on your ego, try it out!*(Please. Someone must learn from my mistakes.)

    3 votes
  6. Comment on The Password Game in ~tech

    wirelyre
    Link
    I played this a couple weeks ago, then after I beat it I took it apart a bit. All rules Your password must be at least 5 characters. Your password must include a number. Your password must include...

    I played this a couple weeks ago, then after I beat it I took it apart a bit.

    All rules
    1. Your password must be at least 5 characters.
    2. Your password must include a number.
    3. Your password must include an uppercase letter.
    4. Your password must include a special character.
    5. The digits in your password must add up to 25.
    6. Your password must include a month of the year.
    7. Your password must include a roman numeral.
    8. Your password must include one of our sponsors: [logos for Pepsi, Starbucks, and Shell]
    9. The roman numerals in your password should multiply to 35.
    10. Your password must include this CAPTCHA: [a CAPTCHA]
    11. Your password must include today's Wordle answer.
    12. Your password must include a two letter symbol from the periodic table.
    13. Your password must include the current phase of the moon as an emoji.
    14. Your password must include the name of this country. [Google Street View frame, like in GeoGuessr]
    15. Your password must include a leap year.
    16. Your password must include the best move in algebraic chess notation.
    17. 🥚 ← This is my chicken Paul. He hasn't hatched yet, please put him in your password and keep him safe.
    18. The elements in your password must have atomic numbers that add up to 200.
    19. All the vowels in your password must be bolded.
    20. Oh no! Your password is on fire. Quick, put it out!
    21. Your password is not strong enough 🏋️‍♂️
    22. Your password must contain one of the following affirmations:
      • I am loved
      • I am worthy
      • I am enough
    23. Paul has hatched! Please don't forget to feed him, he eats three 🐛 every minute.
    24. Your password must include the URL of a ___ minute ___ second long YouTube video.
    25. A sacrifice must be made. Pick 2 letters that you will no longer be able to use.
    26. Your password must contain twice as many italic characters as bold.
    27. At least 30% of your password must be in the Wingdings font.
    28. Your password must include this color in hex. [a box filled with a random color]
    29. All roman numerals must be in Times New Roman.
    30. The font size of every digit must be equal to its square.
    31. Every instance of the same letter must have a different font size.
    32. Your password must include the length of your password.
    33. The length of your password must be a prime number.
    34. Uhhh let's skip this one.
    35. Your password must include the current time.
    Things I noticed
    • Most things are case insensitive! Only these are case sensitive:
      • Uppercase letters — [A-Z]
      • Roman numerals — [IVXLCDM] — actually M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})
      • Periodic table symbols
      • Chess notation
    • The moon phase can be reflected, and there are more moon emojis than you think. 🌓🌗🌛🌜 are all equivalent.
    • Not only is the country name case insensitive, it ignores spaces. So aus tra liaAustralia.
    • The Gregorian calendar is used for leap years even before 1582. Also the year 0, which is not a year at all, is considered a leap year.
    • For chess, moves need to end in + if they're checks. There are 193 possible positions.
    • The fire spreads faster if your window is wider — basically if you're on a mobile device it gets nerfed.
    • Paul eats a bug every 15 seconds, contrary to the rule text. He needs 1–8 bugs in the password when he tries to eat.
    • The YouTube challenge can be any length from 180–2179 seconds, chosen randomly and uniformly.
    1 vote
  7. Comment on "Layered" music that builds throughout the song? in ~music

    wirelyre
    Link
    A few classical pieces I was thinking of, especially orchestral, some of which people have already mentioned: Ludwig van Beethoven, Symphony No. 7 (1812), mvt. 2 Maurice Ravel, Bolero (1928)...

    A few classical pieces I was thinking of, especially orchestral, some of which people have already mentioned:

    In general I think you'll find loads of classical examples.

    If you're a little less literal about the building process, there are several entire forms that are like that. For example, passacaglias and chaconnes:

    Themes and variations:

    Very motivic pieces:

    Even less literally, and over even longer spans:

    And if you go full hog arguably every fugue. You might not want all the hog though, since fugues usually have their thickest textures pretty early.

    I love this kind of music too. I'm not sure the Beethoven 7 movement can be beaten but that Mahler 1 movement just blows me away every time.

    7 votes
  8. Comment on I'm out of the loop, what is up with The Legend of Zelda ? in ~games

    wirelyre
    Link Parent
    The one after the waterfall/rapids room? I must've been one of the lucky ones, I don't remember looking for that at all. I do remember wondering if I was softlocked at one point though. What did...

    The one after the waterfall/rapids room? I must've been one of the lucky ones, I don't remember looking for that at all. I do remember wondering if I was softlocked at one point though.

    What did trip me up for probably 15 actual minutes was figuring out how to get into the basement.

  9. Comment on I'm out of the loop, what is up with The Legend of Zelda ? in ~games

    wirelyre
    Link Parent
    Right — I can't speak for TotK because I'm avoiding spoilers, but in BotW I really missed the classic formula where all of the puzzles in a dungeon were sort of tangled together. If you solve one...

    Right — I can't speak for TotK because I'm avoiding spoilers, but in BotW I really missed the classic formula where all of the puzzles in a dungeon were sort of tangled together. If you solve one puzzle it doesn't mean much until you see how it fits into the larger puzzle.

    BotW's shrines are decent enough puzzles but they're independent and pretty linear. Off the top of my head I can't remember a shrine where you backtrack. But every classic Zelda I've played, 2D or 3D, has points where I'm dying to go back and re-explore some bit because I just unlocked something. You use the same physical areas multiple times in different ways. There's usually points where you realize you can't make progress so you have to approach it from a different angle — and that usually involves solving a different puzzle. Can't just plow through every puzzle you see in the order you see em.

    So here's my hot take: OoT's Water Temple is one of the Zeldiest dungeons because most of your time is spent figuring out how to navigate the single central area — you can see everything when you first enter, you just can't use anything.

  10. Comment on Let's chat everything classical music in ~music

    wirelyre
    Link Parent
    I keep trying to convince people of this! I think that figured bass and chord charts are almost exactly the same thing, and it boggles my mind that no one seems to teach continuo at the same time...

    I really do think that, given the chance, jazz people will appreciate chamber music and vice versa. I'm actually going to test out this theory with a program next year: Baroque and jazz.

    I keep trying to convince people of this! I think that figured bass and chord charts are almost exactly the same thing, and it boggles my mind that no one seems to teach continuo at the same time as comping.

    I performed with someone last year who told me they were wondering if jazz improv might be a direct descendant of Baroque improv. The Atlantic slave trade was active all through the 17th and 18th centuries so it's not a huge stretch that the European tradition might have mixed in directly. Though I never looked into it more.

    Not sure if it's obscure enough, but Luis Bacalov's Misa Tango. Loved that piece!

    Obscure enough for me, thanks for the recommendation!

    1 vote
  11. Comment on Programming Challenge: Mini Calendar Display in ~comp

    wirelyre
    Link Parent
    I installed a keyboard layout! It's just QWERTY but with a backslash dead key. So I type \r for ↑ and 1\ 2 for 1‿2. It sounds hard but the symbols are good mnemonics for the functions and the keys...

    I installed a keyboard layout! It's just QWERTY but with a backslash dead key. So I type \r for and 1\ 2 for 1‿2. It sounds hard but the symbols are good mnemonics for the functions and the keys are good mnemonics for the symbols. \z\Z makes ⥊⋈ for example, which both look kind of like z. And hjkl ist the dot zone, so \h\j\k\K\l makes ⊸∘○⌾⟜. (Neither of those is meaningful code.)

    Right now I do most of the drafting in the online interpreter because my terminal editor feels weird for it. Over there you can see all the primitives at the top, click them to insert, hover to see the key binding, and shift/control/command-click them to see the documentation.

    Yesterday I was brainstorming and was like "hmm, what's the symbol for this?" So I fumbled around the keyboard trying to find it, and eventually I gave up and looked at the top bar. I was looking for a regular ASCII slash.

    Honestly I'm no expert and the biggest challenge is usually figuring out what not to care about, finding the right place of abstraction. For example I needed to pad the end of each month with spaces, otherwise it would cycle back to 1. How many spaces do you need? Well, actually it doesn't matter, just pad with 42 cells and chop it back to size.

    It feels like you should be able to extract 7 and make it more general. But, like, who on Earth is going to change the length of the week? (And there's only two 7s in the code anyway.)

    And even if it does matter and you do need the generalization — well, it's only 11 lines so you can just go in there and do whatever you want.

    3 votes
  12. Comment on Let's chat everything classical music in ~music

    wirelyre
    Link
    Welcome! Thanks for the piece! When did you make this recording? Not to blast you with questions but I'm super curious what you think: Why do classical chamber recitals and jazz combos have...

    Welcome!

    Thanks for the piece! When did you make this recording?

    Not to blast you with questions but I'm super curious what you think:

    • Why do classical chamber recitals and jazz combos have different audiences and different audience cultures?
    • Is there a way to merge them into a single audience? Is that desirable?
    • It feels like the goal of orchestral pops is to reincorporate parts of big band performances. Is that true, and if so, is it working?
    • How is it different listening to a recording of an orchestra you conducted versus listening to yourself performing on piano?
    • Do you have any favorite obscure pieces by Latin American composers?
    1 vote
  13. Comment on Programming Challenge: Mini Calendar Display in ~comp

    wirelyre
    Link
    Fun little challenge. I got a solution in BQN — it should work for any POSIX date. ⟨ 2023 6 4 ⟩ 1 2 3 4 5 6 │ 1 2 3 │ 1 7 8 9 10 11 12 13 │ 4 5 6 7 8 9 10 │ 2 3 4 5 6 7 8 14 15 16 17 18 19 20 │ 11...

    Fun little challenge. I got a solution in BQN — it should work for any POSIX date.

                                    ⟨ 2023 6 4 ⟩
           1   2   3   4   5   6  │                   1   2   3  │                           1
       7   8   9  10  11  12  13  │   4   5   6   7   8   9  10  │   2   3   4   5   6   7   8
      14  15  16  17  18  19  20  │  11  12  13  14  15  16  17  │   9  10  11  12  13  14  15
      21  22  23  24  25  26  27  │  18  19  20  21  22  23  24  │  16  17  18  19  20  21  22
      28  29  30  31              │  25  26  27  28  29  30      │  23  24  25  26  27  28  29
                                  │                              │  30  31                    
    
    Full source code
    # Print a calendar of this month and the two surrounding months.
    
    
    # current date and weekday
    y‿m‿d‿wd ← •BQN 1⊑ •SH ⟨"date", "+%Y‿%m‿%d‿%w"⟩
    m‿d -↩ 1
    
    # number of days in a month
    Leap ← ≠´0=4‿100‿400|¨⊣
    Days ← ⊢◶31‿(28+Leap)‿31‿30‿31‿30‿31‿31‿30‿31‿30‿31
    
    # number of days and starting weekday of these three months
    Offset ← {y‿m𝕊o: x←o+m+12×y ⋄ ⟨⌊x÷12,12|x⟩}
    ⟨prev,cur,·⟩ ← counts ← Days´¨ y‿m⊸Offset¨ ¯1‿0‿1
    starts ← 7 | ⟨wd-d+prev, wd-d, cur+wd-d⟩
    
    # format a single month as rank-2 character array
    S ← ⥊⟜⟨"    "⟩
    Chart ← { ∾˘ 6‿7⥊ (S𝕨)∾((¯4↑•Fmt)¨1+↕𝕩)∾(S 42) }
    
    
    # output
    •Out (32⥊" ")∾•Fmt⟨y,m+1,d+1⟩
    •Out˘ (∾⟜"  │"⊸∾)˘˝> starts Chart¨ counts
    

    Tildes's font has surprisingly nice BQN symbols!

    This was a good exercise for boiling down the problem to its essential parts. I decided those should be:

    • Print today's date
    • Print three calendar months

    In order to print one month you need to know how many days it has and which day of the week it starts on. I think the Days function (number of days in a month) is really beautiful. Take the index of the month into a list. If it's February, figure out whether it's a Leap year (modulus 4 and 100 and 400, xor together) and add 28 to the boolean. One weird note: xor is written , so "xor of a boolean list" is written ≠´.

    Then I figured out how to print a single month. This is string formatting and it's ugly. But the interface 2 Chart 29 for printing a 29-day month starting on Tuesday (2s-day) is nice. You can then splice those together. Each chart is just a list of strings for each day, padded on the front by the starting weekday, padded on the back by loads of spaces, cut into a 6×7 grid, and merged into an array of lines.

    Then it's just a matter of finding the number of days in each month and the weekday they start on. Boring math but we got Offset out of it: (2023‿6 Offset 3) ≡ 2023‿9, forward 3 months; (2023‿6 Offset ¯8) ≡ 2022‿10, backward 8 months. Finally, a little modular math to find the weekdays (using 0-based month and day indexes).

    I decided to print the date in native BQN array format, ⟨surrounded by angle brackets⟩, as a nod to the language! I think it looks cute.

    5 votes
  14. Comment on Use.GPU goes trad in ~comp

    wirelyre
    Link Parent
    I went back to this earlier post which explains more of the high-level architecture in a way I'm familiar with.

    I went back to this earlier post which explains more of the high-level architecture in a way I'm familiar with.

    2 votes
  15. Comment on Writers, be wary of throat-clearers and wan intensifiers. Very, very wary. in ~creative

    wirelyre
    Link Parent
    English has a lot of diphthongs (two vowels as a unit) and you can put loads of consonants at the front and end of syllables. I'm gonna write a little IPA to show where all the sounds are, and...

    English has a lot of diphthongs (two vowels as a unit) and you can put loads of consonants at the front and end of syllables.

    I'm gonna write a little IPA to show where all the sounds are, and I'll put the vowels in bold. Each of these words has one syllable:

    • may — /m/
    • make — /mk/
    • makes — /mks/
    • eye — //
    • rye — /ɹ/
    • ride — /ɹd/
    • tried — /tɹd/
    • stride — /stɹd/
    • strides — /stɹdz/
    • strengths — /stɹɛŋθs/

    Really, if you want to count English syllables, your best bet is to look at the vowels. Consonants usually don't make another syllable.

    4 votes
  16. Comment on What have you learned from working in tech? in ~talk

    wirelyre
    Link Parent
    Would you say that's more true of tech than other industries? Do you think the people with titanium egos are likely to act the same way once they've passed the condescension threshold themselves?...

    Would you say that's more true of tech than other industries?

    Do you think the people with titanium egos are likely to act the same way once they've passed the condescension threshold themselves? Like is the toxic environment self-sustaining because of the people, or the shape of the organizations, or something else?

    1 vote
  17. Comment on What programming/technical projects have you been working on? in ~comp

    wirelyre
    Link
    For the past 11 months my hobby project has basically been developing tools to play Tetris™ really fast. I should probably measure how fast, but it's really fast. There's a web interface as a...

    For the past 11 months my hobby project has basically been developing tools to play Tetris™ really fast. I should probably measure how fast, but it's really fast.

    There's a web interface as a little toy that uses the library.

    This has been such a cool project — it's got colors, it's got Coding and Algorithms, I learned a lot about multicore programming and vectorization and Rust's type system, I rented a machine with 96 cores, I expanded the state of the art for this problem domain a little bit, and I wrote my own concurrent hash map. And best of all, it's all in service of an actual specific question I have, so I'll know when I'm done!

    I intend to write a series of technical blog posts about this, because I think it's really interesting, but I'm holding out until I've actually done some research work. The tools are pretty much done, now I need to use them.

    7 votes
  18. Comment on Ocarina of Time's source code has been reverse engineered in ~games

    wirelyre
    Link
    I'm not sure I believe that decompiling isn't copying the ROM in some sense. The goal of the project is to produce C source that, when compiled with the original toolchain, produces byte-identical...

    I'm not sure I believe that decompiling isn't copying the ROM in some sense.

    The goal of the project is to produce C source that, when compiled with the original toolchain, produces byte-identical binaries to those in the ROM. If you copy the game assets, compile the reverse-engineered source, and link them together, you should get a 100%-identical ROM.


    But this is very valuable!

    Before this project, in order to modify game functionality, you had to

    • write new code
    • make the ROM bigger so you can paste the code at the end
    • modify an instruction in ROM to jump out to your new code
    • modify your new code to jump back to the old code.

    This is tricky to do except when writing directly in assembly, which is very tedious.

    After this project, you can simply write new code, and when linked everything will shuffle around safely.

    2 votes