From 9d5e582d70b0167021f2e819572009246ca74694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20=C4=8C=C3=AD=C5=BE?= Date: Sat, 26 Sep 2020 19:59:50 +0200 Subject: [PATCH] Fix self shoot bug --- assets/level3.gif | Bin 4873 -> 4864 bytes game.h | 319 +++++++++++++++++++++++----------------------- 2 files changed, 160 insertions(+), 159 deletions(-) diff --git a/assets/level3.gif b/assets/level3.gif index 70d8a392cb1a266a38897a3ee8aa4a8c464f6404..5f0bbf4b7a1491543e612ce1d93e907b0fdc7ee4 100644 GIT binary patch delta 3530 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 EJ84(73IG5A delta 3518 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 sP@Kg$Q4uS_#U1O#R16eFp~YmJ6cSb}#aG SFG_MELEE_RANGE) - continue; - - RCL_Vector2D toMonster; - - toMonster.x = pX - SFG_player.camera.position.x; - toMonster.y = pY - SFG_player.camera.position.y; - - if (RCL_vectorsAngleCos(SFG_player.direction,toMonster) >= - (RCL_UNITS_PER_SQUARE - SFG_PLAYER_MELEE_ANGLE)) - { - SFG_monsterChangeHealth(m, - -1 * SFG_getDamageValue(SFG_WEAPON_FIRE_TYPE_MELEE)); - - SFG_createDust(pX,pY,pZ); - - break; - } - } - } - - SFG_player.weaponCooldownFrames = - RCL_max( - SFG_GET_WEAPON_FIRE_COOLDOWN_FRAMES(SFG_player.weapon), - SFG_MIN_WEAPON_COOLDOWN_FRAMES); - - SFG_getPlayerWeaponInfo(&ammo,&projectileCount,&canShoot); - - if (!canShoot) - { - // No more ammo, switch to the second strongest weapon. - - SFG_playerRotateWeapon(1); - - uint8_t previousWeapon = SFG_player.weapon; - - SFG_playerRotateWeapon(0); - - if (previousWeapon > SFG_player.weapon) - SFG_playerRotateWeapon(1); - } - } // endif: has enough ammo? - } // attack -#endif // SFG_PREVIEW_MODE == 0 - int8_t canSwitchWeapon = SFG_player.weaponCooldownFrames == 0; if (SFG_keyJustPressed(SFG_KEY_NEXT_WEAPON) && canSwitchWeapon) @@ -3541,6 +3389,161 @@ void SFG_gameStepPlaying() add vertical velocity. */ #endif +#if SFG_PREVIEW_MODE == 0 + if ( + SFG_keyIsDown(SFG_KEY_B) && + !SFG_keyIsDown(SFG_KEY_C) && + (SFG_player.weaponCooldownFrames == 0)) + { + /* Player attack/shoot/fire, this has to be done AFTER the player is moved, + otherwise he could shoot himself while running forward. */ + + uint8_t ammo, projectileCount, canShoot; + + SFG_getPlayerWeaponInfo(&ammo,&projectileCount,&canShoot); + + if (canShoot) + { + uint8_t sound; + + switch (SFG_player.weapon) + { + case SFG_WEAPON_KNIFE: sound = 255; break; + case SFG_WEAPON_ROCKET_LAUNCHER: + case SFG_WEAPON_SHOTGUN: sound = 2; break; + case SFG_WEAPON_PLASMAGUN: + case SFG_WEAPON_SOLUTION: sound = 4; break; + default: sound = 0; break; + } + + if (sound != 255) + SFG_playGameSound(sound,255); + + if (ammo != SFG_AMMO_NONE) + SFG_player.ammo[ammo] -= projectileCount; + + uint8_t projectile; + + switch (SFG_GET_WEAPON_FIRE_TYPE(SFG_player.weapon)) + { + case SFG_WEAPON_FIRE_TYPE_PLASMA: + projectile = SFG_PROJECTILE_PLASMA; + break; + + case SFG_WEAPON_FIRE_TYPE_FIREBALL: + projectile = SFG_PROJECTILE_FIREBALL; + break; + + case SFG_WEAPON_FIRE_TYPE_BULLET: + projectile = SFG_PROJECTILE_BULLET; + break; + + case SFG_WEAPON_FIRE_TYPE_MELEE: + projectile = SFG_PROJECTILE_NONE; + break; + + default: + projectile = 255; + break; + } + + if (projectile != SFG_PROJECTILE_NONE) + { + uint16_t angleAdd = SFG_PROJECTILE_SPREAD_ANGLE / (projectileCount + 1); + + RCL_Unit direction = + (SFG_player.camera.direction - SFG_PROJECTILE_SPREAD_ANGLE / 2) + + angleAdd; + + RCL_Unit projectileSpeed = SFG_GET_PROJECTILE_SPEED_UPS(projectile); + + /* Vertical speed will be either determined by autoaim (if shearing is + off) or the camera shear value. */ + RCL_Unit verticalSpeed = (SFG_game.settings & 0x04) ? + (SFG_player.camera.shear * projectileSpeed) / + SFG_CAMERA_MAX_SHEAR_PIXELS + : + (projectileSpeed * SFG_autoaimVertically()) / RCL_UNITS_PER_SQUARE; + + for (uint8_t i = 0; i < projectileCount; ++i) + { + SFG_launchProjectile( + projectile, + SFG_player.camera.position, + SFG_player.camera.height, + RCL_angleToDirection(direction), + verticalSpeed, + SFG_PROJECTILE_SPAWN_OFFSET + ); + + direction += angleAdd; + } + } + else + { + // player's melee attack + + for (uint16_t i = 0; i < SFG_currentLevel.monsterRecordCount; ++i) + { + SFG_MonsterRecord *m = &(SFG_currentLevel.monsterRecords[i]); + + uint8_t state = SFG_MR_STATE(*m); + + if ((state == SFG_MONSTER_STATE_INACTIVE) || + (state == SFG_MONSTER_STATE_DEAD)) + continue; + + RCL_Unit pX, pY, pZ; + SFG_getMonsterWorldPosition(m,&pX,&pY,&pZ); + + if (SFG_taxicabDistance(pX,pY,pZ, + SFG_player.camera.position.x, + SFG_player.camera.position.y, + SFG_player.camera.height) > SFG_MELEE_RANGE) + continue; + + RCL_Vector2D toMonster; + + toMonster.x = pX - SFG_player.camera.position.x; + toMonster.y = pY - SFG_player.camera.position.y; + + if (RCL_vectorsAngleCos(SFG_player.direction,toMonster) >= + (RCL_UNITS_PER_SQUARE - SFG_PLAYER_MELEE_ANGLE)) + { + SFG_monsterChangeHealth(m, + -1 * SFG_getDamageValue(SFG_WEAPON_FIRE_TYPE_MELEE)); + + SFG_createDust(pX,pY,pZ); + + break; + } + } + } + + SFG_player.weaponCooldownFrames = + RCL_max( + SFG_GET_WEAPON_FIRE_COOLDOWN_FRAMES(SFG_player.weapon), + SFG_MIN_WEAPON_COOLDOWN_FRAMES); + + SFG_getPlayerWeaponInfo(&ammo,&projectileCount,&canShoot); + + if (!canShoot) + { + // No more ammo, switch to the second strongest weapon. + + SFG_playerRotateWeapon(1); + + uint8_t previousWeapon = SFG_player.weapon; + + SFG_playerRotateWeapon(0); + + if (previousWeapon > SFG_player.weapon) + SFG_playerRotateWeapon(1); + } + } // endif: has enough ammo? + } // attack +#endif // SFG_PREVIEW_MODE == 0 + SFG_player.squarePosition[0] = SFG_player.camera.position.x / RCL_UNITS_PER_SQUARE; @@ -3564,8 +3567,6 @@ void SFG_gameStepPlaying() SFG_player.health = 0; } - SFG_updateLevel(); - if (SFG_player.weapon != currentWeapon) // if weapon switched, start cooldown SFG_player.weaponCooldownFrames = SFG_GET_WEAPON_FIRE_COOLDOWN_FRAMES(SFG_player.weapon) / 2; @@ -4344,12 +4345,12 @@ void SFG_drawWinOverlay() uint32_t time = (blinkDouble & 0x01) ? SFG_currentLevel.completionTime10sOfS : timeTotal; - x += SFG_drawNumber(time / 10,x,y,SFG_FONT_SIZE_SMALL,7) * - CHAR_SIZE + 1; + x += (SFG_drawNumber(time / 10,x,y,SFG_FONT_SIZE_SMALL,7) + 1) * + CHAR_SIZE; char timeRest[5] = ".X s"; - timeRest[1] = '0' + (time % 10) / 100; + timeRest[1] = '0' + (time % 10); SFG_drawText(timeRest,x,y,SFG_FONT_SIZE_SMALL,7,4,0); #if SFG_VERY_LOW_RESOLUTION