Submit Your Article


 
RPG Maker

Welcome Guest ( Log In | Register )


  Games Resources RPG Maker VX RPG Maker XP Scripts Tutorials Downloads

 
Reply to this topicStart new topic
> Crafting Recipes: What am I doing wrong?, I followed the instructions for making recipes, but only one shows up.
Phantomaang
post May 25 2011, 09:09 PM
Post #1


Level 3
Group Icon

Group: Member
Posts: 42
Type: Developer
RM Skill: Beginner




Just like the title says. Okay, here's the recipes instructions from the advanced crafting system.

Hide/Show
#------------------------------------------------------------------------------
#
# This class defines a recipe object for use with the crafting system
#
#------------------------------------------------------------------------------

class Recipe

attr_reader :name
attr_reader :createdAmount
attr_reader :criticalName
attr_reader :criticalItem
attr_reader :critAmount
attr_reader :numOfIngredients
attr_reader :ingredients
attr_reader :ingAmounts
attr_reader :itemCreated
attr_reader :criticaled
attr_reader :difficulty
attr_reader :bonusStat
attr_reader :disabledReason
attr_reader :category

#-----------------------------------------------------------------------------
#
# name: Name of item that the recipe makes
# ingredients[]: An array of the ingredients used to make the item
# ingAmounts[]: An array containing the amount of each ingredient needed
# itemCreated: An int representing the item to be created
# createdAmount: The amount of items to be created by the recipe normally
# criticalItem: The item that is created if the recipe is a critical success
# critAmount: Amount of the critical item created on a critical success
# critChance: Chance this recipe will be criticaled. This is modded by
# the party's average intelligence when the crafting system
# creates the recipe.
# difficulty: int 0 to 9 where 0 is easiest and 9 is most difficult
#-----------------------------------------------------------------------------
def initialize( name, ingredients, ingAmounts, itemCreated, createdAmount,
criticalItem, critAmount, critChance, difficulty, bonusStat,
bonusInterval, category)
@name = name
@ingredients = ingredients
@numOfIngredients = ingredients.length
@ingAmounts = ingAmounts
@itemCreated = itemCreated
@createdAmount = createdAmount
@criticalItem = criticalItem
@criticalName = criticalItem.name
@critAmount = critAmount
@critChance = critChance
@difficulty = difficulty
@bonusStat = bonusStat
@bonusInterval = bonusInterval
@category = category
@discovered = false

#--------------------------------------------------------------------------
# Recipe behavior customization starts here.
#
# @allowDiscoveryByItems: Allows recipes to be discovered when
# ingredients of the recipe have been found
# @requireAllItems: Requires all items of a recipe to be found
# before the recipe will be revealed.
# @allowStatBonuses: Allows bonus critical chance from the party's
# current stats.
# @requireStatThreshold: Requires an amount of the bonus stat in order
# to craft the item.
# @requireTools: Requires the presence of crafting tools to
# make an item.
#--------------------------------------------------------------------------
@allowDiscoveryByItems = true
@requireAllItems = false
@allowStatBonuses = true
@requireStatThreshold = false
@requireTools = true
end

#----------------------------------------------------------------------------
# Determines if the item is currently able to be crafted by the party
#----------------------------------------------------------------------------
def isCraftable?

#check to see if the party has enough of each needed ingredient
for x in 1..@numOfIngredients
if $game_party.item_number(@ingredients[x-1]) < @ingAmounts[x-1]
@disabledReason = "You don't have enough of the required ingredients!"
return false
end
end

#check to see if the party has the right tools
if @requireTools
requiredTools = $game_crafting.tools(@category)
for tool in requiredTools
if not $game_party.has_item?($data_items[tool])
@disabledReason = "You don't have a required tool!"
return false
end
end
end

#now check to see if the party has the neccessary stat
if @requireStatThreshold
avgStat = totalStat / $game_party.members.length
if avgStat < $game_crafting.difficulties(@bonusStat)[@difficulty]
case @bonusStat
when 0
@disabledReason = "The party is not strong enough to make this item yet!"
when 1
@disabledReason = "The party is not hardy enough to make this item yet!"
when 2
@disabledReason = "The party is not smart enough to make this item yet!"
when 3
@disabledReason = "The party is not swift enough to make this item yet!"
end
return false
end
end

#if we didn't return yet, then the party has enough of each ingredient
#and is smart enough to figure out how to put everything together
return true
end

#----------------------------------------------------------------------------
# Determines if the recipe has been discovered by the party.
# Recipes reveal when at least one ingredient is discovered or if they
# Are found in the gameworld from a book, npc or other method
#----------------------------------------------------------------------------
def isDiscovered?
#check the flag first!
if @discovered
return true
end

#now check inventory for at least one item of each ingredient. include
#equiped items! If we have it, then set the flag before returning.
if @allowDiscoveryByItems
totalItemsFound = 0
for x in 1..@numOfIngredients
if $game_party.has_item?(@ingredients[x-1], true)
totalItemsFound += 1
if not @requireAllItems
@discovered = true
return true
end
end
end
if totalItemsFound == @numOfIngredients
@discovered = true
return true
end
end

#discovered flag is false and the party doesn't have any of the ingredients
return false
end

#----------------------------------------------------------------------------
# These methods check the created item's type
#----------------------------------------------------------------------------
def makesWeapon?
return @itemCreated.is_a?(RPG::Weapon)
end

def makesArmor?
return @itemCreated.is_a?(RPG::Armor)
end

def makesItem?
return @itemCreated.is_a?(RPG::Item)
end

#----------------------------------------------------------------------------
# this will set discovered to true. this is so game NPCs, books or other
# events can grant recipes that the party does not have ingredients for yet
#----------------------------------------------------------------------------
def setDiscovered
@discovered = true
end

#----------------------------------------------------------------------------
# This will execute the crafting recipe, removing the components and adding
# the result to the party's inventory
#----------------------------------------------------------------------------
def make
#remove ingredients
for x in 1..@numOfIngredients
$game_party.lose_item(@ingredients[x-1], @ingAmounts[x-1])
end

#calc critical chance
totalCritChance = calcCriticalChance

#make item!
if rand(100) < totalCritChance
$game_party.gain_item(@criticalItem, @critAmount)
@criticaled = true
else
$game_party.gain_item(@itemCreated, @createdAmount)
end
end

def calcCriticalChance
if @allowStatBonuses
# set stat bonus
avgStat = (totalStat / $game_party.members.length)
statBonus = avgStat - $game_crafting.difficulties(@bonusStat)[@difficulty]
statBonus /= @bonusInterval
totalCritChance = @critChance + statBonus
else
totalCritChance = @critChance
end
if totalCritChance > 100
totalCritChance = 100
end

return totalCritChance
end

#----------------------------------------
# Returns the party's total intelligence
#----------------------------------------
def totalStat
x = 0
total = 0
case @bonusStat
when 0
while x < $game_party.members.length
total += $game_party.members[x].base_atk
x += 1
end
when 1
while x < $game_party.members.length
total += $game_party.members[x].base_def
x += 1
end
when 2
while x < $game_party.members.length
total += $game_party.members[x].base_spi
x += 1
end
when 3
while x < $game_party.members.length
total += $game_party.members[x].base_agi
x += 1
end
end

return total
end

#---------------------------------------
# Returns the recipe icon index
#---------------------------------------
def icon_index(critical = false)
if critical
return @criticalItem.icon_index
else
return @itemCreated.icon_index
end
end

#--------------------------------------------
# Resets the recipe critical flag to normal
#--------------------------------------------
def resetCriticaled
@criticaled = false
end

end


Here's my customized recipe category list.

Hide/show
#--------------------------------------------------------------------
#
# This class implements the custom crafting system. The instanced
# variable name is $game_crafting
#
#--------------------------------------------------------------------

class Game_Crafting

attr_reader :categoryLabels
attr_reader :categoryText
attr_accessor :categoryStates

#----------------------------------
# Init the system.
#----------------------------------
def initialize
initRecipes
initDifficulties
initCategories
end

#-----------------------------------------------------------------------------
# creates the array for difficulty level comparisons.
# Current party must have an average of this int in order to make the item
#-----------------------------------------------------------------------------
def initDifficulties
@atkThresholds = [25, 40, 55, 70, 85, 100, 115, 130, 145, 160]
@defThresholds = [25, 40, 55, 70, 85, 100, 115, 130, 145, 160]
@spiThresholds = [25, 50, 75, 100, 125, 150, 175, 200, 225, 250]
@agiThresholds = [25, 50, 75, 100, 125, 150, 175, 200, 225, 250]
end

#-----------------------------------------------------------------------------
# Defines the text and required tools of each category
#-----------------------------------------------------------------------------
def initCategories
#---------------------------------------------------------------------------
# Type in the names of your crafting categories here. As you can see, you
# are not required to use all 10 spaces! Just make sure to have a comma
# after the quotations for every item EXCEPT the last.
#---------------------------------------------------------------------------
@categoryLabels = [ #Category 0
"Cooking",

#Category 1
"Sewing",

#Category 2
"Pharmacy",

#Category 3
"Jewelry",

#Category 4
"Rock Polishing",

#Category 5
"Battle Items",

#Category 6
"Materials",

#Category 7
#Category 8
]
#---------------------------------------------------------------------------
# Each number refers to the RPG::Item index of the required tool. You
# should have the same number of categories here as you did above!
# Make sure there is a comma after every bracket pair [] EXCEPT the last!
#---------------------------------------------------------------------------
@requiredTools = [ #Category 0
[73,74,75],

#Category 1
[77,76],

#Category 2
[80,81,82],

#Category 3
[83,84,85],

#Category 4
[88,89],

#Category 5
[86,87],

#Category 6
[86,87],

#Category 7
#Category 8
]
#---------------------------------------------------------------------------
# This is the text that appears in the help box of the crafting menu
# when hovering over a category label. Same rule for commas!
#---------------------------------------------------------------------------
@categoryText = [ #Category 0
"Cook up great concoctions and delicacies.",

#Category 1
"Sew your own clothes.",

#Category 2
"Brew drinks, medicine, and other useful substances.",

#Category 3
"Polish beautiful gems and create jewelry.",

#Category 4
"Shine up rocks to reveal beautiful gems",

#Category 5
"Create items of mass destruction. Meant for battle.",

#Category 6
"All other materials for crafting are created here.",

#Category 7
#Category 8
]
@categoryStates = []
end

#---------------------------------------------------------------------------
# Get the recipe list from the file (include a recipes.txt in Data folder)
#----------------------------------------------------------------------------
def initRecipes
@recipes = []
x = 0
fileName = "Data/recipes.txt"

if File.exists?(fileName)
recipeFile = File.new(fileName, "r")
buildRecipeList(recipeFile)
exportData
else
@recipes = load_data("Data/recipes.rf")
end
end

def buildRecipeList(recipeFile)
while (line = recipeFile.gets)
thisRecipe = createNewRecipe(line)
@recipes.push(thisRecipe) unless thisRecipe == nil
end
end

def exportData
fileName = "Data/recipes.rf"
if File.exists?(fileName)
File.delete(fileName)
end
file = File.new(fileName, "wb")
Marshal.dump(@recipes, file)
end
#----------------------------------------------------------------------------
# returns a new Recipe object. the recpies.txt file should have data in the
# following format:
#
# name: Name of the item being created
# itemType: 0 for item, 1 for weapon, 2 for armor. The normal
# and critical form MUST be the same item type!
# numOfIngs: number of different ingredients from 1 to 9
# ingreds 01..2999: the item indexes of the ingredients. the first
# character determines the item type for each
# ingredient. 0 for item, 1 for weapon, 2 for armor
# amounts 1..999: amount of each ingredient
# normalItem: index of item created on normal success
# normalAmount: amount of normal item created on success
# criticalItem: item created from a critical success
# critAmount: amount of crit item created
# critChance: chance to crit (out of 100)
# difficulty: integer 0 to 9 where 0 is easiest and 9 is hardest
# bonusStat: The statistic that will be used to calculate the
# bonus critical chance. 0 for attack, 1 for defense,
# 2 for spirit, 3 for agility.
# bonusInterval: The amount of the bonus stat it takes to get a 1%
# higher critical chance
# category: The type of crafting (smithing, woodworking, etc.)
# As an integer from 0 to 9!
#
# The file allows for empty lines and comments using '#' to start a line
# Here's some example lines from the file:
#
# #Leather Working
# Rough_Leather 0 1 0204 2 205 1 205 3 10 0 2 10 1
#
# NOTE: whitespace in the name must be replaced with underscores!!!
#
#----------------------------------------------------------------------------
def createNewRecipe(stringToParse)
#first check for nil and comments
return nil if stringToParse == nil
return nil if stringToParse.strip.empty?
return nil if stringToParse.lstrip.index("#") != nil

#first parse out the text info
#split at the whitespace
attributes = stringToParse.split

name = attributes[0].gsub("_", " ") #the first position is name
itemType = attributes[1].to_i #2nd is item type
numOfIngs = attributes[2].to_i #3nd position is the num of ingredients
x = 0
ingreds = [] #ingredients start at the 3rd position
while x < numOfIngs
number = attributes[x + 3]
ingredientType = number[0,1].to_i
index = number[1,number.length - 1].to_i
case ingredientType #switch for ingredients
when 0
ingreds.push($data_items[index])
when 1
ingreds.push($data_weapons[index])
when 2
ingreds.push($data_armors[index])
end
x += 1
end
y = 0
amounts = [] #amounts start after the ingredients
while y < numOfIngs
amounts.push(attributes[x + y + 3].to_i)
y += 1
end
currentIndex = x + y + 3
case itemType #switch for resulting items
when 0
normalItem = $data_items[attributes[currentIndex].to_i]
criticalItem = $data_items[attributes[currentIndex + 2].to_i]
when 1
normalItem = $data_weapons[attributes[currentIndex].to_i]
criticalItem = $data_weapons[attributes[currentIndex + 2].to_i]
when 2
normalItem = $data_armors[attributes[currentIndex].to_i]
criticalItem = $data_armors[attributes[currentIndex + 2].to_i]
end
normalAmount = attributes[currentIndex + 1].to_i
critAmount = attributes[currentIndex + 3].to_i
critChance = attributes[currentIndex + 4].to_i
difficulty = attributes[currentIndex + 5].to_i
bonusStat = attributes[currentIndex + 6].to_i
bonusInterval = attributes[currentIndex + 7].to_i
category = attributes[currentIndex + 8].to_i

#next, create the Recipe object, initialize it and return it!
thisRecipe = Recipe.new(name, ingreds, amounts, normalItem, normalAmount,
criticalItem, critAmount, critChance, difficulty,
bonusStat, bonusInterval, category)
return thisRecipe
end

#----------------------------------------------------------------------------
# Returns the array of recipes that are available
#----------------------------------------------------------------------------
def recipeList
return @recipes
end

#----------------------------------------------------------------------------
# Discovers the recipe at recipeIndex
#----------------------------------------------------------------------------
def discover(recipeIndex)
@recipes[recipeIndex].setDiscovered
end

#----------------------------------------------------------------------------
# Returns the difficulties of the specified stat
#----------------------------------------------------------------------------
def difficulties(stat)
case stat
when 0
return @atkThresholds
when 1
return @defThresholds
when 2
return @spiThresholds
when 3
return @agiThresholds
end
end

#----------------------------------------------------------------------------
# Returns the array of required tools for the specified category
#----------------------------------------------------------------------------
def tools(category)
return @requiredTools[category]
end

#----------------------------------------------------------------------------
# Returns the name of the statistic being requested
#----------------------------------------------------------------------------
def statName(stat)
case stat
when 0
return "Attack"
when 1
return "Defense"
when 2
return "Intelligence"
when 3
return "Agility"
end
end
end



And here's my recipe file.

Hide/Show
#Cooking
Leek_Soup 0 2 064 2 142 1 144 1 144 2 30 0 0 1 0
Mushroom_Soup 0 1 011 2 062 1 062 3 30 0 0 1 0
Spinach_Soup 0 2 096 2 142 1 105 1 105 2 25 0 0 1 0
Chicken_Soup 0 2 097 2 142 1 103 1 103 2 25 0 0 1 0
Chicken_Noodle_soup 0 3 097 1 140 1 142 2 102 1 102 2 0 0 1 0
Clam_Chowder 0 4 098 3 122 2 142 1 10 1 172 1 172 2 27 0 0 1 0
Tomato_Soup 0 2 094 3 119 1 106 1 106 2 25 0 0 1 0
Salad 0 3 108 2 094 1 096 2 107 1 107 3 25 0 0 1 0
Cake 0 7 109 1 117 2 118 1 119 1 030 2 122 1 151 1 099 1 099 2 20 0 0 1 0
Strawberry_Cake 0 2 099 1 023 3 100 1 100 2 20 0 0 1 0
Icing 0 2 148 2 122 1 109 1 109 3 18 0 0 1 0
Ice_Cream 0 3 112 3 118 2 122 1 111 1 111 2 28 0 0 1 0
Banana_Split 0 2 111 1 113 2 137 1 137 2 23 0 0 1 0
Cream_Cheese 0 2 120 1 153 1 154 1 154 2 20 0 0 1 0
Bagles 0 1 133 2 155 1 155 2 20 0 0 1 0
Whipped_Cream 0 1 153 2 110 1 110 2 20 0 0 1 0
Strawberry_Shortcake 0 3 110 1 099 1 23 2 101 1 101 2 18 0 0 1 0
Spaghettie 0 3 161 2 140 1 156 1 139 1 139 2 23 0 0 1 0
Pasta 0 2 095 1 157 1 140 1 140 3 15 0 0 1 0
Red_Sauce 0 1 094 2 161 1 161 2 19 0 0 1 0
Cooked_Ground_Beef 0 1 147 1 156 1 156 2 19 0 0 1 0
Fried_Egg 0 2 030 1 151 1 158 1 158 2 22 0 0 1 0
Leek_Tea 0 2 157 1 064 1 063 1 063 2 25 0 0 1 0
Spearmint_Tea 0 2 157 1 004 1 159 1 159 2 20 0 0 1 0
Candy 0 1 118 1 160 1 160 3 35 0 0 1 0
Lemonade 0 3 157 1 118 1 124 1 162 1 162 2 20 0 0 1 0
Root_Beer 0 1 009 2 163 1 163 2 29 0 0 1 0
Steak 0 1 147 1 157 1 157 2 23 0 0 1 0
Sushi 0 1 035 1 141 1 141 3 22 0 0 1 0
Fish_Filet 0 1 035 2 134 1 134 2 20 0 0 1 0

#Sewing

#Pharmacy

#Jewelry

#Rock Polishing

#Battle Items

#Materials


Here's what happens. I made Mushroom_Soup, right? Everything's fine. Except the fact that next to ingredients and what it makes, the icons are mismatched, but I can live with that.
I thought I followed the instructions for everything else, but none of the other recipes are popping up when I meet all the requirements in-game for a recipe to show up. What gives? Am I just missing something really obvious? Or is there a certain place this has to be put for the script to work? (I have a feeling it's my recipe making that screwed it up.)


__________________________
My current game project: Moranson Chronicles
Go to the top of the page
 
+Quote Post
   
Phantomaang
post May 28 2011, 01:18 PM
Post #2


Level 3
Group Icon

Group: Member
Posts: 42
Type: Developer
RM Skill: Beginner




Bump.


__________________________
My current game project: Moranson Chronicles
Go to the top of the page
 
+Quote Post
   
Destinynite1
post May 28 2011, 03:28 PM
Post #3


Level 11
Group Icon

Group: Revolutionary
Posts: 193
Type: Developer
RM Skill: Masterful




Try using this program. http://www.rpgrevolution.com/forums/index....amp;hl=Crafting

This allows for MUCH faster recipe making and easier and simpler viewing for your recipes. Just follow the directions and it'll load the recipes. I ran into the same problem you did and for some reason this fixed it.


__________________________
Current Project


1. Legends of the Four

Database - 75%
Scripting -55%
Storyline - SCRAPED (OPEN WORLD)
Character Skills - 100%
Monster Skills - 60%
Item Creation Skills- 45%
Everything else - No idea xD

Go to the top of the page
 
+Quote Post
   
Phantomaang
post May 28 2011, 04:01 PM
Post #4


Level 3
Group Icon

Group: Member
Posts: 42
Type: Developer
RM Skill: Beginner




QUOTE (Destinynite1 @ May 28 2011, 04:28 PM) *
Try using this program. http://www.rpgrevolution.com/forums/index....amp;hl=Crafting

This allows for MUCH faster recipe making and easier and simpler viewing for your recipes. Just follow the directions and it'll load the recipes. I ran into the same problem you did and for some reason this fixed it.

Wow... Thank you so much! If I'd only known this existed. ^^;; There go hours of recipe work. But now it'll only take like, 30 minutes! Thanks so much.


EDIT
Ehhh, strike that. I'm getting some major errors here.;



Okay, I just started using this, and I'm glad it's so easy to use, but I keep running into various errors. I've only made three recipes, and this error pops up when I go to crafting-> Cooking (my first option)-> and then click to see my learned recipes. It pops up with

Hide/show
Script 'Recipes' line 85 argumentError occurred.
Comparison of fixnum with string failed


Line 85 is

#check to see if the party has enough of each needed ingredient
for x in 1..@numOfIngredients
(Here.) if $game_party.item_number(@ingredients[x-1]) < @ingAmounts[x-1]
@disabledReason = "You don't have enough of the required ingredients!"
return false
end
end


Any clues what I'm doing wrong?

This post has been edited by Phantomaang: May 29 2011, 08:56 PM


__________________________
My current game project: Moranson Chronicles
Go to the top of the page
 
+Quote Post
   
Phantomaang
post May 31 2011, 11:05 AM
Post #5


Level 3
Group Icon

Group: Member
Posts: 42
Type: Developer
RM Skill: Beginner




Bump


__________________________
My current game project: Moranson Chronicles
Go to the top of the page
 
+Quote Post
   
Kread-EX
post May 31 2011, 11:15 AM
Post #6


(=___=)/
Group Icon

Group: +Gold Member
Posts: 4,136
Type: Scripter
RM Skill: Undisclosed




Why did you post the same thing in two different places?

Quoting myself:
QUOTE (Kread-EX)
This thread is for the special ACS editor, not for the ACS script support. You should have made a new thread in the RGSS2 Script Support section.

Anyways, since we're here, can I see your recipes? There must have been an error somewhere in one of them.


__________________________
FRACTURE - a SMT inspired game (demo) made by Rhyme, Karsuman and me. Weep and ragequit.

My blog.

Click here for my e-peen


Go to the top of the page
 
+Quote Post
   
Phantomaang
post May 31 2011, 05:56 PM
Post #7


Level 3
Group Icon

Group: Member
Posts: 42
Type: Developer
RM Skill: Beginner




QUOTE (Kread-EX @ May 31 2011, 12:15 PM) *
Why did you post the same thing in two different places?

Quoting myself:
QUOTE (Kread-EX)
This thread is for the special ACS editor, not for the ACS script support. You should have made a new thread in the RGSS2 Script Support section.

Anyways, since we're here, can I see your recipes? There must have been an error somewhere in one of them.


Because I didn't know doing that wasn't okay.;;
Anyways. Here's my recipes. (There's so few because I can't figure out what's wrong.)

Show/hide
#Cooking
Mushroom_Soup 0 1 011 1 62 1 62 3 20 0 0 1 0

Tomato_Soup 0 2 094 0142 2 1 106 1 106 3 20 0 0 1 0

Cake 0 5 0109 0117 0118 0119 030 1 2 1 1 1 99 1 99 2 10 0 0 1 0

Bread 0 2 0117 0119 2 1 32 1 1 1 0 0 0 1 0

#Jewelry
Ruby_Ring 0 2 0198 0206 1 1 214 1 214 1 0 0 0 1 3

#Weapons/Armor/Other

Hook_Claw_Lv._2 0 2 0193 092 1 5 195 1 195 1 0 0 0 1 5





The error is completely random. Sometimes I'll click my recipe drop-list, and it'll be fine, other times, it'll totally crash.


__________________________
My current game project: Moranson Chronicles
Go to the top of the page
 
+Quote Post
   
Kread-EX
post Jun 1 2011, 12:05 AM
Post #8


(=___=)/
Group Icon

Group: +Gold Member
Posts: 4,136
Type: Scripter
RM Skill: Undisclosed




I can't check very well right now, but try to rename this recipe:

Hook_Claw_Lv._2

into something less... cryptic, like simply Hook_Claw_B I can't guarantee anything, but this is the only issue I can think of right now, aside from a script conflict.


__________________________
FRACTURE - a SMT inspired game (demo) made by Rhyme, Karsuman and me. Weep and ragequit.

My blog.

Click here for my e-peen


Go to the top of the page
 
+Quote Post
   

Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 

Lo-Fi Version Time is now: 18th May 2013 - 09:20 AM
RPG RPG Revolution is an Privacy Policy and Legal
eXTReMe Tracker