Announcing Our New Fully-Flexible Travel Policy!

 

 

Quick Links

LAND


Trip Planning by
Sage Traveling



SEA





Contact Us

info@sagetraveling.com

US: 1-888-645-7920
UK: +44 20 3540 6155

Subscribe to Our Newsletter!

Dear settachai,
I understand that uncertain times call for flexibility. This is why we are currently offering our clients a Fully-Flexible Travel Policy.


If for any reason you change your mind, just let us know with at least 30 days' notice before your tour, transfer or vacation package, and you will receive the full amount you have paid in a FULLY-TRANSFERABLE FUTURE TRAVEL VOUCHER (minus any unrecoverable expenses *). You may use the voucher to reschedule your existing trip or you may use it toward ANY TRAVEL PRODUCT in ANY DESTINATION that we offer **. If for some reason you are not able to use the voucher, it is transferable to a family member or a friend ***. The voucher is good for up to 3 years from the original departure date.

* Pre-paid entrance tickets and train tickets are not included. Cruise purchases are bound by cruise line cancellation policies.
** Trip can be rescheduled once without incurring a change fee. Additional rescheduling may incur change fees.
*** Future Travel Voucher can only be transferred to another individual once.



We've spent a lot of time looking at the various cancellation policies in the industry right now, and we think this is a good one! It has some features that many other policies don't:
1) It gives you 3 years to reschedule instead of the standard 2 years.
2) You can transfer your future travel voucher to another individual.
3) You can use the voucher in more than 50 countries (e.g. if Switzerland gets closed to outside visitors, you can switch your vacation to Jamaica).
4) It's a single cancellation policy across all of our destinations so it's simple to navigate.

I hope this helps your confidence in putting a vacation on your calendar! 


DID YOU KNOW?
With new social distancing measures in place throughout most of the world, new, smaller capacity limits are and will be set for several tourist attractions and sites. This means that booking far in advance will be key to securing that you get to experience your bucket list items when you travel. 
 

When you're ready, we'll be here! 

Travel Wisely,
John Sage, Founder and President of Sage Traveling


Phone: US: 1-888-645-7920, UK: +44 20 3540 6155
Web: http://www.sagetraveling.com

 
 
   

Exploring Monster Taming Mechanics In Final Fantasy XIII-2: The Remaining Tables

Continuing this miniseries of exploring the monster taming mechanics of Final Fantasy XIII-2, we'll finish off the remaining database tables that we want for the data relevant to monster taming. In the last article, we filled in a second table of passive abilities and connected those abilities to the monsters that had them through references in the monster table that used foreign keys to the ability table. In the first article, we had identified four tables besides the monster table that we would need as well, these being abilities, game areas, monster materials, and monster characteristics. We did the passive abilities table, but we still need a table for role abilities. In addition to this role ability table, we'll finish off the game areas, monster materials, and monster characteristics tables. These tables are all small, so we should be able to get through them without much effort.

Final Fantasy XIII-2 Battle Scene

The Monster Role Abilities

Unlike the passive monster abilities, of which there were 218, we only have 57 role abilities to worry about, and they can be found in this FAQ from Krystal109 on GameFAQs.com. Since these abilities are already in two HTML tables, it's easy to copy-and-paste them directly into a spreadsheet and tweak it the way we want it. I used Google sheets, and removed the "Best Infusion Source," "Learned by," and "Comments" columns because we don't need them. Then I split the merged cells in the "Role" column and copied the role names as necessary. Finally, I added a column for whether the ability is infusable or not, depending on which of the two tables it came from, before exporting the sheet to a .csv file.

But wait! There are actually 70 infusable role abilities in the Monster Infusion FAQ that we've been using, plus the non-infusable role abilities from the second HTML table, so we're missing a few. We are dealing with the common occurrence of incomplete data here. I had to cross-check the lists and add in the missing role abilities from the Monster Infusion FAQ. I ended up with 87 abilities in the end. This manual process is still probably faster than writing a script, but we're not sure, yet, if we have all of the non-infusable role abilities. We'll find out in a minute when we try to link up this data with the monster table.

Before we can add these associations, we have to generate a model of the role abilities table in Rails, like so:
$ rails g model RoleAbility name:string role:string infusable:boolean
This creates a migration that's all ready to run:
class CreateRoleAbilities < ActiveRecord::Migration[6.0]
def change
create_table :role_abilities do |t|
t.string :name
t.string :role
t.boolean :infusable

t.timestamps
end
end
end
Now we can add the import of the role abilities to the seeds.rb script right after the passive abilities import:
# passive abilities import from monster_abilities.csv
# ...

csv_file_path = 'db/monster_role_abilities.csv'

CSV.foreach(csv_file_path, {headers: true}) do |row|
role_ability = row.to_hash
role_ability['infusable'] = (role_ability['infusable'] == 'true')
RoleAbility.create!(role_ability)
puts "#{row['name']} added!"
end

# monster data import from monsters.csv
# ...
This import looks almost exactly like the passive abilities import, except that we need to convert the 'true' and 'false' strings for the infusable attribute into boolean values to match that attribute's data type. Once we have the role abilities imported and available, we need to add the associations to the monster table. We do this in a very similar way to how we did the passive ability associations, but this time it's simpler because we don't have to worry about red-locked abilities with the same base name as other abilities or ranks that complicated the passive abilities. We just have to find each role ability in each monster's set of skills and associate them by assigning the role ability to the right skill, like so:
CSV.foreach(csv_file_path, {headers: true}) do |row|
monster = row.to_hash

# ... associate passive abilities ...

monster.keys.select { |key| key.include? '_skill' }.each do |key|
if monster[key]
monster[key] = RoleAbility.find_by(name: monster[key])
if monster[key].nil?
puts "ERROR: monster #{monster['name']} #{key} not found!"
return
end
puts "Found #{key} #{monster[key].name}"
end
end

Monster.create!(monster)
puts "#{row['name']} added!"
end
Now, we can't run this seed script quite yet. We still don't have a database migration or the monster and role ability models set up to handle these associations, so let's do that tedious work. First, the monster table migration needs all of the skill attributes changed from t.string to t.references and add_foreign_key statements need to be added for each skill. There are about a hundred of these, so I'll just show an example of what they look like:
class CreateMonsters < ActiveRecord::Migration[6.0]
def change
create_table :monsters do |t|
# ... all of the other monster attributes ...
t.references :default_skill1
t.references :default_skill2
t.references :default_skill3
t.references :default_skill4
t.references :default_skill5
t.references :default_skill6
t.references :default_skill7
t.references :default_skill8
t.references :lv_02_skill
t.references :lv_03_skill
# ... etc ...
end

# ... passive ability foreign keys ...

add_foreign_key :monsters, :role_abilities, column: :default_skill1_id, primary_key: :id
add_foreign_key :monsters, :role_abilities, column: :default_skill2_id, primary_key: :id
add_foreign_key :monsters, :role_abilities, column: :default_skill3_id, primary_key: :id
add_foreign_key :monsters, :role_abilities, column: :default_skill4_id, primary_key: :id
add_foreign_key :monsters, :role_abilities, column: :default_skill5_id, primary_key: :id
add_foreign_key :monsters, :role_abilities, column: :default_skill6_id, primary_key: :id
add_foreign_key :monsters, :role_abilities, column: :default_skill7_id, primary_key: :id
add_foreign_key :monsters, :role_abilities, column: :default_skill8_id, primary_key: :id
add_foreign_key :monsters, :role_abilities, column: :lv_02_skill_id, primary_key: :id
add_foreign_key :monsters, :role_abilities, column: :lv_03_skill_id, primary_key: :id
# ... etc ...
end
end
With that done, we still need to add the role abilities to the monster model in app/models/monster.rb with belongs_to. Remember how it felt weird that we were saying a monster belongs to its abilities in the last article? Well, that's still the direction we want, so we'll do it again with role abilities, even though it sounds weird:
class Monster < ApplicationRecord
# ... passive ability belongs_to declarations

belongs_to :default_skill1, class_name: 'RoleAbility', optional: true
belongs_to :default_skill2, class_name: 'RoleAbility', optional: true
belongs_to :default_skill3, class_name: 'RoleAbility', optional: true
belongs_to :default_skill4, class_name: 'RoleAbility', optional: true
belongs_to :default_skill5, class_name: 'RoleAbility', optional: true
belongs_to :default_skill6, class_name: 'RoleAbility', optional: true
belongs_to :default_skill7, class_name: 'RoleAbility', optional: true
belongs_to :default_skill8, class_name: 'RoleAbility', optional: true
belongs_to :lv_02_skill, class_name: 'RoleAbility', optional: true
belongs_to :lv_03_skill, class_name: 'RoleAbility', optional: true
# ... etc ...
end
Finally, we need to add the has_many declarations to the role ability model (because each ability has many monsters, right?):
class RoleAbility < ApplicationRecord
has_many :default_skill1_monsters, :class_name => 'Monster', :foreign_key => 'default_skill1'
has_many :default_skill2_monsters, :class_name => 'Monster', :foreign_key => 'default_skill2'
has_many :default_skill3_monsters, :class_name => 'Monster', :foreign_key => 'default_skill3'
has_many :default_skill4_monsters, :class_name => 'Monster', :foreign_key => 'default_skill4'
has_many :default_skill5_monsters, :class_name => 'Monster', :foreign_key => 'default_skill5'
has_many :default_skill6_monsters, :class_name => 'Monster', :foreign_key => 'default_skill6'
has_many :default_skill7_monsters, :class_name => 'Monster', :foreign_key => 'default_skill7'
has_many :default_skill8_monsters, :class_name => 'Monster', :foreign_key => 'default_skill8'
has_many :lv_02_skill_monsters, :class_name => 'Monster', :foreign_key => 'lv_02_skill'
has_many :lv_03_skill_monsters, :class_name => 'Monster', :foreign_key => 'lv_03_skill'
# ... etc ...
end
Whew! We're finally ready to purge the database, run the migration again, and reseed the database, but remember to rename the monster table migration so that the timestamp in the filename is after the new role ability migration because the monster table migration needs to run last:
$ mv <old monster migration name> <new monster migration name>
$ rails db:purge
$ rails db:migrate
$ rails db:seed
After running these commands, we find that a bunch of non-infusable role abilities were missing from the list. Most of these were basic Commando commands like Attack, Ruin, Launch, and Blitz, or variations on Saboteur commands like Dispel II or Heavy Dispelga. When all missing abilities are found and fixed, we should have 127 role abilities. Then there are two typos in the Monster Infusion FAQ monster list that need to be fixed as well: an instance of "Deprotectga" instead of "Deprotega" and an instance of "Medigaurd" instead of "Mediguard." With that task done, we can call the role ability table complete. There are six hidden role abilities, one for each role type, but they are never referenced in the monster attributes because they are fixed by the role type of the monster. By infusing 99 levels worth of monsters of the opposite role type, (e.g. commando and ravager are opposites) the monster will acquire its hidden role ability. It's questionable whether adding them to the database is useful, so let's move on to game areas.

Making a Game Location Graph

You start the game in New Bodhum 003 AF. Actually, you start in Valhalla, but after getting through the intro segment with Lightning and a bunch of over-the-top cut scenes, the game really starts in New Bodhum with Serah. As you progress through the game, you unlock more and more new areas by jumping through time gates. Some locations have multiple time gates that lead to multiple new locations. Different monsters live in different locations, and which locations they live in is noted as one or more of the monsters' location attributes.

We want to capture the graph of these location dependencies in a database table and link the locations to the monster attributes so that we can figure out the earliest possible times in the game that we can acquire monsters with certain abilities. In order to do that, we're going to build a table to represent that graph. We could build this table in a couple of ways. One way is to make an adjacency matrix, but this representation requires a row and column for each node in the graph. In this case such a matrix would be sparsely populated, so we're going to use an adjacency list instead. Each row in the table will have one location's name, and which location leads to this location. Since each location has only one other location as a source, we can get away with this simple table structure. There are only a small number of locations, so the .csv file for this table can be created by hand. Plus, I couldn't find a good list on the internet, so here it is, created from scratch:
name,source
New Bodhum 003 AF,nil
Bresha Ruins 005 AF,New Bodhum 003 AF
Bresha Ruins 300 AF,Bresha Ruins 005 AF
Yaschas Massif 110 AF,Bresha Ruins 300 AF
Yaschas Massif 010 AF,Bresha Ruins 005 AF
Oerba 200 AF,Yaschas Massif 010 AF
Yaschas Massif 01X AF,Oerba 200 AF
Augusta Tower 300 AF,Yaschas Massif 01X AF
Serendipity Year Unknown,Yaschas Massif 01X AF
Sunleth Waterscape 300 AF,Bresha Ruins 005 AF
Coliseum ??? AF,Sunleth Waterscape 300 AF
Archylte Steppe ??? AF,Sunleth Waterscape 300 AF
Vile Peaks 200 AF,Archylte Steppe ??? AF
Academia 400 AF,Sunleth Waterscape 300 AF
Yaschas Massif 100 AF,Academia 400 AF
Sunleth Waterscape 400 AF,Yaschas Massif 100 AF
Augusta Tower 200 AF,Academia 400 AF
Oerba 300 AF,Augusta Tower 200 AF
Oerba 400 AF,Oerba 300 AF
Academia 4XX AF,Augusta Tower 200 AF
The Void Beyond ??? AF,Academia 4XX AF
Vile Peaks 010 AF,Academia 4XX AF
A Dying World 700 AF,Academia 4XX AF
Bresha Ruins 100 AF,A Dying World 700 AF
New Bodhum 700 AF,A Dying World 700 AF
Academia 500 AF,New Bodhum 700 AF
Valhalla ??? AF,Academia 500 AF
Coliseum ??? AF (DLC),New Bodhum 003 AF
Valhalla ??? AF (DLC),New Bodhum 003 AF
Serendipity ??? AF (DLC),New Bodhum 003 AF
As we've already done with the other tables, the first thing we need to do to import this .csv file is generate the model for this location table:
$ rails g model Location name:string source:references
Notice that we created the source attribute as a reference right away, and this reference that's being created is different than the others that we created for passive and role abilities. Whereas those references were associated with new tables, this source reference is associated with the location table itself. To construct this self-reference, we don't actually have to do anything to the migration. Rails does the right thing by default, so the migration is simple:
class CreateLocations < ActiveRecord::Migration[6.0]
def change
create_table :locations do |t|
t.string :name
t.references :source

t.timestamps
end
end
end
We also want to add references to the location attributes in the monster table, so we need to change that migration as well:
class CreateMonsters < ActiveRecord::Migration[6.0]
def change
create_table :monsters do |t|
t.string :name
t.string :role
t.references :location, foreign_key: true
t.references :location2, foreign_key: {to_table: :locations}
t.references :location3, foreign_key: {to_table: :locations}
# ... the mess of other attribute declarations ...
end

# ... a mess of foreign key declarations ...
end
end
Notice that for these location references, the foreign key is specified directly in the attribute declaration. I recently noticed that this was possible, and it's much cleaner than adding foreign keys at the end, so I'm switching to doing it this way.

The next step is to update the seeds.rb script for the location and monster models. Let's do the models first this time. The location model will need a self-reference for the source attribute and declare that it has many monsters for the location attributes in the monster model, like so:
class Location < ApplicationRecord
belongs_to :source, class_name: 'Location', optional: true
has_many :location_monsters, :class_name => 'Monster', :foreign_key => 'location'
has_many :location2_monsters, :class_name => 'Monster', :foreign_key => 'location2'
has_many :location3_monsters, :class_name => 'Monster', :foreign_key => 'location3'
end
The self-reference doesn't need to declare its foreign key because it's the same name as the name of the reference. Rails can infer the foreign key correctly in this case. Now for the monster model:
class Monster < ApplicationRecord
belongs_to :location, class_name: 'Location', optional: true
belongs_to :location2, class_name: 'Location', optional: true
belongs_to :location3, class_name: 'Location', optional: true
# ... a mess of other reference declarations ...
end
It makes a little more sense that a monster belongs to a location, so that's nice, but it's really just words. It's the direction of the associations that's important, and belongs_to means the reference is in the current model and points to the Location model, which is what we want. Finally, we can update the seeds.rb script to import locations. This update happens in two parts. First, we need to read from the .csv file we created:
# ... role abilities import from monster_role_abilities.csv ...

csv_file_path = 'db/monster_locations.csv'

CSV.foreach(csv_file_path, {headers: true}) do |row|
location = row.to_hash
location['source'] = Location.find_by(name: location['source'])
if location['source'].nil? && location['name'] != 'New Bodhum 003 AF'
puts "ERROR: location #{location['source']} not found!"
return
end
Location.create!(location)
puts "Location #{location['name']} added!"
end

# ... monster data import from monsters.csv ...
For this import, we're not only populating the table, but we have to correctly assign the self-references. To do that assignment, we had to make sure when writing the .csv file that every location that was referenced in a source attribute appeared before that reference as a named location. That way, when this script looks for a location in the source attribute, it will find it already exists as a location in the table. If there were loops, this import would require two passes to find all of the location names first before assigning references, but there are no loops so lucky us. I also check that each source location is actually found, in case I made any typos, but there is one intentional nil source for where you start the game in New Bodhum 003 AF.  That particular nil source needs to be handled specially. With the location table filled in, we can associate the location attributes in the monster table:
CSV.foreach(csv_file_path, {headers: true}) do |row|
monster = row.to_hash

# ... associate role abilities ...

monster.keys.select { |key| key.starts_with? 'location' }.each do |key|
if monster[key]
monster[key] = Location.find_by(name: monster[key])
if monster[key].nil?
puts "ERROR: monster #{monster['name']} #{key} not found!"
return
end
puts "Found #{key} '#{monster[key].name}'"
end
end

Monster.create!(monster)
puts "#{row['name']} added!"
end
This part of the script is exactly the same as it was for role abilities, just doing it for the location attributes instead. Now we can run this script again, making sure that the monster migration is still the most recent migration since it needs to be performed last:
$ mv <old monster migration name> <new monster migration name>
$ rails db:purge
$ rails db:migrate
$ rails db:seed
After running this script, I found a number of additional typos in the FAQ, so that data validation code is really coming in handy. I also caught an unexpected shortcut that the FAQ author took with locations. If a monster appears in two similar locations, they combined the years with a slash, e.g. "Bresha Ruins 100/300 AF." I had to split these out into two separate lines to adhere to our data model. Once that shortcut and the typos were fixed, the script ran to completion, and that's it for locations.

Wrapping up Monster Materials and Characteristics

This article is getting pretty long, so I'm going to finish off the monster materials and characteristics tables quickly. The characteristics is a straightforward table that doesn't require figuring out anything new. The materials table can also be straightforward, at least for now. The monster materials themselves constitute a simple table with a name, a grade of 1-5, and a type of either biological or mechanical. The trick is that we'll eventually want to know when in the game we can get each grade of monster material because they're used to upgrade our tamed monsters. The way to acquire those materials is by defeating other monsters in battle. The different materials are some of the loot that the monsters drop. This information is all in the Monster Infusion FAQ, but it would require another parser to extract it and import it into the monster table. We can do that later in the series, but right now I want to complete the tables and get on with starting to view the data so we'll just go with making the simple material table.

A table of the materials can be found in the same HTML FAQ from Krystal109. Like the first set of role abilities, we can copy this table into a spreadsheet and then export it to a .csv file. Then we run through the same steps of importing this data into our Rails database, starting with generating a material model:
$ rails g model Material name:string grade:integer material_type:string
The migration is created without need for modification, and right now, this will be a stand-alone table so there's no need to change any model code. All that's left is to import the .csv file in the seeds.rb script:
# ... location import from monster_locations.csv ...

csv_file_path = 'db/monster_materials.csv'

CSV.foreach(csv_file_path, {headers: true}) do |row|
Material.create!(row.to_hash)
puts "Material #{row['name']} added!"
end

# ... monster data import from monsters.csv ...
Then we can do the same thing with the monster characteristics table also found in the HTML FAQ from Krystal109. Do the same drill of copying the table into a spreadsheet and then exporting it to a .csv file before generating another model for this table:
$ rails g model Characteristic name:string description:string
Finally, add this data import to the seeds.rb script:
# ... material import from monster_materials.csv ...

csv_file_path = 'db/monster_characteristics.csv'

CSV.foreach(csv_file_path, {headers: true}) do |row|
Characteristic.create!(row.to_hash)
puts "Characteristic #{row['name']} added!"
end

# ... monster data import from monsters.csv ...
And we're ready to run the migration and import:
$ rails db:purge
$ rails db:migrate
$ rails db:seed
The purge is done first to clean out everything that we already had in the database. Otherwise, when we run it again now, we'll be duplicating all of the other data that we already imported in the seeds.rb script on previous runs. Running this sequence of commands will build a fresh database from scratch, and it should finish cleanly in one shot.

That last step will wrap up the database design and building, for now. We'll have a bit of work to do later when we want to connect the monster materials to the monsters that drop them, but this is good enough to get started with creating views of this data. After spending multiple articles parsing, exporting, importing, and creating data for the database, I'm anxious to get moving on those views, so that's what we'll start looking at next time.

Streaming, Gaming And Podcasting

I had an opportunity last night to be interviewed by Hobbs of Hobbs & Friends, a long runing RPG/OSR-friendly podcast. We were talking about Three Hexes, as well as talking about how to transition between mass combat and 1:1 D&D scale - a subject that is near and dear to my heart!

The way Hobbs does it, he streams as he records his podcast, giving his audience a chance to interact and see things as they're done. Here's a link to the stream video!

Watch Hobbs & Friends #60 from Hobbs665 on www.twitch.tv

It had never occurred to me to do this, but the folks that were there had great feedback and questions, which made the whole thing a ton of fun! I enjoyed it so much that I think I'm going to do that as well.

If you'd like to see these streams, here's my own channel!

Watch live video from Chgowiz on www.twitch.tv

I have been a lot more busy with gaming during this time than I had planned! Between the games all going virtual for the time being, I'm also volunteering to run more games at conventions or just as pop-up events. I have a dungeon delve tomorrow (Sat 4/4) at 9am Central (UTC -6). Then, on next Sat 4/11, I'm going to be running a one-shot OD&D game for folks from the OD&D 74 Proboards forum! We'll be taking a dive into B1 - In Search of the Unknown... with some twists and turns that I'll be dropping in! Muahahaha... Come play!

The Rocket Raid

Erika and I raced across the Celadon Shopping Plaza, pushing our way through the panicked crowds. A voice on the loud speaker urged people to remain calm and remain indoors, but it felt like they were doing anything but remaining calm. There was no further explanation given for the alarm blazing around us, but Erika and I knew it had to be related to Team Rocket. We burst out of the shopping center into the midday sun.
The streets were just as chaotic. People were dashing every which way, ducking into buildings and out of sight. Team Rocket members had their Pokémon out in the streets and were attempting to herd civilians to some nefarious end, but we couldn't stop to help everyone or we would never make it to Blue's assault in time. There was no sign of local authorities. Erika and I rushed down the busy streets towards her gym, but about halfway there we ran into her gym trainers and the other trainers who were waiting with them. Blue was nowhere to be seen.
"Right now, Rocket controls the streets," Erika spoke loudly to the group. "I want my gym trainers to make a sweep of the city. Knock out their Pokémon and subdue any Rocket members you can until police arrive. I don't think they will move against Team Rocket until they absolutely have to, which is what we're going to make sure of today." The trainers from her gym nodded and began to organize into teams to sweep through the city streets. "The rest of you, come with me!" Erika ordered. She abruptly turned and began running east. The rest of us followed on her heels.
Erika led our group toward the Celadon Game Corner as frightened citizens did everything in their power to run away from it. As we turned the corner on to the street where the Game Corner was located, I spotted Blue. In front of him was a massive Charizard pinning two Rocket grunts to the ground, with menacing flames spouting in bursts from its mouth in their general direction.
"Just in time," he said as Erika ran up to him.
"You started without us!" she managed to gasp while trying to catch her breath after our brisk run across town.
Blue chuckled. "An opportunity presented itself." He motioned to the two pinned grunts. "I didn't count on the Game Corner tripping an alarm, though. They must think I'm here to rob them. Whatever. At least it will summon the police whenever they feel like helping out."
"So what's the plan?" I asked. Blue glanced at me as if he had never seen me before.
"These goons told me how to get inside their headquarters. There are four underground floors with a lift going directly to a secret lab as well as their boss's office. I want you three to come with me." He motioned to me, Erika and another female trainer I'd never noticed before. "We will split up, subdue any threats, and find that lift key. Each one of us will take a floor on our own and secure it. Everyone else stay out here with these two clowns." He motioned at his captives. "Stop any Rocket members who try to escape the building. Protect the citizens of the city at all cost, even if it means letting some Rocket go. Make sure innocent people aren't hurt or harassed by our Pokémon or Team Rocket. When the police do arrive, cooperate but also try and stall them from interfering inside until we return. We don't know who we can trust, or who is on Rocket's payroll. I don't want any Rocket goons slipping out of this snare."
Blue withdrew his Charizard and entered the Game Corner. The two goons that were released from Charizard's grasp made an attempt to flee, but they were quickly surrounded by the other trainers and their Pokémon. The two young ladies Blue had instructed followed him inside, and I took up the rear guard. Inside we found more people in full panic mode, but Blue barked at them that we weren't here to harm or rob them and marched to the back of the game hall. Everyone in the Game Corner looked as scared as I felt inside. I glanced around at them nervously, clutching a Poké Ball tightly in my hand. Blue tore a poster down from the back wall revealing a switch. He flipped it and a door slid open revealing a set of stairs that went down into the basement of the Game Corner. I shook my head in disbelief. I couldn't believe I was part of this. My heart was racing as I followed Blue down those stairs into a gangster hideout.
"Fox, you take this floor. Erika, you're in charge of the next one. Green, you'll take the third floor down and I'll take the final floor. If you find a key to the lift, come find me and we'll take down the boss together," Blue said as we reached the first landing. I took a deep breath and nodded to him. He and the girl named Green continued on down the stairs to the next floor. Erika lingered a moment and placed her fingers gently on my hand that was clutching a Poké Ball like my life depended on it. Her reassurance allowed me to relax a little. She gave me a quick nod and a smile and then disappeared down the darkness below.

I cautiously stepped out of the stairwell and into a small hallway. The lights flickered dimly, but I could make out a Rocket member standing in an open doorway to my left. He spotted me almost immediately, but I assume he didn't quite know what to make of a 17-year old kid stepping into his headquarters.
"Are you lost, kid? You can't be here!" he shouted at me. "Go back upstairs to the Game Corner." I responded by tossing out Royal's Poké Ball and watching the Rocket grunt's expression change from irritation to panic as Royal let out a mighty roar. He nearly took up the entire hallway. The grunt rushed into the hallway and nervously tossed out a Drowzee. I knew full well what a threat a well trained Drowzee could be, but if I had learned anything about Team Rocket in my time in Kanto, it was that most of their Pokémon weren't properly trained. Royal chomped down hard on the Drowzee knocking it out in a single bite.
"Surrender," I pleaded. The grunt responded by tossing out a Machop who was swiftly defeated by Royal. "You won't win. We have this place surrounded," I said confidently. Royal edged forward backing the grunt up into the room he had been guarding. I peeked inside and saw what appeared to be a small lounge with another door leading out the back. The grunt ran to the door, but it appeared to be locked. If he had the key, he didn't use it. With Royal watching the door, he was trapped unless someone unlocked that door from the other side.
"Hey! What's going on?" came a shout from the other end of the hall. A Rocket grunt rushed out of the other room into the hallway and stopped short when he saw me and my enormous Gyrados clogging up the end of the hallway. "Wait. I know you. I remember you from Mount Moon." His words struck me like lightning, because I recognized him, too. He was the trainer of the Dread Rocket Raticate that put Nibbles out of commission. Prior to this realization I had felt sick with anxiety, but now I was swelling with rage and excitement.
"Watch the door," I instructed Royal. "We'll take care of this." In a flash of light, Rascal Jr. was at my side and ready to get our revenge. The Team Rocket grunt I'd faced off against at Mount Moon tossed out what I dubbed the Dread Rocket Raticate. I knelt down to be closer to Rascal Jr. "I know you never knew Nibbles, but we're doing this for him. We have to prove just how far we've come." Rascal Jr. squeaked his acknowledgment and rushed forward.
Rascal was faster and stronger. At every turn, he outmatched his opponent. He got in a quick tail whip to disorient the
Dread Rocket Raticate, then would dart in for a quick attack, dashing back out to avoid a hyper bite. I smiled smugly. Although I had defeated this Rocket grunt at Mount Moon it had come at a great cost. Seeing how far I'd come since then, with my own well-trained Raticate, filled me with a surge of pride in myself as a trainer and in my team. Rascal Jr. ended this contest with a hyper bite of his own that soundly defeated the Dread Rocket Raticate without even taking a single scratch.
The Rocket grunt shook his head and joined his friend behind Royal in the locked lounge. I quickly surveyed the rest of the floor and found it empty. I had done my part. This floor was secure and as a bonus I got to rematch an earlier nemesis of mine. It felt good. Royal and I sat in the locked lounge awaiting Blue's return.

The door at the back of the lounge unlocked with a loud click. The two Rocket grunts jumped to their feet as if they were about to be rescued. Royal edged closer to me from behind, but it was Blue who walked through the door. Behind him I could see the lift and I knew Blue had come up from the bottom floors after finding the lift key.
"We're done here," Blue announced. "I see you have this floor under control. Green and Erika are bringing up the others and we'll hand them over to the authorities. You wouldn't believe what I saw down there," Blue said motioning behind him. "They were running some kind of experiments on Pokémon. Really twisted stuff. The police are going to have a field day. Still, I think we were a bit too late. Their boss wasn't here and a lot of the experiments look like they were moved to another site."
"Wow," I managed to say. "Still. We did it. We took down their headquarters. They'll have a hard time recovering form this." Blue nodded in agreement and together with the grunts we made our way back out of the headquarters.
Emerging in the late afternoon sun, we were greeted by the flashing lights of the police. Many of them looked cross, others flustered, but they were arresting the right people at least. Members of Team Rocket were lined up in handcuffs and being escorted to police cars and vans. The young trainers who had been assembled to take down Team Rocket were all giving detailed statements to the police. Though they might have charged the four of us who actually went inside with trespassing, whatever crimes we may have committed were dismissed in favor of prosecuting Team Rocket. Inside they found stolen equipment, stolen Pokémon and the unethical experiments Blue had mentioned to me.
We were detained by the police long into the night to make sure they had all our statements accurately recorded, then they let us go. Blue and I were the last to be released. Erika and her gym leaders had been among the first due to her social standing in the community. As we left the police station, Blue stopped me and shook my hand.
"I want you to have this," he said handing me a strange headset with his other hand. "I may have picked this up from some of the stolen lab equipment inside."
"You stole evidence?" I asked. "What is it?"
Blue laughed. "Yeah, but we'll give it back to its rightful owners eventually, right? You're going to need this for your research in Lavender Town. It's a Silph Scope - made by the Silph Company. You won't get far in the Pokémon Tower without it. Trust me. I had a bad experience in there before bumping into you outside."
"Thanks, Blue," I said earnestly. He shrugged and walked off. He looked as exhausted as I felt as he disappeared into the dark city streets. This was by far the craziest day I'd spent in Kanto and I'm still honored to be part of the team that took down Team Rocket.

Current Team:
Attacks in Blue are recently learned.


Bill's Storage: Kiwi (Pidgeotto) & Vesper (Zubat)

Old Man Daycare: Charlie (Pidgey)

Chic Collection: Rug & Painting

 


Continue Reading »

EA Cricket 2018 Download For Free Full Version

EA Cricket 2018 Download For Free Full Version




SCREENSHOT



System Requirements Of Cricket 2018 Download Free

  • Tested on Window 7 64 Bit
  • Operating System: Window XP/ Vista/ Window 7/ Window 8 and 8.1/10
  • CPU: 2.0 GHz Intel Pentium 4 or later
  • RAM: 512 MB
  • Setup size: 1.1 GB
  • Hard Disk Space: 4 GB






abcs