public void Clear()
    {
        if (IsTargetValid())
        {
            if (lastCompiledCode != liveCode)
            {
                // Uses made un-saved changes. Make sure we save it.
                target.SetDraftCode(liveCode);
            }

            target = null;
        }

        waitingOnRetrieveCode = false; // The outstanding call, if any, will know to terminate itself.

        if (compileRequested)
        {
            Debug.LogError($"Editor was cleared while there was still an outstanding compile request. Please poll IsCompilePending() before clearing. The compile request will be ignored.");
        }
        compileRequested = false;

        liveCode         = null;
        lastCompiledCode = null;

        browser.SetCode("");
    }
示例#2
0
 public ICardAssignmentModel OnAssignCard(ICardModel card, int index = -1)
 {
     Debug.Assert(card != null, "Given card was null");
     Debug.Assert(this.actorBehaviorsEditor != null, "Null actorBehaviorsEditor?");
     using (this.actorBehaviorsEditor.StartUndo($"Add {this.GetCardCategory()} card {card.GetTitle()}"))
     {
         UnassignedBehavior behaviorEditor = ((UnassignedCard)card).GetUnassignedBehaviorItem();
         AssignedBehavior   assigned       = this.actorBehaviorsEditor.AddBehavior(behaviorEditor);
         List <string>      deckUseIds     = new List <string>((string[])deckEditor.data);
         if (index >= 0)
         {
             if (index > deckUseIds.Count)
             {
                 throw new System.Exception("OnAssignCard: Index greater than deckUseIds count!");
             }
             deckUseIds.Insert(index, assigned.useId);
         }
         else
         {
             deckUseIds.Add(assigned.useId);
         }
         deckEditor.SetData(deckUseIds.ToArray());
         return(new CardAssignment(assigned, this));
     }
 }
    public void Set(UnassignedBehavior target, VoosEngine.BehaviorLogItem?error = null)
    {
        Clear();
        Debug.Assert(target.IsValid(), "Given target was not valid?");

        this.target = target;

        // Use draft code if it's there.
        liveCode = Util.IsNotNullNorEmpty(target.GetDraftCode()) ?
                   target.GetDraftCode().NormalizeLineEndings() :
                   target.GetCode().NormalizeLineEndings();

        lastCompiledCode = target.GetCode().NormalizeLineEndings();

        browser.SetCode(liveCode);

        // Restore scroll pos if this is the same as before
        if (scrollPosByUri.ContainsKey(target.GetBehaviorUri()))
        {
            browser.SetScrollTop(scrollPosByUri[target.GetBehaviorUri()]);
        }

        browser.SetReadOnly(target.IsBehaviorReadOnly());

        if (error.HasValue)
        {
            AddErrorToMonaco(error.Value.lineNum, error.Value.message);
        }
    }
    public AssignedBehavior AddBehavior(UnassignedBehavior behavior)
    {
        OnBeforeAnyChange();
        Debug.Assert(!behavior.behaviorUri.IsNullOrEmpty());

        string finalBehaviorUri = behavior.behaviorUri;

        // Alright, some special logic here. If it's a user-library behavior, do not
        // just use the URI directly. Import it, so turn it into embedded, then use
        // it. We want VOOS files to be stand-alone, so we can't have any local user
        // library dependencies.
        if (BehaviorSystem.IsUserLibraryBehaviorUri(behavior.behaviorUri))
        {
            Behaviors.Behavior importedBehavior = GetBehaviorSystem().GetBehaviorData(behavior.behaviorUri);
            Debug.Assert(!importedBehavior.userLibraryFile.IsNullOrEmpty());
            string importedId = GetBehaviorSystem().GenerateUniqueId();
            GetBehaviorSystem().PutBehavior(importedId, importedBehavior);
            string importedUri = BehaviorSystem.IdToEmbeddedBehaviorUri(importedId);
            finalBehaviorUri = importedUri;
        }

        // Create the use in the database
        string useId = actor.GetBehaviorSystem().GenerateUniqueId();
        var    brain = GetBrain();

        brain.AddUse(new BehaviorUse
        {
            id                  = useId,
            behaviorUri         = finalBehaviorUri,
            propertyAssignments = new Behaviors.PropertyAssignment[0]
        });
        GetBehaviorSystem().PutBrain(GetBrainId(), brain);

        return(new AssignedBehavior(useId, this));
    }
示例#5
0
 void AddNewCard(string category)
 {
     // Close();
     BehaviorCards.CardMetadata md = BehaviorCards.CardMetadata.DefaultCardMetadata;
     md.cardSystemCardData.categories = new string[] { category };
     string             metadataJson = JsonUtility.ToJson(md);
     UnassignedBehavior newBehavior  = behaviorSystem.CreateNewBehavior(
         BehaviorCards.GetDefaultCodeForCategory(category), metadataJson);
     // onCodeRequest(newBehavior.GetId());
 }
示例#6
0
        public ICardAssignmentModel CreateAndAssignNewCard()
        {
            // Make sure the category is for this slot.
            CardMetadata md = CardMetadata.DefaultCardMetadata;

            md.cardSystemCardData.categories = new string[] { deckEditor.cardCategory };
            string             metadataJson = JsonUtility.ToJson(md);
            UnassignedBehavior newBehavior  = this.actorBehaviorsEditor.CreateNewBehavior(GetDefaultCodeForCategory(deckEditor.cardCategory), metadataJson);

            return(this.OnAssignCard(new UnassignedCard(newBehavior)));
        }
示例#7
0
    private void PopulateContainerWithUri(GameObject containerObj, string cardUri)
    {
        UnassignedBehavior unassignedBehavior = new UnassignedBehavior(cardUri, behaviorSystem);
        ICardModel         cardModel          = new BehaviorCards.UnassignedCard(unassignedBehavior);

        if (!cardModel.IsValid())
        {
            return;
        }
        Card card = containerObj.GetComponentInChildren <CardContainer>().GetCard();

        card.Populate(cardModel);
    }
示例#8
0
        public ICardAssignmentModel CreateAndAssignNewCard()
        {
            string metaJson = JsonUtility.ToJson(new CardMetadata
            {
                cardSystemCardData = new CardMetadata.Data
                {
                    description = "Describe what your card does here!",
                    isCard      = true,
                    title       = "Name your card",
                    categories  = CUSTOM_CATEGORIES
                }
            });
            UnassignedBehavior newBehavior = this.actorEditor.CreateNewBehavior(CodeTemplates.MISC, metaJson);

            return(this.OnAssignCard(new UnassignedCard(newBehavior)));
        }
    public UnassignedBehavior CreateNewBehavior(string initCode, string metadataJson)
    {
        string behaviorId = GetBehaviorSystem().GenerateUniqueId();

        GetBehaviorSystem().PutBehavior(behaviorId, new Behaviors.Behavior
        {
            label        = "Custom",
            metadataJson = metadataJson,
            javascript   = initCode
        });

        UnassignedBehavior newBehavior = new UnassignedBehavior(BehaviorSystem.IdToEmbeddedBehaviorUri(behaviorId), GetBehaviorSystem());

        // NOTE: We don't need to add it here, per se. The caller should call AddBehavior on us with this instance.
        return(newBehavior);
    }
示例#10
0
        public void SetupPreview(UnassignedBehavior editor)
        {
            TryClearFieldList();

            if (editor == null)
            {
                return;
            }

            var defaultProps = editor.GetDefaultProperties();

            foreach (PropEditor propEditor in defaultProps)
            {
                if (IsRelevantField(propEditor))
                {
                    SpawnField(propEditor);
                }
            }

            SetPreviewSpacerAndOverlay(HasAnyProps());
        }
    public void Open(string openCardUri = null, VoosEngine.BehaviorLogItem?error = null)
    {
        gameObject.SetActive(true);

        resourceClaimer.Unclaim();
        isNewCard = false;

        this.error = null;
        // Which card are we editing ?
        if (openCardUri != null && behaviorSystem.IsBehaviorUriValid(openCardUri))
        {
            cardUri    = openCardUri;
            this.error = error;
        }
        else if (cardUri == null || !behaviorSystem.IsBehaviorUriValid(cardUri))
        {
            UnassignedBehavior newBehavior = behaviorSystem.CreateNewBehavior(
                CodeTemplates.MISC, BehaviorCards.GetMiscMetadataJson());
            cardUri   = newBehavior.GetBehaviorUri();
            isNewCard = true;
        }

        resourceClaimer.Claim(UnassignedBehavior.GetClaimResourceId(cardUri), OnClaimStatusChanged);
    }
示例#12
0
 public PanelCommon(UnassignedBehavior item)
 {
     this.item = item;
 }
示例#13
0
 public UnassignedCard(UnassignedBehavior item)
 {
     this.item = item;
 }
 public string GetBehaviorMetadataJson(UnassignedBehavior b)
 {
     return(GetBehaviorSystem().GetBehaviorData(b.behaviorUri).metadataJson);
 }
示例#15
0
 public UnassignedPanel(UnassignedBehavior item, BehaviorCards.ManagerImpl manager)
     : base(item)
 {
     this.item    = item;
     this.manager = manager;
 }
示例#16
0
    public void Setup()
    {
        Util.FindIfNotSet(this, ref behaviorSystem);
        Util.FindIfNotSet(this, ref claimKeeper);
        Util.FindIfNotSet(this, ref undoStack);
        Util.FindIfNotSet(this, ref voosEngine);
        Util.FindIfNotSet(this, ref popups);
        newCardUI.newCardButton.onClick.AddListener(() =>
        {
            string category = newCardCategoryOptions[newCardUI.newCardCategoryDropdown.value].text;
            AddNewCard(category);
        });
        cardLibraryUI.closeButton.onClick.AddListener(Close);
        cardLibraryUI.inputField.onValueChanged.AddListener(OnInputFieldChanged);
        cardLibraryUI.clearSearchButton.onClick.AddListener(ClearSearch);
        cardLibraryUI.categoryDropdown.onValueChanged.AddListener((v) =>
        {
            MatchNewCardCategoryToFilter();
            UpdateCards();
        });
        cardDetail = Instantiate(cardDetailPrefab);
        cardDetail.Setup(parentRect);

        cardDetail.onCodeCard += (model, _, container) =>
        {
            if (!model.IsValid())
            {
                return;
            }
            if (model.IsBuiltin())
            {
                // Not embedded, need to copy first
                string newBehaviorUri = model.MakeCopy().GetUri();
                onCodeRequest?.Invoke(newBehaviorUri);
            }
            else
            {
                onCodeRequest?.Invoke(model.GetUri());
            }
        };
        cardDetail.onPreviewCard += (model) =>
        {
            onCodeRequest?.Invoke(model.GetUri());
        };
        cardDetail.onTrashCard += (model, _) =>
        {
            if (!model.IsValid())
            {
                return;
            }

            ClaimableUndoUtil.ClaimableUndoItem undoItem = new ClaimableUndoUtil.ClaimableUndoItem();
            Behaviors.Behavior behavior = model.GetUnassignedBehaviorItem().GetBehavior();
            string             uri      = model.GetUri();
            string             id       = model.GetId();
            undoItem.resourceId   = UnassignedBehavior.GetClaimResourceId(id);
            undoItem.resourceName = model.GetTitle();
            undoItem.label        = $"Delete {model.GetTitle()}";
            undoItem.doIt         = () =>
            {
                behaviorSystem.DeleteBehavior(id);
            };
            undoItem.undo = () =>
            {
                behaviorSystem.PutBehavior(id, behavior);
            };
            undoItem.cannotDoReason = () =>
            {
                if (voosEngine.FindOneActorUsing(uri) != null)
                {
                    return("One or more actors are using this card.");
                }
                return(null);
            };
            ClaimableUndoUtil.PushUndoForResource(undoStack, claimKeeper, undoItem);
        };

        behaviorSystem.onBehaviorPut    += OnBehaviorPut;
        behaviorSystem.onBehaviorDelete += OnBehaviorDelete;

#if USE_STEAMWORKS
        uploadDialog = Instantiate(uploadDialogPrefab);
        uploadDialog.Setup();

        workshopMenu = Instantiate(workshopMenuPrefab);
        workshopMenu.Setup();
#endif

        cardPackPicker = Instantiate(cardPackPickerPrefab);

        cardLibraryUI.selectionDoneButton.onClick.AddListener(() =>
        {
            Debug.Assert(selection != null);
            selection.selectionFinishedCallback(selection.selectedCards);
            EndSelection();
        });

        cardLibraryUI.selectionCancelButton.onClick.AddListener(() =>
        {
            EndSelection();
        });

#if USE_STEAMWORKS
        cardLibraryUI.exportDropdown.SetOptions(new List <string>()
        {
            EXPORT_TO_DISK, EXPORT_TO_WORKSHOP, UPDATE_WORKSHOP_PACK
        });
#else
        // cardLibraryUI.exportDropdown.SetOptions(new List<string>() {
        //   EXPORT_TO_DISK
        // });
        cardLibraryUI.exportButton.onClick.AddListener(() => StartSelection(OnFinishSelectionForLocal));
#endif

        cardLibraryUI.exportDropdown.onOptionClicked += (value) =>
        {
            if (value == EXPORT_TO_DISK)
            {
                StartSelection(OnFinishSelectionForLocal);
            }
#if USE_STEAMWORKS
            else if (value == UPDATE_WORKSHOP_PACK)
            {
                cardPackPicker.Open((res) =>
                {
                    if (res.IsEmpty())
                    {
                        return;
                    }
                    StartSelection((list) => OnFinishSelectionForWorkshop(list, res), res);
                });
            }
            else
            {
                StartSelection(OnFinishSelectionForWorkshop, Util.Maybe <ulong> .CreateEmpty());
            }
#endif
        };

#if USE_STEAMWORKS
        cardLibraryUI.importDropdown.SetOptions(new List <string>()
        {
            IMPORT_FROM_DISK, IMPORT_FROM_WORKSHOP
        });
#else
        cardLibraryUI.importButton.onClick.AddListener(ImportLocal);

        // cardLibraryUI.importDropdown.SetOptions(new List<string>() {
        //   IMPORT_FROM_DISK
        // });
#endif

        cardLibraryUI.importDropdown.onOptionClicked += (value) =>
        {
            if (value == IMPORT_FROM_DISK)
            {
                ImportLocal();
            }
            else
            {
                workshopMenu.Open();
            }
        };

        PopulateCards();
    }