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