An Android word puzzle game made with libGDX (Java). Swipe across a wheel of letters to spell words and fill a crossword grid. It has 10,034 English and 10,032 Turkish levels.
This game is built on a purchased CodeCanyon template, "Word Connect Android Game". The template's manual is included as docs/template-help.pdf. This repository is the renamed, configured and maintained version that was published on Google Play (app name Wordy). Template and customization separates what the template provides from what was changed.
- Core loop: drag across the letters on the dial to spell a word. Words that belong to the board fill in their row or column; complete every word to clear the level.
- Levels: 10,034 in English and 10,032 in Turkish. The first levels use 3–4 letters and 2–4 words. From level 1,000 on they use 7–8 letters and 9–16 words, on grids up to 12 × 10.
- Hints:
- Shuffle.
- Reveal a random tile, or a tile you choose.
- Reveal several random tiles at once.
- Rocket: reveals a word's first and last letters and puts collectible coins on the rest.
- Players start with two of each hint and can win more. When none are left, hints cost coins.
- Coins: come from combos (several correct words in a row), bonus words, boosters, rewarded videos and push-message gifts.
- Bonus words: valid words that are not on the board are collected; every 50 pays out coins. A word filter (
vulgar.txt) keeps offensive words from counting. - Boosters (from level 15, every 5th level, in rotation):
- a UFO to tap before it flies off;
- a bomb to defuse before you run out of moves (a video buys 5 more);
- a gold pack;
- "Jumpy" the monster, who drops coins when caught.
- Extras:
- A lucky wheel once every 24 hours.
- An in-game dictionary: tap a solved word to see its definition (English only).
- Interactive tutorials for the dial, shuffle and every hint.
- Seasonal title screens (Halloween, Thanksgiving, New Year) and 10 game backgrounds that rotate every 10 levels.
- A rate-us prompt and a support e-mail button.
- Languages: the player picks English or Turkish at first launch and can switch in the menu. Level progress is kept separately for each language.
Status: Published on Google Play. The first release build dates from December 2020. The project was updated in 2022 for Google Play's target-API and SDK requirements, and the latest release bundle was built in January 2023.
Google Play: https://play.google.com/store/apps/details?id=com.wordfind.mchunter. The store listing uses the application ID com.wordfind.mchunter; this source snapshot is configured for com.tblood.wordfind.
Known issues in this snapshot:
android/assets/data/en/strings.propertieshas a Turkish text forspin_again. This label doesn't appear with the current one-spin-a-day wheel setting.
The project started from "Word Connect Android Game" (CodeCanyon; manual in docs/template-help.pdf). The template supplies:
- the complete libGDX game:
core, the Android and desktop launchers, and the ads, push and billing integration; - all art, sounds and fonts, including the PSD sources and sprite-sheet projects in
resources/; - the English and Turkish word lists and their ~10,000 levels each. The manual describes both languages as part of the template, and the level files date from October 2020;
- the level generator in
resources/CrosswordGenerator.
Customized and published:
- App identity: app name Wordy (
android/res/values/strings.xml) and application IDcom.tblood.wordfind(android/build.gradle) instead of the template defaults. The Java package staysword.game. - AdMob: the project's AdMob app and ad-unit IDs in
strings.xml, with test ads off. Interstitial and rewarded ads are enabled. - Monetization: ads only. In-app purchases are switched off (
IAP_ENABLEDisfalse), so the shop and Play Billing code are inactive. - Firebase: a Firebase configuration for
com.tblood.wordfind, used for push messages.android/google-services.jsonis not in the repo. - Settings and text:
GameConfig.java,UIConfig.javaand bothstrings.propertiesfiles were edited in February 2022. SeveralGameConfigvalues differ from the template's inline comments, e.g. 500 starting coins where the comment says 0. - 2022–2023 updates for Google Play requirements:
- Compile/target SDK 31, with
android:exportedset in the manifest. - Android Gradle Plugin 7.1.0 and Gradle 7.2.
- Ads code on the Mobile Ads SDK 20 API (
InterstitialAd.load,RewardedAd.load) and billing on Play Billing Library 4.0 (queryPurchasesAsync). - New release builds.
- The
//UPDATE//markers inIAPActivity.javasuggest that part of this code came from a template update.
- Compile/target SDK 31, with
- Published on Google Play; first release build December 2020.
Owner: add any other changes you made here.
| Area | What it uses |
|---|---|
| Engine | libGDX 1.9.11 (Java), scene2d UI, custom GLSL shaders |
| Modules | core (shared game code), android (launcher and platform services), desktop (LWJGL2 launcher for testing on PC) |
| App | Application ID com.tblood.wordfind, versionName 1.3.3 (versionCode 1), code package word.game |
| Android build | Android Gradle Plugin 7.1.0, Gradle 7.2 wrapper; compileSdk/targetSdk 31, minSdk 16; multidex; R8 shrinking for release (proguard-rules.pro) |
| Ads and consent | Google Mobile Ads SDK 20.5.0 (AdMob interstitial + rewarded), User Messaging Platform 2.0.0 |
| In-app purchases | Google Play Billing Library 4.0.0 (integrated, switched off) |
| Push messages | Firebase Cloud Messaging (Firebase BoM 25.11.0, google-services plugin 4.3.10) |
| Dictionary lookups | jsoup 1.13.1 (parses Princeton WordNet's HTML results) |
| Art pipeline | 4 texture atlases exported at 3 scales (_sd, _hd, _hdr) from a gdx-texture-packer-gui project (resources/word_connect.tpproj); Hiero bitmap fonts made from Montserrat; PSD sources |
| Level tooling | resources/CrosswordGenerator: standalone Java program with an SQLite word database (resources/db/word_source.db; sqlite-jdbc 3.30.1, org.json 20190722) |
The build script also carries libGDX-setup leftovers that the game doesn't use: the Box2D dependency and its native libraries, the GWT plugin and a RoboVM version.
All of this code comes from the template; files changed later are listed above.
Game code lives in core/src/word/game/: 126 Java files, about 22k lines. There are also 9 Android classes, 6 desktop classes and 16 generator classes, so 157 Java files in total.
| Package | Contents |
|---|---|
screens |
SplashScreen (asset loading, first-run language choice), IntroScreen (title screen), GameScreen (about 2.3k lines, the level screen), shared BaseScreen |
controllers |
GameController: answer checking, bonus words, combos, booster triggers, level end |
model |
GameData (level loading and save data), BoardModel, CellModel, Level, Word, Constants |
ui/board |
Crossword grid (BoardView, CellView) and the board boosters (Ufo, Bomb, GoldPack, Monster) |
ui/dial |
Letter dial (Dial, DialButton), connection lines, combo ring animation and particles |
ui/hint |
Hint buttons, Rocket, idle-hint timer, rewarded-video button |
ui/dialogs |
Dictionary, how to play, bomb, watch-and-earn, remove ads, bonus words, menu and language (menu/), lucky wheel (wheel/), shop (iap/) |
ui/tutorial |
Interactive tutorials for the dial, hint buttons and boosters |
ui (other) |
Level-end view, combo display, feedback ribbons, toasts, tooltips; top_panel (coins, level, combo), preview (word being spelled), confetti, calendar (date interface for seasonal content) |
pool |
Object pools for letters, cells, dial buttons, coins, words and particles |
managers |
ResourceManager (asset loading, resolution choice), LanguageManager (UI text via I18NBundle), HintManager (coins and hint counts), AdManager interface, ConnectionManager |
config |
GameConfig (economy, ad frequency, boosters, languages, IAP catalog), UIConfig (colors, layout, backgrounds), SoundConfig |
actions, graphics, util, net, i18n, events |
Bezier/curve scene2d actions, atlas regions and nine-patches, shader actors, screen shake and UI helpers, network/dictionary interfaces, locale model, dictionary event |
Outside core:
android/src/word/game/: the activity chain (AndroidLauncher,IAPActivity,AdActivity), the Firebase messaging service, the English WordNet lookup, and date and network helpers.android/assets/data/<lang>/(en,tr):levels/: one JSON file per level.words.txt: every allowed word asid:WORDpairs, about 32.5k English and 31.1k Turkish.vulgar.txt: the word filter.strings.properties: UI text.
android/assets/(other folders): texture atlases, bitmap fonts, sound effects, shaders, title and game backgrounds.desktop/: LWJGL2 launcher (366 × 650 window). No ads, billing or push.resources/: the template's source assets:- PSDs and the sprite-sheet folders
atlas_1toatlas_4; - the TexturePacker project;
- Hiero font projects and TTFs;
- the SQLite word database;
- the level generator.
- PSDs and the sprite-sheet folders
core/src/word/game/model/GameData.java: loads and saves game state.- Each level is a tiny JSON file. For example,
"o": "9,9,KINFOLK"gives the grid size and dial letters, and"a"/"d"list the across/down words aswordId,x,y. - Word IDs are looked up in
words.txt. - Progress (solved words, rocket words, tile states packed as
(x << 8) | y) is saved per language in libGDXPreferences.
- Each level is a tiny JSON file. For example,
core/src/word/game/controllers/GameController.java: checks each swiped word against the board first, then against the bonus-word list and the word filter.- Found words go through an animation queue.
- Crossing words completed as a side effect are solved automatically.
- Boosters react to the tiles that get filled.
core/src/word/game/ui/dial/Dial.java+graphics/shader/LineShader.java: the line between selected letters is drawn by a fragment shader (android/assets/shader/line.frag: anti-aliased distance to a line segment), not sprites.DialAnimationContainerusesdial.fshfor a rainbow ring around the dial that grows with the combo count.core/src/word/game/managers/ResourceManager.java: picks the_sd,_hdor_hdrasset set for the screen size and computes a global scale factor, so one set of art serves small and high-resolution phones.android/src/word/game/activity/:AndroidLauncherextendsIAPActivity, which extendsAdActivity. The core only talks to interfaces (AdManager,ShoppingProcessor,AppExit,RateUsLauncher,SupportRequest,WordMeaningProvider,Network,DateUtil).corehas no Android dependencies and also runs through the desktop launcher.android/src/word/game/WordConnectFirebaseMessagingService.java: a push message to the topiccoin_topicwith acoinsvalue is passed on by local broadcast toWordConnectGame.notificationReceived(), which adds the coins and shows a dialog.
A standalone Java program that comes with the template. It produced the level files in android/assets/data/<lang>/levels/. For each level index it:
- Reads that level's rules from
src/generator/level_definitions/LevelDefinitions_<lang>.java:- dial length;
- word difficulty score 1–4;
- minimum word length;
- min/max number of words;
- how many levels must pass before a word may reappear.
- Picks a random word with that length and score from the
words_<lang>table inresources/db/word_source.db. Its letters become the dial. - Collects every database word that can be spelled from those letters.
- Lays the words out as a crossword of at most 10 rows × 12 columns. The layout code is based on the MIT-licensed satchamo/Crossword-Generator, credited in the template manual.
- Discards boards with too few words and duplicates of existing levels.
- Moves the used words'
reappearlevel forward so words spread across the level set. - Writes the level as JSON, and exports
words.txt(all words with score 0 or higher) andvulgar.txt(score -1).
Word scores in the database: -1 offensive (never used, filtered), 0 obscure (bonus word only), 1–4 easy to hard. The database and output paths in src/generator/Main.java still point to the template author's machine.
| Service / content | Used for |
|---|---|
| Google AdMob (Mobile Ads SDK 20.5.0) | Interstitials at the start of a level. There are none during the tutorial levels, then they come more often as levels go up (GameConfig.shouldWeShowAnInterstitialAdForThisLevel). Rewarded videos give 20 coins or 5 extra bomb moves, at most one every 40 s. IDs and switches are in android/res/values/strings.xml. |
| Google User Messaging Platform 2.0.0 | GDPR consent form code in AdActivity (not called at the moment; see Status) |
| Firebase Cloud Messaging | Push messages to the coin_topic topic; a coins data value gives coins in game |
| Google Play Billing Library 4.0.0 | Shop with 6 coin packs, 4 bundles (coins + hints) and Remove Ads; inactive because IAP_ENABLED is false |
| Princeton WordNet (web search) | English definitions for the dictionary dialog, fetched over HTTP (hence usesCleartextTraffic) and parsed with jsoup. There is no Turkish dictionary. |
| Open-source libraries | libGDX (Apache 2.0), jsoup (MIT); for the generator, sqlite-jdbc (Apache 2.0) and org.json (JSON License) |
| Template media | Montserrat fonts plus icons, sounds and backgrounds from iconfinder, flaticon, freesound, pngtree, pexels and freepik; licenses and required attributions are listed at the end of docs/template-help.pdf |
This public repository is a showcase. It contains the documentation for this project. The game is built on a licensed CodeCanyon template, so its source code is kept in a private repository.
Copyright © Omer Avcioglu (McHunter Studio). All rights reserved. Viewing only; see LICENSE.