terraria-source-code/GameContent/Golf/FancyGolfPredictionLine.cs
2021-10-26 12:45:26 -04:00

138 lines
5.6 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.GameContent.Golf.FancyGolfPredictionLine
// 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 ReLogic.Graphics;
using System;
using System.Collections.Generic;
using Terraria.Graphics;
namespace Terraria.GameContent.Golf
{
public class FancyGolfPredictionLine
{
private readonly List<Vector2> _positions;
private readonly Entity _entity = (Entity) new FancyGolfPredictionLine.PredictionEntity();
private readonly int _iterations;
private readonly Color[] _colors = new Color[2]
{
Color.White,
Color.Gray
};
private readonly BasicDebugDrawer _drawer = new BasicDebugDrawer(Main.instance.GraphicsDevice);
private float _time;
public FancyGolfPredictionLine(int iterations)
{
this._positions = new List<Vector2>(iterations * 2 + 1);
this._iterations = iterations;
}
public void Update(Entity golfBall, Vector2 impactVelocity, float roughLandResistance)
{
bool flag = Main.tileSolid[379];
Main.tileSolid[379] = false;
this._positions.Clear();
this._time += 0.01666667f;
this._entity.position = golfBall.position;
this._entity.width = golfBall.width;
this._entity.height = golfBall.height;
GolfHelper.HitGolfBall(this._entity, impactVelocity, roughLandResistance);
this._positions.Add(this._entity.position);
float angularVelocity = 0.0f;
for (int index = 0; index < this._iterations; ++index)
{
GolfHelper.StepGolfBall(this._entity, ref angularVelocity);
this._positions.Add(this._entity.position);
}
Main.tileSolid[379] = flag;
}
public void Draw(Camera camera, SpriteBatch spriteBatch, float chargeProgress)
{
this._drawer.Begin(camera.GameViewMatrix.TransformationMatrix);
int count = this._positions.Count;
Texture2D texture2D = TextureAssets.Extra[33].Value;
Vector2 vector2_1 = new Vector2(3.5f, 3.5f);
Vector2 origin = texture2D.Size() / 2f;
Vector2 unscaledPosition = camera.UnscaledPosition;
Vector2 vector2_2 = vector2_1 - unscaledPosition;
float travelledLength = 0.0f;
float num = 0.0f;
for (int startIndex = 0; startIndex < this._positions.Count - 1; ++startIndex)
{
float length;
this.GetSectionLength(startIndex, out length, out float _);
if ((double) length != 0.0)
{
for (; (double) travelledLength < (double) num + (double) length; travelledLength += 4f)
{
float index = (travelledLength - num) / length + (float) startIndex;
Vector2 position = this.GetPosition((travelledLength - num) / length + (float) startIndex);
Color color = this.GetColor2(index) * MathHelper.Clamp((float) (2.0 - 2.0 * (double) index / (double) (this._positions.Count - 1)), 0.0f, 1f);
spriteBatch.Draw(texture2D, position + vector2_2, new Rectangle?(), color, 0.0f, origin, this.GetScale(travelledLength), SpriteEffects.None, 0.0f);
}
num += length;
}
}
this._drawer.End();
}
private Color GetColor(float travelledLength)
{
float num1 = ((float) ((double) travelledLength % 200.0 / 200.0) * (float) this._colors.Length - (float) ((double) this._time * 3.14159274101257 * 1.5)) % (float) this._colors.Length;
if ((double) num1 < 0.0)
num1 += (float) this._colors.Length;
int num2 = (int) Math.Floor((double) num1);
int num3 = num2 + 1;
int index1 = Utils.Clamp<int>(num2 % this._colors.Length, 0, this._colors.Length - 1);
int index2 = Utils.Clamp<int>(num3 % this._colors.Length, 0, this._colors.Length - 1);
float amount = num1 - (float) index1;
Color color = Color.Lerp(this._colors[index1], this._colors[index2], amount);
color.A = (byte) 64;
return color * 0.6f;
}
private Color GetColor2(float index)
{
double d;
int index1 = (int) Math.Floor(d = (double) index * 0.5 - (double) this._time * 3.14159274101257 * 1.5) % this._colors.Length;
if (index1 < 0)
index1 += this._colors.Length;
int index2 = (index1 + 1) % this._colors.Length;
float amount = (float) d - (float) Math.Floor(d);
Color color = Color.Lerp(this._colors[index1], this._colors[index2], amount);
color.A = (byte) 64;
return color * 0.6f;
}
private float GetScale(float travelledLength) => (float) (0.200000002980232 + (double) Utils.GetLerpValue(0.8f, 1f, (float) (Math.Cos((double) travelledLength / 50.0 + (double) this._time * -3.14159274101257) * 0.5 + 0.5), true) * 0.150000005960464);
private void GetSectionLength(int startIndex, out float length, out float rotation)
{
int index = startIndex + 1;
if (index >= this._positions.Count)
index = this._positions.Count - 1;
length = Vector2.Distance(this._positions[startIndex], this._positions[index]);
rotation = (this._positions[index] - this._positions[startIndex]).ToRotation();
}
private Vector2 GetPosition(float indexProgress)
{
int index1 = (int) Math.Floor((double) indexProgress);
int index2 = index1 + 1;
if (index2 >= this._positions.Count)
index2 = this._positions.Count - 1;
float amount = indexProgress - (float) index1;
return Vector2.Lerp(this._positions[index1], this._positions[index2], amount);
}
private class PredictionEntity : Entity
{
}
}
}