void DUH_CrossbowAltFire(bool useammo) { int ammoCount = ACS_CheckInventory(DUH_CrossbowAmmo); int ammoUsage = (ammoCount / 25) + 1; int damage = (ammoCount / 5) + ammoUsage + 1; accum angle = ACS_GetActorAngle(0); accum pitch = ACS_GetActorPitch(0); accum spreadStep = 1.0k/80.0k; // 4.5 degrees accum spread = 0; DU_FireMissile(ACS_ActivatorTID(), s"DUH_CrossbowMissile3", damage, angle, pitch, 30); while(damage >>= 1) { spread += spreadStep; DU_FireMissile(ACS_ActivatorTID(), s"DUH_CrossbowMissile2", damage, angle + spread, pitch, 30); DU_FireMissile(ACS_ActivatorTID(), s"DUH_CrossbowMissile2", damage, angle - spread, pitch, 30); } if(useammo) ACS_TakeInventory(DUH_CrossbowAmmo, ammoUsage); }
void DUD_FireDGun(void) { int *count = &DakkaCount[ACS_PlayerNumber()]; int damage = 1 * DUD_GetDamageFactor(ACS_PlayerNumber(), AMMO_CLIP); int pspeed = 80 * DUD_GetPSpeedFactor(ACS_PlayerNumber(), AMMO_CLIP); accum angle = ACS_GetActorAngle(0) + ACS_RandomFixed(-1.0k/256, 1.0k/256); accum pitch = ACS_GetActorPitch(0) + ACS_RandomFixed(-1.0k/256, 1.0k/256); int tid = DU_FireMissile(0, s"DUD_Dakka", damage, angle, pitch, pspeed); switch((*count)++) { default: case 0: case 1: ACS_SetActorState(tid, s"SpawnD"); break; case 2: case 3: ACS_SetActorState(tid, s"SpawnA"); break; case 4: case 5: ACS_SetActorState(tid, s"SpawnK"); break; case 6: case 7: ACS_SetActorState(tid, s"SpawnK"); break; case 8: case 9: ACS_SetActorState(tid, s"SpawnA"); break; } if(*count == 10) *count = 0; if(*count & 1) ACS_TakeInventory(s"Clip", 1); }
void DUD_FirePlasma(void) { int damage = 5 * DUD_GetDamageFactor(ACS_PlayerNumber(), AMMO_CELL); int pspeed = 25 * DUD_GetPSpeedFactor(ACS_PlayerNumber(), AMMO_CELL); DU_FireMissile(0, s"DUD_PlasmaBall", damage, ACS_GetActorAngle(0), ACS_GetActorPitch(0), pspeed); ACS_TakeInventory(s"Cell", 1); }
void DUD_RocketLauncherFire(void) { int damage = 20 * DUD_GetDamageFactor(ACS_PlayerNumber(), AMMO_RCKT); int radius = 128 * DUD_GetRadiusFactor(ACS_PlayerNumber(), AMMO_RCKT); int pspeed = 20 * DUD_GetPSpeedFactor(ACS_PlayerNumber(), AMMO_RCKT); int tid = DU_FireMissile(0, s"DUD_Rocket", damage, ACS_GetActorAngle(0), ACS_GetActorPitch(0), pspeed); ACS_SetThingSpecial(tid, 0, radius, 0, 0, 0, 0); ACS_TakeInventory(s"RocketAmmo", 1); }
void DUH_HellstaffAltFire(bool useammo) { int ammoCount = ACS_CheckInventory(DUH_HellstaffAmmo); int ammoUsage = (ammoCount / 100) + 1; int damage = (ammoCount / 25) + ammoUsage + 1; int tid; tid = DU_FireMissile(ACS_ActivatorTID(), s"DUH_HellstaffMissile2", damage, ACS_GetActorAngle(0), ACS_GetActorPitch(0), 25); ACS_SetUserVariable(tid, s"user_stormTics", (ammoCount / 10) + 10); ACS_SetUserVariable(tid, s"user_shooter", ACS_ActivatorTID()); if(useammo) ACS_TakeInventory(DUH_HellstaffAmmo, ammoUsage); }
void DUD_FireAlphagun(int n, int ammoUse) { int damage = 1; int pellets = n * DUD_GetDamageFactor(ACS_PlayerNumber(), AMMO_SHEL); int pspeed = 80 * DUD_GetPSpeedFactor(ACS_PlayerNumber(), AMMO_SHEL); for(; pellets; --pellets) { accum offA = ACS_RandomFixed(0, 1); accum offD = ACS_RandomFixed(0, 6/256k); accum angle = ACS_GetActorAngle(0) + ACS_Cos(offA) * offD; accum pitch = ACS_GetActorPitch(0) + ACS_Sin(offA) * offD * 0.75k; DU_FireMissile(0, s"DUD_Alphapellet", damage, angle, pitch, pspeed); } if(ammoUse) ACS_TakeInventory(s"Shell", ammoUse); }
// Scripts ACS_S_SCRIPT ENTER void CameraMain (void) { int plrHealth, camType, plrNum = ACS_PlayerNumber(); accum plrAngle = ACS_GetActorAngle(0); player[plrNum].angle = plrAngle; if (!ACS_ActivatorTID()) ACS_Thing_ChangeTID(0, ACS_UniqueTID(-32678, 0)); player[plrNum].tid = ACS_ActivatorTID(); player[plrNum].camTid = ACS_UniqueTID(-32768, 0); ACS_SpawnForced(s"ChaseCam", ACS_GetActorX(0), ACS_GetActorY(0), ACS_GetActorZ(0), player[plrNum].camTid, player[plrNum].angle); while (true) { plrHealth = ACS_GetActorProperty(0, APROP_Health); player[plrNum].angle += ACS_GetPlayerInputFixed(-1, INPUT_YAW); player[plrNum].pitch -= ACS_GetPlayerInputFixed(-1, INPUT_PITCH); if (player[plrNum].pitch > PITCH_LIMIT) player[plrNum].pitch = PITCH_LIMIT; if (player[plrNum].pitch < -PITCH_LIMIT) player[plrNum].pitch = -PITCH_LIMIT; ACS_LineAttack(0, player[plrNum].angle + 0.5k, -player[plrNum].pitch, 0, s"ChaseCamWaypoint", s"", ACS_GetCVarFixed(s"chase_dist"), FHF_NORANDOMPUFFZ); ACS_SetActorAngle(player[plrNum].camTid, player[plrNum].angle); ACS_SetActorPitch(player[plrNum].camTid, player[plrNum].pitch); camType = ACS_GetUserCVar(plrNum, s"chase_camtype"); if (plrHealth) { switch (camType) { default: case 1: plrAngle = player[plrNum].angle; break; case 2: if (KeyDown(BT_FORWARD) || KeyDown(BT_BACK) || KeyDown(BT_MOVELEFT) || KeyDown(BT_MOVERIGHT) || KeyDown(BT_ATTACK) || KeyDown(BT_ALTATTACK)) plrAngle = player[plrNum].angle; break; case 3: if (KeyDown(BT_FORWARD) || KeyDown(BT_BACK) || KeyDown(BT_MOVELEFT) || KeyDown(BT_MOVERIGHT)) plrAngle = player[plrNum].angle; break; } } if (ACS_GetUserCVar(plrNum, s"chase_active")) ACS_ChangeCamera(player[plrNum].camTid, 0, 0); else { if (plrHealth) plrAngle = player[plrNum].angle; ACS_ChangeCamera(0, 0, 0); } ACS_SetActorAngle(0, plrAngle); ACS_SetActorPitch(0, player[plrNum].pitch); ACS_Delay(1); } return; }
void DUH_ArtifactReady(int frames) { static int tics[MAX_PLAYERS]; while(frames--) { int tic = ++tics[ACS_PlayerNumber()]; int inv; int tid = ACS_ActivatorTID(); if(!tid) ACS_Thing_ChangeTID(0, tid = DU_MakeTID()); inv = ACS_CheckInventory(s"ArtiEgg"); if(inv > 256) inv = 256; if(inv && !(tic % ((35 * 256) / inv))) ACS_Spawn(s"DUH_ChickenFriend", ACS_GetActorX(0), ACS_GetActorY(0), ACS_GetActorZ(0) + 56, 0, ACS_GetActorAngle(0)*256); inv = ACS_CheckInventory(s"ArtiFly"); if(inv > 0x7FFF - 8) inv = 0x7FFF - 8; ACS_SetActorPropertyFixed(0, APROP_JumpZ, inv + 8.0k); inv = ACS_CheckInventory(s"ArtiHealth"); if(inv > 35 * 4) inv = 35 * 4; if(inv && !(tic % ((35 * 4) / inv))) ACS_GiveInventory(s"Health", 1); inv = ACS_CheckInventory(s"ArtiInvisibility"); if(inv > 35 * 8) inv = 35 * 8; if(inv && !(tic % ((35 * 8) / inv))) ACS_GiveInventory(s"DUH_ArmorBonus", 1); inv = ACS_CheckInventory(s"ArtiInvulnerability"); if(inv > 35 * 1) inv = 35 * 1; if(inv && !(tic % ((35 * 1) / inv))) ACS_GiveInventory(s"DUH_ArmorBonus", 1); inv = ACS_CheckInventory(s"ArtiSuperHealth") + 4; if(inv > 0x7FFFFFFF / 25) inv = 0x7FFFFFFF / 25; ACS_SetActorProperty(0, APROP_SpawnHealth, inv * 25); inv = ACS_CheckInventory(s"ArtiTeleport"); if(inv > 16) inv = 16; ACS_SetActorPropertyFixed(0, APROP_Speed, (inv / 10.0) + 1.0); inv = ACS_CheckInventory(s"ArtiTimeBomb"); if(inv > 35 * 16) inv = 35 * 16; if(inv && !(tic % ((35 * 16) / inv))) ACS_SpawnProjectile(tid, s"DUH_TimeBombAura", 0, 0, 0, 0, 0); inv = ACS_CheckInventory(s"DUH_BagOfHolding") + 4; if(inv > 16) inv = 16; DUH_ArtifactTomeReady(DUH_ElvenWandAmmo, inv * 50); DUH_ArtifactTomeReady(DUH_CrossbowAmmo, inv * 25); DUH_ArtifactTomeReady(DUH_DragonClawAmmo, inv * 100); DUH_ArtifactTomeReady(DUH_HellstaffAmmo, inv * 100); DUH_ArtifactTomeReady(DUH_PhoenixRodAmmo, inv * 10); DUH_ArtifactTomeReady(DUH_FiremaceAmmo, inv * 75); inv = ACS_CheckInventory(s"ArtiTorch"); if(inv > 64) inv = 64; if(inv && !(tic % ((35 * 64) / inv))) ACS_GiveInventory(s"ArtiTorch", 1); DUH_AmmoReady(tic, DUH_ElvenWandAmmo, 350); DUH_AmmoReady(tic, DUH_CrossbowAmmo, 1750); DUH_AmmoReady(tic, DUH_DragonClawAmmo, 700); DUH_AmmoReady(tic, DUH_HellstaffAmmo, 1050); DUH_AmmoReady(tic, DUH_PhoenixRodAmmo, 3500); DUH_AmmoReady(tic, DUH_FiremaceAmmo, 7000); if(frames) ACS_Delay(1); } }