Пример #1
0
        public override void executa(IOrganismo o)
        {
            int memSize = o.getReg(getByteOrganismo(o, 1));

            if (o.child != null)
            {
                mundo.dealloc(o.child);
                o.clearChild();
                o.fatalError();
                return;
            }
            memSize = ALifeConsts.validateMemorySize(o, memSize);
            if (memSize == 0)
            {
                o.fatalError();
                return;
            }
            IOrganismo child = mundo.alloc(memSize, o);

            if (child.isAlive())
            {
                o.addFitness();
                o.setChild(child);
                o.setReg(getByteOrganismo(o, 2), child.sp());
            }
            else
            {
                o.error();
                o.setReg(getByteOrganismo(o, 2), 0);
            }
        }
Пример #2
0
 private void returnPos(IOrganismo o, int pos)
 {
     if (pos >= 0)
     {
         o.setReg(getByteOrganismo(o, 1), pos);
     }
     else
     {
         o.error();
     }
 }
Пример #3
0
 private void returnPos(IOrganismo o, int pos)
 {
     if (pos >= 0)
     {
         o.ip = pos - 1;
     }
     else
     {
         o.error();
     }
 }
Пример #4
0
 public void fatalError()
 {
     if (!alive)
     {
         return;
     }
     _error += mundo.settings.errorCritical;
     if (_parent != null)
     {
         _parent.error();
     }
     mundo.dealloc(this);
 }
Пример #5
0
        public override void executa(IOrganismo o)
        {
            o.fillTemplate(getStep());
            if (o.sizeBuffer == 0)
            {
                o.error();
                return;
            }
            int posF = -1;
            int posB = -1;

            if (fwd && bwd)
            {
                posF = o.searchTemplateFwd();
                posB = o.searchTemplateBwd();
                if (posB < 0)
                {
                    returnPos(o, posF);
                    return;
                }
                if (posF < 0)
                {
                    returnPos(o, posB);
                    return;
                }
                int difF = posF - o.ip;
                int difB = o.ip - posB;
                o.setReg(getByteOrganismo(o, 1), difF < difB ? posF : posB);
            }
            else
            {
                if (fwd)
                {
                    posF = o.searchTemplateFwd();
                    returnPos(o, posF);
                }
                if (bwd)
                {
                    posB = o.searchTemplateBwd();
                    returnPos(o, posB);
                }
            }
        }