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	// in case that wants to start with resources plants
 34	newPlanet.Buildings = make(map[string]int64)
 35	newPlanet.Buildings["metalmine"] = 1
 36	newPlanet.Buildings["crystalmine"] = 1
 37	newPlanet.Buildings["deuteriummine"] = 1
 38	newPlanet.Buildings["energymine"] = 1
 39
 40	err := srv.db.Planets.Insert(newPlanet)
 41	if err != nil {
 42		return nil, nil, err
 43	}
 44	var planet *models.Planet
 45	err = srv.db.Planets.Find(bson.M{"name": name}).One(&planet)
 46	if err != nil {
 47		return nil, nil, err
 48	}
 49
 50	// now put the planet in a solar system
 51	// get random solar system
 52	systemPosition := utils.RandInRange(0, constants.GALAXYSIZE)
 53	solarSystem, err := srv.PutPlanetInSolarSystem(systemPosition, planet)
 54	// 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
 55
 56	return solarSystem, planet, err
 57}
 58
 59func (srv Service) PutPlanetInSolarSystem(position int64, planet *models.Planet) (*models.SolarSystem, error) {
 60	var solarSystem models.SolarSystem
 61	err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
 62	if err != nil {
 63		// solar system non existing yet
 64		// create a solarsystem with empty planets
 65		var emptyPlanets []string
 66		for i := 0; i < constants.SOLARSYSTEMSIZE; i++ {
 67			emptyPlanets = append(emptyPlanets, "empty")
 68		}
 69		newSolarSystem := models.SolarSystem{
 70			Position: position,
 71			Planets:  emptyPlanets[:15],
 72		}
 73		err = srv.db.SolarSystems.Insert(newSolarSystem)
 74		if err != nil {
 75			return nil, err
 76		}
 77		err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
 78
 79		return &solarSystem, err
 80	}
 81	// get free slots in solarSystem
 82	posInSolarSystem := utils.RandInRange(0, constants.SOLARSYSTEMSIZE)
 83	if solarSystem.Planets[posInSolarSystem] != "" {
 84		// not empty slot, take another one TODO
 85		// if there are no empty slots, return error
 86		fmt.Println("not empty slot")
 87	}
 88	// store planet in solar system
 89	solarSystem.Planets[posInSolarSystem] = planet.Id.String()
 90	err = srv.db.SolarSystems.Update(bson.M{"position": position}, solarSystem)
 91
 92	return &solarSystem, err
 93}
 94
 95func (srv Service) GetBuildings(user *models.User, planetid bson.ObjectId) (*models.Planet, error) {
 96	var planet models.Planet
 97	err := srv.db.Planets.Find(bson.M{"_id": planetid, "ownerid": user.Id}).One(&planet)
 98	if err != nil {
 99		return nil, err
100	}
101	return &planet, nil
102}
103
104func (srv Service) UpgradeBuilding(user *models.User, planetid bson.ObjectId, building string) (*models.Planet, error) {
105	// get planet
106	var planet models.Planet
107	err := srv.db.Planets.Find(bson.M{"_id": planetid}).One(&planet)
108	if err != nil {
109		return nil, err
110	}
111
112	// get current building level, and get the needed resources for next level
113	resourcesNeeded, err := user.GetBuildingCost(planet, building)
114	if err != nil {
115		return nil, err
116	}
117
118	fmt.Println("bui", building)
119	fmt.Println("needed", resourcesNeeded)
120	// if user have enough resources to upgrade the building, upgrade the building
121	err = user.SpendResources(resourcesNeeded)
122	if err != nil {
123		return nil, err
124	}
125	// upgrade level of building in planet
126	planet.Buildings[building] += 1
127	// store planet in db
128	err = srv.db.Planets.Update(bson.M{"_id": planet.Id}, planet)
129	return &planet, nil
130}