Compare commits

..

9 Commits

49 changed files with 9137 additions and 428 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 4.6 MiB

View File

@@ -2,6 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-feature android:glEsVersion="0x00020000" android:required="true"/> <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<uses-permission android:name="android.permission.INTERNET" />
<application <application
android:allowBackup="true" android:allowBackup="true"
android:fullBackupContent="true" android:fullBackupContent="true"

View File

@@ -1,21 +0,0 @@
package com.iofferyoutea.WitchQueen
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.BitmapFont
import com.badlogic.gdx.scenes.scene2d.ui.Container
import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.badlogic.gdx.scenes.scene2d.ui.TextButton.TextButtonStyle
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable
import ktx.assets.toInternalFile
open class Button(val upTexturePath: String, val downTexturePath: String, val fontPath: String, val defaultText: String = "New Button", val useDefaultFont: Boolean = true, val fontScale: Float = 1f) {
val buttonText = defaultText
val buttonUp = TextureRegionDrawable(Texture(upTexturePath))
val buttonDown = TextureRegionDrawable(Texture(downTexturePath))
val buttonFont = (if (useDefaultFont) BitmapFont() else BitmapFont(fontPath.toInternalFile())).apply { data.scale(fontScale) }
val buttonStyle = TextButtonStyle().apply { up = buttonUp; down = buttonDown; font = buttonFont }
val button = TextButton(defaultText, buttonStyle)
val container = Container<TextButton>(button)
}

View File

@@ -0,0 +1,6 @@
package com.iofferyoutea.WitchQueen
class Client(val hostAddress: String, val hostPort: Int, val playerProfile: PlayerProfile) {
val preparedItems: MutableList<Int> = mutableListOf(0, 0, 0, 0) // Item ID. 0 for no item
lateinit var map: Map
}

View File

@@ -0,0 +1,4 @@
package com.iofferyoutea.WitchQueen
class Game(val clients: Array<Client>) {
}

View File

@@ -1,11 +0,0 @@
package com.iofferyoutea.WitchQueen
import ktx.app.KtxScreen
import ktx.app.clearScreen
class GameScreen(val players: List<Player>, val map: Map) : KtxScreen {
override fun render(delta: Float) {
super.render(delta)
clearScreen(0.15f, 0.15f, 0.3f)
}
}

View File

@@ -14,14 +14,9 @@ import ktx.graphics.use
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
class Main : KtxGame<KtxScreen>() { class Main : KtxGame<KtxScreen>() {
//val mainMenu = MainMenu()
//val screenManager = ScreenManager.apply { switchScreen(mainMenu) }
override fun create() { override fun create() {
KtxAsync.initiate() KtxAsync.initiate()
// addScreen(FirstScreen())
// setScreen<FirstScreen>()
addScreen(MainMenu()) addScreen(MainMenu())
setScreen<MainMenu>() setScreen<MainMenu>()
} }

View File

@@ -3,221 +3,90 @@ package com.iofferyoutea.WitchQueen
import com.badlogic.gdx.Gdx import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.BitmapFont import com.badlogic.gdx.graphics.g2d.BitmapFont
import com.badlogic.gdx.scenes.scene2d.InputEvent import com.badlogic.gdx.scenes.scene2d.Actor
import com.badlogic.gdx.scenes.scene2d.Stage import com.badlogic.gdx.scenes.scene2d.Stage
import com.badlogic.gdx.scenes.scene2d.ui.Button.ButtonStyle
import com.badlogic.gdx.scenes.scene2d.ui.Container import com.badlogic.gdx.scenes.scene2d.ui.Container
import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable
import com.badlogic.gdx.utils.Logger
import com.badlogic.gdx.utils.viewport.ScreenViewport
import com.badlogic.gdx.utils.viewport.Viewport
import ktx.actors.centerPosition
import ktx.actors.setPosition
import ktx.app.KtxScreen import ktx.app.KtxScreen
import ktx.app.clearScreen import ktx.app.clearScreen
import org.w3c.dom.Text
class MainMenu : KtxScreen { class MainMenu : KtxScreen {
val myTable = Table().apply { val table = Table().apply {
debug = true debug = true
setFillParent(true) setFillParent(true)
} }
val myStage = Stage().apply { val stage = Stage().apply {
addActor(myTable) Gdx.input.inputProcessor = this
addActor(table)
} }
//region Map Button // Default
val mapButtonStyle = ImageButton.ImageButtonStyle( val defaultButtonTrd = TextureRegionDrawable(Texture("default.png"))
TextureRegionDrawable(Texture("default.png")), val flippedDefaultButtonTrd = TextureRegionDrawable(Texture("default_flipped.png"))
TextureRegionDrawable(Texture("default.png")), val defaultTextButtonStyle = TextButton.TextButtonStyle (
TextureRegionDrawable(Texture("default.png")), defaultButtonTrd,
TextureRegionDrawable(Texture("default.png")), flippedDefaultButtonTrd,
TextureRegionDrawable(Texture("default.png")), defaultButtonTrd,
TextureRegionDrawable(Texture("default.png")) BitmapFont()
) )
val mapButton = ImageButton(mapButtonStyle).apply {
myTable.add(this) // Map
myTable.getCell<ImageButton>(this).padBottom(myStage.viewport.screenHeight * 0.05f) // Figure out how to centre
// Lobby
// Start off only showing Host and Join button. When selected show menu for that option.
// Host is normal lobby
// Join will bring up menu with games on local network
val hostButton = TextButton("Host", defaultTextButtonStyle)
val joinButton = TextButton("Join", defaultTextButtonStyle)
val hostOrJoinVerticalGroup = VerticalGroup().apply {
addActor(hostButton)
addActor(joinButton)
} }
val lobbyContainer = Container<Actor>(hostOrJoinVerticalGroup)
//region Play
val casualButton = TextButton("Casual", defaultTextButtonStyle)
//endregion //endregion
//region Player Buttons val everythingVerticalGroup = VerticalGroup().apply {
// Local Player addActor(lobbyContainer)
// Remote Player addActor(casualButton)
val remotePlayerButton = PlayerButton().apply { table.add(this)
myTable.row() Gdx.app.log("MainMenu", stage.width.toString())
myTable.add(this.playerGroup) //Gdx.app.log("MainMenu", table.width.toString())
myTable.getCell<HorizontalGroup>(this.playerGroup).padBottom(myStage.viewport.screenHeight * 0.05f) // You've got to size the sub actors!
}
//endregion
//region Play Buttons
val casualButtonStyle = TextButton.TextButtonStyle(
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
BitmapFont()
)
val casualButton = TextButton("Casual", casualButtonStyle).apply {
myTable.row() // Start with a new row
myTable.add(this)
myTable.getCell<TextButton>(this)
} }
val competitiveButtonStyle = TextButton.TextButtonStyle( private fun update(delta: Float) {
TextureRegionDrawable(Texture("default.png")), if (hostButton.isPressed) {
TextureRegionDrawable(Texture("default.png")), Gdx.app.log("MainMenu", "Host button pressed")
TextureRegionDrawable(Texture("default.png")), }
BitmapFont() if (joinButton.isPressed) {
) Gdx.app.log("MainMenu", "Join button pressed")
val competitiveButton = TextButton("Competitive", competitiveButtonStyle).apply { }
myTable.add(this) if (casualButton.isPressed) {
myTable.getCell<TextButton>(this).padLeft(myStage.viewport.screenWidth * 0.1f) Gdx.app.log("MainMenu", "Casual button pressed")
}
} }
//endregion
override fun render(delta: Float) { override fun render(delta: Float) {
clearScreen(0.3f, 0.3f, 0.3f) clearScreen(0f,0f, 0f)
myStage.act(delta) update(delta)
myStage.draw()
stage.act(delta)
stage.draw()
}
override fun resize(width: Int, height: Int) {
Gdx.app.log("MainMenu", "resize called! New width: $width, new height $height")
everythingVerticalGroup.setSize(width.toFloat(), height.toFloat())
} }
override fun dispose() { override fun dispose() {
myStage.dispose() stage.dispose()
} }
} }
//class MainMenu : KtxScreen {
// val viewport = ScreenViewport().apply {
//
// }
//
// val table = Table().apply {
// setFillParent(true)
// debug = true
// }
// val stage = Stage(viewport).apply {
// Gdx.app.log("WitchQueen", "Width: " + viewport.screenWidth.toString() + " Height: " + viewport.screenHeight.toString())
//
// Gdx.input.inputProcessor = this
// addActor(table)
// }
//
// // Map Selection Button
//
// // Player Table
//// val inviteButton = Button(
//// "default.png",
//// "default_flipped.png",
//// "",
//// "Invite Player",
//// true,
//// 2f
//// ).apply {
//// table.add(this.button).size(1024f, 512f)
//// table.row()
//// }
//
// // Invite Player Button
// val playerPlaceholderButtonUp = TextureRegionDrawable(Texture("player-frame-up.png"))
// val playerPlaceholderButtonDown = TextureRegionDrawable(Texture("player-frame-down.png"))
// val playerPlaceholderButtonChecked = TextureRegionDrawable(Texture("player-frame-up.png"))
// val playerPlaceholderButtonStyle = ImageButton.ImageButtonStyle()
// .apply { up = playerPlaceholderButtonUp; down = playerPlaceholderButtonDown; checked = playerPlaceholderButtonChecked }
// val playerPlaceholderButton = ImageButton(playerPlaceholderButtonStyle)
// val playerPlaceholderContainer = Container<ImageButton>(playerPlaceholderButton).apply {
// width(viewport.screenWidth * 0.8f)
// height(((viewport.screenWidth * 0.8f) * 9f) / 32f) // container.width is 0. We need to work out the width again.
// padLeft(0f)
// }
//
// val player1TableButton = PlayerTableButton().apply { // These should only be collections no t buttons?
// container.width(viewport.screenWidth * 0.8f)
// container.height(500f)
// //container.height(((viewport.screenWidth * 0.8f) * 9f) / 32f) // container.width is 0. We need to work out the width again.
// container.padLeft(0f)
// }
// val player2TableButton = PlayerTableButton() // Since the collection contains the buttons we need anyway?
// val playerTableButtonCollection = VerticalGroup().apply {
// addActor(player1TableButton.container)
// addActor(playerPlaceholderContainer)
// table.add(this)
// table.row()
// }
//
// // Casual Button
// val casualButton = Button(
// "default.png",
// "default_flipped.png",
// "",
// "Casual",
// true,
// 2f
// ).apply { // Could probably do this in Button. Just take in width and aspect ratio and padding?
// container.width(viewport.screenWidth * 0.375f)
// container.height(((viewport.screenWidth * 0.375f) * 3f) / 4) // container.width is 0. We need to work out the width again.
// container.padLeft(viewport.screenWidth * 0.1f)
// }
//
// // Competitive Button
// val competitiveButton = Button(
// "default.png",
// "default_flipped.png",
// "",
// "Competitive",
// true,
// 2f
// ).apply {
// container.width(viewport.screenWidth * 0.375f)
// container.height(((viewport.screenWidth * 0.375f) * 3f) / 4) // container.width is 0. We need to work out the width again.
// container.padLeft(viewport.screenWidth * 0.05f)
// }
//
// val playButtonGroup = HorizontalGroup().apply {
// addActor(casualButton.container)
// addActor(competitiveButton.container)
//
// table.add(this).width(viewport.screenWidth.toFloat())
// }
//
// // Methods
// private fun processInput() {
// casualButton.button.addListener(object : ClickListener() {
// override fun touchUp(
// event: InputEvent?,
// x: Float,
// y: Float,
// pointer: Int,
// button: Int
// ) {
// Gdx.app.log("My Project", "Clicked!")
// //setScreen()
// }
// })
// }
//
// override fun resize(width: Int, height: Int) {
// super.resize(width, height)
// stage.viewport.update(width, height, true)
// }
//
// override fun render(delta: Float) {
// super.render(delta)
// clearScreen(0f, 255f, 0f)
//
// processInput()
//
// stage.act(delta)
// stage.draw()
// }
//
// override fun dispose() {
// stage.dispose()
// }
//}

View File

@@ -1,4 +1,6 @@
package com.iofferyoutea.WitchQueen package com.iofferyoutea.WitchQueen
class Map { class Map(val mapType: MapType) {
val rooms = Array(2) { Array<Room>(2) { Room(mapType) } } // We use an array instead of list i think
} }

View File

@@ -0,0 +1,5 @@
package com.iofferyoutea.WitchQueen
enum class MapType {
DUNGEON, STREETS
}

View File

@@ -1,5 +1,10 @@
package com.iofferyoutea.WitchQueen package com.iofferyoutea.WitchQueen
class Player { enum class PlayerState {
val name = String() IDLE, LOOTING, FIGHTING
}
class Player(val map: Map) {
var currentState = PlayerState.IDLE
val currentRoom = arrayOf(0, 0) // Make this a spawn room or something
} }

View File

@@ -1,109 +0,0 @@
package com.iofferyoutea.WitchQueen
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.BitmapFont
import com.badlogic.gdx.scenes.scene2d.ui.Container
import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton
import com.badlogic.gdx.scenes.scene2d.ui.Label
import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable
class PlayerButton {
enum class STATE { EMPTY, CONNECTING, FILLED }
// Player Profile
val profileButtonStyle = ImageButton.ImageButtonStyle(
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png"))
)
val profileButton = ImageButton(profileButtonStyle)
// Player Username
val usernameStyle = Label.LabelStyle(BitmapFont(), Color.BLACK)
val username = Label("default", usernameStyle)
//region Player Items
val item1ButtonStyle = ImageButton.ImageButtonStyle(
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png"))
)
val item1Button = ImageButton(item1ButtonStyle)
val item2ButtonStyle = ImageButton.ImageButtonStyle(
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png"))
)
val item2Button = ImageButton(item2ButtonStyle)
val item3ButtonStyle = ImageButton.ImageButtonStyle(
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png"))
)
val item3Button = ImageButton(item3ButtonStyle)
val item4ButtonStyle = ImageButton.ImageButtonStyle(
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png"))
)
val item4Button = ImageButton(item4ButtonStyle)
//endregion
// Leave Lobby - Only shows for local player on local player's button
val leaveButtonStyle = ImageButton.ImageButtonStyle(
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png"))
)
val leaveButton = ImageButton(leaveButtonStyle)
// Kick Player - Only shows for local player on remote player's button
val kickButtonStyle = ImageButton.ImageButtonStyle(
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png")),
TextureRegionDrawable(Texture("default.png"))
)
val kickButton = ImageButton(kickButtonStyle)
val itemGroup = HorizontalGroup().apply {
addActor(item1Button)
addActor(item2Button)
addActor(item3Button)
addActor(item4Button)
}
val nameAndItemGroup = VerticalGroup().apply {
addActor(username)
addActor(itemGroup)
}
val playerGroup = HorizontalGroup().apply {
addActor(profileButton)
addActor(nameAndItemGroup)
addActor(kickButton)
}
}

View File

@@ -0,0 +1,7 @@
package com.iofferyoutea.WitchQueen
class PlayerProfile {
var iconPath = "default.png"
var username = "Default"
val availableItems: MutableList<Int> = mutableListOf() // Use Item IDs?
}

View File

@@ -1,65 +0,0 @@
package com.iofferyoutea.WitchQueen
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.BitmapFont
import com.badlogic.gdx.scenes.scene2d.ui.Button
import com.badlogic.gdx.scenes.scene2d.ui.Button.ButtonStyle
import com.badlogic.gdx.scenes.scene2d.ui.Container
import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup
import com.badlogic.gdx.scenes.scene2d.ui.Image
import com.badlogic.gdx.scenes.scene2d.ui.Label
import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable
import ktx.assets.toInternalFile
class PlayerTableButton(val playerIconPath: String = "default.png", val newPlayerName: String = "PLAYER"):
Table() {
val playerIcon = Image(Texture(playerIconPath))
val playerNameStyle = Label.LabelStyle(BitmapFont("default.fnt".toInternalFile()), Color.WHITE)
val playerName = Label(newPlayerName, playerNameStyle)
// Change preparedItems and kickButton into actual buttons
var preparedItems: MutableList<Image> = mutableListOf( // We should use libGDX scene2d.ui List?
Image(Texture("prepared-item-frame.png")),
Image(Texture("prepared-item-frame.png")),
Image(Texture("prepared-item-frame.png")),
Image(Texture("prepared-item-frame.png"))
)
val preparedItemsGroup = HorizontalGroup().apply {
for (item in preparedItems) addActor(item)
}
val kickButton = Image(Texture("red-x.png"))
// Sub-table for Player/Items stack - Use VerticalGroup instead
// val playerPlusItemsStack = Table().apply {
// add(playerName)
// row()
// for (item in preparedItems) add(item)
// }
val playerLabelPlusItemsGroup = VerticalGroup().apply {
addActor(playerName)
addActor(preparedItemsGroup)
}
// Sub-table for the contents of the PlayerTableButton - Use HorizontalGroup instead
// val subTable = Table().apply {
// add(playerName, playerPlusItemsStack, kickButton)
// }
val componentCollection = HorizontalGroup().apply {
addActor(playerIcon)
addActor(playerLabelPlusItemsGroup)
addActor(kickButton)
}
// Base Button stuff
val buttonUp = TextureRegionDrawable(Texture("transparent.png"))
val buttonDown = TextureRegionDrawable(Texture("transparent.png"))
val buttonChecked = TextureRegionDrawable(Texture("transparent.png"))
val buttonStyle = ButtonStyle().apply { up = buttonUp; down = buttonDown; checked = buttonChecked }
val button = Button(componentCollection, buttonStyle)
val container = Container<HorizontalGroup>(componentCollection)
}

View File

@@ -1,4 +0,0 @@
package com.iofferyoutea.WitchQueen
class PlayerTablePlaceholderButton {
}

View File

@@ -0,0 +1,12 @@
package com.iofferyoutea.WitchQueen
enum class RoomActivity {
EMPTY, LOOT, FIGHT
}
class Room(val mapType: MapType) {
var availableActivities: MutableList<RoomActivity> = mutableListOf()
init {
// Generate Room in this init block!
}
}

View File

@@ -1,22 +0,0 @@
package com.iofferyoutea.WitchQueen
import com.badlogic.gdx.Gdx
import kotlinx.coroutines.*
import ktx.app.KtxScreen
import java.lang.ref.WeakReference
object ScreenManager {
var currentScreen: WeakReference<KtxScreen>? = null
val screens: MutableSet<WeakReference<KtxScreen>> = mutableSetOf<WeakReference<KtxScreen>>() // Does this need to be mutable?
fun switchScreen(newScreen: WeakReference<KtxScreen>): Boolean {
if (!screens.contains(newScreen)) {
Gdx.app.log("ScreenManager", "newScreen not found in screens. Adding...")
screens.add(newScreen)
}
currentScreen = screens.find { it == newScreen }
return currentScreen != null
}
}

18
uitest/.editorconfig Normal file
View File

@@ -0,0 +1,18 @@
# https://editorconfig.org
root = true
[*]
indent_style = space
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{java,scala,groovy,kt,kts}]
indent_size = 4
[*.gradle]
indent_size = 2
[*.md]
trim_trailing_whitespace = false

2
uitest/.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
* text=auto eol=lf
*.bat text=auto eol=crlf

164
uitest/.gitignore vendored Normal file
View File

@@ -0,0 +1,164 @@
## Gradle:
.gradle/
gradle-app.setting
/build/
/android/build/
/core/build/
/lwjgl2/build/
/lwjgl3/build/
/html/build/
/teavm/build/
/ios/build/
/ios-moe/build/
/headless/build/
/server/build/
/shared/build/
## Java:
*.class
*.war
*.ear
hs_err_pid*
.attach_pid*
## Android:
/android/libs/armeabi-v7a/
/android/libs/arm64-v8a/
/android/libs/x86/
/android/libs/x86_64/
/android/gen/
/android/out/
local.properties
com_crashlytics_export_strings.xml
## Robovm:
/ios/robovm-build/
## iOS:
/ios/xcode/*.xcodeproj/*
!/ios/xcode/*.xcodeproj/xcshareddata
!/ios/xcode/*.xcodeproj/project.pbxproj
/ios/xcode/native/
/ios/IOSLauncher.app
/ios/IOSLauncher.app.dSYM
## GWT:
/html/war/
/html/gwt-unitCache/
.apt_generated/
/html/war/WEB-INF/deploy/
/html/war/WEB-INF/classes/
.gwt/
gwt-unitCache/
www-test/
.gwt-tmp/
## TeaVM:
# Not sure yet...
## IntelliJ, Android Studio:
.idea/
*.ipr
*.iws
*.iml
## Eclipse:
.classpath
.project
.metadata/
/android/bin/
/core/bin/
/lwjgl2/bin/
/lwjgl3/bin/
/html/bin/
/teavm/bin/
/ios/bin/
/ios-moe/bin/
/headless/bin/
/server/bin/
/shared/bin/
*.tmp
*.bak
*.swp
*~.nib
.settings/
.loadpath
.externalToolBuilders/
*.launch
## NetBeans:
/nbproject/private/
/android/nbproject/private/
/core/nbproject/private/
/lwjgl2/nbproject/private/
/lwjgl3/nbproject/private/
/html/nbproject/private/
/teavm/nbproject/private/
/ios/nbproject/private/
/ios-moe/nbproject/private/
/headless/nbproject/private/
/server/nbproject/private/
/shared/nbproject/private/
/nbbuild/
/android/nbbuild/
/core/nbbuild/
/lwjgl2/nbbuild/
/lwjgl3/nbbuild/
/html/nbbuild/
/teavm/nbbuild/
/ios/nbbuild/
/ios-moe/nbbuild/
/headless/nbbuild/
/server/nbbuild/
/shared/nbbuild/
/dist/
/android/dist/
/core/dist/
/lwjgl2/dist/
/lwjgl3/dist/
/html/dist/
/teavm/dist/
/ios/dist/
/ios-moe/dist/
/headless/dist/
/server/dist/
/shared/dist/
/nbdist/
/android/nbdist/
/core/nbdist/
/lwjgl2/nbdist/
/lwjgl3/nbdist/
/html/nbdist/
/teavm/nbdist/
/ios/nbdist/
/ios-moe/nbdist/
/headless/nbdist/
/server/nbdist/
/shared/nbdist/
nbactions.xml
nb-configuration.xml
## OS-Specific:
.DS_Store
Thumbs.db
## Miscellaneous:
*~
*.*#
*#*#
/.kotlin/
/assets/assets.txt
## Special cases:
## There is a resource-config.json file generated by nativeimage.gradle if you use Graal Native Image.
## Some usage may need extra resource configuration in a different file with the same name.
## You could also add that configuration to the text in nativeimage.gradle .
## You should delete or comment out the next line if you have configuration in a different resource-config.json .
**/resource-config.json

32
uitest/README.md Normal file
View File

@@ -0,0 +1,32 @@
# uitest
A [libGDX](https://libgdx.com/) project generated with [gdx-liftoff](https://github.com/libgdx/gdx-liftoff).
This project was generated with a Kotlin project template that includes Kotlin application launchers and [KTX](https://libktx.github.io/) utilities.
## Platforms
- `core`: Main module with the application logic shared by all platforms.
- `android`: Android mobile platform. Needs Android SDK.
## Gradle
This project uses [Gradle](https://gradle.org/) to manage dependencies.
The Gradle wrapper was included, so you can run Gradle tasks using `gradlew.bat` or `./gradlew` commands.
Useful Gradle tasks and flags:
- `--continue`: when using this flag, errors will not stop the tasks from running.
- `--daemon`: thanks to this flag, Gradle daemon will be used to run chosen tasks.
- `--offline`: when using this flag, cached dependency archives will be used.
- `--refresh-dependencies`: this flag forces validation of all dependencies. Useful for snapshot versions.
- `android:lint`: performs Android project validation.
- `build`: builds sources and archives of every project.
- `cleanEclipse`: removes Eclipse project data.
- `cleanIdea`: removes IntelliJ project data.
- `clean`: removes `build` folders, which store compiled classes and built archives.
- `eclipse`: generates Eclipse project data.
- `idea`: generates IntelliJ project data.
- `test`: runs unit tests (if any).
Note that most tasks that are not specific to a single project can be run with `name:` prefix, where the `name` should be replaced with the ID of a specific project.
For example, `core:clean` removes `build` folder only from the `core` project.

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<application
android:allowBackup="true"
android:fullBackupContent="true"
android:icon="@drawable/ic_launcher"
android:isGame="true"
android:appCategory="game"
android:label="@string/app_name"
tools:ignore="UnusedAttribute"
android:theme="@style/GdxTheme">
<activity
android:name="com.iofferyoutea.uitest.android.AndroidLauncher"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="keyboard|keyboardHidden|navigation|orientation|screenSize|screenLayout"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

136
uitest/android/build.gradle Normal file
View File

@@ -0,0 +1,136 @@
buildscript {
repositories {
mavenCentral()
google()
}
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
namespace = "com.iofferyoutea.uitest"
compileSdk = 35
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.setSrcDirs(['src/main/java', 'src/main/kotlin'])
aidl.setSrcDirs(['src/main/java', 'src/main/kotlin'])
renderscript.setSrcDirs(['src/main/java', 'src/main/kotlin'])
res.setSrcDirs(['res'])
assets.setSrcDirs(['../assets'])
jniLibs.setSrcDirs(['libs'])
}
}
packagingOptions {
resources {
excludes += ['META-INF/robovm/ios/robovm.xml', 'META-INF/DEPENDENCIES.txt', 'META-INF/DEPENDENCIES',
'META-INF/dependencies.txt', '**/*.gwt.xml']
pickFirsts += ['META-INF/LICENSE.txt', 'META-INF/LICENSE', 'META-INF/license.txt', 'META-INF/LGPL2.1',
'META-INF/NOTICE.txt', 'META-INF/NOTICE', 'META-INF/notice.txt']
}
}
defaultConfig {
applicationId 'com.iofferyoutea.uitest'
minSdkVersion 21
targetSdkVersion 35
versionCode 1
versionName "1.0"
}
compileOptions {
sourceCompatibility "8"
targetCompatibility "8"
coreLibraryDesugaringEnabled = true
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
kotlin.compilerOptions.jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8)
}
repositories {
// needed for AAPT2, may be needed for other tools
google()
}
configurations { natives }
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
implementation project(':core')
natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-arm64-v8a"
natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86_64"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
}
// Called every time gradle gets executed, takes the native dependencies of
// the natives configuration, and extracts them to the proper libs/ folders
// so they get packed with the APK.
tasks.register('copyAndroidNatives') {
doFirst {
file("libs/armeabi-v7a/").mkdirs()
file("libs/arm64-v8a/").mkdirs()
file("libs/x86_64/").mkdirs()
file("libs/x86/").mkdirs()
configurations.natives.copy().files.each { jar ->
def outputDir = null
if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
if(jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
if(outputDir != null) {
copy {
from zipTree(jar)
into outputDir
include "*.so"
}
}
}
}
}
tasks.matching { it.name.contains("merge") && it.name.contains("JniLibFolders") }.configureEach { packageTask ->
packageTask.dependsOn 'copyAndroidNatives'
}
tasks.register('run', Exec) {
def path
def localProperties = project.file("../local.properties")
if (localProperties.exists()) {
Properties properties = new Properties()
localProperties.withInputStream { instr ->
properties.load(instr)
}
def sdkDir = properties.getProperty('sdk.dir')
if (sdkDir) {
path = sdkDir
} else {
path = "$System.env.ANDROID_SDK_ROOT"
}
} else {
path = "$System.env.ANDROID_SDK_ROOT"
}
def adb = path + "/platform-tools/adb"
commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.iofferyoutea.uitest/com.iofferyoutea.uitest.android.AndroidLauncher'
}
eclipse.project.name = appName + "-android"

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

52
uitest/android/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,52 @@
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# https://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-verbose
-dontwarn android.support.**
-dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication
# Needed by the gdx-controllers official extension.
-keep class com.badlogic.gdx.controllers.android.AndroidControllers
# Needed by the Box2D official extension.
-keepclassmembers class com.badlogic.gdx.physics.box2d.World {
boolean contactFilter(long, long);
boolean getUseDefaultContactFilter();
void beginContact(long);
void endContact(long);
void preSolve(long, long);
void postSolve(long, long);
boolean reportFixture(long);
float reportRayFixture(long, float, float, float, float, float);
}
# You will need the next three lines if you use scene2d for UI or gameplay.
# If you don't use scene2d at all, you can remove or comment out the next line:
-keep public class com.badlogic.gdx.scenes.scene2d.** { *; }
# You will need the next two lines if you use BitmapFont or any scene2d.ui text:
-keep public class com.badlogic.gdx.graphics.g2d.BitmapFont { *; }
# You will probably need this line in most cases:
-keep public class com.badlogic.gdx.graphics.Color { *; }
# These two lines are used with mapping files; see https://developer.android.com/build/shrink-code#retracing
-keepattributes LineNumberTable,SourceFile
-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,14 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-rules.pro
# Project target.
target=android-21

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon
xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_background_color"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -0,0 +1,28 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="512dp"
android:height="512dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:pathData="M457.78,372.5l-201.78,116.5l-201.78,-116.5l0,-233l201.78,-116.5l201.78,116.5z"
android:strokeWidth="23"
android:fillColor="#4a4a4a"
android:strokeColor="#000000"/>
<group>
<clip-path
android:pathData="M449.71,363.84l-193.71,111.84l-193.71,-111.84l0,-223.68l193.71,-111.84l193.71,111.84z"/>
<path
android:pathData="M256,67.33c-0.36,0.13 -1.07,0.4 -2,0.99 -1.67,1.07 -3.94,2.89 -6.4,5.26 -4.93,4.75 -10.72,11.66 -16.1,19.34a142.77,142.77 0,0 0,-2.95 4.41c9.43,-1.86 18.44,-2.8 27.45,-2.8 9.01,0 18.03,0.94 27.45,2.8a142.77,142.77 135,0 0,-2.95 -4.41c-5.38,-7.68 -11.17,-14.6 -16.1,-19.34 -2.46,-2.37 -4.73,-4.2 -6.4,-5.26a9.93,9.93 135,0 0,-2 -0.99zM256,108.66c-11.75,0 -23.5,1.9 -36.98,5.69C214.74,123.36 212,131.66 212,136.8l0,127.71c4.08,-13.81 7.7,-30.59 11.2,-51.52L223.2,200.8c0,-8.8 3.65,-18.74 9.03,-27.7 2.69,-4.48 5.85,-8.63 9.66,-11.94C245.69,157.86 250.4,155.2 256,155.2s10.31,2.66 14.12,5.96c3.81,3.3 6.97,7.45 9.66,11.94C285.15,182.06 288.8,192 288.8,200.8l0,12.19c3.5,20.94 7.12,37.71 11.2,51.52L300,136.8c0,-5.14 -2.74,-13.44 -7.02,-22.45 -13.47,-3.79 -25.23,-5.69 -36.98,-5.69zM185.6,150.71c-5.21,9.21 -12,23.48 -12,37.29l0,31.2l24,0l0,-31.2c0,-13.81 -6.79,-28.08 -12,-37.29zM326.4,150.71c-5.21,9.21 -12,23.48 -12,37.29l0,31.2l24,0l0,-31.2c0,-13.81 -6.79,-28.08 -12,-37.29zM256,169.6c-0.8,0 -2.49,0.54 -4.68,2.44 -2.19,1.9 -4.63,4.95 -6.74,8.46C240.35,187.54 237.6,196.8 237.6,200.8l0,131.02l-2.16,2.12c-8.49,8.33 -10.26,28.91 -10.52,42.22 5.34,2.83 14.26,5.13 23.88,5.94L248.8,341.6l14.4,0l0,40.49c9.62,-0.8 18.54,-3.11 23.88,-5.94 -0.25,-13.27 -1.97,-33.66 -10.57,-42.26L274.4,331.78L274.4,200.8c0,-4 -2.75,-13.26 -6.97,-20.3 -2.11,-3.52 -4.55,-6.57 -6.74,-8.46C258.49,170.14 256.8,169.6 256,169.6zM243.2,193.6l25.6,0l0,14.4l-25.6,0l0,-14.4zM173.6,233.6l0,93.05c9.94,-8.52 17.6,-17.06 24,-27.75L197.6,233.6l-24,0zM314.4,233.6l0,65.3c6.4,10.69 14.06,19.24 24,27.75L338.4,233.6l-24,0zM223.2,276.78c-2.81,8.32 -5.87,15.8 -9.36,22.54 -7.44,14.41 -16.73,25.6 -28.37,36.03l30.94,1.55c1.73,-3.88 3.94,-7.57 6.78,-10.87l0,-49.24zM288.8,276.78l0,49.28c2.81,3.3 5,6.98 6.72,10.84l31,-1.55c-11.64,-10.42 -20.92,-21.62 -28.37,-36.03 -3.48,-6.74 -6.55,-14.22 -9.36,-22.54zM446.4,289.61c-10.84,4.52 -15.22,15.65 -21.56,33.46 0,0 -36.65,0.34 -42.7,14.05 -6.46,14.65 19.67,43.83 19.67,43.83s-21.71,-6.98 -30.34,-1.69c-9.59,5.88 -13.61,30.87 -13.61,30.87 -2.83,-0.68 -5.52,-1.24 -8.11,-1.71L341.33,383.2l8.53,0l-4.79,-8.77 -42.81,2.14 -0.65,1.2c-0,0.73 -0.01,1.56 -0.01,2.22l0,3.2l5.6,0l-8.53,25.6 17.07,-12.8 4,12.01c-11.83,2.51 -20.44,8.55 -28.72,16.43L281.6,405.6l12.8,0l-10.24,-12.49C275.61,395.79 265.83,396.8 256,396.8c-9.85,0 -19.66,-1.02 -28.22,-3.7L217.6,405.6l12.8,0l-10.31,20.62c-9.71,-4.02 -20.02,-8.02 -30.08,-11.44L196.27,396l17.07,12.8L204.8,383.2l5.6,0l0,-3.2c0,-0.65 -0.01,-1.47 -0.01,-2.18l-0.68,-1.24 -42.82,-2.14 -4.76,8.77l8.53,0l-7.96,23.89c-3.19,-0.65 -6.24,-1.16 -9.1,-1.49 -25.25,-2.9 -31.78,3.71 -46.35,9.93 0,0 13.33,-77.26 -13.35,-94.7 -3.3,-2.16 -7.43,-3.03 -11.99,-2.98 -5.06,0.04 -10.67,1.22 -16.31,2.99L65.6,442.4l189.6,0l0.8,1.6 12.8,-25.6 18.79,9.4c-4.45,4.5 -8.93,9.46 -13.88,14.6L446.4,442.4L446.4,289.61zM168.82,348.93c-4.32,3.9 -5.52,7.7 -5.45,9.24 0.04,0.88 0.19,1 0.41,1.19 0.22,0.19 0.81,0.63 2.63,0.63l0.18,0l44.16,2.21c0.25,-3.58 0.68,-7.33 1.39,-11.11l-43.31,-2.17zM343.18,348.93l-43.35,2.17c0.72,3.78 1.15,7.53 1.41,11.11l44.18,-2.21L345.6,360c1.82,0 2.42,-0.44 2.63,-0.63 0.22,-0.19 0.37,-0.32 0.41,-1.19 0.06,-1.54 -1.14,-5.34 -5.45,-9.24zM179.2,396l5.7,17.09c-7.29,-2.35 -14.35,-4.32 -20.86,-5.72L179.2,396zM332.8,396l16.44,12.33c-7.58,-1.34 -14.17,-1.78 -20.05,-1.5L332.8,396zM243.2,418.4l11.64,23.27c-7.9,-3.74 -18.63,-8.66 -30.68,-13.75L243.2,418.4z"
android:fillColor="#ffda54"/>
</group>
<path
android:pathData="M135.76,190.05L112.46,190.05v-15.61q0,-6.81 -0.77,-8.47 -0.72,-1.72 -3.26,-1.72 -2.88,0 -3.65,2.05 -0.77,2.05 -0.77,8.85v41.61q0,6.53 0.77,8.52 0.77,1.99 3.49,1.99 2.6,0 3.38,-1.99 0.83,-1.99 0.83,-9.35v-11.23h23.3v3.49q0,13.89 -1.99,19.7 -1.94,5.81 -8.69,10.18 -6.7,4.37 -16.55,4.37 -10.24,0 -16.88,-3.71 -6.64,-3.71 -8.8,-10.24 -2.16,-6.59 -2.16,-19.76L80.7,182.58q0,-9.68 0.66,-14.5 0.66,-4.87 3.93,-9.35 3.32,-4.48 9.13,-7.03 5.87,-2.6 13.45,-2.6 10.29,0 16.99,3.98 6.7,3.98 8.8,9.96 2.1,5.92 2.1,18.48zM197.68,150.98v89.59h-23.3v-37.63h-6.97v37.63h-23.3v-89.59h23.3v32.04h6.97v-32.04zM247.27,150.98 L260.6,240.57L236.75,240.57l-1.16,-16.1h-8.36l-1.38,16.1h-24.13l11.84,-89.59zM234.93,208.59q-1.77,-15.22 -3.54,-37.57 -3.54,25.68 -4.43,37.57zM316.6,150.98v89.59h-20.42l-12.12,-40.73v40.73h-19.48v-89.59h19.48l13.06,40.34v-40.34zM379.41,183.96h-23.3v-8.13q0,-7.69 -0.66,-9.63 -0.66,-1.94 -3.15,-1.94 -2.16,0 -2.93,1.66 -0.77,1.66 -0.77,8.52v43q0,6.03 0.77,7.97 0.77,1.88 3.1,1.88 2.55,0 3.43,-2.16 0.94,-2.16 0.94,-8.41v-10.62h-4.7v-13.61h27.28v48.09h-14.66l-2.16,-6.42q-2.38,4.15 -6.03,6.25 -3.6,2.05 -8.52,2.05 -5.87,0 -11.01,-2.82 -5.09,-2.88 -7.75,-7.08 -2.66,-4.21 -3.32,-8.8 -0.66,-4.65 -0.66,-13.89v-26.62q0,-12.84 1.38,-18.65 1.38,-5.81 7.91,-10.62 6.59,-4.87 16.99,-4.87 10.24,0 16.99,4.21 6.75,4.21 8.8,10.02 2.05,5.76 2.05,16.77zM388.43,150.98h38.85v17.93h-15.55v16.99h14.55v17.04h-14.55v19.7h17.1v17.93L388.43,240.57Z"
android:strokeWidth="6.1"
android:fillColor="#f30d0d"
android:strokeColor="#000000"/>
<path
android:pathData="m202.17,286.98v17.93h-13.83v71.66h-23.3v-71.66h-13.78v-17.93zM261.05,286.98v89.59h-23.3v-37.63h-6.97v37.63L207.48,376.57v-89.59h23.3v32.04h6.97v-32.04zM293.69,286.98v89.59h-23.3v-89.59zM352.41,314.09L330.77,314.09v-6.64q0,-4.65 -0.83,-5.92 -0.83,-1.27 -2.77,-1.27 -2.1,0 -3.21,1.72 -1.05,1.72 -1.05,5.2 0,4.48 1.22,6.75 1.16,2.27 6.59,5.48 15.55,9.24 19.59,15.16 4.04,5.92 4.04,19.09 0,9.57 -2.27,14.11 -2.21,4.54 -8.63,7.64 -6.42,3.04 -14.94,3.04 -9.35,0 -15.99,-3.54 -6.59,-3.54 -8.63,-9.02 -2.05,-5.48 -2.05,-15.55v-5.87h21.64v10.9q0,5.04 0.89,6.47 0.94,1.44 3.26,1.44 2.32,0 3.43,-1.83 1.16,-1.83 1.16,-5.42 0,-7.91 -2.16,-10.35 -2.21,-2.43 -10.9,-8.13 -8.69,-5.76 -11.51,-8.36 -2.82,-2.6 -4.7,-7.19 -1.83,-4.59 -1.83,-11.73 0,-10.29 2.6,-15.05 2.66,-4.76 8.52,-7.42 5.87,-2.71 14.17,-2.71 9.08,0 15.44,2.93 6.42,2.93 8.47,7.42 2.1,4.43 2.1,15.11z"
android:strokeWidth="6.1"
android:fillColor="#f30d0d"
android:strokeColor="#000000"/>
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_background_color">#F5A623FF</color>
<color name="background">#FFFFFFFF</color>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">uitest</string>
</resources>

View File

@@ -0,0 +1,5 @@
<resources>
<style name="GdxTheme" parent="android:Theme.Material.Light.NoActionBar.Fullscreen">
<item name="android:colorBackground">@color/background</item>
</style>
</resources>

View File

@@ -0,0 +1,18 @@
package com.iofferyoutea.uitest.android
import android.os.Bundle
import com.badlogic.gdx.backends.android.AndroidApplication
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration
import com.iofferyoutea.uitest.Main
/** Launches the Android application. */
class AndroidLauncher : AndroidApplication() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initialize(Main(), AndroidApplicationConfiguration().apply {
// Configure your application here.
useImmersiveMode = true // Recommended, but not required.
})
}
}

BIN
uitest/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

74
uitest/build.gradle Normal file
View File

@@ -0,0 +1,74 @@
buildscript {
repositories {
mavenCentral()
gradlePluginPortal()
mavenLocal()
google()
maven { url = 'https://central.sonatype.com/repository/maven-snapshots/' }
}
dependencies {
classpath "com.android.tools.build:gradle:8.9.3"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
}
}
allprojects {
apply plugin: 'eclipse'
apply plugin: 'idea'
// This allows you to "Build and run using IntelliJ IDEA", an option in IDEA's Settings.
idea {
module {
outputDir = file('build/classes/java/main')
testOutputDir = file('build/classes/java/test')
}
}
}
configure(subprojects - project(':android')) {
apply plugin: 'java-library'
apply plugin: 'kotlin'
java.sourceCompatibility = 8
// From https://lyze.dev/2021/04/29/libGDX-Internal-Assets-List/
// The article can be helpful when using assets.txt in your project.
tasks.register('generateAssetList') {
inputs.dir("${project.rootDir}/assets/")
// projectFolder/assets
File assetsFolder = new File("${project.rootDir}/assets/")
// projectFolder/assets/assets.txt
File assetsFile = new File(assetsFolder, "assets.txt")
// delete that file in case we've already created it
assetsFile.delete()
// iterate through all files inside that folder
// convert it to a relative path
// and append it to the file assets.txt
fileTree(assetsFolder).collect { assetsFolder.relativePath(it) }.sort().each {
assetsFile.append(it + "\n")
}
}
processResources.dependsOn 'generateAssetList'
compileJava {
options.incremental = true
}
compileKotlin.compilerOptions.jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8)
compileTestKotlin.compilerOptions.jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8)
}
subprojects {
version = "$projectVersion"
ext.appName = 'uitest'
repositories {
mavenCentral()
// You may want to remove the following line if you have errors downloading dependencies.
mavenLocal()
maven { url = 'https://central.sonatype.com/repository/maven-snapshots/' }
maven { url = 'https://jitpack.io' }
}
}
eclipse.project.name = 'uitest' + '-parent'

46
uitest/core/build.gradle Normal file
View File

@@ -0,0 +1,46 @@
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
eclipse.project.name = appName + '-core'
dependencies {
api "com.badlogicgames.ashley:ashley:$ashleyVersion"
api "com.badlogicgames.gdx:gdx-ai:$aiVersion"
api "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
api "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
api "com.badlogicgames.gdx:gdx:$gdxVersion"
api "io.github.libktx:ktx-actors:$ktxVersion"
api "io.github.libktx:ktx-ai:$ktxVersion"
api "io.github.libktx:ktx-app:$ktxVersion"
api "io.github.libktx:ktx-artemis:$ktxVersion"
api "io.github.libktx:ktx-ashley:$ktxVersion"
api "io.github.libktx:ktx-assets-async:$ktxVersion"
api "io.github.libktx:ktx-assets:$ktxVersion"
api "io.github.libktx:ktx-async:$ktxVersion"
api "io.github.libktx:ktx-box2d:$ktxVersion"
api "io.github.libktx:ktx-collections:$ktxVersion"
api "io.github.libktx:ktx-freetype-async:$ktxVersion"
api "io.github.libktx:ktx-freetype:$ktxVersion"
api "io.github.libktx:ktx-graphics:$ktxVersion"
api "io.github.libktx:ktx-i18n:$ktxVersion"
api "io.github.libktx:ktx-inject:$ktxVersion"
api "io.github.libktx:ktx-json:$ktxVersion"
api "io.github.libktx:ktx-log:$ktxVersion"
api "io.github.libktx:ktx-math:$ktxVersion"
api "io.github.libktx:ktx-preferences:$ktxVersion"
api "io.github.libktx:ktx-reflect:$ktxVersion"
api "io.github.libktx:ktx-scene2d:$ktxVersion"
api "io.github.libktx:ktx-style:$ktxVersion"
api "io.github.libktx:ktx-tiled:$ktxVersion"
api "io.github.libktx:ktx-vis-style:$ktxVersion"
api "io.github.libktx:ktx-vis:$ktxVersion"
api "net.onedaybeard.artemis:artemis-odb:$artemisOdbVersion"
api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinxCoroutinesVersion"
if(enableGraalNative == 'true') {
implementation "io.github.berstanio:gdx-svmhelper-annotations:$graalHelperVersion"
}
}
jar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

View File

@@ -0,0 +1,75 @@
package com.iofferyoutea.uitest
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.BitmapFont
import com.badlogic.gdx.scenes.scene2d.Stage
import com.badlogic.gdx.scenes.scene2d.ui.Container
import com.badlogic.gdx.scenes.scene2d.ui.Label
import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable
import ktx.app.KtxGame
import ktx.app.KtxScreen
import ktx.app.clearScreen
import ktx.async.KtxAsync
import org.w3c.dom.Text
class Main : KtxGame<KtxScreen>() {
override fun create() {
KtxAsync.initiate()
addScreen(FirstScreen())
setScreen<FirstScreen>()
}
}
class FirstScreen : KtxScreen {
val stage = Stage()
val table = Table()
//region Label
val labelStyle = Label.LabelStyle(
BitmapFont(),
Color.BLACK
)
val label = Label("My Label", labelStyle)
//endregion
//region TextButton
val textButtonStyle = TextButton.TextButtonStyle(
TextureRegionDrawable(Texture("logo.png")),
TextureRegionDrawable(Texture("logo.png")),
TextureRegionDrawable(Texture("logo.png")),
BitmapFont()
)
val textButton = TextButton("My Text Button", textButtonStyle)
//endregion
override fun show() {
stage.addActor(table)
table.setFillParent(true)
table.debug = true
label.wrap = false
label.setFontScale(5f) // Label text size must be done through setFontScale(f). Maybe we can do like this cell's width / 1080->? Or whatever would equal 1 on the dev machine
table.add(label)
table.getCell<Label>(label).width(1200f).height(400f) // Widget sizes are meant to be controlled through their parent like we do here
table.row()
table.add(textButton)
table.getCell<TextButton>(textButton).width(100f).height(600f)
}
override fun render(delta: Float) {
clearScreen(red = 0.7f, green = 0.7f, blue = 0.7f)
stage.act()
stage.draw()
}
override fun dispose() {
stage.dispose()
}
}

27
uitest/gradle.properties Normal file
View File

@@ -0,0 +1,27 @@
# This doesn't need to be false, and some projects may be able to take advantage of setting daemon to true.
# We set it to false by default in order to avoid too many daemons from being created and persisting; each needs RAM.
org.gradle.daemon=false
# Sets starting memory usage to 512MB, maximum memory usage to 1GB, and tries to set as much to use Unicode as we can.
org.gradle.jvmargs=-Xms512M -Xmx1G -Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8
# "Configure on-demand" must be false because it breaks projects that have Android modules. The default is also false.
org.gradle.configureondemand=false
# The logging level determines which messages get shown about how Gradle itself is working, such as if build.gradle
# files are fully future-proof (which they never are, because Gradle constantly deprecates working APIs).
# You can change 'quiet' below to 'lifecycle' to use Gradle's default behavior, which shows some confusing messages.
# You could instead change 'quiet' below to 'info' to see info that's important mainly while debugging build files.
# Note that if you want to use Gradle Build Scans, you should set the below logging level to 'lifecycle', otherwise
# the link to the scan won't get shown at all.
# Documented at: https://docs.gradle.org/current/userguide/command_line_interface.html#sec:command_line_logging
org.gradle.logging.level=quiet
ktxVersion=1.13.1-rc1
kotlinVersion=2.3.0
artemisOdbVersion=2.3.0
aiVersion=1.8.2
ashleyVersion=1.7.4
kotlinxCoroutinesVersion=1.10.2
visUiVersion=1f8b37a24b
android.useAndroidX=true
android.enableR8.fullMode=false
enableGraalNative=false
gdxVersion=1.14.0
projectVersion=1.0.0

View File

@@ -0,0 +1,12 @@
#This file is generated by updateDaemonJvm
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/93aeea858331bd6bb00ba94759830234/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/3426ffcaa54c3f62406beb1f1ab8b179/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/d6690dfd71c4c91e08577437b5b2beb0/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/1e91f45234d88a64dafb961c93ddc75a/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/552c7bffe0370c66410a51c55985b511/redirect
toolchainVersion=21

BIN
uitest/gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

248
uitest/gradlew vendored Normal file
View File

@@ -0,0 +1,248 @@
#!/bin/sh
#
# Copyright © 2015 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/b631911858264c0b6e4d6603d677ff5218766cee/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

93
uitest/gradlew.bat vendored Normal file
View File

@@ -0,0 +1,93 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

8
uitest/settings.gradle Normal file
View File

@@ -0,0 +1,8 @@
plugins {
// Applies the foojay-resolver plugin to allow automatic download of JDKs.
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}
// A list of which subprojects to load as part of the same larger project.
// You can remove Strings from the list and reload the Gradle project
// if you want to temporarily disable a subproject.
include 'android', 'core'