灵符lingfu

lingdev

↓ 0 downloads

LingDev: a Godot / Unity-style game editor written in Ling. 2-D and 3-D scenes, Flash-style timeline and cutscenes, HUDs over 3-D, Ling scripting, audio / music / MIDI, builds for Windows, Linux, macOS, web, Raspberry Pi and LingOS. Ships with Ling Agent (an N64-style spy FPS), Ling Breaker (a 3-D breakout) and Moko's Picture Book (a kawaii storybook platformer).

Windows · x86-64Linux · x86-64LingOS · x86-64LingOS · Pi 5 ARM64Web · WASM
Keywords game-engine, editor, 3d, 2d, cutscene, timeline, ling, lingos, raspberry-pi
lingfu install lingdev
LicenseApache-2.0 OR MIT
Authorsling-lin
READMECode / FilesVersionsDependency GraphDependentsSecurityBuildsSettings

Code / Files (136)

ling/help.ling
# help.ling - the text shown by Help, Shortcuts and the Scripting Reference.

fn help_lines() {
    return ["#GETTING STARTED", "File > New Project creates a folder with scenes/, scripts/, assets/ and the runtime.", "The left column holds the Hierarchy (nodes of the open scene) and the Assets browser.", "The centre is the viewport: a 3D orbit view for levels and cutscenes, a canvas for 2D menus.", "The right column is the Inspector for the selected node; the dock below holds the", "Timeline, Cutscene, Script and Build editors.", "", "#SCENES", "A project is a set of .lscene files. Kinds: 3d (levels, worlds), 2d (menus, HUDs) and", "cutscene (3d + camera / dialog / fx tracks). A 3D scene can name a 2D HUD scene that is", "drawn on top of it, which is how a menu or HUD sits over a 3D background.", "Nodes nest: drag a row onto another in the Hierarchy. Children move with their parent.", "", "#VIEWPORT", "Right-drag orbits, middle-drag (or Shift + right-drag) pans, the wheel zooms, F focuses", "the selection, Home resets the camera. Hold the right button and use WASD to fly.", "Click selects, drag moves along the ground plane (Move tool) or around the up axis", "(Rotate tool) or scales (Scale tool). Drag an asset from the browser into the view.", "", "#TIMELINE", "Every node property with a diamond in the Inspector can be keyed. With Auto Key on,", "edits at the playhead write keys. Right-click a key for its easing. Space plays.", "", "#CUTSCENES", "Tracks: camera (moves, cuts, orbits, follow), dialog (subtitle lines with voice-over", "files), anim (model clips, move-to, show / hide), audio (sounds, music), fx (fade,", "letterbox, flash, shake) and event (go to scene, call a script hook, wait, end).", "Right-click a track to add a clip; drag clips; double-click to edit.", "", "#LEVELS & GAMEPLAY", "Spawn points place the player; an Actor with tag `player` is driven with WASD / gamepad.", "Boxes and planes with tag `solid` collide. Trigger zones fire their action when the", "player enters: goto:<scene>, call:<hook>, cutscene:<scene>, sound:<file>.", "Cameras: fixed, orbit (around a target node), follow (behind the player) and dolly", "(driven by the timeline / cutscene tracks).", "", "#SCRIPTS", "Scripts are .ling files in scripts/. A node names its script in the Inspector; the", "generated game calls <script>_ready / _update / _draw / _input / _trigger / _net hooks.", "See Help > Scripting Reference.", "", "#BUILD & EXPORT", "Build > Build & Export writes main.ling (the player + your scenes and scripts),", "Ling.toml and build scripts for: Windows, Linux, macOS, Web, a Raspberry Pi kernel", "image and a LingOS app. The Pi / LingOS targets run the software renderer.", "", "#SOUL SYMPHONY", "File > Import Ling Game turns ../soul-symphony-ling into a LingDev project: its", "cutscenes become .lscene cutscenes with dialog + voice-over tracks, its models,", "music and images are indexed as assets, and a hub level + title menu are scaffolded."]
}

fn shortcut_lines() {
    return ["#FILES", "Ctrl+Shift+N|New project", "Ctrl+Shift+O|Open project", "Ctrl+O|Open scene", "Ctrl+S|Save scene", "Ctrl+Shift+S|Save scene as", "Ctrl+I|Import asset", "Ctrl+P|Settings", "Ctrl+Q|Quit", "#EDIT", "Ctrl+Z / Ctrl+Y|Undo / redo", "Ctrl+C / X / V|Copy / cut / paste node", "Ctrl+D|Duplicate", "Delete|Delete selected", "F2|Rename", "Ctrl+G|Group selected", "Ctrl+A|Select all", "Esc|Deselect / stop play", "#VIEWPORT", "Q W E R|Select / move / rotate / scale", "F|Focus selected", "Home|Reset camera", "G|Toggle grid", "Z|Wire / solid", "H|Hide / show selected", "Numpad 7 / 1 / 3|Top / front / side", "Right-drag|Orbit", "Middle-drag|Pan", "Wheel|Zoom", "Right + WASD|Fly", "Ctrl+drag|Move without snapping", "#TIMELINE", "Space|Play / pause the playhead", "Home / End|Start / end", "L|Loop", ", / .|Step a frame", "K|Insert key on selected", "Shift+K|Delete keys at the playhead", "#PLAY", "F5|Play the project", "F6|Play this scene", "Esc|Stop", "#DOCK", "F7 F8 F9 F10 F11|Timeline / Cutscene / Script / Build / Console", "Ctrl+B|Build & export", "F1|Shortcuts"]
}

fn scripting_lines() {
    return ["#HOW SCRIPTS ATTACH", "Put a file in scripts/, e.g. scripts/enemy.ling, and type `enemy` in a node's Script field.", "Build (or Play) generates main.ling, which `use`s every script and routes the hooks below.", "Hooks are plain functions named <script>_<hook>; define only the ones you need.", "The node index `i` is the row in the scene; read / write it with nd_get(i, col) / nd_set(i, col, v).", "", "#HOOKS", "  fn enemy_ready(i)                 # once, after the scene loads", "  fn enemy_update(i, dt)            # every frame", "  fn enemy_draw(i)                  # extra drawing after the node (3D: world; 2D: canvas)", "  fn enemy_input(i, key)            # a key was pressed this frame (names like key_pressed)", "  fn enemy_trigger(i, other)        # a trigger node fired with this script attached", "  fn enemy_net(i, msg)              # a network message arrived (co-op)", "  fn enemy_hit(i, other)            # the player actor overlapped this node", "", "#NODE COLUMNS", "px py pz   position        rx ry rz   rotation (radians)      sx sy sz   size / scale", "col        packed colour   src        file path               vis lock   1 / 0", "tag scr    tag, script     a b c d    kind-specific numbers   txt        text", "", "#RUNTIME API (rt_game.ling)", "  game_goto(path)                  # switch scene (relative to the project)", "  game_push_hud(path)              # draw a 2D scene on top", "  game_play_cutscene(path)         # run a cutscene then come back", "  game_player()                    # index of the player actor (or -1)", "  game_find(name) / game_find_tag(tag)", "  game_spawn(kind, name, x, y, z)  # new node at runtime", "  game_destroy(i)", "  game_var(k) / game_set(k, v)     # shared game variables (score, flags)", "  game_sound(path, x, y, z) / game_music(path) / game_sfx(freq, dur)", "  game_say(speaker, text, seconds) # subtitle line", "  game_time() / game_dt()", "  game_key(name) / game_axis_x() / game_axis_y()  # keyboard + gamepad", "  cam_set(x,y,z,yaw,pitch,zd) / cam_orbit(...) / cam_look_at(...)", "", "#AI", "  ai_seek(i, tx, tz, speed, dt)    # move a node toward a point", "  ai_patrol(i, points_list, speed, dt)", "  ai_dist(i, j)                    # distance between two nodes", "  plat_bt_build(src) / plat_bt_set / plat_bt_tick   # behaviour trees (desktop)", "", "#NETWORKING (desktop)", "  net_host_game(port) / net_join_game(ip, port)", "  net_send_state() every frame sends the player transform; net_poll() applies the peer's", "", "#MIDI & MUSIC (desktop)", "  A midi node loads its .mid; game_midi_notes(i) -> [time, pitch, dur, ...]", "  game_on_beat(i, t) is true on a note onset at time t (rhythm games)."]
}

← Back to index