mirror of
https://github.com/pkali/scorch_src.git
synced 2026-05-20 22:34:21 +02:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3794089698 | |||
| 12eebaedec | |||
| 9e8446abe4 | |||
| 324b42855a | |||
| 81e3de877b | |||
| 2333a5d6bc | |||
| 20fd262fbd | |||
| 8980ba2ee2 | |||
| 0e699ce41a | |||
| 630c5eaa1a | |||
| ce741f05dd | |||
| a52c48bb25 | |||
| 06298c856b | |||
| 9e8187fc0d | |||
| 72c9d7952b |
+10
-13
@@ -1966,27 +1966,24 @@ NoShieldEnergy
|
||||
;=========================
|
||||
mwa Wind temp
|
||||
lda #space
|
||||
bit Wind+3 ; highest byte of 4 byte wind
|
||||
bmi DisplayLeftWind
|
||||
sta statusBuffer+80+17 ; (space) char
|
||||
lda #char_TAB ; (tab) char
|
||||
sta statusBuffer+80+20
|
||||
bne DisplayWindValue
|
||||
DisplayLeftWind
|
||||
sta statusBuffer+80+20 ; (space) char
|
||||
:4 lsrw temp ;divide by 16 to have a nice value on a screen
|
||||
lda temp
|
||||
beq DisplayWindValuex
|
||||
bit Wind+3 ; highest byte of 4 byte wind
|
||||
bmi DisplayLeftWindx
|
||||
ldx #char_TAB ; (tab) char
|
||||
stx statusBuffer+80+20
|
||||
bne DisplayWindValuex
|
||||
DisplayLeftWindx
|
||||
lda #char_DEL ;(del) char
|
||||
sta statusBuffer+80+17
|
||||
sec ; Wind = -Wind
|
||||
lda #$00
|
||||
sbc temp
|
||||
sta temp
|
||||
lda #$00
|
||||
sbc temp+1
|
||||
sta temp+1
|
||||
DisplayWindValue
|
||||
:4 lsrw temp ;divide by 16 to have a nice value on a screen
|
||||
lda temp
|
||||
;sta decimal
|
||||
DisplayWindValuex
|
||||
mwx #statusBuffer+80+18 displayposition
|
||||
jsr displaybyte
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ Scorch is a multi-player, turn-based, artillery video game. Tanks do turn-based
|
||||
|
||||
by Tomasz 'Pecus' Pecko and Pawel 'pirx' Kalinowski
|
||||
|
||||
Warsaw, Miami 2000, 2001, 2002, 2003, 2009, 2012, 2013, 2022, 2023
|
||||
Warsaw, Miami 2000, 2001, 2002, 2003, 2009, 2012, 2013, 2022, 2023, 2024
|
||||
|
||||
[Game manual in PDF (layout by Bocianu)](Manuals/scorch_manual_en.pdf)
|
||||
|
||||
@@ -35,13 +35,22 @@ Compilation: (requires mads newer than 2023-09-13)
|
||||
- `mads scorch.asm -o:scorch.bin -d:TARGET=5200` for Atari 5200 version
|
||||
- `mads scorchC64.asm -o:scorchC64.prg` for C64 version (WIP, not playable yet)
|
||||
|
||||
Update of the official Atari 8-bit cartridge from Mq:
|
||||
- boot `scorch_fl.atr` from e.g. SIO2SD, SIO2PC or a large floppy
|
||||
- insert the cartridge
|
||||
- do what the flasher application says on the screen.
|
||||
- do not despair if something goes wrong, just reboot, the reinsert cart, etc.
|
||||
- it is smoother with QMeg OS, because there you can insert the cart, turn on your Atari, jump to the QMeg menu and boot the `scorch_fl.atr` from there. No need to insert the cart to the running Atari.
|
||||
|
||||
WARNING | ADVERTENCIA |警告 | AVERTISSEMENT | चेतावनी | WARNUNG | ПРЕДУПРЕЖДЕНИЕ | UWAGA | POZOR !!!
|
||||
This is not an official cart manufacturer's (Mq) flasher, it is a collective and separate community effort. Be responsible, don't drink and flash your car(t). Better yet, do not flash it at all. In fact, to preserve the historical value of the artifact we strongly discourage from opening the game box and inserting the cartridge anywhere, especially into unauthorized orifices.
|
||||
|
||||
|
||||
Game source code is split into several parts:
|
||||
- `scorch.asm` is the main game startup code
|
||||
- `scorchC64.asm` is the main game startup code for Commodore 64
|
||||
- `game.asm` - it all happens here
|
||||
- `grafproc.asm` - graphics routines like line or circle
|
||||
- `textproc.asm` - text routines like list of weapons and shop
|
||||
- `variables.asm` - all non-zero page variables
|
||||
- `constants.asm` and `constants_top.asm` - various tables of constants
|
||||
- `ai.asm` - artificial stupidity of computer opponents
|
||||
@@ -66,6 +75,38 @@ With the advent of [fujinet](https://fujinet.online/) we are thinking about maki
|
||||
|
||||
## Changelog:
|
||||
|
||||
###### Version 1.50
|
||||
2024-03-15
|
||||
|
||||
Atari 8-bit cart flasher and bug fixes!
|
||||
|
||||
@RB5200 provided us with a very good bug reports so the new version was inevitable. Additionally, we have used [cart flasher](https://github.com/jhusak/jataricart/tree/master/various_flashers/1MBscorch) from @jhusak to prepare the .atr with flasher.
|
||||
|
||||
Fixes and changes:
|
||||
- Napalm and Hot Napalm animations were not playing.
|
||||
- Wind of force 0 and left direction was wrapping arithmetic and caused very strong left shoots.
|
||||
- Now 0 force wind has got no direction (no negative zeroes anymore!)
|
||||
- CTRL+Tab was non functional for some time, returned
|
||||
- Much nicer easter egg visualization.
|
||||
|
||||
|
||||
###### Version 1.48
|
||||
2024-03-11
|
||||
|
||||
New cart image, bugfixes and easter eggs.
|
||||
|
||||
In preparation for the festive season we have squeezed the code a bit more, fixed some buggies and added an easter egg or two :)
|
||||
|
||||
Most important changes:
|
||||
- Cyborgs prefer attacking human players again! Due to unforeseen circumstances Cyborgs were a bit shy and not as vicious as planned. Fixed.
|
||||
- A new weapon "Propaganda". In the spirit of a ["Phoney War"](https://en.wikipedia.org/wiki/Phoney_War) instead of dropping bombs we drop a bunch of leaflets. This will show them!
|
||||
- Robotanks were making suboptimal purchase decisions. Fixed.
|
||||
- Updated binary manuals.
|
||||
- ... _redacted_
|
||||
- ... _redacted for egg season_
|
||||
- A new physical cart image - you can update carts and have even more fun now!
|
||||
|
||||
|
||||
###### Version 1.43
|
||||
2023-12-07
|
||||
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
.proc talk
|
||||
; Maximum text length is 63 characters!!!
|
||||
dta d"MUERE!"^
|
||||
dta d"CON GARRA!"^
|
||||
dta d"ESTAS MUERTO!"^
|
||||
dta d"MUERE PUERCO COMUNISTA!"^
|
||||
dta d"VICTORIA!"^
|
||||
dta d"MUERE, CERDO EXTRANJERO!"^
|
||||
dta d"DUELE?!!!"^
|
||||
dta d"PERDEDOR"^
|
||||
dta d"TOMA!"^
|
||||
dta d"COMETE ESTO!"^
|
||||
dta d"ESTAS FRITO!"^
|
||||
dta d"VIVAI!"^
|
||||
dta d"ABRE!"^
|
||||
dta d"JA JA JA."^
|
||||
dta d"AVANZA!"^
|
||||
dta d"ATACA!"^
|
||||
dta d"MUERE, ESCORIA!"^
|
||||
dta d"EN TU CARA!"^
|
||||
dta d"A VOLAR!"^
|
||||
dta d"ALEGRAME EL DIA."^
|
||||
dta d"TOC, TOC."^
|
||||
; end of Propaganda :)
|
||||
dta d"DESDE EL AVERNO TE MATO..."^
|
||||
dta d"DONDE QUEDO TU SUERTE?"^
|
||||
dta d"ADIOS!."^
|
||||
dta d"QUE TE PASA?"^
|
||||
dta d"ALTO O DISPARO!"^
|
||||
dta d"VENIMOS EN PAZ - DISPARA A MATAR!"^
|
||||
dta d"AMO EL OLOR A NAPALM TAN TEMPRANO."^
|
||||
dta d"RESPETA!"^
|
||||
dta d"QUIEN DIABLOS TE CREES?"^
|
||||
dta d"CUIDADO ABAJO!"^
|
||||
dta d"CUIDADO!"^
|
||||
dta d"ADIVINA QUIEN VIENE A CENAR?"^
|
||||
dta d"FELIZ NAVIDAD."^
|
||||
dta d"ALLA VOY..."^
|
||||
dta d"CALMA, NO ES UNA BALA REAL."^
|
||||
dta d"SANGRE, DOLOR, VIOLENCIA!"^
|
||||
dta d"TOMA, MARICA!"^
|
||||
dta d"TE APLASTARE!"^
|
||||
dta d"ACABARE TU FEO TANQUE!"^
|
||||
dta d"QUE HARA ESTE BOTON?"^
|
||||
dta d"NADA PERSONAL."^
|
||||
dta d"TE ENOJARA ESTO?"^
|
||||
dta d"DEJA EN PAZ A MI HERMANA!"^
|
||||
dta d"TE PERDONARIA, PERO POR QUE?"^
|
||||
dta d"MI BOMBA ES MAS GRANDE QUE LA TUYA."^
|
||||
dta d"ME LAS PAGARAS!"^
|
||||
dta d"HASTA LA VISTA, BABY!"^
|
||||
dta d"ASI QUEDAS BAJO FUEGO."^
|
||||
dta d"NO HAY SUFICIENTE ESPACIO PARA LOS DOS."^
|
||||
dta d"ENGRASARE MI ARMA CON TU SANGRE."^
|
||||
dta d"TE ROMPERE LA CARA!"^
|
||||
dta d"MAMA ME DIJO QUE TE PEGUE!"^
|
||||
dta d"DISFRUTA EL DOLOR!"^
|
||||
dta d"NO QUE ME IBA A DOLER?"^
|
||||
;----------------------------
|
||||
dta d"DECIR ADIOS EN TAN DULCE... COMO NO"^
|
||||
dta d"UGH!"^
|
||||
dta d"AARGH!"^
|
||||
dta d"AYUDAAA!"^
|
||||
dta d"AUXILIO!!!"^
|
||||
dta d"NOO..."^
|
||||
dta d"OH!"^
|
||||
dta d"EEEH!"^
|
||||
dta d"AUCH!"^
|
||||
dta d"MALDICION!"^
|
||||
dta d"SE PUDRIO TODO."^
|
||||
dta d"OH NO!"^
|
||||
dta d"NO A MI!"^
|
||||
dta d"AY."^
|
||||
dta d"OH NO, DE NUEVO."^
|
||||
dta d"OTRO QUE MUERE EL POLVO."^
|
||||
dta d"BAIS."^
|
||||
dta d"S.O.S!"^
|
||||
dta d"ADIOS, MUNDO CRUEL."^
|
||||
dta d"GERONIMOOO!"^
|
||||
dta d"OH MAN!"^
|
||||
dta d"DOOUGH!"^
|
||||
dta d"OTRO DIA, OTRA BOMBA."^
|
||||
dta d"SE ACABO, AMIGO MIO."^
|
||||
dta d"AH, GRACIOSO."^
|
||||
dta d"TERMINA CUANDO ACABA."^
|
||||
dta d"POR QUE A MI?"^
|
||||
dta d"ECHEN PAJA!"^
|
||||
dta d"TENGO UN MAL PRESENTIMIENTO."^
|
||||
dta d"A LA M..."^
|
||||
dta d"PUM!"^
|
||||
dta d"PIN!"^
|
||||
dta d"BAM!"^
|
||||
dta d"CARAJ...!"^
|
||||
dta d"DEBI ESCUCHARTE, MAMA."^
|
||||
dta d"VOY RUMBO AL VALLE DE SOMBRAS..."^
|
||||
dta d"QUE FUE ESE RUIDO?"^
|
||||
dta d"SIEMPRE SUPE QUE HABRIA DIAS ASI."^
|
||||
dta d"ES UNO DE ESOS DIAS..."^
|
||||
dta d"VEO UNA LUZ BRILLAR..."^
|
||||
dta d"MAMA? ERES TU?"^
|
||||
dta d"ME DEJE GANAR!"^
|
||||
dta d"QUE CHIRIPASO!"^
|
||||
dta d"IGUAL, NO QUERIA GANAR."^
|
||||
dta d"-<BUU>-"^
|
||||
dta d"VAYA QUE ESTUVO CERCA!"^
|
||||
dta d"UNETE AL EJERCITO, YA!."^
|
||||
dta d"NO FUE SOLO TRABAJO, FUE POR DIVERSION!"^
|
||||
dta d"NUNCA ME GUSTO LA VIOLENCIA!"^
|
||||
dta d"PENSE QUE TE AGRADABA"^
|
||||
dta d"NOS VEMOS."^
|
||||
dta d"ESTE TIPO ES MEDIO LOCO."^
|
||||
dta d"ASI YA NO JUEGO."^
|
||||
dta d"MORIR NO ES CHEVERE."^
|
||||
dta d"ER... GRACIAS."^
|
||||
dta d"HE CAIDO EN DESGRACIA!"^
|
||||
dta d"ALO, 911?"^
|
||||
dta d"YA VALIMOS V3RG4!"^
|
||||
dta d"YA VUELVO..."^
|
||||
dta d"TE DEMANDARE!"^
|
||||
dta d"Y MIS ABOGADOS?"^
|
||||
dta d"INFELIZ!"^ ;(sanford and son)
|
||||
LEND
|
||||
NumberOfOffensiveTexts=55
|
||||
NumberOfDeffensiveTexts=62
|
||||
NumberOfPropagandaTexts=21
|
||||
VeryFunnyText=79
|
||||
.endp
|
||||
hoverFull dta d"ME C4G0 EN LA M13RD4!"^
|
||||
hoverFullEnd
|
||||
hoverEmpty dta d"UNA MAS Y NOS VAMOS"^
|
||||
hoverEmptyEnd
|
||||
@@ -1,3 +1,5 @@
|
||||
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
|
||||
|
||||
.IF *>0 ;this is a trick that prevents compiling this file alone
|
||||
|
||||
; All main procedures of the game not dependent on hardware (I hope) :)
|
||||
@@ -742,19 +744,20 @@ NotNegativeShieldEnergy
|
||||
;out: Wind (word)
|
||||
;uses: _
|
||||
;--------------------------------------------------
|
||||
lda random
|
||||
cmp MaxWind
|
||||
bcs GetRandomWind ; if more than MaxWind then randomize again
|
||||
sta Wind
|
||||
mva #$00 Wind+1
|
||||
sta Wind+2
|
||||
sta Wind+3
|
||||
@ lda random
|
||||
sta Wind
|
||||
beq noWind ; if 0 then nothing to do
|
||||
cmp MaxWind
|
||||
bcs @- ; if more than MaxWind then randomize again
|
||||
; multiply Wind by 16
|
||||
; two bytes of Wind are treated as a decimal part of vx variable
|
||||
:4 aslw Wind
|
||||
; decide the direction
|
||||
lda random
|
||||
bmi @+
|
||||
bmi noWindDirectionChange
|
||||
sec ; Wind = -Wind
|
||||
.rept 2
|
||||
lda #$00
|
||||
@@ -764,7 +767,9 @@ NotNegativeShieldEnergy
|
||||
lda #$ff
|
||||
sta Wind+2
|
||||
sta Wind+3
|
||||
@ rts
|
||||
noWind
|
||||
noWindDirectionChange
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc MaxForceCalculate
|
||||
@@ -1439,15 +1444,22 @@ FinishResultDisplay
|
||||
.ENDIF
|
||||
cmp #VuMeterTime
|
||||
bcc EndMeter
|
||||
; Let's go!
|
||||
jsr ClearTanks
|
||||
; store all angles
|
||||
ldx NumberOfPlayers
|
||||
dex
|
||||
@ lda AngleTable,x
|
||||
sta previousAngle,x
|
||||
lda #0
|
||||
sta AngleTable,x
|
||||
dex
|
||||
bpl @-
|
||||
jsr DrawTanks
|
||||
; let's go!
|
||||
Meter
|
||||
jsr ClearTanks
|
||||
mva #1 Erase
|
||||
jsr drawbarrels ; clear barrels
|
||||
ldx NumberOfPlayers
|
||||
@ txa
|
||||
and #%00000001
|
||||
@@ -1457,7 +1469,8 @@ Meter
|
||||
sta AngleTable,x
|
||||
dex
|
||||
bpl @-
|
||||
jsr drawtanks
|
||||
mva #0 Erase
|
||||
jsr drawbarrels ; draw barrels
|
||||
jsr WaitOneFrame
|
||||
jsr GetKeyFast
|
||||
cmp #@kbcode._none
|
||||
@@ -1465,6 +1478,7 @@ Meter
|
||||
; restore all angles
|
||||
jsr ClearTanks
|
||||
ldx NumberOfPlayers
|
||||
dex
|
||||
@ lda previousAngle,x
|
||||
sta AngleTable,x
|
||||
dex
|
||||
@@ -1481,6 +1495,24 @@ EndMeterAndReset
|
||||
.ENDIF
|
||||
EndMeter
|
||||
rts
|
||||
;-----------
|
||||
drawbarrels
|
||||
lda TankNr
|
||||
pha
|
||||
ldx NumberOfPlayers
|
||||
dex
|
||||
stx TankNr
|
||||
DrawNextTank
|
||||
lda eXistenZ,x
|
||||
beq nobarrel ; if energy=0 then no tank
|
||||
jsr drawtanknr.BarrelChange
|
||||
nobarrel
|
||||
dec TankNr
|
||||
ldx TankNr
|
||||
bpl DrawNextTank
|
||||
pla
|
||||
sta TankNr
|
||||
rts
|
||||
.endp
|
||||
.ENDIF
|
||||
|
||||
|
||||
+3
-3
@@ -25,7 +25,7 @@
|
||||
.ENDIF
|
||||
;---------------------------------------------------
|
||||
.ifndef SPLASH
|
||||
.def SPLASH = 0 ; if 0 - no splash screens
|
||||
.def SPLASH = 0 ; if 0 - no splash screens
|
||||
.endif
|
||||
.ifndef CART_VERSION
|
||||
.def CART_VERSION = 0 ; if 1 - dual splash screen
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
;---------------------------------------------------
|
||||
.macro build
|
||||
dta d"1.48" ; number of this build (4 bytes)
|
||||
dta d"S.50" ; number of this build (4 bytes)
|
||||
.endm
|
||||
|
||||
.macro RMTSong
|
||||
@@ -534,7 +534,7 @@ noingame
|
||||
;----------------------------------------------
|
||||
icl 'ai.asm'
|
||||
;----------------------------------------------
|
||||
icl 'artwork/talk.asm'
|
||||
icl 'artwork/scorch-spanish-talk.asm'
|
||||
;----------------------------------------------
|
||||
TankFont
|
||||
ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
+1
-1
@@ -25,7 +25,7 @@
|
||||
|
||||
;---------------------------------------------------
|
||||
.macro build
|
||||
dta d"1.48" ; number of this build (4 bytes)
|
||||
dta d"1.50" ; number of this build (4 bytes)
|
||||
.endm
|
||||
|
||||
.macro RMTSong
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+16
-36
@@ -261,6 +261,7 @@ RepeatNapalm ; external loop (for fire animation)
|
||||
mwa xcircle xdraw
|
||||
sbw xdraw #(napalmRadius) ; 10 pixels on left side hit point
|
||||
ldy #0
|
||||
sty Erase ; becouse Erase flag is set!
|
||||
sty magic+1
|
||||
RepeatFlame ; internal loop (draw flames)
|
||||
ldy #0
|
||||
@@ -1247,19 +1248,9 @@ DeadTank
|
||||
|
||||
ldx TankNr
|
||||
|
||||
;Checking the maximal force
|
||||
lda MaxForceTableH,x
|
||||
cmp ForceTableH,x
|
||||
bne ContinueToCheckMaxForce2
|
||||
lda MaxForceTableL,x
|
||||
cmp ForceTableL,x
|
||||
ContinueToCheckMaxForce2
|
||||
bcs @+
|
||||
lda MaxForceTableH,x
|
||||
sta ForceTableH,x
|
||||
lda MaxForceTableL,x
|
||||
sta ForceTableL,x
|
||||
@
|
||||
;Check and set the maximal force
|
||||
jsr RandomizeForce.LimitForce ; only limit (no randomize)
|
||||
|
||||
jsr PutTankNameOnScreen
|
||||
; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen
|
||||
|
||||
@@ -1271,13 +1262,8 @@ ContinueToCheckMaxForce2
|
||||
bpl @+
|
||||
jsr Shoot.AfterOffensiveText ; Lazy Darwin - aiming visualisation
|
||||
@
|
||||
;keyboard reading
|
||||
; KBCODE keeps code of last keybi
|
||||
; SKSTAT $ff - nothing pressed
|
||||
; $FB - any key
|
||||
; $f7 - shift
|
||||
; $f3 - shift+key
|
||||
.IF VU_METER = 1
|
||||
; VU meter timer reset
|
||||
jsr VUMeter.EndMeterAndReset
|
||||
.ENDIF
|
||||
notpressed
|
||||
@@ -1286,6 +1272,12 @@ notpressed
|
||||
.IF VU_METER = 1
|
||||
jsr VUMeter
|
||||
.ENDIF
|
||||
;keyboard reading
|
||||
; KBCODE keeps code of last keybi
|
||||
; SKSTAT $ff - nothing pressed
|
||||
; $FB - any key
|
||||
; $f7 - shift
|
||||
; $f3 - shift+key
|
||||
ldx TankNr ; for optimize
|
||||
jsr GetKeyFast
|
||||
mvy #00 EscFlag ; prevent for set EscFalg in GetKey! we checking this in CheckExitKeys!
|
||||
@@ -1328,12 +1320,13 @@ NoSpyHard
|
||||
mva #0 escFlag
|
||||
jmp ReleaseAndLoop
|
||||
@
|
||||
/*o cmp #$80|@kbcode._up
|
||||
/* cmp #$80|@kbcode._up
|
||||
jeq CTRLPressedUp
|
||||
cmp #$80|@kbcode._down
|
||||
jeq CTRLPressedDown
|
||||
jeq CTRLPressedDown */
|
||||
|
||||
cmp #$80|@kbcode._tab
|
||||
jeq CTRLPressedTAB */
|
||||
jeq CTRLPressedTAB
|
||||
|
||||
jumpFromStick
|
||||
.IF TARGET = 800
|
||||
@@ -1399,20 +1392,7 @@ pressedUp
|
||||
CheckingMaxForce
|
||||
|
||||
mva #sfx_set_power_1 sfx_effect
|
||||
|
||||
lda MaxForceTableH,x
|
||||
cmp ForceTableH,x
|
||||
bne FurtherCheckMaxForce
|
||||
lda MaxForceTableL,x
|
||||
cmp ForceTableL,x
|
||||
FurtherCheckMaxForce
|
||||
jcs BeforeFire
|
||||
|
||||
lda MaxForceTableH,x
|
||||
sta ForceTableH,x
|
||||
lda MaxForceTableL,x
|
||||
sta ForceTableL,x
|
||||
|
||||
; checking is at the beginning of the procedure !!
|
||||
jmp BeforeFire
|
||||
|
||||
CTRLPressedUp
|
||||
|
||||
Reference in New Issue
Block a user