Guest User

Untitled

a guest
Jul 23rd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.64 KB | None | 0 0
  1. /*
  2. #include "actor.h"
  3. #include "info.h"
  4. #include "m_random.h"
  5. #include "s_sound.h"
  6. #include "p_local.h"
  7. #include "p_enemy.h"
  8. #include "gstrings.h"
  9. #include "a_action.h"
  10. #include "thingdef/thingdef.h"
  11. */
  12.  
  13. //
  14. // Mancubus attack,
  15. // firing three missiles in three different directions?
  16. // Doesn't look like it.
  17. //
  18. #define FATSPREAD (ANG90/8)
  19.  
  20. DEFINE_ACTION_FUNCTION(AActor, A_FatRaise)
  21. {
  22. A_FaceTarget (self);
  23. S_Sound (self, CHAN_WEAPON, "fatso/raiseguns", 1, ATTN_NORM);
  24. }
  25.  
  26. DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_FatAttack1)
  27. {
  28. AActor *missile;
  29. angle_t an;
  30.  
  31. if (!self->target)
  32. return;
  33.  
  34. ACTION_PARAM_START(1);
  35. ACTION_PARAM_CLASS(spawntype, 0);
  36.  
  37. if (spawntype == NULL) spawntype = PClass::FindClass("FatShot");
  38.  
  39. A_FaceTarget (self);
  40. // Change direction to ...
  41. self->angle += FATSPREAD;
  42. P_SpawnMissile (self, self->target, spawntype);
  43.  
  44. missile = P_SpawnMissile (self, self->target, spawntype);
  45. if (missile != NULL)
  46. {
  47. missile->angle += FATSPREAD;
  48. an = missile->angle >> ANGLETOFINESHIFT;
  49. missile->velx = FixedMul (missile->Speed, finecosine[an]);
  50. missile->vely = FixedMul (missile->Speed, finesine[an]);
  51. }
  52. }
  53.  
  54. DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_FatAttack2)
  55. {
  56. AActor *missile;
  57. angle_t an;
  58.  
  59. if (!self->target)
  60. return;
  61.  
  62. ACTION_PARAM_START(1);
  63. ACTION_PARAM_CLASS(spawntype, 0);
  64.  
  65. if (spawntype == NULL) spawntype = PClass::FindClass("FatShot");
  66.  
  67. A_FaceTarget (self);
  68. // Now here choose opposite deviation.
  69. self->angle -= FATSPREAD;
  70. P_SpawnMissile (self, self->target, spawntype);
  71.  
  72. missile = P_SpawnMissile (self, self->target, spawntype);
  73. if (missile != NULL)
  74. {
  75. missile->angle -= FATSPREAD*2;
  76. an = missile->angle >> ANGLETOFINESHIFT;
  77. missile->velx = FixedMul (missile->Speed, finecosine[an]);
  78. missile->vely = FixedMul (missile->Speed, finesine[an]);
  79. }
  80. }
  81.  
  82. DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_FatAttack3)
  83. {
  84. AActor *missile;
  85. angle_t an;
  86.  
  87. if (!self->target)
  88. return;
  89.  
  90. ACTION_PARAM_START(1);
  91. ACTION_PARAM_CLASS(spawntype, 0);
  92.  
  93. if (spawntype == NULL) spawntype = PClass::FindClass("FatShot");
  94.  
  95. A_FaceTarget (self);
  96.  
  97. missile = P_SpawnMissile (self, self->target, spawntype);
  98. if (missile != NULL)
  99. {
  100. missile->angle -= FATSPREAD/2;
  101. an = missile->angle >> ANGLETOFINESHIFT;
  102. missile->velx = FixedMul (missile->Speed, finecosine[an]);
  103. missile->vely = FixedMul (missile->Speed, finesine[an]);
  104. }
  105.  
  106. missile = P_SpawnMissile (self, self->target, spawntype);
  107. if (missile != NULL)
  108. {
  109. missile->angle += FATSPREAD/2;
  110. an = missile->angle >> ANGLETOFINESHIFT;
  111. missile->velx = FixedMul (missile->Speed, finecosine[an]);
  112. missile->vely = FixedMul (missile->Speed, finesine[an]);
  113. }
  114. }
  115.  
  116. //
  117. // killough 9/98: a mushroom explosion effect, sorta :)
  118. // Original idea: Linguica
  119. //
  120.  
  121. AActor * P_OldSpawnMissile(AActor * source, AActor * owner, AActor * dest, const PClass *type);
  122.  
  123. enum
  124. {
  125. MSF_Standard = 0,
  126. MSF_Classic = 1,
  127. MSF_DontHurt = 2,
  128. };
  129.  
  130. DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Mushroom)
  131. {
  132. int i, j;
  133.  
  134. ACTION_PARAM_START(5);
  135. ACTION_PARAM_CLASS(spawntype, 0);
  136. ACTION_PARAM_INT(n, 1);
  137. ACTION_PARAM_INT(flags, 2);
  138. ACTION_PARAM_FIXED(vrange, 3);
  139. ACTION_PARAM_FIXED(hrange, 4);
  140.  
  141. if (n == 0) n = self->Damage; // GetMissileDamage (0, 1);
  142. if (spawntype == NULL) spawntype = PClass::FindClass("FatShot");
  143.  
  144. P_RadiusAttack (self, self->target, 128, 128, self->DamageType, !(flags & MSF_DontHurt));
  145. P_CheckSplash(self, 128<<FRACBITS);
  146.  
  147. // Now launch mushroom cloud
  148. AActor *target = Spawn("Mapspot", 0, 0, 0, NO_REPLACE); // We need something to aim at.
  149. AActor *master = (flags & MSF_DontHurt) ? self->target : self;
  150. target->height = self->height;
  151. for (i = -n; i <= n; i += 8)
  152. {
  153. for (j = -n; j <= n; j += 8)
  154. {
  155. AActor *mo;
  156. target->x = self->x + (i << FRACBITS); // Aim in many directions from source
  157. target->y = self->y + (j << FRACBITS);
  158. target->z = self->z + (P_AproxDistance(i,j) * vrange); // Aim up fairly high
  159. if ((flags & MSF_Classic) || // Flag explicitely set, or no flags and compat options
  160. (flags == 0 && (self->state->DefineFlags & SDF_DEHACKED) && (i_compatflags & COMPATF_MUSHROOM)))
  161. { // Use old function for MBF compatibility
  162. mo = P_OldSpawnMissile (self, master, target, spawntype);
  163. }
  164. else // Use normal function
  165. {
  166. mo = P_SpawnMissile(self, target, spawntype, master);
  167. }
  168. if (mo != NULL)
  169. { // Slow it down a bit
  170. mo->velx = FixedMul(mo->velx, hrange);
  171. mo->vely = FixedMul(mo->vely, hrange);
  172. mo->velz = FixedMul(mo->velz, hrange);
  173. mo->flags &= ~MF_NOGRAVITY; // Make debris fall under gravity
  174. }
  175. }
  176. }
  177. target->Destroy();
  178. }
Add Comment
Please, Sign In to add comment