Pinapelz
banner
micro.pinapelz.moe.web.brid.gy
Pinapelz
@micro.pinapelz.moe.web.brid.gy
yo! and he's more than a cover he's a quilt
General arcade rhythm game enjoyer (SDVX, IIDX, CHUNITHM)
Mostly play MMOs (FFXIV, OSRS), JRPGs, and VNs (anything with a good story)
I Watch only slice of life (and Bandori)
Arch Linux + Hyprland user (btw)
Hi …
Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers)
_This is primarily focused on the content of the patch, not so much the features they’ve added._ # Story * Mistwake Dungeon was a good difficulty. Although I’m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one. * Cutscene quality def. got better. As in animations and uniqueness. * Love the look and feel (Treno). There’s a ton of good spots for “gpose-ing”. Music is nice too. * Seriously Krile? You parents were the ones who dropped you into the Source. I don’t think they’d care if you wanted to stay in the Source (just make up your mind) -> well glad that got sorted out * “Hell on Rails” Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the “sucking” mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it. * The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now. * The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth’s meteor. * Cool so we just get to keep the key. If this were any bit realistic, we’ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story… Well I guess it can go either way. * I’m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn’t something more unique. * And what do you know. Ascians. I hope we get something unqiue for 8.0… I guess thats fine but please lets not have it just be SHB all over again. # Raid * “Feral Fandom” -> Yep thats FF14 NA playerbase for you. * Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we’d stop with mechanics that are designed to trick people even when read correctly. * Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team. * Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it. * Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There’s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe… * Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming. * Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it! # Misc * The new Frontline map is “dangerous”. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they’re needed too (to spice things up/allow for a turning point). * The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -> B (but partially I guess this is done cause the map does feel smaller than Onsal). #ffxiv
micro.pinapelz.moe
December 22, 2025 at 6:53 PM
Arcade Monsters
If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I’ve found is taking the Pacific Surfliner train down to San Diego. # Getting There There are a number of departures in the morning, and while not as fast as a car when there’s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds. Once you get there, you can either take the trolley or walk 20 minutes to the arcade. I prefer the walk since you can grab some food/coffee on the way. Plus the view is excellent. # Value So is this trip worth it and what is the cost? Arcade Monsters games operate all on “Free Play”, you pay a set fee for entry and can stay for as long as you’d like. Its $25 to enter, or $35 if you want to be able to leave and come back. Since there aren’t exactly a lot of “retro” arcades anymore, I’ll compare the value proposition here to Round1: At Round1 a standard rhythm games is roughly 8.6 credits per play. If we estimate the value of a Round1 credit to be around $0.15 (assuming standard non-member $120 package for 777 credits), this would put 1 play at around $1.29. This means it takes roughly 20 plays to hit $25. Let’s also say that a single play at any rhythm game takes roughly 10 minutes. Assuming you continuously played games This means $25 of Round1 credits would last you roughly 3.3 hours. So just this on its own, without considering anything else I’d say that this is great value just on its own. But if you were to include transportation costs, assuming around $60 for a round-trip ticket via train, it becomes a little more difficult to justify since for the same price since you’d be able to play 46 rounds of something else at Round1. However, with the variety of games in there (even rarer ones), I’d say this is still an excellent trip. I personally could easily stay 5+ hours in there (cause I’m a degenerate and they also sell food + drinks in there). # Quality Most of the retro stuff is very well maintained and in great working condition. Also many of the modern games are networked and have card saving features. However, it’d be dishonest to say that these cabs are in excellent condition: * The Sound Voltex knobs are basically falling off, the switches don’t feel great * The pads ghosts on Dancerush and the navigation keys are broken * FutureTomTom drums have sensitivity issues * Small things like how the stool for Ongeki doesn’t match the height of the standard seat. Also it gets busy in there and is also a popular spot for families (kids get loud). # Conclusion Overall, as a once in a while its great value. You get to try out a ton of games, some of which are even considered rare to come by in Japan. If you also just want to go in and hardcore grind out some CHUNITHM, I can see that as a pretty good option too. Check out the list of games here #arcade
localhost
December 19, 2025 at 6:24 AM
Enable HID Mode on Nintendo Pro Controller 2
Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn’t work out of box on PC (Linux) for me like it’s predacessor. Until there’s actual better driver support for this thing in the kernel (or Valve does something), here’s a hacky Python script to initialize HID-mode on the controller # I only tested this script on Linux w/ Steam but in theory it shoud work on Windows? import usb.core # install pyusb first: pip install pyusb import usb.util import time import sys VENDOR_ID = 0x057E PRODUCT_IDS = { 0x2066: "Joy-Con (L)", 0x2067: "Joy-Con (R)", 0x2069: "Pro Controller", 0x2073: "GCN Controller" } USB_INTERFACE_NUMBER = 1 INIT_COMMAND_0x03 = bytes([0x03, 0x91, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]) UNKNOWN_COMMAND_0x07 = bytes([0x07, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]) UNKNOWN_COMMAND_0x16 = bytes([0x16, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]) REQUEST_CONTROLLER_MAC = bytes([0x15, 0x91, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]) LTK_REQUEST = bytes([0x15, 0x91, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]) UNKNOWN_COMMAND_0x15_ARG_0x03 = bytes([0x15, 0x91, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00]) UNKNOWN_COMMAND_0x09 = bytes([0x09, 0x91, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) IMU_COMMAND_0x02 = bytes([0x0c, 0x91, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00]) OUT_UNKNOWN_COMMAND_0x11 = bytes([0x11, 0x91, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00]) UNKNOWN_COMMAND_0x0A = bytes([0x0a, 0x91, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x35, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) IMU_COMMAND_0x04 = bytes([0x0c, 0x91, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00]) ENABLE_HAPTICS = bytes([0x03, 0x91, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00]) OUT_UNKNOWN_COMMAND_0x10 = bytes([0x10, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]) OUT_UNKNOWN_COMMAND_0x01 = bytes([0x01, 0x91, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00]) OUT_UNKNOWN_COMMAND_0x03 = bytes([0x03, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00]) OUT_UNKNOWN_COMMAND_0x0A_ALT = bytes([0x0a, 0x91, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00]) def send_usb_data(ep_out, ep_in, data, description=""): try: ep_out.write(data) time.sleep(0.01) try: response = ep_in.read(32, timeout=100) hex_resp = " ".join([f"{x:02x}" for x in response]) print(f"[{description}] Response: {hex_resp}") except usb.core.USBError as e: if e.errno == 110: print(f"[{description}] No response (Timeout)") else: print(f"[{description}] Read Error: {e}") except usb.core.USBError as e: print(f"[{description}] Write Error: {e}") raise def set_player_leds(ep_out, ep_in, led_mask): command = [ 0x09, 0x91, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00, led_mask, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] send_usb_data(ep_out, ep_in, bytes(command), f"Set LED Mask: 0x{led_mask:02x}") def connect_usb(): print("Searching for Nintendo Switch Controllers...") def match_device(dev): return dev.idVendor == VENDOR_ID and dev.idProduct in PRODUCT_IDS dev = usb.core.find(custom_match=match_device) if dev is None: raise ValueError("Device not found") product_name = PRODUCT_IDS.get(dev.idProduct, "Unknown Device") print(f"Found {product_name} (ID: {dev.idProduct:04x})") if dev.is_kernel_driver_active(USB_INTERFACE_NUMBER): try: print("Detaching kernel driver...") dev.detach_kernel_driver(USB_INTERFACE_NUMBER) except usb.core.USBError as e: sys.exit(f"Could not detach kernel driver: {e}") try: dev.set_configuration() print("Configuration set.") except usb.core.USBError as e: print(f"Error setting configuration: {e}") try: usb.util.claim_interface(dev, USB_INTERFACE_NUMBER) print(f"Interface {USB_INTERFACE_NUMBER} claimed.") except usb.core.USBError as e: sys.exit(f"Could not claim interface: {e}") cfg = dev.get_active_configuration() intf = cfg[(USB_INTERFACE_NUMBER,0)] ep_out = usb.util.find_descriptor( intf, custom_match = lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_OUT) ep_in = usb.util.find_descriptor( intf, custom_match = lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_IN ) if not ep_out: sys.exit("Could not find OUT endpoint") print(f"Found Endpoint OUT: 0x{ep_out.bEndpointAddress:02x}") print("Starting Initialization Sequence...") try: send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, "Init 0x03") send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, "Unknown 0x07") send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, "Unknown 0x16") send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, "Req MAC") send_usb_data(ep_out, ep_in, LTK_REQUEST, "Req LTK") send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, "Unknown 0x15") send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, "Unknown 0x09") send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, "IMU 0x02") send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, "OUT Unknown 0x11") send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, "Unknown 0x0A") send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, "IMU 0x04") send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, "Enable Haptics") send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, "OUT Unknown 0x10") send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, "OUT Unknown 0x01") send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, "OUT Unknown 0x03") send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, "OUT Unknown 0x0A Alt") set_player_leds(ep_out, ep_in, 0x0F) print("Controller initialization sequence complete! All LEDs should be on.") except Exception as e: print(f"Error during sequence: {e}") if __name__ == "__main__": try: connect_usb() except ValueError as e: print(e) except Exception as e: print(f"Unexpected error: {e}") **Steps** 0. (Optional) First Create a virtual environment 1. Install pyusb via `pip install pyusb` 2. Plug your Pro Controller 2 in via USB 3. Run the script If all 4 of the player indicator LEDs light up (the square ones near the charging port), then that means you should be good to go! You’ll need to re-run this script each time you plug/unplug or restart your machine. This is pretty much a copy of the online Procon 2 Enabler Tool but WebHID is dodgy on the Firefox fork I’m using, plus its annoying having to open this page each time.
micro.pinapelz.moe
December 5, 2025 at 7:40 AM