func (p *burstProcess) Think(g *game.Game) { _player := g.GetEnt(p.Player_id) player := _player.(*game.Player) if p.Remaining_initial.Magnitude() == 0 { if p.count > 0 { p.count = -1 } p.Frames-- if p.Frames <= 0 { p.The_phase = game.PhaseComplete } for i := range g.Ents { other := g.Ents[i] if other == player { continue } dist := other.Pos().Sub(player.Pos()).Mag() if dist < 1 { dist = 1 } force := p.Force / dist other.ApplyForce(other.Pos().Sub(player.Pos()).Norm().Scale(force)) } } }
func (p *pullProcess) Think(g *game.Game) { defer p.reset() player, ok := g.Ents[p.PlayerGid].(*game.PlayerEnt) if !ok { return } base_force := p.Force * p.supplied / p.required() g.DoForEnts(func(gid game.Gid, ent game.Ent) { if ent == game.Ent(player) { return } target_pos := ent.Pos() ray := target_pos.Sub(player.Pos()) target_angle := ray.Angle() - player.Angle for target_angle < 0 { target_angle += math.Pi * 2 } for target_angle > math.Pi*2 { target_angle -= math.Pi * 2 } if target_angle > p.Angle/2 && target_angle < math.Pi*2-p.Angle/2 { return } ray = player.Pos().Sub(ent.Pos()) // dist := ray.Mag() ray = ray.Norm() force := base_force // / math.Pow(dist, p.Angle/(2*math.Pi)) ent.ApplyForce(ray.Scale(-force)) player.ApplyForce(ray.Scale(force).Scale(0.01)) }) }
func (p *pullProcess) Think(g *game.Game) { _player := g.GetEnt(p.Player_id) player := _player.(*game.Player) base_force := p.Force * p.supplied / p.required for _, _target := range g.Ents { target, ok := _target.(*game.Player) if !ok || target == player { continue } target_pos := linear.Vec2{target.X, target.Y} ray := target_pos.Sub(player.Pos()) target_angle := ray.Angle() - player.Angle for target_angle < 0 { target_angle += math.Pi * 2 } for target_angle > math.Pi*2 { target_angle -= math.Pi * 2 } if target_angle > p.Angle/2 && target_angle < math.Pi*2-p.Angle/2 { continue } ray = player.Pos().Sub(target.Pos()) // dist := ray.Mag() ray = ray.Norm() force := base_force // / math.Pow(dist, p.Angle/(2*math.Pi)) target.ApplyForce(ray.Scale(-force)) player.ApplyForce(ray.Scale(force)) } }
func (p *burstProcess) Think(g *game.Game) { player, ok := g.Ents[p.PlayerGid].(*game.PlayerEnt) if !ok { return } if p.Remaining_initial.Magnitude() == 0 { if p.count > 0 { p.count = -1 } p.Frames-- if p.Frames <= 0 { p.The_phase = game.PhaseComplete } g.DoForEnts(func(gid game.Gid, other game.Ent) { if other == player { return } dist := other.Pos().Sub(player.Pos()).Mag() if dist < 1 { dist = 1 } force := p.Force / dist other.ApplyForce(other.Pos().Sub(player.Pos()).Norm().Scale(force)) }) } }
func (p *burstProcess) Draw(player_id int, g *game.Game) { player := g.GetEnt(player_id).(*game.Player) base.EnableShader("circle") prog := p.Remaining_initial.Magnitude() / p.Initial.Magnitude() base.SetUniformF("circle", "progress", 1-float32(prog)) gl.Color4ub(255, 255, 255, 255) radius := 40.0 texture.Render( player.X-radius, player.Y-radius, 2*radius, 2*radius) base.EnableShader("") }
func (p *pullProcess) Draw(player_id int, g *game.Game) { gl.Color4d(1, 1, 1, 1) gl.Disable(gl.TEXTURE_2D) player := g.GetEnt(player_id).(*game.Player) v1 := player.Pos() v2 := v1.Add(linear.Vec2{1000, 0}) v3 := v2.RotateAround(v1, player.Angle-p.Angle/2) v4 := v2.RotateAround(v1, player.Angle+p.Angle/2) gl.Begin(gl.LINES) vs := []linear.Vec2{v3, v4, linear.Vec2{player.X, player.Y}} for i := range vs { gl.Vertex2d(gl.Double(vs[i].X), gl.Double(vs[i].Y)) gl.Vertex2d(gl.Double(vs[(i+1)%len(vs)].X), gl.Double(vs[(i+1)%len(vs)].Y)) } gl.End() s := fmt.Sprintf("%.2f", p.supplied) base.Log().Printf("'%s'", s) if true { base.GetDictionary("luxisr").RenderString(s, 10, 10, 0, 50, gin.Left) } }
func (f *fireProcessExplosion) Think(g *game.Game) { g.DoForEnts(func(gid game.Gid, ent game.Ent) { for _, expl := range f.Explosions { if expl.Size() == 0 { continue } if expl.Pos.Sub(ent.Pos()).Mag() <= expl.Size() { ent.Stats().ApplyDamage(stats.Damage{stats.DamageFire, 1}) } } }) done := true for i := range f.Explosions { f.Explosions[i].Think() if !f.Explosions[i].Done() { done = false } } if done { f.The_phase = game.PhaseComplete } }
func main() { fmt.Printf("%v\n", key_map) sys.Startup() err := gl.Init() if err != nil { panic(err) } render.Init() render.Queue(func() { sys.CreateWindow(10, 10, wdx, wdy) sys.EnableVSync(true) err := gl.Init() if err != nil { panic(err) } }) base.InitShaders() runtime.GOMAXPROCS(2) ui, err = gui.Make(gin.In(), gui.Dims{wdx, wdy}, filepath.Join(datadir, "fonts", "skia.ttf")) if err != nil { panic(err) } sys.Think() for false && len(sys.GetActiveDevices()[gin.DeviceTypeController]) < 2 { time.Sleep(time.Millisecond * 100) sys.Think() } var ids []int var engine *cgf.Engine var room game.Room err = base.LoadJson(filepath.Join(base.GetDataDir(), "rooms/basic.json"), &room) if err != nil { panic(err) } if IsHost() { sys.Think() var g game.Game g.Rng = cmwc.MakeGoodCmwc() g.Rng.SeedWithDevRand() g.Dx = 900 g.Dy = 600 g.Friction = 0.97 g.Friction_lava = 0.85 g.Room = room var p game.Player p.Color.R = 255 err := json.NewDecoder(bytes.NewBuffer([]byte(` { "Base": { "Max_turn": 0.07, "Max_acc": 0.2, "Mass": 750, "Max_rate": 10, "Influence": 75, "Health": 1000 }, "Dynamic": { "Health": 1000 } } `))).Decode(&p.Stats) if err != nil { panic(err) } Nx := 2 Ny := 1 p.X = float64(g.Dx-Nx)/2 - 200 p.Y = float64(g.Dy-Ny)/2 - 200 for x := 0; x < Nx; x++ { for y := 0; y < Ny; y++ { p.X += float64(x * 25) p.Y += float64(y * 25) p.Gid++ // p.Mass += float64(x+y) * 150 p.Processes = make(map[int]game.Process) temp := p ids = append(ids, g.AddEnt(&temp)) // p.Mass -= float64(x+y) * 150 p.X -= float64(x * 25) p.Y -= float64(y * 25) } } g.Ents[0].(*game.Player).X = 500 g.Ents[0].(*game.Player).Y = 300 g.Ents[1].(*game.Player).X = 550 g.Ents[1].(*game.Player).Y = 300 g.SetLocalData() d := sys.GetActiveDevices() base.Log().Printf("%v\n", d) n := 0 base.Log().Printf("%v\n", d[gin.DeviceTypeController]) for _, index := range d[gin.DeviceTypeController] { // panic("ASD") g.SetLocalPlayer(g.Ents[n].(*game.Player), index) n++ if n > 2 { break } } if len(d[gin.DeviceTypeController]) == 0 { g.SetLocalPlayer(g.Ents[0].(*game.Player), 0) } // g.Ents[0], g.Ents[(N*N)/2+(1-N%2)*N/2] = g.Ents[(N*N)/2+(1-N%2)*N/2], g.Ents[0] g.Init() // engine, err = cgf.NewLocalEngine(&g, 17, base.Log()) engine, err = cgf.NewHostEngine(&g, 17, "", 1231, base.Log()) if err != nil { panic(err.Error()) } g.SetEngine(engine) } else { engine, err = cgf.NewClientEngine(17, "", 1231, base.Log()) if err != nil { panic(err.Error()) } engine.CopyState().(*game.Game).SetEngine(engine) } anchor := gui.MakeAnchorBox(gui.Dims{wdx, wdy}) ui.AddChild(anchor) anchor.AddChild(&game.GameWindow{Engine: engine}, gui.Anchor{0.5, 0.5, 0.5, 0.5}) var v float64 var profile_output *os.File var num_mem_profiles int // ui.AddChild(base.MakeConsole()) base.LoadAllDictionaries() for gin.In().GetKey(gin.AnyEscape).FramePressCount() == 0 { sys.Think() render.Queue(func() { ui.Draw() }) render.Queue(func() { sys.SwapBuffers() }) render.Purge() game.LocalThink() if IsHost() { for i := 0; i <= 0; i++ { // down_axis := gin.In().GetKeyFlat(gin.ControllerAxis0Positive+1, gin.DeviceTypeController, gin.DeviceIndexAny) // up_axis := gin.In().GetKeyFlat(gin.ControllerAxis0Negative+1, gin.DeviceTypeController, gin.DeviceIndexAny) // right_axis := gin.In().GetKeyFlat(gin.ControllerAxis0Positive, gin.DeviceTypeController, gin.DeviceIndexAny) // left_axis := gin.In().GetKeyFlat(gin.ControllerAxis0Negative, gin.DeviceTypeController, gin.DeviceIndexAny) // up := key_map[fmt.Sprintf("%dup", i)].FramePressAvg() // down := key_map[fmt.Sprintf("%ddown", i)].FramePressAvg() // left := key_map[fmt.Sprintf("%dleft", i)].FramePressAvg() // right := key_map[fmt.Sprintf("%dright", i)].FramePressAvg() // up = axisControl(up_axis.FramePressAmt()) // down = axisControl(down_axis.FramePressAmt()) // left = axisControl(left_axis.FramePressAmt()) // right = axisControl(right_axis.FramePressAmt()) // if up-down != 0 { // engine.ApplyEvent(game.Accelerate{ids[i], 2 * (up - down)}) // } // if left-right != 0 { // engine.ApplyEvent(game.Turn{ids[i], (left - right)}) // } // if key_map[fmt.Sprintf("%d-1", i)].FramePressCount() > 0 { // engine.ApplyEvent(game.Pull{ids[i], 0, 20000}) // } // if key_map[fmt.Sprintf("%d-2", i)].FramePressCount() > 0 { // engine.ApplyEvent(game.MoonFire{ids[i], 1, 50, 50}) // } // if gin.In().GetKeyFlat(gin.ControllerButton0, gin.DeviceTypeController, gin.DeviceTypeAny).FramePressCount() > 0 { // if key_map[fmt.Sprintf("%d-3", i)].FramePressCount() > 0 { // engine.ApplyEvent(game.Burst{ids[i], 2, 3, 100000}) // } } } // TODO: Replace the 'P' key with an appropriate keybind if gin.In().GetKey(gin.AnyKeyP).FramePressCount() > 0 { if profile_output == nil { profile_output, err = os.Create(filepath.Join(datadir, "cpu.prof")) if err == nil { err = pprof.StartCPUProfile(profile_output) if err != nil { fmt.Printf("Unable to start CPU profile: %v\n", err) profile_output.Close() profile_output = nil } fmt.Printf("profout: %v\n", profile_output) } else { fmt.Printf("Unable to start CPU profile: %v\n", err) } } else { pprof.StopCPUProfile() profile_output.Close() profile_output = nil } } // TODO: Replace the 'M' key with an appropriate keybind if gin.In().GetKey(gin.AnyKeyM).FramePressCount() > 0 { f, err := os.Create(filepath.Join(datadir, fmt.Sprintf("mem.%d.prof", num_mem_profiles))) if err != nil { base.Error().Printf("Unable to write mem profile: %v", err) } pprof.WriteHeapProfile(f) f.Close() num_mem_profiles++ } v += 0.01 } }