class DukeViewscreen : DukeActor { default { spriteset "VIEWSCREEN", "STATIC", "VIEWSCR"; +NOFALLER; +NOFLOORPAL; } const VIEWSCR_DIST = 1024; // was originally 2048, was increased to 8192 by EDuke32 and RedNukem, but with high resolutions the resulting 512 map units are still too low. override void Initialize() { self.ownerActor = self; self.lotag = 1; self.extra = 1; self.ChangeStat(STAT_STANDABLE); } override void Tick() { if (self.scale.X == 0) self.Destroy(); else { let p = self.findplayer(); double x = (self.pos - p.actor.pos).LengthSquared(); // the result from findplayer is not really useful. if (x >= VIEWSCR_DIST * VIEWSCR_DIST && camsprite == self) { camsprite = null; self.yint = 0; self.temp_data[0] = 0; } } } override bool onUse(DukePlayer user) { DukeStatIterator it; for(let acti = it.First(STAT_ACTOR); acti; acti = it.Next()) { if (acti.actorflag2(SFLAG2_CAMERA) && acti.yint == 0 && self.hitag == acti.lotag) { acti.yint = 1; //Using this camera if (user == Duke.GetViewPlayer()) Duke.PlaySound("MONITOR_ACTIVE"); self.ownerActor = acti; self.yint = 1; camsprite = self; user.newOwner = acti; Raze.forceSyncInput(Duke.GetPlayerIndex(user)); return true; } } user.clearcameras(); return true; } override bool animate(tspritetype tspr) { let actor = DukeActor(tspr.ownerActor); let hitowner = actor.hitOwnerActor; if (camsprite != null && hitowner && hitowner.temp_data[0] == 1) { tspr.SetSpritePic(self, 1); tspr.cstat &= ~ (CSTAT_SPRITE_XFLIP | CSTAT_SPRITE_YFLIP); tspr.cstat |= randomFlip(); tspr.scale.X += (0.125); tspr.scale.Y += (0.125); } else if (camsprite && camsprite == hitowner) { tspr.SetSpritePic(self, 2); } return true; } } class DukeViewscreen2 : DukeViewscreen { default { spriteset "VIEWSCREEN", "STATIC", "VIEWSCR"; } } //--------------------------------------------------------------------------- // // // //--------------------------------------------------------------------------- class DukeCamera : DukeActor { default { pic "CAMERA1"; +CAMERA; +ALWAYSROTATE1; } override void Initialize() { if (gs.camerashitable) self.cstat = CSTAT_SPRITE_BLOCK_ALL; else self.cstat = 0; if (ud.multimode < 2 && self.pal != 0) { self.scale = (0, 0); self.ChangeStat(STAT_MISC); return; } else self.pal = 0; self.extra = 1; self.ChangeStat(STAT_ACTOR); } override void Tick() { if (self.temp_data[0] == 0) { self.temp_data[1] += 8; if (gs.camerashitable) { int j = self.ifhitbyweapon(); if (j >= 0) { self.temp_data[0] = 1; // static self.cstat = CSTAT_SPRITE_INVISIBLE; for (int x = 0; x < 5; x++) self.RANDOMSCRAP(); return; } } if (self.hitag > 0) { let angle = 360. / 256; if (self.temp_data[1] < self.hitag) self.angle += angle; else if (self.temp_data[1] < (self.hitag * 3)) self.angle -= angle; else if (self.temp_data[1] < (self.hitag * 4)) self.angle += angle; else { self.angle += angle; self.temp_data[1] = 0; } } } } }