<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://www.lets-role.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Neo-Teyrall</id>
	<title>Wiki Let&#039;s Role - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://www.lets-role.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Neo-Teyrall"/>
	<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php/Sp%C3%A9cial:Contributions/Neo-Teyrall"/>
	<updated>2026-05-25T03:43:50Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fork&amp;diff=120</id>
		<title>Fork</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fork&amp;diff=120"/>
		<updated>2026-04-30T09:48:13Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : premier jet sur ls fork&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Most systems available on Let’s Roll are created by the community, for the community.&lt;br /&gt;
&lt;br /&gt;
In this spirit, users are encouraged to copy existing systems in order to:&lt;br /&gt;
&lt;br /&gt;
* get inspiration,&lt;br /&gt;
* create a modified version,&lt;br /&gt;
* or add custom rules for a specific campaign.&lt;br /&gt;
&lt;br /&gt;
This copying mechanism is called a &#039;&#039;&#039;fork&#039;&#039;&#039;, and it is fully automated by Let’s Roll.&lt;br /&gt;
&lt;br /&gt;
=== How to Fork a System ===&lt;br /&gt;
Follow these steps to copy an existing system:&lt;br /&gt;
&lt;br /&gt;
# Go to the &#039;&#039;&#039;Store&#039;&#039;&#039;.&lt;br /&gt;
# Find and select the system you want to copy.&lt;br /&gt;
# Open the system’s page.&lt;br /&gt;
# Click on the &#039;&#039;&#039;Fork&#039;&#039;&#039; tab.&lt;br /&gt;
# Click the &#039;&#039;&#039;Fork&#039;&#039;&#039; button to create your copy.&lt;br /&gt;
&lt;br /&gt;
Once the fork is complete:&lt;br /&gt;
&lt;br /&gt;
* The system is copied into your &#039;&#039;&#039;System Builder&#039;&#039;&#039;.&lt;br /&gt;
* You can freely edit and customize it.&lt;br /&gt;
* The original system remains unchanged.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Progress_bar&amp;diff=121</id>
		<title>Progress bar</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Progress_bar&amp;diff=121"/>
		<updated>2026-04-30T09:11:58Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout d’une systeme example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
A progress bar is a visual element that can be used to display, in a more playful way, the number of hit points, mana, or any other resource of your character sheet.&lt;br /&gt;
&lt;br /&gt;
There are several methods to build a progress bar. In this page, we’ll cover &#039;&#039;&#039;four different approaches&#039;&#039;&#039;, each with its own advantages and disadvantages.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Dynamic Progress Bar ==&lt;br /&gt;
Let’s start with the simplest method. The &#039;&#039;&#039;dynamic progress bar&#039;&#039;&#039; makes it easy to manage large ranges of values and is highly customizable, since its appearance can be modified in just a few clicks.&lt;br /&gt;
&lt;br /&gt;
With some coding skill, you can even make progress bars that players themselves can personalize.&lt;br /&gt;
&lt;br /&gt;
The bar works in a very simple way:&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;filled portion&#039;&#039;&#039; of the bar is displayed using one symbol (for example, a [https://game-icons.net/1x1/delapouite/plain-square.html ga_plain-square]).&lt;br /&gt;
* The &#039;&#039;&#039;empty portion&#039;&#039;&#039; is displayed using another symbol  (for example a [https://game-icons.net/1x1/delapouite/square.html ga_square] or   a space &amp;quot; &amp;quot;).&lt;br /&gt;
&lt;br /&gt;
⚠️ The drawback is that this bar is &#039;&#039;&#039;not interactive&#039;&#039;&#039;. To change its value, you’ll need to add [+] and [–] [[Button|buttons]] or directly edit the NumberInput components.&lt;br /&gt;
[[Fichier:Tuto_progress_bar1_ex.png|centré|700x700px]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 🔧 How to Build It ===&lt;br /&gt;
You need &#039;&#039;&#039;3 components&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;NumberInput&#039;&#039;&#039; for the current value → &amp;lt;code&amp;gt;&amp;quot;bar1_current_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;NumberInput&#039;&#039;&#039; for the maximum value → &amp;lt;code&amp;gt;&amp;quot;bar1_max_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;Label&#039;&#039;&#039; that will display the progress bar → &amp;lt;code&amp;gt;&amp;quot;bar1_progress&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;⚠️ Check the markdown checkbox of the label to have the proper display&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tuto_progress_bar1.png|centré|700x700px]]&lt;br /&gt;
 init = function(sheet){&lt;br /&gt;
    initProgressBar(sheet,&amp;quot;bar1_progress&amp;quot;, &amp;quot;bar1_current_value&amp;quot;,&lt;br /&gt;
                    &amp;quot;bar1_max_value&amp;quot;, &amp;quot;:ga_plain-square:&amp;quot;,&lt;br /&gt;
                    &amp;quot;:ga_square:&amp;quot;,10);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const initProgressBar = function(sheet,bar_id, current_value_id, max_value_id, fill_icon, empty_icon, line_length ){&lt;br /&gt;
     let current = sheet.get(current_value_id);&lt;br /&gt;
     let max  = sheet.get(max_value_id);&lt;br /&gt;
     let bar = sheet.get(bar_id);&lt;br /&gt;
     const updateBar = function(){&lt;br /&gt;
         let current_value = current.value();&lt;br /&gt;
         let max_value = max.value();&lt;br /&gt;
         let bar_value = &amp;quot;&amp;quot;;&lt;br /&gt;
         for(let i = 0; i &amp;lt; max_value; i++) {&lt;br /&gt;
             if (i != 0 &amp;amp;&amp;amp; i%line_length==0){&lt;br /&gt;
                 bar_value += &amp;quot;\n&amp;quot;;&lt;br /&gt;
             }&lt;br /&gt;
             if ( i &amp;lt; current_value){&lt;br /&gt;
                 bar_value += fill_icon;&lt;br /&gt;
             } else {&lt;br /&gt;
                 bar_value += empty_icon;&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         if (max_value &amp;lt; current_value){&lt;br /&gt;
             current.value(max_value);&lt;br /&gt;
         }&lt;br /&gt;
         bar.value(bar_value);&lt;br /&gt;
     }&lt;br /&gt;
     current.on(&amp;quot;update&amp;quot;, updateBar);&lt;br /&gt;
     max.on(&amp;quot;update&amp;quot;, updateBar);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
✨ You can modify its appearance by:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Changing the classes of &amp;lt;code&amp;gt;&amp;quot;bar1_progress&amp;quot;&amp;lt;/code&amp;gt; by changing the [[Styling character sheets with classes|color or the size]].&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Adjusting the line length argument.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Using any available icon in LetsRole ([https://fontawesome.com/v5/search?o=r&amp;amp;m=free&amp;amp;s=solid list1] [https://yesicon.app/game-icons liste2]).&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Two-Color Progress Bar ==&lt;br /&gt;
This progress bar is an upgrade of the first one: it differentiates the &#039;&#039;&#039;filled&#039;&#039;&#039; and &#039;&#039;&#039;empty&#039;&#039;&#039; portions with &#039;&#039;&#039;two different colors&#039;&#039;&#039;.&lt;br /&gt;
[[Fichier:Tuto_progress_bar2_ex.png|centré|700x700px]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 🔧 How to Build It ===&lt;br /&gt;
&amp;lt;p&amp;gt;You’ll need &#039;&#039;&#039;5 components&#039;&#039;&#039;:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;NumberInput&#039;&#039;&#039; for the current value → &amp;lt;code&amp;gt;&amp;quot;bar2_current_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A &amp;lt;b&amp;gt;NumberInput&amp;lt;/b&amp;gt; for the maximum value → &amp;lt;code&amp;gt;&amp;quot;bar2_max_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
*Two &amp;lt;b&amp;gt;Labels side by side&amp;lt;/b&amp;gt; → &amp;lt;code&amp;gt;&amp;quot;bar3_progress_middle_c1&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;bar3_progress_middle_c2&amp;quot;&amp;lt;/code&amp;gt; (these form the mixed line with the last filled + empty parts)&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;Label above&#039;&#039;&#039; for fully filled lines → &amp;lt;code&amp;gt;&amp;quot;bar3_progress_c1&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
*A &#039;&#039;&#039;Label below&#039;&#039;&#039; for fully empty lines → &amp;lt;code&amp;gt;&amp;quot;bar3_progress_c2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Tuto_progress_bar2.png|centré|700x700px]]&lt;br /&gt;
 init = function(sheet){&lt;br /&gt;
     initProgressBarTwoColor(sheet, &amp;quot;bar2_progress_c1&amp;quot;, &amp;quot;bar2_progress_middle_c1&amp;quot;,&lt;br /&gt;
                             &amp;quot;bar2_progress_c2&amp;quot;, &amp;quot;bar2_progress_middle_c2&amp;quot;,&lt;br /&gt;
                             &amp;quot;bar2_current_value&amp;quot;, &amp;quot;bar2_max_value&amp;quot;,&lt;br /&gt;
                             &amp;quot;:ga_plain-square:&amp;quot;, &amp;quot;:ga_plain-square:&amp;quot;,10); &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const initProgressBarTwoColor = function(sheet,sub_bar_c1_id, bar_c1_id, &lt;br /&gt;
                                          sub_bar_c2_id,bar_c2_id, &lt;br /&gt;
                                          current_value_id, max_value_id,&lt;br /&gt;
                                          fill_icon, empty_icon, line_length){&lt;br /&gt;
     let current = sheet.get(current_value_id);&lt;br /&gt;
     let max  = sheet.get(max_value_id);&lt;br /&gt;
     let sub_bar1 = sheet.get(sub_bar_c1_id);&lt;br /&gt;
     let bar1 = sheet.get(bar_c1_id);&lt;br /&gt;
     let sub_bar2 = sheet.get(sub_bar_c2_id);&lt;br /&gt;
     let bar2 = sheet.get(bar_c2_id);&lt;br /&gt;
     const stringMul = function(string, mul){&lt;br /&gt;
         let out_string = &amp;quot;&amp;quot;;&lt;br /&gt;
         for(let i = 0 ; i &amp;lt; mul ; i++){&lt;br /&gt;
             if(i != 0 &amp;amp;&amp;amp; i % line_length == 0){&lt;br /&gt;
                 out_string += &amp;quot;\n&amp;quot;;&lt;br /&gt;
             } &lt;br /&gt;
             out_string += string;&lt;br /&gt;
         }&lt;br /&gt;
         return out_string;&lt;br /&gt;
      }&lt;br /&gt;
     const updateBar = function(){&lt;br /&gt;
         let current_value = current.value();&lt;br /&gt;
         let max_value = max.value();&lt;br /&gt;
         if (max_value &amp;lt; current_value){&lt;br /&gt;
             current.value(max_value);&lt;br /&gt;
             current_value = max_value;&lt;br /&gt;
         }&lt;br /&gt;
         let left = max_value - current_value; &lt;br /&gt;
         let on_top_bar = current_value - (current_value % line_length);&lt;br /&gt;
         let on_midle_bar1 = current_value % line_length;&lt;br /&gt;
         let on_midle_bar2 = (left &amp;lt; line_length - on_midle_bar1) ? left : line_length - on_midle_bar1;&lt;br /&gt;
         let on_bot_bar = max_value - current_value - on_midle_bar2;&lt;br /&gt;
         sub_bar1.value(stringMul(fill_icon, on_top_bar));&lt;br /&gt;
         bar1.value(stringMul(fill_icon, on_midle_bar1));&lt;br /&gt;
         bar2.value(stringMul(empty_icon, on_midle_bar2));&lt;br /&gt;
         sub_bar2.value(stringMul(empty_icon , on_bot_bar));&lt;br /&gt;
     }&lt;br /&gt;
     current.on(&amp;quot;update&amp;quot;, updateBar);&lt;br /&gt;
     max.on(&amp;quot;update&amp;quot;, updateBar);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
✨ Like the first version, it’s easily customizable — but with an &#039;&#039;&#039;extra color&#039;&#039;&#039; to highlight different resources.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Clickable Progress Bar ==&lt;br /&gt;
This progress bar is &#039;&#039;&#039;interactive&#039;&#039;&#039;: players can click on it to change its value.&lt;br /&gt;
&lt;br /&gt;
⚠️ Drawbacks:&lt;br /&gt;
&lt;br /&gt;
*More difficult and time-consuming to set up.&lt;br /&gt;
*The maximum value must be fixed when designing the sheet (not dynamic).&lt;br /&gt;
*Each icon can display a différent icon.&lt;br /&gt;
&lt;br /&gt;
Here, the &#039;&#039;&#039;NumberInputs can be hidden&#039;&#039;&#039; so only the bar is visible.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tuto_progress_bar3_ex.png|700x700px]]&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 🔧 How to Build It ===&lt;br /&gt;
You’ll need:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A &#039;&#039;&#039;NumberInput&#039;&#039;&#039; for the current value → &amp;lt;code&amp;gt;&amp;quot;bar4_current_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A &amp;lt;b&amp;gt;NumberInput&amp;lt;/b&amp;gt; for the maximum value → &amp;lt;code&amp;gt;&amp;quot;bar4_max_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;series of Labels or Icons&#039;&#039;&#039; equal to the max size whithe precise id name (e.g., &amp;lt;code resource=&amp;quot;Fichier:Tuto progress bar3.png&amp;quot; height width&amp;gt;bar4_0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bar4_1&amp;lt;/code&amp;gt;, ..., &amp;lt;code&amp;gt;bar4_30&amp;lt;/code&amp;gt;, ...)&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
[[Fichier:Tuto_progress_bar3.png|700x700px]]&lt;br /&gt;
 init = function(sheet){&lt;br /&gt;
     initButtonProgressBar(sheet,&amp;quot;bar4_&amp;quot;, 20, &amp;quot;bar4_current_value&amp;quot;, &amp;quot;bar4_max_value&amp;quot;, &amp;quot;text-success &amp;quot;, &amp;quot;text-danger opacity-50&amp;quot; , &amp;quot;d-none&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const initButtonProgressBar = function(sheet,bar_prefix, bar_nb_element, current_value_id, max_value_id, fill_class,  empty_class, disable_class ){&lt;br /&gt;
     let current= sheet.get(current_value_id);&lt;br /&gt;
     let max = sheet.get(max_value_id);&lt;br /&gt;
     let button_container = sheet.get(button_container_id);&lt;br /&gt;
 &lt;br /&gt;
     let empty_class_list = empty_class.split(&amp;quot; &amp;quot;);&lt;br /&gt;
     let fill_class_list = fill_class.split(&amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     const addClasses = function(cmp, class_liste){&lt;br /&gt;
         for(let i = 0; i&amp;lt; class_liste.length; i++){&lt;br /&gt;
             cmp.addClass(class_liste[i]);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     const removeClasses = function(cmp, class_liste){&lt;br /&gt;
         for(let i = 0; i&amp;lt; class_liste.length; i++){&lt;br /&gt;
         cmp.removeClass(class_liste[i]);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     const updateBarOnButton = function(progress){&lt;br /&gt;
         let i = 0;&lt;br /&gt;
         while (i &amp;lt; bar_nb_element){&lt;br /&gt;
             let button_i = sheet.get(bar_prefix + i);&lt;br /&gt;
             if ( i &amp;lt;= progress){&lt;br /&gt;
                 removeClasses(button_i, empty_class_list);&lt;br /&gt;
                 addClasses(button_i, fill_class_list);&lt;br /&gt;
             } else {&lt;br /&gt;
                 removeClasses(button_i, fill_class_list);&lt;br /&gt;
                 addClasses(button_i, empty_class_list);&lt;br /&gt;
             }&lt;br /&gt;
             i++;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     const updateMax = function(){&lt;br /&gt;
         let i = 0;&lt;br /&gt;
         let max_value = max.value()-1;&lt;br /&gt;
         while (i &amp;lt; bar_nb_element){&lt;br /&gt;
             let button_i = sheet.get(bar_prefix + i);&lt;br /&gt;
             if ( i &amp;lt;= max_value){&lt;br /&gt;
                 button_i.removeClass(disable_class);&lt;br /&gt;
             } else {&lt;br /&gt;
                 button_i.addClass(disable_class);&lt;br /&gt;
             }&lt;br /&gt;
         i++;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     const barClicked = function(btn){&lt;br /&gt;
         if(btn.id().includes(bar_prefix)){&lt;br /&gt;
             let n = parseInt(btn.id().split(bar_prefix)[1]);&lt;br /&gt;
             current.value(n);&lt;br /&gt;
             updateBarOnButton(n);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     button_container.on(&amp;quot;click&amp;quot;,&amp;quot;.label&amp;quot;,barClicked); &lt;br /&gt;
     max.on(&amp;quot;update&amp;quot;,updateMax);&lt;br /&gt;
     current.on(&amp;quot;update&amp;quot;,function(){updateBarOnButton(current.value()-1)});&lt;br /&gt;
    &lt;br /&gt;
     updateBarOnButton(current.value()-1);&lt;br /&gt;
     updateMax();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
✨ Although harder to implement, this bar is &#039;&#039;&#039;very user-friendly&#039;&#039;&#039; since players can simply click on it.&lt;br /&gt;
&lt;br /&gt;
Also, the buttons don’t need perfect formatting — you can arrange them however you like.&lt;br /&gt;
[[Fichier:Tuto_progress_bar3_ex2.png|centré|700x700px]]&lt;br /&gt;
&lt;br /&gt;
=== Live example ===&lt;br /&gt;
You can see a live example in the [https://lets-role.com/system/wikic-progress-bar-27601 Wikic - ProgressBar.] To see the code and the components [[Fork]] it in your systems libarry.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Asynchrone_play&amp;diff=119</id>
		<title>Asynchrone play</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Asynchrone_play&amp;diff=119"/>
		<updated>2025-11-28T22:00:11Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Let’s Roll is not designed to be used asynchronously. There is no native way to play asynchronously.&lt;br /&gt;
&lt;br /&gt;
However, there are methods to play asynchronously by tracking your players’ actions with a timestamp.&lt;br /&gt;
&lt;br /&gt;
This page explains how to set up a timestamp system and how to link it to bindings in order to follow each action performed by your players.&lt;br /&gt;
[[Fichier:Date example.png|centré]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getting the date and time&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To obtain the current time, you can use the following function. It gives you the current date, which is very useful for asynchronous sessions that take place over a week. For longer sessions, use the [[Advanced time function|advanced function]] (link).&lt;br /&gt;
&lt;br /&gt;
 const heure = function (time_zone) {&lt;br /&gt;
     const jours = [&amp;quot;Monday&amp;quot;, &amp;quot;Tuesday&amp;quot;, &amp;quot;Wednesday&amp;quot;, &amp;quot;Thursday&amp;quot;, &amp;quot;Friday&amp;quot;, &amp;quot;Saturday&amp;quot;, &amp;quot;Sunday&amp;quot;];&lt;br /&gt;
     now = Date.now(); // epoc &lt;br /&gt;
     dateBase = new Date(&amp;quot;2025-01-06&amp;quot;); // A Monday&lt;br /&gt;
     delta = (now - dateBase) / 1000 + time_zone * 60 * 60; //  seconds&lt;br /&gt;
     s = delta % 60;&lt;br /&gt;
     delta = Math.floor(delta / 60); // minutes&lt;br /&gt;
     m = delta % 60;&lt;br /&gt;
     delta = Math.floor(delta / 60); // hours&lt;br /&gt;
     h = delta % 24;&lt;br /&gt;
     delta = Math.floor(delta / 24); // Day&lt;br /&gt;
     j = jours[delta % 7];&lt;br /&gt;
     return j + &amp;quot; &amp;quot; + h + &amp;quot;:&amp;quot; + (m &amp;lt; 10 ? &amp;quot;0&amp;quot; + m : m);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a timestamped message&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To send a timestamped message, you will need to set up a message sender so your players can specify the action they want to perform and the contextual roll.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Writing the message&#039;&#039;&#039;&lt;br /&gt;
[[Fichier:Chate date.png|vignette]]&lt;br /&gt;
The following example shows a view that you can add to one of your tabs.&lt;br /&gt;
&lt;br /&gt;
– a field for the action name: id “date_title”&lt;br /&gt;
&lt;br /&gt;
– an area for writing a long message: “date_message”&lt;br /&gt;
&lt;br /&gt;
– a field for the roll title: “date_roll_title”&lt;br /&gt;
&lt;br /&gt;
– a field to enter a roll to perform: “date_roll”&lt;br /&gt;
&lt;br /&gt;
– a button to send the message to the chat: “date_send_message”&lt;br /&gt;
&lt;br /&gt;
– a field to specify your time zone: “date_time_zone”&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Message date.png|vignette]]&lt;br /&gt;
&#039;&#039;&#039;Displaying the message&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must create a view (id: “view_message”) to display the message in the chat.&lt;br /&gt;
&lt;br /&gt;
It must contain at least:&lt;br /&gt;
&lt;br /&gt;
– a label to display the message text (text = “if(#text = 0, ‘[Text]’, #text)”)&lt;br /&gt;
&lt;br /&gt;
– a label to display the result of the action (text = “if(#roll = 0, ‘[Roll]’, #roll)”)&lt;br /&gt;
&lt;br /&gt;
– a label containing the name of the character who performed the action (text = “if(#perso = 0, ‘[Perso]’, #perso)”)&lt;br /&gt;
&lt;br /&gt;
– a label that contains the date of the action (text = “if(#time = 0, ‘[Time]’, #time)”)&lt;br /&gt;
&lt;br /&gt;
Once all of this is in place, you can use the following script, which connects everything together.&lt;br /&gt;
&lt;br /&gt;
 init = function(sheet) {&lt;br /&gt;
     if (sheet.id() === &amp;quot;main&amp;quot;) {&lt;br /&gt;
         initMain(sheet);&lt;br /&gt;
     }&lt;br /&gt;
 };&lt;br /&gt;
 const initMain = function(sheet) {&lt;br /&gt;
     // Main initialization&lt;br /&gt;
     dateMessage(sheet);&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 const dateMessage = function (sheet) {&lt;br /&gt;
       let date_send_message = &amp;quot;date_send_message&amp;quot;;&lt;br /&gt;
       let title = sheet.get(&amp;quot;date_title&amp;quot;);&lt;br /&gt;
       let dice_roll = sheet.get(&amp;quot;date_roll&amp;quot;);&lt;br /&gt;
       let roll_title = sheet.get(&amp;quot;date_roll_title&amp;quot;);&lt;br /&gt;
       let message = sheet.get(&amp;quot;date_message&amp;quot;);&lt;br /&gt;
       let button_message = sheet.get(date_send_message);&lt;br /&gt;
       let time_zone = sheet.get(&amp;quot;date_time_zone&amp;quot;);&lt;br /&gt;
       // display the message with the roll results &lt;br /&gt;
       const result_message = function (result) {&lt;br /&gt;
           log(&amp;quot;START : action roll cliked&amp;quot;);&lt;br /&gt;
           messageChat(sheet, title.value(), message.value(), result.total, time_zone.value());&lt;br /&gt;
       }&lt;br /&gt;
       // setup the roll&lt;br /&gt;
       const button_click = function () {&lt;br /&gt;
           log(&amp;quot;START : roll cliked&amp;quot;);&lt;br /&gt;
           let roll = new RollBuilder(sheet);&lt;br /&gt;
           if (dice_roll.value() == &amp;quot;&amp;quot;){&lt;br /&gt;
               roll = roll.expression(&amp;quot;0&amp;quot;);&lt;br /&gt;
           } else {&lt;br /&gt;
               roll = roll.expression(dice_roll.value());&lt;br /&gt;
           }&lt;br /&gt;
           roll = roll.visibility(&amp;quot;all&amp;quot;);&lt;br /&gt;
           roll = roll.title(roll_title.value());&lt;br /&gt;
            // renseigner la fonction automatique&lt;br /&gt;
           roll = roll.onRoll(result_message);&lt;br /&gt;
           roll.roll();&lt;br /&gt;
           log(&amp;quot;END : roll clicked&amp;quot;)&lt;br /&gt;
       }&lt;br /&gt;
       button_message.on(&amp;quot;click&amp;quot;, button_click);&lt;br /&gt;
       // The functoin Send the message in the chat. &lt;br /&gt;
       const messageChat = function (sheet, titre, texte, result, time_zone) { &lt;br /&gt;
           let binding_name = sheet.properName() + &amp;quot; : &amp;quot; + titre;&lt;br /&gt;
           Bindings.add(binding_name, &amp;quot;sheet&amp;quot;, &amp;quot;view_message&amp;quot;, function (sheet) { &lt;br /&gt;
               const h = time_complete(time_zone);&lt;br /&gt;
               const data = {&lt;br /&gt;
                   text: texte,&lt;br /&gt;
                   roll: result,&lt;br /&gt;
                   perso: sheet.properName(),&lt;br /&gt;
                   time: h&lt;br /&gt;
               };&lt;br /&gt;
               return data;&lt;br /&gt;
           })&lt;br /&gt;
           Bindings.send(sheet, binding_name); // Send message to chat&lt;br /&gt;
           Bindings.remove(binding_name); // Delete the binding&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Asynchrone_play&amp;diff=118</id>
		<title>Asynchrone play</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Asynchrone_play&amp;diff=118"/>
		<updated>2025-11-28T21:55:30Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Let’s Roll is not designed to be used asynchronously. There is no native way to play asynchronously.&lt;br /&gt;
&lt;br /&gt;
However, there are methods to play asynchronously by tracking your players’ actions with a timestamp.&lt;br /&gt;
&lt;br /&gt;
This page explains how to set up a timestamp system and how to link it to bindings in order to follow each action performed by your players.&lt;br /&gt;
[[Fichier:Date example.png|centré]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getting the date and time&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To obtain the current time, you can use the following function. It gives you the current date, which is very useful for asynchronous sessions that take place over a week. For longer sessions, use the [[Advanced time function|advanced function]] (link).&lt;br /&gt;
&lt;br /&gt;
 const heure = function (time_zone) {&lt;br /&gt;
     const jours = [&amp;quot;Monday&amp;quot;, &amp;quot;Tuesday&amp;quot;, &amp;quot;Wednesday&amp;quot;, &amp;quot;Thursday&amp;quot;, &amp;quot;Friday&amp;quot;, &amp;quot;Saturday&amp;quot;, &amp;quot;Sunday&amp;quot;];&lt;br /&gt;
     now = Date.now(); // epoc &lt;br /&gt;
     dateBase = new Date(&amp;quot;2025-01-06&amp;quot;); // A Monday&lt;br /&gt;
     delta = (now - dateBase) / 1000 + time_zone * 60 * 60; //  seconds&lt;br /&gt;
     s = delta % 60;&lt;br /&gt;
     delta = Math.floor(delta / 60); // minutes&lt;br /&gt;
     m = delta % 60;&lt;br /&gt;
     delta = Math.floor(delta / 60); // hours&lt;br /&gt;
     h = delta % 24;&lt;br /&gt;
     delta = Math.floor(delta / 24); // Day&lt;br /&gt;
     j = jours[delta % 7];&lt;br /&gt;
     return j + &amp;quot; &amp;quot; + h + &amp;quot;:&amp;quot; + (m &amp;lt; 10 ? &amp;quot;0&amp;quot; + m : m);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a timestamped message&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To send a timestamped message, you will need to set up a message sender so your players can specify the action they want to perform and the contextual roll.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Writing the message&#039;&#039;&#039;&lt;br /&gt;
[[Fichier:Chate date.png|vignette]]&lt;br /&gt;
The following example shows a view that you can add to one of your tabs.&lt;br /&gt;
&lt;br /&gt;
– a field for the action name: id “date_title”&lt;br /&gt;
&lt;br /&gt;
– an area for writing a long message: “date_message”&lt;br /&gt;
&lt;br /&gt;
– a field for the roll title: “date_roll_title”&lt;br /&gt;
&lt;br /&gt;
– a field to enter a roll to perform: “date_roll”&lt;br /&gt;
&lt;br /&gt;
– a button to send the message to the chat: “date_send_message”&lt;br /&gt;
&lt;br /&gt;
– a field to specify your time zone: “date_time_zone”&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Message date.png|vignette]]&lt;br /&gt;
&#039;&#039;&#039;Displaying the message&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must create a view (id: “view_message”) to display the message in the chat.&lt;br /&gt;
&lt;br /&gt;
It must contain at least:&lt;br /&gt;
&lt;br /&gt;
– a label to display the message text (text = “if(#text = 0, ‘[Text]’, #text)”)&lt;br /&gt;
&lt;br /&gt;
– a label to display the result of the action (text = “if(#roll = 0, ‘[Roll]’, #roll)”)&lt;br /&gt;
&lt;br /&gt;
– a label containing the name of the character who performed the action (text = “if(#perso = 0, ‘[Perso]’, #perso)”)&lt;br /&gt;
&lt;br /&gt;
– a label that contains the date of the action (text = “if(#time = 0, ‘[Time]’, #time)”)&lt;br /&gt;
&lt;br /&gt;
Once all of this is in place, you can use the following script, which connects everything together.&lt;br /&gt;
&lt;br /&gt;
 const dateMessage = function (sheet) {&lt;br /&gt;
       let date_send_message = &amp;quot;date_send_message&amp;quot;;&lt;br /&gt;
       let title = sheet.get(&amp;quot;date_title&amp;quot;);&lt;br /&gt;
       let dice_roll = sheet.get(&amp;quot;date_roll&amp;quot;);&lt;br /&gt;
       let roll_title = sheet.get(&amp;quot;date_roll_title&amp;quot;);&lt;br /&gt;
       let message = sheet.get(&amp;quot;date_message&amp;quot;);&lt;br /&gt;
       let button_message = sheet.get(date_send_message);&lt;br /&gt;
       let time_zone = sheet.get(&amp;quot;date_time_zone&amp;quot;);&lt;br /&gt;
       // display the message with the roll results &lt;br /&gt;
       const result_message = function (result) {&lt;br /&gt;
           log(&amp;quot;START : action roll cliked&amp;quot;);&lt;br /&gt;
           messageChat(sheet, title.value(), message.value(), result.total, time_zone.value());&lt;br /&gt;
       }&lt;br /&gt;
       // setup the roll&lt;br /&gt;
       const button_click = function () {&lt;br /&gt;
           log(&amp;quot;START : roll cliked&amp;quot;);&lt;br /&gt;
           let roll = new RollBuilder(sheet);&lt;br /&gt;
           if (dice_roll.value() == &amp;quot;&amp;quot;){&lt;br /&gt;
               roll = roll.expression(&amp;quot;0&amp;quot;);&lt;br /&gt;
           } else {&lt;br /&gt;
               roll = roll.expression(dice_roll.value());&lt;br /&gt;
           }&lt;br /&gt;
           roll = roll.visibility(&amp;quot;all&amp;quot;);&lt;br /&gt;
           roll = roll.title(roll_title.value());&lt;br /&gt;
            // renseigner la fonction automatique&lt;br /&gt;
           roll = roll.onRoll(result_message);&lt;br /&gt;
           roll.roll();&lt;br /&gt;
           log(&amp;quot;END : roll clicked&amp;quot;)&lt;br /&gt;
       }&lt;br /&gt;
       button_message.on(&amp;quot;click&amp;quot;, button_click);&lt;br /&gt;
       // The functoin Send the message in the chat. &lt;br /&gt;
       const messageChat = function (sheet, titre, texte, result, time_zone) { &lt;br /&gt;
           let binding_name = sheet.properName() + &amp;quot; : &amp;quot; + titre;&lt;br /&gt;
           Bindings.add(binding_name, &amp;quot;sheet&amp;quot;, &amp;quot;view_message&amp;quot;, function (sheet) { &lt;br /&gt;
               const h = time_complete(time_zone);&lt;br /&gt;
               const data = {&lt;br /&gt;
                   text: texte,&lt;br /&gt;
                   roll: result,&lt;br /&gt;
                   perso: sheet.properName(),&lt;br /&gt;
                   time: h&lt;br /&gt;
               };&lt;br /&gt;
               return data;&lt;br /&gt;
           })&lt;br /&gt;
           Bindings.send(sheet, binding_name); // Send message to chat&lt;br /&gt;
           Bindings.remove(binding_name); // Delete the binding&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Date_example.png&amp;diff=117</id>
		<title>Fichier:Date example.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Date_example.png&amp;diff=117"/>
		<updated>2025-11-28T21:54:34Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Asynchrone_play&amp;diff=116</id>
		<title>Asynchrone play</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Asynchrone_play&amp;diff=116"/>
		<updated>2025-11-28T21:41:36Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : premier jet de finalisation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Let’s Roll is not designed to be used asynchronously. There is no native way to play asynchronously.&lt;br /&gt;
&lt;br /&gt;
However, there are methods to play asynchronously by tracking your players’ actions with a timestamp.&lt;br /&gt;
&lt;br /&gt;
This page explains how to set up a timestamp system and how to link it to bindings in order to follow each action performed by your players.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getting the date and time&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To obtain the current time, you can use the following function. It gives you the current date, which is very useful for asynchronous sessions that take place over a week. For longer sessions, use the [[Advanced time function|advanced function]] (link).&lt;br /&gt;
&lt;br /&gt;
 const heure = function (time_zone) {&lt;br /&gt;
     const jours = [&amp;quot;Monday&amp;quot;, &amp;quot;Tuesday&amp;quot;, &amp;quot;Wednesday&amp;quot;, &amp;quot;Thursday&amp;quot;, &amp;quot;Friday&amp;quot;, &amp;quot;Saturday&amp;quot;, &amp;quot;Sunday&amp;quot;];&lt;br /&gt;
     now = Date.now(); // epoc &lt;br /&gt;
     dateBase = new Date(&amp;quot;2025-01-06&amp;quot;); // A Monday&lt;br /&gt;
     delta = (now - dateBase) / 1000 + time_zone * 60 * 60; //  seconds&lt;br /&gt;
     s = delta % 60;&lt;br /&gt;
     delta = Math.floor(delta / 60); // minutes&lt;br /&gt;
     m = delta % 60;&lt;br /&gt;
     delta = Math.floor(delta / 60); // hours&lt;br /&gt;
     h = delta % 24;&lt;br /&gt;
     delta = Math.floor(delta / 24); // Day&lt;br /&gt;
     j = jours[delta % 7];&lt;br /&gt;
     return j + &amp;quot; &amp;quot; + h + &amp;quot;:&amp;quot; + (m &amp;lt; 10 ? &amp;quot;0&amp;quot; + m : m);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a timestamped message&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To send a timestamped message, you will need to set up a message sender so your players can specify the action they want to perform and the contextual roll.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Writing the message&#039;&#039;&#039;&lt;br /&gt;
[[Fichier:Chate date.png|vignette]]&lt;br /&gt;
The following example shows a view that you can add to one of your tabs.&lt;br /&gt;
&lt;br /&gt;
– a field for the action name: id “date_title”&lt;br /&gt;
&lt;br /&gt;
– an area for writing a long message: “date_message”&lt;br /&gt;
&lt;br /&gt;
– a field for the roll title: “date_roll_title”&lt;br /&gt;
&lt;br /&gt;
– a field to enter a roll to perform: “date_roll”&lt;br /&gt;
&lt;br /&gt;
– a button to send the message to the chat: “date_send_message”&lt;br /&gt;
&lt;br /&gt;
– a field to specify your time zone: “date_time_zone”&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Message date.png|vignette]]&lt;br /&gt;
&#039;&#039;&#039;Displaying the message&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must create a view (id: “view_message”) to display the message in the chat.&lt;br /&gt;
&lt;br /&gt;
It must contain at least:&lt;br /&gt;
&lt;br /&gt;
– a label to display the message text (text = “if(#text = 0, ‘[Text]’, #text)”)&lt;br /&gt;
&lt;br /&gt;
– a label to display the result of the action (text = “if(#roll = 0, ‘[Roll]’, #roll)”)&lt;br /&gt;
&lt;br /&gt;
– a label containing the name of the character who performed the action (text = “if(#perso = 0, ‘[Perso]’, #perso)”)&lt;br /&gt;
&lt;br /&gt;
– a label that contains the date of the action (text = “if(#time = 0, ‘[Time]’, #time)”)&lt;br /&gt;
&lt;br /&gt;
Once all of this is in place, you can use the following script, which connects everything together.&lt;br /&gt;
&lt;br /&gt;
 const dateMessage = function (sheet) {&lt;br /&gt;
       let date_send_message = &amp;quot;date_send_message&amp;quot;;&lt;br /&gt;
       let title = sheet.get(&amp;quot;date_title&amp;quot;);&lt;br /&gt;
       let dice_roll = sheet.get(&amp;quot;date_roll&amp;quot;);&lt;br /&gt;
       let roll_title = sheet.get(&amp;quot;date_roll_title&amp;quot;);&lt;br /&gt;
       let message = sheet.get(&amp;quot;date_message&amp;quot;);&lt;br /&gt;
       let button_message = sheet.get(date_send_message);&lt;br /&gt;
       let time_zone = sheet.get(&amp;quot;date_time_zone&amp;quot;);&lt;br /&gt;
       // display the message with the roll results &lt;br /&gt;
       const result_message = function (result) {&lt;br /&gt;
           log(&amp;quot;START : action roll cliked&amp;quot;);&lt;br /&gt;
           messageChat(sheet, title.value(), message.value(), result.total, time_zone.value());&lt;br /&gt;
       }&lt;br /&gt;
       // setup the roll&lt;br /&gt;
       const button_click = function () {&lt;br /&gt;
           log(&amp;quot;START : roll cliked&amp;quot;);&lt;br /&gt;
           let roll = new RollBuilder(sheet);&lt;br /&gt;
           if (dice_roll.value() == &amp;quot;&amp;quot;){&lt;br /&gt;
               roll = roll.expression(&amp;quot;0&amp;quot;);&lt;br /&gt;
           } else {&lt;br /&gt;
               roll = roll.expression(dice_roll.value());&lt;br /&gt;
           }&lt;br /&gt;
           roll = roll.visibility(&amp;quot;all&amp;quot;);&lt;br /&gt;
           roll = roll.title(roll_title.value());&lt;br /&gt;
            // renseigner la fonction automatique&lt;br /&gt;
           roll = roll.onRoll(result_message);&lt;br /&gt;
           roll.roll();&lt;br /&gt;
           log(&amp;quot;END : roll clicked&amp;quot;)&lt;br /&gt;
       }&lt;br /&gt;
       button_message.on(&amp;quot;click&amp;quot;, button_click);&lt;br /&gt;
       // The functoin Send the message in the chat. &lt;br /&gt;
       const messageChat = function (sheet, titre, texte, result, time_zone) { &lt;br /&gt;
           let binding_name = sheet.properName() + &amp;quot; : &amp;quot; + titre;&lt;br /&gt;
           Bindings.add(binding_name, &amp;quot;sheet&amp;quot;, &amp;quot;view_message&amp;quot;, function (sheet) { &lt;br /&gt;
               const h = time_complete(time_zone);&lt;br /&gt;
               const data = {&lt;br /&gt;
                   text: texte,&lt;br /&gt;
                   roll: result,&lt;br /&gt;
                   perso: sheet.properName(),&lt;br /&gt;
                   time: h&lt;br /&gt;
               };&lt;br /&gt;
               return data;&lt;br /&gt;
           })&lt;br /&gt;
           Bindings.send(sheet, binding_name); // Send message to chat&lt;br /&gt;
           Bindings.remove(binding_name); // Delete the binding&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Chate_date.png&amp;diff=114</id>
		<title>Fichier:Chate date.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Chate_date.png&amp;diff=114"/>
		<updated>2025-11-28T21:39:54Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Message_date.png&amp;diff=115</id>
		<title>Fichier:Message date.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Message_date.png&amp;diff=115"/>
		<updated>2025-11-28T21:39:47Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Asynchrone_play&amp;diff=113</id>
		<title>Asynchrone play</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Asynchrone_play&amp;diff=113"/>
		<updated>2025-11-28T21:37:10Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : Page créée avec « Let’s Roll is not designed to be used asynchronously. There is no native way to play asynchronously.  However, there are methods to play asynchronously by tracking your players’ actions with a timestamp.  This page explains how to set up a timestamp system and how to link it to bindings in order to follow each action performed by your players.  &amp;#039;&amp;#039;&amp;#039;Getting the date and time&amp;#039;&amp;#039;&amp;#039;  To obtain the current time, you can use the following function. It gives you the cu... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Let’s Roll is not designed to be used asynchronously. There is no native way to play asynchronously.&lt;br /&gt;
&lt;br /&gt;
However, there are methods to play asynchronously by tracking your players’ actions with a timestamp.&lt;br /&gt;
&lt;br /&gt;
This page explains how to set up a timestamp system and how to link it to bindings in order to follow each action performed by your players.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Getting the date and time&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To obtain the current time, you can use the following function. It gives you the current date, which is very useful for asynchronous sessions that take place over a week. For longer sessions, use the [[Advanced time function|advanced function]] (link).&lt;br /&gt;
&lt;br /&gt;
 const heure = function (time_zone) {&lt;br /&gt;
     const jours = [&amp;quot;Monday&amp;quot;, &amp;quot;Tuesday&amp;quot;, &amp;quot;Wednesday&amp;quot;, &amp;quot;Thursday&amp;quot;, &amp;quot;Friday&amp;quot;, &amp;quot;Saturday&amp;quot;, &amp;quot;Sunday&amp;quot;];&lt;br /&gt;
     now = Date.now(); // epoc &lt;br /&gt;
     dateBase = new Date(&amp;quot;2025-01-06&amp;quot;); // A Monday&lt;br /&gt;
     delta = (now - dateBase) / 1000 + time_zone * 60 * 60; //  seconds&lt;br /&gt;
     s = delta % 60;&lt;br /&gt;
     delta = Math.floor(delta / 60); // minutes&lt;br /&gt;
     m = delta % 60;&lt;br /&gt;
     delta = Math.floor(delta / 60); // hours&lt;br /&gt;
     h = delta % 24;&lt;br /&gt;
     delta = Math.floor(delta / 24); // Day&lt;br /&gt;
     j = jours[delta % 7];&lt;br /&gt;
     return j + &amp;quot; &amp;quot; + h + &amp;quot;:&amp;quot; + (m &amp;lt; 10 ? &amp;quot;0&amp;quot; + m : m);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sending a timestamped message&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To send a timestamped message, you will need to set up a message sender so your players can specify the action they want to perform and the contextual roll.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Writing the message&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The following example shows a view that you can add to one of your tabs.&lt;br /&gt;
&lt;br /&gt;
– a field for the action name: id “date_title”&lt;br /&gt;
&lt;br /&gt;
– an area for writing a long message: “date_message”&lt;br /&gt;
&lt;br /&gt;
– a field for the roll title: “date_roll_title”&lt;br /&gt;
&lt;br /&gt;
– a field to enter a roll to perform: “date_roll”&lt;br /&gt;
&lt;br /&gt;
– a button to send the message to the chat: “date_send_message”&lt;br /&gt;
&lt;br /&gt;
– a field to specify your time zone: “date_time_zone”&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Displaying the message&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You must create a view (id: “view_message”) to display the message in the chat.&lt;br /&gt;
&lt;br /&gt;
It must contain at least:&lt;br /&gt;
&lt;br /&gt;
– a label to display the message text (text = “if(#text = 0, ‘[Text]’, #text)”)&lt;br /&gt;
&lt;br /&gt;
– a label to display the result of the action (text = “if(#roll = 0, ‘[Roll]’, #roll)”)&lt;br /&gt;
&lt;br /&gt;
– a label containing the name of the character who performed the action (text = “if(#perso = 0, ‘[Perso]’, #perso)”)&lt;br /&gt;
&lt;br /&gt;
– a label that contains the date of the action (text = “if(#time = 0, ‘[Time]’, #time)”)&lt;br /&gt;
&lt;br /&gt;
Once all of this is in place, you can use the following script, which connects everything together.&lt;br /&gt;
&lt;br /&gt;
 const dateMessage = function (sheet) {&lt;br /&gt;
       let date_send_message = &amp;quot;date_send_message&amp;quot;;&lt;br /&gt;
       let title = sheet.get(&amp;quot;date_title&amp;quot;);&lt;br /&gt;
       let dice_roll = sheet.get(&amp;quot;date_roll&amp;quot;);&lt;br /&gt;
       let roll_title = sheet.get(&amp;quot;date_roll_title&amp;quot;);&lt;br /&gt;
       let message = sheet.get(&amp;quot;date_message&amp;quot;);&lt;br /&gt;
       let button_message = sheet.get(date_send_message);&lt;br /&gt;
       let time_zone = sheet.get(&amp;quot;date_time_zone&amp;quot;);&lt;br /&gt;
       // display the message with the roll results &lt;br /&gt;
       const result_message = function (result) {&lt;br /&gt;
           log(&amp;quot;START : action roll cliked&amp;quot;);&lt;br /&gt;
           messageChat(sheet, title.value(), message.value(), result.total, time_zone.value());&lt;br /&gt;
       }&lt;br /&gt;
       // setup the roll&lt;br /&gt;
       const button_click = function () {&lt;br /&gt;
           log(&amp;quot;START : roll cliked&amp;quot;);&lt;br /&gt;
           let roll = new RollBuilder(sheet);&lt;br /&gt;
           if (dice_roll.value() == &amp;quot;&amp;quot;){&lt;br /&gt;
               roll = roll.expression(&amp;quot;0&amp;quot;);&lt;br /&gt;
           } else {&lt;br /&gt;
               roll = roll.expression(dice_roll.value());&lt;br /&gt;
           }&lt;br /&gt;
           roll = roll.visibility(&amp;quot;all&amp;quot;);&lt;br /&gt;
           roll = roll.title(roll_title.value());&lt;br /&gt;
            // renseigner la fonction automatique&lt;br /&gt;
           roll = roll.onRoll(result_message);&lt;br /&gt;
           roll.roll();&lt;br /&gt;
           log(&amp;quot;END : roll clicked&amp;quot;)&lt;br /&gt;
       }&lt;br /&gt;
       button_message.on(&amp;quot;click&amp;quot;, button_click);&lt;br /&gt;
       // The functoin Send the message in the chat. &lt;br /&gt;
       const messageChat = function (sheet, titre, texte, result, time_zone) { &lt;br /&gt;
           let binding_name = sheet.properName() + &amp;quot; : &amp;quot; + titre;&lt;br /&gt;
           Bindings.add(binding_name, &amp;quot;sheet&amp;quot;, &amp;quot;view_message&amp;quot;, function (sheet) { &lt;br /&gt;
               const h = time_complete(time_zone);&lt;br /&gt;
               const data = {&lt;br /&gt;
                   text: texte,&lt;br /&gt;
                   roll: result,&lt;br /&gt;
                   perso: sheet.properName(),&lt;br /&gt;
                   time: h&lt;br /&gt;
               };&lt;br /&gt;
               return data;&lt;br /&gt;
           })&lt;br /&gt;
           Bindings.send(sheet, binding_name); // Send message to chat&lt;br /&gt;
           Bindings.remove(binding_name); // Delete the binding&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Advanced_time_function&amp;diff=112</id>
		<title>Advanced time function</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Advanced_time_function&amp;diff=112"/>
		<updated>2025-11-28T21:33:36Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : fonction avancé pour obtenir l’heure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; function heure(tz) {&lt;br /&gt;
     // Date de référence (que TU connais)&lt;br /&gt;
     var base_annee = 2025;&lt;br /&gt;
     var base_mois = 1;   // Janvier&lt;br /&gt;
     var base_jour = 1;   // 1er janvier&lt;br /&gt;
     var base_jSemaine = 3; // 0=Lundi → 3=Jeudi (2025-01-01)&lt;br /&gt;
     var moisLong = [31,28,31,30,31,30,31,31,30,31,30,31];&lt;br /&gt;
     var joursNom = [&amp;quot;Lundi&amp;quot;,&amp;quot;Mardi&amp;quot;,&amp;quot;Mercredi&amp;quot;,&amp;quot;Jeudi&amp;quot;,&amp;quot;Vendredi&amp;quot;,&amp;quot;Samedi&amp;quot;,&amp;quot;Dimanche&amp;quot;];&lt;br /&gt;
     var moisNom  = [&amp;quot;Janvier&amp;quot;,&amp;quot;Février&amp;quot;,&amp;quot;Mars&amp;quot;,&amp;quot;Avril&amp;quot;,&amp;quot;Mai&amp;quot;,&amp;quot;Juin&amp;quot;,&amp;quot;Juillet&amp;quot;,&lt;br /&gt;
                     &amp;quot;Août&amp;quot;,&amp;quot;Septembre&amp;quot;,&amp;quot;Octobre&amp;quot;,&amp;quot;Novembre&amp;quot;,&amp;quot;Décembre&amp;quot;];&lt;br /&gt;
     // Epoch actuel + fuseau horaire&lt;br /&gt;
     var now = Math.floor(Date.now() / 1000) + tz * 3600;&lt;br /&gt;
     // Convertir le même jour base en epoch SECONDES (simplifié)&lt;br /&gt;
     var baseDate = new Date(&amp;quot;2025-01-01&amp;quot;);&lt;br /&gt;
     var baseEpoch = Math.floor(baseDate.getTime() / 1000);&lt;br /&gt;
     var delta = now - baseEpoch; // secondes depuis le 1 janvier 2025&lt;br /&gt;
     // ---- Heures, minutes, secondes ----&lt;br /&gt;
     var s = delta % 60;&lt;br /&gt;
     delta = Math.floor(delta / 60);&lt;br /&gt;
     var m = delta % 60;&lt;br /&gt;
     delta = Math.floor(delta / 60);&lt;br /&gt;
     var h = delta % 24;&lt;br /&gt;
     delta = Math.floor(delta / 24);&lt;br /&gt;
     // ---- Jours écoulés depuis la base ----&lt;br /&gt;
     var joursPasse = delta;&lt;br /&gt;
     // Jour de la semaine&lt;br /&gt;
     var jSemaine = (base_jSemaine + joursPasse) % 7;&lt;br /&gt;
     // ---- Calcul du jour / mois / année ----&lt;br /&gt;
     var annee = base_annee;&lt;br /&gt;
     var mois = base_mois - 1; // 0..11&lt;br /&gt;
     var jour = base_jour;&lt;br /&gt;
     // Année bissextile simple&lt;br /&gt;
     function estBissextile(a) {&lt;br /&gt;
         return (a % 4 == 0 &amp;amp;&amp;amp; (a % 100 != 0 ||  a % 400 == 0));&lt;br /&gt;
     }&lt;br /&gt;
     while (joursPasse &amp;gt; 0) {&lt;br /&gt;
         var len = moisLong[mois];&lt;br /&gt;
         if (mois == 1 &amp;amp;&amp;amp; estBissextile(annee)) {&lt;br /&gt;
             len = 29;&lt;br /&gt;
         }&lt;br /&gt;
         jour++;&lt;br /&gt;
         if (jour &amp;gt; len) {&lt;br /&gt;
             jour = 1;&lt;br /&gt;
             mois++;&lt;br /&gt;
             if (mois == 12) {&lt;br /&gt;
                 mois = 0;&lt;br /&gt;
                 annee++;&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         joursPasse--;&lt;br /&gt;
    }&lt;br /&gt;
     // ---- Padding simple ----&lt;br /&gt;
     if (h &amp;lt; 10) h = &amp;quot;0&amp;quot;+h;&lt;br /&gt;
     if (m &amp;lt; 10) m = &amp;quot;0&amp;quot;+m;&lt;br /&gt;
     if (s &amp;lt; 10) s = &amp;quot;0&amp;quot;+s;&lt;br /&gt;
     return joursNom[jSemaine] + &amp;quot; &amp;quot; + jour + &amp;quot; &amp;quot; +&lt;br /&gt;
            moisNom[mois] + &amp;quot; &amp;quot; + annee + &amp;quot; - &amp;quot; +&lt;br /&gt;
            h + &amp;quot;:&amp;quot; + m + &amp;quot;:&amp;quot; + s;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=111</id>
		<title>System Builder</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=111"/>
		<updated>2025-11-28T21:22:07Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout d’un section sur le jeu asynchrone&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The System Builder is a tool for creating game systems for the [https://lets-role.com/ Let&#039;s Roll] gaming tables. It allows for the comprehensive construction of various essential tools such as player character sheets, as well as the creation of non-player character sheets, objects, and game monitoring tools for Game Masters.&lt;br /&gt;
&lt;br /&gt;
The tool is accessible to anyone with a Let&#039;s Roll account. It is designed so that anyone can develop their own system without any coding knowledge. The System Builder is equipped with coding tools (pseudoJS) that allow for the creation of complex, non-essential functionalities that will add a bit of convenience.&lt;br /&gt;
&lt;br /&gt;
=== First step ===&lt;br /&gt;
Quickstart video guide for creating systems in Let’s Role (🇫🇷 &#039;&#039;French only)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=F141URrFVwo&lt;br /&gt;
[[Fichier:Video_thumbnail_Start_on_SB.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
==== Interface ====&lt;br /&gt;
[[Fichier:Systemebuilder global.png|centré|vignette|900x900px]]&lt;br /&gt;
&lt;br /&gt;
# The title of the edited system&lt;br /&gt;
# [[Manage views|C]]&amp;lt;nowiki/&amp;gt;[[Manage views|reate new views]], navigate between [views]...&lt;br /&gt;
# The list of [[components|c]]&amp;lt;nowiki/&amp;gt;[[components|omponents]] usable for building a view&lt;br /&gt;
# [[Manage views|The dependency tree of views]]&lt;br /&gt;
# Launch the system on a table to [test the system]&lt;br /&gt;
# The tabs [view], [table], [script], [translation], the tools to develop a system&lt;br /&gt;
# The [preview of the sheet]&lt;br /&gt;
# The buttons [[Save, Deploy, and Exit]].&lt;br /&gt;
# The panel of the selected [component parameters]&lt;br /&gt;
&lt;br /&gt;
===== Views =====&lt;br /&gt;
Views are trees of components. They can be instantiated by the [tab] component or the [repeater] component to create complex and well-organized sheets.&lt;br /&gt;
&lt;br /&gt;
==== Creating a New View ====&lt;br /&gt;
To create a new view, click on the &amp;quot;Create a new view&amp;quot; button. Fill in the popup with an ID (no capital letters, no special characters, no numbers, and use underscores to separate words), for example: &amp;quot;vue_armes&amp;quot;. To switch views, use the dropdown list.&lt;br /&gt;
&lt;br /&gt;
==== Building a View ====&lt;br /&gt;
To build a view, use the components in window 3 by dragging and dropping them into the component tree of the view in window 4.&lt;br /&gt;
&lt;br /&gt;
===== Layout Components =====&lt;br /&gt;
Layout components are used to structure and organize components among themselves, such as rows, columns, and containers.&lt;br /&gt;
&lt;br /&gt;
TODO: Link to a tutorial&lt;br /&gt;
&lt;br /&gt;
===== Form Components =====&lt;br /&gt;
Form components are designed to contain the information for your character sheet.&lt;br /&gt;
&lt;br /&gt;
===== Container Components =====&lt;br /&gt;
Containers are components that can contain views to create complete and dynamic sheets.&lt;br /&gt;
&lt;br /&gt;
=== Special Components ===&lt;br /&gt;
Special components allow you to perform specific and essential actions for a character sheet.&lt;br /&gt;
&lt;br /&gt;
==== Tables ====&lt;br /&gt;
Tables are spreadsheets that allow you to provide information for certain components, such as lists, tabs, etc.&lt;br /&gt;
&lt;br /&gt;
==== Script ====&lt;br /&gt;
The script is a JS file that allows you to perform more complete and complex actions than managing views alone.&lt;br /&gt;
&lt;br /&gt;
[[FirstScript|Your first step in the script]]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
&lt;br /&gt;
#[[Styling character sheets with classes|Build character sheets with Bootstrap]]&lt;br /&gt;
# [[Put a dice roll result in the sheet]]&lt;br /&gt;
# [[Use lists]]&lt;br /&gt;
# [[Use tabs]]&lt;br /&gt;
# [[Use repeaters]]&lt;br /&gt;
# [[Use Prompt]]&lt;br /&gt;
# [[Button|Use Button]]&lt;br /&gt;
# [[Manage Roll]]&lt;br /&gt;
# [[Show or hide components]]&lt;br /&gt;
# [[Progress bar]]&lt;br /&gt;
# [https://lets-role.com/help/fr/documentation/v1/component/avatar Configure the avatar properly]&lt;br /&gt;
# [[Create your first game table]]&lt;br /&gt;
# [[Asynchrone play]]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Use_tabs&amp;diff=110</id>
		<title>Use tabs</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Use_tabs&amp;diff=110"/>
		<updated>2025-10-09T14:05:32Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout d’un lien&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Using Tabs =&lt;br /&gt;
&lt;br /&gt;
== Step 1: Insert the Tab component ==&lt;br /&gt;
Insert a &#039;&#039;&#039;Tab&#039;&#039;&#039; component in your main view.  You don’t need to place anything else inside the view.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Create a table ==&lt;br /&gt;
Create a new &#039;&#039;&#039;Table&#039;&#039;&#039; (click on &#039;&#039;&#039;Tables&#039;&#039;&#039; on the right of &#039;&#039;&#039;Views&#039;&#039;&#039; in the &#039;&#039;SystemBuilder&#039;&#039;).  This table should contain:&lt;br /&gt;
&lt;br /&gt;
* an &#039;&#039;&#039;id&#039;&#039;&#039; column&lt;br /&gt;
* a &#039;&#039;&#039;title&#039;&#039;&#039; column&lt;br /&gt;
* a &#039;&#039;&#039;view&#039;&#039;&#039; column&lt;br /&gt;
&lt;br /&gt;
Add one row for each Tab you want to include in your Tab component (see image 3).&lt;br /&gt;
&lt;br /&gt;
== Step 3: Link the table to the Tab component ==&lt;br /&gt;
Select your Tab component (in the main view) and fill in the following fields:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Table&#039;&#039;&#039; → your created table&lt;br /&gt;
* &#039;&#039;&#039;Title&#039;&#039;&#039; → the &#039;&#039;title&#039;&#039; column&lt;br /&gt;
* &#039;&#039;&#039;View ID&#039;&#039;&#039; → the &#039;&#039;view&#039;&#039; column&lt;br /&gt;
&lt;br /&gt;
== Step 4: Customize the display ==&lt;br /&gt;
You can customize how the Tabs are displayed:&lt;br /&gt;
&lt;br /&gt;
* Show Tabs as a column instead of a row (check &#039;&#039;&#039;Vertical&#039;&#039;&#039;)&lt;br /&gt;
* Display labels vertically (check &#039;&#039;&#039;Vertical text&#039;&#039;&#039;)&lt;br /&gt;
* Show Tab labels on the right instead of the left (via the drop-down menu)&lt;br /&gt;
&lt;br /&gt;
== Step 5: Create subviews ==&lt;br /&gt;
For each Tab, create a &#039;&#039;&#039;Subview&#039;&#039;&#039; (&#039;&#039;&#039;[[Manage views|Create a new view]]&#039;&#039;&#039; → Type &#039;&#039;&#039;SubComponent&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
* Use the &#039;&#039;&#039;id&#039;&#039;&#039; corresponding to the &#039;&#039;view&#039;&#039; column&lt;br /&gt;
* Optional: use the &#039;&#039;title&#039;&#039; column value as the subview name&lt;br /&gt;
&lt;br /&gt;
These subviews will contain the content of each Tab.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=109</id>
		<title>System Builder</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=109"/>
		<updated>2025-10-08T17:22:21Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout de l’image du tuto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The System Builder is a tool for creating game systems for the [https://lets-role.com/ Let&#039;s Roll] gaming tables. It allows for the comprehensive construction of various essential tools such as player character sheets, as well as the creation of non-player character sheets, objects, and game monitoring tools for Game Masters.&lt;br /&gt;
&lt;br /&gt;
The tool is accessible to anyone with a Let&#039;s Roll account. It is designed so that anyone can develop their own system without any coding knowledge. The System Builder is equipped with coding tools (pseudoJS) that allow for the creation of complex, non-essential functionalities that will add a bit of convenience.&lt;br /&gt;
&lt;br /&gt;
=== First step ===&lt;br /&gt;
Quickstart video guide for creating systems in Let’s Role (🇫🇷 &#039;&#039;French only)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=F141URrFVwo&lt;br /&gt;
[[Fichier:Video_thumbnail_Start_on_SB.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
==== Interface ====&lt;br /&gt;
[[Fichier:Systemebuilder global.png|centré|vignette|900x900px]]&lt;br /&gt;
&lt;br /&gt;
# The title of the edited system&lt;br /&gt;
# [[Manage views|C]]&amp;lt;nowiki/&amp;gt;[[Manage views|reate new views]], navigate between [views]...&lt;br /&gt;
# The list of [[components|c]]&amp;lt;nowiki/&amp;gt;[[components|omponents]] usable for building a view&lt;br /&gt;
# [[Manage views|The dependency tree of views]]&lt;br /&gt;
# Launch the system on a table to [test the system]&lt;br /&gt;
# The tabs [view], [table], [script], [translation], the tools to develop a system&lt;br /&gt;
# The [preview of the sheet]&lt;br /&gt;
# The buttons [[Save, Deploy, and Exit]].&lt;br /&gt;
# The panel of the selected [component parameters]&lt;br /&gt;
&lt;br /&gt;
===== Views =====&lt;br /&gt;
Views are trees of components. They can be instantiated by the [tab] component or the [repeater] component to create complex and well-organized sheets.&lt;br /&gt;
&lt;br /&gt;
==== Creating a New View ====&lt;br /&gt;
To create a new view, click on the &amp;quot;Create a new view&amp;quot; button. Fill in the popup with an ID (no capital letters, no special characters, no numbers, and use underscores to separate words), for example: &amp;quot;vue_armes&amp;quot;. To switch views, use the dropdown list.&lt;br /&gt;
&lt;br /&gt;
==== Building a View ====&lt;br /&gt;
To build a view, use the components in window 3 by dragging and dropping them into the component tree of the view in window 4.&lt;br /&gt;
&lt;br /&gt;
===== Layout Components =====&lt;br /&gt;
Layout components are used to structure and organize components among themselves, such as rows, columns, and containers.&lt;br /&gt;
&lt;br /&gt;
TODO: Link to a tutorial&lt;br /&gt;
&lt;br /&gt;
===== Form Components =====&lt;br /&gt;
Form components are designed to contain the information for your character sheet.&lt;br /&gt;
&lt;br /&gt;
===== Container Components =====&lt;br /&gt;
Containers are components that can contain views to create complete and dynamic sheets.&lt;br /&gt;
&lt;br /&gt;
=== Special Components ===&lt;br /&gt;
Special components allow you to perform specific and essential actions for a character sheet.&lt;br /&gt;
&lt;br /&gt;
==== Tables ====&lt;br /&gt;
Tables are spreadsheets that allow you to provide information for certain components, such as lists, tabs, etc.&lt;br /&gt;
&lt;br /&gt;
==== Script ====&lt;br /&gt;
The script is a JS file that allows you to perform more complete and complex actions than managing views alone.&lt;br /&gt;
&lt;br /&gt;
[[FirstScript|Your first step in the script]]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
&lt;br /&gt;
#[[Styling character sheets with classes|Build character sheets with Bootstrap]]&lt;br /&gt;
# [[Put a dice roll result in the sheet]]&lt;br /&gt;
# [[Use lists]]&lt;br /&gt;
# [[Use tabs]]&lt;br /&gt;
# [[Use repeaters]]&lt;br /&gt;
# [[Use Prompt]]&lt;br /&gt;
# [[Button|Use Button]]&lt;br /&gt;
# [[Manage Roll]]&lt;br /&gt;
# [[Show or hide components]]&lt;br /&gt;
# [[Progress bar]]&lt;br /&gt;
# [https://lets-role.com/help/fr/documentation/v1/component/avatar Configure the avatar properly]&lt;br /&gt;
# [[Create your first game table]]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=108</id>
		<title>System Builder</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=108"/>
		<updated>2025-10-08T17:00:57Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout d’un nouveau tuto pour les bouton&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The System Builder is a tool for creating game systems for the [https://lets-role.com/ Let&#039;s Roll] gaming tables. It allows for the comprehensive construction of various essential tools such as player character sheets, as well as the creation of non-player character sheets, objects, and game monitoring tools for Game Masters.&lt;br /&gt;
&lt;br /&gt;
The tool is accessible to anyone with a Let&#039;s Roll account. It is designed so that anyone can develop their own system without any coding knowledge. The System Builder is equipped with coding tools (pseudoJS) that allow for the creation of complex, non-essential functionalities that will add a bit of convenience.&lt;br /&gt;
&lt;br /&gt;
=== First step ===&lt;br /&gt;
Quickstart video guide for creating systems in Let’s Role (🇫🇷 &#039;&#039;French only)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=F141URrFVwo&lt;br /&gt;
[[Fichier:Video_thumbnail_Start_on_SB.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
==== Interface ====&lt;br /&gt;
Inserez l&#039;image de l&#039;interface&lt;br /&gt;
&lt;br /&gt;
# The title of the edited system&lt;br /&gt;
# [[Manage views|C]]&amp;lt;nowiki/&amp;gt;[[Manage views|reate new views]], navigate between [views]...&lt;br /&gt;
# The list of [[components|c]]&amp;lt;nowiki/&amp;gt;[[components|omponents]] usable for building a view&lt;br /&gt;
# [The dependency tree of views]&lt;br /&gt;
# Launch the system on a table to [test the system]&lt;br /&gt;
# The tabs [view], [table], [script], [translation], the tools to develop a system&lt;br /&gt;
# The [preview of the sheet]&lt;br /&gt;
# The buttons [[Save, Deploy, and Exit]].&lt;br /&gt;
# The panel of the selected [component parameters]&lt;br /&gt;
&lt;br /&gt;
===== Views =====&lt;br /&gt;
Views are trees of components. They can be instantiated by the [tab] component or the [repeater] component to create complex and well-organized sheets.&lt;br /&gt;
&lt;br /&gt;
==== Creating a New View ====&lt;br /&gt;
To create a new view, click on the &amp;quot;Create a new view&amp;quot; button. Fill in the popup with an ID (no capital letters, no special characters, no numbers, and use underscores to separate words), for example: &amp;quot;vue_armes&amp;quot;. To switch views, use the dropdown list.&lt;br /&gt;
&lt;br /&gt;
==== Building a View ====&lt;br /&gt;
To build a view, use the components in window 3 by dragging and dropping them into the component tree of the view in window 4.&lt;br /&gt;
&lt;br /&gt;
===== Layout Components =====&lt;br /&gt;
Layout components are used to structure and organize components among themselves, such as rows, columns, and containers.&lt;br /&gt;
&lt;br /&gt;
TODO: Link to a tutorial&lt;br /&gt;
&lt;br /&gt;
===== Form Components =====&lt;br /&gt;
Form components are designed to contain the information for your character sheet.&lt;br /&gt;
&lt;br /&gt;
===== Container Components =====&lt;br /&gt;
Containers are components that can contain views to create complete and dynamic sheets.&lt;br /&gt;
&lt;br /&gt;
=== Special Components ===&lt;br /&gt;
Special components allow you to perform specific and essential actions for a character sheet.&lt;br /&gt;
&lt;br /&gt;
==== Tables ====&lt;br /&gt;
Tables are spreadsheets that allow you to provide information for certain components, such as lists, tabs, etc.&lt;br /&gt;
&lt;br /&gt;
==== Script ====&lt;br /&gt;
The script is a JS file that allows you to perform more complete and complex actions than managing views alone.&lt;br /&gt;
&lt;br /&gt;
[[FirstScript|Your first step in the script]]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
&lt;br /&gt;
#[[Styling character sheets with classes|Build character sheets with Bootstrap]]&lt;br /&gt;
# [[Put a dice roll result in the sheet]]&lt;br /&gt;
# [[Use lists]]&lt;br /&gt;
# [[Use tabs]]&lt;br /&gt;
# [[Use repeaters]]&lt;br /&gt;
# [[Use Prompt]]&lt;br /&gt;
# [[Button|Use Button]]&lt;br /&gt;
# [[Manage Roll]]&lt;br /&gt;
# [[Show or hide components]]&lt;br /&gt;
# [[Progress bar]]&lt;br /&gt;
# [https://lets-role.com/help/fr/documentation/v1/component/avatar Configure the avatar properly]&lt;br /&gt;
# [[Create your first game table]]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Manage_Roll&amp;diff=105</id>
		<title>Manage Roll</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Manage_Roll&amp;diff=105"/>
		<updated>2025-10-08T16:59:36Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : Page créée avec «  This page explains how to perform dice rolls using a script, how to present sub-rolls to the user, and how to interact with the results.  Several examples of roll construction are presented here.  Among the different ways to build a roll, the most recommended one is using the &amp;#039;&amp;#039;&amp;#039;RollBuilder&amp;#039;&amp;#039;&amp;#039;. ----  == Simple Roll == A simple roll consists of performing a dice roll triggered by a button through a script.  This action can be done without a complex script.  === R... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
This page explains how to perform dice rolls using a script, how to present sub-rolls to the user, and how to interact with the results.  Several examples of roll construction are presented here.&lt;br /&gt;
&lt;br /&gt;
Among the different ways to build a roll, the most recommended one is using the &#039;&#039;&#039;RollBuilder&#039;&#039;&#039;.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Simple Roll ==&lt;br /&gt;
A simple roll consists of performing a dice roll triggered by a button through a script.  This action can be done without a complex script.&lt;br /&gt;
&lt;br /&gt;
=== Required Components ===&lt;br /&gt;
For this script, you will need:&lt;br /&gt;
&lt;br /&gt;
* an icon that acts as a button (&#039;&#039;&amp;lt;code&amp;gt;roll1_button&amp;lt;/code&amp;gt;&#039;&#039;),&lt;br /&gt;
* a text input containing the dice expression (&#039;&#039;&amp;lt;code&amp;gt;roll1_value&amp;lt;/code&amp;gt;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== The script performs the following actions: ===&lt;br /&gt;
&lt;br /&gt;
# retrieves the components by their ID, &lt;br /&gt;
# creates a function that prepares the roll using the provided expression (for example: &#039;&#039;1d20&#039;&#039;), &lt;br /&gt;
# connects this function to the “click” event of the button.&lt;br /&gt;
&lt;br /&gt;
 const initSimpleRoll = function (sheet, id_roll_button, id_roll_value) {&lt;br /&gt;
     // 1 &lt;br /&gt;
     let roll_button = sheet.get(id_roll_button);&lt;br /&gt;
     let roll_value = sheet.get(id_roll_value);&lt;br /&gt;
     // 2&lt;br /&gt;
     const roll = function () {&lt;br /&gt;
         log(&amp;quot;START : simple roll cliked&amp;quot;);&lt;br /&gt;
         // creer le jet&lt;br /&gt;
         let roll = new RollBuilder(sheet);&lt;br /&gt;
             // configuer le jet&lt;br /&gt;
             roll = roll.expression(roll_value.value());&lt;br /&gt;
             roll = roll.visibility(&amp;quot;all&amp;quot;);&lt;br /&gt;
             roll = roll.title(&amp;quot;Simple Roll&amp;quot;);&lt;br /&gt;
             // lancer le jet&lt;br /&gt;
             roll.roll();&lt;br /&gt;
             log(&amp;quot;END : simple roll clicked&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
     // 3 &lt;br /&gt;
     roll_button.on(&amp;quot;click&amp;quot;, roll);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Add an Action to a Roll ==&lt;br /&gt;
In many game systems, player actions consist of multiple rolls.  For example, an attack may require a first roll to determine if the target is hit, and a second roll to calculate the damage.&lt;br /&gt;
&lt;br /&gt;
You can add &#039;&#039;&#039;sub-actions&#039;&#039;&#039; to your rolls.  These actions appear as small white buttons below the result of the main roll.&lt;br /&gt;
&lt;br /&gt;
=== View Composition ===&lt;br /&gt;
For this example, you will need: &lt;br /&gt;
&lt;br /&gt;
* two text inputs containing the expressions of the main and sub-rolls (&#039;&#039;&amp;lt;code&amp;gt;roll2_value&amp;lt;/code&amp;gt;&#039;&#039; and &#039;&#039;&amp;lt;code&amp;gt;roll2_action_value&amp;lt;/code&amp;gt;&#039;&#039;),&lt;br /&gt;
* one button to trigger the first roll (&#039;&#039;&amp;lt;code&amp;gt;roll2_button&amp;lt;/code&amp;gt;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The corresponding script:&lt;br /&gt;
&lt;br /&gt;
# retrieves the components by their IDs,&lt;br /&gt;
# creates a function that performs the sub-action when it is clicked,&lt;br /&gt;
# prepares the first roll and attaches the action to it,&lt;br /&gt;
# connects everything to the click event on the button.&lt;br /&gt;
&lt;br /&gt;
 const initActionRoll = function (sheet, id_roll_button, id_roll_value, id_roll_action_value) {&lt;br /&gt;
     // 1&lt;br /&gt;
     let roll_button = sheet.get(id_roll_button);&lt;br /&gt;
     let roll_value = sheet.get(id_roll_value);&lt;br /&gt;
     let roll_action_value = sheet.get(id_roll_action_value);&lt;br /&gt;
     // 2  &lt;br /&gt;
     const rollAction = function (result) {&lt;br /&gt;
         log(&amp;quot;START : action roll cliked&amp;quot;);&lt;br /&gt;
         let roll_action = new RollBuilder(sheet);&lt;br /&gt;
         roll_action = roll_action.expression(roll_action_value.value());&lt;br /&gt;
         roll_action = roll_action.visibility(&amp;quot;all&amp;quot;);&lt;br /&gt;
         roll_action = roll_action.title(&amp;quot;Action Roll&amp;quot;);&lt;br /&gt;
         roll_action.roll();&lt;br /&gt;
         log(&amp;quot;END : action roll clicked&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
     // 3&lt;br /&gt;
     const roll = function () {&lt;br /&gt;
         log(&amp;quot;START : roll cliked&amp;quot;);&lt;br /&gt;
         let roll = new RollBuilder(sheet);&lt;br /&gt;
         roll = roll.expression(roll_value.value());&lt;br /&gt;
         roll = roll.visibility(&amp;quot;all&amp;quot;);&lt;br /&gt;
         roll = roll.title(&amp;quot;Roll&amp;quot;);&lt;br /&gt;
         roll = roll.addAction(&amp;quot;Action name&amp;quot;, rollAction);&lt;br /&gt;
         roll.roll();&lt;br /&gt;
         log(&amp;quot;END : roll clicked&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
     // 4&lt;br /&gt;
     roll_button.on(&amp;quot;click&amp;quot;, roll);&lt;br /&gt;
 }&lt;br /&gt;
This allows you to add multiple actions to your rolls.  &lt;br /&gt;
&lt;br /&gt;
For each additional action, simply create a new function (&amp;lt;nowiki&amp;gt;&#039;&#039;rollAction1&#039;&#039;, &#039;&#039;rollAction2&#039;&#039;&amp;lt;/nowiki&amp;gt;, etc.) with the desired behavior and add it to the main roll.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;nowiki&amp;gt;&#039;&#039;results&#039;&#039;&amp;lt;/nowiki&amp;gt; argument passed to an action function contains the result of the parent roll.  &lt;br /&gt;
&lt;br /&gt;
This allows you to detect specific cases such as critical hits and adjust the behavior accordingly.&lt;br /&gt;
&lt;br /&gt;
== Automatic Action ==&lt;br /&gt;
An automatic action is a secondary effect that triggers as soon as a roll is completed.  It can be used, for example, to:&lt;br /&gt;
&lt;br /&gt;
* automatically record the result of a roll on the sheet,&lt;br /&gt;
* update a resource such as mana or health points.&lt;br /&gt;
&lt;br /&gt;
==== Building the View ====&lt;br /&gt;
For this example, you will need:&lt;br /&gt;
&lt;br /&gt;
* a button to trigger the roll (&amp;lt;code&amp;gt;roll3_button&amp;lt;/code&amp;gt;),&lt;br /&gt;
* a text input containing the roll expression (&amp;lt;code&amp;gt;roll3_value&amp;lt;/code&amp;gt;),&lt;br /&gt;
* a component where the result will be displayed (&amp;lt;code&amp;gt;roll3_mark&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The associated script: &lt;br /&gt;
&lt;br /&gt;
# retrieves the components by their IDs, &lt;br /&gt;
# creates a function that writes the roll result automatically in the designated component, &lt;br /&gt;
# creates a function that is triggered when the button is clicked, &lt;br /&gt;
# links both functions together to execute the automatic action.&lt;br /&gt;
&lt;br /&gt;
 const initAutoAction = function(sheet,id_roll_button, id_roll_value, id_roll_mark){&lt;br /&gt;
     // 1 &lt;br /&gt;
     let roll_button = sheet.get(id_roll_button);&lt;br /&gt;
     let roll_value = sheet.get(id_roll_value);&lt;br /&gt;
     let roll_mark = sheet.get(id_roll_mark);&lt;br /&gt;
     //2&lt;br /&gt;
     const autoAction = function (result) {&lt;br /&gt;
         log(&amp;quot;START : action roll cliked&amp;quot;);&lt;br /&gt;
         roll_mark.value(result.total);&lt;br /&gt;
     }&lt;br /&gt;
     // 3&lt;br /&gt;
     const roll = function () {&lt;br /&gt;
         log(&amp;quot;START : roll cliked&amp;quot;);&lt;br /&gt;
         let roll = new RollBuilder(sheet);&lt;br /&gt;
         roll = roll.expression(roll_value.value());&lt;br /&gt;
         roll = roll.visibility(&amp;quot;all&amp;quot;);&lt;br /&gt;
         roll = roll.title(&amp;quot;Roll&amp;quot;);&lt;br /&gt;
         // renseigner la fonction automatique&lt;br /&gt;
         roll = roll.onRoll(autoAction);&lt;br /&gt;
         roll.roll();&lt;br /&gt;
         log(&amp;quot;END : roll clicked&amp;quot;)&lt;br /&gt;
     }&lt;br /&gt;
     //4 &lt;br /&gt;
     roll_button.on(&amp;quot;click&amp;quot;, roll);&lt;br /&gt;
 }&lt;br /&gt;
This approach allows you to add many automation features to your character sheet.  &lt;br /&gt;
&lt;br /&gt;
You can also combine regular and automatic actions, or even nest actions inside other actions to create complex game mechanics.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Button&amp;diff=107</id>
		<title>Button</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Button&amp;diff=107"/>
		<updated>2025-10-08T16:27:24Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout d’un tuto pour les lancé de jet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Buttons =&lt;br /&gt;
Buttons are components that can trigger multiple actions.&lt;br /&gt;
&lt;br /&gt;
There are three main ways to create a button:  the first two are simple, while the third allows you to build more complex buttons.&lt;br /&gt;
&lt;br /&gt;
== Button with an icon ==&lt;br /&gt;
&lt;br /&gt;
# Add an &#039;&#039;&#039;Icon&#039;&#039;&#039; component and choose the desired icon.&lt;br /&gt;
# You can assign an action to the icon in two different ways:&lt;br /&gt;
#* Fill in the &#039;&#039;&#039;Roll&#039;&#039;&#039; field with a dice roll and the roll’s title.  &lt;br /&gt;
#* Add the class &#039;&#039;&#039;clickable&#039;&#039;&#039; and [link|connect the button to a JS script].  &lt;br /&gt;
&lt;br /&gt;
== Button with a label ==&lt;br /&gt;
&lt;br /&gt;
# Add a &#039;&#039;&#039;Label&#039;&#039;&#039; component and set the text to the value you want.&lt;br /&gt;
# Create an action for the button in two ways:&lt;br /&gt;
#* Fill in the &#039;&#039;&#039;Roll&#039;&#039;&#039; field with a dice roll and check the &#039;&#039;&#039;Clickable&#039;&#039;&#039; option.&lt;br /&gt;
#* Add the class &#039;&#039;&#039;clickable&#039;&#039;&#039; and connect the button to a JS script.  &lt;br /&gt;
&lt;br /&gt;
== Complex button with a container ==&lt;br /&gt;
Sometimes, you may want to create more advanced buttons by overlaying multiple elements (icons, labels, etc.).&lt;br /&gt;
&lt;br /&gt;
# Place a &#039;&#039;&#039;Container&#039;&#039;&#039;.&lt;br /&gt;
# Add the elements you want to overlay inside this container.&lt;br /&gt;
# Add the &#039;&#039;&#039;position-absolute&#039;&#039;&#039; class to each of the components inside the container so that they overlap.&lt;br /&gt;
# Use m and p] classes to adjust positioning.&lt;br /&gt;
# Adjust opacity, size, and color to differentiate the elements.&lt;br /&gt;
# Finally, add the &#039;&#039;&#039;clickable&#039;&#039;&#039; class to the parent container so that the whole button reacts on hover.&lt;br /&gt;
# Assign an &#039;&#039;&#039;id&#039;&#039;&#039; to the container (e.g., &#039;&#039;button_action&#039;&#039;) so you can connect it to your script.&lt;br /&gt;
&lt;br /&gt;
== Connect the button to a script ==&lt;br /&gt;
To link a button to a scripted action:&lt;br /&gt;
&lt;br /&gt;
# Define a clear &#039;&#039;&#039;id&#039;&#039;&#039; for your button (e.g., &#039;&#039;button_action&#039;&#039;, &#039;&#039;button_roll&#039;&#039;, &#039;&#039;button_hide&#039;&#039;...).&lt;br /&gt;
# Create an initialization function to connect the button to an action.&lt;br /&gt;
&lt;br /&gt;
 init = function(sheet) {&lt;br /&gt;
     if (sheet.id() === &amp;quot;main&amp;quot;) {&lt;br /&gt;
         initMain(sheet);&lt;br /&gt;
     }&lt;br /&gt;
 };&lt;br /&gt;
 const initMain = function(sheet) {&lt;br /&gt;
     // Main initialization&lt;br /&gt;
     initButton(sheet);&lt;br /&gt;
 };&lt;br /&gt;
 const initButton = function(sheet){&lt;br /&gt;
     log(&amp;quot;START INIT BUTTON&amp;quot;);&lt;br /&gt;
     // Define the button action when clicked&lt;br /&gt;
     const buttonAction = function () {&lt;br /&gt;
         // Add instructions to execute here&lt;br /&gt;
     };&lt;br /&gt;
     // Get the button component using its ID&lt;br /&gt;
     let button = sheet.get(&amp;quot;button_action&amp;quot;);&lt;br /&gt;
     // Connect the &amp;quot;click&amp;quot; action to the buttonAction function&lt;br /&gt;
     button.on(&amp;quot;click&amp;quot;, buttonAction);&lt;br /&gt;
     log(&amp;quot;END INIT BUTTON&amp;quot;);&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
== Using buttons ==&lt;br /&gt;
You can find tutorials that use buttons here:&lt;br /&gt;
&lt;br /&gt;
# [[Manage Roll]]&lt;br /&gt;
# Hide and show elements [TODO]&lt;br /&gt;
# Send information to the chat [TODO]&lt;br /&gt;
# Move a view inside a repeater [TODO]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=106</id>
		<title>System Builder</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=106"/>
		<updated>2025-10-01T12:06:02Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout du fien vers le boutton&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The System Builder is a tool for creating game systems for the [https://lets-role.com/ Let&#039;s Roll] gaming tables. It allows for the comprehensive construction of various essential tools such as player character sheets, as well as the creation of non-player character sheets, objects, and game monitoring tools for Game Masters.&lt;br /&gt;
&lt;br /&gt;
The tool is accessible to anyone with a Let&#039;s Roll account. It is designed so that anyone can develop their own system without any coding knowledge. The System Builder is equipped with coding tools (pseudoJS) that allow for the creation of complex, non-essential functionalities that will add a bit of convenience.&lt;br /&gt;
&lt;br /&gt;
=== First step ===&lt;br /&gt;
Quickstart video guide for creating systems in Let’s Role (🇫🇷 &#039;&#039;French only)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=F141URrFVwo&lt;br /&gt;
[[Fichier:Video_thumbnail_Start_on_SB.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
==== Interface ====&lt;br /&gt;
Inserez l&#039;image de l&#039;interface&lt;br /&gt;
&lt;br /&gt;
# The title of the edited system&lt;br /&gt;
# [[Manage views|C]]&amp;lt;nowiki/&amp;gt;[[Manage views|reate new views]], navigate between [views]...&lt;br /&gt;
# The list of [[components|c]]&amp;lt;nowiki/&amp;gt;[[components|omponents]] usable for building a view&lt;br /&gt;
# [The dependency tree of views]&lt;br /&gt;
# Launch the system on a table to [test the system]&lt;br /&gt;
# The tabs [view], [table], [script], [translation], the tools to develop a system&lt;br /&gt;
# The [preview of the sheet]&lt;br /&gt;
# The buttons [[Save, Deploy, and Exit]].&lt;br /&gt;
# The panel of the selected [component parameters]&lt;br /&gt;
&lt;br /&gt;
===== Views =====&lt;br /&gt;
Views are trees of components. They can be instantiated by the [tab] component or the [repeater] component to create complex and well-organized sheets.&lt;br /&gt;
&lt;br /&gt;
==== Creating a New View ====&lt;br /&gt;
To create a new view, click on the &amp;quot;Create a new view&amp;quot; button. Fill in the popup with an ID (no capital letters, no special characters, no numbers, and use underscores to separate words), for example: &amp;quot;vue_armes&amp;quot;. To switch views, use the dropdown list.&lt;br /&gt;
&lt;br /&gt;
==== Building a View ====&lt;br /&gt;
To build a view, use the components in window 3 by dragging and dropping them into the component tree of the view in window 4.&lt;br /&gt;
&lt;br /&gt;
===== Layout Components =====&lt;br /&gt;
Layout components are used to structure and organize components among themselves, such as rows, columns, and containers.&lt;br /&gt;
&lt;br /&gt;
TODO: Link to a tutorial&lt;br /&gt;
&lt;br /&gt;
===== Form Components =====&lt;br /&gt;
Form components are designed to contain the information for your character sheet.&lt;br /&gt;
&lt;br /&gt;
===== Container Components =====&lt;br /&gt;
Containers are components that can contain views to create complete and dynamic sheets.&lt;br /&gt;
&lt;br /&gt;
=== Special Components ===&lt;br /&gt;
Special components allow you to perform specific and essential actions for a character sheet.&lt;br /&gt;
&lt;br /&gt;
==== Tables ====&lt;br /&gt;
Tables are spreadsheets that allow you to provide information for certain components, such as lists, tabs, etc.&lt;br /&gt;
&lt;br /&gt;
==== Script ====&lt;br /&gt;
The script is a JS file that allows you to perform more complete and complex actions than managing views alone.&lt;br /&gt;
&lt;br /&gt;
[[FirstScript|Your first step in the script]]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
&lt;br /&gt;
#[[Styling character sheets with classes|Build character sheets with Bootstrap]]&lt;br /&gt;
# [[Put a dice roll result in the sheet]]&lt;br /&gt;
# [[Use lists]]&lt;br /&gt;
# [[Use tabs]]&lt;br /&gt;
# [[Use repeaters]]&lt;br /&gt;
# [[Use Prompt]]&lt;br /&gt;
# [[Button|Use Button]]&lt;br /&gt;
# [[Show or hide components]]&lt;br /&gt;
# [[Progress bar]]&lt;br /&gt;
# [https://lets-role.com/help/fr/documentation/v1/component/avatar Configure the avatar properly]&lt;br /&gt;
# [[Create your first game table]]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Use_Prompt&amp;diff=104</id>
		<title>Use Prompt</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Use_Prompt&amp;diff=104"/>
		<updated>2025-09-27T21:42:23Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : correction des tablutation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Let&#039;s Role, &#039;&#039;&#039;prompts&#039;&#039;&#039; are used to display a window showing text or a form to collect information.  &lt;br /&gt;
This is very useful to ask for confirmation, or to request bonuses or penalties related to a roll.&lt;br /&gt;
&lt;br /&gt;
To create and use a prompt, you need to use a &#039;&#039;&#039;script&#039;&#039;&#039; and build a &#039;&#039;&#039;view&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This page shows three tutorials, from the simplest to the most advanced:&lt;br /&gt;
&lt;br /&gt;
* a tutorial to create a prompt that simply displays text (for tutorials or tooltips),&lt;br /&gt;
* a tutorial to chain multiple prompts to build a multi-page tutorial,&lt;br /&gt;
* a tutorial to use prompts as forms to input modifiers or additional dice in a roll.&lt;br /&gt;
&lt;br /&gt;
== Tutorial 1: Create a simple prompt ==&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
The first step is to create a [[button]] that triggers the script.&lt;br /&gt;
&lt;br /&gt;
Note: you can trigger a prompt with any other event in your script.&lt;br /&gt;
[[Fichier:Tuto prompt tutorial view 1.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Build a prompt view ===&lt;br /&gt;
The prompt that appears is actually a &#039;&#039;&#039;[[Manage views|view]]&#039;&#039;&#039; you need to build. &lt;br /&gt;
&lt;br /&gt;
The ID of this view must be defined properly, since it will be used in the script.&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Here is a script that manages the prompt display.  &lt;br /&gt;
This function does three things:&lt;br /&gt;
&lt;br /&gt;
* detects the click on the button, &lt;br /&gt;
* shows the prompt, &lt;br /&gt;
* handles the closing of the prompt.  &lt;br /&gt;
&lt;br /&gt;
Most of these actions are handled by the &#039;&#039;&#039;[https://lets-role.com/help/fr/documentation/v1/scripting/api-prompt sheet.prompt(...)]&#039;&#039;&#039; function.&lt;br /&gt;
&lt;br /&gt;
The third argument is optional, but allows you to close the prompt when the &#039;&#039;Continue&#039;&#039; button is clicked.&lt;br /&gt;
[[Fichier:Tuto prompt example 1.png|vignette]]&lt;br /&gt;
 const promptTutorial = function(sheet){&lt;br /&gt;
     let tutorial_view = &amp;quot;view_prompt_tutorial&amp;quot;;&lt;br /&gt;
     let tutorial_title = &amp;quot;prompt tutorial&amp;quot;;&lt;br /&gt;
     let tutorial_button = sheet.get(&amp;quot;display_tutorial_1&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
     tutorial_button.on(&amp;quot;click&amp;quot;, function(){&lt;br /&gt;
         sheet.prompt(tutorial_title, tutorial_view, function(){});&lt;br /&gt;
     })&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Tutorial 2: Chained prompts ==&lt;br /&gt;
A chained tutorial shows several pages in sequence.&lt;br /&gt;
When you click &#039;&#039;Continue&#039;&#039;, the next page is displayed.&lt;br /&gt;
[[Fichier:Tuto prompt tutorial view 2.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
As in the first tutorial, create a button to trigger the prompt.&lt;br /&gt;
&lt;br /&gt;
=== Create the views ===&lt;br /&gt;
Each page of the tutorial must be created as a separate view.&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
The display of the next page is requested in the closing function of the previous prompt.&lt;br /&gt;
 const promptTutorial2 = function(sheet){&lt;br /&gt;
     let tutorial_view_1 = &amp;quot;view_prompt_tutorial&amp;quot;;&lt;br /&gt;
     let tutorial_view_2 = &amp;quot;view_prompt_tutorial_2&amp;quot;;&lt;br /&gt;
     let tutorial_title = &amp;quot;prompt tutorial&amp;quot;;&lt;br /&gt;
     let tutorial_button = sheet.get(&amp;quot;display_tutorial_2&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
     tutorial_button.on(&amp;quot;click&amp;quot;, function(){&lt;br /&gt;
         sheet.prompt(tutorial_title + &amp;quot; (1/2)&amp;quot;, tutorial_view_1, function(){&lt;br /&gt;
             sheet.prompt(tutorial_title + &amp;quot; (2/2)&amp;quot;, tutorial_view_2, function(){})&lt;br /&gt;
         });&lt;br /&gt;
     })&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Tutorial 3: Prompt as a form ==&lt;br /&gt;
A prompt can also be used as a &#039;&#039;&#039;form&#039;&#039;&#039; to collect information, fill fields, or add variables to a roll.&lt;br /&gt;
[[Fichier:Tuto prompt form button.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
Prepare a button that will open the prompt, just like a roll [[button]]. &lt;br /&gt;
[[Fichier:Tuto prompt form.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Create the prompts ===&lt;br /&gt;
Build your prompts with appropriate input fields (&#039;&#039;&#039;TextInput&#039;&#039;&#039;, &#039;&#039;&#039;NumberInput&#039;&#039;&#039;, etc.).&lt;br /&gt;
&lt;br /&gt;
For example, a prompt that asks for the roll name and a modifier.&lt;br /&gt;
&lt;br /&gt;
=== Prepare a script ===&lt;br /&gt;
The script must include a closing function to handle and process the entered data.&lt;br /&gt;
&lt;br /&gt;
You can also define an initialization function to configure the display (e.g. pre-fill some fields).&lt;br /&gt;
 const initPromptExample = function (sheet) {&lt;br /&gt;
     log(&amp;quot;START init prompt&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
     // Prompt initialization&lt;br /&gt;
     const promptInitialization = function (prompte_view) {&lt;br /&gt;
         log(&amp;quot;START prompt initialization&amp;quot;);&lt;br /&gt;
         prompte_view.get(&amp;quot;prompt_name&amp;quot;).value(sheet.get(&amp;quot;prompt_name&amp;quot;).value());&lt;br /&gt;
         prompte_view.get(&amp;quot;prompt_roll&amp;quot;).value(sheet.get(&amp;quot;prompt_roll&amp;quot;).value());&lt;br /&gt;
         log(&amp;quot;END prompt initialization&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // Process prompt results&lt;br /&gt;
     const promptAccepte = function (prompte_results) {&lt;br /&gt;
         log(&amp;quot;START prompt results&amp;quot;);&lt;br /&gt;
         let roll = prompte_results.prompt_roll;&lt;br /&gt;
         log(&amp;quot;mod : [&amp;quot; + prompte_results.prompt_modificator + &amp;quot;]&amp;quot;);&lt;br /&gt;
         if (prompte_results.prompt_modificator != undefined &amp;amp;&amp;amp; prompte_results.prompt_modificator != 0) {&lt;br /&gt;
             roll += &amp;quot;+&amp;quot; + prompte_results.prompt_modificator + &amp;quot;[Modifier]&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
         log(&amp;quot;-- roll : &amp;quot; + roll);&lt;br /&gt;
         Dice.roll(sheet, roll, prompte_results.prompt_name);&lt;br /&gt;
         log(&amp;quot;END prompt results&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // ID of the view displayed as prompt&lt;br /&gt;
     let prompt_view = &amp;quot;view_prompt&amp;quot;;&lt;br /&gt;
     let prompt_name = &amp;quot;&amp;quot;;&lt;br /&gt;
     let roll_button = sheet.get(&amp;quot;prompt_roll_button&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     // Show the prompt when the button is clicked&lt;br /&gt;
     roll_button.on(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
         sheet.prompt(prompt_name, prompt_view, promptAccepte, promptInitialization);&lt;br /&gt;
     });&lt;br /&gt;
     log(&amp;quot;END init prompt&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
[[Fichier:Tuto prompt form display.png|centré]]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Use_Prompt&amp;diff=103</id>
		<title>Use Prompt</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Use_Prompt&amp;diff=103"/>
		<updated>2025-09-27T21:33:02Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : fin des ajput&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Let&#039;s Role, &#039;&#039;&#039;prompts&#039;&#039;&#039; are used to display a window showing text or a form to collect information.  &lt;br /&gt;
This is very useful to ask for confirmation, or to request bonuses or penalties related to a roll.&lt;br /&gt;
&lt;br /&gt;
To create and use a prompt, you need to use a &#039;&#039;&#039;script&#039;&#039;&#039; and build a &#039;&#039;&#039;view&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This page shows three tutorials, from the simplest to the most advanced:&lt;br /&gt;
&lt;br /&gt;
* a tutorial to create a prompt that simply displays text (for tutorials or tooltips),&lt;br /&gt;
* a tutorial to chain multiple prompts to build a multi-page tutorial,&lt;br /&gt;
* a tutorial to use prompts as forms to input modifiers or additional dice in a roll.&lt;br /&gt;
&lt;br /&gt;
== Tutorial 1: Create a simple prompt ==&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
The first step is to create a [[button]] that triggers the script.&lt;br /&gt;
&lt;br /&gt;
Note: you can trigger a prompt with any other event in your script.&lt;br /&gt;
[[Fichier:Tuto prompt tutorial view 1.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Build a prompt view ===&lt;br /&gt;
The prompt that appears is actually a &#039;&#039;&#039;[[Manage views|view]]&#039;&#039;&#039; you need to build. &lt;br /&gt;
&lt;br /&gt;
The ID of this view must be defined properly, since it will be used in the script.&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Here is a script that manages the prompt display.  &lt;br /&gt;
This function does three things:&lt;br /&gt;
&lt;br /&gt;
* detects the click on the button, &lt;br /&gt;
* shows the prompt, &lt;br /&gt;
* handles the closing of the prompt.  &lt;br /&gt;
&lt;br /&gt;
Most of these actions are handled by the &#039;&#039;&#039;[https://lets-role.com/help/fr/documentation/v1/scripting/api-prompt sheet.prompt(...)]&#039;&#039;&#039; function.&lt;br /&gt;
&lt;br /&gt;
The third argument is optional, but allows you to close the prompt when the &#039;&#039;Continue&#039;&#039; button is clicked.&lt;br /&gt;
[[Fichier:Tuto prompt example 1.png|vignette]]&lt;br /&gt;
 const promptTutorial = function(sheet){&lt;br /&gt;
    let tutorial_view = &amp;quot;view_prompt_tutorial&amp;quot;;&lt;br /&gt;
    let tutorial_title = &amp;quot;prompt tutorial&amp;quot;;&lt;br /&gt;
    let tutorial_button = sheet.get(&amp;quot;display_tutorial_1&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    tutorial_button.on(&amp;quot;click&amp;quot;, function(){&lt;br /&gt;
        sheet.prompt(tutorial_title, tutorial_view, function(){});&lt;br /&gt;
    })&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Tutorial 2: Chained prompts ==&lt;br /&gt;
A chained tutorial shows several pages in sequence.&lt;br /&gt;
When you click &#039;&#039;Continue&#039;&#039;, the next page is displayed.&lt;br /&gt;
[[Fichier:Tuto prompt tutorial view 2.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
As in the first tutorial, create a button to trigger the prompt.&lt;br /&gt;
&lt;br /&gt;
=== Create the views ===&lt;br /&gt;
Each page of the tutorial must be created as a separate view.&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
The display of the next page is requested in the closing function of the previous prompt.&lt;br /&gt;
 const promptTutorial2 = function(sheet){&lt;br /&gt;
  let tutorial_view_1 = &amp;quot;view_prompt_tutorial&amp;quot;;&lt;br /&gt;
  let tutorial_view_2 = &amp;quot;view_prompt_tutorial_2&amp;quot;;&lt;br /&gt;
  let tutorial_title = &amp;quot;prompt tutorial&amp;quot;;&lt;br /&gt;
  let tutorial_button = sheet.get(&amp;quot;display_tutorial_2&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  tutorial_button.on(&amp;quot;click&amp;quot;, function(){&lt;br /&gt;
      sheet.prompt(tutorial_title + &amp;quot; (1/2)&amp;quot;, tutorial_view_1, function(){&lt;br /&gt;
          sheet.prompt(tutorial_title + &amp;quot; (2/2)&amp;quot;, tutorial_view_2, function(){})&lt;br /&gt;
      });&lt;br /&gt;
  })&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Tutorial 3: Prompt as a form ==&lt;br /&gt;
A prompt can also be used as a &#039;&#039;&#039;form&#039;&#039;&#039; to collect information, fill fields, or add variables to a roll.&lt;br /&gt;
[[Fichier:Tuto prompt form button.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
Prepare a button that will open the prompt, just like a roll [[button]]. &lt;br /&gt;
[[Fichier:Tuto prompt form.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Create the prompts ===&lt;br /&gt;
Build your prompts with appropriate input fields (&#039;&#039;&#039;TextInput&#039;&#039;&#039;, &#039;&#039;&#039;NumberInput&#039;&#039;&#039;, etc.).&lt;br /&gt;
&lt;br /&gt;
For example, a prompt that asks for the roll name and a modifier.&lt;br /&gt;
&lt;br /&gt;
=== Prepare a script ===&lt;br /&gt;
The script must include a closing function to handle and process the entered data.&lt;br /&gt;
&lt;br /&gt;
You can also define an initialization function to configure the display (e.g. pre-fill some fields).&lt;br /&gt;
 const initPromptExample = function (sheet) {&lt;br /&gt;
   log(&amp;quot;START init prompt&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
   // Prompt initialization&lt;br /&gt;
   const promptInitialization = function (prompte_view) {&lt;br /&gt;
       log(&amp;quot;START prompt initialization&amp;quot;);&lt;br /&gt;
       prompte_view.get(&amp;quot;prompt_name&amp;quot;).value(sheet.get(&amp;quot;prompt_name&amp;quot;).value());&lt;br /&gt;
       prompte_view.get(&amp;quot;prompt_roll&amp;quot;).value(sheet.get(&amp;quot;prompt_roll&amp;quot;).value());&lt;br /&gt;
       log(&amp;quot;END prompt initialization&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // Process prompt results&lt;br /&gt;
   const promptAccepte = function (prompte_results) {&lt;br /&gt;
       log(&amp;quot;START prompt results&amp;quot;);&lt;br /&gt;
       let roll = prompte_results.prompt_roll;&lt;br /&gt;
       log(&amp;quot;mod : [&amp;quot; + prompte_results.prompt_modificator + &amp;quot;]&amp;quot;);&lt;br /&gt;
       if (prompte_results.prompt_modificator != undefined &amp;amp;&amp;amp; prompte_results.prompt_modificator != 0) {&lt;br /&gt;
           roll += &amp;quot;+&amp;quot; + prompte_results.prompt_modificator + &amp;quot;[Modifier]&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
       log(&amp;quot;-- roll : &amp;quot; + roll);&lt;br /&gt;
       Dice.roll(sheet, roll, prompte_results.prompt_name);&lt;br /&gt;
       log(&amp;quot;END prompt results&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // ID of the view displayed as prompt&lt;br /&gt;
   let prompt_view = &amp;quot;view_prompt&amp;quot;;&lt;br /&gt;
   let prompt_name = &amp;quot;&amp;quot;;&lt;br /&gt;
   let roll_button = sheet.get(&amp;quot;prompt_roll_button&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   // Show the prompt when the button is clicked&lt;br /&gt;
   roll_button.on(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
       sheet.prompt(prompt_name, prompt_view, promptAccepte, promptInitialization);&lt;br /&gt;
   });&lt;br /&gt;
   log(&amp;quot;END init prompt&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
[[Fichier:Tuto prompt form display.png|centré]]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_form_display.png&amp;diff=102</id>
		<title>Fichier:Tuto prompt form display.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_form_display.png&amp;diff=102"/>
		<updated>2025-09-27T21:31:04Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Use_Prompt&amp;diff=101</id>
		<title>Use Prompt</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Use_Prompt&amp;diff=101"/>
		<updated>2025-09-27T21:17:09Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : les image sont ajouter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Let&#039;s Role, &#039;&#039;&#039;prompts&#039;&#039;&#039; are used to display a window showing text or a form to collect information.  &lt;br /&gt;
This is very useful to ask for confirmation, or to request bonuses or penalties related to a roll.&lt;br /&gt;
&lt;br /&gt;
To create and use a prompt, you need to use a &#039;&#039;&#039;script&#039;&#039;&#039; and build a &#039;&#039;&#039;view&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This page shows three tutorials, from the simplest to the most advanced:&lt;br /&gt;
&lt;br /&gt;
* a tutorial to create a prompt that simply displays text (for tutorials or tooltips),&lt;br /&gt;
* a tutorial to chain multiple prompts to build a multi-page tutorial,&lt;br /&gt;
* a tutorial to use prompts as forms to input modifiers or additional dice in a roll.&lt;br /&gt;
&lt;br /&gt;
== Tutorial 1: Create a simple prompt ==&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
The first step is to create a [[button]] that triggers the script.&lt;br /&gt;
&lt;br /&gt;
Note: you can trigger a prompt with any other event in your script.&lt;br /&gt;
[[Fichier:Tuto prompt tutorial view 1.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Build a prompt view ===&lt;br /&gt;
The prompt that appears is actually a &#039;&#039;&#039;[[Manage views|view]]&#039;&#039;&#039; you need to build. &lt;br /&gt;
&lt;br /&gt;
The ID of this view must be defined properly, since it will be used in the script.&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Here is a script that manages the prompt display.  &lt;br /&gt;
This function does three things:&lt;br /&gt;
&lt;br /&gt;
* detects the click on the button, &lt;br /&gt;
* shows the prompt, &lt;br /&gt;
* handles the closing of the prompt.  &lt;br /&gt;
&lt;br /&gt;
Most of these actions are handled by the &#039;&#039;&#039;[https://lets-role.com/help/fr/documentation/v1/scripting/api-prompt sheet.prompt(...)]&#039;&#039;&#039; function.&lt;br /&gt;
&lt;br /&gt;
The third argument is optional, but allows you to close the prompt when the &#039;&#039;Continue&#039;&#039; button is clicked.&lt;br /&gt;
[[Fichier:Tuto prompt example 1.png|vignette]]&lt;br /&gt;
 const promptTutorial = function(sheet){&lt;br /&gt;
    let tutorial_view = &amp;quot;view_prompt_tutorial&amp;quot;;&lt;br /&gt;
    let tutorial_title = &amp;quot;prompt tutorial&amp;quot;;&lt;br /&gt;
    let tutorial_button = sheet.get(&amp;quot;display_tutorial_1&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    tutorial_button.on(&amp;quot;click&amp;quot;, function(){&lt;br /&gt;
        sheet.prompt(tutorial_title, tutorial_view, function(){});&lt;br /&gt;
    })&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Tutorial 2: Chained prompts ==&lt;br /&gt;
A chained tutorial shows several pages in sequence.&lt;br /&gt;
When you click &#039;&#039;Continue&#039;&#039;, the next page is displayed.&lt;br /&gt;
[[Fichier:Tuto prompt tutorial view 2.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
As in the first tutorial, create a button to trigger the prompt.&lt;br /&gt;
&lt;br /&gt;
=== Create the views ===&lt;br /&gt;
Each page of the tutorial must be created as a separate view.&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
The display of the next page is requested in the closing function of the previous prompt.&lt;br /&gt;
 const promptTutorial2 = function(sheet){&lt;br /&gt;
  let tutorial_view_1 = &amp;quot;view_prompt_tutorial&amp;quot;;&lt;br /&gt;
  let tutorial_view_2 = &amp;quot;view_prompt_tutorial_2&amp;quot;;&lt;br /&gt;
  let tutorial_title = &amp;quot;prompt tutorial&amp;quot;;&lt;br /&gt;
  let tutorial_button = sheet.get(&amp;quot;display_tutorial_2&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  tutorial_button.on(&amp;quot;click&amp;quot;, function(){&lt;br /&gt;
      sheet.prompt(tutorial_title + &amp;quot; (1/2)&amp;quot;, tutorial_view_1, function(){&lt;br /&gt;
          sheet.prompt(tutorial_title + &amp;quot; (2/2)&amp;quot;, tutorial_view_2, function(){})&lt;br /&gt;
      });&lt;br /&gt;
  })&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Tutorial 3: Prompt as a form ==&lt;br /&gt;
A prompt can also be used as a &#039;&#039;&#039;form&#039;&#039;&#039; to collect information, fill fields, or add variables to a roll.&lt;br /&gt;
[[Fichier:Tuto prompt form button.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
Prepare a button that will open the prompt, just like a roll [[button]]. &lt;br /&gt;
[[Fichier:Tuto prompt form.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Create the prompts ===&lt;br /&gt;
Build your prompts with appropriate input fields (&#039;&#039;&#039;TextInput&#039;&#039;&#039;, &#039;&#039;&#039;NumberInput&#039;&#039;&#039;, etc.).&lt;br /&gt;
&lt;br /&gt;
For example, a prompt that asks for the roll name and a modifier.&lt;br /&gt;
&lt;br /&gt;
=== Prepare a script ===&lt;br /&gt;
The script must include a closing function to handle and process the entered data.&lt;br /&gt;
&lt;br /&gt;
You can also define an initialization function to configure the display (e.g. pre-fill some fields).&lt;br /&gt;
 const initPromptExample = function (sheet) {&lt;br /&gt;
   log(&amp;quot;START init prompt&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
   // Prompt initialization&lt;br /&gt;
   const promptInitialization = function (prompte_view) {&lt;br /&gt;
       log(&amp;quot;START prompt initialization&amp;quot;);&lt;br /&gt;
       prompte_view.get(&amp;quot;prompt_name&amp;quot;).value(sheet.get(&amp;quot;prompt_name&amp;quot;).value());&lt;br /&gt;
       prompte_view.get(&amp;quot;prompt_roll&amp;quot;).value(sheet.get(&amp;quot;prompt_roll&amp;quot;).value());&lt;br /&gt;
       log(&amp;quot;END prompt initialization&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // Process prompt results&lt;br /&gt;
   const promptAccepte = function (prompte_results) {&lt;br /&gt;
       log(&amp;quot;START prompt results&amp;quot;);&lt;br /&gt;
       let roll = prompte_results.prompt_roll;&lt;br /&gt;
       log(&amp;quot;mod : [&amp;quot; + prompte_results.prompt_modificator + &amp;quot;]&amp;quot;);&lt;br /&gt;
       if (prompte_results.prompt_modificator != undefined &amp;amp;&amp;amp; prompte_results.prompt_modificator != 0) {&lt;br /&gt;
           roll += &amp;quot;+&amp;quot; + prompte_results.prompt_modificator + &amp;quot;[Modifier]&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
       log(&amp;quot;-- roll : &amp;quot; + roll);&lt;br /&gt;
       Dice.roll(sheet, roll, prompte_results.prompt_name);&lt;br /&gt;
       log(&amp;quot;END prompt results&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // ID of the view displayed as prompt&lt;br /&gt;
   let prompt_view = &amp;quot;view_prompt&amp;quot;;&lt;br /&gt;
   let prompt_name = &amp;quot;&amp;quot;;&lt;br /&gt;
   let roll_button = sheet.get(&amp;quot;prompt_roll_button&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   // Show the prompt when the button is clicked&lt;br /&gt;
   roll_button.on(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
       sheet.prompt(prompt_name, prompt_view, promptAccepte, promptInitialization);&lt;br /&gt;
   });&lt;br /&gt;
   log(&amp;quot;END init prompt&amp;quot;);&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_tutorial_view_2.png&amp;diff=100</id>
		<title>Fichier:Tuto prompt tutorial view 2.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_tutorial_view_2.png&amp;diff=100"/>
		<updated>2025-09-27T21:14:11Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : Neo-Teyrall a téléversé une nouvelle version de Fichier:Tuto prompt tutorial view 2.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Use_Prompt&amp;diff=94</id>
		<title>Use Prompt</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Use_Prompt&amp;diff=94"/>
		<updated>2025-09-27T21:06:04Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : premier jet sans les image&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prompts =&lt;br /&gt;
In Let&#039;s Role, &#039;&#039;&#039;prompts&#039;&#039;&#039; are used to display a window showing text or a form to collect information.  &lt;br /&gt;
This is very useful to ask for confirmation, or to request bonuses or penalties related to a roll.&lt;br /&gt;
&lt;br /&gt;
To create and use a prompt, you need to use a &#039;&#039;&#039;script&#039;&#039;&#039; and build a &#039;&#039;&#039;view&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This page shows three tutorials, from the simplest to the most advanced:&lt;br /&gt;
&lt;br /&gt;
* a tutorial to create a prompt that simply displays text (for tutorials or tooltips),&lt;br /&gt;
* a tutorial to chain multiple prompts to build a multi-page tutorial,&lt;br /&gt;
* a tutorial to use prompts as forms to input modifiers or additional dice in a roll.&lt;br /&gt;
&lt;br /&gt;
== Tutorial 1: Create a simple prompt ==&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
The first step is to create a [[button]] that triggers the script.&lt;br /&gt;
&lt;br /&gt;
Note: you can trigger a prompt with any other event in your script.&lt;br /&gt;
&lt;br /&gt;
=== Build a prompt view ===&lt;br /&gt;
The prompt that appears is actually a &#039;&#039;&#039;[[Manage views|view]]&#039;&#039;&#039; you need to build. &lt;br /&gt;
&lt;br /&gt;
The ID of this view must be defined properly, since it will be used in the script.&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
Here is a script that manages the prompt display.  &lt;br /&gt;
This function does three things:&lt;br /&gt;
&lt;br /&gt;
* detects the click on the button, &lt;br /&gt;
* shows the prompt, &lt;br /&gt;
* handles the closing of the prompt.  &lt;br /&gt;
&lt;br /&gt;
Most of these actions are handled by the &#039;&#039;&#039;[https://lets-role.com/help/fr/documentation/v1/scripting/api-prompt sheet.prompt(...)]&#039;&#039;&#039; function.&lt;br /&gt;
&lt;br /&gt;
The third argument is optional, but allows you to close the prompt when the &#039;&#039;Continue&#039;&#039; button is clicked.&lt;br /&gt;
&lt;br /&gt;
 const promptTutorial = function(sheet){&lt;br /&gt;
    let tutorial_view = &amp;quot;view_prompt_tutorial&amp;quot;;&lt;br /&gt;
    let tutorial_title = &amp;quot;prompt tutorial&amp;quot;;&lt;br /&gt;
    let tutorial_button = sheet.get(&amp;quot;display_tutorial_1&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    tutorial_button.on(&amp;quot;click&amp;quot;, function(){&lt;br /&gt;
        sheet.prompt(tutorial_title, tutorial_view, function(){});&lt;br /&gt;
    })&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Tutorial 2: Chained prompts ==&lt;br /&gt;
A chained tutorial shows several pages in sequence.&lt;br /&gt;
When you click &#039;&#039;Continue&#039;&#039;, the next page is displayed.&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
As in the first tutorial, create a button to trigger the prompt.&lt;br /&gt;
&lt;br /&gt;
=== Create the views ===&lt;br /&gt;
Each page of the tutorial must be created as a separate view.&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
The display of the next page is requested in the closing function of the previous prompt.&lt;br /&gt;
 const promptTutorial2 = function(sheet){&lt;br /&gt;
  let tutorial_view_1 = &amp;quot;view_prompt_tutorial&amp;quot;;&lt;br /&gt;
  let tutorial_view_2 = &amp;quot;view_prompt_tutorial_2&amp;quot;;&lt;br /&gt;
  let tutorial_title = &amp;quot;prompt tutorial&amp;quot;;&lt;br /&gt;
  let tutorial_button = sheet.get(&amp;quot;display_tutorial_2&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  tutorial_button.on(&amp;quot;click&amp;quot;, function(){&lt;br /&gt;
      sheet.prompt(tutorial_title + &amp;quot; (1/2)&amp;quot;, tutorial_view_1, function(){&lt;br /&gt;
          sheet.prompt(tutorial_title + &amp;quot; (2/2)&amp;quot;, tutorial_view_2, function(){})&lt;br /&gt;
      });&lt;br /&gt;
  })&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Tutorial 3: Prompt as a form ==&lt;br /&gt;
A prompt can also be used as a &#039;&#039;&#039;form&#039;&#039;&#039; to collect information, fill fields, or add variables to a roll.&lt;br /&gt;
&lt;br /&gt;
=== Create a button ===&lt;br /&gt;
Prepare a button that will open the prompt, just like a roll [[button]]. &lt;br /&gt;
&lt;br /&gt;
=== Create the prompts ===&lt;br /&gt;
Build your prompts with appropriate input fields (&#039;&#039;&#039;TextInput&#039;&#039;&#039;, &#039;&#039;&#039;NumberInput&#039;&#039;&#039;, etc.).&lt;br /&gt;
&lt;br /&gt;
For example, a prompt that asks for the roll name and a modifier.&lt;br /&gt;
&lt;br /&gt;
=== Prepare a script ===&lt;br /&gt;
The script must include a closing function to handle and process the entered data.&lt;br /&gt;
&lt;br /&gt;
You can also define an initialization function to configure the display (e.g. pre-fill some fields).&lt;br /&gt;
 const initPromptExample = function (sheet) {&lt;br /&gt;
   log(&amp;quot;START init prompt&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
   // Prompt initialization&lt;br /&gt;
   const promptInitialization = function (prompte_view) {&lt;br /&gt;
       log(&amp;quot;START prompt initialization&amp;quot;);&lt;br /&gt;
       prompte_view.get(&amp;quot;prompt_name&amp;quot;).value(sheet.get(&amp;quot;prompt_name&amp;quot;).value());&lt;br /&gt;
       prompte_view.get(&amp;quot;prompt_roll&amp;quot;).value(sheet.get(&amp;quot;prompt_roll&amp;quot;).value());&lt;br /&gt;
       log(&amp;quot;END prompt initialization&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // Process prompt results&lt;br /&gt;
   const promptAccepte = function (prompte_results) {&lt;br /&gt;
       log(&amp;quot;START prompt results&amp;quot;);&lt;br /&gt;
       let roll = prompte_results.prompt_roll;&lt;br /&gt;
       log(&amp;quot;mod : [&amp;quot; + prompte_results.prompt_modificator + &amp;quot;]&amp;quot;);&lt;br /&gt;
       if (prompte_results.prompt_modificator != undefined &amp;amp;&amp;amp; prompte_results.prompt_modificator != 0) {&lt;br /&gt;
           roll += &amp;quot;+&amp;quot; + prompte_results.prompt_modificator + &amp;quot;[Modifier]&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
       log(&amp;quot;-- roll : &amp;quot; + roll);&lt;br /&gt;
       Dice.roll(sheet, roll, prompte_results.prompt_name);&lt;br /&gt;
       log(&amp;quot;END prompt results&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // ID of the view displayed as prompt&lt;br /&gt;
   let prompt_view = &amp;quot;view_prompt&amp;quot;;&lt;br /&gt;
   let prompt_name = &amp;quot;&amp;quot;;&lt;br /&gt;
   let roll_button = sheet.get(&amp;quot;prompt_roll_button&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   // Show the prompt when the button is clicked&lt;br /&gt;
   roll_button.on(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
       sheet.prompt(prompt_name, prompt_view, promptAccepte, promptInitialization);&lt;br /&gt;
   });&lt;br /&gt;
   log(&amp;quot;END init prompt&amp;quot;);&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_tutorial_view_1.png&amp;diff=99</id>
		<title>Fichier:Tuto prompt tutorial view 1.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_tutorial_view_1.png&amp;diff=99"/>
		<updated>2025-09-27T21:05:46Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_tutorial_view_2.png&amp;diff=98</id>
		<title>Fichier:Tuto prompt tutorial view 2.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_tutorial_view_2.png&amp;diff=98"/>
		<updated>2025-09-27T21:05:38Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_example_1.png&amp;diff=97</id>
		<title>Fichier:Tuto prompt example 1.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_example_1.png&amp;diff=97"/>
		<updated>2025-09-27T21:05:30Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_form.png&amp;diff=96</id>
		<title>Fichier:Tuto prompt form.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_form.png&amp;diff=96"/>
		<updated>2025-09-27T21:05:19Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_form_button.png&amp;diff=95</id>
		<title>Fichier:Tuto prompt form button.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_prompt_form_button.png&amp;diff=95"/>
		<updated>2025-09-27T21:05:02Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=93</id>
		<title>System Builder</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=93"/>
		<updated>2025-09-27T20:21:15Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout du lien vers prompte&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The System Builder is a tool for creating game systems for the [https://lets-role.com/ Let&#039;s Roll] gaming tables. It allows for the comprehensive construction of various essential tools such as player character sheets, as well as the creation of non-player character sheets, objects, and game monitoring tools for Game Masters.&lt;br /&gt;
&lt;br /&gt;
The tool is accessible to anyone with a Let&#039;s Roll account. It is designed so that anyone can develop their own system without any coding knowledge. The System Builder is equipped with coding tools (pseudoJS) that allow for the creation of complex, non-essential functionalities that will add a bit of convenience.&lt;br /&gt;
&lt;br /&gt;
=== First step ===&lt;br /&gt;
Quickstart video guide for creating systems in Let’s Role (🇫🇷 &#039;&#039;French only)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=F141URrFVwo&lt;br /&gt;
[[Fichier:Video_thumbnail_Start_on_SB.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
==== Interface ====&lt;br /&gt;
Inserez l&#039;image de l&#039;interface&lt;br /&gt;
&lt;br /&gt;
# The title of the edited system&lt;br /&gt;
# [[Manage views|C]]&amp;lt;nowiki/&amp;gt;[[Manage views|reate new views]], navigate between [views]...&lt;br /&gt;
# The list of [[components|c]]&amp;lt;nowiki/&amp;gt;[[components|omponents]] usable for building a view&lt;br /&gt;
# [The dependency tree of views]&lt;br /&gt;
# Launch the system on a table to [test the system]&lt;br /&gt;
# The tabs [view], [table], [script], [translation], the tools to develop a system&lt;br /&gt;
# The [preview of the sheet]&lt;br /&gt;
# The buttons [[Save, Deploy, and Exit]].&lt;br /&gt;
# The panel of the selected [component parameters]&lt;br /&gt;
&lt;br /&gt;
===== Views =====&lt;br /&gt;
Views are trees of components. They can be instantiated by the [tab] component or the [repeater] component to create complex and well-organized sheets.&lt;br /&gt;
&lt;br /&gt;
==== Creating a New View ====&lt;br /&gt;
To create a new view, click on the &amp;quot;Create a new view&amp;quot; button. Fill in the popup with an ID (no capital letters, no special characters, no numbers, and use underscores to separate words), for example: &amp;quot;vue_armes&amp;quot;. To switch views, use the dropdown list.&lt;br /&gt;
&lt;br /&gt;
==== Building a View ====&lt;br /&gt;
To build a view, use the components in window 3 by dragging and dropping them into the component tree of the view in window 4.&lt;br /&gt;
&lt;br /&gt;
===== Layout Components =====&lt;br /&gt;
Layout components are used to structure and organize components among themselves, such as rows, columns, and containers.&lt;br /&gt;
&lt;br /&gt;
TODO: Link to a tutorial&lt;br /&gt;
&lt;br /&gt;
===== Form Components =====&lt;br /&gt;
Form components are designed to contain the information for your character sheet.&lt;br /&gt;
&lt;br /&gt;
===== Container Components =====&lt;br /&gt;
Containers are components that can contain views to create complete and dynamic sheets.&lt;br /&gt;
&lt;br /&gt;
=== Special Components ===&lt;br /&gt;
Special components allow you to perform specific and essential actions for a character sheet.&lt;br /&gt;
&lt;br /&gt;
==== Tables ====&lt;br /&gt;
Tables are spreadsheets that allow you to provide information for certain components, such as lists, tabs, etc.&lt;br /&gt;
&lt;br /&gt;
==== Script ====&lt;br /&gt;
The script is a JS file that allows you to perform more complete and complex actions than managing views alone.&lt;br /&gt;
&lt;br /&gt;
[[FirstScript|Your first step in the script]]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
&lt;br /&gt;
#[[Styling character sheets with classes|Build character sheets with Bootstrap]]&lt;br /&gt;
# [[Put a dice roll result in the sheet]]&lt;br /&gt;
# [[Use lists]]&lt;br /&gt;
# [[Use tabs]]&lt;br /&gt;
# [[Use repeaters]]&lt;br /&gt;
# [[Use Prompt]]&lt;br /&gt;
# [[Show or hide components]]&lt;br /&gt;
# [[Progress bar]]&lt;br /&gt;
# [https://lets-role.com/help/fr/documentation/v1/component/avatar Configure the avatar properly]&lt;br /&gt;
# [[Create your first game table]]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Create_your_first_game_table&amp;diff=92</id>
		<title>Create your first game table</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Create_your_first_game_table&amp;diff=92"/>
		<updated>2025-09-23T10:03:18Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It’s the big day! You’re ready and want to create your game table, either from an existing system or from your own custom system.  This page explains step by step how to do it.&lt;br /&gt;
&lt;br /&gt;
== Using an existing system ==&lt;br /&gt;
&lt;br /&gt;
=== From the store ===&lt;br /&gt;
[[Fichier:Tuto creat table shop.png|droite|486x486px]]&lt;br /&gt;
If you want to play one of the most famous role-playing games, go to the &#039;&#039;&#039;Store&#039;&#039;&#039;.  Search for the system of your choice (for example D&amp;amp;D), click on &#039;&#039;&#039;View system&#039;&#039;&#039;, and then on &#039;&#039;&#039;Create a new table&#039;&#039;&#039;.  Follow the instructions in the table creation wizard.&lt;br /&gt;
&lt;br /&gt;
=== From the table manager ===&lt;br /&gt;
[[Fichier:Tuto_creat_table_table.png|droite|486x486px]]&lt;br /&gt;
Go to the &#039;&#039;&#039;Tables&#039;&#039;&#039; tab, then click on &#039;&#039;&#039;Create a table&#039;&#039;&#039;.  Select a system, enter a title, and validate.  Then follow the table creation wizard.&lt;br /&gt;
&lt;br /&gt;
== Using a system you created ==&lt;br /&gt;
You have created a system from scratch, or forked an existing one, and now you want to create a table based on it.&lt;br /&gt;
&lt;br /&gt;
=== Private system ===&lt;br /&gt;
[[Fichier:Tuto creat table systeme.png|droite|691x691px]]&lt;br /&gt;
If you want to keep your system private so others cannot see it:&lt;br /&gt;
&lt;br /&gt;
*go to the &#039;&#039;&#039;System Builder&#039;&#039;&#039;;&lt;br /&gt;
*click on &#039;&#039;&#039;Create a new table&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Public system ===&lt;br /&gt;
If you want to share your system with all Let&#039;s Role users, you can publish it.  To do so, open the management menu of your system and check the option &#039;&#039;&#039;Publish this system&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== ⚠️ Warning: the System Builder table ====&lt;br /&gt;
In your tables list, there is a special table that starts with &#039;&#039;&#039;[Builder]&#039;&#039;&#039;.  This table is used by the &#039;&#039;System Builder&#039;&#039; to test your system.  You cannot join this table from the Tables tab: the connection will fail and an error message will be displayed.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_creat_table_systeme.png&amp;diff=91</id>
		<title>Fichier:Tuto creat table systeme.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_creat_table_systeme.png&amp;diff=91"/>
		<updated>2025-09-23T09:51:23Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Create_your_first_game_table&amp;diff=90</id>
		<title>Create your first game table</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Create_your_first_game_table&amp;diff=90"/>
		<updated>2025-09-22T18:46:17Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout des deux image&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It’s the big day! You’re ready and want to create your game table, either from an existing system or from your own custom system.  This page explains step by step how to do it.&lt;br /&gt;
&lt;br /&gt;
== Using an existing system ==&lt;br /&gt;
&lt;br /&gt;
=== From the store ===&lt;br /&gt;
[[Fichier:Tuto creat table shop.png|droite|486x486px]]&lt;br /&gt;
If you want to play one of the most famous role-playing games, go to the &#039;&#039;&#039;Store&#039;&#039;&#039;.  Search for the system of your choice (for example D&amp;amp;D), click on &#039;&#039;&#039;View system&#039;&#039;&#039;, and then on &#039;&#039;&#039;Create a new table&#039;&#039;&#039;.  Follow the instructions in the table creation wizard.&lt;br /&gt;
&lt;br /&gt;
=== From the table manager ===&lt;br /&gt;
[[Fichier:Tuto_creat_table_table.png|droite|486x486px]]&lt;br /&gt;
Go to the &#039;&#039;&#039;Tables&#039;&#039;&#039; tab, then click on &#039;&#039;&#039;Create a table&#039;&#039;&#039;.  Select a system, enter a title, and validate.  Then follow the table creation wizard.&lt;br /&gt;
&lt;br /&gt;
== Using a system you created ==&lt;br /&gt;
You have created a system from scratch, or forked an existing one, and now you want to create a table based on it.&lt;br /&gt;
&lt;br /&gt;
=== Private system ===&lt;br /&gt;
If you want to keep your system private so others cannot see it:&lt;br /&gt;
&lt;br /&gt;
*go to the &#039;&#039;&#039;System Builder&#039;&#039;&#039;;&lt;br /&gt;
*click on &#039;&#039;&#039;Create a new table&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Public system ===&lt;br /&gt;
If you want to share your system with all Let&#039;s Role users, you can publish it.  To do so, open the management menu of your system and check the option &#039;&#039;&#039;Publish this system&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== ⚠️ Warning: the System Builder table ====&lt;br /&gt;
In your tables list, there is a special table that starts with &#039;&#039;&#039;[Builder]&#039;&#039;&#039;.  This table is used by the &#039;&#039;System Builder&#039;&#039; to test your system.  You cannot join this table from the Tables tab: the connection will fail and an error message will be displayed.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_creat_table_shop.png&amp;diff=89</id>
		<title>Fichier:Tuto creat table shop.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_creat_table_shop.png&amp;diff=89"/>
		<updated>2025-09-22T18:42:28Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_creat_table_table.png&amp;diff=88</id>
		<title>Fichier:Tuto creat table table.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_creat_table_table.png&amp;diff=88"/>
		<updated>2025-09-22T18:40:44Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=87</id>
		<title>System Builder</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=87"/>
		<updated>2025-09-22T18:39:51Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout d&amp;#039;un autre tuto sur la création d&amp;#039;un tuto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The System Builder is a tool for creating game systems for the [https://lets-role.com/ Let&#039;s Roll] gaming tables. It allows for the comprehensive construction of various essential tools such as player character sheets, as well as the creation of non-player character sheets, objects, and game monitoring tools for Game Masters.&lt;br /&gt;
&lt;br /&gt;
The tool is accessible to anyone with a Let&#039;s Roll account. It is designed so that anyone can develop their own system without any coding knowledge. The System Builder is equipped with coding tools (pseudoJS) that allow for the creation of complex, non-essential functionalities that will add a bit of convenience.&lt;br /&gt;
&lt;br /&gt;
=== First step ===&lt;br /&gt;
Quickstart video guide for creating systems in Let’s Role (🇫🇷 &#039;&#039;French only)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=F141URrFVwo&lt;br /&gt;
[[Fichier:Video_thumbnail_Start_on_SB.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
==== Interface ====&lt;br /&gt;
Inserez l&#039;image de l&#039;interface&lt;br /&gt;
&lt;br /&gt;
# The title of the edited system&lt;br /&gt;
# [[Manage views|C]]&amp;lt;nowiki/&amp;gt;[[Manage views|reate new views]], navigate between [views]...&lt;br /&gt;
# The list of [[components|c]]&amp;lt;nowiki/&amp;gt;[[components|omponents]] usable for building a view&lt;br /&gt;
# [The dependency tree of views]&lt;br /&gt;
# Launch the system on a table to [test the system]&lt;br /&gt;
# The tabs [view], [table], [script], [translation], the tools to develop a system&lt;br /&gt;
# The [preview of the sheet]&lt;br /&gt;
# The buttons [[Save, Deploy, and Exit]].&lt;br /&gt;
# The panel of the selected [component parameters]&lt;br /&gt;
&lt;br /&gt;
===== Views =====&lt;br /&gt;
Views are trees of components. They can be instantiated by the [tab] component or the [repeater] component to create complex and well-organized sheets.&lt;br /&gt;
&lt;br /&gt;
==== Creating a New View ====&lt;br /&gt;
To create a new view, click on the &amp;quot;Create a new view&amp;quot; button. Fill in the popup with an ID (no capital letters, no special characters, no numbers, and use underscores to separate words), for example: &amp;quot;vue_armes&amp;quot;. To switch views, use the dropdown list.&lt;br /&gt;
&lt;br /&gt;
==== Building a View ====&lt;br /&gt;
To build a view, use the components in window 3 by dragging and dropping them into the component tree of the view in window 4.&lt;br /&gt;
&lt;br /&gt;
===== Layout Components =====&lt;br /&gt;
Layout components are used to structure and organize components among themselves, such as rows, columns, and containers.&lt;br /&gt;
&lt;br /&gt;
TODO: Link to a tutorial&lt;br /&gt;
&lt;br /&gt;
===== Form Components =====&lt;br /&gt;
Form components are designed to contain the information for your character sheet.&lt;br /&gt;
&lt;br /&gt;
===== Container Components =====&lt;br /&gt;
Containers are components that can contain views to create complete and dynamic sheets.&lt;br /&gt;
&lt;br /&gt;
=== Special Components ===&lt;br /&gt;
Special components allow you to perform specific and essential actions for a character sheet.&lt;br /&gt;
&lt;br /&gt;
==== Tables ====&lt;br /&gt;
Tables are spreadsheets that allow you to provide information for certain components, such as lists, tabs, etc.&lt;br /&gt;
&lt;br /&gt;
==== Script ====&lt;br /&gt;
The script is a JS file that allows you to perform more complete and complex actions than managing views alone.&lt;br /&gt;
&lt;br /&gt;
[[FirstScript|Your first step in the script]]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
&lt;br /&gt;
#[[Styling character sheets with classes|Build character sheets with Bootstrap]]&lt;br /&gt;
# [[Put a dice roll result in the sheet]]&lt;br /&gt;
# [[Use lists]]&lt;br /&gt;
# [[Use tabs]]&lt;br /&gt;
# [[Use repeaters]]&lt;br /&gt;
# [[Show or hide components]]&lt;br /&gt;
# [[Progress bar]]&lt;br /&gt;
# [https://lets-role.com/help/fr/documentation/v1/component/avatar Configure the avatar properly]&lt;br /&gt;
# [[Create your first game table]]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Create_your_first_game_table&amp;diff=86</id>
		<title>Create your first game table</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Create_your_first_game_table&amp;diff=86"/>
		<updated>2025-09-22T17:11:08Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : premier jet de la page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It’s the big day! You’re ready and want to create your game table, either from an existing system or from your own custom system.  This page explains step by step how to do it.&lt;br /&gt;
&lt;br /&gt;
== Using an existing system ==&lt;br /&gt;
&lt;br /&gt;
=== From the store ===&lt;br /&gt;
If you want to play one of the most famous role-playing games, go to the &#039;&#039;&#039;Store&#039;&#039;&#039;.  Search for the system of your choice (for example D&amp;amp;D), click on &#039;&#039;&#039;View system&#039;&#039;&#039;, and then on &#039;&#039;&#039;Create a new table&#039;&#039;&#039;.  Follow the instructions in the table creation wizard.&lt;br /&gt;
&lt;br /&gt;
=== From the table manager ===&lt;br /&gt;
Go to the &#039;&#039;&#039;Tables&#039;&#039;&#039; tab, then click on &#039;&#039;&#039;Create a table&#039;&#039;&#039;.  Select a system, enter a title, and validate.  Then follow the table creation wizard.&lt;br /&gt;
&lt;br /&gt;
== Using a system you created ==&lt;br /&gt;
You have created a system from scratch, or forked an existing one, and now you want to create a table based on it.&lt;br /&gt;
&lt;br /&gt;
=== Private system ===&lt;br /&gt;
If you want to keep your system private so others cannot see it:&lt;br /&gt;
&lt;br /&gt;
* go to the &#039;&#039;&#039;System Builder&#039;&#039;&#039;;&lt;br /&gt;
* click on &#039;&#039;&#039;Create a new table&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Public system ===&lt;br /&gt;
If you want to share your system with all Let&#039;s Role users, you can publish it.  To do so, open the management menu of your system and check the option &#039;&#039;&#039;Publish this system&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== ⚠️ Warning: the System Builder table ====&lt;br /&gt;
In your tables list, there is a special table that starts with &#039;&#039;&#039;[Builder]&#039;&#039;&#039;.  This table is used by the &#039;&#039;System Builder&#039;&#039; to test your system.  You cannot join this table from the Tables tab: the connection will fail and an error message will be displayed.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Save,_Deploy,_and_Exit&amp;diff=85</id>
		<title>Save, Deploy, and Exit</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Save,_Deploy,_and_Exit&amp;diff=85"/>
		<updated>2025-09-22T16:52:54Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout d&amp;#039;une image pour illustrer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Tuto button save deploy exit.png|droite]]&lt;br /&gt;
This page explains the three buttons: &#039;&#039;&#039;Save&#039;&#039;&#039;, &#039;&#039;&#039;Deploy&#039;&#039;&#039;, and &#039;&#039;&#039;Exit&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Exit ==&lt;br /&gt;
The &#039;&#039;&#039;Exit&#039;&#039;&#039; button allows you to leave the System Builder editor.  &lt;br /&gt;
&lt;br /&gt;
If you try to exit without saving, a warning will notify you that your work has not been saved.&lt;br /&gt;
&lt;br /&gt;
== Save ==&lt;br /&gt;
The &#039;&#039;&#039;Save&#039;&#039;&#039; button stores your current work so you can continue later.  &lt;br /&gt;
&lt;br /&gt;
Make sure to save frequently, either by clicking &#039;&#039;&#039;Save&#039;&#039;&#039; or using the &#039;&#039;&#039;Ctrl + S&#039;&#039;&#039; shortcut.  &lt;br /&gt;
&lt;br /&gt;
⚠️ To make your changes visible in the &#039;&#039;&#039;test tabl&#039;&#039;&#039;*, you must save your system.  &lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;&#039;Save&#039;&#039;&#039; does &#039;&#039;&#039;not&#039;&#039;&#039; update your live game tables.&lt;br /&gt;
&lt;br /&gt;
== Deploy a system ==&lt;br /&gt;
The &#039;&#039;&#039;Deploy&#039;&#039;&#039; button creates a new version of your system.  The deploy action give the possibility to add a comment that is crucial to keep tracs on the modification. &lt;br /&gt;
&lt;br /&gt;
- This version is automatically updated on all your game tables using this system.  &lt;br /&gt;
&lt;br /&gt;
- A &#039;&#039;&#039;restore point&#039;&#039;&#039; is automatically created, allowing you to roll back if you make a mistake.  &lt;br /&gt;
&lt;br /&gt;
Deploy your system carefully:  &lt;br /&gt;
&lt;br /&gt;
- when a feature is ready,  &lt;br /&gt;
&lt;br /&gt;
- or after significant progress in your development.  &lt;br /&gt;
&lt;br /&gt;
⚠️ Warning: &#039;&#039;&#039;deploying&#039;&#039;&#039; a system immediately updates your players’ tables. Avoid deploying a system that is still under development&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_button_save_deploy_exit.png&amp;diff=84</id>
		<title>Fichier:Tuto button save deploy exit.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_button_save_deploy_exit.png&amp;diff=84"/>
		<updated>2025-09-22T16:51:31Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=83</id>
		<title>System Builder</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=83"/>
		<updated>2025-09-22T16:49:10Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout du lien vers la nouvelle page save deploy and exit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The System Builder is a tool for creating game systems for the [https://lets-role.com/ Let&#039;s Roll] gaming tables. It allows for the comprehensive construction of various essential tools such as player character sheets, as well as the creation of non-player character sheets, objects, and game monitoring tools for Game Masters.&lt;br /&gt;
&lt;br /&gt;
The tool is accessible to anyone with a Let&#039;s Roll account. It is designed so that anyone can develop their own system without any coding knowledge. The System Builder is equipped with coding tools (pseudoJS) that allow for the creation of complex, non-essential functionalities that will add a bit of convenience.&lt;br /&gt;
&lt;br /&gt;
=== First step ===&lt;br /&gt;
Quickstart video guide for creating systems in Let’s Role (🇫🇷 &#039;&#039;French only)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=F141URrFVwo&lt;br /&gt;
[[Fichier:Video_thumbnail_Start_on_SB.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
==== Interface ====&lt;br /&gt;
Inserez l&#039;image de l&#039;interface&lt;br /&gt;
&lt;br /&gt;
# The title of the edited system&lt;br /&gt;
# [[Manage views|C]]&amp;lt;nowiki/&amp;gt;[[Manage views|reate new views]], navigate between [views]...&lt;br /&gt;
# The list of [[components|c]]&amp;lt;nowiki/&amp;gt;[[components|omponents]] usable for building a view&lt;br /&gt;
# [The dependency tree of views]&lt;br /&gt;
# Launch the system on a table to [test the system]&lt;br /&gt;
# The tabs [view], [table], [script], [translation], the tools to develop a system&lt;br /&gt;
# The [preview of the sheet]&lt;br /&gt;
# The buttons [[Save, Deploy, and Exit]].&lt;br /&gt;
# The panel of the selected [component parameters]&lt;br /&gt;
&lt;br /&gt;
===== Views =====&lt;br /&gt;
Views are trees of components. They can be instantiated by the [tab] component or the [repeater] component to create complex and well-organized sheets.&lt;br /&gt;
&lt;br /&gt;
==== Creating a New View ====&lt;br /&gt;
To create a new view, click on the &amp;quot;Create a new view&amp;quot; button. Fill in the popup with an ID (no capital letters, no special characters, no numbers, and use underscores to separate words), for example: &amp;quot;vue_armes&amp;quot;. To switch views, use the dropdown list.&lt;br /&gt;
&lt;br /&gt;
==== Building a View ====&lt;br /&gt;
To build a view, use the components in window 3 by dragging and dropping them into the component tree of the view in window 4.&lt;br /&gt;
&lt;br /&gt;
===== Layout Components =====&lt;br /&gt;
Layout components are used to structure and organize components among themselves, such as rows, columns, and containers.&lt;br /&gt;
&lt;br /&gt;
TODO: Link to a tutorial&lt;br /&gt;
&lt;br /&gt;
===== Form Components =====&lt;br /&gt;
Form components are designed to contain the information for your character sheet.&lt;br /&gt;
&lt;br /&gt;
===== Container Components =====&lt;br /&gt;
Containers are components that can contain views to create complete and dynamic sheets.&lt;br /&gt;
&lt;br /&gt;
=== Special Components ===&lt;br /&gt;
Special components allow you to perform specific and essential actions for a character sheet.&lt;br /&gt;
&lt;br /&gt;
==== Tables ====&lt;br /&gt;
Tables are spreadsheets that allow you to provide information for certain components, such as lists, tabs, etc.&lt;br /&gt;
&lt;br /&gt;
==== Script ====&lt;br /&gt;
The script is a JS file that allows you to perform more complete and complex actions than managing views alone.&lt;br /&gt;
&lt;br /&gt;
[[FirstScript|Your first step in the script]]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
&lt;br /&gt;
#[[Styling character sheets with classes|Build character sheets with Bootstrap]]&lt;br /&gt;
# [[Put a dice roll result in the sheet]]&lt;br /&gt;
# [[Use lists]]&lt;br /&gt;
# [[Use tabs]]&lt;br /&gt;
# [[Use repeaters]]&lt;br /&gt;
# [[Show or hide components]]&lt;br /&gt;
# [[Progress bar]]&lt;br /&gt;
# [https://lets-role.com/help/fr/documentation/v1/component/avatar Configure the avatar properly]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Save,_Deploy,_and_Exit&amp;diff=82</id>
		<title>Save, Deploy, and Exit</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Save,_Deploy,_and_Exit&amp;diff=82"/>
		<updated>2025-09-22T16:45:47Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : petit ajustement par apport a la premiere version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page explains the three buttons: &#039;&#039;&#039;Save&#039;&#039;&#039;, &#039;&#039;&#039;Deploy&#039;&#039;&#039;, and &#039;&#039;&#039;Exit&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Exit ==&lt;br /&gt;
The &#039;&#039;&#039;Exit&#039;&#039;&#039; button allows you to leave the System Builder editor.  &lt;br /&gt;
&lt;br /&gt;
If you try to exit without saving, a warning will notify you that your work has not been saved.&lt;br /&gt;
&lt;br /&gt;
== Save ==&lt;br /&gt;
The &#039;&#039;&#039;Save&#039;&#039;&#039; button stores your current work so you can continue later.  &lt;br /&gt;
&lt;br /&gt;
Make sure to save frequently, either by clicking &#039;&#039;&#039;Save&#039;&#039;&#039; or using the &#039;&#039;&#039;Ctrl + S&#039;&#039;&#039; shortcut.  &lt;br /&gt;
&lt;br /&gt;
⚠️ To make your changes visible in the &#039;&#039;&#039;test tabl&#039;&#039;&#039;*, you must save your system.  &lt;br /&gt;
&lt;br /&gt;
Note that &#039;&#039;&#039;Save&#039;&#039;&#039; does &#039;&#039;&#039;not&#039;&#039;&#039; update your live game tables.&lt;br /&gt;
&lt;br /&gt;
== Deploy a system ==&lt;br /&gt;
The &#039;&#039;&#039;Deploy&#039;&#039;&#039; button creates a new version of your system.  The deploy action give the possibility to add a comment that is crucial to keep tracs on the modification. &lt;br /&gt;
&lt;br /&gt;
- This version is automatically updated on all your game tables using this system.  &lt;br /&gt;
&lt;br /&gt;
- A &#039;&#039;&#039;restore point&#039;&#039;&#039; is automatically created, allowing you to roll back if you make a mistake.  &lt;br /&gt;
&lt;br /&gt;
Deploy your system carefully:  &lt;br /&gt;
&lt;br /&gt;
- when a feature is ready,  &lt;br /&gt;
&lt;br /&gt;
- or after significant progress in your development.  &lt;br /&gt;
&lt;br /&gt;
⚠️ Warning: &#039;&#039;&#039;deploying&#039;&#039;&#039; a system immediately updates your players’ tables. Avoid deploying a system that is still under development&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Save,_Deploy,_and_Exit&amp;diff=81</id>
		<title>Save, Deploy, and Exit</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Save,_Deploy,_and_Exit&amp;diff=81"/>
		<updated>2025-09-22T16:41:47Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : premier jet textuel du wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Save, Deploy and Exit =&lt;br /&gt;
This page explains the three buttons: **Save**, **Deploy**, and **Exit**.&lt;br /&gt;
&lt;br /&gt;
== Exit ==&lt;br /&gt;
The **Exit** button allows you to leave the System Builder editor.  &lt;br /&gt;
&lt;br /&gt;
If you try to exit without saving, a warning will notify you that your work has not been saved.&lt;br /&gt;
&lt;br /&gt;
== Save ==&lt;br /&gt;
The **Save** button stores your current work so you can continue later.  &lt;br /&gt;
&lt;br /&gt;
Make sure to save frequently, either by clicking **Save** or using the **Ctrl + S** shortcut.  &lt;br /&gt;
&lt;br /&gt;
⚠️ To make your changes visible in the **test table**, you must save your system.  &lt;br /&gt;
&lt;br /&gt;
Note that **Save** does **not** update your live game tables.&lt;br /&gt;
&lt;br /&gt;
== **** Deploy a system ==&lt;br /&gt;
The **Deploy** button creates a new version of your system.  The deploy action give the possibility to add a comment that is crucial to keep tracs on the modification. &lt;br /&gt;
&lt;br /&gt;
- This version is automatically updated on all your game tables using this system.  &lt;br /&gt;
&lt;br /&gt;
- A **restore point** is automatically created, allowing you to roll back if you make a mistake.  &lt;br /&gt;
&lt;br /&gt;
Deploy your system carefully:  &lt;br /&gt;
&lt;br /&gt;
- when a feature is ready,  &lt;br /&gt;
&lt;br /&gt;
- or after significant progress in your development.  &lt;br /&gt;
&lt;br /&gt;
⚠️ Warning: **deploying** a system immediately updates your players’ tables. Avoid deploying a system that is still under development.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Progress_bar&amp;diff=80</id>
		<title>Progress bar</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Progress_bar&amp;diff=80"/>
		<updated>2025-09-20T19:46:18Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
A progress bar is a visual element that can be used to display, in a more playful way, the number of hit points, mana, or any other resource of your character sheet.&lt;br /&gt;
&lt;br /&gt;
There are several methods to build a progress bar. In this page, we’ll cover &#039;&#039;&#039;four different approaches&#039;&#039;&#039;, each with its own advantages and disadvantages.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Dynamic Progress Bar ==&lt;br /&gt;
Let’s start with the simplest method. The &#039;&#039;&#039;dynamic progress bar&#039;&#039;&#039; makes it easy to manage large ranges of values and is highly customizable, since its appearance can be modified in just a few clicks.&lt;br /&gt;
&lt;br /&gt;
With some coding skill, you can even make progress bars that players themselves can personalize.&lt;br /&gt;
&lt;br /&gt;
The bar works in a very simple way:&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;filled portion&#039;&#039;&#039; of the bar is displayed using one symbol (for example, a [https://game-icons.net/1x1/delapouite/plain-square.html ga_plain-square]).&lt;br /&gt;
* The &#039;&#039;&#039;empty portion&#039;&#039;&#039; is displayed using another symbol  (for example a [https://game-icons.net/1x1/delapouite/square.html ga_square] or   a space &amp;quot; &amp;quot;).&lt;br /&gt;
&lt;br /&gt;
⚠️ The drawback is that this bar is &#039;&#039;&#039;not interactive&#039;&#039;&#039;. To change its value, you’ll need to add [+] and [–] [[Button|buttons]] or directly edit the NumberInput components.&lt;br /&gt;
[[Fichier:Tuto_progress_bar1_ex.png|centré|700x700px]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 🔧 How to Build It ===&lt;br /&gt;
You need &#039;&#039;&#039;3 components&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;NumberInput&#039;&#039;&#039; for the current value → &amp;lt;code&amp;gt;&amp;quot;bar1_current_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;NumberInput&#039;&#039;&#039; for the maximum value → &amp;lt;code&amp;gt;&amp;quot;bar1_max_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;Label&#039;&#039;&#039; that will display the progress bar → &amp;lt;code&amp;gt;&amp;quot;bar1_progress&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;⚠️ Check the markdown checkbox of the label to have the proper display&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tuto_progress_bar1.png|centré|700x700px]]&lt;br /&gt;
 init = function(sheet){&lt;br /&gt;
    initProgressBar(sheet,&amp;quot;bar1_progress&amp;quot;, &amp;quot;bar1_current_value&amp;quot;,&lt;br /&gt;
                    &amp;quot;bar1_max_value&amp;quot;, &amp;quot;:ga_plain-square:&amp;quot;,&lt;br /&gt;
                    &amp;quot;:ga_square:&amp;quot;,10);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const initProgressBar = function(sheet,bar_id, current_value_id, max_value_id, fill_icon, empty_icon, line_length ){&lt;br /&gt;
     let current = sheet.get(current_value_id);&lt;br /&gt;
     let max  = sheet.get(max_value_id);&lt;br /&gt;
     let bar = sheet.get(bar_id);&lt;br /&gt;
     const updateBar = function(){&lt;br /&gt;
         let current_value = current.value();&lt;br /&gt;
         let max_value = max.value();&lt;br /&gt;
         let bar_value = &amp;quot;&amp;quot;;&lt;br /&gt;
         for(let i = 0; i &amp;lt; max_value; i++) {&lt;br /&gt;
             if (i != 0 &amp;amp;&amp;amp; i%line_length==0){&lt;br /&gt;
                 bar_value += &amp;quot;\n&amp;quot;;&lt;br /&gt;
             }&lt;br /&gt;
             if ( i &amp;lt; current_value){&lt;br /&gt;
                 bar_value += fill_icon;&lt;br /&gt;
             } else {&lt;br /&gt;
                 bar_value += empty_icon;&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         if (max_value &amp;lt; current_value){&lt;br /&gt;
             current.value(max_value);&lt;br /&gt;
         }&lt;br /&gt;
         bar.value(bar_value);&lt;br /&gt;
     }&lt;br /&gt;
     current.on(&amp;quot;update&amp;quot;, updateBar);&lt;br /&gt;
     max.on(&amp;quot;update&amp;quot;, updateBar);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
✨ You can modify its appearance by:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Changing the classes of &amp;lt;code&amp;gt;&amp;quot;bar1_progress&amp;quot;&amp;lt;/code&amp;gt; by changing the [[Styling character sheets with classes|color or the size]].&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Adjusting the line length argument.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Using any available icon in LetsRole ([https://fontawesome.com/v5/search?o=r&amp;amp;m=free&amp;amp;s=solid list1] [https://yesicon.app/game-icons liste2]).&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Two-Color Progress Bar ==&lt;br /&gt;
This progress bar is an upgrade of the first one: it differentiates the &#039;&#039;&#039;filled&#039;&#039;&#039; and &#039;&#039;&#039;empty&#039;&#039;&#039; portions with &#039;&#039;&#039;two different colors&#039;&#039;&#039;.&lt;br /&gt;
[[Fichier:Tuto_progress_bar2_ex.png|centré|700x700px]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== 🔧 How to Build It ===&lt;br /&gt;
&amp;lt;p&amp;gt;You’ll need &#039;&#039;&#039;5 components&#039;&#039;&#039;:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;NumberInput&#039;&#039;&#039; for the current value → &amp;lt;code&amp;gt;&amp;quot;bar2_current_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A &amp;lt;b&amp;gt;NumberInput&amp;lt;/b&amp;gt; for the maximum value → &amp;lt;code&amp;gt;&amp;quot;bar2_max_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
*Two &amp;lt;b&amp;gt;Labels side by side&amp;lt;/b&amp;gt; → &amp;lt;code&amp;gt;&amp;quot;bar3_progress_middle_c1&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;bar3_progress_middle_c2&amp;quot;&amp;lt;/code&amp;gt; (these form the mixed line with the last filled + empty parts)&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;Label above&#039;&#039;&#039; for fully filled lines → &amp;lt;code&amp;gt;&amp;quot;bar3_progress_c1&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
*A &#039;&#039;&#039;Label below&#039;&#039;&#039; for fully empty lines → &amp;lt;code&amp;gt;&amp;quot;bar3_progress_c2&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Tuto_progress_bar2.png|centré|700x700px]]&lt;br /&gt;
 init = function(sheet){&lt;br /&gt;
     initProgressBarTwoColor(sheet, &amp;quot;bar2_progress_c1&amp;quot;, &amp;quot;bar2_progress_middle_c1&amp;quot;,&lt;br /&gt;
                             &amp;quot;bar2_progress_c2&amp;quot;, &amp;quot;bar2_progress_middle_c2&amp;quot;,&lt;br /&gt;
                             &amp;quot;bar2_current_value&amp;quot;, &amp;quot;bar2_max_value&amp;quot;,&lt;br /&gt;
                             &amp;quot;:ga_plain-square:&amp;quot;, &amp;quot;:ga_plain-square:&amp;quot;,10); &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const initProgressBarTwoColor = function(sheet,sub_bar_c1_id, bar_c1_id, &lt;br /&gt;
                                          sub_bar_c2_id,bar_c2_id, &lt;br /&gt;
                                          current_value_id, max_value_id,&lt;br /&gt;
                                          fill_icon, empty_icon, line_length){&lt;br /&gt;
     let current = sheet.get(current_value_id);&lt;br /&gt;
     let max  = sheet.get(max_value_id);&lt;br /&gt;
     let sub_bar1 = sheet.get(sub_bar_c1_id);&lt;br /&gt;
     let bar1 = sheet.get(bar_c1_id);&lt;br /&gt;
     let sub_bar2 = sheet.get(sub_bar_c2_id);&lt;br /&gt;
     let bar2 = sheet.get(bar_c2_id);&lt;br /&gt;
     const stringMul = function(string, mul){&lt;br /&gt;
         let out_string = &amp;quot;&amp;quot;;&lt;br /&gt;
         for(let i = 0 ; i &amp;lt; mul ; i++){&lt;br /&gt;
             if(i != 0 &amp;amp;&amp;amp; i % line_length == 0){&lt;br /&gt;
                 out_string += &amp;quot;\n&amp;quot;;&lt;br /&gt;
             } &lt;br /&gt;
             out_string += string;&lt;br /&gt;
         }&lt;br /&gt;
         return out_string;&lt;br /&gt;
      }&lt;br /&gt;
     const updateBar = function(){&lt;br /&gt;
         let current_value = current.value();&lt;br /&gt;
         let max_value = max.value();&lt;br /&gt;
         if (max_value &amp;lt; current_value){&lt;br /&gt;
             current.value(max_value);&lt;br /&gt;
             current_value = max_value;&lt;br /&gt;
         }&lt;br /&gt;
         let left = max_value - current_value; &lt;br /&gt;
         let on_top_bar = current_value - (current_value % line_length);&lt;br /&gt;
         let on_midle_bar1 = current_value % line_length;&lt;br /&gt;
         let on_midle_bar2 = (left &amp;lt; line_length - on_midle_bar1) ? left : line_length - on_midle_bar1;&lt;br /&gt;
         let on_bot_bar = max_value - current_value - on_midle_bar2;&lt;br /&gt;
         sub_bar1.value(stringMul(fill_icon, on_top_bar));&lt;br /&gt;
         bar1.value(stringMul(fill_icon, on_midle_bar1));&lt;br /&gt;
         bar2.value(stringMul(empty_icon, on_midle_bar2));&lt;br /&gt;
         sub_bar2.value(stringMul(empty_icon , on_bot_bar));&lt;br /&gt;
     }&lt;br /&gt;
     current.on(&amp;quot;update&amp;quot;, updateBar);&lt;br /&gt;
     max.on(&amp;quot;update&amp;quot;, updateBar);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
✨ Like the first version, it’s easily customizable — but with an &#039;&#039;&#039;extra color&#039;&#039;&#039; to highlight different resources.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Clickable Progress Bar ==&lt;br /&gt;
This progress bar is &#039;&#039;&#039;interactive&#039;&#039;&#039;: players can click on it to change its value.&lt;br /&gt;
&lt;br /&gt;
⚠️ Drawbacks:&lt;br /&gt;
&lt;br /&gt;
*More difficult and time-consuming to set up.&lt;br /&gt;
*The maximum value must be fixed when designing the sheet (not dynamic).&lt;br /&gt;
*Each icon can display a différent icon.&lt;br /&gt;
&lt;br /&gt;
Here, the &#039;&#039;&#039;NumberInputs can be hidden&#039;&#039;&#039; so only the bar is visible.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tuto_progress_bar3_ex.png|700x700px]]&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 🔧 How to Build It ===&lt;br /&gt;
You’ll need:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A &#039;&#039;&#039;NumberInput&#039;&#039;&#039; for the current value → &amp;lt;code&amp;gt;&amp;quot;bar4_current_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A &amp;lt;b&amp;gt;NumberInput&amp;lt;/b&amp;gt; for the maximum value → &amp;lt;code&amp;gt;&amp;quot;bar4_max_value&amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A &#039;&#039;&#039;series of Labels or Icons&#039;&#039;&#039; equal to the max size whithe precise id name (e.g., &amp;lt;code resource=&amp;quot;Fichier:Tuto progress bar3.png&amp;quot; height width&amp;gt;bar4_0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bar4_1&amp;lt;/code&amp;gt;, ..., &amp;lt;code&amp;gt;bar4_30&amp;lt;/code&amp;gt;, ...)&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
[[Fichier:Tuto_progress_bar3.png|700x700px]]&lt;br /&gt;
 init = function(sheet){&lt;br /&gt;
     initButtonProgressBar(sheet,&amp;quot;bar4_&amp;quot;, 20, &amp;quot;bar4_current_value&amp;quot;, &amp;quot;bar4_max_value&amp;quot;, &amp;quot;text-success &amp;quot;, &amp;quot;text-danger opacity-50&amp;quot; , &amp;quot;d-none&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 const initButtonProgressBar = function(sheet,bar_prefix, bar_nb_element, current_value_id, max_value_id, fill_class,  empty_class, disable_class ){&lt;br /&gt;
     let current= sheet.get(current_value_id);&lt;br /&gt;
     let max = sheet.get(max_value_id);&lt;br /&gt;
     let button_container = sheet.get(button_container_id);&lt;br /&gt;
 &lt;br /&gt;
     let empty_class_list = empty_class.split(&amp;quot; &amp;quot;);&lt;br /&gt;
     let fill_class_list = fill_class.split(&amp;quot; &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     const addClasses = function(cmp, class_liste){&lt;br /&gt;
         for(let i = 0; i&amp;lt; class_liste.length; i++){&lt;br /&gt;
             cmp.addClass(class_liste[i]);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     const removeClasses = function(cmp, class_liste){&lt;br /&gt;
         for(let i = 0; i&amp;lt; class_liste.length; i++){&lt;br /&gt;
         cmp.removeClass(class_liste[i]);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     const updateBarOnButton = function(progress){&lt;br /&gt;
         let i = 0;&lt;br /&gt;
         while (i &amp;lt; bar_nb_element){&lt;br /&gt;
             let button_i = sheet.get(bar_prefix + i);&lt;br /&gt;
             if ( i &amp;lt;= progress){&lt;br /&gt;
                 removeClasses(button_i, empty_class_list);&lt;br /&gt;
                 addClasses(button_i, fill_class_list);&lt;br /&gt;
             } else {&lt;br /&gt;
                 removeClasses(button_i, fill_class_list);&lt;br /&gt;
                 addClasses(button_i, empty_class_list);&lt;br /&gt;
             }&lt;br /&gt;
             i++;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     const updateMax = function(){&lt;br /&gt;
         let i = 0;&lt;br /&gt;
         let max_value = max.value()-1;&lt;br /&gt;
         while (i &amp;lt; bar_nb_element){&lt;br /&gt;
             let button_i = sheet.get(bar_prefix + i);&lt;br /&gt;
             if ( i &amp;lt;= max_value){&lt;br /&gt;
                 button_i.removeClass(disable_class);&lt;br /&gt;
             } else {&lt;br /&gt;
                 button_i.addClass(disable_class);&lt;br /&gt;
             }&lt;br /&gt;
         i++;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     const barClicked = function(btn){&lt;br /&gt;
         if(btn.id().includes(bar_prefix)){&lt;br /&gt;
             let n = parseInt(btn.id().split(bar_prefix)[1]);&lt;br /&gt;
             current.value(n);&lt;br /&gt;
             updateBarOnButton(n);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     button_container.on(&amp;quot;click&amp;quot;,&amp;quot;.label&amp;quot;,barClicked); &lt;br /&gt;
     max.on(&amp;quot;update&amp;quot;,updateMax);&lt;br /&gt;
     current.on(&amp;quot;update&amp;quot;,function(){updateBarOnButton(current.value()-1)});&lt;br /&gt;
    &lt;br /&gt;
     updateBarOnButton(current.value()-1);&lt;br /&gt;
     updateMax();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
✨ Although harder to implement, this bar is &#039;&#039;&#039;very user-friendly&#039;&#039;&#039; since players can simply click on it.&lt;br /&gt;
&lt;br /&gt;
Also, the buttons don’t need perfect formatting — you can arrange them however you like.&lt;br /&gt;
[[Fichier:Tuto_progress_bar3_ex2.png|centré|700x700px]]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Manage_views&amp;diff=78</id>
		<title>Manage views</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Manage_views&amp;diff=78"/>
		<updated>2025-09-19T11:59:42Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : petit probleme d&amp;#039;image corriger&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Manage views =&lt;br /&gt;
&lt;br /&gt;
== Create New Views ==&lt;br /&gt;
To create a new view, click on Create New View. Once clicked, a prompt will open with three fields:&lt;br /&gt;
[[Fichier:Tuto create views.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
# View ID – must respect the ID formatting rules.&lt;br /&gt;
# Name – can contain any characters.&lt;br /&gt;
# Type – choose between:&lt;br /&gt;
#* Main component&lt;br /&gt;
#* Sub component&lt;br /&gt;
&lt;br /&gt;
Once the view is accepted, the new view is opened, made of a single root component.&lt;br /&gt;
&lt;br /&gt;
== Edit Views ==&lt;br /&gt;
=== View Parameters ===&lt;br /&gt;
[[Fichier:Tuto view parameters.png|gauche|280x280px]]&lt;br /&gt;
Once the view is created, you can edit its parameters by selecting the root component:&lt;br /&gt;
&lt;br /&gt;
* ID&lt;br /&gt;
* Name&lt;br /&gt;
* Classes&lt;br /&gt;
* Type&lt;br /&gt;
* Height&lt;br /&gt;
* Width&lt;br /&gt;
* Is a craft&lt;br /&gt;
* Can be used on the map&lt;br /&gt;
* Can be drag &amp;amp; dropped onto another sheet&lt;br /&gt;
* ID of the avatar component&lt;br /&gt;
&lt;br /&gt;
=== Add Components ===&lt;br /&gt;
To add a component, drag and drop it from the Component List into the Component Tree.&lt;br /&gt;
&lt;br /&gt;
The Layout component can contain other components to organize their display.&lt;br /&gt;
[[Fichier:Tuto add component.png|centré|vignette|300x300px]]&lt;br /&gt;
&lt;br /&gt;
=== Change Component Order ===&lt;br /&gt;
To adjust the display, drag and drop a component inside the tree.&lt;br /&gt;
Components contained in a layout component will follow the order defined.&lt;br /&gt;
[[Fichier:Tuto move component 1.png|centré|vignette|[[Fichier:Tuto move component 2.png|300x300px]]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Duplicate Component Set ===&lt;br /&gt;
You can duplicate a component to copy its settings within the same component.&lt;br /&gt;
&lt;br /&gt;
Duplicating a layout component will also duplicate all components it contains.&lt;br /&gt;
&lt;br /&gt;
The component ID will not be duplicated; instead, a random ID will be generated.&lt;br /&gt;
[[Fichier:Tuto Duplicate.png|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Move Component Set to Another View ===&lt;br /&gt;
A component can be moved to another view.&lt;br /&gt;
&lt;br /&gt;
All components contained in a layout component will also be moved.&lt;br /&gt;
[[Fichier:Tuto move to other view.png|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Change Current View ==&lt;br /&gt;
To switch between views, use the dropdown menu.&lt;br /&gt;
[[Fichier:Tuto Change views.png|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Edit the Source Code ==&lt;br /&gt;
The tree of components is stored in the source code.&lt;br /&gt;
If you encounter difficulties with the tree, you can edit the source directly.&lt;br /&gt;
&lt;br /&gt;
⚠ Warning: Editing the source code may break your system. Always deploy or back up your system before editing.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=79</id>
		<title>System Builder</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=System_Builder&amp;diff=79"/>
		<updated>2025-09-13T18:37:14Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajustement mineur&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The System Builder is a tool for creating game systems for the [https://lets-role.com/ Let&#039;s Roll] gaming tables. It allows for the comprehensive construction of various essential tools such as player character sheets, as well as the creation of non-player character sheets, objects, and game monitoring tools for Game Masters.&lt;br /&gt;
&lt;br /&gt;
The tool is accessible to anyone with a Let&#039;s Roll account. It is designed so that anyone can develop their own system without any coding knowledge. The System Builder is equipped with coding tools (pseudoJS) that allow for the creation of complex, non-essential functionalities that will add a bit of convenience.&lt;br /&gt;
&lt;br /&gt;
=== First step ===&lt;br /&gt;
Quickstart video guide for creating systems in Let’s Role (🇫🇷 &#039;&#039;French only)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=F141URrFVwo&lt;br /&gt;
[[Fichier:Video_thumbnail_Start_on_SB.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
==== Interface ====&lt;br /&gt;
Inserez l&#039;image de l&#039;interface&lt;br /&gt;
&lt;br /&gt;
# The title of the edited system&lt;br /&gt;
# [[Manage views|C]]&amp;lt;nowiki/&amp;gt;[[Manage views|reate new views]], navigate between [views]...&lt;br /&gt;
# The list of [[components|c]]&amp;lt;nowiki/&amp;gt;[[components|omponents]] usable for building a view&lt;br /&gt;
# [The dependency tree of views]&lt;br /&gt;
# Launch the system on a table to [test the system]&lt;br /&gt;
# The tabs [view], [table], [script], [translation], the tools to develop a system&lt;br /&gt;
# The [preview of the sheet]&lt;br /&gt;
# The buttons [save], [deploy], and [exit]&lt;br /&gt;
# The panel of the selected [component parameters]&lt;br /&gt;
&lt;br /&gt;
===== Views =====&lt;br /&gt;
Views are trees of components. They can be instantiated by the [tab] component or the [repeater] component to create complex and well-organized sheets.&lt;br /&gt;
&lt;br /&gt;
==== Creating a New View ====&lt;br /&gt;
To create a new view, click on the &amp;quot;Create a new view&amp;quot; button. Fill in the popup with an ID (no capital letters, no special characters, no numbers, and use underscores to separate words), for example: &amp;quot;vue_armes&amp;quot;. To switch views, use the dropdown list.&lt;br /&gt;
&lt;br /&gt;
==== Building a View ====&lt;br /&gt;
To build a view, use the components in window 3 by dragging and dropping them into the component tree of the view in window 4.&lt;br /&gt;
&lt;br /&gt;
===== Layout Components =====&lt;br /&gt;
Layout components are used to structure and organize components among themselves, such as rows, columns, and containers.&lt;br /&gt;
&lt;br /&gt;
TODO: Link to a tutorial&lt;br /&gt;
&lt;br /&gt;
===== Form Components =====&lt;br /&gt;
Form components are designed to contain the information for your character sheet.&lt;br /&gt;
&lt;br /&gt;
===== Container Components =====&lt;br /&gt;
Containers are components that can contain views to create complete and dynamic sheets.&lt;br /&gt;
&lt;br /&gt;
=== Special Components ===&lt;br /&gt;
Special components allow you to perform specific and essential actions for a character sheet.&lt;br /&gt;
&lt;br /&gt;
==== Tables ====&lt;br /&gt;
Tables are spreadsheets that allow you to provide information for certain components, such as lists, tabs, etc.&lt;br /&gt;
&lt;br /&gt;
==== Script ====&lt;br /&gt;
The script is a JS file that allows you to perform more complete and complex actions than managing views alone.&lt;br /&gt;
&lt;br /&gt;
[[FirstScript|Your first step in the script]]&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
&lt;br /&gt;
#[[Styling character sheets with classes|Build character sheets with Bootstrap]]&lt;br /&gt;
# [[Put a dice roll result in the sheet]]&lt;br /&gt;
# [[Use lists]]&lt;br /&gt;
# [[Use tabs]]&lt;br /&gt;
# [[Use repeaters]]&lt;br /&gt;
# [[Show or hide components]]&lt;br /&gt;
# [[Progress bar]]&lt;br /&gt;
# [https://lets-role.com/help/fr/documentation/v1/component/avatar Configure the avatar properly]&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Manage_views&amp;diff=77</id>
		<title>Manage views</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Manage_views&amp;diff=77"/>
		<updated>2025-09-13T18:35:51Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : ajout des image&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Manage views =&lt;br /&gt;
&lt;br /&gt;
== Create New Views ==&lt;br /&gt;
To create a new view, click on Create New View. Once clicked, a prompt will open with three fields:&lt;br /&gt;
[[Fichier:Tuto create views.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
# View ID – must respect the ID formatting rules.&lt;br /&gt;
# Name – can contain any characters.&lt;br /&gt;
# Type – choose between:&lt;br /&gt;
#* Main component&lt;br /&gt;
#* Sub component&lt;br /&gt;
&lt;br /&gt;
Once the view is accepted, the new view is opened, made of a single root component.&lt;br /&gt;
&lt;br /&gt;
== Edit Views ==&lt;br /&gt;
=== View Parameters ===&lt;br /&gt;
[[Fichier:Tuto view parameters.png|gauche|280x280px]]&lt;br /&gt;
Once the view is created, you can edit its parameters by selecting the root component:&lt;br /&gt;
&lt;br /&gt;
* ID&lt;br /&gt;
* Name&lt;br /&gt;
* Classes&lt;br /&gt;
* Type&lt;br /&gt;
* Height&lt;br /&gt;
* Width&lt;br /&gt;
* Is a craft&lt;br /&gt;
* Can be used on the map&lt;br /&gt;
* Can be drag &amp;amp; dropped onto another sheet&lt;br /&gt;
* ID of the avatar component&lt;br /&gt;
&lt;br /&gt;
=== Add Components ===&lt;br /&gt;
To add a component, drag and drop it from the Component List into the Component Tree.&lt;br /&gt;
&lt;br /&gt;
The Layout component can contain other components to organize their display.&lt;br /&gt;
[[Fichier:Tuto add component.png|centré|vignette|300x300px]]&lt;br /&gt;
&lt;br /&gt;
=== Change Component Order ===&lt;br /&gt;
To adjust the display, drag and drop a component inside the tree.&lt;br /&gt;
Components contained in a layout component will follow the order defined.&lt;br /&gt;
[[Fichier:Tuto move component 2.png|centré|vignette|[[Fichier:Tuto move component 2.png|300x300px]]]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Duplicate Component Set ===&lt;br /&gt;
You can duplicate a component to copy its settings within the same component.&lt;br /&gt;
&lt;br /&gt;
Duplicating a layout component will also duplicate all components it contains.&lt;br /&gt;
&lt;br /&gt;
The component ID will not be duplicated; instead, a random ID will be generated.&lt;br /&gt;
[[Fichier:Tuto Duplicate.png|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== Move Component Set to Another View ===&lt;br /&gt;
A component can be moved to another view.&lt;br /&gt;
&lt;br /&gt;
All components contained in a layout component will also be moved.&lt;br /&gt;
[[Fichier:Tuto move to other view.png|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Change Current View ==&lt;br /&gt;
To switch between views, use the dropdown menu.&lt;br /&gt;
[[Fichier:Tuto Change views.png|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Edit the Source Code ==&lt;br /&gt;
The tree of components is stored in the source code.&lt;br /&gt;
If you encounter difficulties with the tree, you can edit the source directly.&lt;br /&gt;
&lt;br /&gt;
⚠ Warning: Editing the source code may break your system. Always deploy or back up your system before editing.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_create_views.png&amp;diff=73</id>
		<title>Fichier:Tuto create views.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_create_views.png&amp;diff=73"/>
		<updated>2025-09-13T18:26:42Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_view_parameters.png&amp;diff=74</id>
		<title>Fichier:Tuto view parameters.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_view_parameters.png&amp;diff=74"/>
		<updated>2025-09-13T18:26:34Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Manage_views&amp;diff=66</id>
		<title>Manage views</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Manage_views&amp;diff=66"/>
		<updated>2025-09-13T18:23:50Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : the views managing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Manage views =&lt;br /&gt;
&lt;br /&gt;
== Create New Views ==&lt;br /&gt;
To create a new view, click on Create New View. Once clicked, a prompt will open with three fields:&lt;br /&gt;
&lt;br /&gt;
# View ID – must respect the ID formatting rules.&lt;br /&gt;
# Name – can contain any characters.&lt;br /&gt;
# Type – choose between:&lt;br /&gt;
#* Main component&lt;br /&gt;
#* Sub component&lt;br /&gt;
&lt;br /&gt;
Once the view is accepted, the new view is opened, made of a single root component.&lt;br /&gt;
&lt;br /&gt;
== Edit Views ==&lt;br /&gt;
=== View Parameters ===&lt;br /&gt;
Once the view is created, you can edit its parameters by selecting the root component:&lt;br /&gt;
&lt;br /&gt;
* ID&lt;br /&gt;
* Name&lt;br /&gt;
* Classes&lt;br /&gt;
* Type&lt;br /&gt;
* Height&lt;br /&gt;
* Width&lt;br /&gt;
* Is a craft&lt;br /&gt;
* Can be used on the map&lt;br /&gt;
* Can be drag &amp;amp; dropped onto another sheet&lt;br /&gt;
* ID of the avatar component&lt;br /&gt;
&lt;br /&gt;
=== Add Components ===&lt;br /&gt;
To add a component, drag and drop it from the Component List into the Component Tree.&lt;br /&gt;
&lt;br /&gt;
The Layout component can contain other components to organize their display.&lt;br /&gt;
&lt;br /&gt;
=== Change Component Order ===&lt;br /&gt;
To adjust the display, drag and drop a component inside the tree.&lt;br /&gt;
Components contained in a layout component will follow the order defined.&lt;br /&gt;
&lt;br /&gt;
=== Duplicate Component Set ===&lt;br /&gt;
You can duplicate a component to copy its settings within the same component.&lt;br /&gt;
&lt;br /&gt;
Duplicating a layout component will also duplicate all components it contains.&lt;br /&gt;
&lt;br /&gt;
The component ID will not be duplicated; instead, a random ID will be generated.&lt;br /&gt;
&lt;br /&gt;
=== Move Component Set to Another View ===&lt;br /&gt;
A component can be moved to another view.&lt;br /&gt;
&lt;br /&gt;
All components contained in a layout component will also be moved.&lt;br /&gt;
&lt;br /&gt;
== Change Current View ==&lt;br /&gt;
To switch between views, use the dropdown menu.&lt;br /&gt;
&lt;br /&gt;
== Edit the Source Code ==&lt;br /&gt;
The tree of components is stored in the source code.&lt;br /&gt;
If you encounter difficulties with the tree, you can edit the source directly.&lt;br /&gt;
&lt;br /&gt;
⚠ Warning: Editing the source code may break your system. Always deploy or back up your system before editing.&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_move_component_2.png&amp;diff=67</id>
		<title>Fichier:Tuto move component 2.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_move_component_2.png&amp;diff=67"/>
		<updated>2025-09-13T18:23:26Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
	<entry>
		<id>https://www.lets-role.wiki/index.php?title=Fichier:Tuto_move_component_1.png&amp;diff=68</id>
		<title>Fichier:Tuto move component 1.png</title>
		<link rel="alternate" type="text/html" href="https://www.lets-role.wiki/index.php?title=Fichier:Tuto_move_component_1.png&amp;diff=68"/>
		<updated>2025-09-13T18:23:18Z</updated>

		<summary type="html">&lt;p&gt;Neo-Teyrall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Neo-Teyrall</name></author>
	</entry>
</feed>