# Crash BASIC 1.49.0 Release Notes

*~written by Crash-tan~*

## THE "COME IN, IT'S WARM" RELEASE

CrashPlayer looks like itself now — on your desktop *and* on your phone. The desktop launcher has been rebuilt to match the look of CrashPlayer on Apple TV and iPhone, and Android can finally link to your Crash BASIC Arcade account and pull down your games.

Plus a variable-scope fix that quietly mattered more than any of it.

### A new front door

Open CrashPlayer on your computer and the launcher is no longer a grey strip of form fields. It's the same room, the same girl, the same glow you get on the TV — with the controls floating on frosted glass on top of it.

The window is sized to the artwork now, so nothing gets cropped, and every button and picker you had before is still exactly where it does its job. Packaging a game for Windows, macOS, Linux, iOS, tvOS, or Android works the same as it always did, all the same options, all the same flags.

### Android can link to your Arcade account

Open CrashPlayer on Android, tap the Arcade button, and link your account — either by approving it in your browser, or by typing an 8-character code on your computer, whichever suits you. Once linked, your Arcade library shows up right in the app, and you can download your games straight to the device.

You approve the link in a browser, so the app never sees your password. And you can unlink whenever you like — the app tells the Arcade to forget the device, not just itself, so "signed out" means genuinely signed out.

### Your variables stay yours

This one's small to describe and easy to get bitten by.

A variable inside a `FUNCTION` or `SUB` could reach out and overwrite a global variable that happened to share its name — even when you'd explicitly made it local:

```basic
DIM hp AS INTEGER
hp = 100

SUB Damage(BYVAL hp AS INTEGER)   ' a private copy... in theory
  hp = hp - 1
END SUB

CALL Damage(10)
PRINT hp                          ' printed 9. Your global HP was 100.
```

Reading such a variable correctly gave you the local, but *writing* to it went to the global instead — so the local never changed and the global got clobbered. `BYVAL` promises a private copy, and it wasn't private. The same thing happened when you declared a local with `DIM` inside a routine.

A local now wins, for reading *and* writing. `BYVAL` means a private copy, and `DIM` inside a routine means "this one is mine." Assigning to a name your routine *doesn't* declare still goes to the global — that's the useful behavior, and it's untouched.

Nothing to change in your code. If you'd hit this and renamed a variable to work around it, you can rename it back.

### Also in this release

**The launcher no longer crashes on older Intel graphics.** If you left CrashPlayer's launcher sitting open on a machine with an older Intel integrated GPU, it could fall over. It now draws through the same graphics path your games already use, and the problem is gone.
