[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-105380":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":12,"contributorsCount":13,"subscribersCount":13,"size":13,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":13,"forks30d":13,"starsTrendScore":15,"compositeScore":16,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":17,"hasPages":17,"topics":19,"createdAt":8,"pushedAt":8,"updatedAt":20,"readmeContent":21,"aiSummary":8,"trendingCount":13,"starSnapshotCount":13,"syncStatus":12,"lastSyncTime":22,"discoverSource":23},105380,"Half-Life-Nintendo-64-Port","ToxyCola\u002FHalf-Life-Nintendo-64-Port","ToxyCola",null,"C",78,5,2,0,10,30,58.1,false,"main",[],"2026-11-01 00:15:28","# Half-Life 64\n\n**The bulk of this project was done with Claude Opus 5.5, with the exception of menus and assets built by UnhealthyGrapejuice.**\n\nA Nintendo 64 port of Half-Life's single-player campaign: the original maps, textures and\nlighting, played with Valve's own player-movement code, running on stock N64 hardware with an\nExpansion Pak.\n\n**Current release: 1.2** ([what's new](#whats-new-in-12)). Get the builder for Windows, Linux or macOS from the [Releases](..\u002F..\u002Freleases) page; it\nbuilds the ROM from your own copy of Half-Life (see\n[Building the ROM with the builder](#building-the-rom-with-the-builder-the-easy-way)).\n\nIt is built from:\n\n* **Valve's Half-Life SDK** (`github.com\u002FValveSoftware\u002Fhalflife`). Valve's player physics,\n  `pm_shared\u002Fpm_shared.c` and `pm_math.c`, is compiled for the N64's VR4300 CPU **unmodified**.\n  Walking, running, air control, jumping, ducking, stair-stepping, ladders, swimming, friction\n  and footstep materials all come from the real code.\n* **Your own copy of Half-Life.** The maps, textures, skies, character models, fonts, HUD\n  sprites, titles and sounds are converted from your Steam install by the tools in `tools\u002F`.\n  No Valve game data is included in this source.\n* **A new N64 engine** written for this port, because the GoldSrc engine (`hw.dll`) has never\n  been released as source. It uses [libdragon](https:\u002F\u002Fgithub.com\u002FDragonMinded\u002Flibdragon) and\n  [tiny3d](https:\u002F\u002Fgithub.com\u002FHailToDodongo\u002Ftiny3d).\n\n## What's new in 1.2\n\n**New**\n\n* **Builders for Windows, Linux and macOS with a window** instead of a console: pick your\n  Half-Life folder (found through Steam when possible), where the ROM is saved and, optionally,\n  where the temporary files go, then press Build ROM and follow the progress bar and log.\n* **Controller Pak saves:** with a Controller Pak in controller 1, the Save and Load menus get a\n  Controller Pak column with three more slots. Controller settings and button remaps are saved\n  to the cartridge SRAM, and to the Controller Pak when one is inserted.\n* **GameCube controllers** (through a JoyBus adapter or on hardware that supports them): X\n  reloads, Y uses, and the C-stick looks.\n* **Two D-pad control schemes:** \"D-pad moves, stick looks\" and \"D-pad moves, C looks\". The\n  input a scheme leaves free is mapped to the weapon, reload and flashlight buttons and shows\n  in the button remap screen.\n* **Decals:** bullet holes, blood splats and explosion scorch marks, with material impact sounds\n  and sparks off computers and metal, as on PC.\n* **Animated textures:** buttons light up when pressed, screens, scanners and other animated\n  (`+0…`\u002F`+a…`) textures play.\n* **Chrome (reflective) textures** on the weapons, Barney's helmet and other shiny surfaces.\n* **Tentacles behave like the PC version:** they track the sound of your footsteps (not when\n  you crouch), shots and grenade landings, strike at what they hear, kill the player and other\n  characters, and play their real rise, lower, tap and strike animations. The tentacle arm in\n  the scientist scene is back.\n* **Barnacles** catch you as soon as you walk under them, pull you (or a character) straight\n  up, and eat what they catch.\n* **Autosaves** now happen only where the PC autosaves (the maps' autosave points), not on\n  every level load.\n* **The flashlight** is closer to the PC's: a round spot that lights the surfaces around it.\n* **Menus:** every options screen uses the new title-screen style, with the menu move sound and\n  evenly spaced items along the cursor's arc.\n* **Cheats** (noclip, god mode, give everything, map select) only work when \"Enable cheats\" is\n  ticked in the advanced controller settings.\n\n**Fixed**\n\n* Fall damage is measured from where the fall really starts, so ladders and lifts catch you.\n* The Office Complex lift (and others like it) no longer blocks you or slides you off.\n* Scientists dragged off in a scripted scene (the tentacle grab) no longer reappear where they\n  started.\n* The tentacles had become invisible.\n* Weapon textures were mapped wrongly.\n* The weapon and its view model could disappear.\n* The flashlight turned bright surfaces (lit signs, lamps) blue or green.\n* A grenade stuck in a wall replayed its hit sound forever.\n* \"No clipping\" was spaced so tightly it read as \"No dipping\".\n* Running out of memory when entering some maps.\n\n## What works\n\n| Area | Status |\n|---|---|\n| The whole campaign | All 103 maps, Black Mesa Inbound → the G-Man ending, plus the Hazard Course, played through in order with the PC's level changes. New game (Easy \u002F Medium \u002F Hard or the Training Room), Continue, Load game (autosaves and manual saves) |\n| Saving | Battery-backed SRAM, like a cartridge save, and the Controller Pak when one is in controller 1: autosaves at the maps' trigger_autosave points (where the PC autosaves), plus manual saves from the pause menu (Save game). A save holds the player, the level's doors, lifts, triggers and characters, global states (Blast Pit's fuel, oxygen and power) and Xen's gravity. Maps remember what was done in them when you backtrack. Dying reloads the last save |\n| World rendering | BSP + PVS culling, frustum culling, original textures, baked lighting, light styles (switchable and flickering lights), skyboxes, see-through grates (alpha-tested) and glass\u002Fwater (translucent, drawn after the effects so beams and glows behind them show through correctly) |\n| Characters | Scientists, Barney, the G-Man and every monster are placed with their original models, skins, heads and animations (studio models converted by `tools\u002Fmdl2n64.py`, skinned on the RSP). They are solid, lit by the floor beneath them, and follow the player through level transitions |\n| Navigation | Characters walk on the map's own node graph (`info_node`), like `dlls\u002Fnodes.cpp`: `tools\u002Fnavgen.c` links the nodes offline with the same 18-unit step test the PC does at load time, and the N64 finds routes with A*. Movement is collision-checked against the world, doors, other characters and the player, with step-up, gravity and riding lifts |\n| Scripted sequences | `dlls\u002Fscripted.cpp`: a scene waits (retrying every second) until its character is free, the character walks or runs to its mark along the node graph, turns, plays its animation and fires its events; the scene's target fires when the animation ends |\n| Talking characters | `talkmonster.cpp`: +use makes a scientist or Barney follow you (or wait), pre-disaster staff decline, greetings, idle chatter, questions and answers between characters, remarks about your health, scientists heal you, getting shot makes them angry |\n| Speech and music | All of `sentences.txt` (the engine's VOX system: word lists, per-word pitch\u002Fvolume\u002Fstart\u002Fend, groups), scripted_sentence, speaker announcements, ambient_generic, env_message sounds, the HEV suit voice, and the CD-audio music (trigger_cdaudio \u002F target_cdaudio) from the game's MP3s. 3D panning and distance falloff follow the engine's `S_Spatialize`. Audio is compressed with libdragon's ULC codec |\n| HEV suit | Picking up the suit starts the HEV logon (with its music in Anomalous Materials), turns on the HUD, and unlocks the map logic that waits for it. Health, armour, batteries, medkits, wall health and HEV chargers, fall damage, drowning, trigger_hurt, the suit's damage reports, death and restart |\n| Weapons | All 14 weapons with their first-person models and animations, ammo, reloads and alternate fire: crowbar, glock, .357, MP5 + grenades, shotgun, crossbow, RPG (laser-guided), gauss (charged shot), egon, hivehand, hand grenades, satchels, trip mines, snarks. Placed where the maps put them, in crates (`func_breakable` spawn objects) and dropped by soldiers. Autoaim as in single player. HUD ammo counters, weapon selection, crosshairs, damage indicators |\n| Combat | Monsters see, hear and chase you along the node graph, and use their own attack animations: zombie claws, headcrab leaps, houndeye blasts, vortigaunt zaps, soldiers' MP5s, shotguns and grenades (they take cover when hurt), alien grunt hornets, bullsquid spit, gargantua flames, turrets, barnacles, tentacles. Monstermakers bring in reinforcements. Barney fights alongside you, scientists flee. Damage, pain, deaths. Bodies (killed monsters and the maps' placed corpses) take hits like on PC: bullets draw blood, the crowbar and explosions gib them (`DeadTakeDamage`). Values come from the game's `skill.cfg` (difficulty from the New Game dialog) |\n| Bosses | Nihilanth (arenas, teleport balls, crystal recharging, opening head), Gonarch (node path with per-node health, mortar, baby headcrabs), Apache (path, strafing, rockets), Osprey (drops soldiers) |\n| Effects | The PC's own sprites: explosions, muzzle flashes (at the weapon model's muzzle), gluon gun beams (xbeam1\u002Fxspark1), lightning and laser beams, sparks, blood, gibs, bullsquid\u002FGonarch spit, alien-controller balls, Nihilanth zaps and teleport balls, and every env_sprite\u002Fenv_glow in the maps (portals, including the G-Man's at the end, light glows, Xen flares) animated at their framerate. Glows follow GoldSrc's `R_GlowBlend`: hidden by walls in front, constant size on screen, fading with distance. Everything else is depth-tested against the world, so walls and grates hide it |\n| Brush entities | Doors (sliding and rotating), buttons, lifts\u002Fplats, func_train, rotating objects, walls, water, ladders, breakables (shoot or hit them; they drop their items) |\n| Trains | `func_tracktrain` ported from `plats.cpp`\u002F`pathcorner.cpp`: path_track switching (alternate paths, disabled tracks), track-change lifts, dead ends, and **player-driven trains** (On A Rail) with the HUD speed gauge |\n| Map logic | trigger_once\u002Fmultiple\u002Fauto\u002Frelay\u002Fpush\u002Fteleport\u002Fhurt (including the monster-only ones: the vortigaunts that flash into the test chamber during the resonance cascade are sent on as on PC), multi_manager, multisource masters (sources are everything that targets them plus the multi_managers that list them, as in `CMultiSource::Register`; their state is saved), trigger_changetarget, trigger_camera, env_fade, env_message, env_shake, env_explosion, env_spark, game_text, env_render, env_sprite\u002Fenv_glow, env_shooter, env_funnel, env_blood, env_beverage, env_global (global states carried between maps and saves), trigger_gravity (Xen's 0.6 gravity), trigger_autosave, player_loadsaved, func_friction, func_pendulum, func_mortar_field, momentary_rot_button + momentary_door, func_tank family, killtarget, `globalname` carry-over |\n| Text | Half-Life's own font (`gfx.wad` CREDITSFONT) for menus and HUD messages. `titles.txt` is parsed at run time: intro credits, chapter titles, Hazard Course instructions and end credits use their original positions, colours and fade\u002Ftype-on effects (`cl_dll\u002Fmessage.cpp`) |\n| Menus | Animated title screen with music and menu sounds: Continue \u002F New game \u002F Load game \u002F Options; Resume \u002F Save game \u002F Load game \u002F Options \u002F Leave game in the pause menu; New Game, Load and Save (SRAM and Controller Pak), Options (controls, button remapping, audio\u002Fvideo, cheats, credits) and a \"Loading...\" box |\n| Level transitions | trigger_changelevel with landmarks, as on PC, carrying over characters that follow you, `changetarget` events (Office Complex's elevator) and global states. The intro tram plays through c0a0–c0a0e. Your health, suit, weapons and ducking carry over. Options → Cheat Codes can also jump straight to any map, placing you where the level is normally entered (or at the map's own start point when that spot is over a drop or outside the new map) |\n| Player physics | Valve's pm_shared.c, unmodified (including the long jump module) |\n| Performance | About 30–60 fps at 320×240 in ares (cycle-accurate emulator), averaging ~47 fps over an automated tour of the campaign's maps; the busiest scenes dip to the high 20s. PVS + frustum culling of world faces and brush entities, characters drawn as triangle strips, fixed poses (gibs, mines, items, bodies) computed once and shared, view-culled gibs and projectiles, billboards drawn as texture rectangles, monster sight checks that test the nearest targets first and skip those outside the PVS, throttled route searches, idle monsters out of sight think at 4 Hz, and a deeper RSP command queue so the CPU and RSP work in parallel |\n| HUD | HEV HUD and title credit inset for CRT overscan; the crosshair (on once you have the suit) slides onto the enemy the auto-aim locks on to |\n\n## Known issues\n\n* Tested mainly in the ares emulator. Speed on real hardware should be similar but hasn't been\n  measured scene by scene.\n* The heaviest scenes (the tram ride and busy parts of Unforeseen Consequences, Office Complex and\n  \"We've Got Hostiles\", with many characters on screen) run in the high 20s fps.\n* A few of the largest maps use nearly all of the Expansion Pak's memory.\n* A report of the shotgun's view model briefly covering the lower half of the screen while\n  moving hasn't been reproduced yet.\n* The Debug map loader's arrival spot is worked out from the previous map's level change; on a\n  few maps it falls back to the map's own start point, which can be a little off the usual path.\n* With the flashlight on and the view held still, a character walking into the beam can take a\n  few frames to be lit.\n* The Controller Pak and GameCube controller support have been tested in the emulator only.\n* The macOS builders are built by GitHub Actions and haven't been tried on a Mac yet.\n\n## What is not there (yet)\n\n* The monster AI is a compact rewrite of the SDK's schedule system, not a port of it: no squad\n  tactics, and the bosses and flying machines are simplified versions of the PC behaviour.\n* No smoke puffs.\n* Sprites missing from the `sprites` folder you build from are replaced by the nearest one you\n  have (for example the G-Man's `E-Tele1` portal by the Xen `exit1` portal); the asset build\n  prints which. Building from a full Half-Life install uses the exact art.\n\n## Controls (N64 pad)\n\n| Button | Action |\n|---|---|\n| Analog stick | Move and strafe |\n| C buttons | Look (left\u002Fright turn, up\u002Fdown look) |\n| Z | Fire |\n| R | Alternate fire (MP5 grenade, double barrel, gauss charge, RPG laser, satchel detonator...) |\n| A | Jump |\n| L | Duck (hold A while ducking for the long jump) |\n| B | Use: doors, buttons, chargers and valves (hold), scientists and Barney (follow \u002F wait). On a train or a mounted gun: take or leave the controls |\n| D-pad left \u002F right | Previous \u002F next weapon |\n| D-pad down | Reload |\n| D-pad up | Flashlight |\n| Stick up\u002Fdown while driving a train | Faster \u002F slower (four steps each way, as on PC) |\n| Start | Pause menu |\n| Cheats (tick \"Enable cheats\" in Options → Controls → Advanced first): L + D-pad up | Noclip |\n| Cheats: L + D-pad down | Every weapon and full ammo (impulse 101) |\n| Cheats: Options → Cheat Codes | God mode, noclip, give everything, and go to any map |\n\nFour other layouts are in **Options → Controls**: stick looks \u002F C buttons move (Turok style),\nstick moves and turns (GoldenEye 1.1), D-pad moves \u002F stick looks, and D-pad moves \u002F C buttons look\n(the input those leave free takes over weapons, reload and flashlight). Every action can be\nremapped, and look sensitivity and \"Reverse up-down axis\" are there too. A GameCube controller\nworks as well: X reloads, Y uses and the C-stick looks. In menus, use the D-pad or stick, A to choose, B to go back, Z\u002FR to change tabs.\n\n**An Expansion Pak (8 MB) is required.** Large maps decompress to about 3 MB. Saves use the\ncartridge's 32 KB SRAM (set the save type to SRAM 256k on a flashcart or emulator), and a\nController Pak if one is inserted.\n\n### Running it\n\n* **Emulator:** use an accurate, LLE emulator such as [ares](https:\u002F\u002Fares-emu.net\u002F) (tested),\n  gopher64 or simple64. Older HLE emulators (Project64 with default plugins, mupen64plus with\n  HLE plugins) cannot run libdragon ROMs. Enable the Expansion Pak.\n* **Real hardware:** copy `hl64.z64` to a flashcart that supports 64 MB ROMs (SummerCart64,\n  EverDrive-64 X7\u002FV3, 64drive). The ROM uses libdragon's open-source IPL3 boot code, so no CIC\n  setting is needed.\n\n## Building the ROM with the builder (the easy way)\n\nDownload the builder for your computer from this repository's [Releases](..\u002F..\u002Freleases) page:\n**HL64Builder.exe** (Windows), **HL64Builder-linux-x86_64.tar.gz** (Linux) or\n**HL64Builder-macos-arm64.zip** \u002F **HL64Builder-macos-x86_64.zip** (Apple silicon \u002F Intel Macs).\nIt needs Half-Life installed through Steam (or any copy of the game's `valve` folder) and nothing\nelse: the N64 engine (compiled from this repository for that release), libdragon's asset tools and a\nprivate copy of Python are inside it, and no Valve game data is.\n\n1. Run it (Linux: extract the archive and run `HL64Builder`; macOS: unzip and open `HL64Builder.app`).\n   A window opens with the Half-Life folder filled in when Steam has it (every Steam library is\n   checked); otherwise pick it with **Browse...**. Choose where the ROM is saved (next to the builder\n   by default) and, optionally, where the temporary files are kept. The choices are remembered.\n2. Press **Build ROM**. It converts the maps, textures, models, sprites, sounds and music (30–90\n   minutes, most of it compressing the maps), then writes **`hl64.z64`**; \"Show the ROM\" opens its folder.\n3. Build again later and it reuses the converted data, so only the ROM is rebuilt; tick\n   \"Convert everything again\" to redo it.\n\nThe temporary files (the unpacked tools and the converted data, about 300 MB) go to\n`%LOCALAPPDATA%\\HL64Builder` on Windows, `~\u002F.cache\u002FHL64Builder` on Linux and\n`~\u002FLibrary\u002FCaches\u002FHL64Builder` on macOS unless another folder is chosen. The builders aren't\ncode-signed: on Windows choose \"More info\" → \"Run anyway\"; on macOS right-click the app and choose\nOpen (or run `xattr -dr com.apple.quarantine HL64Builder.app`). The ROM contains Half-Life's game\ndata, so keep it for yourself and don't share it.\n\nTo make the builders yourself: `builder\u002Fbuild_windows.sh` (HL64Builder.exe, on Linux with\nmingw-w64) and `builder\u002Fbuild_unix.sh linux-x86_64` \u002F `macos-arm64` \u002F `macos-x86_64` (the Mac ones\non a Mac); see the comments at their tops. Releases are built by GitHub Actions\n(`.github\u002Fworkflows\u002Frelease.yml`): changing `builder\u002FVERSION` on `main` builds all four builders\nand publishes them as release `v\u003CVERSION>`. \"Run workflow\" on the Actions tab builds them too, and\nwith \"publish\" ticked publishes them to (or replaces them in) the release for the current\n`builder\u002FVERSION`. The builder's version includes the commit, so a new builder never reuses files\nan older one unpacked or converted.\n\n## Building from source\n\nYou need Linux or WSL, Python 3 with `numpy` and `Pillow`, and your Half-Life install.\n\n```sh\n# 1. Toolchain + libraries\n#    libdragon \"preview\" branch (toolchain .deb from its GitHub releases), then:\nexport N64_INST=\u002Fopt\u002Flibdragon\ngit clone -b preview https:\u002F\u002Fgithub.com\u002FDragonMinded\u002Flibdragon\n#    bigger RSP command queue: lets the CPU run game logic while the RSP\u002FRDP draws (~+30% fps in big maps)\ngit -C libdragon apply ..\u002Ftools\u002Flibdragon-rspq-buffer.patch\nmake -C libdragon install tools-install\ngit clone https:\u002F\u002Fgithub.com\u002FHailToDodongo\u002Ftiny3d && (cd tiny3d && .\u002Fbuild.sh)\n\n# 2. Convert your game data (maps, node graphs, textures, skies, models, fonts, sounds, music) into filesystem\u002F\npython3 tools\u002Fbuild_assets.py \"\u002Fpath\u002Fto\u002FHalf-Life\u002Fvalve\" filesystem\n#    --models-only \u002F --ui-only rebuild just the characters or the fonts, HUD\u002Feffect sprites and titles\n#    options: --maps c1a0 c1a1 ...   (subset)   --grid 64 --tol 12 (lighting detail vs triangles)\n\n# 3. Build the ROM\nmake T3D_INST=\u002Fpath\u002Fto\u002Ftiny3d\n#    -> hl64.z64\n```\n\nThe asset build takes about 45 minutes, most of it Shrinkler compression of the maps\n(`--compress-level 3`, ~20% smaller than aPLib). That, and libdragon's ULC audio codec for the\n2,500 sounds and 27 music tracks, is what makes everything fit in one 64 MB cartridge image\n(about 63 MB). `--maps-only`, `--models-only`, `--ui-only` and `--sounds-only` rebuild one part.\nBuilding needs a host C compiler (`cc`) for `tools\u002Fnavgen.c`.\n\n## How the conversion works\n\n* **Textures:** Half-Life textures are 8-bit with a 256-colour palette, which matches the N64's\n  CI8 format. They are resampled to power-of-two sizes of at most 2048 texels (the N64's texture\n  memory holds 4 KB including the palette) and re-indexed into the *original* palette.\n  Duplicates across maps are stored once in `textures.pak`.\n* **Lighting:** The N64 has no room for a second lightmap texture, so each face's lightmap is\n  baked into vertex colours. Faces are subdivided on their lightmap grid only as finely as the\n  light actually varies (`--tol`). A T-junction welding pass, like qbsp's `tjunc.c`, removes\n  cracks between faces.\n* **Collision:** The BSP clipnodes for all four GoldSrc hulls are kept bit-for-bit. Hull 0 is\n  generated from the nodes the way the engine does it. `src\u002Fbsp.c` implements the\n  recursive hull trace that `pm_shared.c` expects from the engine, including rotated brush\n  entities.\n* **Visibility:** The original PVS is kept (run-length compressed) and decompressed per leaf.\n* **Entities:** The entity lump is kept verbatim and interpreted on the N64 in `src\u002Fentities.c`,\n  following the SDK sources (`doors.cpp`, `buttons.cpp`, `plats.cpp`, `pathcorner.cpp`,\n  `triggers.cpp`, `effects.cpp`, `scripted.cpp`).\n* **Characters:** `tools\u002Fmdl2n64.py` reads studio models (v10, including `*t.mdl` texture files\n  and `*01.mdl` sequence groups) and keeps the sequences the maps use: idles, walks and runs,\n  every animation named by a scripted_sequence, dead and sitting poses. Vertices are grouped by\n  bone so tiny3d can skin them with one matrix per batch. Textures become CI8.\n* **Effect sprites:** `tools\u002Fspr2n64.py` converts every sprite the maps' env_sprite, env_glow and\n  cycler_sprite entities use (and those the game code uses) into N64 frame strips: single-hue art\n  as 8-bit intensity tinted at draw time, coloured art as RGBA32 tiles. Additive art is drawn as\n  alpha blending with alpha = brightness, because the RDP's additive blend wraps around instead\n  of saturating.\n* **Fonts and UI:** `tools\u002Fui2n64.py` converts `gfx.wad`'s CREDITSFONT into three sizes of\n  I4 glyph atlas, the 320×240 HUD sprites (`sprites\u002F320hud3.spr`: train gauge and title) and the\n  menu logo (`resource\u002Flogo.tga`). Colours and layout come from `resource\u002FTrackerScheme.res`\n  and `GameMenu.res`.\n\n## Source layout\n\n```\nsrc\u002Fmain.c        main loop, input, view, trigger_camera, level changes, saves\nsrc\u002Frender.c      tiny3d renderer: PVS, batching, CI8 textures, skybox, characters\nsrc\u002Fbsp.c         map loader, PVS, hull traces, texture-under-point, light sampling\nsrc\u002Fpmove.c       engine callbacks for Valve's pm_shared.c (incl. monster box hulls)\nsrc\u002Fentities.c    doors, buttons, trains, tanks, triggers, multi_managers, global states, fades ...\nsrc\u002Fstudio.c      studio model loading and skinned drawing\nsrc\u002Ffont.c        Half-Life font drawing\nsrc\u002Fhud.c         titles.txt messages, screen fades, game title, train gauge\nsrc\u002Fmenu.c        title screen, pause menu and dialogs\nsrc\u002Fsound.c       channels, 3D sound, sentences.txt speech, music\nsrc\u002Fnpc.c         monsters, NPCs, items: AI, talking, following, scripted sequences\nsrc\u002Fnav.c         node graph routes (A*)\nsrc\u002Fplayer.c      health, HEV suit, damage, items, health\u002Farmour HUD\nsrc\u002Fweapons.c     weapons, projectiles, view model, ammo HUD, effects and env_sprites\nsrc\u002Fskill.c       skill.cfg\nvalve_sdk\u002F        files from Valve's Half-Life SDK (see valve_sdk\u002FLICENSE)\ntools\u002F            bsp2n64.py, mdl2n64.py, ui2n64.py, spr2n64.py, sky2n64.py, spr.py, navgen.c, build_assets.py\nbuilder\u002F          the ROM builders: Windows (hl64builder.c, packer, build_windows.sh), Linux\u002FmacOS (build_unix.sh + tools\u002Fbuilder_gui.py)\ntest\u002F             PC test harness: runs the same game code on a converted map\n```\n\nThe only change to Valve's files is in `pm_defs.h`: `MAX_PHYSENTS` is wrapped in `#ifndef` so the\nN64 build can use 128 entries instead of 600 (only nearby brush entities are passed in, as the PC server does), to save RAM.\n\n## Legal\n\nThis project contains code from Valve's Half-Life 1 SDK, distributed under Valve's SDK licence\n(`valve_sdk\u002FLICENSE`): non-commercial use only, with the licence included. A ROM built with\n`tools\u002Fbuild_assets.py` contains converted Half-Life game data from *your* copy of the game.\nKeep it for personal use and do not distribute it. Half-Life is a trademark of Valve\nCorporation. This is an unofficial fan project, not affiliated with Valve or Nintendo.\n","2026-10-31 04:26:35","CREATED_QUERY"]