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 DUH_HellstaffStorm(void) { accum basex = ACS_GetActorX(0); accum basey = ACS_GetActorY(0); accum basez = ACS_GetActorCeilingZ(0) - 12; int shooter = ACS_GetUserVariable(0, s"user_shooter"); int tics = ACS_GetUserVariable(0, s"user_stormTics"); while(tics) { accum x = basex + ACS_RandomFixed(-64, 64); accum y = basey + ACS_RandomFixed(-64, 64); accum z = basez; int tid = DU_MakeTID(); // Hack to not kill projectile if shooting from water. accum shooterx = ACS_GetActorX(shooter); accum shootery = ACS_GetActorY(shooter); accum shooterz = ACS_GetActorZ(shooter); ACS_SetActorPosition(shooter, shooterx, shootery, shooterz+16, false); ACS_SpawnProjectile(shooter, s"DUH_HellstaffMissile3", 0, 0, 0, 0, tid); if(ACS_SetActorPosition(tid, x, y, z, false)) { ACS_SetActorVelocity(tid, 0, 0, -5, false, false); --tics; } else ACS_Thing_Remove(tid); ACS_SetActorPosition(shooter, shooterx, shootery, shooterz, false); ACS_Delay(1); } ACS_Delay(23); ACS_Thing_Remove(ACS_ActivatorTID()); }
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); }
script static void UpdateMagicUI(struct player *p, struct upgrade *upgr) { struct gui_state *g = &UData.gst; G_Begin(g, 320, 240); G_UpdateState(g, p); PrintSprite(sp_UI_MagicSelectBack, 0,1, 0,1); bool any = false; for(i32 i = 0; i < countof(minf); i++) { struct magic_info const *m = &minf[i]; if(m->st != -1 && !world.cbiupgr[m->st]) continue; char gfx[32] = ":UI:"; strcat(gfx, m->name); char hot[32] = ":UI:"; strcat(hot, m->name); strcat(hot, "Sel"); struct gui_pre_btn pre = { .gfx = gfx, .hot = hot, .cdef = "d", .cact = "r", .chot = "k", .cdis = "m", .font = s"cbifont", .snd = s"player/cbi/buttonpress", .external = true, .w = 64, .h = 64 }; char name[128]; LanguageCV(name, LANG "INFO_SHORT_%s", m->name); if(G_Button_FId(g, i + 1, name, m->x, m->y, .preset = &pre)) GiveMagic(m); } G_End(g, gui_curs_outline); } script static void GivePlayerZ(i32 tid, struct player *p) { while(ACS_ThingCount(T_NONE, tid)) { SetMembI(tid, sm_UserZ, p->z); ACS_Delay(1); } } static void SetMagicUI(struct player *p, bool on) { if(p->dead) return; struct upgrade *upgr = p->getUpgr(UPGR_Magic); if(on) { UData.ui = true; p->semifrozen++; UData.gst.gfxprefix = ":UI:"; UData.gst.cx = 320/2; UData.gst.cy = 240/2; G_Init(&UData.gst); } else if(!on && UData.ui) { if(UData.gst.hot) GiveMagic(&minf[UData.gst.hot - 1]); UData.ui = false; p->semifrozen--; memset(&UData.gst, 0, sizeof UData.gst); } } // Extern Functions ----------------------------------------------------------| script void Upgr_Magic_Update(struct player *p, struct upgrade *upgr) { StrEntON k32 manaperc = p->mana / (k32)p->manamax; if(UData.manaperc < 1 && manaperc == 1) ACS_LocalAmbientSound(ss_player_manafull, 127); UData.manaperc = manaperc; if(p->buttons & BT_USER4 && !(p->old.buttons & BT_USER4)) SetMagicUI(p, true); else if(!(p->buttons & BT_USER4) && p->old.buttons & BT_USER4) SetMagicUI(p, false); if(UData.ui) UpdateMagicUI(p, upgr); if(manaperc >= 0.7) for(i32 i = 0; i < 5 * manaperc; i++) { k32 dst = ACS_RandomFixed(32, 56); k32 ang = ACS_RandomFixed(0, 1); i32 tid = ACS_UniqueTID(); i32 x = ACS_Cos(ang) * dst; i32 y = ACS_Sin(ang) * dst; i32 z = ACS_Random(8, 48); ACS_Spawn(so_ManaLeak, p->x + x, p->y + y, p->z + z, tid); SetMembI(tid, sm_UserX, x); SetMembI(tid, sm_UserY, y); SetPropK(tid, APROP_Alpha, manaperc / 2); PtrSet(tid, AAPTR_DEFAULT, AAPTR_MASTER, p->tid); GivePlayerZ(tid, p); } }