lock-key-system.html 70 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119
  1. <!doctype html>
  2. <html lang="en" class="no-js">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <link rel="prev" href="multiple-floors.html">
  7. <link rel="next" href="injecting-tiles.html">
  8. <link rel="icon" href="../assets/images/favicon.ico">
  9. <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11">
  10. <title>Lock & Key System - DunGen</title>
  11. <link rel="stylesheet" href="../assets/stylesheets/main.4af4bdda.min.css">
  12. <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
  13. <script src="https://unpkg.com/iframe-worker/shim"></script>
  14. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  15. <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
  16. <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
  17. <link rel="stylesheet" href="../stylesheets/extra.css">
  18. <script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
  19. </head>
  20. <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="cyan">
  21. <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
  22. <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
  23. <label class="md-overlay" for="__drawer"></label>
  24. <div data-md-component="skip">
  25. <a href="#advanced-features-lock-key-system" class="md-skip">
  26. Skip to content
  27. </a>
  28. </div>
  29. <div data-md-component="announce">
  30. </div>
  31. <header class="md-header md-header--shadow" data-md-component="header">
  32. <nav class="md-header__inner md-grid" aria-label="Header">
  33. <a href="../index.html" title="DunGen" class="md-header__button md-logo" aria-label="DunGen" data-md-component="logo">
  34. <svg width="100%" height="100%" viewBox="0 0 258 272" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
  35. <path d="M79,20.998C103.163,20.998 126.827,20.993 150.49,21.002C156.512,21.004 156.994,21.502 157,27.603C157.008,36.435 157.275,45.279 156.89,54.094C156.689,58.68 158.685,61.484 161.849,64.242C170.723,71.978 179.515,79.812 188.188,87.772C190.849,90.214 193.071,93.217 195.28,95.995C199.425,101.209 199.993,100.532 203.73,100.441C209.056,100.311 214.403,100.217 219.713,100.549C222.988,100.754 224.083,99.873 224.059,96.517C223.93,78.354 223.952,60.189 224.044,42.025C224.059,38.949 223.341,37.434 219.868,37.603C214.383,37.872 208.877,37.791 203.381,37.715C199.579,37.663 197.517,38.715 197.907,43.168C198.327,47.964 197.807,52.836 198.065,57.655C198.263,61.366 196.432,62.919 193.348,61.885C188.656,60.311 184.193,58.029 179.724,55.858C179.188,55.598 179.033,54.157 179.028,53.262C178.979,44.43 179.007,35.598 178.995,26.766C178.99,22.857 180.241,20.823 184.822,20.897C200.816,21.158 216.816,20.988 232.814,21.004C239.132,21.01 240.996,22.894 240.998,29.241C241.006,56.07 241.005,82.9 240.998,109.729C240.997,114.795 238.959,117.469 233.922,117.935C228.649,118.423 223.32,118.407 218.015,118.42C208.355,118.444 198.68,117.994 189.04,118.408C184.225,118.615 181.96,116.755 180.231,112.653C175.241,100.811 167.104,91.401 156.54,84.26C153.778,82.394 150.001,81.189 146.67,81.142C126.51,80.86 106.344,81.107 86.182,80.92C81.723,80.878 80.502,82.453 80.517,86.753C80.64,122.394 80.606,158.037 80.499,193.679C80.487,197.764 81.821,199.148 86.047,199.093C103.375,198.866 120.707,198.998 138.038,198.998C159.059,198.998 178.198,184.319 182.849,163.942C184.15,158.243 183.93,152.135 183.91,146.215C183.896,141.846 185.254,139.882 189.885,139.936C204.381,140.105 218.88,139.974 233.378,140.01C238.862,140.024 240.989,142.215 240.993,147.822C241.011,180.317 241.012,212.813 240.992,245.308C240.988,250.939 238.967,252.977 233.218,252.985C205.722,253.022 178.226,253.017 150.73,252.989C145.524,252.983 144.074,251.47 144.001,246.325C143.982,244.992 144.14,243.641 143.973,242.329C143.34,237.341 146.132,235.979 150.411,235.99C160.395,236.016 171.06,236.112 181.183,236.112C181.349,229.59 181.592,223.106 181.957,216.723C182.112,214.015 183.166,213.054 185.926,212.937C199.005,212.385 199.002,212.308 199.002,225.465C199.002,236.846 199.003,236.883 210.211,236.618C214.669,236.512 219.122,236.203 223.998,235.966L223.998,215.809C223.998,197.812 223.911,179.813 224.071,161.817C224.103,158.195 223.211,156.729 219.348,156.922C213.399,157.218 207.424,157 201.518,157C200.995,162.216 201.49,167.296 200.093,171.982C197.761,179.807 196.375,184.335 192.2,189.003C186.463,195.42 180.539,202.401 173.212,206.467C165.218,210.904 155.809,213.982 146.533,214.772C140.003,215.328 133.915,215.112 127.586,214.988C124.239,214.923 122.845,216.06 122.934,219.622C123.145,228.116 123.005,236.618 123.001,245.117C122.998,251.059 121.128,252.977 115.061,252.989C97.897,253.025 80.733,253.002 63.568,253.002C51.404,253.002 39.239,253.028 27.074,252.99C21.11,252.972 19.972,251.911 19.969,246.171C19.952,212.512 20.027,178.852 19.931,145.193C19.92,141.244 21.512,139.936 25.206,139.967C36.037,140.056 46.872,139.868 57.7,140.066C61.659,140.139 62.704,138.654 62.9,134.816C63.079,131.328 63.031,127.859 62.985,124.329C62.92,119.388 61.017,118.259 56.858,118.302C47.864,118.397 38.869,118.381 29.875,118.42C29.044,118.424 28.21,118.569 27.382,118.535C20.483,118.255 19.854,117.626 19.858,110.743C19.874,83.582 19.901,56.422 19.946,29.261C19.957,22.709 21.747,21.005 28.509,21.001C45.173,20.992 61.836,20.998 79,20.998M40.806,37.592C39.579,39.018 37.305,40.427 37.283,41.871C37.009,60.012 37.047,78.158 37.045,96.302C37.045,98.812 38.187,100.243 40.973,100.24C46.626,100.235 52.281,100.327 57.93,100.537C61.815,100.681 63.165,99.043 63.06,95.156C62.832,86.672 62.99,78.177 63.001,69.687C63.01,63.101 65.168,60.989 71.882,60.989C92.36,60.99 112.837,60.999 133.315,60.997C139.718,60.996 139.987,60.711 139.998,54.125C140.004,50.629 139.757,47.111 140.059,43.642C140.457,39.073 138.568,37.373 134.101,37.395C103.319,37.551 72.535,37.595 40.806,37.592M62.997,200.455C62.997,187.472 63.078,174.487 62.886,161.507C62.863,159.996 61.38,157.25 60.476,157.208C52.923,156.859 45.347,157.01 37.87,157.01C37.87,182.364 37.917,206.983 37.817,231.602C37.803,235.205 39.289,236.074 42.623,236.055C62.599,235.939 82.576,236.005 102.552,235.977C103.642,235.975 104.732,235.678 105.997,235.493C105.997,229.703 105.875,224.216 106.048,218.738C106.137,215.898 105.136,214.958 102.315,214.998C93.661,215.12 85.004,215.009 76.348,215.006C62.998,215 62.998,215.006 62.997,200.455Z" style="fill:currentColor;fill-rule:nonzero;"/>
  36. <g transform="matrix(1,0,0,1,91.4761,179.778)">
  37. <text x="0px" y="0px" style="font-family:'Arial-BoldMT', 'Arial', sans-serif;font-weight:700;font-size:110px;fill:currentColor;">D</text>
  38. </g>
  39. </svg>
  40. </a>
  41. <label class="md-header__button md-icon" for="__drawer">
  42. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
  43. </label>
  44. <div class="md-header__title" data-md-component="header-title">
  45. <div class="md-header__ellipsis">
  46. <div class="md-header__topic">
  47. <span class="md-ellipsis">
  48. DunGen
  49. </span>
  50. </div>
  51. <div class="md-header__topic" data-md-component="header-topic">
  52. <span class="md-ellipsis">
  53. Lock & Key System
  54. </span>
  55. </div>
  56. </div>
  57. </div>
  58. </nav>
  59. </header>
  60. <div class="md-container" data-md-component="container">
  61. <main class="md-main" data-md-component="main">
  62. <div class="md-main__inner md-grid">
  63. <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
  64. <div class="md-sidebar__scrollwrap">
  65. <div class="md-sidebar__inner">
  66. <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
  67. <label class="md-nav__title" for="__drawer">
  68. <a href="../index.html" title="DunGen" class="md-nav__button md-logo" aria-label="DunGen" data-md-component="logo">
  69. <svg width="100%" height="100%" viewBox="0 0 258 272" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
  70. <path d="M79,20.998C103.163,20.998 126.827,20.993 150.49,21.002C156.512,21.004 156.994,21.502 157,27.603C157.008,36.435 157.275,45.279 156.89,54.094C156.689,58.68 158.685,61.484 161.849,64.242C170.723,71.978 179.515,79.812 188.188,87.772C190.849,90.214 193.071,93.217 195.28,95.995C199.425,101.209 199.993,100.532 203.73,100.441C209.056,100.311 214.403,100.217 219.713,100.549C222.988,100.754 224.083,99.873 224.059,96.517C223.93,78.354 223.952,60.189 224.044,42.025C224.059,38.949 223.341,37.434 219.868,37.603C214.383,37.872 208.877,37.791 203.381,37.715C199.579,37.663 197.517,38.715 197.907,43.168C198.327,47.964 197.807,52.836 198.065,57.655C198.263,61.366 196.432,62.919 193.348,61.885C188.656,60.311 184.193,58.029 179.724,55.858C179.188,55.598 179.033,54.157 179.028,53.262C178.979,44.43 179.007,35.598 178.995,26.766C178.99,22.857 180.241,20.823 184.822,20.897C200.816,21.158 216.816,20.988 232.814,21.004C239.132,21.01 240.996,22.894 240.998,29.241C241.006,56.07 241.005,82.9 240.998,109.729C240.997,114.795 238.959,117.469 233.922,117.935C228.649,118.423 223.32,118.407 218.015,118.42C208.355,118.444 198.68,117.994 189.04,118.408C184.225,118.615 181.96,116.755 180.231,112.653C175.241,100.811 167.104,91.401 156.54,84.26C153.778,82.394 150.001,81.189 146.67,81.142C126.51,80.86 106.344,81.107 86.182,80.92C81.723,80.878 80.502,82.453 80.517,86.753C80.64,122.394 80.606,158.037 80.499,193.679C80.487,197.764 81.821,199.148 86.047,199.093C103.375,198.866 120.707,198.998 138.038,198.998C159.059,198.998 178.198,184.319 182.849,163.942C184.15,158.243 183.93,152.135 183.91,146.215C183.896,141.846 185.254,139.882 189.885,139.936C204.381,140.105 218.88,139.974 233.378,140.01C238.862,140.024 240.989,142.215 240.993,147.822C241.011,180.317 241.012,212.813 240.992,245.308C240.988,250.939 238.967,252.977 233.218,252.985C205.722,253.022 178.226,253.017 150.73,252.989C145.524,252.983 144.074,251.47 144.001,246.325C143.982,244.992 144.14,243.641 143.973,242.329C143.34,237.341 146.132,235.979 150.411,235.99C160.395,236.016 171.06,236.112 181.183,236.112C181.349,229.59 181.592,223.106 181.957,216.723C182.112,214.015 183.166,213.054 185.926,212.937C199.005,212.385 199.002,212.308 199.002,225.465C199.002,236.846 199.003,236.883 210.211,236.618C214.669,236.512 219.122,236.203 223.998,235.966L223.998,215.809C223.998,197.812 223.911,179.813 224.071,161.817C224.103,158.195 223.211,156.729 219.348,156.922C213.399,157.218 207.424,157 201.518,157C200.995,162.216 201.49,167.296 200.093,171.982C197.761,179.807 196.375,184.335 192.2,189.003C186.463,195.42 180.539,202.401 173.212,206.467C165.218,210.904 155.809,213.982 146.533,214.772C140.003,215.328 133.915,215.112 127.586,214.988C124.239,214.923 122.845,216.06 122.934,219.622C123.145,228.116 123.005,236.618 123.001,245.117C122.998,251.059 121.128,252.977 115.061,252.989C97.897,253.025 80.733,253.002 63.568,253.002C51.404,253.002 39.239,253.028 27.074,252.99C21.11,252.972 19.972,251.911 19.969,246.171C19.952,212.512 20.027,178.852 19.931,145.193C19.92,141.244 21.512,139.936 25.206,139.967C36.037,140.056 46.872,139.868 57.7,140.066C61.659,140.139 62.704,138.654 62.9,134.816C63.079,131.328 63.031,127.859 62.985,124.329C62.92,119.388 61.017,118.259 56.858,118.302C47.864,118.397 38.869,118.381 29.875,118.42C29.044,118.424 28.21,118.569 27.382,118.535C20.483,118.255 19.854,117.626 19.858,110.743C19.874,83.582 19.901,56.422 19.946,29.261C19.957,22.709 21.747,21.005 28.509,21.001C45.173,20.992 61.836,20.998 79,20.998M40.806,37.592C39.579,39.018 37.305,40.427 37.283,41.871C37.009,60.012 37.047,78.158 37.045,96.302C37.045,98.812 38.187,100.243 40.973,100.24C46.626,100.235 52.281,100.327 57.93,100.537C61.815,100.681 63.165,99.043 63.06,95.156C62.832,86.672 62.99,78.177 63.001,69.687C63.01,63.101 65.168,60.989 71.882,60.989C92.36,60.99 112.837,60.999 133.315,60.997C139.718,60.996 139.987,60.711 139.998,54.125C140.004,50.629 139.757,47.111 140.059,43.642C140.457,39.073 138.568,37.373 134.101,37.395C103.319,37.551 72.535,37.595 40.806,37.592M62.997,200.455C62.997,187.472 63.078,174.487 62.886,161.507C62.863,159.996 61.38,157.25 60.476,157.208C52.923,156.859 45.347,157.01 37.87,157.01C37.87,182.364 37.917,206.983 37.817,231.602C37.803,235.205 39.289,236.074 42.623,236.055C62.599,235.939 82.576,236.005 102.552,235.977C103.642,235.975 104.732,235.678 105.997,235.493C105.997,229.703 105.875,224.216 106.048,218.738C106.137,215.898 105.136,214.958 102.315,214.998C93.661,215.12 85.004,215.009 76.348,215.006C62.998,215 62.998,215.006 62.997,200.455Z" style="fill:currentColor;fill-rule:nonzero;"/>
  71. <g transform="matrix(1,0,0,1,91.4761,179.778)">
  72. <text x="0px" y="0px" style="font-family:'Arial-BoldMT', 'Arial', sans-serif;font-weight:700;font-size:110px;fill:currentColor;">D</text>
  73. </g>
  74. </svg>
  75. </a>
  76. DunGen
  77. </label>
  78. <ul class="md-nav__list" data-md-scrollfix>
  79. <li class="md-nav__item">
  80. <a href="../index.html" class="md-nav__link">
  81. <span class="md-ellipsis">
  82. Introduction
  83. </span>
  84. </a>
  85. </li>
  86. <li class="md-nav__item">
  87. <a href="../changelog.html" class="md-nav__link">
  88. <span class="md-ellipsis">
  89. Changelog
  90. </span>
  91. </a>
  92. </li>
  93. <li class="md-nav__item md-nav__item--nested">
  94. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
  95. <div class="md-nav__link md-nav__container">
  96. <a href="../getting-started/index.html" class="md-nav__link ">
  97. <span class="md-ellipsis">
  98. Getting Started
  99. </span>
  100. </a>
  101. <label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="0">
  102. <span class="md-nav__icon md-icon"></span>
  103. </label>
  104. </div>
  105. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
  106. <label class="md-nav__title" for="__nav_3">
  107. <span class="md-nav__icon md-icon"></span>
  108. Getting Started
  109. </label>
  110. <ul class="md-nav__list" data-md-scrollfix>
  111. <li class="md-nav__item">
  112. <a href="../getting-started/1-creating-tiles.html" class="md-nav__link">
  113. <span class="md-ellipsis">
  114. 1. Creating Tiles
  115. </span>
  116. </a>
  117. </li>
  118. <li class="md-nav__item">
  119. <a href="../getting-started/2-doorways.html" class="md-nav__link">
  120. <span class="md-ellipsis">
  121. 2. Doorways
  122. </span>
  123. </a>
  124. </li>
  125. <li class="md-nav__item">
  126. <a href="../getting-started/3-dungeon-flow.html" class="md-nav__link">
  127. <span class="md-ellipsis">
  128. 3. Dungeon Flow Basics
  129. </span>
  130. </a>
  131. </li>
  132. <li class="md-nav__item">
  133. <a href="../getting-started/4-scene-setup.html" class="md-nav__link">
  134. <span class="md-ellipsis">
  135. 4. Scene Setup & First Generation
  136. </span>
  137. </a>
  138. </li>
  139. </ul>
  140. </nav>
  141. </li>
  142. <li class="md-nav__item md-nav__item--nested">
  143. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
  144. <div class="md-nav__link md-nav__container">
  145. <a href="../core-concepts/index.html" class="md-nav__link ">
  146. <span class="md-ellipsis">
  147. Core Concepts
  148. </span>
  149. </a>
  150. <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
  151. <span class="md-nav__icon md-icon"></span>
  152. </label>
  153. </div>
  154. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
  155. <label class="md-nav__title" for="__nav_4">
  156. <span class="md-nav__icon md-icon"></span>
  157. Core Concepts
  158. </label>
  159. <ul class="md-nav__list" data-md-scrollfix>
  160. <li class="md-nav__item">
  161. <a href="../core-concepts/tiles.html" class="md-nav__link">
  162. <span class="md-ellipsis">
  163. Tiles & Tile Component
  164. </span>
  165. </a>
  166. </li>
  167. <li class="md-nav__item">
  168. <a href="../core-concepts/weighting.html" class="md-nav__link">
  169. <span class="md-ellipsis">
  170. Weighting
  171. </span>
  172. </a>
  173. </li>
  174. <li class="md-nav__item">
  175. <a href="../core-concepts/tile-sets.html" class="md-nav__link">
  176. <span class="md-ellipsis">
  177. Tile Sets
  178. </span>
  179. </a>
  180. </li>
  181. <li class="md-nav__item">
  182. <a href="../core-concepts/archetypes.html" class="md-nav__link">
  183. <span class="md-ellipsis">
  184. Archetypes
  185. </span>
  186. </a>
  187. </li>
  188. <li class="md-nav__item">
  189. <a href="../core-concepts/doorways.html" class="md-nav__link">
  190. <span class="md-ellipsis">
  191. Doorways
  192. </span>
  193. </a>
  194. </li>
  195. <li class="md-nav__item">
  196. <a href="../core-concepts/dungeon-flow.html" class="md-nav__link">
  197. <span class="md-ellipsis">
  198. Dungeon Flow Asset
  199. </span>
  200. </a>
  201. </li>
  202. <li class="md-nav__item">
  203. <a href="../core-concepts/flow-editor.html" class="md-nav__link">
  204. <span class="md-ellipsis">
  205. Flow Editor
  206. </span>
  207. </a>
  208. </li>
  209. <li class="md-nav__item">
  210. <a href="../core-concepts/dungeon-generator.html" class="md-nav__link">
  211. <span class="md-ellipsis">
  212. Dungeon Generator
  213. </span>
  214. </a>
  215. </li>
  216. </ul>
  217. </nav>
  218. </li>
  219. <li class="md-nav__item md-nav__item--active md-nav__item--nested">
  220. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
  221. <div class="md-nav__link md-nav__container">
  222. <a href="index.html" class="md-nav__link ">
  223. <span class="md-ellipsis">
  224. Advanced Features
  225. </span>
  226. </a>
  227. <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
  228. <span class="md-nav__icon md-icon"></span>
  229. </label>
  230. </div>
  231. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
  232. <label class="md-nav__title" for="__nav_5">
  233. <span class="md-nav__icon md-icon"></span>
  234. Advanced Features
  235. </label>
  236. <ul class="md-nav__list" data-md-scrollfix>
  237. <li class="md-nav__item">
  238. <a href="props-variety.html" class="md-nav__link">
  239. <span class="md-ellipsis">
  240. Props for Variety
  241. </span>
  242. </a>
  243. </li>
  244. <li class="md-nav__item">
  245. <a href="doors.html" class="md-nav__link">
  246. <span class="md-ellipsis">
  247. Doors
  248. </span>
  249. </a>
  250. </li>
  251. <li class="md-nav__item">
  252. <a href="multiple-floors.html" class="md-nav__link">
  253. <span class="md-ellipsis">
  254. Multiple Floors
  255. </span>
  256. </a>
  257. </li>
  258. <li class="md-nav__item md-nav__item--active">
  259. <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
  260. <label class="md-nav__link md-nav__link--active" for="__toc">
  261. <span class="md-ellipsis">
  262. Lock & Key System
  263. </span>
  264. <span class="md-nav__icon md-icon"></span>
  265. </label>
  266. <a href="lock-key-system.html" class="md-nav__link md-nav__link--active">
  267. <span class="md-ellipsis">
  268. Lock & Key System
  269. </span>
  270. </a>
  271. <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  272. <label class="md-nav__title" for="__toc">
  273. <span class="md-nav__icon md-icon"></span>
  274. Table of contents
  275. </label>
  276. <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
  277. <li class="md-nav__item">
  278. <a href="#1-creating-the-key-manager" class="md-nav__link">
  279. <span class="md-ellipsis">
  280. 1. Creating the Key Manager
  281. </span>
  282. </a>
  283. </li>
  284. <li class="md-nav__item">
  285. <a href="#2-assigning-a-locked-door-prefab" class="md-nav__link">
  286. <span class="md-ellipsis">
  287. 2. Assigning a Locked Door Prefab
  288. </span>
  289. </a>
  290. </li>
  291. <li class="md-nav__item">
  292. <a href="#3-placing-keys-and-locks-dungeon-flow" class="md-nav__link">
  293. <span class="md-ellipsis">
  294. 3. Placing Keys and Locks (Dungeon Flow)
  295. </span>
  296. </a>
  297. <nav class="md-nav" aria-label="3. Placing Keys and Locks (Dungeon Flow)">
  298. <ul class="md-nav__list">
  299. <li class="md-nav__item">
  300. <a href="#assigning-keyslocks" class="md-nav__link">
  301. <span class="md-ellipsis">
  302. Assigning Keys/Locks:
  303. </span>
  304. </a>
  305. </li>
  306. <li class="md-nav__item">
  307. <a href="#placement-differences" class="md-nav__link">
  308. <span class="md-ellipsis">
  309. Placement Differences:
  310. </span>
  311. </a>
  312. </li>
  313. <li class="md-nav__item">
  314. <a href="#node-specific-setting-lock-placement" class="md-nav__link">
  315. <span class="md-ellipsis">
  316. Node-Specific Setting: Lock Placement
  317. </span>
  318. </a>
  319. </li>
  320. <li class="md-nav__item">
  321. <a href="#line-segment-setting-lock-count" class="md-nav__link">
  322. <span class="md-ellipsis">
  323. Line Segment Setting: Lock Count
  324. </span>
  325. </a>
  326. </li>
  327. </ul>
  328. </nav>
  329. </li>
  330. <li class="md-nav__item">
  331. <a href="#4-tying-it-into-our-game-runtime-integration" class="md-nav__link">
  332. <span class="md-ellipsis">
  333. 4. Tying it into our Game (Runtime Integration)
  334. </span>
  335. </a>
  336. <nav class="md-nav" aria-label="4. Tying it into our Game (Runtime Integration)">
  337. <ul class="md-nav__list">
  338. <li class="md-nav__item">
  339. <a href="#ikeyspawner-interface" class="md-nav__link">
  340. <span class="md-ellipsis">
  341. IKeySpawner Interface
  342. </span>
  343. </a>
  344. </li>
  345. <li class="md-nav__item">
  346. <a href="#ikeylock-interface" class="md-nav__link">
  347. <span class="md-ellipsis">
  348. IKeyLock Interface
  349. </span>
  350. </a>
  351. </li>
  352. </ul>
  353. </nav>
  354. </li>
  355. </ul>
  356. </nav>
  357. </li>
  358. <li class="md-nav__item">
  359. <a href="injecting-tiles.html" class="md-nav__link">
  360. <span class="md-ellipsis">
  361. Injecting Special Tiles
  362. </span>
  363. </a>
  364. </li>
  365. <li class="md-nav__item">
  366. <a href="connection-rules.html" class="md-nav__link">
  367. <span class="md-ellipsis">
  368. Tile Connection Rules
  369. </span>
  370. </a>
  371. </li>
  372. <li class="md-nav__item">
  373. <a href="attached-dungeons.html" class="md-nav__link">
  374. <span class="md-ellipsis">
  375. Generating Attached Dungeons
  376. </span>
  377. </a>
  378. </li>
  379. <li class="md-nav__item">
  380. <a href="additional-collisions.html" class="md-nav__link">
  381. <span class="md-ellipsis">
  382. Avoid Collisions With the Scene
  383. </span>
  384. </a>
  385. </li>
  386. <li class="md-nav__item">
  387. <a href="runtime-events.html" class="md-nav__link">
  388. <span class="md-ellipsis">
  389. Runtime Events & Code Execution
  390. </span>
  391. </a>
  392. </li>
  393. <li class="md-nav__item">
  394. <a href="post-processing.html" class="md-nav__link">
  395. <span class="md-ellipsis">
  396. Custom Post-Processing
  397. </span>
  398. </a>
  399. </li>
  400. <li class="md-nav__item">
  401. <a href="character-component.html" class="md-nav__link">
  402. <span class="md-ellipsis">
  403. DunGen Character Component
  404. </span>
  405. </a>
  406. </li>
  407. </ul>
  408. </nav>
  409. </li>
  410. <li class="md-nav__item md-nav__item--nested">
  411. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
  412. <div class="md-nav__link md-nav__container">
  413. <a href="../optimization/index.html" class="md-nav__link ">
  414. <span class="md-ellipsis">
  415. Optimization
  416. </span>
  417. </a>
  418. <label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="0">
  419. <span class="md-nav__icon md-icon"></span>
  420. </label>
  421. </div>
  422. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
  423. <label class="md-nav__title" for="__nav_6">
  424. <span class="md-nav__icon md-icon"></span>
  425. Optimization
  426. </label>
  427. <ul class="md-nav__list" data-md-scrollfix>
  428. <li class="md-nav__item">
  429. <a href="../optimization/culling.html" class="md-nav__link">
  430. <span class="md-ellipsis">
  431. Built-in Culling
  432. </span>
  433. </a>
  434. </li>
  435. <li class="md-nav__item">
  436. <a href="../optimization/tile-pooling.html" class="md-nav__link">
  437. <span class="md-ellipsis">
  438. Tile Pooling
  439. </span>
  440. </a>
  441. </li>
  442. </ul>
  443. </nav>
  444. </li>
  445. <li class="md-nav__item md-nav__item--nested">
  446. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" >
  447. <div class="md-nav__link md-nav__container">
  448. <a href="../pathfinding/index.html" class="md-nav__link ">
  449. <span class="md-ellipsis">
  450. Pathfinding
  451. </span>
  452. </a>
  453. <label class="md-nav__link " for="__nav_7" id="__nav_7_label" tabindex="0">
  454. <span class="md-nav__icon md-icon"></span>
  455. </label>
  456. </div>
  457. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
  458. <label class="md-nav__title" for="__nav_7">
  459. <span class="md-nav__icon md-icon"></span>
  460. Pathfinding
  461. </label>
  462. <ul class="md-nav__list" data-md-scrollfix>
  463. <li class="md-nav__item">
  464. <a href="../pathfinding/unity-navmesh.html" class="md-nav__link">
  465. <span class="md-ellipsis">
  466. Unity NavMesh Components
  467. </span>
  468. </a>
  469. </li>
  470. <li class="md-nav__item">
  471. <a href="../pathfinding/astar-pathfinding.html" class="md-nav__link">
  472. <span class="md-ellipsis">
  473. A* Pathfinding Project Pro
  474. </span>
  475. </a>
  476. </li>
  477. <li class="md-nav__item">
  478. <a href="../pathfinding/custom-adapters.html" class="md-nav__link">
  479. <span class="md-ellipsis">
  480. Custom Adapters
  481. </span>
  482. </a>
  483. </li>
  484. </ul>
  485. </nav>
  486. </li>
  487. <li class="md-nav__item md-nav__item--nested">
  488. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
  489. <div class="md-nav__link md-nav__container">
  490. <a href="../integrations/index.html" class="md-nav__link ">
  491. <span class="md-ellipsis">
  492. Integrations
  493. </span>
  494. </a>
  495. <label class="md-nav__link " for="__nav_8" id="__nav_8_label" tabindex="0">
  496. <span class="md-nav__icon md-icon"></span>
  497. </label>
  498. </div>
  499. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
  500. <label class="md-nav__title" for="__nav_8">
  501. <span class="md-nav__icon md-icon"></span>
  502. Integrations
  503. </label>
  504. <ul class="md-nav__list" data-md-scrollfix>
  505. <li class="md-nav__item">
  506. <a href="../integrations/sectr.html" class="md-nav__link">
  507. <span class="md-ellipsis">
  508. SECTR Portal Culling
  509. </span>
  510. </a>
  511. </li>
  512. <li class="md-nav__item">
  513. <a href="../integrations/playmaker.html" class="md-nav__link">
  514. <span class="md-ellipsis">
  515. PlayMaker Actions
  516. </span>
  517. </a>
  518. </li>
  519. </ul>
  520. </nav>
  521. </li>
  522. <li class="md-nav__item md-nav__item--nested">
  523. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" >
  524. <div class="md-nav__link md-nav__container">
  525. <a href="../troubleshooting/index.html" class="md-nav__link ">
  526. <span class="md-ellipsis">
  527. Troubleshooting
  528. </span>
  529. </a>
  530. <label class="md-nav__link " for="__nav_9" id="__nav_9_label" tabindex="0">
  531. <span class="md-nav__icon md-icon"></span>
  532. </label>
  533. </div>
  534. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
  535. <label class="md-nav__title" for="__nav_9">
  536. <span class="md-nav__icon md-icon"></span>
  537. Troubleshooting
  538. </label>
  539. <ul class="md-nav__list" data-md-scrollfix>
  540. <li class="md-nav__item">
  541. <a href="../troubleshooting/limitations.html" class="md-nav__link">
  542. <span class="md-ellipsis">
  543. Limitations & Considerations
  544. </span>
  545. </a>
  546. </li>
  547. <li class="md-nav__item">
  548. <a href="../troubleshooting/analysis.html" class="md-nav__link">
  549. <span class="md-ellipsis">
  550. Analysis
  551. </span>
  552. </a>
  553. </li>
  554. </ul>
  555. </nav>
  556. </li>
  557. <li class="md-nav__item md-nav__item--nested">
  558. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_10" >
  559. <label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
  560. <span class="md-ellipsis">
  561. Reference
  562. </span>
  563. <span class="md-nav__icon md-icon"></span>
  564. </label>
  565. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
  566. <label class="md-nav__title" for="__nav_10">
  567. <span class="md-nav__icon md-icon"></span>
  568. Reference
  569. </label>
  570. <ul class="md-nav__list" data-md-scrollfix>
  571. <li class="md-nav__item">
  572. <a href="../reference/faq.html" class="md-nav__link">
  573. <span class="md-ellipsis">
  574. FAQ
  575. </span>
  576. </a>
  577. </li>
  578. <li class="md-nav__item">
  579. <a href="../reference/cookbook.html" class="md-nav__link">
  580. <span class="md-ellipsis">
  581. Cookbook
  582. </span>
  583. </a>
  584. </li>
  585. </ul>
  586. </nav>
  587. </li>
  588. </ul>
  589. </nav>
  590. </div>
  591. </div>
  592. </div>
  593. <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
  594. <div class="md-sidebar__scrollwrap">
  595. <div class="md-sidebar__inner">
  596. <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  597. <label class="md-nav__title" for="__toc">
  598. <span class="md-nav__icon md-icon"></span>
  599. Table of contents
  600. </label>
  601. <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
  602. <li class="md-nav__item">
  603. <a href="#1-creating-the-key-manager" class="md-nav__link">
  604. <span class="md-ellipsis">
  605. 1. Creating the Key Manager
  606. </span>
  607. </a>
  608. </li>
  609. <li class="md-nav__item">
  610. <a href="#2-assigning-a-locked-door-prefab" class="md-nav__link">
  611. <span class="md-ellipsis">
  612. 2. Assigning a Locked Door Prefab
  613. </span>
  614. </a>
  615. </li>
  616. <li class="md-nav__item">
  617. <a href="#3-placing-keys-and-locks-dungeon-flow" class="md-nav__link">
  618. <span class="md-ellipsis">
  619. 3. Placing Keys and Locks (Dungeon Flow)
  620. </span>
  621. </a>
  622. <nav class="md-nav" aria-label="3. Placing Keys and Locks (Dungeon Flow)">
  623. <ul class="md-nav__list">
  624. <li class="md-nav__item">
  625. <a href="#assigning-keyslocks" class="md-nav__link">
  626. <span class="md-ellipsis">
  627. Assigning Keys/Locks:
  628. </span>
  629. </a>
  630. </li>
  631. <li class="md-nav__item">
  632. <a href="#placement-differences" class="md-nav__link">
  633. <span class="md-ellipsis">
  634. Placement Differences:
  635. </span>
  636. </a>
  637. </li>
  638. <li class="md-nav__item">
  639. <a href="#node-specific-setting-lock-placement" class="md-nav__link">
  640. <span class="md-ellipsis">
  641. Node-Specific Setting: Lock Placement
  642. </span>
  643. </a>
  644. </li>
  645. <li class="md-nav__item">
  646. <a href="#line-segment-setting-lock-count" class="md-nav__link">
  647. <span class="md-ellipsis">
  648. Line Segment Setting: Lock Count
  649. </span>
  650. </a>
  651. </li>
  652. </ul>
  653. </nav>
  654. </li>
  655. <li class="md-nav__item">
  656. <a href="#4-tying-it-into-our-game-runtime-integration" class="md-nav__link">
  657. <span class="md-ellipsis">
  658. 4. Tying it into our Game (Runtime Integration)
  659. </span>
  660. </a>
  661. <nav class="md-nav" aria-label="4. Tying it into our Game (Runtime Integration)">
  662. <ul class="md-nav__list">
  663. <li class="md-nav__item">
  664. <a href="#ikeyspawner-interface" class="md-nav__link">
  665. <span class="md-ellipsis">
  666. IKeySpawner Interface
  667. </span>
  668. </a>
  669. </li>
  670. <li class="md-nav__item">
  671. <a href="#ikeylock-interface" class="md-nav__link">
  672. <span class="md-ellipsis">
  673. IKeyLock Interface
  674. </span>
  675. </a>
  676. </li>
  677. </ul>
  678. </nav>
  679. </li>
  680. </ul>
  681. </nav>
  682. </div>
  683. </div>
  684. </div>
  685. <div class="md-content" data-md-component="content">
  686. <article class="md-content__inner md-typeset">
  687. <h1 id="advanced-features-lock-key-system">Advanced Features: Lock &amp; Key System</h1>
  688. <p>DunGen includes a robust system for procedurally placing locked doors and their corresponding keys within your dungeon layouts. This allows you to create progression gates, control access to specific areas (like boss rooms), and add another layer of dynamic gameplay.</p>
  689. <p>Implementing the Lock &amp; Key system involves configuration across several assets and requires some C# scripting to integrate the key pickup and door unlocking logic into your actual game mechanics.</p>
  690. <p><strong>The Core Components:</strong></p>
  691. <ol>
  692. <li><strong>Key Manager Asset:</strong> Defines the different types of keys available in your dungeon.</li>
  693. <li><strong>Tile Set Asset:</strong> Specifies which prefabs to use for locked doors.</li>
  694. <li><strong>Dungeon Flow Asset:</strong> Determines where locks and keys should be placed within the dungeon structure.</li>
  695. <li><strong>Runtime Interfaces (<code>IKeySpawner</code>, <code>IKeyLock</code>):</strong> C# interfaces you implement to tell DunGen <em>how</em> to spawn key objects and <em>notify</em> your prefabs when they are assigned a specific key type.</li>
  696. </ol>
  697. <hr />
  698. <h2 id="1-creating-the-key-manager">1. Creating the Key Manager</h2>
  699. <p>First, you need to define the types of keys your dungeon can use.</p>
  700. <ol>
  701. <li>Create a <strong>Key Manager</strong> asset: Right-click in Project view &gt; <code>Create &gt; DunGen &gt; Key Manager</code>.</li>
  702. <li>Select the asset. In the Inspector, click <strong>"Add New Key"</strong> for each distinct key type you need (e.g., Red Key, Blue Key, Boss Key).</li>
  703. <li>Configure each Key Type:<ul>
  704. <li><strong>Name:</strong> A human-readable name (e.g., "Red Skeleton Key"). Used for identification, potentially in UI.</li>
  705. <li><strong>Prefab:</strong> (Optional) A prefab representing the key visually in the scene (e.g., a collectible key model). DunGen will tell your code <em>which</em> prefab to potentially spawn via the <code>IKeySpawner</code> interface.</li>
  706. <li><strong>Colour:</strong> (Optional) A color used for visual debugging in the editor and potentially for color-coding locks and keys in your game via the <code>IKeyLock</code> interface.</li>
  707. </ul>
  708. <div class="admonition note">
  709. <p class="admonition-title">Note</p>
  710. <p>These properties (Prefab, Colour) are conveniences. Whether you use them depends entirely on how you implement the runtime interfaces later.</p>
  711. </div>
  712. </li>
  713. <li><strong>Link to Dungeon Flow:</strong> You must assign this Key Manager asset to the <strong><code>Key Manager</code></strong> field in your <a href="../core-concepts/dungeon-flow.html">Dungeon Flow asset</a> so DunGen knows which keys are available for that flow.</li>
  714. </ol>
  715. <hr />
  716. <h2 id="2-assigning-a-locked-door-prefab">2. Assigning a Locked Door Prefab</h2>
  717. <p>Next, tell DunGen which prefab(s) represent a locked door. This is done <em>per Tile Set</em>.</p>
  718. <ol>
  719. <li>Select a <a href="../core-concepts/tile-sets.html">Tile Set asset</a> that contains tiles where locked doors might appear.</li>
  720. <li>In the Inspector, find the <strong>"Locked Door Prefabs"</strong> section.</li>
  721. <li>Click <strong>"Add"</strong> to create an entry for a specific <a href="../core-concepts/doorways.html#doorway-sockets">Doorway Socket</a>. Choose the relevant socket from the dropdown (e.g., "Default").<ul>
  722. <li>This means <em>when a lock is placed</em> on a connection using this socket type, and involving a tile from this Tile Set, DunGen will look here for the prefab to use.</li>
  723. </ul>
  724. </li>
  725. <li>Within that socket entry, click <strong>"Add New Prefab"</strong> and drag your locked door prefab(s) into the slot(s).</li>
  726. <li>Configure <strong>Weights</strong> if you add multiple locked door prefabs for the <em>same</em> socket type. The weights determine the likelihood of each prefab being chosen when that type of locked door is needed.</li>
  727. </ol>
  728. <hr />
  729. <h2 id="3-placing-keys-and-locks-dungeon-flow">3. Placing Keys and Locks (Dungeon Flow)</h2>
  730. <p>Now, define <em>where</em> in the dungeon structure keys and locks should appear. This is configured in the <a href="../core-concepts/flow-editor.html">Dungeon Flow editor</a>.</p>
  731. <ol>
  732. <li>Select your <a href="../core-concepts/dungeon-flow.html">Dungeon Flow asset</a> and click <strong>"Open Flow Editor"</strong>.</li>
  733. <li>Select a <strong>Node</strong> or a <strong>Line Segment</strong> in the graph.</li>
  734. <li>In the Inspector, you'll find <strong><code>Keys</code></strong> and <strong><code>Locks</code></strong> lists.</li>
  735. </ol>
  736. <h3 id="assigning-keyslocks">Assigning Keys/Locks:</h3>
  737. <ul>
  738. <li>Click <strong>"Add"</strong> under the <code>Keys</code> or <code>Locks</code> list.</li>
  739. <li>Select the desired <strong>Key Type</strong> (defined in your Key Manager) from the dropdown.</li>
  740. </ul>
  741. <h3 id="placement-differences">Placement Differences:</h3>
  742. <ul>
  743. <li><strong>Nodes:</strong> Keys/Locks assigned here will be placed <em>specifically within the single tile</em> generated by that node.</li>
  744. <li><strong>Line Segments:</strong> Keys/Locks assigned here will be placed <em>randomly somewhere along the sequence of tiles</em> generated by that line segment.</li>
  745. </ul>
  746. <h3 id="node-specific-setting-lock-placement">Node-Specific Setting: <code>Lock Placement</code></h3>
  747. <ul>
  748. <li>When assigning a <strong>Lock</strong> to a <strong>Node</strong>, you get an extra <code>Lock Placement</code> option:<ul>
  749. <li><code>Entrance</code>: The locked door will <em>only</em> be placed on the doorway the player enters the node's tile through. Essential for boss rooms or requiring a key found earlier to enter a specific tile.</li>
  750. <li><code>Exit</code>: The locked door will <em>only</em> be placed on the doorway used to exit the node's tile.</li>
  751. <li><code>Any</code>: The locked door can be placed on any doorway connected to the node's tile.</li>
  752. </ul>
  753. </li>
  754. </ul>
  755. <h3 id="line-segment-setting-lock-count">Line Segment Setting: Lock <code>Count</code></h3>
  756. <ul>
  757. <li>When assigning a <strong>Lock</strong> to a <strong>Line Segment</strong>, you can specify a <code>Count</code> (Min/Max) for how many instances of that lock type should appear within that segment.</li>
  758. </ul>
  759. <div class="admonition note">
  760. <p class="admonition-title">Solvability Guarantee</p>
  761. <p>DunGen's logic ensures dungeons are always completable regarding locks and keys:</p>
  762. <ol>
  763. <li>It places <strong>Locks</strong> first based on your Flow configuration.</li>
  764. <li>It then determines where the corresponding <strong>Keys</strong> <em>must</em> be placed.</li>
  765. <li>It guarantees that keys are placed in locations accessible <em>before</em> their corresponding locks are encountered along the main path. It uses the potential key locations you assigned in the Flow Editor to find valid spots.</li>
  766. </ol>
  767. </div>
  768. <hr />
  769. <h2 id="4-tying-it-into-our-game-runtime-integration">4. Tying it into our Game (Runtime Integration)</h2>
  770. <p>DunGen handles the <em>placement</em> logic, but it needs your C# code to handle the <em>game-specific actions</em> of spawning key objects and reacting to lock/key assignments. This is done by implementing two interfaces:</p>
  771. <h3 id="ikeyspawner-interface"><code>IKeySpawner</code> Interface</h3>
  772. <ul>
  773. <li><strong>Purpose:</strong> Implement this interface on a component to tell DunGen <em>how</em> and <em>where</em> a key object should actually appear in the game.</li>
  774. <li><strong>Method:</strong> <code>void SpawnKey(KeySpawnParameters keySpawnParameters);</code></li>
  775. <li><strong>Workflow:</strong><ol>
  776. <li>When DunGen decides a specific <code>Key</code> needs to be placed at a location defined in the Dungeon Flow (Node or Line Segment).</li>
  777. <li>It searches for GameObjects at valid positions within the target Tile(s).</li>
  778. <li>It finds components on those GameObjects that implement <code>IKeySpawner</code>.</li>
  779. <li>It randomly selects one of these components.</li>
  780. <li>It calls the <code>SpawnKey</code> method on the selected component, passing information about the specific <code>Key</code> type.</li>
  781. </ol>
  782. </li>
  783. <li>
  784. <p><strong>Implementation Examples:</strong></p>
  785. <ul>
  786. <li><strong>Spawn Prefab:</strong> Your <code>SpawnKey</code> method could instantiate the <code>key.Prefab</code> at the component's position (like the demo scene's <code>KeySpawnPoint</code> script).</li>
  787. <li><strong>Add to Inventory:</strong> Your <code>SpawnKey</code> method on an enemy's script could add the <code>key</code> to that enemy's drop loot table.</li>
  788. <li><strong>Place in Chest:</strong> Your <code>SpawnKey</code> method on a chest script could add the <code>key</code> to the chest's contents.</li>
  789. </ul>
  790. <div class="language-C# highlight"><span class="filename">KeySpawnPoint.cs</span><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="k">using</span><span class="w"> </span><span class="nn">UnityEngine</span><span class="p">;</span>
  791. </span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="k">using</span><span class="w"> </span><span class="nn">DunGen</span><span class="p">;</span>
  792. </span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="k">using</span><span class="w"> </span><span class="nn">DunGen.LockAndKey</span><span class="p">;</span>
  793. </span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
  794. </span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">KeySpawnPoint</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">MonoBehaviour</span><span class="p">,</span><span class="w"> </span><span class="n">IKeySpawner</span>
  795. </span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="p">{</span>
  796. </span><span id="__span-0-7"><a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="w"> </span><span class="c1">// Check if the key has already been spawned</span>
  797. </span><span id="__span-0-8"><a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">HasSpawnedKey</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">spawnedKey</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">;</span>
  798. </span><span id="__span-0-9"><a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>
  799. </span><span id="__span-0-10"><a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="n">GameObject</span><span class="w"> </span><span class="n">spawnedKey</span><span class="p">;</span>
  800. </span><span id="__span-0-11"><a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a>
  801. </span><span id="__span-0-12"><a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>
  802. </span><span id="__span-0-13"><a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">CanSpawnKey</span><span class="p">(</span><span class="n">KeyManager</span><span class="w"> </span><span class="n">keyManager</span><span class="p">,</span><span class="w"> </span><span class="n">Key</span><span class="w"> </span><span class="n">key</span><span class="p">)</span>
  803. </span><span id="__span-0-14"><a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a><span class="w"> </span><span class="p">{</span>
  804. </span><span id="__span-0-15"><a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a><span class="w"> </span><span class="c1">// We can&#39;t spawn a key if one has already been spawned</span>
  805. </span><span id="__span-0-16"><a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">HasSpawnedKey</span><span class="p">)</span>
  806. </span><span id="__span-0-17"><a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">false</span><span class="p">;</span>
  807. </span><span id="__span-0-18"><a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a>
  808. </span><span id="__span-0-19"><a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a><span class="w"> </span><span class="c1">// We can&#39;t spawn a key if it has no prefab</span>
  809. </span><span id="__span-0-20"><a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="p">.</span><span class="n">Prefab</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">;</span>
  810. </span><span id="__span-0-21"><a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a><span class="w"> </span><span class="p">}</span>
  811. </span><span id="__span-0-22"><a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a>
  812. </span><span id="__span-0-23"><a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">SpawnKey</span><span class="p">(</span><span class="n">KeySpawnParameters</span><span class="w"> </span><span class="n">keySpawnParameters</span><span class="p">)</span>
  813. </span><span id="__span-0-24"><a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a><span class="w"> </span><span class="p">{</span>
  814. </span><span id="__span-0-25"><a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">keySpawnParameters</span><span class="p">.</span><span class="n">Key</span><span class="p">;</span>
  815. </span><span id="__span-0-26"><a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a>
  816. </span><span id="__span-0-27"><a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">keySpawnParameters</span><span class="p">.</span><span class="n">Key</span><span class="p">.</span><span class="n">Prefab</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span>
  817. </span><span id="__span-0-28"><a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a><span class="w"> </span><span class="p">{</span>
  818. </span><span id="__span-0-29"><a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a><span class="w"> </span><span class="n">Debug</span><span class="p">.</span><span class="n">LogWarning</span><span class="p">(</span><span class="s">$&quot;Key &#39;{key.Name}&#39; needs to be spawned here, but has no Prefab assigned in the Key Manager.&quot;</span><span class="p">,</span><span class="w"> </span><span class="k">this</span><span class="p">);</span>
  819. </span><span id="__span-0-30"><a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
  820. </span><span id="__span-0-31"><a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a><span class="w"> </span><span class="p">}</span>
  821. </span><span id="__span-0-32"><a id="__codelineno-0-32" name="__codelineno-0-32" href="#__codelineno-0-32"></a>
  822. </span><span id="__span-0-33"><a id="__codelineno-0-33" name="__codelineno-0-33" href="#__codelineno-0-33"></a><span class="w"> </span><span class="c1">// Instantiate the key prefab defined in the Key Manager</span>
  823. </span><span id="__span-0-34"><a id="__codelineno-0-34" name="__codelineno-0-34" href="#__codelineno-0-34"></a><span class="w"> </span><span class="n">spawnedKey</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Instantiate</span><span class="p">(</span><span class="n">key</span><span class="p">.</span><span class="n">Prefab</span><span class="p">,</span><span class="w"> </span><span class="n">transform</span><span class="p">.</span><span class="n">position</span><span class="p">,</span><span class="w"> </span><span class="n">transform</span><span class="p">.</span><span class="n">rotation</span><span class="p">);</span>
  824. </span><span id="__span-0-35"><a id="__codelineno-0-35" name="__codelineno-0-35" href="#__codelineno-0-35"></a>
  825. </span><span id="__span-0-36"><a id="__codelineno-0-36" name="__codelineno-0-36" href="#__codelineno-0-36"></a><span class="w"> </span><span class="c1">// Notify the DunGen about any IKeyLock components that were created</span>
  826. </span><span id="__span-0-37"><a id="__codelineno-0-37" name="__codelineno-0-37" href="#__codelineno-0-37"></a><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">keyLockComponents</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">spawnedKey</span><span class="p">.</span><span class="n">GetComponentsInChildren</span><span class="o">&lt;</span><span class="n">IKeyLock</span><span class="o">&gt;</span><span class="p">();</span>
  827. </span><span id="__span-0-38"><a id="__codelineno-0-38" name="__codelineno-0-38" href="#__codelineno-0-38"></a><span class="w"> </span><span class="n">keySpawnParameters</span><span class="p">.</span><span class="n">OutputSpawnedKeys</span><span class="p">.</span><span class="n">AddRange</span><span class="p">(</span><span class="n">keyLockComponents</span><span class="p">);</span>
  828. </span><span id="__span-0-39"><a id="__codelineno-0-39" name="__codelineno-0-39" href="#__codelineno-0-39"></a><span class="w"> </span><span class="p">}</span>
  829. </span><span id="__span-0-40"><a id="__codelineno-0-40" name="__codelineno-0-40" href="#__codelineno-0-40"></a><span class="p">}</span>
  830. </span></code></pre></div>
  831. </li>
  832. </ul>
  833. <div class="admonition note">
  834. <p class="admonition-title">Props &amp; Keys Timing</p>
  835. <p>Props (Local, Random, Global) are processed <em>before</em> the Lock &amp; Key system runs. This means if you have a chest placed as a random prop, DunGen can correctly identify it later as a potential spawn location for a key if the chest's script implements <code>IKeySpawner</code>.</p>
  836. </div>
  837. <h3 id="ikeylock-interface"><code>IKeyLock</code> Interface</h3>
  838. <ul>
  839. <li><strong>Purpose:</strong> Implement this interface on components within your <strong>Locked Door prefabs</strong> and your <strong>Key prefabs</strong> to be notified <em>which specific Key type</em> has been assigned to them.</li>
  840. <li><strong>Method:</strong> <code>void OnKeyAssigned(Key key, KeyManager manager);</code></li>
  841. <li><strong>Workflow:</strong><ol>
  842. <li>When DunGen places a <strong>locked door prefab</strong>, it calls <code>OnKeyAssigned</code> on all components implementing <code>IKeyLock</code> within that prefab's hierarchy, passing the assigned <code>Key</code>.</li>
  843. <li>When DunGen tells your <code>IKeySpawner</code> to spawn a key and you (optionally) return a list of spawned <code>IKeyLock</code> back to DunGen. <code>OnKeyAssigned</code> will be called automatically on all of these components.</li>
  844. </ol>
  845. </li>
  846. <li>
  847. <p><strong>Implementation Examples:</strong></p>
  848. <ul>
  849. <li><strong>Visual Feedback:</strong> Change the color of a mesh renderer on the lock/key based on <code>key.Colour</code> (like the demo scene's <code>KeyColour</code> script).</li>
  850. <li><strong>Store Key Info:</strong> Store the required <code>Key</code> object on the locked door script so you know what key the player needs when they interact with it.</li>
  851. <li><strong>Initialize Key Object:</strong> Set up properties on the collectible key script based on the assigned <code>Key</code> type.</li>
  852. </ul>
  853. <div class="language-C# highlight"><span class="filename">KeyColour.cs</span><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="k">using</span><span class="w"> </span><span class="nn">UnityEngine</span><span class="p">;</span>
  854. </span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="k">using</span><span class="w"> </span><span class="nn">DunGen</span><span class="p">;</span>
  855. </span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>
  856. </span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">KeyColour</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">MonoBehaviour</span><span class="p">,</span><span class="w"> </span><span class="n">IKeyLock</span>
  857. </span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="p">{</span>
  858. </span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="c1">// Assign in Inspector</span>
  859. </span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Renderer</span><span class="w"> </span><span class="n">TargetRenderer</span><span class="p">;</span>
  860. </span><span id="__span-1-8"><a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a>
  861. </span><span id="__span-1-9"><a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="w"> </span><span class="c1">// Used to change material properties without leaking material instances into the scene</span>
  862. </span><span id="__span-1-10"><a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="n">MaterialPropertyBlock</span><span class="w"> </span><span class="n">propertyBlock</span><span class="p">;</span>
  863. </span><span id="__span-1-11"><a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a>
  864. </span><span id="__span-1-12"><a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a>
  865. </span><span id="__span-1-13"><a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">OnKeyAssigned</span><span class="p">(</span><span class="n">Key</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">KeyManager</span><span class="w"> </span><span class="n">manager</span><span class="p">)</span>
  866. </span><span id="__span-1-14"><a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="w"> </span><span class="p">{</span>
  867. </span><span id="__span-1-15"><a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">TargetRenderer</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span>
  868. </span><span id="__span-1-16"><a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a><span class="w"> </span><span class="p">{</span>
  869. </span><span id="__span-1-17"><a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">propertyBlock</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span>
  870. </span><span id="__span-1-18"><a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a><span class="w"> </span><span class="n">propertyBlock</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">MaterialPropertyBlock</span><span class="p">();</span>
  871. </span><span id="__span-1-19"><a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a>
  872. </span><span id="__span-1-20"><a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a><span class="w"> </span><span class="c1">// Use the color defined in the Key Manager</span>
  873. </span><span id="__span-1-21"><a id="__codelineno-1-21" name="__codelineno-1-21" href="#__codelineno-1-21"></a><span class="w"> </span><span class="n">propertyBlock</span><span class="p">.</span><span class="n">SetColor</span><span class="p">(</span><span class="s">&quot;_Color&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">.</span><span class="n">Colour</span><span class="p">);</span>
  874. </span><span id="__span-1-22"><a id="__codelineno-1-22" name="__codelineno-1-22" href="#__codelineno-1-22"></a><span class="w"> </span><span class="n">TargetRenderer</span><span class="p">.</span><span class="n">SetPropertyBlock</span><span class="p">(</span><span class="n">propertyBlock</span><span class="p">);</span>
  875. </span><span id="__span-1-23"><a id="__codelineno-1-23" name="__codelineno-1-23" href="#__codelineno-1-23"></a><span class="w"> </span><span class="p">}</span>
  876. </span><span id="__span-1-24"><a id="__codelineno-1-24" name="__codelineno-1-24" href="#__codelineno-1-24"></a><span class="w"> </span><span class="p">}</span>
  877. </span><span id="__span-1-25"><a id="__codelineno-1-25" name="__codelineno-1-25" href="#__codelineno-1-25"></a><span class="p">}</span>
  878. </span></code></pre></div>
  879. </li>
  880. </ul>
  881. <p>By combining asset configuration with these runtime interfaces, you can create complex and solvable lock and key puzzles within your procedurally generated DunGen levels. Remember that the actual player interaction logic (detecting key pickup, checking inventory, triggering door unlocks) needs to be implemented in your own game systems.</p>
  882. </article>
  883. </div>
  884. <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
  885. <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
  886. </div>
  887. <button type="button" class="md-top md-icon" data-md-component="top" hidden>
  888. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
  889. Back to top
  890. </button>
  891. </main>
  892. <footer class="md-footer">
  893. <nav class="md-footer__inner md-grid" aria-label="Footer" >
  894. <a href="multiple-floors.html" class="md-footer__link md-footer__link--prev" aria-label="Previous: Multiple Floors">
  895. <div class="md-footer__button md-icon">
  896. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
  897. </div>
  898. <div class="md-footer__title">
  899. <span class="md-footer__direction">
  900. Previous
  901. </span>
  902. <div class="md-ellipsis">
  903. Multiple Floors
  904. </div>
  905. </div>
  906. </a>
  907. <a href="injecting-tiles.html" class="md-footer__link md-footer__link--next" aria-label="Next: Injecting Special Tiles">
  908. <div class="md-footer__title">
  909. <span class="md-footer__direction">
  910. Next
  911. </span>
  912. <div class="md-ellipsis">
  913. Injecting Special Tiles
  914. </div>
  915. </div>
  916. <div class="md-footer__button md-icon">
  917. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
  918. </div>
  919. </a>
  920. </nav>
  921. <div class="md-footer-meta md-typeset">
  922. <div class="md-footer-meta__inner md-grid">
  923. <div class="md-copyright">
  924. <div class="md-copyright__highlight">
  925. Copyright &copy; Aegon Games Ltd.
  926. </div>
  927. Made with
  928. <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
  929. Material for MkDocs
  930. </a>
  931. </div>
  932. </div>
  933. </div>
  934. </footer>
  935. </div>
  936. <div class="md-dialog" data-md-component="dialog">
  937. <div class="md-dialog__inner md-typeset"></div>
  938. </div>
  939. <script id="__config" type="application/json">{"base": "..", "features": ["content.code.annotate", "content.code.copy", "content.tabs.link", "announce.dismiss", "header.autohide", "navigation.footer", "navigation.indexes", "navigation.top", "navigation.tracking"], "search": "../assets/javascripts/workers/search.f8cc74c7.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
  940. <script src="../assets/javascripts/bundle.c8b220af.min.js"></script>
  941. </body>
  942. </html>