text:
Sheet Worker Scripts
From Roll20 Wiki
Page Updated: 2023-11-16 |
This is related to Editing(coding) Character Sheets, which require Pro info to be able to use.Main Page: Building Character Sheets |
Character Sheet Development
Getting Started
- Using Custom Sheets
- Building Sheets
(Main Page) - Glossary
- Code Restrictions
- Best Practice
- Common Mistakes
- Tutorials
- Examples, Templates
- Pattern Libraries
- HTML & storing data
- CSS & Styling
- Updates & Changelog
- Known Bugs
- Character Sheet Enhancement(CSE)
- Custom Roll Parsing
- Legacy Sheet(LCS)
- (upcoming) Beacon SDK
- Buttons
- Repeating Sections
- Sheetworkers
- Roll Templates
- sheet.json
- Translation
- Auto-Calc
- Advanced
- All SheetDev Pages
Tools & Tips
Sheet Worker Scripts(AKA simply as "sheetworkers"), are an advanced feature of the Character Sheets system, which are written in JavaScript(they are a type of Web Workers, hence the name). They will allow making automatic & complex changes to the character sheet stats, based on certain events, such as whenever a certain attribute's value on a character sheet is modified, or when an action button is pressed.
Sheetworker examples for Non-programmers, Sheet Worker Snippets and Universal Sheetworkers are the best starting points for practical and working examples on how to use sheetworkers.
This page gives a general overview of the available Roll20-specific features that can be used in sheetworkers, but is not a great guide for practical implementations. The pages/links found under the Related Pages and See Also-sections have links to more examples of how to use sheetworkers.
As sheetworkers are written in JavaScript, its a good idea to take some general guides and learn the basics of it to be able to understand & create sheetworkers.
Introduction to JavaScript - Mozilla Developer Network(MDN) web docs
- Few things that often come up in existing sheetworkers code, which isn't always covered that early in general JS tutorials & guides.
- Arrow functions - An alternative way to write functions in JavaScript. Used in many sheets.
- Template literals - string literals allowing embedded expressions:
`This is a ${word} example`
- Javascript:Best Practices - tips for both API & sheetworkers
JavaScript Restrictions
Many JavaScript functions or functionalities can't be used in Roll20 character sheets due to the security filter. One should check existing sheets for examples of what can be used, if you're attempting to do any slightly more advanced data-handling. Sheetworkers have access to the Underscore library.
- DOM can't be used directly in basically any way, so event listeners like
won't work. (Partial exception: CSS classes manipulated via jQuery) - All JavaScript must be inside a single
<script type="text/worker">
element in the HTML file. Otherwise some may fail to trigger or lead to uncertain behaviour - Only the Roll20-designed event listeners can trigger JS on the character sheet:
- stat change on a sheet, done either by the user, or another sheetworker
- stat change done by an API
- triggered by an Action Sheet Button
See Also BCS/Bugs#Sheetworkers.
Structure of a Sheetworker
Sheetworkers in Roll20 character sheets are pieces of JavaScript, intertwined with a few custom features made specifically for handling Roll20 character sheet information. All the sheetworkers in a character sheet are places inside a single <script type="text/worker">
Usually a sheetworker works as follows.
1. Listens for changes to the sheet with an Event Listener ("change:attributename
) (explained in next section)
2. Retrieves values of a number of attributes from the sheet with the getAttrs
function, usually including the attributes that were monitored.
3. Create some temporary variables and uses the values received from getAttrs
and does something based on the info using normal JavaScript.
4. Save to the character sheet some of the new values made in Step 3 to some number of attributes with the setAttrs
The following is an example of a single sheetworker placed in a <script type="text/worker">
-element, taken from the Sheetworker examples for Non-programmers-page.
<script type="text/worker"> on("change:siz change:con sheet:opened", function() { getAttrs(["siz","con"], function(values) { let siz = parseInt(values.siz)||0; let con = parseInt(values.con)||0; let hp = siz + con; setAttrs({ "hitpoints": hp }); }); }); </script>
<script type="text/worker">
In a character sheet, all sheetworkers are saved on the .html
-file for the sheet, inside a single HTML element named <script type="text/worker">
. This is critical for the sheetworkers to function in Roll20. If sheetworkers are split into more than one <script type="text/worker">
-element, it's almost guaranteed all of them will fail to function. Most Sheet Creator place the sheetworker-block at the bottom of the HTML-file.
Event listener
on("change:siz change:con sheet:opened", function()
is the Event listener, which checks the character sheet for changes to specific attributes, if the sheet have been opened, or if a button have been pressed. In the example, the sheetworker is checking if the siz
or con
-attribute have been changed, or if the sheet have been opened. These two represents the size and constitution of the character.
Value retrieval
getAttrs(["siz","con"], function(values)
looks up the values of the siz
or con
-attributes on the character sheet, so they can be used in the sheetworker.
Making changes
let siz = parseInt(values.siz)||0; let con = parseInt(values.con)||0; let hp = siz + con;
This is the main part of the sheetworker. It first defines two temporary varible, siz
and con
, that saves the values of their attributes in a way that JavaScript knows it's a number.
On the third row, it defines the hp
-varaible to be siz + con
, which means that the characters Hit Points are equal to the sum of their Size and Constitution.
Saving the changes
setAttrs({ "hitpoints": hp });
Finally, the sheetworker decides to define the character sheet's hitpoints
-attribute to be equal to the newly calculated hp
-variable, which is the last action of the sheetworker. Note that it does not make changes to the attributes it was listening to.
Other things
It's good practice to always use lower case when referencing attribute names in your sheet workers, regardless of how the attributes are defined in the HTML. This helps to avoid a number of issues.
Outside of this, there may exist some other things saved in the <script type="text/worker">
, such as:
- Saved list of information, used by the sheetworkers.
- Example:
const stats = ["strength", "intelligence", "charm", "arcana", "grace"];
- Example:
- the Event Listener might loop through some JavaScript, that decides what attributes to listen/change/save
- Example:
stats.forEach(stat => { some code });
- Example:
- Define JavaScript functions to be used in the sheetworkers, instead of repeating the same code snippets in several places.
Adding a Sheetworker
To add a sheetworker to a Character Sheet, simply add the script to the bottom of your HTML
-section of the sheet using the following format:
<script type="text/worker"> on("change:strength", function() { }); // ... etc </script>
The <script>
-element must have a type of "text/worker"
to be properly handled by the system. When the game loads, all script tags are removed from the sheet's template for security purposes. However, <script>
-elements with a type of "text/worker"
will be used to spin up a background worker on each player's computer, that can respond to changing values in their sheets and take action as needed.
All sheetworker should be contained within a single <script type="text/worker">
element, and preferably be placed at the bottom of the html
Sheetworker examples for Non-programmers
Warning about "global" variable scope: the scope of a variable declared inside the <script type="text/worker">
but outside a function are currently per player, not per character. Changing its value will change it for all the characters of your player's session.
As a best practice Asynchronous cascades should be avoided whenever possible. It is generally a better practice to get all attributes needed for calculations in one getAttrs
rather than doing getAttrs
-> calculations -> setAttrs
-> getAttrs
-> calculations -> setAttrs
Understanding sheetworkers
(credit: Jakob)
Usually, the best way to learn something is to do it! Start solving the problems you want to solve using sheet workers, and learn along the way :).
Now, that probably wasn't very helpful. I could also encourage you to look at code others have written, which you should do; just realize that many sheet authors are also amateurs (such as me), hence the code may not be the most elegantly-written example.
That probably also wasn't helpful. Let me try something else: depending on what your course taught you, much of it (everything dealing with manipulation of the DOM) is not going to be very helpful. Here's some important things you need to keep in mind that might make sheet workers different from what you've learned:
- 1. Sheet workers are event-driven. Everything interesting your workers do will happen in response to a certain event on the sheet; most of the time, the triggering event will be changing an attribute on the sheet (i.e., the value of some input, be it a checkbox, radio, text, number input, or textarea). This is what the
on("change:attr", function () { ...})
is there for: it's about registering a function that's supposed to be executed every time attr changes.
- 2. Sheet workers can only really do one thing. Sheet workers can change the value of attributes, and that's pretty much it (they can also remove repeating rows, but that's not their main use). If you want your sheet workers to do a thing, ask yourself if it can be accomplished by changing the value of an attribute (this includes being able to (un)check checkboxes), +perhaps some CSS. If yes, you can do it with sheet workers. If not, you cannot.
- 3. Sheet workers are asynchronous. The main interesting functions you have access to in sheet workers, namely getAttrs, setAttrs, and getSectionIDs, take as their second argument functions that do other stuff. This means that you cannot trust that your code will simply be executed from top to bottom, and have to write in such a way that it makes sense no matter when asynchronous functions are executed. This is often a source of confusion for people.
Good Practices
(credit: GiGs)
- I think it's a good idea (especially when still learning) to get into the habit of putting all the values you are using in variables at the top of the code. It makes writing the code a bit more laborious, but if you reuse values, or have long macros, it can make things clearer, and most importantly, you can then use console.log statements to check what their values are. (they will appear in the browser's dev console, which you can usually find by pressing F12).
- Another tip is its a good idea to just use a single setAttrs statement, at the end of the sheet worker. For this one which is just modifying a single attribute, it doesn't matter, but you'll eventually get into making workers that set multiple attributes. when that happens, you definitely want to group them into a single statement, to avoid unpredictable errors.
- Also its a good idea to use variable names that match the value they are calling. In the code below, for example,
renamed index tocurrenthp
, which I think is more descriptive.
- It's also a good idea to use lower case only for attribute names, and use underscores instead of dashes or other symbols in the name. For example, use
, and avoidstrength
- One final tip: if you are using
on cells that users can enter values into, it's a good idea to add a default value. For instanceparseInt('something')||0
means that if the cell contains text, or not a number, you'll get a number in the code. Your if statements will fail without this, if the cells being called don't actually have numbers in them.
Sheet Workers vs. Auto-Calculating Fields: Which should I use?
There's no hard-and-fast rule about this. Both of these tools are capable of achieving the same thing. Let's take a hypothetical use-case of a "Strength" attribute, which we want to use to keep a "Strength Mod" attribute updated. Here would be the differences between the two tools for this use case:
- The auto-calculating fields are all re-calculated every time a sheet is opened for the first time. The Sheet Worker fields, on the other hand, only recalculate when their dependent values change. This means that sheets utilizing the Sheet Worker option will be much, much faster for players to open and interact with.
- In addition, the Sheet Worker calculations run on a background process, meaning that there is no user interface lag created while the calculations are run. Disabled fields, on the other hand, run on the main process and as such can cause "lockups" or "stuttering" if there are large numbers of them being calculated at once (for example, if you have a very complicated sheet using thousands of disabled fields).
- The auto-calculating Strength Mod field would appear disabled to the player. A Strength Mod field that is updated by a Sheet Worker, on the other hand, would be modifiable after the calculation has run (although any value entered would be overwritten when the Strength value changes). So a Sheet Worker would better support homebrew rules since the player could simply modify the Mod value after Strength changes. On the other hand, the auto-calculating field would not allow such a change, so rules would be "enforced" more rigidly.
In general, our recommendation is that you use auto-calculating fields sparingly. Give yourself a budget of 500 to 1,000 auto-calculating fields at most. We recommend using the new Sheet Worker functionality for most calculations, especially calculations which only need to be performed rarely (for example, your Strength value (and therefore your Strength Mod) probably only changes at most once per session when the character levels up. There's no need to re-run the same calculation over and over again every time the sheet is opened.
Sheet Worker API
A list of sheetworker features accessible in Roll20. Not to be confused with the Roll20 API.
Note: All attribute names are lowercased in events. So even if you normally refer to an attribute as Strength , use change:strength in the event listener. |
eventInfo Object
Many of the events are passed an eventInfo
object that gives you additional detail about the circumstances of the event.
Property | Description |
The original attribute that triggered the event. It is the full name (including RowID if in a repeating section) of the attribute that originally triggered this event.
Note: The entire string will have been translated into lowercase and thus might not be suitable for being fed directly into |
The agent that triggered the event, either player or sheetworker
The original value of the attribute in an on:change event, before the attribute was changed.
The value to which the attribute in an on:change event has changed.
An object containing the values of all the attributes removed in a remove:repeating_groupname event.
When changing a value it is equal to the sourceAttribute , being the full name (including RowID if in a repeating section)
When removing a repeating row it contains the bound trigger name for the repeating section, including the |
Allows you to listen to the changes of specific attributes, or in the case of a repeating section any changes in the entire section. It's very straightforward:
on("change:strength change:strengthmod change:strengthotherthing", function(eventInfo) { //Do something here // eventInfo.previousValue is the original value of the attribute that triggered this event, before being changed. // eventInfo.newValue is the current value of the attribute that triggered this event, having been changed. }); on("change:repeating_spells:spellname", function(eventInfo) { //Do something here // eventInfo.sourceAttribute is the full name (including repeating ID) of the attribute // that originally triggered this event, // however the entire string will have been translated into lowercase and thus might not be // suitable for being fed directly // into getAttrs() or other uses without being devandalized first. }); on("change:repeating_spells", function(eventInfo) { //Would be triggered when any attribute in the repeating_spells section is changed // eventInfo.sourceAttribute is the full name (lowercased)(including repeating ID) // of the attribute that originally triggered this event. });
For attributes in repeating fields, all of the following would be triggered when the repeating_spells_SpellName
attribute is updated:
This gives you maximum flexibility in choosing what "level" of change event you want to bind your function to.
Note: This supports the _max suffix in that ether change:strength or change:strength_max will fire an event, however these two variations seem to be interchangeable, in that ether or both will fire when ether strength or strength_max changes. |
Sheetworkers can also listen for a change event of a special attribute that is modified whenever a repeating section is re-ordered.
on("change:_reporder:<sectionname>", function(eventInfo) { // Where <sectionname> above should be a repeating section name, such as skills or spells });
This is an event which will fire whenever a row is deleted from a repeating field section. You can also listen for a specific row to be deleted if you know its ID, such as on(remove:repeating_inventory:-ABC123
on("remove:repeating_inventory", function(eventInfo) { //Fired whenever a row is removed from repeating_inventory // eventInfo.sourceAttribute is the full name (including ID) of the first attribute that triggered the event (you can use this to determined the ID of the row that was deleted) });
The removed:repeating_<groupname>
function's eventinfo
includes a special property removedInfo
, that displays all of the attributes of the now removed repeating section.
on("remove:repeating_inventory", function(eventinfo) { console.log(eventinfo.removedInfo); });
This event will fire every time a sheet is opened by a player in a game session. It should be useful for doing things like checking for needed sheet upgrades.
on('sheet:opened',function(){ // Do something the first time the sheet is opened by a player in a session });
This event will trigger when an action button is clicked. The button's name will need to start with act_
. Example:
<button type="action" name="act_activate">Activate!</button> <script type="text/worker"> on("clicked:activate", function() { console.log("Activate button clicked"); }); </script>
Only relevant if you're working on Compendium Integration.
Can be used to set Default Token info for characters drag&dropped from the compendium to your game.
getAttrs(attributeNameArray, callback)
The getAttrs
function allows you to get the values of a set of attributes from the sheet. The _max
suffix is supported, so getAttrs( ["Strength", "Strength_max"], func)
will get both the current and max values of Strength
. Note that the function is asynchronous, which means that there is no guarantee that the order in which multiple getAttrs
calls are made is the order in which the results will be returned. Rather, you pass a callback function which will be executed when the values have been calculated. The callback function receives a simple JavaScript object with a list of key-value pairs, one for each attribute that you requested.
on("change:strength", function() { getAttrs(["Strength", "Level"], function(values) { //Do something with values.Strength and/or values[ "Level" ] }); });
Values in Repeating Sections require a little special handling. If the event that you are inside of is already inside of a repeating section, you can simply request the variable using its name prefaced by the repeating group name and you will receive the value in the same repeating section the event was triggered in. For example, if we have a repeating_spells
section that has both SpellName
, SpellLevel
, and SpellDamage
, then:
on("change:repeating_spells:spelllevel", function() { getAttrs([ "repeating_spells_SpellDamage", "repeating_spells_SpellName" ], function(values) { //values.repeating_spells_SpellDamage and values.repeating_spells_SpellName //will both be from the same repeating section row that the SpellLevel that changed is in. }); });
On the other hand, if you aren't currently in a repeating section, you can specifically request that value of a field in a repeating section row by specifying its ID manually:
You can also request the _reporder_repeating_<sectionname>
attribute with getAttrs()
to get a list of all the IDs in the section that have been ordered. However note that this may not include the full listing of all IDs in a section. Any IDs not in the list that are in the section are assumed to come after the ordered IDs in lexographic order.
values -- This is an object whose properties are the names of attributes (without the attr_ prefix) and whose values are what you want to set that attribute to.
options -- (Optional) This is an object that specifies optional behavior for the function. Currently the only option is "silent", which prevents propagation of change events from setting the supplied attributes.
callback -- (Optional) This is a callback function which will be executed when the set attributes have been updated.
The setAttrs function allows you to set the attributes of the character sheet. Use the _max
-suffix to set the max value of an attribute. For example Strength_max
on("change:strength", function() { getAttrs(["Strength", "Level"], function(values) { setAttrs({ StrengthMod: Math.floor(values.Strength / 2) }); }); });
Note: If you are trying to update a disabled input field with this method you may run into trouble. One option is to use this setAttrs
method to set a hidden input, then set the disabled input to the hidden element. In this example we have an attribute named will
, and we want to calculate judgement
based off 1/2 of the will
stat, but not to allow it to exceed 90. See below.
<label>Judgment</label> <input type="hidden" name="attr_foo_judgment" value="0" /> <input type="number" name="attr_judgment" value="@{foo_judgment}" disabled="true" title="1/2 of will rounded down, 90 max" />
on("change:will", function() { getAttrs(["will"], function(values) { setAttrs({ foo_judgment: Math.min(90, (values.will/2)) }); }); });
Although setAttrs
is an asynchronous function and there is no guarantee to which order the actual attributes will be set for multiple setAttrs()
For repeating sections, you have the option of using the simple variable name if the original event is in a repeating section, or you can specify the full repeating section variable name including ID in any event.
on("change:repeating_spells:spelllevel", function() { getAttrs(["repeating_spells_SpellLevel", "repeating_spells_SpellName"], function(values) { setAttrs({ repeating_spells_SpellDamage: Math.floor(values.repeating_spells_SpellLevel / 2) + 10 }); }); });
This function allows you to get a list of the IDs which currently exist for a given repeating section. This is useful for calculating things such as inventory where there may be a variable number of rows.
on("change:repeating_inventory", function() { getSectionIDs("inventory", function(idarray) { for(var i=0; i < idarray.length; i++) { //Do something with the IDs } }); });
Note that you may use GetAttrs()
(described above) to request the _reporder_repeating_<sectionname>
attribute to get a list of all the IDs in the section that have been ordered. However note that this may not include the full listing of all IDs in a section. Any IDs not in the list that are in the section are assumed to come after the ordered IDs in lexographic order.
Which is to say that getSectionIDs()
will get all IDs - but not in the order that they are displayed to the user. getAttrs( _reporder_repeating_<sectionname>
, ... ) will return a list of all IDs that have been moved out of their normal lexographic order. You can use the following function as a replacement for getSectionIDs
to get the IDs in the order that they are displayed in instead.
var getSectionIDsOrdered = function (sectionName, callback) { 'use strict'; getAttrs([`_reporder_${sectionName}`], function (v) { getSectionIDs(sectionName, function (idArray) { let reporderArray = v[`_reporder_${sectionName}`] ? v[`_reporder_${sectionName}`].toLowerCase().split(',') : [], ids = [...new Set(reporderArray.filter(x => idArray.includes(x)).concat(idArray))]; callback(ids); }); }); };
A synchronous function which immediately returns a new random ID which you can use to create a new repeating section row. If you use setAttrs()
and pass in the ID of a repeating section row that doesn't exist, one will be created with that ID.
Here's an example you can use to create a new row in a repeating section:
var newrowid = generateRowID(); var newrowattrs = {}; newrowattrs["repeating_inventory_" + newrowid + "_weight"] = "testnewrow"; setAttrs(newrowattrs);
This function does not generate reliably unique row IDs, which may lead to unexpected behavior. For example, if you use generated IDs as keys in value
for use in setAttrs(value)
as intended, you may end up overwriting one or more existing entries and thus expected repeating section items will never be rendered. Here's an example you can use to work around this issue:
var newweightid = "repeating_inventory_" + generateRowID() + "_weight"; while (newweightid in newrowattrs) { newweightid = "repeating_inventory_" + generateRowID() + "_weight"; } newrowattrs[newweightid] = "testnewrow";
removeRepeatingRow( RowID )
A synchronous function which will immediately remove all the attributes associated with a given RowID and then remove the row from the character sheet. The RowID should be of the format repeating_<sectionname>_<rowid>
. For example, repeating_skills_-KbjuRmBRiJNeAJBJeh2
Here is an example of clearing out a summary list when the original list changes:
on("change:repeating_inventory", function() { getSectionIDs("repeating_inventorysummary", function(idarray) { for(var i=0; i < idarray.length; i++) { removeRepeatingRow("repeating_inventorysummary_" + idarray[i]); } }); });
setSectionOrder(<Repeating Section Name>, <Section Array>, <Callback>)
setSectionOrder("proficiencies", final-array, callbackFunction);
The setSectionOrder function allow the ordering of repeating sections according to your preference. The function accepts the name of a repeating section **without** `repeating_` (e.g. `repeating_proficiencies` would be passed simply as `proficiencies`) and an array of row IDs in the order that you want them.
This function's behavior does not match its documentation. The function does not appear to have any callback functionality. Additionally, reordering sections via this function can cause significant graphical glitches and even some data corruption depending on what a user does in reaction to the graphic glitches.
A synchronous function which immediately returns the translation string related to the given key. If no key exists, false will be returned and a message in the console will be thrown which list the specific key that was not found in the translation JSON.
Here's an example you can use to fetch a translation string from the translation JSON: With the following translation JSON
{ "str": "Strength", "dex": "Dexterity" }
var strTranslation = getTranslationByKey('str'); // "Strength" var dexTranslation = getTranslationByKey('dex'); // "Dexterity" var intTranslation = getTranslationByKey('int'); // false
A synchronous function which immediately returns the 2-character language code for the user's selected language.
Here's an example you can use to fetch the translation language:
var translationLang = getTranslationLanguage(); // "en" , for an account using English
A function that allows the sheet author to determine what attributes are set on character dropped from the compendium. When setting the default token after a compendium drop, this function can set any attributes on the default token to tie in important attributes specific to that character sheet, such as attr_hit_points
The list of token attributes that can be set by setDefaultToken
["bar1_value","bar1_max","bar2_value","bar2_max","bar3_value","bar3_max","aura1_square","aura1_radius","aura1_color","aura2_square","aura2_radius","aura2_color", "tint_color","showname","showplayers_name","playersedit_name","showplayers_bar1","playersedit_bar1","showplayers_bar2","playersedit_bar2","showplayers_bar3", "playersedit_bar3","showplayers_aura1","playersedit_aura1","showplayers_aura2","playersedit_aura2","light_radius","light_dimradius","light_angle","light_otherplayers", "light_hassight","light_losangle","light_multiplier"]
For more information about this attributes and what they do, please see the the API Objects-page.
on("sheet:compendium-drop", function() { var default_attr = {}; default_attr["width"] = 70; default_attr["height"] = 70; default_attr["bar1_value"] = 10; default_attr["bar1_max"] = 15; setDefaultToken(default_attr); });
Custom Roll Parsing
Main Page: Custom Roll Parsing
As of July 13th, 2021, character sheets can now combine the functionality of roll buttons and action buttons to allow for roll parsing.
You essentially now have an action button that will perform dice rolls, with input from sheetworkers. CRP also requires changes to the Roll Template.
Currently there's you can only display computed values in the first 10 fields that are sent in the macro.
<button type="action" name="act_test">Click me</button> <rolltemplate class="sheet-rolltemplate-test"> <div class="sheet-template-container"> <h1>{{name}}</h1> <div class="sheet-results"> <h4>Result = {{roll1}}</h4> <h4>Custom Result = {{computed::roll1}}</h4> </div> </div> </rolltemplate> <script type="text/worker"> on('clicked:test', (info) => { startRoll("&{template:test} {{name=Test}} {{roll1=[[1d20]]}}", (results) => { const total = results.results.roll1.result const computed = total % 4; finishRoll( results.rollId, { roll1: computed } ); }); }); </script>
Main Page: jQuery
If your sheetworkers don't work, it's worthwhile to use console.log() and check the console returns with Web Developer Tools, to get better idea of what went wrong.
Also doing code validation
Related Pages
- Sheetworker
- List of All Sheetworker pages
- Sheetworker examples for Non-programmers
- Sheet Worker Snippets - short and practical examples of sheetworkers
- Universal Sheet Workers - How to create one function that can handle a bunch of similar sheet workers
- Javascript:Best Practices
- Building Character Sheets
- Auto-Calc
- CSS Wizardry - Contains multiple examples that makes use of sheetworkers.
- Action Button - how to use sheetworkers in combination with action buttons
- Andreas Guide to Sheet Development - general stuff on design & code best practice regarding sheets
- Sheet Author Tips
- Complete Guide to Macros & Rolls - guide to how the dice rolling & macro syntax works. Useful for creating more complicated rolls through sheetworkers
See Also
Various Roll20 Forum threads , github repositories, or other great external resources helping sheetworker creation.
- A Sheet Author's Journey(Part 3) - Repeating sections and writing sheetworkers!(Forum) Feb 2022
- Sheet Worker Optimization(Forum) by Scott C.
- Multiversal Sheetworker Generator(Forum) by GiGs
- How to integrate table of stats into a sheet(Forum) by GiGs
- getSetAttrs: an alternative API for getAttrs/SetAttrs(Forum) by Jakob
- TheAaronSheet - A facade for Sheet Worker Tasks and Utility Functions. Contains a great function for sheet troubleshooting/debugging
- sheet workers - Almost always outdated/lacking compared to any pages on sheet development on the wiki
General stuff about JavaScript:
- Introduction to JavaScript - Mozilla Developer Network(MDN) web docs
- JavaScript Best Practices
- Arrow functions - An alternative way to write functions in JavaScript. Used in many sheets.
- Template literals - string literals allowing embedded expressions:
`This is a ${word} example`
- console.log() - good for troubleshooting
- Conditional (ternary) operator
- Working with JSON - useful if you want to create an import function for your sheet.
- Object Oriented JS
- JavaScript Foreach: A Comprehensive Guide for Beginners - help with understanding
- Closure JavaScript Compiler Good for checking your sheetworkers for errors
- Firefox JavaScript Debugger


text:
The SnoWizard® Difference
In 1936, George Ortolano created a machine that produced a fine, fluffy shaven snow, similar to that made with blocks of ice and a hand-plane ice shaver. This invention of a simple but ingenious machine transformed blocks of ice used in the household icebox into mounds of delicate snow-like flakes.
Today, superior engineering, solid craftsmanship and uncompromising attention to detail stand out on every SnoWizard SnoBall Machine®. Precision welded stainless steel cabinet, perfectly machined aluminum castings and old-world craftsmanship result in a finely honed machine built to last a lifetime. So well, that not one single SnoWizard® machine has ever required service for any manufacturing defects in our 80 year history.
SnoWizard® invites you to look at all other imitation, look-alike block shavers and compare. Only then can you appreciate the SnoWizard® difference. We warrant that out machines will be free from defects in workmanship and materials and will repair or replace all defective parts, to include labor and return shipping charges, for the life of the machine, to the original purchaser. This is testament to our dedication and craftsmanship in manufacturing the world's finest ice shaver.
Read more about our Lifetime Warranty.
SnoWizard SnoBall Machine® specifications

subset: commoncrawl


text:
- How To Book
- Services
- Use us for
- Moving to
- Movers guide
- Insurance
- FAQs
- Blog
- Get in touch
- English
Shipping represents a considerable expense for millions of European businesses. But with the help of our European pallets & groupage network, we offer a range of services to meet those costs.
Groupage is one such service. By packing smaller loads into a single shipment, we're able to provide international removals that are more economical and environmentally sound. Groupage is a sensible option for smaller consignments that can't justify an entire truck to themselves. It'll allow larger loads to be split into smaller ones without any extra trucks having to leave the depot.
Effective groupage requires sophisticated coordination, of the sort that comes only with experience. We've refined our methods over the course of eight years, hauling goods across Europe. With a European pallets & groupage network of trusted partners at our disposal, we're able to orchestrate everything with precision. Shipments are guided to their destinations by routing through frictionless hubs.
Stackable pallets have been with us in their current form since the development of the forklift in the mid-20th century. They're finding increasing use in the consumer sector as well as their traditional business-to-business innovation.
The pallet has revolutionised storage and warehousing, allowing for even the heaviest items to be lifted vertically. With the aid of a dedicated forklift, or a tail-lift mounted to the rear of a truck. Whether looking to ship one pallet or five hundred, we're able to get them to wherever in Europe you need them moving too.
If you're shipping something especially valuable or fragile, we can provide a direct service that'll minimise handling and guard against the possibility of accidental damage. However simple or complex your shipping requirements, we have a service that can meet them. Furthermore, our experienced staff are always happy to help and advise to ensure the best outcome. Why not get in touch with our office, and see what our European removals service can do for you?


text:
We are working hard to help you return home.
Whether you are returning from the hospital, rehab center, or staying in a family member's home to recover, we have you covered.
About Next Day Access Wichita
- Next Day Access Rental Program
- Accessibility ramps to fit any entrance
- Durable, Code-Compliant Ramps & Lifts
- We move Fast!
- We keep client's safety in mind as our top priority.
- All ramps are built within ADA guidelines.
- Professional and caring staff
- Trained on-staff technicians
- Basic accessibility products can be installed Next Day!


text:
COSDOLL 18.5 in Full Body Platinum Silicone Doll W/Drink-Wet System Girl Baby 4.9lb. The latest model baby doll which can drink water normally.
Welcome to COSDOLL reborn baby doll kingdom!!!! We do not sell reborn dolls, we serve emotions!! COSDOLL focus on providing high quality real lifelike dolls to people all around the world, our realistic reborn dolls including premiee dolls, infant dolls, baby dolls, toddler dolls and doll accessories etc.
All of our doll artists have been worked in this field for more than 10 years. They endow love, warmth, companionship, happiness with us, we also want to deliver those priceless emotions to you and your beloved families. What COSDOLL created is not only a simple high qulity toy doll but also the guardian of the pure heart, the enabler of happy living. These babies are soft, smooth, squishy and can be bathed and powdered.Fantastic Gift for Your Beloved Partners/ Family/ Friends. Almost same weight (4.96lb) and height (18.5in) like real baby. Fine makeup on skin appliance, you can even see veins on his temple.
Brand:COSDOLL Material: Platinum Silicone Ecoflex Doll size: Size: 18.5 in (46 cm) Weight: 4.96 lb (2.25 kg) B/W/H: 10.62 in/10.23 in/11.41 in Feet Length: 8.26 in Arm Length: 7.08 in Shoulder Width: 4.72 in Head Circumference: 11.81 in Neck Circumference: 5.90 in Mouth-Type: Open EYES Type: Closed Eyelashes: YES Gender: Girl. Festival gifts, It is beautiful and so lifelike, Birthday gifts for lovers and babies. Play doll for babies and Grandma Accompany doll that will never let them feel alone.
Add to your Collection of Reborn Babys. For training of Maternity Matron, Nursery, mother-to-be.
You can practice how to hold and take a baby with it. Props for shooting TV or movie.Health workers for Alzheimer's, Autism & and many more with special needs with huge health calming benefits. Especially for those who like baby, you can find the special feeling of being a mother. Can accompany you in life. 1:The limbs of the doll cannot be separated. Because the baby doll is solid.
The material of the doll is platinum silicone, which makes the skin become more softness and feel real feeling touch. 2: Not intended for babies age under 6.
"Drink-wet":baby doll which can Drink-Wet system. 5: Please allow up to 0.4 to 0.5 inch errors gap in measurement. This listing is painted bald for sale, please pay attention to these information when you make an order to us. 7: The difference between our doll is that the silicone material has a longer service life and is not easily deformed. Picture baby clothes are shooting props, you need to dress up the baby yourself. This product is suitable for tools used by Bao's parents to practice taking care of future babies. It is suitable for creative writers to color the doll with dexterous hands and make exquisite crafts. Suitable for babies over six years old as a gift for babies. Together with your partner, accompany your baby to grow up. These babies open mouth, but can't take a pacifier, and Package contains a pacifier. But they are awesome silicone.Due to the different display and different light, the picture may not reflect the actual color of the item. If you are looking for a silicone for a baby, please message me for options. Platinum silicone babies are delicate and considered collectible art.
Q1: Is this reborn baby made of cloth or silicone? A1: This reborn baby is made of platinum liquid silicone, soft and weighty body for a "real" baby feeling. Will the paint come off if I put this baby in water? A2: Yes, it is hand drawn. But the paint did not peel off in normal temperature water Q3: Can this baby have a pacifier?
A3: Yes, can drink water version. Note: baby doll with Drink-Wet system, but baby doll mouth can't take(hold up) a pacifier. Silicone Doll Care Instructions 1: Please wash with clean water and dry before use. 3: Do not put the doll in the mouth. Please keep it out of reach of babies under 6 years old. 4: The product is integrally formed and does not need to be disassembled and assembled. 5: Product accessories: doll's clothes, feeding bottles and pacifiers are all used for dolls and cannot be used on real baby. 6: Please note again: these babies are not perfect, they do have small flaws and seams, but they are affordable and the best silicone dolls. When cleaning the doll, please use warm water below 80°. If cleaning the doll seems necessary, you can do it with a damp washcloth. Use it with a few drops of dish soap and wipe the body with it. Do it gently, so it doesn't damage the doll. Use a dry washcloth on the body when you're finished with the damp one. This will make sure that no moisture remains on the doll. And finally to get the outfits on the doll to make it more realistic. Avoid placing the doll direct sunlight as it may cause the colors to fade over time. For storage, use coll, shaded places so no moisture or other damaging-agents can reach it. WASHABLE BODY POWDER You can bathe the silicone doll just like taking care of a baby, and you can also apply talcum powder to the silicone doll and dress up in beautiful clothes to make the silicone doll more realistic and moving. If you feel that the doll is sticky and too shiny when you receive it, don't panic. You can take a bath and then put on talcum powder, and the problem will be solved! If you have service of free to sign, the Carrier probably leave your parcel on there. We stand behind every product we sell. If you are dissatisfied for any reason, please donot be quick to leave negative/neutral feedback. If you feel delighted with this transation, Pls give us all 5-stars. We strive for 5-star service by providing high-quality goods and perfect service.(Positive)feedback is simply what we seek for. This item is in the category "Dolls & Bears\Dolls, Clothing & Accessories\Dolls & Doll Playsets". The seller is "cosdollbabydolls" and is located in this country: US.
This item can be shipped worldwide.


text: Striking and familiar backyard bird throughout most of eastern North America; also occurs in the southwestern U.S. and fairly extensively in Mexico. Crest, large red bill, and long tail render this species distinctive even with a poor view. Male is entirely red with a black face. Female is brownish overall with redder wings and tail. Usually seen in pairs or small groups near dense cover, especially thickets near forest edges. Frequently visits bird feeders. Listen for high-pitched metallic chips and series of loud, sweet whistles.


text:
Dumbest Thing I Have Read Today
From the department of wishful thinking comes this:
The worst oil shock since the 1970s has put a permanent mark on the
American way of life that even a drop in oil's price below $100 a
barrel won't erase.Public transportation is in. Hummers are out. Frugality is in. Wastefulness is out....
As prices come falling back to earth, Americans aren't expected to
drop their newfound frugality. The jarring reality of $4-a-gallon
gasoline stirred up an unprecedented level of consumer angst that
experts say will keep people from reverting to extravagant energy use
for years to come - if ever again.High gas prices prompted calls to lower speed limits to 55 mph in some states and touched off a seemingly endless wave of "Go Green" campaigns.
"I see a permanent shift," said Kit Yarrow, a consumer psychologist
at San Francisco's Golden Gate University who has studied how high oil
prices have affected Americans' buying behavior. "Historically, when
gas prices come down, people use more. But we've learned a lot of new
things during this period and it will be hard to go back to our
gas-guzzling ways."
Really? I could have sworn people said that in 1972 and again in 1978. But the SUV and the Hummer were not even invented until after these oil shocks. He mentions the 55 mph speed limit, but we once had a national speed limit at 55 in the 1970s and we chucked it. What possible evidence does this guy have, particularly since the recent shock was not nearly as bad as 1972 or 1978. In fact, you can see that here in this graph of gas price pain:
And, we have not seen the absolute shortages and gas lines we saw in the 1970s. Usually these weird statements like this published by the AP are the start of some kind of broader political campaign. The only thing I can guess is that this is the front end of some leftish/Obama polical message that we need to keep slamming on government conservation directives and alt-energy subsidies even as prices fall.


text:
How do I view my favorite courses in the Card View Dashboard as an observer?
The Card View Dashboard displays course cards for all your favorite active courses. Course cards can help you organize your student's courses by adding a nickname or customizing the color, which is synced with the color shown for the course in the Calendar. Depending on your institution's preference, the Card View may be your default Dashboard.
The Card View Dashboard also includes the Dashboard sidebar, which displays a Coming Up feed and includes a link to the global Grades page.
You can change your Dashboard view at any time using the Dashboard Options icon.
Favorited courses are removed from the Card View Dashboard when the course is concluded. Concluded courses that were previously favorited are still shown as favorited in the Courses list.
View Course Cards
By default, active course cards are automatically added by Canvas and display up to 20 courses.
Dashboard courses are ordered alphabetically by course name; nicknames and course codes do not apply to course ordering.
Note: If you want to remove the default course card setting, you can customize the course list and manually select your favorite courses to display in the Dashboard. When you favorite at least one course, the Dashboard will only display favorited courses. Canvas will also continue to automatically favorite new published course enrollments.
View Student Dashboards
To filter your dashboard by student, click the Student drop-down menu [1], then click the student's name [2]. The dashboard view displays based on your student's dashboard view.
View Card Details
Course cards display an overview of course information including the course name, course code, term, and the student(s) you are observing in the course [1].
Each card can include up to four tabs [2], which represent the four main Canvas features for student course activity: Assignments, Announcements, Discussions, and Files. These tabs mimic visibility and order in Course Navigation, so for instance, if an instructor hides the Announcements link, the Announcements tab will not display on the course card.
An unread icon on the Discussions or Announcements tab indicates that there is a new discussion or announcement in the course [3]. The number in the icon indicates the number of new items.
Create Nickname
If one of your student's courses includes a long or confusing name, you can create a nickname for the course. Most courses are created using Student Information Systems (SIS) that generate course names based on terms, departments, and section numbers, and courses with similar names may be hard to distinguish.
Course nicknames appear in the Dashboard, Course Navigation Menu, course breadcrumbs, and notification emails.
A course nickname does not affect the course name at the account or course level; it only changes the name of the course for the individual user who created the nickname.
If you need to know the original name of the course, you can hover over the nickname and the original name will appear. Additionally, the course code is not affected and always displays on the course card for course reference.
- This feature does not currently apply to the global Grades page and Dashboard sidebar elements such as the Coming Up feed.
- Course nicknames are limited to 59 characters.
Manage Nickname
To add a nickname, click the Options icon [1], then type the name in the nickname field [2]. Click the Apply button [3].
To remove a nickname, open the card options and remove the nickname. The Nickname field will display the original name of the course.
Change Course Color
Course cards can help you organize courses by customizing the color, which is synced with the color shown for the course in the Calendar.
To change the color, click the card's Options icon [1], then select a new color. The check mark indicates the selected color [2], and the hex color code displays in the text field [3].
If you want to use a color not shown in the window, you can enter the color's hex code directly in in the text field. The hex field will display a warning icon if the hex code is not valid. Additionally, any variation of white is not accepted as a course color.
Click the Apply button [4].
Note: If you change the color for a course in the Calendar, the color also updates in the Dashboard.
Move Course Cards
You can also move a course card to another location in the Dashboard or remove a card from the Dashboard. Click the Options icon [1] and select the Move tab [2]. Depending on the placement of the existing card, you can move the card to the top of the Dashboard, ahead or behind a specific card, or to the bottom of the Dashboard [3].
Once a dashboard card has been reordered, new courses added to the Dashboard always display at the end of all existing courses.
To remove the course card from the Dashboard, click the Unfavorite option [4].
Note: The Unfavorite option only displays if you previously selected favorite courses.
Drag and Drop Course Cards
You can also manually drag and drop a course card to another location in the Dashboard. Click a course card and drag it to the desired location.
View Color Overlay
Some courses may include an image for the course behind the course color [1]. By default, course cards with an image include a color overlay. To remove the color overlay from all course cards that contain an image, click the Options icon [2] and then deselect the Color Overlay option [3].
Remove Color Overlay
When the color overlay is removed, the course color will display as a circle behind the card's Options icon.


text:
Information Possibly Outdated
The information presented on this page was originally released on October 18, 2019. It may not be outdated, but please search our site for more current information. If you plan to quote or reference this information in a publication, please check with the Extension specialist or author before proceeding.
Reduced acreage, shaky start challenged soybeans
STARKVILLE, Miss. -- Producers are tracing the mixed results they see from the 2019 Mississippi soybean harvest back to early struggles getting the crop started.
Trent Irby, Mississippi State University Extension Service soybean specialist, said there were extreme environmental challenges for all crops this year. Wet weather and flooding delayed planting in many areas, forced replanting of many soybean acres and put the crop behind schedule.
MSU Extension agricultural economist Will Maples explains why the 2019 soybean harvest is down from recent years.
"There's a large window in which you can successfully plant soybeans and they'll have sufficient time to develop and mature," Irby said. "However, it's well documented that, as the planting date delays beyond late April, which is the prime planting time, yield potential declines."
Mississippi soybean fields are estimated to yield 51 bushels an acre in 2019. This yield is below the record-setting pace set over the last two years. The state hit an average high of 54.5 bushels per acre in 2018.
Irby said very few soybean acres looked good early in the season.
"The earliest planted acres went through the worst conditions," Irby said. "There was major river flooding in the south Delta, and in many other places, fields were repeatedly flooded by heavy rains and had to be replanted."
Even with the early-season challenges, timely rains and mostly ideal weather in July allowed the crop to make up some lost ground.
"As harvest nears completion, it is evident that the hot, dry conditions the crop experienced late in the season impacted yield," Irby said. "There were no significant challenges this year from insects or disease pressure."
The U.S. Department of Agriculture estimated the state's soybean crop was 75% harvested by Oct. 13, 2019, a pace on track with recent harvest rates.
Although the resilient crop has produced average yields similar to those of recent years, soybean's value to the state will be down significantly this year because of tremendously reduced acreage.
Mississippi growers will harvest an estimated 1.6 million acres, down about 26% from the 2.2 million acres harvested in 2018. This year was the first time that state growers planted fewer than 2 million acres since 2012, when they planted 1.9 million acres.
Although flooding kept some acres out of soybean production, Will Maples, Extension agricultural economist, said reduced acreage is also a symptom of market prices this spring when planting decisions were being made.
"Market prices were more favorable for corn and cotton rather than soybeans at that time," Maples said.
Ongoing trade disputes have driven soybean prices this year, and the direction has mostly been downward.
"Cash bids for soybeans are around $9 per bushel," Maples said. "This is better than where we were this time last year when prices were around $7.60. We have seen some rebound in the soybean market this fall."


text:
Chasing Power
The Realm's Salvation
by Constance Phillips
Genre: Magical Realism/Fantasy Romance
This is the third book of a series, but it is a stand alone. It is not necessary to read the other books to enjoy this story.
For Keiran Saysin, protecting the fairy population from humans is more than a job. It is passion and his duty to the realm. Since Eero's revolution failed—and the discovery of fairy power lying dormant in some of the human population, that job hasn't been easy. Now that his sister and her husband are welcoming a set of twins, old enemies have come out of hiding, hoping the children will a serve as a key to reclaiming what has been stripped from them.
Enter Annie Valentine, the genetic researcher Daniel's mother has employed. Keiran knows the smart thing to do is cast a spell and push the human away, but something about the way she stands toe to toe and eye to eye has him forgetting that getting involved with a human could cost him everything he values, including his power.
Book 1
Monique can control any human with a flirtatious smile and an attraction spell. Until she meets Daniel Elliot, the only human who's immune to both.
After her parents' death and an unwanted proposal, fairy Monique seeks refuge in the human world. Her brother has warned her of the dangers, but she believes hiding will be a breeze. She can control any human with a flirtatious smile and an attraction spell. Until she meets Daniel Elliot, the only human who's immune to both.
Can Monique's brother find her and bring her home before she falls victim to whoever is killing fairies on the human world?
Will the reason Daniel's fairyproof be too much for them to overcome?
Book 2
Council Courtship
When Tristan Ipsly becomes eligible to fill a vacated Council seat, he thinks his chances are non-existent. Especially since he is the sole member to a house the fell to the revolution and his contender Edwin Vettore is an elder from a house that adheres to Canon teachings.
If fairykind has a chance at survival, it will come on Tristan's wings of change. Or so Quinn Vettore believes. But voicing her support for Tristan will anger her grandfather, and he's the one man who can stand in the way of a courtship between Quinn and Tristan.
Will Edwin successfully keep both Quinn and the position out Tristan's grasp, or will the Council yield to change?


text:
"I'm not alone" – Thank you for sharing and supporting! Here's the winner of the dinner! Continue Reading... "Winner Of The Dinner!"
Tag: alex abraham
Sharing Is Caring – Win A Dinner With Dr. Motte
"I'm not alone" – I am very pleased to be part of this special fundraising campaign organized by Carsten Hahnefeld aka Chris CoK to support Foundation for Children with Tumors and… Continue Reading... "Sharing Is Caring – Win A Dinner With Dr. Motte"


text:
DETROIT (AP) — General Motors is recalling about 200,000 Saab and Saturn cars in the U.S. and Canada to replace the Takata driver's air bag inflators.
The move is part of a broader recall of about 5.4 million vehicles announced last month by U.S. safety regulators.
Takata inflators can explode with too much force in a crash and hurl metal shrapnel into drivers and passengers. At least 10 people have died worldwide and 139 have been hurt due to the problem.
The GM recall includes the Saab 9-3 from 2003 to 2011 and the Saab 9-5 from 2010 and 2011. Also included is the Saturn Astra from 2008 and 2009.
Dealers will replace the inflators. Owners will get letters notifying them of the recalls, but since parts aren't available yet, they'll have to wait for a second letter before taking cars to dealers.
GM has no plans to offer loaner cars to people who don't want to drive their vehicles, spokesman Tom Wilkinson said. The type of Takata inflators in the GM cars ruptured only in testing and not in the field, he said. "Our position is you can continue to drive the cars as normal" until repairs are made, he said.
The Saab models under recall were sold in other markets including Europe, while the Astra was sold as an Opel in Europe and elsewhere. Wilkinson said GM's global safety team is reviewing data on the inflators in other markets "and will respond appropriately."
GM sold the Saab brand in 2009 but kept responsibility for administering its recalls. The brand eventually went out of business.
The National Highway Traffic Safety Administration announced the latest round of Takata recalls on Jan. 22 after the death of a South Carolina man when an inflator ruptured on a 2006 Ford Ranger, and when testing showed four ruptures on a different type of Takata inflator.
The latest round of recalls covers vehicles made by GM, Ford, BMW, Volkswagen, Honda, Mazda, Mercedes-Benz and Daimler Trucks. They bring to about 24.4 million the number of vehicles under recall in the U.S. for Takata air bag problems, affecting 14 car and truck makers. It's already the largest automotive recall in U.S. history, and the government expects it to grow. Worldwide, about 50 million inflators are under recall.


text:
Please refer to my page about USAF's Project Blue Book for context information.
FOREWORD | Introduction, foreword |
CHAPTER ONE | Project Blue Book and the UFO Story, 1 |
CHAPTER TWO | The Era of Confusion Begins, 15 |
CHAPTER THREE | The Classics, 29 |
CHAPTER FOUR | Green Fireballs, Project Twinkle, Little Lights, and Grudge, 47 (This page) |
CHAPTER FIVE | The Dark Ages, 59 |
CHAPTER SIX | The Presses Roll-The Air Force Shrugs, 69 |
CHAPTER SEVEN | The Pentagon Rumbles, 82 |
CHAPTER EIGHT | The Lubbock Lights, Unabridged, 96 |
CHAPTER NINE | The New Project Grudge, 111 |
CHAPTER TEN | Project Blue Book and the Big Build-Up, 123 |
CHAPTER ELEVEN | The Big Flap, 139 |
CHAPTER TWELVE | The Washington Merry-Go-Round, 156 |
CHAPTER THIRTEEN | Hoax or Horror?, 173 |
CHAPTER FOURTEEN | Digesting the Data, 186 |
CHAPTER FIFTEEN | The Radiation Story, 199 |
CHAPTER SIXTEEN | The Hierarchy Ponders, 209 |
CHAPTER SEVENTEEN | What Are UFO's?, 226 |
At exactly midnight on September 18, 1954, my telephone rang. It was Jim Phalen, a friend of mine from the Long Beach Press-Telegram, and he had a "good flying saucer report," hot off the wires. He read it to me. The lead line was: "Thousands of people saw a huge fireball light up dark New Mexico skies tonight."
The story went on to tell about how a "blinding green" fireball the size of a full moon had silently streaked southeast across Colorado and northern New Mexico at eight forty that night. Thousands of people had seen the fireball. It had passed right over a crowded football stadium at Santa Fe, New Mexico, and people in Denver said it "turned night into day." The crew of a TWA airliner flying into Albuquerque from Amarillo, Texas, saw it. Every police and newspaper switchboard in the two state area was jammed with calls.
One of the calls was from a man inquiring if anything unusual had happened recently. When he was informed about the mysterious fireball he heaved an audible sigh of relief, "Thanks," he said, "I was afraid I'd gotten some bad bourbon." And he hung up.
Dr. Lincoln La Paz, world-famous authority on meteorites and head of the University of New Mexico's Institute of Meteoritics, apparently took the occurrence calmly. The wire story said he had told a reporter that he would plot its course, try to determine where it landed, and go out and try to find it. "But," he said, "I don't expect to find anything."
When Jim Phalen had read the rest of the report he asked, "What was it?"
"It sounds to me like the green fireballs are back," I answered.
"What the devil are green fireballs?"
What the devil are green fireballs? I'd like to know. So would a lot of other people.
The green fireballs streaked into UFO history late in November 1948, when people around Albuquerque, New Mexico, began to report seeing mysterious "green flares" at night. The first reports mentioned only a "green streak in the sky," low on the horizon. From the description the Air Force Intelligence people at Kirtland AFB in Albuquerque and the Project Sign people at ATIC wrote the objects off as flares. After all, thousands of GI's had probably been discharged with a duffel bag full of "liberated" Very pistols and flares.
But as days passed the reports got better. They seemed to indicate that the "flares" were getting larger and more people were reporting seeing them. It was doubtful if this "growth" was psychological because there had been no publicity - so the Air Force decided to reconsider the "flare" answer. They were in the process of doing this on the night of December 5, 1948, a memorable night in the green fireball chapter of UFO history.
At 9:27 P.M. on December 5, an Air Force C-47 transport was flying at 18,000 feet 10 miles east of Albuquerque. The pilot was a Captain Goede. Suddenly the crew, Captain Goede, his co-pilot, and his engineer were startled by a green ball of fire flashing across the sky ahead of them. It looked something like a huge meteor except that it was a bright green color and it didn't arch downward, as meteors usually do. The green- colored ball of fire had started low, from near the eastern slopes of the Sandia Mountains, arched upward a little, then seemed to level out. And it was too big for a meteor, at least it was larger than any meteor that anyone in the C-47 had ever seen before. After a hasty discussion the crew decided that they'd better tell somebody about it, especially since they had seen an identical object twenty-two minutes before near Las Vegas, New Mexico.
Captain Goede picked up his microphone and called the control tower at Kirtland AFB and reported what he and his crew had seen. The tower relayed the message to the local intelligence people.
A few minutes later the captain of Pioneer Airlines Flight 63 called Kirtland Tower. At 9:35 P.M. he had also seen a green ball of fire just east of Las Vegas, New Mexico. He was on his way to Albuquerque and would make a full report when he landed.
When he taxied his DC-3 up to the passenger ramp at Kirtland a few minutes later, several intelligence officers were waiting for him. He reported that at 9:35 P.M. he was on a westerly heading, approaching Las Vegas from the east, when he and his co-pilot saw what they first thought was a "shooting star." It was ahead and a little above them. But, the captain said, it took them only a split second to realize that whatever they saw was too low and had too flat a trajectory to be a meteor. As they watched, the object seemed to approach their airplane head on, changing color from orange red to green. As it became bigger and bigger, the captain said, he thought sure it was going to collide with them so he racked the DC-3 up in a tight turn. As the green ball of fire got abreast of them it began to fall toward the ground, getting dimmer and dimmer until it disappeared. Just before he swerved the DC-3, the fireball was as big, or bigger, than a full moon.
The intelligence officers asked a few more questions and went back to their office. More reports, which had been phoned in from all over northern New Mexico, were waiting for them. By morning a full-fledged investigation was under way.
No matter what these green fireballs were, the military was getting a little edgy. They might be common meteorites, psychologically enlarged flares, or true UFO's, but whatever they were they were playing around in one of the most sensitive security areas in the United States. Within 100 miles of Albuquerque were two installations that were the backbone of the atomic bomb program, Los Alamos and Sandia Base. Scattered throughout the countryside were other installations vital to the defense of the U.S.: radar stations, fighter interceptor bases, and the other mysterious areas that had been blocked off by high chain link fences.
Since the green fireballs bore some resemblance to meteors or meteorites, the Kirtland intelligence officers called in Dr. Lincoln La Paz.
Dr. La Paz said that he would be glad to help, so the officers explained the strange series of events to him. True, he said, the description of the fireballs did sound as if they might be meteorites - except for a few points. One way to be sure was to try to plot the flight path of the green fireballs the same way he had so successfully plotted the flight path of meteorites in the past. From this flight path he could determine where they would have hit the earth - if they were meteorites. They would search this area, and if they found parts of a meteorite they would have the answer to the green fireball riddle.
The fireball activity on the night of December 5 was made to order for plotting flight paths. The good reports of that night included carefully noted locations, the directions in which the green objects were seen, their heights above the horizon, and the times when they were observed. So early the next morning Dr. La Paz and a crew of intelligence officers were scouring northern New Mexico. They started out by talking to the people who had made reports but soon found out that dozens of other people had also seen the fireballs. By closely checking the time of the observations, they determined that eight separate fireballs had been seen. One was evidently more spectacular and was seen by the most people. Everyone in northern New Mexico had seen it going from west to east, so Dr. La Paz and his crew worked eastward across New Mexico to the west border of Texas, talking to dozens of people. After many sleepless hours they finally plotted where it should have struck the earth. They searched the area but found nothing. They went back over the area time and time again-nothing. As Dr. La Paz later told me, this was the first time that he seriously doubted the green fireballs were meteorites.
Within a few more days the fireballs were appearing almost nightly. The intelligence officers from Kirtland decided that maybe they could get a good look at one of them, so on the night of December 8 two officers took off in an airplane just before dark and began to cruise around north of Albuquerque. They had a carefully worked out plan where each man would observe certain details if they saw one of the green fireballs. At 6:33 P.M. they saw one. This is their report:
"At 6:33 P.M. while flying at an indicated altitude of 11,500 feet, a strange phenomenon was observed. Exact position of the aircraft at time of the observation was 20 miles east of the Las Vegas, N.M., radio range station. The aircraft was on a compass course of 90 degrees. Capt. (-) was pilot and I was acting as copilot. I first observed the object and a split second later the pilot saw it. It was 2,000 feet higher than the plane, and was approaching the plane at a rapid rate of speed from 30 degrees to the left of our course. The object was similar in appearance to a burning green flare, the kind that is commonly used in the Air Force. However, the light was much more intense and the object appeared considerably larger than a normal flare. The trajectory of the object, when first sighted, was almost flat and parallel to the earth. The phenomenon lasted about 2 seconds. At the end of this time the object seemed to begin to burn out and the trajectory then dropped off rapidly. The phenomenon was of such intensity as to be visible from the very moment it ignited."
Back at Wright-Patterson AFB, ATIC was getting a blow-by-blow account of the fireball activity but they were taking no direct part in the investigation. Their main interest was to review all incoming UFO reports and see if the green fireball reports were actually unique to the Albuquerque area. They were. Although a good many UFO reports were coming in from other parts of the U.S., none fit the description of the green fireballs.
All during December 1948 and January 1949 the green fireballs continued to invade the New Mexico skies. Everyone, including the intelligence officers at Kirtland AFB, Air Defense Command people, Dr. La Paz, and some of the most distinguished scientists at Los Alamos had seen at least one.
In mid February 1949 a conference was called at Los Alamos to determine what should be done to further pursue the investigation. The Air Force, Project Sign, the intelligence people at Kirtland, and other interested parties had done everything they could think of and still no answer.
Such notable scientists as Dr. Joseph Kaplan, a world-renowned authority on the physics of the upper atmosphere, Dr. Edward Teller, of H-bomb fame, and of course Dr. La Paz, attended, along with a lot of military brass and scientists from Los Alamos.
This was one conference where there was no need to discuss whether or not this special type of UFO, the green fireball, existed. Almost everyone at the meeting had seen one. The purpose of the conference was to decide whether the fireballs were natural or man-made and how to find out more about them.
As happens in any conference, opinions were divided. Some people thought the green fireballs were natural fireballs. The proponents of the natural meteor, or meteorite, theory presented facts that they had dug out of astronomical journals. Greenish colored meteors, although not common, had been observed on many occasions. The flat trajectory, which seemed to be so important in proving that the green fireballs were extraterrestrial, was also nothing new. When viewed from certain angles, a meteor can appear to have a flat trajectory. The reason that so many had been seen during December of 1948 and January of 1949 was that the weather had been unusually clear all over the Southwest during this period.
Dr. La Paz led the group who believed that the green fireballs were not meteors or meteorites. His argument was derived from the facts that he had gained after many days of research and working with Air Force intelligence teams. He stuck to the points that (1) the trajectory was too flat, (2) the color was too green, and (3) he couldn't locate any fragments even though he had found the spots where they should have hit the earth if they were meteorites.
People who were at that meeting have told me that Dr. La Paz's theory was very interesting and that each point was carefully considered. But evidently it wasn't conclusive enough because when the conference broke up, after two days, it was decided that the green fireballs were a natural phenomenon of some kind. It was recommended that this phase of the UFO investigation be given to the Air Force's Cambridge Research Laboratory, since it is the function of this group to study natural phenomena, and that Cambridge set up a project to attempt to photograph the green fireballs and measure their speed, altitude, and size.
In the late summer of 1949, Cambridge established Project Twinkle to solve the mystery. The project called for establishing three cinetheodolite stations near White Sands, New Mexico. A cinetheodolite is similar to a 35 mm. movie camera except when you take a photograph of an object you also get a photograph of three dials that show the time the photo was taken, the azimuth angle, and the elevation angle of the camera.
If two or more cameras photograph the same object, it is possible to obtain a very accurate measurement of the photographed object's altitude, speed, and size.
Project Twinkle was a bust. Absolutely nothing was photographed. Of the three cameras that were planned for the project, only one was available. This one camera was continually being moved from place to place. If several reports came from a certain area, the camera crew would load up their equipment and move to that area, always arriving too late. Any duck hunter can tell you that this is the wrong tactic; if you want to shoot any ducks pick a good place and stay put, let the ducks come to you.
The people trying to operate Project Twinkle were having financial and moral trouble. To do a good job they needed more and better equipment and more people, but Air Force budget cuts precluded this. Moral support was free but they didn't get this either.
When the Korean War started, Project Twinkle silently died, along with official interest in green fireballs.
When I organized Project Blue Book in the summer of 1951 I'd never heard of a green fireball. We had a few files marked "Los Alamos Conference," "Fireballs," "Project Twinkle," etc., but I didn't pay any attention to them.
Then one day I was at a meeting in Los Angeles with several other officers from ATIC, and was introduced to Dr. Joseph Kaplan. When he found we were from ATIC, his first question was, "What ever happened to the green fireballs?" None of us had ever heard of them, so he quickly gave us the story. He and I ended up discussing green fireballs. He mentioned Dr. La Paz and his opinion that the green fireballs might be man-made, and although he respected La Paz's professional ability, he just wasn't convinced. But he did strongly urge me to get in touch with Dr. La Paz and hear his side of the story.
When I returned to ATIC I spent several days digging into our collection of green fireball reports. All of these reports covered a period from early December 1948 to 1949. As far as Blue Book's files were concerned, there hadn't been a green fireball report for a year and a half.
I read over the report on Project Twinkle and the few notes we had on the Los Alamos Conference, and decided that the next time I went to Albuquerque I'd contact Dr. La Paz. I did go to Albuquerque several times but my visits were always short and I was always in a hurry so I didn't get to see him.
It was six or eight months later before the subject of green fireballs came up again. I was eating lunch with a group of people at the AEC's Los Alamos Laboratory when one of the group mentioned the mysterious kelly-green balls of fire. The strictly unofficial bull-session-type discussion that followed took up the entire lunch hour and several hours of the afternoon. It was an interesting discussion because these people, all scientists and technicians from the lab, had a few educated guesses as to what they might be. All of them had seen a green fireball, some of them had seen several.
One of the men, a private pilot, had encountered a fireball one night while he was flying his Navion north of Santa Fe and he had a vivid way of explaining what he'd seen. "Take a soft ball and paint it with some kind of fluorescent paint that will glow a bright green in the dark," I remember his saying, "then have someone take the ball out about 100 feet in front of you and about 10 feet above you. Have him throw the ball right at your face, as hard as he can throw it. That's what a green fireball looks like."
The speculation about what the green fireballs were ran through the usual spectrum of answers, a new type of natural phenomenon, a secret U.S. development, and psychologically enlarged meteors. When the possibility of the green fireballs' being associated with interplanetary vehicles came up, the whole group got serious. They had been doing a lot of thinking about this, they said, and they had a theory.
The green fireballs, they theorized, could be some type of unmanned test vehicle that was being projected into our atmosphere from a "spaceship" hovering several hundred miles above the earth. Two years ago I would have been amazed to hear a group of reputable scientists make such a startling statement. Now, however, I took it as a matter of course. I'd heard the same type of statement many times before from equally qualified groups.
Turn the tables, they said, suppose that we are going to try to go to a far planet. There would be three phases to the trip: out through the earth's atmosphere, through space, and the re-entry into the atmosphere of the planet we're planning to land on. The first two phases would admittedly present formidable problems, but the last phase, the re-entry phase, would be the most critical. Coming in from outer space, the craft would, for all practical purposes, be similar to a meteorite except that it would be powered and not free falling. You would have myriad problems associated with aerodynamic heating, high aerodynamic loadings, and very probably a host of other problems that no one can now conceive of. Certain of these problems could be partially solved by laboratory experimentation, but nothing can replace flight testing, and the results obtained by flight tests in our atmosphere would not be valid in another type of atmosphere. The most logical way to overcome this difficulty would be to build our interplanetary vehicle, go to the planet that we were interested in landing on, and hover several hundred miles up. From this altitude we could send instrumented test vehicles down to the planet. If we didn't want the inhabitants of the planet, if it were inhabited, to know what we were doing we could put destruction devices in the test vehicle, or arrange the test so that the test vehicles would just plain burn up at a certain point due to aerodynamic heating.
They continued, each man injecting his ideas.
Maybe the green fireballs are test vehicles - somebody else's. The regular UFO reports might be explained by the fact that the manned vehicles were venturing down to within 100,000 or 200,000 feet of the earth, or to the altitude at which atmosphere re-entry begins to get critical.
I had to go down to the airstrip to get a CARGO Airlines plane back to Albuquerque so I didn't have time to ask a lot of questions that came into my mind. I did get to make one comment. From the conversations, I assumed that these people didn't think the green fireballs were any kind of a natural phenomenon. Not exactly, they said, but so far the evidence that said they were a natural phenomenon was vastly outweighed by the evidence that said they weren't.
During the kidney jolting trip down the valley from Los Alamos to Albuquerque in one of the CARGO Airlines' Bonanzas, I decided that I'd stay over an extra day and talk to Dr. La Paz.
He knew every detail there was to know about the green fireballs. He confirmed my findings, that the genuine green fireballs were no longer being seen. He said that he'd received hundreds of reports, especially after he'd written several articles about the mysterious fireballs, but that all of the reported objects were just greenish colored, common, everyday meteors.
Dr. La Paz said that some people, including Dr. Joseph Kaplan and Dr. Edward Teller, thought that the green fireballs were natural meteors. He didn't think so, however, for several reasons. First the color was so much different. To illustrate his point, Dr. La Paz opened his desk drawer and took out a well worn chart of the color spectrum. He checked off two shades of green; one a pale, almost yellowish green and the other a much more distinct vivid green. He pointed to the bright green and told me that this was the color of the green fireballs. He'd taken this chart with him when he went out to talk to people who had seen the green fireballs and everyone had picked this one color. The pale green, he explained, was the color reported in the cases of documented green meteors.
Then there were other points of dissimilarity between a meteor and the green fireballs. The trajectory of the fireballs was too flat. Dr. La Paz explained that a meteor doesn't necessarily have to arch down across the sky, its trajectory can appear to be flat, but not as flat as that of the green fireballs. Then there was the size. Almost always such descriptive words as "terrifying," "as big as the moon," and "blinding" had been used to describe the fireballs. Meteors just aren't this big and bright.
No --- Dr. La Paz didn't think that they were meteors.
Dr. La Paz didn't believe that they were meteorites either.
A meteorite is accompanied by sound and shock waves that break windows and stampede cattle. Yet in every case of a green fireball sighting the observers reported that they did not hear any sound.
But the biggest mystery of all was the fact that no particles of a green fireball had ever been found. If they were meteorites, Dr. La Paz was positive that he would have found one. He'd missed very few times in the cases of known meteorites. He pulled a map out of his file to show me what he meant. It was a map that he had used to plot the spot where a meteorite had hit the earth. I believe it was in Kansas. The map had been prepared from information he had obtained from dozens of people who had seen the meteorite come flaming toward the earth. At each spot where an observer was standing he'd drawn in the observer's line of sight to the meteorite. From the dozens of observers he had obtained dozens of lines of sight. The lines all converged to give Dr. La Paz a plot of the meteorite's downward trajectory. Then he had been able to plot the spot where it had struck the earth. He and his crew went to the marked area, probed the ground with long steel poles, and found the meteorite.
Of all the successful expeditions in his file this was just one case that he showed me. He had records of many more similar expeditions.
Then he showed me some other maps. The plotted lines looked identical to the ones on the map I'd just seen. Dr. La Paz had used the same techniques on these plots and had marked an area where he wanted to search. He had searched the area many times but he had never found anything.
These were plots of the path of a green fireball.
When Dr. La Paz had finished, I had one last question, "What do you think they are?"
He weighed the question for a few seconds then he said that all he cared to say was that he didn't think that they were a natural phenomenon. He thought that maybe someday one would hit the earth and the mystery would be solved. He hoped that they were a natural phenomenon.
After my talk with Dr. La Paz I can well understand his apparent calmness on the night of September 18, 1954, when the newspaper reporter called him to find out if he planned to investigate this latest green fireball report. He was speaking from experience, not indifference, when he said, "But I don't expect to find anything."
If the green fireballs are back, I hope that Dr. La Paz gets an answer this time.
The story of the UFO now goes back to late January 1949, the time when the Air Force was in the midst of the green fireball mystery. In another part of the country another odd series of events was taking place. The center of activity was a highly secret area that can't be named, and the recipient of the UFO's, which were formations of little lights, was the U.S. Army.
The series of incidents started when military patrols who were protecting the area began to report seeing formations of lights flying through the night sky. At first the lights were reported every three or four nights, but inside of two weeks the frequency had stepped up. Before long they were a nightly occurrence. Some patrols reported that they had seen three or four formations in one night. The sightings weren't restricted to the men on patrol. One night, just at dusk, during retreat, the entire garrison watched a formation pass directly over the post parade ground.
As usual with UFO reports, the descriptions of the lights varied but the majority of the observers reported a V formation of three lights. As the formation moved through the sky, the lights changed in color from a bluish white to orange and back to bluish white. This color cycle took about two seconds. The lights usually travelled from west to east and made no sound. They didn't streak across the sky like a meteor, but they were "going faster than a jet." The lights were "a little bigger than the biggest star." Once in a while the GI's would get binoculars on them but they couldn't see any more details. The lights just looked bigger.
From the time of the first sighting, reports of the little lights were being sent to the Air Force through Army Intelligence channels. The reports were getting to ATIC, but the green fireball activity was taking top billing and no comments went back to the Army about their little lights. According to an Army G-2 major to whom I talked in the Pentagon, this silence was taken to mean that no action, other than sending in reports, was necessary on the part of the Army.
But after about two weeks of nightly sightings and no apparent action by the Air Force, the commander of the installation decided to take the initiative and set a trap. His staff worked out a plan in record time. Special UFO patrols would be sent out into the security area and they would be furnished with sighting equipment. This could be the equipment that they normally used for fire control. Each patrol would be sent to a specific location and would set up a command post. Operating out of the command post, at points where the sky could be observed, would be sighting teams. Each team had sighting equipment to measure the elevation and azimuth angle of the UFO. Four men were to be on each team, an instrument man, a timer, a recorder, and a radio operator. All the UFO patrols would be assigned special radio frequencies.
The operating procedure would be that when one sighting team spotted a UFO the radio operator would call out his team's location, the location of the UFO in the sky, and the direction it was going. All of the other teams from his patrol would thus know when to look for the UFO and begin to sight on it. While the radio man was reporting, the instrument man on the team would line up the UFO and begin to call out the angles of elevation and azimuth. The timer would call out the time; the recorder would write all of this down. The command post, upon hearing the report of the UFO, would call the next patrol and tell them. They too would try to pick it up.
Here was an excellent opportunity to get some concrete data on at least one type of UFO. It was something that should have been done from the start. Speeds, altitudes, and sizes that are estimated just by looking at a UFO are miserably inaccurate. But if you could accurately establish that some type of object was travelling 30,000 miles an hour, even 3,000 miles an hour - through our atmosphere, the UFO story would be the biggest story since the Creation.
The plan seemed foolproof and had the full support of every man who was to participate. For the first time in history every GI wanted to get on the patrols. The plan was quickly written up as a field order, approved, and mimeographed. Since the Air Force had the prime responsibility for the UFO investigation, it was decided that the plan should be quickly coordinated with the Air Force, so a copy was rushed to them. Time was critical because every group of nightly reports might be the last. Everything was ready to roll the minute the Air Force said "Go."
The Air Force didn't O.K. the plan. I don't know where the plan was killed, or who killed it, but it was killed. Its death caused two reactions.
Many people thought that the plan was killed so that too many people wouldn't find out the truth about UFO's. Others thought somebody was just plain stupid. Neither was true. The answer was simply that the official attitude toward UFO's had drastically changed in the past few months. They didn't exist, they couldn't exist. It was the belief at ATIC that the one last mystery, the green fireballs, had been solved a few days before at Los Alamos. The fireballs were meteors and Project Twinkle would prove it. Any further investigation by the Army would be a waste of time and effort.
This drastic change in official attitude is as difficult to explain as it was difficult for many people who knew what was going on inside Project Sign to believe. I use the words "official attitude" because at this time UFO's had become as controversial a subject as they are today. All through intelligence circles people had chosen sides and the two UFO factions that exist today were born.
On one side was the faction that still believed in flying saucers. These people, come hell or high water, were hanging on to their original ideas. Some thought that the UFO's were interplanetary spaceships. Others weren't quite as bold and just believed that a good deal more should be known about the UFO's before they were so completely written off. These people weren't a bunch of nuts or crackpots either. They ranged down through the ranks from generals and top grade civilians. On the outside their views were backed up by civilian scientists.
On the other side were those who didn't believe in flying saucers. At one time many of them had been believers. When the UFO reports were pouring in back in 1947 and 1948, they were just as sure that the UFO's were real as the people they were now scoffing at. But they had changed their minds. Some of them had changed their minds because they had seriously studied the UFO reports and just couldn't see any evidence that the UFO's were real. But many of them could see the "I don't believe" band wagon pulling out in front and just jumped on.
This change in the operating policy of the UFO project was so pronounced that I, like so many other people, wondered if there was a hidden reason for the change. Was it actually an attempt to go underground - to make the project more secretive? Was it an effort to cover up the fact that UFO's were proven to be interplanetary and that this should be withheld from the public at all cost to prevent a mass panic? The UFO files are full of references to the near mass panic of October 30, 1938, when Orson Welles presented his now famous "The War of the Worlds" broadcast.
This period of "mind changing" bothered me. Here were people deciding that there was nothing to this UFO business right at a time when the reports seemed to be getting better. From what I could see, if there was any mind changing to be done it should have been the other way, skeptics should have been changing to believers.
Maybe I was just playing the front man to a big cover-up. I didn't like it because if somebody up above me knew that UFOs were really spacecraft, I could make a big fool out of myself if the truth came out. I checked into this thoroughly. I spent a lot of time talking to people who had worked on Project Grudge.
The anti saucer faction was born because of an old psychological trait, people don't like to be losers. To be a loser makes one feel inferior and incompetent. On September 23, 1947, when the chief of ATIC sent a letter to the Commanding General of the Army Air Forces stating that UFO's were real, intelligence committed themselves. They had to prove it. They tried for a year and a half with no success. Officers on top began to get anxious and the press began to get anxious. They wanted an answer. Intelligence had tried one answer, the then Top Secret Estimate of the Situation that "proved" that UFO's were real, but it was kicked back. The people on the UFO project began to think maybe the brass didn't consider them too sharp so they tried a new hypothesis: UFO's don't exist. In no time they found that this was easier to prove and it got recognition. Before if an especially interesting UFO report came in and the Pentagon wanted an answer, all they'd get was an "It could be real but we can't prove it." Now such a request got a quick, snappy "It was a balloon," and feathers were stuck in caps from ATIC up to the Pentagon. Everybody felt fine.
In early 1949 the term "new look" was well known. The new look in women's fashions was the lower hemlines, in automobiles it was longer lines. In UFO circles the new look was cuss 'em.
The new look in UFO's was officially acknowledged on February 11, 1949, when an order was written that changed the name of the UFO project from Project Sign to Project Grudge. The order was supposedly written because the classified name, Project Sign, had been compromised. This was always my official answer to any questions about the name change. I'd go further and say that the names of the projects, first Sign, then Grudge, had no significance. This wasn't true, they did have significance, a lot of it.


text:
Black Widow Grossed More Than $60 Million on Disney+ Alone
Marvel is back atop the box office charts.
The studio reported that this weekend their first film in two years, Black Widow, had earned approximately $215 million worldwide. According to their estimates, the film grossed $80 million in U.S. theaters, $78 million overseas, and "over $60 million in Disney+ Premier Access." Black Widow costs $30 to watch at home, which would mean two million Disney+ subscribers watched the movie.
Those numbers come with some caveats. On the one hand, each $30 Premier Access could be watched by multiple people; as many family and friends as you could cram into a room to watch a television, or by as many people are share a single Disney+ account. If each one of those people had bought a $10 or $15 ticket, that would greatly exceed the revenue Black Widow generated through streaming. On the other hand, Disney keeps the vast majority of those $30 on Disney+. When someone buys a ticket to Black Widow at a movie theater, Disney gets only a percentage of the admission price; the rest is kept by the theater owner.
However you slice it, Black Widow's opening is the biggest in America since the start of the Covid pandemic, even before you factor in the Disney+ grosses. (The studio also touted in their press release that "the combined theatrical and Disney+ Premier Access opening makes Black Widow the only film to surpass $100M in domestic consumer spend on opening weekend since the start of the pandemic.") According to Disney, it's also the third biggest "Marvel Cinematic Universe origin story after Black Panther and Captain Marvel." I'm not sure Black Widow is actually an origin story, but whatever.
The biggest takeaway from all these numbers (assuming they're accurate) is that Disney+ did not cannibalize the theatrical ticket sales, and Marvel's Disney+ shows seemingly didn't cannibalize the Disney+ Premier Access fee either. Marvel was dormant for a while, but they've had either 30 or 60 minutes of new content on Disney+ almost every single week of 2021. People still went to the theater, or paid $30 extra on top of their monthly Disney+ subscription to watch Black Widow. If that doesn't prove the loyalty (and insatiable appetite) of the Marvel audience, nothing will.
Marvel's next film, Shang-Chi and the Legend of the Ten Rings, opens in theaters (but not on Disney+) on September 3, 2021.
Sign up for Disney+ here.


text:
2024 California Rules of Court
Rule 8.836. Agreed statement
(a) What is an agreed statement
An agreed statement is a summary of the trial court proceedings that is agreed to by the parties. If the parties have prepared an agreed statement or stipulated to prepare one, the appellant can elect under rule 8.831 to use an agreed statement as the record of the documents filed in the trial court, replacing the clerk's transcript, and as the record of the oral proceedings in the trial court, replacing the reporter's transcript.
(b) Contents of an agreed statement
(1) The agreed statement must explain the nature of the action, the basis of the appellate division's jurisdiction, and the rulings of the trial court relating to the points to be raised on appeal. The statement should recite only those facts that a party considers relevant to decide the appeal and must be signed by the parties.
(2) If the agreed statement replaces a clerk's transcript, the statement must be accompanied by copies of all items required by rule 8.832(a)(1), showing the dates required by rule 8.832(a)(2).
(3) The statement may be accompanied by copies of any document includable in the clerk's transcript under rule 8.832(a)(3).
(c) Time to file; extension of time
(1) If an appellant indicates on its notice designating the record under rule 8.831 that it elects to use an agreed statement under this rule, the appellant must file with the notice designating the record either the agreed statement or a stipulation that the parties are attempting to agree on a statement.
(2) If the appellant files a stipulation under (1), within 30 days after filing the notice of designation under rule 8.831, the appellant must either:
(A) File the statement if the parties were able to agree on the statement; or
(B) File both a notice stating that the parties were not able to agree on the statement and a new notice designating the record under rule 8.831. In the new notice designating the record, the appellant may not elect to use an agreed statement.
Rule 8.836 adopted effective January 1, 2009.