You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.4 KiB

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