WIP splitting BR mode into files
This commit is contained in:
parent
58c11048a9
commit
b2c3079310
3 changed files with 41 additions and 32 deletions
|
|
@ -13,8 +13,8 @@ type Circle struct {
|
||||||
cptr *C.Circle
|
cptr *C.Circle
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCircle(x float64, y float64, rad float64) Circle {
|
func NewCircle(x float64, y float64, rad float64) *Circle {
|
||||||
return Circle{
|
return &Circle{
|
||||||
cptr: C.new_circle(C.double(x), C.double(y), C.double(rad)),
|
cptr: C.new_circle(C.double(x), C.double(y), C.double(rad)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -24,7 +24,7 @@ func (c *Circle) UpdatePos(x float64, y float64) {
|
||||||
c.cptr.y = C.double(y)
|
c.cptr.y = C.double(y)
|
||||||
}
|
}
|
||||||
|
|
||||||
func DestroyCircle(circle Circle) {
|
func DestroyCircle(circle *Circle) {
|
||||||
if circle.cptr == nil {
|
if circle.cptr == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -41,8 +41,8 @@ type Bullet struct {
|
||||||
cptr *C.Bullet
|
cptr *C.Bullet
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLinearBullet(tick int64, spawnX float64, spawnY float64, radius float64, velX float64, velY float64) Bullet {
|
func NewLinearBullet(tick int64, spawnX float64, spawnY float64, radius float64, velX float64, velY float64) *Bullet {
|
||||||
return Bullet{
|
return &Bullet{
|
||||||
cptr: C.new_bullet(
|
cptr: C.new_bullet(
|
||||||
C.uint8_t(0),
|
C.uint8_t(0),
|
||||||
C.int64_t(tick),
|
C.int64_t(tick),
|
||||||
|
|
@ -55,7 +55,7 @@ func NewLinearBullet(tick int64, spawnX float64, spawnY float64, radius float64,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func DestroyBullet(bullet Bullet) {
|
func DestroyBullet(bullet *Bullet) {
|
||||||
if bullet.cptr == nil {
|
if bullet.cptr == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -67,7 +67,7 @@ func (b *Bullet) BeyondKillBoundary(tick int64) bool {
|
||||||
return bool(C.bullet_beyond_kill_boundary(b.cptr, C.int64_t(tick)))
|
return bool(C.bullet_beyond_kill_boundary(b.cptr, C.int64_t(tick)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Bullet) CollidesWith(circle Circle, tick int64) bool {
|
func (b *Bullet) CollidesWith(circle *Circle, tick int64) bool {
|
||||||
return bool(C.bullet_collides_with(b.cptr, C.int64_t(tick), circle.cptr))
|
return bool(C.bullet_collides_with(b.cptr, C.int64_t(tick), circle.cptr))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,17 +35,6 @@ const (
|
||||||
// Interface for registering match handlers
|
// Interface for registering match handlers
|
||||||
type Match struct{}
|
type Match struct{}
|
||||||
|
|
||||||
type PlayerStageState struct {
|
|
||||||
hitCol ffi.Circle
|
|
||||||
grazeCol ffi.Circle
|
|
||||||
bullets []ffi.Bullet
|
|
||||||
updatePlayerPos bool
|
|
||||||
health int
|
|
||||||
graze int
|
|
||||||
score int
|
|
||||||
deathTimer int
|
|
||||||
}
|
|
||||||
|
|
||||||
type PlayerUpdate struct {
|
type PlayerUpdate struct {
|
||||||
X float64 `json:"x"`
|
X float64 `json:"x"`
|
||||||
Y float64 `json:"y"`
|
Y float64 `json:"y"`
|
||||||
|
|
@ -62,8 +51,8 @@ type GameTickUpdate struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type PresenceState struct { // present time! hahahahahahahah!
|
type PresenceState struct { // present time! hahahahahahahah!
|
||||||
presence runtime.Presence
|
presence *runtime.Presence
|
||||||
stageState PlayerStageState
|
stageState *PlayerStageState
|
||||||
}
|
}
|
||||||
|
|
||||||
type BattleRoyaleMatchState struct {
|
type BattleRoyaleMatchState struct {
|
||||||
|
|
@ -110,15 +99,8 @@ func (m *Match) MatchJoin(ctx context.Context, logger runtime.Logger, db *sql.DB
|
||||||
|
|
||||||
for i := 0; i < len(presences); i++ {
|
for i := 0; i < len(presences); i++ {
|
||||||
lobbyState.presences[presences[i].GetSessionId()] = &PresenceState{
|
lobbyState.presences[presences[i].GetSessionId()] = &PresenceState{
|
||||||
presence: presences[i],
|
presence: &presences[i],
|
||||||
stageState: PlayerStageState{
|
stageState: NewPlayerStage(),
|
||||||
hitCol: ffi.NewCircle(STAGE_WIDTH*0.5, STAGE_HEIGHT-STAGE_HEIGHT*0.1, STAGE_WIDTH*PLAYER_HIT_COL_RADIUS_MULTIPLIER),
|
|
||||||
grazeCol: ffi.NewCircle(STAGE_WIDTH*0.5, STAGE_HEIGHT-STAGE_HEIGHT*0.1, STAGE_WIDTH*PLAYER_GRAZE_COL_RADIUS_MULTIPLIER),
|
|
||||||
bullets: []ffi.Bullet{},
|
|
||||||
updatePlayerPos: true,
|
|
||||||
health: 3,
|
|
||||||
deathTimer: -1,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -225,7 +207,7 @@ func (m *Match) MatchLoop(ctx context.Context, logger runtime.Logger, db *sql.DB
|
||||||
// Compute and broadcast per-presence state
|
// Compute and broadcast per-presence state
|
||||||
for _, v := range lobbyState.presences {
|
for _, v := range lobbyState.presences {
|
||||||
// Clean up bullets when they pass off the board
|
// Clean up bullets when they pass off the board
|
||||||
v.stageState.bullets = slices.DeleteFunc(v.stageState.bullets, func(b ffi.Bullet) bool {
|
v.stageState.bullets = slices.DeleteFunc(v.stageState.bullets, func(b *ffi.Bullet) bool {
|
||||||
if b.BeyondKillBoundary(tick) {
|
if b.BeyondKillBoundary(tick) {
|
||||||
ffi.DestroyBullet(b)
|
ffi.DestroyBullet(b)
|
||||||
return true
|
return true
|
||||||
|
|
@ -243,11 +225,11 @@ func (m *Match) MatchLoop(ctx context.Context, logger runtime.Logger, db *sql.DB
|
||||||
v.stageState.grazeCol.UpdatePos(STAGE_WIDTH*0.5, STAGE_HEIGHT-STAGE_HEIGHT*0.1)
|
v.stageState.grazeCol.UpdatePos(STAGE_WIDTH*0.5, STAGE_HEIGHT-STAGE_HEIGHT*0.1)
|
||||||
v.stageState.updatePlayerPos = true
|
v.stageState.updatePlayerPos = true
|
||||||
} else if v.stageState.deathTimer == -1 { // If the player is alive, check if the player collided with a bullet and kill them if so
|
} else if v.stageState.deathTimer == -1 { // If the player is alive, check if the player collided with a bullet and kill them if so
|
||||||
if slices.ContainsFunc(v.stageState.bullets, func(b ffi.Bullet) bool {
|
if slices.ContainsFunc(v.stageState.bullets, func(b *ffi.Bullet) bool {
|
||||||
return b.CollidesWith(v.stageState.hitCol, tick)
|
return b.CollidesWith(v.stageState.hitCol, tick)
|
||||||
}) {
|
}) {
|
||||||
v.stageState.deathTimer = PLAYER_DEATH_TIMER_MAX
|
v.stageState.deathTimer = PLAYER_DEATH_TIMER_MAX
|
||||||
} else if slices.ContainsFunc(v.stageState.bullets, func(b ffi.Bullet) bool { // Otherwise, check the graze col and increment the graze and score
|
} else if slices.ContainsFunc(v.stageState.bullets, func(b *ffi.Bullet) bool { // Otherwise, check the graze col and increment the graze and score
|
||||||
return b.CollidesWith(v.stageState.grazeCol, tick)
|
return b.CollidesWith(v.stageState.grazeCol, tick)
|
||||||
}) {
|
}) {
|
||||||
v.stageState.graze += GRAZE_ADDITION_MULTIPLIER
|
v.stageState.graze += GRAZE_ADDITION_MULTIPLIER
|
||||||
|
|
|
||||||
27
server/game-modes/battle-royale/player-stage.go
Normal file
27
server/game-modes/battle-royale/player-stage.go
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
package battleroyale
|
||||||
|
|
||||||
|
import (
|
||||||
|
"danmaku/ffi"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PlayerStageState struct {
|
||||||
|
hitCol *ffi.Circle
|
||||||
|
grazeCol *ffi.Circle
|
||||||
|
bullets []*ffi.Bullet
|
||||||
|
updatePlayerPos bool
|
||||||
|
health int
|
||||||
|
graze int
|
||||||
|
score int
|
||||||
|
deathTimer int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPlayerStage() *PlayerStageState {
|
||||||
|
return &PlayerStageState{
|
||||||
|
hitCol: ffi.NewCircle(STAGE_WIDTH*0.5, STAGE_HEIGHT-STAGE_HEIGHT*0.1, STAGE_WIDTH*PLAYER_HIT_COL_RADIUS_MULTIPLIER),
|
||||||
|
grazeCol: ffi.NewCircle(STAGE_WIDTH*0.5, STAGE_HEIGHT-STAGE_HEIGHT*0.1, STAGE_WIDTH*PLAYER_GRAZE_COL_RADIUS_MULTIPLIER),
|
||||||
|
bullets: []*ffi.Bullet{},
|
||||||
|
updatePlayerPos: true,
|
||||||
|
health: 3,
|
||||||
|
deathTimer: -1,
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in a new issue