Exemplo n.º 1
0
// Called periodically from loop() to update the state machine.
static inline void updateState() {
  // Meta rule: inject IFF in INJECT state.
  {
    const boolean injecting = (state == states::IGNITION_ON_INJECT);
    custom_injector::setInjectionsEnabled(injecting);
    leds::status.set(injecting);
  }
   
  // Meta rule: if ignition is known to be off, reset to IGNITION_OFF_IDLE state.
  if (custom_signals::ignition_state().isOff()) {
    if (state != states::IGNITION_OFF_IDLE) {
      changeToState(states::IGNITION_OFF_IDLE);
    }  
    return;
  }
    
  // Handle the state transitions.
  switch (state) {
    case states::IGNITION_OFF_IDLE:
      if (custom_signals::ignition_state().isOnForAtLeastMillis(1000)) {
        changeToState(states::IGNITION_ON_MAYBE_INJECT);  
      }
      break;
      
    case states::IGNITION_ON_MAYBE_INJECT:
      changeToState(custom_config::is_enabled() 
          ? states::IGNITION_ON_INJECT 
          : states::IGNITION_ON_IDLE);  
      return;
    
    case states::IGNITION_ON_INJECT:
      // NOTE: the meta rule at the begining of this method enables injection
      // as long as state is INJECT. We don't need to control injection here.
      if (time_in_state.timeMillis() > 500) {
        changeToState(states::IGNITION_ON_IDLE);
      }
      break;
    
    case states::IGNITION_ON_IDLE:
      // Nothing to do here. Stay in this state until ignition is
      // turned off.
      break;
    
    // Unknown state, set to initial.
    default:
      sio::printf(F("injection state: unknown (%d)"), state);
      changeToState(states::IGNITION_OFF_IDLE);
      break;
  } 
}
Exemplo n.º 2
0
GiantSlimeEntity::GiantSlimeEntity(float x, float y)
  : EnemyEntity (ImageManager::getInstance().getImage(IMAGE_GIANT_SLIME), x, y)
{
  width = 128;
  height = 128;
  creatureSpeed = GIANT_SLIME_SPEED;
  velocity = Vector2D(creatureSpeed);
  hp = GIANT_SLIME_HP;
  hpDisplay = hp;
  hpMax = GIANT_SLIME_HP;
  meleeDamages = GIANT_SLIME_DAMAGES;
  missileDelay = GIANT_SLIME_MISSILE_DELAY;

  type = ENTITY_ENEMY_BOSS;
  enemyType = EnemyTypeSlimeBoss;
  bloodColor = BloodGreen;
  shadowFrame = 3;
  frame = 0;
  sprite.setOrigin(64.0f, 64.0f);
  h = 0.0f;

  age = -2.0f;

  changeToState(0);
  slimeCounter = 0;
  slimeTimer =5.0f;

  resistance[ResistanceFrozen] = ResistanceVeryHigh;
  resistance[ResistanceRepulsion] = ResistanceVeryHigh;
  resistance[ResistancePoison] = ResistanceVeryHigh;

  sprite.setOrigin(64, 84);
  canExplode = false;
}
Exemplo n.º 3
0
void FSM::doEvent(std::string eventName)
{
	if (canDoEvent(eventName))
	{
		cocos2d::log("FSM::doEvent:doing event %s", eventName.c_str());
		changeToState(_events[eventName][_currentState]);
	}
	else
	{
		cocos2d::log("FSM::doEvent: cannot do event %s", eventName.c_str());
	}
}
void BookAR::update()
{
	StateMachine<BookAR>::update();

	BOOST_FOREACH(shared_ptr<UIElement> e, _buttons)
	{
		if (e->getState() == UIElement::CLICK)
		{
			int id = e->getId()-BUTTON_BASE;
			switch (id)
			{
			case OBSERVE:
				break;
			case CREATE:
				changeToState(_state_creating);
				break;
			case CAMERA:
				changeToState(_state_tracking);
				break;
			case SHARE:
				changeToState(_state_sharing);
				break;
			case FRIENDS:
				break;
			default:
				break;
			}
			break;
		}
	}
	BOOST_FOREACH(shared_ptr<UIElement> e, _thumbs)
	{
		if (e->getState() == UIElement::CLICK)
		{
			int id = e->getId()-THUMB_BASE;
			//TODO: set current model to create
			break;
		}
	}
}
Exemplo n.º 5
0
void controlDialog::OnBnClicked1LoadMesh()
{
	CFileDialog fOpenDlg(TRUE, _T("stl"), _T("Load mesh file"), OFN_HIDEREADONLY|OFN_FILEMUSTEXIST, 
		_T("STL file (*.stl)|*.stl||"), this);
	fOpenDlg.m_pOFN->lpstrTitle=_T("Load mesh file");

	if(fOpenDlg.DoModal()==IDOK)
	{
		CString path = (LPCTSTR)fOpenDlg.GetPathName();
		TRACE(path);
		// Do something useful here
	}

	changeToState(STATE_1_GEN_VOXEL);
}
void QmlModelView::nodeInstancePropertyChanged(const ModelNode &node, const QString &propertyName)
{
    if (debug)
        qDebug() << this << __FUNCTION__ << node << propertyName;

    QmlObjectNode qmlObjectNode(node);

    if (!qmlObjectNode.isValid())
        return;

    if (isTransformProperty(propertyName))
        transformChanged(qmlObjectNode, propertyName);
    else if (propertyName == "parent")
        parentChanged(qmlObjectNode);
    else if (propertyName == "state")
        changeToState(node, qmlObjectNode.instanceValue(propertyName).toString());
    else
        otherPropertyChanged(qmlObjectNode, propertyName);
}
Exemplo n.º 7
0
void setup() {
  custom_signals::setup();
  custom_config::setup();
  changeToState(states::IGNITION_OFF_IDLE);
}
Exemplo n.º 8
0
void GiantSlimeEntity::animate(float delay)
{
  slimeTimer -= delay;
  if (slimeTimer <= 0.0f)
  {
    slimeTypeEnum slimeType = SlimeTypeStandard;
    if (game().isAdvancedLevel())
    {
      slimeType =  (slimeTypeEnum)(slimeType + rand() % 3);
    }
    switch (slimeCounter)
    {
    case 0:
      new SlimeEntity(TILE_WIDTH * 1.5f, TILE_HEIGHT * 1.5f, slimeType, true);
      break;
    case 1:
      new SlimeEntity(TILE_WIDTH * (MAP_WIDTH - 2) + TILE_WIDTH * 0.5f, TILE_HEIGHT * 1.5f, slimeType, true);
      break;
    case 2:
      new SlimeEntity(TILE_WIDTH * (MAP_WIDTH - 2) + TILE_WIDTH * 0.5f, TILE_HEIGHT * (MAP_HEIGHT - 2) + TILE_HEIGHT * 0.5f, slimeType, true);
      break;
    case 3:
      new SlimeEntity(TILE_WIDTH * 1.5f, TILE_HEIGHT * (MAP_HEIGHT - 2) + TILE_HEIGHT * 0.5f, slimeType, true);
      break;
    }
    slimeTimer = 7.0f;
    slimeCounter ++;
    if (slimeCounter == 4) slimeCounter = 0;
  }

  if (age <= 0.0f)
  {
    age += delay;
    return;
  }
  EnemyEntity::animate(delay);
  if (specialState[SpecialStateIce].active) delay *= specialState[SpecialStateIce].param1;

  timer -= delay;
  if (timer <= 0.0f)
  {
    if (state == 0) // walking
    {
      counter--;
      if (counter >= 0)
      {
        timer = 0.5f;
        if (hp <= hpMax / 4)
          creatureSpeed = GIANT_SLIME_SPEED * 1.4f;
        if (hp <= hpMax / 2)
          creatureSpeed = GIANT_SLIME_SPEED * 1.2f;
        else
          creatureSpeed = GIANT_SLIME_SPEED;

        setVelocity(Vector2D(x, y).vectorTo(game().getPlayerPosition(), GIANT_SLIME_SPEED ));
      }
      else
      {
        int r = rand() % 3;
        if (r == 0) changeToState(1);
        else if (r == 1) changeToState(3);
        else changeToState(5);
      }
    }
    else if (state == 1) // waiting for jumping
    {
      changeToState(2);
    }
    else if (state == 2) // jumping
    {
      changeToState(8);
    }
    else if (state == 3)
    {
      changeToState(4);
    }
    else if (state == 4) // walking
    {
      counter--;
      if (counter >= 0)
      {
        if (hp <= hpMax / 4)
          timer = missileDelay * 0.6f;
        if (hp <= hpMax / 2)
          timer = missileDelay * 0.8f;
        else
          timer = missileDelay;
        fire();
      }
      else
      {
        changeToState(8);
      }
    }
    else if (state == 5)
    {
      changeToState(6);
    }
    else if (state == 6)  // jump
    {
      changeToState(7); // fall
    }
    else if (state == 7)  // jump
    {
    }
    else if (state == 8)  // jump
    {
      changeToState(0); // fall
    }
  }

  if (state == 0) // walking
  {
    frame = ((int)(age * 2.0f)) % 2;
  }
  else if (state == 1 || state == 5) // waiting to jump
  {
    if (timer < 0.25f)
      frame = 1;
    else
      frame = 0;
  }
  else if (state == 2)  // jumping
  {
    hVelocity -= 700.0f * delay;

    h += hVelocity * delay;

    if (h <= 0.0f)
    {
      if (hp <= 0)
        dying();
      else
      {
        h = 0.0f;
        if (isFirstJumping)
        {
          isFirstJumping = false;
          hVelocity = 160.0f;
          SoundManager::getInstance().playSound(SOUND_SLIME_IMAPCT);
        }
        else
        {
          SoundManager::getInstance().playSound(SOUND_SLIME_IMAPCT_WEAK);
          viscosity = 0.96f;
          changeToState(0);
        }
      }
    }
    if (hVelocity > 0.0f) frame = 2;
    else frame = 0;
  }
  else if (state == 6) // ultra jump
  {
    if (h < 2000)
      h += hVelocity * delay;
  }
  else if (state == 7) // ultra jump
  {
    if (!isFalling && timer <= 2.2f)
    {
      isFalling = true;
      x = game().getPlayer()->getX();
      y = game().getPlayer()->getY();
      // to prevent collisions
      float x0 = TILE_WIDTH + 1;
      float xf = TILE_WIDTH * (MAP_WIDTH - 1) - 1;
      float y0 = TILE_HEIGHT + 1;
      float yf = TILE_HEIGHT * (MAP_HEIGHT - 1) - 1;

      calculateBB();

      if (boundingBox.left < x0) x += (x0 - boundingBox.left);
      else if (boundingBox.left + boundingBox.width > xf) x -= (boundingBox.left + boundingBox.width - xf);

      if (boundingBox.top < y0) y += (y0 - boundingBox.top);
      else if (boundingBox.top + boundingBox.height > yf) y -= (boundingBox.top + boundingBox.height - yf);
    }
    if (timer < 2.3f)
    {
      h += hVelocity * delay;
      if (h <= 0)
      {
        h = 0;
        changeToState(8);
        game().makeShake(0.8f);
        SoundManager::getInstance().playSound(SOUND_CYCLOPS_IMPACT);
      }
    }
  }

  if (state == 6 && timer < 0.5f)
  {
    int fade = timer * 512;
    if (fade < 0) fade = 0;
    sprite.setColor(sf::Color(255, 255, 255, fade));
  }
  else if (state == 7 && timer < 1.5f)
    sprite.setColor(sf::Color(255, 255, 255, 255));
  else if (state == 7 && timer < 2.0f)
    sprite.setColor(sf::Color(255, 255, 255, (2.0f - timer) * 512));
  else if (state == 7)
    sprite.setColor(sf::Color(255, 255, 255, 0));

  isMirroring = (frame == 2) && (velocity.x < 0.0f);
  z = y + 26;
}
Exemplo n.º 9
0
  // Called periodically from loop() to update the state machine.
  static inline void updateState() {
    // Valid in IGNITION_ON_COUNTING state only.
    static uint8 button_click_count;
    static uint8 button_last_state;

    // Handle the state transitions.
    switch (state) {
      case states::IGNITION_OFF_IDLE:
        if (custom_signals::ignition_state().isOn()) {
          button_click_count = 0;
          button_last_state = custom_signals::config_button().state();
          changeToState(states::IGNITION_ON_COUNTING);  
        }
        break;

      case states::IGNITION_ON_COUNTING: 
        {
          // If sequence takes too long too long or too many clicks then ignore.
          if (time_in_state.timeMillis() > kSequenceTimeoutMillis || button_click_count > kExpectedButtonClicks) {
            changeToState(states::IGNITION_ON_IDLE);  
            break;
          }
  
          // If ignition turned off, see if we have the conditions to toggle configuration.
          if (custom_signals::ignition_state().isOff()) {
            changeToState(button_click_count == kExpectedButtonClicks 
                ? states::IGNITION_OFF_TOGGLE_CONFIG 
                : states::IGNITION_OFF_IDLE);
            break;
          }
  
          const uint8 button_new_state = custom_signals::config_button().state();
          // Count change from non pressed to pressed.
          if ((button_last_state == SignalTracker::States::OFF) && (button_new_state == SignalTracker::States::ON)) {
            // This cannot overflow because we exist this state if exceeding kExpectedButtonClicks. 
            button_click_count++;
            sio::printf(F("config state: %d.%d\n"), states::IGNITION_ON_COUNTING, button_click_count);
          }
          button_last_state = button_new_state;
        }
        break;

      case states::IGNITION_ON_IDLE:
        if (custom_signals::ignition_state().isOff()) {
          changeToState(states::IGNITION_OFF_IDLE);  
        }
        break;

      case states::IGNITION_OFF_TOGGLE_CONFIG:
        toggleConfig();
        changeToState(states::IGNITION_OFF_IDLE);
        break;

      // Unknown state, set to initial.
      default:
        sio::printf(F("config state: unknown (%d)"), state);
        // Go to a default state and wait there until ignition is off.
        changeToState(states::IGNITION_ON_IDLE);
        break;
    } 
  }
Exemplo n.º 10
0
 void setup() {
   loadEepromConfig();
   changeToState(states::IGNITION_OFF_IDLE);
 }
Exemplo n.º 11
0
void LargeSlimeEntity::animate(float delay)
{
  if (age <= 0.0f)
  {
    age += delay;
    return;
  }
  EnemyEntity::animate(delay);
  if (specialState[SpecialStateIce].active) delay *= specialState[SpecialStateIce].param1;

  timer -= delay;
  frame = 0;
  if (timer <= 0.0f)
  {
    if (state == 0) // walking
    {
      counter--;
      if (counter >= 0)
      {
        timer = 0.5f;
        if (hp <= hpMax / 4)
          creatureSpeed = GIANT_SLIME_SPEED * 1.4f;
        if (hp <= hpMax / 2)
          creatureSpeed = GIANT_SLIME_SPEED * 1.2f;
        else
          creatureSpeed = GIANT_SLIME_SPEED;

        setVelocity(Vector2D(x, y).vectorTo(game().getPlayerPosition(), GIANT_SLIME_SPEED ));
      }
      else
      {
        int r = rand() % 2;
        if (r == 0) changeToState(1);
        else changeToState(3);
      }
    }
    else if (state == 1) // waiting for jumping
    {
      changeToState(2);
    }
    else if (state == 2) // jumping
    {
      changeToState(8);
    }
    else if (state == 3)
    {
      changeToState(4);
    }
    else if (state == 4) // walking
    {
      counter--;
      if (counter >= 0)
      {
        if (hp <= hpMax / 4)
          timer = missileDelay * 0.6f;
        if (hp <= hpMax / 2)
          timer = missileDelay * 0.8f;
        else
          timer = missileDelay;
        fire();
      }
      else
      {
        changeToState(8);
      }
    }
    else if (state == 8)  // jump
    {
      changeToState(0); // fall
    }
  }

  if (state == 0) // walking
  {
    frame = ((int)(age * 2.0f)) % 2;
  }
  else if (state == 1 || state == 5) // waiting to jump
  {
    if (timer < 0.25f)
      frame = 1;
    else
      frame = 0;
  }
  else if (state == 2)  // jumping
  {
    hVelocity -= 700.0f * delay;

    h += hVelocity * delay;

    if (h <= 0.0f)
    {
      if (hp <= 0)
        dying();
      else
      {
        h = 0.0f;
        if (isFirstJumping)
        {
          isFirstJumping = false;
          hVelocity = 160.0f;
          SoundManager::getInstance().playSound(SOUND_SLIME_IMAPCT);
        }
        else
        {
          SoundManager::getInstance().playSound(SOUND_SLIME_IMAPCT_WEAK);
          viscosity = 0.96f;
          changeToState(0);
        }
      }
    }
    if (hVelocity > 0.0f) frame = 2;
    else frame = 0;
  }

  isMirroring = (frame == 2) && (velocity.x < 0.0f);
  frame += baseFrame;

  z = y + 26;
}
Exemplo n.º 12
0
LargeSlimeEntity::LargeSlimeEntity(float x, float y, slimeTypeEnum slimeType)
  : EnemyEntity (ImageManager::getInstance().getImage(IMAGE_GIANT_SLIME), x, y)
{
  width = 128;
  height = 128;
  creatureSpeed = GIANT_SLIME_SPEED;
  velocity = Vector2D(creatureSpeed);
  hp = GIANT_SLIME_HP / 2;
  hpDisplay = hp;
  hpMax = hp;
  meleeDamages = GIANT_SLIME_DAMAGES;
  missileDelay = GIANT_SLIME_MISSILE_DELAY;

  type = ENTITY_ENEMY;
  bloodColor = BloodGreen;
  shadowFrame = 3;
  imagesProLine = 5;
  h = 0.0f;

  age = -1.0f;
  this->slimeType = slimeType;

  changeToState(0);

  switch (slimeType)
  {
  case SlimeTypeBlue:
    resistance[ResistanceFrozen] = ResistanceVeryHigh;
    resistance[ResistanceRecoil] = ResistanceVeryHigh;
    resistance[ResistancePoison] = ResistanceHigh;
    resistance[ResistanceIce] = ResistanceVeryHigh;
    resistance[ResistanceFire] = ResistanceVeryLow;
    enemyType = EnemyTypeSlimeBlueLarge;
    meleeType = ShotTypeIce;
    fireSound = SOUND_BLAST_ICE;
    fireType  = ShotTypeIce;
    fireDamage = 8;
    baseFrame = 10;
    break;

  case SlimeTypeRed:
    resistance[ResistanceFrozen] = ResistanceHigh;
    resistance[ResistanceRecoil] = ResistanceVeryHigh;
    resistance[ResistancePoison] = ResistanceHigh;
    resistance[ResistanceIce] = ResistanceVeryLow;
    resistance[ResistanceFire] = ResistanceVeryHigh;
    enemyType = EnemyTypeSlimeRedLarge;
    fireSound = SOUND_BLAST_FIRE;
    fireType  = ShotTypeFire;
    fireDamage = 12;
    baseFrame = 5;
    break;

  case SlimeTypeViolet:
    resistance[ResistanceFrozen] = ResistanceHigh;
    resistance[ResistanceRecoil] = ResistanceVeryHigh;
    resistance[ResistancePoison] = ResistanceHigh;
    enemyType = EnemyTypeSlimeLarge;
    fireSound = SOUND_BLAST_FLOWER;
    fireType  = ShotTypeStandard;
    fireDamage = 8;
    baseFrame = 15;
    break;

  case SlimeTypeStandard:
    resistance[ResistanceFrozen] = ResistanceHigh;
    resistance[ResistanceRecoil] = ResistanceVeryHigh;
    resistance[ResistancePoison] = ResistanceHigh;
    enemyType = EnemyTypeSlimeLarge;
    fireSound = SOUND_BLAST_FLOWER;
    fireType  = ShotTypeStandard;
    fireDamage = 8;
    baseFrame = 0;
    break;
  }

  frame = baseFrame;
  sprite.setOrigin(64, 84);
  canExplode = false;
}