Files
jak-project/custom_assets/jak1/levels/test-zone/test-zone.jsonc

245 lines
11 KiB
JSON

{
// The "in-game" name of the level. Should be lower case, with dashes (GOAL symbol name)
// the name of this file, and the folder this file is in must have the same name.
// The long_name must also be 10 characters or fewer.
"long_name": "test-zone",
// The file name, should be upper case and 8 characters or less.
"iso_name": "TESTZONE",
// The nickname, should be exactly 3 characters
"nickname": "tsz", // 3 char name, all lowercase
// Background mesh file.
// Must have vertex colors. Use the blender cycles renderer, bake, diffuse, uncheck color,
// and bake to vertex colors. For now, only the first vertex color group is used, so make sure you
// only have 1.
"gltf_file": "custom_assets/jak1/levels/test-zone/test-zone2.glb",
// automatically set wall vs. ground based on angle. Useful if you don't want to assign this yourself
"automatic_wall_detection": true,
"automatic_wall_angle": 45.0,
// if your mesh has triangles with incorrect orientation, set this to make all collision mesh triangles double sided
// this makes collision 2x slower and bigger, so only use if really needed
"double_sided_collide": false,
// available res-lump tag types:
// integer types: int32, uint32, enum-int32, enum-uint32
// float types: float, meters (1 meter = 4096.0 units), degrees (65536.0 = 360°)
// vector types: vector (normal floats), vector4m (meters), vector3m (meters with w set to 1.0), vector-vol (normal floats with w in meters), movie-pos (meters with w in degrees)
// special types: symbol, type, string, eco-info, cell-info, buzzer-info, water-height
// by default, lumps will always use the default keyframe value of -1000000000.0 (DEFAULT_RES_TIME).
// most of the actor code will be using that value, but there are some exceptions (camera entities, water volumes, etc.)
// you can specify a different keyframe by suffixing the lump type with e.g. "@0.5", so for a float at keyframe 0.5, the type would be "float@0.5".
//
// examples:
//
// adds a float tag 'spring-height' with value of 200 meters (1 meter = 4096.0 units):
// "spring-height": ["meters", 200.0]
//
// adds a degrees tag 'rotoffset':
// "rotoffset": ["degrees", -45.0]
//
// adds a movie-pos tag:
// "movie-pos": ["movie-pos", [100.22, -25.3, 99.5, 180.0]]
//
// adds an enum tag 'options':
// "options": ["enum-int32", "(fact-options large)"]
//
// adds a water-height tag:
// "water-height": ["water-height", 25.0, 0.5, 2.0, "(water-flags wt08 wt03 wt01)"]
//
// adds an eco-info tag:
// "eco-info": ["eco-info", "(pickup-type health)", 2]
//
// adds a cell-info tag:
// "eco-info": ["cell-info", "(game-task training-gimmie)"]
//
// adds a buzzer-info tag:
// "eco-info": ["buzzer-info", "(game-task training-buzzer)", 5]
//
// adds a 'symbol' tag (using the 'type' and 'string' lump types works the same way):
// "symbol-list": ["symbol", "sym-1", "sym-2"]
// The base actor id for your custom level. If you have multiple levels, this should be unique!
"base_id": 100,
// All art groups you want to use in your custom level. Will add their models and corresponding textures to the FR3 file.
// Note: You will still have to add them to your level's .gd file.
// "art_groups": ["plat-ag"],
// If you have any custom models in the "custom_assets/jak1/models/custom_levels" folder that you want to use in your level, add them to this list.
// Note: Like with art groups, these should also be added to your level's .gd file.
"custom_models": ["test-actor"],
// Any textures you want to include in your custom level. This is mainly useful for things such as the zoomer HUD,
// sky textures and cases where you want to use objects drawn with the generic renderer,
// which also requires you to set a texture remap table and a list of tpages.
// To get a list of all the textures, you can extract all of the game's textures
// by setting "save_texture_pngs" to true in the decompiler config.
// The format is ["tpage-name", "texture-name1", "texture-name2", ...].
// If you want all textures from a tpage, you can just do ["tpage-name"].
"textures": [
// Zoomer HUD textures
// ["zoomerhud"],
// Sandover sky textures
["village1-vis-alpha"]
],
// Which vanilla level's texture remap table to use.
// This is needed if you want to have proper textures for objects that are drawn using generic, such as
// dark eco pools or dying enemies. If you choose to use this,
// the order of art groups and tpages in your level's .gd MUST match the vanilla level's for the textures to work.
"tex_remap": "village1",
// Which sky to use for your custom level. This needs to be the name of a vanilla level with sky textures.
// Your level's mood update needs to be set up to copy the sky texture (update-mood-default already handles this as an example).
// You also need to add a specific tpage to your level .gd depending on the level you chose:
// training: tpage-1308.go
// village1: tpage-401.go
// beach: tpage-215.go
// jungle: tpage-388.go
// misty: tpage-520.go
// firecanyon: tpage-1123.go
// village2: tpage-921.go
// rolling: tpage-925.go
// sunkenb: tpage-162.go
// swamp: tpage-630.go
// ogre: tpage-1117.go
// village3: tpage-1194.go
// snow: tpage-712.go
// finalboss: tpage-1418.go
// The tpage you choose also has to be in the alpha (4th) slot in the "tpages" list below.
"sky": "village1",
// Any texture pages that are added to the level's "texture-ids" array.
// These will be logged in and linked as part of level loading.
// There are five tpage categories, in this order:
// - tfrag
// - pris
// - shrub
// - alpha
// - water
// This is also (with the exception of levels that use the zoomer) the order that the tpages are listed in in the vanilla .gd files.
// You need to also add these to your level .gd as well.
// Sky textures use the alpha slot.
// If this is empty and "tex_remap" and "sky" are the same level, this will be auto-filled with the tpages from the
// corresponding level (check its .gd file for the art group/tpage order to copy over).
"tpages": [],
// Ambients you want to use in your custom level. Ambients can be used for various things like changing the music variation (flava),
// adding ambient sounds, level name hints, etc.
"ambients": [
{
"trans": [-21.6238, 20.0496, 17.1191, 10.0],
"bsphere": [-21.6238, 20.0496, 17.1191, 15.0],
"lump": {
"name": "test-ambient",
"type": "'hint",
"text-id": ["enum-uint32", "(text-id fuel-cell)"], // text id for the "POWER CELL" text
"play-mode": "'notice"
}
}
],
// Camera entities you want to use in your level. These are used to dynamically adjust camera settings/modes when Jak enters a volume.
// There are a couple of different camera modes, depending on what lumps are present:
// - cam-circular: orbits a specified point. requires "pivot" lump.
// - optional lumps: "maxAngle", "focalPull"
// - cam-standoff: requires "align" lump.
// - cam-string: the default camera mode. used when any of these lumps are present to override the default cam mode behavior:
// - "stringMaxLength", "stringMinLength", "stringMaxHeight", "stringMinHeight"
//
// Some generic lumps that can be used for all camera modes:
// - "fov": set the camera fov (default is 64).
// - "interpTime": set the cam blend time when entering the camera entity volume.
// - "tiltAdjust": set the camera roll value.
//
// There's a "flags" lump that takes a cam-slave-options enum value:
// "flags": ["enum-uint32", "(cam-slave-options SAME_SIDE COLLIDE)"]
//
// There's three different volume types (these all have to be defined in keyframe 0, e.g. ["vector-vol@0.0": ...]):
// vol: sets camera entity when Jak is inside.
// pvol: preferred volume when camera entities overlap.
// cutoutvol: disables camera entity when Jak is inside.
//
// "interesting" is an optional vector lump that can be set to be used as a "point of interest" for the camera to focus on.
"cameras": [
{
"trans": [17.26, 9.0, 13.2],
"quat": [0, 1, 0, 0],
"lump": {
"name": "test-cam",
"flags": ["enum-uint32", "(cam-slave-options SAME_SIDE)"],
"pivot": ["vector3m", [15.0761, 2.6482, 25.548]],
"interpTime": ["float", 1.0],
"vol": [
"vector-vol@0",
[-0.09046, 0.025624, 0.99557, 32.528575],
[-0.995854, 0.007292, -0.090673, -8.671137],
[0.09046, -0.025624, -0.99557, -16.528584],
[0.995854, -0.007292, 0.090673, 24.671144],
[-0.009584, -0.999645, 0.024858, 0.695884],
[0.009584, 0.999645, -0.024858, 15.304117]
]
}
}
],
"actors": [
{
"trans": [-21.6238, 20.0496, 17.1191], // translation
"etype": "fuel-cell", // actor type
"game_task": "(game-task none)", // associated game task (for powercells, etc)
"quat": [0, 0, 0, 1], // quaternion
"bsphere": [-21.6238, 19.3496, 17.1191, 10], // bounding sphere
"lump": {
"name": "test-fuel-cell",
"eco-info": ["cell-info", "(game-task none)"]
}
},
{
"trans": [-15.2818, 15.2461, 17.136], // translation
"etype": "crate", // actor type
"game_task": "(game-task none)", // associated game task (for powercells, etc)
"quat": [0, 0, 0, 1], // quaternion
"bsphere": [-15.2818, 15.2461, 17.136, 10], // bounding sphere
"lump": {
"name": "test-crate",
"crate-type": "'steel",
"eco-info": ["eco-info", "(pickup-type money)", 10]
}
},
{
"trans": [-5.463, 17.4553, 1.6169], // translation
"etype": "eco-yellow", // actor type
"game_task": "(game-task none)", // associated game task (for powercells, etc)
"quat": [0, 0, 0, 1], // quaternion
"bsphere": [-5.463, 17.4553, 1.6169, 10], // bounding sphere
"lump": {
"name": "test-eco"
}
},
{
"trans": [-5.41, 3.5, 28.42], // translation
"etype": "test-actor", // actor type
"game_task": 0, // associated game task (for powercells, etc)
"quat": [0, 0, 0, 1], // quaternion
"bsphere": [-7.41, 3.5, 28.42, 10], // bounding sphere
"lump": {
"name": "test-actor"
}
}
// {
// "trans": [-7.41, 3.5, 28.42], // translation
// "etype": "plat", // actor type
// "game_task": "(game-task none)", // associated game task (for powercells, etc)
// "quat": [0, 0, 0, 1], // quaternion
// "bsphere": [-7.41, 3.5, 28.42, 10], // bounding sphere
// "lump": {
// "name": "test-plat"
// }
// }
]
}