/*.$file${.::missile.c} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /* * Model: game.qm * File: ${.::missile.c} * * This code has been generated by QM 4.6.0 . * DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. * * This program is open source software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ /*.$endhead${.::missile.c} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ #include "qpn.h" #include "game.h" #include "bsp.h" /* Q_DEFINE_THIS_MODULE("missile") */ /* encapsulated delcaration of the Missile active object -------------------*/ /*.$declare${AOs::Missile} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /*.${AOs::Missile} .........................................................*/ typedef struct Missile { /* protected: */ QActive super; /* private: */ uint8_t x; uint8_t y; uint8_t exp_ctr; /* public: */ uint8_t speed; } Missile; /* protected: */ static QState Missile_initial(Missile * const me); static QState Missile_armed(Missile * const me); static QState Missile_flying(Missile * const me); static QState Missile_exploding(Missile * const me); /*.$enddecl${AOs::Missile} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /* global objects ----------------------------------------------------------*/ Missile AO_Missile; /* Active object definition ------------------------------------------------*/ /*.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /*. Check for the minimum required QP version */ #if (QP_VERSION < 650U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) #error qpn version 6.5.0 or higher required #endif /*.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /*.$define${AOs::Missile_ctor} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /*.${AOs::Missile_ctor} ....................................................*/ void Missile_ctor(uint8_t speed) { Missile *me = &AO_Missile; QActive_ctor(&me->super, Q_STATE_CAST(&Missile_initial)); me->speed = speed; } /*.$enddef${AOs::Missile_ctor} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /*.$define${AOs::Missile} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /*.${AOs::Missile} .........................................................*/ /*.${AOs::Missile::SM} .....................................................*/ static QState Missile_initial(Missile * const me) { /*.${AOs::Missile::SM::initial} */ return Q_TRAN(&Missile_armed); } /*.${AOs::Missile::SM::armed} ..............................................*/ static QState Missile_armed(Missile * const me) { QState status_; switch (Q_SIG(me)) { /*.${AOs::Missile::SM::armed::MISSILE_FIRE} */ case MISSILE_FIRE_SIG: { me->x = (uint8_t)Q_PAR(me); /* init position from the Ship */ me->y = (uint8_t)(Q_PAR(me) >> 8); status_ = Q_TRAN(&Missile_flying); break; } default: { status_ = Q_SUPER(&QHsm_top); break; } } return status_; } /*.${AOs::Missile::SM::flying} .............................................*/ static QState Missile_flying(Missile * const me) { QState status_; switch (Q_SIG(me)) { /*.${AOs::Missile::SM::flying::TIME_TICK} */ case TIME_TICK_SIG: { /*.${AOs::Missile::SM::flying::TIME_TICK::[me->x+GAME_MISSILE_SPEED_Xx + GAME_MISSILE_SPEED_X < GAME_TUNNEL_WIDTH) { me->x += me->speed; /*tell the Tunnel to draw the Missile and test for wall hits*/ QACTIVE_POST(&AO_Tunnel, MISSILE_IMG_SIG, (MISSILE_BMP << 16) | me->x | (me->y << 8)); status_ = Q_HANDLED(); } /*.${AOs::Missile::SM::flying::TIME_TICK::[else]} */ else { status_ = Q_TRAN(&Missile_armed); } break; } /*.${AOs::Missile::SM::flying::HIT_WALL} */ case HIT_WALL_SIG: { status_ = Q_TRAN(&Missile_exploding); break; } /*.${AOs::Missile::SM::flying::DESTROYED_MINE} */ case DESTROYED_MINE_SIG: { /* tell the Ship the score for destroing this Mine */ QACTIVE_POST(&AO_Ship, Q_SIG(me), Q_PAR(me)); /* re-arm immediately & let the destroyed Mine do the exploding */ status_ = Q_TRAN(&Missile_armed); break; } default: { status_ = Q_SUPER(&QHsm_top); break; } } return status_; } /*.${AOs::Missile::SM::exploding} ..........................................*/ static QState Missile_exploding(Missile * const me) { QState status_; switch (Q_SIG(me)) { /*.${AOs::Missile::SM::exploding} */ case Q_ENTRY_SIG: { me->exp_ctr = 0; status_ = Q_HANDLED(); break; } /*.${AOs::Missile::SM::exploding::TIME_TICK} */ case TIME_TICK_SIG: { /*.${AOs::Missile::SM::exploding::TIME_TICK::[(me->x>=GAME_SPEED_X)&&(me->exp~} */ if ((me->x >= GAME_SPEED_X) && (me->exp_ctr < 15)) { ++me->exp_ctr; /* advance the explosion counter */ me->x -= me->speed; /* move the explosion by one step */ /* tell the Tunnel to render the current stage of Explosion */ QACTIVE_POST(&AO_Tunnel, EXPLOSION_SIG, ((EXPLOSION0_BMP + (me->exp_ctr >> 2)) << 16) | (me->x + 3) | ((int)me->y - 4) << 8); status_ = Q_HANDLED(); } /*.${AOs::Missile::SM::exploding::TIME_TICK::[else]} */ else { /* explosion finished or moved outside the game */ status_ = Q_TRAN(&Missile_armed); } break; } default: { status_ = Q_SUPER(&QHsm_top); break; } } return status_; } /*.$enddef${AOs::Missile} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/