# High Noon account and saloon: verified original evidence Source: `HighNoon_Clutch_Ghidra.macho.c`, line numbers below refer to that file. Assets from `Payload/HighNoon.app`. This is a reading of decompiled client code, not recovered original source or a claim of full original behavior. Machine data: `screen-layout-evidence.json`; original default XML recovered directly from executable: `saloon-default-avatars.xml`; original localized account text: `account-original-text.json`. ## Screen flow - `SignInHNCtl::viewDidLoad` L237073 adds `Default2.jpg`, version and status labels, then calls `doSignIn`. There is no username/password form or sign-in button in this screen. `doSignIn` L237250 connects and sends `GetServerSettingsMessage`. `sendSignInMsg` L237299 sends `SignInMessage` with device/account identifiers and client metadata. Neither web login nor simulated success is original authentication. - `handleSignIn` L237680 branches on server `result_code`. Codes 9 and 11 enter existing-account saloon path; 8 calls `onLocalAccountLogin`; 10 links Game Center; 7 calls `onSignUp`. Other branches show upgrade, authentication or server errors. - `onSignUp` L237618 chooses optional Game Center screen if configured/available/not finished. Otherwise clears saved username and navigates to `ChooseGenderHNCtl`. Bundled defaults have `displayAGC=0` and `displayFB=0` (L312737–312738), so these optional native service screens are not required by default. - `ChooseGenderHNCtl::navToSignUpScreen` L315620 creates `SignUpHNCtl`, sets `isFemale`, pushes it. **Gender selection does not directly enter lobby.** - `SignUpHNCtl::textFieldShouldReturn` L246613 trims whitespace/newlines, rejects empty name, resigns keyboard and calls `doSignUp`. The latter L238322 sends `SignUpMessage` containing username and `is_female`. Default max username length is 30 (L312731), but it is a configurable server setting. - `onSignUpResponseMessage` L246656 accepts result codes 5 or 6; may show optional Facebook promotion, otherwise invokes `FUN_0015ecec` with `get_my_info_resp`. - `FUN_0015ecec` L237475 creates GlobalContext/HNPlayer from server player data and schedules `gotoSaloonScreen` L237607. `HNScreenNav::gotoSaloonScreen` L164054 replaces bottom controller with `OppListRootHNCtl`. ## Login exact layout `Default2.jpg` is 320×480 and added using `UIImageView initWithImage` with no frame override. Version label frame at L237099: `[20,450,280,10]`. Status label frame at L237120: `[10,457,300,20]`. These are decoded IEEE754 float constants passed to `initWithFrame`. `HNAccountStyle::signInVersionLbl` L282641: commonFont size10, color RGB117,76,40, alignment2 (right). `signInStateLbl` L282674: commonFontBold size10, color RGB119,76,43, alignment1 (center). `HNStyle::init` L286745 selects AmericanTypewriter / AmericanTypewriter-Bold for both English and Arabic. Status dots timer 1.2s (`viewWillAppear` L237180); status fade duration0.2s. Exact version format string should be read from Mach-O because Ghidra sanitizes string symbols. Original English status text from binary Localizable.strings: `APPROACHING HIGH NOON GULCH ` and `UPDATING CONTENT `. Arabic equivalents preserved in JSON. ## Gender exact layout Programmatic, not NIB-backed (`viewDidLoad` L315180). Draw/add order: 1. `choose-gender-bg.png` 320×480 at native origin. 2. localized `choose-gender-text.png` 320×480 at native origin. 3. `choose-gender-male-0.png` 141×385 at x11,y47. 4. `choose-gender-female-0.png` 146×374 at x164,y48. 5. `choose-gender-male-btn-0.png` 69×68 at x44,y413. 6. `choose-gender-female-btn-0.png` 68×68 at x204,y413. 7. localized `choose-gender-ok-btn.png` 171×88 at x73,y287; initial transform scale0.1 and alpha0. Selecting either portrait or its sex-symbol button calls `didChooseGender` L315572. Male selection sets male portrait/button to `-1.png`, female to `-0.png`; inverse for female. First selection reveals confirm via alpha1/scale1 animation of0.3s (`showComfirmBtn` L315474). Selection highlight animation also0.3s, but image changes happen inside block (no tweened graphic assets). Confirm target is attached after reveal completion. No default selection is set by viewDidLoad. ## Name registration exact layout `SignUpHNCtl::viewDidLoad` L238143 adds `sign-up-background.jpg` 320×480; title frame x20,y25,w280,h30 (centered horizontally by parent view center), description x30,y60,w260,h100, registration label `[99,166,120,20]`, name field `[52,198,216,20]`. Title style size22 commonFontBold RGB59,35,20, centered; description size14 same font/color, centered, multiline (HNAccountStyle L282707 and L282740). Registration label is commonCondensedBoldFont size20, black alpha0.8. Name field commonFont size18, adjusts size/minimum1, placeholder from original localization. Native keyboard return is submit; no original on-screen continue button is added in this code. ## Saloon layout and behavior `OppListRootHNCtl::init` L255402 loads `opp_list.nib` at L255452. Root/subview frames and button wiring must come from NIB decoding, not assumptions. `viewDidLoad` L255892 sets sky image and adds separate land and house layers. Normal assets: sky960×129, house960×27, land960×363. Land y is computed as480-landHeight (117); house y as480-landHeight-houseHeight (90), although Ghidra corrupts one setFrame argument list, so disassembly should confirm before claiming pixel-perfect accuracy. Ranking image is `saloon-bg-ranking.png`320×42. A programmatic instruction button at `[276,0,44,44]` has image insets top0,left9,bottom21,right0 (`viewDidLoad` ~L256135). Original default theme mapping is in `FUN_0013e9e8` L218218–218315: scarecrow uses `scarecrow-in-duel.png`; sky/house/land/floor/fence map to `saloon-bg-*`; theme names `default` and `christmas`. `FUN_0013ef0c` L218317 selects mapping using configured theme. ServerConfigs bundled default theme is `default` L312719. ### Original block order, no guessing `OppListRootHNCtl::init` prepends `shitboard`, then parses server-configured `saloonAvatarsXML`, respecting level and hidden blocks. **The executable contains a real bundled default XML**, extracted byte-for-byte at file offset3863531 into `saloon-default-avatars.xml`: - scarecrow: Target Practice and Controls. - wildcat: Quick Play; minimum level2; `wildcat-challenge.png`. - mov: Earn Wampum by Watching Movies; `func-avatar-mov.png` / disabled counterpart. - app: Try Other Apps; `func-avatar-app.png` / disabled counterpart. - slotmachine: Joe's Lucky Bottle Spin; minimum level6; `saloon-slot-machine.png`. - me: `customize-me.png`. At level1, bundled-default order is therefore shitboard/scarecrow/mov/app/me. It is not proof of a live historical server response. The fallback for XML parse failure at L255589 differs: shitboard/scarecrow/(wildcat if level>1)/me. Do not silently present fallback as the default. `SaloonScrollView::viewDidLoad` L197923 starts centered on `me` block. Paging is disabled, fast deceleration, horizontal scrolling, clipping disabled. `getWidthFor` L197531 returns122 for every block except shitboard (global width still needs binary verification). `getOriginFor` L197552 sums widths + leftPadding; `getScreenPaddingFor` L197584 is max(0,(scrollWidth-blockWidth)/2); offset=origin-padding. `getFrameFor` L197653 gives local block y6 except shitboard's global configured offset. `SaloonCharactorController::loadSubview` L196898 places scarecrow centered horizontally, baseline at local y322, exact image size (no scale). It is wired to `showPractice` at L197480. Label frame `[10,322,106,textHeight]` (`addSaloonLabelView` L196855), commonFontBold11. `SaloonScrollView::addFenceWithTag` L197739: each fence frame x=(tag-4000)*320+shitboardWidth-25,y133,w320,h177. `addWoodFloorWithTag` L197815: floor x=(tag-4500)*390+shitboardWidth-125,y=419-imageHeight, native image dimensions506×122. These are local to scroll view. Floor tile step390 differs from image width506: preserve overlap. Scroll parallax `setParallaxOffsetForImage...` L198137 clamps speed ratio to min((imageWidth-scrollWidth)/maxContentOffsetX,expectedRatio), then x=-max(0,ratio*contentOffsetX). `scrollViewDidScroll` L198235 uses expected ratio0.1 for house/land and0.005 for sky. This lobby parallax is distinct from motion sensor training-room camera. ### Player and store transition PlayerView size122×362 (`initWithPlayer...` L198478), body baseline322. `transformedPlayerSize` L198738 and `FUN_0013e970` L218200 yield width122, height floor(322*(0.9+clamp(level*0.1/20,0,0.1))). `getBodyRect` L198773: x0,y322-height,w122,h=transformed height. This depends on actual player level received from server; do not invent level/balance/inventory and label it recovered. PlayerView is placed at origin0,0 within the `me` block, which is centered when entering lobby. Own-avatar tap chain verified end-to-end: `OppListRootHNCtl::onAvatar_event` L258717 → own id branch L258812 calls `MyDetailTabHNCtl::onShowMyDetails` L254618 → `setHidden:1` L254263 → `moveDownAnimation` L254743 → `onMoveDownAnimationFinished` L254730 → `navToDressingRoomScreen` L254789 → new `DressingRoomHNCtl` pushed transition8. Thus it does ultimately open original dressing/shop screen, after bottom info panel drops down. Avatar also animates into frame origin0,y48 during transition. Dressing room implementation requires its separate evidence. `showPractice` L257959 plays click at soundSetting*0.3 and calls `gotoPractice` L257930. If `myGuns.count==0`, sets pending and blocks until gun response. Otherwise replaces lobby with new `PracticeHNCtl`, transition1. ## Remaining uncertainties / required distinctions - No original server response is supplied; player level, selected clothes/guns, initial balance, ranks, online players and any server overrides remain unknown. - Programmatic layout constants above are explicit, but Ghidra has bad structure-return signatures and vector arithmetic; verify ambiguous formula/frames using original Mach-O disassembly before asserting exactness. - NIB-derived root hierarchy, frames and selectors must be merged from actual NIB decoding. Login, gender, registration are built programmatically and have no dedicated NIB in this IPA. - A browser-local account and transition past login would be an offline reconstruction adaptation; document it separately from original authentication. Game Center and old multiplayer have not been restored merely by reproducing screens. - No substitute images or invented account values are justified by these findings. ## Follow-up: binary globals and client fallback avatar Direct parsing of armv7 Mach-O inside universal binary (architecture file offset0x1000) resolves pointer0x3f11fc→0x3f0640: float350.0, the shitboard width; pointer0x3f11f8→0x3f0658: integer39, shitboard localY. No coordinate guessing is required for these globals. Combined with decoded NIB scroll frame[0,42,320,480], ordinary block screenY=48. At bundled default level1: block origins shitboard0,scarecrow350,mov472,app594,me716; centered me scrollOffset617 and viewport x99. Initial player container screen frame[99,48,122,362]. Actual player level remains server data. `customize-me.png` is localized English67×52, placed by SaloonCharactorController inside me block at x=(122-67)/2=27.5,y321, tag5006. Added behind actual player view, shown/hidden by bottom panel transitions. It is not a substitute avatar. **Bundled client fallback appearance exists.** `DressingUtils::prepare_is_female` L158480 iterates store.plist.dressing, uses supplied player dressDict value when present, otherwise male_default/female_default then default (`getDefaultDressSlug_is_female` L159391). Skin=skin1; Body=body1/body2; Shirt=shirt-1/shirt-female-02; Pants=jeans-1/pants-female-02; Boots=boot1/boots-female-11; Face=face1/face-female-2; Fur=fur1; Eyes=eyes-normal/eyes-female-normal; Mouth=mouth-1/mouth-female-normal; female Hair=hair-female-bargirl; Weapon=revolver. Other optional clothing absent. This proves fallback behavior, not original initial server-assigned outfit. GlobalContext loads store.plist L200643. `HNPlayer::dressDict` L234712 returns parsed dressing JSON or empty dictionary. `HNPlayer::avatarCGImage` L234765 invokes DressingUtils makeUpPlayerOnlyForFullAvatar→makeUpPlayer, which prepares selection and renders in state'held'. CFString0x49a7e4 resolves to C string0x399748 length4 ('held'), directly read from Mach-O. `newRenderedCGImageWithState` L159072 creates122×322 canvas; drawClothesBack L158786 traverses reverse dressing order, then drawClothes L158879 traverses forward order. Item X,Y are Quartz bottom-left; DOM top coordinate322-Y-imageHeight. Held Body uses suffix Skin then revolver (dress-body1-skin1-revolver.png); weapon uses gender-specific held sprite and male_held/female_held coordinates. Face masks color+Skin+0 and1 use skin1 colors, followed by overlay. Complete parsed defaults/item metadata saved in avatar-fallback-evidence.json. ## Final fidelity audit additions Version text format resolved from SignInHNCtl::viewDidLoad original ARM IMP0x15dc1d. MOVW r2,#0xc1ba/MOVT r2,#0x33 followed by ADD r2,PC at0x15de56 computes CFString0x49a014. CFString points to Cstring0x398970 length5 `%@.%@`. With Info.plist values, actual label is `5.1.0.185`. Parenthesized build number would be incorrect. Disassembly retained at extracts/signin-arm.txt. Saloon titles: loadSubview ARM0x11ee8c–0x11ee9a loads CFString0x49c594 (`%@_title`, Cstring0x39d9ad), formats with block id, then calls localization function. XML title attribute is not used as localization key here. For Arabic, use `scarecrow_title`, `mov_title`, `app_title`, etc. No consumption of line-num XML attribute occurs in loadSubview/addSaloonLabelView; original computes height by sizeWithFont at width106 and heightInfinity, then sets numberOfLines0. Do not force two lines from XML metadata. Board art: original normal theme saloon-shitlist-board.png is first composited with localized saloon-shitboard-text.png at origin0,0 and native text dimensions. It is framed `[0,-45,320,350]`, contentMode9, then y is changed by additional -35 (literal float at0x11f340), yielding board-local final frame `[0,-80,320,350]`. Board block y39 plus scroll y42 gives initial screen top1 at contentOffset0. Current direct native480-height art without this framing would be wrong. Disassembly retained at extracts/saloon-title-arm.txt.