Compare commits

...

16 Commits

Author SHA1 Message Date
Pirx 8c61ce7e4d Merge pull request #145 from pkali/develop
Develop
2022-10-31 01:54:02 -04:00
Pirx eb38407868 manual_en update 2022-10-31 01:52:56 -04:00
Pirx 7d7da78fd6 manual_en update 2022-10-31 01:52:06 -04:00
Pirx 148c64f158 version, README and manual_en update 2022-10-31 01:51:20 -04:00
Pecusx 4bf6b33528 Keyboard autorepeat added #141 2022-10-30 12:51:38 +01:00
Pecusx cd70e8c1ec New (faster) ingame DLI 2022-10-29 17:40:00 +02:00
Pecusx c7aea8e3ab DLI optimization
No more WSYNC :)
2022-10-29 16:22:53 +02:00
Pecusx fe990a6668 WaitOneFrame procedure sometimes hung in NTSC
And manuals update.
2022-10-29 11:36:33 +02:00
Pecusx 6f369735c3 Final (or not :) ) PAL and NTSC music by @mikerro 2022-10-28 21:27:06 +02:00
Pecusx d462c84577 Bouncy Castle bounces Funky Bomb bug fixed #129 2022-10-27 20:33:54 +02:00
Pecusx 3ed648b01f Better music in NTSC 2022-10-26 19:15:37 +02:00
Pecusx 2aca68c41c ATRACT mode fixed. 2022-10-25 19:47:15 +02:00
Pecusx 5f5ea0a752 Credits flickering fixed! 2022-10-25 19:15:50 +02:00
Pirx 1891bcc7f1 5200 ingame dli fix 2022-10-25 09:38:01 -04:00
Pecusx 11592414a8 GameOver screen optimization and return of Tab in weapon selection :) 2022-10-25 10:03:04 +02:00
Pirx 89d6f4834b README updt 2022-10-16 23:51:42 -04:00
15 changed files with 190 additions and 75 deletions
+17 -14
View File
@@ -14,10 +14,10 @@ On the first screen, you can configure gameplay options:
* frequency of suicides :) - if for a number of turns the game has not recorded hits (tanks are constantly shooting inaccurately), after one of such misses a tank commits suicide - here you determine how long they can "shooting for the stars" :) - if only people play the optimal setting is "norm", in the case of computer-controlled players ... you choose.
* The height (and undulation) of the mountains from almost flat (NL - Kingdom of the Netherlands), to soaring and high (NP - Federal Democratic Republic of Nepal)
* the way the walls (edges of the screen) work:
* none - projectiles that flew off the screen do not return
* wrap - the screen "wraps" and projectiles that flew to the right appear on the left side (and vice versa)
* bump - the right and left walls deflect projectiles that want to fly through them
* boxy - just like bump, except that the "ceiling" also reflects projectiles
* none - projectiles that flew off the screen do not return (black color of the screen frame)
* wrap - the screen "wraps" and projectiles that flew to the right appear on the left side and vice versa (purple color of the screen frame)
* bump - the right and left walls deflect projectiles that want to fly through them (dark blue color of the screen frame)
* boxy - just like bump, except that the "ceiling" also reflects projectiles (green color of the screen frame)
* rand - at the beginning of each round, one of the above 4 ways the walls work is drawn.
During gameplay, the current mode of the walls is represented by the color of the screen frame: none - black, wrap - purple, bump - blue, boxy - green.
@@ -56,16 +56,19 @@ The status line shows which player is currently allowed to take a shot and a set
* in parentheses is the name of the active defensive weapon - if there is any activated by the player.
The keyboard controls here are simple, cursor keys or joystick: left/right - change the angle of the barrel, up/down - change the the force of the shot.
* [SPACE] or joystick button pressed briefly - firing a shot.
* [TAB] or [SELECT] - selection of offensive weapons (this option is not available directly with the joystick - you need to select Inventory).
* [I] or longer holding the joystick button - go to Inventory. It is a screen (actually two) with the same layout as the shopping menu, it also works similarly except that here you don't buy weapons, but choose one of the offensive ones to shoot or activate a defensive weapon.
* [A] or [OPTION] - go directly to the defensive weapons activation.
* [M] key - disable/enable background music.
* [S] key - disable/enable effect sounds.
* [START] - speed up some game animations.
* [O] - end the current game and jump to the Game Over screen with a summary. The summary of the results does not take into account the current round of the game, but only the rounds completed earlier. This corresponds to pressing the [ESC] key with the difference that the summary and credits are displayed.
* [START] + [OPTION] - immediately force the end of the game (Game Over), just like [O] but without confirmation.
* [ESC] - during the entire game at any time (unless the computer is playing, then sometimes you have to wait a while) you can press the [ESC] key, which allows you to abort the game and return to the beginning (of course, there is protection against accidental pressing).
| A800 | 5200 | function |
| --- | --- | --- |
| [SPACE] | [0] | or joystick button pressed briefly - firing a shot. |
| [TAB] or [SELECT] | [5] | selection of offensive weapons (this option is not available directly with the joystick - you need to select Inventory) |
| [I] | [9] | or longer holding the joystick button - go to Inventory. It is a screen (actually two) with the same layout as the shopping menu, it also works similarly except that here you don't buy weapons, but choose one of the offensive ones to shoot or activate a defensive weapon. |
| [A] or [OPTION] | [7] | go directly to the defensive weapons activation.
| [M] | [PAUSE] | disable/enable background music. |
| [S] key | [RESET] | disable/enable effect sounds. |
| [START] | N/A | speed up some game animations. |
| [O] | [3] | end the current game and jump to the Game Over screen with a summary. The summary of the results does not take into account the current round of the game, but only the rounds completed earlier. This corresponds to pressing the [ESC] key with the difference that the summary and credits are displayed. |
| [START] + [OPTION] | N/A | immediately force the end of the game (Game Over), just like [O] but without confirmation.
| [ESC] | [*] | during the entire game at any time (unless the computer is playing, then sometimes you have to wait a while) you can press the [ESC] key, which allows you to abort the game and return to the beginning (of course, there is protection against accidental pressing). |
## 5. Game mechanics - offensive weapons
+4 -4
View File
@@ -13,10 +13,10 @@ Na pierwszym ekranie możemy skonfigurować opcje rozgrywwki:
* częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania.
* wysokość (i pofałdowanie) gór od prawie płaskich (NL - Królestwo Niderlandów), do strzelistych i wysokich (NP - Federalna Demokratyczna Republika Nepalu)
* sposób działania ścian (krawędzi ekranu):
* none - pociski, które wyleciały poza ekran nie wracają
* wrap - ekran "zawija się" i pociski, które wyleciały w prawo pojawiają się z lewej strony (i odwrotnie)
* bump - prawa i lewa ściana odbijają pociski, które chcą przez nie przelecieć
* boxy - tak jak bump, tyle że "sufit" także odbija pociski
* none - pociski, które wyleciały poza ekran nie wracają (czarny kolor ramki ekranu)
* wrap - ekran "zawija się" i pociski, które wyleciały w prawo pojawiają się z lewej strony i odwrotnie (fioletowy kolor ramki ekranu)
* bump - prawa i lewa ściana odbijają pociski, które chcą przez nie przelecieć (granatowy kolor ramki ekranu)
* boxy - tak jak bump, tyle że "sufit" także odbija pociski (zielony kolor ramki ekranu)
* rand - na początku każdej rundy losowany jest jeden z 4 powyższych sposobów działania ścian
W trakcie rozgrywki aktualny sposób działania ścian reprezentowany jest przez kolor ramki ekranu: none - czarny, wrap - fioletowy, bump - niebieski, boxy - zielony.
+30 -2
View File
@@ -46,7 +46,35 @@ It never happened, but we got some encouraging comments and we are still trying
With the advent of [fujinet](https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see.
## Changes:
## Changelog:
###### Version 1.17
2022-10-31
Mostly 5200 console port and NTSC improvements.
* Updated songs from Miker do not require skipping frames on NTSC machines. Crucial for the next point.
* Bouncy Castle bouncing of Funky Bomb fixed https://github.com/pkali/scorch_src/issues/129
* 5200 version had various graphical and sound glitches. Although mostly harmless, it hurt our sense of aesthetics. First of all the flickering credits roll is all good now.
* Rare hang-ups on NTSC machines fixed
* Screen lowered down by 7 scan lines to help top status line on NTSC CRTs.
* 5200 ATTRACT mode not going away fixed
* Autorepeat added to menus what should help 5200 users with their non-centering abomination of a controller.
* DLI interrupts optimized, few cycles saved.
* 5200 keypad sort-of-works. Please refer to manual for key bindings.
###### Version 1.16
2022-10-16
The official release of our game for the Atari 5200 SuperSystem. Grab the `scorch.bin` file and burn a cart!
This is all thanks to @miker who supported us all this time of uncertainty and despair.
Cramming the game into a 32KiB cart and 16KiB RAM was a big task - it required a rewrite of the RMT player, a crazy number of size optimizations, and counting each byte.
The release is not perfect - we have a number of glitches and improvements to the 5200 controller procedures to work on, but the game is playable.
Changes:
* numerous, but not very visible
###### Version 1.14
2022-09-05
@@ -60,7 +88,7 @@ Changes:
* Bouncy Castle bounces like it should.
* Tracer and Smoke Tracer are not causing defense weapons to trigger anymore.
* In rare cases direct hit was not accounted for correctly.
* Manuals updated.
* Manuals updated. https://github.com/pkali/scorch_src/releases/tag/v1.16
###### Version 1.13
Binary file not shown.
+5 -2
View File
@@ -594,11 +594,14 @@ CreditsStart
dta d"Krzysztof 'Kaz' Ziembi",d"k"*
.ENDIF
dta d" "*
dta d"Ideas and Q",d"A"*
dta d"Ideas, help and Q",d"A"*
dta d"Bocianu, Probabilitydragon, EnderDude",d","*
dta d"Beeblebrox, KrzysRog, lopezpb, Dracon",d","*
dta d"brad-colbert, archon800, nowy80",d","*
dta d"Shaggy the Atarian, RetroBorsuk, ZP",d"H"*
.IF target = 5200
dta d"x-usr(1536), Aking, JAC!, phaero",d"n"*
.ENDIF
dta d" "*
dta d"Additional testin",d"g"*
dta d"Arek and Alex Peck",d"o"*
@@ -609,7 +612,7 @@ CreditsStart
dta d" "*
CreditsEnd
.IF target = 5200
CreditsLines=36
CreditsLines=37
.ELSE
CreditsLines=42 ; 34 in reality. add 7?
.ENDIF
+2
View File
@@ -25,6 +25,8 @@ TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor
TextForegroundColor = $0A
space = 0 ; space in screencodes
KeyRepeatSpeed = 10 ; (max 127 !!!)
;character codes for symbols (tank, parachute, etc. )
char_parachute_______ = $02
char_flag____________ = $1e
+3 -2
View File
@@ -13,9 +13,10 @@ PurchaseDL
DLPurTitleAddr
.word PurchaseTitle
.byte $50
.byte $42+$80
.byte $42
.word purchaseTextBuffer
.byte $60,$42
.byte $00+$80
.byte $50,$42
MoreUpdl
.word EmptyLine
.byte 0,$42
+4 -4
View File
@@ -117,8 +117,8 @@ dl ; MAIN game display list
.byte $70
.byte $42
.word statusBuffer
.byte $02, $02 +$80 ;DLI
.byte $10 ; 2 blank lines
.byte $02, $02
.byte $10+$80 ; 2 blank lines + DLI
.byte $4f
.word display ; 1 line
@@ -213,13 +213,13 @@ GameOverDL
.byte $70,$40
.byte $47 ; 16 gr8 lines
.word GameOverTitle
.byte $60 ; 7 lines down to match new sprite position
; .byte $60 ; 7 lines down to match new sprite position
.byte $4f ; 1 line
.word display+(40*72)
:28 .byte $0f ; 28 lines
.byte $0f+$80
.byte $4f ; 1 line
.word display+(40*32)
.word display+(40*(32-7)) ;7 lines up to match new sprite position
:30 .byte $0f ; 30 lines
.byte $0f+$80 ; 1 line
.byte $4f ; 1 line
+4 -2
View File
@@ -78,8 +78,10 @@
; WAIT
; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
?zero LDA VCOUNT
beq ?zero
bpl ?WA
cmp #$05
bcc ?zero
cmp #$70
bcc ?WA
sbc #10 ; last lines correction
?WA cmp VCOUNT
beq ?WA
+4 -2
View File
@@ -77,8 +77,10 @@
; WAIT
; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
?zero LDA VCOUNT
beq ?zero
bpl ?WA
cmp #$05
bcc ?zero
cmp #$70
bcc ?WA
sbc #10 ; last lines correction
?WA cmp VCOUNT
beq ?WA
+97 -34
View File
@@ -6,7 +6,7 @@
;Miami & Warsaw 2022
;---------------------------------------------------
.def TARGET = 800 ;5200 ; or 800
.def TARGET = 800; 5200 ; or 800
;atari800 -5200 -cart ${outputFilePath} -cart-type 4
;atari800 -run ${outputFilePath}
;---------------------------------------------------
@@ -15,7 +15,7 @@
;---------------------------------------------------
.macro build
dta d"1.16" ; number of this build (4 bytes)
dta d"1.17" ; number of this build (4 bytes)
.endm
.macro RMTSong
@@ -26,7 +26,7 @@
;---------------------------------------------------
icl 'definitions.asm'
;---------------------------------------------------
.zpvar DliColorBack .byte = $63
.zpvar xdraw .word = $64 ;variable X for plot
.zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen)
.zpvar xbyte .word
@@ -70,6 +70,7 @@
.zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling
.zpvar sfx_effect .byte
.zpvar RMT_blocked .byte
.zpvar ScrollFlag .byte
; --------------OPTIMIZATION VARIABLES--------------
.zpvar Force .word
@@ -251,6 +252,24 @@ FirstSTART
cpy #screenheight+1
bne @-
.IF TARGET = 800
lda PAL
and #%00001110
bne NoRMT_PALchange
;it is PAL here
; Change RMT to PAL version
; 5 values in RMT file
; not elegant :(
mva #$06 MODUL-6+$941
mva #$10 MODUL-6+$a43
mva #$06 MODUL-6+$b9d
mva #$04 MODUL-6+$bd2
mva #$08 MODUL-6+$e17
mva #$06 MODUL-6+$e3d
NoRMT_PALchange
.ENDIF
; RMT INIT
lda #$f0 ;initial value
sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240)
@@ -1106,7 +1125,7 @@ MakeTanksVisible
rts
.endp
;--------------------------------------------------
.proc DLIinterruptGraph
/* .proc DLIinterruptGraph
;sta dliA
;sty dliY
pha
@@ -1115,9 +1134,9 @@ MakeTanksVisible
lda dliColorsBack,y
ldy dliColorsFore
.IF TARGET = 800
nop ; necessary on 800 because DLIs take less time, jitter visible without it
nop ; necessary on 800 because DLIs take less time, jitter visible without it
nop
.ENDIF
nop
sta COLPF1
sty COLPF2
inc dliCounter
@@ -1126,6 +1145,26 @@ MakeTanksVisible
ply
pla
rti
.endp */
.proc DLIinterruptGraph
pha
lda dliColorsFore
nop
nop
nop
.IF TARGET = 800
nop ; necessary on 800 because DLIs take less time, jitter visible without it
nop
.ENDIF
sta COLPF2
lda DliColorBack
sta COLPF1
eor #$02
sta DliColorBack
pla
rti
.endp
;--------------------------------------------------
.proc DLIinterruptOptions
@@ -1149,14 +1188,14 @@ MakeTanksVisible
lda dliCounter
bne EndofPMG
lda #%00100001 ; playfield after P/M - prior=1
STA WSYNC
;STA WSYNC
sta PRIOR
bne EndOfDLI_GO
EndofPMG
cmp #1
bne ColoredLines
lda #%00100100 ; playfield before P/M
STA WSYNC
;STA WSYNC
sta PRIOR
bne EndOfDLI_GO
ColoredLines
@@ -1165,29 +1204,13 @@ ColoredLines
tay
lda GameOverColoursTable-3,y ; -2 because this is DLI nr 2 and -1 (labels line)
ldy #$0a ; text colour (brightnes)
STA WSYNC
;STA WSYNC
sta COLPF2
sty COLPF1
bne EndOfDLI_GO
CreditsScroll
lda #$00
sta COLPF2
inc CreditsVScrol
lda CreditsVScrol
cmp #32 ;not too fast
beq nextlinedisplay
:2 lsr ;not too fast
sta WSYNC
sta VSCROL
jmp EndOfDLI_GO
nextlinedisplay
lda #0
sta CreditsVScrol
sta VSCROL
adw DLCreditsAddr #40
cpw DLCreditsAddr #CreditsLastLine
bne EndOfDLI_GO
mwa #Credits DLCreditsAddr
EndOfDLI_GO
inc dliCounter
ply
@@ -1199,7 +1222,7 @@ EndOfDLI_GO
;sta dliA
pha
lda #TextBackgroundColor
sta WSYNC
;sta WSYNC
sta COLPF2
mva #TextForegroundColor COLPF3
;lda dliA
@@ -1210,6 +1233,7 @@ DLIinterruptNone
;--------------------------------------------------
.proc VBLinterrupt
mva #0 dliCounter
mva #$02 DliColorBack
lda PAL
and #%00001110
@@ -1218,12 +1242,14 @@ DLIinterruptNone
dec NTSCcounter
bne itsPAL
mva #6 NTSCcounter
bne exitVBL ; skip doing VBL things each 6 frames in Amerika, Amerika
bne SkippedIfNTSC ; skip doing VBL things each 6 frames in Amerika, Amerika
; We're all living in Amerika, Coca Cola, Wonderbra
itsPAL
; pressTimer is trigger tick counter. always 50 ticks / s
bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s
SkippedIfNTSC
bit RMT_blocked
bmi SkipRMTVBL
@@ -1243,7 +1269,37 @@ lab2
jsr RASTERMUSICTRACKER+3 ;1 play
; ------- RMT -------
SkipRMTVBL
exitVBL
bit ScrollFlag
bpl EndOfCreditsVBI
CreditsVBI
inc CreditsVScrol
lda CreditsVScrol
cmp #32 ;not too fast
beq nextlinedisplay
:2 lsr ;not too fast
sta VSCROL
jmp EndOfCreditsVBI
nextlinedisplay
lda #0
sta CreditsVScrol
sta VSCROL
clc
lda DLCreditsAddr
adc #40
sta DLCreditsAddr
bcc @+
inc DLCreditsAddr+1
@
cmp #<CreditsLastLine
bne EndOfCreditsVBI
lda DLCreditsAddr+1
cmp #>CreditsLastLine
bne EndOfCreditsVBI
; adw DLCreditsAddr #40
; cpw DLCreditsAddr #CreditsLastLine
; bne EndOfCreditsVBI
mwa #Credits DLCreditsAddr
EndOfCreditsVBI
.IF TARGET = 5200
center = 114 ;Read analog stick and make it look like a digital stick
threshold = 60
@@ -1601,6 +1657,8 @@ notpressedJoyGetKey
lda #@kbcode._ret ;Return key
getkeyend
ldx #0
stx ATRACT ; reset atract mode
mvx #sfx_keyclick sfx_effect
rts
.endp
@@ -1617,22 +1675,27 @@ getkeyend
;--------------------------------------------------
.proc WaitForKeyRelease
;--------------------------------------------------
mva #128-KeyRepeatSpeed pressTimer ; tricky
StillWait
bit pressTimer
bmi KeyReleased
lda STICK0
and #$0f
cmp #$0f
bne WaitForKeyRelease
bne StillWait
lda STRIG0
beq WaitForKeyRelease
beq StillWait
.IF TARGET = 800
lda SKSTAT
cmp #$ff
bne WaitForKeyRelease
bne StillWait
lda CONSOL
and #%00000110 ; Select and Option only
cmp #%00000110
bne WaitForKeyRelease
rts
bne StillWait
.ENDIF
KeyReleased
rts
.endp
;--------------------------------------------------
.proc IsKeyPressed ; A=0 - yes , A>0 - no
@@ -1794,7 +1857,7 @@ TankFont
org $b000
MODUL ; equ $b000 ;address of RMT module
;opt h- ;RMT module is standard Atari binary file already
ins "artwork/sfx/scorch_str6.rmt",+6 ;include music RMT module
ins "artwork/sfx/scorch_str6-NTSC.rmt",+6 ;include music RMT module
;opt h+
MODULEND
;----------------------------------------------
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+7 -5
View File
@@ -398,7 +398,7 @@ ChoosingItemForPurchase
jsr getkey
bit escFlag
spl:jmp WaitForKeyRelease ; like jsr ... : rts
cmp #@kbcode._esc ; $2c ; Tab
cmp #@kbcode._tab ; $2c ; Tab
jeq ListChange
cmp #@kbcode._left ; $06 ; cursor left
jeq ListChange
@@ -2022,6 +2022,7 @@ FinishResultDisplay
jsr GameOverResultsClear
jsr CopyFromPurchaseAndGameOver
mwa #GameOverDL dlptrs
mva #$ff ScrollFlag ; credits scroll on
lda #%00111110 ; normal screen width, DL on, P/M on
sta dmactls
lda #%00100100 ; playfield before P/M
@@ -2139,7 +2140,7 @@ MainTanksFloatingLoop
AllTanksFloatingDown
stx TankNr
lda Ytankstable,x
cmp #72 ; tank under screen - no erase
cmp #(72-7) ; tank under screen - no erase
bcs NoEraseTank
mva #1 Erase
jsr DrawTankNr
@@ -2154,9 +2155,9 @@ NoEraseTank
NotFastTank
lda Ytankstable,x
; cmp #32 ; tank over screen - not visible
cmp #80 ; tank under screen - new tank randomize
cmp #(80-7) ; tank under screen - new tank randomize
bcs TankUnderScreen
cmp #72 ; tank under screen but.... parachute
cmp #(72-7) ; tank under screen but.... parachute
bcs DrawOnlyParachute
bcc TankOnScreen
TankUnderScreen
@@ -2173,11 +2174,12 @@ FastTank
bpl AllTanksFloatingDown
jsr IsKeyPressed
bne MainTanksFloatingLoop ; neverending loop
mva #$00 ScrollFlag ; credits scroll off
jsr MakeDarkScreen
jsr GameOverResultsClear
rts
RandomizeTankPos
randomize 10 32 ; 10 not 8 - barrel !! :)
randomize 10 (32-7) ; 10 not 8 - barrel !! :)
sta Ytankstable,x
randomize 0 180
sta AngleTable,x
+13 -4
View File
@@ -1206,7 +1206,8 @@ checkJoy
and #$0f
cmp #$0f
beq notpressedJoy
tay
tay
mva #0 ATRACT ; reset atract mode
lda joyToKeyTable,y
jmp jumpFromStick
notpressedJoy
@@ -1415,9 +1416,10 @@ pressedS
pressedSpace
;=================================
;we shoot here!!!
mva #0 pressTimer ; reset
jsr WaitForKeyRelease
lda #0
sta ATRACT ; reset atract mode
sta pressTimer ; reset
jsr WaitForKeyRelease.StillWait
lda pressTimer
cmp #25 ; 1/2s
bcc fire
@@ -1895,6 +1897,13 @@ NoDefence
lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2
rts ; END !!!
BouncyCastle
; now in Y we have number of of the attacking player (TankNr) !
lda ActiveWeapon,y
; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down
cmp #ind_Funky_Bomb_____
bne @+
jsr SetFullScreenSoilRange
@
mva #sfx_shield_on sfx_effect
; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)!
mva #1 Erase