From f61c0939420b9072e541b9b7d4b6fc6ca1795db1 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Mon, 17 Oct 2022 12:41:14 -0700 Subject: [PATCH] Update Documentation/Materials/MatGoldSrc.md, add some example images while we're at it... --- Documentation/Building.md | 39 +++--- Documentation/Contributing.md | 4 +- Documentation/Launching.md | 2 +- Documentation/Materials/MatGoldSrc.md | 153 +++++++++++++-------- Documentation/Materials/hl_impact.jpg | Bin 0 -> 7264 bytes Documentation/Materials/source_metal.jpg | Bin 0 -> 7052 bytes Documentation/Materials/source_plaster.jpg | Bin 0 -> 6838 bytes Documentation/Materials/source_wood.jpg | Bin 0 -> 11503 bytes Documentation/Models/VVM.md | 3 +- Documentation/Models/VVM_Tutorial.md | 5 +- Documentation/Surf_data.md | 4 +- 11 files changed, 130 insertions(+), 80 deletions(-) create mode 100644 Documentation/Materials/hl_impact.jpg create mode 100644 Documentation/Materials/source_metal.jpg create mode 100644 Documentation/Materials/source_plaster.jpg create mode 100644 Documentation/Materials/source_wood.jpg diff --git a/Documentation/Building.md b/Documentation/Building.md index 92020f64..8aa7b430 100644 --- a/Documentation/Building.md +++ b/Documentation/Building.md @@ -1,21 +1,23 @@ # Building ## Building the Engine {#engine} + The **build_engine.sh** will do that for you. It will still ask you to have at least a certain amount of dependencies installed (such as the **GCC**, **GNU make** and the **X11/SDL** headers for your platform. ### Dependencies -* subversion -* gmake -* gcc -* mesa-libGL-devel -* libgnutls-devel -* libopenal-devel -* libX11-devel -* libXcursor-devel -* libXrandr-devel -* libSDL2-devel (only if you pass BUILD_SDL2=1 in build.cfg) + +- subversion +- gmake +- gcc +- mesa-libGL-devel +- libgnutls-devel +- libopenal-devel +- libX11-devel +- libXcursor-devel +- libXrandr-devel +- libSDL2-devel (only if you pass BUILD_SDL2=1 in build.cfg) ### Optional: Building release binaries @@ -38,17 +40,20 @@ The resulting binary can be found inside the `src/engine/engine/release` directo **Note**: The **SDL2** target will require you to set the **ARCH** environment to the target of your choosing. ## Building the Level Editor {#editor} + Handled by **build_editor.sh**. ### Dependencies -* gcc-c++ -* gtk2-devel -* gtkglext-devel -* libxml2-devel -* libjpeg8-devel -* minizip-devel + +- gcc-c++ +- gtk2-devel +- gtkglext-devel +- libxml2-devel +- libjpeg8-devel +- minizip-devel ## Building Game-Logic {#game} + You can build the game source tree with **build_game.sh**. The script also takes a parameter. If you specify: @@ -65,6 +70,7 @@ Some distributions may carry the **fteqcc** compiler, but it usually is a very a that's probably not going to build any of this. ## Custom Configuration {#config} + There's a **build.cfg** file with which you can tweak build parameters of the various **build_** scripts. For example, this is where you select between X11 and SDL2 builds. There you can specify which engine revision you want to build and also which plugins you want to build along with it. @@ -72,6 +78,7 @@ It's well commented, so I encourage you to check it out. However on some platfor might introduce additional setup/dependency steps. ## Additional Information {#notes} + The game-logic is written in QuakeC, it is thus platform and architecture independent. You do not need to rebuild the logic for each and every platform. diff --git a/Documentation/Contributing.md b/Documentation/Contributing.md index e062c1b7..0d92145a 100644 --- a/Documentation/Contributing.md +++ b/Documentation/Contributing.md @@ -8,13 +8,13 @@ There's just 2 very short requirements. The code must be yours. It's simple: -* Do not take code that is by anyone else that is not you. +- Do not take code that is by anyone else that is not you. ## Rule #2 No submission or decompilation of third-party code. This is important if you want to recreate behaviour from another game. -* We do not decompile - we reverse-engineer by trial and error. +- We do not decompile - we reverse-engineer by trial and error. This is generally referred to as 'clean-room engineering'. Most of the behaviour is rather predictable, other is not. diff --git a/Documentation/Launching.md b/Documentation/Launching.md index 9682c791..b75b7c08 100644 --- a/Documentation/Launching.md +++ b/Documentation/Launching.md @@ -23,7 +23,7 @@ $ ./nuclide -game first_mod -game second_mod -game third_mod And it'll load those directories in order, on top of `base/`. -However, we advise you only do this for development. If you want proper multiplayer compatibility (slightly different filesystem mount setups can confuse client <> server negotation) please use the built-in **Custom game** menu to ensure maximum compatibility to other clients. +However, we advise you only do this for development. If you want proper multiplayer compatibility (slightly different filesystem mount setups can confuse client-server negotation) please use the built-in **Custom game** menu to ensure maximum compatibility to other clients. ## For release... diff --git a/Documentation/Materials/MatGoldSrc.md b/Documentation/Materials/MatGoldSrc.md index dda53ad3..ad77d57a 100644 --- a/Documentation/Materials/MatGoldSrc.md +++ b/Documentation/Materials/MatGoldSrc.md @@ -1,69 +1,73 @@ -# Materials: GoldSrc -Material definitions handle what footsteps and what impact effects are played against each texture in the game-world. -So when you walk on dirt, you can hear the difference; or when you shoot wood with a gun it will have splinters spawn instead of black bits and smoke. +# "Materials" in GoldSrc +In the GoldSrc games "Material" definitions handle what footsteps and what impact sounds are played against each texture in the game-world. -*Note:* While Nuclide supports this for legacy BSP files, you are encouraged to define the material of a texture via the [surfaceparm](MatCommands.md) command in a **Material** instead. +![Generic bullet impact effect in Half-Life](hl_impact.jpg) + +So when you walk on dirt, you can hear the difference; or when you shoot wood with a gun it will sound like wood. + +*Note:* While Nuclide supports this for legacy BSP files, please define the surface properties inside your [material](Documentation/Materials/MatOverview.md) using the **surfaceprop** command. ## Details Usually, a game in the GoldSrc engine would provide a `sound/materials.txt` file, where each line defines the properties for a single (or a series of) textures. For example: -``` -C CONCRETEWALL -``` +`C CONCRETEWALL` -Will make any surface **concrete** that starts with the name `CONCRETEWALL`. In vanilla Half-Life, the second argument (name) can only be 12 characters long. +Will make any surface the type **concrete** that starts with the name `CONCRETEWALL`. In vanilla Half-Life, the second argument (name) can only be 12 characters long. It will also only compare the length of characters of the name above. So for example if you were to define: -``` -C CONC -``` +`C CONC` Then `CONCRETEWALL` would still be marked as concrete, and any other texture that starts with `CONC[...]`. -## Community Changes and Additions +When you then walk around your level, the footstep will be aware of you being on a texture marked with the **concrete** attribute and play a different step sound. In theory. -In stock GoldSrc, the **materials.txt** can be overwritten by a modification, and users could customize the file on the client-side only for themselves. This means there was no map specific materials, and mods could not inherit Half-Life's materials, so mods would always have to manage a nearly duplicate file if they desired custom texture sounds. +There's many other types available in games such as Half-Life, a few of them conflict two so porting levels can sometimes be a bit more work than it first appears to be at first glance. + +## Later Enhancements + +### Community additions + +In stock GoldSrc games, the **materials.txt** can be overwritten by a modification, and users could customize the file on the client-side only for themselves. This means there was no map specific materials, and mods could not inherit Half-Life's materials, so mods would always have to manage a nearly duplicate file if they desired custom texture sounds. A few mods tried to remedy this problem, the following below is methods documented so far: -* maps/MAPNAME.mat -> Introduced in The Wastes (2003) +maps/MAPNAME.mat +: Introduced in The Wastes (2003) -* maps/MAPNAME_materials.txt -> Convention by Andrew Lucas, creator of Trinity SDK, modeled after -> MAPNAME_details.txt +maps/MAPNAME_materials.txt +: Convention by Andrew Lucas, creator of Trinity SDK, modeled after MAPNAME_details.txt -* materials_file `PATH/FILE.txt` via the `worldspawn` entity -> Introduced in Sven Co-op 5.0 +worldspawn entity key named 'materials_file' with the value `PATH_TO/FILE.txt` +: Introduced in Sven Co-op 5.0 -All these methods are supported by Nuclide, as one goal is to implement +**All these methods are supported by Nuclide**, as one goal is to implement conventions by not only Valve but the community as well. -In addition Nuclide has also implemented a way of giving modifications -their own inheritable materials file: +### Nuclide additions -``` -sounds/materials_UNIQUENAME.txt -``` +In addition Nuclide has also implemented a way of giving modifications +their own *inheritable* materials file: + +`sounds/materials_UNIQUENAME.txt` The idea here is that any mod or even map pack can include ONLY the textures used, and no longer will anyone have to manage a near-clone of materials.txt For repackaging or modding purposes, if you desire to give your map custom -sound definitions, we recommend **The Wastes** its method for individual maps, while -the Nuclide method should be used for Mods or Map Packs. We find these to be -the most clean and efficient way. +material property definitions, we recommend **The Wastes** its method for individual maps, +while the Nuclide method should be used for Mods or Map Packs. We find these to be +the most clean and efficient way! **NOTE**: We recommend only using materials text files for GoldSrc related modding purposes. It is inefficient for modern projects as there are much better -standards already supported in Nuclide. Keep in mind, it takes memory to load -big text files, and lots of text files adds up over play sessions. +standards already supported in Nuclide. You'll save a bit of memory that way too. # Material List + In Nuclide, this is the currently supported list of material IDs: | Material ID | Material Name | @@ -85,15 +89,22 @@ In Nuclide, this is the currently supported list of material IDs: | W | Wood | | Y | Glass | - ## Game differences + +Different games/mods can ship with different material properties. +To make your life easier, you can edit **scripts/surfaceproperties.txt** and define +which Material ID character maps to which [surfaceproperty](Documentation/Surf_data.md) entry. +This way you can add new materials to existing legacy maps without writing a line of code. + Listed below are definitions for various games and mods. Only the changes and additions are listed since the rest are identical. -The * indicates these definitions are not implemented in Nuclide +The "*" indicates these definitions are not implemented in Nuclide + +## GoldSrc Games/Mods -## GoldSrc ### Arrangement -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | B | Blue Texture | | N | Snow | @@ -103,14 +114,17 @@ The * indicates these definitions are not implemented in Nuclide | Z | Black Texture | ### Counter-Strike -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | N | Snow | | X | Grass | + *Afraid of Monsters: DC, Natural Selection, and Snow War uses the same definitions.* ### Cry of Fear -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | B | Random Twig Snap | | H | Paper | @@ -123,7 +137,8 @@ The * indicates these definitions are not implemented in Nuclide | Z | Carpet | ### Gunman Chronicles -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | G | Wood | | T | Rock | @@ -131,19 +146,22 @@ The * indicates these definitions are not implemented in Nuclide | W | Unknown/Unused? | ### Firearms -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|-----------------------------------------| | B | Sandbag | | N | Snow | | U | No impact or decals, just smoke effects | ### Heart of Evil -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | U | Mud | ### Hostile Intent -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | A | Sand | | E | Foliage | @@ -153,53 +171,71 @@ The * indicates these definitions are not implemented in Nuclide | Z | Grass | ### Household DEATH! -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | H | Wood (Creaky) | | I | Grass | ### Night at the Office -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | T | Carpet | ### Opposing Force -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | O | Snow | + *Science and Industry uses the same definitions as Opposing Force.* ### Poke646 -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | M | Metal/Grate | | T | Wood/Tile | | G | Carpet/Grass | ### Wasteland Half-Life -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | B | Barrel | | I | Sand | | N | Tinroof | | R | Rust | | U | Drywall | + *The Wastes uses the same definitions.* -## Source -While Source has materials describing a surface with its **$surfaceprop** command, the GoldSrc way of describing materials with a 1-character symbol is still used to define which impact effect to use. +## Source Engine Games/Mods -So be aware that a Source engine game may actually have more surface materials than this, these are solely the IDs associated with impact effects. +While Source has materials describing a surface with its own **$surfaceprop** command, the GoldSrc way of describing materials with a 1-character symbol is still used to define which **impact effect** to use. + +The **Material ID** is used via the `gamematerial` command inside **scripts/surfaceproperties.txt** entries. In Nuclide that's used for compatibility with the GoldSrc system instead. + +![Bullet impact on Plaster](source_plaster.jpg) +![Bullet impact on Wood](source_wood.jpg) +![Bullet impact on Metal](source_metal.jpg) + +Be aware that a Source engine game may actually have more surface materials than this, these are *solely the IDs associated with impact effects*. + +In Nuclide, ### Alien Swarm -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | 11 | Steam Pipe | Alien Swarm: Reactive Drop uses the same definitions. ### Counter-Strike: Global Offensive -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------------| | 11 | Mud | | 12 | Sand Barrel | @@ -207,7 +243,8 @@ Alien Swarm: Reactive Drop uses the same definitions. | 14 | Metal Shield | ### Half-Life 2 -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | A | Antlion | | B | Flesh (Bloody) | @@ -221,20 +258,23 @@ Alien Swarm: Reactive Drop uses the same definitions. | - | No Decal | ### Half-Life 2: Episode 2 -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | E | Antlion Egg Sacks | | Z | Adviser Shield | ### Insurgency -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | A | Fruit | *Day of Infamy uses the same definitions.* ### Left 4 Dead -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | J | Grass | | K | Mud | @@ -253,6 +293,7 @@ Alien Swarm: Reactive Drop uses the same definitions. | 10 | Puddle | ### Portal 2 -| **Material ID** | **Material Name** | + +| Material ID | Material Name | |-------------------|---------------------| | R | Reflective | diff --git a/Documentation/Materials/hl_impact.jpg b/Documentation/Materials/hl_impact.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dcf6f9f2063deaedff85ab5a17180a4617faab9 GIT binary patch literal 7264 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 literal 0 HcmV?d00001 diff --git a/Documentation/Materials/source_wood.jpg b/Documentation/Materials/source_wood.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17d41f69e09c7ae5ebd9f9d3ce00d6a661c92c2f GIT binary patch literal 11503 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 vvmtool on -GitHub](https://github.com/VeraVisions/vvmtool) \ No newline at end of file +[vvmtool on GitHub](https://github.com/VeraVisions/vvmtool) \ No newline at end of file diff --git a/Documentation/Models/VVM_Tutorial.md b/Documentation/Models/VVM_Tutorial.md index 2dcc7580..05b7687e 100644 --- a/Documentation/Models/VVM_Tutorial.md +++ b/Documentation/Models/VVM_Tutorial.md @@ -32,6 +32,7 @@ internal, modeling program specific exporter for VVM. Here's an EXCERPT of a control file from **The Wastes*: +``` output tommygun.vvm materialprefix models/weapons/tommygun/ @@ -75,7 +76,7 @@ Here's an EXCERPT of a control file from **The Wastes*: event 0 1005 "33 1" scene seq/shoot.smd fps 30.0 scene seq/shoot_last.smd fps 30.0 - ... +``` That's a really complicated control file, but it highlights a few things: @@ -92,10 +93,12 @@ things: However, a model control file doesn't need to be this complicated: +``` output terminal01.vvm materialprefix models/props/computers/ rotate 0 -90 0 scene ref/terminal01.smd +``` This is `models/props/computers/terminal01.qc` from The Wastes. diff --git a/Documentation/Surf_data.md b/Documentation/Surf_data.md index 25188323..0eec9060 100644 --- a/Documentation/Surf_data.md +++ b/Documentation/Surf_data.md @@ -1,7 +1,7 @@ # Surface Properties -**Surfaces** are being abstracted into one API with the help of **Surf -Data** helper functions and large parts of NSSurfacePropEntity. +**Surfaces** are being abstracted into one API with the help of **SurfData** +helper functions and large parts of NSSurfacePropEntity. # Preface {#preface}