Пример #1
0
        /// <summary>
        /// Remove given blob from this group if it matches, returns true if able to match and clean-up.
        /// </summary>
        public bool RemoveBlob(Blob blob)
        {
            if (blobOpLeft == blob || blobOpRight == blob)
            {
                Clear();
                return(true);
            }
            else if (blobEq == blob)
            {
                if (connectEq)
                {
                    if (!connectEq.isReleasing)
                    {
                        connectEq.state = BlobConnect.State.Releasing;
                    }
                    connectEq = null;
                }

                blobEq = null;

                return(true);
            }

            return(false);
        }
Пример #2
0
        public void SetOp(Blob left, Blob right, BlobConnect connect)
        {
            Clear(); //fail-safe

            blobOpLeft  = left;
            blobOpRight = right;

            connectOp = connect;
        }
Пример #3
0
    public void ReleaseDragging()
    {
        if (mCurConnectDragging)
        {
            mCurConnectDragging.Release();
            mCurConnectDragging = null;
        }

        curBlobDragging  = null;
        curGroupDragging = null;
    }
Пример #4
0
        public void SetEq(Blob eq, BlobConnect connect)
        {
            if (connectEq && !connectEq.isReleasing)
            {
                connectEq.state = BlobConnect.State.Releasing;
            }

            blobEq = eq;

            connectEq = connect;
        }
Пример #5
0
        public void ClearEq()
        {
            if (connectEq)
            {
                if (!connectEq.isReleasing)
                {
                    connectEq.state = BlobConnect.State.Releasing;
                }
                connectEq = null;
            }

            blobEq = null;
        }
Пример #6
0
        public void Clear()
        {
            if (connectOp)
            {
                if (!connectOp.isReleasing)
                {
                    connectOp.state = BlobConnect.State.Releasing;
                }
                connectOp = null;
            }

            blobOpLeft  = null;
            blobOpRight = null;

            ClearEq();
        }
Пример #7
0
    void OnBlobConnectDelete(BlobConnect blobConnect)
    {
        //check which connects need to be purged.
        for (int i = mGroupActives.Count - 1; i >= 0; i--)
        {
            var grp = mGroupActives[i];
            if (grp.connectOp == blobConnect)
            {
                grp.Clear();
            }
            else if (grp.connectEq == blobConnect)
            {
                grp.ClearEq();
            }

            if (grp.isEmpty)
            {
                mGroupActives.RemoveAt(i);
                mGroupCache.Add(grp);
            }
        }
    }
Пример #8
0
    void OnBlobDragBegin(Blob blob)
    {
        if (!mCurConnectDragging)
        {
            mConnectSpawnParms.Clear();
            //params?

            mCurConnectDragging = mPool.Spawn <BlobConnect>(connectTemplate.name, "", null, mConnectSpawnParms);
        }

        curBlobDragging = blob;

        var toOp = mCurOp;

        //determine what the operator is based on blob's current connect state

        mCurConnectDragging.op    = toOp;
        mCurConnectDragging.state = BlobConnect.State.Connecting;

        if (mCurConnectDragging.connectingSpriteRender)
        {
            mCurConnectDragging.connectingSpriteRender.color = curBlobDragging.color;
        }

        //determine if this is in a group
        curGroupDragging = GetGroup(blob);
        if (curGroupDragging != null)
        {
            //highlight entire group

            //flip operand order based if it's the first operand
            if (blob == curGroupDragging.blobOpLeft)
            {
                curGroupDragging.blobOpLeft  = curGroupDragging.blobOpRight;
                curGroupDragging.blobOpRight = blob;
            }
        }
    }
Пример #9
0
    void OnGroupEval(BlobConnectController.Group grp)
    {
        //check if correct
        float op1, op2, eq;

        grp.GetNumbers(out op1, out op2, out eq);

        bool isCorrect = false;

        switch (grp.connectOp.op)
        {
        case OperatorType.Multiply:
            isCorrect = op1 * op2 == eq;
            break;

        case OperatorType.Divide:
            isCorrect = op1 / op2 == eq;
            break;
        }

        Blob        blobLeft = grp.blobOpLeft, blobRight = grp.blobOpRight, blobEq = grp.blobEq;
        BlobConnect connectOp = grp.connectOp, connectEq = grp.connectEq;

        if (isCorrect)
        {
            //do sparkly thing for blobs
            blobLeft.state  = Blob.State.Correct;
            blobRight.state = Blob.State.Correct;
            blobEq.state    = Blob.State.Correct;

            //clean out op
            connectOp.state = BlobConnect.State.Correct;
            connectEq.state = BlobConnect.State.Correct;

            if (mDragIndicatorRout != null)
            {
                HideDrag();
            }
        }
        else
        {
            //do error thing for blobs
            blobLeft.state  = Blob.State.Error;
            blobRight.state = Blob.State.Error;
            blobEq.state    = Blob.State.Error;

            //clean out op
            connectOp.state = BlobConnect.State.Error;
            connectEq.state = BlobConnect.State.Error;

            //restart drag show
            if (mDragIndicatorRout != null)
            {
                OnSignalDragShow();
            }
        }

        connectControl.ClearGroup(grp);

        if (isCorrect && signalInvokeCorrect)
        {
            signalInvokeCorrect.Invoke();
        }
    }
Пример #10
0
    void OnBlobDragEnd(Blob blob)
    {
        SetCurGroupDraggingOtherBlobHighlight(false);

        //determine if we can connect to a new blob
        var blobRefPt = blob.dragPointerJellySpriteRefPt;

        if (blobRefPt != null && blobRefPt.ParentJellySprite != blob.gameObject)
        {
            Group evalGroup = null;

            var endBlob = blobRefPt.ParentJellySprite.GetComponent <Blob>();

            //determine op
            var toOp = mCurOp;
            if (curGroupDragging != null)
            {
                if (curGroupDragging.IsBlobOp(curBlobDragging))
                {
                    //cancel if dragging to the same group as ops
                    if (curGroupDragging.IsBlobOp(endBlob))
                    {
                        toOp = OperatorType.None;
                    }
                    else
                    {
                        toOp = OperatorType.Equal;
                    }
                }
            }

            //update link groups
            if (toOp != OperatorType.None)
            {
                //remove endBlob from its group
                var endGroup = GetGroup(endBlob);
                if (endGroup != null && endGroup != curGroupDragging)
                {
                    //if we are dragging to apply equal op, then remove it from end group and move to drag group
                    if (toOp == OperatorType.Equal)
                    {
                        RemoveBlobFromGroup(endGroup, endBlob);

                        curGroupDragging.SetEq(endBlob, mCurConnectDragging);
                        evalGroup = curGroupDragging;
                    }
                    else
                    {
                        //if dragging to one of the operands of end group, then move blob to this group
                        if (endGroup.IsBlobOp(endBlob))
                        {
                            toOp = OperatorType.Equal;

                            //move blob to end group as the equal
                            endGroup.SetEq(blob, mCurConnectDragging);
                            evalGroup = endGroup;

                            //remove from dragging group
                            if (curGroupDragging != null)
                            {
                                RemoveBlobFromGroup(curGroupDragging, blob);
                            }
                        }
                        else
                        {
                            //remove blobs from its group, and create new group together
                            if (curGroupDragging != null)
                            {
                                RemoveBlobFromGroup(curGroupDragging, blob);
                            }

                            RemoveBlobFromGroup(endGroup, endBlob);

                            var newGrp = NewGroup();
                            newGrp.SetOp(blob, endBlob, mCurConnectDragging);
                            groupAddedCallback?.Invoke(newGrp);
                        }
                    }
                }
                else if (curGroupDragging != null)
                {
                    if (toOp == OperatorType.Equal)
                    {
                        //refresh equal
                        curGroupDragging.SetEq(endBlob, mCurConnectDragging);
                        evalGroup = curGroupDragging;
                    }
                    else //re-establish group
                    {
                        curGroupDragging.SetOp(blob, endBlob, mCurConnectDragging);
                    }
                }
                else
                {
                    //create new group
                    var newGrp = NewGroup();
                    newGrp.SetOp(blob, endBlob, mCurConnectDragging);
                    groupAddedCallback?.Invoke(newGrp);
                }

                //setup link
                mCurConnectDragging.op = toOp;
                mCurConnectDragging.ApplyLink(blob, endBlob);
            }
            else //cancel
            {
                mCurConnectDragging.Release();
            }

            mCurConnectDragging = null;
            curBlobDragging     = null;
            curGroupDragging    = null;

            //send call to evaluate a group
            if (evalGroup != null && evalGroup.isComplete)
            {
                evaluateCallback?.Invoke(evalGroup);
            }
        }
        else
        {
            ReleaseDragging();
        }
    }
Пример #11
0
    void OnGroupEval(BlobConnectController.Group grp)
    {
        float op1, op2, eq;

        grp.GetNumbers(out op1, out op2, out eq);

        var op = grp.connectOp.op;

        bool isCorrect = false;

        switch (op)
        {
        case OperatorType.Multiply:
            isCorrect = op1 * op2 == eq;
            break;

        case OperatorType.Divide:
            isCorrect = op1 / op2 == eq;
            break;
        }

        Blob        blobLeft = grp.blobOpLeft, blobRight = grp.blobOpRight, blobEq = grp.blobEq;
        BlobConnect connectOp = grp.connectOp, connectEq = grp.connectEq;

        if (isCorrect)
        {
            //do sparkly thing for blobs
            blobLeft.state  = Blob.State.Correct;
            blobRight.state = Blob.State.Correct;
            blobEq.state    = Blob.State.Correct;

            blobSpawner.RemoveFromActive(blobLeft);
            blobSpawner.RemoveFromActive(blobRight);
            blobSpawner.RemoveFromActive(blobEq);

            //clean out op
            connectOp.state = BlobConnect.State.Correct;
            connectEq.state = BlobConnect.State.Correct;

            //increment and refresh combo
            if (mComboRout == null)
            {
                mComboRout = StartCoroutine(DoComboUpdate());
            }

            comboCurTime = 0f;
            comboCount++;

            //add score
            if (isHintShown)
            {
                curScore += GameData.instance.correctDecayPoints;
            }
            else
            {
                curScore += GameData.instance.correctPoints * comboCount;
            }

            //go to next round
            mIsAnswerCorrectWait = false;
        }
        else
        {
            //do error thing for blobs
            blobLeft.state  = Blob.State.Error;
            blobRight.state = Blob.State.Error;
            blobEq.state    = Blob.State.Error;

            //clean out op
            connectOp.state = BlobConnect.State.Error;
            connectEq.state = BlobConnect.State.Error;

            //decrement combo count
            if (mComboRout != null)
            {
                if (comboCount > 0)
                {
                    comboCount--;
                }

                if (comboCount == 0)
                {
                    StopCoroutine(mComboRout);
                    mComboRout = null;
                }

                comboCurTime = 0f;
            }

            mistakeCount++;
            mMistakeRoundCount++;
        }

        connectControl.ClearGroup(grp);

        groupEvalCallback?.Invoke(new Operation {
            operand1 = (int)op1, operand2 = (int)op2, op = op
        }, (int)eq, isCorrect);
    }