Flexible, extensible, and scalable video game matchmaking.

Open Match

GoDoc Go Report Card License GitHub release Follow on Twitter

Open Match is an open source game matchmaking framework that simplifies building a scalable and extensible Matchmaker. It is designed to give the game developer full control over how to make matches while removing the burden of dealing with the challenges of running a production service at scale.

Please visit Open Match website for user documentation, demo instructions etc.

Contributing to Open Match

Open Match is in active development and we would love your contribution! Please read the contributing guide for guidelines on contributing to Open Match.

The Open Match Development guide has detailed instructions on getting the source code, making changes, testing and submitting a pull request to Open Match.

Support

Code of Conduct

Participation in this project comes under the Contributor Covenant Code of Conduct

License

Apache 2.0

Comments
  • Feature Request: Backfill Support

    Feature Request: Backfill Support

    Is your feature request related to a problem? Please describe. Matches can be created without being full. At the same time, matches that were “full,” can have changing rosters from the perspective of the game host. Developers need a way to fill partially full matches. Additionally, the reasons and criteria used to fill matches change over time as the game progresses (e.g. highly skilled players leave one team, a friend has joined from outside matchmaking, etc).

    For users of the matchmaker, solving this backfill problem should result in quicker times to match, and matches that are filled with more players; it will be more likely that any joined server will be full or quickly filled. From a developer perspective, it is very hard to work with a backfill system that competes with tickets being allocated to new servers. Methods to achieve this generally take the form of introducing lag to compensate for startup delay of servers, and failure to do so correctly can break matchmaking or overwhelm the system.

    Here are a few common issues associated with directly running a match function as a backfill request:

    Backfill Storms - If backfilling encounters issues that prevent successful backfill for a short period, matchmaking generates new game hosts since players aren't being drained into existing games. The game hosts start and try backfilling, resulting in further failure. More game hosts. More failed backfills. If left unresolved, the issue balloons and eventaully becomes a scale problem. Etc. Etc. This is especially problematic for long running game hosts (like lobby servers or mmos)

    Immediacy Problem - Servers scheduled for allocation need to be immediately available for backfill. Without this, during the lag between a server allocation request and it coming online for backfill requests, many extraneous servers can be created leading to a cascading effect that can lead to service failure and extremely sparse server density.

    Player Density - Similarly to the immediacy problem above, backfill requests that aren’t processed during every match function window are missed and can result in new matches being created despite having partially full games. This decreases the ability for the developer to fill those games, and ultimately ties game-host player-density directly to the rate at which a game developer is able to meet the matchmaking sync windows. This necessitates the need for some state to exist in the matchmaker to be available during matchmaking windows on a consistently recurring basis.

    Describe the solution you'd like

    Describe alternatives you've considered

    Additional context

  • API change: Add MMF status to FetchMatches

    API change: Add MMF status to FetchMatches

    Overview

    Add a field to FetchMatchesResponse to indicate Match Function success/failure. Never return which fails an entire FetchMatches call which stem from an individual mmf failing. Change the contract so that any matches which had been streamed before the MMF returned an error are still sent to the synchronizer instead of failing the whole call immediately.

    Motivation

    A match making function which has returned matches but then fails is not necessarily an indication that a whole FetchMatches call should fail. A single FetchMatches may have a large number of profiles all succeeding. Failing everything on a single mmf failure may block the whole system when a single unimportant mmfs pod fails.

    An mmf may have too many tickets to finish processing before the proposal window closes. In that case, it's very beneficial for any matches it had returned to properly be sent to the synchronizer and returned as a result (if passing the evaluator), so that the ticket pool continues to drain.

    With the current mechanism, it's not possible to easily tell the root cause of a profile failing.

    With optimistic stream from the mmf to the synchronizer before all mmfs have finished (which will increase overall system speed and scale), the synchronizer may already be marking tickets in matches as pending a match. Failing at this point due to another MMF failing unnecessarily causes these tickets to be stuck waiting for the pending match time out to expire.

    An alternative is to make the FetchMatches call only operate on a single profile (removing the repeated), though that still has some of the streaming problems. Though they're less severe as they're specifically limited to the erroring mmf.

    Impact

    Callers of FetchMatches will need to check the type of result returned. They may ignore the mmf status, but they will likely want to additionally log this status.

    Change Proto

    Change from:

    message FetchMatchesResponse {
      // A Match generated by the user-defined MMF with the specified MatchProfiles.
      // A valid Match response will contain at least one ticket.
      Match match = 1;
    }
    

    To:

    message FetchMatchesResponse {
      oneof response {
        // A Match generated by the user-defined MMF with the specified MatchProfiles.
        // A valid Match response will contain at least one ticket.
        Match match = 1;
        MmfResult mmf_result = 2;
      }
    }
    
    message MmfResult {
      string profile_name = 1;
      google.rpc.Status status = 2;
    }
    

    MmfResult would always be sent for each profile run. In the future, we could expand this to allowing other information to be returned to the director.

    Note that adding a oneof isn't backwards compatible, but I think it's better to have it and we're not 1.0 yet.

  • Do not merge - testing all PRs for Backfill on CI for the Demo

    Do not merge - testing all PRs for Backfill on CI for the Demo

    What this PR does / Why we need it:

    Which issue(s) this PR fixes:

    Closes #

    Special notes for your reviewer:

  • Use Helm release to name resources

    Use Helm release to name resources

    This set of changes ensures that every k8s resource created by the Helm chart includes the fullname macro which includes the name of the Helm release.

    It's a big change, and is probably much easier to read commit-by-commit, due to the distance between different parts for some of the specific changes.

    The main observable effect is that all the resources that were hard-coded to om-XXX or open-match-XXX are now RELEASE-open-match-XXX, although if RELEASE contains "open-match" then they will be RELEASE-XXX.

    In a special case (or rather, removing a special case), e01c77b838fdd86fae4ae8983b030fae552973f4 causes the open-match-scale subchart's resources to be RELEASE-open-match-scale-XXX, which means a release named "open-match" gets, e.g., Deployments named open-match-backend and open-match-open-match-scale-backend. It wasn't clear to be if this is desirable, and if not, that commit can be removed, producing open-match-scale-backend instead, but cementing that the subcharts are really just part of the main chart.

    Similarly, redis no longer has a fullnameOverride set, so its resources will generally be of the form RELEASE-redis-XXX, e.g., a StatefulSet named open-match-redis-master.

    Note: Redis PVCs names change with this. Since it's a StatefulSet, the old PVCs are left behind. It's still possible to set redis.fullnameOverride to "om-redis" to use any existing PVCs in a namespace, when upgrading. If your release is named om, this will be the default name anyway.

    As noted in the values.yaml, the hostName and serviceAccount values now default to empty to generate names, and can be overridden where desired.

    To regain the short-names, you can use the YAML file (inside the Details) with --values. The only thing that will differ is the ConfigMap created by open-match-scale for Grafana dashboards, because it was already named open-match-scale-dashboard. If you do this, you can only have one such release in a namespace, and you cannot then have a release named 'om' or 'open-match' installed at the same time, as some resources will conflict.

    # Reinstate all the resource names as if I hadn't done anything
    fullnameOverride: "om"
    open-match-scale:
      fullnameOverride: "om"
      configs:
        default:
          configName: "om-configmap-default"
        override:
          configName: "om-configmap-override"
      scaleBackend:
        hostName: "om-scale-backend"
      scaleFrontend:
        hostName: "om-scale-frontend"
    
    open-match-customize:
      fullnameOverride: "om"
    
    redis:
      fullnameOverride: "om-redis"
      serviceAccount:
        name: "open-match-redis-service"
    global:
      kubernetes:
        serviceAccount: "open-match-unprivileged-service"
    
    configs:
      default:
        configName: "om-configmap-default"
      override:
        configName: "om-configmap-override"
    

    Tested to support multiple installs using the following commands from install/helm/open-match

    helm dep build
    helm install open-match . --values om-install-all.values.yaml --set-string global.image.tag=1.0.0
    helm install another-open-match . --values om-install-all.values.yaml --set-string global.image.tag=1.0.0
    

    with TLS keys generated per TLS Encryption

    where om-install-all-values.yaml is set to install as many of the templated resources as possible, as below:

    open-match-core:
        enabled: true
        swaggerui:
            enabled: true
        redis:
            enabled: true
    
    open-match-customize:
        enabled: true
        function:
            enabled: true
        evaluator:
            enabled: true
    
    open-match-scale:
        enabled: true
    
    open-match-telemetry:
        enabled: true
    
    open-match-override: true
    
    usingHelmTemplate: false
    
    ci: false
    
    global:
        tls:
            enabled: true
        telemetry:
            grafana:
                enabled: true
            jaeger:
                enabled: true
            prometheus:
                enabled: true
    

    I repeated the test with --set ci=true appended to both, to confirm that the testing resources do not conflict.

    Fixes: #1235

  • Can't build frontend service in matchmaker101/frontend tutorial

    Can't build frontend service in matchmaker101/frontend tutorial

    What happened: I received the following error while following the matchmaker101 "Build your own Game Frontend" tutorial when I executed the docker build command in the "Build and Push" step:

    ❯ docker build -t scosgrave/mm101-tutorial-frontend frontend/
    Sending build context to Docker daemon  52.74kB
    Step 1/6 : FROM golang:alpine as go
    alpine: Pulling from library/golang
    aad63a933944: Pull complete
    c732a2540651: Pull complete
    7b2225181d6b: Pull complete
    c8dae7ec6990: Pull complete
    08684ee472f3: Pull complete
    Digest: sha256:244a736db4a1d2611d257e7403c729663ce2eb08d4628868f9d9ef27354
    Status: Downloaded newer image for golang:alpine
     ---> 760fdda71c8f
    Step 2/6 : WORKDIR /app
     ---> Running in d626ff2b5ecc
    Removing intermediate container d626ff2b5ecc
     ---> f5e457966455
    Step 3/6 : ENV GO111MODULE=on
     ---> Running in 0b169b76bd25
    Removing intermediate container 0b169b76bd25
     ---> 383a431fdc04
    Step 4/6 : COPY . .
     ---> 8a51d70c7dd0
    Step 5/6 : RUN go build -o frontend .
     ---> Running in f206fb482092
    go: open-match.dev/[email protected]: parsing /open-match/go.mod: open no such file or directory
    The command '/bin/sh -c go build -o frontend .' returned a non-zero code:
    

    What you expected to happen: I expected the docker build command to complete successfully and create a docker image.

    How to reproduce it (as minimally and precisely as possible):

    1. Install open-match v0.9.0 in a kubernetes cluster using the installation steps documented here (standard Helm v3 installation steps)
    2. Follow the tutorial for customizing the frontend here
    3. You should see the reported error when executing the "Build and Push" step

    Anything else we need to know?:

    Output of kubectl version:

    ❯ kubectl version
    Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.9", GitCommit:"500f5aba80d71253cc01ac6a8622b8377f4a7ef9", GitTreeState:"clean", BuildDate:"2019-11-13T11:21:43Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}
    Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:45:25Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}
    

    Cloud Provider/Platform (AKS, GKE, Minikube etc.):

    ❯ minikube version
    minikube version: v1.8.2
    commit: eb13446e786c9ef70cb0a9f85a633194e62396a1
    

    Running on Windows 10

    Open Match Release Version:

    ❯ helm3 list
    NAME            NAMESPACE       REVISION        UPDATED                                   STATUS          CHART                   APP VERSION
    my-om-release   open-match      1               2020-03-24 11:50:39.2988155 -0700 DST     deployed        open-match-0.9.0        0.9.0
    

    Install Method(yaml/helm):: Helm

  • issues with release process

    issues with release process

    Writing down all of the issues I encounter here: -" Open a document for a draft release notes." link leads to 404. -"The link resolves to, v{version}...master." It resolves to v{PREVIOUS version}...master. That whole sentence seems weird, just remove? The instructions seemed good enough.

    • The commits since last release links to commits, not the PRs. Not all commits specify their PR.

    • Search for merged pull request tagging should include " is:merged " to exclude pull requests which were abandoned.

    • Unclear if all of the versions should be updated for release candidates. Should the RC suffix be included in all of them? I skipped the README.md for the RC.

    • Skipped tagging, because the tags aren't specified.

    • Tagging shouldn't be the job of the person doing the release.

    • Why is it that one of the first steps is to open the release notes to start writing a draft, then later it says to create a draft release with the same template?

    • cloudbuild.yaml needs to be included in places version number needs to be set.

    • "git checkout master && git pull master && git rev-parse HEAD" is not the git command we want. Instead: "git fetch upstream && git rev-parse upstream/master"

    • "take note of the hash in git master" take note for what?

    • I don't have permission to run post submit trigger. However, it looks like it triggered automatically?

    • Making the release notes is a lot of work, though you're working on this for 0.6 I think?

    Post submit failed with: "Deploy: Deployment Configs": / [0 files][ 0.0 B/ 13.3 KiB] AccessDeniedException: 403 [email protected] does not have storage.objects.delete access to open-match-chart/install/yaml/master-latest/01-redis-chart.yaml.

    .... I accidentally hit enter and made a release instead of it being a draft.

  • Make matchmaker_config.yaml a part of Helm chart config

    Make matchmaker_config.yaml a part of Helm chart config

    Aa part of #130 file /config/matchmaker_config.yaml is removed along with all its symlinks. Instead, its content is stored inside /install/helm/open-match/values.yaml. At the time of chart installation (or just rendering) one may override various parts of matchmaker config using --set:

    helm template open-match \
      --set openmatch.config.files."matchmaker_config\.yaml".logging.level=warn \
      --set openmatch.config.files."matchmaker_config\.yaml".metrics.reportingPeriod=15 \
      --set openmatch.config.files."matchmaker_config\.yaml".playerIndices="{some,thing,there}" \
    

    Also moved config package under internal/.

  • PersistentVolumes and PersistentVolumeClaims persist even after helm uninstall

    PersistentVolumes and PersistentVolumeClaims persist even after helm uninstall

    Hi,

    We started encountering a problem where open-match couldn't start successfully. After digging around we found that the redis data volumes are never reset, even after making many changes and uninstalling from helm many times. This meant we had millions of tickets in redis upon start-up. Example:

    redis-data-open-match-redis-node-0   Bound    pvc-c94f7e4b-4543-4e8d-985e-cee49710e32b   8Gi        RWO            standard       115d
    redis-data-open-match-redis-node-1   Bound    pvc-3af3f3f5-d29d-4b0e-808d-a1fedc3304db   8Gi        RWO            standard       115d
    redis-data-open-match-redis-node-2   Bound    pvc-146917d1-ceab-4331-9163-01807a19290f   8Gi        RWO            standard       8d
    

    and

    pvc-359a9f92-996f-4ee1-ba42-539a497c0a1c   8Gi        RWO            Delete           Bound    open-match/redis-data-open-match-redis-node-1   standard                27d
    pvc-a934b590-70bf-47b9-bd9c-e6f3ec186fec   8Gi        RWO            Delete           Bound    open-match/redis-data-open-match-redis-node-2   standard                6d19h
    pvc-f9bb0538-0b30-4d84-8bbc-6d3f604b985f   8Gi        RWO            Delete           Bound    open-match/redis-data-open-match-redis-node-0   standard                27d
    

    It is unexpected that any data would remain after installing.

  • backfill not found on 1.3.0 (worked on 1.2.0)

    backfill not found on 1.3.0 (worked on 1.2.0)

    What happened: back fill not found

    What you expected to happen:

    i backfill was created in api and exists in redis, it should be found

    How to reproduce it (as minimally and precisely as possible):

    2021/10/25 19:54:26 Could not get backfill from open-match, rpc error: code = NotFound desc = Backfill id: c5rgms3vttta9v4fj84g not found, waiting for new backfill
    2021/10/25 19:54:28 Probe backfill
    2021/10/25 19:54:28 Health Ping
    2021/10/25 19:54:28 Could not get backfill from open-match, rpc error: code = NotFound desc = Backfill id: c5rgms3vttta9v4fj84g not found, waiting for new backfill
    2021/10/25 19:54:30 Probe backfill
    2021/10/25 19:54:30 Health Ping
    2021/10/25 19:54:30 Could not get backfill from open-match, rpc error: code = NotFound desc = Backfill id: c5rgms3vttta9v4fj84g not found, waiting for new backfill
    2021/10/25 19:54:32 Probe backfill
    2021/10/25 19:54:32 Health Ping
    2021/10/25 19:54:32 Could not get backfill from open-match, rpc error: code = NotFound desc = Backfill id: c5rgms3vttta9v4fj84g not found, waiting for new backfill
    2021/10/25 19:54:34 Health Ping
    2021/10/25 19:54:34 Probe backfill
    2021/10/25 19:54:34 Could not get backfill from open-match, rpc error: code = NotFound desc = Backfill id: c5rgms3vttta9v4fj84g not found, waiting for new backfill
    2021/10/25 19:54:36 Probe backfill
    2021/10/25 19:54:36 Health Ping
    2021/10/25 19:54:36 Could not get backfill from open-match, rpc error: code = NotFound desc = Backfill id: c5rgms3vttta9v4fj84g not found, waiting for new backfill
    

    image

    	backfill, err := frontendService.GetBackfill(context.Background(), &om.GetBackfillRequest{BackfillId: backfillId})
    
    					if err != nil {
    						// other option, to allow GS to create and set backfill label
    						log.Printf("Could not get backfill from open-match, %v, waiting for new backfill", err)
    					} else {
    
    go 1.17
    
    require (
    	agones.dev/agones v1.18.0
    	github.com/golang/protobuf v1.5.2
    	github.com/spf13/pflag v1.0.5
    	github.com/spf13/viper v1.7.1
    	golang.org/x/net v0.0.0-20210224082022-3d97a244fca7
    	google.golang.org/grpc v1.39.0
    	open-match.dev/open-match v1.3.0
    )
    

    image

    Anything else we need to know?: i used 1.2 in almost same setup, it worked

    Output of kubectl version: 1.2.1

    Cloud Provider/Platform (AKS, GKE, Minikube etc.): aks

    Open Match Release Version: 1.3.0 (not rc, but yamls with 1.3.0). hit the issue on rc1 yamls

    Install Method(yaml/helm):: yaml

  • Add backfill TTL config variable

    Add backfill TTL config variable

    What this PR does / Why we need it: This PR adds a new variable in Helm charts for configuring the timeout for Backfill TTL

    Which issue(s) this PR fixes:

    Special notes for your reviewer: This PR should be merged after #1325 is merged and resolving all conflicts, if any.

  • Redis: Backfill last acknowledged

    Redis: Backfill last acknowledged

    What this PR does / Why we need it: Add SortedSet to store Backfill in a sorted order to retrieve all expired Backfills.

    Which issue(s) this PR fixes: Work on #1240

    Special notes for your reviewer: This PR is dependent on StateStore changes. We can select a specific TTL config variable later during implementation of Cleanup Service.

    func (rb *redisBackend) AcknowledgeBackfill(ctx context.Context, id string) (error) {
    func (rb *redisBackend) GetExpiredBackfills(ctx context.Context) ([]string, error) {
    // Used in DeleteBackfil()
    func (rb *redisBackend) deleteExpiredBackfillID(ctx context.Context, backfillID string) error
    
  • Update to GO1.17, google.golang.org/protobuf and deprecation changes

    Update to GO1.17, google.golang.org/protobuf and deprecation changes

    What this PR does / Why we need it: Update go version to v1.17 and package github.com/golang/protobuf to google.golang.org/protobuf to keep Open Match dependencies up-to-date.

    Which issue(s) this PR fixes: #1443

    Closes

    Special notes for your reviewer: Tools updates: protoc v3.19.4 kubectl v1.21.5 golang v1.17

  • Update to GO1.16, google.golang.org/protobuf and deprecation changes

    Update to GO1.16, google.golang.org/protobuf and deprecation changes

    What this PR does / Why we need it: Update go version to v1.16 and package github.com/golang/protobuf to google.golang.org/protobuf to keep Open Match dependencies up-to-date.

    Which issue(s) this PR fixes: #1443

    Closes

    Special notes for your reviewer: Tools updates: protoc v3.19.4 kubectl v1.21.5 golang v1.16

  • update helm chart repo link

    update helm chart repo link

    What this PR does / Why we need it: This PR contains the changes required for update to repo link of Bitnami's helm chart where the redis's archived chart can be fetched. The updated retention policy for bitnami's helm charts keeps the newly published charts for 6 months before moving to archive.

    Which issue(s) this PR fixes:

    Closes #1523

    Special notes for your reviewer:

  • To update link to bitnami/redis helm chart.

    To update link to bitnami/redis helm chart.

    What happened: Recently Bitnami's helm chart retention policy has changed which only now retains charts published in just 6 months and others charts are archived and available to be used from LINK as reported in bitnami#10539. So to use redis helm chart in open-match installation dependency, we need to use new link to fetch chart v16.3.1.

    What you expected to happen: to run make presubmit command successfully.

    How to reproduce it (as minimally and precisely as possible): using make presubmit command or more specifically by make update-chart-deps command

    Anything else we need to know?:

    Output of kubectl version:

    Cloud Provider/Platform (AKS, GKE, Minikube etc.): local or CI

    Open Match Release Version: latest

    Install Method(yaml/helm): any

  • "READONLY You can't write against a read only replica" when trying to create a ticket

    What happened: Receiving "READONLY You can't write against a read only replica" error when trying to create a ticket through CreateTicket front end calling

    How to reproduce it (as minimally and precisely as possible): Intermitent and no related to codebase. It seems related to REDIS replication setup

    Anything else we need to know?: Sometimes after a restart it seems that openmatch is trying to connect to redis slave instead of master to create tickets. I would like to know if there is some config to force connect to redis master

    Othertimes slave instance node-1 switchs to master and we have two master nodes and replication stops working generating several erros since tickes are created in one node and could not be read in another one

    Output of kubectl version:

    ~$ minikube kubectl version
    WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
    Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.3", GitCommit:"434bfd82814af038ad94d62ebe59b133fcb50506", GitTreeState:"clean", BuildDate:"2022-10-12T10:57:26Z", GoVersion:"go1.19.2", Compiler:"gc", Platform:"linux/amd64"}
    Kustomize Version: v4.5.7
    Server Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.3", GitCommit:"434bfd82814af038ad94d62ebe59b133fcb50506", GitTreeState:"clean", BuildDate:"2022-10-12T10:49:09Z", GoVersion:"go1.19.2", Compiler:"gc", Platform:"linux/amd64"}
    
    

    Cloud Provider/Platform (AKS, GKE, Minikube etc.): Minikube

    Open Match Release Version: v1.6.0

    Install Method(yaml/helm): yaml

  • Found CRITICAL Vulnerability in your website !

    Found CRITICAL Vulnerability in your website !

    Hello I am Chirag Prajapati a Certified Penetration Tester and Ethical Hacker my License no is: 10188-161-078-1726.

    We would like to inform you that, a security vulnerability affecting your website.

    Affected Website: openmatch.dev

    Following the ISO/IEC 29147 (“Information technology — Security techniques — Vulnerability disclosure”) guidelines, we verified the vulnerability's existence prior to notifying you. Please connect with us for technical details of the vulnerability,  The researcher may also help remediate the vulnerability if you need any assistance.

    For more information I request you to kindly revert me back so that I can share with you the report ! Looking forward to hearing from you !

The flexible game engine.
The flexible game engine.

The flexible game engine. Crown is a general purpose and data-driven game engine, written in orthodox C++ with a minimalistic and data-oriented design

Dec 28, 2022
Perimeter is a real-time strategy video game with unique gameplay elements such as terraforming deformable terrain, morphing units, energy network, protective shield and surreal worlds.
Perimeter is a real-time strategy video game with unique gameplay elements such as terraforming deformable terrain, morphing units, energy network, protective shield and surreal worlds.

Периметр | Perimeter About Perimeter is a real-time strategy video game with unique gameplay elements such as terraforming deformable terrain, morphin

Dec 27, 2022
Stealthy way to hijack the existing game process handle within the game launcher (currently supports Steam and Battle.net). Achieve external game process read/write with minimum footprint.
Stealthy way to hijack the existing game process handle within the game launcher (currently supports Steam and Battle.net). Achieve external game process read/write with minimum footprint.

Launcher Abuser Stealthy way to hijack the existing game process handle within the game launcher (currently supports Steam and Battle.net). Achieve ex

Nov 25, 2022
Game Boy, Game Boy Color, and Game Boy Advanced Emulator
Game Boy, Game Boy Color, and Game Boy Advanced Emulator

SkyEmu SkyEmu is low level cycle accurate GameBoy, GameBoy Color and Game Boy Advance emulator that I have been developing in my spare time. Its prima

Jan 4, 2023
This is 2048, the video game that was embodied in C language.
This is 2048, the video game that was embodied in C language.

2048 This is 2048, the video game that was embodied in C language. How to use Main Page Operation keys Operation keys are used on the game page. △ - Y

Dec 31, 2021
MMORPG Video Game of the year 1999 created in Visual Basic 6.0 by Pablo Marquez (Morgolock)
MMORPG Video Game of the year 1999 created in Visual Basic 6.0 by Pablo Marquez (Morgolock)

Argentum Online C++ MMORPG Video Game of the year 1999 created in Visual Basic 6.0 by Pablo Marquez (Morgolock), this game is open source under the "G

Dec 26, 2022
A video game I created for one of my CS classes.

Eclipse This is a video game I created for one of my CS classes. It game will run on Mac or Linux. Requirements This game requires that Mednafen be in

Oct 29, 2022
Animation compression is a fundamental aspect of modern video game engines
Animation compression is a fundamental aspect of modern video game engines

Animation compression is a fundamental aspect of modern video game engines. Not only is it important to keep the memory footprint down but it is also critical to keep the animation clip sampling performance fast.

Jan 2, 2023
Classic video game revived with a new story, now available for your MySQL database.
Classic video game revived with a new story, now available for your MySQL database.

mysql-snake Classic video game revived with a new story, now available for your MySQL database. A supermarket is giving out free buckets to visitors.

Feb 16, 2022
OGRE is a scene-oriented, flexible 3D engine written in C++ designed to make it easier and more intuitive for developers to produce games and demos utilising 3D hardware.
OGRE  is a scene-oriented, flexible 3D engine written in C++ designed to make it easier and more intuitive for developers to produce games and demos utilising 3D hardware.

OGRE (Object-Oriented Graphics Rendering Engine) is a scene-oriented, flexible 3D engine written in C++ designed to make it easier and more intuitive for developers to produce games and demos utilising 3D hardware. The class library abstracts all the details of using the underlying system libraries like Direct3D and OpenGL and provides an interface based on world objects and other intuitive classes.

Jan 3, 2023
Improved version of the X-Ray Engine, the game engine used in the world-famous S.T.A.L.K.E.R. game series by GSC Game World.
Improved version of the X-Ray Engine, the game engine used in the world-famous S.T.A.L.K.E.R. game series by GSC Game World.

OpenXRay OpenXRay is an improved version of the X-Ray Engine, the game engine used in the world-famous S.T.A.L.K.E.R. game series by GSC Game World. S

Jan 1, 2023
GlslViewer is a flexible console-base OpenGL Sandbox to display 2D/3D GLSL shaders without the need of an UI
GlslViewer is a flexible console-base OpenGL Sandbox to display 2D/3D GLSL shaders without the need of an UI

GlslViewer is a flexible console-base OpenGL Sandbox to display 2D/3D GLSL shaders without the need of an UI

Dec 26, 2022
GB Studio is a quick and easy to use retro adventure game creator for Game Boy available for Mac, Linux and Windows
GB Studio is a quick and easy to use retro adventure game creator for Game Boy available for Mac, Linux and Windows

GB Studio is a quick and easy to use retro adventure game creator for Game Boy available for Mac, Linux and Windows

Jan 8, 2023
A cycle-accurate Game Boy and Game Boy Color Emulator, with rewind feature.
A cycle-accurate Game Boy and Game Boy Color Emulator, with rewind feature.

Azayaka is a free and open-source Game Boy and Game Boy Color emulator written in C++. Features Cycle-Accurate emulation. Console based Debugg

Dec 3, 2022
CLUSEK-RT is a complex game engine written in C++ and the successor of the CLUSEK game engine
CLUSEK-RT is a complex game engine written in C++ and the successor of the CLUSEK game engine

CLUSEK-RT is a complex game engine written in C++ and the successor of the CLUSEK game engine. This engine has been designed with a cross-platform design in mind. Thanks to Vulkan API it delivers a next-gen experience with ray tracing to both Linux and Windows platforms

Dec 29, 2022
Minetest is an open source voxel game engine with easy modding and game creation

Minetest is an open source voxel game engine with easy modding and game creation

Dec 29, 2022
SameBoy DX is a Qt-based interface of SameBoy, a free, highly accurate Game Boy and Game Boy Color emulator.

SameBoy DX SameBoy DX is a Qt-based interface of SameBoy, a free, highly accurate Game Boy and Game Boy Color emulator. Build requirements: CMake Pyth

Oct 2, 2022
To recreate the board game Scotland yard and enable a single player to play the game by letting one of the roles being played by the computer based on written algorithm
To recreate the board game Scotland yard and  enable a single player to play the game by letting one of the roles being played by the computer based on written algorithm

Scotland Yard GAME OF SCOTLAND YARD This is a custom version of the classic board game, Scotland Yard .The game uses the London map used in the origin

Nov 11, 2021
Engine being created for homeworks in UPC Master's Degree in Advanced Programming for AAA Video Games.
Engine being created for homeworks in UPC Master's Degree in Advanced Programming for AAA Video Games.

Strawhat Engine Strawhat Engine is a game engine under construction that has model loading and camera movement features along with an editor. Reposito

May 18, 2022