Daily random pokemon

This is my card so far:
image

type: markdown
content: >-
  # {{ state_attr('sensor.random_pokemon','name') | capitalize }}

  #### <i> {% for tp in state_attr("sensor.random_pokemon","types") -%} {{
  tp.type.name | capitalize }}, {% endfor %} </i>

  ---

  **Height:** {{ state_attr('sensor.random_pokemon', 'height') / 10 }} cm

  **Weight:** {{ state_attr('sensor.random_pokemon', 'weight') / 10 }} kg

  **Sprite:** <br>
  ![front_default]({{states['sensor.random_pokemon'].attributes.sprites.front_default}})

I am still goofing with this, mine is like this now:

1 Like

So I have grabbed a picture of a pokedex and made this using a picture element card:
image

The text moves around a little bit and I haven’t figured out how to divide the height and weight by 10 but I think it’s looking pretty good.

type: picture-elements
elements:
  - type: image
    camera_image: camera.pokemon_camera_4
    style:
      top: 46%
      left: 24%
    hold_action:
      action: call-service
      service: homeassistant.update_entity
      data: {}
      target:
        entity_id: sensor.random_pokemon
  - type: state-label
    entity: sensor.random_pokemon
    style:
      top: 58%
      left: 24%
      color: black
      font-weight: bold
      font-size: 16px
      text-align: center
  - type: state-label
    entity: sensor.random_pokemon
    attribute: id
    prefix: '#'
    style:
      top: 33%
      left: 90%
      color: black
      font-size: 16px
      text-align: center
  - type: state-label
    entity: sensor.random_pokemon
    attribute: height
    prefix: 'Height: '
    suffix: m
    style:
      top: 43%
      left: 67%
      color: black
      font-size: 14px
      text-align: left
  - type: state-label
    entity: sensor.random_pokemon
    attribute: weight
    prefix: 'Weight: '
    suffix: kg
    style:
      top: 50%
      left: 70%
      color: black
      font-size: 14px
      text-align: left
image: /local/pokedex.png

1 Like

How did you create the camera.pokemon_camera_4 entity?

It’s a generic camera using the default front sprite as the still image:

camera:
  - platform: generic
    name: Pokemon Camera
    still_image_url: https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/{{ state_attr('sensor.random_pokemon', 'id') }}.png
1 Like

Thank you! I was trying to get the image in the right spot all day!

Here is my current card:

type: custom:stack-in-card
mode: vertical
keep:
  border_radius: false
  margin: false
  background: false
  box_shadow: false
cards:
  - type: picture-elements
    elements:
      - type: image
        camera_image: camera.pokemon_camera
        style:
          top: 46%
          left: 24%
        hold_action:
          action: call-service
          service: homeassistant.update_entity
          data: {}
          target:
            entity_id: sensor.random_pokemon
      - type: state-label
        entity: sensor.random_pokemon
        attribute: name
        style:
          top: 58%
          left: 24%
          color: black
          font-weight: bold
          font-size: 16px
          text-align: center
      - type: state-label
        entity: sensor.random_pokemon
        attribute: id
        prefix: '#'
        style:
          top: 33%
          left: 90%
          color: black
          font-size: 16px
          text-align: center
      - type: state-label
        entity: sensor.random_pokemon
        attribute: height
        prefix: 'Height: '
        suffix: m
        style:
          top: 43%
          left: 67%
          color: black
          font-size: 14px
          text-align: left
      - type: state-label
        entity: sensor.random_pokemon
        attribute: weight
        prefix: 'Weight: '
        suffix: kg
        style:
          top: 50%
          left: 70%
          color: black
          font-size: 14px
          text-align: left
    image: /local/Pokedex.png
  - type: custom:collapsable-cards
    title: More Stats
    cards:
      - type: custom:stack-in-card
        mode: horizontal
        keep:
          border_radius: false
          margin: false
          background: false
          box_shadow: false
        cards:
          - type: markdown
            content: |-
              ### Type(s)
              {% for tp in state_attr("sensor.random_pokemon","types") -%}
               * {{ tp.type.name | capitalize }}
              {% endfor %}
              ### Abilities
              {% for ab in state_attr("sensor.random_pokemon","abilities") -%}
               * {{ ab.ability.name | capitalize}}
              {% endfor %}
            card_mod:
              style: |
                ha-card: {
                  border: none;
                  box-shadow: 0px 0px 0px 0px;
                }
          - type: markdown
            content: |-
              ### Stats
              {% for st in state_attr("sensor.random_pokemon","stats") -%}
               * {{ st.stat.name | capitalize}}: {{ st.base_stat }}
              {% endfor %}
        card_mod:
          style: |
            ha-card: {
              border: none;
              box-shadow: 0px 0px 0px 0px;
            }
    card_mod:
      style: |
        ha-card: {
          border: none;
          box-shadow: 0px 0px 0px 0px;
        }
card_mod:
  style: |
    ha-card: {
      border: none;
      box-shadow: 0px 0px 0px 0px;
    }

1 Like

@shirasp here are some pokedex images if you want them.

I am now using the first one, and I have added button entities over the white squares on the right.
Going to try to get them to increase / decrease the id number, changing the pokemon.

pokedex
pokedex_no_bg
pokedex_buttons
pokedex_no_bg_buttons

1 Like

Brilliant! When you get that all set can you please post your code? This was the first time I have ever used a picture elements card and I don’t totally understand everything about it yet, but these examples totally help!

I actually changed up my code to the following:

type: custom:stack-in-card
mode: vertical
keep:
  border_radius: false
  margin: false
  background: false
  box_shadow: false
cards:
  - type: picture-elements
    elements:
      - type: image
        camera_image: camera.pokemon_camera
        style:
          top: 46%
          left: 24%
        hold_action:
          action: call-service
          service: homeassistant.update_entity
          data: {}
          target:
            entity_id: sensor.random_pokemon
      - type: state-label
        entity: sensor.random_pokemon
        attribute: name
        style:
          top: 58%
          left: 24%
          color: black
          font-weight: bold
          font-size: 16px
          text-align: center
      - type: state-label
        entity: sensor.random_pokemon
        attribute: id
        prefix: '#'
        style:
          top: 33%
          left: 90%
          color: black
          font-size: 16px
          text-align: center
      - type: state-label
        entity: sensor.random_pokemon
        attribute: height
        prefix: 'Height: '
        suffix: m
        style:
          top: 43%
          left: 67%
          color: black
          font-size: 14px
          text-align: left
      - type: state-label
        entity: sensor.random_pokemon
        attribute: weight
        prefix: 'Weight: '
        suffix: kg
        style:
          top: 50%
          left: 70%
          color: black
          font-size: 14px
          text-align: left
    image: /local/Pokedex.png
  - type: custom:stack-in-card
    cards:
      - square: false
        columns: 2
        type: grid
        cards:
          - type: custom:mushroom-template-card
            primary: ''
            secondary: More Stats
            fill_container: true
            card_mod:
              style: |
                ha-card {
                  border: 0px;
                  margin-left: 10px;
                  font-variant: small-caps;
                  font-family: "Helvetica";
                  --card-secondary-font-size: 15px;
                }
          - type: custom:mushroom-chips-card
            chips:
              - type: template
                entity: input_boolean.pokedex_more_info
                icon: |-
                  {% if is_state(entity,'off') %}
                  mdi:chevron-down
                  {% elif is_state(entity,'on') %}
                  mdi:chevron-up
                  {% endif %}
                tap_action:
                  action: toggle
            alignment: end
            card_mod:
              style: |
                ha-card {
                --chip-box-shadow: none;
                --chip-background: none;
                --chip-border-width: 0px;
                padding: 10px 10px;
                }
      - type: conditional
        conditions:
          - entity: input_boolean.pokedex_more_info
            state: 'on'
        card:
          type: custom:stack-in-card
          cards:
            - square: false
              columns: 2
              type: grid
              cards:
                - type: custom:stack-in-card
                  mode: vertical
                  cards:
                    - type: custom:mushroom-template-card
                      primary: Type(s)
                      secondary: >-
                          {% for tp in state_attr("sensor.random_pokemon","types") -%}
                            - {{ tp.type.name | capitalize }}
                          {% endfor %}
                      icon: ''
                      entity: sensor.random_pokemon
                      fill_container: true
                      multiline_secondary: true
                      layout: horizontal
                      card_mod:
                        style: |
                          ha-card {
                            border: none;
                            box-shadow: none;
                            --card-secondary-font-size: 14px;
                            --card-primary-font-size: 18px;
                            --card-secondary-font-weight: normal;
                            --card-primary-font-weight: bold;
                          }
                    - type: custom:mushroom-template-card
                      primary: Abilities
                      secondary: >-
                        {% for ab in
                        state_attr("sensor.random_pokemon","abilities") -%}
                         - {{ ab.ability.name | capitalize}}
                        {% endfor %}
                      icon: ''
                      entity: sensor.random_pokemon
                      fill_container: true
                      multiline_secondary: true
                      layout: horizontal
                      card_mod:
                        style: |
                          ha-card {
                            border: none;
                            box-shadow: none;
                            --card-secondary-font-size: 14px;
                            --card-primary-font-size: 18px;
                            --card-secondary-font-weight: normal;
                            --card-primary-font-weight: bold;
                          }
                  card_mod:
                    style: |
                      ha-card {
                        border: none;
                        box-shadow: none;
                        margin-left: 25px;
                      }
                - type: custom:mushroom-template-card
                  primary: Stats
                  secondary: |-
                    {% for st in state_attr("sensor.random_pokemon","stats") -%}
                     - {{ st.stat.name | capitalize}}: {{ st.base_stat }}
                    {% endfor %}
                  icon: ''
                  entity: sensor.random_pokemon
                  fill_container: true
                  multiline_secondary: true
                  layout: horizontal
                  card_mod:
                    style: |
                      ha-card {
                        border: none;
                        box-shadow: none;
                            --card-secondary-font-size: 14px;
                            --card-primary-font-size: 18px;
                            --card-secondary-font-weight: normal;
                            --card-primary-font-weight: bold;              
                      }
          card_mod:
            style: |
              ha-card {
                border: none;
                box-shadow: none;
              }
    card_mod:
      style: |
        ha-card: {
          box-shadow: 0px;
          border: none;
        }
card_mod:
  style: |
    ha-card: {
      border: none;
      box-shadow: 0px 0px 0px 0px;
    }

so now I have the more stats as a condional chip instead of the collapse card, which I think makes it work better.

@kbrown01 do you have an example of the apex radial chart?

I have been playing with a few things and will do so today. I do love the radialbar chart however I have been unsucessful at getting it to display the way I want. On mouse over it displays a “%” because that is the nature of the card. Essentially it takes a “max” and the value would then give you a “%” of max. Well this is no good really because I could not template the max.

Now, I created a new sensor that just has the data for the HP, Speed, etc. and it sets the state to the “max” of those values (good start). However, I still cannot get it to display the actual point value in the center.

I may go to gauges which I know I can display the actual value.

Right now (using the original sensor and a fixed “max” of 200, it is like this:

type: custom:apexcharts-card
header:
  show: false
  show_states: true
  colorize_states: true
chart_type: radialBar
all_series_config:
  max: 200
  show:
    legend_value: false
series:
  - entity: sensor.random_pokemon
    name: HP
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[0].base_stat]]
  - entity: sensor.random_pokemon
    name: Attack
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[1].base_stat]]
  - entity: sensor.random_pokemon
    name: Defense
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[2].base_stat]]
  - entity: sensor.random_pokemon
    name: Special Attack
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[3].base_stat]]
  - entity: sensor.random_pokemon
    name: Special Defense
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[4].base_stat]]
  - entity: sensor.random_pokemon
    name: Speed
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[5].base_stat]]

One option with gauge and card-templater with a custom sensor of just the stats as attributes:

type: custom:stack-in-card
mode: vertical
cards:
  - type: custom:card-templater
    entities:
      - sensor.random_pokemon
    card:
      type: custom:gauge-card
      entity: sensor.pokemon_base_stats
      attribute: hp
      measurement: ''
      title: HP
      min: 0
      max_template: >-
        {{ (state_attr("sensor.random_pokemon","stats") |
        map(attribute="base_stat") | max) * 1.1 }}
  - type: custom:card-templater
    entities:
      - sensor.random_pokemon
    card:
      type: custom:gauge-card
      entity: sensor.pokemon_base_stats
      attribute: defense
      measurement: ''
      title: Defense
      min: 0
      max_template: >-
        {{ (state_attr("sensor.random_pokemon","stats") |
        map(attribute="base_stat") | max) * 1.1 }}
  - type: custom:card-templater
    entities:
      - sensor.random_pokemon
    card:
      type: custom:gauge-card
      entity: sensor.pokemon_base_stats
      attribute: special-attack
      measurement: ''
      title: Special Attack
      min: 0
      max_template: >-
        {{ (state_attr("sensor.random_pokemon","stats") |
        map(attribute="base_stat") | max) * 1.1 }}
  - type: custom:card-templater
    entities:
      - sensor.random_pokemon
    card:
      type: custom:gauge-card
      entity: sensor.pokemon_base_stats
      attribute: special-defense
      measurement: ''
      title: Special Defense
      min: 0
      max_template: >-
        {{ (state_attr("sensor.random_pokemon","stats") |
        map(attribute="base_stat") | max) * 1.1 }}
  - type: custom:card-templater
    entities:
      - sensor.random_pokemon
    card:
      type: custom:gauge-card
      entity: sensor.pokemon_base_stats
      attribute: speed
      measurement: ''
      title: Speed
      min: 0
      max_template: >-
        {{ (state_attr("sensor.random_pokemon","stats") |
        map(attribute="base_stat") | max) * 1.1 }}

NOTE: This sets the max value of the gauge to 110% of the largest stat. This gives them some value in examining them all together with your eye as they all have the same baseline. One could plug in severity in the templates likely and color bars based on % of the largest stat.

I would note that no matter what I have tried, I cannot template “max” in the Apex card. It just does not work. I posted in their forum but there was no solutions given that work. At this time, this is the best I could do. I also created a new sensor with just this data to make it easier as:

###
### Pokemon Base Stats
###
sensor:
  - name: Pokemon Base Stats
    state: '{{ state_attr("sensor.random_pokemon","stats") | map(attribute="base_stat") | max }}'
    attributes:
        hp: '{{ state_attr("sensor.random_pokemon","stats")[0].base_stat }}'
        attack: '{{ state_attr("sensor.random_pokemon","stats")[1].base_stat }}'
        defense: '{{ state_attr("sensor.random_pokemon","stats")[2].base_stat }}'
        special-attack: '{{ state_attr("sensor.random_pokemon","stats")[3].base_stat }}'
        special-defense: '{{ state_attr("sensor.random_pokemon","stats")[4].base_stat }}'
        speed: '{{ state_attr("sensor.random_pokemon","stats")[5].base_stat }}'

It assumes that (and I believe this is correct) that the attributes are always in that order. There is likely a better way to select them based on the names, but heck … this is just fun for my 60 yr old self.

Here is a little coloring applied using severity:

  - type: custom:card-templater
    entities:
      - sensor.random_pokemon
    card:
      type: custom:gauge-card
      entity: sensor.pokemon_base_stats
      attribute: hp
      measurement: ''
      title: HP
      min: 0
      max_template: >-
        {{ (state_attr("sensor.random_pokemon","stats") |
        map(attribute="base_stat") | max) * 1.1 }}
      severity:
        red_template: >-
          {{ (state_attr("sensor.random_pokemon","stats") |
          map(attribute="base_stat") | max) * 0.8 }}
        green_template: >-
          {{ (state_attr("sensor.random_pokemon","stats") |
          map(attribute="base_stat") | max) * 0.3 }}
        amber_template: >-
          {{ (state_attr("sensor.random_pokemon","stats") |
          map(attribute="base_stat") | max) * 0.6 }}

1 Like

So everyone has brought up a few things here that seem great. The overall sensor that was sensor.random_pokemon should in reality have a few modes we should address (and not break anything).

It should be able to be called like …

  1. Random … just grab a random number between 1 and 1008
  2. Increment … if the current Pokemon is 619 … go get 620
  3. Decrement … if the current Pokemon is 619 … go get 618
  4. Name … go get your favorite Pokemon by name in a select list

Did anyone do some of these yet? I have Random and a select list by name, but have not implemented updating the sensor based on this. This will take some work unless someone already did some things.

OK, I did it.

Now I can Increment, Decrement, Random or select by name.

Just turn the input_select into automations is all. SO I am going to restructure that into widgets … along to top would be Random, Increment, Decrement, Name … those would call automations to do exactly what you think. Get a pokemon … randomly, one higher, one lower or by name.

Then start to play with the structure underneath

Don’t implement unless you have the input_select created, but still:

##
## Random Pokemon
## 
- platform: rest
  name: Random Pokemon
  scan_interval: 3600
  resource_template: >
      {% if states('input_select.select_pokemon_mode') == 'Increment' %}
        https://pokeapi.co/api/v2/pokemon/{{ state_attr('sensor.random_pokemon','id') + 1 }}
      {% elif states('input_select.select_pokemon_mode') == 'Decrement' %}
        https://pokeapi.co/api/v2/pokemon/{{ state_attr('sensor.random_pokemon','id') - 1 }}
      {% elif states('input_select.select_pokemon_mode') == 'Name' %}
        https://pokeapi.co/api/v2/pokemon/{{ states('input_select.pokedex') }}
      {% else %}
        https://pokeapi.co/api/v2/pokemon/{{ range(1, 1008) | random }}
      {% endif %}
  value_template: "{{ now() }}"
  json_attributes:
    - abilities
    - base_experience
    - forms
    - game_indicies
    - height
    - held_items
    - id
    - is_default
    - location_area_encounters
    - moves
    - name
    - order
    - past_types
    - species
    - sprites
    - stats
    - types
    - weight
- platform: rest
  name: Pokedex
  scan_interval: 3600
  resource_template: https://pokeapi.co/api/v2/pokemon/?limit=1008
  value_template: "{{ now() }}"
  json_attributes:
    - results

With a helper-created input_select as:

I would suppose we should enhance that to say you cannot decrement at “1” or increment at “1008” to be really good. I will do that and post all my code as usually at Github

OK, I have completed much of this. I now have my dashboard like this:

Previous, Next, Grab (Random) and Select by Name all work. Everything changes instantly below.
What else would people want? I am looking at doing “Moves” in a simple list. Showing Sprites or ?

1 Like

re sprites, I think front default is the main one.
but if you want a challenge there a few pokemon that have different sprites for male and female.
eg 449 the colours are inverted:

not sure if you could use an if function here, ie if female = null do nothing, else show sprite?

BTW that card looks amazing, can you link your github so I can check it out please?

@kbrown01 I have been playing around with the stats and this is what I have at the moment, thoughts?

type: custom:apexcharts-card
chart_type: donut
header:
  show: false
  show_states: true
  colorize_states: true
all_series_config:
  min: 1
  max: 255
  show:
    legend_value: false
series:
  - entity: sensor.random_pokemon
    name: HP
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[0].base_stat]]
  - entity: sensor.random_pokemon
    name: Attack
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[1].base_stat]]
  - entity: sensor.random_pokemon
    name: Defense
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[2].base_stat]]
  - entity: sensor.random_pokemon
    name: Special Attack
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[3].base_stat]]
  - entity: sensor.random_pokemon
    name: Special Defense
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[4].base_stat]]
  - entity: sensor.random_pokemon
    name: Speed
    data_generator: >
      return [[new Date(entity.state).getTime(),
      entity.attributes.stats[5].base_stat]]

image

Also I notices you have the max to your stats as 200, this should be 255 as per Base stats - Bulbapedia, the community-driven Pokémon encyclopedia

1 Like

Give me until after today, playing around a bit more … I implemented new sensor that grabs some of the text descriptions and other information. Plugging that in now:

2 Likes

No worries mate, looks awesome, thanks for all your hard work :slight_smile:

@kbrown01 Ditto on everything @smelly-grunger said previously! I love seeing what you both have come up with and I would love to see the code as well when it is ready!

How did you create this? I’d assume that you didn’t have to type every name into the list when you created the helper, but I’m not sure how it would be created differently?

Which part? Do you mean the selector to select a specific pokemon?

Step 1: Create a basically empty list. You need at least one option but it will be overwritten.

#############################
######### pokedex ###########
#############################
pokedex:
    options:
        - Bulbasaur

Step 2: I found the API call to get the complete list of Pokemon. SO I have a senosr that gets this information:

- platform: rest
  name: Pokedex
  scan_interval: 360000
  resource_template: https://pokeapi.co/api/v2/pokemon/?limit=1008
  value_template: "{{ now() }}"
  json_attributes:
    - results

Step 3: On Home Assistant Start, put them all into a list via an automation:

- id: '1675715210686'
  alias: Build Pokedex Options
  description: ''
  trigger:
  - platform: homeassistant
    event: start
  condition: []
  action:
  - service: input_select.set_options
    data_template:
      entity_id: input_select.pokedex
      options: "{% set pdex = namespace(poke=[]) %}\n  {% for pokemon in state_attr('sensor.pokedex','results')
        \ %} \n    {% set pdex.poke = pdex.poke + [pokemon.name] %}\n  {% endfor %}\n{{
        pdex.poke | list }}"
  mode: single

You now have input_select.pokedex that is allows you to select a particular Pokemon as opposed to a random one.

As it turns out, you can call the API to get a specific Pokemon in two ways. You can use the “id” which we already set up or “random”, but instead of an id, you can just use the name. SO I modified the sensor like this:

- platform: rest
  name: Random Pokemon
  scan_interval: 360000
  resource_template: >
      {% if states('input_select.select_pokemon_mode') == 'Increment' %}
        https://pokeapi.co/api/v2/pokemon/{{ state_attr('sensor.random_pokemon','id') + 1 }}
      {% elif states('input_select.select_pokemon_mode') == 'Decrement' %}
        https://pokeapi.co/api/v2/pokemon/{{ state_attr('sensor.random_pokemon','id') - 1 }}
      {% elif states('input_select.select_pokemon_mode') == 'Name' %}
        https://pokeapi.co/api/v2/pokemon/{{ states('input_select.pokedex') }}
      {% else %}
        https://pokeapi.co/api/v2/pokemon/{{ range(1, 1008) | random }}
      {% endif %}
  value_template: "{{ now() }}"

It defaults to “random” but if you call it with a name, it will get the named Pokemon. This also has the Increment and Decrement too. IT uses a simple input_select that has only “Name”, “Increment”, “Decrement” and “Random” as options which you can use to create all four ways across the top.

And I tie it all together with this script:

get_pokemon:
  alias: Get Pokemon
  variables:
    pokemode: Increment
  sequence:
  - service: input_select.select_option
    data:
      option: '{{ pokemode }}'
    target:
      entity_id: input_select.select_pokemon_mode
  - service: homeassistant.update_entity
    data: {}
    target:
      entity_id: sensor.random_pokemon
  - service: homeassistant.update_entity
    data: {}
    target:
      entity_id: sensor.pokemon_species
  - service: input_select.select_option
    data:
      option: Random
    target:
      entity_id: input_select.select_pokemon_mode
  - service: input_select.select_option
    data:
      option: '{{state_attr(''sensor.random_pokemon'',''name'') }}'
    target:
      entity_id: input_select.pokedex
  mode: single

So clicking any one of the button on the top will set the input select “mode”, then update sensor.random_pokemon. IT also updates the other sensor I created that has Pokemon descriptions, then it sets it back to random. I likely could even get rid of the “mode” input_select, I only used it for testing and it is hidden now.

Example to call it:

      - type: custom:mushroom-template-card
        entity: sensor.random_pokemon
        primary: Previous Pokemon
        secondary: Show Previous Pokemon
        icon: mdi:backburger
        icon_color: red
        tap_action:
          action: none
        hold_action:
          action: call-service
          service: script.get_pokemon
          data:
            pokemode: Decrement
          target: {}

Ultimately you have this:

2 Likes

When I finish the “sprites” view I have here … alignment and non-exstant images … I will post it all for people

2 Likes