| name | godot-adapt-mobile-to-desktop |
| description | Expert patterns for scaling mobile games to desktop including mouse/keyboard controls, increased resolution and graphical fidelity, expanded UI layouts, settings menus, window management, and platform-specific features. Use when creating desktop ports or cross-platform releases. Trigger keywords: mouse_controls, keyboard_shortcuts, resolution_scaling, graphics_settings, fullscreen_toggle, window_modes, Steam_integration, desktop_optimization. |
NEVER Do
- NEVER keep touch-only controls โ Add mouse/keyboard alternatives. Touch controls on desktop feel awkward and limit precision.
- NEVER lock to mobile resolution โ Desktop can handle 1920x1080+ and higher frame rates. Upscale UI, increase render distance.
- NEVER hide graphics settings โ Desktop players expect quality options (resolution, VSync, shadows, anti-aliasing).
- NEVER use mobile-sized UI โ Touch targets (44pt) are too large for mouse. Reduce button/text size by 30-50%.
- NEVER forget window management โ Players expect fullscreen, borderless, maximize, and multi-monitor support.
Available Scripts
MANDATORY: Read the appropriate script before implementing the corresponding pattern.
MANDATORY first read for input remap โ Bridges mobile actions to keyboard/mouse without rewriting gameplay. Emits mouse_look_bridge_requested when FPS capture is needed โ pair with mouse_capture_look.
MANDATORY when UI needs hover โ Restores desktop hover/focus affordances mobile never had. Prefer this over ad-hoc mouse_entered dumps.
Captured look via InputEventMouseMotion.relative โ use for FPS/orbit when adapter alone is not enough.
MANDATORY โ Windowed / exclusive fullscreen / borderless via DisplayServer.
Runtime InputMap remap + ConfigFile persistence.
Hardware cursor show/hide/combat vs menu states.
VSync / Engine.max_fps unlock for 144Hz+.
Native resolution OptionButton from DisplayServer.screen_get_size.
MANDATORY โ Shrink thumb-sized mobile Controls for mouse density.
Mouse-wheel zoom replacing pinch.
MANDATORY โ set_auto_accept_quit(false) + save prompt on WM close.
Launch/place window on the screen under the cursor.
Decision Tree โ Input Script Picks
| Need | Use |
|---|
| Map touch actions โ WASD/mouse without rewriting movers | desktop_input_adapter |
| Button/Control hover styles & tooltips | hover_bridge |
| Captured mouselook (FPS/3P orbit) | mouse_capture_look โ MANDATORY when aim/Look requires captured relative motion; adapter get_aim_vector() alone is top-down only |
| Rebindable keys | keybinding_remapper |
| Pinch โ wheel zoom | scroll_wheel_zoom |
When desktop_input_adapter emits mouse_look_bridge_requested, attach or enable mouse_capture_look.gd on the player/camera rig โ do not stop after InputMap injection.
Port Procedure (ordered)
- MANDATORY desktop_input_adapter (+ hover_bridge for UI) so every touch action has a precision equivalent.
- desktop_ui_scaler + expanded layouts (hotbar/chat/minimap) โ godot-ui-containers for structure.
- dynamic_window_manager + multi_monitor_handling + quit_confirmation.
- resolution_dropdown + uncapped_framerate + graphics quality ladder (persist ConfigFile).
- Deeper OS integration โ godot-platform-desktop.
Platform Services Decision Tree (Steam / Discord)
| Goal | Decision |
|---|
| Ship on Steam with cloud/achievements | Add GDExtension bridge (e.g. GodotSteam); keep init behind OS.has_feature("steam") / editor-safe stubs. Do not paste fake Steam.* tutorials into gameplay scripts. |
| Discord Rich Presence only | Prefer a thin GDExtension/plugin; update presence from an Autoload on scene change โ never block _ready on network. |
| No store integration this milestone | Cut โ omit Steam/Discord code paths entirely; document as future GDExtension spike. |
Deep Recipes
MANDATORY when porting beyond the ordered procedure: read desktop-port-deep.md. Do NOT Load it for a first-pass keyboard/mouse remap.
Testing (before ship)
MANDATORY before declaring the port complete: run desktop-port-testing-checklist.md. Do not inline a partial checklist โ use the reference file.
Expert Techniques (short)
- Optional lightweight launcher via
OS.create_process + user://settings.cfg before main pack.
- Short FPS benchmark โ write
user://override.cfg quality suggestions.
- Graphics quality ladder (MSAA, shadow atlas, post-FX) and UI density tables live in desktop-port-deep.md โ open when port procedure rows are insufficient.
Reference
Progressive disclosure: open Official Documentation links only when researching a specific API;
load Related Skills when routing work to a peer domain โ do not preload the whole lattice.
Official Documentation
- Using InputEvent โ Event pipeline for replacing
InputEventScreenTouch/ScreenDrag with mouse motion, buttons, and keyboard actions on desktop.
- Mouse and input coordinates โ Viewport vs canvas transforms so mouse aim and hover hit the same UI/game space as former touch targets.
- Custom mouse cursor โ Hardware cursor shapes and hide/show rules for combat vs menus (
Input.set_custom_mouse_cursor).
- Input examples โ Practical WASD, mouse-look, and action patterns that map onto mobile virtual-joystick / button actions.
- Handling quit requests โ
NOTIFICATION_WM_CLOSE_REQUEST / set_auto_accept_quit(false) so the OS close button can prompt save instead of silent exit.
- Multiple resolutions โ Stretch mode, aspect, and content scale when leaving fixed mobile base resolutions for 1080pโ4K and ultrawide.
- DisplayServer โ Window modes, VSync, screen count/size/position, and refresh-rate queries behind fullscreen and multi-monitor ports.
- Window โ Per-window size, position, and mode APIs used with borderless / exclusive fullscreen toggles.
- InputMap โ Runtime remapping of actions to keycodes so PC players can rebind what mobile hard-coded as touch zones.
- Size and anchors โ Anchor/offset contracts when shrinking thumb-sized controls for mouse density without breaking layout.
- Using Containers โ Box/Grid/Margin layout rules for expanded desktop HUDs (hotbars, chat, minimap) vs compact mobile stacks.
- Feature tags โ
pc / mobile / OS tags for branching input, UI scale, and graphics quality without separate projects.
Related Skills
Prerequisites
- godot-input-handling โ Shared InputEvent buffering, action maps, and device detection before injecting WASD/mouse equivalents for mobile actions.
- godot-ui-containers โ Anchors, containers, and minimum sizes so desktop UI shrink/expand passes keep layout correct across resolutions.
- godot-platform-mobile โ Inventory the mobile lifecycle, touch, and safe-area assumptions you are replacing before desktop window/input paths take over.
Complements
- godot-platform-desktop โ Deeper Windows/macOS/Linux DisplayServer and OS integration once the mobileโdesktop control and settings remap is in place.
- godot-camera-systems โ Mouse-look, orbit, and scroll-wheel zoom rigs that replace swipe/pinch camera controls.
- godot-performance-optimization โ Profiling and quality ladders when unlocking FPS, MSAA, shadows, and draw distance for desktop GPUs.
- godot-save-load-systems โ Durable save ownership hooked to window-close confirmation and settings
ConfigFile persistence.
- godot-ui-theming โ Theme type variations and hover styles that mobile never showed but desktop players expect on buttons/menus.
- godot-project-foundations โ Display stretch, renderer, and feature-tag project defaults that every desktop port branch depends on.
- godot-autoload-architecture โ Singleton homes for window managers, input adapters, and graphics settings that must outlive scene changes.
Downstream / consumers
- godot-export-builds โ Packaging and CI export presets for Windows/macOS/Linux after input/UI/window gates pass on desktop.
- godot-adapt-desktop-to-mobile โ Inverse lattice when the same codebase must keep or regain touch-first paths after a desktop-first pass.
- godot-monte-carlo-balancer โ Re-tune difficulty when mouse precision and higher FPS invalidate mobile touch timing and aim curves.
Master
- godot-master โ Library router and mirrored module entry for discovering this adapt skill beside sibling domains.