예제 #1
0
        public object RemoteFunctionCall(object[] args)
        {
            float  receiverIndex = (int)ReturnValueConversions.SafeUnwrap <float>(args, 0);
            string functionName  = ReturnValueConversions.SafeUnwrap <string>(args, 1);

            if (args [2].GetType() != typeof(SortedDictionary <KeyWrapper, object>))
            {
                throw new Error("Argument array to " + functionName + " is not an array");
            }

            var argsAsReturnValues = ReturnValueConversions.SafeUnwrap <SortedDictionary <KeyWrapper, object> >(args, 2);

            if (_caller.connectedTings.Length == 0)
            {
                _caller.Say("No connected object to call function on", "");
                return(0f);
            }

            if (receiverIndex == -1)
            {
                _caller.Say("Connection not open, can't call function.", "");
                return(0f);
            }
            else if (receiverIndex < 0)
            {
                _caller.Say("Receiver index is below 0: " + receiverIndex, "");
                return(0f);
            }
            else if (receiverIndex >= _caller.connectedTings.Length)
            {
                _caller.Say("Receiver index is too big (" + _caller.connectedTings.Length + ")", "");
                return(0f);
            }

            MimanTing receiverTing = _caller.connectedTings[(int)receiverIndex];

            receiverTing.PrepareForBeingHacked();

            if (receiverTing.programs.Length == 0)
            {
                _caller.Say("Connected thing has no programs to call", "");
                return(0f);
            }

            var fixedArgs = argsAsReturnValues.Values.ToArray();

            receiverTing.masterProgram.StartAtFunctionIfItExists(functionName, fixedArgs, _program);
            _program.waitingForInput = true;

            return(0f);            // "WAITING FOR RETURN VALUE FROM REMOTE FUNCTION";
        }
예제 #2
0
        private void SetHandItem(MimanTing pNewHandItem)
        {
            if (pNewHandItem == null) {
                D.Log ("pNewHandItem is null!");
                return;
            }

            if (handItem != null) {
                MoveHandItemToInventoryForcefully ();
                if(onNewHandItem != null) {
                    onNewHandItem("", false);
                }
            }

            handItem = pNewHandItem;
            handItem.isBeingHeld = true;
            handItem.PrepareForBeingHacked(); // this will make drinks generate programs if they don't have them already (happens when they are made by vending machines).

            if(onNewHandItem != null) {
                onNewHandItem(handItem.name, false);
            }
        }
예제 #3
0
        private int RemoteFunctionCall(float receiverIndex, string functionName, object [] arguments)
        {
            var argsAsReturnValues = new object[arguments.Length];

            int i = 0;

            foreach (object o in arguments)
            {
                if (o is float)
                {
                    argsAsReturnValues[i] = (float)o;
                }
                else if (o is string)
                {
                    argsAsReturnValues[i] = (string)o;
                }
                else if (o is bool)
                {
                    argsAsReturnValues[i] = (bool)o;
                }
                else
                {
                    throw new Exception("Can't handle argument to remote function call.");
                }
                i++;
            }

            if (_caller.connectedTings.Length == 0)
            {
                _caller.Say("No connected object to call function on", "");
                return(0);
            }

            if (receiverIndex == -1)
            {
                _caller.Say("Connection not open, can't call function.", "");
                return(0);
            }
            else if (receiverIndex < 0)
            {
                _caller.Say("Receiver index is below 0: " + receiverIndex, "");
                return(0);
            }
            else if (receiverIndex >= _caller.connectedTings.Length)
            {
                _caller.Say("Receiver index is too big (" + _caller.connectedTings.Length + ")", "");
                return(0);
            }

            MimanTing receiverTing = _caller.connectedTings[(int)receiverIndex];

            receiverTing.PrepareForBeingHacked();

            if (receiverTing.programs.Length == 0)
            {
                _caller.Say("Connected thing has no programs to call", "");
                return(0);
            }

            //Program.OnProgramEndsReturnValue onReturnHandler = OnReturnValue;

            receiverTing.masterProgram.StartAtFunctionIfItExists(functionName, argsAsReturnValues, _program);
            _program.waitingForInput = true;

            return(0);            // "WAITING FOR RETURN VALUE FROM REMOTE FUNCTION";
        }
예제 #4
0
        public void Hack(MimanTing pHackableTing)
        {
            if(pHackableTing == null) {
                D.Log("Hackable ting of " + name + " was null!");
                return;
            }

            if(hackdev == null) {
                D.Log(name + " has got no hackdev to hack with");
                return;
            }

            //logger.Log("Going to hack " + pHackableTing.name);

            if (pHackableTing != handItem) {
                FaceTing (pHackableTing);
            }
            pHackableTing.PrepareForBeingHacked();

            if (pHackableTing == hackdev) {
                _worldSettings.Notify (name, "Modifier can't modify itself");
            }
            else if(pHackableTing.programs.Length > 0) {
                MockProgram receiver = new MockProgram (retVal => {
                    //D.Log("Got response from hackdev Allow function: " + retVal);
                    if(retVal.GetType() == typeof(bool) && ((bool)retVal) == true) {
                        StartAction("Hacking", pHackableTing, LONG_TIME, LONG_TIME);
                        _dialogueRunner.EventHappened(name + "_hack_" + pHackableTing.name);
                    } else {
                        D.Log("Hacking not allowed with current device for character " + name);
                        _worldSettings.Notify(name, "Not allowed with current device");
                        StopAction();
                    }
                });

                StartAction("AttemptHacking", pHackableTing, 1.0f, 1.0f);

                pHackableTing.PrepareForBeingHacked ();
                hackdev.PrepareForBeingHacked ();

                if (hackdev.masterProgram.HasFunction ("Allow", true)) {
                    hackdev.masterProgram.StartAtFunctionWithMockReceiver ("Allow", new object[] {
                        pHackableTing.name,
                        (float)pHackableTing.securityLevel
                    }, receiver);
                } else {
                    _worldSettings.Notify(name, "No Allow-function in " + hackdev.name);
                }
            }
            else {
                _worldSettings.Notify(name, "No programs to hack in " + pHackableTing.name);
                StopAction();
            }
        }