// 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; } }
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; }
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; } } }
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); }
void setup() { custom_signals::setup(); custom_config::setup(); changeToState(states::IGNITION_OFF_IDLE); }
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; }
// 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; } }
void setup() { loadEepromConfig(); changeToState(states::IGNITION_OFF_IDLE); }
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; }
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; }