diff --git a/hampsterengine b/hampsterengine
index 5af7f5c6e3ce1d9ada43e76940ec97e4c64de4f9..18b1c8ff97a94e054ad822ea1570e6833acc0e1a 160000
--- a/hampsterengine
+++ b/hampsterengine
@@ -1 +1 @@
-Subproject commit 5af7f5c6e3ce1d9ada43e76940ec97e4c64de4f9
+Subproject commit 18b1c8ff97a94e054ad822ea1570e6833acc0e1a
diff --git a/src/js/extras.js b/src/js/extras.js
index 51f186c805311f86e920f7ad8b48358647f27523..dc884e97c2226610430c92a6ed2346c664f18f41 100644
--- a/src/js/extras.js
+++ b/src/js/extras.js
@@ -4,4 +4,8 @@ export function drawLineThroughPoint(x, y) {
     canvas.drawLine();
 }
 
-export const GRAVITY = 100;
+export const clone = structuredClone;
+
+export const clonePlayer = player => {
+    return player;
+}
diff --git a/src/js/main.js b/src/js/main.js
index 1e064f5edfd134725a4c8c684ee49615a699e11e..65c282bc3ff6c3d3acc02dc8fd01ce6ee85cd550 100644
--- a/src/js/main.js
+++ b/src/js/main.js
@@ -25,6 +25,9 @@ import Mouse from "../../hampsterengine/src/mouse";
 // Music
 // There is none
 
+// Parse query parameters
+const query = new URLSearchParams(window.location.search);
+
 // Init the engine and canvas
 const canvas = new Canvas('c');
 const engine = new Engine(canvas);
@@ -36,17 +39,15 @@ window.fR = fontRenderer
 // const mouse = new Mouse(engine);
 // window.mouse = mouse;
 
-canvas.width = 256 * 2;
-canvas.height = 240 * 2;
-canvas.pixelRatio = 2;
+const scale = (query.get('debug') ? 4 : 1);
+canvas.width = 256 * scale;
+canvas.height = 240 * scale;
+canvas.pixelRatio = scale;
 canvas.ctx.setTransform(canvas.pixelRatio, 0, 0, canvas.pixelRatio, 0, 0);
 canvas.ctx.imageSmoothingEnabled = false;
 
 engine.running = false; // Game uses this as a pause state actually
 
-// Parse query parameters
-const query = new URLSearchParams(window.location.search);
-
 engine.registerRoom(rm_mainMenu, 'mainMenu');
 engine.registerRoom(rm_game, 'game');
 
@@ -62,6 +63,9 @@ engine.registerRoom(rm_DEBUG_text, 'debug_text');
 // document.body.appendChild( stats.dom );
 
 let physicsFrame=0;
+window.physicsFrame = physicsFrame;
+
+let readyTime = 0;
 
 function main() {
     // Draw things. no user interaction or physics here.
@@ -79,7 +83,9 @@ function main() {
         // stats.end();
 
         if (query.get('debug')) {
-
+            canvas.drawText(`physics ticks: ${physicsFrame} (~${(physicsFrame/60).toFixed(1)}sec)`, 0, 0,{textBaseline:'top'})
+            canvas.drawText(`frames: ${engine.frames} (~${(engine.frames/(physicsFrame/60)).toFixed(1)}FPS <--flawed)`, 0, 8,{textBaseline:'top'})
+            canvas.drawText(`run time: ${((performance.now()-readyTime)/1000).toFixed(1)}sec`, 0, 16, {textBaseline:'top'})
         }
 
         // Ask to run at the next frame
@@ -108,7 +114,7 @@ function physicsTick() {
     // Runs 60 times a second regardless of frame rate.
     physicsFrame++;
 
-    if (engine.running) engine.room.step();
+    engine.room.step();
 }
 
 console.debug(engine.rooms);
@@ -127,6 +133,7 @@ function load() {
         engine.loadLoop();
         setTimeout(load, 1000/60);
     } else {
+        readyTime = performance.now();
         main();
         setInterval(physicsTick, 1000/60); // Update physics 60 times a second
     }
diff --git a/src/js/objects.js b/src/js/objects.js
index 1298685e3e4bb684542a207822e28b030ee9b5ff..7876278c18593d93e775b4fb0c34fcccfbaed3ea 100644
--- a/src/js/objects.js
+++ b/src/js/objects.js
@@ -132,10 +132,15 @@ export class FontRenderer {
         this.font = font;
         this.h = 8;
         this.w = 6;
+        this.invert = 0;
     }
 
     draw(text, x, y) {
         text = text.toUpperCase();
+
+        const oldFilter = canvas.filter;
+        if (this.invert) canvas.filter = 'invert(1)';
+
         let split
         try{
             split = text.split("");
@@ -165,6 +170,8 @@ export class FontRenderer {
                 this.w, this.h,
                 this.w * slice, 0, this.w, this.h);
         }
+
+        canvas.filter = oldFilter;
     }
 
     drawLines(text, x, y) {
diff --git a/src/js/objects/player.js b/src/js/objects/player.js
index 51b0e263d93db4bf84ba340a44affbf3a0fedf47..15c44696a8f094e9aefc9296d72c0e2d2f243c11 100644
--- a/src/js/objects/player.js
+++ b/src/js/objects/player.js
@@ -1,8 +1,23 @@
 import {Entity} from "../../../hampsterengine/src/things";
 
 export default class Player extends Entity {
+    constructor(props) {
+        super(props);
+    }
+
     draw() {
         canvas.setFillColor('red');
         canvas.fillRect(this.x,this.y,10,16);
     }
+
+    checkCollision(other) {
+        // Checks if colliding with another entity. Returns true if colliding.
+
+        return (
+            this.left < other.right &&
+            this.right > other.left &&
+            this.top < other.bottom &&
+            this.bottom > other.top
+        );
+    }
 }
diff --git a/src/js/rooms/game.js b/src/js/rooms/game.js
index dd5815b9c400d68ec7ecf447ae8b55cab9d864bc..85c4a12277318984137649de4ec97d6fce60404e 100644
--- a/src/js/rooms/game.js
+++ b/src/js/rooms/game.js
@@ -1,11 +1,13 @@
 
 import {Entity, Room} from "../../../hampsterengine/src/things";
 import Player from "../objects/player";
-import {GRAVITY} from "../extras";
+import {clone, clonePlayer} from "../extras";
 
 export const rm_game = new Room();
-const GRAVITY_X = 0;
-const GRAVITY_Y = 0.0003;
+const GRAVITY_X = 0; // I don't think we're going to use X gravity but i'm going to keep in the source in case i do
+const GRAVITY_Y = 150; // Per second
+const entities = rm_game.entities;
+
 
 rm_game.start = _=>{
     engine.running = true;
@@ -16,7 +18,18 @@ rm_game.stop = _=>{
 }
 
 rm_game.step = _=>{
+    const elapsed = 1 / 60;
+
+    // Clone the player so we can put them back after the first check
+    const old_player = {...player};
+    const entitiesWithoutThePlayer = [...entities].slice(entities.indexOf(player));
+
+    // Accelerate the player towards GRAVITY_Y
+    player.y += GRAVITY_Y * elapsed;
 
+    if (player.checkCollision(floor)) {
+        player.y = floor.top - player.height;
+    }
 }
 
 rm_game.drawGui = _ => {
@@ -27,7 +40,16 @@ rm_game.drawGui = _ => {
     });
 }
 
-const player = new Player();
-// player.ay = 0.1;
+let player = new Player();
 player.x = 40;
-rm_game.entities.push(player);
+player.y = 40;
+window.player = player;
+entities.push(player);
+
+let floor = new Entity();
+floor.x = 0;
+floor.y = 150;
+floor.width = 256;
+floor.height = 50;
+floor.draw = _=> { canvas.setStrokeColor('black'); canvas.strokeRect(floor.x, floor.y, floor.width, floor.height) }
+rm_game.entities.push(floor);
diff --git a/src/js/rooms/mainMenu.js b/src/js/rooms/mainMenu.js
index a76925b9fb00252354a7069a37f6efa49101d824..507c62d5e620ebc71da6b6765ce000dd214c411d 100644
--- a/src/js/rooms/mainMenu.js
+++ b/src/js/rooms/mainMenu.js
@@ -2,18 +2,27 @@ import {Room} from "../../../hampsterengine/src/things";
 import {Logo, MainMenuButton} from "../objects";
 
 export const rm_mainMenu = new Room();
-rm_mainMenu.bgColor = '#f0f0f0';
+rm_mainMenu.bgColor = '#050911';
 
-const logo = new Logo();
-logo.x = 30;
-logo.y = 45;
-logo.align = 2
-rm_mainMenu.entities.push(logo);
+// const logo = new Logo();
+// logo.x = 30;
+// logo.y = 45;
+// logo.align = 2
+// rm_mainMenu.entities.push(logo);
+
+rm_mainMenu.flasher = !0;
+
+rm_mainMenu.step = _=>{
+    if (physicsFrame % 30) rm_mainMenu.flasher = !rm_mainMenu.flasher;
+}
 
 rm_mainMenu.drawGui = _ => {
-    canvas.setFillColor('#0f0f0f');
+    // canvas.setFillColor('#ffffff');
+
+    fR.invert = 1;
+    fR.draw("Thirteen minutes to space", 30, 8*4);
 
-    fR.draw("Press [ENTER] to start.", 30, canvas.height-35);
-    fR.draw("[c] bye 2024", 30, canvas.height-16);
-    // fR.draw("Uses 3rd-party licenses. Press [L] to read.", 30, canvas.height-16, {});
+    if(rm_mainMenu.flasher) fR.draw("Press [ENTER] to start.", 30, canvas.height-(8*8));
+    fR.draw("created by bye", 30, canvas.height-(8*4));
+    fR.invert = 0;
 }
\ No newline at end of file