Posts tagged Android

Reversi Magic 3.0 Released On All App Stores

0

After a long time of not being active on the App Stores, our game Reversi Magic has finally been updated and launched on all three mobile app stores – Google Play, Apple App Store and Amazon App Store. Links to get the latest versions of the game can be found here – https://www.fishguygames.com/reversi/

This major update has been a long time in the works, with lots of changes to the game & engine to make it fully compatible with the most up-to-date Android and Apple devices. The following is a small list of the more important features that have been added or changed in the game:

  • Improved loading times by removing all unnecessary data files no longer needed by older devices.
  • While playing the game, the grid can be rotated 90 degrees at any time by pressing the Rotate button. Some players prefer to orient the board differently during play to see certain moves better, so this feature is handy. The board can be rotated as many times as you want.
  • When a player is unable to place a move in the current game, a notification is now given on the screen telling you so. Previously, the game would just skip the player’s turn without any notification and this has caused many people to believe the game is “cheating”. We can assure you that the game has never cheated, but this new feature should help to alleviate any concerns that anyone might have. Future changes are also coming that will allow you to verify this behavior.
  • Better internal bookkeeping for statistics (this will be replaced in a future update, see below for more information)
  • Lots of other minor tweaks and fixes to the gameplay code to improve the overall playing experience.

The following is a list of some features that are planned for future updates:

  • A new statistics system is in development that will store all playing information in our database. This will allow you to see your playing history, and also allow you to see how well you compare to other players around the world. More details will be available in the future about this feature and we will be looking for beta testers to help us test it out.
  • Online Player Support is also coming in the future with the above statistics system in place. This will allow you to play against other players around the world, and also allow you to play against your friends. We are still working out the details on the best way to implement this feature, but we will be looking for beta testers to help us test it out once we reach the beta stages. One such topic we are debating is how best to handle players in different timezones, and instead of making play modes realtime, they would be turn based so that a player could maybe play a handful of games at a time, and come back to them as the opponent has made their turn. This would allow players to play at their own pace, and not have to worry about being online at the same time as their opponent.
  • Tournament Rules & Scoring – The game will implement full tournament rules and scoring methods so that all recorded scores are equal and fair to all players. We will also implement tournament games of our own at certain time periods when we have implemented some of the other systems.
  • We have already began adding support for Leaderboards and Achievements to the game for a wide variety of challenges, for the devices that support them. Compete for the highest leaderboard scores and score points for completing certain activities within the game.
  • Improved Harder Difficulty – As with any strategy game like this, keeping the logic current and up to date will always be a challenge and we are working on an improved difficulty level to make the game more challenging & appealing to our more experienced players out there. We enjoy hearing from you, and we thank those who have already reached out to us with helpful tips, suggestions and technical documents to continually improve the computer player.
  • End-Game Review system – This is mostly completed already in the current build, and was taken out at the last minute due to a few problems that we will fix in the next update. This will allow you to review the game turn by turn, see where both yourself and the computer placed moves, where player stalemates occured (when the player couldn’t place a move) and every other detail of the game. This will also allow you to verify that the computer player is not cheating, and that it is playing a fair game. We cannot stress enough that the game has never cheated in any version release.

We hope that you enjoy playing the game as much as we have spent working on it. Please feel free to reach out to us with any comments, concerns or other feedback, and please consider leaving a review on the app store of your choice. We look forward to hearing from you!

Twinz! Released To Google Play & Amazon App Store

0

After a long time of no updates, I have finally released an updated version of my Twinz! game! The last updates came a really long time ago, and due to family, careers and other life events I ended up not being able to spend as much time programming as I would have liked, so all of my games have taken a spot on the back burner.

After a few weeks of work, my game engine has been updated and we are slowly making progress in updating all of games to run on the newer modern devices. This last week, the game has been released for Android on the Google Play & Amazon Marketplace App Stores. There is also a version of the APK that can be downloaded manually from the Twinz! Website.

As part of this update, we have made many quality-of-life improvements to the game that have been requested over the years, along with 3 additional levels to make the game even more challenging. Try to beat all 10 levels on every difficulty, and submit your best high scores to see if you can become the best Twinz! player in the world!

The iPhone/iPad version of the game is almost ready and will be released in the next week or so. Each App Store has a Free version of the game that is supported by Adverts. There is also a Pro version, which contains no adverts and has no additional delays etc. at the end of each level.

Links:

Twinz! Website
Twinz! on Google Play
Twinz! on the Amazon App Store

We hope you enjoy playing our game!

How I Made Reversi Magic For Android/iOS (And Games In General)

0

A few weeks ago, I took a bunch of my old computer systems (Atari’s, GameBoys and Sega Systems) to my kid’s school to show them off as part of his “History Of Video Games” project he had worked on. Several of the kids ask me, as a games programmer, how I make them, and even my own kids recently have started asking questions about how I make the small games that I do, so I thought I would write this up showing how I made my Reversi Magic game to hopefully educate them a little bit, and also anyone else who might be interested in learning the process.

Firstly, I should start by saying that the various methods used by different people tend to be very different; I take a more OldSkool approach to writing games than say, some of the modern game programmers. Also, being that I work mostly in my spare time, at home, at night, in-between a full time job & managing the kids, some things get done with more priority than others. Someone with more resources/time etc. can probbably get things done a lot quicker. That being said, i’m always open to feedback so feel free to comment on this if you have some 🙂 Don’t shoot me if I do something differently than everyone else 🙂

Coming Up With Ideas

Before I start laying in any amount of code, I usually try to come up with an idea of where I want the game to go. Depending on the game and whats going on, there might not even be an idea yet. Ideas tend to come from existing games, so you might have a couple of web games that seem good, but if one had this feature, or copied ideas from this, it might be even better. If I have a general idea of what I want to work on, i’ll take an empty project file of mine (which consists of the game basics such as the menu’s and basic graphics, enough to be able to press Play, and just start adding game code right away) and modify it to work with a very crude, but simple engine showing the gameplay for this idea. This will be tweaked until the game is able to do what I was thinking of, then its evaluated for how well it plays. Lately I have been playing online casino games at https://imhighroller.com/reviews/genesis-casino-review/, its been fun to play with other people. Some of these tests might seem pretty good, even with very basic graphics (often coloured blocks or re-used images). Others, will be quite bad. It’s not a bad thing if the idea doesn’t yet work, it just needs more refining. After working on a very basic idea, its often good to have a friend play with it and have them give you some feedback. You are trying to find an idea thats engaging to you and your players, so if your friend is very quickly bored, or finds the idea too challenging or confusing, then you need to head in another direction.

In this picture, this game (called Avalanche!) was put together in about 2 days altogether, to show off some ideas I had about a columns-based game, and matching snowflakes together to make some cool snowy explosions etc. In the end, I never released the game, but it was fun to work on the prototype.

In the past, I have prototyped as many as 30+ different game ideas, some better than others, until something comes up. Often, you’ll know when a good idea comes up as you’ll find yourself playing it for ages, while not getting bored of it. Also, your friends might like playing it too. They are also handy to come back on later as well, i’ve worked on some I haven’t touched in years, bringing some new changes and various elements to the table that turn it into a better game.

The Design Process

Once you have thought of a solid idea to work on, it’s often a good idea to do a brief design draft of where the game should be heading, so that you don’t fall off the wagon too easily. If you’re going a route that’s not recommended or you get stuck what to do next, you still have your plan to fall back on for guidance. Again, depending on the type of game you are writing, you can also define a list of specific behaviour rules here, that must be followed at all times. For example, if it’s a puzzle game, you would lay out the logic here exactly, so that you know exactly how it’s supposed to play. If its doing something its not supposed to, you can later analyze this logic to start tracking bugs. This is more important for larger games, or puzzle games that have a lot of different AI/Logic combinations.

Normally I do paper notes for almost all of my games, I still have notebooks with designs in them from my days of writing programs on the ZX spectrum games! One day, i’ll put all that stuff online, but it won’t be today hehe 🙂

Below is my notebook pages that I did for my Reversi Magic game, that’s currently available on Android, iOS and Kindle Fire. The notes were done a year or so ago. The idea was very simple, and I have always been interested in playing Reversi on the computer, with this game not being my 1st on the computer. The goal was to make a simple, easy to pick up game that anyone could familiarize themselves with, without having to learn any new rules or be bombarded with over-the-top graphics. Not all games require notes, but it doesn’t hurt to play with pen/paper every so often to make some design sketches. These 2 pages are the design spec that I originally set forward to complete:

 

The 1st page just covers some simple layout rules and goals that I would like to have the program meet, and the 2nd page shows some interface layouts for various orientations, and a few other design elements such as an idea I had for dynamic grid frames.

Applying Code

 Once you have a clear idea of where you want to go, you can start laying in code. I’m often asked which part of the game do I start on first? Most people always assume that the graphics are first. The correct answer is actually the AI/Logic of the game (how I do it anyways) with a little bit of graphics work to get the basic shape of what you are working on. The graphics for this game were actually quite simple to do. I use a CAD program called CoCreate, so I used it to make the rotating disk image and capture each of the frames for it. The picture on the left is a small version, with an added drop shadow to make the edges stand out a bit more. The actual images are a lot bigger, so they look sharp & crisp even on the iPad Retina displays. The backdrop is also translucent, so the shapes can be blitted anywhere.

I spent a full month of non-stop coding of the AI engine for the game. The tough parts were testing it to make sure it plays 100% compliant moves, so in the end, there would be a long debug report of the game, how the computer did, as well as opportunities that it took/missed so I could review and tweak the AI later. The AI algorithm itself is based on a combination mix of NegaScout & Min/Max game theories. The Min/Max algo will evaluate scores recursively for the Best/Worst possible scoring points, and NegaScout does some pruning to several paths in that tree, to ensure the answer it comes out with can be found faster. Combine this with some traditional elements of gameplay, a method of looking at grid moves to determine how risky they are, and you have a very powerful AI routine. You can learn more about the Min/Max methods Here in this great tutorial (with samples and images).

The next hardest part of programming the AI was to teach the computer not to be too hard on beginner players. Its programatically easy to make the computer as hard as nails when it comes to playing the game, but how do you adjust those levels so that they are somewhat forgiving to a new player? Again, with a reverse NegaScout algo, and a few other traditional playing rules implemented, the computer will now assist the player to some extent when playing its moves, so as not to dominate. Of course, there are always some people who are just not very good at the game (or Reversi in general), and as I have seen on the feedback for my games, they think the game is the fault and tend to leave negative feedback because of that.

Your game should also show assists/help to your players, for when they get stuck and cannot decide where to play a move. They also may not realize they can play a move in certain areas. In Reversi Magic, I added options that show you where you can place a tile, they actually cycle in and out as small transparent disks of your colour. Tap the disk to place your move. There is also an option that shows you where the opponent last moved, so if you are not following the board too closely, you can still see where they last played and how it affects your strategy. Both of these assist options can be turned off in the game Options screen at any time, though they are enabled by default for first time users of the game. In my original design, I had wanted to show how many disks were going to be flipped for each move that was shown as available, but as experienced players will tell you, playing for the best possible score every time is not the best playing strategy at all, so I eventually removed it.

Cleaning Things Up

Now that the majority of your code is done, the last part of the process is to apply the spit & polish needed before you release it. For me, this is usually when I will finalize all of my graphics, and add all of the last bits of fine tuning to the game. Normally, i’ll sit in a room with my Nexus 7 and play the game, write down all the stuff that I see that is annoying, or needs fixed (out of place text, menus that move too slow, playing effects that should happen that don’t, ways to improve the ingame experience etc. etc.) and then after I have the list, i’ll set forth on making the changes. If you are not already doing so at this point, its often a good idea to send out your game to some private testers. Friends/family often make a good choice, but you want to pick some who are open to give you criticizing feedback (and some who will actually give feedback!) Listen to their complaints and what they think might make the experience better. You might not be able to implement it 100% exactly as everyone wants it, but you might be able to meet in the middle, especially if several testers are reporting on one specific area/feature of the game (which normally means you should focus some effort on it anyways).

From Prototype, To Finished Game

 When you think that the game is ready, it can be released to the world. Be sure that before you release it, it has been tested thoroughly by your team, as there is nothing worse than having a game that gets launched on a platform such as iOS and theres a massive bug in it that prevents users from playing properly. I’ve been there, and its not a good feeling, as Apple are not very fast when it comes around to updating. The general public tend to do more crazy things with the game (seeing as there is much wider exposure to strange incidents) so putting your app through the ringer beforehand, making sure certain phone events don’t crash it, is extremely important. If you plan to release on tablets as well, be absolutely sure to test a range of different tablet resolutions, both in the Landscape/Portrait aspect. You should also make sure your graphics look good, as if someone on say a retina iPad has to look at your scaled-up low resolution logos, it makes for quite an eyesore.

In the above pictures, I have used my game Twinz! as an example of what the game may look like in prototype, to the final product. The left screenshot is from the prototype game I did in about 2005 or so. It was just a handful of images, a simple shaded image for the door shutters, and a small logo. The image on the right is taken from an iPhone running the released version of the game. As you can see, the screen’s real-estate has been cleaned up to make the size of the tiles more optimal, and get rid of the unused areas. This game runs great on tablets, and features high resolution tiles.

Whats Next?

After the launch, you can sit back and watch your total downloads go up for each market, and wait for your customer’s feedback. Most players are nice in that they will contact you directly about any bugs they might find, before they leave negative feedback, so if you do get not-so perfect app feedback, or bug reports, be sure to get right on top of them and prepare for an update in the future.

While I have yet to become mega rich or famous from one of my games, this is still a hobby that I love to do, and hope that one day at least one of my games will be successful enough that I can quit my job and focus on doing this full time 🙂

If you want to play any of the games mentioned above, or any other games of mine, please visit the app store for your preferred device and try them (there are free versions of all of my games): Amazon App Store (For All Kindle Fires), Apple App Store, Google Play

Should you find the info in this page useful for anything, show your support by buying a game! If you have questions, ask in the comments or send me a quick email. Thanks!

Reversi Magic Updated For iOS / Android / Amazon Kindle Fire

2

I have been spending a lot of time lately working on Reversi Magic, my Othello/Reversi game. Since the game was originally released last year, I have been spending time on optimizing the various parts of the game for AI, appearance, and also ensuring that it works on absolutely any device out there. The game has certainly come a long way since I originally started working on it!

The game’s AI functions make use of a NegaScout/PVS algorithm to determine the best possible moves based on a series of conditions, such as difficulty, board status and a few other things. The easy level is designed to be not too difficult, but good enough to keep you alert during play. As the levels get harder, the AI will step up it’s game and the Hard levels are quite tough to beat! I spent close to a full month working on AI code alone, and it was very educational for me. One day I should write up something on how the AI works, as someone else might find it useful in a different game.

embedded by Embedded Video

YouTube Direkt

Anyways, if you would like to give the Free version of the game a go, you can find it at your favourite App Store by clicking one of the links below:

appleappstoreAndroidMarketLarge

amazon-android-app-store

Screenshot Gallery for Reversi Magic:

How To Link To All Your Apps On The App Store In iOS, and other App Stores

1

While working on an update for one of my games, I ran into a problem where I wanted to create a link to every app on the App Store that I had written. Each of my games has a button for ‘More Games’ that currently just takes you to my website, where you can see the games, but what if this could be tailored to go directly to the app store page itself? This generates better install follow through, as the viewer can simply click the Install/Purchase buttons, without having to go anywhere else!

How To List All Of Your Apps On Google Play

Directing the viewer to a list of all of your published apps on Google Play is as simple as making a link to your Publisher Name, such as:

market://search?q=pub:Andy+Kellett

Or, if you wish to do it via the web, you can link to this (clickable) link:

http://play.google.com/store/search?q=pub:Andy+Kellett

If your Publisher Name uses spaces, replace them with a + instead. Feel free to check out some of my Android games at the store!

How To List All Of Your Apps On Amazon Kindle Fire

The Kindle Fire runs Android, however it does not run any of the Google services at all, and many developers make the mistake of accidentally using some of the services in their apps, which do cause problems. Nothing is more embarrassing when you release a lite version of your game, only to have the link to upgrade to the paid version not work. The Amazon method is extremely simple:

http://www.amazon.com/gp/mas/dl/android?p=com.fishguygames.WordSearchHunterFree&showAll=1

The com.fishguygames.WordSearchHunterFree is the package name of the originating request, although Amazon doesn’t appear to do much with this initially that you can see, it lets the system know where the request was generated from. You can also manually enter the above URL in a regular browser window, which will generate a new address that can also be used, such as the following:

http://www.amazon.com/s/ref=mas_dl?_encoding=UTF8&field-brandtextbin=FishGuyGames&node=2350149011

Both are 100% compatible from launch. If launched on a Kindle device, the 1st link will give you the option of viewing the app list on the web, or in the Amazon App Store. The 2nd link is only viewable on the web, even if launched on the Kindle, so for use within your App, I reccomend the top link. On Non-Kindle devices, the top link is auto-converted to the 2nd one for display purposes.

How To List All your Apps On iOS/Apple

Follow these simple steps to do the same thing on iOS for your Apple products:

SelectLinkLocation
Step 1 – Find your app in the App Store. Right click on your Publisher name, and choose Copy Link to copy the address to the clipboard, so you can paste it in the next step.

Edit The Link
Step 2 – Paste in the link, and change the http:// header (the link in the example is highlighted above) to itms://, as this will stop the app from redirecting as many as 3 times, and instead use the iTunes Store app directly, making the experience faster for the end user. This link can be used in any app and shouldn’t ever change.

App Store List
Step 3 – Test the code on different devices, to ensure it works the way you expect it to! If you wish to have the same effect from your website, just keep the URL as it was.

If you would like to play some of the various games I have written for iOS, Check Out My List Of Games for more information! This should open a window, which will then open your iTunes and take you directly to my developer pages!

I hope this post helps you!  Andy Kellett

Creating A New Game & Framework In 30 Days – Piles’o’Tiles for Android/iPhone \o/

0

The Big Arrow - PilesOTiles

Click To Enlarge The Image

It’s been a while since I did any work on my games, which really is a shame as I still play my own games from time to time, and people are still buying them and playing them too. So, I have decided that I would motivate myself with a “New Game In 30 Days” type blogfest, where I port the old game to a brand new format in the space of a month!

The first game I picked to port is my popular Piles’o’Tiles Mahjong game, its been long overdue to be overhauled and is still fairly popular amongst players. On top of porting the game, within the same period of time I plan to develop a re-usable game framework that I will use in all of my games, so after Tiles I can easily jump in and start porting my other games such as Jelly-Othelly, Crazy Crystals and my unreleased WordHunter games. I also have some ideas for a few new games, but need the framework before I put together some experimental test versions, and see how bad the idea sucks when it’s played for real!

The plan is to have tiles in an almost-ready state by the end of the month, and from there I can fix any small issues, tweak a few bits and pieces and then release not too long after, if it even takes that long.

Today is Day 4, and most of the screen switching framework is in place, graphics are loading and being processed accordingly, and most menu/gadget functions are in and working. Once a few little things are fixed, the next steps are to start adding actual game code, such as level rendering and a few other parts critical to testing the rest of the game itself. Once they work, then I can start on the menus and level selectors etc. before finishing with the finer details.

I will keep you posted as to how it progresses, and when I am ready to find some beta testers to take a look at it! The plan is to try and get it released for Android & Desktops at the same time with an iPhone version to follow not too long afterwards. Thanks!

Android Development Finally Taking Shape!!

0

Over the last few weeks, I have been helping my friend Paul port some of his code over to Android. Currently he releases games for PC, Mac, and iPhone and so the move to Android is a good one. Most of my involvement was working on sound, and the C to Java handling code. Lots of stress when digging through the error logs, but it has coming along very nicely! We started the process aiming for an Android 1.6 target, to ensure we can support the most amount of users across all devices.

I have also been tinkering with some of my own Android projects, moreso converting some of the games I have written to work on the new platform. So far its working out well, I have the basis for my framework in and working, and I am hoping to have the first of my games ready in about 2 months. I’ll post more about them here as I get them ready for testing or release.

In the meantime, check out some of Paul’s great games at http://www.shoecakegames.com 🙂

So Just How Much Shit Did Steve Jobs Spout At His Press Conference? Quite A Lot Apparently!!

0

After watching the live-blog from several websites regarding the iPhone 4 “Antennagate” issue from this Friday, I was just so shocked about what happened that I had to sit and mull my thought for a few days before I could really think about it, and comment on anything properly. I mean, not many people could transform a huge fiasco of what was actually happening with the iPhone 4, into a complete diversion from the initial problem at hand. Instead of admitting the iPhone 4 has a major problem, it was played down as nothing different than every other phone, and even though there was no problem we’ll give you a free case anyways.

What started out as a simple “touch of death” of the phone, turned into a huge “Killer Grip” presentation where Jobs initially started diverting the blame from his phone, by showing still images from other phones and manufacturers having “similar” issues. These stills showed the phones being cupped by someones hands, and pictures of the antenna strength declining. Let’s not remember, that the iPhone can die with just the slight touch of your little pinky finger on the two lines; And cell phone 101 – You cover up enough of your phone, or certain key areas of the phone, you will begin to lose some of its reception. This claim was seriously overrated on Jobs presentation to the point where it was just ludicrous.

To throw in a bit of a bump, Jobs did state that he would give all iPhone 4 owners a free case if they wanted one, and those who had already bought one a refund. Mind you, that did only apply to the Apple official bumpers, and no refunds for anyone who bought a 3rd party case. To add another insult, the free case offer is only open till September 30th where they will “re-evaluate the situation” and decide if free cases are still warranted. Personally, if they are going to do the “We’ll hide the problem and just give you a free case” then it should be shipped with one. This mediocre solution however, still doesn’t fix the underlying issue.

The Q &A session at the end of the press conference was a classic. Steve Jobs returned to his original dick self as was apparent in the 90’s (and almost bankrupted Apple a couple of times) by denying any issue, being smart with reporters and not clarifying anything much more than what he had actually said. He was even fighting back at one reporter who had asked about the software update Apple has been praying will fix their problems (but everyone knows it wont) by denying that the signal issue was even there to begin with. The answer was something like “This” issue you speak of has just been explained in the last hour. So, what turned out to be a big hope for Apple (in terms of fixing the signal bars) has become a nothing now, as I guess they figured out everyone got smart at the real problem – noise interference in the atenna assembly.

The press conference itself was nothing more than smoke and mirrors. What really really made my day though was reading the response from Consumer Reports. We all know the only reason that they hosted this press conference was because of CR’s refusal to recommend the iPhone 4 in any way to its customers, as well as the other public figures and corporations who wanted a response from Apple. Well, Apple just assumed that a free case and denial of the issue was sufficient. CR’s response said that Apple was making “A great start to fixing the problem by offering a free bumber case” and that it still won’t recommend the phone. Brilliant! Some of the big corporations finally standing up to Apple!!

After the conference, of course everyone started writing their own things on what they fought. Its funny watching people write about how Apple has done everything correctly, and that consumers should get over it blah blah blah. I’m sorry, but if you release a product with a major flaw that only 0.55% of people called Apple about (lets remember, called Apple, this isn’t including going to the Apple stores, complaining about it on the web, or the millions of people who just think its a bad reception area) and you try to pretend the problem doesn’t exist, it is not OK in my books.

Jobs also has the manufacturers of the phones listed in his presentation in an uproar too, to the point where HTC officially posted numbers of their complaints versus Apple’s – the iPhone 4 had 35x as many complaints about reception quality versus HTC. thats a LOT of complaints! Some of the other guys are thinking of suing for defamation (which I think that they should!).

Personally, I think Jobs should have done a lot more at the press release. Giving away a free bumper was only the beginning. He should have admitted fully that there was a major issue and not try to deny that it occurs to everyone else. That is just completely petty and selfish. While it was apparent that Jobs was clearly aggravated, and that everyone should just accept it, he should have offered a better long time solution. Maybe not a direct recall, but a chance to replace it for a newer model later at no cost. You have to remember, as much as I would like for Apple to recall the phone, they still need to create a solution to the problem. Until they design/build it, then they wont recall. My thoughts on that are that the white iPhone will be almost immune to the problem (because of the white paint/covering on the antenna) so maybe that would be a better way to go.

Apple knew of this problem a long time ago and went well out of their way to skip the Q&A to detect it very early. Its also wierd that this is the first time Apple have produced a phone case, and my guess is they knew that they would have to give one away (because they knew their antenna was flawed) so rather than paying a lot of money to a 3rd party supplier like Belkin, they’d eat the 30c per bumber and profit by selling them at $30 each.

Well done, Apple. you have completely lowered yourself even deeper into the shithole 🙂 Nice way to treat your millions of loyal customers by denying their problems exist! Here is hoping that Android buries you into the ground! Oh wait, they did!!! Imma let you finish n’ all, but they activated 3.5 million Android phones (Activated is not the same as Sold, as they sold MANY more im sure!!) in the same 22 days you SOLD 3 million phones! Toodles!!

Go to Top