Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

game_data.gno

18.98 Kb · 313 lines
  1// GnoMoji — Main Game Realm
  2// gno.land/r/g138gdmwj6heduu3st796lw6qqdwylgaxf7ty5gz/game27
  3//
  4// On-chain game engine for GnoMoji on Gno.land (v1.5.0 / Onyx testnet API).
  5
  6package game27
  7
  8import (
  9	"gno.land/p/nt/avl/v0"
 10)
 11
 12// ── State ────────────────────────────────────────────────────────────────────
 13
 14var (
 15	admin          address
 16	minterAddr     address  // authorized minter realm (minter5) — set via SetMinter
 17	pendingMints   avl.Tree // addr+":"+coinId → amount string
 18	balances       avl.Tree // addr+":"+coinId → amount string
 19	veinSupply     avl.Tree // coinId → "remaining:max"
 20	casinoRounds   avl.Tree // roundId → JSON string
 21	pvpLobbies     avl.Tree // lobbyId → JSON string
 22	pvpWagers      avl.Tree // lobbyId → "coinId:amount:creator:challenger" (challenger="" until joined)
 23	ownedTools     avl.Tree // addr → comma-separated tool IDs
 24	toolLife       avl.Tree // addr+":"+toolId → remaining life string
 25	lifetimeMined  avl.Tree // addr+":"+coinId → total mined string
 26	achievements   avl.Tree // addr+":"+achId → "1"
 27	dailyCheckins  avl.Tree // addr → unix seconds string
 28	skillRanks     avl.Tree // addr+":"+skillId → rank string
 29	miners         avl.Tree // addr → total mined all-time string
 30	lastClaim      avl.Tree // addr → unix timestamp of last ClaimMine/ClaimAndMint (velocity limit)
 31	blacklist      avl.Tree // addr → "reason:timestamp"
 32	banExpiries    avl.Tree // addr → unix expiry (0 = permanent)
 33	guilds         avl.Tree // guildId → JSON{name, leader, memberCount, createdAt}
 34	guildMembers   avl.Tree // guildId+":"+addr → "1"
 35	playerGuild    avl.Tree // addr → guildId
 36	gnomePasses    avl.Tree // addr → unix expiry timestamp string (0 = never set, >0 = active until)
 37	paused         bool
 38)
 39
 40// ── Cost Tables ───────────────────────────────────────────────────────────────
 41
 42// toolCosts maps toolId → slice of [coinId, amount] pairs.
 43// Copied from catalog.ts TOOLS array. Amounts are for qty=1.
 44// Phase 5: expanded tool costs — each tool requires more ingredient types at higher tiers.
 45// Matches catalog.ts TOOLS array exactly.
 46var toolCosts = map[string][][2]string{
 47	"twig": {
 48		{"grin", "120"}, {"joy", "75"}, {"cool", "60"},
 49	},
 50	"wood": {
 51		{"seedling", "180"}, {"leaves", "150"}, {"fallen", "120"}, {"think", "105"}, {"sleep", "90"}, {"party", "75"},
 52	},
 53	"stone": {
 54		{"rock", "600"}, {"log", "540"}, {"evergreen", "480"}, {"brick", "420"}, {"mushroom", "360"}, {"heart", "300"},
 55		{"deciduous", "240"}, {"cactus", "180"},
 56	},
 57	"iron": {
 58		{"gear", "840"}, {"chains", "780"}, {"wrench", "720"}, {"hammer", "660"}, {"anchor", "630"}, {"pick", "570"},
 59		{"nut", "400"}, {"saw", "200"}, {"hammer-wrench", "300"}, {"axe", "60"},
 60	},
 61	"gold": {
 62		{"gold-medal", "1140"}, {"crown", "1080"}, {"trophy", "1020"}, {"money-bag", "960"}, {"bolt", "930"}, {"sword", "870"},
 63		{"old-key", "80"}, {"scale", "60"}, {"bullseye", "200"}, {"mahjong", "50"}, {"slots", "20"}, {"joker", "15"},
 64	},
 65	"diamond": {
 66		{"gem", "1560"}, {"coin", "1440"}, {"ring", "1380"}, {"disco", "1320"}, {"kite", "1260"}, {"dodo", "1140"},
 67		{"scope", "25"}, {"telescope", "40"}, {"tube", "60"}, {"dish", "50"},
 68		{"lock", "300"}, {"key-lock", "200"},
 69		{"eight", "150"}, {"puzzle", "200"},
 70	},
 71	"cosmic": {
 72		{"galaxy", "1950"}, {"moai", "1860"}, {"hamsa", "1800"}, {"mirror", "1740"}, {"atom", "1650"}, {"ufo", "1500"},
 73		{"shooting", "15"}, {"rex", "20"}, {"mammoth", "25"}, {"new-face", "20"},
 74		{"cyclone", "40"}, {"tornado", "50"},
 75		{"sat", "60"}, {"castle", "80"}, {"liberty", "100"}, {"kaaba", "10"},
 76	},
 77	"plasma": {
 78		{"galaxy", "2250"}, {"atom", "2100"}, {"moai", "2100"}, {"comet", "1950"}, {"jelly", "1800"}, {"peacock", "1800"},
 79		{"om", "8"}, {"yin", "10"}, {"ophiuchus", "12"}, {"fleur", "15"}, {"trident", "15"},
 80		{"radioactive", "40"}, {"biohazard", "40"},
 81		{"castle-jp", "60"},
 82		{"sun-face", "20"}, {"dragon-face", "25"}, {"sauropod", "30"}, {"moon-word", "80"},
 83	},
 84	"neutron": {
 85		{"jelly", "2850"}, {"peacock", "2700"}, {"unicorn", "2550"}, {"galaxy", "2400"}, {"hamsa", "2400"}, {"dna", "2100"},
 86		{"genie", "8"}, {"heart-organ", "40"}, {"mage", "50"}, {"monarch", "60"},
 87		{"ninja", "40"}, {"brain", "30"}, {"lotus-sit", "40"},
 88		{"lion", "60"}, {"tiger", "80"}, {"eagle", "80"}, {"wolf", "100"}, {"shark", "120"},
 89	},
 90	"quasar": {
 91		{"unicorn", "3450"}, {"peacock", "3300"}, {"jelly", "3300"}, {"lotus", "2550"}, {"galaxy", "2850"}, {"dragon", "2550"},
 92		{"fireworks", "30"}, {"medal", "25"}, {"sports-medal", "40"}, {"silver-medal", "50"}, {"bronze-medal", "60"},
 93		{"tower", "80"}, {"hot-spring", "100"}, {"pirate", "60"},
 94		{"fairy", "80"}, {"vampire", "80"},
 95		{"heli", "40"}, {"bullet", "50"}, {"race", "80"},
 96	},
 97	"void": {
 98		{"lotus", "3600"}, {"unicorn", "4350"}, {"dragon", "4200"}, {"peacock", "4350"}, {"jelly", "4500"}, {"galaxy", "1500"},
 99		{"om", "15"}, {"yin", "15"}, {"trident", "20"}, {"fleur", "20"}, {"ophiuchus", "18"},
100		{"shooting", "25"}, {"sun-face", "30"}, {"dragon-face", "40"}, {"rex", "35"}, {"sauropod", "40"},
101		{"mammoth", "45"}, {"new-face", "35"},
102		{"kaaba", "18"},
103		{"witness", "12"}, {"genie", "12"},
104	},
105	"genesis": {
106		{"lotus", "5400"}, {"dragon", "5400"}, {"unicorn", "5250"}, {"peacock", "4950"}, {"jelly", "4800"}, {"infinity", "4200"},
107		{"genie", "12"}, {"witness", "15"},
108		{"sun-face", "40"}, {"shooting", "30"}, {"dragon-face", "50"},
109		{"om", "20"}, {"yin", "20"}, {"trident", "25"}, {"fleur", "25"},
110		{"kaaba", "20"},
111		{"rex", "40"}, {"sauropod", "45"}, {"mammoth", "50"},
112		{"new-face", "40"},
113		{"lion", "80"}, {"shark", "150"},
114	},
115	"omega": {
116		{"lotus", "6900"}, {"dragon", "6600"}, {"unicorn", "6300"}, {"peacock", "6000"}, {"jelly", "6000"}, {"infinity", "5700"},
117		{"genie", "18"},
118		{"witness", "20"},
119		{"sun-face", "50"},
120		{"shooting", "40"},
121		{"dragon-face", "60"},
122		{"om", "25"},
123		{"yin", "25"},
124		{"trident", "30"},
125		{"fleur", "30"},
126		{"ophiuchus", "25"},
127		{"kaaba", "25"},
128		{"rex", "50"},
129		{"sauropod", "55"},
130		{"mammoth", "60"},
131		{"new-face", "50"},
132		{"mage", "80"},
133		{"heart-organ", "60"},
134		{"sat", "100"},
135	},
136}
137
138// skillBaseCosts maps skillId → base cost at rank 0.
139// Actual cost at rank N = base × 2^N (doubles per rank).
140var skillBaseCosts = map[string][][2]string{
141	// STRIKE branch
142	"wrist":               {{"grin", "80"}, {"joy", "20"}},
143	"palm_strike":         {{"cool", "60"}, {"think", "40"}},
144	"follow":              {{"fire", "40"}, {"up", "40"}},
145	"knuckle_wrap":        {{"rock", "45"}, {"log", "40"}},
146	"heavy_swing":         {{"brick", "35"}, {"evergreen", "30"}},
147	"stone_breaker":       {{"rock", "70"}, {"hammer", "25"}, {"gear", "20"}},
148	"anvil_force":         {{"chains", "35"}, {"wrench", "30"}, {"brick", "60"}},
149	"point_drive":         {{"pick", "35"}, {"gear", "40"}, {"log", "90"}},
150	"kinetic_thrust":      {{"rocket", "20"}, {"bolt", "12"}, {"fire", "70"}},
151	"crushing_blow":       {{"crown", "10"}, {"trophy", "12"}, {"hammer", "45"}, {"bolt", "15"}},
152	"shatter_spike":       {{"sword", "18"}, {"pick", "45"}, {"chains", "45"}, {"gold-medal", "12"}},
153	"ironclad_cleave":     {{"anchor", "40"}, {"gear", "60"}, {"wrench", "50"}, {"money-bag", "15"}},
154	"thunder_jab":         {{"bolt", "25"}, {"rocket", "30"}, {"fire", "120"}, {"wand", "15"}},
155	"titan_hammer":        {{"gem", "14"}, {"coin", "18"}, {"crown", "22"}, {"trophy", "22"}, {"sword", "28"}},
156	"diamond_cleave":      {{"gem", "20"}, {"ring", "12"}, {"disco", "15"}, {"pick", "70"}, {"gold-medal", "24"}},
157	"hyper_drive":         {{"kite", "15"}, {"dodo", "12"}, {"bolt", "35"}, {"rocket", "45"}, {"gear", "70"}},
158	"quasar_impact":       {{"galaxy", "18"}, {"moai", "18"}, {"atom", "20"}, {"ufo", "16"}, {"comet", "18"}},
159	"black_hole_crush":    {{"galaxy", "30"}, {"atom", "28"}, {"moai", "24"}, {"gem", "35"}, {"ring", "28"}, {"comet", "22"}},
160	"mythic_annihilation": {{"dragon", "8"}, {"unicorn", "10"}, {"jelly", "12"}, {"peacock", "12"}, {"galaxy", "35"}, {"moai", "30"}},
161	"singularity_fist":    {{"infinity", "6"}, {"lotus", "8"}, {"dragon", "10"}, {"unicorn", "12"}, {"jelly", "14"}, {"galaxy", "40"}},
162	// FORTUNE branch
163	"fortune":             {{"clover", "16"}, {"heart", "40"}},
164	"four_leaf":           {{"seedling", "60"}, {"leaves", "50"}},
165	"edge":                {{"pizza", "20"}, {"spark", "30"}},
166	"glint":               {{"spark", "50"}, {"star", "12"}},
167	"spark_chaser":        {{"fire", "45"}, {"tada", "25"}},
168	"razor_focus":         {{"coffee", "25"}, {"game", "25"}, {"hundred", "30"}},
169	"precision_cut":       {{"eyes", "40"}, {"skull", "35"}, {"flutter", "18"}},
170	"aurora_gaze":         {{"rainbow", "15"}, {"spark", "60"}, {"moon", "20"}},
171	"starlight_gleam":     {{"star", "25"}, {"clover", "20"}, {"heart", "80"}},
172	"double_haul":         {{"gear", "30"}, {"anchor", "20"}, {"up", "70"}},
173	"twin_strike":         {{"chains", "25"}, {"wrench", "25"}, {"pick", "20"}},
174	"executioner":         {{"skull", "60"}, {"sword", "18"}, {"crown", "10"}, {"orb", "8"}},
175	"celestial_sight":     {{"planet", "10"}, {"moon", "30"}, {"star", "30"}, {"bead", "8"}},
176	"helix_harmony":       {{"dna", "12"}, {"spark", "80"}, {"rainbow", "25"}, {"orb", "10"}},
177	"fortune_split":       {{"money-bag", "15"}, {"gold-medal", "12"}, {"clover", "35"}, {"chains", "40"}},
178	"critical_surge":      {{"gem", "15"}, {"disco", "14"}, {"ring", "12"}, {"orb", "20"}, {"planet", "18"}},
179	"astral_scintillation": {{"ring", "14"}, {"gem", "16"}, {"dna", "20"}, {"star", "60"}, {"moon", "50"}},
180	"plunder_frenzy":      {{"coin", "25"}, {"money-bag", "30"}, {"gem", "12"}, {"crown", "25"}, {"trophy", "25"}},
181	"singularity_edge":    {{"lotus", "6"}, {"dragon", "8"}, {"galaxy", "25"}, {"hamsa", "20"}, {"atom", "22"}, {"mirror", "20"}},
182	"cosmic_fortune":      {{"peacock", "10"}, {"unicorn", "8"}, {"comet", "25"}, {"disco", "30"}, {"galaxy", "30"}, {"gem", "35"}},
183	// POCKET branch
184	"dustbag":             {{"grin", "200"}, {"sleep", "40"}},
185	"rhythm":              {{"music", "16"}, {"clap", "30"}},
186	"pocket_expansion":    {{"fallen", "45"}, {"herb", "35"}},
187	"steady_tempo":        {{"party", "40"}, {"wow", "30"}},
188	"cadence":             {{"music", "30"}, {"coffee", "20"}, {"clap", "50"}},
189	"deep_pouch":          {{"log", "70"}, {"rock", "60"}, {"mushroom", "35"}},
190	"vein_resonator":      {{"flutter", "20"}, {"rainbow", "15"}, {"tada", "40"}},
191	"cart_bed":            {{"log", "120"}, {"rock", "100"}, {"brick", "80"}, {"money-bag", "10"}},
192	"bounty_overflow":     {{"trophy", "15"}, {"crown", "12"}, {"pick", "45"}, {"game", "35"}},
193	"fracture_pulse":      {{"bolt", "25"}, {"wand", "15"}, {"hammer", "50"}, {"rocket", "25"}},
194	"metro_pulse":         {{"music", "45"}, {"coffee", "35"}, {"raise", "30"}, {"bolt", "15"}},
195	"hoarders_tote":       {{"coin", "22"}, {"gem", "10"}, {"money-bag", "35"}, {"rock", "150"}, {"log", "150"}},
196	"shatter_strike":      {{"gem", "14"}, {"bolt", "35"}, {"wand", "25"}, {"sword", "30"}, {"hammer", "60"}},
197	"super_conductor":     {{"coin", "20"}, {"ring", "12"}, {"music", "60"}, {"bolt", "30"}, {"coffee", "50"}},
198	"dodo_instinct":       {{"dodo", "14"}, {"kite", "14"}, {"crown", "22"}, {"trophy", "22"}, {"eyes", "80"}},
199	"void_rend":           {{"infinity", "6"}, {"jelly", "12"}, {"dragon", "8"}, {"atom", "30"}, {"comet", "25"}, {"bolt", "60"}},
200	"celestial_duplication": {{"infinity", "5"}, {"lotus", "6"}, {"dragon", "8"}, {"peacock", "10"}, {"coin", "40"}, {"gem", "35"}},
201	"eternity_flow":       {{"infinity", "5"}, {"lotus", "6"}, {"peacock", "8"}, {"hamsa", "25"}, {"mirror", "25"}, {"music", "100"}},
202	"abyssal_reserve":     {{"unicorn", "6"}, {"jelly", "10"}, {"moai", "25"}, {"ufo", "25"}, {"money-bag", "50"}, {"rock", "300"}},
203	"singularity_snap":    {{"infinity", "8"}, {"lotus", "8"}, {"dragon", "10"}, {"galaxy", "40"}, {"moai", "30"}, {"bolt", "80"}},
204
205	// ── Phase 5: Nature branch (level 20) ────────────────────────────────────
206	"deep_root":       {{"bear", "60"}, {"fox", "40"}},
207	"stone_sense":     {{"turtle", "30"}, {"coral", "15"}},
208	"bloom_tide":      {{"sakura", "20"}, {"bee", "50"}, {"deciduous", "80"}},
209	"thorn_hide":      {{"boar", "40"}, {"snake", "30"}, {"scorpion", "20"}},
210	"old_growth":      {{"elephant", "25"}, {"gorilla", "20"}, {"whale-spout", "15"}},
211	"storm_surge":     {{"storm", "25"}, {"lightning-cloud", "20"}, {"tornado", "15"}},
212	"predator_sense":  {{"tiger", "20"}, {"lion", "20"}, {"wolf", "20"}, {"eagle", "15"}},
213	"world_tree":      {{"rex", "12"}, {"mammoth", "10"}, {"dragon-face", "8"}, {"shooting", "8"}},
214
215	// ── Phase 5: Food branch (level 30) ──────────────────────────────────────
216	"hot_meal":     {{"ramen", "50"}, {"stew", "40"}},
217	"sugar_rush":   {{"candy", "60"}, {"cupcake", "40"}, {"donut", "30"}},
218	"second_wind":  {{"burger", "50"}, {"bacon", "40"}, {"cheese", "30"}},
219	"caffeinated":  {{"boba", "40"}, {"tea", "30"}, {"sake", "25"}},
220	"feast_mode":   {{"sushi", "30"}, {"curry", "40"}, {"pasta", "40"}, {"paella", "25"}},
221	"night_shift":  {{"honey", "30"}, {"pie", "25"}, {"cake", "20"}},
222	"brew_mastery": {{"beer", "40"}, {"wine", "30"}, {"cocktail", "20"}, {"champagne", "15"}},
223	"mythic_feast": {{"tropical-drink", "20"}, {"cheers", "15"}, {"toast", "12"}, {"mate", "12"}},
224
225	// ── Phase 5: People branch (level 40) ────────────────────────────────────
226	"mentor":        {{"baby", "60"}, {"child", "50"}},
227	"crowd_favor":   {{"clap", "80"}, {"heart-hands", "60"}},
228	"team_spirit":   {{"shake", "40"}, {"pray", "30"}, {"hug-pair", "30"}},
229	"athlete_heart": {{"surf", "30"}, {"swim", "30"}, {"run", "40"}, {"lift", "25"}},
230	"warrior_code":  {{"ninja", "20"}, {"fencer", "15"}, {"juggle", "15"}},
231	"elder_wisdom":  {{"monarch", "15"}, {"mage", "15"}, {"fairy", "12"}},
232	"hero_legend":   {{"hero", "12"}, {"vampire", "10"}, {"merfolk", "10"}},
233	"genie_wish":    {{"genie", "8"}, {"heart-organ", "12"}},
234
235	// ── Phase 5: Things branch (level 50) ────────────────────────────────────
236	"tempered_grip":   {{"gloves", "80"}, {"hammer", "60"}},
237	"field_repair":    {{"hammer-wrench", "40"}, {"saw", "30"}, {"nut", "50"}},
238	"master_craft":    {{"wrench", "60"}, {"driver", "50"}, {"clamp", "30"}},
239	"workshop_lore":   {{"toolbox", "30"}, {"abacus", "25"}, {"scroll", "20"}},
240	"iron_discipline": {{"axe", "30"}, {"dagger", "20"}, {"bow", "15"}},
241	"vault_keeper":    {{"lock", "40"}, {"key-lock", "30"}, {"old-key", "15"}},
242	"precision_forge": {{"scope", "20"}, {"telescope", "15"}, {"tube", "18"}, {"dish", "15"}},
243	"deep_science":    {{"alembic", "12"}, {"shield", "15"}, {"hammer-pick", "15"}, {"scale", "12"}},
244
245	// ── Phase 5: Travel branch (level 65) ────────────────────────────────────
246	"long_haul":      {{"car", "80"}, {"bus", "60"}},
247	"vein_compass":   {{"plane", "50"}, {"sail", "30"}},
248	"nomad_pace":     {{"moto", "40"}, {"cycle", "50"}, {"scooter", "40"}},
249	"deep_sea":       {{"ship", "30"}, {"whale-spout", "15"}, {"dolphin", "25"}},
250	"sky_route":      {{"rocket", "30"}, {"heli", "20"}, {"depart", "20"}},
251	"monument_seal":  {{"tower", "20"}, {"castle", "15"}, {"liberty", "12"}},
252	"orbital_drift":  {{"sat", "15"}, {"castle-jp", "12"}},
253	"sacred_ground":  {{"kaaba", "8"}, {"shrine", "10"}, {"temple", "10"}, {"mosque", "10"}},
254
255	// ── Phase 5: Signs branch (level 80) ─────────────────────────────────────
256	"amplify":       {{"sparkle", "80"}, {"eight-star", "60"}},
257	"resonance":     {{"recycle", "60"}, {"medical", "50"}},
258	"sigil_power":   {{"worship", "40"}, {"peace-sign", "30"}},
259	"zodiac_edge":   {{"aries", "20"}, {"taurus", "20"}, {"gemini", "20"}, {"cancer", "15"}},
260	"star_david":    {{"star-david", "15"}, {"dharma", "15"}, {"cross", "15"}, {"menorah", "12"}},
261	"hazard_forge":  {{"radioactive", "12"}, {"biohazard", "12"}},
262	"cosmic_sigil":  {{"trident", "10"}, {"fleur", "10"}, {"ophiuchus", "8"}},
263	"infinite_mark": {{"om", "8"}, {"yin", "8"}, {"witness", "6"}},
264}
265
266// skillMaxRanks maps skillId → maximum rank allowed.
267// Most skills cap at 3 or 4 — see catalog.ts SKILLS[*].max.
268var skillMaxRanks = map[string]uint64{
269	// Strike branch
270	"wrist": 5, "palm_strike": 4, "follow": 3, "knuckle_wrap": 4, "heavy_swing": 4,
271	"stone_breaker": 4, "anvil_force": 4, "point_drive": 4, "kinetic_thrust": 4,
272	"crushing_blow": 4, "shatter_spike": 4, "ironclad_cleave": 3, "thunder_jab": 3,
273	"titan_hammer": 3, "diamond_cleave": 3, "hyper_drive": 3, "quasar_impact": 3,
274	"black_hole_crush": 3, "mythic_annihilation": 3, "singularity_fist": 3,
275	// Fortune branch
276	"fortune": 4, "four_leaf": 3, "edge": 3, "glint": 3, "spark_chaser": 3,
277	"razor_focus": 3, "precision_cut": 3, "aurora_gaze": 3, "starlight_gleam": 3,
278	"double_haul": 3, "twin_strike": 3, "executioner": 3, "celestial_sight": 3,
279	"helix_harmony": 3, "fortune_split": 3, "critical_surge": 3,
280	"astral_scintillation": 3, "plunder_frenzy": 3, "singularity_edge": 3, "cosmic_fortune": 3,
281	// Pocket branch
282	"dustbag": 3, "rhythm": 3, "pocket_expansion": 3, "steady_tempo": 3, "cadence": 3,
283	"deep_pouch": 3, "vein_resonator": 3, "cart_bed": 3, "bounty_overflow": 3,
284	"fracture_pulse": 3, "metro_pulse": 3, "hoarders_tote": 3, "shatter_strike": 3,
285	"super_conductor": 3, "dodo_instinct": 3, "void_rend": 3, "celestial_duplication": 3,
286	"eternity_flow": 3, "abyssal_reserve": 3, "singularity_snap": 3,
287	// Phase 5 — Nature branch (unlocks level 20)
288	"deep_root": 3, "stone_sense": 3, "bloom_tide": 3, "thorn_hide": 3,
289	"old_growth": 3, "storm_surge": 3, "predator_sense": 3, "world_tree": 3,
290	// Phase 5 — Food branch (unlocks level 30)
291	"hot_meal": 3, "sugar_rush": 3, "second_wind": 3, "caffeinated": 3,
292	"feast_mode": 3, "night_shift": 3, "brew_mastery": 3, "mythic_feast": 3,
293	// Phase 5 — People branch (unlocks level 40)
294	"mentor": 3, "crowd_favor": 3, "team_spirit": 3, "athlete_heart": 3,
295	"warrior_code": 3, "elder_wisdom": 3, "hero_legend": 3, "genie_wish": 3,
296	// Phase 5 — Things branch (unlocks level 50)
297	"tempered_grip": 3, "field_repair": 3, "master_craft": 3, "workshop_lore": 3,
298	"iron_discipline": 3, "vault_keeper": 3, "precision_forge": 3, "deep_science": 3,
299	// Phase 5 — Travel branch (unlocks level 65)
300	"long_haul": 3, "vein_compass": 3, "nomad_pace": 3, "deep_sea": 3,
301	"sky_route": 3, "monument_seal": 3, "orbital_drift": 3, "sacred_ground": 3,
302	// Phase 5 — Signs branch (unlocks level 80)
303	"amplify": 3, "resonance": 3, "sigil_power": 3, "zodiac_edge": 3,
304	"star_david": 3, "hazard_forge": 3, "cosmic_sigil": 3, "infinite_mark": 3,
305}
306
307// toolMaxLife maps toolId → maximum durability (from catalog.ts tool.life).
308// Tools with life=0 are indestructible (hands, twig).
309var toolMaxLife = map[string]uint64{
310	"hands": 0, "twig": 0, "wood": 1200, "stone": 2500, "iron": 4000,
311	"gold": 6000, "diamond": 8000, "cosmic": 10000, "plasma": 10000,
312	"neutron": 10000, "quasar": 10000, "void": 12000, "genesis": 15000, "omega": 25000,
313}