1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.egg.landroid
18 
19 import android.content.res.Resources
20 import kotlin.random.Random
21 
22 import com.android.egg.R
23 
24 const val SUFFIX_PROB = 0.75f
25 const val LETTER_PROB = 0.3f
26 const val NUMBER_PROB = 0.3f
27 const val RARE_PROB = 0.05f
28 
29 class Namer(resources: Resources) {
30     private val planetDescriptors = Bag(resources.getStringArray(R.array.planet_descriptors))
31     private val lifeDescriptors = Bag(resources.getStringArray(R.array.life_descriptors))
32     private val anyDescriptors = Bag(resources.getStringArray(R.array.any_descriptors))
33     private val atmoDescriptors = Bag(resources.getStringArray(R.array.atmo_descriptors))
34 
35     private val planetTypes = Bag(resources.getStringArray(R.array.planet_types))
36     private val constellations = Bag(resources.getStringArray(R.array.constellations))
37     private val constellationsRare = Bag(resources.getStringArray(R.array.constellations_rare))
38     private val suffixes = Bag(resources.getStringArray(R.array.star_suffixes))
39     private val suffixesRare = Bag(resources.getStringArray(R.array.star_suffixes_rare))
40 
41     private val planetTable = RandomTable(0.75f to planetDescriptors, 0.25f to anyDescriptors)
42 
43     private var lifeTable = RandomTable(0.75f to lifeDescriptors, 0.25f to anyDescriptors)
44 
45     private var constellationsTable =
46         RandomTable(RARE_PROB to constellationsRare, 1f - RARE_PROB to constellations)
47 
48     private var suffixesTable = RandomTable(RARE_PROB to suffixesRare, 1f - RARE_PROB to suffixes)
49 
50     private var atmoTable = RandomTable(0.75f to atmoDescriptors, 0.25f to anyDescriptors)
51 
52     private var delimiterTable =
53         RandomTable(
54             15f to " ",
55             3f to "-",
56             1f to "_",
57             1f to "/",
58             1f to ".",
59             1f to "*",
60             1f to "^",
61             1f to "#",
62             0.1f to "(^*!%@##!!"
63         )
64 
65     fun describePlanet(rng: Random): String {
66         return planetTable.roll(rng).pull(rng) + " " + planetTypes.pull(rng)
67     }
68 
69     fun describeLife(rng: Random): String {
70         return lifeTable.roll(rng).pull(rng)
71     }
72 
73     fun nameSystem(rng: Random): String {
74         val parts = StringBuilder()
75         parts.append(constellationsTable.roll(rng).pull(rng))
76         if (rng.nextFloat() <= SUFFIX_PROB) {
77             parts.append(delimiterTable.roll(rng))
78             parts.append(suffixesTable.roll(rng).pull(rng))
79             if (rng.nextFloat() <= RARE_PROB) parts.append(' ').append(suffixesRare.pull(rng))
80         }
81         if (rng.nextFloat() <= LETTER_PROB) {
82             parts.append(delimiterTable.roll(rng))
83             parts.append('A' + rng.nextInt(0, 26))
84             if (rng.nextFloat() <= RARE_PROB) parts.append(delimiterTable.roll(rng))
85         }
86         if (rng.nextFloat() <= NUMBER_PROB) {
87             parts.append(delimiterTable.roll(rng))
88             parts.append(rng.nextInt(2, 5039))
89         }
90         return parts.toString()
91     }
92 
93     fun describeAtmo(rng: Random): String {
94         return atmoTable.roll(rng).pull(rng)
95     }
96 }
97