terraria-source-code/GameContent/Skies/CreditsRoll/Segments.cs
2021-10-26 12:45:26 -04:00

256 lines
9 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.GameContent.Skies.CreditsRoll.Segments
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using Terraria.DataStructures;
using Terraria.Localization;
using Terraria.UI.Chat;
namespace Terraria.GameContent.Skies.CreditsRoll
{
public class Segments
{
private const float PixelsToRollUpPerFrame = 0.5f;
public class LocalizedTextSegment : ICreditsRollSegment
{
private const int PixelsForALine = 120;
private LocalizedText _text;
private float _timeToShowPeak;
public float DedicatedTimeNeeded => 240f;
public LocalizedTextSegment(float timeInAnimation, string textKey)
{
this._text = Language.GetText(textKey);
this._timeToShowPeak = timeInAnimation;
}
public void Draw(ref CreditsRollInfo info)
{
float num1 = 400f;
float num2 = 400f;
int timeInAnimation = info.TimeInAnimation;
float num3 = Utils.GetLerpValue(this._timeToShowPeak - num1, this._timeToShowPeak, (float) timeInAnimation, true) * Utils.GetLerpValue(this._timeToShowPeak + num2, this._timeToShowPeak, (float) timeInAnimation, true);
if ((double) num3 <= 0.0)
return;
float num4 = this._timeToShowPeak - (float) timeInAnimation;
Vector2 position = info.AnchorPositionOnScreen + new Vector2(0.0f, num4 * 0.5f);
float Hue = (float) ((double) this._timeToShowPeak / 100.0 % 1.0);
if ((double) Hue < 0.0)
++Hue;
Color rgb = Main.hslToRgb(Hue, 1f, 0.5f);
string text = this._text.Value;
Vector2 origin = FontAssets.DeathText.Value.MeasureString(text) * 0.5f;
float num5 = (float) (1.0 - (1.0 - (double) num3) * (1.0 - (double) num3));
ChatManager.DrawColorCodedStringShadow(info.SpriteBatch, FontAssets.DeathText.Value, text, position, rgb * num5 * num5 * 0.25f, 0.0f, origin, Vector2.One);
ChatManager.DrawColorCodedString(info.SpriteBatch, FontAssets.DeathText.Value, text, position, Color.White * num5, 0.0f, origin, Vector2.One);
}
}
public abstract class ACreditsRollSegmentWithActions<T> : ICreditsRollSegment
{
private int _dedicatedTimeNeeded;
private int _lastDedicatedTimeNeeded;
protected int _targetTime;
private List<ICreditsRollSegmentAction<T>> _actions = new List<ICreditsRollSegmentAction<T>>();
public float DedicatedTimeNeeded => (float) this._dedicatedTimeNeeded;
public ACreditsRollSegmentWithActions(int targetTime)
{
this._targetTime = targetTime;
this._dedicatedTimeNeeded = 0;
}
protected void ProcessActions(T obj, float localTimeForObject)
{
for (int index = 0; index < this._actions.Count; ++index)
this._actions[index].ApplyTo(obj, localTimeForObject);
}
public Segments.ACreditsRollSegmentWithActions<T> Then(
ICreditsRollSegmentAction<T> act)
{
this.Bind(act);
act.SetDelay((float) this._dedicatedTimeNeeded);
this._actions.Add(act);
this._lastDedicatedTimeNeeded = this._dedicatedTimeNeeded;
this._dedicatedTimeNeeded += act.ExpectedLengthOfActionInFrames;
return this;
}
public Segments.ACreditsRollSegmentWithActions<T> With(
ICreditsRollSegmentAction<T> act)
{
this.Bind(act);
act.SetDelay((float) this._lastDedicatedTimeNeeded);
this._actions.Add(act);
return this;
}
protected abstract void Bind(ICreditsRollSegmentAction<T> act);
public abstract void Draw(ref CreditsRollInfo info);
}
public class NPCSegment : Segments.ACreditsRollSegmentWithActions<NPC>
{
private NPC _npc;
private Vector2 _anchorOffset;
private Vector2 _normalizedOriginForHitbox;
public NPCSegment(
int targetTime,
int npcId,
Vector2 anchorOffset,
Vector2 normalizedNPCHitboxOrigin)
: base(targetTime)
{
this._npc = new NPC();
this._npc.SetDefaults(npcId);
this._npc.IsABestiaryIconDummy = true;
this._anchorOffset = anchorOffset;
this._normalizedOriginForHitbox = normalizedNPCHitboxOrigin;
}
protected override void Bind(ICreditsRollSegmentAction<NPC> act) => act.BindTo(this._npc);
public override void Draw(ref CreditsRollInfo info)
{
if ((double) info.TimeInAnimation > (double) this._targetTime + (double) this.DedicatedTimeNeeded)
return;
this.ResetNPCAnimation(ref info);
this.ProcessActions(this._npc, (float) (info.TimeInAnimation - this._targetTime));
if (this._npc.alpha >= (int) byte.MaxValue)
return;
this._npc.FindFrame();
Main.instance.DrawNPCDirect(info.SpriteBatch, this._npc, this._npc.behindTiles, Vector2.Zero);
}
private void ResetNPCAnimation(ref CreditsRollInfo info)
{
this._npc.position = info.AnchorPositionOnScreen + this._anchorOffset - this._npc.Size * this._normalizedOriginForHitbox;
this._npc.alpha = 0;
this._npc.velocity = Vector2.Zero;
}
}
public class LooseSprite
{
private DrawData _originalDrawData;
public DrawData CurrentDrawData;
public float CurrentOpacity;
public LooseSprite(DrawData data)
{
this._originalDrawData = data;
this.Reset();
}
public void Reset()
{
this.CurrentDrawData = this._originalDrawData;
this.CurrentOpacity = 1f;
}
}
public class SpriteSegment : Segments.ACreditsRollSegmentWithActions<Segments.LooseSprite>
{
private Segments.LooseSprite _sprite;
private Vector2 _anchorOffset;
public SpriteSegment(int targetTime, DrawData data, Vector2 anchorOffset)
: base(targetTime)
{
this._sprite = new Segments.LooseSprite(data);
this._anchorOffset = anchorOffset;
}
protected override void Bind(
ICreditsRollSegmentAction<Segments.LooseSprite> act)
{
act.BindTo(this._sprite);
}
public override void Draw(ref CreditsRollInfo info)
{
if ((double) info.TimeInAnimation > (double) this._targetTime + (double) this.DedicatedTimeNeeded)
return;
this.ResetSpriteAnimation(ref info);
this.ProcessActions(this._sprite, (float) (info.TimeInAnimation - this._targetTime));
DrawData currentDrawData = this._sprite.CurrentDrawData;
currentDrawData.position += info.AnchorPositionOnScreen;
currentDrawData.color *= this._sprite.CurrentOpacity;
currentDrawData.Draw(info.SpriteBatch);
}
private void ResetSpriteAnimation(ref CreditsRollInfo info) => this._sprite.Reset();
}
public class EmoteSegment : ICreditsRollSegment
{
private int _targetTime;
private Vector2 _offset;
private SpriteEffects _effect;
private int _emoteId;
public float DedicatedTimeNeeded { get; private set; }
public EmoteSegment(
int emoteId,
int targetTime,
int timeToPlay,
Vector2 position,
SpriteEffects drawEffect)
{
this._emoteId = emoteId;
this._targetTime = targetTime;
this._effect = drawEffect;
this._offset = position;
this.DedicatedTimeNeeded = (float) timeToPlay;
}
public void Draw(ref CreditsRollInfo info)
{
int num = info.TimeInAnimation - this._targetTime;
if (num < 0 || (double) num >= (double) this.DedicatedTimeNeeded)
return;
Vector2 position = (info.AnchorPositionOnScreen + this._offset).Floor();
bool flag = num < 6 || (double) num >= (double) this.DedicatedTimeNeeded - 6.0;
Texture2D texture2D = TextureAssets.Extra[48].Value;
Rectangle rectangle = texture2D.Frame(8, 38, flag ? 0 : 1);
Vector2 origin = new Vector2((float) (rectangle.Width / 2), (float) rectangle.Height);
SpriteEffects effect = this._effect;
info.SpriteBatch.Draw(texture2D, position, new Rectangle?(rectangle), Color.White, 0.0f, origin, 1f, effect, 0.0f);
if (flag)
return;
switch (this._emoteId)
{
case 87:
case 89:
if (effect.HasFlag((Enum) SpriteEffects.FlipHorizontally))
{
effect &= ~SpriteEffects.FlipHorizontally;
position.X += 4f;
break;
}
break;
}
info.SpriteBatch.Draw(texture2D, position, new Rectangle?(this.GetFrame(num % 20)), Color.White, 0.0f, origin, 1f, effect, 0.0f);
}
private Rectangle GetFrame(int wrappedTime)
{
int num = wrappedTime >= 10 ? 1 : 0;
return TextureAssets.Extra[48].Value.Frame(8, 38, this._emoteId % 4 * 2 + num, this._emoteId / 4 + 1);
}
}
}
}