game/stars.py

110 lines
3.0 KiB
Python

# -*- coding: utf-8 -*-
#
# Copyright © 2024 Simon Forman
#
# This file is part of game
#
# game is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# game is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with game. If not see <http://www.gnu.org/licenses/>.
#
'''
A field of stars. Each has planets. Each planet has...?
Keep it simple.
Stars have what qualities?
- Cosmetic
- color
- brightness
- size
- Game stats
- age?
- ?
🌑 🌒 🌓 🌔 🌕 🌖 🌗 🌘
♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓
'''
from random import randint, expovariate, seed, gauss
from poisson import poisson
seed(23)
MINIMUM_DISTANCE_BETWEEN_STARS = 160
# The old standard 4:3 ratio screen of 1024 x 768 pixels,
# let's have 10 x 10 of those.
WIDTH, HEIGHT = 10240, 7680
# Database stuff. SQL, etc.
TABLES = [
'create table stars (id INTEGER PRIMARY KEY AUTOINCREMENT, x INTEGER, y INTEGER, radius INTEGER)',
('''\
create table planets (
id INTEGER PRIMARY KEY,
ordo INTEGER,''' # The order from the star, counting from 1.
# I use "ordo" instead of "order" because "order" is a keyword
# in SQL (or at least it caused a syntax error in SQLite.)
'''star INTEGER,
FOREIGN KEY(star) REFERENCES stars(id)
)'''),
]
def init_db(conn):
print('Generating star data.')
c = conn.cursor()
for values in generate_stars(WIDTH, HEIGHT, MINIMUM_DISTANCE_BETWEEN_STARS):
c.execute('insert into stars(x, y, radius) values (?, ?, ?)', values)
generate_planets_for_star(c)
c.close()
conn.commit()
def iter_stars(conn):
c = conn.cursor()
c.execute('select x, y, radius from stars')
yield from c.fetchall()
c.close()
# Procedural Generation of solar system data
def generate_stars(width, height, minimum_distance_between_stars):
for (x, y) in poisson(width, height, minimum_distance_between_stars):
yield x, y, round(1 + expovariate(1))
def how_many_planets():
n = round(gauss(5, 5))
while n < 0:
n = round(gauss(5, 5))
return n
def generate_planets_for_star(c):
star_id = c.lastrowid
for ordo in range(1, how_many_planets() + 1):
c.execute('insert into planets(ordo, star) values (?, ?)', (ordo, star_id))
ROMAN_NUMBERS = [
None, # no zero, but this aligns entries and their indicies
'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X',
'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX',
'XXI', 'XXII', 'XXIII', 'XXIV', 'XXV', 'XXVI', 'XXVII', 'XXVIII', 'XXIX',
]