From 847087affbcf2fb5c18b47ae1ee7b5471fc32378 Mon Sep 17 00:00:00 2001
From: "B. Watson" <yalhcru@gmail.com>
Date: Mon, 31 May 2021 23:30:54 -0400
Subject: Semi-random ship damage

---
 DAMAGED2.DAT  | Bin 0 -> 49 bytes
 Makefile      |   5 ++++-
 convfont.c    |  16 ++++++++++++++++
 draw_lorcha.s |  22 ++++++++++++++++++++--
 taipan.c      |  19 +++++++++----------
 5 files changed, 49 insertions(+), 13 deletions(-)
 create mode 100644 DAMAGED2.DAT

diff --git a/DAMAGED2.DAT b/DAMAGED2.DAT
new file mode 100644
index 0000000..be67315
Binary files /dev/null and b/DAMAGED2.DAT differ
diff --git a/Makefile b/Makefile
index 041ab25..34ca678 100644
--- a/Makefile
+++ b/Makefile
@@ -404,7 +404,7 @@ procsizes: clean all taipan.lst
 	$(PERLF) procsizes.pl > procsizes
 	cat procsizes
 
-# These 2 are informational only, for when you're editing the ship
+# These 3 are informational only, for when you're editing the ship
 # graphics in convfont.c.
 lorcha.txt: shipshape.pl LORCHA.DAT
 	$(PERLF) shipshape.pl LORCHA.DAT > lorcha.txt
@@ -412,6 +412,9 @@ lorcha.txt: shipshape.pl LORCHA.DAT
 damaged.txt: shipshape.pl LORCHA.DAT
 	$(PERLF) shipshape.pl DAMAGED.DAT > damaged.txt
 
+damaged2.txt: shipshape.pl LORCHA.DAT
+	$(PERLF) shipshape.pl DAMAGED2.DAT > damaged2.txt
+
 # This one build the sound code as a standalone xex.
 soundtest: sounds.c
 	$(CC) -DTESTXEX -t atari -o sounds.xex sounds.c
diff --git a/convfont.c b/convfont.c
index 211eb30..f48542f 100644
--- a/convfont.c
+++ b/convfont.c
@@ -190,6 +190,18 @@ char damaged_shipshape[] = {
 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
 
+/* DAMAGED2.DAT - as above. damage_lorcha randomly picks
+	from the 2 damaged ship shapes. */
+char damaged_shipshape2[] = {
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x42, 0x4e, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x48, 0x4c, 0x56, 0x57, 0x60,
+	0x00, 0x00, 0x5e, 0x49, 0x4b, 0x57, 0x5f,
+	0x00, 0x7d, 0x7e, 0x7c, 0x7e, 0x50, 0x7f,
+	0x00, 0x46, 0xd4, 0x49, 0x4c, 0x5d, 0x47,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
 void bitswap(unsigned char *b, int lim) {
 	unsigned char j, k;
 	// fprintf(stderr, "bitswap(%x, %d)\n", b, lim);
@@ -310,5 +322,9 @@ int main(int argc, char **argv) {
 	write(i, damaged_shipshape, sizeof(damaged_shipshape));
 	close(i);
 
+	i = open("DAMAGED2.DAT", O_WRONLY | O_CREAT, 0666);
+	write(i, damaged_shipshape2, sizeof(damaged_shipshape2));
+	close(i);
+
 	return 0;
 }
diff --git a/draw_lorcha.s b/draw_lorcha.s
index 07c4afe..b08fa50 100644
--- a/draw_lorcha.s
+++ b/draw_lorcha.s
@@ -44,6 +44,10 @@ lorcha_data:
 damaged_data:
  .incbin "DAMAGED.DAT"
 
+; fully-damaged version of the lorcha, damaged_shipshape2[] in convfont.c
+damaged_data2:
+ .incbin "DAMAGED2.DAT"
+
  .ifdef CART_TARGET
   .segment "HIGHCODE"
  .else
@@ -176,7 +180,7 @@ _damage_lorcha:
 
 xrand:
  ; get random number 0-48 in X:
- lda 53770 ; RANDOM
+ lda RANDOM
  lsr
  lsr
  cmp #49
@@ -184,7 +188,15 @@ xrand:
  tax
 
 getpiece:
+ bit RANDOM
+ bpl @used2
  lda damaged_data,x
+ jmp @can_dmg
+
+@used2:
+ lda damaged_data2,x
+
+@can_dmg:
  cmp lorcha_data,x
  beq xrand ; if it's a piece that can't show damage,
                     ; ditch it and start over
@@ -204,10 +216,16 @@ calcrow:
  bcc calcrow
 
 rowdone:
- lda temp ; the piece
  ldy temp+1
+
+ lda (destptr),y
+ cmp lorcha_data,x    ; if it's already damaged,
+ bne @ret             ; leave it alone.
+
+ lda temp ; the piece
  sta (destptr),y
 
+@ret:
  rts ; end of _damage_lorcha
 
 ; a couple of utility functions for dealing with destptr:
diff --git a/taipan.c b/taipan.c
index a7518e6..7dbb0d3 100644
--- a/taipan.c
+++ b/taipan.c
@@ -1005,7 +1005,8 @@ unsigned int gunamt(void) {
 void new_ship(void) {
    unsigned long amount;
 
-   amount = gunamt() * (capacity / 50) + 1000;
+	/* TODO: check against applesoft, line 1060 */
+	amount = gunamt() * (capacity / 50) + 1000;
 
    if(cash < amount) {
       return;
@@ -3405,16 +3406,14 @@ int main(void) {
 #endif
 
 #ifdef LORCHA_TEST
+	gotox0y(0);
+	clrtoeol();
+	for(choice = 0; choice < 10; choice++) {
+		draw_lorcha(choice);
+	}
 	while(1) {
-		gotox0y(0);
-		clrtoeol();
-		for(choice = 0; choice < 10; choice++) {
-			draw_lorcha(choice);
-			sink_lorcha(choice);
-			cprintuint(PEEK(0xda));
-			cspace();
-		}
-		agetc();
+		choice = agetc() % 10;
+		damage_lorcha(choice);
 	}
 #endif
 
-- 
cgit v1.2.3