Skip to content

Commit

Permalink
Merge pull request #120 from Wieku/dev
Browse files Browse the repository at this point in the history
0.5.2
  • Loading branch information
Wieku authored May 16, 2021
2 parents 934bb80 + 3fbb9b0 commit 7aabdd6
Show file tree
Hide file tree
Showing 52 changed files with 1,206 additions and 725 deletions.
2 changes: 1 addition & 1 deletion app/beatmap/objects/circle.go
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ func (circle *Circle) Draw(time float64, color color2.Color, batch *batch.QuadBa
if settings.DIVIDES < 2 && settings.Objects.DrawComboNumbers {
fnt := skin.GetFont("default")
batch.SetColor(1, 1, 1, alpha*circle.textFade.GetValue())
fnt.DrawOriginV(batch, position.Copy64().Add(circle.hitCircle.GetPosition()), bmath.Origin.Centre, 0.8*fnt.GetSize(), false, strconv.Itoa(int(circle.ComboNumber)))
fnt.DrawOriginV(batch, circle.hitCircle.GetPosition(), bmath.Origin.Centre, 0.8*fnt.GetSize(), false, strconv.Itoa(int(circle.ComboNumber)))
}
} else if !circle.SliderPointEnd {
circle.reverseArrow.SetRotation(circle.ArrowRotation)
Expand Down
2 changes: 1 addition & 1 deletion app/beatmap/objects/spinner.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ func (spinner *Spinner) Draw(time float64, color color2.Color, batch *batch.Quad
scoreFont := skin.GetFont("score")

if spinner.bonusFade.GetValue() > 0.01 {
batch.SetColor(1.0, 1.0, 1.0, spinner.bonusFade.GetValue())
batch.SetColor(1.0, 1.0, 1.0, spinner.bonusFade.GetValue()*alpha)

scoreFont.DrawOrigin(batch, 256, 192+80, bmath.Origin.Centre, spinner.bonusScale.GetValue()*scoreFont.GetSize()*0.8, false, strconv.Itoa(spinner.bonus))
}
Expand Down
49 changes: 23 additions & 26 deletions app/beatmap/parser.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package beatmap

import (
"bufio"
"errors"
"github.com/dimchansky/utfbom"
"github.com/wieku/danser-go/app/beatmap/objects"
"github.com/wieku/danser-go/app/bmath"
"github.com/wieku/danser-go/app/settings"
"github.com/wieku/danser-go/app/skin"
"github.com/wieku/danser-go/framework/util"
"math"
"os"
"path/filepath"
Expand All @@ -16,6 +15,8 @@ import (
"strings"
)

const bufferSize = 10*1024*1024

func parseGeneral(line []string, beatMap *BeatMap) bool {
switch line[0] {
case "Mode":
Expand Down Expand Up @@ -73,7 +74,7 @@ func parseDifficulty(line []string, beatMap *BeatMap) {
switch line[0] {
case "SliderMultiplier":
beatMap.SliderMultiplier, _ = strconv.ParseFloat(line[1], 64)
beatMap.Timings.SliderMult = float64(beatMap.SliderMultiplier)
beatMap.Timings.SliderMult = beatMap.SliderMultiplier
case "ApproachRate":
parsed, _ := strconv.ParseFloat(line[1], 64)
beatMap.Diff.SetAR(parsed)
Expand All @@ -89,6 +90,10 @@ func parseDifficulty(line []string, beatMap *BeatMap) {
case "OverallDifficulty":
parsed, _ := strconv.ParseFloat(line[1], 64)
beatMap.Diff.SetOD(parsed)

if !beatMap.ARSpecified {
beatMap.Diff.SetAR(parsed)
}
}
}

Expand Down Expand Up @@ -138,16 +143,16 @@ func getSection(line string) string {

func ParseBeatMap(beatMap *BeatMap) error {
file, err := os.Open(filepath.Join(settings.General.OsuSongsDir, beatMap.Dir, beatMap.File))
defer file.Close()

if err != nil {
return err
}
scanner := bufio.NewScanner(file)
buf := make([]byte, 0, 10*1024*1024)
scanner.Buffer(buf, cap(buf))

defer file.Close()

scanner := util.NewScannerBuf(file, bufferSize)

var currentSection string

counter := 0

for scanner.Scan() {
Expand Down Expand Up @@ -209,12 +214,6 @@ func ParseBeatMap(beatMap *BeatMap) error {
}
}

if !beatMap.ARSpecified {
beatMap.Diff.SetAR(beatMap.Diff.GetOD())
}

//beatMap.LoadTimingPoints()

file.Seek(0, 0)

if beatMap.Name+beatMap.Artist+beatMap.Creator == "" || counter == 0 {
Expand Down Expand Up @@ -245,15 +244,16 @@ func ParseTimingPointsAndPauses(beatMap *BeatMap) {
}

file, err := os.Open(filepath.Join(settings.General.OsuSongsDir, beatMap.Dir, beatMap.File))
defer file.Close()

if err != nil {
panic(err)
}
scanner := bufio.NewScanner(file)
buf := make([]byte, 0, 10*1024*1024)
scanner.Buffer(buf, cap(buf))

defer file.Close()

scanner := util.NewScannerBuf(file, bufferSize)

var currentSection string

for scanner.Scan() {
line := scanner.Text()

Expand All @@ -278,19 +278,16 @@ func ParseTimingPointsAndPauses(beatMap *BeatMap) {

func ParseObjects(beatMap *BeatMap) {
file, err := os.Open(filepath.Join(settings.General.OsuSongsDir, beatMap.Dir, beatMap.File))
defer file.Close()

if err != nil {
panic(err)
}

fileBom := utfbom.SkipOnly(file)
defer file.Close()

scanner := bufio.NewScanner(fileBom)
scanner := util.NewScannerBuf(file, bufferSize)

buf := make([]byte, 0, 10*1024*1024)
scanner.Buffer(buf, cap(buf))
var currentSection string

for scanner.Scan() {
line := scanner.Text()

Expand All @@ -317,7 +314,7 @@ func ParseObjects(beatMap *BeatMap) {
}
}

sort.Slice(beatMap.HitObjects, func(i, j int) bool {
sort.SliceStable(beatMap.HitObjects, func(i, j int) bool {
return beatMap.HitObjects[i].GetStartTime() < beatMap.HitObjects[j].GetStartTime()
})

Expand Down
6 changes: 0 additions & 6 deletions app/dance/input/relax.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,12 @@ func (processor *RelaxInputProcessor) Update(time float64) {
for _, o := range processed {
circle, c1 := o.(*osu.Circle)
slider, c2 := o.(*osu.Slider)
_, c3 := o.(*osu.Spinner)

objectStartTime := processor.ruleset.GetBeatMap().HitObjects[o.GetNumber()].GetStartTime()
objectEndTime := processor.ruleset.GetBeatMap().HitObjects[o.GetNumber()].GetEndTime()

if ((c1 && !circle.IsHit(player)) || (c2 && !slider.IsStartHit(player))) && time > objectStartTime-12 {
click = true
}

if (c2 || c3) && time >= objectStartTime && time <= objectEndTime {
click = true
}
}

processor.cursor.LeftButton = click && !processor.wasLeft
Expand Down
165 changes: 88 additions & 77 deletions app/dance/movers/spline.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ import (
"math"
)

const (
streamEntryMin = 25
streamEntryMax = 4000
streamEscape = 8000
)

type SplineMover struct {
curve *curves.BSpline
startTime, endTime float64
Expand All @@ -37,125 +43,130 @@ func (mover *SplineMover) SetObjects(objs []objects.IHitObject) int {

for ; i < len(objs); i++ {
o := objs[i]

if i == 0 {
if s, ok := o.(objects.ILongObject); ok {
points = append(points, o.GetStackedEndPositionMod(mover.mods), vector.NewVec2fRad(s.GetEndAngleMod(mover.mods), o.GetStackedEndPositionMod(mover.mods).Dst(objs[i+1].GetStackedStartPositionMod(mover.mods))*0.7).Add(o.GetStackedEndPositionMod(mover.mods)))
}
cEnd := o.GetStackedEndPositionMod(mover.mods)
nStart := objs[i+1].GetStackedStartPositionMod(mover.mods)

var wPoint vector.Vector2f

if s, ok := o.(*objects.Circle); ok {
points = append(points, s.GetStackedEndPositionMod(mover.mods), objs[i+1].GetStackedStartPositionMod(mover.mods).Sub(s.GetStackedEndPositionMod(mover.mods)).Scl(0.333).Add(s.GetStackedEndPositionMod(mover.mods)))
switch s := o.(type) {
case objects.ILongObject:
wPoint = cEnd.Add(vector.NewVec2fRad(s.GetEndAngleMod(mover.mods), cEnd.Dst(nStart)*0.7))
default:
wPoint = cEnd.Lerp(nStart, 0.333)
}

points = append(points, cEnd, wPoint)
timing = append(timing, int64(math.Max(o.GetStartTime(), o.GetEndTime())))

endTime = math.Max(o.GetStartTime(), o.GetEndTime())

continue
}

_, ok := o.(objects.ILongObject)
if _, ok := o.(objects.ILongObject); ok || i == len(objs)-1 {
pEnd := objs[i-1].GetStackedEndPositionMod(mover.mods)
cStart := o.GetStackedStartPositionMod(mover.mods)

if ok || i == len(objs)-1 {
if s, ok := o.(objects.ILongObject); ok {
points = append(points, vector.NewVec2fRad(s.GetStartAngleMod(mover.mods), o.GetStackedStartPositionMod(mover.mods).Dst(objs[i-1].GetStackedEndPositionMod(mover.mods))*0.7).Add(o.GetStackedStartPositionMod(mover.mods)), o.GetStackedStartPositionMod(mover.mods))
}
var wPoint vector.Vector2f

if s, ok := o.(*objects.Circle); ok {
points = append(points, objs[i-1].GetStackedEndPositionMod(mover.mods).Sub(s.GetStackedStartPositionMod(mover.mods)).Scl(0.333).Add(s.GetStackedStartPositionMod(mover.mods)), s.GetStackedStartPositionMod(mover.mods))
switch s := o.(type) {
case objects.ILongObject:
wPoint = cStart.Add(vector.NewVec2fRad(s.GetStartAngleMod(mover.mods), cStart.Dst(pEnd)*0.7))
default:
wPoint = cStart.Lerp(pEnd, 0.333)
}

points = append(points, wPoint, cStart)
timing = append(timing, int64(o.GetStartTime()))

startTime = o.GetStartTime()

break
} else if i < len(objs)-1 && i-1 > 0 {
if _, ok := o.(*objects.Circle); ok {
pos1 := objs[i-1].GetStackedStartPositionMod(mover.mods)
pos2 := o.GetStackedStartPositionMod(mover.mods)
pos3 := objs[i+1].GetStackedStartPositionMod(mover.mods)

min := float32(25.0)
max := float32(4000.0)
if stream {
max = 8000
}
} else if i > 1 && i < len(objs)-1 {
pos1 := objs[i-1].GetStackedStartPositionMod(mover.mods)
pos2 := o.GetStackedStartPositionMod(mover.mods)
pos3 := objs[i+1].GetStackedStartPositionMod(mover.mods)

min := float32(streamEntryMin)
max := float32(streamEntryMax)
if stream {
max = streamEscape
}

sq1 := pos1.DstSq(pos2)
sq2 := pos2.DstSq(pos3)
sq1 := pos1.DstSq(pos2)
sq2 := pos2.DstSq(pos3)

if sq1 > max && sq2 > max && settings.Dance.Spline.RotationalForce {
if stream {
angle = 0
stream = false
} else {
ang := int(math32.Abs(pos1.Sub(pos2).AngleR() - pos1.Sub(pos3).AngleR()))
if sq1 > max && sq2 > max && settings.Dance.Spline.RotationalForce {
if stream {
angle = 0
stream = false
} else {
ang := int(math32.Abs(pos1.AngleRV(pos2) - pos1.AngleRV(pos3)))

if ang == 0 {
angle *= -1
} else {
angle = float32(ang) * 90 / 180 * math32.Pi
}
}
} else if sq1 >= min && sq2 >= min && sq1 <= max && sq2 <= max && (settings.Dance.Spline.StreamWobble || settings.Dance.Spline.StreamHalfCircle) {
if stream {
if ang == 0 {
angle *= -1
} else {
angle = float32(ang) * 90 / 180 * math32.Pi
}
}
} else if sq1 >= min && sq1 <= max && sq2 >= min && sq2 <= max && (settings.Dance.Spline.StreamWobble || settings.Dance.Spline.StreamHalfCircle) {
if stream {
angle *= -1

if math32.Abs(angle) < 0.01 {
pp1 := points[len(points)-1]
if math32.Abs(angle) < 0.01 {
pp1 := points[len(points)-1]

shoeF := pp1.X*pos2.Y + pos2.X*pos3.Y + pos3.X*pp1.Y
shoeS := pp1.Y*pos2.X + pos2.Y*pos3.X + pos3.Y*pp1.X
shoeF := pp1.X*pos2.Y + pos2.X*pos3.Y + pos3.X*pp1.Y
shoeS := pp1.Y*pos2.X + pos2.Y*pos3.X + pos3.Y*pp1.X

sig := (shoeF - shoeS) > 0
sig := (shoeF - shoeS) > 0

angle = math32.Pi / 2
if sig {
angle *= -1
}
angle = math32.Pi / 2
if sig {
angle *= -1
}
} else {
stream = true
}
} else {
stream = false
angle = 0
stream = true
}
} else {
stream = false
angle = 0
}

if math32.Abs(angle) > 0.01 {
mid := pos1.Mid(pos2)

scale := float32(1.0)
if stream && !settings.Dance.Spline.StreamHalfCircle {
scale = float32(settings.Dance.Spline.WobbleScale)
}
if math32.Abs(angle) > 0.01 {
mid := pos1.Mid(pos2)

if stream && settings.Dance.Spline.StreamHalfCircle {
sign := -1
if angle < 0 {
sign = 1
}
scale := float32(1.0)
if stream && !settings.Dance.Spline.StreamHalfCircle {
scale = float32(settings.Dance.Spline.WobbleScale)
}

for t := -2; t <= 2; t++ {
p4 := mid.Sub(pos1).Scl(scale).Rotate(angle + float32(sign*t)*math32.Pi/6).Add(mid)
if stream && settings.Dance.Spline.StreamHalfCircle {
sign := -1
if angle < 0 {
sign = 1
}

points = append(points, p4)
timing = append(timing, int64((o.GetStartTime()-objs[i-1].GetStartTime())*(3+float64(t))/6+objs[i-1].GetStartTime()))
}
} else {
p4 := mid.Sub(pos1).Scl(scale).Rotate(angle).Add(mid)
for t := -2; t <= 2; t++ {
p4 := mid.Sub(pos1).Scl(scale).Rotate(angle + float32(sign*t)*math32.Pi/6).Add(mid)

points = append(points, p4)
timing = append(timing, int64((o.GetStartTime()-objs[i-1].GetStartTime())/2+objs[i-1].GetStartTime()))
timing = append(timing, int64((o.GetStartTime()-objs[i-1].GetStartTime())*(3+float64(t))/6+objs[i-1].GetStartTime()))
}
} else {
p4 := mid.Sub(pos1).Scl(scale).Rotate(angle).Add(mid)

points = append(points, p4)
timing = append(timing, int64((o.GetStartTime()-objs[i-1].GetStartTime())/2+objs[i-1].GetStartTime()))
}
}
}

if s, ok := o.(*objects.Circle); ok {
points = append(points, s.GetStackedEndPositionMod(mover.mods))
timing = append(timing, int64(s.GetStartTime()))
}
points = append(points, o.GetStackedEndPositionMod(mover.mods))
timing = append(timing, int64(o.GetStartTime()))
}

mover.startTime = startTime
Expand Down
Loading

0 comments on commit 7aabdd6

Please sign in to comment.