private void Btn_Unlock()
    {
        var cost = trayInfo.costToUnlock[this.slotID];

        if (!isUnlockable())
        {
            ConfirmYesNoInterface.Ask("Research Lab", "You need\n<color={0}><size=+20>{2} {1}</size></color>\nto unlock this slot.".Format2(ColorConstants.HTML_GOLD, cost.type, cost.amount), "OK");
            return;
        }

        ConfirmYesNoInterface.Ask("Research Lab", "Would you like\nto unlock this\nResearch Slot?\n<size=+20><color={0}>{2} {1}</color></size>".Format2(ColorConstants.HTML_GOLD, cost.type, cost.amount))
        .Then(answer => {
            if (answer == "NO")
            {
                TimelineTween.ShakeError(this.gameObject);
                return;
            }

            ChangeStatus(ResearchSlotStatus.UNLOCKED, cost.type, cost.amount)
            .Then(slot => {
                FXPulse(imgStatus.transform);
                INTERFACE.UpdateAllSlots();
            });
        });
    }
Exemplo n.º 2
0
        public static int ConversionCost(FunctionParameter dest, VariableType src)
        {
            if (dest.VarType == src)
            {
                return(0); //exact match
            }

            if (src?.PropertyType == EPropertyType.Vector && dest.VarType?.PropertyType == EPropertyType.Vector ||
                src?.PropertyType == EPropertyType.Rotator && dest.VarType?.PropertyType == EPropertyType.Rotator)
            {
                return(0);
            }
            if (dest.VarType is Class c && (src is null || src is ClassType && !c.IsInterface))
            {
                return(0);
            }
            if (dest.VarType is DelegateType && src is null)
            {
                return(0);
            }
            if (dest.IsOut)
            {
                return(int.MaxValue);
            }
            if (INTERFACE.CaseInsensitiveEquals(dest.VarType?.Name) && src is Class cls && cls.SameAsOrSubClassOf(INTERFACE))
            {
                return(1); //Interface subclass
            }
            if (!INTERFACE.CaseInsensitiveEquals(dest.VarType?.Name) && dest.VarType is Class && src is Class)
            {
                return(2);
            }
            ECast conversion = GetConversion(dest.VarType, src);

            //if it has 'coerce', any valid conversion is acceptable, otherwise only autoconversions are acceptable
            if (dest.Flags.Has(UnrealFlags.EPropertyFlags.CoerceParm) ? conversion != ECast.Max : conversion.Has(ECast.AutoConvert))
            {
                if (conversion.Has(ECast.Truncate))
                {
                    return(104); //lossy conversion
                }

                if (dest.VarType == SymbolTable.FloatType && (src == SymbolTable.IntType || src?.PropertyType == EPropertyType.Byte))
                {
                    return(103); //int to float conversion
                }

                return(101); //lossless conversion
            }

            return(int.MaxValue);
        }