{
  "coordinateSystem": {
    "width": 320,
    "height": 480,
    "origin": "top-left",
    "source": "UIImage sizes and UIView initWithFrame constants"
  },
  "signin": {
    "source": "SignInHNCtl::viewDidLoad L237073",
    "background": {
      "asset": "Default2.jpg",
      "size": [
        320,
        480
      ]
    },
    "version": {
      "frame": [
        20,
        450,
        280,
        10
      ],
      "font": "AmericanTypewriter",
      "fontSize": 10,
      "rgb": [
        117,
        76,
        40
      ],
      "alignment": "right",
      "format": "%@.%@",
      "text": "5.1.0.185",
      "binaryEvidence": {
        "methodIMP": "0x15dc1d",
        "addPCInstruction": "0x15de56",
        "cfString": "0x49a014",
        "cstring": "0x398970"
      }
    },
    "state": {
      "frame": [
        10,
        457,
        300,
        20
      ],
      "font": "AmericanTypewriter-Bold",
      "fontSize": 10,
      "rgb": [
        119,
        76,
        43
      ],
      "alignment": "center"
    },
    "originalInteraction": "automatic network login, no input/button"
  },
  "gender": {
    "source": "ChooseGenderHNCtl::viewDidLoad L315180",
    "background": {
      "asset": "choose-gender-bg.png",
      "size": [
        320,
        480
      ]
    },
    "text": {
      "asset": "en.lproj/choose-gender-text.png",
      "size": [
        320,
        480
      ]
    },
    "maleAvatar": {
      "position": [
        11,
        47
      ],
      "asset": "choose-gender-male-0.png",
      "size": [
        141,
        385
      ]
    },
    "femaleAvatar": {
      "position": [
        164,
        48
      ],
      "asset": "choose-gender-female-0.png",
      "size": [
        146,
        374
      ]
    },
    "maleButton": {
      "position": [
        44,
        413
      ],
      "asset": "choose-gender-male-btn-0.png",
      "size": [
        69,
        68
      ]
    },
    "femaleButton": {
      "position": [
        204,
        413
      ],
      "asset": "choose-gender-female-btn-0.png",
      "size": [
        68,
        68
      ]
    },
    "confirm": {
      "position": [
        73,
        287
      ],
      "asset": "en.lproj/choose-gender-ok-btn.png",
      "size": [
        171,
        88
      ],
      "initialAlpha": 0,
      "initialScale": 0.1,
      "revealDurationSeconds": 0.3
    },
    "nextScreen": "signup"
  },
  "signup": {
    "source": "SignUpHNCtl::viewDidLoad L238143",
    "background": {
      "asset": "sign-up-background.jpg",
      "size": [
        320,
        480
      ]
    },
    "titleFrame": [
      20,
      25,
      280,
      30
    ],
    "descriptionFrame": [
      30,
      60,
      260,
      100
    ],
    "registrationFrame": [
      99,
      166,
      120,
      20
    ],
    "nameFrame": [
      52,
      198,
      216,
      20
    ],
    "submit": "keyboard return trims whitespace and submits nonempty username",
    "maxLengthDefault": 30,
    "maxLengthSource": "ServerConfigs::init L312731",
    "originalSubmit": "SignUpMessage sent to server with username and is_female",
    "titleStyle": {
      "font": "AmericanTypewriter-Bold",
      "fontSize": 22,
      "rgb": [
        59,
        35,
        20
      ],
      "alignment": "center"
    },
    "descriptionStyle": {
      "font": "AmericanTypewriter-Bold",
      "fontSize": 14,
      "rgb": [
        59,
        35,
        20
      ],
      "alignment": "center",
      "numberOfLines": 0
    },
    "registrationStyle": {
      "font": "AmericanTypewriter-CondensedBold",
      "fontSize": 20,
      "rgba": [
        0,
        0,
        0,
        0.8
      ],
      "alignment": "center"
    },
    "nameStyle": {
      "font": "AmericanTypewriter",
      "fontSize": 18,
      "adjustsFontSizeToFitWidth": true,
      "minimumFontSize": 1
    }
  },
  "saloon": {
    "source": "OppListRootHNCtl::init L255402 and SaloonScrollView",
    "nib": "opp_list.nib",
    "defaultTheme": "default",
    "defaultXml": "saloon-default-avatars.xml",
    "initialBlock": "me",
    "blockWidth": 122,
    "blockLocalY": 6,
    "playerViewSize": [
      122,
      362
    ],
    "bodyBaseSize": [
      122,
      322
    ],
    "bodyLevelHeightFormula": "floor(322 * (0.9 + clamp(level * 0.1 / 20,0,0.1)))",
    "bodyLocalYFormula": "322 - bodyHeight",
    "scarecrowBaselineLocalY": 322,
    "scarecrowPositionFormula": [
      "floor((blockWidth-imageWidth)/2)",
      "322-imageHeight"
    ],
    "floorFrameFormula": [
      "(tag-4500)*390+shitboardWidth-125",
      "419-imageHeight",
      "imageWidth",
      "imageHeight"
    ],
    "fenceFrameFormula": [
      "(tag-4000)*320+shitboardWidth-25",
      133,
      320,
      177
    ],
    "labelFrame": [
      10,
      322,
      106,
      "text height"
    ],
    "backgroundSizes": {
      "saloon-bg-sky.jpg": [
        960,
        129
      ],
      "saloon-bg-house.png": [
        960,
        27
      ],
      "saloon-bg-land.jpg": [
        960,
        363
      ],
      "saloon-bg-floor.png": [
        506,
        122
      ],
      "saloon-bg-fence.png": [
        320,
        177
      ]
    },
    "parallax": {
      "house": 0.1,
      "land": 0.1,
      "sky": 0.005,
      "formula": "x=-max(0,contentOffsetX * min((imageWidth-scrollFrameWidth)/maxContentOffsetX,expectedRatio))",
      "source": "SaloonScrollView::setParallaxOffset... L198137, scrollViewDidScroll L198235"
    },
    "avatarTap": [
      "OppListRootHNCtl::onAvatar_event_",
      "MyDetailTabHNCtl::onShowMyDetails_",
      "setHidden:1",
      "moveDownAnimation",
      "onMoveDownAnimationFinished",
      "navToDressingRoomScreen",
      "DressingRoomHNCtl"
    ],
    "shitboardWidth": 350,
    "shitboardLocalY": 39,
    "shitboardBinaryEvidence": {
      "width": {
        "pointer": "0x3f11fc",
        "target": "0x3f0640",
        "float": 350
      },
      "y": {
        "pointer": "0x3f11f8",
        "target": "0x3f0658",
        "integer": 39
      },
      "fatArchOffset": "0x1000"
    },
    "scrollFrame": [
      0,
      42,
      320,
      480
    ],
    "level1DefaultBlockOrigins": {
      "shitboard": 0,
      "scarecrow": 350,
      "mov": 472,
      "app": 594,
      "me": 716
    },
    "level1DefaultInitialContentOffsetX": 617,
    "meInitialScreenFrame": [
      99,
      48,
      122,
      362
    ],
    "customizeMeOverlay": {
      "asset": "customize-me.png",
      "xFormula": "(122-imageWidth)/2",
      "localY": 321,
      "tag": 5006,
      "source": "SaloonCharactorController::loadSubview L197180–197223"
    },
    "labelLocalization": {
      "format": "%@_title",
      "keyArgument": "block id (scarecrow,mov,app,etc), not title attribute",
      "cfString": "0x49c594",
      "cstring": "0x39d9ad",
      "lineNum": "not consumed in loadSubview or addSaloonLabelView",
      "font": "AmericanTypewriter-Bold",
      "fontSize": 11,
      "constraint": [
        106,
        "Infinity"
      ],
      "numberOfLines": 0,
      "en": {
        "scarecrow_title": "Target Practice and Controls",
        "wildcat_title": "Quick Play",
        "mov_title": "Earn Wampum by Watching Movies",
        "app_title": "Try Other Apps",
        "slotmachine_title": "Joe's Lucky Bottle Spin"
      },
      "ar": {
        "scarecrow_title": "تمرين الرماية وعناصر التحكم",
        "wildcat_title": "تشغيل سريع",
        "mov_title": "الحصول على النقود من خلال مشاهدة الأفلام",
        "app_title": "جرب تطبيقات أخرى",
        "slotmachine_title": "قوارير دجوا المحظوظة"
      }
    },
    "shitboardImage": {
      "localFrame": [
        0,
        -80,
        320,
        350
      ],
      "compositeText": "localized saloon-shitboard-text.png at [0,0,textWidth,textHeight] before frame applied",
      "source": "SaloonCharactorController::loadSubview ARM0x11f068–0x11f17a; y=-45 + literal -35 from0x11f340"
    }
  },
  "uncertainties": [
    "Original live server settings and initial player inventory/level/balances are absent; bundled defaults can be used only as bundled defaults.",
    "Ghidra ARM structure-return and vector arithmetic have corrupt signatures; verify uncertain layout arithmetic in disassembly.",
    "NIB-derived lobby root/subview coordinates are handled separately; this file does not invent them.",
    "Browser-local account state is a new offline adaptation, not original server authentication."
  ]
}