[{"data":1,"prerenderedAt":1536},["ShallowReactive",2],{"doc:\u002Fgame-engine\u002Fcore\u002Fevents":3,"surround:\u002Fgame-engine\u002Fcore\u002Fevents":1285,"navigation":1296},{"id":4,"title":5,"body":6,"description":1278,"extension":1279,"meta":1280,"navigation":137,"path":1281,"seo":1282,"stem":1283,"__hash__":1284},"docs\u002F01.game-engine\u002F05.core\u002F05.events.md","Zdarzenia i harmonogram",{"type":7,"value":8,"toc":1266},"minimark",[9,14,23,181,186,266,270,335,342,346,375,379,382,545,627,632,650,654,952,956,959,1051,1055,1062,1206,1219,1250,1262],[10,11,13],"h2",{"id":12},"eventbus","EventBus",[15,16,17,18,22],"p",{},"Synchroniczna magistrala zdarzeń. Emisja idzie po ",[19,20,21],"strong",{},"kopii"," listy subskrybentów, a wyjątek jednego handlera nie blokuje pozostałych.",[24,25,30],"pre",{"className":26,"code":27,"language":28,"meta":29,"style":29},"language-ts shiki shiki-themes github-light github-dark","const off = this.getEvents().on\u003C{ score: number }>('score:changed', ({ score }) => {\n  this.hud.setText(`Wynik: ${score}`)\n})\n\nthis.getEvents().emit('score:changed', { score: 120 })\n\noff()\n","ts","",[31,32,33,100,126,132,139,167,172],"code",{"__ignoreMap":29},[34,35,38,42,46,49,52,56,60,63,66,69,73,76,79,82,86,89,91,94,97],"span",{"class":36,"line":37},"line",1,[34,39,41],{"class":40},"szBVR","const",[34,43,45],{"class":44},"sj4cs"," off",[34,47,48],{"class":40}," =",[34,50,51],{"class":44}," this",[34,53,55],{"class":54},"sVt8B",".",[34,57,59],{"class":58},"sScJk","getEvents",[34,61,62],{"class":54},"().",[34,64,65],{"class":58},"on",[34,67,68],{"class":54},"\u003C{ ",[34,70,72],{"class":71},"s4XuR","score",[34,74,75],{"class":40},":",[34,77,78],{"class":44}," number",[34,80,81],{"class":54}," }>(",[34,83,85],{"class":84},"sZZnC","'score:changed'",[34,87,88],{"class":54},", ({ ",[34,90,72],{"class":71},[34,92,93],{"class":54}," }) ",[34,95,96],{"class":40},"=>",[34,98,99],{"class":54}," {\n",[34,101,103,106,109,112,115,118,120,123],{"class":36,"line":102},2,[34,104,105],{"class":44},"  this",[34,107,108],{"class":54},".hud.",[34,110,111],{"class":58},"setText",[34,113,114],{"class":54},"(",[34,116,117],{"class":84},"`Wynik: ${",[34,119,72],{"class":54},[34,121,122],{"class":84},"}`",[34,124,125],{"class":54},")\n",[34,127,129],{"class":36,"line":128},3,[34,130,131],{"class":54},"})\n",[34,133,135],{"class":36,"line":134},4,[34,136,138],{"emptyLinePlaceholder":137},true,"\n",[34,140,142,145,147,149,151,154,156,158,161,164],{"class":36,"line":141},5,[34,143,144],{"class":44},"this",[34,146,55],{"class":54},[34,148,59],{"class":58},[34,150,62],{"class":54},[34,152,153],{"class":58},"emit",[34,155,114],{"class":54},[34,157,85],{"class":84},[34,159,160],{"class":54},", { score: ",[34,162,163],{"class":44},"120",[34,165,166],{"class":54}," })\n",[34,168,170],{"class":36,"line":169},6,[34,171,138],{"emptyLinePlaceholder":137},[34,173,175,178],{"class":36,"line":174},7,[34,176,177],{"class":58},"off",[34,179,180],{"class":54},"()\n",[182,183,185],"h3",{"id":184},"api","API",[24,187,189],{"className":26,"code":188,"language":28,"meta":29,"style":29},"on(event, handler): () => off\nsubscribe(event, handler): () => off\nsubscribeForScene(sceneId, event, handler): () => off\noff(event, handler); offById(event, id)\nemit(event, payload)\nclearScene(sceneId); clearAll(); listenerCount(event)\n",[31,190,191,203,214,226,239,246],{"__ignoreMap":29},[34,192,193,195,198,200],{"class":36,"line":37},[34,194,65],{"class":58},[34,196,197],{"class":54},"(event, handler): () ",[34,199,96],{"class":40},[34,201,202],{"class":54}," off\n",[34,204,205,208,210,212],{"class":36,"line":102},[34,206,207],{"class":58},"subscribe",[34,209,197],{"class":54},[34,211,96],{"class":40},[34,213,202],{"class":54},[34,215,216,219,222,224],{"class":36,"line":128},[34,217,218],{"class":58},"subscribeForScene",[34,220,221],{"class":54},"(sceneId, event, handler): () ",[34,223,96],{"class":40},[34,225,202],{"class":54},[34,227,228,230,233,236],{"class":36,"line":134},[34,229,177],{"class":58},[34,231,232],{"class":54},"(event, handler); ",[34,234,235],{"class":58},"offById",[34,237,238],{"class":54},"(event, id)\n",[34,240,241,243],{"class":36,"line":141},[34,242,153],{"class":58},[34,244,245],{"class":54},"(event, payload)\n",[34,247,248,251,254,257,260,263],{"class":36,"line":169},[34,249,250],{"class":58},"clearScene",[34,252,253],{"class":54},"(sceneId); ",[34,255,256],{"class":58},"clearAll",[34,258,259],{"class":54},"(); ",[34,261,262],{"class":58},"listenerCount",[34,264,265],{"class":54},"(event)\n",[182,267,269],{"id":268},"subskrypcje-per-scena","Subskrypcje per scena",[24,271,273],{"className":26,"code":272,"language":28,"meta":29,"style":29},"this.getEvents().subscribeForScene(this.id, 'player:died', () => {\n  this.getCamera().shake(200, 0.01)\n})\n",[31,274,275,304,331],{"__ignoreMap":29},[34,276,277,279,281,283,285,287,289,291,294,297,300,302],{"class":36,"line":37},[34,278,144],{"class":44},[34,280,55],{"class":54},[34,282,59],{"class":58},[34,284,62],{"class":54},[34,286,218],{"class":58},[34,288,114],{"class":54},[34,290,144],{"class":44},[34,292,293],{"class":54},".id, ",[34,295,296],{"class":84},"'player:died'",[34,298,299],{"class":54},", () ",[34,301,96],{"class":40},[34,303,99],{"class":54},[34,305,306,308,310,313,315,318,320,323,326,329],{"class":36,"line":102},[34,307,105],{"class":44},[34,309,55],{"class":54},[34,311,312],{"class":58},"getCamera",[34,314,62],{"class":54},[34,316,317],{"class":58},"shake",[34,319,114],{"class":54},[34,321,322],{"class":44},"200",[34,324,325],{"class":54},", ",[34,327,328],{"class":44},"0.01",[34,330,125],{"class":54},[34,332,333],{"class":36,"line":128},[34,334,131],{"class":54},[15,336,337,338,341],{},"Przy ",[31,339,340],{},"shutdown()"," sceny wszystkie jej subskrypcje znikają automatycznie — nie ma wycieków między scenami.",[182,343,345],{"id":344},"zdarzenia-silnika","Zdarzenia silnika",[15,347,348,325,351,325,354,325,357,325,360,325,363,325,366,325,369,325,372,55],{},[31,349,350],{},"engine:start",[31,352,353],{},"engine:stop",[31,355,356],{},"engine:pause",[31,358,359],{},"engine:resume",[31,361,362],{},"engine:update",[31,364,365],{},"scene:start",[31,367,368],{},"scene:stop",[31,370,371],{},"assets:*",[31,373,374],{},"audio:unlocked",[10,376,378],{"id":377},"scheduler","Scheduler",[15,380,381],{},"Zadania z uchwytami, właścicielami i izolacją błędów:",[24,383,385],{"className":26,"code":384,"language":28,"meta":29,"style":29},"const handle = this.getScheduler().delay(2, () => {\n  this.spawnWave(2)\n}, { owner: this.id })\n\nthis.getScheduler().interval(0.5, () => {\n  this.regenHp(1)\n}, { owner: this.id, repeat: 10 })\n\nthis.getScheduler().cancel(handle)\nthis.getScheduler().cancelOwner(this.id)\n",[31,386,387,419,434,444,448,472,488,502,507,524],{"__ignoreMap":29},[34,388,389,391,394,396,398,400,403,405,408,410,413,415,417],{"class":36,"line":37},[34,390,41],{"class":40},[34,392,393],{"class":44}," handle",[34,395,48],{"class":40},[34,397,51],{"class":44},[34,399,55],{"class":54},[34,401,402],{"class":58},"getScheduler",[34,404,62],{"class":54},[34,406,407],{"class":58},"delay",[34,409,114],{"class":54},[34,411,412],{"class":44},"2",[34,414,299],{"class":54},[34,416,96],{"class":40},[34,418,99],{"class":54},[34,420,421,423,425,428,430,432],{"class":36,"line":102},[34,422,105],{"class":44},[34,424,55],{"class":54},[34,426,427],{"class":58},"spawnWave",[34,429,114],{"class":54},[34,431,412],{"class":44},[34,433,125],{"class":54},[34,435,436,439,441],{"class":36,"line":128},[34,437,438],{"class":54},"}, { owner: ",[34,440,144],{"class":44},[34,442,443],{"class":54},".id })\n",[34,445,446],{"class":36,"line":134},[34,447,138],{"emptyLinePlaceholder":137},[34,449,450,452,454,456,458,461,463,466,468,470],{"class":36,"line":141},[34,451,144],{"class":44},[34,453,55],{"class":54},[34,455,402],{"class":58},[34,457,62],{"class":54},[34,459,460],{"class":58},"interval",[34,462,114],{"class":54},[34,464,465],{"class":44},"0.5",[34,467,299],{"class":54},[34,469,96],{"class":40},[34,471,99],{"class":54},[34,473,474,476,478,481,483,486],{"class":36,"line":169},[34,475,105],{"class":44},[34,477,55],{"class":54},[34,479,480],{"class":58},"regenHp",[34,482,114],{"class":54},[34,484,485],{"class":44},"1",[34,487,125],{"class":54},[34,489,490,492,494,497,500],{"class":36,"line":174},[34,491,438],{"class":54},[34,493,144],{"class":44},[34,495,496],{"class":54},".id, repeat: ",[34,498,499],{"class":44},"10",[34,501,166],{"class":54},[34,503,505],{"class":36,"line":504},8,[34,506,138],{"emptyLinePlaceholder":137},[34,508,510,512,514,516,518,521],{"class":36,"line":509},9,[34,511,144],{"class":44},[34,513,55],{"class":54},[34,515,402],{"class":58},[34,517,62],{"class":54},[34,519,520],{"class":58},"cancel",[34,522,523],{"class":54},"(handle)\n",[34,525,527,529,531,533,535,538,540,542],{"class":36,"line":526},10,[34,528,144],{"class":44},[34,530,55],{"class":54},[34,532,402],{"class":58},[34,534,62],{"class":54},[34,536,537],{"class":58},"cancelOwner",[34,539,114],{"class":54},[34,541,144],{"class":44},[34,543,544],{"class":54},".id)\n",[24,546,548],{"className":26,"code":547,"language":28,"meta":29,"style":29},"scheduler.delay(seconds, callback, options?): TaskHandle\nscheduler.interval(seconds, callback, options?): TaskHandle\nscheduler.cancel(handle); scheduler.cancelOwner(owner): number; scheduler.clear()\nscheduler.has(id); scheduler.count(owner?); scheduler.errorCount\n",[31,549,550,571,587,606],{"__ignoreMap":29},[34,551,552,555,557,560,563,566,568],{"class":36,"line":37},[34,553,554],{"class":54},"scheduler.",[34,556,407],{"class":58},[34,558,559],{"class":54},"(seconds, callback, options",[34,561,562],{"class":40},"?",[34,564,565],{"class":54},")",[34,567,75],{"class":40},[34,569,570],{"class":54}," TaskHandle\n",[34,572,573,575,577,579,581,583,585],{"class":36,"line":102},[34,574,554],{"class":54},[34,576,460],{"class":58},[34,578,559],{"class":54},[34,580,562],{"class":40},[34,582,565],{"class":54},[34,584,75],{"class":40},[34,586,570],{"class":54},[34,588,589,591,593,596,598,601,604],{"class":36,"line":128},[34,590,554],{"class":54},[34,592,520],{"class":58},[34,594,595],{"class":54},"(handle); scheduler.",[34,597,537],{"class":58},[34,599,600],{"class":54},"(owner): number; scheduler.",[34,602,603],{"class":58},"clear",[34,605,180],{"class":54},[34,607,608,610,613,616,619,622,624],{"class":36,"line":134},[34,609,554],{"class":54},[34,611,612],{"class":58},"has",[34,614,615],{"class":54},"(id); scheduler.",[34,617,618],{"class":58},"count",[34,620,621],{"class":54},"(owner",[34,623,562],{"class":40},[34,625,626],{"class":54},"); scheduler.errorCount\n",[15,628,629,55],{},[31,630,631],{},"TaskOptions = { owner?: string; repeat?: number; onError?: (e) => void }",[633,634,637],"callout",{"type":635,"title":636},"info","Izolacja błędów",[15,638,639,640,643,644,647,648,55],{},"Wyjątek w zadaniu nie zatrzymuje innych zadań. Trafia do ",[31,641,642],{},"errorCount"," i do ",[31,645,646],{},"onError",", jeśli podano. Timery sceny są anulowane przy ",[31,649,340],{},[182,651,653],{"id":652},"przykład-fale-przeciwników","Przykład: fale przeciwników",[24,655,657],{"className":26,"code":656,"language":28,"meta":29,"style":29},"class GameScene extends Scene {\n  create() {\n    this.getScheduler().interval(8, () => this.spawnWave(), {\n      owner: this.id,\n      onError: (e) => this.getLogger().error('spawnWave failed', e)\n    })\n  }\n\n  private spawnWave() {\n    const count = this.getRandom().int(3, 6)\n    for (let i = 0; i \u003C count; i++) {\n      this.createSprite('enemy', {\n        x: this.getRandom().float(100, 1180),\n        y: -40,\n        tags: ['enemy']\n      })\n    }\n  }\n}\n",[31,658,659,675,683,714,724,760,765,770,774,784,818,854,873,903,918,929,935,941,946],{"__ignoreMap":29},[34,660,661,664,667,670,673],{"class":36,"line":37},[34,662,663],{"class":40},"class",[34,665,666],{"class":58}," GameScene",[34,668,669],{"class":40}," extends",[34,671,672],{"class":58}," Scene",[34,674,99],{"class":54},[34,676,677,680],{"class":36,"line":102},[34,678,679],{"class":58},"  create",[34,681,682],{"class":54},"() {\n",[34,684,685,688,690,692,694,696,698,701,703,705,707,709,711],{"class":36,"line":128},[34,686,687],{"class":44},"    this",[34,689,55],{"class":54},[34,691,402],{"class":58},[34,693,62],{"class":54},[34,695,460],{"class":58},[34,697,114],{"class":54},[34,699,700],{"class":44},"8",[34,702,299],{"class":54},[34,704,96],{"class":40},[34,706,51],{"class":44},[34,708,55],{"class":54},[34,710,427],{"class":58},[34,712,713],{"class":54},"(), {\n",[34,715,716,719,721],{"class":36,"line":134},[34,717,718],{"class":54},"      owner: ",[34,720,144],{"class":44},[34,722,723],{"class":54},".id,\n",[34,725,726,729,732,735,738,740,742,744,747,749,752,754,757],{"class":36,"line":141},[34,727,728],{"class":58},"      onError",[34,730,731],{"class":54},": (",[34,733,734],{"class":71},"e",[34,736,737],{"class":54},") ",[34,739,96],{"class":40},[34,741,51],{"class":44},[34,743,55],{"class":54},[34,745,746],{"class":58},"getLogger",[34,748,62],{"class":54},[34,750,751],{"class":58},"error",[34,753,114],{"class":54},[34,755,756],{"class":84},"'spawnWave failed'",[34,758,759],{"class":54},", e)\n",[34,761,762],{"class":36,"line":169},[34,763,764],{"class":54},"    })\n",[34,766,767],{"class":36,"line":174},[34,768,769],{"class":54},"  }\n",[34,771,772],{"class":36,"line":504},[34,773,138],{"emptyLinePlaceholder":137},[34,775,776,779,782],{"class":36,"line":509},[34,777,778],{"class":40},"  private",[34,780,781],{"class":58}," spawnWave",[34,783,682],{"class":54},[34,785,786,789,792,794,796,798,801,803,806,808,811,813,816],{"class":36,"line":526},[34,787,788],{"class":40},"    const",[34,790,791],{"class":44}," count",[34,793,48],{"class":40},[34,795,51],{"class":44},[34,797,55],{"class":54},[34,799,800],{"class":58},"getRandom",[34,802,62],{"class":54},[34,804,805],{"class":58},"int",[34,807,114],{"class":54},[34,809,810],{"class":44},"3",[34,812,325],{"class":54},[34,814,815],{"class":44},"6",[34,817,125],{"class":54},[34,819,821,824,827,830,833,836,839,842,845,848,851],{"class":36,"line":820},11,[34,822,823],{"class":40},"    for",[34,825,826],{"class":54}," (",[34,828,829],{"class":40},"let",[34,831,832],{"class":54}," i ",[34,834,835],{"class":40},"=",[34,837,838],{"class":44}," 0",[34,840,841],{"class":54},"; i ",[34,843,844],{"class":40},"\u003C",[34,846,847],{"class":54}," count; i",[34,849,850],{"class":40},"++",[34,852,853],{"class":54},") {\n",[34,855,857,860,862,865,867,870],{"class":36,"line":856},12,[34,858,859],{"class":44},"      this",[34,861,55],{"class":54},[34,863,864],{"class":58},"createSprite",[34,866,114],{"class":54},[34,868,869],{"class":84},"'enemy'",[34,871,872],{"class":54},", {\n",[34,874,876,879,881,883,885,887,890,892,895,897,900],{"class":36,"line":875},13,[34,877,878],{"class":54},"        x: ",[34,880,144],{"class":44},[34,882,55],{"class":54},[34,884,800],{"class":58},[34,886,62],{"class":54},[34,888,889],{"class":58},"float",[34,891,114],{"class":54},[34,893,894],{"class":44},"100",[34,896,325],{"class":54},[34,898,899],{"class":44},"1180",[34,901,902],{"class":54},"),\n",[34,904,906,909,912,915],{"class":36,"line":905},14,[34,907,908],{"class":54},"        y: ",[34,910,911],{"class":40},"-",[34,913,914],{"class":44},"40",[34,916,917],{"class":54},",\n",[34,919,921,924,926],{"class":36,"line":920},15,[34,922,923],{"class":54},"        tags: [",[34,925,869],{"class":84},[34,927,928],{"class":54},"]\n",[34,930,932],{"class":36,"line":931},16,[34,933,934],{"class":54},"      })\n",[34,936,938],{"class":36,"line":937},17,[34,939,940],{"class":54},"    }\n",[34,942,944],{"class":36,"line":943},18,[34,945,769],{"class":54},[34,947,949],{"class":36,"line":948},19,[34,950,951],{"class":54},"}\n",[10,953,955],{"id":954},"timer","Timer",[15,957,958],{},"Lżejszy wariant schedulera do prostych opóźnień:",[24,960,962],{"className":26,"code":961,"language":28,"meta":29,"style":29},"this.getTimer().delay(1.5, () => this.flashScreen())\nthis.getTimer().interval(0.1, () => this.tick())\nthis.getTimer().pending\nthis.getTimer().clear()\n",[31,963,964,996,1026,1037],{"__ignoreMap":29},[34,965,966,968,970,973,975,977,979,982,984,986,988,990,993],{"class":36,"line":37},[34,967,144],{"class":44},[34,969,55],{"class":54},[34,971,972],{"class":58},"getTimer",[34,974,62],{"class":54},[34,976,407],{"class":58},[34,978,114],{"class":54},[34,980,981],{"class":44},"1.5",[34,983,299],{"class":54},[34,985,96],{"class":40},[34,987,51],{"class":44},[34,989,55],{"class":54},[34,991,992],{"class":58},"flashScreen",[34,994,995],{"class":54},"())\n",[34,997,998,1000,1002,1004,1006,1008,1010,1013,1015,1017,1019,1021,1024],{"class":36,"line":102},[34,999,144],{"class":44},[34,1001,55],{"class":54},[34,1003,972],{"class":58},[34,1005,62],{"class":54},[34,1007,460],{"class":58},[34,1009,114],{"class":54},[34,1011,1012],{"class":44},"0.1",[34,1014,299],{"class":54},[34,1016,96],{"class":40},[34,1018,51],{"class":44},[34,1020,55],{"class":54},[34,1022,1023],{"class":58},"tick",[34,1025,995],{"class":54},[34,1027,1028,1030,1032,1034],{"class":36,"line":128},[34,1029,144],{"class":44},[34,1031,55],{"class":54},[34,1033,972],{"class":58},[34,1035,1036],{"class":54},"().pending\n",[34,1038,1039,1041,1043,1045,1047,1049],{"class":36,"line":134},[34,1040,144],{"class":44},[34,1042,55],{"class":54},[34,1044,972],{"class":58},[34,1046,62],{"class":54},[34,1048,603],{"class":58},[34,1050,180],{"class":54},[10,1052,1054],{"id":1053},"random","Random",[15,1056,1057,1058,1061],{},"Deterministyczna losowość z seedem (domyślnie ",[31,1059,1060],{},"1337","):",[24,1063,1065],{"className":26,"code":1064,"language":28,"meta":29,"style":29},"const random = this.getRandom()\n\nrandom.next()\nrandom.float(0, 100)\nrandom.int(1, 6)\nrandom.bool(0.3)\nrandom.sign()\nrandom.pick(['sword', 'axe', 'bow'])\n\nconst lootRandom = random.fork('loot')\n",[31,1066,1067,1084,1088,1098,1115,1131,1145,1154,1180,1184],{"__ignoreMap":29},[34,1068,1069,1071,1074,1076,1078,1080,1082],{"class":36,"line":37},[34,1070,41],{"class":40},[34,1072,1073],{"class":44}," random",[34,1075,48],{"class":40},[34,1077,51],{"class":44},[34,1079,55],{"class":54},[34,1081,800],{"class":58},[34,1083,180],{"class":54},[34,1085,1086],{"class":36,"line":102},[34,1087,138],{"emptyLinePlaceholder":137},[34,1089,1090,1093,1096],{"class":36,"line":128},[34,1091,1092],{"class":54},"random.",[34,1094,1095],{"class":58},"next",[34,1097,180],{"class":54},[34,1099,1100,1102,1104,1106,1109,1111,1113],{"class":36,"line":134},[34,1101,1092],{"class":54},[34,1103,889],{"class":58},[34,1105,114],{"class":54},[34,1107,1108],{"class":44},"0",[34,1110,325],{"class":54},[34,1112,894],{"class":44},[34,1114,125],{"class":54},[34,1116,1117,1119,1121,1123,1125,1127,1129],{"class":36,"line":141},[34,1118,1092],{"class":54},[34,1120,805],{"class":58},[34,1122,114],{"class":54},[34,1124,485],{"class":44},[34,1126,325],{"class":54},[34,1128,815],{"class":44},[34,1130,125],{"class":54},[34,1132,1133,1135,1138,1140,1143],{"class":36,"line":169},[34,1134,1092],{"class":54},[34,1136,1137],{"class":58},"bool",[34,1139,114],{"class":54},[34,1141,1142],{"class":44},"0.3",[34,1144,125],{"class":54},[34,1146,1147,1149,1152],{"class":36,"line":174},[34,1148,1092],{"class":54},[34,1150,1151],{"class":58},"sign",[34,1153,180],{"class":54},[34,1155,1156,1158,1161,1164,1167,1169,1172,1174,1177],{"class":36,"line":504},[34,1157,1092],{"class":54},[34,1159,1160],{"class":58},"pick",[34,1162,1163],{"class":54},"([",[34,1165,1166],{"class":84},"'sword'",[34,1168,325],{"class":54},[34,1170,1171],{"class":84},"'axe'",[34,1173,325],{"class":54},[34,1175,1176],{"class":84},"'bow'",[34,1178,1179],{"class":54},"])\n",[34,1181,1182],{"class":36,"line":509},[34,1183,138],{"emptyLinePlaceholder":137},[34,1185,1186,1188,1191,1193,1196,1199,1201,1204],{"class":36,"line":526},[34,1187,41],{"class":40},[34,1189,1190],{"class":44}," lootRandom",[34,1192,48],{"class":40},[34,1194,1195],{"class":54}," random.",[34,1197,1198],{"class":58},"fork",[34,1200,114],{"class":54},[34,1202,1203],{"class":84},"'loot'",[34,1205,125],{"class":54},[1207,1208,1209,1213],"ul",{},[1210,1211,1212],"li",{},"Ten sam seed → ta sama sekwencja, niezależnie od maszyny.",[1210,1214,1215,1218],{},[31,1216,1217],{},"fork(salt)"," tworzy niezależny strumień — np. osobny dla lootu i osobny dla AI, żeby nie zaburzać sobie sekwencji.",[24,1220,1222],{"className":26,"code":1221,"language":28,"meta":29,"style":29},"const engine = createEngine({ parent: 'app', seed: 20260 })\n",[31,1223,1224],{"__ignoreMap":29},[34,1225,1226,1228,1231,1233,1236,1239,1242,1245,1248],{"class":36,"line":37},[34,1227,41],{"class":40},[34,1229,1230],{"class":44}," engine",[34,1232,48],{"class":40},[34,1234,1235],{"class":58}," createEngine",[34,1237,1238],{"class":54},"({ parent: ",[34,1240,1241],{"class":84},"'app'",[34,1243,1244],{"class":54},", seed: ",[34,1246,1247],{"class":44},"20260",[34,1249,166],{"class":54},[633,1251,1253],{"type":1252},"tip",[15,1254,1255,1256,1259,1260,55],{},"Nigdy nie używaj ",[31,1257,1258],{},"Math.random()"," w logice gry — łamie determinizm i powtarzalność zapisów. Cała losowość przechodzi przez ",[31,1261,1054],{},[1263,1264,1265],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":29,"searchDepth":128,"depth":128,"links":1267},[1268,1273,1276,1277],{"id":12,"depth":102,"text":13,"children":1269},[1270,1271,1272],{"id":184,"depth":128,"text":185},{"id":268,"depth":128,"text":269},{"id":344,"depth":128,"text":345},{"id":377,"depth":102,"text":378,"children":1274},[1275],{"id":652,"depth":128,"text":653},{"id":954,"depth":102,"text":955},{"id":1053,"depth":102,"text":1054},"EventBus, Scheduler, Timer i Random — komunikacja między systemami, zadania z uchwytami, izolacja błędów i deterministyczna losowość.","md",{},"\u002Fgame-engine\u002Fcore\u002Fevents",{"title":5,"description":1278},"01.game-engine\u002F05.core\u002F05.events","EMq-6JoIS2-NNx36gR9SQQv-sEJNNTsVfHaT8Lpw8MU",[1286,1291],{"title":1287,"path":1288,"stem":1289,"description":1290,"children":-1},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects","GameObject, transformacje, tagi, hierarchia i komponenty z fazami systemowymi. Jak budować zachowania bez ECS.",{"title":1292,"path":1293,"stem":1294,"description":1295,"children":-1},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets","Manifest, statusy ładowania, uchwyty właścicieli, refcounting, GC i raporty rozmiarów. Jak ładować assety bez wycieków.",[1297,1408,1469],{"title":1298,"path":1299,"stem":1300,"children":1301},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[1302,1304,1308,1312,1316,1336,1362,1375,1396,1400,1404],{"title":1303,"path":1299,"stem":1300},"Przegląd",{"title":1305,"path":1306,"stem":1307},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":1309,"path":1310,"stem":1311},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":1313,"path":1314,"stem":1315},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":1317,"path":1318,"stem":1319,"children":1320,"page":1335},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[1321,1325,1329,1333,1334],{"title":1322,"path":1323,"stem":1324},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":1326,"path":1327,"stem":1328},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":1330,"path":1331,"stem":1332},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":1287,"path":1288,"stem":1289},{"title":5,"path":1281,"stem":1283},false,{"title":1337,"path":1338,"stem":1339,"children":1340,"page":1335},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[1341,1342,1346,1350,1354,1358],{"title":1292,"path":1293,"stem":1294},{"title":1343,"path":1344,"stem":1345},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":1347,"path":1348,"stem":1349},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":1351,"path":1352,"stem":1353},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":1355,"path":1356,"stem":1357},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":1359,"path":1360,"stem":1361},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":1363,"path":1364,"stem":1365,"children":1366,"page":1335},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[1367,1371],{"title":1368,"path":1369,"stem":1370},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":1372,"path":1373,"stem":1374},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":1376,"path":1377,"stem":1378,"children":1379,"page":1335},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[1380,1384,1388,1392],{"title":1381,"path":1382,"stem":1383},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":1385,"path":1386,"stem":1387},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":1389,"path":1390,"stem":1391},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":1393,"path":1394,"stem":1395},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":1397,"path":1398,"stem":1399},"Wdrożenie","\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":1401,"path":1402,"stem":1403},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":1405,"path":1406,"stem":1407},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":1409,"path":1410,"stem":1411,"children":1412},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[1413,1414,1417,1420,1441],{"title":1303,"path":1410,"stem":1411},{"title":1305,"path":1415,"stem":1416},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":1309,"path":1418,"stem":1419},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":1421,"path":1422,"stem":1423,"children":1424,"page":1335},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[1425,1429,1433,1437],{"title":1426,"path":1427,"stem":1428},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":1430,"path":1431,"stem":1432},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":1434,"path":1435,"stem":1436},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":1438,"path":1439,"stem":1440},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":1442,"path":1443,"stem":1444,"children":1445,"page":1335},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[1446,1450,1454,1458,1461,1465],{"title":1447,"path":1448,"stem":1449},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":1451,"path":1452,"stem":1453},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":1455,"path":1456,"stem":1457},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":1397,"path":1459,"stem":1460},"\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":1462,"path":1463,"stem":1464},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":1466,"path":1467,"stem":1468},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":1470,"path":1471,"stem":1472,"children":1473},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[1474,1475,1478,1499,1512,1532],{"title":1303,"path":1471,"stem":1472},{"title":1305,"path":1476,"stem":1477},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":1479,"path":1480,"stem":1481,"children":1482,"page":1335},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[1483,1487,1491,1495],{"title":1484,"path":1485,"stem":1486},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":1488,"path":1489,"stem":1490},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":1492,"path":1493,"stem":1494},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":1496,"path":1497,"stem":1498},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":1500,"path":1501,"stem":1502,"children":1503,"page":1335},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[1504,1508],{"title":1505,"path":1506,"stem":1507},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":1509,"path":1510,"stem":1511},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":1513,"path":1514,"stem":1515,"children":1516,"page":1335},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[1517,1520,1524,1528],{"title":1313,"path":1518,"stem":1519},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":1521,"path":1522,"stem":1523},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":1525,"path":1526,"stem":1527},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":1529,"path":1530,"stem":1531},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":1533,"path":1534,"stem":1535},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986307402]