diff --git a/res/raw/rollo.c b/res/raw/rollo.c
index d7df6b9..5ff3308 100644
--- a/res/raw/rollo.c
+++ b/res/raw/rollo.c
@@ -5,40 +5,15 @@
 
 #define PI 3.14159f
 
-// Variables from java ======
-
-// Parameters ======
-#define PARAM_BUBBLE_WIDTH              0
-#define PARAM_BUBBLE_HEIGHT             1
-#define PARAM_BUBBLE_BITMAP_WIDTH       2
-#define PARAM_BUBBLE_BITMAP_HEIGHT      3
-#define PARAM_SCROLL_HANDLE_ID          4
-#define PARAM_SCROLL_HANDLE_TEX_WIDTH   5
-#define PARAM_SCROLL_HANDLE_TEX_HEIGHT  6
-
-// State ======
-#define STATE_ICON_COUNT                0
-#define STATE_SCROLL_X                  1
-#define STATE_FLING_TIME                2
-#define STATE_FLING_VELOCITY_X          3
-#define STATE_ADJUSTED_DECELERATION     4
-
-/* with fling offset applied */
-#define STATE_CURRENT_SCROLL_X          5
-
-#define STATE_FLING_DURATION            6
-#define STATE_FLING_END_POS             7
-
-#define STATE_START_SCROLL_X            8
-#define STATE_SELECTED_ICON_INDEX       9
-#define STATE_SELECTED_ICON_TEXTURE     10
-
-#define STATE_VISIBLE                   11
-#define STATE_ZOOM                      12
+float deceleration;
 
 // Drawing constants, should be parameters ======
 #define VIEW_ANGLE 1.28700222f
 
+void init() {
+    deceleration = 0;
+}
+
 int g_lastFrameTime = 0;
 void print_frame_rate()
 {
@@ -78,7 +53,7 @@
     int row;
     int col;
 
-    float scale = 1.0f - loadI32(ALLOC_STATE, STATE_ZOOM)/100000.0f;
+    float scale = 1.0f - state->zoom;
 
     float iconTextureWidth = ICON_WIDTH_PX / (float)ICON_TEXTURE_WIDTH_PX;
     float iconTextureHeight = ICON_HEIGHT_PX / (float)ICON_TEXTURE_HEIGHT_PX;
@@ -91,16 +66,11 @@
 
     float farIconTextureSize = far_size(2 * ICON_TEXTURE_WIDTH_PX / (float)SCREEN_WIDTH_PX);
 
-    float labelWidthPx = loadI32(ALLOC_PARAMS, PARAM_BUBBLE_WIDTH);
-    float labelHeightPx = loadI32(ALLOC_PARAMS, PARAM_BUBBLE_HEIGHT);
-
-    float normalizedLabelWidth = 2 * labelWidthPx / (float)SCREEN_WIDTH_PX;
+    float normalizedLabelWidth = 2 * params->bubbleWidth / (float)SCREEN_WIDTH_PX;
     float farLabelWidth = far_size(normalizedLabelWidth);
-    float farLabelHeight = far_size(labelHeightPx * (normalizedLabelWidth / labelWidthPx));
-    float labelTextureWidth = labelWidthPx / loadI32(ALLOC_PARAMS, PARAM_BUBBLE_BITMAP_WIDTH);
-    float labelTextureHeight = labelHeightPx / loadI32(ALLOC_PARAMS, PARAM_BUBBLE_BITMAP_HEIGHT);
-
-    int selectedIconIndex = loadI32(ALLOC_STATE, STATE_SELECTED_ICON_INDEX);
+    float farLabelHeight = far_size(params->bubbleHeight * (normalizedLabelWidth / params->bubbleWidth));
+    float labelTextureWidth = (float)params->bubbleWidth / params->bubbleBitmapWidth;
+    float labelTextureHeight = (float)params->bubbleHeight / params->bubbleBitmapHeight;
 
     for (row=0; row<ROWS_PER_PAGE && icon<=lastIcon; row++) {
         float angle = centerAngle;
@@ -131,8 +101,8 @@
             float iconLeftZ = centerZ + (sine * farIconTextureSize * .5);
             float iconRightZ = centerZ - (sine * farIconTextureSize * .5);
 
-            if (selectedIconIndex == icon) {
-                bindTexture(NAMED_PF, 0, loadI32(ALLOC_STATE, STATE_SELECTED_ICON_TEXTURE));
+            if (state->selectedIconIndex == icon) {
+                bindTexture(NAMED_PF, 0, state->selectedIconTexture);
                 drawQuadTexCoords(
                         iconLeftX, iconTextureTop, iconLeftZ,       0.0f, 0.0f,
                         iconRightX, iconTextureTop, iconRightZ,     1.0f, 0.0f,
@@ -173,15 +143,15 @@
     pfClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 
     // If we're not supposed to be showing, don't do anything.
-    if (!loadI32(ALLOC_STATE, STATE_VISIBLE)) {
+    if (!state->visible) {
         return 0;
     }
 
     // icons & labels
-    int iconCount = loadI32(ALLOC_STATE, STATE_ICON_COUNT);
+    int iconCount = state->iconCount;
     int pageCount = count_pages(iconCount);
 
-    float scrollXPx = loadI32(ALLOC_STATE, STATE_SCROLL_X);
+    float scrollXPx = state->scrollX;
     float maxScrollXPx = -(pageCount-1) * SCREEN_WIDTH_PX;
     int done = 0;
 
@@ -194,11 +164,10 @@
     }
 
     // If we've been given a velocity, start a fling
-    float flingVelocityPxMs = loadI32(ALLOC_STATE, STATE_FLING_VELOCITY_X);
+    float flingVelocityPxMs = state->flingVelocityX;
     if (flingVelocityPxMs != 0) {
         // how many screens will this velocity do? TODO: use long
         // G * ppi * friction // why G? // friction = 0.015
-        float deceleration = loadF(ALLOC_STATE, STATE_ADJUSTED_DECELERATION);
         float flingDurationMs;
         if (deceleration == 0) {
             // On the first frame, calculate which animation we're going to do.  If it's
@@ -264,18 +233,16 @@
             endPos = scrollXPx + (flingVelocityPxMs*flingDurationMs)
                     + ((deceleration*flingDurationMs*flingDurationMs)/2);
 
-            storeF(ALLOC_STATE, STATE_ADJUSTED_DECELERATION, deceleration);
-            storeF(ALLOC_STATE, STATE_FLING_DURATION, flingDurationMs);
-            storeF(ALLOC_STATE, STATE_FLING_END_POS, endPos);
+            state->flingDuration = flingDurationMs;
+            state->flingEndPos = endPos;
         } else {
-            flingDurationMs = loadF(ALLOC_STATE, STATE_FLING_DURATION);
+            flingDurationMs = state->flingDuration;
         }
 
         // adjust the deceleration so we always hit a page boundary
 
-        int flingTime = loadI32(ALLOC_STATE, STATE_FLING_TIME);
         int now = uptimeMillis();
-        float elapsedTime = (now - flingTime) / 1000.0f;
+        float elapsedTime = (now - state->flingTimeMs) / 1000.0f;
         int animEndTime = -flingVelocityPxMs / deceleration;
 
         int flingOffsetPx = (flingVelocityPxMs * elapsedTime)
@@ -283,7 +250,7 @@
         scrollXPx += flingOffsetPx;
 
         if (elapsedTime > flingDurationMs) {
-            scrollXPx = loadF(ALLOC_STATE, STATE_FLING_END_POS);
+            scrollXPx = state->flingEndPos;
             done = 1;
         }
     } else {
@@ -297,12 +264,12 @@
     if (scrollXPx < maxScrollXPx) {
         scrollXPx = maxScrollXPx;
     }
-    
-    storeI32(ALLOC_STATE, STATE_CURRENT_SCROLL_X, scrollXPx);
+
+    state->currentScrollX = scrollXPx;
     if (done) {
-        storeI32(ALLOC_STATE, STATE_SCROLL_X, scrollXPx);
-        storeI32(ALLOC_STATE, STATE_FLING_VELOCITY_X, 0);
-        storeF(ALLOC_STATE, STATE_ADJUSTED_DECELERATION, 0);
+        state->scrollX = scrollXPx;
+        state->flingVelocityX = 0;
+        deceleration = 0.f;
     }
 
     // Draw the icons ========================================
@@ -324,7 +291,7 @@
 
     draw_page(icon, lastIcon, -VIEW_ANGLE*currentPagePosition);
     draw_page(icon+iconsPerPage, lastIcon, (-VIEW_ANGLE*currentPagePosition)+VIEW_ANGLE);
-    
+
     // Draw the border lines for debugging ========================================
     /*
     bindProgramVertex(NAMED_PVOrtho);
