Examples
Thematic content is JSON. Each folder holds a minimal example (the least that works) and a full one
(every field, with a "_comment" saying where the file goes). Copy one into your pack, rename it to
your id and change what you need. Keys starting with _ are ignored. The format of each kind is in
../addon-format.md; your pack's AGENTS.md has the short version.
| kind | files | goes to |
|---|---|---|
| suits | suits/suit.minimal.json, suit.full.json | data/thematic/armors/<collection>/<id>.json |
| suit alts | suits/alt.minimal.json, alt.full.json | data/thematic/armors/<collection>/alt/<alt id>.json |
| suit recipes | suits/recipe.suit_bench.json | data/thematic/recipes/<suit id>.json |
| suit tags | armor_tags/armor_tag.minimal.json, armor_tag.full.json (includes, options, a remove) | data/<ns>/armor_tags/<any folders>/<id>.json |
| collections | collections/collection.minimal.json, collection.full.json | data/thematic/collections/<collection>.json |
| abilities | abilities/ability.minimal.json (a new id from a type), ability.params.json (a type with fields), ability.full.json (options and assets), override.json (retune an existing ability), composed.minimal.json / composed.kick_drop.json (a component written as data: a press key's running order and a cooldown), brimstone_parry.js (a component script: a hold key that opens a phase and answers a hit), family.fire_wards.js (one script defining many components in loops, over a tag and the Lantern corps), morph.minimal.json (a morph ability naming its shape), owned_items.js (items a move hands out and takes back: give), suit_swap.js (a transformation: swapSuit behind the kitIdle guard), lightning_call.js (bolts round each target: lightning), tether.minimal.js, tether.full.js (a move that throws a line and rides it: a key plus component.tether, swing / slingshot / hang), break_with_tool.*.js, tunnel_and_face.*.js (breakPattern with the held or a named tool, a line, a heading-oriented plane that advances, the broken count), transform_options.*.js (transformBlock that reverts, still sources only, the event's block on a random neighbour; the dropped_itself guard), fire_shapes.*.js (placeFire footings, a line across the facing, lasts; at: {groundBelow}), drop_blocks.*.js (falling blocks with an on_land answer), world_reach.*.js (looking_at_block, findBlock{all}), summon_options.*.js (summoned attributes, scales, a display summon, an explosion at: "summoned"), bolt_options.*.js (a bolt's pierce{unless} and return), pattern_shapes.*.js (lanes by hand, a spiral), vfx_duration.minimal.js, loadout.minimal.js, loadout.full.js (a belt: the loadout part, loadoutCycle, loadoutUse), targeted_dash.*.js (a charge at a marked body, spin), lunge_and_swim.*.js (lunge, swim_boost), teleport_placements.*.js (impact, behind_target, nudge, clear_spot, block_top), tunnel.*.js (walking through blocks over a floor), windup_stages.*.js (a fast flight's wind-up stages), body_verbs.*.js (push{on_collide}, look_at{spot}, extinguish, set_active{clear_capture}), burn_cap.*.js (ignite{maxSeconds} cutting burns short), charged_breath.js (parts composing: a heat-gauge breath with charges on top), damage_taken_when.*.js (a phase's damageTaken with when), enchant_bonus_attack.*.js (enchantBonus on the held weapon while attacking), game_inputs.*.js (number inputs only the game knows: attack, level, look_pitch...), reaching_box.*.js (targets with box: { across, below, above }), self_damage.*.js (damage({ who: "self" })), worked_out_sizes.*.js (worked-out arc, radius, box and every seconds) | data/thematic/abilities/<any folders>/<id>.json or <id>.js |
| guards | guards/<guard>.minimal.js, <guard>.full.js for attacker_held_trait, carries, enemies_within, facing_assist, from_spot, hand_stack, keeps, number, run_speed_at_least, running_kind, sees, switch_on, weak_to (each a small ability gated or aimed by that guard) | data/<ns>/abilities/<any folders>/<id>.js |
| traits | traits/<trait>.minimal.js, <trait>.full.js for affinity (a weakness or resistance), attributes (attribute modifiers while the suit has the move), cooldown_while (a cooldown that counts down only while a guard holds), damage_taken (a standing damage multiplier), suit_removed (the event that takes a passive's gifts off with the suit) | data/<ns>/abilities/<any folders>/<id>.js |
| items | items/<type>.minimal.json, <type>.full.json (weapon, melee, shield, bow, thrown_weapon, tether_launcher, lantern_ring, status_wearable, spyglass, fluid_container, wallet, spawn_egg, ingredient, food, currency, loot_box), bespoke.thor_hammer.json (an old type id, now an alias of a generic type), deflecting_bat.minimal.json (on_incoming_projectile with cancel_event), deployed_gadget.*.json (tuning_from, on_inventory_tick, notify), thrown_fan.*.json (throw_held count, spread and clips; item_clip{stop}), status_wearable_break.*.json (on_break) | data/thematic/items/<id>.json |
| arrows | arrows/arrow.minimal.json, arrow.full.json | data/<ns>/arrows/<id>.json |
| throwables | throwables/throwable.minimal.json, throwable.full.json, gadget.minimal.json, thrown_body.minimal.json, thrown_body.full.json (chain, stick, orbit, item_source, pierce, spin and clips), thrown_weapon.minimal.json, thrown_weapon.full.json (a weapon that comes home: return, per-axis bounce, on_land, on_refused_hit, recall, catch), flight.full.json (every flight component and its look spelled out), hug_ground.minimal.json, hug_ground.full.json (a saw that rolls through the ground), thrown_item_strike.minimal.json, thrown_item_strike.full.json (a thrown weapon that strikes with the item it carries) | data/thematic/throwables/<id>.json |
| guns | guns/gun.minimal.json, gun.full.json (the JSON form; for the .js form see the pack template's data/thematic/guns/) | data/<ns>/guns/<id>.js or .json |
| criminals | criminals/criminal.minimal.json, criminal.full.js (a crew file: one id per role, over the heroes pack's thematic:criminal_<role> presets) | data/<ns>/criminals/<id>.json or <crew>.js |
| suit animation controllers | anim_controllers/suit_controllers.minimal.json, suit_controllers.full.js | data/<ns>/anim_controllers/<id>.json or .js |
| gun effects | guns/gun_effect.minimal.json, gun_effect.full.json | data/<ns>/gun_effects/<name>.js or .json |
| blocks | blocks/block.minimal.json, block.full.json, stairs.minimal.json, door.full.json, furniture.minimal.json, furniture.full.json (a shape written once facing north, turned for each facing; seat to sit on it), behavior.minimal.json, behavior.full.json (a block with hooks and behaviour options), lift_column.minimal.json, lift_column.full.json, brushable.minimal.json, brushable.full.json, container.minimal.json, container.full.json, player_inventory.minimal.json, player_inventory.full.json, processor.minimal.json, processor.full.json (storage, a player-inventory bench and a fuelled or plain machine), geo.minimal.json, geo.full.json, visual.minimal.json, visual.full.json (a block drawn with its GeckoLib model, and block-entity visuals: item display, light beam, text readout), repairable_machine.full.json (a behaviour block that wears out and is repaired stage by stage), use_transform.minimal.json (on_use's transform: the block turns into another and drops an item) | data/<ns>/blocks/<id>.json or .js |
| entities | entities/seat.minimal.json (the thematic:seat body), zone.minimal.json, zone.full.json (a lingering area, pulse, wall cell or decal), thrown.minimal.json, thrown.full.js (an id bound to its throwable), tether.minimal.json, tether.full.json (the thematic:tether body: a grapple or lasso line held between its owner and what it caught), vehicle.minimal.json, vehicle.full.json (the thematic:vehicle body: a car, plane or tank with controls), owner_copy.minimal.json, owner_copy.full.json (the thematic:owner_copy body: an after-image; a live decoy double), mob.minimal.json, mob.full.json (the thematic:mob body: a humanoid with behaviour ids, a suit, phases, a boss bar, a merchant; looks, clips, damage_taken, stances, sounds), owned_summon.minimal.json, owned_summon.full.json (the thematic:owned_summon body: a drone; a strike fighter with missiles), arc.minimal.json, arc.full.json (a harmless crackle of lightning along the ground), bolt.minimal.json, bolt.full.json (an entity type of its own for thematic:bolts), mushroom_cloud.minimal.json, mushroom_cloud.full.json (a great blast's rising cloud), perch.minimal.json, perch.full.json (a shoulder crossbow that shoots its owner's quarry), strike.minimal.json, strike.full.json (a lightning strike that flashes and hits) | data/<ns>/entities/<id>.json |
| machine recipes | recipes/machine_recipe.minimal.json, machine_recipe.full.json (alloy smelter, centrifuge, plate press) | data/<ns>/recipes/<id>.json |
| pocket dimensions | pocket_dimensions/pocket_dimension.minimal.json, pocket_dimension.full.json | data/<ns>/pocket_dimensions/<id>.json |
| corps | corps/corps.minimal.json, corps.full.json (the Green Lantern Corps as the heroes pack ships it) | data/<ns>/corps/<id>.json |
| status effects | status_effects/status_effect.minimal.json, status_effect.full.json, wound.minimal.json, wound.full.json (behaviour fields: tick damage, a particle ping, a melee lock, heal on hit, a tint, an on_expire hook), flash.minimal.json (a screen overlay) | data/<ns>/status_effects/<id>.json |
| damage elements | damage_elements/element.minimal.json, element.full.json | data/<ns>/damage_elements/<id>.json |
| vfx presets | vfx/preset.minimal.json, preset.full.json, particle_system.full.json | data/<ns>/vfx/<id>.json |
| squads | entities/squad.minimal.json, squad.full.json (a summoned flier in its owner's formation: patterns, engage, kit, expend) | data/<ns>/entities/<id>.json |
| formations | formations/swarm_arc.js (a plan(ctx) that says where each squad unit stands) | data/<ns>/formations/<id>.js |
| consoles | abilities/console.minimal.js (an order button, a pick-a-target strike with quick cast, unit cards with rebuild bars) | data/<ns>/abilities/<any folders>/<id>.js |
| unit programs | programs/program.minimal.js (a guard program with an // @input) | data/<ns>/programs/<name>.js; guide ../programs.md |
| fear and grounding | status_effects/fog_grounding.full.json (fog, lift_cut, resisted_by, level_decay), dread_weight.minimal.json, dread_ward.minimal.json (markers), thorns_sleeper.full.json (on_hurt, pose), with the passives abilities/dread_aura.full.js (presence aura) and dread_ward.full.js (resistance) | data/<ns>/status_effects/<id>.json, data/<ns>/abilities/<id>.js |
| owner copies | entities/owner_copy.minimal.json, owner_copy.full.json (a live decoy), owner_copy.after_image.full.json, owner_copy.decoy.full.json (an ai decoy that fights) | data/<ns>/entities/<id>.json |
| flight profiles | flight_profiles/jetpack_heavy.full.json (a heavy jetpack flyer: turnRate, stepped lean, arm poses, speedLineRate) | data/<ns>/flight_profiles/<id>.json |
What is new in 1.7.0, with a pointer to the example for each feature, is in ../addon-format.md.
Art goes next to the data under the same id: a suit's assets/thematic/geo/armor/<id>.geo.json (optional),
assets/thematic/textures/armor/<id>.png and assets/thematic/models/item/<id>.json
({"parent": "thematic:item/thematic_armor"}), plus names in assets/thematic/lang/en_us.json.
The ids in these examples (night_warden, ruby_gaze, my_heroes ...) are placeholders: rename them.
Ability ids a suit example names (punch, heat_vision ...) are Thematic's own. ./gradlew validateContent
checks every file here in the source repo.