package com.fteams.siftrain;
import com.badlogic.gdx.utils.Array;
import com.fteams.siftrain.assets.Assets;
import com.fteams.siftrain.assets.GlobalConfiguration;
import com.fteams.siftrain.entities.SimpleNotesInfo;
import com.fteams.siftrain.objects.AccuracyMarker;
import com.fteams.siftrain.objects.AccuracyPopup;
import com.fteams.siftrain.objects.CircleMark;
import com.fteams.siftrain.objects.TapZone;
import com.fteams.siftrain.util.SongUtils;
import com.fteams.siftrain.util.random.ExtremeRandomizer;
import com.fteams.siftrain.util.random.KeepSidesRandomizer;
import com.fteams.siftrain.util.random.MirroredKeepSidesRandomizer;
import com.fteams.siftrain.util.random.NewAlgorithmRandomizer;
import com.fteams.siftrain.util.random.OldAlgorithmRandomizer;
import com.fteams.siftrain.util.random.Randomizer;
import com.fteams.siftrain.util.random.SimpleRandomizer;
public class World {
int width;
int height;
/**
* The 9 zones the user can tap
*/
Array<TapZone> zones = new Array<>();
/**
* The notes which spawn from the center
*/
Array<CircleMark> marks = new Array<>();
public int combo;
public boolean started;
public int offsetX;
public int offsetY;
private Array<AccuracyMarker> accuracyMarkers;
private Array<AccuracyPopup> accuracyPopups;
public boolean paused;
// Getters -----------
public Array<TapZone> getZones() {
return zones;
}
// --------------------
public World() {
createWorld();
}
public float delay;
private void createWorld() {
float x = 0f;
float y = 0f;
Double noteSpeed = SongUtils.getDefaultNoteSpeedForApproachRate(GlobalConfiguration.noteSpeed);
delay = Assets.selectedSong.lead_in != null ? Assets.selectedSong.lead_in : noteSpeed.floatValue();
for (SimpleNotesInfo notesInfo : Assets.selectedSong.song_info.get(0).notes) {
SimpleNotesInfo copy = copy(notesInfo);
if (GlobalConfiguration.playbackMode != null && GlobalConfiguration.playbackMode.equals(SongUtils.GAME_MODE_ABREPEAT)) {
if (GlobalConfiguration.aTime != null) {
if (copy.timing_sec < GlobalConfiguration.aTime) {
continue;
}
}
if (GlobalConfiguration.bTime != null) {
if (copy.timing_sec > GlobalConfiguration.bTime + 2f) {
continue;
}
}
}
if (GlobalConfiguration.playbackRate != null) {
copy.timing_sec = copy.timing_sec / GlobalConfiguration.playbackRate;
if ((copy.effect & SongUtils.NOTE_TYPE_HOLD) != 0 && copy.effect_value != null) {
copy.effect_value = copy.effect_value / GlobalConfiguration.playbackRate;
}
}
CircleMark mark = new CircleMark(x, y, copy, noteSpeed, delay);
marks.add(mark);
}
marks.sort();
if (GlobalConfiguration.random) {
switch (GlobalConfiguration.randomMode) {
case 0: {
Randomizer oldAlgorithmRandomizer = new OldAlgorithmRandomizer();
oldAlgorithmRandomizer.randomize(marks);
break;
}
case 1: {
Randomizer newAlgorithmRandomizer = new NewAlgorithmRandomizer();
newAlgorithmRandomizer.randomize(marks);
break;
}
case 2: {
Randomizer keepSidesRandomizer = new KeepSidesRandomizer();
keepSidesRandomizer.randomize(marks);
break;
}
case 3: {
Randomizer mirroredKeepSidesRandomizer = new MirroredKeepSidesRandomizer();
mirroredKeepSidesRandomizer.randomize(marks);
break;
}
case 4: {
Randomizer simpleRandomizer = new SimpleRandomizer();
simpleRandomizer.randomize(marks);
break;
}
case 5: {
Randomizer extremeRandomizer = new ExtremeRandomizer();
extremeRandomizer.randomize(marks);
break;
}
default:
break;
}
}
float step = (float) (Math.PI / 8);
float distance = 600f / 2 - 400f * 0.1275f;
for (int i = 0; i < 9; i++) {
float angle = step * i;
x = (float) (distance * Math.cos(angle));
y = -(float) (distance * Math.sin(angle));
TapZone zone = new TapZone(x, y, i + 1);
zones.add(zone);
}
this.accuracyMarkers = new Array<>();
this.accuracyPopups = new Array<>();
paused = false;
}
private SimpleNotesInfo copy(SimpleNotesInfo notesInfo) {
SimpleNotesInfo copy = new SimpleNotesInfo();
copy.timing_sec = notesInfo.timing_sec;
copy.position = notesInfo.position;
copy.effect = notesInfo.effect;
copy.effect_value = notesInfo.effect_value;
return copy;
}
public float getDuration() {
float timing = 0f;
for (SimpleNotesInfo note : Assets.selectedSong.song_info.get(0).notes) {
if (timing < note.timing_sec) {
timing = note.timing_sec.floatValue();
}
}
return timing;
}
public void setSize(int width, int height, int offsetX, int offsetY) {
this.width = width;
this.height = height;
this.offsetX = offsetX;
this.offsetY = offsetY;
}
public Array<CircleMark> getMarks() {
return marks;
}
public Array<AccuracyMarker> getAccuracyMarkers() {
return accuracyMarkers;
}
public Array<AccuracyPopup> getAccuracyPopups() {
return accuracyPopups;
}
}