From 9abd235ed2b9a5c80d5e63d6187d69e9317c2f0d Mon Sep 17 00:00:00 2001
From: Indrajith K L
Date: Wed, 22 Sep 2021 10:10:50 +0530
Subject: * Initial Commit * Leaderboard Implementation for dreamlo * FlxSave
for Player Data * GUID Generation for Unique User
---
.gitignore | 46 +++++++++++++++++++
.vscode/extensions.json | 6 +++
.vscode/launch.json | 21 +++++++++
.vscode/settings.json | 13 ++++++
.vscode/tasks.json | 13 ++++++
Project.xml | 84 ++++++++++++++++++++++++++++++++++
assets/data/data-goes-here.txt | 0
assets/images/images-go-here.txt | 0
assets/images/space_bg.png | Bin 0 -> 10980 bytes
assets/music/music-goes-here.txt | 0
assets/sounds/sounds-go-here.txt | 0
hxformat.json | 15 ++++++
source/AssetPaths.hx | 4 ++
source/Main.hx | 13 ++++++
source/PlayState.hx | 33 +++++++++++++
source/screens/LeaderBoardState.hx | 74 ++++++++++++++++++++++++++++++
source/screens/MenuState.hx | 31 +++++++++++++
source/screens/RegisterPlayerState.hx | 27 +++++++++++
source/shared/PlayerSave.hx | 37 +++++++++++++++
source/shared/ScoreBoard.hx | 54 ++++++++++++++++++++++
source/shared/Types.hx | 25 ++++++++++
source/shared/UIBackground.hx | 14 ++++++
source/shared/UserNamePopup.hx | 57 +++++++++++++++++++++++
source/shared/Utils.hx | 13 ++++++
24 files changed, 580 insertions(+)
create mode 100644 .gitignore
create mode 100644 .vscode/extensions.json
create mode 100644 .vscode/launch.json
create mode 100644 .vscode/settings.json
create mode 100644 .vscode/tasks.json
create mode 100644 Project.xml
create mode 100644 assets/data/data-goes-here.txt
create mode 100644 assets/images/images-go-here.txt
create mode 100644 assets/images/space_bg.png
create mode 100644 assets/music/music-goes-here.txt
create mode 100644 assets/sounds/sounds-go-here.txt
create mode 100644 hxformat.json
create mode 100644 source/AssetPaths.hx
create mode 100644 source/Main.hx
create mode 100644 source/PlayState.hx
create mode 100644 source/screens/LeaderBoardState.hx
create mode 100644 source/screens/MenuState.hx
create mode 100644 source/screens/RegisterPlayerState.hx
create mode 100644 source/shared/PlayerSave.hx
create mode 100644 source/shared/ScoreBoard.hx
create mode 100644 source/shared/Types.hx
create mode 100644 source/shared/UIBackground.hx
create mode 100644 source/shared/UserNamePopup.hx
create mode 100644 source/shared/Utils.hx
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f3c021a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,46 @@
+# Prerequisites
+*.d
+
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Linker output
+*.ilk
+*.map
+*.exp
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
+# Debug files
+*.dSYM/
+*.su
+*.idb
+*.pdb
+
+# Build Folders
+export/
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..89e20ed
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,6 @@
+{
+ "recommendations": [
+ "openfl.lime-vscode-extension",
+ "redhat.vscode-xml"
+ ]
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..5e9a7a1
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,21 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Build + Debug",
+ "type": "lime",
+ "request": "launch"
+ },
+ {
+ "name": "Debug",
+ "type": "lime",
+ "request": "launch",
+ "preLaunchTask": null
+ },
+ {
+ "name": "Macro",
+ "type": "haxe-eval",
+ "request": "launch"
+ }
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..4c1a0e9
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,13 @@
+{
+ "search.exclude": {
+ "export/**/*.hx": true
+ },
+ "[haxe]": {
+ "editor.formatOnSave": true,
+ "editor.formatOnPaste": true,
+ "editor.codeActionsOnSave": {
+ "source.sortImports": true
+ }
+ },
+ "haxe.enableExtendedIndentation": true
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..16a7764
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,13 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "lime",
+ "command": "test",
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
diff --git a/Project.xml b/Project.xml
new file mode 100644
index 0000000..fd79d2e
--- /dev/null
+++ b/Project.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/data/data-goes-here.txt b/assets/data/data-goes-here.txt
new file mode 100644
index 0000000..e69de29
diff --git a/assets/images/images-go-here.txt b/assets/images/images-go-here.txt
new file mode 100644
index 0000000..e69de29
diff --git a/assets/images/space_bg.png b/assets/images/space_bg.png
new file mode 100644
index 0000000..4032c6f
Binary files /dev/null and b/assets/images/space_bg.png differ
diff --git a/assets/music/music-goes-here.txt b/assets/music/music-goes-here.txt
new file mode 100644
index 0000000..e69de29
diff --git a/assets/sounds/sounds-go-here.txt b/assets/sounds/sounds-go-here.txt
new file mode 100644
index 0000000..e69de29
diff --git a/hxformat.json b/hxformat.json
new file mode 100644
index 0000000..66cb386
--- /dev/null
+++ b/hxformat.json
@@ -0,0 +1,15 @@
+{
+ "lineEnds": {
+ "leftCurly": "both",
+ "rightCurly": "both",
+ "objectLiteralCurly": {
+ "leftCurly": "after"
+ }
+ },
+ "sameLine": {
+ "ifElse": "next",
+ "doWhile": "next",
+ "tryBody": "next",
+ "tryCatch": "next"
+ }
+}
diff --git a/source/AssetPaths.hx b/source/AssetPaths.hx
new file mode 100644
index 0000000..db7ef44
--- /dev/null
+++ b/source/AssetPaths.hx
@@ -0,0 +1,4 @@
+package;
+
+@:build(flixel.system.FlxAssets.buildFileReferences("assets", true))
+class AssetPaths {}
diff --git a/source/Main.hx b/source/Main.hx
new file mode 100644
index 0000000..efa0e2d
--- /dev/null
+++ b/source/Main.hx
@@ -0,0 +1,13 @@
+package;
+
+import flixel.FlxGame;
+import openfl.display.Sprite;
+
+class Main extends Sprite
+{
+ public function new()
+ {
+ super();
+ addChild(new FlxGame(0, 0, PlayState));
+ }
+}
diff --git a/source/PlayState.hx b/source/PlayState.hx
new file mode 100644
index 0000000..593c32f
--- /dev/null
+++ b/source/PlayState.hx
@@ -0,0 +1,33 @@
+package;
+
+import flixel.FlxG;
+import flixel.FlxState;
+import flixel.util.FlxSave;
+import screens.MenuState;
+import screens.RegisterPlayerState;
+import shared.PlayerSave;
+
+class PlayState extends FlxState
+{
+ var saveData:FlxSave = new FlxSave();
+
+ override public function create()
+ {
+ super.create();
+ saveData.bind("PlayerSaveObj");
+ if (saveData.data.playerSaveObj == null)
+ {
+ FlxG.switchState(new RegisterPlayerState());
+ }
+ else
+ {
+ PlayerSave.instance.setPlayerData(saveData.data.playerSaveObj.name, saveData.data.playerSaveObj.guid);
+ FlxG.switchState(new MenuState());
+ }
+ }
+
+ override public function update(elapsed:Float)
+ {
+ super.update(elapsed);
+ }
+}
diff --git a/source/screens/LeaderBoardState.hx b/source/screens/LeaderBoardState.hx
new file mode 100644
index 0000000..67f726e
--- /dev/null
+++ b/source/screens/LeaderBoardState.hx
@@ -0,0 +1,74 @@
+package screens;
+
+import flixel.FlxG;
+import flixel.FlxState;
+import flixel.addons.ui.FlxUIGroup;
+import flixel.addons.ui.FlxUIList;
+import flixel.addons.ui.FlxUIRegion;
+import flixel.addons.ui.FlxUIText;
+import flixel.text.FlxText;
+import flixel.ui.FlxButton;
+import flixel.util.FlxColor;
+import shared.PlayerSave;
+import shared.ScoreBoard;
+import shared.Types.Entry;
+import shared.Types.ScoreBoardData;
+
+class LeaderBoardState extends FlxState
+{
+ var scoreBoardList:FlxUIList;
+ var previousState:FlxState;
+
+ public function new()
+ {
+ super();
+ var scoreLabel:FlxText = new FlxText(FlxG.width / 2 - 50, 10, "Leaderboard", 13);
+ scoreLabel.borderSize = 1;
+ scoreLabel.borderColor = FlxColor.PURPLE;
+ scoreLabel.borderQuality = 1;
+ scoreLabel.borderStyle = FlxTextBorderStyle.OUTLINE;
+ scoreBoardList = new FlxUIList(FlxG.width / 2 - 100, 70, [], 300, 300, "More");
+ scoreBoardList.loadGraphic(AssetPaths.space_bg__png);
+ var backButton:FlxButton = new FlxButton(FlxG.width / 2 - 40, 410, "Back", onBackButtonClick);
+ add(scoreLabel);
+ add(scoreBoardList);
+ add(backButton);
+ getScores();
+ }
+
+ override public function create()
+ {
+ super.create();
+ }
+
+ private function getScores()
+ {
+ var scoreboard:ScoreBoard = new ScoreBoard();
+ var scoresData:ScoreBoardData = scoreboard.getScores();
+ trace(scoresData.dreamlo.leaderboard);
+ if (scoresData.dreamlo.leaderboard != null)
+ {
+ var scores:Array = scoresData.dreamlo.leaderboard.entry;
+ for (i in 0...400)
+ {
+ scores.push(scores[0]);
+ }
+ for (score in scores)
+ {
+ var widgetGroup:FlxUIGroup = new FlxUIGroup(0, 0);
+ var nameTxt:FlxUIText = new FlxUIText(0, 0, 100, '${score.text}', 11);
+ var scoreTxt:FlxUIText = new FlxUIText(100, 0, 100, '${score.score}', 11);
+ nameTxt.alignment = FlxTextAlign.LEFT;
+ scoreTxt.alignment = FlxTextAlign.RIGHT;
+ widgetGroup.add(nameTxt);
+ widgetGroup.add(scoreTxt);
+ scoreBoardList.add(widgetGroup);
+ }
+ }
+ }
+
+ private function onBackButtonClick()
+ {
+ FlxG.switchState(new MenuState());
+ }
+}
diff --git a/source/screens/MenuState.hx b/source/screens/MenuState.hx
new file mode 100644
index 0000000..9f4deda
--- /dev/null
+++ b/source/screens/MenuState.hx
@@ -0,0 +1,31 @@
+package screens;
+
+import flixel.FlxG;
+import flixel.FlxState;
+import flixel.ui.FlxButton;
+import shared.PlayerSave;
+
+class MenuState extends FlxState
+{
+ public function new()
+ {
+ super();
+ var playButton = new FlxButton(FlxG.width / 2 - 40, FlxG.height / 2, "Play", onPlayButtonPressed);
+ var leaderBoardButton = new FlxButton(FlxG.width / 2 - 40, FlxG.width / 2 + 30, "Leaderboard", onLeaderBoardButtonPressed);
+ add(playButton);
+ add(leaderBoardButton);
+ trace(PlayerSave.instance.guid);
+ }
+
+ override public function create()
+ {
+ super.create();
+ }
+
+ function onPlayButtonPressed() {}
+
+ function onLeaderBoardButtonPressed()
+ {
+ FlxG.switchState(new LeaderBoardState());
+ }
+}
diff --git a/source/screens/RegisterPlayerState.hx b/source/screens/RegisterPlayerState.hx
new file mode 100644
index 0000000..e50d3d1
--- /dev/null
+++ b/source/screens/RegisterPlayerState.hx
@@ -0,0 +1,27 @@
+package screens;
+
+import flixel.FlxG;
+import flixel.FlxSprite;
+import flixel.FlxState;
+import shared.PlayerSave;
+import shared.UserNamePopup;
+
+class RegisterPlayerState extends FlxState
+{
+ override public function create()
+ {
+ super.create();
+ var bg = new FlxSprite(0, 0, AssetPaths.space_bg__png);
+ var popup = new UserNamePopup(OnSave);
+ add(bg);
+ add(popup);
+ }
+
+ function OnSave(data:PlayerSave)
+ {
+ if (data != null)
+ {
+ FlxG.switchState(new MenuState());
+ }
+ }
+}
diff --git a/source/shared/PlayerSave.hx b/source/shared/PlayerSave.hx
new file mode 100644
index 0000000..298eca6
--- /dev/null
+++ b/source/shared/PlayerSave.hx
@@ -0,0 +1,37 @@
+package shared;
+
+class PlayerSave
+{
+ public static final instance:PlayerSave = new PlayerSave();
+
+ @:isVar public var name(get, set):String;
+ @:isVar public var guid(get, set):String;
+
+ private function new() {}
+
+ public function setPlayerData(_name:String, _name:String)
+ {
+ this.name = _name;
+ this.guid = _name;
+ }
+
+ function set_name(name:String):String
+ {
+ return this.name = name;
+ }
+
+ public function get_name()
+ {
+ return name;
+ }
+
+ function set_guid(guid:String):String
+ {
+ return this.guid = guid;
+ }
+
+ public function get_guid()
+ {
+ return guid;
+ }
+}
diff --git a/source/shared/ScoreBoard.hx b/source/shared/ScoreBoard.hx
new file mode 100644
index 0000000..f91ae34
--- /dev/null
+++ b/source/shared/ScoreBoard.hx
@@ -0,0 +1,54 @@
+package shared;
+
+import haxe.Http;
+import haxe.Json;
+import shared.Types.ScoreBoardData;
+
+class ScoreBoard
+{
+ var scoreBoardSecret:String = '8lykk7evgka9JqFzCs_C-QSBPeydJIUEa_vSuoSRJYJQ';
+ var scoreBoardPublicId:String = '6144ce1e8f40bb0e285c6d95';
+ var scoreBoardSetUrl:String;
+ var baseUrl:String = 'http://dreamlo.com';
+
+ public function new()
+ {
+ this.scoreBoardSetUrl = '$baseUrl/lb/$scoreBoardSecret/add';
+ }
+
+ public function setScore(name:String, guid:String, score:Int)
+ {
+ var scoreUrl:String = '$scoreBoardSetUrl/$guid/$score/0/$name';
+ var request:Http = new Http(scoreUrl);
+ trace(scoreUrl);
+ // request.onData = function(data)
+ // {
+ // trace(data);
+ // }
+
+ request.onError = function(error)
+ {
+ trace(error);
+ }
+ request.request(false);
+ }
+
+ public function getScores():ScoreBoardData
+ {
+ var scoresUrl:String = '$baseUrl/lb/$scoreBoardPublicId/json';
+ var request:Http = new Http(scoresUrl);
+ request.onData = function(data)
+ {
+ // trace(data);
+ }
+
+ request.onError = function(error)
+ {
+ trace(error);
+ }
+ request.request(false);
+
+ var response = request.responseBytes;
+ return Json.parse(response.toString());
+ }
+}
diff --git a/source/shared/Types.hx b/source/shared/Types.hx
new file mode 100644
index 0000000..3faad76
--- /dev/null
+++ b/source/shared/Types.hx
@@ -0,0 +1,25 @@
+package shared;
+
+typedef Entry =
+{
+ var date:String;
+ var name:String;
+ var score:String;
+ var seconds:String;
+ var text:String;
+}
+
+typedef LeaderBoard =
+{
+ var entry:Array;
+}
+
+typedef DreamLo =
+{
+ var leaderboard:LeaderBoard;
+}
+
+typedef ScoreBoardData =
+{
+ var dreamlo:DreamLo;
+}
diff --git a/source/shared/UIBackground.hx b/source/shared/UIBackground.hx
new file mode 100644
index 0000000..de3b4c9
--- /dev/null
+++ b/source/shared/UIBackground.hx
@@ -0,0 +1,14 @@
+package shared;
+
+import flixel.FlxSprite;
+import flixel.util.FlxColor;
+
+class UIBackground extends FlxSprite
+{
+ public function new(x:Float = 0, y:Float = 0, width:Int, height:Int, color:FlxColor)
+ {
+ super(x, y);
+ makeGraphic(width, height, color);
+ alpha = 0.5;
+ }
+}
diff --git a/source/shared/UserNamePopup.hx b/source/shared/UserNamePopup.hx
new file mode 100644
index 0000000..81e7129
--- /dev/null
+++ b/source/shared/UserNamePopup.hx
@@ -0,0 +1,57 @@
+package shared;
+
+import flixel.FlxG;
+import flixel.FlxObject;
+import flixel.FlxSprite;
+import flixel.addons.ui.FlxInputText;
+import flixel.addons.ui.FlxUIGroup;
+import flixel.graphics.FlxGraphic;
+import flixel.group.FlxGroup.FlxTypedGroup;
+import flixel.text.FlxText;
+import flixel.ui.FlxButton;
+import flixel.util.FlxColor;
+import flixel.util.FlxSave;
+
+class UserNamePopup extends FlxTypedGroup
+{
+ var popupWidth:Int = 200;
+ var popupHeight:Int = 100;
+ var pX:Float = 0;
+ var pY:Float = 0;
+ var textFieldWidth = 150;
+ var textFieldHeight = 8;
+ var txtInput:FlxInputText;
+ var playerSave:FlxSave;
+
+ public function new(OnClick:PlayerSave->Void)
+ {
+ super();
+ this.playerSave = new FlxSave();
+ this.playerSave.bind("PlayerSaveObj");
+ this.pX = (FlxG.width / 2) - (this.popupWidth / 2);
+ this.pY = (FlxG.height / 2) - (popupHeight / 2);
+ var inputTextX = this.pX + (this.popupWidth / 2) - (this.textFieldWidth / 2);
+ var inputTextY = this.pY + (this.popupHeight / 2) - this.textFieldHeight;
+ var uiBackground:UIBackground = new UIBackground(this.pX, this.pY, this.popupWidth, this.popupHeight, FlxColor.PURPLE);
+ var label:FlxText = new FlxText(inputTextX, inputTextY - 20, 100, "Enter Your Name");
+ var enterGameBut = new FlxButton(inputTextX + textFieldWidth / 2 - 4, inputTextY + 20, "Enter Game", onEnterGame.bind(this, OnClick));
+ this.txtInput = new FlxInputText(inputTextX, inputTextY, this.textFieldWidth, "", this.textFieldHeight);
+ txtInput.backgroundColor = FlxColor.PURPLE;
+ txtInput.color = FlxColor.WHITE;
+ add(uiBackground);
+ add(label);
+ add(txtInput);
+ add(enterGameBut);
+ }
+
+ function onEnterGame(event, OnClick)
+ {
+ FlxG.camera.shake(0.05);
+ var guid = Utils.Guid();
+ PlayerSave.instance.setPlayerData(this.txtInput.text, guid);
+ this.playerSave.data.playerSaveObj = PlayerSave.instance;
+ this.playerSave.flush();
+ OnClick(PlayerSave.instance);
+ trace(OnClick);
+ }
+}
diff --git a/source/shared/Utils.hx b/source/shared/Utils.hx
new file mode 100644
index 0000000..3f924ed
--- /dev/null
+++ b/source/shared/Utils.hx
@@ -0,0 +1,13 @@
+package shared;
+
+import haxe.Timer;
+import lime.tools.GUID;
+
+class Utils
+{
+ public static function Guid()
+ {
+ var guid = GUID.seededUuid(Date.now().toString());
+ return guid.split("{").join("").split("}").join("");
+ }
+}
--
cgit v1.2.3