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