gogame-old/services/gamesrv/gamesrv.go
services/gamesrv/gamesrv.goRaw
1package gamesrv
2
3import (
4 "fmt"
5
6 "github.com/arnaucube/gogame/database"
7 "github.com/arnaucube/gogame/models"
8 "github.com/arnaucube/gogame/utils"
9 "gopkg.in/mgo.v2/bson"
10)
11
12type Service struct {
13 db *database.Db
14}
15
16func New(db *database.Db) *Service {
17 return &Service{
18 db,
19 }
20}
21
22// CreatePlanet is used when a user conquers a planet
23func (srv Service) CreatePlanet(userId bson.ObjectId) (*models.SolarSystem, *models.Planet, error) {
24 size := int64(250) // TODO get rand inside a range
25 name := "planetname" // TODO get random name
26
27 newPlanet := models.Planet{
28 Size: size,
29 Name: name,
30 OwnerId: userId,
31 }
32 err := srv.db.Planets.Insert(newPlanet)
33 if err != nil {
34 return nil, nil, err
35 }
36 var planet *models.Planet
37 err = srv.db.Planets.Find(bson.M{"name": name}).One(&planet)
38 if err != nil {
39 return nil, nil, err
40 }
41
42 // now put the planet in a solar system
43 // get random solar system
44 systemPosition := utils.RandInRange(0, models.GALAXYSIZE)
45 solarSystem, err := srv.PutPlanetInSolarSystem(systemPosition, planet)
46 // TODO if error is returned because there is no empty slots for planets in the solar system in systemPosition, get another systemPosition and try again
47
48 return solarSystem, planet, err
49}
50
51func (srv Service) PutPlanetInSolarSystem(position int64, planet *models.Planet) (*models.SolarSystem, error) {
52 var solarSystem models.SolarSystem
53 err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
54 if err != nil {
55 // solar system non existing yet
56 // create a solarsystem with empty planets
57 var emptyPlanets []bson.ObjectId
58 for i := 0; i < models.SOLARSYSTEMSIZE; i++ {
59 emptyPlanets = append(emptyPlanets, "")
60 }
61 newSolarSystem := models.SolarSystem{
62 Position: position,
63 Planets: emptyPlanets[:15],
64 }
65 err = srv.db.SolarSystems.Insert(newSolarSystem)
66 if err != nil {
67 return nil, err
68 }
69 err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
70
71 return &solarSystem, err
72 }
73 // get free slots in solarSystem
74 posInSolarSystem := utils.RandInRange(0, models.SOLARSYSTEMSIZE)
75 if solarSystem.Planets[posInSolarSystem] != "" {
76 // not empty slot, take another one TODO
77 // if there are no empty slots, return error
78 fmt.Println("not empty slot")
79 }
80 // store planet in solar system
81 solarSystem.Planets[posInSolarSystem] = planet.Id
82 err = srv.db.SolarSystems.Update(bson.M{"position": position}, solarSystem)
83
84 return &solarSystem, err
85
86}