Giter Site home page Giter Site logo

o21's Introduction

O21 Status Enfer

O21 is a modern free and open-source remake of U95, a game by NIKITA company, released in 1995.

Implementation Status

Some of the game engine features have been implemented, but the game is not in a playable state.

Visit the issue tracker if you want to know more.

Usage

Currently, O21 is only suitable for development mode. To start the game, run the following shell command:

$ dotnet run --project O21.Game -- <downloaded-data-directory>

Game History

U95 (also called as U-95 on the title screen) is a game well known in the 1990's Russian-speaking gaming community, since it was one of the first games published there.

It was created in 1995 by one of the first Russian game development companies, NIKITA (currently renamed to Nikita Online), for Windows 3.x.

O21

Since the original game is probably named after a German submarine U-95, that was sunk by Dutch O 21, the authors decided to name the remake project O21, as a (wishfully) superior project (at least in some aspects).

License and Legal Disclaimers

This section is maintained by me, the O21 project lead, Friedrich von Never. The statements made in first person are all mine, do not hesitate to contact me if you have any comments.

All the content and code in this program (except the O21.Game/Translations folder and the fonts, see below) is covered by the MIT license.

This program is designed to use resources of the U-95 game by NIKITA. This project is not affiliated with or endorsed by NIKITA in any way. The project is non-commercial. The source code is available for free and always will be.

This is a blackbox re-implementation project. The code in this project was written based on reading data files and observing the game running. In some cases, the code was written based on specs available on the Internet.

I believe this puts the project in the clear, legally speaking. If someone disagrees, please reach me.

The distribution license of the original game is unknown, so the game has an unclear de jure status. De facto, it is abandonware nowadays.

No assets from the original game are included in this software (though it may allow the user to use any assets downloaded under the user's informed consent).

This software bundles the Inter font, covered by the SIL Open Font License.

This software also bundles the microGM sound font, published under the WTFPL 2.0 license.

Documentation

Acknowledgments

  • Thanks to Nikita Online for making such a great game!
  • Thanks to the OpenSAGE project for some ideas on the wording in the Legal Disclaimers section.

o21's People

Contributors

atomosk avatar ettud avatar evgeny608799 avatar fantoom avatar fornever avatar gsomix avatar kant2002 avatar keterscp avatar sotiredofyours avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

o21's Issues

Level background rendering

Figure out how to read the levels from the .SCR files and render them in-game.

Document the details in docs/resources.md.

Help page: add design

Currently, the Help page looks very dull:
image

We should improve the design of this page somehow. Add a background or maybe draw it in a small frame on top of the main background, I dunno.

Game basics

Before starting Basic gameplay tasks we need to implement basic game architecture in same way Gyges project does.

Advanced gameplay: level progression

When moving to the edge of the screen, the player should be moved to the next level.

Questions:

  1. Do the enemies respawn?
  2. How are they spawned even? Are they on the map? Random? Or what?
  3. How do the level map numbers relate to the actual level placement?
  4. Is there anything beyond level 10? [DATA EXPUNGED]

Game localization modes

We extract certain resources from the original game resource bundle that has them in a mix of languages: all the UI resources are exclusively in English, while all the text resources (menus and help file) are in Russian.

We should introduce a localization mode with at least two languages: Russian and English, with a possibility for the contributors to add more. I propose to do the following:

  • Do not allow overriding and image resources; only translate menus and texts (including Help and About).
  • The translation shouldn't require modifying the original game resources (say, generating a .HLP file). There should be override layers for all the strings.
  • Perhaps we should introduce a light text markup system for the help file, then.

Pass help encoding via a configuration file

Currently, the help file encoding is hard-coded to be 1251 (since it's the only encoding supported by the game resources available to us).

There may exist some other resource packs, so we should allow to override this via the configuration file.

See TODO[#57] when fixing this issue.

Game HUD

Implement the HUD (the bottom bar):
image

Extra style points for adding the O21 logo somewhere near the NIKITA.

Decorative air bubbles

The original game has these tiny air bubbles coming out of the submarine. We should draw them as well.
image

Extract the graphics from the NE files

Most of the game graphics is stored in the 16-bit NE files (.EXE and .DLL).

We should learn to extract the graphics from them, and figure out how to use it: i.e. combine sprites into the animations, and properly apply the transparency effects to them (it looks like the sprites are divided into two parts, one for the sprite body and another one for transparency mask).

For details, see the documentation.

Main Menu

The original game's main menu was implemented as a standard Windows menu bar.

We may choose something simple yet different, such as a bunch of buttons or whatnot.

Help page: add scrolling

Currently, there's a small fragment of the help page that doesn't fit on the main screen.

In the future, it's possible we'll limit the size of the help page even more.

We should add scrolling (mouse wheel and keyboard) to the page.

Draw sprites

We should learn to draw the animated sprites.

Document the results in the docs/resources.md file.

Depends on:

Extract the format library

In the scope of #18, I had to investigate certain details of NE file format.

At some later point, let's extract the library O21.NE to a separate repository and publish it to nuget.org, since it may be useful to other people dealing with 16-bit binaries.

Aside from that, let's also extract the DIB and WinHelp libraries.

  • NE
  • DIB
  • WinHelp
  • MRB and whatnot

Proposed name of the umbrella library: FVNever.Oddities.

WAV sound system

O21 should be able to read the original WAV sound files from the game and play them when required.

Game MIDI support

The game music is stored in a .MID file. We should learn to read it and play. MIDI is known to be open to interpretation, so we should seek for some good MIDI player/library for .NET, I guess?

Document any relevant results in the docs/resources.md.

Basic gameplay: health and collisions

When colliding with walls or enemies, the player should be damaged.

When colliding with the bullets, the enemies should be killed.

See TODO[#26] in the code for the place to handle the bullet collisions.

Menu hotkeys

The original game included two hotkeys in the menu:

  • F2 to start a new game,
  • F3 to pause the game.

We should implement the same.

Oxygen system

Figure out the exact metrics of the oxygen system, implement them.

Splash screen

Implement the reading and drawing of the first game screen:
image

Level reading

We should decypher the data from the level .DAT files.

They seem to be in ASCII, but what does the characters mean?

After researching that, document the format in the docs/resources.md.

Migrate from wmf submodule

In #49, I had to introduce a submodule wmf, to incorporate my fix of papnkukn/wmf#3.

Eventually, after a new version of wmf gets published, we'll need to simply use it and thus remove the submodule.

Don't forget to remove submodules: recursive from CI configuration.

Game pause mode

Original game included pause feature in the main menu.

The pause window was just silently pausing everything on the screen, including the decorative features and animations.

Docs: How to Play Original

To reproduce the original, we'll have to do a fair bit of play testing. We'll need some documentation on running the original game on modern systems.

Auto-downloader of the game files

We should create a simple downloader of the game files (re-upload to archive.org if old-games.ru is unreliable in that regard).

It should tell the user that the game has abandonware state, and the download the files, after the user approval.

Bonus points if it is graphical and embedded into the UI.

We should cache the results and allow the user to provide their own game distribution (and, later, their own graphics packs completely).

O21 logo

Draw the O21 logo. It should be a picture of about 40x40 pixels.

Embed the result in the fifth block of HUD under or above the NIKITA logo.

Game over

Implement the game over mechanism when the player is out of lives.

Game Over screen from the original game:
image

Make sure to eliminate TODO[#32] from the game code.

HUD buttons

We should add the ability to control the submarine using mouse and HUD buttons.

Depends on:

Game About window

We should reproduce the contents of the original game's About dialog.
image

Translation of wrongly decoded messages:

Программирование: Антон Буцев.
Графика: Евгений Харкевич.
Музыка и звуки: Александр Чистяков.

Copyright (c) 1995 Nikita,Ltd.
Все права защищены.

Note the game icon here as well.

I don't think we definitely should extract these lines from the game binary, since the WinAPI dialog structure in the resources may be very hard to work with (though I can see this dialog in the binary resources). Maybe just translate it to English ourselves?

TODO:

  • Present the original About window
  • Add the font license

Help: support bold text style

Game help may include bold fragments, and we currently don't support rendering of these fragments.

We should support it.

See TODO[#56] when looking to fix this issue.

Game Download Location

We need to determine a safe place to download the game.

Is old-games.ru still okay? Or maybe re-upload it to the archive.org?

Improve text rendering

Currently, our text rendering (in places we need text: main menu and help) is pretty awful.

Why?

Because of several problems.

  1. MonoGame doesn't seem to properly handle font kerning (even though it is enabled in our .spritefont, it is clear it is not taken into account when rendering).

  2. We use a weird technique for resizing of the game content.

    We need this because the original game content has a pretty small size, and we currently render it in the original size and then resample it to fit the screen better.

    We uniformly use the same approach for everything we render, and this means the fonts have much worse quality than they could, provided the user's screen size.

  3. I'm not sure what happens with font antialiasing and subpixel antialiasing in MonoGame, but that leads to letters not having good quality.

What can we do?

  1. Render fonts to a separate render target (or directly to the screen), for them to have normal quality.
  2. Investigate antialiasing settings (if any) in MonoGame, and choose the best one.
  3. See this note on using of the multi-channel distance fields (yep, that's a thing!) in MonoGame. There's a couple of accompanying repositories for the note.

Identify the WAV files

We should figure out which of the game WAV files is played when, and document the details in docs/resources.md.

Score system

Figure out how the score is calculated. Implement. Show on the HUD.

Bonus mechanics

There are several types of bonuses in the game.

First of all, let's keep a catalog of them, and gradually implement one by one.

Some of them may affect how player moves and shots, so this will be fun.

Subtasks:

Original Game Resources

Almost all the resources seem to be available either directly in the form of files, or as PE32 resources embedded into game executables and DLLs.

For start, let's enumerate the available data and its formats.

Two-digit live number

In HUDRenderer.fs, there's a question:

DrawTexture(sprites[lives % 10 + 9], 314, 320, WHITE) // what if the number of lives is a two-digit number?

We need to figure out how the original game handled that, and do the same.

Help file

As a historical artifact, the game help file may be interesting, so why not add the ability to read it in the game itself?

Document any notes in the docs/resources.md file.

TODO

  • Read the U95.HLP file (#43)
  • Learn to read the bitmaps from the file
  • Render the help somewhere in the game

New endgame content

Original game is known to have sort of disappointing ending: there's nothing else to go, you are just stuck at certain points of the last level.

We can make better.

@sotiredofyours, @gsomix, any ideas? What could we make?

I am thinking of a boss battle (with "the boss" being a bigger and maybe handmade animated sprite that may swim and throw bombs at you, with a lot of HP and custom behavior).

Any other ideas (like a puzzle stage or somewhat more explorative ending, like a portal to another world or something) are also very appreciated.

Help page: "Back" button

Currently, there's no way back from the Help page. We should add a way to close help and get back to the main menu.

Game loading screen

We should add a game loading screen that will be shown during file downloading and data load.

See also: #13.

When fixing this, look for TODO[#38] in the code.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.