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	}
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}