arnaucube
arnaucube/gogame-oldPublic Self-hosted repository
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		Buildings: models.BuildingsList{
33			MetalMine:     1,
34			CrystalMine:   1,
35			DeuteriumMine: 1,
36			EnergyMine:    1,
37		},
38	}
39	err := srv.db.Planets.Insert(newPlanet)
40	if err != nil {
41		return nil, nil, err
42	}
43	var planet *models.Planet
44	err = srv.db.Planets.Find(bson.M{"name": name}).One(&planet)
45	if err != nil {
46		return nil, nil, err
47	}
48
49	// now put the planet in a solar system
50	// get random solar system
51	systemPosition := utils.RandInRange(0, constants.GALAXYSIZE)
52	solarSystem, err := srv.PutPlanetInSolarSystem(systemPosition, planet)
53	// 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
54
55	return solarSystem, planet, err
56}
57
58func (srv Service) PutPlanetInSolarSystem(position int64, planet *models.Planet) (*models.SolarSystem, error) {
59	var solarSystem models.SolarSystem
60	err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
61	if err != nil {
62		// solar system non existing yet
63		// create a solarsystem with empty planets
64		var emptyPlanets []string
65		for i := 0; i < constants.SOLARSYSTEMSIZE; i++ {
66			emptyPlanets = append(emptyPlanets, "empty")
67		}
68		newSolarSystem := models.SolarSystem{
69			Position: position,
70			Planets:  emptyPlanets[:15],
71		}
72		err = srv.db.SolarSystems.Insert(newSolarSystem)
73		if err != nil {
74			return nil, err
75		}
76		err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
77
78		return &solarSystem, err
79	}
80	// get free slots in solarSystem
81	posInSolarSystem := utils.RandInRange(0, constants.SOLARSYSTEMSIZE)
82	if solarSystem.Planets[posInSolarSystem] != "" {
83		// not empty slot, take another one TODO
84		// if there are no empty slots, return error
85		fmt.Println("not empty slot")
86	}
87	// store planet in solar system
88	solarSystem.Planets[posInSolarSystem] = planet.Id.String()
89	err = srv.db.SolarSystems.Update(bson.M{"position": position}, solarSystem)
90
91	return &solarSystem, err
92}