Exemplo n.º 1
0
    public void accept(InsertionRelationship rel)
    {
        // Insert one item in the other.
        SpawnedPuzzleItem box, filler;

        if (rel.containerName == _item1.itemName)
        {
            box    = _item1;
            filler = _item2;
        }
        else
        {
            box    = _item2;
            filler = _item1;
        }
        // If the box is empty, insert the filler item
        if (!box.containsItem)
        {
            filler.addToOtherItem(box);
            PlayState.instance.playAudio(PlayState.instance.pickupClip);
        }
        else
        {
            PlayState.instance.addPlayerText(string.Format("The {0} is full.", box.itemName));
        }
    }
Exemplo n.º 2
0
        protected override bool spawnFilteredInputs(string outputName)
        {
            DBItem dbOutput = Database.Instance.getItem(outputName);

            // Get the possible boxes to contain our item
            List <string> possibleContainers = new List <string>();

            if (_desiredOutputProperties.ContainsKey("fills"))
            {
                possibleContainers = new List <string>(_desiredOutputProperties["fills"] as List <string>);
            }
            else if (dbOutput.propertyExists("fills"))
            {
                possibleContainers = new List <string>(dbOutput.getProperty("fills") as List <string>);
            }

            BuildingBlock.shuffle(possibleContainers);
            foreach (string boxName in possibleContainers)
            {
                Dictionary <string, object> boxProperties = new Dictionary <string, object>();
                boxProperties["open"]     = false;
                boxProperties["contains"] = new List <string>()
                {
                    outputName
                };
                boxProperties["innerItemProps"] = new Dictionary <string, object>(_desiredOutputProperties);
                // Include the spawn index
                (boxProperties["innerItemProps"] as Dictionary <string, object>)["spawnIndex"] = _outputSpawnIndex;
                PuzzleOutput possibleInput = _containerInput.generatePuzzle(boxName, boxProperties);
                if (possibleInput == null)
                {
                    if (_verbose)
                    {
                        Debug.Log(string.Format("Failed to generate unboxing puzzle with {0} as the box and {1} as the item to remove.", boxName, outputName));
                    }
                    continue;
                }

                // If we officially succeed
                if (_verbose)
                {
                    Debug.Log(string.Format("Successfully generated unboxing puzzle with {0} as the box and {1} as the item to remove.", boxName, outputName));
                }
                _itemsToSpawn.AddRange(possibleInput.Items);
                _relationshipsToSpawn.AddRange(possibleInput.Relationships);
                // Add the insertion relationship
                InsertionRelationship insertionRelationship = new InsertionRelationship(outputName, _outputSpawnIndex, boxName, _containerInput.outputSpawnIndex());
                _relationshipsToSpawn.Add(insertionRelationship);

                return(true);
            }
            if (_verbose)
            {
                Debug.Log("Failed to generate unboxing puzzle. No possible boxes worked.");
            }
            return(false);
        }
Exemplo n.º 3
0
 public void accept(InsertionRelationship rel)
 {
     // Add the insertion relationship to the map
     if (!_relationshipMap.ContainsKey(rel.containerName))
     {
         _relationshipMap[rel.containerName] = new Dictionary <string, IRelationship>();
     }
     _relationshipMap[rel.containerName][rel.fillerName] = rel;
     if (!_relationshipMap.ContainsKey(rel.fillerName))
     {
         _relationshipMap[rel.fillerName] = new Dictionary <string, IRelationship>();
     }
     _relationshipMap[rel.fillerName][rel.containerName] = rel;
 }
Exemplo n.º 4
0
    protected void addAuxiliaryRelationship(string name1, string name2)
    {
        IRelationship relToAdd = null;

        DBItem dbitem1 = Database.Instance.getItem(name1);
        DBItem dbitem2 = Database.Instance.getItem(name2);

        // Figure out if one of the items can be inserted in the other
        if (dbitem1.propertyExists("container") && (bool)dbitem1.getProperty("container") &&
            dbitem1.propertyExists("filledby") && (dbitem1.getProperty("filledby") as List <string>).Contains(name2))
        {
            relToAdd = new InsertionRelationship(name2, 0, name1, 0);
        }
        if (relToAdd == null)
        {
            if (dbitem2.propertyExists("container") && (bool)dbitem2.getProperty("container") &&
                dbitem2.propertyExists("filledby") && (dbitem2.getProperty("filledby") as List <string>).Contains(name1))
            {
                relToAdd = new InsertionRelationship(name1, 0, name2, 0);
            }
        }
        // Next, try combine relationships
        if (relToAdd == null)
        {
            if (dbitem1.propertyExists("makes"))
            {
                List <KeyValuePair <string, string> > makes = new List <KeyValuePair <string, string> >((List <KeyValuePair <string, string> >)dbitem1.getProperty("makes"));
                Globals.shuffle(makes);
                foreach (KeyValuePair <string, string> recipe in makes)
                {
                    if (recipe.Key == name2)
                    {
                        if (!Database.Instance.itemExists(recipe.Value))
                        {
                            continue;
                        }
                        DBItem dbResult = Database.Instance.getItem(recipe.Value);
                        if (dbResult.Spawned)
                        {
                            continue;
                        }
                        PuzzleItem resultItem = dbResult.spawnItem();
                        relToAdd = new CombineRelationship(name1, 0, name2, 0, resultItem);
                        break;
                    }
                }
            }
        }
        if (relToAdd == null)
        {
            if (dbitem2.propertyExists("makes"))
            {
                List <KeyValuePair <string, string> > makes = new List <KeyValuePair <string, string> >((List <KeyValuePair <string, string> >)dbitem2.getProperty("makes"));
                Globals.shuffle(makes);
                foreach (KeyValuePair <string, string> recipe in makes)
                {
                    if (recipe.Key == name1)
                    {
                        if (!Database.Instance.itemExists(recipe.Value))
                        {
                            continue;
                        }
                        DBItem dbResult = Database.Instance.getItem(recipe.Value);
                        if (dbResult.Spawned)
                        {
                            continue;
                        }
                        PuzzleItem resultItem = dbResult.spawnItem();
                        relToAdd = new CombineRelationship(name1, 0, name2, 0, resultItem);
                        break;
                    }
                }
            }
        }
        // Finally try property change relationships
        if (relToAdd == null)
        {
            if (dbitem1.propertyExists("changes"))
            {
                List <KeyValuePair <string, string> > changes     = new List <KeyValuePair <string, string> >();
                Dictionary <string, List <string> >   changesDict = (Dictionary <string, List <string> >)dbitem1.getProperty("changes");
                foreach (string changeProp in changesDict.Keys)
                {
                    foreach (string changeVal in changesDict[changeProp])
                    {
                        changes.Add(new KeyValuePair <string, string>(changeProp, changeVal));
                    }
                }

                Globals.shuffle(changes);
                foreach (KeyValuePair <string, string> change in changes)
                {
                    // Check if the property is mutable and allows our value
                    if (!dbitem2.propertyExists("mutables") || !((List <string>)dbitem2.getProperty("mutables")).Contains(change.Key))
                    {
                        continue;
                    }
                    if (!dbitem2.propertyExists(change.Key) || !((List <string>)dbitem2.getProperty(change.Key)).Contains(change.Value))
                    {
                        continue;
                    }
                    relToAdd = new PropertyChangeRelationship(name2, 0, name1, 0, change.Key, change.Value);
                    break;
                }
            }
        }
        if (relToAdd == null)
        {
            if (dbitem2.propertyExists("changes"))
            {
                List <KeyValuePair <string, string> > changes     = new List <KeyValuePair <string, string> >();
                Dictionary <string, List <string> >   changesDict = (Dictionary <string, List <string> >)dbitem2.getProperty("changes");
                foreach (string changeProp in changesDict.Keys)
                {
                    foreach (string changeVal in changesDict[changeProp])
                    {
                        changes.Add(new KeyValuePair <string, string>(changeProp, changeVal));
                    }
                }
                Globals.shuffle(changes);
                foreach (KeyValuePair <string, string> change in changes)
                {
                    // Check if the property is mutable and allows our value
                    if (!dbitem1.propertyExists("mutables") || !((List <string>)dbitem1.getProperty("mutables")).Contains(change.Key))
                    {
                        continue;
                    }
                    if (!dbitem1.propertyExists(change.Key) || !((List <string>)dbitem1.getProperty(change.Key)).Contains(change.Value))
                    {
                        continue;
                    }
                    relToAdd = new PropertyChangeRelationship(name1, 0, name2, 0, change.Key, change.Value);
                    break;
                }
            }
        }

        if (relToAdd != null)
        {
            if (!_relationshipMap.ContainsKey(name1))
            {
                _relationshipMap[name1] = new Dictionary <string, IRelationship>();
            }
            _relationshipMap[name1][name2] = relToAdd;
            if (!_relationshipMap.ContainsKey(name2))
            {
                _relationshipMap[name2] = new Dictionary <string, IRelationship>();
            }
            _relationshipMap[name2][name1] = relToAdd;
        }
    }
Exemplo n.º 5
0
        protected override bool spawnFilteredInputs(string outputName)
        {
            // First determine if our desiredProperties specifically has any items it wants to contain
            DBItem        dbOutput = Database.Instance.getItem(outputName);
            List <string> possibleFillers;

            if (_desiredOutputProperties["contains"] != null)
            {
                possibleFillers = new List <string>(_desiredOutputProperties["contains"] as List <string>);
            }
            else if (dbOutput.propertyExists("filledby"))
            {
                possibleFillers = new List <string>(dbOutput.getProperty("filledby") as List <string>);
            }
            else
            {
                if (_verbose)
                {
                    Debug.Log("Failed to generate insertion puzzle. No possible fillers worked.");
                }
                return(false);
            }

            BuildingBlock.shuffle(possibleFillers);
            foreach (string fillerName in possibleFillers)
            {
                if (!areCarryable(new List <string>()
                {
                    outputName, fillerName
                }, new List <BuildingBlock>()
                {
                    _containerInput, _itemToInsertInput
                }))
                {
                    continue;
                }

                // Update the properties we're passing to our inputs
                Dictionary <string, object> newDesiredOutputProperties = new Dictionary <string, object>();
                foreach (string key in _desiredOutputProperties.Keys)
                {
                    newDesiredOutputProperties[key] = _desiredOutputProperties[key];
                }
                // Make sure we can open our item
                newDesiredOutputProperties["open"] = true;
                if (newDesiredOutputProperties["contains"] != null)
                {
                    List <string> fillerArray = new List <string>(newDesiredOutputProperties["contains"] as List <string>);
                    fillerArray.Remove(fillerName);
                    if (fillerArray.Count == 0)
                    {
                        newDesiredOutputProperties.Remove("contains");
                    }
                    else
                    {
                        newDesiredOutputProperties["contains"] = fillerArray;
                    }
                }

                // Now try to generate the inputs
                Dictionary <string, object> innerItemProps = new Dictionary <string, object>();
                if (_desiredOutputProperties.ContainsKey("innerItemProps"))
                {
                    innerItemProps = _desiredOutputProperties["innerItemProps"] as Dictionary <string, object>;
                }
                PuzzleOutput possibleContainerInput = _containerInput.generatePuzzle(outputName, newDesiredOutputProperties);
                PuzzleOutput possibleFillerInput    = _itemToInsertInput.generatePuzzle(fillerName, innerItemProps);
                if (possibleContainerInput == null || possibleFillerInput == null)
                {
                    if (_verbose)
                    {
                        Debug.Log(string.Format("Failed to generate insertion puzzle with {0} as the container and {1} as the filler.", outputName, fillerName));
                    }
                    _containerInput.despawnItems();
                    _itemToInsertInput.despawnItems();
                    continue;
                }

                if (_verbose)
                {
                    Debug.Log(string.Format("Successfully generated insertion puzzle with {0} as container and {1} as the filler.", outputName, fillerName));
                }
                _itemsToSpawn.AddRange(possibleContainerInput.Items);
                _itemsToSpawn.AddRange(possibleFillerInput.Items);
                _relationshipsToSpawn.AddRange(possibleContainerInput.Relationships);
                _relationshipsToSpawn.AddRange(possibleFillerInput.Relationships);

                // Add an insertion relationship here
                InsertionRelationship insertionRelationship = new InsertionRelationship(fillerName, _itemToInsertInput.outputSpawnIndex(), outputName, _containerInput.outputSpawnIndex());
                _relationshipsToSpawn.Add(insertionRelationship);

                return(true);
            }

            if (_verbose)
            {
                Debug.Log("Failed to generate insertion puzzle. No possible fillers worked.");
            }
            return(false);
        }