tag:blogger.com,1999:blog-76049800451223759462024-03-18T21:08:25.340-07:00Retrogame Deconstruction ZoneRetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.comBlogger103125tag:blogger.com,1999:blog-7604980045122375946.post-60919172869398633222021-08-04T20:21:00.005-07:002021-08-05T11:43:26.029-07:00The Tennis for Two Simulator (TeTS)<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Tennis for Two</title>
<style>
* { padding: 0; margin: auto; }
canvas { background: #616161; display: block; margin: auto; }
#mytext
{
padding-top:100vh;
}
</style>
</head>
<body>
<canvas id="game" width=800px height=500px></canvas>
<script>
var useImages=1;
var canvas=document.getElementById("game");
var ctx=canvas.getContext("2d");
if (window.innerWidth<770) {
ctx.canvas.width=window.innerWidth;
ctx.canvas.height=window.innerWidth*5/8
}
var scaleOverall=canvas.width/800
var widthFull=ctx.canvas.width
var panelFraction=0
var controlsFraction=0.35
var panelWidth=panelFraction*widthFull
var controlsHeight=controlsFraction*canvas.height
var screenWidth=(1-panelFraction)*widthFull
var screenHeight=(1-controlsFraction)*canvas.height
var nPersist=300
var nOversample=3
let xpos = new Array(nPersist).fill(0)
let ypos = new Array(nPersist).fill(0)
let spotBrights = new Array(nPersist).fill(0)
let spotSizes = new Array(nPersist).fill(0)
let spotTimes = new Array(nPersist).fill(0)
var intervalTime=28
var fadeScale1=75
var fadeScale2=350
var ballImage=new Array(2)
var interval=0
// Parameters
var x=0
var y=0
var vx=0
var vy=0
var x_old=0
var y_old=0
var computerPosition=0
var ballAngle=0
// Constants
var ballRadius = 4;
var g=0.12
var RCoeff=0.8;
var airCoeff=0.00095;
var ballDisplaySize=2
var vHit=10
var reactionTime=750
var coeffAIX=0
var coeffAIY=Math.PI/8
var computerServeWaitTime=600
var ballAngleTime=40
var ballScaleFactor=1.0
var scaleChangeTime=100
ballInterval=setInterval(changeBallAngle,ballAngleTime)
scaleInterval=setInterval(changeBallScaleFactor,scaleChangeTime)
// Court dimensions
var courtWidth=screenWidth*0.7
var netHeight=courtWidth*0.07
var groundY=0.8*screenHeight
var netX=panelWidth+screenWidth/2
// On-off switch
var switchDisplaySize=0.5
var switchX=0.97*widthFull
var switchY=screenHeight+0.25*controlsHeight
// Buttons
var buttonX=[0.375*widthFull,0.875*widthFull]
var buttonY=[canvas.height-controlsHeight/2,canvas.height-controlsHeight/2]
var buttonActive=new Array(buttonX.length).fill(0)
var buttonDistance=new Array(buttonX.length).fill(0)
var buttonDisplaySize=new Array(buttonX.length).fill(0.6)
// Labels
var labelText=['2P','CPU']
var labelX=[widthFull*0.95,widthFull*0.95]
var labelY=[screenHeight+0.17*controlsHeight,screenHeight+0.37*controlsHeight]
var labelSize=['16','16']
var labelSize2=['14','14']
var labelColor=new Array(labelX.length).fill('black')
// Knobs
var knobX=[0.15*canvas.width,0.65*canvas.width]
var knobY=[screenHeight+controlsHeight/2,screenHeight+controlsHeight/2]
let knobAngle = [0,0]
let knobActive = new Array(knobX.length).fill(0)
let knobNominal = [0,0]
let knobDisplaySize = new Array(knobX.length).fill(0.65)
let knobFactor = [1,1]
var knobZero=[0,0]
var knobImageAngle=0
var knobSensitivity = new Array(knobX.length).fill(0.01)
var knobAngleMin = [-Math.PI/2,-Math.PI/2]
var knobAngleMax = [Math.PI/2,Math.PI/2]
var angleLimits=[Math.PI/4,Math.PI/2]
var knobAngleIncrement=Math.PI/32
// States
var switchState=0
startedGame=0
var buttonState=new Array(buttonX.length).fill(0)
var courtHit=0
var playerServe=2
var ballVisible=0;
var ballHit=0
var netHit=0
var ballActive=0;
var touchLifted=1;
var shownElement=0;
// Sizes
var ballSize=new Array(2)
ballSize[0]=[19,17]
ballSize[1]=[2,2]
var switchSize=[45,112]
var buttonSize=[93,103]
var courtSize=[167,13]
var knobSize=[163,163]
var frameSize=[547,465]
var panelSize=[400,175]
//Click Distances
var knobClickDistance=knobSize[0]*knobDisplaySize[0]/2*scaleOverall
var buttonClickDistance=buttonSize[0]*scaleOverall*buttonDisplaySize[0]
var switchClickDistance=switchSize[0]*scaleOverall*switchDisplaySize
//Sounds
shotNoises=new Array(6)
shotNoises[0]=new Audio('https://drive.google.com/uc?export=download&id=1NztHEAzBUD3yA4-ploC7nY1BLIvXPrjs')
shotNoises[1]=new Audio('https://drive.google.com/uc?export=download&id=1Z2G2_Do55PZxPav4-fbKa51MmBm1YpTx')
shotNoises[2]=new Audio('https://drive.google.com/uc?export=download&id=1eoJSRsJpG4QcCoTV4h4HZPFIgeRMXaNk')
shotNoises[3]=new Audio('https://drive.google.com/uc?export=download&id=1ihrCrH_qE1bkvwIco0HR5kCa-NyZqER8')
shotNoises[4]=new Audio('https://drive.google.com/uc?export=download&id=1mdsnoiReCyAJfwtXLmwoDFpBAR66ezy4')
shotNoises[5]=new Audio('https://drive.google.com/uc?export=download&id=1P0cfUV3DwV7zKbse_qXbqHmUPFh16oHi')
document.addEventListener("mousedown",mouseDownHandler, false);
document.addEventListener("mousemove",mouseMoveHandler, false);
document.addEventListener("mouseup",mouseUpHandler, false);
document.addEventListener("keydown",keyDownHandler, false);
document.addEventListener("touchstart",touchDownHandler, false);
document.addEventListener("touchend",touchUpHandler, false);
function imposeLimits(limitedValue,minLimit,maxLimit) {
if (limitedValue<minLimit) {
return minLimit
} else if (limitedValue>maxLimit) {
return maxLimit
} else {
return limitedValue
}
}
function getTouchPos(cvas, evt) {
var rect = cvas.getBoundingClientRect();
return {
x: evt.touches[0].clientX-rect.left,
y: evt.touches[0].clientY-rect.top
}
}
function getMousePos(cvas, evt) {
var rect = cvas.getBoundingClientRect();
return {
x: evt.clientX-rect.left,
y: evt.clientY-rect.top
}
}
function drawImage(drawContext,img,xi,yi,scalei,anglei) {
var vxi = Math.cos(anglei)*scalei;
var vyi = Math.sin(anglei)*scalei;
var imH = -(img.height/2);
var imW = -(img.width/2);
xi+=imW*vxi+imH*-vyi;
yi+=imW*vyi+imH*vxi;
drawContext.setTransform(vxi,vyi,-vyi,vxi,xi,yi);
drawContext.drawImage(img,0,0);
drawContext.setTransform(1,0,0,1,0,0);
}
function touchUpHandler(e) {
e.preventDefault()
touchLifted=1;
for (let i=0;i<buttonX.length;i++) {
buttonActive[i]=0
}
}
function touchDownHandler(e) {
e.preventDefault()
if (touchLifted==1) {
touchLifted=0
touchpos=getTouchPos(canvas,e)
checkKnobAction(touchpos)
checkSwitchAction(touchpos)
checkButtonAction(touchpos)
}
}
function mouseUpHandler(e) {
e.preventDefault()
for (let i=0;i<buttonX.length;i++) {
buttonActive[i]=0
}
draw()
}
function mouseMoveHandler(e) {
e.preventDefault()
mousepos=getMousePos(canvas,e)
for (let i=0;i<knobX.length;i++) {
if (knobActive[i]==1) {
knobAngle[i]=knobNominal[i]+(mousepos.x-knobX[i])/canvas.width*6
}
}
}
function mouseDownHandler(e) {
e.preventDefault()
mousepos=getMousePos(canvas,e)
checkKnobAction(mousepos)
checkButtonAction(mousepos)
checkSwitchAction(mousepos)
}
function keyDownHandler(e) {
if (e.keyCode==83) {
buttonAction(0)
}
if (e.keyCode==88) {
knobAngle[0]+=knobAngleIncrement
knobNominal[0]=knobAngle[0]
}
if (e.keyCode==90) {
knobAngle[0]-=knobAngleIncrement
knobNominal[0]=knobAngle[0]
}
if (e.keyCode==191) {
knobAngle[1]+=knobAngleIncrement
knobNominal[1]=knobAngle[1]
}
if (e.keyCode==190) {
knobAngle[1]-=knobAngleIncrement
knobNominal[1]=knobAngle[1]
}
if (e.keyCode==186) {
buttonAction(1)
}
}
function checkKnobAction(actionPosition) {
for (let i=0;i<knobX.length;i++) {
knobDistance=Math.sqrt(Math.pow(knobX[i]-actionPosition.x,2)+Math.pow(knobY[i]-actionPosition.y,2))
if (knobDistance<knobClickDistance && knobActive[i]==0) {
knobDisplaySize[i]*=0.95
knobActive[i]=1
} else {
if (knobActive[i]==1) {
knobDisplaySize[i]/=0.95
knobNominal[i]=knobAngle[i]
}
knobActive[i]=0
}
}
}
function checkSwitchAction(actionPosition) {
switchDistance=Math.sqrt(Math.pow(switchX-actionPosition.x,2)+Math.pow(switchY-actionPosition.y,2))
if (switchDistance<switchClickDistance) {
switchState=(switchState+1)%2;
}
}
function checkButtonAction(actionPosition) {
for (let i=0;i<buttonX.length;i++) {
buttonDistance[i]=Math.sqrt(Math.pow(buttonX[i]-actionPosition.x,2)+Math.pow(buttonY[i]-actionPosition.y,2))
if (buttonDistance[i]<buttonClickDistance && buttonActive[i]==0) {
buttonActive[i]=1
buttonAction(i)
}
}
}
function buttonAction(buttonNumber) {
if (ballVisible==0) {
ballVisible=1
prepareServe(1)
clearInterval(interval)
interval=setInterval(draw,intervalTime)
} else if (((buttonNumber==0 && x<netX) || (buttonNumber==1 && x>=netX)) && ballHit==0) {
if (netHit==0) {
hitBall(buttonNumber)
if (buttonNumber==0) {
computerPosition=netX+courtWidth/4+(Math.random()-0.4)*courtWidth*0.45
}
}
}
}
function gameReset() {
ballVisible=0
}
function draw() {
ctx.clearRect(panelWidth,0,canvas.width,screenHeight)
drawControls()
drawCourt()
if(y+vy>groundY-ballRadius) {
vy=-vy*RCoeff;
courtHit=1
}
for (let i=0;i<xpos.length; i++) {
brightness=getBeamFade(spotTimes[i],fadeScale1)*spotBrights[i]
drawBall(xpos[i],ypos[i],brightness,0);
}
for (let i=0;i<xpos.length; i++) {
brightness=getBeamFade(spotTimes[i],fadeScale2)
drawBall(xpos[i],ypos[i],brightness,1);
}
x_old=x
y_old=y
if (ballActive==1) {
vy += g-airCoeff*Math.pow(vy,2)*Math.sign(vy);
vx += -airCoeff*Math.pow(vx,2)*Math.sign(vx);
x += vx*scaleOverall;
y += vy*scaleOverall;
}
if (y>groundY-ballRadius) {
y=groundY-ballRadius
}
for (let i = 0; i<xpos.length-nOversample; i++) {
xpos[i]=xpos[i+nOversample]
ypos[i]=ypos[i+nOversample]
spotBrights[i]=spotBrights[i+nOversample]
spotSizes[i]=spotSizes[i+nOversample]
spotTimes[i]=spotTimes[i+nOversample]+intervalTime
}
for (let i=0;i<nOversample;i++) {
xpos[xpos.length-1-i]=x_old+(x-x_old)*(nOversample-i)/nOversample
ypos[xpos.length-1-i]=y_old+(y-y_old)*(nOversample-i)/nOversample
spotBrights[nPersist-1-i]=0.6
spotSizes[nPersist-1-i]=1
spotTimes[nPersist-1-i]=i/nOversample*intervalTime
}
checkBoundaries()
if (switchState==0) {
checkComputer()
}
shownElement=(shownElement+1)%3
}
function checkComputer() {
if (x>netX && Math.abs(x-computerPosition)<vx*1.05) {
let angle=Math.PI*0.3-(x-netX)/courtWidth*coeffAIX+(groundY-y)/netHeight*coeffAIY
if (groundY-y>2*netHeight) {
angle=Math.PI/2
}
convertToKnobAngle(angle)
if (groundY-y<5*netHeight*(1-(x-netX)/courtWidth*1.6) || courtHit==1) {
hitBall(1)
}
courtHit=0
netHit=0
computerPosition=0
}
}
function checkBoundaries() {
if ((x-panelWidth-screenWidth/2>courtWidth/2)) {
if (courtHit==1 || netHit==1) {
playerServe=1
} else {
playerServe=2
}
netHit=0
courtHit=0
prepareServe(playerServe)
}
if (ballHit==1 && Math.abs(x-netX)<Math.abs(vx)) {
ballHit=0
}
if ((Math.abs(x-netX)<Math.abs(vx) && y+vy>groundY-netHeight && netHit==0)) {
vx=-vx
netHit=1
}
if ((x-panelWidth-screenWidth/2<-courtWidth/2)) {
if (courtHit==1 || netHit==1) {
playerServe=2
} else {
playerServe=1
}
courtHit=0
netHit=0
prepareServe(playerServe)
}
}
function drawControls() {
ctx.clearRect(0,canvas.height-controlsHeight,canvas.width,canvas.height);
drawImage(ctx,panelImage,widthFull/4,canvas.height-controlsHeight/2,scaleOverall,0)
drawImage(ctx,panelImage,widthFull/4*3,canvas.height-controlsHeight/2,scaleOverall,0)
ctx.strokeStyle='black'
ctx.beginPath()
ctx.lineWidth=5
ctx.moveTo(canvas.width/2,canvas.height-controlsHeight)
ctx.lineTo(canvas.width/2,canvas.height)
ctx.closePath()
ctx.stroke()
drawButtons()
drawKnobs()
drawSwitch()
drawLabels()
}
function drawLabels() {
for(let i=0;i<labelX.length;i++) {
if (canvas.height<400) {
fontString=labelSize2[i].concat('px Courier New')
} else {
fontString=labelSize[i].concat('px Courier New')
}
ctx.font = fontString
ctx.strokeStyle = labelColor[i]
ctx.textAlign = 'right';
ctx.lineWidth = 1
ctx.strokeText(labelText[i],labelX[i],labelY[i])
ctx.stroke()
}
}
function drawKnobs() {
for (let i=0;i<knobX.length;i++) {
drawKnob(i)
}
}
function getBeamFade(time,fadescale) {
expFactor=Math.exp(-time/fadescale)
return expFactor
}
function drawNet() {
}
function drawCourt() {
if (useImages==1) {
ctx.globalAlpha=Math.random()*0.2+0.8
drawImage(ctx,courtImage,panelWidth+screenWidth/2,groundY-netHeight/2,courtWidth/courtSize[0],0)
ctx.globalAlpha=1
} else {
ctx.strokeStyle='rgb(155.2,155.0,155.6)'
ctx.beginPath()
ctx.moveTo(panelWidth+0.5*(screenWidth-courtWidth),groundY)
ctx.lineTo(panelWidth+0.5*screenWidth+0.5*courtWidth,groundY)
ctx.closePath()
ctx.stroke()
ctx.beginPath()
ctx.moveTo(panelWidth+0.5*screenWidth,groundY)
ctx.lineTo(panelWidth+0.5*screenWidth,groundY-netHeight)
ctx.closePath()
ctx.stroke()
}
}
function drawSwitch() {
if (switchState==0) {
drawImage(ctx,switch2Image,switchX,switchY,scaleOverall*switchDisplaySize,0)
} else {
drawImage(ctx,switch1Image,switchX,switchY,scaleOverall*switchDisplaySize,0)
}
}
function drawKnobs() {
for (let i=0;i<knobX.length;i++) {
knobAngle[i]=imposeLimits(knobAngle[i],knobAngleMin[i],knobAngleMax[i])
drawImage(ctx,knobImage,knobX[i],knobY[i],scaleOverall*knobDisplaySize[i],knobAngle[i]+knobImageAngle)
}
}
function drawButtons() {
for (let i=0;i<buttonX.length;i++) {
if (buttonActive[i]==0) {
drawImage(ctx,button2Image,buttonX[i],buttonY[i],scaleOverall*buttonDisplaySize[i],0)
} else {
drawImage(ctx,button1Image,buttonX[i],buttonY[i],scaleOverall*buttonDisplaySize[i],0)
}
}
}
function changeBallAngle() {
ballAngle=Math.random()*Math.PI*2
}
function drawBall(pX,pY,brightness,ballNum) {
if (ballVisible==1) {
ctx.globalAlpha=brightness
if (useImages==1) {
drawImage(ctx,ballImage[ballNum],pX,pY,ballDisplaySize*scaleOverall*ballScaleFactor,0)
} else {
if (ballNum==0) {
ctx.fillStyle='white'
} else {
ctx.fillStyle='green'
}
ctx.beginPath()
ctx.moveTo(pX,pY)
ctx.arc(pX,pY,ballRadius,0,Math.PI*2)
ctx.closePath()
ctx.fill()
}
ctx.globalAlpha=1
}
}
function convertToKnobAngle(angle) {
knobAngle[1]=(angle-angleLimits[0])*Math.PI/(angleLimits[1]-angleLimits[0])-Math.PI/2
knobNominal[1]=knobAngle[1]
}
function computerServe() {
angle=Math.PI*0.35*(1+Math.random()*0.4)
convertToKnobAngle(angle)
hitBall(1)
computerPosition=0
}
function changeBallScaleFactor() {
ballScaleFactor=2.0*(0.5-Math.random()*0.1)
}
function prepareServe(player) {
y=groundY-netHeight*1.25
x = panelWidth+0.5*(screenWidth-courtWidth)+0.08*courtWidth+(player-1)*0.84*courtWidth
ballActive=0
vx=0
vy=0
if (player==2 && switchState==0) {
setTimeout(computerServe,computerServeWaitTime)
}
}
function hitBall(player) {
if (ballVisible==1) {
angle=(knobAngle[player]+Math.PI/2)/Math.PI*(angleLimits[1]-angleLimits[0])+angleLimits[0]
vx=-vHit*Math.sin(angle)*(player*2-1)
vy=-vHit*Math.cos(angle)
ballActive=1
ballHit=1
let noise=Math.floor(Math.random()*shotNoises.length)
shotNoises[noise].play()
netHit=0
courtHit=0
}
}
function loadSprites() {
ballImage[0]=new Image();
ballImage[0].src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsd-s98mcUNu-NI8j3cStPl96eiymUn_8d7IDsGzSCHv8R0aWhLLMShsQXqlL_wKHgcs7468F9Z9RwJxhfpLgXbZHa3cHu4nnkQJIszMM-vPc-e7aR2mNwgJV08UW1NGm2-lZj_f34UVBX/s17/ball_large_2.png"
ballImage[0].onload = function () {
gameReset()
}
ballImage[1]=new Image();
ballImage[1].src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2LJ_T8wR5Ay46bIaQxWlN3e0wG2bFTUEetM1w0tM-YGLpUntHBJhSoHu1b7jmQHK1PfwOEWW2vRBsI22rqF-xo8-ly34vCQNM2ZazARUSCIYSMC3AkJnMz7cG-NZBX55GM3OSOs18jM8B/s2/ball_small.png"
ballImage[1].onload = function () {
draw()
}
panelImage=new Image(panelSize[0],panelSize[1]);
panelImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQPIIO2-bXzx8sUSwksbEuSxVOmFnj_hss6CzR615Gn2TNTsWQYVPOS_DKxI6lRet8uU0PQSaLT8nIKOCOjTeI4oK_8QlhpDR5tLCt4L4DVCaEOyxUBiQ2pSgj85mosib8QgkZs8w5dePz/s397/controlsPanel.png"
panelImage.onload = function () {
draw()
}
knobImage=new Image(knobSize[0],knobSize[1]);
knobImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM7hh92FrZASWyE0FG4bj5hF0MJS_19hxBaCkcqu9lv1JJxo2rFrnsBcDNCbrZ1nIL6TcNo_LZXHfXMkdtSLqqSyVkFV4YsaKbhyphenhyphenjnFQTf23y1oEbQfJKucSCNBr0cf9LxywVhF04q8TCb/s163/knob_cut.png"
knobImage.onload = function () {
draw()
}
courtImage=new Image(courtSize[0],courtSize[1]);
courtImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdshmBbomsUL60vcPj-K9iT680p1x2Bz9CxWras62pqmt-yhAyqnq67g8Uzr2NDmXN8JUQ-cA09ryeXnAazcxdZN3JD08CJpsAi05diVcO3FyW4AEQixPso_CNE25ZYESP32BOJ4uqEV1w/s167/court.png"
courtImage.onload = function () {
draw()
}
netImage=new Image(courtSize[0],courtSize[1]);
netImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdshmBbomsUL60vcPj-K9iT680p1x2Bz9CxWras62pqmt-yhAyqnq67g8Uzr2NDmXN8JUQ-cA09ryeXnAazcxdZN3JD08CJpsAi05diVcO3FyW4AEQixPso_CNE25ZYESP32BOJ4uqEV1w/s167/court.png"
netImage.onload = function () {
draw()
}
switch1Image=new Image(switchSize[0],switchSize[1]);
switch1Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6n8eWMtpfTlF7wyqui5MTeI4uVNLBvczcg1_C17_YdxuVQQ9evhGhegPshuTSwNWbrv5kL_jE9PksGlM2zWj_W1P6SZRkXJGgbIUF9wXl6Er8bTiCXP8uou9AR7IUWrt-Wn4xhXLz4S5J/s112/switch1.png"
switch1Image.onload = function () {
draw()
}
switch2Image=new Image(switchSize[0],switchSize[1]);
switch2Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiasskFQ9CmS1oStOkUlpE1xWZPjEhU93VJnlS66ibOCA2NnkHrV4j0QkDe6xWSd76Iao-41KQ_gSQ5_c671hZBAvEtbwDbGale4pE-3donvQMfy8RP1t9ebUoNf_cd15COgnrTSbQ8fXqX/s112/switch2.png"
switch2Image.onload = function () {
draw()
}
button1Image=new Image(buttonSize[0],buttonSize[1]);
button1Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpEIKpdm9eUWmY6UwKPL2U7epa9q9RtTsAvrU3nGbGRRJXaOC6YZyUJ6MAjBbHx-0Ze-lJ8VzXuWnATaZindkXyUDfcAjkTClMQNs0_NLQCjCCH6rWWlbf55EiN6Ed5Z2Ey-U6h45WT_or/s103/radiobutton1.png"
button1Image.onload = function () {
draw()
}
button2Image=new Image(buttonSize[0],buttonSize[1]);
button2Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK66T7heDZPFZNpweiOJ-V5V3-Vt_E3xnrxM80zCXCtV0g-WtvOuxn0GoDIj3o43eCLZIJ1YHlPouVmVPpvtJH5hvepl4swENKPV8QLARPMwu7tSUVJC2Bj62XQF9Cl1ktTLx4rRJ-9njK/s103/radiobutton2.png"
button2Image.onload = function () {
draw()
}
frameImage=new Image(frameSize[0],frameSize[1]);
frameImage.src=""
frameImage.onload = function () {
draw()
}
}
loadSprites()
</script>
<br>
The Tennis for Two Simulator (TeTS) has two modes: player vs. CPU and player vs. player. You can alternate between them with the switch on the righthand controller.
<br><br>
First, click on one of the two silver buttons to make the ball to appear.
<br><br>
If playing CPU mode, click on the dial on the lefthand controller. This dial controls the angle of the ball when hit. Once clicked, the dial can be rotated by moving the mouse to the left and right. When you're ready, press the s key on the keyboard to serve the ball over the net. You can hit the ball again as soon as it crosses over to your side of the net, continuing to use the mouse to aim and s key to hit. Note that if you click the mouse while the dial is active, you will have to click the dial again to reactivate angle control.
<br><br>
2P mode is controlled differently, and just uses the keyboard. The left player hits the ball with the s key and can adjust the angle incrementally left/right using the x/z keys. The right player uses the ";", ".", and "/" keys, respectively.
<br><br>
The game will not keep score for you, but the outcome of a point determines who serves the next point. If you hit on the opponent's side of the court and they fail to return it, you get the serve. If you hit the net or hit the ball out of bounds before it hits your opponent's court, your opponent gets the serve.
<br><br>
<h3><b>History</b></h3>
<br>
Tennis for Two was originally run on a vacuum tube analog computer in 1958, where it was demoed as part of an exhibition at the Brookhaven National Laboratory. William Higinbotham designed it based on a bouncing ball program, likely similar to the <a href="http://www.retrogamedeconstructionzone.com/2021/07/the-whirlwind-bouncing-ball-simulator.html">Whirlwind Bouncing Ball</a>. His intention was to demonstrate to the public the computer's "relevance to society".
<br><br>
At the time, Higinbotham thought that the game didn't warrant special attention beyond the exhibition, but history has come to view it quite differently. Many people now consider it the first video game. For more on the game's history, see the <a href="https://www.bnl.gov/about/history/firstvideo.php">Brookhaven National Laboratory website</a>.
<br><br>
<h3><b>The TeTS components</b></h3>
<br>
There are number of resources I used in writing the <i>Tennis for Two</i> simulator. <a href="https://www.bnl.gov/about/docs/Higinbotham_Notes.pdf">Higinbotham's notes</a> describe the gameplay and development in general terms, while his <a href="https://www.bnl.gov/about/docs/Higinbotham_Deposition.pdf">court deposition</a> gets into the technical details. In addition, there is <a href="https://www.youtube.com/watch?v=6PG2mdU_i8k">video</a> of a recreation of the game being played.
<br><br>
<h4><b>Ball motion</b></h4>
<br>
The model for the ball's motion is a combination of gravity, wind resistance, and a damping factor for the bounce. The wind resistance model in TeTS assumes that the ball slows in proportion to the square of the speed - a standard scaling that has been used since the 19th century. I don't know if this is the exact scaling produced by Higinbotham's setup, but even if it isn't, the amount of wind resistance was small (as is apparent in both the video and in Higinbotham's notes) so the gameplay would not be greatly altered with a different scaling.
<br><br>
The speed of the ball when hit is kept at a constant value. Higinbotham said that the player did not have control over the speed, but that it could still be adjusted, presumably by the operator. In TeTS, I fix the hit speed to a constant value for both players.
<br><br>
<h4><b>The display</b></h4>
<br>
The playing field of TeTS refreshes at a rate of 36 Hz, consistent with the original game. Persistence effects were substantial in early vector displays, so TeTS overlays the last 300 positions of the ball, each with diminishing brightness. To simulate saturation of the beam, each position has two different images overlaid. The "saturated" beam image is large, but fades quickly with time (~75 ms), while the tail is represented by a much smaller image that fades slowly (~350 ms).
<br><br>
<div class="separator" style="clear: both;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRHtp3rbEXcA-ED10-kVB5j_iMFyDtp6rPayDOnSVoBHAoiF4LVBtfj6e35TJQanzKGjEPLKMhNCz-Ftkb4Qf5q8o1w_jE3MOWpWCxWlv9ada93VxOCgGek9vKT-ZBkOzE1mP7kAkjHkCK/s0/play_large2.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="200" data-original-width="399" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRHtp3rbEXcA-ED10-kVB5j_iMFyDtp6rPayDOnSVoBHAoiF4LVBtfj6e35TJQanzKGjEPLKMhNCz-Ftkb4Qf5q8o1w_jE3MOWpWCxWlv9ada93VxOCgGek9vKT-ZBkOzE1mP7kAkjHkCK/s0/play_large2.gif"/></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Footage of a recreation of the game</td></tr></tbody></table><div class="separator" style="clear: both; text-align: center;"></div>
<br>
<h4><b>Sound</b></h4>
<br>
One of six different sound clips plays when the ball is hit by either player. All were extracted from the gameplay footage.
<br><br>
<h4><b>CPU mode</b></h4>
<br>
The CPU mode in TeTS was not part of the original <i>Tennis for Two</i>, but I wanted people to be able to try the game even if they didn't have a second player handy. The CPU player is a combination of random and deterministic behaviors, and there are a range of strategies you can use to defeat it. I suggest experimenting.
<br><br>
<h2><b>Subsequent games</b></h2>
<br>
<i>Tennis for Two</i> is often compared to Atari's <i>Pong</i>, which was released 14 years later and basically started the video game industry. However, the two games are quite different; the only real similarity is that a ball is passed back-and-forth between players.
<br><br>
In his notes, Higinbotham refers to <i>Pong</i> as being "quite inferior". I wonder if Higinbotham fully appreciated the nuances in Allan Alcorn's design, but even so, it's hard to deny that the physical model in <i>Tennis for Two</i> is more sophisticated.
<br><br>
For whatever reason, the coin-op companies that pumped out paddle games in the '70s didn't make any serious attempts to reproduce Higinbotham's game. Perhaps Atari's <i>Rebound</i> (1974) comes the closest, though it still has substantial differences.
<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnMVEzf16WRM51RfWLMAWuGj5OeQ-kFlJ_fszCWQTgdW0vpgAlTdoj42MZg0oU1r3-PkC7aQvqQJkGBI7kXLFisZN-AWUYkwKk8KbdIb81pc02Emi3plstmsyQAzaJA8Zyk_tq7tcck6Ku/s0/play_large2.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="377" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnMVEzf16WRM51RfWLMAWuGj5OeQ-kFlJ_fszCWQTgdW0vpgAlTdoj42MZg0oU1r3-PkC7aQvqQJkGBI7kXLFisZN-AWUYkwKk8KbdIb81pc02Emi3plstmsyQAzaJA8Zyk_tq7tcck6Ku/s0/play_large2.gif"/></a></div>
We'll never know if the <i>Tennis for Two</i> design would have been popular in '70s arcades, but at least those of us in the 21st century can give it a go.
<br><br>
What do you think? Is it better than <i>Pong</i>?
</div>
</body>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com2tag:blogger.com,1999:blog-7604980045122375946.post-60947758937517347422021-07-28T17:41:00.012-07:002021-08-06T14:16:09.232-07:00MIDSAC Pool Simulator<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>MIDSAC Pool Simulator</title>
<style>
* { padding: 0; margin: auto; }
canvas { background: #555; display: block; margin: auto; }
#mytext
{
padding-top:100vh;
}
</style>
</head>
<body>
<canvas id="game" width=800px height=500px></canvas>
<script>
var useImages=1
var canvas=document.getElementById("game");
var ctx=canvas.getContext("2d");
if (window.innerWidth<800) {
ctx.canvas.width=window.innerWidth;
ctx.canvas.height=window.innerWidth*0.7;
}
var widthFull=ctx.canvas.width
var panelFraction=0.2
var scaleOverall=ctx.canvas.width/800
var panelWidth=panelFraction*widthFull
var screenWidth=(1-panelFraction)*widthFull
var nBall=16
var nPersist=300
let xpos = new Array(nBall)
let ypos = new Array(nBall)
let spotBrights = new Array(nBall)
let spotTimes = new Array(nBall)
for (let i=0;i<nBall;i++) {
xpos[i] = new Array(nPersist).fill(0)
ypos[i] = new Array(nPersist).fill(0)
spotBrights[i] = new Array(nPersist).fill(0)
spotTimes[i] = new Array(nPersist).fill(0)
}
var intervalTimeNominal=20
var fadeScale1=25
var fadeScale2=500
var scaleMin=0.5
var interval=setInterval(draw,intervalTimeNominal)
var gameInterval=0
// Parameters
var ballVX = new Array(nBall).fill(0)
var ballVY = new Array(nBall).fill(0)
var ballActive = new Array(nBall).fill(1)
var ballMoving = new Array(nBall).fill(0)
var cueXInit=panelWidth+screenWidth*0.65
var cueYInit=canvas.height*0.65
var countCalcs=0
var intervalTimeNew=intervalTimeNominal
//Constants
sideBounceCoeff=0.8
//sideBounceCoeff=1.0
coeffFriction=0.0005
//coeffFriction=0
tableBoundaries=[panelWidth+0.15*screenWidth,0.25*canvas.height,panelWidth+0.85*screenWidth,0.75*canvas.height]
ballRadius=0.04*0.5*canvas.height
cueLength=canvas.height*0.1
stepTime=intervalTimeNominal*0.75
cuePosStep=canvas.height*0.04
speedMin=0.02
vShoot=0.9
var scaleFactorLag=0.2
var intervalTimeThreshold=0
var rackX=[10,4,3,3,2,2,2,1,1,1,1,0,0,0,0,0]
var rackY=[10,0,0.5,-0.5,1,0,-1,1.5,0.5,-0.5,-1.5,2,1,0,-1,-2]
var rackOffset=[panelWidth+0.25*screenWidth,0.5*canvas.height]
var holeX=[tableBoundaries[0],(tableBoundaries[0]+tableBoundaries[2])/2,tableBoundaries[2],tableBoundaries[2],(tableBoundaries[0]+tableBoundaries[2])/2,tableBoundaries[0]]
var holeY=[tableBoundaries[1],tableBoundaries[1],tableBoundaries[1],tableBoundaries[3],tableBoundaries[3],tableBoundaries[3]]
var holeRadius=1.6*ballRadius
var threshDrawMove=0.1
// On-off switch
// Knobs
var knobX=[0.5*panelWidth]
var knobY=[0.2*canvas.height]
let knobAngle = [0]
let knobActive = new Array(knobX.length).fill(0)
let knobNominal = new Array(knobX.length).fill(0)
let knobDisplaySize = new Array(knobX.length).fill(0.75)
let knobFactor = [1]
var knobZero=[0]
var knobImageAngle=-0.85
var knobSensitivity = new Array(knobX.length).fill(0.01)
var knobMinAngle = new Array(knobX.length).fill(-1000)
var knobMaxAngle = new Array(knobX.length).fill(1000)
// Labels
var labelText=['Cue','direction','Cue','position','Shoot','Rack','Recover','cue ball']
var labelX=[panelWidth*0.5,panelWidth*0.5,panelWidth*0.5,panelWidth*0.5,panelWidth*0.8,panelWidth*0.5,panelWidth*0.5,panelWidth*0.5]
var labelY=[canvas.height*0.29,canvas.height*0.33,canvas.height*0.59,canvas.height*0.63,canvas.height*0.15,canvas.height*0.78,canvas.height*0.92,canvas.height*0.96]
var labelSize=['16','16','16','16','16','16','14','14']
var labelSize2=['12','12','12','12','12','12','10','10']
var labelColor=new Array(labelX.length).fill('black')
// Buttons
var buttonX=[0.5*panelWidth,0.5*panelWidth,0.8*panelWidth]
var buttonY=[0.85*canvas.height,0.71*canvas.height,0.08*canvas.height]
var buttonActive=new Array(buttonX.length).fill(0)
var buttonDistance=new Array(buttonX.length).fill(0)
var buttonDisplaySize=new Array(buttonX.length).fill(0.5)
var buttonClickDistance=30
// Screws
var screwX=[0.15*panelWidth,0.15*panelWidth]
var screwY=[0.9*canvas.height,0.1*canvas.height]
var screwDisplaySize=[0.3,0.3]
// Joysticks
var joystickX=[0.5*panelWidth]
var joystickY=[0.47*canvas.height]
var joystickXJ=[0]
var joystickYJ=[0]
var joystickActive=new Array(joystickX.length).fill(0)
// States
var buttonState=0
var touchLifted=1;
// Sizes
var switchSize=[93,103]
var ballSize=[28,24]
var screw1Size=[75,70]
var screw2Size=[75,73]
var cueSize=[18,68]
var joystickBaseSize=[200,197]
var joystickHeadSize=[75,74]
var buttonSize=[93,103]
var knobSize=[75,74]
var frameSize=[547,465]
var panelSize=[232,465]
var screwImage=new Array(2)
//Click Distances
var knobClickDistance=knobSize[0]*knobDisplaySize[0]/2*scaleOverall
var joystickClickDistance=knobClickDistance
ballDisplaySize=ballRadius*2*1.2/ballSize[0]
cueDisplaySize=(tableBoundaries[3]-tableBoundaries[1])/2/cueSize[1]
var joystickDisplaySize=new Array(joystickX.length).fill(0.4)
var joystickLimit=joystickBaseSize[0]*joystickDisplaySize[0]*scaleOverall/3
cueNominal=-0.1
cueX=new Array(nPersist).fill(cueXInit)
cueY=new Array(nPersist).fill(cueYInit)
cueAngle=new Array(nPersist).fill(cueNominal)
cueTimes=new Array(nPersist).fill(0)
document.addEventListener("mousedown",mouseDownHandler, false);
document.addEventListener("mousemove",mouseMoveHandler, false);
document.addEventListener("mouseup",mouseUpHandler, false);
document.addEventListener("keydown",keyDownHandler, false);
document.addEventListener("touchstart",touchDownHandler, false);
document.addEventListener("touchmove",touchMoveHandler, false);
document.addEventListener("touchend",touchUpHandler, false);
function dotProduct(vector1,vector2) {
return vector1[0]*vector2[0]+vector1[1]*vector2[1]
}
function addVectors(vector1,vector2) {
return [vector1[0]+vector2[0],vector1[1]+vector2[1]]
}
function imposeLimits(limitedValue,minLimit,maxLimit) {
if (limitedValue<minLimit) {
return minLimit
} else if (limitedValue>maxLimit) {
return maxLimit
} else {
return limitedValue
}
}
function normalize(vector1) {
norm=Math.sqrt(Math.pow(vector1[0],2)+Math.pow(vector1[1],2))
return [vector1[0]/norm,vector1[1]/norm]
}
function getTouchPos(cvas, evt) {
var rect = cvas.getBoundingClientRect();
return {
x: evt.touches[0].clientX-rect.left,
y: evt.touches[0].clientY-rect.top
}
}
function getMousePos(cvas, evt) {
var rect = cvas.getBoundingClientRect();
return {
x: evt.clientX-rect.left,
y: evt.clientY-rect.top
}
}
function drawImage(drawContext,img,xi,yi,scalei,anglei) {
var vxi = Math.cos(anglei)*scalei;
var vyi = Math.sin(anglei)*scalei;
var imH = -(img.height/2);
var imW = -(img.width/2);
xi+=imW*vxi+imH*-vyi;
yi+=imW*vyi+imH*vxi;
drawContext.setTransform(vxi,vyi,-vyi,vxi,xi,yi);
drawContext.drawImage(img,0,0);
drawContext.setTransform(1,0,0,1,0,0);
}
function touchUpHandler(e) {
e.preventDefault()
touchLifted=1;
for (let i=0;i<knobX.length;i++) {
knobActive[i]=0
knobNominal[i]=knobAngle[i]
}
for (let i=0;i<buttonX.length;i++) {
buttonActive[i]=0
}
draw()
}
function touchDownHandler(e) {
e.preventDefault()
if (touchLifted==1) {
touchLifted=0
touchpos=getTouchPos(canvas,e)
checkKnobAction(touchpos)
checkJoystickAction(touchpos)
checkButtonAction(touchpos)
}
}
function mouseDownHandler(e) {
e.preventDefault()
mousepos=getMousePos(canvas,e)
checkKnobAction(mousepos)
checkJoystickAction(mousepos)
checkButtonAction(mousepos)
}
function touchMoveHandler(e) {
e.preventDefault()
touchpos=getTouchPos(canvas,e)
if (touchLifted==0) {
}
}
function keyDownHandler(e) {
if (e.keyCode==37) {
cueX[nPersist-1]-=cuePosStep/4
} else if (e.keyCode==39) {
cueX[nPersist-1]+=cuePosStep/4
} else if (e.keyCode==38) {
cueY[nPersist-1]-=cuePosStep/4
} else if (e.keyCode==40) {
cueY[nPersist-1]+=cuePosStep/4
} else if (e.keyCode==17) {
buttonAction(2)
}
}
function mouseMoveHandler(e) {
e.preventDefault()
mousepos=getMousePos(canvas,e)
for (let i=0;i<knobX.length;i++) {
if (knobActive[i]==1) {
knobAngle[i]=knobNominal[i]+(mousepos.x-knobX[i])/canvas.width*6
}
}
for (let i=0;i<joystickX.length;i++) {
mouseposj=[mousepos.x-joystickX[i],mousepos.y-joystickY[i]]
if (joystickActive[i]==1) {
joystickXJ[i]=mouseposj[0]/canvas.width*150
joystickYJ[i]=mouseposj[1]/canvas.width*150
joystickXJ[i]=imposeLimits(joystickXJ[i],-joystickLimit,joystickLimit)
joystickYJ[i]=imposeLimits(joystickYJ[i],-joystickLimit,joystickLimit)
}
}
}
function mouseUpHandler(e) {
for (let i=0;i<buttonX.length;i++) {
buttonActive[i]=0
}
draw()
}
function checkJoystickAction(actionPosition) {
for (let i=0;i<joystickX.length;i++) {
joystickDistance=Math.sqrt(Math.pow(joystickX[i]-actionPosition.x,2)+Math.pow(joystickY[i]-actionPosition.y,2))
if (joystickDistance<joystickClickDistance && joystickActive[i]==0) {
joystickDisplaySize[i]*=0.95
joystickActive[i]=1
} else {
if (joystickActive[i]==1) {
joystickDisplaySize[i]/=0.95
}
joystickActive[i]=0
joystickXJ[i]=0
joystickYJ[i]=0
}
}
}
function checkKnobAction(actionPosition) {
for (let i=0;i<knobX.length;i++) {
knobDistance=Math.sqrt(Math.pow(knobX[i]-actionPosition.x,2)+Math.pow(knobY[i]-actionPosition.y,2))
if (knobDistance<knobClickDistance && knobActive[i]==0) {
knobDisplaySize[i]*=0.95
knobActive[i]=1
} else {
if (knobActive[i]==1) {
knobDisplaySize[i]/=0.95
knobNominal[i]=knobAngle[i]
}
knobActive[i]=0
}
}
}
function checkSwitchAction(actionPosition) {
switchDistance=Math.sqrt(Math.pow(switchX-actionPosition.x,2)+Math.pow(switchY-actionPosition.y,2))
if (switchDistance<switchClickDistance) {
switchState=(switchState+1)%2;
if (switchState==0) {
clearInterval(gameInterval)
gameStop();
} else {
gameStart();
clearInterval(gameInterval)
gameInterval=setInterval(gameStop,gameDuration)
}
}
}
function checkButtonAction(actionPosition) {
for (let i=0;i<buttonX.length;i++) {
buttonDistance[i]=Math.sqrt(Math.pow(buttonX[i]-actionPosition.x,2)+Math.pow(buttonY[i]-actionPosition.y,2))
if (buttonDistance[i]<buttonClickDistance && buttonActive[i]==0) {
buttonActive[i]=1
buttonAction(i)
}
}
}
function buttonAction(buttonNumber) {
if (buttonNumber==2) {
shootCueBall()
} else if (buttonNumber==1) {
gameReset()
} else if (buttonNumber==0) {
if (ballActive[0]==0) {
setCueBall()
}
}
}
function getBeamFade(time,saturated) {
expFactor1=Math.exp(-time/fadeScale1)
expFactor2=Math.exp(-time/fadeScale2)*0.3
if (saturated==1) {
expFactor=(expFactor1+expFactor2)/1.3
} else {
expFactor=expFactor1
}
return expFactor
}
function getBeamBright() {
beamBrightness=1
return beamBrightness
}
function gameReset() {
rackBalls()
}
function checkHoles(ballNum) {
pass=0
for (let i=0;i<holeX.length;i++) {
holeDistance=Math.sqrt(Math.pow(holeX[i]-xpos[ballNum][nPersist-1],2)+Math.pow(holeY[i]-ypos[ballNum][nPersist-1],2))
if (holeDistance<holeRadius && pass==0) {
ballActive[ballNum]=0
ballMoving[ballNum]=0
}
}
return pass
}
function bounceBoundaries(ballNum) {
if (xpos[ballNum][nPersist-1]+ballRadius>tableBoundaries[2]) {
ballVX[ballNum]=-ballVX[ballNum]*sideBounceCoeff
}
if (xpos[ballNum][nPersist-1]-ballRadius<tableBoundaries[0]) {
ballVX[ballNum]=-ballVX[ballNum]*sideBounceCoeff
}
if (ypos[ballNum][nPersist-1]-ballRadius<tableBoundaries[1]) {
ballVY[ballNum]=-ballVY[ballNum]*sideBounceCoeff
}
if (ypos[ballNum][nPersist-1]+ballRadius>tableBoundaries[3]) {
ballVY[ballNum]=-ballVY[ballNum]*sideBounceCoeff
}
}
function stepBalls() {
countCalcs=0
for (let i=0;i<xpos.length;i++) {
if (ballActive[i]==1) {
xpos[i][nPersist-1]=xpos[i][nPersist-2]+ballVX[i]*stepTime
ypos[i][nPersist-1]=ypos[i][nPersist-2]+ballVY[i]*stepTime
pass=checkHoles(i)
if (pass==0) {
bounceBoundaries(i)
}
nCalcs=0
for (let j=0;j<xpos.length;j++) {
if (j != i) {
nCalcs+=checkCollision(i,j)
}
}
if (ballMoving[i]==1) {
countCalcs+=nCalcs
}
}
}
for (let i=0;i<xpos.length;i++) {
if (ballActive[i]==1) {
xpos[i][nPersist-1]=xpos[i][nPersist-2]+ballVX[i]*stepTime
ypos[i][nPersist-1]=ypos[i][nPersist-2]+ballVY[i]*stepTime
ballVX[i]-=ballVX[i]*coeffFriction*stepTime
ballVY[i]-=ballVY[i]*coeffFriction*stepTime
for (j=0;j<xpos.length;j++) {
if (j!=i) {
checkOverlaps(i,j)
}
}
if (Math.abs(ballVX[i])<speedMin && Math.abs(ballVY[i])<speedMin) {
ballVX[i]=0
ballVY[i]=0
ballMoving[i]=0
}
if (ballMoving[i]==1) {
countCalcs+=4
}
}
}
}
function checkOverlaps(ball1,ball2) {
if (ballActive[ball1]==1 && ballActive[ball2]==1) {
distanceBalls=Math.sqrt(Math.pow(xpos[ball1][nPersist-1]-xpos[ball2][nPersist-1],2)+Math.pow(ypos[ball1][nPersist-1]-ypos[ball2][nPersist-1],2))
if (distanceBalls<2*ballRadius) {
xDistance=xpos[ball1][nPersist-1]-xpos[ball2][nPersist-1]
yDistance=ypos[ball1][nPersist-1]-ypos[ball2][nPersist-1]
xAverage=(xpos[ball1][nPersist-1]+xpos[ball2][nPersist-1])/2
yAverage=(ypos[ball1][nPersist-1]+ypos[ball2][nPersist-1])/2
xpos[ball1][nPersist-1]=xAverage+xDistance*ballRadius/distanceBalls
ypos[ball1][nPersist-1]=yAverage+yDistance*ballRadius/distanceBalls
xpos[ball2][nPersist-1]=xAverage-xDistance*ballRadius/distanceBalls
ypos[ball2][nPersist-1]=yAverage-yDistance*ballRadius/distanceBalls
}
}
return nCalcs
}
function checkCollision(ball1,ball2) {
nCalcs=0
if (ball1 > ball2 && ballActive[ball1]==1 && ballActive[ball2]==1) {
distanceBalls=Math.sqrt(Math.pow(xpos[ball1][nPersist-1]-xpos[ball2][nPersist-1],2)+Math.pow(ypos[ball1][nPersist-1]-ypos[ball2][nPersist-1],2))
nCalcs+=4
if (distanceBalls<2*ballRadius) {
doCollision(ball1,ball2)
nCalcs+=18
}
}
return nCalcs
}
function doCollision(ball1,ball2) {
xDistance=xpos[ball1][nPersist-2]-xpos[ball2][nPersist-2]
yDistance=ypos[ball1][nPersist-2]-ypos[ball2][nPersist-2]
pVector=[xDistance,yDistance]
normalVector = normalize(pVector)
tangentVector = [-normalVector[1],normalVector[0]]
ball1scalarNormal = dotProduct(normalVector,[ballVX[ball1],ballVY[ball1]])
ball2scalarNormal = dotProduct(normalVector,[ballVX[ball2],ballVY[ball2]])
ball1scalarTangent = dotProduct(tangentVector,[ballVX[ball1],ballVY[ball1]])
ball2scalarTangent = dotProduct(tangentVector,[ballVX[ball2],ballVY[ball2]])
ball1scalarNormalAfter_vector = [ball2scalarNormal*normalVector[0],ball2scalarNormal*normalVector[1]]
ball2scalarNormalAfter_vector = [ball1scalarNormal*normalVector[0],ball1scalarNormal*normalVector[1]]
ball1scalarNormalVector = [ball1scalarTangent*tangentVector[0],ball1scalarTangent*tangentVector[1]]
ball2scalarNormalVector = [ball2scalarTangent*tangentVector[0],ball2scalarTangent*tangentVector[1]]
velocity1=addVectors(ball1scalarNormalVector,ball1scalarNormalAfter_vector)
velocity2=addVectors(ball2scalarNormalVector,ball2scalarNormalAfter_vector)
ballVX[ball1]=velocity1[0]
ballVX[ball2]=velocity2[0]
ballVY[ball2]=velocity2[1]
ballVY[ball1]=velocity1[1]
ballMoving[ball1]=1
ballMoving[ball2]=1
}
function draw() {
ctx.clearRect(panelWidth,0,canvas.width,canvas.height);
drawCue()
updateCuePos()
drawTable()
drawPanel()
drawScrews()
for (let i=0;i<xpos.length; i++) {
for (let j=xpos[i].length-1;j>=0;j--) {
brightness=getBeamFade(spotTimes[i][j],1)*spotBrights[i][j]
if (j<xpos[i].length-1) {
moveDist=Math.sqrt(Math.pow(xpos[i][j]-xpos[i][j+1],2)+Math.pow(ypos[i][j]-ypos[i][j+1],2))
if (moveDist>threshDrawMove) {
drawBall(xpos[i][j],ypos[i][j],brightness,i);
}
} else {
drawBall(xpos[i][j],ypos[i][j],brightness,i);
}
}
}
for (let i=0;i<xpos.length; i++) {
for (let j=0;j<xpos[i].length-1;j++) {
xpos[i][j]=xpos[i][j+1]
ypos[i][j]=ypos[i][j+1]
spotBrights[i][j]=spotBrights[i][j+1]
spotTimes[i][j]=spotTimes[i][j+1]+intervalTimeNew
}
}
for (let i=0;i<cueX.length-1;i++) {
cueX[i]=cueX[i+1]
cueY[i]=cueY[i+1]
cueAngle[i]=cueAngle[i+1]
cueTimes[i]=cueTimes[i+1]+intervalTimeNew
}
cueAngle[nPersist-1]=knobAngle[0]-cueNominal
cueTimes[nPersist-1]=0
stepBalls()
for (let i=0;i<xpos.length;i++) {
if (ballActive[i]==1) {
spotBrights[i][nPersist-1]=getBeamBright()
if (i>0) {
spotBrights[i][nPersist-1]*=0.6
}
} else {
spotBrights[i][nPersist-1]=0
}
spotTimes[i][nPersist-1]=0
}
setSimulationLag()
ctx.globalAlpha=1
// ctx.drawImage(frameImage,panelWidth,0,widthFull-panelWidth,canvas.height)
}
function setSimulationLag() {
intervalTimeOld=intervalTimeNew
intervalTimeNew=countCalcs*scaleFactorLag
if (intervalTimeNew<25) {
intervalTimeNew=25
}
if (Math.abs(intervalTimeNew-intervalTimeOld)>intervalTimeThreshold) {
clearInterval(interval)
interval=setInterval(draw,intervalTimeNew)
}
}
function drawLabels() {
for(let i=0;i<labelX.length;i++) {
if (canvas.height<400) {
fontString=labelSize2[i].concat('px Courier New')
} else {
fontString=labelSize[i].concat('px Courier New')
}
ctx.font = fontString
ctx.strokeStyle = labelColor[i]
ctx.textAlign = 'center';
ctx.lineWidth = 1
ctx.strokeText(labelText[i],labelX[i],labelY[i])
ctx.stroke()
}
}
function drawPanel() {
ctx.clearRect(0,0,panelWidth,canvas.height);
ctx.globalAlpha=0.7
ctx.drawImage(panelImage,0,0,panelWidth,canvas.height)
ctx.globalAlpha=1.0
for (i=0;i<buttonX.length;i++) {
drawButton(buttonX[i],buttonY[i],panelWidth/panelSize[0],i)
}
for (i=0;i<joystickX.length;i++) {
drawJoystick(joystickX[i],joystickY[i],joystickXJ[i],joystickYJ[i],joystickDisplaySize[i]*scaleOverall,i)
}
for (i=0;i<knobX.length;i++) {
drawImage(ctx,knobImage,knobX[i],knobY[i],scaleOverall*knobDisplaySize[i],knobAngle[i]-knobImageAngle)
}
drawLabels()
ctx.moveTo(panelWidth,canvas.height)
ctx.lineTo(panelWidth,0)
ctx.lineWidth=4
ctx.stroke()
}
function drawSwitch() {
if (switchState==0) {
drawImage(ctx,switch2Image,switchX,switchY,scaleOverall*switchDisplaySize,0)
} else {
drawImage(ctx,switch1Image,switchX,switchY,scaleOverall*switchDisplaySize,0)
}
}
function drawJoystick(xp,yp,xj,yj,scale,joystickNumber) {
if (useImages==1) {
drawImage(ctx,joystickBaseImage,xp,yp,scale,0)
drawImage(ctx,joystickHeadImage,xp+xj,yp+yj,scale,0)
} else {
ctx.beginPath()
ctx.fillStyle='black'
ctx.rect(xp-scale/2,yp-scale/2,scale,scale)
ctx.closePath()
ctx.fill()
ctx.beginPath()
ctx.strokeStyle='blue'
ctx.fillStyle='blue'
ctx.arc(xp+xj,yp+yj,scale/4,0,2*Math.PI)
ctx.closePath()
ctx.fill()
}
}
function drawButton(xp,yp,scalep,buttonNumber) {
if (buttonActive[buttonNumber]==0) {
drawImage(ctx,button2Image,xp,yp,scalep*buttonDisplaySize[buttonNumber],0)
} else {
drawImage(ctx,button1Image,xp,yp,scalep*buttonDisplaySize[buttonNumber],0)
}
}
function drawTable() {
ctx.strokeStyle='black'
ctx.beginPath()
xCenter=tableBoundaries[0]+(tableBoundaries[2]-tableBoundaries[0])/2
ctx.arc(holeX[0],holeY[0],holeRadius,Math.PI/2,Math.PI*2)
ctx.arc(holeX[1],holeY[1],holeRadius,Math.PI,Math.PI*2)
ctx.arc(holeX[2],holeY[2],holeRadius,Math.PI,5*Math.PI/2)
ctx.arc(holeX[3],holeY[3],holeRadius,3*Math.PI/2,3*Math.PI)
ctx.arc(holeX[4],holeY[4],holeRadius,0,Math.PI)
ctx.arc(holeX[5],holeY[5],holeRadius,0,3*Math.PI/2)
ctx.moveTo(tableBoundaries[0]+holeRadius,tableBoundaries[1])
ctx.lineTo(xCenter-holeRadius,tableBoundaries[1])
ctx.moveTo(xCenter+holeRadius,tableBoundaries[1])
ctx.lineTo(tableBoundaries[2]-holeRadius,tableBoundaries[1])
ctx.moveTo(tableBoundaries[2],tableBoundaries[1]+holeRadius)
ctx.lineTo(tableBoundaries[2],tableBoundaries[3]-holeRadius)
ctx.moveTo(tableBoundaries[2]-holeRadius,tableBoundaries[3])
ctx.lineTo(xCenter+holeRadius,tableBoundaries[3])
ctx.moveTo(xCenter-holeRadius,tableBoundaries[3])
ctx.lineTo(tableBoundaries[0]+holeRadius,tableBoundaries[3])
ctx.moveTo(tableBoundaries[0],tableBoundaries[3]-holeRadius)
ctx.lineTo(tableBoundaries[0],tableBoundaries[1]+holeRadius)
ctx.closePath()
ctx.stroke()
}
function drawCue() {
cueX[nPersist-1]=imposeLimits(cueX[nPersist-1],panelWidth+cueSize[1]/2,canvas.width-cueSize[1]/2)
cueY[nPersist-1]=imposeLimits(cueY[nPersist-1],cueSize[1]/2,canvas.height-cueSize[1]/2)
if (useImages==1) {
for (let i=0;i<cueX.length;i++) {
ctx.globalAlpha=getBeamFade(cueTimes[i])
drawImage(ctx,cueImage,cueX[i],cueY[i],cueDisplaySize,cueAngle[i])
ctx.globalAlpha=1
}
} else {
ctx.strokeStyle='white'
ctx.beginPath()
ctx.moveTo(cueX-cueLength*Math.sin(knobAngle[0]),cueY+cueLength*Math.cos(knobAngle[0]))
ctx.lineTo(cueX+cueLength*Math.sin(knobAngle[0]),cueY-cueLength*Math.cos(knobAngle[0]))
ctx.closePath()
ctx.stroke()
}
}
function setCueBall() {
for (let i=0;i<nPersist;i++) {
xpos[0][i]=panelWidth+screenWidth*0.75
ypos[0][i]=0.5*canvas.height
}
ballVX[0]=0
ballVY[0]=0
ballActive[0]=1
ballMoving[0]=0
}
function rackBalls() {
setCueBall()
for (let i=1;i<xpos.length;i++) {
for (let j=0;j<nPersist;j++) {
xpos[i][j]=rackOffset[0]+rackX[i]*ballRadius*2*1.025
ypos[i][j]=rackOffset[1]+rackY[i]*ballRadius*2*1.025
}
ballVX[i]=0
ballVY[i]=0
ballActive[i]=1
ballMoving[i]=0
}
}
function updateCuePos() {
cueX[nPersist-1]+=cuePosStep*joystickXJ[0]/joystickLimit
cueY[nPersist-1]+=cuePosStep*joystickYJ[0]/joystickLimit
}
function shootCueBall() {
ballVX[0]=vShoot*Math.sin(knobAngle[0])
ballVY[0]=-vShoot*Math.cos(knobAngle[0])
ballMoving[0]=1
}
function drawScrews() {
ctx.globalAlpha=0.8
for (let i=0;i<screwX.length;i++) {
drawImage(ctx,screwImage[i],screwX[i],screwY[i],screwDisplaySize[i]*scaleOverall,0)
}
ctx.globalAlpha=1.0
}
function drawBall(pX,pY,brightness,ballNum) {
ctx.globalAlpha=brightness
if (useImages==1) {
drawImage(ctx,ballImage,pX,pY,ballDisplaySize,0)
} else {
if (ballNum==0) {
ctx.fillStyle='white'
} else {
ctx.fillStyle='green'
}
ctx.beginPath()
ctx.moveTo(pX,pY)
ctx.arc(pX,pY,ballRadius,0,Math.PI*2)
ctx.closePath()
ctx.fill()
}
ctx.globalAlpha=1
}
function loadSprites() {
ballImage=new Image();
ballImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7h-YbtjgTUbUT5W-fVvILTR7ApjsZ0rZPm4sR4eojuSghw_Cfn0VDrQXGuHXojiCMAQhlMXrr64a8Qg65hsETGd8MC01o52aeQlQUfjOP5rNr6b5rLdeagxQ0XoM4J7VvDjJi9aIGloV/s28/0.png"
ballImage.onload = function () {
gameReset()
}
panelImage=new Image(panelSize[0],panelSize[1]);
panelImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9aWmbdqNJ2cLIE69L1spFZQgE_fDterW8yfTmFqL-rfs3qPaetsySidbu5SyJkNITShRUuBwCmAY-UmbEY_FlezBwRbWcBE3aSKj0Nd59KRLXg9oEobJbnbG_dsncxG5CiwT-BkCl-mYy/s600/wood.png"
panelImage.onload = function () {
gameReset()
}
knobImage=new Image(knobSize[0],knobSize[1]);
knobImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTabTsIPabIgnhkbCQjWjg1iOrgseIITuAwdC6PJmLLcQYVephh4LOcewDYSfe3X0TM27Aps15ofQi0pwiobwiwFrM4k6NPv5hYYMHf2zknnlgEDLO8lxcb2YmCCooTAy35XGu4OIsZRCL/s75/knob2.png"
knobImage.onload = function () {
gameReset()
}
switch1Image=new Image(switchSize[0],switchSize[1]);
switch1Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpEIKpdm9eUWmY6UwKPL2U7epa9q9RtTsAvrU3nGbGRRJXaOC6YZyUJ6MAjBbHx-0Ze-lJ8VzXuWnATaZindkXyUDfcAjkTClMQNs0_NLQCjCCH6rWWlbf55EiN6Ed5Z2Ey-U6h45WT_or/s103/radiobutton1.png"
switch1Image.onload = function () {
gameReset()
}
cueImage=new Image();
cueImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYSzJ_AraoeijEfAgMzmfV-QIy1-4fKkdTcHoIVLjHl4AUNj_yDqjNQkZTw0DgAD1Y7UqA4e3BAdqsOjYMYrtfHg34v6TtWB7fQMQ4DoMZDkQnBxf43a2NYqzeTqPB5e0adDWN7XqUyisz/s68/cue.png"
cueImage.onload = function () {
gameReset()
}
joystickBaseImage=new Image();
joystickBaseImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS66c-kbU2fsCrvuX7MvynDzYjpipcdodNa9j44gutyv7F-VTu-cq0q-eMPM6a13W2SnjVFDWABhHPUiShGJywO170Dmvvw3g1nBgobqxZJQc7oqWaq9ZvVFb9zhSyR5uJIv3PnCM_BBem/s200/base.png"
joystickBaseImage.onload = function () {
gameReset()
}
joystickHeadImage=new Image();
joystickHeadImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg06d1NP_fx2Lnq1XY7VU-9J8RSrTmCsBlxlOxgdbW1VrItTP2YkityZqbaTj7kUiq6xiPHGNFfE6ZEMFakdHcynVokhElw37NCJ0Ek6JvX07rSCfbVHQpHmyXWy1i6_2ZAoLmenwTwXpRE/s75/head.png"
joystickHeadImage.onload = function () {
gameReset()
}
panelImage=new Image(panelSize[0],panelSize[1]);
panelImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtWjTqOKCvv1tb0BzpyFMrpCRROpifG25bbdzu0fZXBk9_G0cVQNfHBsFI0RC5McOTaoh0D7WnyMuiwLG5T0Xy701PB3SdHfHh8pTVq4stjUceaZ5MHDMgV8lJfzojoQHfM6oDiwZ9qwcc/s500/metal-texture.png"
panelImage.onload = function () {
gameReset()
}
switch2Image=new Image(switchSize[0],switchSize[1]);
switch2Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK66T7heDZPFZNpweiOJ-V5V3-Vt_E3xnrxM80zCXCtV0g-WtvOuxn0GoDIj3o43eCLZIJ1YHlPouVmVPpvtJH5hvepl4swENKPV8QLARPMwu7tSUVJC2Bj62XQF9Cl1ktTLx4rRJ-9njK/s103/radiobutton2.png"
switch2Image.onload = function () {
gameReset()
}
screwImage[0]=new Image(screw1Size[0],screw1Size[1]);
screwImage[0].src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ8VCv6RZ0s551i9wmJrrqcP-Oq2Qhhc0CNboBz7BSAulnRVJuDQcvMBsuoukJpJ_6Y05krHaFJVl6-yZLhL-wPIuEABF-zCMtr2HFIj923ZLO5mEnkWXUMRr44bl3rLTHYy3HaVFF1kC2/s75/screw1.png"
screwImage[0].onload = function () {
gameReset()
}
screwImage[1]=new Image(screw2Size[0],screw2Size[1]);
screwImage[1].src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZcAFqbR9IAq4SqQiHoloAmfZ6rZjmFzSQ1fZUXxZmUHOtKHGg6u1Ga-BC2amqaOb19UYlAqgYxP266Hro_tSnrd5aRzGSWUc3eKxzGsxf_wUFmaQXMS8hOyG3jcbzhvUBCdx77mufK4n2/s75/screw2.png"
screwImage[1].onload = function () {
gameReset()
}
button1Image=new Image(buttonSize[0],buttonSize[1]);
button1Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpEIKpdm9eUWmY6UwKPL2U7epa9q9RtTsAvrU3nGbGRRJXaOC6YZyUJ6MAjBbHx-0Ze-lJ8VzXuWnATaZindkXyUDfcAjkTClMQNs0_NLQCjCCH6rWWlbf55EiN6Ed5Z2Ey-U6h45WT_or/s103/radiobutton1.png"
button1Image.onload = function () {
gameReset()
}
button2Image=new Image(buttonSize[0],buttonSize[1]);
button2Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK66T7heDZPFZNpweiOJ-V5V3-Vt_E3xnrxM80zCXCtV0g-WtvOuxn0GoDIj3o43eCLZIJ1YHlPouVmVPpvtJH5hvepl4swENKPV8QLARPMwu7tSUVJC2Bj62XQF9Cl1ktTLx4rRJ-9njK/s103/radiobutton2.png"
button2Image.onload = function () {
gameReset()
}
frameImage=new Image(frameSize[0],frameSize[1]);
frameImage.src=""
frameImage.onload = function () {
draw()
}
}
loadSprites()
</script>
<br>
To play the MIDSAC Pool Simulator (MIPS), click on the "Cue direction" dial in the upper left corner and move the mouse left/right to set the angle of the pool cue. Click again when you're happy with the angle. Then click on the "Shoot" button (or the Ctrl key) to take a shot in the direction the cue is pointing. Try to knock the balls into the holes around the edge of the table without having the cue ball fall in a hole.
<br><br>
You can move the cue around the screen using the arrow keys or by clicking on the "Cue position" control. However, just like the original MIDSAC Pool, the trajectory of the ball does not depend on the position of the cue.
<br><br>
To reset the game, click on the "Re-rack" button. To just recover a scratched use the "Recover cue ball" button.
<br><br>
Note that the game will run more slowly the more balls are moving -- this is by design, intended to match descriptions of the original game. The frame rate varies from ~8 to 40 frames per second and depends primarily on how many balls are in motion.
<br><br>
<h3><b>History</b></h3>
<br>
The MIDSAC computer was developed at the University of Michigan in 1951-1953 and was capable of executing up to 25,000 calculations per second. It was the first of its kind in the midwestern USA and the sixth digital computer at a research university. There were two separate computers at the university, the MIDAC (Michigan Digital Automatic Computer) and the MIDSAC (Michigan Digitial Special Automatic Computer), and the pool game ran on the latter.
<br><br>
MIDSAC Pool is one of a handful of video games that is sometimes considered the first, depending on how you define a video game. Created in 1954, it post-dates the two other contenders I've simulated, the <a href="http://www.retrogamedeconstructionzone.com/2021/07/the-whirlwind-bouncing-ball-simulator.html">Whirlwind Bouncing Ball</a> and the <a href="http://www.retrogamedeconstructionzone.com/2021/07/cathode-ray-tube-amusement-device.html"
>Cathode-ray tube amusement device</a>, but offers a more complete experience than either of those games.
<br><br>
Most of the information I used to write this simulator was obtained from <a href="http://www-personal.umich.edu/~gkinney/midac/">photos</a> of the original game being played and <a href="https://archive.org/details/19770104MagnavoxVBallyTrialTranscriptPages13771492">transcribed testimony</a> from a 1977 court case. The latter source includes a description of the pool game by its primary author, William George Brown.
<br><br>
For more information about the MIDSAC computer and MIDSAC pool, see <a href="https://www.masswerk.at/nowgobang/2019/michigan-pool">this Norbert Landsteiner article</a>.
<br><br>
<h3><b>The MIPS components</b></h3>
<br>
I believe that MIPS captures the key elements of MIDSAC Pool, but with only a written testimony and some photos to work from, some aspects of the simulation did require guesswork.
<br><br>
<h4><b>Ball motion</b></h4>
<br>
The motion of balls on a pool table can be derived from Newtonian physics that we've known about for centuries, so it's unlikely that the ball motions in MIPS differ substantially from the original game. However, there would have been minor differences, depending on the exact values of parameters used in the model (which are unknown) and whether any approximations were used in the calculations in order to make it run at a reasonable speed.
<br><br>
Parameters that could have been set differently include the initial speed of the cue ball, the coefficient of friction that slows the balls as they move along the table, and the coefficient of restitution that determines how much speed is lost when the ball bounces off the table boundaries. We do know that coefficients of friction and restitution were included in the model because they were mentioned in the court testimony, but the exact values are not specified.
<br><br>
The most complex part of the physical model is the ball collisions. In MIPS, I have treated all ball-on-ball collisions as elastic (that is, they conserve energy). It's not stated explicitly in the court testimony whether they used this assumption, but real billiard balls collide near-elastically and for the purposes of their demonstration, elastic collisions would have been good enough to make the motions look realistic.
<br><br>
<h4><b>The display</b></h4>
<br>
The MIPS display includes representations of the balls, the cue, and the table. The cue and the balls were rendered in real time by the cathode rays, and so would have shined brightly in the original MIDSAC Pool game. The table, on the other hand, was actually drawn on the screen with a grease pencil, so I show it in black in MIPS.
<br><br>
Note that I was going from black-and-white photos, so it's possible that the original game was colored. It's unlikely that it had the capability to display different objects with different colors, but the whole game may well have had, for example, a green or blue tint.
<br><br>
Persistence effects were substantial in these early vector displays, so MIPS overlays images of the last 300 positions of every ball, as well as the cue. The brightness of each image is set using a model I developed for the <a href="http://www.retrogamedeconstructionzone.com/2021/07/cathode-ray-tube-amusement-device.html"
>CRADS</a>, with parameters set to approximate the trails seen in photos of the game.
<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoNlqS3ftH2cYvuoinnc7hYavlxY__hAM-D-keM-3Z1qORShxbpVU1-wqq_5V6iUCsrPatLdPfCau19sTLqMU8u3EQBi-QQ_F5ZsPEq1tjBY5TAg1LiY0E7vllICb_pCzItPA1PtJs738f/s0/persistence.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="295" data-original-width="399" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoNlqS3ftH2cYvuoinnc7hYavlxY__hAM-D-keM-3Z1qORShxbpVU1-wqq_5V6iUCsrPatLdPfCau19sTLqMU8u3EQBi-QQ_F5ZsPEq1tjBY5TAg1LiY0E7vllICb_pCzItPA1PtJs738f/s0/persistence.png"/></a></div>
One thing that puzzled me in the photos was that I couldn't see any way of distinguishing the cue ball from the other balls. It seems unlikely that the player was expected to keep track of the cue ball during a break, so I guessed that it was displayed at a different brightness. The balls are all saturated in the images I have, so if they had different brightnesses, it would be hard to tell.
<br><br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpDM0MfIfuwRyFjcCc9XHWoFa2qXsqTyRX4DaukKvqZwAYQ7UjhJENJx9onHE7yu8EasRNhIHQv3ygAVsts3ajLkweTHeDFSqkLur3nMId8eWyU5jLJspKNDe_irkh10MAcsxYfxTZIDb5/s0/racked.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="231" data-original-width="420" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpDM0MfIfuwRyFjcCc9XHWoFa2qXsqTyRX4DaukKvqZwAYQ7UjhJENJx9onHE7yu8EasRNhIHQv3ygAVsts3ajLkweTHeDFSqkLur3nMId8eWyU5jLJspKNDe_irkh10MAcsxYfxTZIDb5/s0/racked.png"/></a></div>
<br>
<h4><b>The control panel</b></h4>
<br>
In MIPS, I only include controls that are directly related to the game. This includes a dial to set the angle of the cue, an analog joystick to set the position of the cue, a button to shoot the ball, a button to reset ("rack") the game, and a button to recover the cue ball after in case it falls in a hole.
<br><br>
There are other controls visible in the photos of MIDSAC Pool, but I don't know what their function was. It's likely that there were general purpose controls for calibrating the oscilloscope (e.g., aligning the beam in X/Y, setting overall brightness), but for the purposes of the MIPS simulator, I assume the display has already been calibrated.
<br><br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj5OpgB-b4e0jjnnG6OpKXjXRg8hBYTyDrFtwNxzymzh-oY287fBSqktpllQhEdFX_MA4cBv4O_JjUCHuAVJnMigUqkXY1MSH4H4DroroZ06LG_5NNnXFHc71IuJBO4VFFGA_CCxMUOqg0/s0/controls.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="273" data-original-width="751" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj5OpgB-b4e0jjnnG6OpKXjXRg8hBYTyDrFtwNxzymzh-oY287fBSqktpllQhEdFX_MA4cBv4O_JjUCHuAVJnMigUqkXY1MSH4H4DroroZ06LG_5NNnXFHc71IuJBO4VFFGA_CCxMUOqg0/s0/controls.png"/></a></div>
<br>
<h2><b>Subsequent games</b></h2>
<br>
Pool simulations would make at least two other appearances in the early history of video games, both in the mid-60s and both mentioned in the <a href="https://thinksetmag.com/insights/digital-detective-pong">Magnavox law suits</a>. One was demonstrated in 1966 by Information Displays, Inc. and allowed players to move the cue around with a light pen, while another was demonstrated by RCA in 1967 at a research center in Princeton. For more information on games mentioned in the Magnavox law suits, see this article by the <a href="http://allincolorforaquarter.blogspot.com/2013/08/early-unknown-computer-games-mentioned.html">Golden Age Arcade Historian</a>. It wouldn't be until 1976 that pool would appear in a commercial video game, with this coin-op by US Billiards.
<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbix__-yJxmsmNkJHyWt2g3z820cvZwgy7ybMQjqu_50ipPQueN5yPU3Trg5Fw9tQuzEFs-yzbZSuD8F45JFFndpCA5IN-BViJ5tWJ0kTRffKNDzARPpzVU16SgchJ2yEHBtBesFgtz-UP/s400/44bc4518-74d4-5e0f-876b-82f5b00ff678_1024x1024.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="281" data-original-width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbix__-yJxmsmNkJHyWt2g3z820cvZwgy7ybMQjqu_50ipPQueN5yPU3Trg5Fw9tQuzEFs-yzbZSuD8F45JFFndpCA5IN-BViJ5tWJ0kTRffKNDzARPpzVU16SgchJ2yEHBtBesFgtz-UP/s320/44bc4518-74d4-5e0f-876b-82f5b00ff678_1024x1024.jpg"/></a></div>
</div>
</body>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com2tag:blogger.com,1999:blog-7604980045122375946.post-58261695648537695702021-07-19T19:28:00.001-07:002021-07-30T13:11:49.424-07:00Cathode-ray Tube Amusement Device Simulator<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Cathode Ray Amusement Device Simulator</title>
<style>
* { padding: 0; margin: auto; }
canvas { background: #000; display: block; margin: auto; }
#mytext
{
padding-top:100vh;
}
</style>
</head>
<body>
<canvas id="game" width=800px height=600px></canvas>
<script>
var canvas=document.getElementById("game");
var ctx=canvas.getContext("2d");
if (window.innerWidth<800) {
ctx.canvas.width=window.innerWidth;
ctx.canvas.height=window.innerWidth*0.75;
}
var widthFull=ctx.canvas.width
var panelFraction=0.25
var panelWidth=panelFraction*widthFull
let xpos = new Array(300).fill(0)
let ypos = new Array(300).fill(0)
let spotSizes = new Array(300).fill(0)
let spotBrights = new Array(300).fill(0)
var intervalTime=10
var fadeScale1=10
var fadeScale2=100
var scaleMin=0.5
var gameDuration=30000
var maxRadiusRadar=0.85*canvas.height/2
var radarCenter=[panelWidth+(widthFull-panelWidth)/2,canvas.height/2]
// Parameters
var xInit = radarCenter[0]-maxRadiusRadar/Math.sqrt(2)
var yInit = radarCenter[1]+maxRadiusRadar/Math.sqrt(2)
var voltageInit = 0;
var radiusFocusInit = 1.0
var radiusDefocusInit = 7.0
var voltageCoeffInit = 0.5
var defocusInit = 400
var voltageEnd = 550
var brightInit=0.7
var x=xInit
var y=yInit
xpos[xpos.length-1]=xInit
ypos[xpos.length-1]=yInit
var voltage=voltageInit
var bright=brightInit
//Constants
voltageCrossCoeff=0.002
voltageInterval=3
voltageCoeffInterval=0.1
voltageEndInterval=10
radiusInterval=1
radiusExpandTime=0.1
// On-off switch
var switchX=0.5*panelWidth
var switchY=0.1*canvas.height
var switchDisplaySize=0.5
// Knobs
var interval=0
var gameInterval=0
var knobLabel=['Brightness']
var knobX=[0.25*panelWidth,0.75*panelWidth,0.25*panelWidth,0.75*panelWidth,0.25*panelWidth,0.75*panelWidth,0.5*panelWidth]
var knobY=[0.25*canvas.height,0.25*canvas.height,0.45*canvas.height,0.45*canvas.height,0.65*canvas.height,0.65*canvas.height,0.85*canvas.height]
let knobAngle = [0,0,0,0,0,0,1]
let knobActive = new Array(knobX.length).fill(0)
let knobNominal = new Array(knobX.length).fill(0)
let knobDisplaySize = new Array(knobX.length).fill(0.65)
let knobFactor = [0.3,0.3,50,50,0.3,2.0,0.2]
var knobZero=[voltageCoeffInit,voltageCoeffInit,defocusInit,defocusInit,radiusFocusInit,radiusDefocusInit,brightInit]
var knobImageAngle=-0.85
let knobDistance = new Array(knobX.length).fill(0)
var knobSensitivity = new Array(knobX.length).fill(0.01)
var knobMinAngle = new Array(knobX.length).fill(-1.5)
var knobMaxAngle = new Array(knobX.length).fill(1.5)
// Targets
var targetX=[0.8*widthFull,0.7*widthFull,0.4*widthFull]
var targetY=[0.4*canvas.height,0.6*canvas.height,0.5*canvas.height]
var targetDisplaySize=[0.3,0.7,0.5]
var targetActive=new Array(targetX.length).fill(0)
var targetDistance=new Array(targetX.length).fill(0)
var targetImage=[new Image(),new Image(),new Image()]
var targetInterval=0
// Labels
var labelText=['Trajectory','Blast Time','Spot Size','Brightness']
var labelX=[panelWidth*0.5,panelWidth*0.5,panelWidth*0.5,panelWidth*0.5]
var labelY=[canvas.height*0.33,canvas.height*0.53,canvas.height*0.73,canvas.height*0.93]
var labelSize=['18','18','18','16']
var labelSize2=['14','14','14','12']
var labelColor=new Array(labelX.length).fill('black')
// Buttons
var buttonX=[]
var buttonY=[]
var buttonPairLabels=[]
var buttonActive=[]
var buttonDistance=[]
var buttonPairVal=[]
var buttonPairInterval=[]
var buttonPairMinVal=[]
var buttonPairMaxVal=[]
for (let i=0;i<buttonPairVal.length;i++) {
buttonPairMinVal[i]=buttonPairVal[i]-10*buttonPairInterval[i]
buttonPairMaxVal[i]=buttonPairVal[i]+10*buttonPairInterval[i]
}
var buttonPairMaxVal=[]
var buttonDisplaySize=0.5
// States
var switchState=0
var buttonState=0
var defocusOn=0
var touchLifted=1;
// Sizes
var switchSize=[93,103]
var targetSize=[62,81,80]
var buttonSize=[93,103]
var knobSize=[75,74]
var frameSize=[547,465]
var panelSize=[232,465]
//Click Distances
var switchClickDistance=switchSize[0]*switchDisplaySize/2*panelWidth/panelSize[0]
var targetClickDistance= new Array(targetX.length).fill(0)
for (i=0;i<targetX.length;i++) {
targetClickDistance[i]=targetSize[i]*targetDisplaySize[i]/2*panelWidth/panelSize[0]
}
var knobClickDistance=knobSize[0]*knobDisplaySize[0]/2*panelWidth/panelSize[0]
document.addEventListener("mousedown",mouseDownHandler, false);
document.addEventListener("mousemove",mouseMoveHandler, false);
document.addEventListener("mouseup",mouseUpHandler, false);
document.addEventListener("touchstart",touchDownHandler, false);
document.addEventListener("touchmove",touchMoveHandler, false);
document.addEventListener("touchend",touchUpHandler, false);
function getTouchPos(cvas, evt) {
var rect = cvas.getBoundingClientRect();
return {
x: evt.touches[0].clientX-rect.left,
y: evt.touches[0].clientY-rect.top
}
}
function getMousePos(cvas, evt) {
var rect = cvas.getBoundingClientRect();
return {
x: evt.clientX-rect.left,
y: evt.clientY-rect.top
}
}
function drawImage(drawContext,img,xi,yi,scalei,anglei) {
var vxi = Math.cos(anglei)*scalei;
var vyi = Math.sin(anglei)*scalei;
var imH = -(img.height/2);
var imW = -(img.width/2);
xi+=imW*vxi+imH*-vyi;
yi+=imW*vyi+imH*vxi;
drawContext.setTransform(vxi,vyi,-vyi,vxi,xi,yi);
drawContext.drawImage(img,0,0);
drawContext.setTransform(1,0,0,1,0,0);
}
function touchUpHandler(e) {
e.preventDefault()
touchLifted=1;
for (let i=0;i<knobX.length;i++) {
knobActive[i]=0
knobNominal[i]=knobAngle[i]
if (switchState==0) {
clearInterval(interval)
}
}
for (let i=0;i<buttonX.length;i++) {
buttonActive[i]=0
}
for (let i=0;i<targetX.length;i++) {
targetActive[i]=0
clearInterval(targetInterval)
}
draw()
}
function touchDownHandler(e) {
e.preventDefault()
if (touchLifted==1) {
touchLifted=0
touchpos=getTouchPos(canvas,e)
checkKnobAction(touchpos)
checkSwitchAction(touchpos)
checkTargetAction(mousepos)
}
}
function mouseDownHandler(e) {
e.preventDefault()
mousepos=getMousePos(canvas,e)
checkKnobAction(mousepos)
checkSwitchAction(mousepos)
checkTargetAction(mousepos)
}
function touchMoveHandler(e) {
e.preventDefault()
touchpos=getTouchPos(canvas,e)
if (touchLifted==0) {
for (let i=0;i<targetX.length;i++) {
if (targetActive[i]==1) {
radarDistance=Math.sqrt(Math.pow(radarCenter[0]-touchpos.x,2)+Math.pow(radarCenter[1]-touchpos.y,2))
if (radarDistance<maxRadiusRadar*0.9) {
targetX[i]=touchpos.x
targetY[i]=touchpos.y
}
}
}
}
}
function mouseMoveHandler(e) {
e.preventDefault()
mousepos=getMousePos(canvas,e)
for (let i=0;i<targetX.length;i++) {
if (targetActive[i]==1) {
radarDistance=Math.sqrt(Math.pow(radarCenter[0]-mousepos.x,2)+Math.pow(radarCenter[1]-mousepos.y,2))
if (radarDistance<maxRadiusRadar*0.9) {
targetX[i]=mousepos.x
targetY[i]=mousepos.y
}
}
}
}
function mouseUpHandler(e) {
for (let i=0;i<knobX.length;i++) {
knobActive[i]=0
knobNominal[i]=knobAngle[i]
if (switchState==0) {
clearInterval(interval)
}
}
for (let i=0;i<buttonX.length;i++) {
buttonActive[i]=0
}
for (let i=0;i<targetX.length;i++) {
targetActive[i]=0
clearInterval(targetInterval)
}
draw()
}
function checkTargetAction(actionPosition) {
targetFound=0
for (let i=0;i<targetX.length;i++) {
targetDistance[i]=Math.sqrt(Math.pow(targetX[i]-actionPosition.x,2)+Math.pow(targetY[i]-actionPosition.y,2))
if (targetDistance[i]<targetClickDistance[i] && targetActive[i]==0 && switchState==0 && targetFound==0) {
targetActive[i]=1
targetFound=1
clearInterval(targetInterval)
targetInterval=setInterval(draw,intervalTime)
}
}
}
function checkKnobAction(actionPosition) {
for (let i=0;i<knobX.length;i++) {
knobDistance[i]=Math.sqrt(Math.pow(knobX[i]-actionPosition.x,2)+Math.pow(knobY[i]-actionPosition.y,2))
if (knobDistance[i]<knobClickDistance && knobActive[i]==0) {
knobActive[i]=1
if (actionPosition.x-knobX[i]<0) {
knobDirection=-1
} else{
knobDirection=1
}
clearInterval(interval)
interval=setInterval(draw,intervalTime)
}
}
}
function checkSwitchAction(actionPosition) {
switchDistance=Math.sqrt(Math.pow(switchX-actionPosition.x,2)+Math.pow(switchY-actionPosition.y,2))
if (switchDistance<switchClickDistance) {
switchState=(switchState+1)%2;
if (switchState==0) {
clearInterval(gameInterval)
gameStop();
} else {
gameStart();
clearInterval(gameInterval)
gameInterval=setInterval(gameStop,gameDuration)
}
}
}
function checkButtonAction(actionPosition) {
for (let i=0;i<buttonX.length;i++) {
buttonDistance[i]=Math.sqrt(Math.pow(buttonX[i]-actionPos.x,2)+Math.pow(buttonY[i]-actionPos.y,2))
if (buttonDistance[i]<switchClickDistance && buttonActive[i]==0) {
buttonActive[i]=1
if (i%2==0) {
buttonPairVal[i/2]+=buttonPairInterval[i/2]
if (buttonPairVal[i/2]>buttonPairMaxVal[i/2]) {
buttonPairVal[i/2]=buttonPairMaxVal[i/2]
}
} else {
buttonPairVal[(i-1)/2]-=buttonPairInterval[(i-1)/2]
if (buttonPairVal[(i-1)/2]<buttonPairMinVal[(i-1)/2]) {
buttonPairVal[(i-1)/2]=buttonPairMinVal[(i-1)/2]
}
}
}
}
}
function getBeamSize() {
defocusPoint=knobAngle[2]*knobFactor[2]+knobZero[2]+knobAngle[3]*knobFactor[3]
if (voltage>defocusPoint) {
knobVal=knobAngle[5]*knobFactor[5]+knobZero[5]
} else {
knobVal=knobAngle[4]*knobFactor[4]+knobZero[4]
}
return knobVal;
}
function getBeamFade(frame,saturated) {
expFactor1=Math.exp(-frame/fadeScale1)
expFactor2=Math.exp(-frame/fadeScale2)*0.3
if (saturated==1) {
expFactor=(expFactor1+expFactor2)/1.3
} else {
expFactor=expFactor1
}
return expFactor
}
function getBeamBright() {
beamBrightness=knobAngle[6]*knobFactor[6]+knobZero[6]
if (voltage>defocusPoint) {
beamBrightness=beamBrightness/6
}
return beamBrightness
}
function gameStop() {
switchState=0
gameReset()
clearInterval(interval)
draw()
}
function gameReset() {
for (let i=0;i<xpos.length; i++) {
// xpos[i]=0
// ypos[i]=0
// spotSizes[i]=0
// spotBrights[i]=0
}
x=xInit
y=yInit
voltage=voltageInit
xpos[xpos.length-1]=x
ypos[xpos.length-1]=y
spotSizes[xpos.length-1]=getBeamSize()
spotBrights[xpos.length-1]=getBeamBright()
}
function gameStart() {
for (let i=0;i<xpos.length; i++) {
xpos[i]=0
ypos[i]=0
spotSizes[i]=0
spotBrights[i]=0
}
clearInterval(interval)
interval = setInterval(draw,intervalTime);
}
function draw() {
drawPanel()
ctx.clearRect(panelWidth,0,canvas.width,canvas.height);
scale=getBeamSize()
brightness=getBeamBright()
drawBeam(x,y,scale,brightness)
if (switchState==1) {
for (let i=0;i<xpos.length; i++) {
if (spotSizes[i]<4) {
brightness=getBeamFade(xpos.length-i,1)*spotBrights[i]
scale=getBeamFade(xpos.length-i,1)*spotSizes[i]
} else {
brightness=getBeamFade(xpos.length-i,0)*spotBrights[i]
scale=spotSizes[i]
}
if (xpos[i]>panelWidth && ypos[i]>0 && brightness>0.02) {
drawBeam(xpos[i],ypos[i],scale,brightness);
}
}
for (let i = 0; i<xpos.length-1; i++) {
xpos[i]=xpos[i+1]
ypos[i]=ypos[i+1]
spotSizes[i]=spotSizes[i+1]
spotBrights[i]=spotBrights[i+1]
}
xpos[xpos.length-1]=x
ypos[xpos.length-1]=y
voltage+=voltageInterval
spotSizes[xpos.length-1]=getBeamSize()
spotBrights[xpos.length-1]=getBeamBright()
voltageCoeffX=knobAngle[0]*knobFactor[0]+knobZero[0]
voltageCoeffY=1-voltageCoeffX
y -= voltageInterval*voltageCoeffY*canvas.height/600
x += 2*voltageInterval*voltageCoeffX*voltageCrossCoeff*voltage*canvas.height/600
if (voltage>voltageEnd) {
gameReset()
}
}
ctx.globalAlpha=1
ctx.drawImage(frameImage,panelWidth,0,widthFull-panelWidth,canvas.height)
drawRadarLines()
drawTargets()
}
function drawTargets() {
for(let i=0;i<targetX.length;i++) {
drawImage(ctx,targetImage[i],targetX[i],targetY[i],targetDisplaySize[i]*panelWidth/panelSize[0],0)
}
}
function drawLabels() {
for(let i=0;i<labelX.length;i++) {
if (canvas.height<400) {
fontString=labelSize2[i].concat('px Courier New')
} else {
fontString=labelSize[i].concat('px Courier New')
}
ctx.font = fontString
ctx.strokeStyle = labelColor[i]
ctx.textAlign = 'center';
ctx.lineWidth = 1
ctx.strokeText(labelText[i],labelX[i],labelY[i])
ctx.stroke()
}
}
function drawPanel() {
ctx.clearRect(0,0,panelWidth,canvas.height);
ctx.drawImage(panelImage,0,0,panelWidth,canvas.height)
drawSwitch()
for (i=0;i<knobX.length;i++) {
drawImage(ctx,knobImage,knobX[i],knobY[i],panelWidth/panelSize[0]*knobDisplaySize[i],knobAngle[i]-knobImageAngle)
if (knobActive[i]==1) {
knobAngle[i]+=knobSensitivity[i]*knobDirection;
if (i==0) {
knobAngle[1]-=knobSensitivity[i]*knobDirection;
}
if (i==1) {
knobAngle[0]-=knobSensitivity[i]*knobDirection;
}
}
if (knobAngle[i]<knobMinAngle[i]) {
knobAngle[i]=knobMinAngle[i]
}
if (knobAngle[i]>knobMaxAngle[i]) {
knobAngle[i]=knobMaxAngle[i]
}
}
drawLabels()
ctx.moveTo(panelWidth,canvas.height)
ctx.lineTo(panelWidth,0)
ctx.lineWidth=4
ctx.stroke()
}
function drawSwitch() {
if (switchState==0) {
drawImage(ctx,switch2Image,switchX,switchY,panelWidth/panelSize[0]*switchDisplaySize,0)
} else {
drawImage(ctx,switch1Image,switchX,switchY,panelWidth/panelSize[0]*switchDisplaySize,0)
}
}
function drawButton(xp,yp,scalep,active) {
if (active==0) {
drawImage(ctx,button2Image,xp,yp,scalep*buttonDisplaySize,0)
} else {
drawImage(ctx,button1Image,xp,yp,scalep*buttonDisplaySize,0)
}
}
function drawRadarLines() {
radiusRadar=[0.2,0.4,0.6,0.8,1.0]
ctx.strokeStyle = "Green"
ctx.lineWidth = 2
ctx.globalCompositionOperation='destination-over'
linesRadar=[0,Math.PI/2,Math.PI,Math.PI/2*3]
for (let i=0;i<linesRadar.length;i++) {
radarLineEndX=radarCenter[0]+Math.cos(linesRadar[i])*maxRadiusRadar
radarLineEndY=radarCenter[1]+Math.sin(linesRadar[i])*maxRadiusRadar
ctx.beginPath()
ctx.moveTo(radarCenter[0],radarCenter[1])
ctx.lineTo(radarLineEndX,radarLineEndY)
ctx.stroke()
}
for (let i=0;i<radiusRadar.length;i++) {
circle=new Path2D();
circle.arc(radarCenter[0],radarCenter[1],radiusRadar[i]*maxRadiusRadar,0,2*Math.PI)
ctx.stroke(circle)
}
}
function drawBeam(xp,yp,scale,brightness) {
ctx.beginPath();
ctx.globalAlpha=brightness
if (scale<scaleMin) {
scale=scaleMin
}
drawImage(ctx,ballImage, xp, yp, scale*widthFull/800,0 );
ctx.globalAlpha=1
ctx.closePath();
}
function loadSprites() {
ballImage=new Image();
ballImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWUtkOut75rgX2fLkmudqvpZzSZsKEJ6Bb9TP8AChuJWcQ_oyOOSp2K_qiErnu7lhfswL3J7RvtggwfZ08ae2PlEDHArxyE0e5gTxpNawOnQogQfMvxWi57VsATmdbFNwXB6a96tOEUhx9/s8/0001.png"
ballImage.onload = function () {
draw()
}
panelImage=new Image(panelSize[0],panelSize[1]);
panelImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9aWmbdqNJ2cLIE69L1spFZQgE_fDterW8yfTmFqL-rfs3qPaetsySidbu5SyJkNITShRUuBwCmAY-UmbEY_FlezBwRbWcBE3aSKj0Nd59KRLXg9oEobJbnbG_dsncxG5CiwT-BkCl-mYy/s600/wood.png"
panelImage.onload = function () {
draw()
}
knobImage=new Image(knobSize[0],knobSize[1]);
knobImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTabTsIPabIgnhkbCQjWjg1iOrgseIITuAwdC6PJmLLcQYVephh4LOcewDYSfe3X0TM27Aps15ofQi0pwiobwiwFrM4k6NPv5hYYMHf2zknnlgEDLO8lxcb2YmCCooTAy35XGu4OIsZRCL/s75/knob2.png"
knobImage.onload = function () {
draw()
}
switch1Image=new Image(switchSize[0],switchSize[1]);
switch1Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpEIKpdm9eUWmY6UwKPL2U7epa9q9RtTsAvrU3nGbGRRJXaOC6YZyUJ6MAjBbHx-0Ze-lJ8VzXuWnATaZindkXyUDfcAjkTClMQNs0_NLQCjCCH6rWWlbf55EiN6Ed5Z2Ey-U6h45WT_or/s103/radiobutton1.png"
switch1Image.onload = function () {
draw()
}
switch2Image=new Image(switchSize[0],switchSize[1]);
switch2Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK66T7heDZPFZNpweiOJ-V5V3-Vt_E3xnrxM80zCXCtV0g-WtvOuxn0GoDIj3o43eCLZIJ1YHlPouVmVPpvtJH5hvepl4swENKPV8QLARPMwu7tSUVJC2Bj62XQF9Cl1ktTLx4rRJ-9njK/s103/radiobutton2.png"
switch2Image.onload = function () {
draw()
}
button1Image=new Image(buttonSize[0],buttonSize[1]);
button1Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpEIKpdm9eUWmY6UwKPL2U7epa9q9RtTsAvrU3nGbGRRJXaOC6YZyUJ6MAjBbHx-0Ze-lJ8VzXuWnATaZindkXyUDfcAjkTClMQNs0_NLQCjCCH6rWWlbf55EiN6Ed5Z2Ey-U6h45WT_or/s103/radiobutton1.png"
button1Image.onload = function () {
draw()
}
button2Image=new Image(buttonSize[0],buttonSize[1]);
button2Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK66T7heDZPFZNpweiOJ-V5V3-Vt_E3xnrxM80zCXCtV0g-WtvOuxn0GoDIj3o43eCLZIJ1YHlPouVmVPpvtJH5hvepl4swENKPV8QLARPMwu7tSUVJC2Bj62XQF9Cl1ktTLx4rRJ-9njK/s103/radiobutton2.png"
button2Image.onload = function () {
draw()
}
targetImage[0]=new Image();
targetImage[0].src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz2N27aPSJbxYpQUWV1OvP5Qdz66L4py4x0Onfcpjaighb3lI-nnJTOYG949P4syougTn83PRjUnGZXICUU4dw_gZ23Ng8aPK-db1N3h1sTS40oxfRK0QeXRqNqiKoDiPMnxDtBAWW9cd5/s165/plane1.png"
targetImage[0].onload = function () {
draw()
}
targetImage[1]=new Image();
targetImage[1].src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSEe14iBhj2NVs8sQZmVJkFp7PFhPM2_CsTaQh3y_9U7zGNwAWBTSYJMJNk3Kvx9oDY7Z4L9Q_NsA4Fwp9psyiq6XtZz4yIIqgrJml46yLr4jkiddUnYe7e_30VZ2PKHnc8iSA84ti63BQ/s81/ship1.png"
targetImage[1].onload = function () {
draw()
}
targetImage[2]=new Image();
targetImage[2].src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi-1Y3OuV_Wr92xTUR_TMMAoE_a0uJNdSfWKCTzCibUUokdv3MCOpEmNE2EfC-fSYXWHOhst4jA0UFH6fc2RUUzg4XIwdsjc3IdJ7NWEEEXxt91s0nm2XExAKd6prjMhbAzCh07iL5Rp82/s80/plane2.png"
targetImage[2].onload = function () {
draw()
}
frameImage=new Image(frameSize[0],frameSize[1]);
frameImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBA7rH6Ixpep1Cv4vy2i6M8IkITCLqt7mvrB1TuyLS7Icqq5zIDxla1vDIU_1p5RdLHeHGKs9369-VH8Q73JxtBOl2HozQ4ZWCv1iQk8Ls2F8OtiSwrNK3XqFZ5ODUZq3Q72aI7SRPujeV/s518/frame_cut.png"
frameImage.onload = function () {
draw()
}
}
loadSprites()
drawRadarLines()
</script>
<div id="MyText">
<br>
<h2><b><i>Cathode-Ray Tube Amusement Device Simulator (CRADS)</i></b></h2>
<br>
To play the Cathode-Ray Tube Amusement Device Simulator (CRADS), drag the planes and ships across the radar screen until they're in positions that you wish to target. When you're satisfied with their configuration, press the silver button at the top of the panel to start firing at them. You then have 30 seconds to adjust the "Trajectory" and "Blast Time" knobs so that the blasts detonate at the locations of the targets.
<br><br>
Just as in the original game, the device has no way of knowing when you hit the targets, so you have to make your own judgement about whether or not you've been successful. In order to hit your targets, you'll probably need to adjust the trajectory and blast time, which are controlled with the top four dials (see below for details on the controls). You can also control the size of your shells, the size of the blast, and the brightness of your shots as they appear on the screen.
<br><br>
Note that CRADS is designed to come as close as possible to the device described in the 1947 <a href="https://worldwide.espacenet.com/patent/search/family/024910470/publication/US2455992A?q=pn%3DUS2455992">Goldsmith-Mann patent</a>.
<br><br>
<h3><b>History of CRADS and the Original Goldsmith-Mann Game</b></h3>
<br>
The cathode-ray tube amusement device has an interesting place in video game histories, in that it's frequently mentioned at the beginning, but is generally not considered to be a video game. There are many conflicting accounts of its capabilities and the only visual aids provided by most sources are the circuit diagrams from the patent. I wasn't very satisfied with this state of things, so I decided to make CRADS to provide people both a visual and an interactive demonstration of what Goldsmith and Mann proposed in 1947.
<br><br>
Development of the original game was led by Thomas T. Goldsmith Jr., an engineer working for DuMont laboratories. DuMont was primarily a television broadcaster and a manufacturer of television-related equipment, but they also did research on general cathode-ray tube applications. Goldsmith's amusement device was intended to demonstrate the commercial possibilities of cathode-ray tube technology beyond television, but it never went into commercial production.
<br><br>
Most of what's known about the device is encoded in a five-page patent application by Goldsmith and his collaborator, Estle Ray Mann. A handmade prototype was made, presumably for demonstration at DuMont, but I did not find any detailed descriptions of it, so I used the patent as the primary source for designing CRADS.
<br><br>
<h3><b>The Display</b></h3>
<br>
There is no footage, or even photographs, of what the game's display looked like, but the patent clearly describes the use of a cathode-ray tube being impacted by a narrow electron beam. If you look at footage of action games from the '50s and '60s, like <a href="https://www.youtube.com/watch?v=6PG2mdU_i8k">Tennis for Two</a> or <a href="https://www.youtube.com/watch?v=1EWQYAfuMYw?t=883">Spacewar!</a>, you'll see they tend to have a lot of image persistence. It's likely that the cathode-ray tube amusement device had similar effects, so I've added a persistence model to the CRADS display.
<br><div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxMkbefEbFx7RUhVyeS5qvTzD-h31JJnfHhGsZK2hjzLSPRLhHModCZHEIFHm7CoHVlcUngfhGLkUFFXRktWop3HbBpwo1iPtzHB2pyS0o_fk0NcRlx8ZIHgCfC2RHciPcftOuiB5Q5aEX/s299/Dual-beam_Cathode_Ray_Oscillograph%252C_DuMont_Laboratories%252C_c._1950s_-_National_Electronics_Museum_-_DSC00101_%2528cropped%2529.JPG" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="320" data-original-height="299" data-original-width="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxMkbefEbFx7RUhVyeS5qvTzD-h31JJnfHhGsZK2hjzLSPRLhHModCZHEIFHm7CoHVlcUngfhGLkUFFXRktWop3HbBpwo1iPtzHB2pyS0o_fk0NcRlx8ZIHgCfC2RHciPcftOuiB5Q5aEX/s320/Dual-beam_Cathode_Ray_Oscillograph%252C_DuMont_Laboratories%252C_c._1950s_-_National_Electronics_Museum_-_DSC00101_%2528cropped%2529.JPG"/></a></div>
The persistence model is a stack of 300 images from previous frames that are all plotted at once. The brightness of each image depends on how far down the stack it is. When the beam is focused, I also add a steady decrease in image size, in order to model saturation effects.
<br><br>
<h3><b>The Control Panel</b></h3>
<br>
The hardest part of making CRADS was the controls. The patent application has a diagram showing how Goldsmith and Mann envisioned the layout of the controls, and the CRADS layout mirrors that diagram, but the relationship between the various knobs and the moving spot is not always clear. I'm not an electrical engineer and would not claim to understand everything in the circuit diagrams, but I did my best to dissect the patent application to determine the function of each knob. The details of this dissection are beyond the scope of the present article, but I may elaborate in a subsequent entry if there is interest.
<br><br>
The Goldsmith-Mann controls are not what one would call user-friendly. The trajectory knobs are attached to a common control, making them redundant with each other. The blast time knobs are not attached to a common control, but are used to adjust the same thing and could have been combined into a single knob. The blast size knobs do have different functions -- the left one controls the size of the undetonated shell and the right one controls that of the detonated shell -- but they have little to do with the gameplay and probably should have been left to the operator to configure. Likewise, the brightness control is analogous to a screen brightness adjuster on a TV set and has nothing to do with the game, per se.
<br><br>
It may be that the controls were intentionally made to look complex so as to give the player the feeling that they were operating a real radar system. It may also be that determining the function of the controls was part of the game. However, I think it's more likely that Goldsmith and Mann simply hadn't yet put much thought into gamifying their invention. The purpose of the patent, in this case, was to protect the technology behind the game, not its detailed mechanics.
<br><br>
<h2><b>Relationship to Subsequent Games</b></h2>
<br>
The Goldsmith-Mann device stands out among the early video game candidates because it wasn't produced as part of the nascent computing revolution, and was something of a technological dead end. Add this to the fact that it never went into widespread production, and it seems unlikely that it had much influence on subsequent game development.
<br><br>
Nevertheless, playing CRADS, I can't help thinking of how much it resembles the artillery duels that frequented early home computers and video game consoles. Those games simulated ballistic motion of a shell fired from a gun emplacement, where you would input an initial angle (and sometimes speed) to hit a target at a predetermined point.<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnmmicZYbfOR_8OpPinANkfll0jaiTjop8TXaN-cf4R7h8XdDz30QFP0mqIKCrNJMhOH1LU6lEg-8GkS7SXjQJDy2o6FCAgWOV3AaIVw-aNF-LXao90EKAzZDrRCQFCGrCZ_skBsiImG2_/s319/artilleryduel.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="Gameplay from 1982 game Artillery Duel, for the Astrocade console." border="0" width="320" data-original-height="191" data-original-width="319" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnmmicZYbfOR_8OpPinANkfll0jaiTjop8TXaN-cf4R7h8XdDz30QFP0mqIKCrNJMhOH1LU6lEg-8GkS7SXjQJDy2o6FCAgWOV3AaIVw-aNF-LXao90EKAzZDrRCQFCGrCZ_skBsiImG2_/s320/artilleryduel.gif"/></a></div>
Unlike in artillery duels, the motion of the shells in CRADS do not attempt to follow real physical laws, but they do have you tune the initial parameters in order to hit a target.
<br><br>
<h2><b>Is It the First Video Game?</b></h2>
<br>
One reason I wanted to make CRADS was to give people an opportunity to judge for themselves whether or not they think it should qualify as a video game. I may give my own opinion in a later entry, but for now, just give it a try and feel free to drop comments with your thoughts on the question.
</div>
</body>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com4tag:blogger.com,1999:blog-7604980045122375946.post-35568797844722188342021-07-15T08:20:00.000-07:002021-07-15T08:20:07.825-07:00The Whirlwind Bouncing Ball Simulator<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>MIT Whirlwind's Bouncing Ball</title>
<style>
* { padding: 0; margin: auto; }
canvas { background: #000; display: block; margin: auto; }
#mytext
{
padding-top:100vh;
}
</style>
</head>
<body>
<canvas id="game" width=770px height=465px></canvas>
<script>
var realImages=1;
var canvas=document.getElementById("game");
var ctx=canvas.getContext("2d");
if (window.innerWidth<770) {
ctx.canvas.width=window.innerWidth;
ctx.canvas.height=window.innerWidth*0.604;
}
var widthFull=ctx.canvas.width
var panelFraction=0.301
var panelWidth=panelFraction*widthFull
let xpos = new Array(50).fill(0)
let ypos = new Array(50).fill(0)
var intervalTime=30
var floorIntervalTime=4
var fadeScale=7
// Parameters
var xInit = widthFull*(panelFraction+0.1*(1-panelFraction));
var yInit = 0.15*canvas.height;
var vyInit = 0;
var vxInit = 2;
var RCoeffInit=0.8;
var gInit = 0.5;
var x=xInit
var y=yInit
var vy=vyInit
var vx=vxInit
var g=gInit
var RCoeff=RCoeffInit
var holeDistance=0
// Constants
var floor=0.15*canvas.height;
var ballRadius = 4;
var holePosition=widthFull*(panelFraction+(1-panelFraction)*0.8);
var holeWidth=10;
var floorSpeed=4;
// On-off switch
var switchClickDistance=30
var switchX=0.2*panelWidth
var switchY=0.125*canvas.height
// Hole Button
var buttonX=0.8*panelWidth
var buttonY=0.125*canvas.height
var buttonLabel=''
// Knobs
var knobClickDistance=40
var interval=0
var knobLabel=['Speed','Bounce','Gravity']
var knobX=[0.5*panelWidth,0.5*panelWidth,0.5*panelWidth]
var knobY=[0.22*canvas.height,0.5*canvas.height,0.78*canvas.height]
var knobAngle=[0,0,0]
var knobActive=[0,0,0]
var knobFactor=[0.5,0.075,0.25]
var knobNominal=[0,0,0]
var knobZero=[vxInit,RCoeffInit,gInit]
var knobDistance=[0,0,0]
var knobMinAngle=-1.5
var knobMaxAngle=1.5
var knobImageAngle=0.8
var knobInterval=setInterval(drawPanel,intervalTime)
var knobSensitivity=0.01
// States
var throughHole=0;
var switchState=0
var buttonState=0
var floorMode=0;
var touchLifted=1;
// Sizes
var switchSize=[34,60]
var buttonSize=[56,45]
var knobSize=[64,64]
var frameSize=[547,465]
var panelSize=[232,465]
document.addEventListener("mousedown",mouseDownHandler, false);
document.addEventListener("mouseup",mouseUpHandler, false);
document.addEventListener("touchstart",touchDownHandler, false);
document.addEventListener("touchend",touchUpHandler, false);
function getTouchPos(cvas, evt) {
var rect = cvas.getBoundingClientRect();
return {
x: evt.touches[0].clientX-rect.left,
y: evt.touches[0].clientY-rect.top
}
}
function getMousePos(cvas, evt) {
var rect = cvas.getBoundingClientRect();
return {
x: evt.clientX-rect.left,
y: evt.clientY-rect.top
}
}
function drawImage(drawContext,img,xi,yi,scalei,anglei) {
var vxi = Math.cos(anglei)*scalei;
var vyi = Math.sin(anglei)*scalei;
var imH = -(img.height/2);
var imW = -(img.width/2);
xi+=imW*vxi+imH*-vyi;
yi+=imW*vyi+imH*vxi;
drawContext.setTransform(vxi,vyi,-vyi,vxi,xi,yi);
drawContext.drawImage(img,0,0);
drawContext.setTransform(1,0,0,1,0,0);
}
function touchUpHandler(e) {
e.preventDefault()
touchLifted=1;
for (let i=0;i<knobX.length;i++) {
knobActive[i]=0
knobNominal[i]=knobAngle[i]
clearInterval(knobInterval)
}
}
function touchDownHandler(e) {
e.preventDefault()
if (touchLifted==1) {
touchLifted=0
touchpos=getTouchPos(canvas,e)
for (let i=0;i<knobX.length;i++) {
knobDistance[i]=Math.sqrt(Math.pow(knobX[i]-touchpos.x,2)+Math.pow(knobY[i]-touchpos.y,2))
if (touchpos.x-knobX[i]<0) {
knobDirection=-1
} else{
knobDirection=1
}
if (knobDistance[i]<knobClickDistance && knobActive[i]==0) {
knobActive[i]=1
knobInterval=setInterval(drawPanel,10)
}
}
switchDistance=Math.sqrt(Math.pow(switchX-touchpos.x,2)+Math.pow(switchY-touchpos.y,2))
if (switchDistance<switchClickDistance) {
switchState=(switchState+1)%2;
drawSwitch();
if (switchState==0) {
gameStop();
} else {
gameStart();
}
}
buttonDistance=Math.sqrt(Math.pow(buttonX-touchpos.x,2)+Math.pow(buttonY-touchpos.y,2))
if (buttonDistance<switchClickDistance) {
buttonState=(buttonState+1)%2;
draw();
}
}
}
function mouseUpHandler(e) {
e.preventDefault()
for (let i=0;i<knobX.length;i++) {
knobActive[i]=0
knobNominal[i]=knobAngle[i]
clearInterval(knobInterval)
}
}
function mouseDownHandler(e) {
e.preventDefault()
mousepos=getMousePos(canvas,e)
for (let i=0;i<knobX.length;i++) {
knobDistance[i]=Math.sqrt(Math.pow(knobX[i]-mousepos.x,2)+Math.pow(knobY[i]-mousepos.y,2))
if (mousepos.x-knobX[i]<0) {
knobDirection=-1
} else{
knobDirection=1
}
if (knobDistance[i]<knobClickDistance && knobActive[i]==0) {
knobActive[i]=1
knobInterval=setInterval(drawPanel,10)
}
}
switchDistance=Math.sqrt(Math.pow(switchX-mousepos.x,2)+Math.pow(switchY-mousepos.y,2))
if (switchDistance<switchClickDistance) {
switchState=(switchState+1)%2;
drawSwitch();
if (switchState==0) {
gameStop();
} else {
gameStart();
}
}
buttonDistance=Math.sqrt(Math.pow(buttonX-mousepos.x,2)+Math.pow(buttonY-mousepos.y,2))
if (buttonDistance<switchClickDistance) {
buttonState=(buttonState+1)%2;
draw()
}
}
function mouseUpHandler(e) {
for (let i=0;i<knobX.length;i++) {
knobActive[i]=0
knobNominal[i]=knobAngle[i]
clearInterval(knobInterval)
}
}
function gameStop() {
clearInterval(interval)
ctx.clearRect(panelWidth,0,canvas.width,canvas.height);
ctx.drawImage(frameImage,panelWidth,0,widthFull-panelWidth,canvas.height)
}
function gameReset() {
floorMode=0
// for (let i=0;i<xpos.length; i++) {
// xpos[i]=0
// ypos[i]=0
// }
x=xInit
y=yInit
vy=vyInit
vx=vxInit
RCoeff=RCoeffInit
g=gInit
}
function gameStart() {
for (let i=0;i<xpos.length; i++) {
xpos[i]=0
ypos[i]=0
}
clearInterval(interval)
floorMode=1
interval = setInterval(draw,floorIntervalTime);
}
function draw() {
ctx.clearRect(panelWidth,0,canvas.width,canvas.height);
ctx.globalAlpha=0.95+(0.5-Math.random())*0.1
if (buttonState==1 && switchState==1) {
drawHole(holePosition,canvas.height-floor,holeWidth)
}
if (floorMode==0) {
vx=knobAngle[0]*knobFactor[0]+knobZero[0]
g=knobAngle[2]*knobFactor[2]+knobZero[2]
RCoeff=knobAngle[1]*knobFactor[1]+knobZero[1]
} else {
vx=floorSpeed
g=0
vy=0
y=canvas.height-floor
}
holeDistance=Math.abs(x+vx-holePosition)
if(y<=canvas.height-floor-ballRadius && y+vy>canvas.height-floor-ballRadius && holeDistance<holeWidth/2-ballRadius) {
throughHole=1;
}
if(y+vy>canvas.height-floor-ballRadius && throughHole==0) {
vy=-vy*RCoeff;
}
for (let i=0;i<xpos.length; i++) {
if (floorMode==0) {
ctx.globalAlpha=Math.exp(-(xpos.length-i-1)/fadeScale)
// ctx.globalAlpha=1-(xpos.length-i-1)/fadeScale
// scale=1-(xpos.length-i-1)/fadeScale
scale=Math.exp(-(xpos.length-i-1)/fadeScale)
} else {
// ctx.globalAlpha=1-(xpos.length-i-1)/fadeScale*floorIntervalTime/intervalTime
ctx.globalAlpha=Math.exp(-(xpos.length-i-1)/fadeScale*floorIntervalTime/intervalTime)
scale=Math.exp(-(xpos.length-i-1)/fadeScale*floorIntervalTime/intervalTime)
}
if (xpos[i]>0 && ypos[i]>0 && scale>0.05 && (Math.abs(xpos[i]-holePosition)>holeWidth/2 || floorMode==0) && switchState==1) {
drawBall(xpos[i],ypos[i],scale);
}
}
x += vx;
vy += g;
y += vy;
if (y>canvas.height-floor-ballRadius && throughHole==0) {
y=canvas.height-floor-ballRadius
}
for (let i = 0; i<xpos.length-1; i++) {
xpos[i]=xpos[i+1]
ypos[i]=ypos[i+1]
}
xpos[xpos.length-1]=x
ypos[xpos.length-1]=y
if (x>canvas.width+5*ballRadius && switchState==1) {
x=panelWidth;
vy=0;
throughHole=0;
if (g>0) {
for (let i=0;i<xpos.length; i++) {
xpos[i]=0
ypos[i]=0
}
clearInterval(interval)
interval = setInterval(draw,floorIntervalTime);
floorMode=1
} else {
clearInterval(interval)
interval = setInterval(draw,intervalTime);
gameReset()
}
}
ctx.drawImage(frameImage,panelWidth,0,widthFull-panelWidth,canvas.height)
}
function drawPanel() {
ctx.clearRect(0,0,panelWidth,canvas.height);
ctx.drawImage(panelImage,0,0,panelWidth,canvas.height)
drawSwitch()
drawButton()
for (i=0;i<knobX.length;i++) {
// drawImage(ctx,knobImage,knobX[i],knobY[i],panelWidth/panelSize[0],knobAngle[i]-knobImageAngle)
drawImage(ctx,knobImage,knobX[i],knobY[i],panelWidth/panelSize[0],knobAngle[i]-knobImageAngle)
if (knobActive[i]==1) {
knobAngle[i]+=knobSensitivity*knobDirection;
}
if (knobAngle[i]<knobMinAngle) {
knobAngle[i]=knobMinAngle
}
if (knobAngle[i]>knobMaxAngle) {
knobAngle[i]=knobMaxAngle
}
if (widthFull>600) {
ctx.font = '18px Courier New';
} else {
ctx.font = '16px Courier New';
}
ctx.strokeStyle = "Black";
ctx.textAlign = 'center';
ctx.strokeText(knobLabel[i],knobX[i],knobY[i]+knobImage.height*panelWidth/panelSize[0]);
ctx.stroke();
}
}
function drawSwitch() {
if (switchState==0) {
drawImage(ctx,switch2Image,switchX,switchY,panelWidth/panelSize[0],0)
} else {
drawImage(ctx,switch1Image,switchX,switchY,panelWidth/panelSize[0],0)
}
}
function drawButton() {
if (buttonState==0) {
drawImage(ctx,button2Image,buttonX,buttonY,panelWidth/panelSize[0],0)
} else {
drawImage(ctx,button1Image,buttonX,buttonY,panelWidth/panelSize[0],0)
}
// ctx.strokeStyle = "Black";
// ctx.textAlign = 'center';
// ctx.strokeText(buttonLabel,buttonX,buttonY+button1Image.height*panelWidth/panelSize[0]);
// ctx.stroke();
}
function drawBall(xp,yp,scale) {
ctx.beginPath();
if (realImages==0) {
ctx.arc(xp,yp,ballRadius,0,Math.PI*2);
ctx.fillStyle = "#0095DD";
ctx.fill();
} else {
drawImage(ctx,ballImage, xp, yp, scale,0 );
}
ctx.closePath();
}
function drawHole(xp,yp,width) {
ctx.lineWidth = 1;
ctx.beginPath();
ctx.strokeStyle='red';
var holeX1=xp-width/2
var holeX2=xp+width/2
ctx.moveTo(holeX1,yp+5);
ctx.lineTo(holeX1,yp-5);
ctx.moveTo(holeX2,yp+5);
ctx.lineTo(holeX2,yp-5);
ctx.stroke();
}
function loadSprites() {
ballImage=new Image();
ballImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWUtkOut75rgX2fLkmudqvpZzSZsKEJ6Bb9TP8AChuJWcQ_oyOOSp2K_qiErnu7lhfswL3J7RvtggwfZ08ae2PlEDHArxyE0e5gTxpNawOnQogQfMvxWi57VsATmdbFNwXB6a96tOEUhx9/s8/0001.png"
ballImage.onload = function () {
drawPanel()
}
panelImage=new Image(panelSize[0],panelSize[1]);
panelImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDSMQfa6hL6ivQgcDNXJqMsVD_Ejss_A8-1TgXU7lbIn9zugGwpfUkwAkdDMrck6KEMk7_x26BDMHqoeX8eY1GZJw1BRZliJFuoVt0XvTSTNLLFERU6QWYUEOS9lauDE4FPinpzFkeJyD_/s465/panel.png"
panelImage.onload = function () {
drawPanel()
}
knobImage=new Image(knobSize[0],knobSize[1]);
knobImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6CDGsm-nDK9qHURLMjdaD5p0igXMX-X7rXteIx0IoO-sHToX4nJyIJfB8xMPDpBdFxpOm3nylCYj6hg5LhlwUGQ2oNcLTLMgyGD5Tq7F_5pzeAKzcWGLjK45FG2LP0r44YZ5NO08r0-rl/s64/knob_large.png";
knobImage.onload = function () {
drawPanel()
}
switch1Image=new Image(switchSize[0],switchSize[1]);
switch1Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDvd75CyVXctjSWseolbFcTiFU_-7wJJ1ZKxW1nwPdWVm-nVfYPKQj9CDcrbuqoEQAXdTdo5-C7XSI97MJh8u4xItEYoYgi2vQ-CIFoQcyD47fHqNxEp478a1P3hhRRDUfZhEqQSu4fjdX/s320/switch1_small.png";
switch1Image.onload = function () {
drawPanel()
}
switch2Image=new Image(switchSize[0],switchSize[1]);
switch2Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGq29-SABMgAg_KKp8bDFYNefQQ9kZtyHMEz2Ps7sawZrgpojrSkoEMqstcRgPaHyB9oYE54RhV2U284fWPZTHwRSseklPlwyPp-hCZl7KwV49KTGJmStnPFCR8r2aNxiJs1FryNnh63N8/s320/switch2_small.png";
switch2Image.onload = function () {
drawPanel()
}
button1Image=new Image(buttonSize[0],buttonSize[1]);
button1Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ-1hVVEI-icvZZKzNmQqgrmf97TV3A7thLW8xE9_o1BpIo096wAGLk5mmfEtqB_OUOzCk3sAUIWaSVKJcphInEB7t5L9uQV-6tYAFXMHibaE48zpfUPXujob315Sxe4gfsHANRAzJHazg/s56/button_crop_small.png"
button1Image.onload = function () {
drawPanel()
}
button2Image=new Image(buttonSize[0],buttonSize[1]);
button2Image.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ-1hVVEI-icvZZKzNmQqgrmf97TV3A7thLW8xE9_o1BpIo096wAGLk5mmfEtqB_OUOzCk3sAUIWaSVKJcphInEB7t5L9uQV-6tYAFXMHibaE48zpfUPXujob315Sxe4gfsHANRAzJHazg/s56/button_crop_small.png"
button2Image.onload = function () {
drawPanel()
}
frameImage=new Image(frameSize[0],frameSize[1]);
frameImage.src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTu3aC3q8wBZKWasyTQ9n3SyC0dpfZt94mgedDynvpPUwmwHZ76ZmeMn5HnhNksXoXtIadh4LSB_n2L2E3jHL7HwDf6tbgI8fVwMiICDEzUD4i_LbVfw1rnBmjWncDFtDYoOQDc7m13oku/s547/crt_frame_small.png"
frameImage.onload = function () {
draw()
}
}
loadSprites()
</script><div id="MyText">
<br>
<h2><b><i>Bouncing Ball</i></b></h2>
<br>
To play the Whirlwind Bouncing Ball Simulator (WhiBBS), press the red switch in the upper left corner of the control panel. After pressing the switch, a spot will move in a straight line across the bottom of the window showing the floor that the ball is going to bounce on. If you look carefully, you'll see a hole in the floor in the lower right corner. The goal of the game is to get the ball to fall through the hole by adjusting the speed, bounce, and/or gravity.
<br><br>
You can make adjustments to the bouncing ball using the black knobs on the panel. If you click/press the right half of the knob, it will make positive adjustments (clockwise), and if you click/press on the left side of it, it will make negative adjustments (counter-clockwise). You can also have the edges of the hole displayed by pressing the silver button in the upper right corner of the panel while the simulation is active.
<br><br>
<h3><b>History of the Original Game</b></h3>
<br>
<i>Bouncing Ball</i> started its life as a demo on MIT's Whirlwind I computer sometime in 1951-1953. The Whirldwind computer was originally developed to be a flight simulator which would assist the US Navy with training flight crews, but programmers at MIT also applied it to a range of general mathematical and physical problems. The problem of computing the trajectory of a bouncing ball was used as a classroom demonstration of how a computer could solve differential equations. The initial versions of the program were just a simulation, but sometime in subsequent versions, a hole was added to floor as an objective. At this point, <i>Bouncing Ball</i> went from simulation to game.
<br><br>
In fact, <i>Bouncing Ball</i> is considered by some to be the very first video game, though opinions differ on what constitutes a video game and whether <i>Bouncing Ball</i> fits all of the criteria. However, one thing the Bouncing Ball clearly had over its predecessors was a video display.
<br><br>
Authorship of the original bouncing ball game is uncertain, though likely contributors include Charles Adams, Oliver Aberth, and Jack Gilmore. See <a href="https://thehistoryofhowweplay.wordpress.com/2019/10/16/a-response-to-ahoys-the-first-video-game/">The History of How We Play</a> for a detailed discussion the game's origins and possible authorship.
<br><br>
<h3><b>The Mathematics of the Bouncing Ball</b></h3>
<br>
While there remains some uncertainty about how <i>Bouncing Ball</i> was originally played, the simulation of the ball's movements is not a difficult or ambiguous problem. The <a href="https://dome.mit.edu/handle/1721.3/39818">Programmer's Manual</a> for Whirlwind I lays out how the programmers wrote the simulation, using the Backward Euler method to solve a set of differential equations. The equations use a constant acceleration to simulate gravity and the "bounce" is modelled with a constant coefficient of restitution.
<br><br>
The coefficient of restitution is like a damping factor for the bounce. After the ball strikes the floor at some speed, in the next step it will "bounce" upwards at a slightly slower speed. How much slower depends upon the coefficient of restitution.
<br><br>
<h3><b>The Bouncing Ball Display</b></h3>
<br>
<i>Bouncing Ball</i> was originally displayed on a cathode ray tube oscilloscope and fortunately we have <a href="https://youtu.be/KH0tcv3nEQI?t=659">footage</a> of it being played. The most apparent difference between the CRT oscilloscope and what you would see on a modern display is the persistence effects -- the screen cannot be cleared after plotting a point on the ball's trajectory, so the ball has a "tail" made up of the residual light from previous points. I simulate this effect in the WhiBBS by rendering each point with a size and opacity that decrease with time.
<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhthTUvUf1wZEG0cFqdNFOksKIK311-8hCiUwbfoVWQpGKPD7VaZ9zXx7f2A-9HfR3VpQC_9T1U5POQOFdSCCqbf4s7B0j7MLOgs0lhNZ6q9n0fjSt0qR_2Gj5E4ckjexJDGnoT-mgPawf0/s382/segment_zoom2.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="Zoom in on the path of the ball from original Bouncing Ball game, showing the distinct steps in the computer's calculation." border="0" width="320" data-original-height="299" data-original-width="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhthTUvUf1wZEG0cFqdNFOksKIK311-8hCiUwbfoVWQpGKPD7VaZ9zXx7f2A-9HfR3VpQC_9T1U5POQOFdSCCqbf4s7B0j7MLOgs0lhNZ6q9n0fjSt0qR_2Gj5E4ckjexJDGnoT-mgPawf0/s320/segment_zoom2.gif"/></a></div>
Note also how the display shows the "floor" on which the ball bounces. Before each iteration of the bouncing ball simulation, the oscilloscope beam moves horizontally across the bottom of the screen, indicating both the vertical location of the floor and, importantly, the location of the hole. Without this visual cue, the game would be little more than guesswork. Indeed, even with the beam showing the floor, tuning the ball to fall into a hole still feels very much like guesswork, so I have given players the option of marking the hole continuously on the screen.
<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYG9WCEGTnOdA0UQUkLe7ZWZ0KWbaREycG709dkgU5jW9uv5DGjFo68tu0bJ2MyLhyphenhyphenfFqTeun1VVK1viXk4qmkaLu3ZAh1fzZS5XIioKm92XNN_hrRwhErvr_vQPWeqklv3E-Yhr7UInVa/s450/segment2_zoom2.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="Zoom in on the floor of the original Bouncing Ball game." border="0" width="320" data-original-height="257" data-original-width="450" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYG9WCEGTnOdA0UQUkLe7ZWZ0KWbaREycG709dkgU5jW9uv5DGjFo68tu0bJ2MyLhyphenhyphenfFqTeun1VVK1viXk4qmkaLu3ZAh1fzZS5XIioKm92XNN_hrRwhErvr_vQPWeqklv3E-Yhr7UInVa/s320/segment2_zoom2.gif"/></a></div>
<h3><b>The Control Panel</b></h3>
<br>
Unfortunately, I wasn't able to locate any detailed information about how the bouncing ball was controlled. <a href="https://ohiostate.pressbooks.pub/app/uploads/sites/45/2017/09/retro-hurst.pdf">One source</a> refers to a version where players turned "frequency knobs" to change the parameters of the simulations, while other versions were probably controlled by reprogramming the game.
<br><br>
The WhiBBS uses the more video-game-like approach of having the player adjust physical controls. You can change the horizontal speed, coefficient of restitution ("Bounce"), and acceleration due to gravity. This is not the only possible set of controls, of course. It could have been designed to allow users to adjust other things, like the starting point of the ball, the location of the floor, the location of the hole, etc. If more details emerge about the configuration of the game version of the Bouncing Ball, then I may revisit the control scheme.
<br><br>
Another question is the range over which the player could adjust the parameters. Again, I don't know how the original was set up, so the WhiBBS gives you access to wide range in parameter space. It's just more fun that way. However, this also means that if you make the speed low enough or the bounce weak enough, the ball will be rolling by the time it reaches the hole, and will fall through easily. As such, rather than merely trying to get the ball in the hole, try achieving it with a fixed number of bounces. It is possible to get it in with just one bounce.
<br><br>
<h2><b>Subsequent Games</b></h2>
<br>
I don't know if the bouncing ball influenced any subsequent games, though its use of a video display was certainly noteworthy. You'll also find that its mechanics are similar to other titles from the early days of gaming.
<br><br>
<h3><b>Tuning the simulation</b></h3>
<br>
Many of the earliest video games were developed by scientists and engineers whose primary interest in computers was developing simulations of physical systems. Turning these simulations into games was often just a matter of setting a particular outcome as a goal and then asking the player to tune the simulation to achieve that goal. Popular examples include <a href="http://www.retrogamedeconstructionzone.com/2019/10/lunar-lander-when-play-is-actual-science.html">Lunar Lander</a> games, where players would adjust the state of a spacecraft (e.g., thrust, angle) to land safely on the moon, and artillery games, where the players would adjust the aim of a gun emplacement to hit a distant target.
<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnmmicZYbfOR_8OpPinANkfll0jaiTjop8TXaN-cf4R7h8XdDz30QFP0mqIKCrNJMhOH1LU6lEg-8GkS7SXjQJDy2o6FCAgWOV3AaIVw-aNF-LXao90EKAzZDrRCQFCGrCZ_skBsiImG2_/s319/artilleryduel.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="Gameplay from 1982 game Artillery Duel, for the Astrocade console." border="0" width="320" data-original-height="191" data-original-width="319" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnmmicZYbfOR_8OpPinANkfll0jaiTjop8TXaN-cf4R7h8XdDz30QFP0mqIKCrNJMhOH1LU6lEg-8GkS7SXjQJDy2o6FCAgWOV3AaIVw-aNF-LXao90EKAzZDrRCQFCGrCZ_skBsiImG2_/s320/artilleryduel.gif"/></a></div>
<h3><b>Other Bouncing Balls</b></h3>
<br>
The bouncing ball was a popular gamepiece in the '50-'70s. Another game that is sometimes credited as being the "first video game", called <i>Tennis for Two</i>, was developed in 1958 and features a ball being knocked back and forth across a net. <i>Tennis for Two</i> gives the players <a href="http://www.retrogamedeconstructionzone.com/2019/08/digression-paddle-controller.html">paddles</a> and a button to control the action directly.
<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiMahG4kDI5P9bzg1kr4XzOWe4x4o7ZM28RA4TgDKCZyobmiO9kpg0Y9NDeoL6liRdrln5tfsUEacZr2F6Ir_eAgh1U3l86qe0HVIZS1XuIFKVg1jazi-DuRzDLH_AHqUyV5ljh4aXPSN2/s350/tennis_for_two.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="Clip of original Tennis for Two game." border="0" width="320" data-original-height="209" data-original-width="350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiMahG4kDI5P9bzg1kr4XzOWe4x4o7ZM28RA4TgDKCZyobmiO9kpg0Y9NDeoL6liRdrln5tfsUEacZr2F6Ir_eAgh1U3l86qe0HVIZS1XuIFKVg1jazi-DuRzDLH_AHqUyV5ljh4aXPSN2/s320/tennis_for_two.gif"/></a></div>
Of course, there is also the most famous (and most profitable) bouncing ball in the history of video games, <i>Pong</i>. Its ball only moves in straight lines between bounces, however, and it wouldn't be until Atari's fourth ball and paddle game, called <i>Rebound</i>, that gravity would make an appearance.
</div>
</body>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com2tag:blogger.com,1999:blog-7604980045122375946.post-58919775645197988302021-01-05T12:37:00.000-08:002021-01-05T12:37:07.284-08:00Podcast: Top 5 Golden Age Arcade GamesI recently sat down with Mark Steadman of the <a href="https://listenvypod.com/">List Envy</a> podcast to discuss our opinions about the five best games of the arcade golden age (1978 - 1983). <div>
<iframe frameborder="0" height="150" src="https://player.podiant.co/listenvy/392dc89aeb2c1a/" width="100%"></iframe>
</div><div>Enjoy! </div><div><br /></div><div>Concerning the blog, it is still alive and kicking, even if I haven't posted in a while. I have several entries in work, including the finale of my analysis of <i>Centipede. </i>If you 're looking for content on a more regular basis, I post on my <a href="https://twitter.com/MrVGBrow">Twitter feed</a> daily.</div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com6tag:blogger.com,1999:blog-7604980045122375946.post-59165293339847760062020-11-02T19:23:00.003-08:002020-11-02T19:32:25.873-08:00The Descent of the Centipede, Part 1<div>In <a href="http://www.retrogamedeconstructionzone.com/2020/08/the-characters-of-centipede.html">my first article on Atari’s <i>Centipede</i></a>, I did a qualitative overview of the characters and how they impact the gameplay. Here, I want to take a more quantitative look at the game, with a particular focus on one key aspect: the descent of the centipede.</div><div><div><br /></div><div>In every stage of the game, the centipede’s descent acts as a sort of ticking clock. Whatever you might want to do, whether it be clearing out mushrooms or knocking off spiders for points, you’ll want to get it done before the centipede reaches the bottom. Otherwise, you’ll be left to manage a flurry of fast-moving centipede heads.</div><div><br /></div><div>The rules of the descent itself are fairly simple. In this article, part 1, I’ll lay out these rules for the primary centipede, and then consider the effects of the spider and the flea. In part 2, I’ll talk about the scorpion, the secondary centipedes, and the ways that the player can manipulate a centipede’s descent time.</div><h2 style="text-align: left;"> The Rules of the Descent</h2><div class="separator" style="clear: both; text-align: left;">The game of <i>Centipede</i> is played on a 256 pixel x 240 pixel bitmap, but most of the game logic is determined within a grid with square cells, 8 pixels on a side. </div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvs9HcIvrdTRwJxzGMlDgUkd6yk6LGbxj_shWit04IYZJhHHgnd9ZFxiJdh4VIAjKKxjP1GLRn6uC1cUMkIMfSNGW6nJk26Ud_x6LFvqWL9hQuzNDeBAW4zCSmgS76Eu2m0NZVVrz1-LkB/s256/grid_animate2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation showing the grid on which mushrooms are placed in the game of Centipede." border="0" data-original-height="256" data-original-width="240" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvs9HcIvrdTRwJxzGMlDgUkd6yk6LGbxj_shWit04IYZJhHHgnd9ZFxiJdh4VIAjKKxjP1GLRn6uC1cUMkIMfSNGW6nJk26Ud_x6LFvqWL9hQuzNDeBAW4zCSmgS76Eu2m0NZVVrz1-LkB/w300-h320/grid_animate2.gif" width="300" /></a></div><p>The top row of the bitmap is reserved for the player’s score/lives and the bottom row is empty, so the remaining pixels make up the 30 x 30 playing field. When the centipede is in open space and away from the edges, it moves at a constant horizontal speed of either 15 grid cells per second (odd stages and stage 9+) or 7.5 grid cells per second (even stages up to 8). The centipede starts its descent in the middle of the top row.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxSATn-yzMxQSNZxqp0BW5vKyvIY-ETVvgI-cY6hbbrNlM11igTPPOjoH4Xd8xkBkd1JrI2fKB9BuHKfzZ6lp4K-_riDjFUvIxHcgB8ipeRpXdkojCLLBww-yyccRIznk0PMO_Vh6cMYdN/s240/enter_combine2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation showing where the centipede enters at the beginning of a level." border="0" data-original-height="34" data-original-width="240" height="57" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxSATn-yzMxQSNZxqp0BW5vKyvIY-ETVvgI-cY6hbbrNlM11igTPPOjoH4Xd8xkBkd1JrI2fKB9BuHKfzZ6lp4K-_riDjFUvIxHcgB8ipeRpXdkojCLLBww-yyccRIznk0PMO_Vh6cMYdN/w400-h57/enter_combine2.gif" width="400" /></a></div><p>If it’s going left, the centipede starts in column 16 and if it’s going right, it starts in column 15. The starting direction/cell appears to be generated randomly.</p><p>If a centipede’s horizontal motion is impeded by a mushroom or by the edge of the screen, it will descend by one row and then continue moving horizontally, opposite its original direction of motion.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy13HILi0N0pEc26flOzR-fmgIGI_Re5adbZxdJFXmiMvtIjsYicFdLbbBiR3eKE4rv9omLWqTpLZNhp1Aa7ZK64RhzQJOc_Qn50ozp3NUnUXmQAWhfW3ZXNxg972ifVJaNIyG6hFezX_W/s90/hitshroom2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation showing a centipede hitting a mushroom and then changing direction." border="0" data-original-height="32" data-original-width="90" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy13HILi0N0pEc26flOzR-fmgIGI_Re5adbZxdJFXmiMvtIjsYicFdLbbBiR3eKE4rv9omLWqTpLZNhp1Aa7ZK64RhzQJOc_Qn50ozp3NUnUXmQAWhfW3ZXNxg972ifVJaNIyG6hFezX_W/w320-h114/hitshroom2.gif" width="320" /></a></div><div><br /></div><div>Note that centipedes will ignore any object they encounter while in the process of descending or ascending. This means that if they hit a mushroom or the edge of the screen, they will pass through mushrooms that are immediately below them.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1v0H0NuOIMprOmaZpo1t6Nl9hMMIqDqMMqhPdYpY3-67dcLqckGnJcmcq-UjjaCuUEB10IL9eBRWpeqpENBMZ683Cady2fojHt-pFcKgHl3bPOSWq2A8qi5V3N6maYhVNw-rNhUrGvsfu/s124/throughshroom2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation showing a centipede passing through a mushroom when descending a row." border="0" data-original-height="32" data-original-width="124" height="82" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1v0H0NuOIMprOmaZpo1t6Nl9hMMIqDqMMqhPdYpY3-67dcLqckGnJcmcq-UjjaCuUEB10IL9eBRWpeqpENBMZ683Cady2fojHt-pFcKgHl3bPOSWq2A8qi5V3N6maYhVNw-rNhUrGvsfu/w320-h82/throughshroom2.gif" width="320" /></a></div><div><br /></div>With these rules in hand, I have what I need to simulate a simple descent. I started with a single centipede descending a randomly generated field of 100 mushrooms.</div><div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpxP8altE1NmKeSanMYLNs8AwGtyD_wFqix1Ycm-7DqgEoYB6A3fQcv3sVY1ZnHxWzTDN8QFEzK55UuIvaLHYcFZIPLbCF1i8syZ_7fVVHYM_lvsJRTh3h7N6nlcPjdGNSWj0Q18e_nV8S/s240/sample_descent2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Simulated example of a centipede's descent using sprites from the original Atari arcade game." border="0" data-original-height="240" data-original-width="240" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpxP8altE1NmKeSanMYLNs8AwGtyD_wFqix1Ycm-7DqgEoYB6A3fQcv3sVY1ZnHxWzTDN8QFEzK55UuIvaLHYcFZIPLbCF1i8syZ_7fVVHYM_lvsJRTh3h7N6nlcPjdGNSWj0Q18e_nV8S/w320-h320/sample_descent2.gif" width="320" /></a></div><div><br /></div><div><div>The animation doesn’t match the game exactly, but the logic of the descent is the same. How long does it take the centipede to reach the bottom? In this particular case, it takes 904 frames, or 15.07 seconds at the arcade frame rate of 60 frames per second. This won’t apply to all 100-mushroom fields, of course -- the answer will depend on exactly how the mushrooms are placed. So, for the general case, it’s more interesting to look at the average descent time over many such simulations.</div></div><div><br /></div><div>The animation below shows the results of running simulated centipede descents for fields with 0 to 600 randomly placed mushrooms, with 1000 simulations for each; that is, 1000 1-mushroom fields, 1000 2-mushroom fields, etc.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4-JEjMw58JsGVieeEC5ezzlmpR2G_4WSane44KSfd_JDB3-fS9bmkQHTAILqzOq6rsoOUz7Cxc49C_8pzgvrR7usHQeZ_2etEpsUtaJkWMRgFU9XLBSlp9u1Axx90-e9NjwDkM4h9yNIv/s887/sim_rand_final.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animated plot showing how the centipede's descent time changes as the number of randomly placed mushrooms increases." border="0" data-original-height="360" data-original-width="887" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4-JEjMw58JsGVieeEC5ezzlmpR2G_4WSane44KSfd_JDB3-fS9bmkQHTAILqzOq6rsoOUz7Cxc49C_8pzgvrR7usHQeZ_2etEpsUtaJkWMRgFU9XLBSlp9u1Axx90-e9NjwDkM4h9yNIv/s16000/sim_rand_final.gif" /></a></div><p>In the plot, “steps” are the number of grid cells that the centipede has passed through. This can be converted to a time using the aforementioned centipede speeds. As you would expect, the more mushrooms that are in the field, the more quickly the centipede will descend (on average). However, as the number of mushrooms increases, the effect of adding more mushrooms decreases. One way to think about it is to consider how much of the screen the centipede explores. In a dense mushroom field, it will only explore a small portion of the screen, so if you add a new mushroom at a random location, the chances that it will land in the parts of the screen the centipede explores are small.</p><p>For large numbers of mushrooms, you can estimate the average number of steps without using a simulation. For example, if there are 180 mushrooms randomly arranged in a 30x30 grid, there is a 1 in 5 (180 in 900) chance of the centipede hitting a mushroom on any given step. It has to hit 29 mushrooms to descend the grid, so the average number of steps should be about 5 x 29 = 145. The simulations give a slightly smaller number, about 135 steps, because they also account for collisions with the edge of the screen.</p><h2 style="text-align: left;">The Descent with Spiders</h2></div><div>Now that we have a simple centipede descent working, let’s start looking at the effects of the game’s other characters. The most visible character, aside from the centipede, is the spider. Spiders spend a lot of time exploring the bottom of the playing field, but do they affect the centipede’s descent?</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinTd-hahaluwA-nBYO4SLwZLn55X8Ap7VyiXS1Br2NCUB-JDb3VOpFcVKNDOybwkY3xM-PA6cHcV4u77aBNKwadJWHo7v0VG9-N9eZL3jUKTq76xzVOOo_ON1kQ6o_LAL2QIY9I3c5w0DW/s104/spidercrowd2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Slow-motion animation showing how the spider interacts with centipedes." border="0" data-original-height="64" data-original-width="104" height="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinTd-hahaluwA-nBYO4SLwZLn55X8Ap7VyiXS1Br2NCUB-JDb3VOpFcVKNDOybwkY3xM-PA6cHcV4u77aBNKwadJWHo7v0VG9-N9eZL3jUKTq76xzVOOo_ON1kQ6o_LAL2QIY9I3c5w0DW/w400-h246/spidercrowd2.gif" width="400" /></a></div><br /><div><div>The spider does bounce off of centipede segments from time to time, but I don’t see any evidence that centipedes respond to the spider. As such, there’s no need to worry about spider-centipede collisions when determining descent times. </div><div><br /></div><div>However, the spider has another role in the game: mushroom cleaner. This might seem like a minor contribution at first, but look at what happens to the playing field when you let it evolve for 20 minutes without any intervention from the player.</div></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLu3AGo5dkKmoOo_Mm9spbykUjqO4qXUDiAYEyZ5XtlMuLiWkcFVZRb7HvWE7wc8ol16P7eKE85zP6dqWPqXSfjZZB_dBF_EY4DRxRI6Q5a5Bj_Pe4i5IAgJ36W2dW-AAdUYmNGiPdAiMv/s256/longwait2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Demonstration of how the mushroom field evolves in the game of Centipede if the player doesn't interact with it." border="0" data-original-height="256" data-original-width="240" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLu3AGo5dkKmoOo_Mm9spbykUjqO4qXUDiAYEyZ5XtlMuLiWkcFVZRb7HvWE7wc8ol16P7eKE85zP6dqWPqXSfjZZB_dBF_EY4DRxRI6Q5a5Bj_Pe4i5IAgJ36W2dW-AAdUYmNGiPdAiMv/w375-h400/longwait2.gif" width="375" /></a></div><br /><div>It’s clear that the spider acts to keep down the number of mushrooms in the bottom 12 rows of the playing field. As such, this portion of the field is unlikely to ever get very dense. To account for this effect, I added a hard cap of 12 mushrooms to the bottom 12 rows. This limit acts to increase the descent time when the number of mushrooms is large:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi5m0bLTgrUkE2uTGJubojexFMnaO6i3Hltf2w4b5cdNP-gYwmD29oMwJxgjfYU8gljIay-HX0LllZwMygs1G337W-kfpb55XCedM6LR-Xc3EVO84gZkFWVUD_29cNGSN20dStA2UoClg1/s887/sim_barebottom_final.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animated plot showing how the centipede's descent time changes as the number of randomly placed mushrooms increases, leaving the bottom 12 rows mostly clear." border="0" data-original-height="360" data-original-width="887" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi5m0bLTgrUkE2uTGJubojexFMnaO6i3Hltf2w4b5cdNP-gYwmD29oMwJxgjfYU8gljIay-HX0LllZwMygs1G337W-kfpb55XCedM6LR-Xc3EVO84gZkFWVUD_29cNGSN20dStA2UoClg1/s16000/sim_barebottom_final.gif" /></a></div><br /><div>Depending on your score, the spider’s range of influence can decrease to as little as 6 rows, which means that the amount of the playing field that’s kept clean will decrease as well. If you don’t act to clear it out yourself, this will of course speed up the centipede’s descent.</div><h2 style="text-align: left;">The Descent with Spiders and Fleas</h2><div>After the initial population of the mushroom field, the primary source of additional mushrooms is the action of the flea. The flea intermittently falls across the playing field on a vertical trajectory, dropping mushrooms in its wake.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD9U7gcjSG5MMdK35QC-OmnC431iS0chcyeUI2E7FvTln1PRXgiDt6uvxJ0z47ayknqSy47xvW-EnyuFh8jhmvc97-NCP8c6eLG3Eh2SLymClg8c12lTRaHZUXhd0Ts5Z6QIlX_NmKcEGy/s256/fleas_fast.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation showing fleas dropping mushrooms in rapid succession, from the Atari version of Centipede." border="0" data-original-height="256" data-original-width="240" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD9U7gcjSG5MMdK35QC-OmnC431iS0chcyeUI2E7FvTln1PRXgiDt6uvxJ0z47ayknqSy47xvW-EnyuFh8jhmvc97-NCP8c6eLG3Eh2SLymClg8c12lTRaHZUXhd0Ts5Z6QIlX_NmKcEGy/w375-h400/fleas_fast.gif" width="375" /></a></div><br /><div><div>As such, when simulating high-density mushroom fields, it’s better to distribute them along columns rather than in purely random positions. </div><div><br /></div><div>Not all mushrooms are added by fleas, so in the top 18 rows, I combine a fixed number of randomly distributed mushrooms (30, roughly the amount appearing there in the first stage) with an increasing number of mushrooms added in columns. The bottom 12 rows retain their previous cap of 12 mushrooms. Here are the adjusted results.</div></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGCQ7ZJ15pGmAxp7AdMMnquWR17fqGPjSHiM1LgvoZsJ8z-sA6qg1IL7gceRuqXRTlmhaW3EiX7z62-2Rjg5dIB6rhVc85Vfz3hnEz_jghHk_DwJ4KZMTrdy0cLYnzsqpjfmbyw_4GtMs3/s887/sims_pedespiderflea_final.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="360" data-original-width="887" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGCQ7ZJ15pGmAxp7AdMMnquWR17fqGPjSHiM1LgvoZsJ8z-sA6qg1IL7gceRuqXRTlmhaW3EiX7z62-2Rjg5dIB6rhVc85Vfz3hnEz_jghHk_DwJ4KZMTrdy0cLYnzsqpjfmbyw_4GtMs3/s16000/sims_pedespiderflea_final.gif" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div>As it turns out, distributing the mushrooms in columns doesn’t change the average descent times very much compared to the random case. For 100 mushrooms, there’s only about a 5% difference between distributing them in columns versus randomly distributing them, with the columns taking slightly longer for the centipede to descend. </div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpAq7LTiZHGeMqN6k3JXKlDNx_CDkMERIRqIbxtHIbuK-Lv9XgjshQOAtbYcYSyXiQrrgCESSrx-kQr4cGRA22ZQkh9A8JvoiowTOTT6_xe1yOaViNKFHc2Smhv24hPMO9X4-EoIaVZ-79/s240/columns2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation demonstrating the descent of the centipede in a field of mushrooms that were placed in columns, as done by the flea." border="0" data-original-height="240" data-original-width="240" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpAq7LTiZHGeMqN6k3JXKlDNx_CDkMERIRqIbxtHIbuK-Lv9XgjshQOAtbYcYSyXiQrrgCESSrx-kQr4cGRA22ZQkh9A8JvoiowTOTT6_xe1yOaViNKFHc2Smhv24hPMO9X4-EoIaVZ-79/w400-h400/columns2.gif" width="400" /></a></div><br /><div><div>If the fleas were crossing in rows instead of columns, the results would be quite different. The 100-mushroom case, for example, takes 25% longer when I put mushrooms in rows instead of columns.</div><div><br /></div><div>In part 2, I’ll continue my look at centipede descent times, adding in the effects of the scorpion’s poisoned mushrooms, as well as look at the interactions between centipedes when there are several descending at once.</div></div><div><br /></div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com1tag:blogger.com,1999:blog-7604980045122375946.post-26208789899745792912020-10-13T14:23:00.003-07:002020-10-13T14:23:50.331-07:00DONKEY.BAS and the Gaming Revolution That Could Have Been<div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI97aRrtYBxHrxjKXW_xC7pPMeVcGMA2Keq5AWeJcB0YkWb2ZWvRt3uVnuiBIQfHhMueGLVG-FbKw5onL0RC84L4jo6zQUtm8TgH9SV-70KqNZhSGUxrk7v0U_54iAOqIJ-iWgy-E94u9H/s931/ezgif.com-gif-maker+%25281%2529.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites of the PC game, DONKEY.BAS, with an animation showing a donkey being knocked around by cars." border="0" data-original-height="396" data-original-width="931" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI97aRrtYBxHrxjKXW_xC7pPMeVcGMA2Keq5AWeJcB0YkWb2ZWvRt3uVnuiBIQfHhMueGLVG-FbKw5onL0RC84L4jo6zQUtm8TgH9SV-70KqNZhSGUxrk7v0U_54iAOqIJ-iWgy-E94u9H/s16000/ezgif.com-gif-maker+%25281%2529.gif" /></a></div><br /></div><span style="text-align: left;">The fortunes of all turn on the whims of giants. In 1981, the nascent video game industry was about to get a shock like none other, as a young Bill Gates and an impetuous Neil Konzen closed themselves in a small room and crafted an electronic yarn for the ages.</span><div><br /></div><div>Most will look at this period in computing history and point to the operating system Gates and Konzen were preparing, an interface to support the release of the first IBM PC. It was called DOS, and it was certainly a noteworthy achievement. </div><div><br /></div><div>But there was another piece of software, one that would also accompany the IBM PC, that was to be the true load. In order to demonstrate the capabilities of Microsoft's BASIC software, Gates and Konzen created a computer game. It was called simply, Donkey, but such is the respect for its significance that it is more often referred to by its filename, <span style="font-family: courier;">DONKEY.BAS</span>.<p><span style="font-family: courier;">In DONKEY.BAS</span>, you are a car. Take a moment to absorb the significance of that fact, let it challenge your equilibrium now, for you don't want to be in the middle of an identity crisis while facing the forthcoming perils. At first glance, it may seem that you are on a simple, uneventful excursion on a straight road, but no, there are doings afoot.</p><p>It starts with a solitary cuddy, unblinking and blissful in its ignorance of your high-speed approach. If you are quick, you will at this moment engage the game's sole interactive element, the space bar, in time to elude the equine menace. However, before you even have time to catch your breath, you find yourself careening towards another unheeding burro. One after another, a rain of jackass assaults your senses and if you blink for even a split second, they will tally a point over the smoldering wreckage of your vehicle. </p><p>Yes, it's true that you can score a point of your own, one for every 11 successful donkey evasions. But don't even think about celebrating for the barrage of livestock continues without pause. And without end.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyb9rg1ETGgHzYefoszQ5GybZyIP50JZS4i5geiUrY1giJQnQKwFE8gxDhy5jO40-Bd5ttL07MCBDkLXl6rGfa0lNXnqPv9_g1U0KfrTSvkeuSmdGCIIWwdFRXx80mn-sTyVIn-xzOccQ6/s630/zoom7.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Slowed and zoomed animation of the game, DONKEY.BAS, showing the evil donkey at its center.." border="0" data-original-height="395" data-original-width="630" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyb9rg1ETGgHzYefoszQ5GybZyIP50JZS4i5geiUrY1giJQnQKwFE8gxDhy5jO40-Bd5ttL07MCBDkLXl6rGfa0lNXnqPv9_g1U0KfrTSvkeuSmdGCIIWwdFRXx80mn-sTyVIn-xzOccQ6/s16000/zoom7.gif" /></a></div><p>You see, <span style="font-family: courier;">DONKEY.BAS</span> has no winner, only victims. Once you are engaged in its spiral of futililty, you can never leave. Sure, you can press the escape key and cease the game from running, but it never really leaves you. And you never really stop driving.</p><p>A naive observer might interpret the donkey-dodging jaunt as an expression of Bill Gates' unrelenting competitive drive. In this interpretation, adversaries are nothing more than cud-chewing flesh bags that need not be defeated, only avoided. However, I believe a deeper meaning lies at its heart.</p><p>In ancient Egypt, donkeys were used to represent a god, one that was our ultimate source of life and energy, the mighty sun god, Ra. And herein is the crux of this ludic masterpiece. A never-ending stream of donkeys is tantamount to a deluge of light... and meaning. Yes, within these bits lies the answer to the meaning of life.</p><p>Sure, you may mock its simplicity. You might say that similar games had long been available for the Apple ][, such as Sirius Software's <i>Autobahn.</i></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8jwjxL4BrcJ79OM9czuZVp7gLc4rBdts8jvpL-9E2dkzqLVaMGct-G0iFPVvU9lYhujAVuI-mRneSzfIqnRNoo26djcbkrN9kEt5EQnS0_13LRokboDuqwrOHENZ7h8PGOLLf2JesMl9V/s431/ezgif.com-gif-maker+%25282%2529.gif" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="Gameplay and sprites from the Apple ][ game, Autobahn, with a stream of cars in the background." border="0" data-original-height="260" data-original-width="431" height="386" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8jwjxL4BrcJ79OM9czuZVp7gLc4rBdts8jvpL-9E2dkzqLVaMGct-G0iFPVvU9lYhujAVuI-mRneSzfIqnRNoo26djcbkrN9kEt5EQnS0_13LRokboDuqwrOHENZ7h8PGOLLf2JesMl9V/w640-h386/ezgif.com-gif-maker+%25282%2529.gif" width="640" /></a></p>There are no lanes to bound <i>Autobahn</i>'s torrent! And yes, even handheld games had been using the formula, including Mattel's <i>Auto Race </i>(1977), the first ever electronic handheld.<div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/isejBX1Tyjk" width="320" youtube-src-id="isejBX1Tyjk"></iframe></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">But you mock wrongly.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">You see, the difference between <span style="font-family: courier;">DONKEY.BAS</span><span style="font-family: inherit;"> and all supposedly similar games is that certain nuance, that touch of subtle flair that elevates a gamer's experience from the mundane to the truly transcendent. Had other designers followed the lead of Gates and Konzen, the gaming landscape would surely be better for it.</span></div><div class="separator" style="clear: both; text-align: left;"><span style="font-family: inherit;"><br /></span></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7M_hQX-f_bbAFs63BWo_rUq4NI7HgYYHlweq6z7Emo0bvuZ_mizMW8NqfGoZNhzL6-pXXfvIrUn_YaTyQAoPwdqMxfrfVsB_6AXzwKe2_jn-MeJX2GNT_VsUsz2v8_K3FaIZC5RnZC4Zu/s256/donkey_all2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation of Head On, Scramble, Breakout, Star Fire, and Avalanche, all with some sprites replaced by donkeys." border="0" data-original-height="256" data-original-width="224" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7M_hQX-f_bbAFs63BWo_rUq4NI7HgYYHlweq6z7Emo0bvuZ_mizMW8NqfGoZNhzL6-pXXfvIrUn_YaTyQAoPwdqMxfrfVsB_6AXzwKe2_jn-MeJX2GNT_VsUsz2v8_K3FaIZC5RnZC4Zu/w350-h400/donkey_all2.gif" width="350" /></a></div><br /></div><div class="separator" style="clear: both; text-align: left;">Yes, <span style="font-family: courier;">DONKEY.BAS </span><span style="font-family: inherit;">is the real deal</span>, and anyone who says otherwise must tread carefully, for you never know what lies on the road ahead.</div></div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com0tag:blogger.com,1999:blog-7604980045122375946.post-91167499162711077012020-09-24T10:15:00.001-07:002020-09-24T16:58:47.246-07:00Exidy's Venture (1981): Fantasy or Funhouse?<div class="separator"><div style="margin-left: 1em; margin-right: 1em;"><br /></div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl9BHE_-BttomdJHXgydt267QRqqeAda1YZksef4vxeypWTNDfAa54OM4BEZwv99aaQwRbhdo69aV_Vg8hEbP1LYoC3nFetaQg8UYpwCYsy2U_ooT3BUCNaG4K-q5u81kHbIMPuY2-Olf9/s407/demo2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation of the 1981 arcade game, Venture, by Exidy. It shows a section of gameplay and the sprites for the monsters and treasures." border="0" data-original-height="308" data-original-width="407" height="385" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl9BHE_-BttomdJHXgydt267QRqqeAda1YZksef4vxeypWTNDfAa54OM4BEZwv99aaQwRbhdo69aV_Vg8hEbP1LYoC3nFetaQg8UYpwCYsy2U_ooT3BUCNaG4K-q5u81kHbIMPuY2-Olf9/w509-h385/demo2.gif" width="509" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfNbMjUX5UkzJLGOX1jC2XMEEchN3-WDequx7HN4f-CQ1vkYD6UEc-Xdk76gDkstS5o94hV8uLr8nNm3n93NmJjWzEt-XyjmOY7D-BqsZG7qmZTllbrE8J6GBAnJP8HtC6tCzY-1dL882G/s255/6p0.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="81" data-original-width="255" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfNbMjUX5UkzJLGOX1jC2XMEEchN3-WDequx7HN4f-CQ1vkYD6UEc-Xdk76gDkstS5o94hV8uLr8nNm3n93NmJjWzEt-XyjmOY7D-BqsZG7qmZTllbrE8J6GBAnJP8HtC6tCzY-1dL882G/s0/6p0.png" /></a></div>The early '80s were a special time in arcade games. Technology had finally advanced to the point where games could make use of large casts of characters, all rendered with enough detail to make them recognizable as having counterparts in real objects. What's more, microprocessors and ROM were now enabling gameplay that stretched beyond a single-screen playing field, allowing developers to start telling stories, even if only very simple ones. Vast areas of space were opening up in game design, and even small-time game designers had the opportunity to break new ground with ideas that, in retrospect, should have been common sense.<div><br /></div><div>It's within this context that we find <i>Venture</i>, a game that may have the distinction of being the first fantasy-themed arcade game, and which pioneered mechanics that are clearly identifiable in later action-adventure and action role-playing games. </div><h2 style="text-align: left;">How You Play</h2><div>You are Winky, daring smiley-faced adventurer, and you must recover all of the treasures from the <i>Venture </i>dungeon. The game plays out from two perspectives, the level view and the room view. In the level view, you're just a dot (perhaps an homage to <a href="http://www.retrogamedeconstructionzone.com/2019/10/atari-adventure-first-video-game.html" style="font-style: italic;">Atari Adventure</a>?) that travels from one room to the next, entering rooms at locations marked by white doors. The catch is that you must avoid making contact with the squid-like Hall Monsters roaming the corridors.</div><br /><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSzOcKipPGwAVK6iX_Rho3N2_qLPOVIQ7krJL2VRElfqkwqv06TI6FwVVsXwDjzo-Lk-T7IBBr_XWr4p0qvBxyQWlyEkuLb7DiFtus8BT6-Hq36PnyCQv3qbiLiDEqhroeJMNI2wxIS2v9/s256/overworld1.gif" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="Section of gameplay from the arcade version of Venture, showing the player avoiding Hall Monsters on the level map." border="0" data-original-height="256" data-original-width="256" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSzOcKipPGwAVK6iX_Rho3N2_qLPOVIQ7krJL2VRElfqkwqv06TI6FwVVsXwDjzo-Lk-T7IBBr_XWr4p0qvBxyQWlyEkuLb7DiFtus8BT6-Hq36PnyCQv3qbiLiDEqhroeJMNI2wxIS2v9/w400-h400/overworld1.gif" width="400" /></a></div><div><br /></div><div>These creatures bear more than a passing resemblance to the aliens from <a href="http://www.retrogamedeconstructionzone.com/2019/08/space-invaders-noxious-assembly-line.html" style="font-style: italic;">Space Invaders</a>, and like their shoot 'em-up cousins, are only a minor threat at first. Be sure not to dawdle however, because also like Space Invaders, they will eventually kick into high gear. Given enough time, the AI will develop to a point where it makes a beeline towards you and can match you step-for-step.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGvKyJriPADbPGPWJ4Af4tPuOUlHfy4MX2tRAD99T2ghQZt9fQJ_Zl7DdbqIv54owPE1iAgv6PwD28T_At26CgF_e63zZSISxHBf6q3gr7DpGQuVg0xLDCCd_-RSV1DufpHxQTfD1rqUkb/s256/overworld_chase.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Section of gameplay from the arcade version of Venture, showing the player getting chased by Hall Monsters on the level map." border="0" data-original-height="256" data-original-width="256" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGvKyJriPADbPGPWJ4Af4tPuOUlHfy4MX2tRAD99T2ghQZt9fQJ_Zl7DdbqIv54owPE1iAgv6PwD28T_At26CgF_e63zZSISxHBf6q3gr7DpGQuVg0xLDCCd_-RSV1DufpHxQTfD1rqUkb/w400-h400/overworld_chase.gif" width="400" /></a></div><div><br /></div>Fortunately, it doesn't take long to travel from one room to the next, so most of the game is played in the room view. In each room, the player must fend off monsters and/or traps to collect the treasure and exit the room. If you take too long to finish a room, one of the Hall Monsters will enter and begin chasing you. They occupy a similar role to Evil Otto in <i><a href="http://www.retrogamedeconstructionzone.com/2020/03/berzerk-review.html">Berzerk</a></i>, matching the player's speed and forcing them to exit more or less immediately. Here's what a room playthrough looks like:<div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjbRXpFstA0R_FmM8joaPKRsJb3KKEpmUxNEMCg4QmLtrnV6ySAtFp0xJAMK66-Uz-6sjOh-SiXqsu-f4JaLYg303wJZAbe4f6Yw0JdZRFvkVs6WyGrX5QbJUcFOn61VGMtU44rbpdGLHJ/s256/room2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Section of gameplay from the arcade version of Venture, showing the player clearing a room of snakes and collecting the treasure." border="0" data-original-height="256" data-original-width="256" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjbRXpFstA0R_FmM8joaPKRsJb3KKEpmUxNEMCg4QmLtrnV6ySAtFp0xJAMK66-Uz-6sjOh-SiXqsu-f4JaLYg303wJZAbe4f6Yw0JdZRFvkVs6WyGrX5QbJUcFOn61VGMtU44rbpdGLHJ/w400-h400/room2.gif" width="400" /></a></div><br /><div>Easy enough, right? Eh... not so much. <i>Venture</i> is actually a brutally difficult game, moreso even than most arcade games of its time, and it's worth looking more carefully at some of the design decisions that led to that outcome.</div><div><h2 style="text-align: left;">Controls</h2><div>The first thing that jumped out at me when I started playing <i>Venture</i> was how awkward the controls felt. It's not that they're complex -- there is just a single 8-way joystick and a fire button -- but in practice, navigating the dungeon was really frustrating. This is because when you change Winky's direction, he doesn't actually respond right away.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-fRtm2gvVxz78AkckBhGLAX8Fo_ltCDh_m89PIO4t2z5N_7-OGVrvO35dwNzKIejy1iDRtXqAxXBgVHuQNM5RbjG1j-8xa1tSp1a04TzhOf4hfmmVmh2OV7VruwuCBoKcQPM-dH_0aBeJ/s200/turn_compare3.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation from the arcade version of Venture, demonstrating the game's built-in lag in response to commands from the joystick." border="0" data-original-height="98" data-original-width="200" height="157" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-fRtm2gvVxz78AkckBhGLAX8Fo_ltCDh_m89PIO4t2z5N_7-OGVrvO35dwNzKIejy1iDRtXqAxXBgVHuQNM5RbjG1j-8xa1tSp1a04TzhOf4hfmmVmh2OV7VruwuCBoKcQPM-dH_0aBeJ/w320-h157/turn_compare3.gif" width="320" /></a></div><br /><div>In the above animation, the left side shows Winky making a turn at normal speed and the righthand pane shows the same turn slowed down by a factor of 5. You can clearly see Winky stop before he makes the turn, adding a six-frame (0.1 seconds) lag before he translates your command into motion. This may not seem like much, but in the world of action games, an additional six frames of lag is a big deal. Note that this lag is in the game itself, so it would add on to any <a href="http://www.retrogamedeconstructionzone.com/2020/05/reaction-time-and-game-design.html#inputlag">input lag</a> that might be occurring in the game controller or display lag in the video output.</div><h2 style="text-align: left;">Enemy Movement</h2><div>I don't know if the awkward controls in <i>Venture </i>were an intentional design decision or a consequence of hardware limitations, but the cruelty of the enemy AI most definitely lies at the feet of the developers. Previously, I showed what a successful room playthrough looked like in <i>Venture</i>. Here is an example of one that is not so successful.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGPYFFu1nh2xINJ2BhqO1-7RmUzGVwa35gqDgb3prOrm8_m1DHxMpmziXqLbrSdqYM8BgkOpHZp8Ahyphenhyphen2_FJD4VTJKhvEanqkVbnhjfvqyM-aW1WiFWAJW_UijhbG2GdQFgryz0CY05MMSl/s256/crazy2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Section of gameplay from the arcade version of Venture, showing Winky failing to evade erratically moving ghosts." border="0" data-original-height="256" data-original-width="256" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGPYFFu1nh2xINJ2BhqO1-7RmUzGVwa35gqDgb3prOrm8_m1DHxMpmziXqLbrSdqYM8BgkOpHZp8Ahyphenhyphen2_FJD4VTJKhvEanqkVbnhjfvqyM-aW1WiFWAJW_UijhbG2GdQFgryz0CY05MMSl/w400-h400/crazy2.gif" width="400" /></a></div><br /><div>As it turns out, those missed shots are not just a consequence of bad aim (or bad luck). Watch what happens when I try to shoot a single enemy that's clearly in my line of fire.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIVhEnRgqO6gI82KsJVCzcynmWRpQ9gkqzKa5Ur_0ppnK_pzuy3CStLDj3CUbY0z86DtopZ6nbWCXEyJfJKYGZq38NPKsQdxeq-4D7oOS4h5OiAqidqboRwbRo86KqfvmZeOvfkIcYLTPz/s192/dodge_final2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation from Venture demonstrating how the enemy AI avoids the player's line of fire." border="0" data-original-height="83" data-original-width="192" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIVhEnRgqO6gI82KsJVCzcynmWRpQ9gkqzKa5Ur_0ppnK_pzuy3CStLDj3CUbY0z86DtopZ6nbWCXEyJfJKYGZq38NPKsQdxeq-4D7oOS4h5OiAqidqboRwbRo86KqfvmZeOvfkIcYLTPz/w400-h173/dodge_final2.gif" width="400" /></a></div><div><br /></div>In the animation, I've added a horizontal line to indicate my line of fire, and colored it red whenever the arrow is in flight. The enemies in <i>Venture </i>appear to be designed to jump out of your line of fire whenever an arrow is present. You can even see one point where the enemy jitters just above the line, suggesting that one part of the AI (evasion) is overriding the part that determines its wandering motion.</div><div><br /></div><div>Unfortunately, it's difficult to backwards engineer the wandering motions of the enemies because they appear to be at least partially random. Normally, I would track the paths of the sprites to see how they behave, but when you're dealing with randomized motions, you need a large amount of data to average over, and that can be both time- and memory-consuming with sprite tracking. Fortunately, there's another thing I can do.</div><div><br /></div><div>In a previous article on sprite extraction, I talked about using the <a href="http://www.retrogamedeconstructionzone.com/2020/02/animative-blogging-part-3-advanced.html#modebackground">mode of an animation to determine the background</a>. If I try that on a room from <i>Venture</i>, here's what I get.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir2gbRYQgJxl3wDw4yOgapD0CSqFet_2cz6sggiRVin3FXJl6OFZBwQVvWzEeeD7e2w3p5ILRau4qHfmQnaSyvAqe0zni8Tl0VeyZPtbFMDDHiVQiSG2fg6MC6yJ-a_jQ6M5igYZ9CUbaP/s284/background_fade2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation demonstrating the use of the mode of an animation to determine the background of a room in Venture." border="0" data-original-height="205" data-original-width="284" height="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir2gbRYQgJxl3wDw4yOgapD0CSqFet_2cz6sggiRVin3FXJl6OFZBwQVvWzEeeD7e2w3p5ILRau4qHfmQnaSyvAqe0zni8Tl0VeyZPtbFMDDHiVQiSG2fg6MC6yJ-a_jQ6M5igYZ9CUbaP/w400-h289/background_fade2.gif" width="400" /></a></div><br /><div>Note that in this segment of gameplay, I've used a MAME cheat to make Winky invincible (to study the AI, not to improve my score). When I take the mode of the animation, the dragons disappear and Winky stays put. This is because the dragons are never staying in one place long enough to be the mode color in any part of the frame. If Winky were moving around the frame throughout the animation, he would also disappear in the mode background.</div><div><br /></div><div>Once I've determined the mode background, I can then isolate anything that's not in the background, like so.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7VXO1Khu_8OaK2x1Y6KUSt1gRN08gUqtlF-etqwD4yhiPYJVeOeEli_lgVKb_G7uBV07O3uHjCeq1HHrhJMdSjeySRkQmNuWCyKGhEp2cHTftIcAkGmanTjYPS1hZIE8TWGjChsijlpsy/s284/background_subtract2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation showing what remains after mode background subtraction in a room in Venture." border="0" data-original-height="205" data-original-width="284" height="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7VXO1Khu_8OaK2x1Y6KUSt1gRN08gUqtlF-etqwD4yhiPYJVeOeEli_lgVKb_G7uBV07O3uHjCeq1HHrhJMdSjeySRkQmNuWCyKGhEp2cHTftIcAkGmanTjYPS1hZIE8TWGjChsijlpsy/w400-h289/background_subtract2.gif" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: left;">To find out where the enemies are spending the most time, I just look at each pixel in the image and measure how often it's occupied by an enemy. The above animation isn't long enough to get a good sampling, so I averaged over 7 minutes of gameplay at a reduced frame rate. That yielded the following heat map.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZVpmMpj8P83Rp35RTqI03R9tbqzmwgioG3qHPCDSVbU13a3zpOh0SQv-tupFMSR1LBVlIMLvbgEkzotZSYeJDvw-0QY-NpbJAsfQmNedh8TvqyubCKzl2vHk9M6HyUGvLRarpl5WSvo8W/s284/heat_demo2_2.gif" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="Heat map of the enemy movements in a room in Venture, with Winky on the right side of the room." border="0" data-original-height="205" data-original-width="284" height="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZVpmMpj8P83Rp35RTqI03R9tbqzmwgioG3qHPCDSVbU13a3zpOh0SQv-tupFMSR1LBVlIMLvbgEkzotZSYeJDvw-0QY-NpbJAsfQmNedh8TvqyubCKzl2vHk9M6HyUGvLRarpl5WSvo8W/w400-h289/heat_demo2_2.gif" width="400" /></a></div><br /><div class="separator" style="clear: both; text-align: left;">In this map, brighter shading indicates more time spent in that area. You can see that the dragons congregate in two general areas, one that's fairly spread out in the lower right corner and another that's concentrated near the treasure at the top of the room. The top region, which contains the yellow dragons, has sharp boundaries at fixed horizontal and vertical distances from the treasure. The white dragons, meanwhile, must stay out of the top region, but are otherwise unrestricted in where they can go. They do, however, spend more time near Winky than far away from him. To get a better idea of how Winky's position is influencing their motion, let's move him to the other side of the room and see what happens.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div style="text-align: center;"><img alt="Heat map of the enemy movements in a room in Venture, with Winky on the left side of the room." border="0" data-original-height="205" data-original-width="284" height="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ6aVaWAFtem0cNABRPY2mxjbyWRrPrRgxIEgJnuUN1JeZxmu3qA0qSlFB7wQtKK9L57nzndMP9qi0pq__ffGPE4K59maS6DH3IfMlbiweRYLk5ryASSKsIaCS2X4odaulUDeOmng9-_QP/w400-h289/heat_demo1_2.gif" width="400" /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div>Not only do the white dragons move to the same corner as Winky, but the yellow enemies now spend more time to the left of the treasure than to the right of it. </div><div><br /></div><div>Let's try the same thing on another set of enemies.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0AwDWI-xOr5cVJDWeOferr5hImRHEtqaeq8tfqdPUa13E-a92ie8fkxGb06yqeJJOMmJUbkoz_EJd7xVwYPFRHTv7NhSNs1oI5bbdfP3rjJcMC4ZiGv3w3-2PtHpDYsKHPirjTmoIcpjd/s231/heat_demo3_2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Heat map of the enemy movements in a room in Venture, with Winky facing skeletons" border="0" data-original-height="228" data-original-width="231" height="395" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0AwDWI-xOr5cVJDWeOferr5hImRHEtqaeq8tfqdPUa13E-a92ie8fkxGb06yqeJJOMmJUbkoz_EJd7xVwYPFRHTv7NhSNs1oI5bbdfP3rjJcMC4ZiGv3w3-2PtHpDYsKHPirjTmoIcpjd/w400-h395/heat_demo3_2.gif" width="400" /></a></div><br /><div>Here, the skeletons are all the same color, but have individual behaviors just like the dragons did. One skeleton stays near the treasure and the other two wander around the rest of the room, with a modest preference for the area where Winky is. Again, the treasure guard prefers the part of his region that is nearest to Winky.</div><div><br /></div><div>You won't find treasure guards in every room and some enemies will be more attracted to Winky than others. This room, on the second level, doesn't require a heat map to analyze how the enemies are responding to him.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIaKEtX7Rk33uYr73YDnFzU3qa56RLtps8ZDD3-3E-fsFxnRcIa0kx98s_F1hs2nvU05jn9XHUG7x6VxrrdzZf8bN-w6Sntf5A7foZOiTSTdSG8JOFlgl3ZHHqq5J63FEoFUZ-vQ4SRq8j/s256/close_contact2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="A demonstration of enemies in Venture whose movements are drawn directly to Winky." border="0" data-original-height="231" data-original-width="256" height="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIaKEtX7Rk33uYr73YDnFzU3qa56RLtps8ZDD3-3E-fsFxnRcIa0kx98s_F1hs2nvU05jn9XHUG7x6VxrrdzZf8bN-w6Sntf5A7foZOiTSTdSG8JOFlgl3ZHHqq5J63FEoFUZ-vQ4SRq8j/w400-h361/close_contact2.gif" width="400" /></a></div><div><br /></div><div>I credit the developers for giving each room a different character, with enemies that vary in number and behavior. Some rooms will change their configuration spontaneously, while others will have moving walls, like this one on the first level.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh38fpqqn8Gzo6OsjhUCrH1UwDEJV53tHTDqaSF60RFNLmSEgVPAp86SjXnETQmrRvqij-3UA5d7vJs2eM-RqNH-Z38mGwwIHoI1DdHGnzEhTDKo-Ag4znEIDPJdZuKog2jNuLe9rmkXAsD/s256/moving_walls2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="A room in Exidy's Venture where the walls move around the treasure." border="0" data-original-height="256" data-original-width="256" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh38fpqqn8Gzo6OsjhUCrH1UwDEJV53tHTDqaSF60RFNLmSEgVPAp86SjXnETQmrRvqij-3UA5d7vJs2eM-RqNH-Z38mGwwIHoI1DdHGnzEhTDKo-Ag4znEIDPJdZuKog2jNuLe9rmkXAsD/w400-h400/moving_walls2.gif" width="400" /></a></div><h2 style="text-align: left;">Dead Enemies</h2><div>The obstacles facing Winky are considerable. Slow reflexes, combined with enemies that move erratically towards him and can instantly dodge his shots, would surely be enough to challenge any adventurer, but the developers saw fit to add yet another wrinkle.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ-V_6FrI2j2NrfVfes2-VEqEInjVYTbZ2Wa7mScCBr1uHmbg1cz2e30UqTHCOFSwSx9Y9IxepMDMeR0YabfgtzqEjHUZjpqDo5fwSeCYes4qweP4DeSTqXGpkKPmNR6oiI4R6bXONoTfH/s256/corpse_kill2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Snippet of gameplay from Exidy's Venture demonstrating how enemy corpses can kill you." border="0" data-original-height="256" data-original-width="256" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ-V_6FrI2j2NrfVfes2-VEqEInjVYTbZ2Wa7mScCBr1uHmbg1cz2e30UqTHCOFSwSx9Y9IxepMDMeR0YabfgtzqEjHUZjpqDo5fwSeCYes4qweP4DeSTqXGpkKPmNR6oiI4R6bXONoTfH/w400-h400/corpse_kill2.gif" width="400" /></a></div><div><br /></div><div style="text-align: left;">That's right, enemy corpses are lethal. Even if you've managed to overcome the frenetic prescience of the AI, you will be left with a maze of slowly decaying corpses that may or may not fade away before the Hall Monsters appear to crash the party. This seems utterly unjustifiable in the game world and totally unnecessary considering the game's already considerable difficulty, but there you are.</div><h2 style="text-align: left;">Overall Impressions</h2><div>So where does this leave us with <i>Venture</i>? From the historical standpoint, it's actually a unique and innovative design, and accordingly it achieved a reasonable amount of success in its time. Each room is a puzzle to be solved and serves as one piece in a larger dungeon puzzle. Obvious or not, many of the conventions established in Venture would end up becoming fixtures in future action-adventure games, most famously in the Zelda series. </div><div><div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj77hbKWsNkEqxGcl1pAUED8oe5bg2KzA5LUMb5k_7O3eUyAlrXe_ejfQGpEJgE1Hti29wcFi-IdUaIhiy3jZv3oL5IIFSOhtp4u1knOU_5GBEJSOJ5dMk51NAPVIY_8b4gNXVGeujWFMBZ/s190/zeldaventure_compare2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation comparing the basic mechanics of Exidy's Venture and Nintendo's Legend of Zelda." border="0" data-original-height="170" data-original-width="190" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj77hbKWsNkEqxGcl1pAUED8oe5bg2KzA5LUMb5k_7O3eUyAlrXe_ejfQGpEJgE1Hti29wcFi-IdUaIhiy3jZv3oL5IIFSOhtp4u1knOU_5GBEJSOJ5dMk51NAPVIY_8b4gNXVGeujWFMBZ/w298-h266/zeldaventure_compare2.gif" width="298" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div>Dungeon crawling and world exploration were not new to video gaming in general -- they had long been fixtures in PC gaming -- but Exidy deserves credit for being the first to successfully incorporate it into an arcade game. </div><div><br /></div><div>That being said, I did not have fun playing this game. It's not just that <i>Venture</i> is difficult -- that alone is by no means a sin in the design of video games. Rather, it's the feeling of helplessness I get from my failures. It's the sheer futility of having an enemy erratically jitter into Winky because the unnatural evasive abilities of the AI forced me to make a close approach. It's the laggy controls nullifying any realistic chance I might have had of compensating for an unlucky spastic jerk. It's the dotted remnants of a long-dead enemy preventing me from escaping a room that has too soon been invaded by an overzealous Hall Monster.</div><div><br /></div><div>If these challenges had some rationale within the context of the game world, I might be able to see past them, but it is exactly the opposite. They all seem like artificial contrivances cynically added to the game mechanics to bleed as many quarters from the player as possible. The resulting aesthetic more closely resemble that of a funhouse at a <a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-4-at-electronic-carnival.html">carnival</a> than any dungeon adventure, and cheap thrills are the last thing I look for in an epic quest. </div><div><br /></div><div>Credit where credit is due, but I'm inclined to leave this artifact for museums. </div><div><br /></div><div>With that, I'll leave you with a montage of my most excruciating <i>Venture</i> deaths.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ7lZ3oe0mzp1HB5K_yGn9JJtxEaY3eVzCFZQDx3tc7fg5Y0RG0dx5COMY8aBZqN_yr-kt_vYw_U2YoacbejtTQTRvQ9xrFHbUfy9K18gdIifL5jUBtT6N1sWCNsc35S7CwNj0JF6hDRrB/s256/deathp_all.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="256" data-original-width="256" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ7lZ3oe0mzp1HB5K_yGn9JJtxEaY3eVzCFZQDx3tc7fg5Y0RG0dx5COMY8aBZqN_yr-kt_vYw_U2YoacbejtTQTRvQ9xrFHbUfy9K18gdIifL5jUBtT6N1sWCNsc35S7CwNj0JF6hDRrB/w400-h400/deathp_all.gif" width="400" /></a></div><br /><div><br /></div><p><br /></p><p><br /></p></div><br /></div><br />RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com5tag:blogger.com,1999:blog-7604980045122375946.post-57452097891283303222020-09-11T12:46:00.001-07:002020-09-11T13:14:16.546-07:00How I Rate Video Games and Why It Matters<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHDVZuHv7In5H33b85HonNVmfXnG3HOAFfaoReNaaTcLrr_5KA8qiyMObeVClsISOI8o71Yr2A77jLl_-yCbzFMw4_AFvMUIgYdxQAOWiqEQDVp6ThpXAgkZ42NKwCJcOLsT_peQPzsfkx/s654/table_final.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="577" data-original-width="654" height="353" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHDVZuHv7In5H33b85HonNVmfXnG3HOAFfaoReNaaTcLrr_5KA8qiyMObeVClsISOI8o71Yr2A77jLl_-yCbzFMw4_AFvMUIgYdxQAOWiqEQDVp6ThpXAgkZ42NKwCJcOLsT_peQPzsfkx/w400-h353/table_final.gif" width="400" /></a></div><p>Occasionally on the Retrogame Deconstruction Zone, I like to post reviews to supplement my other analyses. This is hardly an original thing -- the internet is stuffed with reviews of both old and new games -- but I want to be explicit about my review philosophy and lay out some common mistakes that I think other reviewers make. </p><p>Here are some frequently asked questions about video game reviews, along with my answers to them.</p><p><b>Q: Why don't you break down your ratings into categories?</b></p><p>A: While it is common for video game reviewers to separately rate things like the graphics, sounds, controls, etc., I think this approach is misguided. It would be absurd for a food reviewer to separately rate a recipe's ingredients or a music reviewer to separately rate rhythm and melody, so why accept it in a game review? A video game is a complete experience in which there is a complex interplay between visual and auditory stimuli, not to mention physical interactions. It is, as they say, much more than the sum of its parts. Game reviews should treat it as such.</p><p><b>Q: Why does your rating scale have so many levels? Can you really distinguish between a game that you rate 7.5 and a game that you rate 8.0?</b></p><p>A: Yes? For things that I'm passionate about, I often find myself frustrated when I'm forced to rate on a scale with less than 10 levels, and ideally there would be more (I use 20 for the blog). Having privately rated thousands of movies, albums, and video games, I've found that narrow rating scales become more frustrating with the more things I rate.</p><p>If, on the other hand, your concern is with my ability to so finely delineate the truth about video game quality, then I think you need to reevaluate what a video game review is actually doing. Even if I were to only give thumbs-up/thumbs-down reviews, my opinions would still just be opinions. A gifted reviewer can communicate the reasons for their love/hate of a particular game in a way that adds to the reader's passion, but that doesn't make them anything more than informed opinions.</p><p><b>Q: Why should I care about your opinion?</b></p><p>A: That's more a question for you than for me, but I will say that I don't approach my reviews lightly. Not only do I spend many, many hours playing the games I review, but in most cases I spend time picking them apart, studying their mechanics and carefully considering how the pieces worked together to create the full experience. Every rating is the product of careful consideration and reflection.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuzb2ilwrXhHHvwjBOUisa1cUV_ALPmQ9YrjHk6hmv9qE_tj0qqDYMVl6vXjHsfD93RpE_BNFcyrjHgDjoeW858RiBFiz0vT73UTPYkQ4qC4y9o6PXdnt83y3UmLxEXrkuk-3qAs0Bj7Yb/s245/dled.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="210" data-original-width="245" height="329" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuzb2ilwrXhHHvwjBOUisa1cUV_ALPmQ9YrjHk6hmv9qE_tj0qqDYMVl6vXjHsfD93RpE_BNFcyrjHgDjoeW858RiBFiz0vT73UTPYkQ4qC4y9o6PXdnt83y3UmLxEXrkuk-3qAs0Bj7Yb/w383-h329/dled.gif" width="383" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><p><b>Q: How much do you weigh a game's influence and impact when rating it?</b></p><p>A: Not at all. <i>Space Invaders</i> is arguably the most impactful video game in history and I trashed it in <a href="http://www.retrogamedeconstructionzone.com/2019/08/space-invaders-noxious-assembly-line.html">my review</a>. My reviews are a reflection of my experience with a game, intended to give modern gamers an idea of what it's like to play it. Most of the games to which I devote full reviews were important in video game history and would receive high ratings on impact alone, so it seems redundant to also weigh such factors in my rating. </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjPT1OPD9VuMH48bN6S4NAstIEwnZ_ISbuKpyKN6kgtfBQUHtsU20RX2ZByq1IWrImkPB0CkKnaF3BWVwHiVbE6LshltgOyGc3CHFo8MMxpWsXPAAKeAFIggbVe33iwPAX5baR1EPSJor3/s250/SpaceInvaders_demo_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="250" data-original-width="250" height="391" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjPT1OPD9VuMH48bN6S4NAstIEwnZ_ISbuKpyKN6kgtfBQUHtsU20RX2ZByq1IWrImkPB0CkKnaF3BWVwHiVbE6LshltgOyGc3CHFo8MMxpWsXPAAKeAFIggbVe33iwPAX5baR1EPSJor3/w391-h391/SpaceInvaders_demo_opt.gif" width="391" /></a></div><p>I will certainly discuss historical impact and influence in the text of my blog entries, including in the reviews, so if that's your main interest, there will be plenty to see here. It just doesn't factor into the number at the top.</p><p><b>Q: Your review is unfair to the people who made [insert game here]. This was a major achievement to its time, so why are you being a hater?</b></p><p>A: My reviews are a judgement of the game, not the developers, and that judgement is made from the standpoint of the 21st century. <i><a href="http://www.retrogamedeconstructionzone.com/2019/10/mystery-house-playthrough-part-1-why.html">Mystery House</a></i>, for example, was a marvelous achievement for its time and I have nothing but respect for its creator, Roberta Williams. Her imaginative approach to games laid the seeds for an entire genre, but that doesn't mean I recommend <i>Mystery House </i>to casual retrogamers. Sometimes a game serves us better as an artifact for study than as a diversion. All classic games fascinate me, but my reviews are intended to distinguish those that are still worth playing for their own sake.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil4BVNKiFBcg5Yn6Q0g6ZCh-tdYB46Nt3qL74upP_Kcjj9lf0eNW1cRzGo7NTi2VmKm_w5UnPR6WE4kqbravDTICArNzmbylkAwbCmrfW7e-2gQFRWEPMGiPOsH8efxOxxmSkpiijGuj9q/s560/Crowd.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="386" data-original-width="560" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil4BVNKiFBcg5Yn6Q0g6ZCh-tdYB46Nt3qL74upP_Kcjj9lf0eNW1cRzGo7NTi2VmKm_w5UnPR6WE4kqbravDTICArNzmbylkAwbCmrfW7e-2gQFRWEPMGiPOsH8efxOxxmSkpiijGuj9q/w400-h276/Crowd.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><p><b>Q: The games you're rating all used primitive technology. Doesn't that automatically make them worse than the best modern games?</b></p><p>A: It's certainly true that early game developers were more limited in what they could do, but that doesn't mean they were unable to achieve greatness. If you wonder at how I could enjoy <i><a href="http://www.retrogamedeconstructionzone.com/2019/10/atari-adventure-first-video-game.html">Atari Adventure</a></i> or <i><a href="http://www.retrogamedeconstructionzone.com/2019/12/pac-man-review-crowning-cultural.html">Pac-Man</a></i> as much, or even more, than any modern game, then I suggest you read my reviews and try spending more time with them. Simplicity and complexity, when properly arranged, have equal claims to beauty.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyAI-V-zcEkJfTcvybTjQocYoU3IjOxu91xqTpRtSLwy4syKMPMTge1ilGfkkvP9E62NXLbJ4i-bf39GSUX9Wp5xt3u6bz18q0B0hCjsv29GkNHWsfS3yfk89_9aOfjFbI24NcjFug1O6C/s366/PacDance_small2.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="311" data-original-width="366" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyAI-V-zcEkJfTcvybTjQocYoU3IjOxu91xqTpRtSLwy4syKMPMTge1ilGfkkvP9E62NXLbJ4i-bf39GSUX9Wp5xt3u6bz18q0B0hCjsv29GkNHWsfS3yfk89_9aOfjFbI24NcjFug1O6C/w400-h340/PacDance_small2.gif" width="400" /></a></div><div><br /></div><b>Q: But isn't it true that modern game developers have a much better idea of what hooks gamers? Even the simplest of puzzle apps is more addictive than these classic games.</b><div><b><br /></b></div><div>A: Addictive, yes, but really satisfying and memorable? Modern game developers have indeed learned a lot about how to appeal to compulsive appetites, exploiting our craving for rewards, status, completeness, accumulation, and much more. But a game that only appeals to our basest impulses is worse than no game at all because it drains our time and energy, leaving us with nothing to show for it but some flipped bits in the ether. </div><div><br /></div><div>If a game is addictive because it stimulates our imagination and expands our mind, forcing us to think in novel ways, that's good. If, on the other hand, it's addictive because we get continuously rewarded for completing trivial tasks, that's not so good. Even the best games will make some use of our compulsions to keep us entertained, but it's the reviewer's job to distinguish when that’s done artfully and when it crosses the line into cheap exploitation. <br /><p><b>Q: I love a game that you trashed and hate a game that you praised. Should I take this lying down?</b></p><p>A: Absolutely not! The most beautiful thing about art is the passion it excites in people. At the end of the day, a reviewer's rating matters less than their ability to communicate that passion to their readers. If one person says <i>Citizen Kane</i> is a brilliant masterpiece and the other says it's a turgid slog, it may be that both voices have something significant to express about the human experience. So comment away. As long as it doesn't get too personal, vulgar, or spammy, I will leave it up.</p></div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com2tag:blogger.com,1999:blog-7604980045122375946.post-10633460769888768042020-08-31T15:41:00.007-07:002020-09-08T16:14:32.532-07:00Shooter Gallery #8: The Special Ability<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKCP8Bw5jB0UnDos0AzQ2J5ISmw482AXNxLQYJkCOebObazfUX0_WYZ9FDrXvK1R7Amv3cy99kwEVN3OJQB_Xk-DLoPzd7UDbAyUTcgHckytjKHa87m8WLGVnJoYhQNAh2RoBG07ARQQyU/s513/special_2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="513" data-original-width="386" height="641" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKCP8Bw5jB0UnDos0AzQ2J5ISmw482AXNxLQYJkCOebObazfUX0_WYZ9FDrXvK1R7Amv3cy99kwEVN3OJQB_Xk-DLoPzd7UDbAyUTcgHckytjKHa87m8WLGVnJoYhQNAh2RoBG07ARQQyU/w483-h641/special_2.gif" width="483" /></a></div><p>There are many ways to expand on the basic shoot 'em up formula <a href="http://www.retrogamedeconstructionzone.com/2020/04/shooter-gallery-1-clone-show.html">originally laid down by <i>Space Invaders</i></a>, some more obvious than others. Giving the player special abilities is one way to add dimensions to the gameplay and, if it's well designed, increase replayability. Here I'm going to look at some of the specific abilities that were offered to player in fixed-screen shoot 'em ups in the first three years following <i>Space Invaders</i>.</p><h1 style="text-align: left;">Hyperspace</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYbMkPOFmNiFHe1voNUAZoh0_M3f8Pdh9GLMk8uNGQc33jwEqbBFC0Cx7HfH6ZX_3GkCIBtqkzx4whpkgSxtKWfhLKBp8LnhWOmRVYuCUDyqUOB_lJ2lOj4EqnLsJYO-ow6q7papnCX78x/s640/hypershow2_arrow2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1979 arcade game, Asteroids, demonstrating the hyperspace ability. A red arrow indicates the position of the player's ship." border="0" data-original-height="480" data-original-width="640" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYbMkPOFmNiFHe1voNUAZoh0_M3f8Pdh9GLMk8uNGQc33jwEqbBFC0Cx7HfH6ZX_3GkCIBtqkzx4whpkgSxtKWfhLKBp8LnhWOmRVYuCUDyqUOB_lJ2lOj4EqnLsJYO-ow6q7papnCX78x/w512-h384/hypershow2_arrow2.gif" width="512" /></a></div><div><br /></div><div>One of the first special abilities to appear in early shoot 'em ups was in <i><a href="http://www.retrogamedeconstructionzone.com/2019/10/asteroids-by-numbers.html">Asteroids</a>. </i>If the player senses they are in danger, either from converging asteroids or attacking UFOs, they can push the "hyperspace" button and be immediately transported to another part of the playing field. Unfortunately, there's no guarantee that you'll be transported to a location that's any safer than where you started.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPirStmyafXRnY0UsGfMnyBB6B-dcxcL7Qragug0RRIzlZl0L-lTEzxxd0rez8s0Y0zNjA192DFPQ59hDGGuEClQpq9FOJE_H-DrRB1vZO7y9X3dj6mInxBfUGsLjlfb_9IJOGEHpJpZcz/s640/hypershow3_arrow2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1979 arcade game, Asteroids, demonstrating the risk of overusing the hyperspace ability. A red arrow indicates the position of the player's ship." border="0" data-original-height="480" data-original-width="640" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPirStmyafXRnY0UsGfMnyBB6B-dcxcL7Qragug0RRIzlZl0L-lTEzxxd0rez8s0Y0zNjA192DFPQ59hDGGuEClQpq9FOJE_H-DrRB1vZO7y9X3dj6mInxBfUGsLjlfb_9IJOGEHpJpZcz/w512-h384/hypershow3_arrow2.gif" width="512" /></a></div><div><br /></div><div>The hyperspace ability amounts to a sort of panic button randomizer. If you know you're about to bite the dust, then there's no harm in taking the chance, but otherwise you're best off leaving it be. As such, its strategic value is limited and its use is less a matter of thought than instinct. The feature would be used again in some contemporary games, such as <i>Defender </i>and <i><a href="http://www.retrogamedeconstructionzone.com/2020/06/astrosmash-trailblazing-console-game.html">Astrosmash</a></i>, but is now difficult to come by in the wild. <i>Asteroids</i> was a success, to be sure, but I suspect it would have done just fine with or without this feature.</div><h1 style="text-align: left;">Shields</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgcQulzxnsc9P5QhZmqVC7xMxyc4x7Ryoge1XcpCIo3TifmziQjjNcO2HQiXByybh6yL7t0wxtTBh7MaC5fpf973zRIOe-ChEplWDNWj5yBUvbrKzcQGhK6cbtD1pAv-AANH7UhJTx6nWW/s256/shield_show1_sub2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1980 arcade game, Phoenix, demonstrating the shield ability." border="0" data-original-height="256" data-original-width="208" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgcQulzxnsc9P5QhZmqVC7xMxyc4x7Ryoge1XcpCIo3TifmziQjjNcO2HQiXByybh6yL7t0wxtTBh7MaC5fpf973zRIOe-ChEplWDNWj5yBUvbrKzcQGhK6cbtD1pAv-AANH7UhJTx6nWW/w325-h400/shield_show1_sub2.gif" width="325" /></a></div><div><br /></div><div>What if, instead of transporting the player, you simply allowed them to become invulnerable for a moment? That's the idea behind the shield in <i><a href="http://www.retrogamedeconstructionzone.com/2020/02/phoenix-review-elusive-splendor.html">Phoenix</a>, </i>which can be used to make yourself invulnerable for one second. You can't move while it's active and there's a three-second cooldown before you can use it again, but it's certainly useful in a pinch. Unfortunately, it comes with risks similar to those of hyperspace.</div><div><br /></div><div>The fact that you're frozen in place while the shield is on is especially dangerous in a game like <i>Phoenix</i>, where the enemies move so erratically that there's really no way to predict where they'll be when your shield deactivates. So again, it acts like a sort of emergency randomizer, though it's less risky than hyperspace. </div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz_yjGkT65E3g8OeSS1qf3yEiHBrI9d_HJV_fWrLXzNifdLEMuQtzW9jnlfZ0ohmoQ6lZjzNmF96YTqOagl2QoALoLcyjlUeyASu4t42qrUbBdVGZwfwD85Awpbh_IdaeJnlirkgk3GczY/s256/shield_show2_sub2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1980 arcade game, Phoenix, demonstrating the risks of overusing the shield ability." border="0" data-original-height="256" data-original-width="208" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz_yjGkT65E3g8OeSS1qf3yEiHBrI9d_HJV_fWrLXzNifdLEMuQtzW9jnlfZ0ohmoQ6lZjzNmF96YTqOagl2QoALoLcyjlUeyASu4t42qrUbBdVGZwfwD85Awpbh_IdaeJnlirkgk3GczY/w325-h400/shield_show2_sub2.gif" width="325" /></a></div><h1 style="text-align: left;">Slowdown</h1><div>It has a very small footprint today, but in 1981, one of the most popular games to imitate was Sega's <i>Astro Blaster</i>. It had a direct clone (Century's <i>Cosmos</i>) and multiple unofficial home computer adaptations (e.g., <i>Threshold </i>and <i>Sneakers</i>). </div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgesSVCCFZ75SxU_k8aTytoi_9VhHEJHvIOAgvcrsDOolZ9_X7ROTyI4YHR1T70jj5NJCbVp6Rp60NlTG446-p6J7BvO9mHSH6PDhlqzdRWJ0CxpU-wWLW79If0hSkBRLW0iriBdqtI7lwz/s525/demo3.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Demonstration animation of the 1981 arcade game, Astro Blaster. In addition to the gameplay, it shows 30 different enemy sprites used in the game." border="0" data-original-height="256" data-original-width="525" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgesSVCCFZ75SxU_k8aTytoi_9VhHEJHvIOAgvcrsDOolZ9_X7ROTyI4YHR1T70jj5NJCbVp6Rp60NlTG446-p6J7BvO9mHSH6PDhlqzdRWJ0CxpU-wWLW79If0hSkBRLW0iriBdqtI7lwz/d/demo3.gif" /></a></div><div><br /></div><div>The concept is very simple: you shoot your way through as many waves of aliens as you can, trying not to run out of fuel or overheat your blaster. The blast heat meter effectively limits the player's firing rate, which is a clever way to enforce shot efficiency. The player can't afford to just fire wildly or they'll end up without a blaster for a short period, and that could be enough to cause them to run out of fuel before the next checkpoint.</div><div><br /></div><div><i>Astro Blaster</i> also gives the player a special ability that they can use once between each refuel point. With the push of a button, you can cause all of the enemies to go into slow motion for a period of 14 seconds, making them sitting ducks for your blaster. This is especially handy for the enemies with stuttery movement, which are hard to take down without a barrage of shots.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnL7AqYyQ1Eek27P4aHgabmUNkqJRTizk4G0ANmLJhs6HKQm3cTbp1PtBVzatmX24xluRv0o8okVCK7AmwPt9qY25xcullWG-3gs8L3AVQUNFWC8QbsbHgiMcox802YORmbRqQd48BsRkS/s256/slowshow2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1981 arcade game, Astro Blaster, demonstrating the use of the Warp function. Enemy movement slows down for a brief period after the warp function is engaged." border="0" data-original-height="256" data-original-width="224" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnL7AqYyQ1Eek27P4aHgabmUNkqJRTizk4G0ANmLJhs6HKQm3cTbp1PtBVzatmX24xluRv0o8okVCK7AmwPt9qY25xcullWG-3gs8L3AVQUNFWC8QbsbHgiMcox802YORmbRqQd48BsRkS/w350-h400/slowshow2.gif" width="350" /></a></div><div><br /></div><div>The slowdown is a useful feature in <i>Astro Blaster</i>, and works well in the context of a game focused on shot efficiency. But shoot 'em ups are action games, and slowing down the action is the opposite of what most gamers are looking for.</div><h1 style="text-align: left;">Warp Mode (<i>Space Firebird</i>)</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ2J2J3nSeWmphJGV51zaP7YnsMNjkX8MiGFOJd3Dei69Vt_tLcZSC-J-bmJIYWDAlLIkXIVmHSnaH31X0WMkftUn1Bf1jiBUXrpRgFkT7BmRPN-qmd6nMIJqyRnQQWl4ParW9DzGLoGpA/s425/demo3.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Demonstration animation of the 1980 arcade game, Space Firebird. In addition to the gameplay, it shows some of the sprites used in the game." border="0" data-original-height="256" data-original-width="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ2J2J3nSeWmphJGV51zaP7YnsMNjkX8MiGFOJd3Dei69Vt_tLcZSC-J-bmJIYWDAlLIkXIVmHSnaH31X0WMkftUn1Bf1jiBUXrpRgFkT7BmRPN-qmd6nMIJqyRnQQWl4ParW9DzGLoGpA/d/demo3.gif" /></a></div><div><br /></div><div>The first use of an offensive special ability that I can find in a shoot 'em up is in Nintendo's <i>Space Firebird</i> (1980). Although thematically indebted to <i>Phoenix</i>, the design of <i>Space Firebird</i> is less clearly structured. A continuous flow of enemy groups enter the playing field, sometimes with all four enemy types attacking at once. Their movements are highly coordinated, however, often forming wide arcs across the screen that presage the sweeping enemy trains of <i><a href="http://www.retrogamedeconstructionzone.com/2020/05/metamorphosis-from-galaxian-to-galaga.html">Galaga</a></i>.</div><div><br /></div><div>Once per wave (or life), <i>Space Firebird</i> gives you the option of going into warp mode. While in this state, you move slowly forward across the screen, destroying anything you come into contact with. It's impossible to know exactly where the enemies will be when you get to the top half of the screen, but if you're anticipating that a lot of enemies are about to enter the field, this can be a good way to dispense of them quickly.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpETQNnHX4-KZM8_jub19upeDsLmX7buZQW_uNajVoNkCaf0V8Bn-JP9cX_Fhyphenhyphenu9CA7QVTVdKDukDeu8F463YWHz-rdlNu4ti5k3L4B1_IrkbmBXXSVjENwV-ERQwtYD8vzwqasHgcpzVP/s256/warp_mode2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1981 arcade game, Space Firebird, demonstrating the use of Warp Mode. In this mode, the player can make themselves invulnerable as they cross the screen." border="0" data-original-height="256" data-original-width="224" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpETQNnHX4-KZM8_jub19upeDsLmX7buZQW_uNajVoNkCaf0V8Bn-JP9cX_Fhyphenhyphenu9CA7QVTVdKDukDeu8F463YWHz-rdlNu4ti5k3L4B1_IrkbmBXXSVjENwV-ERQwtYD8vzwqasHgcpzVP/w350-h400/warp_mode2.gif" width="350" /></a></div><div><h1 style="text-align: left;">Double Fighters (<i>Galaga</i>)</h1></div><div>It's not exactly a special ability in the same sense as the other games discussed here, but <i>Galaga </i>includes a feature where the player can "rescue" one of their own ships, and then attack with both ships at once.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiglGXEZrAHgoQYl7t9tBqNEEZB6HRuRD68ghGDLUG18JkwLBkOVG57KEJietsxfH6R2UY8FdVQ9dEhMesULpHLG8ys582T6KaeKHqfEAMbnIIpQfpmcIUTWxzvwpNxxOPsVwhpihvFBKjC/s288/captureshow5.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1981 arcade game, Galaga, demonstrating the capture and rescue of a player ship." border="0" data-original-height="288" data-original-width="224" height="450" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiglGXEZrAHgoQYl7t9tBqNEEZB6HRuRD68ghGDLUG18JkwLBkOVG57KEJietsxfH6R2UY8FdVQ9dEhMesULpHLG8ys582T6KaeKHqfEAMbnIIpQfpmcIUTWxzvwpNxxOPsVwhpihvFBKjC/w350-h450/captureshow5.gif" width="350" /></a></div><div><br /></div><div>If you're willing to let one of your ships get captured, the double hots can be handy for racking up points in the early going, particularly in the bonus rounds. Of course, it also makes you a much bigger target for the enemies, so depending on your level of experience, it may or may not be worth the risk.</div><div><br /></div><div><i>Galaga</i> actually wasn't the first game to allow the player to fire two bullets at a time. In 1980's <i>Moon Cresta, </i>the player controls three different kinds of ships, one for each of their lives. Two of these ships have double-barrelled weapons.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGm3miYt8JFNTWEcwvjGy-krSyokKDHAdk6XXUhytKLRLhIKM813F_0hPxzpaYGH0N0mCJP1k2D7NMeVJMSFfZ9bvuzKeA7KGlnWtHDnS4wtI3_eTcMPamjBU9u3SET8FAzlWZYUO7opP_/s256/showdouble2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1981 arcade game, Moon Cresta, with the player using a ship that can fire two bullets at once." border="0" data-original-height="256" data-original-width="224" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGm3miYt8JFNTWEcwvjGy-krSyokKDHAdk6XXUhytKLRLhIKM813F_0hPxzpaYGH0N0mCJP1k2D7NMeVJMSFfZ9bvuzKeA7KGlnWtHDnS4wtI3_eTcMPamjBU9u3SET8FAzlWZYUO7opP_/w350-h400/showdouble2.gif" width="350" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">Again, this is not a special ability or a power-up, since you actually have to lose a life to access the ships with double firing, and that's not something a player will want to do intentionally. Still, it adds variety to the gameplay, something that most early shoot 'em ups were sorely lacking.</div><h1 style="text-align: left;">The Big Picture</h1><div>One of the most remarkable things about the "special abilities" in early fixed-screen shoot 'em ups (1978-1981) is how few of them there are. Despite a wide range of experiments in geometry, enemy behavior, <a href="http://www.retrogamedeconstructionzone.com/2020/08/the-first-video-game-bosses.html">boss battles</a>, and even <a href="http://www.retrogamedeconstructionzone.com/2020/06/shooter-gallery-6-best-defense-is-dead.html">defensive mechanics</a>, the player was almost always working with a single fire button and nothing more. Certainly, the industry had long been gravitating towards simple designs, but it should have been clear from the success of <i><a href="http://www.retrogamedeconstructionzone.com/2019/10/asteroids-by-numbers.html">Asteroids</a> </i>that arcade-goers were not completely averse to a complex interface. </div><div><br /></div><div>Fortunately, at least one early shoot 'em up designer was willing to buck the trend. In a forthcoming entry, I'll take a detailed look at<i> Defender, </i>including its incorporation of special abilities into the gameplay. </div><h2 style="text-align: left;"><br /></h2>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com3tag:blogger.com,1999:blog-7604980045122375946.post-63797722961652481352020-08-19T22:11:00.006-07:002020-08-20T08:30:31.363-07:00The First Video Game Bosses<p>In 1980 and 1981, as part of the rush to improve on the shoot 'em up formula pioneered by <i><a href="http://www.retrogamedeconstructionzone.com/2020/04/shooter-gallery-1-clone-show.html">Space Invaders</a> </i>and <i><a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-5-galaxian-model.html">Galaxian</a></i>, a number of arcade games started including "boss" stages, where the player must defeat a single opponent in order to advance. These opponents are often be accompanied by other enemies, but only the primary character needs to be defeated. <i><a href="http://www.retrogamedeconstructionzone.com/2020/01/the-animation-of-phoenix-part-1.html">Phoenix</a></i> (1980) is generally credited with being the first to feature such an enemy in an action game, and several other games released in the following two years would include boss-like battles. Let's look at the different approaches they took in designing these battles.</p><h1 style="text-align: left;">One-Hit Wonders</h1><div>Early bosses varied greatly in their complexity, with some requiring you to break through multiple barriers and others requiring only one well-placed shot. The latter approach is exemplified by <i>Destroyer,</i> the first release by a Spanish arcade game company called Cidelsa (I previously discussed them in the context of <a href="http://www.retrogamedeconstructionzone.com/2020/07/shooter-gallery-7-design-experiments-in.html">unfixed shooters</a>).</div><div><br /></div><div><i>Destroyer </i>is a simple shoot 'em up, with the player fighting off multiple waves of enemies from a position at the bottom of the screen. After five waves of enemies, the player is presented with this character.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNLk-VVUJfXvBWMmEUW-AdWBYOgMzSk2AnAzluNXDAiJI8w4HhNlhN6744rJ7jP1CGA7Xp6sFN6o6v7__mx_xS0x0uEA0gY4hS3ST24mUtV0Y_MceaKHK7MkMuAt9UdvwDbRLZz2eKxlBA/s294/boss_battle2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Complete playthrough of the boss battle in the 1980 arcade game, Destroyer. The player shoots at a giant head with a blinking hole in its forehead." border="0" data-original-height="294" data-original-width="294" height="460" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNLk-VVUJfXvBWMmEUW-AdWBYOgMzSk2AnAzluNXDAiJI8w4HhNlhN6744rJ7jP1CGA7Xp6sFN6o6v7__mx_xS0x0uEA0gY4hS3ST24mUtV0Y_MceaKHK7MkMuAt9UdvwDbRLZz2eKxlBA/w460-h460/boss_battle2.gif" width="460" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div><br /></div><div>The boss tries to crush you, but is easily dispatched with a single well-placed and well-timed shot at its head, where an opening reveals an apparent weak point. The battle is typically very short, as the player just needs to keep firing vertically until a shot lands, and the boss doesn't fire any bullets of its own. The lack of buildup and relative simplicity of the battle make for a forgettable experience.</div><div><br /></div><div>Similarly, in <i>Super Astro Fighter, </i>the player confronts a boss with almost identical mechanics. <i>Super Astro Fighter</i> is a sequel to <i>Astro Fighter</i>, <a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-2-first-steps-from.html">one of the first shoot 'em ups</a> to be released in the year following <i>Space Invaders</i>. After five waves of smaller enemies, the player faces off against a large insectoid creature.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7eYxprbE_NyY7PR5T9a2LfKtrClysLH9WYz1DWgNlLjge-9vC1pqxu4b9XohLkLssQddHJlOY5dLATpCP2_IP9L-P849noe_1qB4JIzmFDASrjwiM_JVARFn5hWv_wfy2-sDiU9DcZZl7/s256/full_boss_battle2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Complete playthrough of the boss battle in the 1981 arcade game, Super Astro Fighter. The player fights against an insectoid boss and then refuels from it." border="0" data-original-height="256" data-original-width="240" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7eYxprbE_NyY7PR5T9a2LfKtrClysLH9WYz1DWgNlLjge-9vC1pqxu4b9XohLkLssQddHJlOY5dLATpCP2_IP9L-P849noe_1qB4JIzmFDASrjwiM_JVARFn5hWv_wfy2-sDiU9DcZZl7/w300-h320/full_boss_battle2.gif" width="300" /></a></div><div><br /></div><div>Instead of blinking in and out, the boss opens and closes its mouth to reveal its weak point, but from the gameplay point of view, it's the same thing as in <i>Destroyer</i>. </div><div><br /></div><div>In this case, the boss battle also doubles as a refuel point. By 1981, limiting the player's fuel had become a popular game mechanic because it encouraged the player to dispatch enemies quickly. Many previous games, like <i><a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-2-first-steps-from.html#InvadersRevenge">Invader's Revenge</a></i>, had required players to dock at a space station to replace their fuel. Given that these docking events typically occurred at the end of several waves of enemy attacks, they could be considered predecessors to the boss battle.</div><div><br /></div><div>Not all one-hit bosses were throwaways. </div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyNPgt2l5TmBhv258q1X2UedZohnPKKEgQOSeScveoI6Ma9PE4sHX_O3txsd3ixjc_7Fn75W_w8uE5yH9JmYiOv0kOWQBPEoCYlKVZS8E9fHcjipNQzYuwZepp4EJ5dllQolDOt-BkNy4x/s674/battle_all2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Three boss battles from the 1980 arcade game, Sasuke vs. Commander. Each battle is shown in full." border="0" data-original-height="256" data-original-width="674" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyNPgt2l5TmBhv258q1X2UedZohnPKKEgQOSeScveoI6Ma9PE4sHX_O3txsd3ixjc_7Fn75W_w8uE5yH9JmYiOv0kOWQBPEoCYlKVZS8E9fHcjipNQzYuwZepp4EJ5dllQolDOt-BkNy4x/w640-h243/battle_all2.gif" width="640" /></a></div><p style="text-align: left;"><i>Sasuke vs. Commander</i> (1980, SNK), a fixed shooter masquerading as a series of martial arts battles, confronts the player with a miniboss in every other stage. The first few minibosses (i.e., "commanders") are dispatched with a single hit, but each battle is designed differently. In the first one, you have to run continuously to avoid vertical blasts of fire, and the only way to hit the boss is to shoot while on the run, just as he stops to fire at you. The second miniboss uses the <a href="https://tvtropes.org/pmwiki/pmwiki.php/Main/DoppelgangerAttack?from=Main.DopplegangerAttack">doppelganger attack</a>, where he creates phantasmal copies of himself and forces the player to guess which one is real. It's likely that this is the first such instance of the technique in video games.</p><h1 style="text-align: left;">Piece-by-Piece</h1><div>One obvious way to step up the complexity in a boss battle is to require the player to destroy different parts of the boss, one at a time. In <i>Astro Fantasia </i>(1981, Data East), four well-placed shots are required to dispatch the boss; one at each wing, one at the bottom center, and then a final one at the top center.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0Za3hVQOmDnSDYmnuhyy7KtnbuGY2tVn-TZeY0B0_33xx41G1gZtIPrO6uM10k8N2ddMd13hfDvRPKfRsqb-CgsfJ2E1uq5dzWEahuPOrQzLBfiGuRwj94MIJxHjpSywBxJ0_KI2fqtTP/s256/full_boss_battle2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Complete playthrough of the boss battle in the 1981 arcade game, Astro Fantasia. The player fights against a boss that shoots fireballs" border="0" data-original-height="256" data-original-width="240" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0Za3hVQOmDnSDYmnuhyy7KtnbuGY2tVn-TZeY0B0_33xx41G1gZtIPrO6uM10k8N2ddMd13hfDvRPKfRsqb-CgsfJ2E1uq5dzWEahuPOrQzLBfiGuRwj94MIJxHjpSywBxJ0_KI2fqtTP/w300-h320/full_boss_battle2.gif" width="300" /></a></div><div><br /></div><div>The boss's movements are very simple -- side-to-side bouncing followed by a jittery descent -- but it still feels like a more complete battle than the one-hit bosses. It's not clear why the the boss partially regenerates in its final descent, but the mechanics are simple enough that it’s easy to figure out what to do.</div><div><span> </span><br /></div><div>Not all of the multi-hit bosses are so straightforward. Another battle that takes a piecemeal approach is Centuri's 1981 follow-up to <i>Phoenix</i>, <i>Pleiades. </i>Here, the player is confronted with a mothership with flames coming out of the bottom.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWEI-PMog02k644AIeFznm6Q3BnRm2J4EFDlKVpZK3CsWYu2s3QV-CTGFjKCF90a1PCrWOrYEvPkvnYihhvVpTpuJvaViR3nFtQQ1H9IJBK1_8Wi7LWMfbTpyUXdA2Yu0ewZMi7fyCCG_N/s256/full_boss_battle2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Complete playthrough of the second stage of the 1981 arcade game, Pleiades. The player fights against a boss with flames coming out of the bottom." border="0" data-original-height="256" data-original-width="208" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWEI-PMog02k644AIeFznm6Q3BnRm2J4EFDlKVpZK3CsWYu2s3QV-CTGFjKCF90a1PCrWOrYEvPkvnYihhvVpTpuJvaViR3nFtQQ1H9IJBK1_8Wi7LWMfbTpyUXdA2Yu0ewZMi7fyCCG_N/w325-h400/full_boss_battle2.gif" width="325" /></a></div><div><br /></div><div>Every now and then, a panel in the mothership opens, releasing enemies that immediately attack you. If you shoot a panel while it's open, the flame that's under it will disappear. If you extinguish all of the flames, the boss is defeated, but the central panel won’t open unless you've defeated enough smaller enemies and the boss changes color. However, the boss will also self-destruct if you’ve defeated all of the enemies that were inside, but that's hard to keep track of because you're also being attacked by enemies from the side.</div><div><br /></div><div>Deducing these rules was not easy, and in practice, an approach of shooting everything that moves will eventually work. You can actually destroy the mothership without landing a single shot on it, which is just bizarre and almost defeats the purpose of the boss. The developers should have put more thought into the mechanics of this battle because it feels a bit like fighting a black box.</div><h1 style="text-align: left;">Whittling Away...</h1><div>Of the boss battles that appear in early fixed shooters, the longest and most complete are those that include shielding of some kind. For one example, I refer you to the mother of all shoot ‘em up bosses, the <i>Phoenix </i>mothership.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkcgCXSROYUDqGgZsQrT1tTVEUf4z0yw-6sPfp0ZJ1uw-QlgrUZFpyXMQBXpfzZPZxBej6UASy5L_b6JE_rEza16yBt47UOwIhc9FPNornP2mi-S0iD46DnJcxvXBI1ABeACks-WBkF4v7/s256/full_boss_battle2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Complete playthrough of the fifth stage of the 1980 arcade game, Phoenix. The player fights against a boss surrounded by a yellow shield and diving birds." border="0" data-original-height="256" data-original-width="208" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkcgCXSROYUDqGgZsQrT1tTVEUf4z0yw-6sPfp0ZJ1uw-QlgrUZFpyXMQBXpfzZPZxBej6UASy5L_b6JE_rEza16yBt47UOwIhc9FPNornP2mi-S0iD46DnJcxvXBI1ABeACks-WBkF4v7/w325-h400/full_boss_battle2.gif" width="325" /></a></div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjarlakSWm3ExCJEmjpheFjruaJKERVums08e8CqTGA5qIG8IezSxHzzJzjUrAQJZ1HBUHhGHtXU_BHaN-yo8GDmK2z_YVc4KYNgs9-TJ6FQFRgYFAmmfYBLO7RuzAgHf_Yrv6_9dkyx3df/s124/shield_whittle.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Animation demonstrating the bunkers in Space Invaders." border="0" data-original-height="124" data-original-width="45" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjarlakSWm3ExCJEmjpheFjruaJKERVums08e8CqTGA5qIG8IezSxHzzJzjUrAQJZ1HBUHhGHtXU_BHaN-yo8GDmK2z_YVc4KYNgs9-TJ6FQFRgYFAmmfYBLO7RuzAgHf_Yrv6_9dkyx3df/d/shield_whittle.gif" /></a></div>Look at the shield and compare to the original <i>Space Invaders</i>, where the player is protected by bunkers that get gradually eaten away by enemy fire. <i>Phoenix </i>uses the same concept, but with the bunker around the boss instead of the player. Of course, they're not going to let you fire away at the shield unmolested. Diving birds and the boss himself take regular potshots at the player, and a rotating conveyor provides yet another obstacle before you can finally finish off the boss. </div><div><br /></div><div>Unlike in the bosses mentioned previously, the design of the <i>Phoenix</i> boss actually lends itself to strategic considerations. Do you just focus your fire on the part of the shielding in front of the boss, or do you first damage the conveyor belt from the side, where the enemy fire is less intense? How much time do you spend dispatching the birds and is it worth trying to pick some of them off from the sides? By allowing multiple strategies, the game becomes more replayable</div><div><br /></div><div>Similar considerations arise in the boss battle of <i><a href="http://www.retrogamedeconstructionzone.com/2020/07/gorf-unfixing-shooter.html">Gorf</a>.</i></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhen4df85yZvi1KxUw7vqP2tK5cuCPXkmth11bj0P_qG_IXnN0_WusmdX0egyEkJ2Uqc5cDwT4uFDlgGT9dXOM-AbO3V2wzYyyf1JBzQoBmPJKF5cDpe4d4843g-fChbaH7c58d_h_wLJoF/s352/full_boss_battle_30.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Complete playthrough of the fifth stage of the 1980 arcade game, Gorf. The player fights against a large starship boss with a semicircular shield in front." border="0" data-original-height="352" data-original-width="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhen4df85yZvi1KxUw7vqP2tK5cuCPXkmth11bj0P_qG_IXnN0_WusmdX0egyEkJ2Uqc5cDwT4uFDlgGT9dXOM-AbO3V2wzYyyf1JBzQoBmPJKF5cDpe4d4843g-fChbaH7c58d_h_wLJoF/d/full_boss_battle_30.gif" /></a></div><div><br /></div><div>Here, the shield is a less substantial hindrance than it was in <i>Phoenix</i>, but that doesn't mean that the battle is easier. Theoretically, you could finish the level with two well-placed shots; one through the shield and another in the boss' vulnerable point.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigEEzSZ0TJzXknYomKOnWltJwhZalFeaO-Kjb8FpCTJpEv_jbL2x6S9T0WFrtMoZEa6cfKqf8eQstmFc3NuJ76B2EbRmKen5Z5C-7i1G2wkfRJFsIK2OHtXGdUAa_lVoLalX8aWW_kQw0C/s99/vulnerable_point_arrow.png" style="margin-left: auto; margin-right: auto;"><img alt="A zoomed-in image of the vulnerable point on the Gorf boss." border="0" data-original-height="63" data-original-width="99" height="155" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigEEzSZ0TJzXknYomKOnWltJwhZalFeaO-Kjb8FpCTJpEv_jbL2x6S9T0WFrtMoZEa6cfKqf8eQstmFc3NuJ76B2EbRmKen5Z5C-7i1G2wkfRJFsIK2OHtXGdUAa_lVoLalX8aWW_kQw0C/w243-h155/vulnerable_point_arrow.png" width="243" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Vulnerable point of the <i>Gorf </i>boss.</td></tr></tbody></table><div><br />Good luck, however, hitting a one-pixel-wide gap while under pressure from both the ship’s fire and the diving aliens. And if you miss, a piece of the ship will "fall" in your direction.</div><div><br /></div><div>You'll probably need at least 5 - 10 clean shots on the boss before you manage to squeak one in through that hole, so it ends up being of similar duration to the boss battle in <i>Phoenix. </i>The primary strategic consideration is where to shoot from. You can get up close and try to improve your aim on the boss, but that will give you less time (and space) to dodge incoming fire. </div><div><br /></div><div>But as well designed as are <i>Gorf</i> and <i>Phoenix</i>, my favorite boss in a fixed shooter is from an obscure arcade game called <i>Black Hole </i>(1980, Game-a-Tron).</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlStSPUZxxJgWb1PjJshGOxpWr3vRTKdYnfpTpHdJwKYhAMVzaKlRi4qPyAuH9V6L4mIZNIsxcCd3xnZ48DsUr-a8YKoPUswPswB38a_XDYLJ4TaBMhyphenhyphenvZGUi3j-6LLMjz0eHDuayIuTvz/s256/boss_battle_30.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Playthrough of the first stage of the 1980 arcade game, Black Hole. The player shoots through a shield while avoiding black holes." border="0" data-original-height="256" data-original-width="224" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlStSPUZxxJgWb1PjJshGOxpWr3vRTKdYnfpTpHdJwKYhAMVzaKlRi4qPyAuH9V6L4mIZNIsxcCd3xnZ48DsUr-a8YKoPUswPswB38a_XDYLJ4TaBMhyphenhyphenvZGUi3j-6LLMjz0eHDuayIuTvz/w350-h400/boss_battle_30.gif" width="350" /></a></div><div><br /></div><div>Much like in <i>Phoenix</i>, there is a shield that you can whittle away and which gradually descends on you. However, instead of facing enemy fire, you're pitted against a swarm of what appear to be hungry pairs of parentheses. Actually, you can infer from the game's title that they're meant to be black holes... but don't expect them to act like black holes. </div><div><br /></div><div>If you shoot the "black holes", they open up, allowing you to pass through them and accumulate points. They close quickly, so don't shoot them too soon. The black holes will move in your direction, but only change course at specific inflection points, so with a little practice, you should be able to direct them out of harm's way while you're firing at the shield. Once you've broken through the shield, be aware that firing at the boss will not destroy it, but will instead hasten the advancement of the shield. This can be good if you've cleared a wide enough path in front of you, but if you haven't, you could get smushed.</div><div><br /></div><div>And that's not even the end. Once you're clear of the shield, a final showdown commences.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1j7FUDo3jgKSDJvd8Q67GrA3JB-fVJP-fiERcU5Q-QQoYEVroyOWAn1owrqdgZwgVf3DwLqbIl_mHHLmYYVENECSwastnAvtrbZpDgU2nkEaECntYp3D5XJcuSfWh6yoEkv7ydfIUgilW/s256/battle2_30.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Complete playthrough of the second stage of the 1980 arcade game, Black Hole. The player fights against a boss surrounded by orbs." border="0" data-original-height="256" data-original-width="224" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1j7FUDo3jgKSDJvd8Q67GrA3JB-fVJP-fiERcU5Q-QQoYEVroyOWAn1owrqdgZwgVf3DwLqbIl_mHHLmYYVENECSwastnAvtrbZpDgU2nkEaECntYp3D5XJcuSfWh6yoEkv7ydfIUgilW/w350-h400/battle2_30.gif" width="350" /></a></div><div><br /></div><div>The boss is now wrapped in orbs which can deflect your shots. He'll never fire at you, but avoiding his bouncing cocoon of orbs, not to mention your own shots, is challenge enough. In some cases, your shots may bounce around several times before exiting the cocoon, so be careful. </div><div><br /></div><div>The orbs rotate in two concentric shells, and the boss can only be hit when the shells align and leave gaps between the orbs. Two well-placed shots between the orbs will dispatch your foe and end the round.</div><div><br /></div><div>Considering the obscurity of both game and developer, <i>Black Hole</i> contains a surprising amount of depth. Learning to manage the black holes is the most challenging problem, because you need to decide when to shoot them, when to pass through them, and how to guide their movements. This is on top of choosing where to focus your fire; if you create too narrow a path in the shield, you may get trapped by the black holes.</div><h1 style="text-align: left;">Looking Forward</h1><div>We don't generally associate fixed shooters with boss battles, in large part because they flourished in an era when the "boss" wasn't a well-established video game concept and developers were still experimenting with the mechanics. Starting in late 1981, scrolling shooters would begin to dominate fixed shooters at the arcades, and the art of the shoot em up boss would continue there.</div><div><br /></div><div>Nevertheless, some of the ideas used in these early fixed shooters would stick around, notably the piece-by-piece knockdown and the doppleganger attack. On the other hand, the <i>Space-Invaders-</i>style shield has gradually disappeared, probably because it takes up so much space on the screen. Later games would use damage meters or gradual color changes to give a visual indication of a player's progress.</div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com1tag:blogger.com,1999:blog-7604980045122375946.post-67602164554972570202020-08-10T13:36:00.004-07:002020-08-10T14:17:43.650-07:00The Characters of Centipede<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbugEAdhjyJGbogjPTvcj47avDZm-NTFpGZCMqn_ZQgNLfo8yJRyLeTXTO8t3IKkRi2OO7lyyMqtwxd7uV3L_NkErP3RR_kFVFoOtX1-jNPGZGKqvOV1ObHljuIBSph880UvAn8M5yO3Sz/s492/table_title2.gif" style="display: block; padding: 1em 0px;"><img alt="Table showing the point values of each enemy in the 1980 arcade game, Centipede." border="0" data-original-height="352" data-original-width="492" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbugEAdhjyJGbogjPTvcj47avDZm-NTFpGZCMqn_ZQgNLfo8yJRyLeTXTO8t3IKkRi2OO7lyyMqtwxd7uV3L_NkErP3RR_kFVFoOtX1-jNPGZGKqvOV1ObHljuIBSph880UvAn8M5yO3Sz/w394-h282/table_title2.gif" width="394" /></a></div><p style="text-align: left;">In the first part of my coverage of the classic Atari arcade game, <i>Centipede</i>, I want to look at the game's characters and how they contribute to the gameplay. The game was created in 1981 by Dona Bailey and Ed Logg. All of the enemies have a fixed point value, given in the table above, except for the spider, whose point value varies. The color of all of <i>Centipede</i>'s characters varies from one stage to the next, as the game cycles through its <a href="http://www.retrogamedeconstructionzone.com/2020/01/graphics-in-early-arcade-games-tilemaps.html#colorschemes">color schemes</a>.</p><p style="text-align: left;">Let's start by looking at the game's title character.</p><h1 style="text-align: left;">Centipede</h1><div>The centipede is the heart and soul of the game, both from the visual perspective and from the point of view of the gameplay. A given stage will only end when the player has cleared all of the centipede segments from the screen. The motion of the centipede across the playing field is determined by simple rules that I will lay out in more detail in a subsequent entry, but roughly speaking, it moves horizontally until it hits an obstacle, then moves downward and changes direction.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2PVH7aU0BKI2YnBedUx-FDz2AYHfnpDJDyjIgCkXgUxUgnswq8Mqcle21_r5Q6-m6AN4q8MshayRGEgKAb4n411GMVb2XdH-6JwDoe3Q1BHOUdStMA_tv3VDmzgQeimJmkSSFXcS_HzlF/s384/centipede_path_size2.gif" style="display: block; padding: 1em 0px;"><img alt="Sample gameplay from the 1980 arcade game, Centipede, tracing the path of the centipede." border="0" data-original-height="384" data-original-width="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2PVH7aU0BKI2YnBedUx-FDz2AYHfnpDJDyjIgCkXgUxUgnswq8Mqcle21_r5Q6-m6AN4q8MshayRGEgKAb4n411GMVb2XdH-6JwDoe3Q1BHOUdStMA_tv3VDmzgQeimJmkSSFXcS_HzlF/d/centipede_path_size2.gif" /></a></div><div>The centipede is composed of multiple sprites, one for each segment, and each segment is animated with a pair of legs that cycle their horizontal position along the segment. The animation is coordinated such that the legs appear to be moving like a conveyor belt along the length of the centipede. Unfortunately, all of the animations in <i>Centipede</i> are rapid and jumpy (as was common in early arcade games), with new frames appearing every 1/16 seconds, so it's easier to see the character animations when you slow them down.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTsOjACtpZ6n0uD8ROPTaQ_a-pkgn4hmfSD3G3u8Y0HoALBdR9zbS9gLCsVmNaR10X5ONpiClgx8nCRjTKbN7SqcX05yU26vPXFESYXxTRryCu6rvMlEGJlkOFOpEIY8A67cfmiM829oTJ/s701/centipede_speed_axrat3.gif" style="display: block; padding: 1em 0px;"><img alt="Animation of the centipede in the 1980 arcade game, Centipede. Shows normal speed and quarter speed." border="0" data-original-height="314" data-original-width="701" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTsOjACtpZ6n0uD8ROPTaQ_a-pkgn4hmfSD3G3u8Y0HoALBdR9zbS9gLCsVmNaR10X5ONpiClgx8nCRjTKbN7SqcX05yU26vPXFESYXxTRryCu6rvMlEGJlkOFOpEIY8A67cfmiM829oTJ/w640-h287/centipede_speed_axrat3.gif" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div>Internally, the same sprite is used for the head as is used for the body segments, but with a different color scheme.</div><div><br /></div><div><div>Things start getting complicated if you shoot one of the centipede segments, because that segment will then turn into a mushroom and any segments that were behind it will become a new centipede. </div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT0MxUW0WNw6afPPCM5p-wH3DAvkMMH0mhdBHNAuLMYH6x2z-URAYWWXG2OVpBRU4xFpOLQC5PQo6VCqENXrmGHmrnV1IajFVTOWJ_JXzXwkH_cUXw_IsfLUioNZeNmO-jaZaUlBC1TFiz/s240/segments3.gif" style="display: block; padding: 1em 0px;"><img alt="Sample gameplay from the 1980 arcade game, Centipede, demonstrating how shooting the centipede breaks it into smaller centipedes." border="0" data-original-height="158" data-original-width="240" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT0MxUW0WNw6afPPCM5p-wH3DAvkMMH0mhdBHNAuLMYH6x2z-URAYWWXG2OVpBRU4xFpOLQC5PQo6VCqENXrmGHmrnV1IajFVTOWJ_JXzXwkH_cUXw_IsfLUioNZeNmO-jaZaUlBC1TFiz/w375-h248/segments3.gif" width="375" /></a></div><div>If you can, it's best to destroy the entire centipede in a single sequence of rapid-fire shots, but failing that, you'll have to manage the pieces individually. As you advance in the stages, an increasing number of individual centipede segments will descend on you in addition to the primary centipede.</div>
<h1 style="text-align: left;">Player</h1><div><div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd0QFt-f-mYR8y3L8rNQBd6vdhNTB7vX_bH7EO9Kn4_Xm8ualIHHBMJYvo03h3YXcmgQ7_WnNUAfn-BJup2q995y0mU8wZEi4RpCuxqvE6jB4f8td-U3AU6QPDX1TnB74R7YTkKZVvhnEe/s355/centipede_player_rat2.gif" style="clear: left; display: block; float: left; margin-bottom: 1em; margin-right: 1em; padding: 1em 0px;"><img alt="The player sprite in the 1980 arcade game, Centipede." border="0" data-original-height="355" data-original-width="131" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd0QFt-f-mYR8y3L8rNQBd6vdhNTB7vX_bH7EO9Kn4_Xm8ualIHHBMJYvo03h3YXcmgQ7_WnNUAfn-BJup2q995y0mU8wZEi4RpCuxqvE6jB4f8td-U3AU6QPDX1TnB74R7YTkKZVvhnEe/w67-h182/centipede_player_rat2.gif" width="67" /></a></div>In <i>Centipede, </i>the player has control of an ambiguous sprite that fires bullets vertically. In the context of shooters from this period, it's a typical generic gun-like thing, but it's not clear what it's supposed to be in the context of the game. My first thought was that it looks like a snake's head, but the Atari 2600 port of the game says it's a <a href="https://atariage.com/manual_html_page.php?SoftwareID=911">elf's magic wand</a>. Whether this also applies to the arcade version is unclear -- the <a href="https://www.arcade-museum.com/manuals-videogames/C/Centipede.pdf">arcade cabinet manual</a> describes it as a "somewhat humanoid head".</div><div><br /></div><div>Regardless, there are two things that stand out about the player character in <i>Centipede </i>compared to other contemporary shooters. First of all, you have a small amount of vertical freedom. The first shoot 'em ups mostly fixed the player along a row at the bottom of the screen, but by the early '80s, developers were increasingly <a href="http://www.retrogamedeconstructionzone.com/2020/07/shooter-gallery-7-design-experiments-in.html">experimenting with giving the player vertical freedom</a>. <i>Centipede</i> is an intermediate case, where the game plays initially like a fixed shooter, but when the centipede reaches the bottom, the player can use their vertical freedom to avoid any remaining centipede segments.</div><div><br /></div><div>The other interesting thing about the <i>Centipede</i> avatar is how quickly it can fire at close range. You're only allowed one bullet on the screen at a time, but when the centipede reaches the bottom, your bullets reach it so quickly that they can cut through an entire centipede in a fraction of a second. You can't make out the individual shots when playing in real time, but fortunately, in an emulator, you can get a frame-by-frame dump of the action:</div><div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyYYucPeqaPeZuxmzUg9_1FoZ5Ccefko9nu6-_h6UTOody7YsIj5ccr82E_V2Y7QLi_fasd4nrkzHdODy0451s0OBn-VPkejAFx-0iX9zB1ooMae7gTDkoanpuIo073T1kQ-km1tHfZag3/s129/fastfire_compare2.gif" style="display: block; padding: 1em 0px; text-align: center;"><img alt="Slowed-down gameplay from the 1980 arcade game, Centipede, showing what's happening during rapid fire.." border="0" data-original-height="120" data-original-width="129" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyYYucPeqaPeZuxmzUg9_1FoZ5Ccefko9nu6-_h6UTOody7YsIj5ccr82E_V2Y7QLi_fasd4nrkzHdODy0451s0OBn-VPkejAFx-0iX9zB1ooMae7gTDkoanpuIo073T1kQ-km1tHfZag3/w201-h188/fastfire_compare2.gif" width="201" /></a></div><div>I had to count to make sure, but all of the bullets are shown. In the animation above, there are twelve shots that hit something, including eight that hit centipede segments (all destroyed) and four that hit a mushroom, which is destroyed by the end.</div><h1 style="text-align: left;">Spider</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNieLd1-hY7TtB7sgPYhEsFUkoaenkB8ONpgR_oHfSCz_6zFFrgKf6b2X0XRKTgoKXon47uSADrf3sFMB5sADMXwvn-bSjYEDAMIh5ro1Oc1Gee2RfDGNcu2dOgw_mpOvAErUEaiaaxnoF/s294/spider_speed2.gif" style="display: block; padding: 1em 0px;"><img alt="Animation of the spider in the 1980 arcade game, Centipede. Shows normal speed and quarter speed." border="0" data-original-height="77" data-original-width="294" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNieLd1-hY7TtB7sgPYhEsFUkoaenkB8ONpgR_oHfSCz_6zFFrgKf6b2X0XRKTgoKXon47uSADrf3sFMB5sADMXwvn-bSjYEDAMIh5ro1Oc1Gee2RfDGNcu2dOgw_mpOvAErUEaiaaxnoF/w460-h120/spider_speed2.gif" width="460" /></a></div><div>The spider is the only opponent in the game that is worth a variable number of points. The points you earn from it will depend on how far away it is when killed, with three possible values: 300, 600, or 900 points.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrL3YW2YoPMRIuAHdEog0nc47Z3uCqGcktrmXFf50qfHHuNHZ4O-U8ZcG3VWGsGrd-oxQv5sepOUawVEv5X17By2r_dpS1qHqu8pDUIbbNMvT_z-vJTQHzgy8cxJ6RWnhJXNofj8VZ8aYe/s192/spoints_all_rat2.gif" style="display: block; padding: 1em 0px;"><img alt="Demonstration of the point value awards for killing the spider in the arcade version of Centipede." border="0" data-original-height="192" data-original-width="175" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrL3YW2YoPMRIuAHdEog0nc47Z3uCqGcktrmXFf50qfHHuNHZ4O-U8ZcG3VWGsGrd-oxQv5sepOUawVEv5X17By2r_dpS1qHqu8pDUIbbNMvT_z-vJTQHzgy8cxJ6RWnhJXNofj8VZ8aYe/w274-h300/spoints_all_rat2.gif" width="274" /></a></div><div>The spider's role in <i>Centipede </i>is to apply pressure on the player, especially when the centipede is too distant to immediately threaten them. The spider switches irregularly between vertical and diagonal motion, with an apparent random component.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizkSIiPFIlWe8rqsgx06HcKGCD0M7QsOh5nuF-Q-pnccCIUJcItTcQnsHYR34L92zV0t6PXjjwNVQBgP0_qx19D0209YLw_FIvy2dOqpNrs8ThgtF14RGoWCZJbZ2acu2ntJmFU88ivQmE/s384/spider_sample2_path2.gif" style="display: block; padding: 1em 0px;"><img alt="Sample gameplay from the 1980 arcade game, Centipede, tracing the path of the spider." border="0" data-original-height="384" data-original-width="288" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizkSIiPFIlWe8rqsgx06HcKGCD0M7QsOh5nuF-Q-pnccCIUJcItTcQnsHYR34L92zV0t6PXjjwNVQBgP0_qx19D0209YLw_FIvy2dOqpNrs8ThgtF14RGoWCZJbZ2acu2ntJmFU88ivQmE/w360-h480/spider_sample2_path2.gif" width="360" /></a></div><div>In the early stages of the game, the spider's diagonal motion is one pixel per frame in both x and y. This is 45 degree motion in the game's internal <a href="http://www.retrogamedeconstructionzone.com/2020/01/animative-blogging-part-2-sprite.html#aspectratio">aspect ratio</a>, but ~50 degrees when squeezed onto the typical 4/3 aspect ratio of an arcade cabinet monitor. Note that the spider never turns around until after it has crossed the playing field. You can take advantage of this fact by staying on its "safe side" in the early going.</div><div><br /></div><div>In addition to pressuring the player, the spider also serves a maintenance role, removing any mushrooms it passes over:</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwTNFu8I_w-pRVRYiTUABQ2KKX9Z7N8AR57iDIyMwOiRmuApPZeS1Bvf4DGs8VrZ4Et6aOhWSGOCThof7NqUkgW7ZnmmFNjZzP6XvV0tpIMOjf6smstgN419gT2ekfAMdZQXQG4K7QLWnc/s384/spider_zoom_size2.gif" style="display: block; padding: 1em 0px;"><img alt="Sample gameplay from the 1980 arcade game, Centipede, zooming in on the spider." border="0" data-original-height="384" data-original-width="288" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwTNFu8I_w-pRVRYiTUABQ2KKX9Z7N8AR57iDIyMwOiRmuApPZeS1Bvf4DGs8VrZ4Et6aOhWSGOCThof7NqUkgW7ZnmmFNjZzP6XvV0tpIMOjf6smstgN419gT2ekfAMdZQXQG4K7QLWnc/w360-h480/spider_zoom_size2.gif" width="360" /></a></div><p style="text-align: left;">Whether the spider's cleanup activities are useful to you will depend on the strategy you're employing. If you don't selectively clear the mushroom field, the effects of the spider's cleanup will become noticeable in the late-stage action, as the top half of the playing field will be considerably more crowded than the bottom half.</p><h1 style="text-align: left;">Flea</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzVXcVsNwCPCF451n49o11Y96084IUInliCdjoskk8B96F4yFuFl8e1asoIZckVMPWPaNkx5o2CyxUku8718o3pXFBSjv-Y8RfDZ_BL6BDk17M4PYcBSqX4CvpCq8RYQSUJwr9GAmErnv6/s174/flea_speed2.gif" style="display: block; padding: 1em 0px;"><img alt="Animation of the flea in the 1980 arcade game, Centipede. Shows normal speed and quarter speed." border="0" data-original-height="77" data-original-width="174" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzVXcVsNwCPCF451n49o11Y96084IUInliCdjoskk8B96F4yFuFl8e1asoIZckVMPWPaNkx5o2CyxUku8718o3pXFBSjv-Y8RfDZ_BL6BDk17M4PYcBSqX4CvpCq8RYQSUJwr9GAmErnv6/w273-h120/flea_speed2.gif" width="273" /></a></div><div class="separator" style="clear: both; text-align: left;">The role of the flea is to fill the board with mushrooms. If the bottom fifth of the board is mostly clear, they will drop from the top of the playing field, leaving mushrooms in their wake.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtUvR_AOqvxwfSN5zaiLTQzeumokE6OGG6imAdI_odYAXUb6g2ukbUM1aLMmiHFIcgl-a1AsDMonLYzlGtf0LvwwuyXb02potzJF5kac3pBqpU4ai2xv6tuQjICLZWHP0XsN3ko4jMMfBq/s384/flea_full_zoom_rat2.gif" style="display: block; padding: 1em 0px;"><img border="0" data-original-height="384" data-original-width="288" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtUvR_AOqvxwfSN5zaiLTQzeumokE6OGG6imAdI_odYAXUb6g2ukbUM1aLMmiHFIcgl-a1AsDMonLYzlGtf0LvwwuyXb02potzJF5kac3pBqpU4ai2xv6tuQjICLZWHP0XsN3ko4jMMfBq/w360-h480/flea_full_zoom_rat2.gif" width="360" /></a></div><div>They initially descend at a rate of 2 pixels per frame, crossing the field in about 2 seconds, but will speed up when you reach 60,000 points. It takes two shots to kill a flea, and knocking them out can be a good way to build up points, since knocking one out will often trigger another to immediately fall.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpYevE7-7YRTLYNAGPqT5q-AXOGGne3WAM3iwFtYgNznpaPECU778MuNaz0DffkQIWf-Lw4npscEuUDFPWw7TO8JWPXRWM-dmcCN1OKezbUpTMgn0rurym5Wx0NvqaR4jPEKHmm6fPkmUr/s384/flea_cascade_rat2.gif" style="display: block; padding: 1em 0px;"><img alt="Demonstration of killing multiple fleas in quick succession, in the 1980 arcade game, Centipede." border="0" data-original-height="384" data-original-width="288" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpYevE7-7YRTLYNAGPqT5q-AXOGGne3WAM3iwFtYgNznpaPECU778MuNaz0DffkQIWf-Lw4npscEuUDFPWw7TO8JWPXRWM-dmcCN1OKezbUpTMgn0rurym5Wx0NvqaR4jPEKHmm6fPkmUr/w360-h480/flea_cascade_rat2.gif" width="360" /></a></div><h1 style="text-align: left;">Scorpion</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi45aVY-66Hj-RfboekxE-FUO4CXiFc7uA6TXhpXBjtJ6SuD2nKVIxLMGVltg_PRpkXjkpAsRpeJ0L5o1YbQT5rM5qs9pFzyEQIDPJZq-8xr5h5kcrDVDGyiPtjV4qmOFQOqg0AN7RllwXm/s314/scorpion_speed2.gif" style="display: block; padding: 1em 0px;"><img alt="Animation of the scorpion in the 1980 arcade game, Centipede. Shows normal speed and quarter speed." border="0" data-original-height="77" data-original-width="314" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi45aVY-66Hj-RfboekxE-FUO4CXiFc7uA6TXhpXBjtJ6SuD2nKVIxLMGVltg_PRpkXjkpAsRpeJ0L5o1YbQT5rM5qs9pFzyEQIDPJZq-8xr5h5kcrDVDGyiPtjV4qmOFQOqg0AN7RllwXm/w491-h120/scorpion_speed2.gif" width="491" /></a></div><div class="separator" style="clear: both;">The scorpion never directly interacts with the player, but is arguably the most dangerous enemy in the game. It crosses the playing field horizontally, poisoning every mushroom that it encounters.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpsQnE8phaBtYhzXGtxRmU8G-Avi_VGBxhVy2aOGbpVwK0kUZhCX4A3Cs6M_3YdassRdu9dEBDvEP4NZBENQeUlVJ1DKdqWiS-iDGiEEztm9bX7EbT5Ay_hFaMBIOXhWY7v6xCy8lwykWY/s384/scorpion_zoom_size2.gif" style="display: block; padding: 1em 0px;"><img alt="Sample gameplay from the 1980 arcade game, Centipede, zooming in on the scorpion." border="0" data-original-height="384" data-original-width="288" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpsQnE8phaBtYhzXGtxRmU8G-Avi_VGBxhVy2aOGbpVwK0kUZhCX4A3Cs6M_3YdassRdu9dEBDvEP4NZBENQeUlVJ1DKdqWiS-iDGiEEztm9bX7EbT5Ay_hFaMBIOXhWY7v6xCy8lwykWY/w360-h480/scorpion_zoom_size2.gif" width="360" /></a></div><div class="separator" style="clear: both; text-align: left;">A poisoned mushroom is extremely dangerous because any centipede that encounters it will immediately descend to the bottom of the screen. The upside is that the scorpion is worth 1000 points when killed, and it moves fairly slowly, about one pixel per second. Every time it enters, you have about four seconds to destroy before it leaves the playing field.</div><h1 style="text-align: left;">Grasshopper</h1><div>There is at least one character in <i>Centipede</i> that never made it into the final version of the game. If you load up the game in MAME and bring up the <a href="http://www.chronocrash.com/forum/index.php?topic=813.0">graphics viewer</a>, you can see the bitmap data that's stored in the game's ROM image. The second page of bitmaps contains the 8x16 sprites, four of which are of this character:</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsd8f5Uuclx-CcTcvJxja1cdU9GZHOIZopXNtbUivipeBmCHcl81UEDLEfg7jNlqGvDM1lcdmfuyHYwy_tKYhoEWAVFT89OFacfCR9u8-z5Zv5jNri3aI8qZusfcoU4CeCubytx_Irmo1f/s314/grasshopper_speed2.gif" style="display: block; padding: 1em 0px;"><img alt="Possible animation of the grasshopper in the 1980 arcade game, Centipede. Shows normal speed and quarter speed." border="0" data-original-height="77" data-original-width="314" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsd8f5Uuclx-CcTcvJxja1cdU9GZHOIZopXNtbUivipeBmCHcl81UEDLEfg7jNlqGvDM1lcdmfuyHYwy_tKYhoEWAVFT89OFacfCR9u8-z5Zv5jNri3aI8qZusfcoU4CeCubytx_Irmo1f/w491-h120/grasshopper_speed2.gif" width="491" /></a></div><div><a href="https://www.google.com/books/edition/Game_Design_Theory_and_Practice_Second_E/tGePP1Nu_P8C?hl=en&gbpv=1&dq=centipede+grasshopper+atari&pg=PA96">According to Ed Logg</a>, the grasshopper was intended to play a role similar to that of the spider. What might that have looked like? To see, I took a clip of gameplay and swapped out the spider sprite with that of a grasshopper (with the same color scheme).</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBJHonwR30tMB37KvQs-WUxDJ74HFWSg_KKAKyNCUKXV_xc6g3e74RupP8yKJdzsi4JBr-spmn8L4tntxtywMK1K9iTVrfAXYk4c7yfVgFMm-tZueiGH3Dwril20ZXSKJ_eqDC_1pNjsFw/s384/grasshopper_demo_size2.gif" style="display: block; padding: 1em 0px;"><img alt="Sample gameplay from the 1980 arcade game, Centipede. The spider sprite is replaced with the grasshopper to show how it might have looked during gameplay." border="0" data-original-height="384" data-original-width="288" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBJHonwR30tMB37KvQs-WUxDJ74HFWSg_KKAKyNCUKXV_xc6g3e74RupP8yKJdzsi4JBr-spmn8L4tntxtywMK1K9iTVrfAXYk4c7yfVgFMm-tZueiGH3Dwril20ZXSKJ_eqDC_1pNjsFw/w360-h480/grasshopper_demo_size2.gif" width="360" /></a></div><div>I think the grasshopper sprite actually looks pretty good in this role. One issue, however, is that it would be easy to confuse with the centipede segments in the heat of battle. Perhaps that fact played a role in the decision to excise it from the final game.</div><div><br /></div><div>In a follow-up entry, I will talk about the detailed mechanics of the game, looking at the rules that govern the centipede's motion and how they interact with changes in the configuration of the mushroom field.</div><div><br /></div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com6tag:blogger.com,1999:blog-7604980045122375946.post-39362435840333555002020-08-02T10:58:00.002-07:002020-08-03T12:42:36.533-07:00The Beginnings of Arcade Game Mazes, Part 2<p style="text-align: left;">In <a href="http://www.retrogamedeconstructionzone.com/2020/07/the-beginnings-of-arcade-game-mazes.html">part 1</a>, I talked about the use of mazes in the earliest arcade games, with the first coming out only a year after <i>Pong</i>. After this first wave, however, arcade maze games didn’t advance very much until 1979. When the breakthrough came, it was in the form of a twist on the overhead racer. In this innovative game, the player tries to avoid colliding with other cars rather than racing against them. The game is titled, appropriately,<i> Head On</i>.</p><h1 style="text-align: left;"><i>Head On</i> (1979, Sega)</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc9Zf69cN5343SpDU209N8_RVnh0x6Epi7wJARKnXFaB7v6EPW1dh7zdYdOxdMy_UawPE245UP8eqyy1dgQ292Jn92zq3xHxvTkZApKWjlNfTpR_stYGvK05rcCPeYgF-x41TBEoDyoL9x/s457/demo2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites for the 1979 arcade game, Head On. The sprites shown are the cars and the bezel title." border="0" data-original-height="224" data-original-width="457" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc9Zf69cN5343SpDU209N8_RVnh0x6Epi7wJARKnXFaB7v6EPW1dh7zdYdOxdMy_UawPE245UP8eqyy1dgQ292Jn92zq3xHxvTkZApKWjlNfTpR_stYGvK05rcCPeYgF-x41TBEoDyoL9x/w500-h245/demo2.gif" width="500" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><i>Head On</i> was developed by Sega and is generally credited to them as an original game, but <a href="https://www.google.com/books/edition/The_Video_Game_Explosion/XiM0ntMybNwC?hl=en&gbpv=1&dq=head+on+sega+dodgem+atari&pg=PA44&printsec=frontcover">at least one source</a> attributes the idea for the game to an Atari concept, called <i>Dodgem</i>, developed in 1978. I have never found any evidence for the existence of such a game in Atari’s arcade catalog (there is a VCS cartridge by that title), so I’m inclined to believe the Sega developer, Lane Hauk, <a href="https://www.google.com/books/edition/The_Sega_Arcade_Revolution/7qZhDwAAQBAJ?hl=en&gbpv=1&dq=head+on+sega+pac-man&pg=PA25&printsec=frontcover">when he says</a> that <i>Head On</i> was an original idea. </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">The playing field is laid out in a series of nested square tracks, where cars can change between the tracks only at four distinct locations. The idea is that once you have committed to a particular lane, you cannot escape it until the next junction, so if the computer has maneuvered into the same lane segment before you leave it, a collision will occur. This design was ideal for early arcade hardware because the logic needed for the AI was relatively simple. The computer merely takes every opportunity to enter the lane that you are already in. The computer is limited somewhat in the early levels, only changing one lane at a time, and the number of computer opponents increases with level.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><i>Head On</i> is easy to learn but difficult to master – ideal for an arcade game. It is also notable for introducing the concept of collecting pellets. By forcing the player to collect all of the pellets, you also force them to explore the entire maze, maximizing the variety of player-computer interactions that can occur in a given level.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY0CfcmpiPahT39t4Hf-h-oAoyXzxOIIpj4atLbPEClHDBxxLf8NcR4zTcf3hb95a9SMCVb2e3GR8qT38h0Zj32wTxoLzQMjiJkbQiYRAzttUoCXgOkSF3M5mlMgaiibnwW9HoNp8c1N0Y/s256/fast1.gif" style="margin-left: auto; margin-right: auto;"><img alt="Complete playthrough of the arcade game, Head On (1979), sped up to 5x." border="0" data-original-height="224" data-original-width="256" height="350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY0CfcmpiPahT39t4Hf-h-oAoyXzxOIIpj4atLbPEClHDBxxLf8NcR4zTcf3hb95a9SMCVb2e3GR8qT38h0Zj32wTxoLzQMjiJkbQiYRAzttUoCXgOkSF3M5mlMgaiibnwW9HoNp8c1N0Y/w400-h350/fast1.gif" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Complete playthrough of a stage of <i>Head On</i>, sped up to 5x.<br /></td></tr></tbody></table><div class="separator" style="clear: both; text-align: left;"><br />The game was incredibly popular, and led to a wide range of clones and imitators. Here are some of the most interesting.<h1><i>Safari Rally </i>(1979, SNK)</h1></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0ZMoHcB_ixmo1ED3aMC4TNFA-AquO1HACfHZPG2uag1u7t8_Eq9HYgD6YFbhjIQVZKC7UTsLBLGBzORcfd4xwwgh-2gghddBmaNwJ7Fx3GEbDuwzDixfd41nSeKE3ZRQjI_nNdeS-5vOU/s409/demo2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites for the 1979 arcade game, Safari Rally. The sprites shown are the snake, lion, and the splash screen title." border="0" data-original-height="256" data-original-width="409" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0ZMoHcB_ixmo1ED3aMC4TNFA-AquO1HACfHZPG2uag1u7t8_Eq9HYgD6YFbhjIQVZKC7UTsLBLGBzORcfd4xwwgh-2gghddBmaNwJ7Fx3GEbDuwzDixfd41nSeKE3ZRQjI_nNdeS-5vOU/w500-h313/demo2.gif" width="500" /></a></div><div><br /></div><div><i>Safari Rally</i> was either released in the same year as <i>Head On</i>, or possibly the following year, 1980. Rather than a square track, <i>Safari Rally</i> places the player within a series of looping vertical lanes. The design is even more similar to <i>Head On</i> than it might appear at first, because a looping vertical lane is functionally equivalent to a square lane, it just lays out differently on the monitor. It has the same number of lane segments in a given lane, as well as the same number of locations where you can switch between lanes. The only difference, from the standpoint of the gameplay, is that the lanes are all the same length in S<i>afari Rally</i>, whereas in <i>Head On</i>, different lanes take different amounts of time to traverse. </div><div><br /></div><div>There are a few wildcards thrown in to <i>Safari Rally</i> that do distinguish it from its cousin. The most obvious are the lions and snakes that sporadically cross the track. Oddly enough, the player is actually given a point reward for direct collisions with the animals, though the most useful function of the animals is to stop the computer player for a brief period when they cross its path. On occasion you will also see rocks pop up between the lanes. Again, the player is incentivized to collide with these rocks, not because they get a point bonus but because the collision causes them to spin out into another lane, usually adding to the distance between player and computer.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYhlXMDZOjQaUNWRt2rwjz1RTcyynwZMIm5C0Sl3VaEGQNOFlwOqL-bSn4X_zwat6rTV_ckgK8B55VKglklOBP_1j-fYINmm-uy_QQqOFV98nmw04E6HBCCwTzbnBytTK0WAMR7nh3DBGH/s256/fast1.gif" style="margin-left: auto; margin-right: auto;"><img alt="Complete playthrough of the arcade game, Safari Rally (1979), sped up to 4x." border="0" data-original-height="256" data-original-width="208" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYhlXMDZOjQaUNWRt2rwjz1RTcyynwZMIm5C0Sl3VaEGQNOFlwOqL-bSn4X_zwat6rTV_ckgK8B55VKglklOBP_1j-fYINmm-uy_QQqOFV98nmw04E6HBCCwTzbnBytTK0WAMR7nh3DBGH/w325-h400/fast1.gif" width="325" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Complete playthrough of a stage of <i>Safari Rally</i>, sped up to 4x.<br /></td></tr></tbody></table><div><br /></div><div>I wouldn't bicker with anyone who wanted to call <i>Safari Rally</i> a <i>Head On</i> clone. I did find it more difficult than it’s cousin (there are more lanes to clear) and I enjoyed the variety that was added by the rocks and animals, but the experience was not fundamentally different from playing <i>Head On</i>.<h1 style="text-align: left;"><i>Side Trak</i> (1979, Exidy)</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV6_-brssZ9DivWOPryziRqDs6K7bHZ1aEpMbADMy1N7idpjcdEmv6LQDrnam3JSn17olZr_8aX7w_hNQAXbdPzZdVoBidBCHJRWcQvFkKGUyegjCJwaZlLKrr3o-KEbnjvlvDhV49gV1w/s407/demo2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay for the 1979 arcade game, Side Trak, including a zoomed-in overlay with the bezel title." border="0" data-original-height="256" data-original-width="407" height="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV6_-brssZ9DivWOPryziRqDs6K7bHZ1aEpMbADMy1N7idpjcdEmv6LQDrnam3JSn17olZr_8aX7w_hNQAXbdPzZdVoBidBCHJRWcQvFkKGUyegjCJwaZlLKrr3o-KEbnjvlvDhV49gV1w/w500-h314/demo2.gif" width="500" /></a></div><div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><i>Side Trak i</i>s the boldest of the experiments with the <i>Head On</i> formula. Here, the player is challenged to navigate the entirety of a two dimensional train track with frequent intersections between tracks. At every intersection, the player has the option to continue along the track as it is or to change its direction. </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">To say that the resulting playing field is complex would be a massive understatement — the player and computer are actively changing the maze with every turn! The learning curve for side track is very steep, as you'll find that even small adjustments in the initial geometry of the track can send you off on a course that is too complex to anticipate. I found that the most successful strategy for traversing the track was to attempt to stay in a single lane (i.e., one of the nested squares) for as long as possible and keeping it as straight as possible until you were forced to make a change. The hardest area to clear safely is the central track because a single circuit around it goes so quickly that it is difficult to adjust your course in a predictable way. </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">As if the game weren’t hard enough, the developers of <i>Side Trak</i> made several particularly cruel design decisions. First, the playing field resets between lives, meaning that any progress you make on a given attempt is erased if you did not finish the stage. This is downright excruciating after you've spent several minutes avoiding close calls against the computer, only to have it reset when you make a single slip-up. To make things even worse, every other stage is a "bonus" stage where play accelerates to 5x speed. This might be a fun addition if it were just for bonus points, but a lost life here is the same as a lost life at normal speed, meaning that the player is just out of luck if they can’t perform the near-impossible task of completing a full stage at 5x speed.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXVWUtEFSXuwVPmy62dZW7MT9I5Re-9U2apGfJu3_YQTpHnU5dPUU6A9TRmAueMvmzrDLDXOJNcD9Oql0wVcJC7yjWF01zmaKzlN3cpF-ju8B8ppc8AnRqKQqiCsYSsP4xMuUj3PnOn0Is/s256/fast2_2.gif" style="margin-left: auto; margin-right: auto;"><img alt="Complete playthrough of the arcade game, Side Trak (1979), sped up to 6x." border="0" data-original-height="256" data-original-width="256" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXVWUtEFSXuwVPmy62dZW7MT9I5Re-9U2apGfJu3_YQTpHnU5dPUU6A9TRmAueMvmzrDLDXOJNcD9Oql0wVcJC7yjWF01zmaKzlN3cpF-ju8B8ppc8AnRqKQqiCsYSsP4xMuUj3PnOn0Is/w400-h400/fast2_2.gif" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td class="tr-caption" style="text-align: center;">Complete playthrough of a stage of <i>Side Trak</i>, sped up to 6x.<br /><br /></td></tr></tbody></table></td></tr></tbody></table><div><i><br />Side Trak </i>is scarce among collectors, suggesting that it was not very successful. Given the steep learning curve and overall cruelty towards the player, I don't find this surprising at all.</div><h1 style="text-align: left;"><i>Space Chaser</i> (1979, Taito)</h1><div class="separator" style="clear: both; text-align: left;">The influence of <i>Head On</i> went beyond its titular concept of head-on collisions. In <i>Space Chaser</i>, the playing field is laid out in a similar way to the original <i>Head On</i>, but this time, the computer can come at you from any direction. I'm not aware of any direct connection between <i>Space Chaser</i> and <i>Pac-Man -- </i>the development of the latter certainly predates <i>Space Chaser</i>'s release -- but the similarities in the gameplay are hard to deny.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><img alt="Gameplay and sprites for the 1979 arcade game, Space Chaser. The sprites shown are the player and computer spaceships and bezel title.." border="0" data-original-height="260" data-original-width="425" height="306" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs47KuL4lKTOhWZNguXcHhJyhgHgFAip99kkrc0VjHlycmRYaK8V-KU08mAdy6X7vh8txdLXMc-81X79YkRaLcVwcVA3JCddpWOocUBOAXxbuMf5LBGmk4DEaBVAmzAQrxBhWB1kFF6fZj/w500-h306/demo2.gif" width="500" /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Of course, the AI is not nearly as clever in <i>Space Chaser</i> as in<i> Pac-Man. T</i>he pink rocket-like pursuer merely follows the player around at a lower speed for most of the stage, and the white ones seem to just wander the maze randomly. The pink enemy does speed up at the end of the stage, forcing you to think carefully about which pellets you collect last. I found that it was best to clear out the center of the maze first, because at the end of the level the increased speed of the enemy made it impossible to make a lot of turns without getting pulverized. As the stages progress more enemies are added and special portions of the maze appear where the enemy can increase its speed. </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">However many similarities there are between the design of <i>Space Chaser</i> and <i>Pac-Man</i>, there is a huge gulf in quality between the two games. Turning your vehicle is slow and awkward, and the simplicity of the AI forces the player into a static strategy that only lends itself to a small amount of variation as the number and intelligence of the enemies increases.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMDqwqK8NaJBZiP7mFdZ9VuEJ9fPmyHFz8jl1xq_hFCLHXDmbgSK6XjxdUQ6nGvaRJwTEtmb5RMW9N1Pe4NkIb0EvAQvJvDNnq25-3fzNTusSC1L_TOOK5uJc6x_viDzyCoMS7rFlkII0K/s260/fast2.gif" style="margin-left: auto; margin-right: auto;"><img alt="Complete playthrough of the arcade game, Space Chaser (1979), sped up to 8x." border="0" data-original-height="260" data-original-width="224" height="406" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMDqwqK8NaJBZiP7mFdZ9VuEJ9fPmyHFz8jl1xq_hFCLHXDmbgSK6XjxdUQ6nGvaRJwTEtmb5RMW9N1Pe4NkIb0EvAQvJvDNnq25-3fzNTusSC1L_TOOK5uJc6x_viDzyCoMS7rFlkII0K/w350-h406/fast2.gif" width="350" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Complete playthrough of a stage of <i>Space Chaser</i>, sped up to 8x.</td></tr></tbody></table><div class="separator" style="clear: both; text-align: center;"><br /><br /></div><div>All things considered, however, it is remarkable to see how quickly the arcade landscape cleared a path from the primitive arcade mazes of the early 70s to the <i>Pac-Man</i> style of maze game that would proliferate in arcades in the early 80s. I've already spent <a href="http://www.retrogamedeconstructionzone.com/2019/12/what-i-learned-from-200-games-of-pac.html">some</a> <a href="http://www.retrogamedeconstructionzone.com/2019/12/what-i-learned-from-200-games-of-pac_4.html">time</a> on <i>Pac-Man </i>on the Retrogame Deconstruction Zone, so I won't dwell on it any further here, but it will no doubt continue to feature prominently as I venture further into 1981 and beyond.</div>
</div></div></div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com0tag:blogger.com,1999:blog-7604980045122375946.post-2829100448801735732020-07-26T11:25:00.002-07:002020-07-31T23:27:29.764-07:00The Beginnings of Arcade Game Mazes, Part 1
The video game landscape opens up a great deal in 1981, in large part because of the tremendous success of <i><a href="http://www.retrogamedeconstructionzone.com/2019/12/what-i-learned-from-200-games-of-pac.html">Pac-Man</a></i>. The pellet-munching game inspired not just clones, but also a wide variety of experiments in maze games. As such, I want to take a step backwards and look at the role of mazes in early arcade games. <div><br /></div><div>Note that video game mazes were prevalent on mainframe and home computers throughout the '70s (see <i><a href="http://www.retrogamedeconstructionzone.com/2019/09/akalabeth-playthrough-part-1-what-did.html">Akalabeth</a></i>, for example), and that's a story that I hope to cover at some point, but I won't get into it here.</div><div><h1 style="text-align: left;"><i>Gotcha</i> (1973, Atari)</h1><div>The first video game maze to see wide release was also Atari’s third original game. <i>Gotcha </i>pitted two players against one another in a constantly shifting labyrinth. </div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-joZ49Ma-1JbnebKdJ52LftX2yXEtnGR7iTgl79QHaJX1GuyPh69qPnxWJLPrXmhuncRRMcJm6wo43TS1VA1S4ZL-AFjfZQKsaFXg6xtgrpOpiWCA5908XulpPQOta_J9I9ja0KyGSq8r/s621/sample.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay from the 1973 arcade Game, Gotcha, played on the DICE emulator." border="0" data-original-height="409" data-original-width="621" height="330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-joZ49Ma-1JbnebKdJ52LftX2yXEtnGR7iTgl79QHaJX1GuyPh69qPnxWJLPrXmhuncRRMcJm6wo43TS1VA1S4ZL-AFjfZQKsaFXg6xtgrpOpiWCA5908XulpPQOta_J9I9ja0KyGSq8r/w500-h330/sample.gif" width="500" /></a></div><div><br /></div><div>Nowadays, <i>Gotcha</i> is best known for the controversy it excited. Apparently, one of Atari’s engineers thought it was interesting that joysticks resembled phalluses and wanted to make an equivalent set of controllers to resemble the female anatomy. </div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNr9dZB409U4sdBp_l9Jup3in6yyuPJMTob4rybdifuBCbazF4EavTiyLdfrmDiTxF1easOAQ6Y32YI3fH193inO4xtC8IdzVnok9Ff7_ODTz20yqWuE8vtJ-O1m7J22sxT6uRl0OXSqD/s2048/gotcha_image.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1049" data-original-width="2048" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNr9dZB409U4sdBp_l9Jup3in6yyuPJMTob4rybdifuBCbazF4EavTiyLdfrmDiTxF1easOAQ6Y32YI3fH193inO4xtC8IdzVnok9Ff7_ODTz20yqWuE8vtJ-O1m7J22sxT6uRl0OXSqD/w500-h256/gotcha_image.jpg" width="500" /></a></div><div><br /></div><div>Perhaps a bit more subtlety was called for -- the resulting controversy forced Atari to replace them with joysticks almost immediately after release. </div><div><br /></div><div>As for the game itself, there was nothing more to <i>Gotcha </i>than a plus sign and a square chasing each other around. However, it offered arcade gamers their first look at a maze as a battleground. </div><div><br /></div><h1 style="text-align: left;"><i>Tank</i> (1974, Kee Games)</h1><div>It didn't take long for arcade game developers to come up with better ways to use this battleground. The following year, a subsidiary of Atari, called Kee Games, released an original title by the name of <i>Tank. </i>In it, players controlled tanks that shot at each other in a 2D maze, using a control scheme similar to what <a href="http://www.retrogamedeconstructionzone.com/2020/04/two-track-turns-battlezone-and-tank.html">would later be used</a> in <i>Battlezone</i> (1980). The only real improvement over <i>Gotcha</i> was the ability for the players to fire at one another, but what a big improvement it was.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk0t14r4nxtGWBGBO8rz3Uw_LiNzkVXvatFQfVJxvCgFhFptPanOLZFQ181RrMP4NnZtUHUHLVNs0-530lJMYqcfoXt5dYj0vN_LVUc1tqVSuhFdfLLBpZ1v3Pt8AOJ_waH23tImlqaiMv/s365/Tank_photo.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="273" data-original-width="365" height="374" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk0t14r4nxtGWBGBO8rz3Uw_LiNzkVXvatFQfVJxvCgFhFptPanOLZFQ181RrMP4NnZtUHUHLVNs0-530lJMYqcfoXt5dYj0vN_LVUc1tqVSuhFdfLLBpZ1v3Pt8AOJ_waH23tImlqaiMv/w500-h374/Tank_photo.jpg" width="500" /></a></div><div><br /></div><div>When you add shooting, the maze suddenly plays a much bigger role in the game. It’s no longer just an obstacle for movement, you can also use it for cover, arranging a trap, or testing your marksmanship between walls.</div><div><br /></div><div>Three years later, Atari released a title with very similar gameplay, called <i>Combat</i>, as one of the launch games for the Atari VCS. The "mazes" are less complex, but you now have access to additional modes, including one where the bullets ricochet off of walls. The more strategic possibilities you add for your combatants, the more emergent maze battlefields become.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVtQMqbxn082hTONW7Cv9PhVWPa1yQ0g5Ab9vGO3_FGJrBJzE9GegtO-nIK4nMV_eLbF1Jn8Bfh2SgwE6jqAIhz14Jhflxnr7P8LxoO25Si-RJarQGFfuZzgqmovNIQdGWmN67MCNWkpp1/s679/Demo_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites for the 1977 Atari VCS game, Combat. Sprites shown are for tank and airplane." border="0" data-original-height="347" data-original-width="679" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVtQMqbxn082hTONW7Cv9PhVWPa1yQ0g5Ab9vGO3_FGJrBJzE9GegtO-nIK4nMV_eLbF1Jn8Bfh2SgwE6jqAIhz14Jhflxnr7P8LxoO25Si-RJarQGFfuZzgqmovNIQdGWmN67MCNWkpp1/w400-h205/Demo_opt.gif" width="400" /></a></div><div><br /></div><div>It is a relatively small conceptual step from <i>Combat</i> and <i>Tank</i> to the many multi-player first-person shooters that still frequent the gaming landscape to this day. Sure, the graphics are more detailed and the game world has an extra dimension to it, but ultimately, it still comes down to players hunting each other in a maze-like setting.</div><h1 style="text-align: left;"><i>Gran Trak 10 </i>(1974, Atari)</h1><div>Around the same time, another branch of gaming was developing that would end up seeding subsequent generations of maze games. <i>Gran Trak 10, </i>yet another Atari product, was the first overhead racing game. Released in 1974, a single player used a steering wheel and pedals to navigate a race track with many twists and turns. It was a big success at the arcades, though Atari incorrectly calculated the initial cost of production and ended up a loser on the bottom line. </div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_6Qy6Bw6iku_rn0OMhVU3kmFeVcM1Gcldx-w_VV0j5rCCm8XQ3tT5kqeAVTpexf2155FRMWyWer1RveAUoNZqhz26MbJUtsX6Rdj6kBTYJLyYwSmcPeKRjBuLu6RyeEIhKNJVxboCkgFi/s293/Gran_Trak_10_photo.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="293" data-original-width="220" height="458" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_6Qy6Bw6iku_rn0OMhVU3kmFeVcM1Gcldx-w_VV0j5rCCm8XQ3tT5kqeAVTpexf2155FRMWyWer1RveAUoNZqhz26MbJUtsX6Rdj6kBTYJLyYwSmcPeKRjBuLu6RyeEIhKNJVxboCkgFi/w344-h458/Gran_Trak_10_photo.jpg" width="344" /></a></div><div><br /></div><div>Throughout the rest of the decade, Atari (and Kee Games) produced a slew of similar overhead racing games, including <i>Sprint</i>, <i>LeMans, Formula K, Twin Racer, </i>and<i> </i>the one shown below, called <i>Indy 4. </i></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIfkD6cWkC9Ao1JkBkgJ0rFS4gMkdEcZIVDLDb7LMDGgfHnQh-CVI_5DQ1QN2xGEGfTmLhu0K0PJyV7u9zVlQmUO2ghwYap3Nxi1-Y-lkvHK91_71qbmGdf0JyZiS4Kdf1dGhiGutBVFgN/s432/Loop_fast.gif" style="margin-left: auto; margin-right: auto;"><img alt="A looping animation from the 1976 arcade game, Indy 4, played on the DICE emulator." border="0" data-original-height="392" data-original-width="432" height="363" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIfkD6cWkC9Ao1JkBkgJ0rFS4gMkdEcZIVDLDb7LMDGgfHnQh-CVI_5DQ1QN2xGEGfTmLhu0K0PJyV7u9zVlQmUO2ghwYap3Nxi1-Y-lkvHK91_71qbmGdf0JyZiS4Kdf1dGhiGutBVFgN/w400-h363/Loop_fast.gif" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="text-align: left;">The above clip is taken from playthrough with the </span><a href="https://sourceforge.net/projects/dice/" style="text-align: left;">DICE</a><span style="text-align: left;"> emulator, which can run some of the </span><a href="http://www.retrogamedeconstructionzone.com/2020/01/graphics-in-arcade-games-1972-1977.html" style="text-align: left;">early arcade games</a><span style="text-align: left;"> that don't contain CPUs and therefore can't be played with MAME.</span></td></tr></tbody></table><div><br />A track like the one shown above is a trivial maze in the sense that it lays out a path without branches. However, later game developers would move the overhead racer to elaborate, maze-like courses with interleaving tracks, resulting in gameplay that more resembled a maze game than a racer.</div><h1 style="text-align: left;"><i>The Amazing Maze</i> (1976, Midway)</h1><div>There are other ways to compete in a maze other than combat and racing. In <i>The Amazing Maze</i> (1976), players were challenged to be the fastest to complete a maze, either competing against an AI or another player. You're given five seconds to study the maze before a timer starts, at which point players and AI can start their trek through the maze.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3OGKwNNcYP8-fF6BKylxKappsD7t5c-99Rcs0ollWthYp0PuHtBKdLTyusCXTUipC1U-DHDx14mrWThG-kg__e5VIhkY1OgE1WeP1__qBlCFdWh5P_6yDj9voDq3wsRK5ftANQSloeEtt/s631/demo_large2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites for the 1976 arcade game, the Amazing Maze. Sprites shown are for the two players." border="0" data-original-height="336" data-original-width="631" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3OGKwNNcYP8-fF6BKylxKappsD7t5c-99Rcs0ollWthYp0PuHtBKdLTyusCXTUipC1U-DHDx14mrWThG-kg__e5VIhkY1OgE1WeP1__qBlCFdWh5P_6yDj9voDq3wsRK5ftANQSloeEtt/w500-h266/demo_large2.gif" width="500" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><div>While the gameplay leaves a lot to be desired, the ability to randomly generate large mazes and navigate them with an AI was impressive for the time. Maze-solving and maze-generation algorithms have been the subject of academic research since the 1800s, mostly in the context of graph theory, and a plethora of such algorithms were developed in the mid-20th century. However, it's one thing to have an algorithm on paper, but it's another to efficiently implement it in assembly language on an 8080 microprocessor. Early game developers often used <a href="https://www.bbc.com/future/article/20190919-the-maze-puzzle-hidden-within-an-early-video-game">idiosyncratic homebrew algorithms</a> for generating mazes, so it's entirely possible that none of the well-known maze algorithms were used in the game.</div><div><br /></div><div>There was a bit of a lull in arcade maze games in the mid-70s, but they would come roaring back in 1979, where I'll pick up again in the next part of this retrospective. </div></div></div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com0tag:blogger.com,1999:blog-7604980045122375946.post-50580225353312576752020-07-19T09:09:00.000-07:002020-07-19T09:09:03.815-07:00What was the first platformer, Space Panic or Donkey Kong?<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf0dU5NA_rKQkWncHVgAXQFEPdElI-csiYHgesLqAcy86oIiMP0FxWRsMr1MweL8p4C-CTlyebipio3knuaUqskkE73lpsF6oTPNTyrH8QdlHN-Ff_Zf7a-HtocpQYUZTkMtg8Atzp_bSv/s418/dkong_sample2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Side-by-side animation of the arcade versions of Space Panic and Donkey." border="0" data-original-height="256" data-original-width="418" height="383" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf0dU5NA_rKQkWncHVgAXQFEPdElI-csiYHgesLqAcy86oIiMP0FxWRsMr1MweL8p4C-CTlyebipio3knuaUqskkE73lpsF6oTPNTyrH8QdlHN-Ff_Zf7a-HtocpQYUZTkMtg8Atzp_bSv/w625-h383/dkong_sample2.gif" width="625" /></a></div><p style="text-align: left;">When game historians talk about the birth of platformers, the first game that usually comes up is Shigeru Miyamoto's freshman effort, <i>Donkey Kong</i>. Released in 1981, it can certainly be credited for inspiring many other designers to make platform-style games, but was it actually the first?</p><p style="text-align: left;">As it turns out, another platform-like game, called <i>Space Panic</i>,was released about a year before <i>Donkey Kong. </i>There is <a href="https://www.redbull.com/in-en/evolution-of-platformers">some</a> <a href="https://gamecrate.com/gaming-literacy-brief-history-jump-part-1/20522">controversy</a>, however, as to its classification, with some reviewers acknowledging it as the first platformer and others designating it a "maze game". Who is right? Let's look at some arguments for each side.</p><h2 style="text-align: left;">Look and Feel</h2><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-eg7tc7JggwhgPACQI-yTpABprOlP-tStFt8qoB0d5ZtaDT7r1PGI_7Zh7Bric3laoNgFBspMUC3zSNCDpTY3LY833QSPmO2KbnoXySe05Rzpjo_uEqXxWweP1nGf0fxcO0Xn3ZJfQ1-q/s343/demo2.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites for the arcade version of Space Panic. Sprites for the player and three monsters are shown." border="0" data-original-height="256" data-original-width="343" height="374" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-eg7tc7JggwhgPACQI-yTpABprOlP-tStFt8qoB0d5ZtaDT7r1PGI_7Zh7Bric3laoNgFBspMUC3zSNCDpTY3LY833QSPmO2KbnoXySe05Rzpjo_uEqXxWweP1nGf0fxcO0Xn3ZJfQ1-q/w500-h374/demo2.gif" width="500" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><i>Space Panic </i>was released in arcades in 1980, by Universal. It was moderately successful in its time, eventually spawning a Colecovision port and a port to the short-lived Casio PV-1000 console. The object of the game is to destroy all of the monsters on the screen, either by dropping them from platforms or dropping other monsters on them. Your only weapon is a shovel, which you can use to dig holes to trap the monsters. Once the monsters are trapped, you can use the shovel to refill the hole and knock the monster to the next level, which may or may not destroy them, depending on which type of monster they are. </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">At first glance, there seems to be no doubt about the classification of <i>Space Panic</i>. It resembles <i>Donkey Kong</i> in many ways, with a character navigating 2D platforms and ladders from the side view. The platforms span multiple levels and can be split into pieces by the digging holes in them.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">If we put <i>Space Panic </i>side-by-side with <i>Pac-Man</i> (a prototypical maze game from the same year) and <i>Donkey Kong, </i>which does it most resemble? Unquestionably, the latter. So, <i>Space Panic</i> is a platformer, right?</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Well, not so fast...</div><h2 style="text-align: left;">But No Jumping?</h2><div>The most frequent objection to the classification of <i>Space Panic</i> as a platformer is the lack of jumping. The only actions your character can take are to run across a platform, climb a ladder, or dig/fill a hole. Some people see the navigation of platforms by jumping as an essential part of the platformer experience, and it certainly features prominently in some of the most famous examples of the genre, including <i>Donkey Kong, Super Mario Bros., Mega Man</i>, etc.</div><div><br /></div><div>This objection gets more credence when you look at <i>Space Panic</i>'s origins. In 1979, a group of theoretical physicists at the University of Tokyo devised a game called <i>Heiankyo Alien</i>.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6SYKLtqMWRMEbBiW5rUIId9SoquVMMtqNDs1_NYExGVZahVcuRE0KqY-i6B_zXsccU1wUWjy1_ztGKy8xtbGTOtLXRTNGbLsi21LWdAj8VKI0gS110YxvrwIFRyUEJV_umTivXvMcije2/s425/demo.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites for the arcade version of Heiankyo Alien. Sprites for the player and monsters are shown." border="0" data-original-height="256" data-original-width="425" height="301" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6SYKLtqMWRMEbBiW5rUIId9SoquVMMtqNDs1_NYExGVZahVcuRE0KqY-i6B_zXsccU1wUWjy1_ztGKy8xtbGTOtLXRTNGbLsi21LWdAj8VKI0gS110YxvrwIFRyUEJV_umTivXvMcije2/w500-h301/demo.gif" width="500" /></a></div><div><br /></div><div class="separator" style="clear: both; text-align: left;">The mechanics of <i>Heiankyo Alien</i> are almost identical to those of <i>Space Panic</i>. You run around a maze and destroy monsters by digging/filling holes. There are no ladders in <i>Heiankyo Alien</i>, but horiztonal/vertical maze passage ways are analogous to the platform/ladder setup of <i>Space Panic</i>. In the sequence below, the player traps and kills an enemy in both games, using exactly the same set of actions.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4qis6FYJ-0U-Mp8p5JI1Oyo-JD0rNGFusz6r7np5SwV6aSwWYH4OP93u67Ut07TD68nzWF60OMxEY10Z5b5bj_ukycsFu_oIUfX9H19akMqvP3NXH1PVrO6KjYrnZkOX0J1k2Uadq7Tsc/s133/heian_compare.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Comparison of a typical game event in Space Panic and Heiankyo Alien, comparing the overhead and side views." border="0" data-original-height="133" data-original-width="128" height="325" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4qis6FYJ-0U-Mp8p5JI1Oyo-JD0rNGFusz6r7np5SwV6aSwWYH4OP93u67Ut07TD68nzWF60OMxEY10Z5b5bj_ukycsFu_oIUfX9H19akMqvP3NXH1PVrO6KjYrnZkOX0J1k2Uadq7Tsc/w313-h325/heian_compare.gif" width="313" /></a></div><div><br /></div><div>The primary difference between the above clips is visual -- one is shown from a side view and the other in an overhead maze. If the underlying mechanics are the same between the two games, that surely matters more than its visual appearance. <i>Heiankyo Alien</i> is unambiguously a maze game, so <i>Space Panic </i>must also be a maze game, right?</div><div><br /></div><div>Well, not so fast...</div><h2 style="text-align: left;">Gravity</h2><div>Our perception of a game is not just about the actions we take to achieve a particular result. The context for the action matters a lot, and in the case of platformers, a key part of that context is gravity. A vertically stacked set of platforms is not equivalent to overhead maze with the same arrangement because the platforms have a clear order to them. And in <i>Space Panic</i>, that order <b>does</b> matter.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxIXxPz0Dz2dFtp065556fa8eMAZlUQm-6TFRoDR4scbjm1rPDq-0SrolzxgneO5qR8NEYBxwQ6spxefh7qZ-jmy2cbZaPON77KMpAZJkWaTCrhBq-gpAv80D3t2m4hqefCyfcpa5uhcsQ/s256/gravity_demo.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay for the arcade version of Space Panic, demonstrating how gravity changes the game." border="0" data-original-height="256" data-original-width="192" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxIXxPz0Dz2dFtp065556fa8eMAZlUQm-6TFRoDR4scbjm1rPDq-0SrolzxgneO5qR8NEYBxwQ6spxefh7qZ-jmy2cbZaPON77KMpAZJkWaTCrhBq-gpAv80D3t2m4hqefCyfcpa5uhcsQ/w300-h400/gravity_demo.gif" width="300" /></a></div><div><br /></div><div>Some enemies need to be dropped multiple levels in order to be killed, a gameplay element that has no analog in an overhead maze. Perhaps even more importantly, your character can quickly change levels by dropping through the holes they've dug. This action is very similar to jumping, in that the player is interacting using the game's gravity in order to navigate the maze. </div><div><br /></div><div>In fact, there are other games without a jumping mechanic that are widely considered to be platformers, such as <i>Lode Runner </i>and <i>Mr. Do's Castle</i>, both of which give the player the ability to create and fall through holes. <i>Space Panic</i> really is a platformer then, right?</div><div><br /></div><div>Well, not so fast...</div><h2 style="text-align: left;">Genre As An Acknowledged Type</h2><div>A big part of what makes a genre a genre is that it's conceived within a particular mold. When somebody makes a platformer today, it's with an awareness that it <b>is</b> a platformer, or at least that it is a game type with historical precedent. This sense of continuity through history can make genre a useful tool for understanding the development of games.</div><div><br /></div><div><i>Space Panic</i> was not a very influential game, and was not successful enough to capture the popular imagination to anywhere near the extent that <i>Donkey Kong</i> did. When a platform-based game was made after <i>Donkey Kong</i>, the developer was fully aware that they were making it within a particular rubric, a rubric laid out by <i>Donkey Kong </i>or one of its descendants.</div><div><br /></div><div>There are countless analogs in other artistic media, but one that particularly springs to mind is the classification of punk music. While there is a lot of rock music made throughout the '60s and early '70s that sounds like what we now call punk rock, music historians typically only use the term "punk rock" to describe music that was associated with the punk movement; that is, a cultural phenomenon that broke into the mainstream in 1976 and 1977. Thus, artists like the Ramones and The Sex Pistols are considered punk, while a Stooges album from the early '70s would be given some other label, either proto-punk or garage rock, even though it sounds an awful lot like punk.</div><div><br /></div><div>Similarly, <i>Space Panic </i>looks and plays a lot like a platformer, but it neither inspired nor originated a particular type. So then we have our answer, <i>Space Panic</i> is not a platformer?</div><div><br /></div><div>Eh...</div><h2 style="text-align: left;">Final Decision</h2><div>In reality, genre is a very fluid and versatile thing. While it can serve as a historical tool, more often it just acts as a shorthand for describing what a game is like to those who have never played it. If I'm a video game historian, maybe I classify <i>Space Panic</i> as a maze game, or perhaps a "proto-platformer", but the rest of us would be better off calling it what it looks and plays like -- a platformer. If it had been made after <i>Donkey Kong</i>, I don't think there would be any debate about its classification.</div><div><br /></div><div>If, on the other hand, the question is who deserves "credit" for inventing the platformer, I lean more in the direction of Miyamoto's <i>Donkey Kong. </i>Not only was it far more influential, but it demonstrated how the formula could be used to create something new and exciting. <i>Space Panic</i>, by contrast, is very similar to its maze predecessor and only uses the platforming elements sparingly.</div><div><br /></div><div>But however you look at it, both of these games deserve a nod for their place in video game history. Credit where credit is due.</div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com3tag:blogger.com,1999:blog-7604980045122375946.post-35524832871796796242020-07-14T11:13:00.001-07:002020-07-14T15:21:21.712-07:00Shooter Gallery #7: Design Experiments in Unfixed Shooters<div><i><a href="http://www.retrogamedeconstructionzone.com/2020/07/gorf-unfixing-shooter.html">Gorf</a></i> wasn't the only game experimenting with adding vertical motion to fixed shooters in the post-Space-Invaders arcades. All of the games here used 2D motion, with varying amounts of success. </div><div><br /></div><div>Note that these are all fixed-screen, gallery-style shooters. I will cover scrolling shooters and <i><a href="http://www.retrogamedeconstructionzone.com/2019/10/asteroids-by-numbers.html">Asteroids</a></i> descendants separately.</div><div><div><h1><i>Killer Comet</i> (1980, Centuri)</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijwwK4G8TqY8FLADjOnW7IPSvP61UpODViLRuk37N3RVkUguoQvwNPNWxenxHiJwPkLgCiSZbbUz0e213m8TlDZvE8aF0mCP54AAXj2LduyR4zKoe-B1XIPGZQhGUwzkyr1sI9BjZzJftl/s398/demo.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites from the 1980 arcade game, Killer Comet." border="0" data-original-height="234" data-original-width="398" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijwwK4G8TqY8FLADjOnW7IPSvP61UpODViLRuk37N3RVkUguoQvwNPNWxenxHiJwPkLgCiSZbbUz0e213m8TlDZvE8aF0mCP54AAXj2LduyR4zKoe-B1XIPGZQhGUwzkyr1sI9BjZzJftl/w400-h235/demo.gif" width="400" /></a></div><div><br /></div><div>Following their lackluster entry into game development with <i><a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-4-at-electronic-carnival.html#Megatack">Megatack</a></i>, Centuri decided to try their hand at a shooter with full two-dimensional freedom. <i>Killer Comet</i> is a good demonstration of what not to do when unfixing a shooter. The enemies drift slowly across the playing field and fire mindlessly downwards, not following any patterns or showing any awareness of the player. You have the ability to shoot diagonally, meaning the only thing you need to do to avoid enemy fire is avoid going directly underneath them. </div><div><br /></div><div>There are eight different types of aliens, but they all behave in the same way and attack in one continuous flow, making the gameplay highly monotonous. There is one interesting enemy, at least-- a glowing orb that tracks the player's position -- but it doesn't move quickly enough to be much of a threat until the later levels.. </div><div><i><br /></i></div><div><i>Killer Comet</i> strikes me as a game without a design. Centuri provided all of the pieces needed to make a game, but didn't do anything with them. To be fair, it's difficult to design patterns for a playing field with no preferred direction; after all, the player could be anywhere. However, there are better alternatives, as the next game demonstrates.</div></div><h1><i>Altair </i>(1981, Cidelsa)</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjixDsxRXujK8H1_aADl2U6vUnzne3ZktgFHtGVcEBxIUiRri6NzKRyNKh-gWEAUQqaVNZo9hz7kAFyhBkuQ1pSK1uPjldAq_rLU6I4QcXQUQJ1qPWrJlsNgYbTSMZ72Ln2zymRpuLrAJr2/s334/demo_sub_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites from the 1981 Spanish arcade game, Altair." border="0" data-original-height="220" data-original-width="334" height="264" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjixDsxRXujK8H1_aADl2U6vUnzne3ZktgFHtGVcEBxIUiRri6NzKRyNKh-gWEAUQqaVNZo9hz7kAFyhBkuQ1pSK1uPjldAq_rLU6I4QcXQUQJ1qPWrJlsNgYbTSMZ72Ln2zymRpuLrAJr2/w400-h264/demo_sub_opt.gif" width="400" /></a></div><div><br /></div><div>Not all arcade games were being made in the USA and Japan in the early '80s. In 1980, a Spanish company called Cidelsa started producing games for their domestic market, including a conventional fixed shooter called<i> Destroyer</i> and this less-conventional shooter, called <i>Altair</i>. <i>Altair</i> not only gives the player 2D motion, but also allows them to flip between firing upwards and downwards. </div><div><br /></div><div>Unlike <i>Killer Comet</i>, where the enemies just drift lazily about, the enemies in <i>Altair </i>bounce around the playing field in a manner that's reminiscent of the old ball-and-paddle games. Bouncing motions are common in early shoot em ups where the player has 2D freedom; this is likely to be because bouncing enemies will naturally end up exploring the entire space and moving in all possible directions. You don't want to leave the player with an easy place to escape to. Unfortunately, this also means that the gameplay tends to randomize quickly and the designer' has little meaningful control over the player's interactions with the enemy after they enter.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoyj_bpw7VqEz4NZdoU7WCjYXYYDqHab7xB6MKu72cgqelezWQA2iEauRlu9fSsTrTQwlBTxAT7WKtXva2RP_sEPposjgQuMT9eOVPvf1Iqopz0-sQSnGzJQyn9dJVh6ZJcqRjGy-WnoDr/s294/path.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="A sample path of an enemy in the 1981 arcade game, Altair." border="0" data-original-height="294" data-original-width="294" height="368" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoyj_bpw7VqEz4NZdoU7WCjYXYYDqHab7xB6MKu72cgqelezWQA2iEauRlu9fSsTrTQwlBTxAT7WKtXva2RP_sEPposjgQuMT9eOVPvf1Iqopz0-sQSnGzJQyn9dJVh6ZJcqRjGy-WnoDr/w368-h368/path.gif" width="368" /></a></div><div><br /></div><div>As I mentioned before, this is symptomatic of the larger problem with fixed-screen, 2D shooters. Any designed pattern in a game like <i>Altair </i>has to account for the fact that the player can be anywhere on the screen. In a fixed shooter, the enemy dive patterns are designed with the knowledge that the player will be somewhere along the bottom row. When you open up the rest of the game board to the player, you either need enemies that are smart enough to follow the player or enemy movements without a preferred direciton. <i>Altair </i>goes with the latter, but sacrifices control over the action in the process.</div><div><br /></div><div>It's difficult to overstate the importance of this consideration for shoot 'em up game design. In fact, many of the various genres of shoot 'em up are distinguished by how they break the symmetry of a 2D playing field -- fixed shooters, scrolling shooters, tube shooters, and rail shooters all direct the player-enemy interaction in different ways.</div></div><div><div><h1><i>Astro Fantasia </i>(1981, Data East)</h1></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNy__7r6dKPRLdVy33NL4l1IwLxA9RT4SIk2wTEX1CmLB776xbL83tiv3DdkLOMFUcancNVRFq-0iMKow90OGXadAmhE7QvtbpVMwSyzc6CdzfNzI62EbDsTEknKJcRfhYhVp7TjMIV5LA/s352/demo_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites from the 1981 arcade game, Astro Fantasia." border="0" data-original-height="256" data-original-width="352" height="291" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNy__7r6dKPRLdVy33NL4l1IwLxA9RT4SIk2wTEX1CmLB776xbL83tiv3DdkLOMFUcancNVRFq-0iMKow90OGXadAmhE7QvtbpVMwSyzc6CdzfNzI62EbDsTEknKJcRfhYhVp7TjMIV5LA/w400-h291/demo_opt.gif" width="400" /></a></div><div><br /></div><div>One of the aforementioned shoot-em-up genres, the tube shooter, was soon to be born in the form of <i>Tempest</i> (1981), but even before that, several shoot em ups were experimenting with enemies emerging from the center of the screen. I already touched on this design concept in my <a href="http://www.retrogamedeconstructionzone.com/2020/07/gorf-unfixing-shooter.html#GorfFourth">analysis of the fourth stage of <i>Gorf</i></a>, but <i>Astro Fantasia</i> presents us with a more fully realized example. </div><div><br /></div><div><i>Astro Fantasia</i> is laid out in a pseudo-3D perspective, with enemies growing in size as they descend on the player. The game is played on what looks like a track, but the player doesn't move along it. Instead, enemy attacks emerge from the center of the track, with patterns alternating between straight lines, sweeping arcs, wall bounces, and erratic dives. These various motions give the player plenty of opportunities to make use of their two-dimensional freedom, such as moving above sweeping UFOs.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNV1cojZC9mumpAY80YmFgD1ffJyvFgxww91g5HqlXiPJIXEftO2n4rspDTQgUAdX5cvh3UDbWeQERX8zwV9L596_TmMYWyMWBnUb9ppYQqgzk2Z76e0WpawHA71zxnq45lJRsiPjvEOeF/s256/dodge.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="A gameplay sample from Astro Fantasia demonstrating the player's 2D freedom." border="0" data-original-height="256" data-original-width="240" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNV1cojZC9mumpAY80YmFgD1ffJyvFgxww91g5HqlXiPJIXEftO2n4rspDTQgUAdX5cvh3UDbWeQERX8zwV9L596_TmMYWyMWBnUb9ppYQqgzk2Z76e0WpawHA71zxnq45lJRsiPjvEOeF/w300-h320/dodge.gif" width="300" /></a></div><div><br /></div><div>There are echoes of <i><a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-5-galaxian-model.html#RadarScope">Radar Scope</a></i> in the layout of the first stage and the boss battle is so similar to the one in <i><a href="http://www.retrogamedeconstructionzone.com/2020/07/gorf-unfixing-shooter.html">Gorf</a> </i>that it's hard to believe that it was designed independently. Still, the game doesn't play like a clone or a knock-off. It's worth noting that <i>Astro Fantasia</i> lets the player fire two bullets at a time, and at a more rapid pace than even <i>Galaga</i>. Rapid-fire capability would become more common as shoot em ups evolved.</div></div><h1 style="text-align: left;"><i>Space Encounters </i>(1980, Midway)</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgiCRgVr9iRdaUCiy-fpGFLOSrR7FcRB_LcxNCBfe0uEarvAErv9luzwOcpgMCBYmgxlsF4gEv-xAe2MoiYepmz_ij0M274rypoy85nP6jqOryHgCKa1yyOvlivGTDAUJAJIaYmQ_ldsTP/s393/demo.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay and sprites from the 1980 arcade game, Space Encounters. The player is shown flying down a trench in a TIE fighter." border="0" data-original-height="219" data-original-width="393" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgiCRgVr9iRdaUCiy-fpGFLOSrR7FcRB_LcxNCBfe0uEarvAErv9luzwOcpgMCBYmgxlsF4gEv-xAe2MoiYepmz_ij0M274rypoy85nP6jqOryHgCKa1yyOvlivGTDAUJAJIaYmQ_ldsTP/w400-h223/demo.gif" width="400" /></a></div><div><br /></div><div>If I had a nickel for every unauthorized Star Wars video game from this era, I'd have plenty of pocket change for the drug store. <i>Space Encounters</i> reimagines the Death Star trench run as a TIE fighter against various sci-fi looking sprites, including what appear to be Klingon warbirds. Much like <i>Astro Fantasia</i>, the game is against a pseudo-3D backdrop, but in this case it's changing to give the impression of forward motion through a trench. </div><div><br /></div><div><i>Space Encounters </i>is different from other shooters of its time in two key respects. First, the player uses a joystick that issues <b>absolute</b> position commands, meaning that there is a direct correspondence between the position of the joystick and where your ship moves. This is in contrast with most shooter controls, in which the joystick position indicates the direction and speed of your motion. In a sense, the joystick for <i>Space Encounters</i> is functioning like a two-dimensional <a href="http://www.retrogamedeconstructionzone.com/2019/08/digression-paddle-controller.html">paddle controller</a>.</div><div><br /></div><div>Secondly, <i>Space Encounters</i> translates uses your vertical position on the screen to determine the apparent speed of your ship down the trench. I don't see any evidence that the gameplay actually changes with increasing speed -- the enemies move at the same rate -- but moving upwards gives the player less time to react to approaching enemies, so it does come with increased risk.</div><div><br /></div><div>Enemies bounce back and forth within the trench, but only seldom approach close enough that you need to avoid them. The real advantage of the 2D motion is that it allows you dodge enemy debris, which will come careening at you after a successful hit.</div><h1 style="text-align: left;">Big Picture</h1><div>These early experiments with unfixing the shooter met with mixed results, but the future of the shoot em up was elsewhere. To really advance beyond the shooting gallery, shoot em ups needed to open up more than just the player's movement. They needed to open up the game world. </div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com0tag:blogger.com,1999:blog-7604980045122375946.post-40360780087779455772020-07-06T20:50:00.003-07:002020-07-13T16:47:19.088-07:00Gorf: Unfixing the Shooter<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinsFkytUr8h8LqkDkaHtkyHH075mcrbTKAVMJVmN0U9v_WPKIhK9or77fknfvlLn0B8h73TWvqG5HIKFO4ihcki_vDkkSwsMIltYYLzlZfkskDwx0vuelhca6MBsVoUIlHBhf7GZhKELRJ/s488/blog_header.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation and gameplay of Gorf, showing some of the enemy and boss sprites. Gameplay is taken from the first stage, a Space Invaders clone." border="0" data-original-height="351" data-original-width="488" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinsFkytUr8h8LqkDkaHtkyHH075mcrbTKAVMJVmN0U9v_WPKIhK9or77fknfvlLn0B8h73TWvqG5HIKFO4ihcki_vDkkSwsMIltYYLzlZfkskDwx0vuelhca6MBsVoUIlHBhf7GZhKELRJ/w500-h360/blog_header.gif" width="500" /></a></div><div><br /></div><div><br /></div>By early 1981, shooters were still the dominant genre in arcades. The <a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-5-galaxian-model.html">Galaxian model</a> had spawned many imitators, but there were limits to how much variety could be achieved within the constraints of a fixed shooter. <div><br /></div><div>Indeed, one could reasonably ask: why was the shooter fixed to begin with? Well before <i>Space Invaders </i>was released, there had been shooters that allowed players to navigate two-dimensional space. Midway's <i><a href="http://www.retrogamedeconstructionzone.com/2020/01/graphics-in-arcade-games-1972-1977.html#gunfight">Gun Fight</a></i>, for example, had players moving around a two-dimensional playing field while firing at each other. But from the release of <i>Space Invaders </i>until 1981, most shoot-em-up style descendants opted to fix the player's motion along one axis.</div><div><br /></div><div>That all started to change, however, with games like <i>Defender</i>, <i>Scramble</i>, and <i>Gorf</i>. I'll cover <i>Defender</i> and <i>Scramble </i>in more detail later, but of these games, the clearest window into the transition out of fixed shooters is <i>Gorf</i>. </div><h1 style="text-align: left;"><i>Gorf</i></h1><p style="text-align: left;"><i>Gorf </i>is a Midway product, released in early 1981 and designed by Jamie Fenton. It was originally intended to be a tie-in to <i>Star Trek: The Motion Picture</i>, but that idea was eventually abandoned and it was created as a standalone game. At first glance, it resembles a standard fixed shooter, but some key differences will be apparent as soon as you start playing.</p><h2 style="text-align: left;">Key Mechanics</h2><h3 style="text-align: left;">Take-Back Firing</h3><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcXIdcxGsLst9FOorGtxy64g3gehrJv8M5AdfiYw0fzPXWxkco0E77LWco5MaVqMjWltThcfrPqSirqSp30_24C0R2fiSm7gYGX2E8IV-G5C0BmcvJrnDuJK0Qx-3jxLxHOnGs1zikVPYp/s352/takeback_fire.gif" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="A clip demonstrating the player firing system used in Gorf. The player can fire rapidly, but only by replacing previously fired bullets." border="0" data-original-height="352" data-original-width="219" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcXIdcxGsLst9FOorGtxy64g3gehrJv8M5AdfiYw0fzPXWxkco0E77LWco5MaVqMjWltThcfrPqSirqSp30_24C0R2fiSm7gYGX2E8IV-G5C0BmcvJrnDuJK0Qx-3jxLxHOnGs1zikVPYp/w199-h320/takeback_fire.gif" width="199" /></a></div><div>For every bullet you fire with your ship, <i>Gorf </i>presents you with a choice. You can let that bullet fly as far as it will or, at any time, take it back and fire a new bullet. This makes for some interesting strategic possibilities from the player's standpoint. Rapid take-back firing can be useful for taking out groups of nearby enemies, but if you're aiming for a distant enemy formation, you'll need to wait before firing again. </div><h3 style="text-align: left;">2-Dimensional Motion</h3><div>Even though <i>Gorf </i>has clear antecedents in fixed shooters like <i>Space Invaders</i> and <i>Galaxian</i>, sometimes going as far as to copy them sprite-for-sprite, it makes one simple mechanical change that makes all of the difference in the world: the player can move left/right <b>and</b> up/down. This change feels very natural and straightforward from the player's standpoint -- after all, we're used to moving into empty space -- but a designer has to think hard about how this changes the gameplay. Fenton clearly did, and in the following sections, I want to look more carefully at the impact of this change. </div><h2 style="text-align: left;">Stages</h2><div><i>Gorf</i> breaks down into five different stages. After you've finished all five stages, they repeat at a higher difficulty level, with up to six levels of difficulty.</div><h3 style="text-align: left;">Astro Battles</h3><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMDfsG3ii6kL_nKEpv5WDY4fz8jMBZ8DqciyhQnSZ1OBELMeIp0n1pelGz8UnpjtF-JaUVFGZpNXwuDhmuDWU1ErDRW_BItSqPKwx-I-RQZn9n27TIY2AdfdgnZEUESfvLS6qtXwOpJ7-3/s352/L1_blog.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="352" data-original-width="236" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMDfsG3ii6kL_nKEpv5WDY4fz8jMBZ8DqciyhQnSZ1OBELMeIp0n1pelGz8UnpjtF-JaUVFGZpNXwuDhmuDWU1ErDRW_BItSqPKwx-I-RQZn9n27TIY2AdfdgnZEUESfvLS6qtXwOpJ7-3/s320/L1_blog.gif" /></a></div><div>"Astro Battles" is essentially a <a href="http://www.retrogamedeconstructionzone.com/2020/04/shooter-gallery-1-clone-show.html"><i>Space Invaders</i> clone</a>, even going so far as to use the sprites from the original arcade game. Of the five stages, it gives you the least freedom to move up and down. This actually makes sense -- if you think about the original <i>Space Invaders</i> design, it's difficult to find much use for that extra degree of freedom. If the player moves up on the screen, they get closer to the alien bullets and no longer can use the bunkers.</div><div><br /></div><div>Two changes in <i>Gorf</i> give you some use for that extra movement. First of all, the bunkers are replaced with a force field, which you can shoot through, so moving upwards a little still keeps you behind the protective shield. Secondly, there is a brief period at the beginning of the stage in which you can shoot at the aliens without worrying about enemy fire. During this period, you can move closer to the armada and take them out in rapid succession (see the animation at the top of the article for an example).</div><h3 style="text-align: left;">Laser Attack</h3><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFmWsydOSlJoWVnhS2-8aNknwdlkP77X2m_nTGrqw-iE4lN_cbnvKRG-4dQQmh1-mHWo6LVeNcUiOgpYIFlFCFhIe_1v9vD2hOcCJBRfu2DOG1jkJFRU5BYe4xc0Kdve6xPVUEs0DT7_o0/s349/L2_blog.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="A clip of gameplay from the second stage of Gorf, where the player faces off against aliens with laser beams." border="0" data-original-height="349" data-original-width="233" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFmWsydOSlJoWVnhS2-8aNknwdlkP77X2m_nTGrqw-iE4lN_cbnvKRG-4dQQmh1-mHWo6LVeNcUiOgpYIFlFCFhIe_1v9vD2hOcCJBRfu2DOG1jkJFRU5BYe4xc0Kdve6xPVUEs0DT7_o0/w214-h320/L2_blog.gif" width="214" /></a></div><div>The second stage, "Laser Battle", is not a direct clone of any previous arcade shooters, but it's clear the developers were familiar with the genre. The coordinated movements of the enemy groups are similar to <a href="http://www.retrogamedeconstructionzone.com/2020/02/the-animation-of-phoenix-part-2-birds.html">the flight patterns in <i>Phoenix</i></a>, where they jump in straight lines between screen locations and occasionally send divers at the player. The dive patterns are not nearly as complex as in <i>Phoenix</i>, however, and more closely resemble those in <i>Galaxian. </i> Finally, the laser attack may have been inspired by games like <i><a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-3-frogger-in-space.html#SpaceBeam">Space Beam</a></i>, released two years prior, in which two ships armed with lasers face off against one another in an asteroid field.</div><div><br /></div><div>The most significant effect of the laser attacks is to restrict the movement of the player. Unlike with bullets, you can't go around a laser attack, so moving up doesn't do you much good until you've knocked out one of the lasers. Even then, you'll usually want to focus on moving left-right -- the laser attacks come so quickly that you can easily be caught off guard moving vertically. And by the time the lasers are both destroyed, it's pretty smooth sailing, with or without vertical motion.</div></div><h3 style="text-align: left;">Galaxians</h3><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRCDTumwJe4Iv_ALCXcCImSMi91RG7gkcVXdAd6PI1WQHiWhZqHjP3DwmlCFjkkzkkwg9I60gORg4m9Jg_ZaDw9nnwOBW4NloHO1sqv8VpPnzawKe2Gr-CMGGvpzAvrXkKGZpuD-9o-hzE/s351/galaxian_dodging.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="A clip of gameplay from the third stage of Gorf, where the player takes on an armada of Galaxians." border="0" data-original-height="351" data-original-width="230" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRCDTumwJe4Iv_ALCXcCImSMi91RG7gkcVXdAd6PI1WQHiWhZqHjP3DwmlCFjkkzkkwg9I60gORg4m9Jg_ZaDw9nnwOBW4NloHO1sqv8VpPnzawKe2Gr-CMGGvpzAvrXkKGZpuD-9o-hzE/w210-h320/galaxian_dodging.gif" width="210" /></a></div><div>"Galaxians" makes no attempt to hide its design origins, even going so far as to use the same sprites and dive patterns as the original <i><a href="http://www.retrogamedeconstructionzone.com/2019/09/galaxian-aesthetics-of-simple-patterns.html">Galaxian</a></i>. Fortunately, this provides an excellent testing ground for unfixing the shooter. What <b>would</b> it be like to play <i>Galaxian</i> if you could move up and down?</div><div><br /></div><div>The answer, as it turns out, is that it's still a lot of fun, but requires a lot more enemy activity in order to challenge the player. With that extra degree of freedom, you can now weave around the enemy attacks and pick your approaches to the diving aliens. Fenton clearly realized this, sending divers in frequently and raining down bullets in higher concentration than the original game.</div><div><br /></div><div>Yet the overall flow is remarkably similar to the original, bringing into question whether the Galaxian model ever needed to be fixed, at least from the design standpoint. There's still a question of the demands on the hardware, but I'll address that further down.</div></div><div id="GorfFourth"></div><h3 style="text-align: left;">Space Warp</h3><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhESXfpalJimUxSNohxWM6diwf5ZlOmtvm6BlxPamdLAMp9uVgaCNxHaL9y9rUhBQunW5Euj1hatamd-b7InG7S7GQ5fdbpAsAHrzDTlEAysgQiFU_rJLNgN8TrAh0kxh2u1d6XwlikwxZv/s352/L4_blog.gif" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="A clip of gameplay from the fourth stage of Gorf, where the play shoot aliens coming out of a vortex at the center of the screen." border="0" data-original-height="352" data-original-width="239" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhESXfpalJimUxSNohxWM6diwf5ZlOmtvm6BlxPamdLAMp9uVgaCNxHaL9y9rUhBQunW5Euj1hatamd-b7InG7S7GQ5fdbpAsAHrzDTlEAysgQiFU_rJLNgN8TrAh0kxh2u1d6XwlikwxZv/w217-h320/L4_blog.gif" width="217" /></a></div><div>The fourth stage is quite different from the previous three, with enemies only emerging one at a time from the center of the screen. All enemies start as very small sprites and gradually spiral outwards at an increasing speed. The spiral geometry is similar to what would eventually be used in tube shooters, like <i>Tempest</i> and <i>Gyruss</i>, but this isn't a proper tube shooter -- the player is still restricted to planar movement in <i>Gorf</i>.</div><div><br /></div><div>With just one enemy appearing on the screen at a time, it's difficult to challenge the player without a fairly sophisticated AI. What Fenton does instead is to keep the enemy very small for most of its flight, making it difficult to target, and then increasing its motion rapidly at the end. Unfortunately, the result of this is that targeting is mostly a crapshoot. I found myself just firing at the center of the vortex and hoping that my shots would make contact with the enemy in its flight. In addition, enemy fire takes a straight path from the alien to the player, so you need to be constantly on the move in order to avoid getting hit. You have plenty of freedom to move up and down, and you'll want to make use of that freedom when avoiding diagonal shots and outward-spiralling enemies.</div></div><div><br /></div><div>While it's true that this particular design wouldn't have worked in a fixed shooter, I don't think it works that well in <i>Gorf</i> either, so I don't think it's a particularly useful reference point for unfixing the shooter. It is interesting, however, how this tube-like geometry seemed to pop up so quickly at the same time that 1-D motion went out of vogue. Perhaps this stage was also influenced by first-person space shooters of the late '70s, like <i><a href="http://www.retrogamedeconstructionzone.com/2019/10/star-raiders-part-1-how-i-went-from.html">Star Raiders</a></i> and <i><a href="http://www.retrogamedeconstructionzone.com/2019/09/star-fire-weirdness-of-pseudo-3d.html">Star Fire</a>, </i>where enemies grow from perspective as they get closer.</div><h3 style="text-align: left;">Flag Ship</h3><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnS787nk_o_Xzs088RtpcLOieznn7Wg1h03d0nsp8TJr_DzGcZUsMYDSTXvgEQ096NZ5CzN-zbkq1MAig8wu43l3A2WH-b3Pvytw-R9X5LaQAr8rAjd5GfIpJ66tm1zZB_njm13jTN0urw/s351/part5.gif" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="A clip of gameplay from the fifth stage of Gorf, where the player faces a boss starship behind a protective shield." border="0" data-original-height="351" data-original-width="237" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnS787nk_o_Xzs088RtpcLOieznn7Wg1h03d0nsp8TJr_DzGcZUsMYDSTXvgEQ096NZ5CzN-zbkq1MAig8wu43l3A2WH-b3Pvytw-R9X5LaQAr8rAjd5GfIpJ66tm1zZB_njm13jTN0urw/w216-h320/part5.gif" width="216" /></a></div><div>In the final stage, you face off against a large starship that resembles a torpedo with a tail. In order to destroy it, you must break through its protective shield and then hit the core at the center. There's one spot on the ship, at the intersection of the tail and the hull, where it's immediately vulnerable to destruction. Failing that, you'll have to chip away at the hull until the core is revealed.</div><div><br /></div><div>The most efficient way to destroy the protective shield around the ship is to move up close and chip into it with rapid fire. Even at the higher levels, I found I was still able to do this while avoiding enemy fire for a short period. After that, you can aim at the ship, but you'll want to consider backing up because the combination of enemy shots and falling shrapnel can be hard to avoid at close range. Of course, moving back will be make it harder to hit the ship's vulnerable point, so you'll need to pick an optimal point for your playing style and ability.</div></div><div><br /></div><div>Aside from the Galaxians stage, the boss battle makes the best use of the player's two-dimensional freedom and it anticipates the more mechanically complex boss battles that would become common in side-scrolling shooters, like <i>Gradius </i>and <i>R-Type.</i></div><h1 style="text-align: left;">Why Fix a Shooter?</h1><div>The fixed shooter is really more a product of its time than any kind of game design ideal. Tomohiro Nishikado's design for <i>Space Invaders </i>was heavily influenced by ball-and-paddle games like <i><a href="http://www.retrogamedeconstructionzone.com/2019/08/breakout-minimalist-gaming.html">Breakout</a></i>, in which the player's movement was similarly fixed. And left-right movement is all you really need in <i>Space Invaders</i> -- the layout of the bunkers and the slow-moving block formation make vertical movement extraneous. </div><div><br /></div><div>After that, given the overwhelming success of <i>Space Invaders</i>, I'm sure that many shoot 'em up designers were hesitant to stray too far from its basic mechanics. I think most of the fixed shooters from 1979 - 1981 could have allowed the vertical motion without sacrificing in gameplay, but only if the hardware could have handled the load. The hardware of that period was certainly capable of rendering two-dimensional player movement, but the question is whether it could have handled the amount of enemy activity necessary to <b>challenge</b> a player with full two-dimensional freedom. It's hard to answer this in general, but I can say that in the case of <i>Galaxian</i>, the original <u>h</u>ardware only allowed seven sprites at a time. By contrast, in the "Galaxians" stage of <i>Gorf</i>, you will sometimes see more than eight or nine diving enemies, even at the lowest difficulty level. </div><div><br /></div><div>That being said, <i><a href="http://www.retrogamedeconstructionzone.com/2020/05/metamorphosis-from-galaxian-to-galaga.html">Galaga</a></i> was also a fixed shooter, and it had much more sophisticated sprite hardware than <i>Galaxian</i>. Given how elaborate the enemy movements are in <i>Galaga</i>, I feel sure that an unfixed version could have been made that provided sufficient challenge to the player. And considering how much fun it is in its fixed form, maybe there's a third answer to the question of why you might fix a shooter. Maybe, sometimes, it's just better to keep it simple. </div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com0tag:blogger.com,1999:blog-7604980045122375946.post-13656771732009208572020-06-29T16:01:00.001-07:002020-06-29T17:01:19.549-07:00Zork I: Commentary and Puzzle Breakdown<p style="text-align: left;">Having submitted a <a href="http://www.retrogamedeconstructionzone.com/2020/06/zork-1-review-fully-realized-fantasy.html">review</a> of <i>Zork: The Great Underground Empire - Part 1</i>, I want to step back and take a more detailed look at some of the puzzles in the game. If you haven't played it yet, I suggest that you do so before reading my comments below, as they contain gobs of spoilers. </p><p style="text-align: left;">The images in this article are taken from the <a href="http://gue.cgwmuseum.org/galleries/index.php?pub=4&item=34&id=3&key=1"><i>Zork I</i> map created by the Zork User's Group</a>.</p><h1 style="text-align: left;">Game Opening</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8iBI7VuvTdLjRZgUyCkBh4quO8pzjsAak_9Vhl4LQtAR4i1P0dezF60JPaHiXkXMqWhXS-__I3OebVEf8qn101kemdh6FsEXrXvxu3pgb9g_CC4LVpHk2_XXRRvCf4LO0Dh8aQkh0OEGz/s397/cabin.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Artist's conception of the cabin from the 1980 text adventure, Zork I" border="0" data-original-height="397" data-original-width="388" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8iBI7VuvTdLjRZgUyCkBh4quO8pzjsAak_9Vhl4LQtAR4i1P0dezF60JPaHiXkXMqWhXS-__I3OebVEf8qn101kemdh6FsEXrXvxu3pgb9g_CC4LVpHk2_XXRRvCf4LO0Dh8aQkh0OEGz/w200-h205/cabin.png" width="200" /></a></div><div>I already noted my affection for the game's opening. While the humble cabin in the woods has no challenging puzzles or great discoveries, as a launching point to the Zorkian underworld, it's second to none. And for newcomers, it doubles as a chance to get comfortable with the game's mechanics, including navigating rooms, manipulating doors/windows, and using the lantern. </div><div><br /></div><div>The other notable event in the game opening is, of course, the troll fight. It's not difficult to figure out what to do -- after all, you just acquired a sword and the troll is obviously unfriendly. I was surprised I never found a use for the troll's axe, or indeed any of the various and sundry weapons scattered about <i>Zork I</i>. You can use them in fights, of course, but it was unclear to me whether there was any practical difference between them.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMUgt5n_Rz9VJkBStl95j5NQ_zRyNkKYe6YSNJub3QTTb9KLwLgg7CkXnXofdb37V39AauF1AcDmIePiOmg82min5PHm3FOboqtplfalsmoJz1nWbEWpoCJMCamJSgtsNEZ3O-ejSSVFl-/s531/troll.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Artist's conception of the troll from the 1980 text adventure, Zork I" border="0" data-original-height="371" data-original-width="531" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMUgt5n_Rz9VJkBStl95j5NQ_zRyNkKYe6YSNJub3QTTb9KLwLgg7CkXnXofdb37V39AauF1AcDmIePiOmg82min5PHm3FOboqtplfalsmoJz1nWbEWpoCJMCamJSgtsNEZ3O-ejSSVFl-/w320-h224/troll.png" width="320" /></a></div><div><br /></div><div>You'll also notice that in the early going, <i>Zork I</i> throws a lot of items at you that may or may not be useful: bagged lunches, leaves, ropes, bricks, etc. It's hard to know what you should hold onto or where you can put things for later use, but I eventually settled on storing everything I found in the trophy case. Fortunately, this ended up being the right move, though I didn't know it for sure at the time.</div><div><h1>Notable Puzzles</h1></div><h2>Maze and Cyclops</h2><div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmDdu1k8QMCeehft1KSLf8i8PzWAx_xFaI9HD2sju0ziWhCinwFQ_FoMcXQsCZ1Yg75ibHyLEvPhcrYl4vU0a0XZCbG5XhNs9K92sute4xHgMKmC0q8bip9E76ndq4UXwlsJ8FjohI-M5k/s434/skeleton.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Artist's conception of the skeleton from the 1980 text adventure, Zork I. It's the remains of a previous adventurer." border="0" data-original-height="429" data-original-width="434" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmDdu1k8QMCeehft1KSLf8i8PzWAx_xFaI9HD2sju0ziWhCinwFQ_FoMcXQsCZ1Yg75ibHyLEvPhcrYl4vU0a0XZCbG5XhNs9K92sute4xHgMKmC0q8bip9E76ndq4UXwlsJ8FjohI-M5k/w205-h202/skeleton.png" width="205" /></a></div>After having played <i><a href="http://www.retrogamedeconstructionzone.com/2019/08/colossal-cave-adventure-how-to-lose.html">Colossal Cave Adventure</a></i>, I found little to trouble me in the <i>Zork I</i> maze. Dropping items like bread crumbs to chart my course has become second nature and once you've mapped the area, it no longer presents much of an obstacle. Certainly, the occasional presence of the thief was a major headache (more on him later), especially since he would sometimes kill me before I had a chance to do anything. In such events, I would just restore a saved game, but I doubted whether the existence of an intermittently homicidal character was making the game more immersive. </div><div><br />Regardless, there are three primary hot spots in the maze: the dead adventurer, the cyclops room, and the grating room. The dead adventurer is a great touch because it immediately suggests a backstory to the labyrinth. Some have suggested that he is actually the protagonist from <i>Colossal Cave Adventure</i>, but who knows. His dead lamp is a clever red herring, as well -- had I not found the torch, I certainly would have spent time trying to get it working again after my first lamp died. </div><div><br /></div><div>Note that if you disturb the skeleton, his ghost will pop up and banish you to the land of the dead. I don't know what it says about me that I discovered this by arbitrarily kicking the skeleton.</div><div><br /></div><div>As for the cyclops, I sated him with hot peppers and a bottle of water, but you can actually do better by mentioning "Odysseus" to him. This is better because he runs away in terror, leaving an open passage back to the cabin. I doubt that many people will discover this on their own, though, and it was probably intended to be an easter egg. In case you don't already know, "Odysseus" is the protagonist in Homer's <i>Odyssey</i>, who at one point drives a wooden stake through the eye of a cyclops. Ouch.</div><div><h2>Dam Controls</h2><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcics7_g6a13_UsUDXNEZ8_OnOBoWKWWKYFU-Bq0v99vsl7fDoCJt0W5Vq2FC4fHYypHEcNPOPJd-UlJASDqos_lTqRamhYPwF6eosA5amUIAZLxHIWFsLeOlgjDukD1Ob-zy94f1AsWnH/s472/dam_controls.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Artist's conception of the dam controls from the 1980 text adventure, Zork I" border="0" data-original-height="472" data-original-width="350" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcics7_g6a13_UsUDXNEZ8_OnOBoWKWWKYFU-Bq0v99vsl7fDoCJt0W5Vq2FC4fHYypHEcNPOPJd-UlJASDqos_lTqRamhYPwF6eosA5amUIAZLxHIWFsLeOlgjDukD1Ob-zy94f1AsWnH/w190-h256/dam_controls.png" width="190" /></a></div>The dam controls took a lot of trial and error for me to decode, but as it turned out, I was overthinking the problem. The best way to approach the problem is by testing each of the buttons in the janitor's closet, so I'll cover each in turn.</div></div><h3 style="text-align: left;">Blue Button</h3><div>The blue button triggers a leak in a pipe above your head. You never need to push the button to finish the game, so I could skip over this one, but unless you're using a walkthrough, you'll probably push the blue button at some point. </div><div><br /></div><div>When you push the blue button, water will start filling the closet and you have to figure out what to do. The problem I have with this puzzle is that the text makes it ambiguous whether the source of the water is even visible, let alone accessible. The exact text: </div><blockquote><div>"There is a rumbling sound and a stream of water appears to burst from the east wall of the room (apparently, a leak has occurred in a pipe)."</div></blockquote><div>I did eventually converge on plugging the leak with the "viscous material", but it took me a while. Why would the above parenthetical say "apparently"? If the pipe is within reach to fix, shouldn't it be visibly obvious that it's leaking?</div><h3 style="text-align: left;">Red Button</h3><div>The red button is not complicated, it just turns the lights in the room on and off. Feel free to push it as much as you like to see.</div><h3 style="text-align: left;">Yellow and Brown Buttons</h3><div>I initially misinterpreted the function of the yellow and brown buttons, so the dam stumped me for a while. Pushing them doesn't lead to any immediately obvious effects, they just respond with a "click". To see their effects you need to go back out to the dam controls and notice that the "small green plastic bubble" begins to glow when you push yellow (any number of times), and stops glowing when you push brown.</div><div><br /></div><div>It all seems very simple in retrospect, but making this connection took a while. There is a bolt on the dam controls, and it will only turn if the green plastic bubble is glowing. I can't tell you how many combinations of items I tried to use on this bolt before realizing the connection with the green plastic bubble. Once the green plastic bubble is glowing, you can turn the bolt with the wrench. </div><h2 style="text-align: left;">Loud Room</h2><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGrxOwYHP5ZGlOT5gejzYJea1XEJAV59NMcBvUUVsU1FyuS3IscLg6SRhDyC59axKbmWFotti_J-oHDhDRXB119WsaEb2_FhBL6FHgFyI-aEnd0ryILiJWJ6j66pD0IdTeotIdWxTYHkPH/s674/dam.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Artist's conception of the dam and Frigid River from the 1980 text adventure, Zork I" border="0" data-original-height="674" data-original-width="348" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGrxOwYHP5ZGlOT5gejzYJea1XEJAV59NMcBvUUVsU1FyuS3IscLg6SRhDyC59axKbmWFotti_J-oHDhDRXB119WsaEb2_FhBL6FHgFyI-aEnd0ryILiJWJ6j66pD0IdTeotIdWxTYHkPH/w165-h320/dam.png" width="165" /></a></div>Unfortunately, I didn't have the pleasure of solving the loud room with my own cleverness. During my initial research into <i>Zork I</i>, I had accidentally stumbled on a solution to the puzzle. I learned that if you go into the room and type 'SAY, "ECHO"', it will change the acoustics and allow you to pick up the platinum bar. I don't see any logic to this solution and I guess it was put in there as an easter egg of sorts. I think a more fun, but still illogical, solution would have been to 'SAY, "SAY ECHO"' and then allowed the cascading echo commands to multiply until the acoustics changed... or the player character's head exploded. Actually, I think I prefer it as a suicide method.</div><div><br /></div><div>Anyway, the real solution is quite tricky. The first time you enter the loud room, it will be loud because water is pouring over the top of the dam, but you don't know this and the text doesn't tell you. When you later open the sluice gates to the dam, the noise will become "unbearably loud" and you won't even be able to enter the loud room. What you have to do is close the gates and quickly rush to the loud room before water starts pouring over the top of the dam again. If you do that, the room will be "eerily silent" and you can pick up the platinum bar. Note that closing the gates only works if they have previously been open long enough to cause the water level in the reservoir to fall. </div><h2 style="text-align: left;">Hades</h2><div>Having the actual entrance to hell contained within the Zork labyrinth is a stroke of genius, and one of the most memorable parts of the game. The game will even transport you there if you die elsewhere in the labyrinth (sometimes).</div><div><br /></div><div>There's a puzzle to solve in Hades as well, but it is somewhat less memorable. Basically, you need to make use of three items: candles, a black book, and a brass bell. The black book contains the hints that should lead you to this conclusion. Reading the marked page in the book will reveal a prayer, and if you try to read any other page, it will tell you that "certain noises, lights, and prayers" are effective in banishing evil.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_OKD0fSRsexm_x9NxFgr8HIMibw-gM04_KIgapKnlNFp3OaVlh8pxVcIaS5ktN55goWesOTn0D1fkx77mY0bs9t0JWxZhcCfVcu7cYWz1fsePTAI55vTDFSHWMrYELHXadnFyvjFafVVk/s596/hades.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Artist's conception of Hades from the 1980 text adventure, Zork I. The spirits of the dead are shown." border="0" data-original-height="417" data-original-width="596" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_OKD0fSRsexm_x9NxFgr8HIMibw-gM04_KIgapKnlNFp3OaVlh8pxVcIaS5ktN55goWesOTn0D1fkx77mY0bs9t0JWxZhcCfVcu7cYWz1fsePTAI55vTDFSHWMrYELHXadnFyvjFafVVk/w400-h280/hades.png" width="400" /></a></div><div><br /></div><div>The only one of the three items that has any immediate effect when you use it in Hades is the bell. Unfortunately, if you're holding the candles when you ring it, they will fall and go out. </div><div><br /></div><div>Use your matches you re-light the candle and try again. You have to wait for the bell to cool down before you can use it again, but this is just a matter of typing "WAIT" about 10 times.</div><div><br /></div><div>The second time, you should of course put the candles down before ringing the bell. This has its desired effect, terrifying the nearby demons and leaving the candles still lit, but you're not done. The next step is what confused me for a while. I thought that I would then just need to read from the black book. Unfortunately, this didn't work. </div><div><br /></div><div>The book does contain the passage, 'Oh ye who go about saying unto each: "Hello sailor"'. Clearly, the game designers were Monty Python fans (as any self-respecting nerd would be), but unfortunately, typing 'SAY, "HELLO SAILOR"' has no effect. I think I tried it about 5 or 6 times for finally giving up, though.</div><div><br /></div><div>As it turned out, I just had to pick up the candles before reading the book. No, I didn't have to consult a walkthrough for that, but it took me longer than I'd like to admit.</div><h2 style="text-align: left;">Coal Mine</h2><div>I gotta say, the coal mine is a major pain in the neck. That's not really criticism -- avaricious adventurers should be expected to jump through some hoops if they want to loot the bastion of an ancient civilization. But still, I lost count of the number of times I botched the sequence of steps that leads to the central treasure of the coal mine, the diamond.</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7gsyuwOZ_fcRAdLR9k1xfKXBU217ckDYtU8EdBUAac8IdNXk9Jjj4Pa4jRnhkSpNu-lOKgHAiUmPQ8dGutzWkTB11TOaj0E66v5FEoZ5XbfDtnvgNEbEaXPdrKf5a18UkKKpw6xUaSreL/s624/bat.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Artist's conception of the vampire bat from the 1980 text adventure, Zork I. He is at the entrance to a coal mine." border="0" data-original-height="624" data-original-width="622" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7gsyuwOZ_fcRAdLR9k1xfKXBU217ckDYtU8EdBUAac8IdNXk9Jjj4Pa4jRnhkSpNu-lOKgHAiUmPQ8dGutzWkTB11TOaj0E66v5FEoZ5XbfDtnvgNEbEaXPdrKf5a18UkKKpw6xUaSreL/w204-h205/bat.png" width="204" /></a></div>Before you set out for the mine, make sure you have some garlic with you. This is essential to get past the vampire bat near the mine entrance. It's not hard to figure this out, but inventory space is at a premium here, so lugging around garlic is a nuisance. </div><div><br /></div><div>Once you're past the bat, you can explore the mine. At the beginning, there's a shaft with a basket and pulley attached. Make note of it, because it will be important later, but feel free to pass it by the first time through.</div><div><br /></div><div>After that, the mine is navigated the same way you navigate the maze, by dropping items and mapping the passages. At the far end of the mine, you'll find a passage that can only be followed when your inventory is empty. Unfortunately, an empty inventory means you don't have any source of light, so you'll be left in the dark if you crawl through without taking some preliminary steps first.</div><div><br /></div><div>Hopefully, you'll eventually be clever enough to realize that the passage is actually leading you to a room at the bottom of the shaft you saw near the entrance to the mine. You will also need to have two sources of light (lantern and torch) and realize that you can lower one of them into said room so that you can see when you crawl through the passage without any items.</div><div><br /></div><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEg_O4BXBQDllpbMQBq80dNFQcH2Tt3w4MHjVFqvlQDntgiDdPBFhqF7KqZnvYdyWeCJTBuyHmN-07Djn0jkYzeOa35F2hn3qDuULc8avMeA5hpjiheEuVQ2RTwSLKyodEeg0Zb9wh_Bak/s432/shaft.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"><img alt="Artist's conception of the shaft from the 1980 text adventure, Zork I. A basket hangs from a rope at the top, and can be dropped down vertically." border="0" data-original-height="428" data-original-width="432" height="203" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEg_O4BXBQDllpbMQBq80dNFQcH2Tt3w4MHjVFqvlQDntgiDdPBFhqF7KqZnvYdyWeCJTBuyHmN-07Djn0jkYzeOa35F2hn3qDuULc8avMeA5hpjiheEuVQ2RTwSLKyodEeg0Zb9wh_Bak/w205-h203/shaft.png" width="205" /></a>To complete the main puzzle, you will need a torch, a lantern, coal, and a screwdriver. The torch, coal, and screwdriver should be placed in the basket and lowered to the bottom of the shaft. Take note of the following things that you should NOT do (I did all of them at one point or another):</div><div><ul style="text-align: left;"><li>DO NOT put the lantern in the basket and take the torch with you. You will just blow yourself up in the gas room.</li><li>DO NOT forget to pick up the coal from the mine BEFORE putting anything in the basket. </li><li>DO NOT forget to lower the basket when you fill it with the items you need. </li><li>When you get to the narrow passage, DO NOT turn off your lantern before crawling through. When you return, you won't be able to see to turn it back on.</li><li>DO NOT forget to put ALL of your items back in the basket before returning through the narrow passage.</li></ul></div><div>Once you've made your way through passage and retrieved your things from the basket. You'll be presented with a mysterious machine. What you'll have to do is put the coal in the machine and then activate the machine's switch by using a screwdriver. Take note that you MUST close the lid to the machine before running it. This is one of those things that's less obvious in text than it would be in person. Once the machine has finished running, you can retrieve your diamond and reverse the steps you followed previously.</div><h2 style="text-align: left;">Thief</h2><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfYgARf6w6IahpTfRYo9UFdCSaUwGlr4wQvoHfgce5_8umAnmV5fZA83LOmexmv_AmjmKQ2yp70LHwsNlj5A8YLcNnfjJ7-tNPSgjJYE0DatsAuvU2hvTGji4SEp2mf2amLhDEPPcfFRsl/s300/thief.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Artist's conception of the thief from the 1980 text adventure, Zork I" border="0" data-original-height="300" data-original-width="300" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfYgARf6w6IahpTfRYo9UFdCSaUwGlr4wQvoHfgce5_8umAnmV5fZA83LOmexmv_AmjmKQ2yp70LHwsNlj5A8YLcNnfjJ7-tNPSgjJYE0DatsAuvU2hvTGji4SEp2mf2amLhDEPPcfFRsl/w192-h192/thief.png" width="192" /></a></div><div>Of all of the puzzles and enemies in <i>Zork I</i>, the thief gave me the most trouble. Aside from the fact that he sporadically appeared to kill me or take my treasure, he also ended up being essential to finishing the game. I eventually had to consult a walkthrough to learn that I needed him to handle one of my items (the egg) before I could retrieve the final treasures. He's also a bear to kill in combat, sometimes requiring several restores to knock off. </div><div><br /></div><div>Still, as an in-game puzzle, he's an interesting feature. I regret not having experimented with him more before giving in to the walkthrough -- perhaps I would have had more appreciation for his enigmatic nature.</div><h1 style="text-align: left;">Big Picture</h1><div><i>Zork I </i>is the first in a trilogy of text adventures that were released in 1980, 1981, and 1982. The genre is still very young in 1980 and its most important company, Infocom, has only just been formed. I look forward to covering future text adventures in this blog, including the rest of the Zork trilogy, but that is for another time. Most of the action is still in the arcades at this point in video game history (both literally and figuratively), so we'll pick up there again in my next entry.</div><div><br /></div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com3tag:blogger.com,1999:blog-7604980045122375946.post-79017563827546163412020-06-26T17:02:00.002-07:002020-06-29T16:02:34.663-07:00Zork 1 Review: A Fully Realized Fantasy<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis4qrvwe5QKXfWQ7wPTpwImIrY5YAO8J1JGawOdcse9erlI5THyOR5QYtMiOhqfDbA4XLjSo2oCsPkftrbxnLTFxwKWbk13QVjutKnvXFbhDfel9DjKCoZurnSvmdOgQxaz3JZa4184fEo/s828/zork1_title.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="806" data-original-width="828" height="389" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis4qrvwe5QKXfWQ7wPTpwImIrY5YAO8J1JGawOdcse9erlI5THyOR5QYtMiOhqfDbA4XLjSo2oCsPkftrbxnLTFxwKWbk13QVjutKnvXFbhDfel9DjKCoZurnSvmdOgQxaz3JZa4184fEo/w400-h389/zork1_title.png" width="400" /></a></div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgooWSQeVIunFMvCIykWsh1GBm7lJoXAofAoOsvoexzHOqGbiXPmzqblaQzV_Va3iWAF5xf86YJuWFpCTxLYX_KTyUrUmYaCJTnPSWgSymXYBz8kMEZBY_rAS1fdygRFFZOvV7S8F3U6gU7/s287/9p5.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="76" data-original-width="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgooWSQeVIunFMvCIykWsh1GBm7lJoXAofAoOsvoexzHOqGbiXPmzqblaQzV_Va3iWAF5xf86YJuWFpCTxLYX_KTyUrUmYaCJTnPSWgSymXYBz8kMEZBY_rAS1fdygRFFZOvV7S8F3U6gU7/" /></a></div>Among the canon of early text adventures, there is none more revered than the Zork trilogy. It takes the immersive complexity of the original <i><a href="http://www.retrogamedeconstructionzone.com/2019/08/colossal-cave-adventure-how-to-lose.html">Colossal Cave Adventure</a> </i>and adds a combat system and a backstory steeped in the mythology of classic fantasy literature. </div><div><br /></div><div>The original <i>Zork</i> dates back to 1977 and was a single game with a vast world map, but the version best known today is a three-part Infocom series, released from 1980 - 1982. The first installment, which I'm reviewing here, is titled, <i>Zork: The Great Underground Empire - Part I. </i>It takes the player through an underworld maze, with vast waterways controlled by an ancient dam. </div><div class="separator" style="clear: both; text-align: center;"><br /></div>As in most early text adventures, the player is tasked with collecting treasures from the game world. <i>Zork II</i> and <i>Zork III</i> gradually deemphasized treasure collecting, perhaps because developers felt that it was unromantic to be motivated by greed, but I would argue that it hardly matters in <i>Zork I. </i>The true beauty of the game is in exploring its world, regardless of the pretext.<div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4fNDoS5reXupIXINzmA5rrHDTzDAGrfeI9CRFxQxRtO2E0Xo83icsiEdqAXEyg2EayIryfdpqVIIkk1Wwa8zh7sOUhgRH-Ctc_diY5txJ-KH52YQgoNb5SDdP1vJFdwSbyh17uDA_6pDX/s1024/graufthaltroglodytecavehomes4.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="375" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4fNDoS5reXupIXINzmA5rrHDTzDAGrfeI9CRFxQxRtO2E0Xo83icsiEdqAXEyg2EayIryfdpqVIIkk1Wwa8zh7sOUhgRH-Ctc_diY5txJ-KH52YQgoNb5SDdP1vJFdwSbyh17uDA_6pDX/w500-h375/graufthaltroglodytecavehomes4.jpg" width="500" /></a></div><div><div><br /></div><div>One notable improvement from its predecessors is the addition of turn-based combat. Unlike in role-playing games, however, the variables that determine the outcome of combat are completely invisible to the player. Combatants simply take turns attacking and the game reports the outcome of each attack. By keeping a separation between the player and the factors that determine combat outcomes, it maintains the perception of a world that is mostly beyond the player's control. The helplessness you feel when a thief makes off with one of your most valuable treasures cannot be assuaged with the knowledge of a superior strength or dexterity statistic. Rather, you are left merely with the hope that you will encounter him again and that circumstances will allow the recovery of your lost item. Zork cannot be tamed or mastered, merely navigated. </div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><img border="0" data-original-height="348" data-original-width="516" height="338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilZosTLXJ7U1rSrGgnc1PwJehp5kgobGHOtaevAyAibeaAFWb6bQ1SK9Hp8tWkUXsCg9UPKFClP0wvOTeN_Fy5y7z4xsiTo1A8Gx0e5zJT8SkRMfzJcLHjPHVP-fHUKM5crVR_QqWxlEH4/w500-h338/dungeon_map.png" style="margin-left: auto; margin-right: auto;" width="500" /></td></tr></tbody></table>And navigation is no simple thing, either. Much like <i>Colossal Cave Adventure</i> before it, <i>Zork I</i> includes many passageways that don't continue in the direction they started; that is, going east will sometimes take you to a room to the southwest or north. Fortunately, it is all internally self-consistent, so as long as you are careful to map the connections the first time you follow them, you should be able to find your way.<br /><br /><div>Unlike many similar games of the era, communicating with the command parser is fairly straightforward. <i>Zork I</i> is the first game to use the Infocom five-word command parser, a system that has been much praised by fans of interactive fiction. Instead of typing "CHOP TREE" and then responding to the question, "WITH WHAT?", you can now just type "CHOP TREE WITH AXE". It has <a href="http://ifwiki.org/index.php/Infocom-type_parser">many other improvements</a> compared to its three-word counterparts, including the ability to handle multi-word nouns, multi-part commands, and numerical quantities, just to name a few. </div><div><br /></div><div>The command parser is certainly impressive from the technical standpoint, but I have found that early text adventures benefit less from the sophistication of the parser than from careful consideration of the words that a player might use. It's okay if hewing a tree with an axe takes two separate commands, as it would with a three-word parser, as long as the game is programmed to accept similar verbs that I might use. For example, "CHOP TREE WITH AXE" should achieve the same thing as "CUT TREE WITH AXE". Fortunately, <i>Zork I</i> does fine on this score as well.</div></div><div><br /></div><div><div>But for all of its polish, what really puts Zork a cut above the rest is imagination. Trudging through the depths of the maze, you can't help but feel that you're exploring a world with a rich history, and that the wonders you do encounter are but the tip of a long-buried iceberg. And the greatest wonder of all is where this world emerges from -- an unassuming cabin at the edge of the forest. </div><div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1MpWME6DAJB4RI09fb7k33hiFGUodkGBG3XCJOtf2HVFvFxZSfrBj0kOPJ5L6ichB3wNOXWZaLsN2ei3fyhJSpt77uP8lyDzCMecP8pFDpV6eSmrHgzVLDgSS5IootX74mfxHMUn0toBu/s940/cabin.jpeg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="634" data-original-width="940" height="338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1MpWME6DAJB4RI09fb7k33hiFGUodkGBG3XCJOtf2HVFvFxZSfrBj0kOPJ5L6ichB3wNOXWZaLsN2ei3fyhJSpt77uP8lyDzCMecP8pFDpV6eSmrHgzVLDgSS5IootX74mfxHMUn0toBu/w500-h338/cabin.jpeg" width="500" /></a></td></tr></tbody></table></div><div><br /></div><div>That the bastion of an ancient civilization could sit beneath the floorboards of an abandoned cabin is a romance I like to indulge myself, whenever I go out exploring the world. That such ancient ruins might also contain trolls, a cyclops, and the gates to hell itself... well, that is the true stuff of fantasy.</div><div><br /></div><div><i>Next: </i><a href="http://www.retrogamedeconstructionzone.com/2020/06/zork-i-commentary-and-puzzle-breakdown.html">Zork I Playthrough Details</a><i> </i></div></div></div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com2tag:blogger.com,1999:blog-7604980045122375946.post-64610814398242380262020-06-20T16:56:00.001-07:002020-06-20T16:56:46.390-07:00Name Change and Computer TroublesYou may have noticed recently that the site has undergone a name change and domain move. I think the newly minted <i>Retrogame Deconstruction Zone</i> is a better reflection of what I do here (see the <a href="http://www.retrogamedeconstructionzone.com/2020/05/raising-brow-mission-statement.html">Mission Statement</a>) than the previous name.<div><br /></div><div>Unfortunately, the past week has been plagued by computer problems, which have greatly hampered my ability to produce content for the blog. I'm hoping to be back in full working order later this week, but I'll post an update if that turns out to not be the case.</div><div><br /></div><div>In the meantime, feel free to check out my <a href="https://twitter.com/MrVGBrow">Twitter account</a>, on which I frequently post snippets about games (and animations) that are too brief to warrant a blog entry.</div><div><br /></div><div>Stay healthy and stay safe,</div><div><br /></div><div>Nick</div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com0tag:blogger.com,1999:blog-7604980045122375946.post-39346201528104550722020-06-14T18:19:00.002-07:002020-06-14T18:19:36.774-07:00Shooter Gallery #6: The Best Defense Is a Dead Alien<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8xtXQhPS-UVQokZbrknIvBgfb7ReWeudQ7Sjbo1X6k41nydBwBaGPNPU0w3hGY5vVLWpDNciDMLleL_JHjSKM8owg_mNxCsW_Oi9qQ_trZQoc-C-fwVNDtTupcY45C84QtzzcJg1H7rpK/s257/stay_close_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="255" data-original-width="257" height="397" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8xtXQhPS-UVQokZbrknIvBgfb7ReWeudQ7Sjbo1X6k41nydBwBaGPNPU0w3hGY5vVLWpDNciDMLleL_JHjSKM8owg_mNxCsW_Oi9qQ_trZQoc-C-fwVNDtTupcY45C84QtzzcJg1H7rpK/w400-h397/stay_close_opt.gif" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div>
The simplicity of the fixed shooter was both a strength and a weakness. Minimalist player interactions were ideal in the arcade setting, where the player didn’t have much time to get acquainted with complex game mechanics. On the other hand, for a phenomenon that gripped the entire video gaming industry, there wasn’t a whole lot of room for innovation. <div><br /></div><div>Nevertheless, some developers found a way. In some cases, rather than simply asking the player to destroy enemies, designers had them use their firepower in a defensive role. <a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-3-frogger-in-space.html" target="_blank">Crossing shooters</a> like <i>Lunar Rescue</i> (1979) provided a natural setting for such mechanics, but more direct <i>Space Invaders</i> descendants were also introducing defensive elements. In the games that follow, the player’s shots and movements serve two purposes: to destroy the enemy, but also to assist allies. </div><div><div><h1 style="clear: both; text-align: left;"><i>SOS </i>(Namco, 1979)</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_mxK1d2qu9I-h0zjCVf19WlnA59xZ-bgKdRwuLMG6WFt2qedZ9dZC-Ns04ZQOSNfC_ELUPeMmhYs5_Fi92CgitjPGqR3M_IiekTvPlaGMrTBWSWUrkJ7tcHgoRFT6_pvsLbmg5B4TPvnU/s372/demo_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the Namco arcade game, SOS (1979), shown alongside the sprites for the player and enemy." border="0" data-original-height="274" data-original-width="372" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_mxK1d2qu9I-h0zjCVf19WlnA59xZ-bgKdRwuLMG6WFt2qedZ9dZC-Ns04ZQOSNfC_ELUPeMmhYs5_Fi92CgitjPGqR3M_IiekTvPlaGMrTBWSWUrkJ7tcHgoRFT6_pvsLbmg5B4TPvnU/w400-h295/demo_opt.gif" width="400" /></a></div><div><br /></div>A very simple Namco game from 1979, <i>SOS</i> presents the player with a continuous stream of enemies, much like a vertically oriented <a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-4-at-electronic-carnival.html">shooting gallery</a>. Every so often, an "SOS" signal appears at the side of the screen and the player is supposed to move over to the side to respond to it. The game emits a loud morse code signal whenever the SOS appears, but there are no visual cues when the player responds to the SOS. It just increases their score slightly.</div><div><br /></div><div>There's something to be said for distracting the player from single-minded destruction, but it's only a mild distraction in this case. One-dimensional gameplay sinks this shooter, but others were bolder.</div><div><h1 style="clear: both; text-align: left;"><i>Cosmic Guerilla </i>(Universal, 1979)</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhznqfijMNivE4aIeMDkwGP-wQxZXsT6l4Z6hYoZbcxEXPDP-_6DyrLaZ1IwRcXvUYnqu1EyBDycq2vlBJvTqunNR93EW1EsBp1xRFTKsZmnlty8DdehTzoh8RuVd9aiIjmj3ZM7q3TWuXL/s296/CG_demo_contrast.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="245" data-original-width="296" height="331" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhznqfijMNivE4aIeMDkwGP-wQxZXsT6l4Z6hYoZbcxEXPDP-_6DyrLaZ1IwRcXvUYnqu1EyBDycq2vlBJvTqunNR93EW1EsBp1xRFTKsZmnlty8DdehTzoh8RuVd9aiIjmj3ZM7q3TWuXL/w400-h331/CG_demo_contrast.gif" width="400" /></a></div><div><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><i>Cosmic Guerilla</i> was one of the <a href="http://www.retrogamedeconstructionzone.com/2020/05/shooter-gallery-2-first-steps-from.html">first original shooters after <i>Space Invaders</i></a>. If you want to stay alive as long as possible, you must protect your reserve lives, which are laid out in the center of the screen. Surrounding your reserves are little sprites that look like soldiers (the <a href="https://www.arcade-museum.com/manuals-videogames/C/CosmicGuerilla.pdf" target="_blank">manual</a> refers to them as "blocks") that "cosmic guerillas" can grab and drag off the screen. If you shoot the guerillas while they have a block in their possession, it will return to its original position.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">The need to rescue the blocks from the aliens doesn't change the player's interactions with the guerillas a great deal. They’re all attacking your blocks, so they’re all equal-value targets. Occasionally, one of the guerillas starts assaulting your enclave at high speed, at which point you must take them out quickly or risk losing one of your lives. Even then, however, all of the other guerillas freeze and you're left in a one-on-one matchup with the offending guerilla. It's interesting to see the player's goals shift slightly, but there is much more room for innovation.</div><h1 style="clear: both; text-align: left;"><i>Stratovox </i>(Sun Electronics, 1980)</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidg5JgVe5p7YuTUw-z6yliDmEuI-vQ1Ahu9TPiD02s3Oz4XHwKzSu3NgATRyznGew7ycVikfg9Dqm0fTRUQ9FiyXoaoznPZDAYK0-39lx3YP5sWh5WuL5uTEubUEqATJ6IA8HO9zoxz2hC/s279/demo_fixed.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from Stratovox (1980) shown alongside the sprites for the player, aliens, and victims." border="0" data-original-height="244" data-original-width="279" height="350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidg5JgVe5p7YuTUw-z6yliDmEuI-vQ1Ahu9TPiD02s3Oz4XHwKzSu3NgATRyznGew7ycVikfg9Dqm0fTRUQ9FiyXoaoznPZDAYK0-39lx3YP5sWh5WuL5uTEubUEqATJ6IA8HO9zoxz2hC/w400-h350/demo_fixed.gif" width="400" /></a></div><div><br /></div><div>With <i>Stratovox</i>, we finally see a defensive scenario with broad strategic implications. Initially, the game plays out like any other fixed shooter, with the player just trying to shoot without being shot.</div><div><br /></div><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ12ECpluss9bFZJuXrTuid69EarJQQyPQRVXEDif7kjuR1caiwOdNb7Y5-mO1oMerIxgKDMu8DSGWTaAu8sb6vxGduuhj_HQd3YZUzOC_kYIThu6es94is1Xv8OsEge88JH1JIVXNXEwR/s579/paths_all.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="The dive patterns for the enemies in the arcade game, Stratovox (1980)." border="0" data-original-height="166" data-original-width="579" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ12ECpluss9bFZJuXrTuid69EarJQQyPQRVXEDif7kjuR1caiwOdNb7Y5-mO1oMerIxgKDMu8DSGWTaAu8sb6vxGduuhj_HQd3YZUzOC_kYIThu6es94is1Xv8OsEge88JH1JIVXNXEwR/d/paths_all.gif" /></a></div><div><br /></div><div>Learning to exploit the enemy dive patterns takes some time, but is within the reach of an intermediate-level player. Once you can complete a wave or two, you'll start having to worry more about protecting your allies. If aliens kidnap all 10 of the people on the right side of the screen, you will lose the game. What's interesting about these kidnappings is that they happen much more rapidly when carried out by a single enemy than by multiple enemies.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1ZHRipzdzlCUKYOhALKdE6uC_DtQVqHsK2pGtPFGOVwNrHtJVwPR3-uhuUYk3I5DzRZlYAX-R3Xt7DYnrKzGpbAnVKn7G4zMpw1HT7Vlx7u1ihtiYxyN0KrizCAq8tirjV29ZiqFqgOjx/s473/capture_both_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from Stratovox (1980) showing the strategic advantage of waiting to shoot enemies." border="0" data-original-height="231" data-original-width="473" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1ZHRipzdzlCUKYOhALKdE6uC_DtQVqHsK2pGtPFGOVwNrHtJVwPR3-uhuUYk3I5DzRZlYAX-R3Xt7DYnrKzGpbAnVKn7G4zMpw1HT7Vlx7u1ihtiYxyN0KrizCAq8tirjV29ZiqFqgOjx/d/capture_both_opt.gif" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div>This sometimes rewards the player for destroying <b>fewer</b><i style="font-weight: bold;"> </i>of the enemies during their dive pattern. In the left panel above, I take out two of the three aliens during their dive, but the third gets away with an ally. If I instead wait until the ally is captured by all three aliens, as in the right panel, I can easily pick off two of them during their return trip. The same number of aliens are destroyed at the end, but in the second case have I saved an ally.</div><div><br /></div><div>In the second wave and beyond, the game starts sending multiple groups of aliens at the same time, so the strategy somewhat, but there remains a strong disincentive to leaving isolated enemies. Despite the increased emphasis on defense in <i>Stratovox</i>, however, I still found myself running out of lives more often than I ran out of allies. Can we take this concept even further?</div><h1 style="clear: both; text-align: left;"><i>King and Balloon </i>(Namco, 1980)</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg07CLcO7Fek3Fw3NngG5-rnKIsdE8BsBumLw3Jiky9elgAaFKJ_77r-XAPjtdbng0staCo6MvV4LvHexNelAErvSYTiHIrCkulP1Wx1kg4ELqRz7Hs3iVyqk_8ByMkXTgUwuXRzyXePfx7/s423/demo_small_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from King and Balloon (1980) shown alongside the sprites for the King, player, and balloon." border="0" data-original-height="253" data-original-width="423" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg07CLcO7Fek3Fw3NngG5-rnKIsdE8BsBumLw3Jiky9elgAaFKJ_77r-XAPjtdbng0staCo6MvV4LvHexNelAErvSYTiHIrCkulP1Wx1kg4ELqRz7Hs3iVyqk_8ByMkXTgUwuXRzyXePfx7/d/demo_small_opt.gif" /></a></div><div><br /></div></div></div><div><i>King and Balloon</i> is the culmination of the "defensive" fixed shooter, replacing the player's life counter with the king's. Your objective is to protect the king -- player deaths only matter insomuch as they provide a brief period of time in which the enemy can carry away the king.</div><div><br /></div><div>The first few times I played <i>King and Balloon</i>, I approached it like most other fixed shooters, trying to maneuver myself between gaps in the enemy attack and take out as many balloons as possible. The balloons all appear to follow the same basic pattern, with only slight variations from one to the next.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSXc_0RftV2KnG3TVtpJnCe2EL48J_sLwg94yQKcbafUke1ptf2LkXEpAP8tJMCVqZabdWpB7__9aWfdTFTRvwdLmJei-0zl46VCZuctLeh1Z-whxLg3Nwf4An5OWIApoNKI3Dws91cIfw/s335/paths_all.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="182" data-original-width="335" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSXc_0RftV2KnG3TVtpJnCe2EL48J_sLwg94yQKcbafUke1ptf2LkXEpAP8tJMCVqZabdWpB7__9aWfdTFTRvwdLmJei-0zl46VCZuctLeh1Z-whxLg3Nwf4An5OWIApoNKI3Dws91cIfw/w400-h217/paths_all.gif" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div>I largely avoided targeting the diving balloons, since their jumpy motions made them difficult to hit. This is not unique to <i>King and Balloon</i> -- in many fixed shooters, you can destroy waves with less risk by focusing on the armada. There was at least one respect, however, in which this was <b>not</b> like other shooters.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJaaw2dScCuzseqVKaqEYQPrD3kZHcb9mtUgrDB1MACfGcsk0UAxFvBSGTBzZ6uO9ExE4LJw6MdFxow8y1mE_TSYr7P4YiyUHJiU_cxcXJvMnKw2rJCxUWdEdddsjTteG6pBECNDARS5AC/s255/cant_save_opt.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="255" data-original-width="251" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJaaw2dScCuzseqVKaqEYQPrD3kZHcb9mtUgrDB1MACfGcsk0UAxFvBSGTBzZ6uO9ExE4LJw6MdFxow8y1mE_TSYr7P4YiyUHJiU_cxcXJvMnKw2rJCxUWdEdddsjTteG6pBECNDARS5AC/w394-h400/cant_save_opt.gif" width="394" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div>It was a mistake to focus on my own survival. Once I learned to treat my gunners as secondary -- that is, stay near the king even if it meant taking a bullet -- I could usually take down any balloons that happened to lift him. I even found that it sometimes helped to intentionally sacrifice myself in order to ensure a timely respawn.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8xtXQhPS-UVQokZbrknIvBgfb7ReWeudQ7Sjbo1X6k41nydBwBaGPNPU0w3hGY5vVLWpDNciDMLleL_JHjSKM8owg_mNxCsW_Oi9qQ_trZQoc-C-fwVNDtTupcY45C84QtzzcJg1H7rpK/s257/stay_close_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="255" data-original-width="257" height="397" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8xtXQhPS-UVQokZbrknIvBgfb7ReWeudQ7Sjbo1X6k41nydBwBaGPNPU0w3hGY5vVLWpDNciDMLleL_JHjSKM8owg_mNxCsW_Oi9qQ_trZQoc-C-fwVNDtTupcY45C84QtzzcJg1H7rpK/w400-h397/stay_close_opt.gif" width="400" /></a></div><div><i><br /></i></div><div>New mechanics are only really worthwhile if they force the player to rethink their interaction with the game, and <i>King and Balloon</i> is a great example of this for defensive mechanics. Unsurprisingly, its lead designer, Shigeru Yokoyama, would have other successes, most notably <i><a href="http://www.retrogamedeconstructionzone.com/2020/05/metamorphosis-from-galaxian-to-galaga.html">Galaga</a></i> the following year.</div><h1 style="text-align: left;">Big Picture</h1><div>Shoot 'em ups were evolving rapidly by 1980 and defensive game mechanics were just one of the things that developers were experimenting with. The most famous example during the golden age is probably in the scrolling shooter, <i>Defender </i>(1981), but these early experiments with fixed shooters demonstrate how they can be incorporated effectively into even simpler designs. </div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com0tag:blogger.com,1999:blog-7604980045122375946.post-2844839445357150112020-06-07T21:54:00.001-07:002020-06-07T21:54:47.906-07:00Astrosmash: Trailblazing Console Game Design<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp2VjkUldMTnRvng2sP88hb6MaOTFhj0EQ2CWDvWKXChFhhOFnB9PWuiPMUTN1sE2T9t4xcOBAxt4yIkL4h4Dbdyym9p0pbT-akU8QcOkRf2JeTnixyAPaVZz3UmMryk7J8cyAeKabb2iV/s634/1x_short.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from Astrosmash, showing the player destroying asteroids." border="0" data-original-height="478" data-original-width="634" height="301" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp2VjkUldMTnRvng2sP88hb6MaOTFhj0EQ2CWDvWKXChFhhOFnB9PWuiPMUTN1sE2T9t4xcOBAxt4yIkL4h4Dbdyym9p0pbT-akU8QcOkRf2JeTnixyAPaVZz3UmMryk7J8cyAeKabb2iV/w400-h301/1x_short.gif" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;"><br /></div><div>The <i>Space Invaders</i> formula was dynamite in arcades in the late '70s, and the shoot 'em up genre developed rapidly in the following years, but home consoles were slow to the party. The first official <i>Space Invaders </i>port wasn't released until 1980, but when it was, it immediately doubled sales of the Atari VCS.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIR-VY3Aa64lBt9xK1kpUfnp16JU84vODKN0bLV_Oe7eRTJFc5omvQ1Tdt1q_grAIYpuTPt3IR5EUk2mzRjG64xUWt6LOUnvny5PIcqf-nZEDRZuj0R8xO9tKXC2Qa8L0a8WcAaLWxXHvQ/" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation of gameplay and sprites from the Atari 2600 version of Space Invaders." border="0" data-original-height="208" data-original-width="511" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIR-VY3Aa64lBt9xK1kpUfnp16JU84vODKN0bLV_Oe7eRTJFc5omvQ1Tdt1q_grAIYpuTPt3IR5EUk2mzRjG64xUWt6LOUnvny5PIcqf-nZEDRZuj0R8xO9tKXC2Qa8L0a8WcAaLWxXHvQ/d/demo_opt.gif" /></a></div><div><br /></div><div>The gameplay is very similar to the arcade original, with a few exceptions. The aliens are clearly different, cutting closer to the "little green men" and insectoid aliens of Hollywood than the arcade originals. But Atari changed another thing: they made it easier.</div><h2 style="text-align: left;">The Art of Challenge</h2><div>Arcade games are, of course, difficult by design. If developers make them too easy, then it limits how much the game can earn. A famous demonstration of this was when the initial prototype for <i><a href="https://raisingthevgbrow.blogspot.com/2020/05/metamorphosis-from-galaxian-to-galaga.html">Galaga</a></i> was demoed in arcades and didn't earn as much as Namco executives wanted. It wasn't that players didn't like it; rather the demo was easy enough that players were averaging 7 or 8 minutes per game and limiting the profits earned by the machine. That was unacceptable for an arcade machine, and the <i>Galaga</i> we now know and love is more difficult than the original demo.</div><div><br /></div><div>But the "hard and fast" approach to game design wouldn't make money if it didn't work. Yes, an easy game can lead to a monopolized cabinet, but if arcade gamers really wanted easy games, they wouldn't spend so much money on the hard ones. </div><div><br /></div><div>Arcade gaming is fueled by adrenaline. With money on the line and, often, an audience looking on, the pressure is on the player to perform. A challenging game makes for higher highs when you succeed and lower lows when you fail, but most importantly it creates drama.</div><div><br /></div><div>Console gaming is a very different beast. Yes, there will sometimes be an audience watching you play at home, but the atmosphere is very different. Players are less likely to be looking for a quick thrill and more likely to settle in for a gaming session where the challenge grows slowly. </div><div><br /></div><div>But is it enough for console game designers to just make easier versions of successful arcade games? </div><h1 style="text-align: left;"><i>Astrosmash</i></h1><div>Enter <i>Astrosmash</i>. </div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK6x7N00RVexaUXo5N3omh1gaRz6rgI-Ds_e5UQUFD2vLljOUKgLlLew9Bvysudrr-2KjG2y4M3GSKxCA08og6kWBjw3VOTrUhyfxl_jVYTrolNYQtoOQptS79quAatGlaucD4M0O03YLl/s468/demo_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation of gameplay and sprites from the Intellivision game, Astrosmash." border="0" data-original-height="239" data-original-width="468" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK6x7N00RVexaUXo5N3omh1gaRz6rgI-Ds_e5UQUFD2vLljOUKgLlLew9Bvysudrr-2KjG2y4M3GSKxCA08og6kWBjw3VOTrUhyfxl_jVYTrolNYQtoOQptS79quAatGlaucD4M0O03YLl/w400-h204/demo_opt.gif" width="400" /></a></div><div><br /></div><div>Originally intended as a bonus game to accompany a clone of <i>Asteroids</i>, <i>Astrosmash </i>was released as a standalone when its parent game was cancelled. Despite these ignominious beginnings, it ended up being one of the most popular games for the Intellivision console.</div><div><br /></div><div>Visually, <i>Astrosmash</i> borrows heavily from a smattering of arcade hits, including <i>Asteroids</i>, <i>Space Invaders</i>, and <i>Missile Command. </i>And the player's task is straightforward -- shoot as many things as you can before you run out of lives. </div><div><br /></div><div>Nothing special, right? Well, not so fast.</div><h3 style="text-align: left;">What Is a Life Worth, Anyway?</h3><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFbEtPb1pX7ArPUzGAnoqmcDPuCxPvKtUEdx500uJVXKcNg2ioeAKiMRAFsz5Zt8GURRcPRgTPSQNWdZ-jzVPAmjQFA7sr_TbYrOdZ1NJeFv5tcZSVEfKX_wvOP6AA7N4gCVziAv1WSWnX/s317/1x_2_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the first level of Astrosmash." border="0" data-original-height="239" data-original-width="317" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFbEtPb1pX7ArPUzGAnoqmcDPuCxPvKtUEdx500uJVXKcNg2ioeAKiMRAFsz5Zt8GURRcPRgTPSQNWdZ-jzVPAmjQFA7sr_TbYrOdZ1NJeFv5tcZSVEfKX_wvOP6AA7N4gCVziAv1WSWnX/w400-h302/1x_2_opt.gif" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">The early-game action is slow going, so take this opportunity to watch your score counter. As you might expect, it <span style="text-align: left;">goes up when you destroy things, but it also goes down when objects reach the ground. Learning how the various objects contribute to your score will be important in late-game strategy. Here's a table that gives the baseline point value of each object, including points lost when it hits the ground.</span></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiwldZyJD4gK8Opr6fSxhPA5yVOKXh3NRBEw9w6gfvEViczO1hZoi8DR22WTIUfgrc4kSzXqsZQ6DsiADp0vFPl-RYMmufK0NJAUl034w9TI-qk9ResmgFgv0mx8BCrgO4lMXXBGS9JmcV/s328/Table_title_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animated table showing the point values of the objects in Astrosmash." border="0" data-original-height="328" data-original-width="321" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiwldZyJD4gK8Opr6fSxhPA5yVOKXh3NRBEw9w6gfvEViczO1hZoi8DR22WTIUfgrc4kSzXqsZQ6DsiADp0vFPl-RYMmufK0NJAUl034w9TI-qk9ResmgFgv0mx8BCrgO4lMXXBGS9JmcV/w391-h400/Table_title_opt.gif" width="391" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div></div><div>As you proceed in the game, the score multiplier will increase, meaning that all objects will be worth (and cost) an amount equivalent to the above numbers times the multiplier*. The highest score multiplier is 6x, at 100,000 points.</div><div><br /></div><div>Note that your score matters for more than just bragging rights: with every 1000 points you earn, you will gain an extra life. In the early stages, you may find yourself going long stretches without losing any lives, so your stockpile of bonus lives can get quite large. However, the more points you accumulate, the more the speed and destructive power of the falling objects increases. In the later stages, the score multiplier will allow you to accumulate lives more quickly, but the falling objects will kill you more frequently. </div><div><br /></div><div>The balance between scoring and dying is what differentiates <i>Astrosmash </i>from most arcade games. While it's not unusual for arcade games to award lives at point milestones, it is unusual to make those bonus lives so accessible that death can be a routine part of gameplay. Instead of challenging you to go long stretches without making a mistake, <i>Astrosmash</i> challenges you to use your head to make the most of the time between mistakes.</div><div><br /></div><div><font size="1">*A similar system of scoring is used in <i><a href="https://raisingthevgbrow.blogspot.com/2019/11/missilie-command-deep-dive.html">Missile Command</a></i>. </font></div><h3 style="text-align: left;">Choose Your Target Wisely</h3><div>Success at <i>Astrosmash</i> ultimately comes down to picking your shots. You won't be able to destroy every falling object, so you want to focus on high-value targets. As a simple example, suppose that you're faced with a small asteroid and a large asteroid, but you only have time to destroy one. Which do you choose?</div><div><br /></div><div>In the scenario where you shoot the small asteroid and let the big one fall, you gain 20 points from the hit and lose 5 from the object you let fall, giving a net gain of 15 points. On the other hand, if you let the small asteroid fall (-10) and shoot the large one (+10), it's a net change of 0 points. So, you probably want to target the small asteroid.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp2VjkUldMTnRvng2sP88hb6MaOTFhj0EQ2CWDvWKXChFhhOFnB9PWuiPMUTN1sE2T9t4xcOBAxt4yIkL4h4Dbdyym9p0pbT-akU8QcOkRf2JeTnixyAPaVZz3UmMryk7J8cyAeKabb2iV/s634/1x_short.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from Astrosmash, showing the player destroying asteroids." border="0" data-original-height="478" data-original-width="634" height="301" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp2VjkUldMTnRvng2sP88hb6MaOTFhj0EQ2CWDvWKXChFhhOFnB9PWuiPMUTN1sE2T9t4xcOBAxt4yIkL4h4Dbdyym9p0pbT-akU8QcOkRf2JeTnixyAPaVZz3UmMryk7J8cyAeKabb2iV/w400-h301/1x_short.gif" width="400" /></a></div><div><br /></div><div>There's a wrinkle to this calculation, however, because half of the time the large asteroid will break into two smaller ones when hit. In this scenario, your net points will depend on whether you can destroy the resulting small asteroids. If you don't manage to hit either of them, then you're down 20 points from where you started. On the other hand, if you can net a spectacular +40 if you manage to hit both small asteroids that break off from the big one. </div><div><br /></div><div>In general, I found that it was better to only target large asteroids if they were falling slowly and there were no other high-value targets around. And when you do shoot a large asteroid, fire twice in rapid succession, because your second shot will often destroy any small asteroids that break off from it.</div><div><br /></div><div>The objects you never want to let fall are the bombs. Anytime they hit the ground, you will lose 100 points (times the multiplier) and a life. Since you need to score 1000 points to make up for that lost life, a fallen bomb effectively costs you 1000 + 100 x multiplier, or 1600 points at the highest stages.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Nq2QDozMJkD73LoFoFiTm7uzuPnZnsrmVGg6XhQnNmgKwB30G7LlZMb75K8quu6fS6KUSYSFsDt9brs0D6yQVgnzHUfxSiaLqcrIUBqLX7_hE2PAAKcjiCsXDCCAEF_XeISPXFJoB6O2/s317/bomb_fall_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation of a bomb falling in Astrosmash." border="0" data-original-height="239" data-original-width="317" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Nq2QDozMJkD73LoFoFiTm7uzuPnZnsrmVGg6XhQnNmgKwB30G7LlZMb75K8quu6fS6KUSYSFsDt9brs0D6yQVgnzHUfxSiaLqcrIUBqLX7_hE2PAAKcjiCsXDCCAEF_XeISPXFJoB6O2/w400-h302/bomb_fall_opt.gif" width="400" /></a></div><div><br /></div><div>Finally, beware of the smart bombs. They are small, making them hard to hit, and will follow you around the screen. Sometimes it's possible to dodge them, but other times, they will just do this:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQTH6RbxdWgPDVHHAryd5YOgTPEfVHaJPqBmVdaqKLLKTgycFAMT9OWjBWhXeBDQ-MxK4DudwHjN9sawkeWaD7RkepvgUUgG9pJZHKXesLHmK4WPUWxLHekFHiWEixIflkyzP8grYjwjh2/s317/smart_bomb_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation of a smart bomb following the player in Astrosmash." border="0" data-original-height="239" data-original-width="317" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQTH6RbxdWgPDVHHAryd5YOgTPEfVHaJPqBmVdaqKLLKTgycFAMT9OWjBWhXeBDQ-MxK4DudwHjN9sawkeWaD7RkepvgUUgG9pJZHKXesLHmK4WPUWxLHekFHiWEixIflkyzP8grYjwjh2/w400-h302/smart_bomb_opt.gif" width="400" /></a></div><div><br /></div><div>The only way to avoid them when they track you horizontally is to use the "hyperspace" button, which will transport you to a random position on the ground.</div><h3 style="text-align: left;">Buckle Up, It's a Long Ride</h3><div>Once you get good at <i>Astrosmash</i>, you'll find your playing sessions stretching out for some time. It took me about 45 minutes of playing time to reach the 6x multiplier. From there, you'll encounter further speed increases at 200,000 points, 500,000 points, and 1,000,000 points (I didn't play long enough to reach that last one). Every milestone results in a different speed and object distribution, forcing you to change your strategy. This kind of progressive level design is normally difficult to achieve in fixed shooters without spiking the difficulty, but the low cost of bonus lives in <i>Astrosmash</i> really smooths out the difficulty curve.</div><div><br /></div><div>The long-play, slow-build design of <i>Astrosmash </i>was unusual in an era when the best-selling console games were just simplified versions of arcade hits<i>. </i>Indeed, second-generation console hardware was barely able to handle the short gameplay of <i>Pac-Man, </i>let alone the kind of extended level design of games like <i>Super Mario Bros </i>or <i>Contra</i>. <i>Astrosmash</i> is clunky by modern standards, so it may not be the best way to spend an afternoon, but it's still a fascinating example of how even the simplest fixed shooter formula can be spread into hours of nonstop gameplay.</div>RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com0tag:blogger.com,1999:blog-7604980045122375946.post-35243731283639589692020-05-29T13:11:00.002-07:002020-06-02T06:55:34.756-07:00Metamorphosis: From Galaxian to Galaga<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik9mWtDKc92rOstI-76zoreSadZQGNvWSkANjQCD3Y3vmHWMmTJuXMOnAMR8mPVKzbEFngd0EF7_mHIAqBUHNxFIMugODy0o3uM7yLVrN8hgi7tm-wF83KP7ML8MgYvxNWtVj9RoHH8V_P/s1600/metamorph_full.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation that fades from the Galaxian (1979) sprites to the Galaga (1981) sprites. The player spaceship and the three primary enemies are depicted." border="0" data-original-height="236" data-original-width="150" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik9mWtDKc92rOstI-76zoreSadZQGNvWSkANjQCD3Y3vmHWMmTJuXMOnAMR8mPVKzbEFngd0EF7_mHIAqBUHNxFIMugODy0o3uM7yLVrN8hgi7tm-wF83KP7ML8MgYvxNWtVj9RoHH8V_P/s400/metamorph_full.gif" title="" width="254" /></a></div>
<br />
Having studied <a href="https://raisingthevgbrow.blogspot.com/2020/05/why-galaxian-works-comparison-with.html"><i>Galaxian</i></a> (1979) and <a href="https://raisingthevgbrow.blogspot.com/2020/05/shooter-gallery-5-galaxian-model.html">its imitators</a> from the following year, lets look in detail at the culmination of the Galaxian design model, <i>Galaga </i>(1981). It might superficially seem that the changes made between these games, like adding bonus rounds and fancier flight patterns, are mostly cosmetic, but when you're starting with something as simple as <i>Galaxian</i>, "frills" can fundamentally alter the character of the gameplay.<br />
<h2>
Armada</h2>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdLac8Syc_exkdB5rQHK62riwlnnTc_oVq-CEt7A-iTnvaglpqUrJhmpFT35GHmSJHH1-RbEbopznvG2c-sstYx-UreaUnSKyd2VNIe88q_XpwcIGn6BZWV95OXpO8DFY6a-oYW3quTb-s/s1600/armada_live_small_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Capture of the armada in formation in the 1979 arcade game, Galaxian." border="0" data-original-height="109" data-original-width="232" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdLac8Syc_exkdB5rQHK62riwlnnTc_oVq-CEt7A-iTnvaglpqUrJhmpFT35GHmSJHH1-RbEbopznvG2c-sstYx-UreaUnSKyd2VNIe88q_XpwcIGn6BZWV95OXpO8DFY6a-oYW3quTb-s/s400/armada_live_small_opt.gif" title="" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM-fgrSksAeOgJkcm_MaPh0t6mamaZJs8D2lFz4UPEhsvYlt5e7xt_sK_voY5dlOH_0uBUKhHnMSR2p2mXcu5U5qM7iwY7NtH9icp9Td-72RnRCUhwUmc9gCzJYYImJglTJDog1FhpS34J/s1600/armada_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Capture of the armada in formation in the 1981 arcade game, Galaga." border="0" data-original-height="122" data-original-width="218" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM-fgrSksAeOgJkcm_MaPh0t6mamaZJs8D2lFz4UPEhsvYlt5e7xt_sK_voY5dlOH_0uBUKhHnMSR2p2mXcu5U5qM7iwY7NtH9icp9Td-72RnRCUhwUmc9gCzJYYImJglTJDog1FhpS34J/s400/armada_opt.gif" title="" width="400" /></a></div>
<br />
One of the most immediately noticeable advances in <i>Galaga</i> is the dynamic nature of the armada. Not only do the aliens move more fluidly and with more detailed animation, but the formation throbs like a living thing. Fliers come and go like bees from a hive, a nice touch considering all of the enemies are now clearly depicted as bugs.<br />
<br />
You'll seldom see the armada in all of its splendor, however. Unlike in <i>Galaxian</i>, the aliens enter the formation gradually at the beginning of the stage, giving you an opportunity to shoot them down before they even reach their position. What's more, thanks to hardware improvements, you can now fire two bullets at a time, greatly increasing the speed at which you can knock out enemies. I found myself completing two stages of <i>Galaga</i> in the time it took to clear one stage of <i>Galaxian</i>, even though there are only six fewer enemies in the <i>Galaga </i>formation.<br />
<br />
You might say that this is just a further step in the evolution from <i>Space Invaders. </i>Steadily decreasing the player's interaction with the aliens while in formation means increasing their engagement with the action; that is, the divers.</div>
<h2>
Divers</h2>
<div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl863Sg761D4use6-7IXxi2PVRC1TV4GjwOueubkA8kZ1t8kbsqfUcaNOIcxnRK1d8FW56ITyqxDmiQ-2FYmHp8hkPNvGN8KZi2cWQzMiXE-h2n56vWSTtZKe4dl6tCIQoo4AO5Mo9hHWr/s1600/paths_compare.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation comparing the flight paths of the primary enemies in Galaxian (1979) and Galaga (1981)." border="0" data-original-height="497" data-original-width="417" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl863Sg761D4use6-7IXxi2PVRC1TV4GjwOueubkA8kZ1t8kbsqfUcaNOIcxnRK1d8FW56ITyqxDmiQ-2FYmHp8hkPNvGN8KZi2cWQzMiXE-h2n56vWSTtZKe4dl6tCIQoo4AO5Mo9hHWr/s640/paths_compare.gif" title="" width="536" /></a></div>
<br />
The overall design model for the divers remains fundamentally the same between <i>Galaxian</i> and <i>Galaga. </i>In both games, the enemies follow simple, smooth curves that are just the right speed to make targeting difficult, but not impossible. However, <i>Galaga</i> adds many little twists.<br />
<br />
One of the most important additions is the two-way dive. The fly enemies, situated at the bottom of the formation, execute large loops that bring them back to their starting position. The loops are simple and smooth, like the other dives, but require you to account for the flies coming from two different directions. Also, the loop is large enough that you're sometimes better off navigating to the middle of it rather than avoiding the enemy entirely.<br />
<br />
The above curves are "normal" behavior, but each of the individual divers exhibits some variability. The butterfly's path will respond to the position of the player, veering slightly at the end of its dive depending on which side you're on.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUnuDgY4yyUpXtiZ-KiN9VKCKUwlKiGhY7Vck2x7iB0jM3Z2WSZQADjXDiV_3xeyQxW7aZ1gaLeeOMtKs-QN0FHiHR9ZvNM-09zliwU1nFHvnWK_TkTTFEmVVSbHvfxxWtF7yoOnyn6Fml/s1600/butterfly_paths.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation demonstrating the flight paths of the butterfly in the arcade game, Galaga (1981)." border="0" data-original-height="219" data-original-width="243" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUnuDgY4yyUpXtiZ-KiN9VKCKUwlKiGhY7Vck2x7iB0jM3Z2WSZQADjXDiV_3xeyQxW7aZ1gaLeeOMtKs-QN0FHiHR9ZvNM-09zliwU1nFHvnWK_TkTTFEmVVSbHvfxxWtF7yoOnyn6Fml/s400/butterfly_paths.gif" title="" width="400" /></a></div>
<br />
Note that these adjustments are still smooth motions, so they don't take the player by surprise (like in <i><a href="https://raisingthevgbrow.blogspot.com/2020/05/why-galaxian-works-comparison-with.html">Cosmic Alien</a></i>), but they do increase the impression that the aliens are aware of you.<br />
<br />
The boss also mixes things up, sometimes performing its characteristic loop dive, other times coming out in a straight line to try to "capture" the player.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGaLOc6F4gWVtL547p8JytEe8SBxEGALx81V-4kLMFXYEKNeuCLsW2tBkNOq7M-6ConZwC8JohZJc4VgQVQZCnSmqCb-IwxfWO3N-wqNwyASdE1yjecaxonZu9WsEH02F4_1YYXmr1jxIK/s1600/boss_paths.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation demonstrating the flight paths of the boss in the arcade game, Galaga (1981)." border="0" data-original-height="244" data-original-width="197" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGaLOc6F4gWVtL547p8JytEe8SBxEGALx81V-4kLMFXYEKNeuCLsW2tBkNOq7M-6ConZwC8JohZJc4VgQVQZCnSmqCb-IwxfWO3N-wqNwyASdE1yjecaxonZu9WsEH02F4_1YYXmr1jxIK/s400/boss_paths.gif" title="" width="322" /></a></div>
<br />
The capture feature gets a lot of attention because it allows the player to retake their ship and double their firepower, something that's both fun and effective for racking up points. The boss will also take butterflies with it on its pattern, if it's executing its looped dive.<br />
<br />
Finally, the fly is the trickiest of them all. Aside the from the standard two-way dive shown, it will sometimes do a full loop and then continue past the player.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTfICjKa7U6MZZmVyZQRnbP1gTSRqLQ51VIolttZlso0kbeC5zFf4fv3q3plEc93zwVOp7oGHbtxoHSRhNxyw4G2Eebzn7McTbjUzZzx7Hrnqa2MmEdAFaUcbwxnCfLnLbVdrcSUrAJJID/s1600/fly_paths.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Animation demonstrating the flight paths of the fly in the arcade game, Galaga (1981)." border="0" data-original-height="225" data-original-width="311" height="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTfICjKa7U6MZZmVyZQRnbP1gTSRqLQ51VIolttZlso0kbeC5zFf4fv3q3plEc93zwVOp7oGHbtxoHSRhNxyw4G2Eebzn7McTbjUzZzx7Hrnqa2MmEdAFaUcbwxnCfLnLbVdrcSUrAJJID/s400/fly_paths.gif" title="" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
This typically comes up at the end of a stage, when most of the armada has been cleared. But that's not all. The fly is also known to morph into other enemies:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAU4EuN_x7olquvYwZ2-j_emC1zhWYbRBnxc6KG4nEVel6mYhZVfMKZGCpv7h1t_84dBQVl-4BTWEvtgfmhtzJ7pOUaOVHKeD4dsSY8eMVT1_Dd43QDPdmDCdKnW5MQJq62b-2eJLWG26N/s1600/morphs_all.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Combined animation from the arcade game, Galaga (1981), showing the flight patterns of the three enemy morphs." border="0" data-original-height="218" data-original-width="582" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAU4EuN_x7olquvYwZ2-j_emC1zhWYbRBnxc6KG4nEVel6mYhZVfMKZGCpv7h1t_84dBQVl-4BTWEvtgfmhtzJ7pOUaOVHKeD4dsSY8eMVT1_Dd43QDPdmDCdKnW5MQJq62b-2eJLWG26N/s640/morphs_all.gif" title="" width="640" /></a></div>
<br />
When morphing, the fly divides into three of the new enemies, though only one will return to the formation. The last morph, which is a sprite from the original <i>Galaxian</i>, has a significantly different flight pattern that can catch you off guard, so watch out for it.<br />
<br />
The aliens also have several entrance patterns to start the level. Overall, the effect of all of these many flight patterns is to add depth to the gameplay. The more you play, the more you learn to anticipate enemy motions.</div>
<h2>
Enemy Fire</h2>
<div>
It's difficult to overstate the importance of enemy shot distribution in driving the gameplay of a shooter. In <i>Galaxian</i>, I showed how the enemies fire bullets that lean in the direction of the player, making it seem like the enemies are aware of the player's position. <i>Galaga</i> doubles down on this effect.</div>
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwsvMYmJsBRCYA1l7NhxZ2mFwhywYlEQjdCgogXZBM-cPMlDq8yM2y-j2uCrF7mALzcJy-1yHgn6EHl07Qu9dJ0GIscNjZwN7eRZkkTREDrs9bLOPS1iWtxWjNBfJsBwDT81wKN1GdK3m0/s1600/bullets_compare_short_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="283" data-original-width="463" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwsvMYmJsBRCYA1l7NhxZ2mFwhywYlEQjdCgogXZBM-cPMlDq8yM2y-j2uCrF7mALzcJy-1yHgn6EHl07Qu9dJ0GIscNjZwN7eRZkkTREDrs9bLOPS1iWtxWjNBfJsBwDT81wKN1GdK3m0/s640/bullets_compare_short_opt.gif" width="640" /></a></div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<br />
In <i>Galaga</i>, the enemy fire is more concentrated and even more focused on the player than in <i>Galaxian</i>, so much so that it changes the character of the game. The curtains of fire that dominated <i>Galaxian</i> put more emphasis on reflexes and spatial awareness. With the more focused fire of <i>Galaga, </i>a clever player has more power to dictate the firing pattern and create their own safe areas without having to duck between bullets. </div>
<div>
<h2>
Bonus Rounds</h2>
</div>
<div>
The simplicity of the Galaxian model is both a strength and a weakness. If you're looking to give the player a sense of progress, then it's a definite weakness, since there is only so much you can change the attacking aliens without changing the character of the game. The bonus rounds (or "Challenging Stages") in <i>Galaga </i>are a clever way around this issue, because they give the player clear signposts in their progress without upsetting the difficulty curve.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghIhJ7rsbkEF9dk_37UjMAfdZ9oDr8JXTOpgCqjeKxrWlX8ey7JNDQ3ErqqtclHKbBefwocXoAlodC0jrp12ZKDdndLd_5jBKxXZALxma4kHMrQNN2M09IHYBcI13UUGIOc_5HGrhN7OnK/s1600/bonus_loop.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Looped gameplay from bonus round in arcade game, Galaga (1981)." border="0" data-original-height="284" data-original-width="223" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghIhJ7rsbkEF9dk_37UjMAfdZ9oDr8JXTOpgCqjeKxrWlX8ey7JNDQ3ErqqtclHKbBefwocXoAlodC0jrp12ZKDdndLd_5jBKxXZALxma4kHMrQNN2M09IHYBcI13UUGIOc_5HGrhN7OnK/s400/bonus_loop.gif" title="" width="314" /></a></div>
<br />
The first example of a bonus round in a video game was Sega/Gremlin's <a href="https://raisingthevgbrow.blogspot.com/2020/05/shooter-gallery-4-at-electronic-carnival.html#Carnival" style="font-style: italic;">Carnival</a>, so it's fitting that the <i>Galaga</i> bonus rounds have a shooting gallery feel to them. The developers clearly wanted to provide <i>Galaga</i> with depth because they designed eight distinct bonus rounds, the last of which won't be seen until you pass stage 30!</div>
<div>
<h2>
Difficulty</h2>
</div>
<div>
In <i>Galaxian</i>, there are very few concrete "facts" that players can learn that will make them better at it. Once you understand the basic rules of the game, getting better requires that you learn to recognize how the game pieces will respond in various conditions, something that can only come from experience.</div>
<div>
<br /></div>
<div>
<i>Galaga</i>, however, is designed to reward specific game knowledge. For example, the first time you play, you're likely to be caught off guard in the second stage when the enemies start firing at you during their entrance, but the next time you play you'll learn to expect this. Similarly, experienced players will learn to recognize enemy entrance patterns, optimal bonus round positions, high scoring opportunities, and the various fly morphs. </div>
<div>
<br /></div>
<div>
This is different from games like <i>Galaxian</i> and <i>Pac-Man</i>. When I lose a life in those games, it's under specific circumstances that will probably only be repeated once in a blue moon. In other words, it's more difficult to apply what I've learned and there's no simple correlation between the knowledge I've gained and the benefits I reap in gameplay. I still improve with time, but the relationship between game knowledge and game success is more complex.<br />
<br />
In <i>Galaga,</i> the player's progress is more linear, at least initially. Every time the player learns a new piece of game information, like a particular dive pattern or enemy type, the game rewards them proportionally and they score that much higher. It provides the player with clear ways to improve their game that don't involve rigorous reflex training or countless hours pattern study.</div>
<div>
<br /></div>
<div>
The learning process will eventually slow, however. At some point, you will have learned all there is to know about the <i>Galaga</i> enemy patterns and the rest of your improvement will come down to the same kind of non-linear learning process that you encounter in <i>Galaxian</i>. Manipulating enemy fire, for example, is a complex, highly situational process that cannot be broken down into a small number of facts. I think the combination of linear and non-linear learning processes allows the game to appeal to both casual and hardcore gamers.<br />
<h2>
Big Picture</h2>
</div>
<div>
<i>Galaga</i> was a huge hit, both commercially and critically, and retains a strong following to this day. For all of its success, however, <i>Galaga</i> actually marked the end of a gaming trend rather than the beginning. Its innovations would be influential on subsequent developers and it would see a sequel in 1984, called <i>Gaplus</i>, but fixed shooters were going out of fashion in arcades. Home systems, however, were breathing new life into the genre. More on that soon.</div>
RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com0tag:blogger.com,1999:blog-7604980045122375946.post-83150558025743951682020-05-23T17:49:00.002-07:002020-07-11T07:10:13.144-07:00Shooter Gallery #5: The Galaxian ModelHaving <a href="https://raisingthevgbrow.blogspot.com/2020/05/why-galaxian-works-comparison-with.html">discussed</a> the model that <i>Galaxian</i> used to expand on the <i>Space Invaders</i> formula, I want to take a look at some games from the following year that made use of that model.<br />
<h2>
<i>Radar Scope </i><span style="font-weight: normal;">(1980, Nintendo)</span></h2>
<div id="RadarScope">
<span style="font-weight: normal;">American arcade-goers are most likely to be familiar with <i>Radar Scope</i> as the motivation for the creation of <i>Donkey Kong</i>. The story goes that <i>Radar Scope</i> was a big hit in Japan, but flopped when Nintendo attempted to market it in the US. Stuck with thousands of unused arcade cabinets, Nintendo decided to outfit them with another game, a game that would eventually become <i>Donkey Kong.</i></span></div>
<div>
<span style="font-weight: normal;"><i><br /></i></span></div>
<div>
<span style="font-weight: normal;">But Nintendo's failure with <i>Radar Scope</i> was more likely a consequence of bad timing (the US release <a href="https://www.google.com/books/edition/I_Am_Error/GBXqCAAAQBAJ?hl=en&gbpv=1&pg=PA54">took a while</a>) than design. The game offers a <i>Galaxian</i>-like setup, but with various subtleties in the mechanics that increase the player's engagement with the divers.</span></div>
<div>
<span style="font-weight: normal;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS4R3XMhcmZkvdawPzzBsRDV7G70xAqidWlfors8Svjudw7M1hD9l_4n3eq4wH2B6YtYuLAjOC-HmWeBlshujJfG3S3binhjPJHv2USn6aBeEuegfMjgqSqMzVZsYxdJUa2DSIHs5C9vJD/s1600/demo_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1979 arcade game, Radar Scope. The sprites for the player and enemies are also shown." border="0" data-original-height="255" data-original-width="322" height="316" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS4R3XMhcmZkvdawPzzBsRDV7G70xAqidWlfors8Svjudw7M1hD9l_4n3eq4wH2B6YtYuLAjOC-HmWeBlshujJfG3S3binhjPJHv2USn6aBeEuegfMjgqSqMzVZsYxdJUa2DSIHs5C9vJD/s400/demo_opt.gif" title="" width="400" /></a></div>
<div>
<span style="font-weight: normal;"><br /></span><span style="font-weight: normal;">Targeting the armada is less fruitful than it was in <i>Galaxian</i> because most of it is beyond the reach of the player's shots. You can still occasionally pick off aliens from the bottom row, but not with any consistency.</span><br />
<span style="font-weight: normal;"><br /></span><span style="font-weight: normal;">What's more, the divers are straightforward to target. All dives in <i>Radar Scope </i>begin and end with approximately straight-line trajectories, giving the player a reasonable chance at targeting the aliens in either direction. </span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxW-oCixgRwTcQPaICzWjw-Ckry5SieYKL6Z6ToXGhgw7QKRzvaJGKiH_o6LCckRFD1LPoxiKgrunEqbbKJXYN77EXu39ChG47nVWXHMtZwMcQGvky9LAmuFeiHpTrHTcrb5CcyyvUm971/s1600/comb_replace.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Example paths taken by the enemies in the 1979 arcade game, Radar Scope." border="0" data-original-height="166" data-original-width="413" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxW-oCixgRwTcQPaICzWjw-Ckry5SieYKL6Z6ToXGhgw7QKRzvaJGKiH_o6LCckRFD1LPoxiKgrunEqbbKJXYN77EXu39ChG47nVWXHMtZwMcQGvky9LAmuFeiHpTrHTcrb5CcyyvUm971/s400/comb_replace.gif" title="" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
The aliens all look the same, so you won't know their complete trajectory ahead of time, but they only fire in their descent, so this unpredictability shouldn't result in unavoidable deaths. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
But my favorite aspect of the <i>Radar Scope</i> design is the enemy shot distribution. Watch what happens when I sit motionless in the center of the screen for a while.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgCjSn7sDT3KydgKX8uCPDdvCbUiUPCBMjOJPlOTknxFqEMFCGdwzTiI9w0WhN2dOVlFs9n01SQCixKVHQ7DIy6NzwFGALL6wnGiIODiivzn5lTXxaH54yDLkadWqrDZcmJdCSWcDUCcMs/s1600/middle_opt_fast.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Demonstration of Radar Scope, with the player sitting still." border="0" data-original-height="255" data-original-width="217" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgCjSn7sDT3KydgKX8uCPDdvCbUiUPCBMjOJPlOTknxFqEMFCGdwzTiI9w0WhN2dOVlFs9n01SQCixKVHQ7DIy6NzwFGALL6wnGiIODiivzn5lTXxaH54yDLkadWqrDZcmJdCSWcDUCcMs/s400/middle_opt_fast.gif" title="" width="340" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-weight: normal;">Attacking enemies will either fire straight ahead or diagonally at the bottom of their dive, leaving a safe spot in between. This encourages the player to stay near the center of the screen and stay engaged with the incoming ships. Note that you can't sit still forever -- eventually an enemy will dive at you -- but in a pinch, you're often better off moving to the center of the playing field.</span></div>
<div>
<h2>
<i>Phoenix </i><span style="font-weight: normal;">(1980, Ams</span><span style="font-weight: normal;">tar Electronics)</span></h2>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2qTHNcgyTqqssfEcP0euVtVeaRrqmO5MAZwBsVUy4OMWuvz_RAWMkaqE2p1hyphenhyphenvUgPvuauPvTL60jtzYtaDA33y_JpL5UjwMn7j9UTPA5uclxzQYzlrRAIoxiW2qpFWpE44qzix25FT4Mj/s1600/demo_opt+%25282%2529.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1980 arcade game, Phoenix. The sprites for the player and enemy birds are also shown." border="0" data-original-height="244" data-original-width="375" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2qTHNcgyTqqssfEcP0euVtVeaRrqmO5MAZwBsVUy4OMWuvz_RAWMkaqE2p1hyphenhyphenvUgPvuauPvTL60jtzYtaDA33y_JpL5UjwMn7j9UTPA5uclxzQYzlrRAIoxiW2qpFWpE44qzix25FT4Mj/s400/demo_opt+%25282%2529.gif" title="" width="400" /></a></div>
<div>
<span style="font-weight: normal;"><br /></span>
<span style="font-weight: normal;">I've already discussed <i><a href="https://raisingthevgbrow.blogspot.com/2020/02/phoenix-review-elusive-splendor.html">Phoenix</a></i> at length in <a href="https://raisingthevgbrow.blogspot.com/2020/01/the-animation-of-phoenix-part-1.html">other</a> <a href="https://raisingthevgbrow.blogspot.com/2020/05/reaction-time-and-game-design.html">entries</a>, so I won't dwell on it too much here. The most significant change relative to <i>Galaxian </i>is the complexity and speed of the enemy dives. </span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmV_L8VaAj0aDIU_ln0jbxRNcgUWsa_wW35U6c6PLLjvlfmgFd-qx-NsDkKxw361b-6joaDeeXJ1GkscIDxzfjgdIk9r7X9iXaZUYjSJac8Sbj4LSGCXg54OIyS-GlDZ460afEpahJHWME/s1600/Fullpath+578.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay still of Phoenix arcade, with the path of the small bird traced out." border="0" data-original-height="248" data-original-width="210" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmV_L8VaAj0aDIU_ln0jbxRNcgUWsa_wW35U6c6PLLjvlfmgFd-qx-NsDkKxw361b-6joaDeeXJ1GkscIDxzfjgdIk9r7X9iXaZUYjSJac8Sbj4LSGCXg54OIyS-GlDZ460afEpahJHWME/s400/Fullpath+578.png" title="" width="338" /></a></div>
<span style="font-weight: normal;"><br /></span>
<span style="font-weight: normal;">Anticipating enemy movements is a hopeless endeavor for all but the most experienced players, so hitting enemies often comes down to luck. </span><br />
<span style="font-weight: normal;"><i><br /></i></span>
<span style="font-weight: normal;"><i>Phoenix</i> certainly is a large step up from <i>Galaxian</i> from the visual standpoint, and the birds' aerial acrobatics are part of that visual impression, but the gameplay leaves something to be desired.</span></div>
<div>
<h2>
<i>Mad Alien </i><span style="font-weight: normal;">(1980, Data East)</span></h2>
</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJHCMm2-f_lbfYPSTZGsBoLwU-WcH9ts9wxE8wEnjWaNqC5TicWHBm2wEpY0M_LqG9Pao04RHArcj7IeO2Q9s1-xRiFVo24tg3R776EKbI3-rTfMjT-9R7SDBsGteBd-Cvuz0CSBIwQQH1/s1600/demo_opt+%25282%2529.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1980 arcade game, Mad Alien. The sprites for the player, motorcycle, and car are also shown." border="0" data-original-height="253" data-original-width="303" height="333" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJHCMm2-f_lbfYPSTZGsBoLwU-WcH9ts9wxE8wEnjWaNqC5TicWHBm2wEpY0M_LqG9Pao04RHArcj7IeO2Q9s1-xRiFVo24tg3R776EKbI3-rTfMjT-9R7SDBsGteBd-Cvuz0CSBIwQQH1/s400/demo_opt+%25282%2529.gif" title="" width="400" /></a></div>
<span style="font-weight: normal;"><br /></span>
<span style="font-weight: normal;"><i>Mad Alien</i> relocates the Galaxian model to a highway, where the player is now in control of a police car and the enemies are rogue motorcyclists. How aliens fit into this picture is unclear... maybe they stole the motorcycles?</span><br />
<span style="font-weight: normal;"><br /></span>
<span style="font-weight: normal;">Anyway, these motorcyclists are very small and hard to hit. Also, in direct defiance of typical shooter design, they </span><b>only</b> shoot at you up close. This would normally mean that you should just steer clear of the divers, but unfortunately they often end their dives on near-horizontal trajectories. Here are some example dives:<br />
<span style="font-weight: normal;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1a8qbPfgFzImOsZq2lihXgZDdBz1Ovc17Mv9CWQW5RpacGmh-gOnJOSXnWhPRyLf1W1G7gM5JvmIwDdFsVithJWyUMHP62sVDwuWdiQJam26a2yGF1_Ycn6JzYfPoaF6VVLjjH7t28PNB/s1600/paths_all.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Example paths taken by the enemies in the 1980 arcade game, Mad Alien." border="0" data-original-height="163" data-original-width="569" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1a8qbPfgFzImOsZq2lihXgZDdBz1Ovc17Mv9CWQW5RpacGmh-gOnJOSXnWhPRyLf1W1G7gM5JvmIwDdFsVithJWyUMHP62sVDwuWdiQJam26a2yGF1_Ycn6JzYfPoaF6VVLjjH7t28PNB/s640/paths_all.gif" title="" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-weight: normal;"><br /></span>
<span style="font-weight: normal;">Dives like that fourth one are especially nasty, and are hard to avoid if you don't take out the motorcycle before it reaches the bottom.</span><br />
<span style="font-weight: normal;"><br /></span>
<i>Mad Alien</i> likes to throw randomizers at you, like blacking out the screen for brief periods and enemy "spin-outs" where they veer quickly to the side after being hit. And don't be surprised if your targets suddenly change their speed or trajectory while you're targeting them.<br />
<br />
Still, there is a lot of potential here. The learning curve is steep initially because of the aforementioned dive patterns, but once you learn how to manage the divers, the game develops some flow. I could have done without the blackouts, which increasingly obscure the patterns and make the outcome more of a crapshoot, but I still had fun and found myself improving steadily. </div>
<div>
<h2>
<i>Devil Zone </i><span style="font-weight: normal;">(1980, Universal)</span></h2>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj_ublz0tjZ5Qh6izXeQc7dHejRj6oSbL0AcPSMfIPjK6dRWGALfgtWk2Eh5e4ZHIJYCuVcUdJnyH_n9iFhRAOofCFvqU-EMEYZys23g6Zzycut_SqM045fb1tNOAWD-FRAOcyf3pDND6X/s1600/demo_opt+%25282%2529.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from the 1980 arcade game, Devil Zone. The sprites for the player and enemies are also shown." border="0" data-original-height="229" data-original-width="343" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj_ublz0tjZ5Qh6izXeQc7dHejRj6oSbL0AcPSMfIPjK6dRWGALfgtWk2Eh5e4ZHIJYCuVcUdJnyH_n9iFhRAOofCFvqU-EMEYZys23g6Zzycut_SqM045fb1tNOAWD-FRAOcyf3pDND6X/s400/demo_opt+%25282%2529.gif" title="" width="400" /></a></div>
<div>
<br />
From the highway to depths of Hades, <i>Devil Zone</i> takes the Galaxian model to an action-packed extreme. The pseudo-3D playing field was probably borrowed from Nintendo's <i>Radar Scope, </i>but what really stands out is the behavior of the enemies. These baddies really are like mad devils, erratically juking and jiving across the playing field. If you had trouble targeting the birds in <i>Phoenix</i>, you can forget about <i>Devil Zone</i>. Here are three examples of diver paths:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5sY6JrXPX3sSOuhT0VUzQ3DtWl6fbIZu2bIK0P-zNxlB1h2M6rSqn4QN1t2AEDXbjIfkHiGUWzL_Fi0rqC5gX8HxK9HvZzqUB3W3BmvWOc5Gp4WaGWdcFd-Ihw0JdTRsE2xZmi6NTGQ5v/s1600/paths_all.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Example paths taken by the enemies in the 1980 arcade game, Devil Zone." border="0" data-original-height="166" data-original-width="488" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5sY6JrXPX3sSOuhT0VUzQ3DtWl6fbIZu2bIK0P-zNxlB1h2M6rSqn4QN1t2AEDXbjIfkHiGUWzL_Fi0rqC5gX8HxK9HvZzqUB3W3BmvWOc5Gp4WaGWdcFd-Ihw0JdTRsE2xZmi6NTGQ5v/s640/paths_all.gif" title="" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-weight: normal;"><br /></span>
You should focus on the armada in the background if your want to maximize your efficiency in defeating the devils, but don't expect it to be easy. You spend so much effort trying to avoid the diving aliens that it's difficult to find the opportunity to target the armada. Also, the <a href="https://raisingthevgbrow.blogspot.com/2020/05/reaction-time-and-game-design.html">20-frame limit</a> is breached on many occasions here, with the alien trajectory changing unexpectedly in as little as four frames, and their shots hitting you in less than ten.<br />
<br />
<i>Devil Zone</i> does, at least, seem to be aware of how helpless it's making the player. The demonic theme is apropos of the gameplay, and when your bullets make contact with an enemy, the subsequent fireworks are satisfying. If Universal were really set on making the experience so frantic, they should have committed more fully. Specifically, a maximalist makeover along the lines of <i>Robotron</i>: <i>2084</i> or <i>Missile Command </i>would have hit the spot.<br />
<br />
Interesting side note: I found the<a href="https://www.arcade-museum.com/manuals-videogames/D/DevilZone.pdf"> <i>Devil Zone </i>manual</a> at the International Arcade Museum site, and it included the following tidbit:<br />
<blockquote class="tr_bq">
<span style="font-weight: normal;">When the last plane of the four plane formation began assaulting while turning, destroy it at as remote a position as possible to score high points.</span></blockquote>
<span style="font-weight: normal;">It's an odd bit of prose to disentangle, but I think it means you can score a bonus if you hit a devil at its highest point while it's looping around you. Hitting one of these bastards at any specific point in their path is a tall order, but I figured it was worth a shot. After many attempts, here's the best I could do.</span><br />
<span style="font-weight: normal;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf2C9yjJFlteYMrn8R6K6pm0PgZpNt469xE90BCa_o1_22DYs3zslgjAUUCTGw2FaUcq1ZpjE6JDanz2qI4omiPSzMXW4R65NCPPNbqmXN1w0W2aHCvfzv6GibZioSkaIk9CPv3P_W-og5/s1600/easter_egg_opt.gif" style="margin-left: 1em; margin-right: 1em;"><img alt="Unlocking the "bonus" points in the 1980 arcade game, Devil Zone." border="0" data-original-height="240" data-original-width="193" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf2C9yjJFlteYMrn8R6K6pm0PgZpNt469xE90BCa_o1_22DYs3zslgjAUUCTGw2FaUcq1ZpjE6JDanz2qI4omiPSzMXW4R65NCPPNbqmXN1w0W2aHCvfzv6GibZioSkaIk9CPv3P_W-og5/s400/easter_egg_opt.gif" title="" width="321" /></a></div>
<span style="font-weight: normal;"><br /></span>
It hardly seems worth all that trouble for 600 points, but hey, I guess it's... um, something.<br />
<h2>
Big Picture</h2>
</div>
<div>
By the end of 1980, experiments with the Galaxian model had had mixed results, but the commercial and critical pinnacle was still to come. Up next, the mighty <i>Galaga</i>. </div>
RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com0tag:blogger.com,1999:blog-7604980045122375946.post-47755186964814646582020-05-21T10:07:00.001-07:002020-05-21T10:07:49.704-07:00Why Galaxian Works: Comparison with an Attempted Clone<i>Galaxian</i> was one of the most succesful games of the arcade golden age and a major stepping stone in the evolution of shooters. I <a href="https://raisingthevgbrow.blogspot.com/2019/09/galaxian-aesthetics-of-simple-patterns.html">already talked about</a> how it makes use of simple patterns to create flow and depth, but I want to look more carefully at the pieces and how they work together to create this experience. Rather than look at the game in isolation, however, I'm going to compare it with another game, <i>Cosmic Alien</i>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOE3YTqJLykMT6S5hoJv_8zTOMc9wvyxYhiQzDq0RI__Aqfost2-0zauzQZPEMxDWrM5TWC3gn1MAcG-C4mNpTgHcv0KPY2Gmpyew_z4jBbI5h9TUtche5Qg19DrTNzQxttf9xewZEFu7P/s1600/PlaySample_both_opt.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Clips of gameplay for Galaxian and Cosmic Alien, shown side-by-side." border="0" data-original-height="257" data-original-width="420" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOE3YTqJLykMT6S5hoJv_8zTOMc9wvyxYhiQzDq0RI__Aqfost2-0zauzQZPEMxDWrM5TWC3gn1MAcG-C4mNpTgHcv0KPY2Gmpyew_z4jBbI5h9TUtche5Qg19DrTNzQxttf9xewZEFu7P/s400/PlaySample_both_opt.gif" title="" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>Galaxian</i> (left) and <i>Cosmic Alien</i> (right)</td></tr>
</tbody></table>
<br />
Superficially, <i>Galaxian</i> and <i>Cosmic Alien </i>look very similar, so much so that it's likely the latter is trying to clone the former. But unlike <i>Space Invaders</i>, the cloning of which led to a <a href="https://raisingthevgbrow.blogspot.com/2020/04/shooter-gallery-1-clone-show.html">virtual deluge of nearly identical games</a>, <i>Galaxian </i>proved to be more resistant to duplication. Let's look at it piece-by-piece to see why this was.<br />
<h2>
The Armada</h2>
<div>
<i>Galaxian</i> and <i>Cosmic Alien</i> both start where <i>Space Invaders</i> left off<i>, </i>with an armada of animated aliens, all lined up and attacking the player. </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG9vFXWQCgerKt6DYLf7rFhLPmQFSSzYFJ2YnjzCXkbBmkD4pFFTGqMt1bisbhl5GN468MHZWQZjlSYOmwx2E09fUMFL7L-Y50-4u9eVgRDkK193rqoAcsQC4kz7nTXMDKGHGWshh9xOKt/s1600/armada_opt.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="A looping GIF of the Galaxian armada." border="0" data-original-height="161" data-original-width="352" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG9vFXWQCgerKt6DYLf7rFhLPmQFSSzYFJ2YnjzCXkbBmkD4pFFTGqMt1bisbhl5GN468MHZWQZjlSYOmwx2E09fUMFL7L-Y50-4u9eVgRDkK193rqoAcsQC4kz7nTXMDKGHGWshh9xOKt/s400/armada_opt.gif" title="" width="400" /></a></div>
<div>
<br /></div>
<div>
In <i>Galaxian</i>, there are 46 aliens, each 11 pixels wide and separate by 4 pixels, meaning that randomly firing at the armada will miss about a quarter of the time. Importantly, the armada is just far enough away and moving quickly enough that there is skill involved in targeting the aliens in formation. Missing too much is not necessarily fatal, as it would be in <i>Space Invaders</i>, but is frustrating and requires you to fend off more alien dives.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFwiK25lWsFREcM40USanbhyphenhyphenRCgxRjUM_zsR3mRyTE3k0O4GuzCdJ2z1SBVFORVtFMA91kDaCe8EXEnH9gfyIezcLxlK5E5ypvfpAzUDO5A-QQUk6T7U7gAxbuqaXiZABw62kJYFtHZvzk/s1600/armada_shoot_opt.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="A clilp of gameplay from Galaxian, demonstrating how it can be tricky to shoot the aliens in formation." border="0" data-original-height="253" data-original-width="245" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFwiK25lWsFREcM40USanbhyphenhyphenRCgxRjUM_zsR3mRyTE3k0O4GuzCdJ2z1SBVFORVtFMA91kDaCe8EXEnH9gfyIezcLxlK5E5ypvfpAzUDO5A-QQUk6T7U7gAxbuqaXiZABw62kJYFtHZvzk/s400/armada_shoot_opt.gif" title="" width="387" /></a></div>
<br />
<i>Cosmic Alien, </i>by contrast, pretty much offers up the armada on a platter. The aliens have the same sizes and separations as in <i>Galaxian</i>, but they're closer to the player and move more slowly, meaning that shooting them in quick succession is easy.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWR85OXYR0CyBCdQN5TlPMjtlMaTvio6WpZnqPM_QvycaavAwrcXfL11ZMSpeasbYWoTQWcSVKnsemO_0WC47hAWL0z7IeIvNGanAoQyZlV3-r9riOSf9WNEPUGjGQS033spFkkGP-HBod/s1600/carve_opt.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Sample gameplay from Cosmic Alien (1980), showing how the aliens in formation can be easily destroyed." border="0" data-original-height="249" data-original-width="193" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWR85OXYR0CyBCdQN5TlPMjtlMaTvio6WpZnqPM_QvycaavAwrcXfL11ZMSpeasbYWoTQWcSVKnsemO_0WC47hAWL0z7IeIvNGanAoQyZlV3-r9riOSf9WNEPUGjGQS033spFkkGP-HBod/s400/carve_opt.gif" title="The armada is easy pickings." width="310" /></a></div>
<br />
It's not necessarily a problem for the game to be easier (though it is), but this armada design takes away a layer of depth. Targeting the armada is no longer a skill to develop.</div>
<h2>
The Dive Patterns</h2>
<div>
At the core of the Galaxian model are these three curves;<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXLLjRnWguJTfUHS1xLw_WwECIuB-d14QUuhDiGgWE09FcPJJwnwrZuKxAdmhd1Ceu39HlyDiTV5PbDmrknDvmnxc5D_rGhYC6zkaPM0QS5MZ12FxxO8XgBxtczSN8EoGioqd8eezTFVFP/s1600/paths_only.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="The dive patterns of the three colors of aliens in Galaxian (arcade version)." border="0" data-original-height="253" data-original-width="417" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXLLjRnWguJTfUHS1xLw_WwECIuB-d14QUuhDiGgWE09FcPJJwnwrZuKxAdmhd1Ceu39HlyDiTV5PbDmrknDvmnxc5D_rGhYC6zkaPM0QS5MZ12FxxO8XgBxtczSN8EoGioqd8eezTFVFP/s1600/paths_only.gif" title="The paths of the Galaxians." /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>Galaxian</i> dive paths.</td></tr>
</tbody></table>
<br />
Each alien follows its own distinctive path across the screen, with a speed optimized for flow and challenge. If they had been much slower, the aliens would have been too easy to pick off mid-dive, and if they were much faster then targeting would depend more on luck than skill (see <i><a href="https://raisingthevgbrow.blogspot.com/2020/02/phoenix-review-elusive-splendor.html">Phoenix</a></i>). Also, the flight patterns follow simple curves that have different amounts of arc for each color of alien. Experienced players will learn to anticipate the movements of the aliens, something that gets even more fun and challenging as their numbers increase.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht3CkdzbCq_zt5QnJLUpaCW3-aS5wV0nVZnB7JvdsyRVxitqZCLAZHL0AsJ5T3dOMyhRtlUaf_CTtSEcFnoxXSbQ1OgdNpoGRFtrYkvKuGu2WQF_at6s8hP7Stjtueb7rVePrliskQYH0j/s1600/path_all.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="The dive patterns of the three colors of aliens in Cosmic Alien (arcade, 1980)." border="0" data-original-height="175" data-original-width="458" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht3CkdzbCq_zt5QnJLUpaCW3-aS5wV0nVZnB7JvdsyRVxitqZCLAZHL0AsJ5T3dOMyhRtlUaf_CTtSEcFnoxXSbQ1OgdNpoGRFtrYkvKuGu2WQF_at6s8hP7Stjtueb7rVePrliskQYH0j/s1600/path_all.gif" title="The paths of Cosmic Aliens." /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>Cosmic Alien </i>dive paths.</td></tr>
</tbody></table>
<br />
<i>Cosmic Alien</i>'s dive paths are different in significant ways, and it seems pretty clear at this point that they weren't attempting a direct clone. While the middle pattern is very similar to the blue alien's dive in <i>Galaxian</i>, the other two have clear inflection points. These inflection points appear designed to take the player off guard, particularly the third one, which mimics the middle dive pattern up until the very last second. This change is less significant for its impact on the difficulty level than it is for the flow of the game. Rather than learning to anticipate flowing movements of large groups of aliens, I found it more a matter of reflexes -- adjusting quickly to veering aliens and just generally avoiding them.<br />
<br />
Why was it better to avoid the aliens rather than target them? This brings me to the last, and I think most significant, difference between the games.<br />
<h2>
Firing Patterns</h2>
</div>
<div>
It's easy to underestimate the importance of the enemy firing patterns in shooter gameplay, especially in these early shooters when the bullets are only one or two pixels wide. To bring out these patterns in <i>Galaxian</i>, I traced the enemy bullets in a playthrough clip<i> </i>(2x speed).<br />
<i><br /></i>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG-8Ia-lvlHbSQX1o0L3ZRY7k_ImWj2i-_K18sj_GiFF-VTU0wFyD7gXtKdJfp86CPNxf3QYKS0-GQ3pWUSKcrDXVxitbNgkN-Ff4QPknTAOPvviDrO3IFX6xYQqI0v6VRBoL3D4GEZHuR/s1600/bullets_trace_opt.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="A clip of Galaxian gameplay at 2x speed with the bullets traced out. Most of the bullets move diagonally, despite being vertical sprites." border="0" data-original-height="253" data-original-width="245" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG-8Ia-lvlHbSQX1o0L3ZRY7k_ImWj2i-_K18sj_GiFF-VTU0wFyD7gXtKdJfp86CPNxf3QYKS0-GQ3pWUSKcrDXVxitbNgkN-Ff4QPknTAOPvviDrO3IFX6xYQqI0v6VRBoL3D4GEZHuR/s400/bullets_trace_opt.gif" title="" width="387" /></a></div>
<br />
There's a lot going on here that you wouldn't necessarily notice when playing. For one thing, even though the bullet sprites point downward, they actually follow diagonal paths, always veering slightly in the direction of the player. This subtle bit of artificial intelligence is just enough to make the game <b>feel</b> like it's responding to the player without them being completely aware of why.<br />
<br />
Another important thing to notice is that the bullets are spread out across the field. Aliens begin firing early in their dive pattern regardless of where the player is along the horizontal, leaving a curtain of bullets to navigate, even if you manage to avoid the alien itself. My favorite moments in <i>Galaxian</i> are when I manage to duck and weave through the middle of several curtains in a row.<br />
<br />
Finally, bullets are never fired more than about 90 pixels above the player, a distance it takes about 20 frames for the bullets to cross. This is <a href="https://raisingthevgbrow.blogspot.com/2020/05/reaction-time-and-game-design.html">just about right</a> if you're trying to give the player a fair chance to react.<br />
<br />
Contrast this to <i>Cosmic Alien</i>. I didn't bother to trace out the bullet patterns, for reasons that should be clear from the following montage:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSTO8r2XQMlrGv_Kjpw-BjUaeqFz3c3HqyP7UU8o5L8kJa-Ig5nsBfCSewackU0vXQLsw2Z9e8wYRa_2zcFYcdqnOkPyO6kk2dOhTMPuKfLr7cvxqCBJgVlHs7CHYUaipW-8OcLom9UCD6/s1600/bullet_pattern_opt.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Clips of Cosmic Alien gameplay spliced together to show the alien bullet patterns and firing behavior." border="0" data-original-height="259" data-original-width="197" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSTO8r2XQMlrGv_Kjpw-BjUaeqFz3c3HqyP7UU8o5L8kJa-Ig5nsBfCSewackU0vXQLsw2Z9e8wYRa_2zcFYcdqnOkPyO6kk2dOhTMPuKfLr7cvxqCBJgVlHs7CHYUaipW-8OcLom9UCD6/s400/bullet_pattern_opt.gif" title="" width="304" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
Here, the aliens function more like dive bombers, shooting only when they're directly over your ship. They fire multiple shots, but in such a small clump that there's no possibility of maneuvering between them. The lack of spacing between bullets removes yet another layer of depth, while the dive-bomber style of enemy fire motivates the player to avoid the action.<br />
<h2>
Difficulty curve</h2>
</div>
<div>
<i>Galaxian</i> is notable for its shallow difficulty curve. The developers were wary of creating a difficulty spike, so they left the armada size and distance to the player the same, slowly increasing the rate of dives. I think the curve is a little <b>too</b> shallow, but the design decision to avoid difficulty spikes was the more important one. Sudden changes in difficulty are not just frustrating, but also tend to reduce immersion by suddenly making the player more aware that they're playing a game. </div>
<div>
<br /></div>
<div>
<i>Cosmic</i> <i>Alien</i>'s difficulty is not so much steep as it is jagged. Every few rounds, the player moves closer to the armada in a large step.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwfTzh_6DKLYJrOE-VRcHemw462tRd0caB9YufyY8mkRNWdz0vzjv4P7t5Ii7spIqI83wrdLPQ7F0JKBxKv3u5O6atWsf8EnFiQZZhNDxKzJTSgRsXzajGMckfWyFhJ5HryweuP-TRp4Xk/s1600/stage5_opt.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Gameplay in the fifth stage of Cosmic Alien (1980), demonstrating how the developers increased the difficulty." border="0" data-original-height="247" data-original-width="193" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwfTzh_6DKLYJrOE-VRcHemw462tRd0caB9YufyY8mkRNWdz0vzjv4P7t5Ii7spIqI83wrdLPQ7F0JKBxKv3u5O6atWsf8EnFiQZZhNDxKzJTSgRsXzajGMckfWyFhJ5HryweuP-TRp4Xk/s400/stage5_opt.gif" title="" width="312" /></a></div>
<div>
<br /></div>
<div>
There are a lot of problems with this. Because the player is moving so close to the armada, there is very little space for the enemy fire, and the game becomes more about dodging the aliens themselves than their bullets. Even if this doesn't always spike the difficulty, it does cause a sudden change in the complexion of the game. </div>
<div>
<br /></div>
<div>
Also, there's no clear in-game reason why the player would keep moving closer, so the player is forcefully broken from the game world with the realization that the designer is trying to make things harder on them. Even in games as simple as <i>Galaxian</i> or <i>Cosmic Alien</i>, in-game consistency and a sort of "suspension of disbelief" can be a key factor in engaging the player.</div>
<div>
<br /></div>
<div>
But I think this also provides a good example of a more general problem in action game design. By moving the player closer to the armada, they give the player significantly less time to react to alien movements. When you design your difficulty curve to simply demand more of a player's reaction time, you limit how much and how quickly a player can improve. There is certainly <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2871325/">evidence</a> that playing more video games can improve your reaction time, but it's a slow process. </div>
<div>
<br /></div>
<div>
By contrast, games like <i>Pac-Man</i> or <i>Frogger </i>allowed players to improve through pattern recognition, a form of learning that humans are <a href="https://bigthink.com/endless-innovation/humans-are-the-worlds-best-pattern-recognition-machines-but-for-how-long">especially adept at</a>. <i>Galaga</i>, the even more successful sequel to <i>Galaxian</i>, would put greater emphasis on pattern recognition than its predecessor, and I have no doubt that this played a large role in its success.</div>
<h2>
The Big Picture</h2>
<div>
<i>Galaxian</i> is a much more nuanced game than it might appear at first glance. Developers who tried to imitate it, like Universal did with <i>Cosmic Alien</i>, would make small changes and end up with a completely different animal. Overall, I found <i>Galaxian</i> to be an entrancing experience with great staying power, while <i>Cosmic Alien</i> alternated between irritating and boring me.</div>
<div>
<br /></div>
<div>
That's not to say that all attempts to follow the Galaxian model were a failure, however. In my next shooter gallery, I'll look at some other similar games from the golden age.</div>
RetroAnalysthttp://www.blogger.com/profile/10633021712932756737noreply@blogger.com5