shithub: sce

Download patch

ref: c093a79fb24ccf39a7611551eca7f5293548467f
parent: 6be6bc64459a8790b1e5020d61e482d0b1d7b84d
author: qwx <qwx@sciops.net>
date: Thu Apr 22 18:00:27 EDT 2021

utils/genspr: rest of extraction process

- sceshb: extract building shadow sprite
- genall: shim global prep script

--- /dev/null
+++ b/utils/genall
@@ -1,0 +1,7 @@
+#!/bin/rc -e
+genmap 16 16 25 badlands >map1.db
+genmap 64 64 25 badlands >map2.db
+genmap 256 256 25 badlands >map3.db
+# FIXME: maps unpopulated, not installed
+# FIXME: missing other .db files
+genspr
--- /dev/null
+++ b/utils/genspr
@@ -1,0 +1,163 @@
+#!/bin/rc -e
+rfork n
+bind -a $home/p/pico /bin
+bind -a $home/p/sce/utils /bin
+
+ramfs -m /n/sce
+cp unit/^(\
+terran/scv\
+terran/control\
+terran/tccShad\
+zerg/drone\
+zerg/mutalid\
+zerg/hatchery\
+zerg/zhashad\
+thingy/tscglow\
+)^.grp /n/sce/
+pcx -9t tileset/badlands/ofire.pcx >/n/sce/ofire.bit
+cp tileset/badlands.^(wpe vr4 vx4) /n/sce/
+cp SC_Unit_Palette.pal /n/sce/
+cd /n/sce
+window -m
+
+awk -v 'pid='$pid '
+function pipe(cmd){
+	if((cmd | getline x) != 1){
+		print cmd ": aborted"
+		exit("aborted")
+	}
+	return x
+}
+function exec(cmd){
+	if(system(cmd) != 0){
+		print cmd ": aborted"
+		exit("aborted")
+	}
+}
+
+function unit17(u,	i, r, n, fi, fo, fs, gf, dim, rect, Δx, Δy){
+	n = split(units[u], a)
+	gf = u ".grp"
+	split(pipe("grp -s " palfile " " gf), dim)
+	for(i=5; i<=n; i++){
+		frm = a[i] * 17
+		for(r=0; r<17; r+=2){
+			fi = sprintf(gf ".%05d.bit", frm + r)
+			fo = sprintf(u ".%02d.%02d.bit", frm, r)
+			fs = sprintf(u ".%02d.%02d.s.bit", frm, r)
+			split(pipe("read -c 60 " fi), rect)
+			Δx = rect[2] - (dim[1] / 2 - a[1])
+			Δy = rect[3] - (dim[2] / 2 - a[2])
+			exec("scespr " fi " " fo " " Δx " " Δy)
+			exec("scesha " fi " " fs " " Δx+a[3] " " Δy+a[4] " " a[3] " " a[4])
+			if(r != 16){
+				exec("rotate -l " fi " >" tmp)
+				Δx += dim[1] - rect[2] - rect[4]
+				fo = sprintf(u ".%02d.%02d.bit", frm, 31-r)
+				fs = sprintf(u ".%02d.%02d.s.bit", frm, 31-r)
+				exec("scespr " tmp " " fo " " Δx " " Δy)
+				exec("scesha " tmp " " fs " " Δx+a[3] " " Δy+a[4] " " a[3] " " a[4])
+			}
+		}
+	}
+	exec("rm -f " tmp " " gf "*")
+}
+
+function glowspr17(u,	i, r, n, fi, fo, gf, dim, rect, Δx, Δy){
+	n = split(units[u], a)
+	gf = a[1] ".grp"
+	split(pipe("grp -sx ofire.bit " gf), dim)
+	for(i=4; i<=n; i++){
+		frm = a[i] * 17
+		for(r=0; r<17; r+=2){
+			fi = sprintf(gf ".%05d.bit", frm + r)
+			fo = sprintf(u ".%02d.%02d.g.bit", frm, r)
+			split(pipe("read -c 60 " fi), rect)
+			Δx = -(dim[1] / 2 - a[2])
+			Δy = -(dim[2] / 2 - a[3])
+			exec("crop -t " Δx " " Δy " >" fo)
+			if(r != 16){
+				fo = sprintf(u ".%02d.%02d.g.bit", frm, 31-r)
+				Δx += dim[1] - rect[2] - rect[4]
+				exec("rotate -l " fi " | crop -t " Δx " " Δy " >" fo)
+			}
+		}
+	}
+	exec("rm -f " tmp " " gf "*")
+}
+
+function build(u,	i, r, n, fi, fo, gf, dim, rect, Δx, Δy){
+	n = split(builds[u], a)
+	gf = u ".grp"
+	split(pipe("grp -s " palfile " " gf), dim)
+	for(i=3; i<=n; i++){
+		frm = a[i]
+		fi = sprintf(gf ".%05d.bit", frm)
+		fo = sprintf(u ".%02d.00.bit", i-3)
+		split(pipe("read -c 60 " fi), rect)
+		Δx = rect[2] - (dim[1] / 2 - a[1]) >= 32 ? -32 : 0
+		Δy = rect[3] - (dim[2] / 2 - a[2]) >= 32 ? -32 : 0
+		exec("scespr " fi " " fo " " Δx " " Δy)
+	}
+	exec("rm -f " tmp " " gf "*")
+}
+
+function shad(u,	i, r, n, fi, fo, gf, dim, rect, Δx, Δy){
+	n = split(builds[u], a)
+	gf = a[1] ".grp"
+	split(pipe("grp -s " palfile " " gf), dim)
+	for(i=3; i<=n; i++){
+		frm = a[i]
+		fi = sprintf(gf ".%05d.bit", frm)
+		fo = sprintf(u ".%02d.00.s.bit", i-3)
+		split(pipe("read -c 60 " fi), rect)
+		Δx = rect[2] - (dim[1] / 2 - a[1]) >= 32 ? -32 : 0
+		Δy = rect[3] - (dim[2] / 2 - a[2]) >= 32 ? -32 : 0
+		exec("sceshb " fi " " fo " " Δx " " Δy)
+	}
+	exec("rm -f " tmp " " gf "*")
+}
+
+function tiles(t, ntile){
+	exec("sctile " t)
+	print "!s", 32, ntile*32 >tmp
+	print "r = z == 0 ? 0 : Z" >>tmp
+	# first tile is empty
+	for(i=1; i<=ntile; i++){
+		printf "!r %s.%05d.bit a\n", t, i >>tmp
+		printf "r = y >= %d && y < %d ? a[x,y-%d] : r\n", 32*(i-1), 32*i, 32*(i-1) >>tmp
+	}
+	print "!w r dicks" >>tmp
+	exec("pico <" tmp)
+	exec("iconv -c r8g8b8 dicks >" t ".bit")
+	exec("rm -f dicks " tmp " " t ".[0-9]*bit")
+}
+
+BEGIN{
+	palfile = "SC_Unit_Palette.pal"
+	tmp = "derp"
+	units["scv"] = "11 11 0 7 0"
+	units["drone"] = "11 11 0 7 0 1 2 3 4"
+	units["mutalid"] = "22 22 0 42 0 1 2 3 4"
+	glows["scv"] = "tscglow 11 11 0 1 2 3 4"
+	builds["control"] = "58 41 0"
+	builds["hatchery"] = "49 32 0 1 2 3"
+	shads["control"] = "tccShad 58 41 0"
+	shads["hatchery"] = "zhashad 49 32 0"
+	for(u in units)
+		unit17(u)
+	for(u in glows)
+		glowspr17(u)
+	for(u in builds)
+		build(u)
+	for(u in shads)
+		shad(u)
+	tiles("badlands", 25)
+}
+'
+
+rm -f ofire.bit *.wpe *.vr4 *.vx4
+cp * /sys/games/lib/sce/
+
+# FIXME:
+# - testing
--- a/utils/genspr2
+++ /dev/null
@@ -1,72 +1,0 @@
-#!/bin/rc -e
-rfork n
-bind -a $home/p/pico /bin
-bind -a $home/p/sce/utils /bin
-
-awk -v 'pid='$pid '
-function pipe(cmd){
-	if((cmd | getline x) != 1){
-		print cmd ": aborted"
-		exit("aborted")
-	}
-	return x
-}
-function exec(cmd){
-	if(system(cmd) != 0){
-		print cmd ": aborted"
-		exit("aborted")
-	}
-}
-
-function unit17(u,	i, r, n, fi, fo, gf, dim, rect, Δx, Δy){
-	n = split(units[u], a)
-	gf = u ".grp"
-	split(pipe("grp -s " palfile " " gf), dim)
-	for(i=4; i<=n; i++){
-		frm = a[i] * 17;
-		for(r=0; r<17; r+=2){
-			fi = sprintf(gf ".%05d.bit", frm + r)
-			fo = sprintf(u ".%02d.%02d.bit", frm, r)
-			fs = sprintf(u ".%02d.%02d.s.bit", frm, r)
-			split(pipe("read -c 60 " fi), rect)
-			goff = -(dim[1] / 2 - a[1])
-			Δx = rect[2] + goff
-			Δy = rect[3] + goff
-			exec("scespr " fi " " fo " " Δx " " Δy);
-			if(a[2] != "-")
-				exec("sceshad " fi " " fs " " Δx+a[2] " " Δy+a[3] " " a[2] " " a[3]);
-			if(r != 16){
-				exec("rotate -l " fi " >" tmp)
-				Δx += dim[1] - rect[2] - rect[4]
-				fo = sprintf(u ".%02d.%02d.bit", frm, 31-r)
-				fs = sprintf(u ".%02d.%02d.s.bit", frm, 31-r)
-				exec("scespr " tmp " " fo " " Δx " " Δy);
-				if(a[2] != "-")
-					exec("sceshad " tmp " " fs " " Δx+a[2] " " Δy+a[3] " " a[2] " " a[3]);
-			}
-		}
-	}
-	exec("rm -f " gf ".*bit")
-}
-
-BEGIN{
-	palfile = "SC_Unit_Palette.pal"
-	tmp = "/tmp/genspr." pid
-	units["scv"] = "11 0 7 0"
-	units["drone"] = "11 0 7 0 1 2 3 4"
-	units["mutalid"] = "22 0 42 0 1 2 3 4"
-	for(u in units){
-		unit17(u)
-	}
-}
-END{
-	exec("rm -f " tmp)
-}
-'
-
-# FIXME:
-# - setup: grp files, pal, etc.; tmp workspace
-#	. ramfs + window -m for monitoring
-#	. copy to final destination on success
-# - tileset, buildings + shadows, asprite
-# - testing
--- /dev/null
+++ b/utils/sceshb
@@ -1,0 +1,20 @@
+#!/bin/rc -e
+if(! ~ $#* 4){
+	echo usage: $0 fi fo Δx Δy
+	exit usage
+}
+tmp=/tmp/sceshb.$pid
+fi=$1
+fo=$2
+Δx=$3
+Δy=$4
+
+cat <<EOF | pico
+!r $fi f
+r = z == 3 ? f[x,y,0] == 0 && f[x,y,1] == Z && f[x,y,2] == Z ? 0 : Z/2+1 : 0
+!w $tmp r
+EOF
+
+iconv -c a8r8g8b8 $tmp |\
+	crop -t $Δx $Δy >$fo
+rm $tmp