(out of ****)
_Pokémon:_The_First_Movie--Mewtwo_Strikes_Back_ (G) * 1/2
with _Pikachu:_The_Movie--Pikachu's_Vacation_ (G) *
The question when it comes to _Pokémon:_The_First_Movie--Mewtwo_Strikes_Back_, is not whether or not it's any good (and, let it be known from the get-go, that it isn't). The question is just how much money it will make in what surely be a huge opening weekend, for children across the country will undoubtedly make their parents take them to this theatrical spinoff of the popular animated TV series/trading card game. The film could simply be a _Pokémon_ screensaver projected onto the silver screen, and kids would want to go anyway, regardless of any objections parents--or anyone else--may have.
A _Pokémon_ screensaver is what the pre-feature short, _Pikachu:_The_Movie--Pikachu's_Vacation_, sometimes resembles. For the uninitiated, Pokémon are "pocket monsters," little animals kept in "Poké balls" and are pitted in battles against each other by their human trainers. The thin plot thread holding together the twenty minutes of _Pikachu's_Vacation_ has the most popular Pokémon, the adorable electrical-powered Pikachu, going to a retreat for Pokémon; the intent is to study the creatures' behavior while in "a state of complete relaxation." Relaxation--to the point of drowsiness--is likely to be felt by the adults in the audience during this "mini-movie," for nothing of interest to anyone over 10 happens. Pikachu and his fellow critters get into all sorts of competitions and petty conflicts before working together to get one out of a jam--literally: a Pokémon gets his head stuck into a pipe, and the others collectively try to pull him out. Every so often, as a new Pokémon is trotted out, the screen fills with its repeated image, not unlike a computer screensaver. The only difference is that I've seen screensavers that are better drawn and animated, not to mention more entertaining to watch.
The jaunty tone takes a surprising turn to the dark side once _Pikachu's_Vacation_ and _Mewtwo_Strikes_Back_ begins. The main feature opens with a scene that seems to be torn from a much more mature animé, with Mewtwo (voiced by Philip Bartlett), the most intelligent and powerful Pokémon, murderous rebelling against the scientists who created him. Even the narration is strangely pretentious; the first lines spoken are, "What is the meaning of life? That is the question that human and Pokémon alike have pondered for years."
But before long, it's familar Pokémon battle time as we meet our heroes Ash (Veronica Taylor), Misty (Rachel Lillis), and Brock (Eric Stuart); and their nemeses, Jessie (Lillis) and James (Stuart), a.k.a. Team Rocket. Ash, trainer to Pikachu and others, is invited to take part in a big Pokémon tournament taking place at a remote island. Little does he and his fellow invitees are walking into a trap set up by Mewtwo, who plans on proving his superior intelligence and strength as well as that of his troop of Pokémon super-clones. Naturally, this is just the first step of a world domination plot by Mewtwo, who hates Pokémon as much, if not more, than humans, for they allow themselves to be "enslaved."
Obviously, the makers of _Pokémon:_The_First_Movie_ are striving for something weightier than the daily cartoon show. It's an admirable ambition, to graft on a message while they have the kiddies' unfettered attention. What is questionable, however, is the choice of message. The tournament on Mewtwo's island becomes one huge free-for-all between the Pokémon and their super-clones, and the trainers look on in horror at the violent display. One character even says something to the effect of, "It's OK for them to battle, but NOT LIKE THIS!" Excuse me, but I fail to see any real difference between this battle and the ones the trainers routinely stage, except that in this case, everyone's going at it all at once. It goes without saying that everything resolves itself in the end, but what do our heroes learn? Nothing, apparently, for it's back to individual Pokémon battles as usual.
If _Pokémon:_The_First_Movie--Mewtwo_Strikes_Back_ had simply been a big screen version of the cartoon show, it would have been better than the overreaching, hypocritical mess that it is; why bother with a message if it goes against what the show is, and then not even follow through with it? Children obviously will miss the point, as best summed up by my 7-year-old nephew's reaction after the screening. While he said he liked the film, he complained, "There wasn't even a winner." Of course, one side lesson of the film is that winning doesn't matter, but you try explaining that to every child who walks into the theatre expecting, as the ads and commercials promise, "the Pokémon match of all time."
Michael Dequina<EMAIL_ADDRESS>|<EMAIL_ADDRESS>|<EMAIL_ADDRESS>|<EMAIL_ADDRESS>Mr. Brown's Movie Site: http://welcome.to/mrbrown CinemaReview Magazine: http://www.CinemaReview.com on ICQ: #25289934 | on AOL Instant Messenger: MrBrown23
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Sign In
Join Us
Username
enter username
Password
enter a valid password
✔
Keep me signed in
Sign in
Forgot Password
Create account


Trivia Game
What is the name of Jon's direwolf?
Ghost
Wilding
Hodor
Echo
Which of the following characters DEBUTS in season 1?
Stannis Baratheon
Ramsay Bolton
Beric Dondarrion
Roose Bolton
Which noble house is Catelyn Stark from?
Lannister
Baratheon
Bolton
Tully
Why could Jon leave the Night's Watch, since his vows were for life?
He died
The Watch made an exception
He fought his way out
He married the Queen
What is the name of Arya Stark's sword?
Valyria
Needle
Oathkeeper
Longclaw
What is the name of Robb Stark's wife?
Daenarys
Cersei
Tyene
Talisa
Which of the following is NOT one of Daenerys' dragons?
Viserion
Doryu
Rhaegal
Drogon
Which of the following Houses did NOT conspire against the Starks during the Red Wedding?
Frey
Bolton
Greyjoy
Lannister
In season 7, Jon Snow was elected to be the new:
Lord Commander of the Night's Watch
King in the North
Hand of the King
King Beyond the Wall
What is Ned Stark's relationship to Jon Snow, according to Bran Stark?
Best Friend
Father
Brother
Uncle
Which of the following is NOT one of Daenerys' allies?
The Unsullied
The Second Sons
The Brotherhood Without Banners
The Dothraki
Submit


--- title: "Lab Week 1" author: "Drew Tyre" date: "2016-08-20" type: "lab" weight: 222011 ---
The goal of this week’s lab is just getting your feet wet, learning how to use R. Like all labs, I expect you to submit an R Markdown file that I can compile to html. You should assume any data files are in a subdirectory called “data”. Your file should not echo the code used. Answer the numbered questions in text, referring to graphical and tabular output as needed. You may use base graphics or ggplot2, according to your preference.
Open RStudio and create a new project. I recommend creating a project for each week of class inside a folder called NRES222
or whatever else works for you.
If you haven’t previously, do
install.packages("tidyverse")
If R prompts you with a question about installing from source because of a newer version, answer n
for no.
Download the data from the link in Canvas, saving it into a subdirectory of your project called data
.
Create a new R Markdown file by clicking the button in the top left of RStudio with a +
on it. Save this file into your project directory with a filename yourlastname_week1.Rmd
. Your file pane should look something like this:
At the top of the file is some header information that you can leave as is for now.
On line 8 you will see a block of text with```
on the top and bottom:
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
This is a “code chunk”. Everything in between the ```
is treated as instructions to the computer. Everything outside the code chunk is rendered as regular text. Add a line to the code chunk to load the tidyverse
package we installed above.
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
```
You can delete everything from the end of that code chunk to the bottom of the file. Click the Knit button at the top. You should get a preview of an HTML file that just has the header information in it. An html file will also appear in the file pane next to the Rmd file.
data.frame
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
beetles <- read_csv("data/dobesh_bettles.csv")
```
Run that line of code (control / command - enter). You will likely get an error:
Error: 'data/dobesh_bettles.csv' does not exist in current working directory ('/Users/atyre2/Documents/NRES222/week_1').
Double check the spelling of the file name (I misspelled it), and if that is good, double check that you saved the file in the right place with the right name.
We want to make three figures. Two showing the average beetle diversity or average beetle abundance in the two habitats, and one showing how diversity changes with abundance. The third one is easier, so let’s start there. The TA will demonstrate building up the code below bit by bit explaining what each piece does. Start by inserting a new code chunk (use the insert button or control-alt-i (pc) or option-command-i (mac) )
```{r figure-diversity-vs-abundance}
ggplot(data=beetles,
mapping = aes(x = abundance, y = diversity, color=habitat)) +
geom_point() +
geom_smooth(method="lm", alpha = 0.4) +
labs(x = "Habitat Type",
y = "Mean abundance of beetles (95% CI)",
caption="Figure 2: Mean and 95% confidence limits of burying beetle abundance in two Nebraska habitats.") +
scale_color_discrete(name = "Habitat type",
labels = c("Dense cedar", "Grassland"))
```
From here on, I won’t show the code chunk information, just the code that goes in the code chunk. The label that comes after the r
is optional, but can help you figure out where things are going wrong.
Here are a few questions to answer with that graph. Remember to type your answers outside the code chunks. Start each answer with the number of the question.
Overall, what happens to species diversity (response variable) as abundance (predictor variable) increases?
Does the same thing happen within each habitat? Do both habitats have the same slope (rate of change) for the trendline?
In order to make a bar plot that compares mean abundance between the two habitats we first have to calculate the averages. We also want to use error bars, so we will need to calculate the standard errors of our means. Again, insert a code chunk, optionally give it a label, and then put the code inside the chunk. The TA will demonstrate the code line by line.
t1 <- group_by(beetles, habitat)
t2 <- summarize(t1,
mean_abundance = mean(abundance),
sd_abundance = sd(abundance),
n = n(),
se_abundance = sd_abundance / n)
# make a nice summary table
knitr::kable(t2, digits = 2, caption = "Table 1: Beetle Abundance by habitat type.")
Then make a figure. This code demonstrate a different way to fix axis labels that also allows you to add a caption.
ggplot(data = t2,
mapping = aes(x=habitat, y = mean_abundance)) +
geom_bar(stat="identity") +
geom_errorbar(mapping = aes(ymin = mean_abundance - 2*se_abundance,
ymax = mean_abundance + 2*se_abundance),
width = 0.2) +
labs(x = "Habitat Type",
y = "Mean abundance of beetles (95% CI)",
caption="Figure 2: Mean and 95% confidence limits of burying beetle abundance in two Nebraska habitats.")
# we don't need to do this again
#t1 <- group_by(beetles, habitat)
# reuse the t1 object
t3 <- summarize(t1,
mean_diversity = mean(diversity),
sd_diversity = sd(diversity),
n = n(),
se_diversity = sd_diversity / n)
# make a nice summary table
knitr::kable(t3, digits = 2, caption = "Table 2: Beetle Species richness by habitat type.")
Then make a figure. This code demonstrate a different way to fix axis labels that also allows you to add a caption.
ggplot(data = t3,
mapping = aes(x=habitat, y = mean_diversity)) +
geom_bar(stat="identity") +
geom_errorbar(mapping = aes(ymin = mean_diversity - 2*se_diversity,
ymax = mean_abundance + 2*se_diversity),
width = 0.2) +
labs(x = "Habitat Type",
y = "Species Richness of beetles (Mean and 95% CI)",
caption="Figure 3: Mean and 95% confidence limits of burying beetle species richness in two Nebraska habitats.")
In Canvas, you will submit your R markdown file. Be sure your last name is the first part of the filename, and that it says “week1” somewhere as well. Double check that it will work (necessary for full points) by clicking the “knit” button. If it produces an HTML file with all your figures and answers to the questions, you’re good!


you must add code that can work, like the javascript code in hello.html
can we stop emitting CO2?can we stop overfishing? then you came to the right place!


|
Occluded Library
0.1
A graphics library that sits on top of low level libraries such as OpenGL and DirectX.
|
| Coccluded::buffers::attributes::attribute | Stores metadata about a value or a set of values |
| ▼Coccluded::buffers::attribute_buffer | Provides contiguous storage for values associated with attributes |
| Coccluded::buffers::interleaved_attr_buffer | An attribute buffer subclass with interleaved data |
| Coccluded::buffers::segregated_attr_buffer | An attribute buffer subclass with segregated data |
| Coccluded::buffers::attribute_buffer_factory | |
| Coccluded::buffers::attributes::attribute_map | Defines an organization of attributes |
| ▼Coccluded::scene::objects::camera | An abstract class that contains all the methods other camera sub classes must implement |
| ▼Coccluded::opengl::retained::scene::objects::gl_retained_camera | An abstract OpenGL camera class which contains the necessary method that any retained camera will use |
| Coccluded::opengl::retained::scene::objects::gl_retained_fixed_camera | A camera with a fixed position and a fixed orientation |
| Coccluded::utilities::files::file_reader | A class that provides ways of reading files |
| Coccluded::opengl::retained::gl_attribute_buffer | A wrapper class for an OpenGL buffer |
| Cgl_retain | |
| Coccluded::opengl::retained::gl_retained_object_manager | |
| ▼Coccluded::meshes::mesh | An abstract class that provides an interface for all mesh classes |
| Coccluded::opengl::retained::gl_retained_mesh | A mesh implementation for OpenGL retained mode |
| Coccluded::scene::objects::model | An abstract class representing a model |
| Coccluded::opengl::retained::shaders::shader | A wrapper class for an OpenGL shader |
| Coccluded::opengl::retained::shaders::shader_attribute_map | Handles the mapping of attributes in an attribute map to those in a shader program |
| Coccluded::opengl::retained::shaders::shader_program | A wrapper class for an OpenGL GLSL shader program |
| Coccluded::opengl::retained::shaders::shader_uniform_store | Stores uniform values for a particular shader program |
| ▼Coccluded::scene::nodes::transformation | An abstract class for transformations within a scene |
| Coccluded::opengl::retained::scene::nodes::gl_retained_fixed_transformation |


SmartApp Monitor
Menu
Code Instrument
SmartThings IDE
User Information
ID:
logout
appList
app trace data
graph
provenance
realtime


Brendan
Tronconi
This is the personal portfolio site of Brendan Tronconi.
I make things for the web.
Codepen
Github
E-mail
MedLog Icon
← Back


The plucky heroine has just entered the Haunted House. She opens the door and walks slowly inside. Suddenly, the door slams shut. She turns around, gasping. She has just been tricked by the Ghost Butler. One has to wonder how these people would react to automatic doors. The chronically Genre Blind say, "It must have been the wind."
In yesteryear, this was a standard feature of horror films — to show just how spooky the Haunted House was. It was used to the point where you are more likely to see it parodied than used straight. If this trope is used straight, then not only do the doors close suddenly, but they cannot be opened, preventing the heroes from choosing to leave at that moment. Now it can be used in any situation where creepiness is needed, even if there are no ghosts.
This commonly occurs in video games, forcing a player to deal with a situation such as a Boss Battle or Descending Ceiling without running away. Expect The Hero to be surprised every time this happens, even if he's encountered ten Ghost Butlers already.
Examples:
- In the Donald Duck comics story "The Old Castle's Secret", in which the ducks are searching for treasure in a Haunted Castle, the "ghost of Sir Quackly" (who turns out not to be a ghost at all, but a thief using invisibility spray) does this to Donald's nephews, Uncle Scrooge and finally Donald himself, locking them all out on a battlement.
- Alfred Pennyworth becomes one after his death in Superman & Batman: Generations, up until he deals with the ghost of Dick Grayson tormenting a very old and frail Joker.
- The Egyptian tomb in Tintin, Cigars of the Pharaoh.
- In The Pagemaster, in one of his challenges Richard Tyler has to go into the mansion of Dr. Jekyll (and soon afterward, Mr. Hyde). When Richard enters, the door closes and locks itself behind him.
- In Spirited Away, lots of doors open or close this way under Haku or Yubaba's power, or maybe even their own — one door actually talks to Chihiro, telling her it is rude not to knock.
- In The Blues Brothers, when Jake and Elwood go to visit the Penguin in their old orphanage, the door to her office opens of itself as they approach. Of course, the only Ghost in play here would be the Holy one.
- Played with in The Ghost and Mr. Chicken, starring Don Knotts. When he tries to open the door himself, it's locked. As he turns away to absorb the eerie surroundings, the door mysteriously opens all by itself... Knotts gapes in horror for a second, then tries to proceed inside, only to have it slam shut again. Consumed by his nerves, Knotts chooses to walk away from the door, staring at it fixedly, wondering what he should do next, when suddenly a trap door opens up from beneath him.
- Ghostbusters II has a door shut and lock itself so Ray and Egon would be trapped in a room on fire.
- Disney's The Haunted Mansion:
- The same thing as in the theme park ride happens. Except for the fact that the ghost butler is literally just that; a deceased butler with the typical ectoplasmic presence and spooky abilities.
- The door of a crypt also closes just as the protagonists are trying to flee from a horde of undead. And then it gets covered with spiders, and it's up to the arachnophobic ten-year-old to open it again.
- Hellraiser: Inferno. When Joseph visits his parents at the hospital he somehow walks into his childhood bedroom, only for the door to magically shut itself behind him. He has to listen to his parents being tortured and murdered on the other side.
- Happens in A Nightmare on Elm Street series whenever someone enters Freddy's home.
- As per the Paranormal Activity 2 trailer "This is the freakiest thing that happened to me last night: This is the door closing by itself."
- In Trick 'r Treat, Sam appears to have one of these following him around. That, or he's telekinetic. Well, Sam (a.k.a. Samhain) IS the physical embodiment of Halloween, so he's bound to have plenty of tricks up his tiny, orange, candy-scarfing sleeve.
- In The Haunting (1963), doors shutting on their own might be a sign that Hill House is haunted, but it also has a rational explanation: the hallways are built at such an angle that gravity eventually causes the doors to swing shut. The real problem comes when a previously closed and locked door is suddenly opened.
- Inverted in Dragon Bones, Oreg, the house ghost, is a more benevolent example. He shows (or creates?) secret doors just when needed. (He could do the opposite, as he can make himself invisible, but is never seen actually doing so) It is also mentioned that the lady-in-waiting, whom he likes, always finds her knitting needles just where she looks first, even if she forgot them in a different room.
- A staple for The Addams Family or The Munsters.
- Subverted in Angel. Cordelia moves into a haunted apartment, and the ghost does the normal Ghost Butler thing... but then it turns out that Dennis the ghost isn't a really bad sort at all and he ends up actually being Cordelia's butler.
- Buffy the Vampire Slayer: Once the Scoobies enter the school to perform the exorcism, all the doors slam shut on them. Buffy later has to use her Super Strength to break open the door so they can escape The Swarm of wasps.
- Doctor Who:
- In "Rose", Rose is in the basement of the shop where she works when the door slams shut behind her. To her credit, she instantly runs to it instead of passing it off as the wind and carrying on.
- "Knock Knock", doors start slamming shut and shutters close over the windows once the dying starts in the episode's Haunted House. Not the work of ghosts, though, but of alien swarming insects.
- Inverted in the first episode of House of Anubis: When Nina arrives at the house for the first time, the door opens to let her in without her touching it.
- Sabrina the Teenage Witch: This happens to anyone who enters the closet, and a few times to people who enters the house when it is under a spell.
- Used at the beginning of a video for PBS's Square One TV, "Ghost of a Chance."
- In an episode of The Wild Wild West called "The Night of the Man-Eating House", this trope is employed several times throughout the episode (rather annoyingly). This isn't the work of a ghostly butler, however, but the house itself, which is embodied by the spirit of a dead woman. It turns out to be All Just a Dream anyway. Oh well.
- Played as an intentional homage to old horror movies in Michael Jackson's long-form video Ghosts: the Maestro's mansion works this way, closing and opening doors for the angry mob that's arrived there.
- Every game of Betrayal at House on the Hill begins with the doors of the house locking themselves behind the adventurers. Some scenarios require the heroes to figure out how to unlock them and escape.
- Dungeons & Dragons has a spell called unseen servant, which closes doors, windows, lights candles and can set tables, etc.
- In the various versions of Disney's The Haunted Mansion theme park ride, the entry to the ride vehicle automatically closes at the start of the ride and reopens at the end, and the narrator (who is a ghost) takes credit for both.
- Happens in the beginning of Alone in the Dark (1992) in the Derceto mansion.
- Occurs a few times in Amnesia: The Dark Descent, mostly towards the beginning of the game.
- All the bosses and minibosses in the Banjo-Kazooie series for the Nintendo 64 have the entrance/exits sealed somehow before the fight begins.
- DOOM (2016): "Demonic presence at unsafe levels. Lockdown in effect." Cue Multi-Mook Melee.
- In The Elder Scrolls: Arena, when you're in a dungeon with doors, they will always close behind you with a loud clanking, yet delayed a minute or two. Yes, it is somewhat creepy.
- Fallout 3's Dunwich Building has a few doors that open or close spontaneously.
- In Faria, doors in the towers will often slam shut as you pass through them, either to set you up for an Inescapable Ambush or just to enforce one-way movement.
- The type-in BASIC adventure game Haunted House (from Write Your Own Adventure Programs for Your Microcomputer) has the front door slam behind the player once they enter the house. There's no way to open it again, so the player has to find an alternative way out.
- Kingdom Hearts: Chain of Memories uses this trope, minus the corny turn and gasp. After entering Castle Oblivion, Goofy turns to shut the door before exploring, only to find that it's already been shut.
- Kirby 64: The Crystal Shards, when you fight minibosses. As an added touch, each barrier has a theme related to the environment (e.g. In the jungle, the exits become blocked by vines).
- The Legend of Zelda
- Whenever Link enters a room in a dungeon with a mini-boss or boss fight, the door often closes and locks itself behind him.
- Lampshaded in The Legend of Zelda: The Wind Waker. The first time Link climbs the tower, the door slams and locks and he is captured and thrown into the sea. The next time he's more cautious and waits for the door to lock. He gives a relieved sigh when it doesn't. Then after a little cutscene, the boss shows up and the door magically locks and the fight/deathcourse starts!
- In Lunar: Eternal Blue, the doors slam shut behind the party upon exiting any of the trial sections of the Haunted House.
- In Myst, every door, drawer, or other manipulable object immediately returns to its initial state as soon as you're not looking for it, heralded by an appropriate sound effect. This saved the creators from having to render multiple variations of each scene to account for their different configurations. The sequel, Riven, intentionally averts this, as the position of various doors is important to several puzzles.
- The Rhem games use a similar mechanic to the above. Most doors close automatically behind the player, but those that avert this usually have a clue on the other side, often requiring the player to close a door and circle around the level to see the clue from another angle.
- Ninja Gaiden Black does this during inescapable ambushes.
- In RuneScape, Draynor Manor's front door will automatically close itself when you walk in, and can't be opened from the inside, leaving the player stuck with a mad scientist, ghosts, a ghoul, and a vampire... until they manage to find the back door.
- Carl Denning finds the front door completely boarded up in The 11th Hour, and the door leading outside from the kitchen never works. Justified with the house being a Genius Loci.
- Super Mario Bros.: This happens in boss fights in various games.
- To Luigi, a few times, in Luigi's Mansion, since he is in a Haunted House.
- Happens in New Super Mario Bros. Wii when the characters enter a ghost house, fortress or castle. In the former, the doors not only slam shut but actually vanish in a flock of Boos if you try to come back out the door you came in.
- Every door in the haunted cathedral in Thief: The Dark Project will shut itself after a few moments if you leave it open.
- A nasty version happens in the NES game Uninvited. There's a prison with an opened cell door. Ignoring a brief warning from a ghost not to go in leads to it slamming shut behind you as soon as you enter. You starve to death, as there's no way out of the cell.
- A literal one is encountered in a room when you open a secret compartment holding a book you need. Contact with the ghost is of course lethal so you have to get him out of the way by scaring him with a spider.
- Which: The semi-last door in the game will close and lock behind you during the ending.
- Roughly half of all boss battles in World of Warcraft start like this, with a door or gate or giant membrane closing or an insurmountable wall of fire springing up. Of those that don't, some have no escape anyway, because the boss will follow any players that run or use attacks that have infinite range. Some bosses, though, will reset if all surviving players and/or whoever has aggro at the time run too far from where the fight started. There is no apparent rhyme or reason to this.
- You Have to Burn the Rope features a long corridor and a Boss Room at the end. When you enter the room, a wall appears at the end of the corridor.
- In Zork, the trap door that leads to the dungeon from the kitchen closes behind you after you entered. It is also barred.
- After Vivi, Arthur and Mystery enter the Haunted House in Mystery Skulls Animated the doors close behind them. In this case the entire house is just an extension or construct of the vengeful ghost within so presumably he closed the doors even though he was in the basement at the time.
- Chadam: When Chadam and Simkin go to explore the Pallid part of the city, they have to enter through a dark tunnel, and the door immediately slams behind them.
- Girl Genius: Not surprisingly, the entrance doors to Castle Heterodyne work this way... and probably only this way.
- Happens in Latchkey Kingdom when Willa is ambushed by rats in the chapter "Jinx", as it's a parody of The Legend of Zelda.
- Classic Disney Shorts
- Although the front door is knocked down off its hinges, this still happens to Mickey, Donald and Goofy in Lonesome Ghosts... except that the door is picked up from underneath them and then slammed up.
- Played straight in The Haunted House.
- In The Gorilla Mystery, it really is the wind... but Mickey freaks so badly that he initially runs away and hides.
- This is played straight in the Code Lyoko episode "New Order", when Odd, Ulrich and Yumi enter the Hermitage for the first time, searching for Aelita. XANA is already waiting for them, having sent a specter to play poltergeist, and starts with closing the front door. Later, the malevolent program locks up Yumi and Ulrich in a room which he turns into a Sauna of Death.
- In the House of Mouse cartoon "How to Haunt a House", this is shown to be a critical step. The cartoon features a (temporarily) deceased Goofy who pulls a Ghost Butler on a very Genre Blind Donald, who happily comments, "Oh! Automatic doors! How convenient!" To be fair, Goofy opened the door rather than close it, which is admittedly not as scary.
- Monster Buster Club's Halloween Episode, "Trick or Treat... or Alien", has a haunted house whose door close behind Danny, locking him inside, and then doing the same to the rest of the MBC. No ghost here, though, just the usual alien trying to scare away too-curious humans.
- Scooby-Doo and his friends have had their fair share of these.


First, create a separate modal controller.
Then, integrate the modal into your page.
In your controller:
In your template:


¶ WaitinRoomCopyright(c) 2016 Stefano Balietti MIT Licensed Waiting room. |
"use strict";
|
¶ Global scope |
module.exports = WaitingRoom;
var J = require('JSUS').JSUS;
var path = require('path');
var ngt = require('nodegame-game-template');
var PlayerList = require('nodegame-client').PlayerList;
var HostRoom = require('./HostRoom');
|
|
Inherit from HostRoom.
Same effect as |
WaitingRoom.prototype = Object.create(HostRoom.prototype);
WaitingRoom.prototype.constructor = WaitingRoom;
|
¶ WaitingRoom.sortingCallbacksPredefined callbacks to sort the list of players before dispatching |
WaitingRoom.sortingCallbacks = {
|
¶ timesNotSelectedGives priority to players which have been left out in previous dispatch |
timesNotSelected: function(a, b) {
if ((a.timesNotSelected || 0) < b.timesNotSelected) {
return -1;
}
else if ((a.timesNotSelected || 0) > b.timesNotSelected) {
return 1;
}
return 0;
}
};
|
¶ WaitingRoom.treatmentCallbacksNames of callbacks for assigning treatments to groups of players |
WaitingRoom.treatmentCallbacks = {
|
|
Keep treatment_ in front to minimize risk of collision with real treatment names. |
|
¶ treatment_rotateRotates across all treatments sequentially |
'treatment_rotate': true,
|
¶ randomSelects a random treatment (with re-sampling) |
'treatment_random': true
};
|
¶ WaitingRoom.dispatchStatesStates of the dispatching method
See
WaitingRoom.dispatch
|
WaitingRoom.dispatchStates = {
NONE: 'NONE',
INITING: 'INITING',
DISPATCHING: 'DISPATCHING',
NOTIFYING: 'NOTIFYING'
};
|
¶ WaitingRoom constructorCreates a new instance of WaitingRoom Params
config
object
Configuration object
See
HostRoom
|
function WaitingRoom(config) {
|
|
Supercall |
HostRoom.call(this, 'Waiting', config);
if (!this.logicPath) {
this.logicPath = ngt.resolve('waitroom/waitroom.js');
}
|
¶ WaitingRoom.roomOpenFlag indicating whether the room is open |
this.roomOpen = config.roomOpen || true;
|
¶ WaitingRoom.dispatchingNumeric flag indicating whether the room is dispatching a new game |
this.dispatching = 0;
|
¶ WaitingRoom.timeOutsArray of setTimeout return values indexed by playerIDs |
this.timeOuts = {};
|
¶ WaitingRoom.notifyTimeoutA timeout to notify players about updates in the number of players See
WaitingRoom.notifyPlayers
|
this.notifyTimeout = null;
|
¶ WaitingRoom.numberOfDispatchesNon-negative integer indicating the number of game dispatches |
this.numberOfDispatches = config.numberOfDispatches || 0;
|
¶ WaitingRoom.lastGameRoomReference to the last created game room |
this.lastGameRoom = null;
|
¶ WaitingRoom.GROUP_SIZEPositive non-zero integer indicating the size of each group |
this.GROUP_SIZE = null;
|
¶ WaitingRoom.POOL_SIZEPositive non-zero integer indicating number of clients for group forming |
this.POOL_SIZE = null;
|
¶ WaitingRoom.DISCONNECT_IF_NOT_SELECTEDBoolean or null, indicating whether unselected players are disconnected |
this.DISCONNECT_IF_NOT_SELECTED = null;
|
¶ WaitingRoom.timeOutsArray of setTimeout return values indexed by playerIDs |
this.N_GAMES = null;
|
¶ WaitingRoom.START_DATETime and date of game start Must be valid input for |
this.START_DATE = null;
|
¶ WaitingRoom.EXECUTION_MODEString indicating execution mode In the execution mode ´'TIMEOUT'´, one waits until the time is up, then it will be checked whether enough players are there to start the game. In the execution mode ´'WAIT_FOR_N_PLAYERS'´, the game starts right away if there are the desired number of players. Otherwise, when the time is up, it will be checked if there are at least a certain minimum number of players to start the game. |
this.EXECUTION_MODE = null;
|
¶ WaitingRoom.MAX_WAIT_TIMEPositive non-zero integer indicating max number of milliseconds to start Cannot be defined at the same time as |
this.MAX_WAIT_TIME = null;
|
¶ WaitingRoom.ON_TIMEOUTCallback to be executed client-side after waiting time has elapsed |
this.ON_TIMEOUT = null;
|
¶ WaitingRoom.ON_TIMEOUT_SERVERCallback to be executed after a timeout has expired |
this.ON_TIMEOUT_SERVER = null;
|
¶ WaitingRoom.ON_OPENCallback to be executed when the waiting room becomes open |
this.ON_OPEN = null;
|
¶ WaitingRoom.ON_CLOSECallback to be executed when the waiting room becomes close |
this.ON_CLOSE = null;
|
¶ WaitingRoom.ON_CONNECTCallback to be executed when a player connects |
this.ON_CONNECT = null;
|
¶ WaitingRoom.ON_DISCONNECTCallback to be executed when a player disconnects |
this.ON_DISCONNECT = null;
|
¶ WaitingRoom.ON_INITCallback to be executed after the settings have been parsed |
this.ON_INIT = null;
|
¶ WaitingRoom.ON_DISPATCHCallback to be executed just before starting dispatching Receives the options of the dispatch call as second param |
this.ON_DISPATCH = null;
|
¶ WaitingRoom.ON_DISPATCHEDCallback to be executed at the end of a dispatch call |
this.ON_DISPATCHED = null;
|
¶ WaitingRoom.ON_FAILED_DISPATCHCallback to be executed if a dispatch attempt failed |
this.ON_FAILED_DISPATCH = null;
|
¶ WaitingRoom.CHOSEN_TREATMENTString or undefined indicating chosen treatment |
this.CHOSEN_TREATMENT = null;
|
¶ WaitingRoom.PLAYER_SORTINGCallback to sort the list of players before dispatching If NULL, random sorting takes place. Default: 'timesNotSelected' |
this.PLAYER_SORTING = WaitingRoom.sortingCallbacks.timesNotSelected;
|
¶ WaitingRoom.PING_BEFORE_DISPATCHIf TRUE, all players are pinged before a dispatch (Default: TRUE) Non-responding clients are disconnected. If only one player is needed and mode is 'WAIT_FOR_N_PLAYERS', pinging is skipped. See
PING_MAX_REPLY_TIME
|
this.PING_BEFORE_DISPATCH = true;
|
¶ WaitingRoom.PING_MAX_REPLY_TIMEThe time to wait to receive a ping back Clients will be disconnected if they do not reply in time. See
PING_BEFORE_DISPATCH
|
this.PING_MAX_REPLY_TIME = 3000;
|
¶ WaitingRoom.PING_DISPATCH_ANYWAYIf TRUE, dispatch continues even if disconnections occur during PING See
PING_BEFORE_DISPATCH
See
PING_MAX_REPLY_TIME
|
this.PING_DISPATCH_ANYWAY = false;
|
¶ WaitingRoom.isPingInProgressFlag to indicate whether currently pinging for unresponsive players |
this.isPingInProgress = false;
|
¶ WaitingRoom.suspendedPingsFlag to indicate whether currently pinging for unresponsive players |
this.suspendedPings = [];
|
¶ WaitingRoom.closeAfterDispatchFlag that the waiting room will close after next dispatch Note: waiting room can dispatch multiple groups, and then will close |
this.closeAfterDispatch = false;
|
¶ WaitingRoom.NOTIFY_INTERVALThe number of milliseconds to wait before sending a player-update message See
WaitingRoom.notifyPlayerUpdate
|
this.NOTIFY_INTERVAL = 200;
}
|
¶ WaitingRoom.parseSettingsValidates settings and appends values to Params
settings
object
Configuration object
|
WaitingRoom.prototype.parseSettings = function(settings) {
var d, where, gameName;
gameName = this.channel.gameInfo.info.name + ' ';
where = gameName + 'WaitingRoom.parseSettings: ';
if ('object' !== typeof settings) {
throw new TypeError(where + 'settings must be object. Found: ' +
settings);
}
if ('number' === typeof settings.GROUP_SIZE) {
checkPositiveInteger(settings, 'GROUP_SIZE', where);
this.GROUP_SIZE = settings.GROUP_SIZE;
}
else {
throw new TypeError(where + 'GROUP_SIZE must be a positive number. ' +
'Found: ' + settings.GROUP_SIZE);
}
if ('undefined' !== typeof settings.POOL_SIZE) {
if ('number' === typeof settings.POOL_SIZE) {
checkPositiveInteger(settings, 'POOL_SIZE', where);
this.POOL_SIZE = settings.POOL_SIZE;
}
else {
throw new TypeError(where + 'POOL_SIZE must be a positive ' +
'number or undefined. Found: ' +
settings.POOL_SIZE);
}
}
else {
this.POOL_SIZE = settings.GROUP_SIZE;
}
if (this.POOL_SIZE < this.GROUP_SIZE) {
throw new TypeError(where + 'POOL_SIZE should be larger or equal ' +
'to GROUP_SIZE. Found: ' + this.POOL_SIZE + ', ' +
this.GROUP_SIZE);
}
if ('undefined' !== typeof settings.N_GAMES) {
if ('number' === typeof settings.POOL_SIZE) {
checkPositiveInteger(settings, 'N_GAMES', where);
this.N_GAMES = settings.N_GAMES;
}
else {
throw new TypeError(where + 'N_GAMES must be a positive number ' +
'or undefined. Found: ' + settings.N_GAMES);
}
}
if ('undefined' !== typeof settings.NOTIFY_INTERVAL) {
if ('number' === typeof settings.NOTIFY_INTERVAL) {
checkPositiveInteger(settings, 'NOTIFY_INTRVAL', where);
this.NOTIFY_INTERVAL = settings.NOTIFY_INTERVAL;
}
else {
throw new TypeError(where + 'NOTIFY_INTERVAL must be a positive ' +
'number or undefined. Found: ' +
settings.NOTIFY_INTERVAL);
}
}
if ('undefined' !== typeof settings.DISCONNECT_IF_NOT_SELECTED) {
if ('boolean' === typeof settings.DISCONNECT_IF_NOT_SELECTED) {
this.DISCONNECT_IF_NOT_SELECTED =
settings.DISCONNECT_IF_NOT_SELECTED;
}
else {
throw new TypeError(where + 'DISCONNECT_IF_NOT_SELECTED must ' +
'be boolean or undefined. Found: ' +
settings.DISCONNECT_IF_NOT_SELECTED );
}
}
if ('undefined' !== typeof settings.DISPATCH_TO_SAME_ROOM) {
if ('boolean' === typeof settings.DISPATCH_TO_SAME_ROOM) {
this.DISPATCH_TO_SAME_ROOM = settings.DISPATCH_TO_SAME_ROOM;
}
else {
throw new TypeError(where + 'DISPATCH_TO_SAME_ROOM must ' +
'be boolean or undefined. Found: ' +
settings.DISPATCH_TO_SAME_ROOM );
}
}
if ('string' !== typeof settings.EXECUTION_MODE) {
throw new TypeError(where + 'EXECUTION_MODE must be string. Found: ' +
settings.EXECUTION_MODE);
}
else {
if (settings.EXECUTION_MODE !== 'TIMEOUT' &&
settings.EXECUTION_MODE !== 'WAIT_FOR_N_PLAYERS') {
throw new Error(where + 'Invalid execution mode: ' +
settings.EXECUTION_MODE);
}
this.EXECUTION_MODE = settings.EXECUTION_MODE;
}
if ('undefined' !== typeof settings.START_DATE) {
if (this.EXECUTION_MODE === 'WAIT_FOR_N_PLAYERS') {
throw new Error(where + 'Execution mode ' + this.EXECUTION_MODE +
' cannot have a START_DATE');
}
d = new Date(settings.START_DATE);
if (isNaN(d.getTime())) {
throw new Error (where + 'START_DATE must be valid argument ' +
'for Date constructor. Found: ' +
settings.START_DATE);
}
if ('undefined' !== typeof settings.MAX_WAIT_TIME) {
throw new Error(where + 'Cannot define both MAX_WAIT_TIME and ' +
'START_DATE.');
}
this.START_DATE = settings.START_DATE;
}
else if ('undefined' !== typeof settings.MAX_WAIT_TIME) {
if ('number' === typeof settings.MAX_WAIT_TIME) {
checkPositiveInteger(settings, 'MAX_WAIT_TIME', where);
this.MAX_WAIT_TIME = settings.MAX_WAIT_TIME;
}
else {
throw new TypeError(where + 'MAX_WAIT_TIME must be ' +
'number or undefined. Found: ' +
settings.MAX_WAIT_TIME);
}
}
else {
if (this.EXECUTION_MODE === 'TIMEOUT') {
throw new Error(where + 'For EXECUTION_MODE="TIMEOUT" either ' +
'MAX_WAIT_TIME or START_DATE must be defined.');
}
}
assignIfFunction('ON_TIMEOUT', this, settings);
assignIfFunction('ON_TIMEOUT_SERVER', this, settings);
assignIfFunction('ON_OPEN', this, settings);
assignIfFunction('ON_CLOSE', this, settings);
assignIfFunction('ON_INIT', this, settings);
assignIfFunction('ON_CONNECT', this, settings);
assignIfFunction('ON_DISCONNECT', this, settings);
assignIfFunction('ON_DISPATCH', this, settings);
assignIfFunction('ON_DISPATCHED', this, settings);
assignIfFunction('ON_FAILED_DISPATCH', this, settings);
this.CHOSEN_TREATMENT = this.validateTreatment(settings.CHOSEN_TREATMENT,
where + ' CHOSEN_TREATMENT');
if ('undefined' !== typeof settings.PLAYER_SORTING) {
if ('string' === typeof settings.PLAYER_SORTING &&
!WaitingRoom.sortingCallbacks[settings.PLAYER_SORTING]) {
throw new TypeError(where + 'PLAYER_SORTING algorithm ' +
'not found: ' + settings.PLAYER_SORTING);
}
else if ('function' !== typeof settings.PLAYER_SORTING &&
null !== settings.PLAYER_SORTING) {
throw new TypeError(where + 'PLAYER_SORTING must be string, ' +
'function, null or undefined. Found: ' +
settings.PLAYER_SORTING);
}
this.PLAYER_SORTING = settings.PLAYER_SORTING;
}
if ('undefined' !== typeof settings.PLAYER_GROUPING) {
if ('function' !== typeof settings.PLAYER_GROUPING &&
null !== settings.PLAYER_GROUPING) {
throw new TypeError(where + 'PLAYER_GROUPING must be function, ' +
'null or undefined. Found: ' +
settings.PLAYER_GROUPING);
}
this.PLAYER_GROUPING = settings.PLAYER_GROUPING;
}
if ('undefined' !== typeof settings.PING_BEFORE_DISPATCH) {
if ('boolean' !== typeof settings.PING_BEFORE_DISPATCH) {
throw new TypeError(where + 'PING_BEFORE_DISPATCH must ' +
'be boolean or undefined. Found: ' +
settings.PING_BEFORE_DISPATCH);
}
this.PING_BEFORE_DISPATCH = settings.PING_BEFORE_DISPATCH;
}
if ('undefined' !== typeof settings.PING_MAX_REPLY_TIME) {
if ('number' === typeof settings.PING_MAX_REPLY_TIME) {
checkPositiveInteger(settings, 'PING_MAX_REPLY_TIME', where);
this.PING_MAX_REPLY_TIME = settings.PING_MAX_REPLY_TIME;
}
else {
throw new TypeError(where + 'PING_MAX_REPLY_TIME must be a ' +
'positive number or undefined. Found: ' +
settings.PING_MAX_REPLY_TIME);
}
}
if ('undefined' !== typeof settings.PING_DISPATCH_ANYWAY) {
if ('boolean' !== typeof settings.PING_DISPATCH_ANYWAY) {
throw new TypeError(where + 'PING_DISPATCH_ANYWAY must ' +
'be boolean or undefined. Found: ' +
settings.PING_DISPATCH_ANYWAY);
}
this.PING_DISPATCH_ANYWAY = settings.PING_DISPATCH_ANYWAY;
}
|
|
Executes ON_INIT, if found. |
if (this.ON_INIT) this.ON_INIT(this);
};
|
¶ WaitingRoom.validateTreatmentValidates if a treatment parameter is found amongst existing options The action taken in case of failing to validate and the return value
depend on the second parameter Params
Optional.
string
function
The name of the treatment
(undefined is a valid value).
doThrow
string
boolean
Optional. If truthy and the treatment
does not pass validation, an error will be thrown. If doThrow is a
string, it is used as the beginning of the sentence for
the error message. Default: 'WaitingRoom.validateTreatment: treatment'
Returns
string
boolean
The validated treatment name|function.
|
WaitingRoom.prototype.validateTreatment = function(treatment, doThrow) {
var t, err;
if ('undefined' !== typeof treatment) {
if (doThrow) {
if ('boolean' === typeof doThrow) {
doThrow = 'WaitingRoom.validateTreatment: treatment';
}
else if ('string' !== typeof doThrow) {
throw new TypeError('WaitingRoom.validateTreatment: doThrow ' +
'must be boolean, string or undefined. ' +
'Found: ' + doThrow);
}
}
if ('string' === typeof treatment) {
if (!WaitingRoom.treatmentCallbacks[treatment]) {
if (this.gameLevel) {
|
|
Treatments are not yet parsed. |
t = this.game.levels[this.gameLevel].settings.treatments;
}
else {
|
|
Treatments are already parsed at this point. |
t = this.game.settings;
}
if (!t[treatment]) err = ' not found: ' + treatment;
}
}
else if ('function' !== typeof treatment) {
err = 'must be string, function or ' +
'undefined. Found: ' + treatment;
}
}
if (doThrow) {
if (err) throw new Error(doThrow + err);
else return treatment
}
return !err;
};
|
¶ WaitingRoom.makeWidgetConfigCreates an object to configure the Returns
object
The configuration object
|
WaitingRoom.prototype.makeWidgetConfig = function() {
return {
groupSize: this.GROUP_SIZE,
poolSize: this.POOL_SIZE,
disconnectIfNotSelected: this.DISCONNECT_IF_NOT_SELECTED,
nGames: this.N_GAMES,
startDate: this.START_DATE,
executionMode: this.EXECUTION_MODE,
maxWaitTime: this.MAX_WAIT_TIME,
onTimeout: this.ON_TIMEOUT,
chosenTreatment: this.CHOSEN_TREATMENT
};
};
|
¶ WaitingRoom.isRoomOpenReturns flag indicating whether the Returns
boolean
Flag indicating whether
this is open
|
WaitingRoom.prototype.isRoomOpen = function() {
return this.roomOpen;
};
|
¶ WaitingRoom.closeRoomChanges state of Params
mod
string
Optional. Modifies the behavior of closeRoom.
Available options:
param
mixed
Optional. Parameter for modifier
|
WaitingRoom.prototype.closeRoom = function(mod, param) {
if (mod && mod !== 'now') {
if (mod === 'afterDispatch') {
this.closeAfterDispatch = true;
return;
}
else {
throw new Error('WaitingRoom.closeRoom: unknown modifier: ' + mod);
}
}
this.roomOpen = false;
if (this.ON_CLOSE) this.ON_CLOSE(this);
};
|
¶ WaitingRoom.openRoomChanges state of |
WaitingRoom.prototype.openRoom = function() {
this.roomOpen = true;
if (this.ON_OPEN) this.ON_OPEN(this);
};
|
¶ WaitingRoom.shouldDispatchMoreGamesChecks whether another game can be dispatched |
WaitingRoom.prototype.shouldDispatchMoreGames = function() {
if (!this.roomOpen) return false;
if (this.N_GAMES) return this.numberOfDispatches < this.N_GAMES;
|
|
TODO: Maybe check other conditions? |
return true;
};
|
¶ WaitingRoom.kickUnresponsivePlayersPings all players and kicks those who fail to respond Params
callback
function
Callback to be executed when pinging
is completed with WaitingRoom as context.
options
object
Options object. Accepted values:
|
WaitingRoom.prototype.kickUnresponsivePlayers = function(callback, options) {
var cb, that;
var i, timeToWaitForPing;
var timeout, pingReturnedCb, doCallback, totPingReturned;
var players, p, pList, pLen;
var where;
where = 'WaitingRoom.kickUnresponsivePlayers';
that = this;
if (this.isPingInProgress) {
console.log('Warning: Suspending call to ' + where +
' because kicking is still in progress.');
this.suspendedPings.push([callback, options]);
return;
}
|
|
Check parameters. |
if ('function' !== typeof callback) {
throw new TypeError(where + ': callback must be function. Found: ' +
callback);
}
options = options || {};
timeToWaitForPing = options.timeToWaitForPing || this.PING_MAX_REPLY_TIME;
if ('number' !== typeof timeToWaitForPing || timeToWaitForPing < 1) {
throw new TypeError(where + ': timeToWaitForPing must be ' +
'a positive number or undefined. Found: ' +
timeToWaitForPing);
}
if ('undefined' !== typeof options.doCallback) {
doCallback = !!options.doCallback;
}
else {
doCallback = this.PING_DISPATCH_ANYWAY;
}
|
|
Lock this function. |
this.isPingInProgress = true;
|
|
Setup variables for pinging all players. |
|
|
Manual copy of player list. |
players = this.clients.player.db;
pList = new PlayerList();
pLen = players.length;
|
|
Need to update pcounter because we use .insert below. |
pList.pcounter = pLen;
|
|
Create callback that will be executed if all players return from PING. |
cb = function() {
var pSize;
|
|
When done, unlock function. |
that.isPingInProgress = false;
pSize = pList.size();
|
|
Call the callback: if required so and at least one player is still connected, or if all players returned the PING. |
if ((doCallback && pSize) || (pSize === pLen)) {
|
|
Add list of pinged players to dispatch options. |
options.callbackArgs.pList = pList;
callback.call(that, options.callbackArgs);
}
else {
console.log('Not enough players:' + pList.size(), pLen);
}
|
|
Execute suspended calls. |
if (that.suspendedPings.length > 0) {
|
|
Cancel suspended pings if waiting room is closed. |
if (!that.shouldDispatchMoreGames()) {
console.log('Warning: room is closed. Clearing previously ' +
'suspended pings.');
that.suspendedPings = [];
}
else if (that.clients.player.size() < that.POOL_SIZE) {
console.log('Warning: not enough players now. ' +
'Aborting previously suspended pings.');
that.suspendedPings = [];
}
else {
that.kickUnresponsivePlayers.apply(that,
that.suspendedPings.pop());
}
}
};
|
|
Count how many pings returned. |
totPingReturned = 0;
|
|
Callback to execute when a ping-back is returned. |
pingReturnedCb = function() {
totPingReturned++;
if (totPingReturned === pLen) {
clearTimeout(timeout);
cb();
}
};
|
|
Start pinging. |
for (i = 0; i < players.length; ++i) {
p = players[i];
|
|
Call .insert, not .add (saves some operations). |
pList.insert(p);
console.log('Pinging player ' + p.id, timeToWaitForPing);
that.node.get('PING', pingReturnedCb, p.id, {
timeout: timeToWaitForPing,
executeOnce: true,
|
|
The callback on failure. |
timeoutCb: (function(p, i) {
return function() {
|
|
This marks the PING failed. |
pList.remove(p.id);
console.log('Player %s unresponsive. Kicking.', p.id);
that.node.disconnectClient(p);
};
})(p, i)
});
}
|
|
At the end of this timeout, we will check how many players have responded. If all players have responded (or doCallback = TRUE) the callback is executed. In any case, we set pingInProgress = FALSE. |
timeout = setTimeout(cb, timeToWaitForPing + 500);
};
|
¶ WaitingRoom.dispatchInitiates the start of the game It is assumed that it is called only after connected players > POOL_SIZE. Params
opts
object
Optional. Configuration options for the method.
Available options:
|
WaitingRoom.prototype.dispatch = (function() {
var doDispatch, where, parseGroupSizeOptions, checkShouldDispatch;
where = 'WaitingRoom.dispatch: ';
checkShouldDispatch = function() {
|
|
Check if we are still allowed to dispatch games. |
if (!this.shouldDispatchMoreGames()) {
this.channel.sysLogger.log(where + ' waiting room is closed. ' +
'Dispatches: ' +
this.numberOfDispatches + '/' +
this.N_GAMES +
'. Aborting current dispatch.',
'warning');
if (this.suspendedPings.length) this.suspendedPings = [];
return false;
}
return true;
};
parseGroupSizeOptions = function(opts) {
var groupSize, numberOfGames, nPlayers;
opts = opts || {};
if ('undefined' !== typeof opts.groupSize) {
groupSize = J.isInt(opts.groupSize, 0);
if (false === groupSize) {
throw new TypeError(where + 'opts.groupSize must be a ' +
'positive number or undefined. Found: ' +
opts.groupSize);
}
}
else {
groupSize = this.GROUP_SIZE;
}
|
|
If nothing is specified, try to dispatch maximal amount of games. |
numberOfGames = opts.numberOfGames;
if ('undefined' === typeof numberOfGames) {
nPlayers = this.clients.player.size();
if (!nPlayers ||
this.MAX_WAIT_TIME && this.EXECUTION_MODE === 'TIMEOUT') {
numberOfGames = 1;
}
else {
numberOfGames = Math.floor(nPlayers / groupSize);
}
}
if (this.N_GAMES !== null) {
numberOfGames = Math.min(numberOfGames, this.N_GAMES);
}
opts.numberOfGames = numberOfGames;
opts.groupSize = groupSize;
return opts;
};
doDispatch = function(opts) {
var treatmentName;
var dispatchList;
var pId, group, groupIdx, groupLimit;
var i, j;
var gameRoom, code, gameNumber;
var pList, nPlayers, nPlayersToDispatch;
var groups, nGroupsCreated, chosenTreatment;
var msg, numberOfGames, groupSize, closeAfterDispatch;
var channel, sysLogger;
|
|
Have we dispatched 'em all? |
if (!checkShouldDispatch.call(this)) return;
this.setDispatchState(WaitingRoom.dispatchStates.INITING);
channel = this.channel;
sysLogger = channel.sysLogger;
if (this.ON_DISPATCH) this.ON_DISPATCH(this, opts);
if ('undefined' !== typeof opts.chosenTreatment) {
if (this.validateTreatment(opts.chosenTreatment)) {
chosenTreatment = opts.chosenTreatment;
}
else {
this.abortDispatch(opts, 'Invalid treatment specified: ' +
opts.chosenTreatment);
return;
}
}
else {
chosenTreatment = this.CHOSEN_TREATMENT;
}
|
|
If coming from a "kick," there might be more players than when the original call to dispatch was performed. Additional players have not been tested, therefore "kick" must pass the list of tested players. |
pList = opts.pList || this.clients.player;
nPlayers = pList.size();
groupSize = opts.groupSize;
numberOfGames = opts.numberOfGames;
msg = opts.msg || { action: 'AllPlayersConnected', exit: 0 };
if ('undefined' === typeof opts.closeAfterDispatch) {
closeAfterDispatch = this.closeAfterDispatch;
}
else {
closeAfterDispatch = opts.closeAfterDispatch;
}
|
|
If numberOfGames is received as input parameter, the total number of players to dispatch might be too large. |
nPlayersToDispatch = groupSize * numberOfGames;
if (nPlayers < nPlayersToDispatch) {
this.abortDispatch(opts,
'Cannot dispatch ' + numberOfGames +
' game/s now, too few players are connected: ' +
nPlayers);
return;
}
|
|
Shuffle and sort players, if necessary. This means that at least two groups will be created. |
if (nPlayersToDispatch > groupSize) {
if (this.PLAYER_GROUPING) {
groups = this.PLAYER_GROUPING(pList, numberOfGames);
nGroupsCreated = groups.length;
if (nGroupsCreated !== numberOfGames) {
this.abortDispatch(opts,
'PLAYER_GROUPING did not return ' +
'the expected number of groups: ' +
groups.length + ' (found) vs ' +
numberOfGames + ' (expected)');
return;
}
|
|
TODO: check if each subgroup has the right size. TODO: shall we allowed groups of different sizes? |
dispatchList = [].concat.apply([], groups);
if (dispatchList.length !== nPlayersToDispatch) {
this.abortDispatch(opts,
'PLAYER_GROUPING did not return ' +
'the expected number of players: ' +
dispatchList.length + ' (found) vs ' +
nPlayersToDispatch + ' (expected)');
return;
}
}
else {
|
|
Shuffle player list anyway. |
dispatchList = pList.shuffle().db;
|
|
Sort according to priority. TODO: We could optimize it, if we knew in advance the sorting criteria, i.e. there might be no need to sort here. |
if (null !== this.PLAYER_SORTING) {
dispatchList = dispatchList.sort(this.PLAYER_SORTING);
}
}
}
else {
|
|
was: dispatchList = pList.breed().db; |
dispatchList = pList.db.slice();
}
this.setDispatchState(WaitingRoom.dispatchStates.DISPATCHING);
console.log('DISPATCH: ',
nPlayersToDispatch + '/' + nPlayers,
('string' === typeof chosenTreatment ?
chosenTreatment : 'Function'));
|
|
If we have too many players log a warning. |
if (nPlayers > nPlayersToDispatch) {
|
|
Warn if more participants than spots available. |
sysLogger.log('There are more players than available ' +
'spots in the game.' +
(this.DISCONNECT_IF_NOT_SELECTED ?
' Some players will be disconnected.' : '' ),
'warning');
}
i = -1, gameNumber = -1;
group = new Array(groupSize), groupLimit = groupSize - 1;
for ( ; ++i < nPlayersToDispatch ; ) {
|
|
Player id. |
pId = dispatchList[i].id;
|
|
Inform players. |
this.node.say('DISPATCH', pId, msg);
this.node.remoteSetup('page', pId, {
clearBody: true
});
|
|
Clear timeout for players. |
this.clearTimeOut(pId);
|
|
Add it to the group. |
groupIdx = i % groupSize;
group[groupIdx] = pId;
if (groupIdx === groupLimit) {
gameNumber++;
|
|
If this is the first dispatch or we need to create a new room anyway, assign a treatment and then setup the game. |
if (!this.lastGameRoom || !this.DISPATCH_TO_SAME_ROOM) {
|
|
Decide treatment. |
treatmentName = this.decideTreatment(chosenTreatment,
gameNumber);
|
|
Starts a game level or the main game. TODO: should the main game have a ghost level? |
if (this.gameLevel) {
gameRoom = channel.gameLevels[this.gameLevel]
.createGameRoom({
clients: group,
treatmentName: treatmentName
});
}
else {
|
|
Create new game room. |
gameRoom = channel.createGameRoom({
clients: group,
treatmentName: treatmentName
});
}
|
|
Setup and start game. |
gameRoom.setupGame();
|
|
The list of clients is empty, because the logic will automatically start them (if syncstepping is on). |
gameRoom.startGame(true, []);
|
|
Store reference. |
this.lastGameRoom = gameRoom;
}
else {
|
|
Move clients into existing room. |
j = -1;
for ( ; ++j < groupSize ; ) {
channel.moveClient(group[j],
this.lastGameRoom.name,
this.name);
}
|
|
Setup new group of players in the old room. |
this.lastGameRoom.setupGame(undefined, false, group);
this.lastGameRoom.startGame(false, group, true);
}
|
|
One more dispatch done! |
++this.numberOfDispatches;
|
|
Close waitingRoom if next game would not be dispatchable. |
if (!this.shouldDispatchMoreGames()) {
this.closeRoom();
|
|
Force to exit loop. |
break;
}
else {
|
|
Clear group. |
group = new Array(groupSize);
}
}
}
|
|
All dispatch attempts have been completed. |
|
|
Close room, if requested. |
if (closeAfterDispatch) {
this.setDispatchState(WaitingRoom.dispatchStates.NONE);
this.closeRoom();
this.closeAfterDispatch = false;
}
this.setDispatchState(WaitingRoom.dispatchStates.NOTIFYING);
|
|
Tell players still waiting, that they have not been selected. |
pList = this.clients.player;
nPlayers = pList.size();
for (i = 0; i < nPlayers; ++i) {
pId = pList.db[i].id;
|
|
Increment timesNotSelected for player. |
if (pList.db[i].timesNotSelected) ++pList.db[i].timesNotSelected;
else pList.db[i].timesNotSelected = 1;
if (this.START_DATE) this.clearTimeOut(pId);
code = channel.registry.getClient(pId);
this.node.say('DISPATCH', pId, {
action: 'NotSelected',
exit: code.ExitCode,
shouldDispatchMoreGames: this.shouldDispatchMoreGames()
});
|
|
Ste was: (but it does not make any sense). Exit loop. if (!this.shouldDispatchMoreGames()) break |
}
this.setDispatchState(WaitingRoom.dispatchStates.NONE);
if (this.ON_DISPATCHED) this.ON_DISPATCHED(this, opts);
};
return function(opts) {
if (!opts) {
opts = {};
}
else if ('object' !== typeof opts) {
throw new TypeError(where + 'opts must be object ' +
'or undefined. Found: ' + opts);
}
if (opts.msg && 'object' !== typeof opts.msg) {
throw new TypeError(where + 'opts.msg must be ' +
'object or undefined. Found: ' + opts.msg);
}
|
|
Have we dispatched 'em all? |
if (!checkShouldDispatch.call(this)) return;
|
|
Fix group size and number of groups. In case of kickUnresponsivePlayers, these can change in between. |
opts = parseGroupSizeOptions.call(this, opts);
|
|
If we have pool of 1 and mode == WAIT_FOR_N_PLAYERS just go ahead! |
if (!this.PING_BEFORE_DISPATCH ||
(this.EXECUTION_MODE === 'WAIT_FOR_N_PLAYERS' &&
this.POOL_SIZE === 1)) {
doDispatch.call(this, opts);
}
else {
|
|
Blocks until all players have returned the ping or are kicked. |
this.kickUnresponsivePlayers(doDispatch, { callbackArgs: opts });
}
};
})();
|
¶ WaitingRoom.notifyPlayerUpdateNotifies players a change in the number of players Params
np
number
Optional. Number of players. If not specified
the number of players will be fetched at the moment of sending the
message. If specified, the message is sent immediately.
|
WaitingRoom.prototype.notifyPlayerUpdate = function(np) {
var that;
if ('number' === typeof np) {
this.node.say('PLAYERSCONNECTED', 'ROOM', np);
if (this.notifyTimeout) {
clearTimeout(this.notifyTimeout);
this.notifyTimeout = null;
}
}
else if (!this.notifyTimeout) {
that = this;
|
|
Group together a few connect-notifications before sending them. |
this.notifyTimeout = setTimeout(function() {
|
|
Delete timeout. |
that.notifyTimeout = null;
|
|
Notify all players of new connection/s. |
that.node.say('PLAYERSCONNECTED', 'ROOM', that.node.game.pl.size());
}, this.NOTIFY_INTERVAL);
}
};
|
¶ WaitingRoom.makeTimeOutRegister a timeout for a player Params
playerID
number
ID of player for which to register timeout.
waitTime
number
Nnumber of milliseconds to wait before execution
of callback. If null then no timeout is made.
cb
function
(Optional) callback to register. If undefined a
predefine callback is used.
See
WaitingRoom.clearTimeOut
|
WaitingRoom.prototype.makeTimeOut = function(playerID, waitTime, cb) {
var that, channel;
if (null === waitTime) return;
that = this;
channel = this.channel;
cb = cb || function() {
var code, pList, nPlayers, res;
channel.sysLogger.log('Waitroom timed out for: ' + playerID);
pList = that.clients.player;
nPlayers = pList.size();
that.node.say('TIME', playerID);
|
|
TODO: do we need to check if we have enough players? |
if (nPlayers >= that.POOL_SIZE) {
that.dispatch({
action: 'AllPlayersConnected',
nPlayers: nPlayers
});
}
else {
code = channel.registry.getClient(playerID);
|
|
If a timeout function for the server was specified, executes. If the return value is FALSE, do not continue with checkout and informing the player about NotEnoughPlayers. |
if (that.ON_TIMEOUT_SERVER) {
|
|
TODO: pass that as parameter. |
res = that.ON_TIMEOUT_SERVER.call(that, code);
if (res === false) return;
}
|
|
If an access code is defined, checkout remotely. |
channel.registry.checkOut(playerID);
that.node.say('DISPATCH', playerID, {
action: 'NotEnoughPlayers',
exit: code.ExitCode
});
}
};
this.timeOuts[playerID] = setTimeout(cb, waitTime);
};
|
¶ WaitingRoom.clearTimeOutClear a timeout for a player Params
playerID
number
ID of player for which to clear the timeout.
See
WaitingRoom.makeTimeOut
|
WaitingRoom.prototype.clearTimeOut = function(playerID) {
clearTimeout(this.timeOuts[playerID]);
this.timeOuts[playerID] = null;
};
|
¶ WaitingRoom.decideTreatmentCheck if string, or use it. Params
t
mixed
String, object, function or undefined
used to decide a treatment
Returns
string
Chosen treatment
|
WaitingRoom.prototype.decideTreatment = function(t, idxInBatch) {
var treatments, tLen, chosenT;
treatments = this.channel.gameInfo.treatmentNames;
tLen = treatments.length;
if (t === 'treatment_rotate') {
return treatments[(this.channel.autoRoomNo) % tLen];
}
if ('random' === t || 'undefined' === typeof t) {
return treatments[J.randomInt(-1, tLen-1)];
}
if ('function' === typeof t) {
chosenT = t(treatments, this.channel.autoRoomNo, idxInBatch);
if ('string' !== typeof chosenT) {
throw new TypeError('WaitingRoom.decideTreatment: callback must ' +
'return string. Found: ' + chosenT);
}
if (!this.channel.hasGameTreatment(chosenT)) {
throw new TypeError('WaitingRoom.decideTreatment: callback ' +
'returned unknown treatment: ' + chosenT);
}
return chosenT;
}
|
|
Return treatment (was a string already). |
return t;
};
|
¶ WaitingRoom.abortDispatchAborts an an attempt to dispatch Logs an error message, cleans up state, and executes a callback, if defined. Params
opts
object
The dispatch options
msg
string
Optional. A message describing the reason for
aborting the dispatch
See
WaitingRoom.ON_FAILED_DISPATCH
|
WaitingRoom.prototype.abortDispatch = function(opts, msg) {
this.channel.sysLogger.log('WaitingRoom.dispatch: aborted. ' + (msg || ''),
'error');
this.setDispatchState(WaitingRoom.dispatchStates.NONE);
if (this.ON_FAILED_DISPATCH) this.ON_FAILED_DISPATCH(this, opts, msg);
};
|
¶ WaitingRoom.setDispatchStateSets the dispatching state See
WaitingRoom.getdispatchState
See
WaitingRoom.dispatchState
See
WaitingRoom.dispatchStates
|
WaitingRoom.prototype.setDispatchState = function(state) {
if (!WaitingRoom.dispatchStates[state]) {
throw new Error('WaitingRoom.setdispatchState: unknown state. ' +
'Found: ' + state);
}
this.dispatchState = state;
};
|
¶ WaitingRoom.getDispatchStateSets the dispatching state See
WaitingRoom.setdispatchState
See
WaitingRoom.dispatchState
See
WaitingRoom.dispatchStates
|
WaitingRoom.prototype.getDispatchState = function() {
return this.dispatchState;
};
|
¶ Helper methods |
|
¶ checkPositiveIntegerChecks whether a property is a positive integer throwing an error if not Params
settings
object
The object for which to check a property.
name
string
The name of the property to check.
where
string
String to prepend to the error message.
See
WaitingRoom.parseSettings
|
function checkPositiveInteger(settings, name, where) {
var N;
N = settings[name];
if (!J.isInt(N, 0)) {
throw new Error (where + name + ' must be an' +
' integer and larger than 0. Found: ' + N);
}
}
|
¶ assignIfFunctionAssigns a property to an object from another one if it is a function The property in the object must be undefined or function, otherwise an error will be raised. Params
name
string
The name of the property to verify and assign
toObj
object
The object to which the property will be assigned
fromObj
object
The object from which the property will be copied
where
string
A prefix for the error message. Default:
'WaitingRoom.parseSettings: '.
|
function assignIfFunction(name, toObj, fromObj, where) {
if ('undefined' !== typeof fromObj[name]) {
if ('function' !== typeof fromObj[name]) {
new TypeError((where || 'WaitingRoom.parseSettings: ') + name +
'must be function or undefined. Found: ' +
fromObj[name]);
}
toObj[name] = fromObj[name];
}
}
|


Toggle navigation
Map
{{ username }}
Profile
Members Portal
Report an Issue
Logout
×
Loading...
Nathaniel Rochester Hall
Bathrooms
Stairs/Elevators
Special Rooms
{% if config['PLUG_SUPPORT'] %}
{% endif %}


nips nips2005 nips2005-11 nips2005-11-reference knowledge-graph by maker-knowledge-mining
Source: pdf
Author: Long Zhu, Alan L. Yuille
Abstract: We describe a hierarchical compositional system for detecting deformable objects in images. Objects are represented by graphical models. The algorithm uses a hierarchical tree where the root of the tree corresponds to the full object and lower-level elements of the tree correspond to simpler features. The algorithm proceeds by passing simple messages up and down the tree. The method works rapidly, in under a second, on 320 × 240 images. We demonstrate the approach on detecting cats, horses, and hands. The method works in the presence of background clutter and occlusions. Our approach is contrasted with more traditional methods such as dynamic programming and belief propagation. 1
[1] Viola, P. and Jones, M. (2001). ”Fast and Robust Classiﬁcation using Asymmetric AdaBoost and a Detector Cascade”. In Proceedings NIPS01.
[2] Schniederman, H. and Kanade, T. (2000). ”A Statistical method for 3D object detection applied to faces and cars”. In Computer Vision and Pattern Recognition.
[3] Chen, X. and Yuille, A.L. (2004). AdaBoost Learning for Detecting and Reading Text in City Scenes. Proceedings CVPR.
[4] Lowe, D.G. (1999). “Object recognition from local scale-invariant features.” In Proc. International Conference on Computer Vision ICCV. Corfu, pages 1150-1157.
[5] Coughlan, J.M., Snow, D., English, C. and Yuille, A.L. (2000). “Efﬁcient Deformable Template Detection and Localization without User Initialization”. Computer Vision and Image Understanding. 78, pp 303-319.
[6] Felzenswalb, P. (2005). “Representation and Detection of Deformable Shapes”. IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 27, No. 2.
[7] Coughlan, J.M., and Ferreira, S. (2002). “Finding Deformable Shapes using Loopy Belief Propoagation”. In Proceedings European Conference of Computer Vision.. 2002.
[8] Coughlan, J.M., and Shen, H. (2004). “Shape Matching with Belief Propagation: Using Dynamic Quantization to Accomodate Occlusion and Clutter”. In GMBV .
[9] Geman, S. Potter, D. and Chi, Z. (2002). “ Composition systems”. Quarterly of Applied Mathematics, LX, pp 707-736.
[10] Fergus, R., Perona, P. and Zisserman, A. (2003) “Object Class Recognition by Unsupervised Scale-Invariant Learning”. Proceeding CVPR. (2), pp 264-271.
[11] Thayananthan, A. Stenger, B., Torr, P. and Cipolla, R. (2003). ”Shape context and chamfer matching in cluttered scenes,” In Proc. Conf. Comp. Vision Pattern Rec., pp. 127–133.
[12] Berg, A.C., Berg, T.L., and Malik, J. (2005). “Shape Matching and Object Recognition using Low Distortion Correspondence”. Proceedings CVPR.
[13] Tu, Z., Chen, X., Yuille, A.L., and Zhu, S.C. (2003). “Image Parsing: Unifying Segmentation, Detection, and Recognition”. In Proceedings ICCV.
[14] Wainwright, M.J., Jaakkola, T.S., and Willsky., A.S. “Tree-Based Reparamterization Framework for Analysis of Sum-Product and Related Algorithms”. IEEE Transactions on Information Theory. Vol. 49, pp 1120-1146. No. 5. 2003.
[15] Chui,H. and Rangarajan, A., A New Algorithm for Non-Rigid Point Matching. In Proceedings CVPR 2000.


Displays an option in a md-select box's dropdown menu. Options can be grouped using md-optgroup element directives.
When applied, md-option-empty
will mark the option as "empty" allowing the option to clear the
select and put it back in it's default state. You may supply this attribute on any option you
wish, however, it is automatically applied to an option whose value
or ng-value
are not
defined.
Automatically Applied
<md-option>
<md-option value>
<md-option value="">
<md-option ng-value>
<md-option ng-value="">
NOT Automatically Applied
<md-option ng-value="1">
<md-option ng-value="''">
<md-option ng-value="undefined">
<md-option value="undefined">
(this evaluates to the string "undefined"
)<md-option ng-value="{{someValueThatMightBeUndefined}}">
Note: A value of undefined
is considered a valid value (and does not auto-apply this
attribute) since you may wish this to be your "Not Available" or "None" option.
Note: Using the
value
attribute from the <option>
element (as opposed to the <md-option>
element's
ng-value) always evaluates
to a string
. This means that value="null"
will cause a check against myValue != "null"
rather than !myValue
or myValue != null
.
Importantly, this also applies to number
values. value="1"
will not match up with an
ng-model
like $scope.selectedValue = 1
. Use ng-value="1"
in this case and other cases where
you have values that are not strings.
Note: Please see our docs on
using objects with md-select
for additional guidance on using the trackBy
option with
ng-model-options
.
With ng-repeat
:
| Parameter | Type | Description |
|---|---|---|
ng-value
expression
|
expression |
Binds the given expression to the value of the option. |
value
string
|
string |
Attribute to set the value of the option. |
ng-repeat
expression
|
expression |
AngularJS directive that instantiates a template once per item from a collection. |
md-option-empty
boolean
|
boolean |
If the attribute exists, mark the option as "empty" allowing
the option to clear the select and put it back in it's default state. You may supply this
attribute on any option you wish, however, it is automatically applied to an option whose |
tabindex
number
|
number |
The |


Javascript Language.
Parentheses ()
Parentheses are used as part of a conditional statement, normally containing the conditional as part of an if/else statement, or in a loop.
They are also used in functions, holding the parameters that the function takes in - function(parameter).
You can also use them to group expressions together so that they are computed as a whole before being included in the rest of the expression, such as in mathematics. E.g. (5 + 6) * 8
Brackets []
Brackets are used to hold arrays - E.g. myArray = [1,2,3]
They are also used to then access particular values in an array using indices - E.g. myArray[1]
Braces {}
Braces are generally used to contain certain sections of code into blocks, such as the code in a for loop or in an if statement. They also contain the code executed by a function.
Braces are also used to form objects, containing all the keys and values of the object.
Single '' and Double "" Quotes
Single and double quotes are generally interchangeable. They are used to denote that the information contained within them is of type string.
If you want quotation marks to appear in the string, then you need to use one type of quotes as the outer pair, and then the other type as the ones in the string.


Cisco IP SLA uses active traffic monitoring for measuring traffic performance. It performs this by generating traffic in a continuous, reliable, and predictable manner and then analyzing the results. The information collected includes response time, one-way latency, jitter, packet loss, voice quality scoring, network resource availability, application performance, and server response time.
If configuring simple IP SLA Operations such as ICMP echo, the operation only has to be configured on the local router. But for the more advanced Operations, you must set up the remote router or device to respond to your IP SLA traffic. The IP SLA Responder is a component embedded in the destination Cisco device that allows the system to anticipate and respond to IP SLA request packets. Only a Cisco device can be a source for a destination IP SLA Responder.
To see the IP SLA Operation types, enter IP SLA configuration mode as follows:
R1(config)#ip sla 1
R1(config-ip-sla)#?
IP SLAs entry configuration commands:
dhcp DHCP Operation
dns DNS Query Operation
ethernet Ethernet Operations
exit Exit Operation Configuration
ftp FTP Operation
http HTTP Operation
icmp-echo ICMP Echo Operation
icmp-jitter ICMP Jitter Operation
mpls MPLS Operation
path-echo Path Discovered ICMP Echo Operation
path-jitter Path Discovered ICMP Jitter Operation
tcp-connect TCP Connect Operation
udp-echo UDP Echo Operation
udp-jitter UDP Jitter Operation
voip Voice Over IP Operation
To set up a Cisco routing device as an SLA responder, you would use the following:
R1(config)# ip sla responder
After an IP SLA Operation has been configured, you must schedule the operation to run:
R1(config)# ip sla schedule 1 start-time now life forever
To then see the results of the IP SLA configuration, use the following:
R1# show ip sla statistics
So starting from the top, a real quick example of an IP SLA configuration to ping an IP address every 30 seconds for 3 hours would look like this:
R1(config)# ip sla 1
R1(config-ip-sla)# icmp-echo <IP_ADDRESS>
R1(config-ip-sla-echo)# frequency 30
R1(config-ip-sla-echo)# exit
R1(config)# ip spa schedule 1 start-time now life 10800
R1(config)# exit


Class Model
Implements
Inherited Members
Namespace: CADability
Assembly: CADability.dll
Syntax
[Serializable]
public class Model : IShowPropertyImpl, IShowProperty, IPropertyEntry, ISerializable, IGeoObjectOwner, IEnumerable, ICommandHandler, ICategorizedDislayLists, IDeserializationCallback, IJsonSerialize, IJsonSerializeDone
Constructors
| Improve this Doc View SourceModel()
Creates an empty model.
Declaration
public Model()
Model(SerializationInfo, StreamingContext)
Constructor required by deserialization
Declaration
protected Model(SerializationInfo info, StreamingContext context)
Parameters
| Type | Name | Description |
|---|---|---|
| System.Runtime.Serialization.SerializationInfo | info | SerializationInfo |
| System.Runtime.Serialization.StreamingContext | context | StreamingContext |
Properties
| Improve this Doc View SourceAllDrives
Returns the list of all IDrive of this model. Only used in connection with AnimatedView.
Declaration
public DriveList AllDrives { get; }
Property Value
| Type | Description |
|---|---|
| DriveList |
AllObjects
Returns a list of all objects owned by this model. Removing or adding objects from or to the returned list doesn't remove or add the objects from or to the model.
Declaration
public GeoObjectList AllObjects { get; }
Property Value
| Type | Description |
|---|---|
| GeoObjectList |
AllSchedules
Returns the list of all Schedules of this model. Only used in connection with AnimatedView.
Declaration
public ScheduleList AllSchedules { get; }
Property Value
| Type | Description |
|---|---|
| ScheduleList |
ContextMenu
Declaration
public override MenuWithHandler[] ContextMenu { get; }
Property Value
| Type | Description |
|---|---|
| MenuWithHandler[] |
Overrides
| Improve this Doc View SourceCount
Returns the count of GeoObjects in this model.
Declaration
public int Count { get; }
Property Value
| Type | Description |
|---|---|
| System.Int32 |
EntryType
Overrides EntryType, returns GroupTitle.
Declaration
public override ShowPropertyEntryType EntryType { get; }
Property Value
| Type | Description |
|---|---|
| ShowPropertyEntryType |
Overrides
| Improve this Doc View SourceExtent
Returns the extent of the model, i.e. a bounding cube enclosing all objects.
Declaration
public BoundingCube Extent { get; set; }
Property Value
| Type | Description |
|---|---|
| BoundingCube |
Item[Int32]
Indexer to access the GeoObjects owned by this model by index.
Declaration
public IGeoObject this[int Index] { get; }
Parameters
| Type | Name | Description |
|---|---|---|
| System.Int32 | Index | Index of the required GeoObject |
Property Value
| Type | Description |
|---|---|
| IGeoObject |
LabelText
Declaration
public override string LabelText { get; set; }
Property Value
| Type | Description |
|---|---|
| System.String |
Overrides
| Improve this Doc View SourceLabelType
Overrides LabelType,
Declaration
public override ShowPropertyLabelFlags LabelType { get; }
Property Value
| Type | Description |
|---|---|
| ShowPropertyLabelFlags |
Overrides
| Improve this Doc View SourceMinExtend
A minimal extend of the Model. This will be the extend of the Model if the Model is empty. This is also used in other circumstances (e.g. dieplay of the grid)
Declaration
public BoundingCube MinExtend { get; set; }
Property Value
| Type | Description |
|---|---|
| BoundingCube |
Name
The name of the model.
Declaration
public string Name { get; set; }
Property Value
| Type | Description |
|---|---|
| System.String |
NoSingleAddEvents
Set to true, if you don't want AddingGeoObjectEvent rsp. GeoObjectAddedEvent beeing fired after AddingGeoObjectsEvent rsp. GeoObjectsAddedEvent has been called. False is the default value.
Declaration
public bool NoSingleAddEvents { set; }
Property Value
| Type | Description |
|---|---|
| System.Boolean |
OctTree
Access to the OctTree containing all geometrical objects of the model. Do not modify the octtree to avoid inconsitencies between model and octtree. Use the octtree for fast access to the objects in the model from geometrical constraints.
Declaration
public OctTree<IGeoObject> OctTree { get; }
Property Value
| Type | Description |
|---|---|
| OctTree<IGeoObject> |
SubEntries
Overrides SubEntries, returns the subentries in this property view.
Declaration
public override IShowProperty[] SubEntries { get; }
Property Value
| Type | Description |
|---|---|
| IShowProperty[] |
Overrides
| Improve this Doc View SourceSubEntriesCount
Overrides SubEntriesCount, returns the number of subentries in this property view.
Declaration
public override int SubEntriesCount { get; }
Property Value
| Type | Description |
|---|---|
| System.Int32 |
Overrides
| Improve this Doc View SourceUndo
Gets or sets the undo-system. Usually this is the undosystem of the Project containing this model.
Declaration
public UndoRedoSystem Undo { get; set; }
Property Value
| Type | Description |
|---|---|
| UndoRedoSystem |
UserData
Declaration
public UserData UserData { get; }
Property Value
| Type | Description |
|---|---|
| UserData |
Methods
| Improve this Doc View SourceAdd(GeoObjectList)
Adds multiple GeoObjects to this model.
Declaration
public void Add(GeoObjectList ListToAdd)
Parameters
| Type | Name | Description |
|---|---|---|
| GeoObjectList | ListToAdd | List of the GeoObjects to add |
Add(IGeoObject)
Adds an object to this model. If the model is beeing displayed the object will appear in the view immediately.
Declaration
public void Add(IGeoObject ObjectToAdd)
Parameters
| Type | Name | Description |
|---|---|---|
| IGeoObject | ObjectToAdd | The GeoObject to add |
Add(IGeoObject[])
Adds multiple GeoObjects to this model.
Declaration
public void Add(IGeoObject[] ListToAdd)
Parameters
| Type | Name | Description |
|---|---|---|
| IGeoObject[] | ListToAdd | Array of the GeoObjects to add |
AdjustPoint(SnapPointFinder, Projection, Set<Layer>)
Adjusts the point defined by spf
(SourcePoint and Projection)
according to the settings of spf
(SnapPointFinder.SnapModes and other properties)
by checking all objects in the visibleLayers
.
As a result SnapPoint and DidSnap will be set.
Declaration
public void AdjustPoint(SnapPointFinder spf, Projection projection, Set<Layer> visibleLayers)
Parameters
| Type | Name | Description |
|---|---|---|
| SnapPointFinder | spf | Point to be adjusted and mode how to adjust |
| Projection | projection | Projection |
| Set<Layer> | visibleLayers | Visible layers to consider |
AdjustPoint(SnapPointFinder, Set<Layer>)
Searches for the best point in this model which corresponds to the mouse position and the
active snap modes. Mouse position and snap modes are contained in the spf
parameter, where also the result is returned
Declaration
public void AdjustPoint(SnapPointFinder spf, Set<Layer> visibleLayers)
Parameters
| Type | Name | Description |
|---|---|---|
| SnapPointFinder | spf | SnapPointFinder class which contains the snap mode and the mouse position |
| Set<Layer> | visibleLayers | Layers to be included in the search |
ClearDisplayLists()
Deprecated, still public for legacy reasons.
Declaration
public void ClearDisplayLists()
Finalize()
Declaration
protected void Finalize()
GetExtent(Projection)
Returns a 2 dimensional bounding rctangle enclosing the projection of all GeoObjects of the model.
Declaration
public BoundingRect GetExtent(Projection pr)
Parameters
| Type | Name | Description |
|---|---|---|
| Projection | pr | The projection to be applied to the GeoObjects |
Returns
| Type | Description |
|---|---|
| BoundingRect |
GetObjectsFromBox(BoundingCube)
Returns all objects of the model that are inside ore close to the provided box.
Declaration
public GeoObjectList GetObjectsFromBox(BoundingCube box)
Parameters
| Type | Name | Description |
|---|---|---|
| BoundingCube | box | Box from which to seek objects |
Returns
| Type | Description |
|---|---|
| GeoObjectList | List of objects in or close to the box |
GetObjectsFromRect(BoundingRect, Projection, Set<Layer>, PickMode, FilterList)
Returns all objects of the model that are touched by the pickrect
, whos layers are in the
visibleLayers
set and which are accepted by the filterList
.
Declaration
public GeoObjectList GetObjectsFromRect(BoundingRect pickrect, Projection projection, Set<Layer> visibleLayers, PickMode pickMode, FilterList filterList)
Parameters
| Type | Name | Description |
|---|---|---|
| BoundingRect | pickrect | Area that specifies which objects are beeing tested |
| Projection | projection | The projection in which the pickrect is defined |
| Set<Layer> | visibleLayers | Set of layers which are visible (and hence should be used for the test) |
| PickMode | pickMode | Single or multiple objects |
| FilterList | filterList | List of conditions |
Returns
| Type | Description |
|---|---|
| GeoObjectList | List of objects that fulfill all conditions |
GetObjectsFromRect(Projection.PickArea, Set<Layer>, PickMode, FilterList, GeoObjectList)
Returns all objects of the model that are touched by the area
, whos layers are in the
visibleLayers
set and which are accepted by the filterList
.
Declaration
public GeoObjectList GetObjectsFromRect(Projection.PickArea area, Set<Layer> visibleLayers, PickMode pickMode, FilterList filterList, GeoObjectList toAvoid = null)
Parameters
| Type | Name | Description |
|---|---|---|
| Projection.PickArea | area | Area that specifies which objects are beeing tested |
| Set<Layer> | visibleLayers | Set of layers which are visible (and hence should be used for the test) |
| PickMode | pickMode | Single or multiple objects |
| FilterList | filterList | List of conditions |
| GeoObjectList | toAvoid | List of objects not to select |
Returns
| Type | Description |
|---|---|
| GeoObjectList | List of objects that fulfill all conditions |
IsAttributeUsed(Object)
Determins whether an attribute (e.g. Layer, LinePattern) is used by any GeoObjects of this model.
Declaration
public bool IsAttributeUsed(object Attribute)
Parameters
| Type | Name | Description |
|---|---|---|
| System.Object | Attribute | Attribut to test |
Returns
| Type | Description |
|---|---|
| System.Boolean | True, if attribute is used, false otherwise. |
LabelChanged(String)
Overrides LabelChanged(String)
Declaration
public override void LabelChanged(string NewText)
Parameters
| Type | Name | Description |
|---|---|---|
| System.String | NewText |
Overrides
| Improve this Doc View SourceMoveToBack(IGeoObject)
Declaration
public void MoveToBack(IGeoObject iGeoObject)
Parameters
| Type | Name | Description |
|---|---|---|
| IGeoObject | iGeoObject |
MoveToFront(IGeoObject)
Declaration
public void MoveToFront(IGeoObject iGeoObject)
Parameters
| Type | Name | Description |
|---|---|---|
| IGeoObject | iGeoObject |
ParallelTriangulation(Double)
Declaration
public void ParallelTriangulation(double precision)
Parameters
| Type | Name | Description |
|---|---|---|
| System.Double | precision |
Remove(GeoObjectList)
Removes a list of GeoObjects from this model. Objects that dont belong to the model will be ignored.
Declaration
public void Remove(GeoObjectList ToRemove)
Parameters
| Type | Name | Description |
|---|---|---|
| GeoObjectList | ToRemove | List of GeoObjects to be removed |
Remove(IGeoObject)
Removes a GeoObject from the model. If the GeoObject doesnt belong to this model it will be ignored.
Declaration
public void Remove(IGeoObject ToRemove)
Parameters
| Type | Name | Description |
|---|---|---|
| IGeoObject | ToRemove | GeoObject to remove |
Remove(IGeoObject[])
Removes an array of GeoObjects from this model. Objects that dont belong to the model will be ignored.
Declaration
public void Remove(IGeoObject[] ToRemove)
Parameters
| Type | Name | Description |
|---|---|---|
| IGeoObject[] | ToRemove | Array of geoObjects to remove |
Remove(HashSet<IGeoObject>)
Declaration
public void Remove(HashSet<IGeoObject> HToRemove)
Parameters
| Type | Name | Description |
|---|---|---|
| System.Collections.Generic.HashSet<IGeoObject> | HToRemove |
RemoveAll()
Remove all objects from this model.
Declaration
public void RemoveAll()
RemoveSolid(Solid, Boolean)
Removes the given solid from all other solids in the model. If there are no solids in the model or this solid is disjoint with all other solids in the model there will be no effect.
Declaration
public bool RemoveSolid(Solid solid, bool onlySameLayer)
Parameters
| Type | Name | Description |
|---|---|---|
| Solid | solid | the solid to remove |
| System.Boolean | onlySameLayer | if true: check only with solids on the same layer |
Returns
| Type | Description |
|---|---|
| System.Boolean |
UniteSolid(Solid, Boolean)
Unites the given solid with all other solids in the model. If there are no other solids or the solid is disjoint with all other solids this solid will simply bee added.
Declaration
public bool UniteSolid(Solid solid, bool onlySameLayer)
Parameters
| Type | Name | Description |
|---|---|---|
| Solid | solid | the solid to unite |
| System.Boolean | onlySameLayer | if true: check only with solids on the same layer |
Returns
| Type | Description |
|---|---|
| System.Boolean |
Events
| Improve this Doc View SourceAddingGeoObjectEvent
This event will be fired before an object is added to this model. The event handler can prevent the object beeing added to the model
Declaration
public event Model.AddingGeoObject AddingGeoObjectEvent
Event Type
| Type | Description |
|---|---|
| Model.AddingGeoObject |
AddingGeoObjectsEvent
This event will be fired before multiple objects are beeing added. There is no sense in modifying the provided array of objects. There will be an additional call to AddingGeoObjectEvent and GeoObjectAddedEvent for each objects (where you can prevent the object beeing added) and a final call to GeoObjectsAddedEvent.
Declaration
public event Model.AddingGeoObjects AddingGeoObjectsEvent
Event Type
| Type | Description |
|---|---|
| Model.AddingGeoObjects |
CalculateExtentForZoomTotalEvent
Declaration
public event Model.CalculateExtentForZoomTotalDelegate CalculateExtentForZoomTotalEvent
Event Type
| Type | Description |
|---|---|
| Model.CalculateExtentForZoomTotalDelegate |
ExtentChangedEvent
This event will be fired when objects have been added, removed or modified which resulted in a different extent (of the bounding box) of the model.
Declaration
public event Model.ExtentChangedDelegate ExtentChangedEvent
Event Type
| Type | Description |
|---|---|
| Model.ExtentChangedDelegate |
GeoObjectAddedEvent
This event will be fired when an object is added to this model.
Declaration
public event Model.GeoObjectAdded GeoObjectAddedEvent
Event Type
| Type | Description |
|---|---|
| Model.GeoObjectAdded |
GeoObjectDidChangeEvent
This event will be fired when an object contained in this model did change.
Declaration
public event ChangeDelegate GeoObjectDidChangeEvent
Event Type
| Type | Description |
|---|---|
| ChangeDelegate |
GeoObjectRemovedEvent
This event will be fired when an object is removed from this model.
Declaration
public event Model.GeoObjectRemoved GeoObjectRemovedEvent
Event Type
| Type | Description |
|---|---|
| Model.GeoObjectRemoved |
GeoObjectsAddedEvent
This event will be fired after multiple GeoObjects have been added, AddingGeoObjectsEvent has been fired before.
Declaration
public event Model.GeoObjectsAdded GeoObjectsAddedEvent
Event Type
| Type | Description |
|---|---|
| Model.GeoObjectsAdded |
GeoObjectsRemovedEvent
This event will be fired when removing multiple objects from this model is finished.
Declaration
public event Model.GeoObjectsRemoved GeoObjectsRemovedEvent
Event Type
| Type | Description |
|---|---|
| Model.GeoObjectsRemoved |
GeoObjectWillChangeEvent
This event will be fired when an object contained in this model is about to change.
Declaration
public event ChangeDelegate GeoObjectWillChangeEvent
Event Type
| Type | Description |
|---|---|
| ChangeDelegate |
ImportingObjectsEvent
This event will be fired when objects imported from another file are added to the model. The event handler can modify the list of objects, e.g. add or remove objects or combine the objects to a Block.
Declaration
public event Model.ImportingObjectsDelegate ImportingObjectsEvent
Event Type
| Type | Description |
|---|---|
| Model.ImportingObjectsDelegate |
NameChangedEvent
This event will be fired when the name of the model changed.
Declaration
public event Model.NameChangedDelegate NameChangedEvent
Event Type
| Type | Description |
|---|---|
| Model.NameChangedDelegate |
RemovingGeoObjectEvent
This event will be fired before an object is removed from this model. The event handler can prevent the object beeing added to the model
Declaration
public event Model.RemovingGeoObject RemovingGeoObjectEvent
Event Type
| Type | Description |
|---|---|
| Model.RemovingGeoObject |
RemovingGeoObjectsEvent
This event will be fired before multiple objects are beeing removed. There is no sense in modifying the provided array of objects. There will be an additional call to RemovingGeoObjectEvent and GeoObjectRemovedEvent for each objects (where you can prevent the object beeing added) and a final call to GeoObjectsRemovedEvent.
Declaration
public event Model.RemovingGeoObjects RemovingGeoObjectsEvent
Event Type
| Type | Description |
|---|---|
| Model.RemovingGeoObjects |
Explicit Interface Implementations
| Improve this Doc View SourceICategorizedDislayLists.Add(Layer, Boolean, Boolean, IGeoObject)
Declaration
void ICategorizedDislayLists.Add(Layer layer, bool addToFace, bool addToLinear, IGeoObject go)
Parameters
| Type | Name | Description |
|---|---|---|
| Layer | layer | |
| System.Boolean | addToFace | |
| System.Boolean | addToLinear | |
| IGeoObject | go |
IJsonSerialize.GetObjectData(IJsonWriteData)
Declaration
void IJsonSerialize.GetObjectData(IJsonWriteData data)
Parameters
| Type | Name | Description |
|---|---|---|
| IJsonWriteData | data |
IJsonSerialize.SetObjectData(IJsonReadData)
Declaration
void IJsonSerialize.SetObjectData(IJsonReadData data)
Parameters
| Type | Name | Description |
|---|---|---|
| IJsonReadData | data |
IJsonSerializeDone.SerializationDone()
Declaration
void IJsonSerializeDone.SerializationDone()
ICommandHandler.OnCommand(String)
Declaration
bool ICommandHandler.OnCommand(string MenuId)
Parameters
| Type | Name | Description |
|---|---|---|
| System.String | MenuId |
Returns
| Type | Description |
|---|---|
| System.Boolean |
ICommandHandler.OnSelected(MenuWithHandler, Boolean)
Declaration
void ICommandHandler.OnSelected(MenuWithHandler selectedMenuItem, bool selected)
Parameters
| Type | Name | Description |
|---|---|---|
| MenuWithHandler | selectedMenuItem | |
| System.Boolean | selected |
ICommandHandler.OnUpdateCommand(String, CommandState)
Declaration
bool ICommandHandler.OnUpdateCommand(string MenuId, CommandState CommandState)
Parameters
| Type | Name | Description |
|---|---|---|
| System.String | MenuId | |
| CommandState | CommandState |
Returns
| Type | Description |
|---|---|
| System.Boolean |
IEnumerable.GetEnumerator()
Declaration
IEnumerator IEnumerable.GetEnumerator()
Returns
| Type | Description |
|---|---|
| System.Collections.IEnumerator |
IDeserializationCallback.OnDeserialization(Object)
Declaration
void IDeserializationCallback.OnDeserialization(object sender)
Parameters
| Type | Name | Description |
|---|---|---|
| System.Object | sender |
ISerializable.GetObjectData(SerializationInfo, StreamingContext)
Declaration
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
Parameters
| Type | Name | Description |
|---|---|---|
| System.Runtime.Serialization.SerializationInfo | info | |
| System.Runtime.Serialization.StreamingContext | context |


In this tutorial, we will cover communicating with an Arduino UNO from a web browser, using the JavaScript runtime environment Node.js. An overview of how this system will work is shown below in Figure 1.
In the browser there will be a form with a couple of inputs. When the form is submittted, the input values will be sent to a server via a socket. The server will then read the data and send it on to the Arduino over the serial (USB) port. On the Arduino there will be a program that repeatedly checks the serial port for data - when it arrives, the program reads it and does something with it, (blinking an LED in this case).
We will start by covering what hardware and software is required, followed by going over installation of Node.js, Node socket and serial port modules, and the Arduino Integrated Development Environment (IDE). Next, we will cover writing the client HTML and JavaScript, writing the server (also in JavaScript), and the Arduino program. We will conclude with wiring up the Arduino circuit and running the example.


WITNESS LIST State Affairs Committee February 12, 2001-2:00P HB 64 For: Luna, Chris (Self) Miller, Laura (Self) Toney, Doug (Texas Daily Newspaper Association and Texas Press Association) Woodford, Suzy (Self and Common Cause Texas) Against: Hicks, Sharon (City of Abilene) Privett, Tony (City of Lubbock) Sturzl, Frank (Texas Municipal League) On: Lundquist, Karen (Texas Ethics Commission) Registering, but not testifying: For: Marsden, Julia (Self and League of Women Voters of Texas) Against: Sledge, Brian (City of Garland) HB 81 For: Hinojosa, Walter (Texas AFL-CIO) On: Moore, Mickey (Texas Retailers Association) Registering, but not testifying: For: Arterburn, David (Self) English, Jr., C. M. (Self) Landry, Richard (Pace International Union) Levy, Rick (Texas AFL-CIO and Texas Civil Rights Project) Willis, D. L. "Dally" (Texas Political and Legislative Committee of the Communications Workers of America) HB 409 For: Risk, Raymond (Texas Construction Association) Registering, but not testifying: For: Noble, Shannon (Texas Air Conditioning Contractor Association)


---
title: Gallery
description: A Picture Tells a Thousand Words. Scroll down to check out photos and videos of the awesome facilities available at Speedball
image: https://source.unsplash.com/BcoGknSqlDc/2000x1322?a=.png
image2: https://source.unsplash.com/1XVpwAHlSNs/2000x1322?a=.png
image3: /images/pexels-photo-102448.jpeg
---
A Picture Tells a Thousand Words
Scroll down to check out photos of the awesome facilities available at Speedball


 A similar ceremony to be observed with regard to the Hyena. A Baboon, when killed, resembles a man, in 'making cloud'. In the Katkop dialect, by Díä!kwãin (L V.-24. 5911-5916, 5911 rev., note). When a hyena has been killed, the bow is also cut with lines (as with killing a baboon) to remove the hyena's curse from the bow. This is so that the hyena's 'actions' will not be on the bow.
Comments
1) See also Cuts to be made on a bow when a baboon has been killed, 2) This story is found in Book V-24
Contributors
Date
January 1876
Categories
Custom and daily life, Portention
Keywords
hyena (its curse on the killing bow) , hyena (removing its 'actions' from a bow) , hyena (the cuts made on the bow when one has been killed) , hyena (the hunting of) , hyena (its actions) , hyena (its curse or bad influence) , hunting (observances) , hunting (fortunes) , hunting (the treatment of the bow) , hunting (removing the curse or bad influence of the hyena from the bow) , hunting (cutting and marking on bows) , hunting (methods) , hunting (and killing hyena) , bow (the treatment of) , bow (making cuts on, when a hyena has been killed) , bow (removing a hyena's curse or actions from) , curse (of the hyena; its bad influence or actions) , curse (removing the hyena's from the killing bow) , curse (making cuts on the bow when a hyena is killed) , weapons (making cuts on the bow when a hyena is killed) , ceremony (for removing the hyena's curse from the killing bow) , ceremony (making cuts on the bow when a hyena has been killed) , cutting (and marking a bow used to kill a hyena) , cutting (and removing the hyena's curse from the killing bow)
Story Pages
5911v


A little about Rusty
Get ready to learn about Rusty
A few of the favorite activites of Rusty include:
- Eating up small animals.
- Chasing after small boys and girls.
- Barking at everything he sees.
- Playing with other big animals.
Some of the toys Rusty likes include:
- Big bones.
- Chew toys.
- Plastic balls.