1
0
mirror of synced 2025-02-04 21:35:30 +01:00

色々改善10 (#483)

* TJAP3EXの機能に対応

* スキンの再読み込み機能を追加

* box.defを多言語対応

* 更にコマンドを追加

* Effects.jsonに対応

* レア度によってもらえるコインの数が変わるように

* 譜面のエラーログを表示するように

* BARLINEの修正
This commit is contained in:
Takkkom 2023-08-18 16:21:02 +09:00 committed by GitHub
parent 92b8a9c87c
commit f4d001d843
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 3770 additions and 141 deletions

View File

@ -113,6 +113,27 @@ namespace FDK
// this._txData = null;
}
public CTexture(CTexture tx)
{
this.sz画像サイズ = tx.sz画像サイズ;
this.szテクスチャサイズ = tx.szテクスチャサイズ;
this._opacity = tx._opacity;
this.texture = tx.texture;
this.cvPositionColoredVertexies = tx.cvPositionColoredVertexies;
this.b加算合成 = tx.b加算合成;
this.fZ軸中心回転 = tx.fZ軸中心回転;
this.vc拡大縮小倍率 = tx.vc拡大縮小倍率;
// this._txData = null;
}
public void UpdateTexture(Device device, Texture texture, int n幅, int n高さ)
{
this.texture = texture;
this.sz画像サイズ = new Size(n幅, n高さ);
this.szテクスチャサイズ = this.t指定されたサイズを超えない最適なテクスチャサイズを返す(device, this.sz画像サイズ);
this.rc全画像 = new Rectangle(0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height);
}
/// <summary>
/// <para>指定されたビットマップオブジェクトから Managed テクスチャを作成する。</para>
/// <para>テクスチャのサイズは、BITMAP画像のサイズ以上、かつ、D3D9デバイスで生成可能な最小のサイズに自動的に調節される。
@ -1139,6 +1160,143 @@ namespace FDK
device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, this.cvPositionColoredVertexies);
}
public void t2D描画SongObj(Device device, float x, float y, float xScale, float yScale)
{
if (this.texture == null)
return;
float depth = 1f;
Rectangle rc画像内の描画領域 = this.rc全画像;
if (this.fZ軸中心回転 == 0f)
{
#region [ (A) ]
//-----------------
float fx = ((float)rc画像内の描画領域.Width) / 2f;
float fy = ((float)rc画像内の描画領域.Height) / 2f;
float f左U値 = ((float)rc画像内の描画領域.Left) / ((float)this.szテクスチャサイズ.Width);
float f右U値 = ((float)rc画像内の描画領域.Right) / ((float)this.szテクスチャサイズ.Width);
float f上V値 = ((float)rc画像内の描画領域.Top) / ((float)this.szテクスチャサイズ.Height);
float f下V値 = ((float)rc画像内の描画領域.Bottom) / ((float)this.szテクスチャサイズ.Height);
this.color4.Alpha = ((float)this._opacity) / 255f;
int color = ToArgb(this.color4);
if (this.cvPositionColoredVertexies == null)
this.cvPositionColoredVertexies = new PositionColoredTexturedVertex[4];
// #27122 2012.1.13 from: 以下、マネージドオブジェクトガベージの量産を抑えるため、new は使わず、メンバに値を1つずつ直接上書きする。
this.cvPositionColoredVertexies[0].Position.X = -fx;
this.cvPositionColoredVertexies[0].Position.Y = fy;
this.cvPositionColoredVertexies[0].Position.Z = depth;
this.cvPositionColoredVertexies[0].Color = color;
this.cvPositionColoredVertexies[0].TextureCoordinates.X = f左U値;
this.cvPositionColoredVertexies[0].TextureCoordinates.Y = f上V値;
this.cvPositionColoredVertexies[1].Position.X = fx;
this.cvPositionColoredVertexies[1].Position.Y = fy;
this.cvPositionColoredVertexies[1].Position.Z = depth;
this.cvPositionColoredVertexies[1].Color = color;
this.cvPositionColoredVertexies[1].TextureCoordinates.X = f右U値;
this.cvPositionColoredVertexies[1].TextureCoordinates.Y = f上V値;
this.cvPositionColoredVertexies[2].Position.X = -fx;
this.cvPositionColoredVertexies[2].Position.Y = -fy;
this.cvPositionColoredVertexies[2].Position.Z = depth;
this.cvPositionColoredVertexies[2].Color = color;
this.cvPositionColoredVertexies[2].TextureCoordinates.X = f左U値;
this.cvPositionColoredVertexies[2].TextureCoordinates.Y = f下V値;
this.cvPositionColoredVertexies[3].Position.X = fx;
this.cvPositionColoredVertexies[3].Position.Y = -fy;
this.cvPositionColoredVertexies[3].Position.Z = depth;
this.cvPositionColoredVertexies[3].Color = color;
this.cvPositionColoredVertexies[3].TextureCoordinates.X = f右U値;
this.cvPositionColoredVertexies[3].TextureCoordinates.Y = f下V値;
this.tレンダリングステートの設定(device);
var matrix = Matrix.Identity * Matrix.Scaling(new Vector3(xScale, yScale, 1f));
matrix *= Matrix.Translation(x - SampleFramework.GameWindowSize.Width / 2.0f + fx, -(y - SampleFramework.GameWindowSize.Height / 2.0f + fy), 0f);
device.SetTransform(TransformState.World, matrix);
device.SetTexture(0, this.texture);
device.VertexFormat = PositionColoredTexturedVertex.Format;
device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, this.cvPositionColoredVertexies);
//-----------------
#endregion
}
else
{
#region [ (B) ]
//-----------------
float fx = ((float)rc画像内の描画領域.Width) / 2f;
float fy = ((float)rc画像内の描画領域.Height) / 2f;
float f左U値 = ((float)rc画像内の描画領域.Left) / ((float)this.szテクスチャサイズ.Width);
float f右U値 = ((float)rc画像内の描画領域.Right) / ((float)this.szテクスチャサイズ.Width);
float f上V値 = ((float)rc画像内の描画領域.Top) / ((float)this.szテクスチャサイズ.Height);
float f下V値 = ((float)rc画像内の描画領域.Bottom) / ((float)this.szテクスチャサイズ.Height);
this.color4.Alpha = ((float)this._opacity) / 255f;
int color = ToArgb(this.color4);
if (this.cvPositionColoredVertexies == null)
this.cvPositionColoredVertexies = new PositionColoredTexturedVertex[4];
// #27122 2012.1.13 from: 以下、マネージドオブジェクトガベージの量産を抑えるため、new は使わず、メンバに値を1つずつ直接上書きする。
this.cvPositionColoredVertexies[0].Position.X = -fx;
this.cvPositionColoredVertexies[0].Position.Y = fy;
this.cvPositionColoredVertexies[0].Position.Z = depth;
this.cvPositionColoredVertexies[0].Color = color;
this.cvPositionColoredVertexies[0].TextureCoordinates.X = f左U値;
this.cvPositionColoredVertexies[0].TextureCoordinates.Y = f上V値;
this.cvPositionColoredVertexies[1].Position.X = fx;
this.cvPositionColoredVertexies[1].Position.Y = fy;
this.cvPositionColoredVertexies[1].Position.Z = depth;
this.cvPositionColoredVertexies[1].Color = color;
this.cvPositionColoredVertexies[1].TextureCoordinates.X = f右U値;
this.cvPositionColoredVertexies[1].TextureCoordinates.Y = f上V値;
this.cvPositionColoredVertexies[2].Position.X = -fx;
this.cvPositionColoredVertexies[2].Position.Y = -fy;
this.cvPositionColoredVertexies[2].Position.Z = depth;
this.cvPositionColoredVertexies[2].Color = color;
this.cvPositionColoredVertexies[2].TextureCoordinates.X = f左U値;
this.cvPositionColoredVertexies[2].TextureCoordinates.Y = f下V値;
this.cvPositionColoredVertexies[3].Position.X = fx;
this.cvPositionColoredVertexies[3].Position.Y = -fy;
this.cvPositionColoredVertexies[3].Position.Z = depth;
this.cvPositionColoredVertexies[3].Color = color;
this.cvPositionColoredVertexies[3].TextureCoordinates.X = f右U値;
this.cvPositionColoredVertexies[3].TextureCoordinates.Y = f下V値;
this.tレンダリングステートの設定(device);
float n描画領域内X = x + (rc画像内の描画領域.Width / 2.0f);
float n描画領域内Y = y + (rc画像内の描画領域.Height / 2.0f);
var vc3移動量 = new Vector3(n描画領域内X - (((float)device.Viewport.Width) / 2f), -(n描画領域内Y - (((float)device.Viewport.Height) / 2f)), 0f);
var matrix = Matrix.Identity * Matrix.Scaling(new Vector3(xScale, yScale, 1f));
matrix *= Matrix.Translation(x - SampleFramework.GameWindowSize.Width / 2.0f + fx, -(y - SampleFramework.GameWindowSize.Height / 2.0f + fy), 0f);
matrix *= Matrix.RotationZ(this.fZ軸中心回転);
matrix *= Matrix.Translation(vc3移動量);
device.SetTransform(TransformState.World, matrix);
device.SetTexture(0, this.texture);
device.VertexFormat = PositionColoredTexturedVertex.Format;
device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, this.cvPositionColoredVertexies);
//-----------------
#endregion
}
}
#region [ IDisposable ]
//-----------------
public void Dispose()

View File

@ -9,7 +9,7 @@ namespace TJAPlayer3
{
class Easing
{
public int EaseIn(CCounter counter, int startPoint, int endPoint, CalcType type)
public int EaseIn(CCounter counter, float startPoint, float endPoint, CalcType type)
{
StartPoint = startPoint;
EndPoint = endPoint;
@ -46,11 +46,14 @@ namespace TJAPlayer3
CounterValue /= TimeMs;
Value = -Sa * (Math.Sqrt(1 - CounterValue * CounterValue) - 1) + StartPoint;
break;
case CalcType.Linear: //Linear
Value = Sa * (CounterValue / TimeMs) + StartPoint;
break;
}
return (int)Value;
}
public int EaseOut(CCounter counter, int startPoint, int endPoint, CalcType type)
public int EaseOut(CCounter counter, float startPoint, float endPoint, CalcType type)
{
StartPoint = startPoint;
EndPoint = endPoint;
@ -91,15 +94,102 @@ namespace TJAPlayer3
CounterValue--;
Value = Sa * Math.Sqrt(1 - CounterValue * CounterValue) + StartPoint;
break;
case CalcType.Linear: //Linear
CounterValue /= TimeMs;
Value = Sa * CounterValue + StartPoint;
break;
}
return (int)Value;
}
public float EaseInOut(CCounter counter, float startPoint, float endPoint, CalcType type)
{
StartPoint = startPoint;
EndPoint = endPoint;
Sa = EndPoint - StartPoint;
TimeMs = counter.n終了値;
Type = type;
CounterValue = counter.n現在の値;
private int StartPoint;
private int EndPoint;
private int Sa;
private int TimeMs;
switch (Type)
{
case CalcType.Quadratic: //Quadratic
CounterValue /= TimeMs / 2;
if (CounterValue < 1)
{
Value = Sa / 2 * CounterValue * CounterValue + StartPoint;
break;
}
CounterValue--;
Value = -Sa / 2 * (CounterValue * (CounterValue - 2) - 1) + StartPoint;
break;
case CalcType.Cubic: //Cubic
CounterValue /= TimeMs / 2;
if (CounterValue < 1)
{
Value = Sa / 2 * CounterValue * CounterValue * CounterValue + StartPoint;
break;
}
CounterValue -= 2;
Value = Sa / 2 * (CounterValue * CounterValue * CounterValue + 2) + StartPoint;
break;
case CalcType.Quartic: //Quartic
CounterValue /= TimeMs / 2;
if (CounterValue < 1)
{
Value = Sa / 2 * CounterValue * CounterValue * CounterValue * CounterValue + StartPoint;
break;
}
CounterValue -= 2;
Value = -Sa / 2 * (CounterValue * CounterValue * CounterValue * CounterValue - 2) + StartPoint;
break;
case CalcType.Quintic: //Quintic
CounterValue /= TimeMs;
CounterValue /= TimeMs / 2;
if (CounterValue < 1)
{
Value = Sa / 2 * CounterValue * CounterValue * CounterValue * CounterValue * CounterValue + StartPoint;
break;
}
CounterValue -= 2;
Value = Sa / 2 * (CounterValue * CounterValue * CounterValue * CounterValue * CounterValue + 2) + StartPoint;
break;
case CalcType.Sinusoidal: //Sinusoidal
Value = -Sa / 2 * (Math.Cos(Math.PI * CounterValue / TimeMs) - 1) + StartPoint;
break;
case CalcType.Exponential: //Exponential
CounterValue /= TimeMs / 2;
if (CounterValue < 1)
{
Value = Sa / 2 * Math.Pow(2, 10 * (CounterValue - 1)) + StartPoint;
break;
}
CounterValue--;
Value = Sa / 2 * (-Math.Pow(2, -10 * CounterValue) + 2) + StartPoint;
break;
case CalcType.Circular: //Circular
CounterValue /= TimeMs / 2;
if (CounterValue < 1)
{
Value = -Sa / 2 * (Math.Sqrt(1 - CounterValue * CounterValue) - 1) + StartPoint;
break;
}
CounterValue -= 2;
Value = Sa / 2 * (Math.Sqrt(1 - CounterValue * CounterValue) + 1) + StartPoint;
break;
case CalcType.Linear: //Linear
CounterValue /= TimeMs;
Value = Sa * CounterValue + StartPoint;
break;
}
return (float)Value;
}
private float StartPoint;
private float EndPoint;
private float Sa;
private double TimeMs;
private CalcType Type;
private double CounterValue;
private double Value;
@ -111,7 +201,8 @@ namespace TJAPlayer3
Quintic,
Sinusoidal,
Exponential,
Circular
Circular,
Linear
}
}
}

View File

@ -1946,6 +1946,25 @@ for (int i = 0; i < 3; i++) {
actScanningLoudness.On進行描画();
if (!ConfigIni.bTokkunMode)
{
float screen_ratiox = TJAPlayer3.Skin.Resolution[0] / 1280.0f;
float screen_ratioy = TJAPlayer3.Skin.Resolution[1] / 720.0f;
var mat = Matrix.LookAtLH(new Vector3(-fCamXOffset * screen_ratiox, fCamYOffset * screen_ratioy, (float)(-SampleFramework.GameWindowSize.Height / (fCamZoomFactor * 2) * Math.Sqrt(3.0))), new Vector3(-fCamXOffset * screen_ratiox, fCamYOffset * screen_ratioy, 0f), new Vector3(0f, 1f, 0f));
mat *= Matrix.RotationYawPitchRoll(0, 0, C変換.DegreeToRadian(fCamRotation));
mat *= Matrix.Scaling(fCamXScale, fCamYScale, 1f);
this.Device.SetTransform(TransformState.View, mat);
if (TJAPlayer3.DTX != null)
{
//object rendering
foreach (KeyValuePair<string, CSongObject> pair in TJAPlayer3.DTX.listObj)
{
pair.Value.tDraw();
}
}
}
if (r現在のステージ != null && r現在のステージ.eステージID != CStage.Eステージ. && TJAPlayer3.Tx.Network_Connection != null)
{
if (Math.Abs(CSound管理.rc演奏用タイマ.nシステム時刻ms - this.ms) > 10000)
@ -1972,6 +1991,30 @@ for (int i = 0; i < 3; i++) {
actFlushGPU?.On進行描画(); // Flush GPU // EndScene()Present()間 (つまりVSync前) でFlush実行
#endif
foreach(var capture in ConfigIni.KeyAssign.System.Capture)
{
if (TJAPlayer3.Input管理.Keyboard.bキーが押された(capture.))
{
if (TJAPlayer3.Input管理.Keyboard.bキーが押されている((int)SlimDXKeys.Key.LeftControl))
{
if (r現在のステージ.eステージID != CStage.Eステージ.)
{
RefleshSkin();
r現在のステージ.On非活性化();
r現在のステージ.On活性化();
}
}
else
{
// Debug.WriteLine( "capture: " + string.Format( "{0:2x}", (int) e.KeyCode ) + " " + (int) e.KeyCode );
string strFullPath =
Path.Combine(TJAPlayer3.strEXEのあるフォルダ, "Capture_img");
strFullPath = Path.Combine(strFullPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ".png");
SaveResultScreen(strFullPath);
}
}
}
/*
if ( Sound管理?.GetCurrentSoundDeviceType() != "DirectSound" )
{
@ -3389,18 +3432,6 @@ for (int i = 0; i < 3; i++) {
}
else
{
for ( int i = 0; i < 0x10; i++ )
{
if ( ConfigIni.KeyAssign.System.Capture[ i ]. > 0 &&
e.KeyCode == DeviceConstantConverter.KeyToKeyCode( (SlimDXKeys.Key) ConfigIni.KeyAssign.System.Capture[ i ]. ) )
{
// Debug.WriteLine( "capture: " + string.Format( "{0:2x}", (int) e.KeyCode ) + " " + (int) e.KeyCode );
string strFullPath =
Path.Combine( TJAPlayer3.strEXEのあるフォルダ, "Capture_img" );
strFullPath = Path.Combine( strFullPath, DateTime.Now.ToString( "yyyyMMddHHmmss" ) + ".png" );
SaveResultScreen( strFullPath );
}
}
}
}
private void Window_MouseUp( object sender, MouseEventArgs e )
@ -3429,5 +3460,18 @@ for (int i = 0; i < 3; i++) {
}
#endregion
#endregion
#region [ EXTENDED VARIABLES ]
public static float fCamXOffset;
public static float fCamYOffset;
public static float fCamZoomFactor = 1.0f;
public static float fCamRotation;
public static float fCamXScale = 1.0f;
public static float fCamYScale = 1.0f;
public static Color4 borderColor = new Color4(1f, 0f, 0f, 0f);
#endregion
}
}

View File

@ -6,6 +6,18 @@ namespace TJAPlayer3
{
class DBCharacter
{
public class CharacterEffect
{
public CharacterEffect()
{
Gauge = "Normal";
}
[JsonProperty("gauge")]
public string Gauge;
}
public class CharacterData
{
public CharacterData()

View File

@ -6,6 +6,30 @@ namespace TJAPlayer3
{
class DBPuchichara
{
public class PuchicharaEffect
{
public PuchicharaEffect()
{
AllPurple = false;
Autoroll = 0;
ShowAdlib = false;
SplitLane = false;
}
[JsonProperty("allpurple")]
public bool AllPurple;
[JsonProperty("AutoRoll")]
public int Autoroll;
[JsonProperty("showadlib")]
public bool ShowAdlib;
[JsonProperty("splitlane")]
public bool SplitLane;
}
public class PuchicharaData
{
public PuchicharaData()

View File

@ -33,6 +33,9 @@ namespace TJAPlayer3
public string DefaultPreimage;
public string ScenePreset;
private readonly string langTITLE = "#TITLE" + CLangManager.fetchLang().ToUpper();
private readonly string langBOXEXPLANATION = "#BOXEXPLANATION" + CLangManager.fetchLang().ToUpper();
// コンストラクタ
public CBoxDef()
@ -80,10 +83,13 @@ namespace TJAPlayer3
}
char[] ignoreChars = new char[] { ':', ' ', '\t' };
if ( str.StartsWith( "#TITLE", StringComparison.OrdinalIgnoreCase ) )
if (str.StartsWith(langTITLE, StringComparison.OrdinalIgnoreCase))
{
this.Title = str.Substring( 6 ).Trim( ignoreChars );
this.Title = str.Substring(8).Trim(ignoreChars);
}
else if(str.StartsWith("#TITLE", StringComparison.OrdinalIgnoreCase))
{
if (this.Title == "") this.Title = str.Substring(6).Trim(ignoreChars);
}
else if( str.StartsWith( "#GENRE", StringComparison.OrdinalIgnoreCase ) )
{
@ -144,9 +150,13 @@ namespace TJAPlayer3
{
for(int i = 0; i < 3; i++)
{
if (str.StartsWith("#BOXEXPLANATION" + (i + 1).ToString(), StringComparison.OrdinalIgnoreCase))
if (str.StartsWith(langBOXEXPLANATION + (i + 1).ToString(), StringComparison.OrdinalIgnoreCase))
{
this.strBoxText[i] = str.Substring(16).Trim(ignoreChars);
this.strBoxText[i] = str.Substring(18).Trim(ignoreChars);
}
else if (str.StartsWith("#BOXEXPLANATION" + (i + 1).ToString(), StringComparison.OrdinalIgnoreCase))
{
if (this.strBoxText[i] == "") this.strBoxText[i] = str.Substring(16).Trim(ignoreChars);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,112 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
using SharpDX;
using FDK;
namespace TJAPlayer3
{
class CSongObject
{
public CSongObject(string name, float x, float y, string path)
{
this.name = path;
this.isVisible = false;
this.x = x;
this.y = y;
this.rotation = 0f;
this.opacity = 255;
this.xScale = 1.0f;
this.yScale = 1.0f;
this.color = new Color4(1f, 1f, 1f, 1f);
this.frame = 0;
FileAttributes attr = File.GetAttributes(path);
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
{
textures = TJAPlayer3.Tx.TxCSongFolder(path);
}
else
{
textures = new CTexture[1];
textures[0] = TJAPlayer3.Tx.TxCSong(path);
}
}
public void tStartAnimation(double animInterval, bool loop)
{
counter.t開始(0, textures.Length - 1, animInterval, TJAPlayer3.Timer);
counter.n現在の値 = this.frame;
this.isLooping = loop;
this.isAnimating = true;
}
public void tStopAnimation()
{
counter.t停止();
this.isAnimating = false;
}
public void tDraw()
{
if (isAnimating)
{
if (isLooping) counter.t進行Loop();
else
{
counter.t進行();
if (counter.b終了値に達した) this.tStopAnimation();
}
frame = counter.n現在の値;
}
CTexture tx = this.textures[frame];
if (frame + 1 > textures.Length) return;
if (tx == null) return;
tx.fZ軸中心回転 = C変換.DegreeToRadian(this.rotation);
tx.color4 = this.color;
tx.Opacity = this.opacity;
float screen_ratiox = TJAPlayer3.Skin.Resolution[0] / 1280.0f;
float screen_ratioy = TJAPlayer3.Skin.Resolution[1] / 720.0f;
if (isVisible) tx.t2D描画SongObj(TJAPlayer3.app.Device, (int)(this.x * screen_ratiox), (int)(this.y * screen_ratioy), this.xScale * screen_ratiox, this.yScale * screen_ratioy);
}
public void tDispose()
{
this.isVisible = false;
foreach (CTexture tx in textures)
{
if (tx != null) tx.Dispose();
}
}
private CCounter counter = new CCounter();
private bool isAnimating;
private bool isLooping;
public CTexture[] textures;
public string name;
public bool isVisible;
public float x;
public float y;
public float rotation;
public int opacity;
public float xScale;
public float yScale;
public Color4 color;
public int frame;
}
}

View File

@ -11,6 +11,7 @@ namespace TJAPlayer3
class CCharacter
{
public DBCharacter.CharacterData metadata;
public DBCharacter.CharacterEffect effect;
public DBUnlockables.CUnlockConditions unlock;
public string _path;
@ -24,6 +25,12 @@ namespace TJAPlayer3
else
metadata = new DBCharacter.CharacterData();
// Character metadata
if (File.Exists($@"{path}\Effects.json"))
effect = ConfigManager.GetConfig<DBCharacter.CharacterEffect>($@"{path}\Effects.json");
else
effect = new DBCharacter.CharacterEffect();
// Character unlockables
if (File.Exists($@"{path}\Unlock.json"))
unlock = ConfigManager.GetConfig<DBUnlockables.CUnlockConditions>($@"{path}\Unlock.json");

View File

@ -15,6 +15,7 @@ namespace TJAPlayer3
public CTexture render;
public CSkin.Cシステムサウンド welcome;
public DBPuchichara.PuchicharaData metadata;
public DBPuchichara.PuchicharaEffect effect;
public DBUnlockables.CUnlockConditions unlock;
public string _path;
@ -41,6 +42,12 @@ namespace TJAPlayer3
else
metadata = new DBPuchichara.PuchicharaData();
// Puchichara metadata
if (File.Exists($@"{path}\Effects.json"))
effect = ConfigManager.GetConfig<DBPuchichara.PuchicharaEffect>($@"{path}\Effects.json");
else
effect = new DBPuchichara.PuchicharaEffect();
// Puchichara unlockables
if (File.Exists($@"{path}\Unlock.json"))
unlock = ConfigManager.GetConfig<DBUnlockables.CUnlockConditions>($@"{path}\Unlock.json");

View File

@ -71,6 +71,8 @@ namespace TJAPlayer3
const string ROLL = @"Roll\";
const string SPLASH = @"Splash\";
public Dictionary<string, CTexture> trackedTextures = new Dictionary<string, CTexture>();
public TextureLoader()
{
@ -109,6 +111,33 @@ namespace TJAPlayer3
return TJAPlayer3.tテクスチャの生成(CSkin.Path(BASE + GAME + GENRE + FileName + ".png"));
}
internal CTexture TxCSong(string path)
{
return TxCUntrackedSong(path);
}
private CTexture[] TxCSong(int count, string format, int start = 0)
{
return TxCSong(format, Enumerable.Range(start, count).Select(o => o.ToString()).ToArray());
}
private CTexture[] TxCSong(string format, params string[] parts)
{
return parts.Select(o => TxCSong(string.Format(format, o))).ToArray();
}
public CTexture[] TxCSongFolder(string folder)
{
var count = TJAPlayer3.t連番画像の枚数を数える(folder);
var texture = count == 0 ? null : TxCSong(count, folder + "{0}.png");
return texture;
}
internal CTexture TxCUntrackedSong(string path)
{
return TJAPlayer3.tテクスチャの生成(path);
}
public void LoadTexture()
{
#region
@ -400,6 +429,7 @@ namespace TJAPlayer3
Note_Swap = TxC(GAME + @"Swap.png");
Note_Kusu = TxC(GAME + @"Kusu.png");
Note_FuseRoll = TxC(GAME + @"FuseRoll.png");
Note_Adlib = TxC(GAME + @"Adlib.png");
Judge_Frame = TxC(GAME + @"Notes.png");
@ -2204,6 +2234,7 @@ namespace TJAPlayer3
Note_Swap,
Note_Kusu,
Note_FuseRoll,
Note_Adlib,
SENotesExtension,
Notes_Arm,
ChipEffect,

View File

@ -503,6 +503,15 @@ namespace TJAPlayer3
if (TJAPlayer3.ConfigIni.nPlayerCount >= 5)
TJAPlayer3.DTX_5P = new CDTX(str, false, 1.0, ini.stファイル.BGMAdjust, 0, 4, true, TJAPlayer3.stage選曲.n確定された曲の難易度[4]);
if (TJAPlayer3.DTX.listErrors.Count != 0)
{
string message = "";
foreach (var text in TJAPlayer3.DTX.listErrors)
{
System.Windows.Forms.MessageBox.Show(text, "譜面にエラーが見つかりました");
}
}
Trace.TraceInformation( "---- Song information -----------------" );
Trace.TraceInformation( "TITLE: {0}", TJAPlayer3.DTX.TITLE );
Trace.TraceInformation( "FILE: {0}", TJAPlayer3.DTX.strファイル名の絶対パス );

View File

@ -112,7 +112,19 @@ namespace TJAPlayer3
for (int i = 0; i < 5; i++)
{
var chara = TJAPlayer3.Tx.Characters[TJAPlayer3.SaveFileInstances[TJAPlayer3.GetActualPlayer(nPlayer)].data.Character];
switch(chara.effect.Gauge)
{
case "Normal":
this.db現在のゲージ値[i] = 0;
break;
case "Hard":
this.db現在のゲージ値[i] = 100;
break;
case "Extreme":
this.db現在のゲージ値[i] = 100;
break;
}
}
//ゲージのMAXまでの最低コンボ数を計算
@ -331,13 +343,41 @@ namespace TJAPlayer3
for (int i = 0; i < 3; i++)
{
var chara = TJAPlayer3.Tx.Characters[TJAPlayer3.SaveFileInstances[TJAPlayer3.GetActualPlayer(nPlayer)].data.Character];
switch (chara.effect.Gauge)
{
case "Normal":
dbゲージ増加量[i][nPlayer] = increase[i];
break;
case "Hard":
dbゲージ増加量[i][nPlayer] = increase[i] / 2.0f;
break;
case "Extreme":
dbゲージ増加量[i][nPlayer] = increase[i] / 4.0f;
break;
}
}
for (int i = 0; i < 3; i++)
{
var chara = TJAPlayer3.Tx.Characters[TJAPlayer3.SaveFileInstances[TJAPlayer3.GetActualPlayer(nPlayer)].data.Character];
switch (chara.effect.Gauge)
{
case "Normal":
dbゲージ増加量_Branch[i, 0][nPlayer] = increaseBranch[i, 0];
dbゲージ増加量_Branch[i, 1][nPlayer] = increaseBranch[i, 1];
dbゲージ増加量_Branch[i, 2][nPlayer] = increaseBranch[i, 2];
break;
case "Hard":
dbゲージ増加量_Branch[i, 0][nPlayer] = increaseBranch[i, 0] / 2.0f;
dbゲージ増加量_Branch[i, 1][nPlayer] = increaseBranch[i, 1] / 2.0f;
dbゲージ増加量_Branch[i, 2][nPlayer] = increaseBranch[i, 2] / 2.0f;
break;
case "Extreme":
dbゲージ増加量_Branch[i, 0][nPlayer] = increaseBranch[i, 0] / 4.0f;
dbゲージ増加量_Branch[i, 1][nPlayer] = increaseBranch[i, 1] / 4.0f;
dbゲージ増加量_Branch[i, 2][nPlayer] = increaseBranch[i, 2] / 4.0f;
break;
}
}
#endregion
}
@ -425,12 +465,22 @@ namespace TJAPlayer3
else
fDamage = this.dbゲージ増加量[2][nPlayer];
if (fDamage >= 0)
{
fDamage = -fDamage;
}
var chara = TJAPlayer3.Tx.Characters[TJAPlayer3.SaveFileInstances[TJAPlayer3.GetActualPlayer(nPlayer)].data.Character];
switch (chara.effect.Gauge)
{
case "Hard":
fDamage = -25;
break;
case "Extreme":
fDamage = -50;
break;
}
if (this.bRisky)
{
this.nRiskyTimes--;

View File

@ -400,6 +400,8 @@ namespace TJAPlayer3
this.bLEVELHOLD = new bool[]{ false, false, false, false, false };
this.JPOSCROLLX = new int[5];
this.JPOSCROLLY = new int[5];
eFirstGameType = new EGameType[5];
bSplitLane = new bool[5];
// Double play set here
@ -418,6 +420,7 @@ namespace TJAPlayer3
for (int i = 0; i < TJAPlayer3.ConfigIni.nPlayerCount; i++)
{
actGauge.Init(TJAPlayer3.ConfigIni.nRisky, i); // #23559 2011.7.28 yyagi
eFirstGameType[i] = TJAPlayer3.ConfigIni.nGameType[i];
}
this.nPolyphonicSounds = TJAPlayer3.ConfigIni.nPoliphonicSounds;
e判定表示優先度 = TJAPlayer3.ConfigIni.e判定表示優先度;
@ -488,10 +491,26 @@ namespace TJAPlayer3
// this.gclatencymode = GCSettings.LatencyMode;
// GCSettings.LatencyMode = GCLatencyMode.Batch; // 演奏画面中はGCを抑止する
this.bIsAlreadyCleared = new bool[5];
for (int player = 0; player < TJAPlayer3.ConfigIni.nPlayerCount; player++)
{
var chara = TJAPlayer3.Tx.Characters[TJAPlayer3.SaveFileInstances[TJAPlayer3.GetActualPlayer(player)].data.Character];
switch (chara.effect.Gauge)
{
case "Normal":
bIsAlreadyCleared[player] = false;
break;
case "Hard":
case "Extreme":
bIsAlreadyCleared[player] = true;
break;
}
}
this.bIsAlreadyMaxed = new bool[5];
this.ListDan_Number = 0;
this.IsDanFailed = false;
this.objHandlers = new Dictionary<CDTX.CChip, CCounter>();
}
@ -528,10 +547,27 @@ namespace TJAPlayer3
this.ctチップ模様アニメ.Bass = null;
this.ctチップ模様アニメ.Taiko = null;
this.ctCamHMove = null;
this.ctCamVMove = null;
this.ctCamHScale = null;
this.ctCamVScale = null;
this.ctCamRotation = null;
this.ctCamZoom = null;
TJAPlayer3.borderColor = new SharpDX.Color4(0f, 0f, 0f, 0f);
TJAPlayer3.fCamXOffset = 0.0f;
TJAPlayer3.fCamYOffset = 0.0f;
TJAPlayer3.fCamXScale = 1.0f;
TJAPlayer3.fCamYScale = 1.0f;
TJAPlayer3.fCamRotation = 0.0f;
TJAPlayer3.fCamZoomFactor = 1.0f;
for (int i = 0; i < 5; i++)
{
ctChipAnime[i] = null;
ctChipAnimeLag[i] = null;
TJAPlayer3.ConfigIni.nGameType[i] = eFirstGameType[i];
bSplitLane[i] = false;
}
listWAV.Clear();
@ -876,6 +912,8 @@ namespace TJAPlayer3
protected int nWaitButton;
protected int[] nStoredHit;
private EGameType[] eFirstGameType;
protected bool[] bSplitLane;
public CDTX.CChip[] chip現在処理中の連打チップ = new CDTX.CChip[ 5 ];
@ -1653,7 +1691,7 @@ namespace TJAPlayer3
{
return tチップのヒット処理( nHitTime, pChip, screenmode, bCorrectLane, nNowInput, 0 );
}
protected unsafe E判定 tチップのヒット処理(long nHitTime, CDTX.CChip pChip, E楽器パート screenmode, bool bCorrectLane, int nNowInput, int nPlayer)
protected unsafe E判定 tチップのヒット処理(long nHitTime, CDTX.CChip pChip, E楽器パート screenmode, bool bCorrectLane, int nNowInput, int nPlayer, bool rollEffectHit = false)
{
//unsafeコードにつき、デバッグ中の変更厳禁!
@ -1699,14 +1737,16 @@ namespace TJAPlayer3
CLagLogger.Add(nPlayer, pChip);
}
var puchichara = TJAPlayer3.Tx.Puchichara[PuchiChara.tGetPuchiCharaIndexByName(TJAPlayer3.GetActualPlayer(nPlayer))];
if (NotesManager.IsRoll(pChip))
{
#region[ Drumroll ]
//---------------------------
this.b連打中[nPlayer] = true;
if (bAutoPlay)
if (bAutoPlay || rollEffectHit)
{
int rollSpeed = TJAPlayer3.ConfigIni.nRollsPerSec;
int rollSpeed = bAutoPlay ? TJAPlayer3.ConfigIni.nRollsPerSec : puchichara.effect.Autoroll;
if (TJAPlayer3.ConfigIni.bAIBattleMode && nPlayer == 1)
rollSpeed = TJAPlayer3.ConfigIni.apAIPerformances[TJAPlayer3.ConfigIni.nAILevel - 1].nRollSpeed;
@ -1740,7 +1780,7 @@ namespace TJAPlayer3
}
}
}
else
if (!bAutoPlay && !rollEffectHit)
{
this.eRollState = E連打State.roll;
this.tRollProcess(pChip, (CSound管理.rc演奏用タイマ.n現在時刻 * (((double)TJAPlayer3.ConfigIni.n演奏速度) / 20.0)), 1, nNowInput, 0, nPlayer);
@ -1757,7 +1797,7 @@ namespace TJAPlayer3
this.b連打中[nPlayer] = true;
this.actChara.b風船連打中[nPlayer] = true;
if (bAutoPlay)
if (bAutoPlay || rollEffectHit)
{
bool IsKusudama = NotesManager.IsKusudama(pChip);
@ -1777,14 +1817,12 @@ namespace TJAPlayer3
if (balloon != 0 && this.bPAUSE == false)
{
int rollSpeed = TJAPlayer3.ConfigIni.nRollsPerSec;
if (TJAPlayer3.ConfigIni.bAIBattleMode && nPlayer == 1)
rollSpeed = TJAPlayer3.ConfigIni.apAIPerformances[TJAPlayer3.ConfigIni.nAILevel - 1].nRollSpeed;
int rollSpeed = bAutoPlay ? balloon : puchichara.effect.Autoroll;
int balloonDuration = (pChip.nーツ終了時刻ms - pChip.n発声時刻ms);
int balloonDuration = bAutoPlay ? (pChip.nーツ終了時刻ms - pChip.n発声時刻ms) : 1000;
if ((CSound管理.rc演奏用タイマ.n現在時刻 * (((double)TJAPlayer3.ConfigIni.n演奏速度) / 20.0)) >
(pChip.n発声時刻ms + (balloonDuration / balloon) * rollCount))
(pChip.n発声時刻ms + (balloonDuration / (double)rollSpeed) * rollCount))
{
if (this.nHand[nPlayer] == 0)
this.nHand[nPlayer]++;
@ -1798,7 +1836,7 @@ namespace TJAPlayer3
}
}
}
else
if (!bAutoPlay && !rollEffectHit)
{
this.tBalloonProcess(pChip, (CSound管理.rc演奏用タイマ.n現在時刻 * (((double)TJAPlayer3.ConfigIni.n演奏速度) / 20.0)), nPlayer);
}
@ -1881,6 +1919,19 @@ namespace TJAPlayer3
}
}
var chara = TJAPlayer3.Tx.Characters[TJAPlayer3.SaveFileInstances[TJAPlayer3.GetActualPlayer(nPlayer)].data.Character];
bool cleared = false;
switch (chara.effect.Gauge)
{
case "Normal":
cleared = (int)actGauge.db現在のゲージ値[nPlayer] >= 80;
break;
case "Hard":
case "Extreme":
cleared = (int)actGauge.db現在のゲージ値[nPlayer] > 0;
break;
}
if (eJudgeResult != E判定.Poor && eJudgeResult != E判定.Miss)
{
double dbUnit = (((60.0 / (TJAPlayer3.stage演奏ドラム画面.actPlayInfo.dbBPM[nPlayer]))));
@ -1898,7 +1949,7 @@ namespace TJAPlayer3
}
this.bIsAlreadyMaxed[nPlayer] = true;
}
if ((int)actGauge.db現在のゲージ値[nPlayer] >= 80 && this.bIsAlreadyCleared[nPlayer] == false)
if (cleared && this.bIsAlreadyCleared[nPlayer] == false)
{
if(TJAPlayer3.Skin.Characters_Become_Cleared_Ptn[Character] != 0 && actChara.CharaAction_Balloon_Delay[nPlayer].b終了値に達した)
{
@ -1917,11 +1968,22 @@ namespace TJAPlayer3
{
this.bIsAlreadyMaxed[nPlayer] = false;
}
if ((int)actGauge.db現在のゲージ値[nPlayer] < 80 && this.bIsAlreadyCleared[nPlayer] == true)
if (!cleared && this.bIsAlreadyCleared[nPlayer] == true)
{
this.bIsAlreadyCleared[nPlayer] = false;
TJAPlayer3.stage演奏ドラム画面.actBackground.ClearOut(nPlayer);
//CDTXMania.stage演奏ドラム画面.actBackground.ClearIn(nPlayer);
switch (chara.effect.Gauge)
{
case "Hard":
case "Extreme":
{
CSound管理.rc演奏用タイマ.t一時停止();
TJAPlayer3.DTX.t全チップの再生停止();
ifp[nPlayer] = true;
}
break;
}
}
cInvisibleChip.ShowChipTemporally( pChip.e楽器パート );
}
@ -3871,47 +3933,359 @@ namespace TJAPlayer3
this.bIsGOGOTIME[ nPlayer ] = false;
}
break;
#endregion
#endregion
#region [ a0-a8: EmptySlot ]
case 0xa0:
case 0xa1:
case 0xa2:
case 0xa3:
case 0xa4:
case 0xa5:
case 0xa6:
case 0xa7:
case 0xa8:
break;
#endregion
#region [ B1BC EmptySlot ]
case 0xb1:
case 0xb2:
case 0xb3:
case 0xb4:
case 0xb5:
case 0xb6:
case 0xb7:
case 0xb8:
case 0xb9:
case 0xba:
case 0xbb:
case 0xbc:
break;
#endregion
#region [ c4, c7, d5-d9: EmptySlot ]
case 0xc4:
case 0xc7:
case 0xd5:
case 0xd6: // BGA画像入れ替え
case 0xd7:
case 0xd8:
case 0xd9:
//case 0xe0:
if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
#region [ EXTENDED COMMANDS ]
case 0xa0: //camera vertical move start
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamVMoveChip = pChip;
this.ctCamVMove = new CCounter(0, pChip.fCamTimeMs, 1, TJAPlayer3.Timer);
}
break;
case 0xa1: //camera vertical move end
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
}
break;
case 0xa2: //camera horizontal move start
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamHMoveChip = pChip;
this.ctCamHMove = new CCounter(0, pChip.fCamTimeMs, 1, TJAPlayer3.Timer);
}
break;
case 0xa3: //camera horizontal move end
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
}
break;
case 0xa4: //camera zoom start
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamZoomChip = pChip;
this.ctCamZoom = new CCounter(0, pChip.fCamTimeMs, 1, TJAPlayer3.Timer);
}
break;
case 0xa5: //camera zoom end
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
}
break;
case 0xa6: //camera rotation start
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamRotateChip = pChip;
this.ctCamRotation = new CCounter(0, pChip.fCamTimeMs, 1, TJAPlayer3.Timer);
}
break;
case 0xa7: //camera rotation end
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
}
break;
case 0xa8: //camera vertical scaling start
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamVScaleChip = pChip;
this.ctCamVScale = new CCounter(0, pChip.fCamTimeMs, 1, TJAPlayer3.Timer);
}
break;
case 0xa9: //camera vertical scaling end
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
}
break;
case 0xb0: //camera horizontal scaling start
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamHScaleChip = pChip;
this.ctCamHScale = new CCounter(0, pChip.fCamTimeMs, 1, TJAPlayer3.Timer);
}
break;
case 0xb1: //camera horizontal scaling end
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
}
break;
case 0xb2: //change border color
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
TJAPlayer3.borderColor = pChip.borderColor;
}
break;
case 0xb3: //set camera x offset
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamHMoveChip = pChip;
this.ctCamHMove = new CCounter(0, 0, 1, TJAPlayer3.Timer);
}
break;
case 0xb4: //set camera y offset
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamVMoveChip = pChip;
this.ctCamVMove = new CCounter(0, 0, 1, TJAPlayer3.Timer);
}
break;
case 0xb5: //set camera zoom factor
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamZoomChip = pChip;
this.ctCamZoom = new CCounter(0, 0, 1, TJAPlayer3.Timer);
}
break;
case 0xb6: //set camera rotation
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamRotateChip = pChip;
this.ctCamRotation = new CCounter(0, 0, 1, TJAPlayer3.Timer);
}
break;
case 0xb7: //set camera x scale
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamHScaleChip = pChip;
this.ctCamHScale = new CCounter(0, 0, 1, TJAPlayer3.Timer);
}
break;
case 0xb8: //set camera y scale
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
this.currentCamVScaleChip = pChip;
this.ctCamVScale = new CCounter(0, 0, 1, TJAPlayer3.Timer);
}
break;
case 0xb9: //reset camera
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
TJAPlayer3.borderColor = new SharpDX.Color4(0f, 0f, 0f, 0f);
this.currentCamVMoveChip = pChip;
this.currentCamHMoveChip = pChip;
this.currentCamZoomChip = pChip;
this.currentCamRotateChip = pChip;
this.currentCamVScaleChip = pChip;
this.currentCamHScaleChip = pChip;
this.ctCamVMove = new CCounter(0, 0, 1, TJAPlayer3.Timer);
this.ctCamHMove = new CCounter(0, 0, 1, TJAPlayer3.Timer);
this.ctCamZoom = new CCounter(0, 0, 1, TJAPlayer3.Timer);
this.ctCamRotation = new CCounter(0, 0, 1, TJAPlayer3.Timer);
this.ctCamVScale = new CCounter(0, 0, 1, TJAPlayer3.Timer);
this.ctCamHScale = new CCounter(0, 0, 1, TJAPlayer3.Timer);
}
break;
case 0xba: //enable doron
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
bCustomDoron = true;
}
break;
case 0xbb: //disable doron
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
bCustomDoron = false;
}
break;
case 0xbc: //add object
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
dTX.listObj.TryGetValue(pChip.strObjName, out CSongObject obj);
obj.x = pChip.fObjX;
obj.y = pChip.fObjY;
obj.isVisible = true;
}
break;
case 0xbd: //remove object
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
dTX.listObj.TryGetValue(pChip.strObjName, out CSongObject obj);
obj.isVisible = false;
}
break;
case 0xbe: //object animation start
case 0xc0:
case 0xc2:
case 0xc4:
case 0xc6:
case 0xc8:
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
dTX.listObj.TryGetValue(pChip.strObjName, out pChip.obj);
objHandlers.Add(pChip, new CCounter(0, pChip.fObjTimeMs, 1, TJAPlayer3.Timer));
}
break;
case 0xbf: //object animation end
case 0xc1:
case 0xc3:
case 0xc5:
case 0xc7:
case 0xc9:
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
}
break;
case 0xca: //set object color
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
dTX.listObj.TryGetValue(pChip.strObjName, out CSongObject obj);
obj.color = pChip.borderColor;
}
break;
case 0xcb: //set object y
case 0xcc: //set object x
case 0xcd: //set object vertical scale
case 0xce: //set object horizontal scale
case 0xcf: //set object rotation
case 0xd0: //set object opacity
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
dTX.listObj.TryGetValue(pChip.strObjName, out pChip.obj);
objHandlers.Add(pChip, new CCounter(0, 0, 1, TJAPlayer3.Timer));
}
break;
case 0xd1: //change texture
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
if (TJAPlayer3.Tx.trackedTextures.ContainsKey(pChip.strTargetTxName))
{
TJAPlayer3.Tx.trackedTextures.TryGetValue(pChip.strTargetTxName, out CTexture oldTx);
dTX.listTextures.TryGetValue(pChip.strNewPath, out CTexture newTx);
newTx.Opacity = oldTx.Opacity;
newTx.fZ軸中心回転 = oldTx.fZ軸中心回転;
newTx.vc拡大縮小倍率 = oldTx.vc拡大縮小倍率;
oldTx.UpdateTexture(TJAPlayer3.app.Device, newTx.texture, newTx.sz画像サイズ.Width, newTx.sz画像サイズ.Height);
}
}
break;
case 0xd2: //reset texture
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
if (TJAPlayer3.Tx.trackedTextures.ContainsKey(pChip.strTargetTxName))
{
TJAPlayer3.Tx.trackedTextures.TryGetValue(pChip.strTargetTxName, out CTexture oldTx);
dTX.listOriginalTextures.TryGetValue(pChip.strTargetTxName, out CTexture originalTx);
originalTx.Opacity = oldTx.Opacity;
originalTx.fZ軸中心回転 = oldTx.fZ軸中心回転;
originalTx.vc拡大縮小倍率 = oldTx.vc拡大縮小倍率;
oldTx.UpdateTexture(TJAPlayer3.app.Device, originalTx.texture, originalTx.sz画像サイズ.Width, originalTx.sz画像サイズ.Height);
}
}
break;
case 0xd3: //set config
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
string[] split = pChip.strConfigValue.Split('=');
//TJAPlayer3.Skin.t文字列から読み込み(pChip.strConfigValue, split[0]);
bConfigUpdated = true;
}
break;
case 0xd4: //start object animation
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
dTX.listObj.TryGetValue(pChip.strObjName, out CSongObject obj);
obj.tStartAnimation(pChip.dbAnimInterval, false);
}
break;
case 0xd5: //start object animation (looping)
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
dTX.listObj.TryGetValue(pChip.strObjName, out CSongObject obj);
obj.tStartAnimation(pChip.dbAnimInterval, true);
}
break;
case 0xd6: //end object animation
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
dTX.listObj.TryGetValue(pChip.strObjName, out CSongObject obj);
obj.tStopAnimation();
}
break;
case 0xd7: //set object frame
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
pChip.bHit = true;
dTX.listObj.TryGetValue(pChip.strObjName, out CSongObject obj);
obj.frame = pChip.intFrame;
}
break;
#endregion
#region [ d8-d9: EXTENDED2 ]
case 0xd8:
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
TJAPlayer3.ConfigIni.nGameType[nPlayer] = pChip.eGameType;
pChip.bHit = true;
}
break;
case 0xd9:
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
bSplitLane[nPlayer] = true;
pChip.bHit = true;
}
break;
#endregion
@ -4088,9 +4462,26 @@ namespace TJAPlayer3
return true;
}
break;
#endregion
#endregion
#region [ () ]
#region [ d8-d9: EXTENDED2 ]
case 0xe3:
if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))
{
bSplitLane[nPlayer] = false;
pChip.bHit = true;
}
break;
case 0xe4:
if (!pChip.bHit && (pChip.nバーからの距離dot.Taiko < 0))
{
pChip.bHit = true;
}
this.t進行描画_チップ_小節線(configIni, ref dTX, ref pChip, nPlayer);
break;
#endregion
#region [ () ]
default:
if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
{
@ -4101,6 +4492,145 @@ namespace TJAPlayer3
}
}
#region [ EXTENDED CONTROLS ]
if (ctCamVMove != null) //vertical camera move
{
ctCamVMove.t進行();
float value = 0.0f;
if (currentCamVMoveChip.strCamEaseType.Equals("IN")) value = easing.EaseIn(ctCamVMove, currentCamVMoveChip.fCamScrollStartY, currentCamVMoveChip.fCamScrollEndY, currentCamVMoveChip.fCamMoveType);
if (currentCamVMoveChip.strCamEaseType.Equals("OUT")) value = easing.EaseOut(ctCamVMove, currentCamVMoveChip.fCamScrollStartY, currentCamVMoveChip.fCamScrollEndY, currentCamVMoveChip.fCamMoveType);
if (currentCamVMoveChip.strCamEaseType.Equals("IN_OUT")) value = easing.EaseInOut(ctCamVMove, currentCamVMoveChip.fCamScrollStartY, currentCamVMoveChip.fCamScrollEndY, currentCamVMoveChip.fCamMoveType);
TJAPlayer3.fCamYOffset = float.IsNaN(value) ? currentCamVMoveChip.fCamScrollStartY : value;
if (ctCamVMove.b終了値に達した)
{
ctCamVMove = null;
TJAPlayer3.fCamYOffset = currentCamVMoveChip.fCamScrollEndY;
}
}
if (ctCamHMove != null) //horizontal camera move
{
ctCamHMove.t進行();
float value = 0.0f;
if (currentCamHMoveChip.strCamEaseType.Equals("IN")) value = easing.EaseIn(ctCamHMove, currentCamHMoveChip.fCamScrollStartX, currentCamHMoveChip.fCamScrollEndX, currentCamHMoveChip.fCamMoveType);
if (currentCamHMoveChip.strCamEaseType.Equals("OUT")) value = easing.EaseOut(ctCamHMove, currentCamHMoveChip.fCamScrollStartX, currentCamHMoveChip.fCamScrollEndX, currentCamHMoveChip.fCamMoveType);
if (currentCamHMoveChip.strCamEaseType.Equals("IN_OUT")) value = easing.EaseInOut(ctCamHMove, currentCamHMoveChip.fCamScrollStartX, currentCamHMoveChip.fCamScrollEndX, currentCamHMoveChip.fCamMoveType);
TJAPlayer3.fCamXOffset = float.IsNaN(value) ? currentCamHMoveChip.fCamScrollStartX : value;
if (ctCamHMove.b終了値に達した)
{
ctCamHMove = null;
TJAPlayer3.fCamXOffset = currentCamHMoveChip.fCamScrollEndX;
}
}
if (ctCamZoom != null) //camera zoom
{
ctCamZoom.t進行();
float value = 0.0f;
if (currentCamZoomChip.strCamEaseType.Equals("IN")) value = easing.EaseIn(ctCamZoom, currentCamZoomChip.fCamZoomStart, currentCamZoomChip.fCamZoomEnd, currentCamZoomChip.fCamMoveType);
if (currentCamZoomChip.strCamEaseType.Equals("OUT")) value = easing.EaseOut(ctCamZoom, currentCamZoomChip.fCamZoomStart, currentCamZoomChip.fCamZoomEnd, currentCamZoomChip.fCamMoveType);
if (currentCamZoomChip.strCamEaseType.Equals("IN_OUT")) value = easing.EaseInOut(ctCamZoom, currentCamZoomChip.fCamZoomStart, currentCamZoomChip.fCamZoomEnd, currentCamZoomChip.fCamMoveType);
TJAPlayer3.fCamZoomFactor = float.IsNaN(value) ? currentCamZoomChip.fCamZoomStart : value;
if (ctCamZoom.b終了値に達した)
{
ctCamZoom = null;
TJAPlayer3.fCamZoomFactor = currentCamZoomChip.fCamZoomEnd;
}
}
if (ctCamRotation != null) //camera rotation
{
ctCamRotation.t進行();
float value = 0.0f;
if (currentCamRotateChip.strCamEaseType.Equals("IN")) value = easing.EaseIn(ctCamRotation, currentCamRotateChip.fCamRotationStart, currentCamRotateChip.fCamRotationEnd, currentCamRotateChip.fCamMoveType);
if (currentCamRotateChip.strCamEaseType.Equals("OUT")) value = easing.EaseOut(ctCamRotation, currentCamRotateChip.fCamRotationStart, currentCamRotateChip.fCamRotationEnd, currentCamRotateChip.fCamMoveType);
if (currentCamRotateChip.strCamEaseType.Equals("IN_OUT")) value = easing.EaseInOut(ctCamRotation, currentCamRotateChip.fCamRotationStart, currentCamRotateChip.fCamRotationEnd, currentCamRotateChip.fCamMoveType);
TJAPlayer3.fCamRotation = float.IsNaN(value) ? currentCamRotateChip.fCamRotationStart : value;
if (ctCamRotation.b終了値に達した)
{
ctCamRotation = null;
TJAPlayer3.fCamRotation = currentCamRotateChip.fCamRotationEnd;
}
}
if (ctCamVScale != null) //vertical camera scaling
{
ctCamVScale.t進行();
float value = 0.0f;
if (currentCamVScaleChip.strCamEaseType.Equals("IN")) value = easing.EaseIn(ctCamVScale, currentCamVScaleChip.fCamScaleStartY, currentCamVScaleChip.fCamScaleEndY, currentCamVScaleChip.fCamMoveType);
if (currentCamVScaleChip.strCamEaseType.Equals("OUT")) value = easing.EaseOut(ctCamVScale, currentCamVScaleChip.fCamScaleStartY, currentCamVScaleChip.fCamScaleEndY, currentCamVScaleChip.fCamMoveType);
if (currentCamVScaleChip.strCamEaseType.Equals("IN_OUT")) value = easing.EaseInOut(ctCamVScale, currentCamVScaleChip.fCamScaleStartY, currentCamVScaleChip.fCamScaleEndY, currentCamVScaleChip.fCamMoveType);
TJAPlayer3.fCamYScale = float.IsNaN(value) ? currentCamVScaleChip.fCamScaleStartY : value;
if (ctCamVScale.b終了値に達した)
{
ctCamVScale = null;
TJAPlayer3.fCamYScale = currentCamVScaleChip.fCamScaleEndY;
}
}
if (ctCamHScale != null) //horizontal camera scaling
{
ctCamHScale.t進行();
float value = 0.0f;
if (currentCamHScaleChip.strCamEaseType.Equals("IN")) value = easing.EaseIn(ctCamHScale, currentCamHScaleChip.fCamScaleStartX, currentCamHScaleChip.fCamScaleEndX, currentCamHScaleChip.fCamMoveType);
if (currentCamHScaleChip.strCamEaseType.Equals("OUT")) value = easing.EaseOut(ctCamHScale, currentCamHScaleChip.fCamScaleStartX, currentCamHScaleChip.fCamScaleEndX, currentCamHScaleChip.fCamMoveType);
if (currentCamHScaleChip.strCamEaseType.Equals("IN_OUT")) value = easing.EaseInOut(ctCamHScale, currentCamHScaleChip.fCamScaleStartX, currentCamHScaleChip.fCamScaleEndX, currentCamHScaleChip.fCamMoveType);
TJAPlayer3.fCamXScale = float.IsNaN(value) ? currentCamHScaleChip.fCamScaleStartX : value;
if (ctCamHScale.b終了値に達した)
{
ctCamHScale = null;
TJAPlayer3.fCamXScale = currentCamHScaleChip.fCamScaleEndX;
}
}
foreach (KeyValuePair<CDTX.CChip, CCounter> pair in objHandlers)
{
CDTX.CChip chip = pair.Key;
CCounter counter = pair.Value;
if (counter != null)
{
counter.t進行();
float value = 0.0f;
if (counter.b終了値に達した)
{
value = chip.fObjEnd;
counter = null;
}
else
{
if (chip.strObjEaseType.Equals("IN")) value = easing.EaseIn(counter, chip.fObjStart, chip.fObjEnd, chip.objCalcType);
if (chip.strObjEaseType.Equals("OUT")) value = easing.EaseOut(counter, chip.fObjStart, chip.fObjEnd, chip.objCalcType);
if (chip.strObjEaseType.Equals("IN_OUT")) value = easing.EaseInOut(counter, chip.fObjStart, chip.fObjEnd, chip.objCalcType);
value = float.IsNaN(value) ? chip.fObjStart : value;
}
if (chip.nチャンネル番号 == 0xBE) chip.obj.y = value;
if (chip.nチャンネル番号 == 0xC0) chip.obj.x = value;
if (chip.nチャンネル番号 == 0xC2) chip.obj.yScale = value;
if (chip.nチャンネル番号 == 0xC4) chip.obj.xScale = value;
if (chip.nチャンネル番号 == 0xC6) chip.obj.rotation = value;
if (chip.nチャンネル番号 == 0xC8) chip.obj.opacity = (int)value;
if (chip.nチャンネル番号 == 0xCB) chip.obj.y = value;
if (chip.nチャンネル番号 == 0xCC) chip.obj.x = value;
if (chip.nチャンネル番号 == 0xCD) chip.obj.yScale = value;
if (chip.nチャンネル番号 == 0xCE) chip.obj.xScale = value;
if (chip.nチャンネル番号 == 0xCF) chip.obj.rotation = value;
if (chip.nチャンネル番号 == 0xD0) chip.obj.opacity = (int)value;
}
}
#endregion
return false;
}
@ -4491,6 +5021,29 @@ namespace TJAPlayer3
AIBattleSections[i].IsAnimated = false;
}
TJAPlayer3.fCamXOffset = 0;
TJAPlayer3.fCamYOffset = 0;
TJAPlayer3.fCamZoomFactor = 1.0f;
TJAPlayer3.fCamRotation = 0;
TJAPlayer3.fCamXScale = 1.0f;
TJAPlayer3.fCamYScale = 1.0f;
TJAPlayer3.borderColor = new SharpDX.Color4(1f, 0f, 0f, 0f);
foreach (var chip in TJAPlayer3.DTX.listChip)
{
if (chip.obj == null) continue;
chip.obj.isVisible = false;
chip.obj.yScale = 1.0f;
chip.obj.xScale = 1.0f;
chip.obj.rotation = 0.0f;
chip.obj.opacity = 255;
chip.obj.frame = 0;
}
TJAPlayer3.DTX.t全チップの再生停止とミキサーからの削除();
this.t数値の初期化( true, true );
this.actAVI.tReset();
@ -4502,6 +5055,9 @@ namespace TJAPlayer3
JPOSCROLLX[i] = 0;
JPOSCROLLY[i] = 0;
ifp[i] = false;
TJAPlayer3.ConfigIni.nGameType[i] = eFirstGameType[i];
bSplitLane[i] = false;
}
TJAPlayer3.stage演奏ドラム画面.On活性化();
for( int i = 0; i < TJAPlayer3.ConfigIni.nPlayerCount; i++ )
@ -4937,5 +5493,30 @@ namespace TJAPlayer3
}
}
}
#region [EXTENDED COMMANDS]
private CCounter ctCamVMove;
private CCounter ctCamHMove;
private CCounter ctCamZoom;
private CCounter ctCamRotation;
private CCounter ctCamVScale;
private CCounter ctCamHScale;
private CDTX.CChip currentCamVMoveChip;
private CDTX.CChip currentCamHMoveChip;
private CDTX.CChip currentCamZoomChip;
private CDTX.CChip currentCamRotateChip;
private CDTX.CChip currentCamVScaleChip;
private CDTX.CChip currentCamHScaleChip;
private Dictionary<CDTX.CChip, CCounter> camHandlers;
private Dictionary<CDTX.CChip, CCounter> objHandlers;
private Easing easing = new Easing();
public bool bCustomDoron = false;
private bool bConfigUpdated = false;
#endregion
}
}

View File

@ -1849,7 +1849,7 @@ namespace TJAPlayer3
int n大音符 = (pChip.nチャンネル番号 == 0x11 || pChip.nチャンネル番号 == 0x12 ? 2 : 0);
this.tチップのヒット処理(pChip.n発声時刻ms, pChip, E楽器パート.TAIKO, true, nLane + n大音符, nPlayer);
this.tチップのヒット処理(pChip.n発声時刻ms, pChip, E楽器パート.TAIKO, true, nLane + n大音符, nPlayer, false);
this.tサウンド再生(pChip, nPlayer);
return;
}
@ -1930,7 +1930,7 @@ namespace TJAPlayer3
#endregion
#region[ HIDSUD & STEALTH ]
if( TJAPlayer3.ConfigIni.eSTEALTH[TJAPlayer3.GetActualPlayer(nPlayer)] == Eステルスモード.STEALTH )
if( TJAPlayer3.ConfigIni.eSTEALTH[TJAPlayer3.GetActualPlayer(nPlayer)] == Eステルスモード.STEALTH || TJAPlayer3.stage演奏ドラム画面.bCustomDoron)
{
pChip.bShow = false;
}
@ -1951,6 +1951,18 @@ namespace TJAPlayer3
y += NotesManager.GetNoteY(pChip, time * pChip.dbBPM, _scrollSpeed, TJAPlayer3.Skin.Game_Notes_Interval, play_bpm_time, configIni.eScrollMode, false);
}
if (bSplitLane[nPlayer] || TJAPlayer3.Tx.Puchichara[PuchiChara.tGetPuchiCharaIndexByName(TJAPlayer3.GetActualPlayer(nPlayer))].effect.SplitLane)
{
if (NotesManager.IsDonNote(pChip))
{
y -= TJAPlayer3.Skin.Game_Notes_Size[1] / 3;
}
else if (NotesManager.IsKaNote(pChip))
{
y += TJAPlayer3.Skin.Game_Notes_Size[1] / 3;
}
}
if ( pChip.nバーからの距離dot.Drums < 0 )
{
this.actGame.st叩ききりまショー.b最初のチップが叩かれた = true;
@ -2106,7 +2118,13 @@ namespace TJAPlayer3
}
case 0x1F:
{
NotesManager.DisplayNote(nPlayer, x, y, pChip, num9);
}
break;
default:
{
}
break;
}
@ -2203,9 +2221,29 @@ namespace TJAPlayer3
y += NotesManager.GetNoteY(pChip, time * pChip.dbBPM, _scrollSpeed, TJAPlayer3.Skin.Game_Notes_Interval, play_bpm_time, configIni.eScrollMode, false);
}
if (bSplitLane[nPlayer] || TJAPlayer3.Tx.Puchichara[PuchiChara.tGetPuchiCharaIndexByName(TJAPlayer3.GetActualPlayer(nPlayer))].effect.SplitLane)
{
if (TJAPlayer3.ConfigIni.nGameType[nPlayer] == EGameType.KONGA)
{
if (NotesManager.IsClapRoll(pChip))
{
}
else if (NotesManager.IsYellowRoll(pChip))
{
y += TJAPlayer3.Skin.Game_Notes_Size[1] / 2;
y末端 += TJAPlayer3.Skin.Game_Notes_Size[1] / 2;
}
else if (NotesManager.IsRoll(pChip))
{
y -= TJAPlayer3.Skin.Game_Notes_Size[1] / 2;
y末端 -= TJAPlayer3.Skin.Game_Notes_Size[1] / 2;
}
}
}
#region[ HIDSUD & STEALTH ]
if (TJAPlayer3.ConfigIni.eSTEALTH[TJAPlayer3.GetActualPlayer(nPlayer)] == Eステルスモード.STEALTH)
if (TJAPlayer3.ConfigIni.eSTEALTH[TJAPlayer3.GetActualPlayer(nPlayer)] == Eステルスモード.STEALTH || TJAPlayer3.stage演奏ドラム画面.bCustomDoron)
{
pChip.bShow = false;
}
@ -2401,11 +2439,17 @@ namespace TJAPlayer3
}
}
}
if (pChip.n発声時刻ms < nowTime && pChip.nーツ終了時刻ms > nowTime)
{
var puchichara = TJAPlayer3.Tx.Puchichara[PuchiChara.tGetPuchiCharaIndexByName(TJAPlayer3.GetActualPlayer(nPlayer))];
//時間内でかつ0x9Aじゃないならならヒット処理
if (!NotesManager.IsRollEnd(pChip) && (nPlayer != 1 ? TJAPlayer3.ConfigIni.b太鼓パートAutoPlay[nPlayer] : (TJAPlayer3.ConfigIni.b太鼓パートAutoPlay[nPlayer] || TJAPlayer3.ConfigIni.bAIBattleMode)))
this.tチップのヒット処理(pChip.n発声時刻ms, pChip, E楽器パート.TAIKO, false, 0, nPlayer);
if (!NotesManager.IsRollEnd(pChip) &&
((nPlayer != 1 ? TJAPlayer3.ConfigIni.b太鼓パートAutoPlay[nPlayer] :
(TJAPlayer3.ConfigIni.b太鼓パートAutoPlay[nPlayer] || TJAPlayer3.ConfigIni.bAIBattleMode)) ||
puchichara.effect.Autoroll > 0))
this.tチップのヒット処理(pChip.n発声時刻ms, pChip, E楽器パート.TAIKO, false, 0, nPlayer, puchichara.effect.Autoroll > 0);
}
}
#endregion
@ -2472,7 +2516,7 @@ namespace TJAPlayer3
else
{
//this.tx小節線.t2D描画( CDTXMania.app.Device, x - 3, y, new Rectangle( 0, 0, 3, 130 ) );
TJAPlayer3.Tx.Bar?.t2D描画( TJAPlayer3.app.Device, x + ((TJAPlayer3.Skin.Game_Notes_Size[0] - TJAPlayer3.Tx.Bar.szテクスチャサイズ.Width) / 2), y, new Rectangle( 0, 0, TJAPlayer3.Tx.Bar_Branch.szテクスチャサイズ.Width, TJAPlayer3.Skin.Game_Notes_Size[1]) );
TJAPlayer3.Tx.Bar?.t2D描画( TJAPlayer3.app.Device, x + ((TJAPlayer3.Skin.Game_Notes_Size[0] - TJAPlayer3.Tx.Bar.szテクスチャサイズ.Width) / 2), y, new Rectangle( 0, 0, TJAPlayer3.Tx.Bar.szテクスチャサイズ.Width, TJAPlayer3.Skin.Game_Notes_Size[1]) );
}
}
}

View File

@ -154,6 +154,18 @@ namespace TJAPlayer3
return chip.nチャンネル番号 == 0x1C;
}
public static bool IsDonNote(CDTX.CChip chip)
{
if (chip == null) return false;
return chip.nチャンネル番号 == 0x11 || chip.nチャンネル番号 == 0x13 || chip.nチャンネル番号 == 0x1A;
}
public static bool IsKaNote(CDTX.CChip chip)
{
if (chip == null) return false;
return chip.nチャンネル番号 == 0x12 || chip.nチャンネル番号 == 0x14 || chip.nチャンネル番号 == 0x1B;
}
public static bool IsSmallNote(CDTX.CChip chip, bool blue)
{
if (chip == null) return false;
@ -360,6 +372,16 @@ namespace TJAPlayer3
TJAPlayer3.Tx.Note_Kusu?.t2D描画(TJAPlayer3.app.Device, x, y, new Rectangle(0, frame, length, TJAPlayer3.Skin.Game_Notes_Size[1]));
return;
}
else if (IsADLIB(chip))
{
var puchichara = TJAPlayer3.Tx.Puchichara[PuchiChara.tGetPuchiCharaIndexByName(TJAPlayer3.GetActualPlayer(player))];
if (puchichara.effect.ShowAdlib)
{
TJAPlayer3.Tx.Note_Adlib?.tUpdateOpacity(50);
TJAPlayer3.Tx.Note_Adlib?.t2D描画(TJAPlayer3.app.Device, x, y, new Rectangle(0, frame, length, TJAPlayer3.Skin.Game_Notes_Size[1]));
}
return;
}
TJAPlayer3.Tx.Notes[(int)_gt]?.t2D描画(TJAPlayer3.app.Device, x, y, new Rectangle(noteType * TJAPlayer3.Skin.Game_Notes_Size[0], frame, length, TJAPlayer3.Skin.Game_Notes_Size[1]));
}

View File

@ -467,6 +467,7 @@ namespace TJAPlayer3
float starRate;
float redStarRate;
float[] modMultipliers =
{
TJAPlayer3.stage選曲.actPlayOption.tGetModMultiplier(CActPlayOption.EBalancingType.COINS, false, 0),
@ -476,6 +477,59 @@ namespace TJAPlayer3
TJAPlayer3.stage選曲.actPlayOption.tGetModMultiplier(CActPlayOption.EBalancingType.COINS, false, 4)
};
float getCoinMul(int player)
{
var chara = TJAPlayer3.Tx.Characters[TJAPlayer3.SaveFileInstances[TJAPlayer3.GetActualPlayer(player)].data.Character];
var puchichara = TJAPlayer3.Tx.Puchichara[PuchiChara.tGetPuchiCharaIndexByName(TJAPlayer3.GetActualPlayer(player))];
float charamul = 1.0f;
switch(chara.metadata.Rarity)
{
case "Poor":
charamul = 0.8f;
break;
case "Common":
charamul = 1.0f;
break;
case "Uncommon":
charamul = 1.1f;
break;
case "Rare":
charamul = 1.2f;
break;
case "Epic":
charamul = 1.3f;
break;
case "Legendary":
charamul = 1.5f;
break;
}
float puchimul = 1.0f;
switch (puchichara.metadata.Rarity)
{
case "Poor":
puchimul = 0.8f;
break;
case "Common":
puchimul = 1.0f;
break;
case "Uncommon":
puchimul = 1.1f;
break;
case "Rare":
puchimul = 1.2f;
break;
case "Epic":
puchimul = 1.3f;
break;
case "Legendary":
puchimul = 1.5f;
break;
}
return charamul * puchimul;
}
if (TJAPlayer3.stage選曲.n確定された曲の難易度[0] == (int)Difficulty.Tower)
{
diffModifier = 3;
@ -505,7 +559,7 @@ namespace TJAPlayer3
// this.nEarnedMedalsCount[0] = stars;
this.nEarnedMedalsCount[0] = 5 + (int)((diffModifier * (starRate + redStarRate)) * (floorRate * lengthBonus)) + clearModifier;
this.nEarnedMedalsCount[0] = Math.Max(5, (int)(this.nEarnedMedalsCount[0] * modMultipliers[0]));
this.nEarnedMedalsCount[0] = Math.Max(5, (int)(this.nEarnedMedalsCount[0] * modMultipliers[0] * getCoinMul(0)));
}
else if (TJAPlayer3.stage選曲.n確定された曲の難易度[0] == (int)Difficulty.Dan)
{
@ -560,7 +614,7 @@ namespace TJAPlayer3
else
{
this.nEarnedMedalsCount[0] = 10 + goukakuModifier + clearModifier + (int)(partialScore * dAccuracyRate);
this.nEarnedMedalsCount[0] = Math.Max(10, (int)(this.nEarnedMedalsCount[0] * modMultipliers[0]));
this.nEarnedMedalsCount[0] = Math.Max(10, (int)(this.nEarnedMedalsCount[0] * modMultipliers[0] * getCoinMul(0)));
}
}
else
@ -619,7 +673,7 @@ namespace TJAPlayer3
else
{
this.nEarnedMedalsCount[i] = 5 + (int)((diffModifier * (starRate + redStarRate)) * dAccuracyRate) + clearModifier + scoreRankModifier;
this.nEarnedMedalsCount[i] = Math.Max(5, (int)(this.nEarnedMedalsCount[i] * modMultipliers[i]));
this.nEarnedMedalsCount[i] = Math.Max(5, (int)(this.nEarnedMedalsCount[i] * modMultipliers[i] * getCoinMul(i)));
}
}
}
@ -2018,7 +2072,7 @@ namespace TJAPlayer3
}
else
{
return new bool[] { actParameterPanel.gaugeValues[0] >= 80, actParameterPanel.gaugeValues[1] >= 80, actParameterPanel.gaugeValues[2] >= 80, actParameterPanel.gaugeValues[3] >= 80, actParameterPanel.gaugeValues[4] >= 80 };
return new bool[] { TJAPlayer3.stage演奏ドラム画面.bIsAlreadyCleared[0], TJAPlayer3.stage演奏ドラム画面.bIsAlreadyCleared[1], TJAPlayer3.stage演奏ドラム画面.bIsAlreadyCleared[2], TJAPlayer3.stage演奏ドラム画面.bIsAlreadyCleared[3], TJAPlayer3.stage演奏ドラム画面.bIsAlreadyCleared[4] };
}
}
}

View File

@ -160,6 +160,7 @@
<Compile Include="Songs\C曲リストードComparers\C曲リストードComparerLevelIcon.cs" />
<Compile Include="Songs\C曲リストードComparers\C曲リストードComparerLevel.cs" />
<Compile Include="Songs\C曲リストードComparers\C曲リストードComparerSubtitle.cs" />
<Compile Include="Songs\Extended\CSongObject.cs" />
<Compile Include="Songs\VTTParser.cs" />
<Compile Include="Stages\01.StartUp\CCharacter.cs" />
<Compile Include="Stages\01.StartUp\CPuchichara.cs" />

View File

@ -0,0 +1,3 @@
{
"gauge":"Normal"
}

View File

@ -0,0 +1,6 @@
{
"allpurple":false,
"autoroll":0,
"showadlib":false,
"splitlane":false
}

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 J.MIR
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,8 +1,12 @@
#TITLE:OpenTaiko Chapter I
#TITLEJA:OpenTaiko I
#GENRE:OpenTaiko Chapter I
#BOXEXPLANATION1:Play awesome community-
#BOXEXPLANATION2:made songs submitted
#BOXEXPLANATION3:for OpenTaiko !
#BOXEXPLANATIONJA1:OpenTaikoコミュニティの
#BOXEXPLANATIONJA2:
#BOXEXPLANATIONJA3:!
#BOXTYPE:3
#BGTYPE:6
#BOXCOLOR:#f76b20

View File

@ -1,4 +1,5 @@
#TITLE:OpenTaiko Chapter II
#TITLEJA:OpenTaiko II
#GENRE:OpenTaiko Chapter II
#BOXEXPLANATION1:Play awesome community-
#BOXEXPLANATION2:made songs submitted

View File

@ -1,8 +1,12 @@
#TITLE:Collaborations
#TITLEJA:
#GENRE:Collaborations
#BOXEXPLANATION1:Enjoy songs from projects
#BOXEXPLANATION2:the OpenTaiko team
#BOXEXPLANATION3:collaborated with !
#BOXEXPLANATIONJA1:OpenTaikoチームと
#BOXEXPLANATIONJA2:
#BOXEXPLANATIONJA3:!
#BGTYPE:3
#BGCOLOR:#a200ff
#BOXTYPE:0

View File

@ -1,10 +1,14 @@
#TITLE:Custom Charts
#TITLEJA:
#GENRE:Custom Charts
#FORECOLOR:#FFFFFF
#BACKCOLOR:#316700
#BOXEXPLANATION1:Play a wide range
#BOXEXPLANATION2:of custom charts
#BOXEXPLANATION3:from the community !
#BOXEXPLANATIONJA1:
#BOXEXPLANATIONJA2:!
#BOXEXPLANATIONJA3:!
#BGTYPE:4
#BGCOLOR:#00fc15
#BOXTYPE:0

View File

@ -1,8 +1,12 @@
#TITLE:Downloaded Songs
#TITLEJA:CDNからダウンロードした曲
#GENRE:Download
#BOXEXPLANATION1: Play songs downloaded
#BOXEXPLANATION2: from the Online Lounge !
#BOXEXPLANATION3:
#BOXEXPLANATIONJA1:
#BOXEXPLANATIONJA2:
#BOXEXPLANATIONJA3: !
#BGCOLOR:#ff00a2
#BOXCOLOR:#ff00a2
#BOXTYPE:0

View File

@ -1,8 +1,12 @@
#TITLE:Dan-i Dojo
#TITLEJA:
#GENRE:
#BOXEXPLANATION1:Play multiple charts in continuation
#BOXEXPLANATION2:following challenging exams
#BOXEXPLANATION3:in order to get a PASS rank !
#BOXEXPLANATIONJA1:
#BOXEXPLANATIONJA2:
#BOXEXPLANATIONJA3:!
#BOXTYPE:0
#BGTYPE:7
#BOXCOLOR:#3e51c9

View File

@ -1,7 +1,10 @@
#TITLE:Tower ()
#TITLE:Tower (Sweet)
#TITLEJA:
#GENRE:
#BOXEXPLANATION1:Easy tower charts for
#BOXEXPLANATION2:players of all skill ranges !
#BOXEXPLANATIONJA1:!
#BOXEXPLANATIONJA2:!
#BACKCOLOR:#222222
#BOXCOLOR:#f6ff00
#BOXTYPE:0

View File

@ -1,7 +1,10 @@
#TITLE:Tower ()
#TITLE:Tower (Spicy)
#TITLEJA:
#GENRE:
#BOXEXPLANATION1:Difficult Tower charts
#BOXEXPLANATION2:for true champions !
#BOXEXPLANATIONJA1:!
#BOXEXPLANATIONJA2:!
#BACKCOLOR:#222222
#BOXCOLOR:#ff5e00
#BOXTYPE:0

View File

@ -1,8 +1,12 @@
#TITLE:Taiko Towers
#TITLEJA:
#GENRE:
#BOXEXPLANATION1:Play long charts within a limited
#BOXEXPLANATION2:count of lives and reach
#BOXEXPLANATION3:the top of the tower !
#BOXEXPLANATIONJA1:
#BOXEXPLANATIONJA2:!
#BOXEXPLANATIONJA3:HPが減るから気を付けて!
#BACKCOLOR:#222222
#BOXCOLOR:#ffb300
#BOXTYPE:0

View File

@ -1,10 +1,14 @@
#TITLE:Favorite songs
#TITLEJA:
#GENRE:Favorite
#FORECOLOR:#FFFFFF
#BACKCOLOR:#673100
#BOXEXPLANATION1:Challenge some of
#BOXEXPLANATION2:your favorite songs !
#BOXEXPLANATION3:(Toggle with Left CTRL)
#BOXEXPLANATIONJA1:
#BOXEXPLANATIONJA2:
#BOXEXPLANATIONJA3:!(便!)
#BGTYPE:10
#BOXTYPE:0
#BOXCOLOR:#c71b3b

View File

@ -1,7 +1,11 @@
#TITLE:Recently played songs
#TITLEJA:
#GENRE:
#FORECOLOR:#FFFFFF
#BACKCOLOR:#164748
#BOXEXPLANATION1:Play recently played songs !
#BOXEXPLANATIONJA1:
#BOXEXPLANATIONJA2:
#BOXEXPLANATIONJA3:!
#BGTYPE:9
#BOXTYPE:9

View File

@ -1,9 +1,12 @@
#TITLE:Search by difficulty
#TITLEJA:
#GENRE:SearchD
#FORECOLOR:#FFFFFF
#BACKCOLOR:#213d18
#BOXEXPLANATION1:Search and play songs that
#BOXEXPLANATION2:fit your level !
#BOXEXPLANATIONJA1:
#BOXEXPLANATIONJA2:便!
#BGTYPE:1
#BOXTYPE:0
#BOXCOLOR:#5ac736

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB