GUI Tutorial: Difference between revisions
No edit summary |
No edit summary |
||
Line 3: | Line 3: | ||
The GUI is set up using the #SPLIT and #DRAW commands, and using your #VAR's. | The GUI is set up using the #SPLIT and #DRAW commands, and using your #VAR's. | ||
First, establish your desired top/bottom screen #SPLIT: | =Split Your Screen= | ||
First, establish your desired top/bottom screen #SPLIT. Run your #SPLIT command manually or make an alias that might be handy later for resetting. | |||
The #BUFFER command reprints the scrolling region after splitting: | |||
#ALIAS {split} { | #ALIAS {split} { | ||
#SPLIT 5 5; | #SPLIT 5 5; | ||
Line 10: | Line 15: | ||
=Draw Tiles= | |||
Second, you can draw tiles of all the vars you want to populate your split region however you want. Here I'm formatting an existing var, then drawing its tile: | Second, you can draw tiles of all the vars you want to populate your split region however you want. Here I'm formatting an existing var, then drawing its tile: | ||
Line 20: | Line 26: | ||
=Draw Lists= | |||
Instead of drawing individual tiles, you can also generate a list and draw that all at once. | Instead of drawing individual tiles, you can also generate a list and draw that all at once. | ||
Here, we will generate such a list, and then also create a sidebar box, and draw the whole list in there: | Here, we will generate such a list, and then also create a sidebar box, and draw the whole list in there: | ||
==Format a List== | |||
First, format your vars into a list: | First, format your vars into a list: | ||
<pre> | <pre> | ||
Line 44: | Line 51: | ||
That will generate a $affects var. Do #VAR affects to look at that. | That will generate a $affects var. Do #VAR affects to look at that. | ||
==Add a Sidebar== | |||
So now let's do a sidebar, and draw a whole $affects list there. | So now let's do a sidebar, and draw a whole $affects list there. | ||
Line 82: | Line 91: | ||
=Auto-Updates= | |||
Now, let's say you want that to auto-update that sidebar every time your affects vars update. | Now, let's say you want that to auto-update that sidebar every time your affects vars update. | ||
Line 88: | Line 97: | ||
#IF {"$sidebar" == "1"} {draw_sidebar}; | #IF {"$sidebar" == "1"} {draw_sidebar}; | ||
Another approach to auto-update, for basically other than the AFFECTS string, is to use an #EVENT. | |||
For example, to have your gui redrawn every time you enter a new room, and print the new room name, you can use the 'variable updated' event. | |||
#EVENT {VARIABLE UPDATED msdp_info[ROOM_NAME]} {draw} | |||
The issue here becomes, if you have a ton of gui tile elements updating, you don't want to re-draw the full screen multiple times redundantly. | |||
Instead, you can set EACH tile to have its own alias and set up events to update each of them. For example, you might make a specific aliases for each tile: | |||
#ALIAS {draw_room_tile} { | |||
#FORMAT {room_string} {%c%.44s} {<ddd>}{$msdp_info[ROOM_NAME]}; | |||
#DRAW tile 3 2 3 44 $room_string; | |||
} | |||
#ALIAS {draw_area_tile} { | |||
#FORMAT {area_string} {%c%.40s} {<bbb>}{$msdp_info[AREA_NAME]}; | |||
#DRAW tile 2 2 2 43 $area_string; | |||
} | |||
Then have an event to update each one: | |||
#EVENT {VARIABLE UPDATED msdp_info[ROOM_NAME]} {draw_room_tile} | |||
#EVENT {VARIABLE UPDATED msdp_info[AREA_NAME]} {draw_area_tile} | |||
How you manage your vars, and how/when to draw/update them is up to you. I've experimented with a few approachs, and have found that handling each screen element as its own small tile, with its own draw alias, with its own event, runs quite efficiently so I'm only ever drawing tiny tiles, and not redrawing the whole screen and doing unnecessary computation to generate parts of the screen that haven't changed. |
Revision as of 21:36, 24 April 2022
People keep asking how to set up the gui, so, here's some information you can expand upon.
The GUI is set up using the #SPLIT and #DRAW commands, and using your #VAR's.
Split Your Screen
First, establish your desired top/bottom screen #SPLIT. Run your #SPLIT command manually or make an alias that might be handy later for resetting.
The #BUFFER command reprints the scrolling region after splitting:
#ALIAS {split} { #SPLIT 5 5; #BUFFER end; }
Draw Tiles
Second, you can draw tiles of all the vars you want to populate your split region however you want. Here I'm formatting an existing var, then drawing its tile:
#ALIAS {draw} { #FORMAT {room_string} {%c%.44s} {<ddd>}{$msdp_info[ROOM_NAME]}; #DRAW tile 3 2 3 44 $room_string; }
Just add every var you want to draw to screen into that draw alias really. You'll have to read #Help draw to understand all your options, and how to use the coordinate system to place those into exact positions on screen. You'll also want to learn #FORMAT so you can align those and specify their lengths to avoid overrun.
Draw Lists
Instead of drawing individual tiles, you can also generate a list and draw that all at once.
Here, we will generate such a list, and then also create a sidebar box, and draw the whole list in there:
Format a List
First, format your vars into a list:
#alias get_affects { #list affects clear; #foreach {*msdp_info[AFFECTS][]} {affect} { #if {$msdp_info[AFFECTS][$affect] < 50} {#var Color {<dbb>}}; #if {$msdp_info[AFFECTS][$affect] > 49 && $msdp_info[AFFECTS][$affect] < 99} {#var Color {<ffd>}}; #if {$msdp_info[AFFECTS][$affect] > 99} {#var Color {<ddd>}}; #format {affect_line} {%c%+15.15s %c%-4s%c} {<bbb>}{$affect}{$Color}{$msdp_info[AFFECTS][$affect]}{<ddd>}; #LIST {affects} {add} {$affect_line}; }; #unvar Color; #unvar affect_line; };
That will generate a $affects var. Do #VAR affects to look at that.
Add a Sidebar
So now let's do a sidebar, and draw a whole $affects list there.
First, use the #SCREEN command to get information about your existing #SPLIT, we know its '5 5' but, this can come in handy in some cases so figured I'd include it. You can re-split to have a sidebar (24 spaces in this example). We also need to do #BUFFER end to reprint the scrolling region, and our original 'draw' alias to draw the normal top/bottom split data into place. Finally we will set a #var sidebar 1 just to track that the sidebar is indeed turned off, so we can use that info later.
#ALIAS {side_split} { #SCREEN get split_top_bar screen[split_top]; #SCREEN get split_bot_bar screen[split_bot]; #SCREEN get split_left_bar screen[split_left]; #SCREEN get split_right_bar screen[split_right]; #SPLIT $screen[split_top] $screen[split_bot] 0 24; #BUFFER end; draw; #VAR sidebar 1; }
Second, draw a box with your list data into the new side split region. I'm drawing the box 'blue' here so you can see it, can change that to 'blanked' to make the outline invisible if you desire:
#alias draw_sidebar { #MATH {mod_top} {$screen[split_top] + 1}; #MATH {mod_bottom} {$screen[split_bot] + 2}; #draw blue box $mod_top -24 -$mod_bottom -1 $affects[1..-1]; };
Then, make a single alias that does the entire side operation:
#ALIAS {sidebar} {get_affects;side_split;draw_sidebar}
Finally, make an alias to toggle the sidebar on/off by checking the $sidebar var.
#ALIAS {affs} { #IF {"$sidebar" == "1"} {#VAR sidebar 0;#SPLIT 5 5;#BUFFER end;draw}; #ELSE {get_affects;side_split;draw_sidebar}; }
So, typing 'affs' will turn the side bar on if it was off, and then turn it off again if it was on. It's a toggle.
Auto-Updates
Now, let's say you want that to auto-update that sidebar every time your affects vars update.
Inside your MSDP script code, at the point where it is parsing the AFFECTS string, you can put this check:
#IF {"$sidebar" == "1"} {draw_sidebar};
Another approach to auto-update, for basically other than the AFFECTS string, is to use an #EVENT.
For example, to have your gui redrawn every time you enter a new room, and print the new room name, you can use the 'variable updated' event.
#EVENT {VARIABLE UPDATED msdp_info[ROOM_NAME]} {draw}
The issue here becomes, if you have a ton of gui tile elements updating, you don't want to re-draw the full screen multiple times redundantly.
Instead, you can set EACH tile to have its own alias and set up events to update each of them. For example, you might make a specific aliases for each tile:
#ALIAS {draw_room_tile} { #FORMAT {room_string} {%c%.44s} {<ddd>}{$msdp_info[ROOM_NAME]}; #DRAW tile 3 2 3 44 $room_string; }
#ALIAS {draw_area_tile} { #FORMAT {area_string} {%c%.40s} {<bbb>}{$msdp_info[AREA_NAME]}; #DRAW tile 2 2 2 43 $area_string; }
Then have an event to update each one:
#EVENT {VARIABLE UPDATED msdp_info[ROOM_NAME]} {draw_room_tile} #EVENT {VARIABLE UPDATED msdp_info[AREA_NAME]} {draw_area_tile}
How you manage your vars, and how/when to draw/update them is up to you. I've experimented with a few approachs, and have found that handling each screen element as its own small tile, with its own draw alias, with its own event, runs quite efficiently so I'm only ever drawing tiny tiles, and not redrawing the whole screen and doing unnecessary computation to generate parts of the screen that haven't changed.