Jump to content

Crest

Contributors
  • Content count

    365
  • Donations

    $120.00 
  • Joined

  • Last visited

  • Days Won

    17

Crest last won the day on May 1

Crest had the most liked content!

About Crest

  • Birthday 01/02/1995

Profile Information

  • Gender
    Male
  • Location
    Orange Park, Florida

Profile Fields

  • My Project
    Stuffing Kittens in a blender
  • Twitch.tv
    JimmyJumpdrive

Recent Profile Visitors

45,197 profile views
  1. Crest

    Introduction to Machine Learning

    Update with a new ML Process: If you have ever played Magic the Gathering and been in an official tournament, you will know that before a tournament begins, you must write down your decklist on a sheet of paper, so the house knows what cards your using and that all the you are using are legal within the current rotating sets. After the tournament, the house sends the deck lists back to wizards where the data gets digitally recorded and sent to websites like http://www.mtgtop8.com. Mtgtop8 lists the rank the player came in during that tournament, the cards they were using and how many of each card they used. This data can be inserted into a Genetic Algorithm to generate a new deck based off winning statistics, here is the algorithm I'm setting up currently: Right now I am scraping 2 sets of data, a list of events (which includes the player name, a link to the deck, and the rank the player came in. Data from the event data table looks like this: The second set of data i am ripping, is the data of the cards that was used in that event, which can be ripped from the deck_url. The card data looks like this in the database: Once all my data has been ripped I will need a system for scoring the decks generated by the system. The score of the deck can based on the ranks of individual cards. Here is how I am converting ranks to scores, I am simply assigning each rank group a value. The better the rank, the higher the point value. def convert_rank_to_score(rank): if rank == '1': return 100 if rank == '2': return 80 if rank == '3' or rank == '3-4' or rank == '4': return 60 if rank == '5-8': return 40 if rank == '9-16': return 20 if rank == '': return 0 I can calculate the total score of the deck with the following formulas: card_score = sum of all event rank scores for the card being scored total_card_score = sum of all card_scores pair_score = sum of all event rank scores that both cards in a pair took place in total_pair_score = sum of all pair_scores deck_score = (total_card_score + total_pair_score) After I score a deck, before sending it off to its next generation, I can mutate the deck by removing the cards with the weakest scores and the weakest pairings. This scoring system will generate decks with the most used cards and the most used pairings. It will also stop too many unwanted color cards from blending into the deck, because the card's paring is taken into value, and since each card in deck could have multiple pairings(1 card could be in up to 60 pairs), it would output a deck with cards that only play well with each other. The card title also includes the number of that used in the deck, this will the system to determine the right number of each card we should be using. As I make progress, i will continue to post my findings and will display some results of generated decks, and how they play in competition
  2. Crest

    3D Salem-GDK

    Repository Link: https://gitlab.com/oddly-doddly/salem-gdk/ Discord Link, (we're community development drive): https://discordapp.com/invite/0wtBMrHuLTjsfsoH For the past 4 months I have been working on a library for developing games and game engines. I am writing this engine to develop my upcoming game project, OddlyDoddly's The InBetween. The system is very simple to how many already existing game engines work, and even though it is very young, it is becoming a very powerful tool. Salem GDK is written with raw OpenGL in C++. It uses GLFW for window and input management. Here are some features i've currently finished developing: Basic TCP Network, soon will be rewritten as a modular network supporting both TCP and UDP protocols. Will also have match making servers. GUI ENGINE with capabilities of scripting user interfaces through JSON files. An example json script and its output { "interface": { "fonts": [ { "id": "arial", "source": "./resource/fonts/arial.ttf" } ], "objects": [ { "type": "image", "id": "img_sanic", "textures": [ { "id": "source", "texture": "./resource/gui/images/sanic.png" } ], "text": "Exit", "position": { "x": -1.0, "y": -1.0 }, "size": { "width": 0.4, "height": 0.6 }, "shader": "ui" }, { "type": "button", "id": "btn_exit", "textures": [ { "id": "inactive", "texture": "./resource/gui/buttons/btn_exit_inactive.png" }, { "id": "hover", "texture": "./resource/gui/buttons/btn_exit_hover.png" }, { "id": "click", "texture": "./resource/gui/buttons/btn_exit_click.png" } ], "text": "Exit", "position": { "x": 0.0, "y": 0.3 }, "size": { "width": 0.4, "height": 0.2 }, "attributes": { "anchor": "left", "text-align": "center" }, "shader": "ui" }, { "type": "textbox", "id": "txt_username", "textures": [ { "id": "inactive", "texture": "./resource/gui/textboxes/textbox_inactive.png" }, { "id": "focus", "texture": "./resource/gui/textboxes/textbox_focus.png" } ], "size": { "width": 0.4, "height": 0.05 }, "position": { "x": 0.0, "y": 0.1 }, "attributes": { "font": "arial", "text-align": "left", "anchor": "center", "place-holder": "Email/Username", "font-size": 0.5, "font-color": "#ffffff" } }, { "type": "textbox", "id": "txt_password", "textures": [ { "id": "inactive", "texture": "./resource/gui/textboxes/textbox_inactive.png" }, { "id": "focus", "texture": "./resource/gui/textboxes/textbox_focus.png" } ], "size": { "width": 0.4, "height": 0.05 }, "position": { "x": 0.0, "y": 0.0 }, "attributes": { "font": "arial", "text-align": "left", "anchor": "center", "place-holder": "Password", "font-size": 0.5, "font-color": "#ffffff", "is-password": true } } ] } } Output Render: All ui objects are interactable and can be grabbed through the gameview's ui engine auto myControl = getView()->ui()->getControl("txt_username"); returns a pinter to the textbox username myControl->value(); Will even get the value of what is in the textbox. Events can be bound to ui buttons through lambda functions. If i want to link an event to btn_exit that prints out the value of email and username to the debug console I can do so like this: // Load GUI loadGui("./resource/gui/views/MainMenu.json"); auto btnExit = gui().findUiControlById<Salem::Graphics::Controls::uiButton>("btn_exit"); auto txtUsername = gui().findUiControlById<Salem::Graphics::Controls::uiTextBox>("txt_username"); auto txtPassword = gui().findUiControlById<Salem::Graphics::Controls::uiTextBox>("txt_password"); btnExit->on_click = []() { std::string username = GAMELOOP_PTR->GetView()->gui().findUiControlById<Salem::Graphics::Controls::uiTextBox>("txt_username")->value(); std::string password = GAMELOOP_PTR->GetView()->gui().findUiControlById<Salem::Graphics::Controls::uiTextBox>("txt_password")->value(); std::cout << "Login: {" << username.c_str() << " : " << password.c_str() << "}" << std::endl; }; Here is an example of a gameview, basically a scene in your game: // // Created by ddodds on 10/24/17. // #ifndef TEST_CLIENT_MAINMENUVIEW_HPP #define TEST_CLIENT_MAINMENUVIEW_HPP #include "system/GameLoop.hpp" #include "system/interface/GameView.hpp" #include "views/controllers/MainMenuController.hpp" #include "behaviours/TestBehaviour.hpp" #include "physics/PhysicsTypes.hpp" #include "physics/types/Transform.hpp" #include <graphics/objects/Model.hpp> #include "graphics/controls/uiButton.hpp" #include "graphics/controls/uiTextBox.hpp" extern Salem::System::GameLoop *GAMELOOP_PTR; namespace TestClient::Views { class MainMenuView : public Salem::System::Interface::GameView { public: explicit MainMenuView(Controllers::MainMenuController &p_view_controller) : GameView(p_view_controller) {} void Initialize() override { // Load GUI loadGui("./resource/gui/views/MainMenu.json"); // Create and bind a Camera Salem::Physics::Types::Transform camera_transform( Salem::Physics::Vector3(0.0f, 0.0f, 0.0f), Salem::Physics::Quaternion(), Salem::Physics::Vector3(1.0f, 1.0f, 1.0f)); GameView::camera(new Salem::Graphics::Objects::Camera(camera_transform, 45.0f, GAMELOOP_PTR->vp_width(), GAMELOOP_PTR->vp_height(), 0.0f, 100.0f)); auto btnExit = gui().findUiControlById<Salem::Graphics::Controls::uiButton>("btn_exit"); auto txtUsername = gui().findUiControlById<Salem::Graphics::Controls::uiTextBox>("txt_username"); auto txtPassword = gui().findUiControlById<Salem::Graphics::Controls::uiTextBox>("txt_password"); btnExit->on_click = []() { std::string username = GAMELOOP_PTR->GetView()->gui().findUiControlById<Salem::Graphics::Controls::uiTextBox>("txt_username")->value(); std::string password = GAMELOOP_PTR->GetView()->gui().findUiControlById<Salem::Graphics::Controls::uiTextBox>("txt_password")->value(); std::cout << "Login: {" << username.c_str() << " : " << password.c_str() << "}" << std::endl; }; Salem::Physics::Types::Transform transform( Salem::Physics::Vector3(0.0f, 0.0f, 0.0f), Salem::Physics::Quaternion(), Salem::Physics::Vector3(1.0f, 1.0f, 1.0f) ); // Game Objects do not get initalized until you add them to a view now. Salem::Graphics::Objects::Model* model = new Salem::Graphics::Objects::Model(transform, "./resource/models/nanosuit/nanosuit.obj"); // Mono Behaviour Initialize Functions get called during the game object's initialization model->AddBehaviour(new Behaviours::TestBehaviour(model->transform())); // Append GameObject to the view addGameObject(model); } void Update() override { // Some Update Logic GameView::Update(); } }; } #endif //TEST_CLIENT_MAINMENUVIEW_HPP And a script to start a scene: The main function of the game itself: We create a game loop, and instruct it to load our Main Menu View, which is defined above. // // Created by ddodds on 10/21/17. // #include <iostream> #include <boost/asio.hpp> #include <views/controllers/MainMenuController.hpp> #include "system/GameLoop.hpp" #include "views/MainMenuView.hpp" #include "views/controllers/MainMenuController.hpp" int main(int argc, char *argv[]) { TestClient::Controllers::MainMenuController mainMenuController; auto mainMenuViewPtr = std::make_unique<TestClient::Views::MainMenuView>(mainMenuController); Salem::System::GameLoop gameLoop; gameLoop.LoadView(std::move(mainMenuViewPtr)); gameLoop.Run(); return 0; } And of course, a game controller to handle user input: // // Created by ddodds on 1/22/18. // #ifndef TEST_CLIENT_MAINMENUCONTROLLER_HPP #define TEST_CLIENT_MAINMENUCONTROLLER_HPP #include <system/interface/ViewController.hpp> #include <physics/PhysicsTypes.hpp> #include "system/GameLoop.hpp" extern Salem::System::GameLoop *GAMELOOP_PTR; namespace TestClient::Controllers { class MainMenuController : public Salem::System::Interface::ViewController { public: void on_keypress(GLFWwindow *window, int key, int scancode, int action, int mods) override { if(key == GLFW_KEY_W) { Salem::Physics::Vector3 move_transform(0.0f, 0.0f, 1.0f); GAMELOOP_PTR->GetView()->camera()->transform().Translate(move_transform); } if(key == GLFW_KEY_S) { Salem::Physics::Vector3 move_transform(0.0f, 0.0f, -1.0f); GAMELOOP_PTR->GetView()->camera()->transform().Translate(move_transform); } if(key == GLFW_KEY_A) { Salem::Physics::Vector3 move_transform(1.0f, 0.0f, 0.0f); GAMELOOP_PTR->GetView()->camera()->transform().Translate( move_transform); } if(key == GLFW_KEY_D) { Salem::Physics::Vector3 move_transform(-1.0f, 0.0f, 0.0f); GAMELOOP_PTR->GetView()->camera()->transform().Translate(move_transform); } } void on_cursor_move(GLFWwindow *p_window, double p_xpos, double p_ypos) override { double x_offset = p_xpos - m_last_x; double y_offset = p_ypos - m_last_y; GAMELOOP_PTR->GetView()->camera()->transform().Rotate(0.05f*x_offset, Salem::Physics::Vector3(0.0f, 1.0f, 0.0f)); GAMELOOP_PTR->GetView()->camera()->transform().Rotate(0.05f*y_offset, Salem::Physics::Vector3(1.0f, 0.0f, 0.0f)); m_last_x = p_xpos; m_last_y = p_ypos; }; private: double m_last_x, m_last_y = 0; }; } #endif //TEST_CLIENT_MAINMENUCONTROLLER_HPP The library supports camera views and transforms: (for this test i just converted all 2d interface objects into 3d world objects.) Of course, 3D model loading at its very basics.... Game Object behaviours. You can bind as many scripted behaviours as you'd like to a game object, and the system runs them when necessary: If you've ever used unity, they are very similar to MonoBehaviours, but these are not scripted or injected, they get baked into the final application compilation. Also support GLSL shader language Coming up in the project's todo; Audio Engine (being developed by a Salem-GDK community member) Animation Engine (will be developed by me) UDP Network (developed by me) Witchcraft Engine;World (engine used to generate 3D worlds and maps for SalemGDK, in development next, by me) More screenshots to come.
  3. Crest

    Lots Of New Stuff

    But arcwyre you not released yet?
  4. Crest

    Isometric Eclipse

    I made it very clear that nobody cares. So just in case that no one is aware, nobody cares what you do with eclipse.
  5. Crest

    Isometric Eclipse

    Mirage was first released under a GPL license, a copy left license that means all derivitives of the software (including derivitives of derivitives) must also inherit the GPL license. legally you cannot close the source to any derivitive of it... Not that that matters, because no one cares for it...
  6. Crest

    Port Forwarding Explained

    This was a terrible place to ask your question if you were looking for a quick response. The application may or may not support iPV6. Your IPv6 address should also have an ipv4 google search "What is my Ipv4 address. Also, i'm not sure if there's a problem with your port forwarding settings because you didn't upload a picture of them.
  7. Crest

    Today I did this on my project...

    Today on my project, I learnt me the value of friendship; Ultimately meaningless. For real though, Took a step away from Salem for the week to work on a quantum computing presentation. So I worked on a quantum computing presentation
  8. Crest

    The presents thread.

    and all i wanted for christmas was intersect's source code
  9. Crest

    The presents thread.

    I got some new dishes, knives,towels, ya know, apartment stuff.
  10. Crest

    The presents thread.

    Just wanted to be the one to start it this year ITT; Post pictures of dope presents you got for Crestmatt.
  11. Crest

    Today I did this on my project...

    The application is postman, it's used for testing REST end points and managing CRUD
  12. Crest

    Today I did this on my project...

    Created a user authentication rest service for Salem-GDK, mongodb is bae, it is so easy to setup rest services with it. http://www.ascensiongamedev.com/resources/filehost/fea913a1085a6815420aad4aa46c0898.webm
  13. I'm working on an MMO database structure, and I'm trying to decide on the best database software for creating an MMO application. I'm thinking MongoDb because of its ease of use with JSON and Rest Services in Node, but the idea of nosql and storing JSON data just seems slower to me than conventional SQL database. Thoughts?
  14. Crest

    Today I did this on my project...

    http://www.ascensiongamedev.com/resources/filehost/43af43557efbd57f265f1f0ef04934d9.webm Got my text boxes loading from my json ui scripting implementation The complexity of creating form controls in openGL goes severely underestimated....
×