Skip to content

Tag: game

Mortal Kombat Arcade Cabinet from Arcade1UP

This is the Mortal Kombat Arcade Cabinet from Arcade1UP. It’s a complete arcade machine with a smaller size. Out of the box (and after assembly) this machine can play 3 original Mortal Kombat games:

  • Mortal Kombat (1992)
  • Mortal Kombat II (1993)
  • Ultimate Mortal Kombat 3 (1995)

It comes with everything you need to play the games. It has joysticks for 2 players, embedded screen and sound. It’s powered by a regular power outlet.

Dimensions: This unit (with the raiser at the bottom) weight 58.5 lbs (26.5 kg) and have height of 45.8” (116.33 cm), length of 22.75” (58.78 cm), and width 19″ (48.26 cm). It is said that Arcade1UP machines are 3/4 of the size of a regular arcade cabinet. The riser has length of 20.5″ (52.07 cm), width of 19.75″ (50.17 cm) and height of 13.25″ (33.65 cm). With the raiser, it has a perfect size for me with controls and monitors at the right height. Seating at the stool makes it even more comfortable.

This machine has the Raiden painted on it’s side just like the original MK2 machine. This is probably my favorite thing about this cabinet.

Dog for size comparison. Dog not included.

Gameplay

While this is not an original Midway arcade system board, all gameplay is executed through some form of emulation. You don’t have to deal with any artifacts of emulation or even have to think about it. The machine just works. You turn it on and you are playing Mortal Kombat in a few seconds. No coins. No charging gamepads batteries. No software updates. No DLCs. No cables. No wifi. No where is the TV remote. Just Mortal Kombat one simple power button away from you.

All games are working perfectly. I could not notice any flaws. I’m sure some arcade hard-core enthusiast will find some minor obscure detail that is different from an original coin operated vintage machine but I could not notice any difference.

The emulation is straight forward, there are no filters, no settings, no save states.

This of course uses LCD screen and not a big CRT monitor. The screen is 17″ which is a great size. As everything else, you can’t change brightness, contrasts, or anything. However, I have no problems with the default configurations it came with.

light up marquee

Control deck

The control deck can support up to 2 players. Each player has 7 buttons and a joystick. The start button is wired to the start input and the coin input. So by pressing start is the same as inserting a coin and pressing start. There is a power switch for the whole machine. There is a volume switch with 3 states: mute, medium and high.

The buttons are not great but usable and functional. They have a cheap feeling and don’t make a characteristic click when you press them. However, they work, they submit the input and have the proper size.

The joystick also is functional, clicky and usable but could be of better quality. I like that they use a bat top handle which I find preferable for fight games and is the same type used in the original MK machines.

This one comes with the transparent deck protector to avoid scratches in the deck paint.

It’s a okay control deck. Keep in mind that arcade controls is a whole field for hobbyists with many different brands of joysticks, buttons, and setups. All with very broad price ranges.

Mortal Kombat custom stool

Stool

The Mortal Kombat custom stool is great. I would probably never buy this one by itself but I’m glad I have it now. It has a glossy finish that looks great. It feels great, it’s comfortable and while you cannot adjust the height I found it just perfect for this machine.

Marquee light

This is a great addition to this machine. It really enhances the look and feel of an arcade machine. That is something that I definitely would add to any Arcade1UP machine. It’s just a plastic piece with a light behind it. My only criticism is that the colors of the marquee are a little bit desaturated.

Pricing

I bought this bundle at Costco and it set me back US$ 350. All prices mentioned here are without taxes, fees and shipping. This bundle includes the machine and a custom stool, light up marquee, custom riser, and the arcade cabinet.

These are some current prices for everything individually.

  • MK custom stool: I found it at GameStop for US$ 80.
  • MK light up marquee: I found one at Amazon for US$ 60.
  • MK Arcade1up: you can find it at Walmart for US$ 299.
  • Deck protector: Arcade1UP sell them for around US$ 12.50.
  • MK custom riser: it seems to be exclusive at the moment but you can buy a standard riser at Walmart for US$ 49 and a set stickers at eBay US$ 55 (total US$ 104) or buy a bundle of arcade and riser at Walmart for US$ 379.

Therefore, right now to replicate this Costco bundle elsewhere it would cost US$ 531.50, i.e. US$ 181.50 more than Costco.

However, these prices fluctuate. These units are heavy and large (45.8”H x 22.75”L x 19”W), therefore occupying a lot of shelf space and they are expensive to ship too. So it’s been common to see the prices of them getting lower (examples) and it’s predictable that during Black Friday and holidays they will go lower again. However, in my personal experience these deals sell fast and I have made several unsuccessful trips trying to get one for a lower price.

Also, let’s keep some things in perspective here for price. First, a real Mortal Kombat II arcade machine is much more expensive, starting from around US $1000. Second, Costco is a paid membership based store. If you are comparing prices keep in mind that you can’t buy at Costco without a membership (starting at US$ 60).

Assembly

The pieces themselves are well labeled with codes. However, the boxes didn’t have any labels. After you open all the boxes and found all the pieces, the assembly can go smoothly. The process is almost the same to assemble an IKEA furniture.

These were some of the problems I faced during the assembly:

  • The pictures for the monitor in the manual did not match the real monitor. That’s because the manual is generic for all machines but machines are slightly different.
  • One package of screws was mislabeled.
  • There was misalignment when mounting the screen piece to the cabinet. That was the only hard part of the assembly.
  • The back panel was missing the screw holes to align to the screw holes inside.
Fore reference, here is the Arcade1UP complete assembly manual.

Secret Menu

You have to do this when the machine is in demo mode inside one of the games. With Player 1, hold the buttons RUN + BLOCK. With player 2, hold the buttons JUMP (UP) + LOW PUNCH + HIGH KICK + START (player 2). Hold them all for 5 seconds.

You are now in the Test Menu. Here you can run tests and change settings such difficulty and volume. This is not an Arcade1UP menu, it’s the original test menu from the arcade games. This was supposed to be used by the arcade owner (and not the arcade player) to change settings, reset high scores, see statistics and change prices.

Conclusion

This product has a limited scope and great execution. It’s a simple machine that does one thing and it does it well: retro arcade Mortal Kombat. It has a sweet point of compromise between an humongous original arcade and a convenient little console while keeping all the characteristics that it feel like an original arcade experience.

Arcade1UP machines

Arcade1UP has a great product but they are iterating very well. They started with older titles and are now expanding for some other franchises. They are also experimenting with different arcade types. I hope they keep improving the quality of their products.

While there are ports or emulation of MK 1-3 on pc and modern devices you just can’t emulate the feeling of playing with an arcade machine with all colors, lights, and size. This is a device for someone for is seeking this feeling.

And while I like Mortal Kombat and this machine, the main reason I bought it was to use it as base for further enhancements and modifications. I’m replacing all button, joysticks, lights, computer, and who knows what more. I will transform this machine into a multi-arcade beast with my favorite games.

Python Fast XML Parsing

Here is a useful tip on Python XML decoding.

I was extending xml.sax.ContentHandler class in a example to decode maps for a Pygame application when my connection went down and I noticed that the program stop working raising a exception regarded a call to urlib (a module for retrieve resources by url). I noticed that the module was getting the remote DTD schema to validate the XML.

<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">

This is not a requirement for my applications and it’s a huge performance overhead when works (almost 1 second for each map loaded) and when the applications is running in a environment without Internet it just waits for almost a minute and then fail with the remain decoding. A dirty workaround is open the XML file and get rid of the line containing the DTD reference.

But the correct way to programming XML decoding when we are not concerned on validate a XML schema is just the xml.parsers.expat. Instead of using a interface you just have to set some callback functions with the behaviors we want. This is a example from the documentation:

import xml.parsers.expat
 
# 3 handler functions
def start_element(name, attrs):
    print 'Start element:', name, attrs
def end_element(name):
    print 'End element:', name
def char_data(data):
    print 'Character data:', repr(data)
 
p = xml.parsers.expat.ParserCreate()
 
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data
 
p.Parse("""<?xml version="1.0"?>
<parent id="top"><child1 name="paul">Text goes here</child1>
<child2 name="fred">More text</child2>
</parent>""", 1)

The output:

Start element: parent {'id': 'top'}
Start element: child1 {'name': 'paul'}
Character data: 'Text goes here'
End element: child1
Character data: '\n'
Start element: child2 {'name': 'fred'}
Character data: 'More text'
End element: child2
Character data: '\n'
End element: parent

Pygame: Running Orcs

Here is a Pygame Sprite animation using the approach presented by Joe Wreschnig and Nicolas Crovatti. It’s not yet exactly what I need but is very suitable.

import pygame, random
from pygame.locals import *
 
class Char(pygame.sprite.Sprite):
	x,y = (100,0)
	def __init__(self, img, frames=1, modes=1, w=32, h=32, fps=3):
		pygame.sprite.Sprite.__init__(self)
		original_width, original_height = img.get_size()
		self._w = w
		self._h = h
		self._framelist = []
		for i in xrange(int(original_width/w)):
			self._framelist.append(img.subsurface((i*w,0,w,h)))
		self.image = self._framelist[0]		
		self._start = pygame.time.get_ticks()
		self._delay = 1000 / fps
		self._last_update = 0
		self._frame = 0
		self.update(pygame.time.get_ticks(), 100, 100)	
 
	def set_pos(self, x, y):
		self.x = x
		self.y = y
 
	def get_pos(self):
		return (self.x,self.y)
 
	def update(self, t, width, height):
		# postion
		self.y+=1
		if(self.y>width):
			self.x = random.randint(0,height-self._w)
			self.y = -self._h
 
		# animation
		if t - self._last_update > self._delay:
			self._frame += 1
			if self._frame >= len(self._framelist):
				self._frame = 0
			self.image = self._framelist[self._frame]
			self._last_update = t
 
SCREEN_W, SCREEN_H = (320, 320)
 
def main():
	pygame.init()
	screen = pygame.display.set_mode((SCREEN_W, SCREEN_H))
	background = pygame.image.load("field.png")
	img_orc = pygame.image.load("orc.png")
	orc = Char(img_orc, 4, 1, 32, 48)
	while pygame.event.poll().type != KEYDOWN:
		screen.blit(background, (0,0))
		screen.blit(orc.image,  orc.get_pos())
		orc.update(pygame.time.get_ticks(), SCREEN_W, SCREEN_H)
		pygame.display.update()
		pygame.time.delay(10)
 
if __name__ == '__main__': main()

Here is it working:

Uptade: I put this source and images at the OpenPixel project in Github

Pygame, Simple Space Effect

This is a simple space effect of sliding stars using Pygame.

Direct link to video: simple_space_effect_01.ogv

We set some constants like the screen size and the number N of star we want.

N = 200
SCREEN_W, SCREEN_H = (640, 480)

Using list comprehension we create a list of random points in the screen, that will be our stars. The size of this list is N.

stars = [
  [random.randint(0, SCREEN_W),random.randint(0, SCREEN_H)]
  for x in range(N)
]

Each star is represented by one tuple on the stars list. The first star is on stars[0] and is a touple with [x, y] positions.

At each step from the game loop we draw and update the position of each star. A star is draw as a white line of one pixel. See the pygame.draw.line doc.

for star in stars:
  pygame.draw.line(background,
    (255, 255, 255), (star[0], star[1]), (star[0], star[1]))
  star[0] = star[0] - 1
  if star[0] < 0:
      star[0] = SCREEN_W
      star[1] = random.randint(0, SCREEN_H)

In this example we update the position of a star by decreasing its horizontal position. When the horizontal position is less than zero, it’s not displayed on the screen anymore so we replace its horizontal position (star[0]) by the screen width (SCREEN_W) and the vertical position (star[1]) by a new random position. This will be like create a new star and guarantee always a different pattern of sliding stars.

The complete code:

#!/usr/bin/env python
 
# A simple effect of sliding stars to create a deep space sensation.
# by Silveira Neto <me@silveiraneto.net>
# Free under the terms of GPLv3 license
# See http://silveiraneto.net/2009/08/12/pygame-simple-space-effect/
 
import os,sys,random
import pygame
from pygame.locals import *
 
# Constants 
N = 200
SCREEN_W, SCREEN_H = (640, 480)
 
def main():
	# basic start
	pygame.init()
	screen = pygame.display.set_mode((SCREEN_W,SCREEN_H))
	pygame.display.set_caption('Simple Space Effect by Silveira Neto')
 
	# create background
	background = pygame.Surface(screen.get_size())
	background = background.convert()
 
	# generate N stars
	stars = [
		[random.randint(0, SCREEN_W),random.randint(0, SCREEN_H)]
		for x in range(N)
	]
 
	# main loop
	clock = pygame.time.Clock()
	while 1:
		clock.tick(22)
		for event in pygame.event.get():
			if event.type == QUIT:
				return
			elif event.type == KEYDOWN and event.key == K_ESCAPE:
				return
		background.fill((0,0,0))
		for star in stars:
			pygame.draw.line(background,
				(255, 255, 255), (star[0], star[1]), (star[0], star[1]))
			star[0] = star[0] - 1
			if star[0] < 0:
				star[0] = SCREEN_W
				star[1] = random.randint(0, SCREEN_H)
		screen.blit(background, (0,0))
		pygame.display.flip()
 
if __name__ == '__main__': main()

My Free Tileset, version 10

My laptop broke and I lose the newest versions of some of my drawing. Fortunately I had backups for most of them. I found out that I had not published the 10th version yet. Here it is.

pixelart free tileset version 10

As usual is just little improvements over the last version. This time I added some geography elements. It’s now possible to create little levels and simple island.

My Free Charset version 3, one quadrillion of new chars

We Are Hiring

Tons of new chars. I’ll not release them individually anymore because now I’m using just one XCF multilayer Gimp file that permits create  of new char combinations, so I’ll be releasing this file instead.

gimp screenshot

Mathematically, let’s assume I have just one layer. This permits create just one character (the nude one), ok? Each new layer I create, earrings as example, permits me create all chars I have done before with and without those earrings. That’s 2 times what we had before. With N layers I can create 2n different chars (2n-1? No, a char made of no layers can be the invisible man:)). We have now about 50 layers so we can create more than one quadrillion different combinations of chars. :o

Here’s the XCF Gimp file, chars.xcf (430Kb). To open and edit it you need the Gimp editor (The GNU Image Manipulation Program, download it here).

It’s also easier for you create your owns characters (try create yourself) or add hats, accessories, cloths, etc. Our My next step is write it to be programmability done with the same idea.