text:
Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Graphical Modeling Framework/Tutorial/Part 2
Website |
Download |
Dev Builds |
Update Site releases milestones |
Community |
Mailing List • Newsgroup • IRC |
Bugzilla |
Open |
Help Wanted |
Bug Day |
Source |
GMF Notation: View CVS repo GMF Runtime: View CVS repo |
Customize using GMF Tooling diagram definition model files
In this second part of the GMF Tutorial, some of the more advanced capabilities of the generation and runtime frameworks will be explored. Specifically, information on adding compartments, connections, feature initializers, diagram validation, and nested child nodes will be covered. The complete solution to this tutorial is maintained in CVS here. Viewlets will be available after appropriate sections below to focus their content and keep them short. (warning: they are outdated)
Important note: If you previously followed this tutorial with GMF 1.0, you'll need to be aware of changes in the graphical definition model described here.
New Icons
A quick way to get a polished look for our mindmap diagram is by replacing the generated EMF icons we've seen so far with some that are more, well... distinctive ;-) The easiest way to do this is to replace the GIF images found in our org.eclipse.gmf.examples.mindmap.edit/icons/ folder.
In case you'd like to map another image file to a palette item, say in the case of our three Relationship tools, or for our Subtopic link which has no default icon, you can modify the children of your Creation Tool elements in the mindmap.gmftool model. For example, delete the 'Default Image' entry below the 'Creation Tool Subtopic' element that represents the small icon and replace it with a 'Small Icon Bundle Image' and set its Bundle to org.eclipse.gmf.examples.mindmap.edit and its Path property to /icons/full/obj16/Subtopic.gif. Regenerate and the palette will display the new icon. Of course, you'll need to provide this file or use the one found in the solution to this tutorial section.
Finally, take a look in the mindmap.gmfgen for properties to set for the default wizard and diagram file icons. While you're there, you might want to change the diagram file extension from 'mindmap_diagram' to 'mmd' or something similar. Browsing the properties available in the gmfgen model is a useful exercise.
Below is an image of our diagram and palette using some new images.
Customize Figures
There are several ways to customize the figures in your editor. Here are a the main tricks to achieve that. You can choose any of this solution, depending on how much customization you need. It's recommended to try first the first solution, then the second one if solution #1 is too limited, then solution #3 is solution #2 is too limited.
Composite Figures (via .gmfgraph)
What we'd like to do is have an actor-style representation for our resources added to our diagram. These will be linked to their respective Topic elements, much like our relationship links between Topic elements. Also, we'd like to have the labels for our Resource figures external and display both the name and email address attribute values of the corresponding domain element.
Graphical Definition
Open up your graphical definition again and add a new Figure Descriptor and Rectangle named 'ResourceFigure' to your Figure Gallery. Set its Outline property to false, along with its Fill. As you can see from the image to the right, we will be adding a series of children to the rectangle, which will act as a container for the elements that comprise our Resource figure. Specifically, right-click and add an XY Layout, and Ellipse for the head, a Polygon for the Body, and sizing elements. Rather than go through all of the gory details of these, the figure code is found below. Either paste it into your mindmap.gmfgraph in the appropriate location using a text editor, or utilize the default editor and properties view.
To our Canvas, add a new Node named Resource and assign our ResourceFigure as its Figure. Also, notice the new 'BasicLabelFigure' label that is added to the Figure Gallery in the image. Create this and add a new Diagram Label 'ResourceLabel' to the Figure Gallery and Canvas respectively. Note that the Label for our Resource is not a child element of its figure. We want the label to be external, and therefore be allowed to float and be positioned wherever the user would like it.
<descriptors name="ResourceFigure"> <actualFigure xsi:type="gmfgraph:Rectangle" name="ResourceFigure" outline="false" fill="false"> <layout xsi:type="gmfgraph:StackLayout"/> <children xsi:type="gmfgraph:Rectangle" name="Resource" outline="false" fill="false"> <layout xsi:type="gmfgraph:FlowLayout" vertical="true" forceSingleLine="true" minorAlignment="CENTER" majorSpacing="0" minorSpacing="0"/> <children xsi:type="gmfgraph:Ellipse" name="Head"> <foregroundColor xsi:type="gmfgraph:RGBColor" red="220" green="220" blue="250"/> <backgroundColor xsi:type="gmfgraph:RGBColor" red="230" green="230" blue="255"/> <size x="40" y="20"/> </children> <children xsi:type="gmfgraph:Polygon" name="Body"> <foregroundColor xsi:type="gmfgraph:RGBColor" red="220" green="220" blue="250"/> <backgroundColor xsi:type="gmfgraph:RGBColor" red="230" green="230" blue="255"/> <template x="23" y="19"/> <template x="23" y="24"/> <template x="39" y="24"/> <template x="39" y="29"/> <template x="23" y="29"/> <template x="23" y="36"/> <template x="39" y="48"/> <template x="39" y="53"/> <template x="20" y="42"/> <template x="1" y="53"/> <template x="1" y="48"/> <template x="17" y="36"/> <template x="17" y="29"/> <template x="1" y="29"/> <template x="1" y="24"/> <template x="17" y="24"/> <template x="17" y="19"/> <template x="23" y="19"/> </children> </children> </actualFigure> </descriptors>
Tip : It's a bit tedious to add multiple template points in the manner above, so feel free to open the gmfgraph file in a text editor to make life easier. To get it looking right more quickly, open the generated figure class and simply modify the GEF code directly and run the editor to see how it looks. Then, move this information back into your gmfgraph model. Of course, when the WYSIWYG features of GMF become more mature, none of this should be necessary.
Tooling Definition
We'll need a tool to add Resource nodes, so as you've done many times before, open the mindmap.gmftool model and add a new node creation tool for the Resource. Next, we'll need to add our mappings, so reopen your mindmap.gmfmap file.
Mapping Definition
First, we'll need to add a new Top Node Reference to our Mapping definition. Set the Containment Feature to our 'resources : Resource' attribute of our Map class. Add a child Node Mapping element to this Top Node Reference and select our 'Resource' for the Domain meta information Element property. Of course, we'll select our Resource node for the Diagram Node and our Resource creation tool for the palette.
Now, to add our Feature Label Mapping as a child of the Node Mapping and set the Edit and View Pattern and corresponding features from our Resource class in the domain model. Here, we'll utilize the edit and view pattern properties of the mapping model to allow a Resource label to be displayed as 'name [firstname.lastname@example.com]'. To allow for the proper parsing of what's entered into the direct edit field, we will define an edit and editor pattern for the label as '{0} : {1}' where a colon is used to separate the name and email attributes. The view pattern will be '{0} [{1}]' and allow our label to be displayed as shown in the image. Note that the generated plug-in code will contribute to the parserProvider extension-point, which will in turn leverages the Java MessageFormat class.
After generation, a slight tweak will need to be made to the generated figure until bug 142010 is resolved. In the generated org.eclipse.gmf.examples.mindmap.diagram.edit.parts.ResourceEditPart$ResourceFigure class, set the attribute private boolean myUseLocalCoordinates = true; You might want to set the comment above it to @generated NOT in order to preserve this change. Without doing this the polygon used for the figure's body will not be visible. With that, set the fill(true) method on the body in the generated figure code, as it seems otherwise to not be filled.
Run the diagram and check the operation of the label, as well as the look of the figure. It should look similar to the one above. Resources added to the diagram are now available in the properties view for topic assignments, thread authoring, etc. To add the ability to create links from other elements to a Resource, follow steps similar to how links are used to represent subtopics. This exercise is left to the reader ;-)
Use SVGFigure
This allows you to use Figures defined from a SVG or a SVGZ file in your editor. Here are the steps to follow in order to use it:
- Install the GMF Experimental SDK from GMF Tooling repository/update-site
- Use the SVGFigure in your .gmfgraph. Here are some exmpales DocumentURI:
- platform:/plugin/a.bundle.name/path/to/a/file.svg[z] to reference a file from a bundle that is available in the target application along with the editor.
- (not advised) file:/filesystem/path/to/a/file.svg[z] to reference a file on your filesystem
- (not advised) platform:/resource/MyProject/path/to/a/file.svg[z] to reference a file in the workspace of the application that will run the editor.
- any kind of URI supported by Eclipse. See http://lmap.blogspot.com/2008/03/platform-scheme-uri.html for more details.
- In your .gmfgen, add a dependency to the org.eclipse.gmf.runtime.lite.svg bundle. You can add it on the GenPlugin element, in the required bundles property.
An easy and efficient way to find SVG Images is to go to Google Images, and make your request by adding to it "filetype:svg". You'll often get lots of possible images.
Create your own Figures classes and use them
Another solution is to create your own classes extending IFigure, and to use this classes you developped as Figures in your GNFGraph. It will for sure provide you more control on your figure, but it can be more complicated to set up since the GMF Tooling GMFGraph Editor won't provide helpers to configure your class. You'll have to reference setter names.
When using your own figures, don't forget to add the bundle that contains them in the additional dependencies of you .gmfgen.
Let's add a compartment to our Topic node to allow discussion threads to be added. In order to illustrate how to allow nodes within compartments, we will represent Thread items as yellow sticky notes and allow ThreadItem elements to appear as list items within them. So, we will have nodes with a compartment list nested within a parent node compartment. A preview of where we're going is seen to the right. And yes, it's a bit contrived, but it does give us an opportunity to describe a lot of features in one section.
Some of the steps in this section are a bit complex, so the viewlet should prove helpful in getting things right.
Tip : Be careful when working with multiple models, as until there is true refactoring support, you will need to be conscious of changes in definition models and how they will impact referenced models, such as our mapping model. Editing models open in the same resource set will help, so you might consider making changes to your graphical and tooling models from within the open mapping model. Otherwise, you'll receive errors when opening the editors and will need to repair broken references in a text editor.
Graphical Definition
Open up your graphical definition again and let's first take care of giving our Topics a rounded rectangle. Right-click the Figure Gallery and add a new Figure Descriptor and child Rounded Rectangle, naming them both RoundedTopicFigure. Adjust the Corner Width and Height property values to 12 (or whatever you'd like). To alter the default line color, right-click on the Rounded Rectangle RoundedTopicFigure and add a new Child | Foreground Color RGB Color with R=220, G=220, B=250 (or whatever you'd like).
We'll reuse the old TopicFigure rectangle for our sticky note. Rename it and its Figure Descriptor to StickyNoteFigure and give it a Background Color RGB Color child with values R=250, G=250, B=190 (a pale yellow, but feel free to change to suit your taste). Rename its child Label to StickyNoteNameFigure.
We'll need to create a child Label on our new Rounded Rectangle named TopicNameFigure, similar to the original Rectangle. You'll also need to create a Child Access element to your Figure Descriptor and select the new Label TopicNameFigure as its Figure. The Accessor property will default to 'getFigureTopicNameFigure' automatically. See the link above regarding changes to the graphical definition model if you're confused by the Child Access and Figure Descriptor changes that took place during the 2.0 release cycle.
Now, you'll need to change the Diagram Label TopicName to use this new Label TopicNameFigure as its Figure (it should still be pointing to the now-renamed StickyNoteFigure). To do this, set the Figure property to the Figure Descriptor Topic Figure and change the Accessor to the 'getFigureTopicNameFigure' child access. Then, just change the Figure property on your Node Topic element to use the Rounded Rectangle RoundedTopicFigure.
Create a new Node on the Canvas to use your StickyNoteFigure and name it Thread, along with a new Diagram Label named ThreadName that uses your StickyNoteFigure and 'getFigureStickyNoteNameFigure' accessor. Select 'true' for the Element Icon property of the label.
As we'd like to have discussion threads within a compartment of our topic nodes, we'll need to add one to our Canvas by right-clicking and selecting New Child | Compartment. Give it the name ThreadCompartment and select RoundedTopicFigure for its Figure property. Select 'true' for its Collapsible property and 'false' for its Needs Title property.
We'd also like to give threads their own compartment to contain a list of thread items for the subject. Create another compartment for our Thread node named ThreadItemCompartment which will use StickyNoteFigure as its Figure. So, our topics will be rounded rectangles which will contain child rectangles within a compartment. These child rectangles will also have a compartment, but they will not contain rectangles, but rather, just a simple list of discussion threads. These will be represented with a Label.
While they will be represented as a series of labels, there are some things we need to ensure they are displayed correctly within the parent StickyNoteFigure rectangle. First, select the Flow Layout child of the parent and modify its properties to match the figure to the left.
As you can see, we're going to force a single line of vertically-oriented children. The Major Alignment (vertical) is set to BEGINNING, while the minor (horizontal) is set to CENTER. We're going to set spacings to 0 and set Match Minor Size to 'true' as well. Now, we'll need a new child Rectangle element named ThreadItems and give it a Stack layout. Finally, the parent StickyNoteFigure Figure Descriptor will need a Child Access to access this rectangle and its labels. Create a new Child Access and set its Figure to the ThreadItems rectangle.
Add a new FigureDescriptor and Label to the Figure Gallery for our thread items named ThreadItemLabelFigure. Create a Diagram Label to the Canvas named ThreadItemLabel and assign the ThreadItemLabelFigure as its Figure property.
In summary, you should now have two nodes, one connection, two compartments, and three diagram labels as shown in the figure. These correspond to the rectangles, our polyline connection, and labels in the Figure Gallery.
Note : In the future, graphical definitions will be done using a designer bootstrapped by GMF itself. The figures you have created here will be done visually, rather than by manipulating a model using the generated EMF editor. To test drive this editor, download and install the "Experimental SDK" from the download site and provide feedback on the newsgroup.
Tooling Definition
We'll need a tool to add Thread nodes and ThreadItems, so open mindmap.gmftool and copy/paste the Topic tool and rename Thread. Repeat for a ThreadItem tool. Next, we'll need to complete our mappings, so reopen your mindmap.gmfmap file (if you're not already working within the mapping model editor, as recommended).
Mapping Definition
First, we'll need to add a new Compartment Mapping to our Topic Node Mapping and select ThreadCompartment for its Compartment property. Also, add a Child Reference to the Node Mapping. In the properties, select 'comments : Thread' for its Containment Feature and Compartment Mapping <ThreadCompartment> for the Compartment. Leave the rest of the properties blank.
Note : If you're wondering about the difference between 'Children Feature' and 'Containment Feature' the idea is this (as described in the newsgroup): the 'Containment Feature' refers to where children are stored, while the 'Children Feature' refers to where to take them from. These are usually the same, and there is no need to set Children Feature if Containment Feature is set as it will default to this value. An example of when you'd need to specify this property is with EClass and EAttribute where eStructuralFeatures is the 'containment' for both operations and attributes, but where eAttributes is 'children' for instances of EAttribute.
Right now, the node that represents our topic has a compartment with a reference to the domain element which will contain its contents. The contents of this compartment we have decided will be thread discussions, which are represented by yellow sticky notes. To represent this in our mapping, add a Node Mapping to our Child Reference. In the properties, select our Thread class for the domain Element, our Thread node for the Diagram Node, and our Thread creation tool from the palette.
The last thing we'll need for our child thread node is a mapping to its label. To our Thread Node mapping, add a child Feature Label Mapping. Select our ThreadName for the Diagram Label and the 'subject : String' feature from our Thread class for the label's Feature property.
At this point, you can regenerate the generator model and diagram plugin to see how things look. Let's continue on and map our thread node compartment to display thread items.
Tip : In the generator model, you will find a property on the compartment that will allow you to show children as 'floating' nodes and not stacked in a list. The property is 'List Layout' and should be set to 'false' in this case.
We will basically repeat the steps above to add a Compartment Mapping for our ThreadItemCompartment. Add a Child Reference for our 'items : ThreadItem' feature on our Thread class and select ThreadItemCompartment for its Compartment.
To our Child Reference, add a child Node Mapping for our ThreadItem class with corresponding ThreadItemLabel as the Diagram Node and ThreadItem tool. Finally, add a Feature Label Mapping to the node for our ThreadItemLabel to display the 'body : String' feature of our ThreadItem class.
At this point, you can regenerate the mindmap.gmfgen model and diagram plugin code. You should be able to run the diagram and produce a diagram similar to the one shown at the beginning of this section.
Note : When making changes to your diagram definition and regenerating, you may not be able to open diagrams that were created with previously generated diagram code. This is to be expected, so it's best to start with a new diagram instance to test each iteration.
Link Constraints
Currently, the diagram will allow you to make a subtopic link from one Topic to itself, as seen here. Clearly, this does not make sense for our Mindmap, so we'd like to prevent this somehow. This section makes for a very short viewlet.
Let's return to our mapping definition. Open the file Mindmap.gmfmap, navigate to the 'Link Mapping <{Topic.subtopics:Topic}/TopicSubtopics>' we created earlier. To add a link constraint, we begin by right-clicking on the 'Link Mapping' and selecting 'New Child > Link Constraints'. Right click the 'Link Constraints' just created and select 'New Child > Source End Constraint'. The 'Language' property defaults to 'ocl' and we'll need to add the following OCL statement to the 'Body' property: self <> oppositeEnd, as seen in the image below. Then, go through the usual regeneration of mindmap.gmfgen and diagram code and try it out. You will no longer be able to make a link from a Topic to itself.
So, now to explain what is happening here. As you can tell from the context above, we've added a constraint to the creation of a link, based on its source end; that is, the Topic element from which a link is being created. In the OCL we've specified the only condition that will evaluate to true, and therefore allow the link to be created, is the condition where the source element is not equal to the 'oppositeEnd' of the link (the target). In this case, the context of 'self' is the source Topic, and 'oppositeEnd' is a custom variable added to the parser environment for link constraints.
Clearly, this is a very simple constraint, and one that could very well have been defined in the domain model itself and respected by the graphical editor automatically. We will look more closely at constraints in future versions of this tutorial as support for their use matures.
Another Connection
Let's look now at the 'Relationship' element of our domain model. It specifies a number of possible relationships that may be indicated between Topic elements, in addition to the subtopic relationship we have supported thus far. We will add support for this type of Connection, as it will illustrate more completely the properties available for a Link Mapping within GMF. A viewlet of this section can be found here.
Graphical Definition
Returning to our graphical definition model (mindmap.gmfgraph), let's right-click on our gallery and add a 'New Child > Figure Descriptor' and to it a 'New Child > Polyline Connection'. Name it 'DashedLineOpenArrow' and change 'Line Kind' to LINE_DASH. Then add a 'New Child > Polyline Decoration' element to the Figure Gallery and name it 'OpenArrow'. The default decoration will be an open arrow (while a Polygon Decoration will be a filled triangle), but if you want to make one explicitly, you could add three Template Point children to the OpenArrow with X:Y values of -1:1, 0:0, and -1:-1. Finally, add the OpenArrow as a Target Decoration to the DashedLineOpenArrow polyline.
Now that you have the figure defined, create a corresponding Connection on our Canvas named 'RelationshipLink', selecting our 'DashedLineOpenArrow' Figure Descriptor as its 'Figure'. Finally, we'd prefer to have subtopics just connected with a solid line (no arrow), so delete the Polyline Decoration TopicsSubtopicsTargetDecoration element from the Figure Gallery which was added by the wizard in part one.
Tooling Definition
We'll need a tool to create these links, so reopen your mindmap.gmftool model. We already have one link tool for subtopics, but it's in the same tool group as our node elements. Let's create a new Tool Group under our Palette for links named 'Links' and add to it new Relationship Creation Tool. Copy/paste the TopicSubtopics tool into this new group and name it simply 'Subtopic'. Delete the old TopicSubtopics tool. Finally, rename the 'mindmap' tool group to 'Nodes'. Make both tool groups collapsible by setting their Collapsible to 'true'.
Mapping Definition
In the mapping definition, due to our changes in the tooling model, you'll need to check/update your existing tool selections. Right-clicking and running validation after a close/open of the mapping model can make it easier to spot invalid tool references. If you've been working with your graphical and tooling models from within the mapping model editor, everything should be fine (well, maybe not everything).
Now, create a new 'Link Mapping' and fill in its properties to match what's displayed in the image. In this mapping, we'll start with the 'Domain meta information > Element' property. It represents the element represented by this link in the domain, which is simply the 'EClass Relationship' element. Recall that in our previous link mapping, we left this and other properties blank. In that case, our target element for the link was represented by an element (Topic) added to a list of reference held in our source element (also a Topic). In this case, the link is represented in the domain by a class of its own, so more information is required in the link mapping. This class, the Relationship class of the domain model, is contained in a list of references in the Map element, which explains the 'Domain meta feature > Containment Feature' map to 'relations : Relationship'.
Continuing the mapping description, the 'Target Feature' in this case is mapped to the 'target : Topic' domain model element, indicating that targets of the link are added to this list in the domain when the link is created. Similarly, the 'Source Feature' maps to the 'source : Topic' domain model element. And of course, we have our straightforward tool mapping and 'Diagram Link' mapping to our RelationshipLink.
Now, we can regenerate our diagram code as before, launch our diagram workspace and test this new link. Here is an example of the results.
What we will now need to do is initialize the link to be of the proper type (dependency, includes, extends) when created. We will use separate tools for each, and could also opt to use distinct visualization. For now, we'll simply add a label to the link to indicate its type and maintain the dashed line with open arrow appearance for each.
Feature Initializers
When you create a new element on a diagram, there is typically a domain element created or modified as a result. In some cases, it's necessary to provide additional initialization information to ensure that objects are properly created. For example, the links we create between topics in our mindmap diagram come in three flavors: dependency, includes, and extends. The 'type' attribute of the Relationship class is used to hold the RelationshipType enum value for the new instance.
In our graphical definition, we will create a figure and corresponding link for each type, along with a creation tool for each in our tooling definition. We'll then use a feature sequence initilizer in our mapping definition to properly initialize our domain objects, depending on the type of link created on the diagram.
Another initialization we will perform is to set the 'label' attribute of the Relationship. As we've indicate above, this will serve to distinguish between the types as our visualization will remain the same for each. A viewlet of this section can be found here.
Graphical Definition
First, we need to add a Label to our graphical definition to use in displaying the relationship type. Add a new Figure Descriptor and Label to our Figure Gallery and name them DashedLineLabelFigure. Right-click on the Canvas and add a new Diagram Label named 'RelationshipLabel' with a Figure assigned to our DashedLineLabelFigure. Set the Element Icon property to 'false'.
Tooling Definition
Return to our tooling model and rename the 'Relationship' tool to 'Dependency'. Copy/paste this tool in order to create additional 'Includes' and 'Extends' tools.
Mapping Definition
In the mapping model, change the tool used by our current Relationship Link Mapping to the 'Extends' tool. After we add the constraint and initializers, we will copy/paste this Link Mapping and change the properties to be used for dependency and extends links. In the end, we will have a single link in our graphical definition being used by 3 tools with corresponding mappings to the same domain element.
In the mapping model, below your Relationship Link Mapping, create a 'Feature Seq Initializer' element. This will hold subsequent 'Feature Value Spec' elements as seen in the figure. OCL is the language we'll use, so be careful that the body expressions you enter are valid. In the case of initializing the enumeration field, you'll enter 'RelationshipType::EXTENDS' to set the 'type : RelationshipType' feature of our Relationship class. In the case of initilizing the 'label : String' feature, you'll enter the string value 'extends' (within single quotes).
Tip : In GMF 2.1 a 'Feature Value Spec' doesn't have 'Body' and 'Language' attributes itself. Instead you have to add a 'Value Expression' child to the 'Feature Value Spec'. Then you can set the body expression in this 'Value Expression'.
In addition to the initializer, we'll need to add a Constraint to the link itself. In fact, whenever you create multiple mappings to a single domain element, you will need to add constraints such that each can be uniquely identified. To the Link Mapping, right-click and add a new Constraint with language set to 'ocl' and a body of 'self.type = RelationshipType::EXTENDS'. Note this is an equality statement (=) and not an assignment (:=).
Lastly, we'll need to provide a new Feature Label Mapping to let the 'label : String' feature of our Relationship domain element be represented by our RelationshipLabel. If you'd like your label to include guillemets, include them in the View Pattern. For example, enter «{0}» to have the label text display on the diagram within these double angle brackets (French quotation marks), or whatever you'd prefer.
Copy/paste your Relationship Link Mapping to create an Include and a Dependency link mapping, changing their properties as necessary (e.g. 'RelationshipType::INCLUDES' and 'RelationshipType::DEPENDENCY' with corresponding 'includes' and 'depends' body values). Be sure not to forget the tool selection for each as well.
Tip : Keep in mind that the order of the 'Feature Value Spec' elements will determine the order in which they are executed.
With these steps complete, we can regenerate our mindmap.gmfgen and code.
If you launch your runtime instance and test these new initializers, you will find that the type attribute is set according to the Relationship tool selected, and that the label attribute is preset to the names you defined above.
As we saw with the OCL constraint added in the first part of the tutorial, it is possible to restrict connections made between nodes by declaring constraints in our mapping definition. Sometimes, it is more appropriate to validate connections and other aspects of a diagram content using batch or even "live" validation using the Validation framework provided by the EMF project. In this section, we will add such a validation feature to our mindmap in order to alert us of cyclic dependencies that have been created between Topics.
To begin, open the mapping definition (mindmap.gmfmap) and right-click the Mapping node. Select 'New Child... Audit Container' and give it a name (e.g. Mindmap Audits). Assign it an id and description as well. To the container, add a new 'Audit Rule' named 'Cyclic relationship check'. We are going to target the Map class for the audit, so add a child 'Domain Element Target' to the Audit Rule and select 'Map' as the Element. Add a new child 'Constraint' to the Audit Rule and enter the following for the Body, leaving the Language set to ocl.
Tip : When authoring these constraint expressions in OCL, you may find it helpful to contribute an action to open the OCL Interpreter view on instances of your domain model. See the OCL Interpreter Example in the online documentation for more information.
self.relations->forAll(r1, r2 | r1.target = r2.source and r1.type = r2.type implies r2.target <> r1.source)
This will only detect cycles that exist between two directly linked Topic elements, but is sufficient for our purposes here. If someone more OCL-savvy can provide a statement to detect cycles between more than two Topics (if possible), it would be appreciated ;).
After reproducing the mindmap.gmfgen model, you will need to set the 'Validation Enabled' property of the Gen Diagram element to 'true' in order for the new audit to be run. To view familiar Eclipse decorators on our elements when audits are violated, set the 'Validation Decorators' property to 'true'. Finally, below that property is one called 'Validation Provider Priority' that you should set to 'Medium' (something higher than 'Lowest'). Do this and regenerate your editor code. After doing so, you will notice some new extensions listed in your editor's plugin.xml file. Primarily, you should notice the constraintProviders and constraintBindings extension-points to which your editor contributes. Examine these and take a closer look at the EMF Validation framework if you wish.
An improvement here would be to write validations that identify the offensive element to allow for selection via the problems view. Currently, violations result in the canvas itself being selected, as the context is the Map and not a particular Topic or Relationship. For example, a simple constraint added to our Topic elements would be to verify each has a name. Add such an Audit Rule to our container where the Domain Element is our Topic class and the constraint is 'name.size() > 0'.
Note : The generated code has a dependency on the EMF Data Integrity Frameworks feature from the Europa update site. It will not be selected automatically when installing GMF, so you will need to explicitly install it to run this part of the tutorial.
To test the new audits, launch your runtime workspace and create a dependency link between two Topic elements. Also, add a Topic and give it no name. Then from the Diagram menu, select 'Validate' and observe the errors in the Problems view, as shown here. To enable/disable the audit, you can find it now listed in the preferences dialog under 'Model Validation'.
In order to share content between diagrams, and indeed between domain model instances, GMF provides the capability to allow shortcuts to be added to diagrams. In order to enable this functionality, you'll need to do the following:
- locate the 'Shortcuts Provided For' and 'Contains Shortcuts To' properties of the Gen Diagram root of your generator model (e.g. mindmap.gmfgen) and set both of these properties to 'mindmap';
- inside the 'Context Menu' element (which should contain the 'Load Resource Action') create a 'Create Shortcut Action' using the contextual menu. This is needed in GMF 2.2 (for more information we refer to this comment in bug 174961).
Now you can regenerate your editor.
Test the shortcut capability by creating two new Mindmap diagrams and adding elements to each. On the background of one, right-click and select 'Create Shortcut...' to bring up a selection dialog. Browse to the other diagram and select a Topic node to add as a shortcut.
There is understandably no viewlet for this section.
In this section of the tutorial, we saw how to add compartments (including nested nodes), links representing classes, feature initializers, constraints, validation, and shortcuts. The next section of the tutorial will dig deeper and focus on altering generated output and manual extension of the editor, along with adding some polish. See GMF Tutorial Part 3.
Following the tutorial
- GMF Tutorial Part 1 - Get Started with GMF
- GMF Tutorial Part 2 - How to configure your editor
- GMF Tutorial Part 3 - Advanced customization
- GMF Tutorial Part 4


text:
The show will run from 2:30-3:00 PM EST. We will provide the details on how to listen and call in, next week. Toginet also has a live chat feature, which allows you to participate in the conversation online.
Can't listen live? Post your questions here, and we will forward them to the hosts of the show. They will do their best to get answers.

subset: commoncrawl


text:
Be sure to check out AYSO's newest sponsor-driven website, Healthy Soccer Kids! On it, our AYSO community can find a plethora of tips and tricks to helping keep their family active and healthy.
Recipes for healthy meals, tips for a nutritious diet and guides for getting the entire family active await on www.HealthySoccerKids.org!


text:
добро пожаловать A Spanish Life - Benijofar
The No. 1 social media website for people living in or thinking of coming to Spain for either a visit or a new life in the sun.
We have thousands of local people that add up to date information about life in Spain and what is happening in their area every day.
Tradesmen, businesses, bars and restaurants list their services on the site with many being recommended by their satisfied customers.
Properties for sale and rent can be found in our extensive property section along with all the information needed to buy a dream home in Spain.
Everyone can add to A Spanish Life by using the simple free tools provided, so if you have something you want to share or a service to tell others about then add them now, or maybe you know of an event or have important information then you can post it on the site for others to read.


text:
Monday, May 2, 2011
About Armor Class
I'm genuinely curious.
91 comments:
Nowadays, I don't know, but back in the day, we didn't have to tell the players the AC number, because describing the armor the monsters were wearing told them what it was. Granted, that wasn't true of many of the non-humanoid critters like oozes, but even then it could usually be inferred.
ReplyDeleteThis is how we do it and I agree it's the superior way (playing Moldvay).
Of course, players will often presume to figure out the target AC as combat progresses. That said, it's a major mindbender when players roll something that "should hit" and does not - what else is going on here? This often forces players to think in context of the narrative, rather than pure numbers.
I've played a good bit of 3rd Ed+ and find that frequently DM's will outright tell you the target, I suspect this is a function of the proliferation of multipliers and bonuses, at some point you just stop trying to add up more plusses. I suspect this tradition has encouraged the creep of announced AC.I play (and DM) multiple flavors of D&D and none of the DMs involved announce the AC. Occasionally, when running 4e, I'll alert the players of the "to hit" number after a few rounds, because the combat tends to slog on forever. It saves me a bit of time if they can determine if they've hit. If I'm running Labyrinth Lord or Swords & Wizardry, I never let out the AC info, though.
ReplyDelete"You do not truly know someone until you fight them." ~ Seraph, The Matrix Reloaded
The characters in the game world would know more about the relative skill of their adversaries than any of us will adequately relay via description at the game table. The best way for the players to make informed decisions on behalf of their characters is for them to know more about these things... so I'll let them know both AC and Hit Points -- once they've started fighting.tells me the highest AC his character hits.
Don't you mean lowest? I thought you liked descending AC :p
Seriously though, my method is more or less the same as yours even if I do use Ascending AC. If I used descending I would do it the same way.
Sometimes I'll let it slip after they've fought for a couple of rounds.I definitely tell them their AC. My reasoning is that more often than not when you are in a fight, you'll know by subtle means how difficult it will be to land a hit on your opponent.
While this information can and should be conveyed through descriptions, it is not the most effective tool to do so.
A description of exactly how difficult it will be to hit the opponent, along with the AC only adds fuel to players imaginations. It makes it easier to picture fighting styles, and for the players to improvise upon that information.
Here is a good example:
I played with a DM did not let any of us know ANY stats whatsoever. His descriptions were not always on the ball, but this is not to put down his ability to describe things, as he was really good at it.
The players expectations as to what the descriptions translated to mechanically threw off many players at times. The immersion was not worth the effort to stamp out meta gaming.I don't think I've ever played with a DM who gave out the AC of monsters. Excepting to speed up a long running combat at the point at which the players could've already figured it out themselves. In fact, this is probably almost always the DM merely confirming the group's deduction rather than telling them something they didn't already know.
ReplyDeleteI used to have players tell me what they rolled until very recently (a few months ago.) However, I realized that it was quicker to let the players know what the AC was and then have them just tell me whether it was a hit or miss. Smart players would figure it out within a few rounds of combat anyway. Now, I often write the monster's AC on a card and hang it on my DM screen during combat. That way, people can quickly look at it, let me know whether they hit, and for how much damage, and we can move on.
ReplyDeleteAlthough it's a bit of meta-game information, I think it's perfectly sensible to tell the players their opponent's AC. Otherwise you get things like:
DM: "Roll to hit."
Player: "I hit an AC of 7."
DM: "You miss."
Other Player: "I hit an AC of 6."
DM: "You hit."
...and everyone's going to know the number from that point on anyhow. Better to let them know beforehand and speed up the interaction.
I don't reveal this information before combat is engaged, however. That's giving away too much, too soon.I never tell my players the AC of the monster/opponent they're fighting. But I do let them know if there are environmental factors influencing how likely they or the opponent are to hit. (e.g., "The hobgoblin knocked you down to one knee last time, making it hard to bring your large shield to bear--the AC bonus from that will be reduced by one until you can get upright again.")
ReplyDeleteIn the 3e and 4e worlds, most games I've played used secret AC. Of course the calculation is simple addition, d20 + modifiers = best AC hit.
Back when I was playing 2e and THAC0 was the rule, it was generally messy. THAC0 - (d20 + modifiers) = best AC hit never clicked for too many people. When playing with new players, or more casual/social games, it was a constant stumbling block. Now, knowing the target AC didn't actually help anything (THAC0 - AC - modifiers = target number), but the general confusion seemed to lead to people expecting it.
This is the core of why I dislike decreasing ACs; it leads to subtractive math. And while the difference between 10+3 and 18-(10+1) isn't much, it's enough to create a bit more of a barrier. With both 3e and 4e, I've observed increasing numbers of casual players who moved from "announce their roll and let someone else calculate the result for them" to "calculates their own results."I have come to the decision over many years that players should (most of the time) know what they need to roll to succeed. Rolling blind all the time can really be unnerving as a player, I have found, as you really have no sense of how powerful you are or how powerful your opponent is. For all you know, the DM could just be making stuff up every round, making your decisions as a player pointless.
The times when I do go for blind rolls, however, is when the whole point is that the player doesn't know something. If you're rolling to find a trap or to see a stealthy character, you just roll and I tell you what happens--anything else would give the answer away, regardless of whether you succeeded or failed.Your way seems the default among the New York Red Box crowd, but I'm the exception when I run. More transparency = faster mechanical processing + sharper tactics, and I figure it's not that hard to get a read on how difficult your opponent is to kill. I feel fine making exceptions to that when there are hidden factors, or outright lying at first when the AC is way out of line with the appearance. I even do this with hit points in some battles.
@Nicolas Dessaux : Searcher of the Unknown is awesome and I had a lot of fun with it. Thanks!Never really thought about it. I guess I've never told people as a matter of habit a particular armor class. Most times, players know approximately what the AC is anyway based on the creature or armor that the opponent is wearing.
I guess like amp108 said, it could basically become a game of "Battleship" where players could figure it out on their own as they roll, so why not tell them?
I suppose "in-game" one might be able to "tell" an oppenent's armor class after an attack or two, sizing up your attack skills and opponent's defense and armor. You'd know roughly if you have a realistic chance of damaging him or not or if it's time to consider discretion as the better part of valorHidden mechanics that is somewhat unrealistic and impractical to enforce. An experienced adventurer will be in the ballpark as to a creature's capabilities after having fought them.
This point was driven home while I was playing NERO live action. Unlike tabletop D&D, NERO doesn't have a published monster manual. So throughout the game we never know what the actual stats are.
But it only a factor when you first face something. After I fought the creature, it became pretty obvious roughly what stats they possessed.
My solution is I don't worry about it and game in the way that resolves things the fastest. I don't allow the referring of monster manuals at the table. But neither do I intentionally hid the stats.It is an interesting question though, and it brings up how GMs and players handle all that "meta" information.
Do you let/play your characters as automatically "knowing" monster weaknesses (ie that pile of goo is green slime so break out the torches while the glop behind it is grey ooze...fire is useless there!). Or do you play them as having to find out the hard way? Charge headlong into the wraith without silver/magic weapons and not "knowing" about level draining because your character has never seen or heard of one before?I've never ever told players the Armor Class, ever. I mean-- conceivably they could have a spell or a feat or a power or a widget or something that let them know, but as a default? No way. Some of the more math savvy players figure it out-- though conditional bonuses can throw them off-- but I never tell ACs or DCs-- roll, & I'll tell you if that was enough.
ReplyDeleteI don't tell the players a foes AC and don't think I ever have. It adds some mystery when some attacks hit and some don't.
@rob, re: NERO monsters, unless you spend a lot of time volunteering as a monster. There was also an air of mystery because monster players would forget their stats a lot of the time.I don't tell; the players have to figure things out from a combination of description and trial-error, and it doesn't slow the game down appreciably. One last vestige of the "mysterium tremendum" of DMing that once concealed the combat charts and ringed round the DMG with terrible imprecations.
Likewise, I give clues to relative HP among monsters of the same ilk, but not the full monty.Cyclopeatron posted about this a while back. He noticed that his players were much more engaged and excited when they knew what target number was trying to be reached. It was like gambling, with the non-rollers rooting the roller on.
My own experience bears this out. I might let players whack at a creature a time or two to see how difficult it is. Then I just tell them, "okay 16 or above."- AnonymousMay 2, 2011 at 6:02 PM
I prefer to have the players roll and give me the roll (I have all the modifiers already written down for each player along with any additional modifiers based on the environment at the moment that they may not be aware of) so I add the modifiers to the roll and know if they hit or not.
I also don't allow players to "know" a monster unless their character has... I mean many people have played the game for years and a new character can not possibly know what all the monsters are since he is "new", and yet the character seems to already know the strengths and weaknesses of something ... this will cost you in my work... that "divine" knowledge obtained from somewhere can be dangerous to your character and possibly others with you. I always tell ACs. The PCs have a much clearer idea of their environment than the players do, and it's never set right with me to negate the kind of feedback the PCs would be getting with one-minute combat rounds. For Stars Without Number I enshrined this in the default combat roll of 1d20+attack bonus+target AC beating 20 to hit. I just don't get enough extra game utility from the additional obfuscation.
ReplyDelete"Is this procedure unusual at most game tables nowadays?"
I do it the way you do it and always have.
However, I had one player in my 3E game who bitterly, bitterly complained about not telling him the target number. There's a passage I found in the 3E DMG explicitly saying not to do that, and still he wasn't very happy.Alan De Smet said: "This is the core of why I dislike decreasing ACs; it leads to subtractive math."
Not necessarily. Instead do the equivalent d20+level+bonuses+AC >= 20.
Interesting! My players have never complained about that--but I let them know that they are welcome to interrogate me on what kind of success rate their character believes he or she might have based on analysis of conditions, and I will provide them with a general sense.
It's just unfair to present them with a situation that they might think their character can manage but which has an infinitesimally small chance of success mechanically speaking.I don't tell them before combat, but when they enter combat, I drop it on them. Makes for some fun situations ("Ok, I attack the fighter, what do I need to hit?" "He's AC0" "WHAT!!! You said he's only got chainmail on?????!!!" "Yep, that's right, you figure it out, meanwhile you need a 20 to hit...")Whatever makes things easier for me as DM, and as already pointed out, players figure it out after a round or two anyway.
ReplyDeleteYeah I try to keep it a secret at first but as many have pointed out, that secret is not a long lived one.
O'Flux: Yes I do allow them to decide which monster to hit. Only seems to make sense, sure I could try to hand wave some fog of war thing but that just seems like going so far to the point of being arbitrary to be.I tell 'em whether the target's defenses look the shit, so they can approximate in their own minds, and if they get within one point or so I'll often say something like "a solid hit but while he may flinch he does not take damage," to let them know, "Hey, that swing nearly did it, maybe if I grip the sword like this/strike juuust here"....i.e. roll just a bit better...
But I don't ever say AC 21 or anything like that unless after extended combat they seem to openly challenge me about it. At that point I step out a little and just point out the facts, as I would if we were playing Scrabble and I was challenged on a word.- AnonymousMay 2, 2011 at 8:38 PM
Started playing with Melee & Wizard; so knowing what one needs to hit seems normal to me.
ReplyDelete I don't really see amp108's scenario as a problem. I think it's good that more information about opponents comes out as the combat progresses.
That said, it is easier for warriors in our game to know what they need to hit, because Gods & Monsters lets player characters use "mojo" to affect die rolls if the roll is archetypal, and fighting is archetypal for warriors. So the hypothetical warrior who rolls enough to hit AC 7 and is told that they've missed might say, "I'm willing to spend 4 mojo to hit him."
If the roll was just off by one, then I tell them, okay, you spend one mojo. And now (a) they hit, and (b) they know what they need to hit.
Letting them figure things out as the combat progresses is one of the reasons I always roll in the open, too. That way, they can objectively see how easy it is for their opponent to hit them.I prefer playing and running games where the target number is not announced up-front. It's not in the least important to me that it doesn't remain secret forever, that feels both realistic and engaging - after the fight has gone a few rounds, the fighter thinks to himself "I took a couple of good swings, and he didn't flinch at all; this guy is tough".
I especially remember that feeling in "Village of Hommlet" when a party member was jumped by the giant tick. We thought "no problem, hit it till it's dead", and were shocked at how hard that was. If we knew right away that we would struggle to damage it, we would have looked for other ways to deal with it - instead we spent several futile rounds trying to mash it and it killed it's victim. To my mind, that was a cool result (albeit upsetting for the player in question).I don't tell the players the Armor class of an opponent until after the first round. That way there is a little bit of a surprise but then afterward we can get down to the business of combat.
As the DM, i have enough crap to deal with including descriptions of the world and everything in it so I don't need to be dicking around with math let the players do the math.I have never told my players the AC of their opponents. Having a very mathematical mind, I never had a problem handling THAC0. I would ask for the players' THAC0 scores at the beginning of game and figure what they needed to hit their opponents before they rolled the dice. Never had an issue with people trying to figure the opponent's AC. They just wanted a yes or no answer to "did I hit?"
ReplyDeleteI've given out ACs and I've kept them secret, but I've never asked people to tell me what AC they hit. I just ask what they roll, then tell them if they hit.
I noticed that "tell what AC you hit" is a frequent phrase when discussing 2e (pro or con.) To me, it makes a simple process sound complicated. Maybe that's why some people are so anti-THAC0.I actually had to think about this for a moment. I currently run Pathfinder, but typically, even in older editions of the game when I do/did run them, I almost never announce AC up front during combat. I may tell the players after a few rounds (usually about the same time they deduce what it is) but I don't announce it. My players never seem to have a problem with it. Most GM's I play with don't announce it either. It's so ingrained in my noggin' that, that I don't even really notice it consciously during play.
ReplyDeleteFor what it is worth, my not announcing AC really doesn't have anything to do with keeping it secret, per se. I can agree with the arguments of those who do announce it.
Rather, I think it has more to do with the fact that I don't want players to feel like they have to know anything about the rules. And I encourage those who know the rules not to think in mechanics.
And I don't find telling them the AC to really speed things up either, so there's not any incentive for me to do it differentlyI can't remember if I've ever played in or DMed a game in which an AC is known.
Revealing what's needed to hit takes part of the fear factor ergo part of the fun.
Joy is throwing AC 0 "toughskin" kobolds at a party and getting that vet player to go, "WTF?"
Or a variable AC creature. Fun. Fun. Fun.- AnonymousMay 2, 2011 at 10:27 PM
I have everyone's THAC0s calculated per weapon, including two-weapon use, specialization, STR bonuses, elf bonuses, DEX bonuses, magic item bonuses, etc on the player's character sheets.
That way, in the usual case, I say "roll a d20 and subtract it from that THAC0 - what AC do you hit?"
@James - is this post so we can all get it out of our systems? :-) - AnonymousMay 2, 2011 at 10:34 PM
@PCB: That giant tick battle is definitely the most memorable we've had so far IMO. It was like a scene out of ER.
ReplyDelete @Delta "I do it the way you do it and always have."
"Not necessarily. Instead do the equivalent d20+level+bonuses+AC >= 20."
How can they do that is you don't tell them the AC? I was under the impression that you told you players the AC.
I have always keep AC (and DCV in Champions) secret but have recently decided it's not worth the effort. I think people would figure it out quite quickly in real combat anyway. I think any suspense involved is overwhelmed by tedium and frustration, just telling them after the first swing provides enough suspense.- AnonymousMay 2, 2011 at 10:51 PM
@O'Flux aka SteveEG - I have everyone announce who they're attacking before rolling for initiative.
If the opponent dies before the PC attacks (melee or ranged) they can just pick someone else.
I don't allow spell-casters to choose a new target unless it's a spell which is "released" after casting. e.g. Charm Person would be forfeit if the victim dies partway through. - AnonymousMay 3, 2011 at 2:55 AM
My players roll their dice and announce what AC they hit. Then I tell them if it's enough. Eventually they'll guess or deduce what the actual AC is, but I'm fine with that. Surely a bunch of dungeon-delving badasses would have an approximate idea of their chances.
As for bonuses and penalties, I usually let the players handle the obvious ones their characters would be aware of. I adjust AC's behind the screen for the rest as appropriate. With armour class in D&D it's generally fairly obvious what the actual AC is going to be. If players can observe their opponents in action they can determine their approximate AC. If they are fighting an opponent they can soon tell for themselves. Particularly when their blade keeps magically turning on the armour of their opponent.
Despite this I generally keep it secret for creatures they have never met before. Players generally tell me the AC they hit. That's because you have to realise that the reality is not as mechanical as the game system. That's why there is a d20 roll to act as random chance. Is your opponent hard to hit because he's good (high AC) or because you can't find an opening (low rolls)? It's when their characters know that there was a good opening for a strike, and that they were not able to make the most of it (rolled high and missed), that they might be in serious trouble.
This is what I consider to be one of the advantages of the fighter class. The ability to judge the combat potential of an opponent. Just as a thief can judge a mark, or a magic user the complexity of magics.
In other games, such as Ironclaw, I'm more open and tend not to conceal the rolls of their opponents. [By seeing the dice they are rolling against they have a good idea of the capabilities of their opponent.] In Runequest I generally inform people as to whether their abilities are within 20% of their opponent (superior or inferior), or vastly superior or inferior (more than 20% difference). [Then again I use variable dice for Runequest with escalating difficulty, rather than assigning difficulty modifiers.]I just composed an excellent, well-reasoned comment that I forgot to save before posting, and received the message, "Error performing your request," so it is now lost forever. Instead of trying to reconstruct it, I'll just say I've always revealed AC once combat has started, but not before.
That is all. :-[It seems mostly everyone commenting above do reveal the AC to the players once an arbitrary factor has been met.
Based on the comments, I think the earliest point in which AC should be given out is when the PC first hits an opponent.
I think most players are more than capable of separating mechanics from role playing, and once they begin to understand those mechanics, the math actually serves to construct their descriptions more vividly.
Rather than the information exchange being about math, it is all kept in the background as everyone does their own calculations resulting in more time for descriptions.
player: I got a 15. Do I hit?
DM: no sorry...
player: I slash at the bastard wildly but he's too quick. Stay still damn it!!!
I think it is quicker to reveal stats for that reason, and trust that players are not going to take advantage or cheat while you play.
I rarely look at my players rolls, I just let them know what they need to get upfront and ask them to describe it rather than tell me what the exact result was.I just tell the players whether or not they've hit. I try to do it descriptively as often as possible - "Your arrow grazes the goblin's fur, but misses" or "Your arrow is so wide to the right that the goblin doesn't even notice it" - but sometimes lapse into the standard "you hit/you miss." My players don't have the to-hit numbers printed on their character sheets, so although they eventually figure out the number they need to hit a given monster, they never translate that to an AC value.
ReplyDeleteAny smart player will eventually figure out what the opponent's armor class is, based on what hits and what doesn't. A DM should never tell the player's what their opponent's AC is because it completely shatters the suspense of combat. What I should have said on the previous post is that ascending AC is convenient because "what did you roll?" "15" (DM checks AC and sees that it is 15). "You hit".
ReplyDeleteMy players tell me what they hit. Eventually they figure out the monsters AC.
Sometimes in the event of a 19 or 20 rolled they will just claim I hit, I'll often as for more details at which point they say I rolled a 19 that hits and AC of "negative ....) and I then agree they hit.
If I'm playing 4E or 3.X I generally assume a 16-20 on the die hits assuming it is level appropriate.Player rolls d20, adds modifiers and/or consults their character sheet as appropriate, announces what AC they hit; GM announces whether they hit or missed, adding a "your swing goes wide" or "almost got him" or "clang against the shield" as the GM deems appropriate.
By the time the combat is up, the players will usually have figured out what AC the opponents/monsters had - same as their characters would have gotten the measure of their foe.
Only time the GM should announce the AC is if a player has poor math skills and needs the help, or on the first game session for someone who has never played before.- AnonymousMay 3, 2011 at 9:32 AM
As a young player, I was always told what the TH number was. I liked that--gave some sense of meaning to the random numbers generated.
I DM for my two daughters (age 9 and 7) and I always tell them what they need to hit. I rarely tell them what they need to hit; my players don't always describe their actions, while I tend to be more descriptive, so I use words to give them an idea of how well they've hit, and let them work out the AC based on that and whether they do any damage.
We also used to play with the DM keeping track of PCs hit points, rather than the player, and using words to give them an idea of how wounded they were. Don't do that anymore, but it did help create atmosphere.Depends. Back when I was into playing the most current edition (0e and 2e in the 90s, 3e thereafter), I always kept AC secret. It was like HD or HP: you just didn't give that info up.
Nowadays, I don't see the point. My rule is this: as soon as a player has definitely declared that he's attacking a particular monster, the monster's AC is revealed. It saves time and lets the player do all the math before rolling to hit.
Unless, of course, I'm running a game geared towards pure immersion (usually a good option for total newbies). But in this case, I'll even be concealing the PCs' own ability scores and hit points, never mind monster stats.With my boys I generally tell them to roll and then tell them if they hit or not.
By not telling them the AC I can adjust for cover, terrain, or (in the past dealing with very young kids) throw in a free +1 to hit because they really need to get a hit in about now.
When I am a player in my normal game my DM never tells us the AC. We do have rules lawyer in the group that I think has every monster's AC memorized so sooner or later he tells us, but otherwise we are on our own.Michael said: "How can they do that is you don't tell them the AC? I was under the impression that you told you players the AC."
Players tell me the total of their d20+level+bonuses. I mentally add the AC and any other bonuses they don't know about.
If the player starts by uttering the word "twenty..." anything, I can almost always abort the process and just say "you hit".I run an ADnD2 campaign.
My players tell me what they roll, I tell them if and how they hit.
The combination of descending AC and THAC0 really make combat more "magical".
When you give players a Base Attack Bonus, that modifier is in the forefront of their mind. Players tend to be very conscious of bonuses and penalties. But THAC0 is just a value, and not directly applied to the attack roll.
Thus, a player is suddenly amazed when she can hit the orc with an attack roll of 8.
It feels like your character is just somehow better than it was before, which is far more charming, to me, than being able to "see" all the nuts and bolts by having to add up bonuses I get just for being a certain level.
...um, so, I prefer descending armor class because it works with THAC0. It what I started playing with, and it just feels right. Ascending armor just feels... video gamey.- AnonymousMay 3, 2011 at 3:56 PM
@Joe: "Ascending armor just feels... video gamey."
Plus, descending armor class is what I first learned. So that's the right way. :)
Actually, though, at the *very* beginning, I was using Basic D&D where armor classes only ranged from 9 to 2...oh well. I don't ever announce target numbers for AC or any other kind of check difficulty, but players know that they can expect a 14 or better on the die to hit the vast majority of the time, just because that's how the game is designed and they pay attention to that kind of thing. Sometimes, though, they're still surprised when they hit on a 6 or something like that.
ReplyDelete- AnonymousMay 3, 2011 at 6:16 PM
You do as Dungeon Master try and avoid telling players what the Target Armour Class is because they cant possibly know what that Ugly faun looking fellow has as an AC, but at some point there is at some point a development of the DM's Degree of Trust in the Ethics of the Player that they are able to check their own TO HIT chart and tell you whether they got the minimum roll required to Hit Orcus in the male parts with a magically enchanted diamond...
ReplyDelete With 'NPC' numbers like this in rpgs (target numbers in Traveller or enemy % to hit) I tend to work as you do at the beginning of an unclear situation and as it proceeds the players either work out the opposition or maybe by the end I may have revealed all. It's like the 'fog of war' in my mind's eye and it can clear partially with time.
ReplyDelete- AnonymousMay 5, 2011 at 4:57 PM
I like to keep it secret at least at the beginning of a fight. If they have never fought the monster before, how do they know how difficult it will be? If it's a physical test, such as leaping across a gap, I generally tell them their chances. In combat, there are too many variables and not enough time to think.
I prefer to let them tell me the total roll, because there may be hidden modifiers. What about the cursed sword he doesn't know about? What about the bonus this creature has because it's near enough to the Toad Idol? "Is this procedure unusual at most game tables nowadays?"
No, that is how my group and the one or two other "old school" type games I have played with in my city play.
I had a "new school" player I play with us a few times and he asked directly for AC once or twice but I just responded by describing their armour, relative speed and fighting skill/style.
I don't see it as a big dewl but I prefer a "mechanics in the background behind the fluff" style if possible.


text:
Ben Buffington company specialized in the industry of Other Business Services. The headquarters are in Twin Falls
Location: Twin Falls
SALARY: $60-$85 per HOUR
Field of activity: Other Business Services
Job type: Permanent
Posted: 2024-06-13
Ben Buffington is a Other Business Services company founded in 2007 and specialized in the industry of Administrative and Support and Waste Management and Remediation Services. The headquarters are in Twin Falls.
The market type is the way that a company uses to make its commercial transactions. There are companies that operate B2B, B2C or both.
There are many cases when a company is operating both B2B and B2C. An example for this would be the real estate industry, where the agencies can land or sell to both businesses or consumers.
Ben Buffington is a (B2B) Business to Businness company, that has been known in the Other Business Services field as one of the best partners in business.
It would definitely be the care we take in delivering our products/services to our customers every day. We are working continually to improve the quality of our products/services. We always put the interest of our customers on the first place.
As per SIC, our company can help you with services/products of:
Over the years we have recruited the best workers in the field of Business Services, NEC. They are all certified Unclassified, with over 17 years of experience in the Administrative and Support and Waste Management and Remediation Services industry.
Where can you find us Ben Buffington?


text:
Hannah Wilke
Nancy Princenthal
Hannah Wilke was a defining presence in the emerging community of women artists in the 1960s and 1970s. In this collection, Nancy Princenthal not only presents a comprehensive survey of the artist's oeuvre but also goes some way to uncovering the rhetoric behind Wilke's work.
Wilke's courageous feminist practice, from the early 1960s until her untimely death in 1993, is testament to the notion that making art can sustain the subject beyond its bodily demise. Using a wide range of non-traditional mediums, including photography and film, as well as latex and chewing gum, Wilkes captured the spirit of the times. Her work has often been aligned to the women's liberation movement although labelling her art as such obscures its real value.
By shifting long-standing assumptions that associate her work with essentialist 1970s feminism, Princenthal's commentary gives weight to the complex narratives at play beneath the surface. Taking in inexplicit references to Judaism to the heartbreaking images of her illness this monograph not only makes compelling reading, but fascinating viewing.
Bethany Rex


text:
Heart Failure
Find your care
The UCLA cardiovascular team cares for all types of heart and vascular conditions. Call 310-825-9011 to connect with a cardiovascular customer care specialist.
What is heart failure?
Heart failure, also called congestive heart failure, is a condition in which the heart cannot pump enough oxygenated blood to meet the needs of the body's other organs. The heart keeps pumping, but not as efficiently as a healthy heart. Usually, the heart's diminished capacity to pump reflects a progressive, underlying condition.
What causes heart failure?
Heart failure may result from any or all of the following:
- Heart valve disease caused by past rheumatic fever or other infections
- High blood pressure (hypertension)
- Active infections of the heart valves and/or heart muscle (for example, endocarditis or myocarditis)
- Previous heart attack(s) (myocardial infarction). Scar tissue from prior damage may interfere with the heart muscle's ability to pump normally.
- Coronary artery disease. Narrowing of the arteries that supply blood to the heart muscle.
- Cardiomyopathy or another primary disease of the heart muscle
- Congenital heart disease or defects (present at birth)
- Cardiac arrhythmias (irregular heartbeats)
- Chronic lung disease and pulmonary embolism
- Certain medications
- Excessive sodium (salt) intake
- Anemia and excessive blood loss
- Complications of diabetes
How does heart failure affect the body?
Heart failure interferes with the kidney's normal function of eliminating excess sodium and waste products from the body. In congestive heart failure, the body retains more fluid, resulting in swelling of the ankles and legs. Fluid also collects in the lungs, which can cause profound shortness of breath.
What are the symptoms of heart failure?
The following are the most common symptoms of heart failure. However, each individual may experience symptoms differently. Symptoms may include:
- Shortness of breath during rest, exercise, or while lying flat
- Weight gain
- Visible swelling of the legs and ankles (due to a buildup of fluid), and, occasionally, swelling of the abdomen
- Fatigue and weakness
- Loss of appetite, nausea, and abdominal pain
- Persistent cough that can cause blood-tinged sputum
The severity of the condition and symptoms depends on how much of the heart's pumping capacity has been compromised.
The symptoms of heart failure may resemble other conditions or medical problems. Always consult your health care provider for a diagnosis.
How is heart failure diagnosed?
In addition to a complete medical history and physical examination, diagnostic procedures for heart failure may include any, or a combination of, the following:
- Chest X-ray. A diagnostic test that uses invisible electromagnetic energy beams to produce images of internal tissues, bones, and organs onto film.
- Echocardiogram (also called echo). A noninvasive test that uses sound waves to evaluate the motion of the heart's chambers and valves. The echo sound waves create an image on the monitor as an ultrasound transducer is passed over the heart.
- Electrocardiogram (ECG or EKG). A test that records the electrical activity of the heart, shows abnormal rhythms (arrhythmias or dysrhythmias), and can sometimes detect heart muscle damage.
- BNP testing. B-type natriuretic peptide (BNP) is a hormone released from the ventricles in response to increased wall tension (stress) that occurs with heart failure. BNP levels rise as wall stress increases. BNP levels are useful in the rapid evaluation of heart failure. In general, the higher the BNP levels, the worse the heart failure.
Treatment for heart failure
Specific treatment for heart failure will be determined by your health care provider based on:
- Your age, overall health, and medical history
- Extent of the disease
- Your tolerance for specific medications, procedures, or therapies
- Expectations for the course of the disease
- Your opinion or preference
The cause of the heart failure will dictate the treatment protocol established. If the heart failure is caused by a valve disorder, then surgery may be performed. If the heart failure is caused by a disease, such as anemia, then the underlying disease will be treated. Although there is no cure for heart failure due to damaged heart muscle, many forms of treatment have been used to treat symptoms very effectively.
The goal of treatment is to improve a person's quality of life by making the appropriate lifestyle changes and implementing drug therapy.
Treatment of heart failure may include:
- Controlling risk factors:
- Quitting smoking
- Losing weight (if overweight) and increasing moderate exercise
- Restrict salt and fat from the diet
- Avoiding alcohol
- Proper rest
- Controlling blood sugar if diabetic
- Controlling blood pressure
- Limiting fluids
- Medication, such as:
- Angiotensin converting enzyme (ACE) inhibitors. This medication decreases the pressure inside the blood vessels and reduces the resistance against which the heart pumps.
- Angiotensin receptor blockers (ARB). This is alternative medication for reducing workload on the heart if ACE inhibitors are not tolerated.
- Diuretics. These reduce the amount of fluid in the body.
- Vasodilators. These dilate the blood vessels and reduce workload on the heart.
- Digitalis. This medication helps the heart beat stronger with a more regular rhythm.
- Antiarrhythmia medications. These help maintain normal heart rhythm and help prevent sudden cardiac death.
- Beta-blockers. These reduce the heart's tendency to beat faster and reduce workload by blocking specific receptors on heart cells.
- Aldosterone blockers. Medication that blocks the effects of the hormone aldosterone which causes sodium and water retention.
- Biventricular pacing/cardiac resynchronization therapy. A new type of pacemaker that paces both pumping chambers of the heart simultaneously to coordinate contractions and to improve the heart's function. Some heart failure patients are candidates for this therapy.
- Implantable cardioverter defibrillator. A device similar to a pacemaker that senses when the heart is beating too fast and delivers an electrical shock to convert the fast rhythm to a normal rhythm.
- Heart transplantation
- Ventricular assist devices (VADs). These are mechanical devices used to take over the pumping function for one or both of the heart's ventricles, or pumping chambers. A VAD may be necessary when heart failure progresses to the point that medications and other treatments are no longer effective.
To learn more, watch these short educational videos and use this personalized checklist to keep track of your medications:


text:
Reviewed by Tena Starr
copyright the Chronicle 8-29-2012
Vermont Women, Native Americans & African Americans, Out of the Shadows of History, by Cynthia D. Bittiinger. Paperback. 158 pages. Published by the History Press. $19.99.
It generally wasn't until the 1960s that Vermont history books were written to acknowledge the fact that Europeans were not the first to inhabit this ground, Cynthia Bittinger says in this slender book. The man who finally assembled a convincing body of research on the early presence of the Abenaki, the man who finally managed to get historical mention of a people who'd been here for something like 11,000 years before Europeans were, was from Albany.
Historians generally credit Gordon M. Day with being the person who unearthed New England's native past, Ms. Bittinger says. Mr. Day was born in Orleans County in 1911 and, as a child, played with children who were part Abenaki. He also knew the area as a place for natives to hunt and trap.
"In his adult years, he initially set out to study forest ecology, but after serving in World War II, he decided to devote himself entirely to saving Abenaki culture from oblivion," Ms. Bittinger writes.
Mr. Day used French records (apparently more accurate — and more friendly — than British records) and Indian tradition in his research, discovering that, until the end of the eighteenth century, the village of Missisquoi, near present day Swanton, was a political hub for Western Abenaki.
Since he knew the Abenaki language, he was able to avail himself of natives' oral tradition to reconstruct a narrative for a people who had either died wholesale, largely from European diseases they had no immunity to, or willfully vanished, either literally or figuratively, in order to avoid persecution, destitution, or sterilization.
What, Ms. Bittinger wonders, allowed for misinformation so grave that an entire people was excluded from the history books? Ethnocentricism? Lack of imagination? Lack of sources? The willingness of the Abenaki themselves to disappear?
Whatever the cause, Ms. Bittinger has done her part to remedy the omission and devotes the initial part of this book to the eastern Indian tribes.
The American Revolution seemed to spell the end of the Abenaki as a visible presence, she says. Although many pulled back into Canada, some lingered in northern Vermont.
However, the Abenaki did little to reclaim their own history, possibly because of fear of retaliation for taking captives or attacking settlers, Ms. Bittinger speculates.
Later, in the twentieth century, Abenakis would be likely to hide their ancestry if possible because revealing it could lead to involuntary sterilization through the eugenics movement, which was not only aimed at Indians, but also at the poor and the less intelligent.
Ms. Bittinger has packed an awful lot of information into this little book. Any one of the subjects she tackles here could have been a book in itself. However, the section on the natives of Vermont is the most tantalizing and left this reader, at least, yearning for more.
Ms. Bittinger is a history professor as well as a commentator and lecturer, and this book reads more like a text than a narrative, with brief, sometimes very brief, descriptions on significant events, people, and historical information. Each section ends with a "conclusion," summing up the information that precedes it, much in the way one might write a scholarly paper.
What Ms. Bittinger set out to do, though, is admirable. "Women and people of color have been denied a usable history," she writes in her introduction. "With a focus on landscape, military battles and government, natives, blacks and women are usually not included unless they participated in a battle or ran for office."
But people have a need to know where they fit into the American story, she says. "I am offering this history to change the narrative of Vermont's past, present and future."
She says she has tried to focus on the positive, on those who worked to improve the lives of others.
Vermont has often been ahead of the curve in its efforts to afford equal rights to its people, but it's far from perfect. For instance, passage of an Equal Rights Amendment for women failed as late as 1986.
In the nineteenth century, often women who died were not even remembered by their names on gravestones. Widows were referred to as "relicts." Ms. Bittinger offers this example: "Experience. Relict of Samuel Wellington. Died Dec. 17, 1838. Age 69. Her first husband was Elias Bemis."
The fact that maiden names were sometimes not included on headstones, can make tracing geneologies tough.
She moves rapidly from the grimness of that time for women, recording gains and the stories of some of the remarkable women who helped achieve them.
Ms. Bittinger's credentials are long and illustrious. She teaches Vermont history for Community College, she's a lecturer, she's a founding member of the Vermont Women's History Project at the Vermont Historical Society, a commentator on Vermont history for Vermont Public Radio, and was the executive director of the Calvin Coolidge Memorial Foundation in Plymouth for 18 years, and her commentaries on Grace Coolidge won the Edward R. Morrow Award.
If you're looking for a captivating read, this isn't the book, but it does impart some very useful information about Vermont history and some remarkable people who risked their lives, or at least security and prosperity, to make this state be the leader it remains in civil rights.
Ms. Bittinger has done her homework, and produced an edifying volume of work that outlines not only many of the brave and ethical people who helped push this state forward in its fight for decency and fairness, but also honestly discusses where it's gone wrong.
contact Tena Starr at [email protected]
For more free articles from the Chronicle like this one, see our Reviews page. For all the Chronicle's stories, pick up a print copy or subscribe, either for print or digital editions.


text:
Wood & Plaid Fabric Bear Wall Hanging. Meausres 24″W
3 in stock
Wood & Plaid Fabric Bear Wall Hanging. Meausres 24″W
©2024 American Bear Association | Minnesota Web Design by W.A. Fisher Co. | Report Problems
Any unauthorized redistribution or reproduction of part or all of the content of this site, in any form, is strictly prohibited. You may not distribute or exploit the content or store it in any other website or other form of electronic retrieval system without express written permission of the American Bear Association.


text:
Fox News Reporter James Rosen Caught Up In Federal Probe
There is word of another controversial leak investigation by the Department of Justice. The target is Fox News reporter James Rosen, who was monitored by the department after breaking a story about North Korea's nuclear weapons program in 2009.
The White House is defending itself - again - against charges that it's trampling on the First Amendment. The Justice Department obtained a portfolio of information about a Fox News reporter's conversations and visits. Obtaining this information was part of an investigation into a possible leak. A federal prosecutor said the reporter, James Rosen, had conspired in the commission of a crime. We have more from NPR's David Folkenflik.
DAVID FOLKENFLIK, BYLINE: Fox News has long been an irritant to the Obama White House, but the questions from the entire White House press corps got pretty pointed yesterday.
MAJOR GARRETT: The subpoena says James Rosen is a potential criminal because he's a reporter. Is the White House comfortable with that standard, never before seen in a leak investigation?
FOLKENFLIK: That was Major Garrett, of CBS News. As other reporters pelted White House press secretary Jay Carney with similar questions, he professed respect for reporters and the First Amendment, but he said another obligation also confronted government officials.
JAY CARNEY: We need to make sure that leaks are not tolerated because leaks - they can endanger the lives of our men and women, and endanger our national security; need to be taken very seriously.
FOLKENFLIK: The reporter, James Rosen, got caught up in a federal investigation into a State Department analyst believed to have leaked information to him about North Korea's nuclear ambitions. No one questions the legal right of prosecutors to obtain the records of the analyst, Stephen Jin-Woo Kim. But the Washington Post revealed Monday that the federal government had also obtained a warrant in May 2010 from a judge, for Rosen's telephone records and emails, too.
A Fox executive told NPR that the network learned of the warrant yesterday, three years later, in the pages of the Washington Post. Fox called it chilling. Here's Hearst Corp. general counsel Eve Burton, considered one of the leading corporate First Amendment lawyers in the country.
EVE BURTON: It appears to be that there's a possibility, at least, in the minds of some - prosecutor, that there is a right to criminalize what reporters do every day; which is talk to sources, and to provide the public with valuable information.
FOLKENFLIK: This is just the latest leak investigation pursued by this Justice Department. But Burton notes the affidavit called the Fox reporter an aider and abettor and/or a co-conspirator in the crime. If, Burton says...
BURTON: ...that becomes a federal crime, merely by picking up the phone and asking the question, we are in for some very dark days ahead.
FOLKENFLIK: It's ironic, says former U.S. Attorney Joe Russoniello, given President Obama's pledge to preside over the most transparent administration in American history. But he says the law is not on the reporter's side.
JOE RUSSONIELLO: It's not like we're talking about that there's a privilege between a newspaper person and his or her source. It just doesn't exist. I mean, they've been fighting for it; a lot of people would like to see it. It just isn't there.
FOLKENFLIK: Russoniello says reporters shouldn't kid themselves. At least in principle, they could be prosecuted.
RUSSONIELLO: Receiving stolen property is a very good example.
FOLKENFLIK: If you consider classified information the stolen property, he says, the reporter is like a fence - and open to prosecution. Leonard Downie Jr. was executive editor of the Washington Post for 17 years. He says reporters aren't the only ones to worry about.
LEONARD DOWNIE JR.: It's potentially very discouraging to government officials who may have important information to tell members of the press.
FOLKENFLIK: Taken with other cases, Downie has reached a stark conclusion.
DOWNIE: The witch hunt that has been going on for leakers in this administration, is going beyond what the law requires.
FOLKENFLIK: The Justice Department may believe it needs to use this power to root out leaks. But in the process it has unified Fox pundits who attack the White House daily with the rest of the press corps, in criticism of the Obama administration.
David Folkenflik, NPR News, New York.
Copyright © 2013 NPR. All rights reserved. Visit our website terms of use and permissions pages at www.npr.org for further information.
NPR transcripts are created on a rush deadline by an NPR contractor. This text may not be in its final form and may be updated or revised in the future. Accuracy and availability may vary. The authoritative record of NPR's programming is the audio record.


text:
We offer a Free quote and UK design service, get in touch today.
For school playgrounds and public parks, trim trail equipment is one of the most common types of play features that are installed.
These are usually made from timber and can include a number of different components which help children develop their physical skills in a fun way.
Our team can install these structures as a full set or with individual components so it's completely up to you.
Fitness trails are becoming increasingly common at many organisations including primary schools, kindergarten and EYFS groups.
This is because they are looking to improve outdoor play with products which can be used for physical development.
They may be supplied along with other playground features such as colourful markings wetpour or artificial grass surfaces to create a complete outdoor learning space.
For young children, physical activity and outdoor play is really important for health, fitness and cognitive development. With interactive playground features, kids are able to learn a number of fundamental social skills as well.
Trim trail equipment varies widely, but here are some common types of equipment you might find on a trim trail:
The average cost of trim trail equipment is £350 - £3,500.
The costs will vary depending on the type of equipment, quantity of play equipment and quality of materials.
If you would like to get a quote for trim trail equipment, please contact us and we will be happt to provide you with a quotation.
Trim trail equipment in schools can offer a wide range of benefits for both students and the educational institution as a whole. Here are some key advantages:
The primary purpose of trim trail equipment is to encourage people of all ages and fitness levels to engage in physical exercise in a natural outdoor setting.
The equipment is strategically placed along a trail, allowing individuals or groups to use the stations while jogging, walking, or simply enjoying the outdoors.
Each station is designed to target different muscle groups and provide a wide range of exercises.
There are a range of designs that we offer for playground assault course equipment, each of which help kids to develop physical skills like balance, agility, strength and coordination.
Some of the different components that are often chosen include rope bridges, stepping logs, ladders, tunnels and balancing beams.
These could be arranged to create a continuous obstacle course, but each piece of equipment can be used individually as well. OFSTED encourage outdoor activities as they help children to improve their physical fitness as well as learning new skills outside of the classroom.
We can offer professional advice to help you choose the right trim trail equipment for your school playground. If you have a budget in mind we'll try to keep the costs within that price range, so please feel free to contact us today by filling in your details through the quick form.
In order to increase activity in young people, children's play structures can be very beneficial when installed at schools, nurseries or public facilities. You can design a bespoke activity trail with versatile pieces of equipment to suit primary school children up to age 12 and above.
Promoting active learning in schools is very important as it helps children to become more physically fit and healthy.
There are a range of climbing structures available as well as balancing beams, bridges and activity panels, each of these allow the kids to develop their physical literacy while having fun and playing with others. You can choose from a variety of different features to create a unique outdoor area that is both fun and educational.
The trim trail we supply is designed to be versatile and strong so it can be used in a range of activities throughout break times and even PE lessons.
These children's play structures are often installed to existing grass areas, we recommend having specialist rubber mats installed beneath the equipment to prevent any injuries if a child falls off.
Other safety surfaces like rubber mulch and wetpour could also be installed beneath playground equipment to absorb impact and stop kids from getting hurt.
A Trim Trail is the course that a child can play on during breaktimes and Physical Education lessons. These trails involve a series of activites that the children must complete to reach the end of the circuit.
These obsticles can vary and come in different designs to suit children of all ages.
If the Trail is going in a Junior school the track may be more advanced than one in a nursery or Infant school, we are able to offer your facility a range of products to fit your required specification.
It is common for teachers to look at how to improve KS1 outdoor learning and other age levels with new products which are engaging and beneficial.
We offer a wide variety of different options which focus on physical development as well as boosting communication skills and building relationships.
A Trim Trail is an outdoor fitness trail or gym that consists of a series of exercise stations spaced out along a walking or jogging trail.
These stations are equipped with various fitness equipment designed to promote physical activity, cardiovascular exercise, strength training, balance, and flexibility.
Trim trail equipment is specifically designed for outdoor use and is usually made from durable, weather-resistant materials like metal or treated wood.
Trim trail equipment typically includes a variety of exercise stations such as pull-up bars, parallel bars, balance beams, step-up platforms, sit-up benches, push-up bars, monkey bars, climbing walls, swing bars, stretching stations, cardio machines, resistance bands, plyometric boxes, and more.
We would be happy to help if you are looking to improve active play on your playground using these diverse products.
Many children enjoy using the activity trails for developing physical fitness along with communication and social skills when working with others.
Please contact School Playground Equipment Limited by sending over your details through our enquiry form.
We'd love to hear from you and we'll get back to you as soon as possible to discuss different pieces of trim trail equipment and speak about the different types of trim trail surfaces.


text:
Cambodia Flag - International Country Flag Sticker
Cambodia Flag - International Country Flag Sticker
These stickers are perfect on your laptop, tablet, notebook, mirrors, phone, water bottle, hydro flask, journal, windows, car windows, water bottles, and more. With a variety of designs to choose from, you can find the perfect sticker to represent you.
Made from high-quality materials, our weather proof stickers are super durable and built to last.
Individual die-cut, waterproof, and matte sticker. Designed, manufactured, and printed in the USA. 100% satisfaction guaranteed.
Each sticker is sold by longest side (horizontal or vertical). So, if the sticker design is taller than it is wider, you pick how tall it is. Or, if the sticker is wider than it is taller you pick how wide you want it. If you want exact dimensions, please contact us.
Save more when you buy more. Pick any assortment of available sticker designs and/or sizes and save up to 50% OFF. All discounts are automatic! Just add more and save.


text:
Education is essential for every child, and it can start as early as preschool years
Displaying 1 - 10 of 14 Results
Nearby Pre-Schools
Copy & paste following code to display the map of WATERWAY CASCADIA, 315A Punggol Way Singapore 821315 on any webpages.
Keep the code intact and maintain the text hyperlink back to our website. Free to use for commercial or personal website / project.
Choose a map size and copy the code to your webpage
MAP SIZE: 480 x 300
MAP SIZE: 560 x 350
MAP SIZE: 640 x 400


text:
My tea journey started in 2012, when a friend gifted me some loose leaf. I guess she thought I was drinking too much coffee. Blown away by the amazing flavours I immediately embraced the loose leaf tea. I still drink coffee, but my main choice of beverage is now tea.
My tea preferences are blacks, pu'erhs, oolongs and greens.