Jump to content



Recommended Posts

I'm a little hesitant if I should start a topic when I'm still about half-way with my project. But I hope this will help me commit my time and maybe get one or two other members interested in going over (parts of) my (asm) code to help me compact it.


This is my first project for the Atari 2600 (or any console to be honest), please be kind.


It's a 'port' (tongue-in-cheek) of Unreal Tournament (needless to say it's barely recognizable), more specifically the Capture the Flag mode. I've named it 'FLUT', with the UT part needing no explanation, and 'flut' being a Dutch equivalent of 'crappy' (albeit without the excremental connotation).


Note: Press either joystick fire trigger to get past the 'company' logo appearing on startup


So far I have added 9 maps very loosely based on original UT99 maps: Command, Coret, Eternal Cave, Face, Gauntlet, Lava Giant, Niven, November and Nucleus. For testing purposes, you can flip through these by pressing/holding SELECT.


Because I haven't yet had time to implement the routines for displaying the (correct) information, both players will be unaware of the weapon they are carrying and the amount of ammo, but they do know their health (first three digits on either side of the screen). Eventually I will add more weapons, each with different capabilities, strengths and weaknesses. Weapons are obtained by picking up the blinking box (you can't now).


To hit your opponent you either have to be in roughly the same horizontal or vertical position. When your health reaches 0 the 'player_dies' action starts, which for now is just 100 frames of frozen you. Do not be alarmed.


My biggest problem is available ROM. I really want my first project to be 4k or less, but I'm already hitting 2.6 or something.



  • Like 1
Link to comment
Share on other sites

The problem with the digits is that I haven't figured out a fast and compact way to generate the 20 bytes of PF0,1 and 2 'masks' needed to cover the correct segments of the digits. My current routine is about 180 bytes of code, 50 bytes of data and runs for 567 cycles which accounts for the blank (vertical) space between the playfield and the digits. I still need to add the code for rendering the two 'ammo' digits, but I was procrastinating because I felt the 4k barrier breathing down my neck.


I'm a bit in the dark with the scanlines, Thomas... I checked some original NTSC games and they come in at ~262 scanlines. I added a 32 WSYNC loop and now FLUT is at 262 too. Are all these scanlines visible? Can I do more coding after these 262 lines or do I need to return to VSYNC immediately?

Link to comment
Share on other sites

Check page 2 of the Stella Programmer's Guide. This should answer some questions. :)


You can vary the sizes a bit, e.g. increase picture display to 200 instead of 192 lines. And reduce vertical blank and overscan areas by 8 lines in total to get back to the total 262 lines.


You can also display a few lines more (or less) in total. Everything between +/-5% should be safe.

Edited by Thomas Jentzsch
Link to comment
Share on other sites

I buckled... caved... surrendered to the ROM-God


There where so many things I still want to implement (weapons, powerups, maps, sound, a title and options screen, animations, etc.) and I realized I probably could do none of them properly if I sticked to my 4k ideals and most-if-not-all-of-them if I split the code in two banks.


I think I've fixed the scanlines during the actual game, the company screen will probably still roll on real hardware, not on Stella. The health points for player 2 are also correctly displayed and both players now have a death action for testing purposes. Player 1 dies and Player 2 gets a 'hologram' powerup.



Link to comment
Share on other sites

  • 2 weeks later...

I reorganized and optimized a lot of the code, started work on the rocket launcher, got a title screen and found a friend willing (and: able) to write the score! (Eventually there will be an explosion animation on missile impact, haven't had the time yet, busy painting stairs)



Link to comment
Share on other sites

It's done in assembly.


Collision detection has been a bit of a struggle... I only allow one player to move horizontally and the other vertically every frame (and vice versa during the next frame). The new X and Y position is converted into a grid location, which is used to retrieve a bit (1 for wall and 0 for floor) from a table. If the new position is on a wall tile (a 1), the move is canceled. This effectively only cancels out either vertical or horizontal movement (because only one of them was allowed) and thus makes it possible to 'slide' along walls by running diagonally against them (or: prevents 'sticking' to walls) with a handful of machine cycles.


I like the players overlapping the playfield too ;) It provides more space to move around.

Link to comment
Share on other sites

Things are slowly falling into place. Now the asm code has some complexity, it starts to feel a bit like programming in a higher language, like there should be classes in there somewhere, but of course it's all macros and JSRs :-D


I included Slocum's music driver in bank 4 and a preliminary intro song by the friend mentioned earlier. Both players start with a Redeemer weapon, for testing purposes naturally (it can be steered, but it is not easy in tight places). The ammo display of player 2 shows the lowest recorded value of the INTIM register right before entering the VBlank-wait routine. It should probably go no lower than $0A, which means I have about 10*64=640 cycles left if in VBlank I'm not mistaken and about 12*76 in overscan.


Still no explosions/splash damage, sorry.


@Thomas: Cycle counts are off again, sorry. They are not stable after I added Slocum's routine, but that may be entirely my fault.



  • Like 1
Link to comment
Share on other sites

@Impaler_26: Thanks for doing that.


Which reminds me... I wasn't completely unhappy about the Unreal logo at first, but a feeling is growing that I should redo it with a 48-pixel sprite technique. This is simply unacceptable :-D

Link to comment
Share on other sites

@Impaler_26: Thanks for doing that.


Which reminds me... I wasn't completely unhappy about the Unreal logo at first, but a feeling is growing that I should redo it with a 48-pixel sprite technique. This is simply unacceptable icon_biggrin.gif


I it looks just Fine to me as its 4 bit graphics and on a machine thats 34 years old so it looks great and I think you should leave it alone as I am already used to it now! ::)

Link to comment
Share on other sites

  • 5 weeks later...

Simple, but functional, options menu



I'm busy fixing the hitscan weapons (single and double enforcers, minigun). To keep things simple they do little damage, but fire fast and through walls (this last one being the 'keeping things simple') :)


Notes on the options:


Game Type

'team' CTF and DM are tournaments of 1-on-1 matches where each player scores points for his/her team.


Pickups Type

- Single and Double Up will give the player a single or double 'weapon upgrade' (one or two 'slots' up).

- TBD (to be determined, naturally).

- With RocketFest, all pickups are rocketlaunchers or, rarely, Redeemers.

- DeltaForce lets playes choose between a minigun or sniper rifle before the match starts, pickups contain only ammo for the selected weapon.

- Redemption: all pickups are Redeemers or players start with Redeemers with infinite ammo.

- No Pickups: see below


Weapon Set

The bio rifle, ripper and pulse gun will be harder to implement faithfully, so I excluded them from the original weapon set. But players may choose to allow them anyway.


Out of Ammo

1 and 2 down are the opposites of Single and Double up. Enforcer always gives the player an enforcer when his/her current weapon is empty and Hectique is an in-joke between some of my friends and me and in it's FLUT incarnation means players start with a random weapon and 1 ammo point. Each time the player fires he/she get's another randomly selected weapon (and 1 ammo point). This is best played without pickups, hence the no pickups option is automatically selected.


Map Rotation

Eventually I hope to include 16 maps.


As soon as I have a working menu and hitscan weapons, I will post an updated version of FLUT here.

Link to comment
Share on other sites

  • 2 weeks later...
  • 1 month later...

A lot of changes since my previous post. Most of them internal and mostly invisible. But UT2600 is quickly progressing towards becoming a 'game'.


Some elements that now work (+) countered by elements that do not work (-):


+ playing tournaments with up to 6 players, either individually or divided into two teams.

- displaying each player's score, so players will have no way of knowing who won the tournament


+ pickups appear randomly on the map

+ players can select the bonus gained by pickups: random weapons, weapon upgrades, rocket launchers etc.

- 'random up' is not yet implemented and other settings may contain bugs


+ music driver reworked to support multiple 'songs'

- there's only one song


+ splash damage (you can take damage from your own rocket when standing too close when they explode)

- only the rocket launcher's splash damage has been correctly balanced. Other weapons may do far too much damage or no damage at all


+ health bonus for up to 399 health points


and many other things


I hope you enjoy this pre-alpha version :)


Do not waste your time reporting bugs yet, there are still way too many bugs I'm currently aware of.





Only player 1 can change the game's settings

Before each match a screen comes up with two colored rectangles beneath a yellow line. Somewhere in the distant future, this screen will display the scores for all players, so you can keep track of who's ahead. Both players need to press the fire button to indicate they are 'ready'. The rectangles will flash a few seconds and the match will begin.

Edited by MLdB
  • Like 1
Link to comment
Share on other sites

+ Players flash (white) when taking damage

+ Random map is chosen for every match (I forgot to enable this in the previous bin, sorry)

+ Flak Cannon has balanced hit and splash damage values.


- Removed the possibility to change the color of the walls every N frames. I decided it took up too much ROM for such a lousy effect.


Started work on optimizing my code to reduce ROM footprint. FLUT is already 450+ bytes 'lighter'.




Next release may have a functioning Sniper Rifle

Link to comment
Share on other sites

Small update, no Sniper Rifle yet.


+ A preview of the (randomly selected) map is shown on the 'match screen'.

+ Players can choose to play a different map than the one randomly selected by pressing L or R

+ Players can withdraw their 'READY' on the match screen (e.g. when they disagree with the other player's choice of map)




Still too many bugs and missing bits to start asking for test reports... but feel free to share insights on the overall game play. I'm curious as to how the game behaves when actually played.

Link to comment
Share on other sites

Working on the score board. Sorting algorithm is in place, now I need to assign scores to various match outcomes. I'm also thinking of making a (separate) map editor (to be named FlutED, naturally) so anyone can modify the 16 maps included in the final game and distribute 'mods' if they like. This feels like an obligation to the UT community :)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Create New...