shithub: patch

Download patch

ref: 02341a2305a07f7551c52464ed0da810bf9942e4
parent: 77536ac40b44c210f01141a3722104550a937cbe
author: qwx <qwx@sciops.net>
date: Sat Mar 1 21:24:53 EST 2025

remove stuff now in fork repo

--- a/doom-chat
+++ /dev/null
@@ -1,38 +1,0 @@
-diff d5938c597328adb8abb8785b4ac820ca0f094b6b uncommitted
---- a/sys/src/games/doom/hu_lib.c
-+++ b/sys/src/games/doom/hu_lib.c
-@@ -320,7 +320,7 @@
-   unsigned char ch )
- {
- 
--    if (ch >= ' ' && ch <= '_') 
-+    if (ch >= ' ' && ch < '~') 
-   	HUlib_addCharToTextLine(&it->l, (char) ch);
-     else 
- 	if (ch == KEY_BACKSPACE) 
---- a/sys/src/games/doom/hu_stuff.c
-+++ b/sys/src/games/doom/hu_stuff.c
-@@ -535,10 +535,10 @@
- 	return false;
-         }
-         /* no break */
--    case ev_char:
--        break;
-     default:
-         return false;
-+    case ev_char:
-+        break;
-     }
- 
-     if (!chat_on)
---- a/sys/src/games/doom/i_video.c
-+++ b/sys/src/games/doom/i_video.c
-@@ -290,7 +290,7 @@
- 		case 'c':
- 			chartorune(&r, buf+1);
- 			if(r){
--				e.data1 = r;
-+				e.data1 = runetokey(r);
- 				e.type = ev_char;
- 				D_PostEvent(&e);
- 			}
--- a/doom-iwad
+++ /dev/null
@@ -1,35 +1,0 @@
-diff d5938c597328adb8abb8785b4ac820ca0f094b6b uncommitted
---- a/sys/src/games/doom/d_main.c
-+++ b/sys/src/games/doom/d_main.c
-@@ -578,6 +578,7 @@
- //
- void IdentifyVersion (void)
- {
-+	int p;
- 	char *wadfile, *slash;
- 
- 	if (M_CheckParm ("-shdev"))
-@@ -623,7 +624,22 @@
- */
- 	}
- 
--	if ( (wadfile = I_IdentifyWAD("doom2f.wad")) ) {
-+	p = M_CheckParm ("-iwad");
-+    if (p && p < myargc-1 && (wadfile = I_IdentifyWAD(myargv[p+1])) )
-+    {
-+ 		p = M_CheckParm ("-gamemode");
-+ 		gamemode = commercial;
-+		if (p && p < myargc-1)
-+		{
-+			if (!strcmp(myargv[p+1], "ultimate"))
-+				gamemode = retail;
-+			else if (!strcmp(myargv[p+1], "registered"))
-+				gamemode = registered;
-+			else if (!strcmp(myargv[p+1], "shareware"))
-+				gamemode = shareware;
-+		}
-+		D_AddFile (wadfile);
-+    } else if ( (wadfile = I_IdentifyWAD("doom2f.wad")) ) {
- 		gamemode = commercial;
- 		// C'est ridicule!
- 		// Let's handle languages in config files, okay?
--- a/doom-mousegrab
+++ /dev/null
@@ -1,32 +1,0 @@
-doom: re-center mouse more often to limit it escaping
-
-when a mouse motion reaches grabout's limits without crossing them, a following
-event in which the mouse passes the remaining distance between grabout and the
-window's limits will have the mouse jump out of the window.
-this happens too frequently on terminals with a good drawing speed.
-
-to reduce this, make grabout smaller, so that the distance to cross in one
-event is larger. Dx(screen->r)/4 is sufficient for the terminals i have tested
-this on.
-
-diff d5938c597328adb8abb8785b4ac820ca0f094b6b uncommitted
---- a/sys/src/games/doom/i_video.c
-+++ b/sys/src/games/doom/i_video.c
-@@ -44,7 +44,7 @@
- 	draw(screen, screen->r, display->black, nil, ZP);
- 
- 	center = addpt(screen->r.min, Pt(Dx(screen->r)/2, Dy(screen->r)/2));
--	grabout = insetrect(screen->r, Dx(screen->r)/8);
-+	grabout = insetrect(screen->r, Dx(screen->r)/4);
- 
- 	kbdpid = proccreate(kbdproc, nil, 4096);
- 	mousepid = proccreate(mouseproc, nil, 4096);
-@@ -152,7 +152,7 @@
- 		draw(screen, screen->r, display->black, nil, ZP);
- 
- 		center = addpt(screen->r.min, Pt(Dx(screen->r)/2, Dy(screen->r)/2));
--		grabout = insetrect(screen->r, Dx(screen->r)/8);
-+		grabout = insetrect(screen->r, Dx(screen->r)/4);
- 	}
- 
- 	if(conv == nil){
--- a/doom-skywallhit
+++ /dev/null
@@ -1,76 +1,0 @@
-bullet puffs and plasma splashes don't spawn, and rockets don't explode,
-when fired against a linedef bridging two sectors of differing heights but
-with a sky texture. example: ultimate doom e4m6: fire at the green
-structure surrounded by a moat of lava outside, or at the moat's walls.
-the "sky hack" is meant to show the sky (in this particular configuration)
-rather than a texture, and to make projectiles disappear when fired at this
-"sky". however, the check for the wall's attributes and the projectiles
-coordinates is wrong.
-this patches fixes that. however, it affects gameplay, and as such, demos
-will desync anytime this mechanism is encountered. it is therefore turned
-off by default.
-not sure if this should be merged.
-TODO: better explanation, more testing
-
-diff -Naur a/sys/src/games/doom/d_main.c b/sys/src/games/doom/d_main.c
---- a/sys/src/games/doom/d_main.c	Sun Aug  2 19:57:59 2015
-+++ b/sys/src/games/doom/d_main.c	Fri Aug 21 15:09:01 2015
-@@ -94,6 +94,8 @@
- boolean		noztele;
- boolean		nobounce;
- 
-+/* demo breaking bug fixes */
-+boolean		noskyabs;
- 
- //extern int soundVolume;
- //extern  int	sfxVolume;
-@@ -743,6 +745,8 @@
- 	noztele = 1;
-     if (M_CheckParm ("-nobounce") && (gamemode == commercial || gamemode == registered))
- 	nobounce = 1;
-+    if (M_CheckParm ("-noskyabs"))
-+	noskyabs = 1;
-     if (M_CheckParm ("-altdeath"))
- 	deathmatch = 2;
-     else if (M_CheckParm ("-deathmatch"))
-diff -Naur a/sys/src/games/doom/p_local.h b/sys/src/games/doom/p_local.h
---- a/sys/src/games/doom/p_local.h	Sun Aug  2 19:57:59 2015
-+++ b/sys/src/games/doom/p_local.h	Fri Aug 21 15:05:02 2015
-@@ -62,6 +62,7 @@
- 
- extern	boolean	noztele;
- extern	boolean	nobounce;
-+extern	boolean noskyabs;
- 
- 
- //
-diff -Naur a/sys/src/games/doom/p_map.c b/sys/src/games/doom/p_map.c
---- a/sys/src/games/doom/p_map.c	Mon Jul 27 20:08:20 2015
-+++ b/sys/src/games/doom/p_map.c	Fri Aug 21 15:10:30 2015
-@@ -958,7 +958,8 @@
- 		return false;
- 	    
- 	    // it's a sky hack wall
--	    if	(li->backsector && li->backsector->ceilingpic == skyflatnum)
-+	    if (li->backsector != nil && li->backsector->ceilingpic == skyflatnum
-+	    && (!noskyabs || z > li->backsector->ceilingheight))
- 		return false;		
- 	}
- 
-diff -Naur a/sys/src/games/doom/p_mobj.c b/sys/src/games/doom/p_mobj.c
---- a/sys/src/games/doom/p_mobj.c	Sun Aug  2 19:57:59 2015
-+++ b/sys/src/games/doom/p_mobj.c	Fri Aug 21 15:03:11 2015
-@@ -173,9 +173,10 @@
- 	    else if (mo->flags & MF_MISSILE)
- 	    {
- 		// explode a missile
--		if (ceilingline &&
--		    ceilingline->backsector &&
--		    ceilingline->backsector->ceilingpic == skyflatnum)
-+		if (ceilingline != nil &&
-+		    ceilingline->backsector != nil &&
-+		    ceilingline->backsector->ceilingpic == skyflatnum &&
-+		    (!noskyabs || mo->z > ceilingline->backsector->ceilingheight))
- 		{
- 		    // Hack to prevent missiles exploding
- 		    // against the sky.
--- a/doom-spy
+++ /dev/null
@@ -1,57 +1,0 @@
-diff -Naur a/sys/src/games/doom/g_game.c b/sys/src/games/doom/g_game.c
---- a/sys/src/games/doom/g_game.c	Mon Aug 31 01:13:18 2015
-+++ b/sys/src/games/doom/g_game.c	Wed Sep 16 08:16:55 2015
-@@ -510,6 +510,9 @@
- 	    displayplayer++; 
- 	    if (displayplayer == MAXPLAYERS) 
- 		displayplayer = 0; 
-+		/* FIXME */
-+		extern player_t *plyr;
-+		plyr = &players[displayplayer];
- 	} while (!playeringame[displayplayer] && displayplayer != consoleplayer); 
- 	return true; 
-     }
-diff -Naur a/sys/src/games/doom/s_sound.c b/sys/src/games/doom/s_sound.c
---- a/sys/src/games/doom/s_sound.c	Sun Jul 29 23:01:33 2012
-+++ b/sys/src/games/doom/s_sound.c	Wed Sep 16 08:16:08 2015
-@@ -38,6 +38,7 @@
- 
- #include "doomstat.h"
- 
-+extern player_t *plyr;
- 
- // Purpose?
- const char snd_prefixen[]
-@@ -281,16 +282,16 @@
- 
-   // Check to see if it is audible,
-   //  and if not, modify the params
--  if (origin && origin != players[consoleplayer].mo)
-+  if (origin && origin != plyr->mo)
-   {
--    rc = S_AdjustSoundParams(players[consoleplayer].mo,
-+    rc = S_AdjustSoundParams(plyr->mo,
- 			     origin,
- 			     &volume,
- 			     &sep,
- 			     &pitch);
- 	
--    if ( origin->x == players[consoleplayer].mo->x
--	 && origin->y == players[consoleplayer].mo->y)
-+    if ( origin->x == plyr->mo->x
-+	 && origin->y == plyr->mo->y)
-     {	
-       sep = NORM_SEP;
-     }
-diff -Naur a/sys/src/games/doom/st_stuff.c b/sys/src/games/doom/st_stuff.c
---- a/sys/src/games/doom/st_stuff.c	Mon Aug 17 23:00:05 2015
-+++ b/sys/src/games/doom/st_stuff.c	Wed Sep 16 08:14:48 2015
-@@ -264,7 +264,7 @@
- 
- 	    
- // main player in game
--static player_t*	plyr; 
-+player_t*	plyr; 
- 
- // ST_Start() has just been called
- static boolean		st_firsttime;
--- a/doom-udpip
+++ /dev/null
@@ -1,462 +1,0 @@
-diff 790a516884e45ee2a3a11b915f5e125a0ccb02ca uncommitted
---- a/sys/src/games/doom/i_net.c
-+++ b/sys/src/games/doom/i_net.c
-@@ -20,142 +20,296 @@
- //
- //-----------------------------------------------------------------------------
- 
--static const char
--rcsid[] = "$Id: m_bbox.c,v 1.1 1997/02/03 22:45:10 b1 Exp $";
--
- #include "doomdef.h"
- #include "doomstat.h"
--
--// #include "i_system.h"
--// #include "d_event.h"
--#include "d_net.h"
-+#include <bio.h>
-+#include <ndb.h>
-+#include <ip.h>
-+#include <thread.h>
- #include "m_argv.h"
--
-+#include "i_system.h"
-+#include "d_net.h"
- #include "i_net.h"
-+#include "w_wad.h"
- 
-+typedef struct Addr Addr;
- 
--//
--// I_InitNetwork
--//
--void I_InitNetwork (void)
-+enum{
-+	HDRSZ = 16+16+16+2+2	/* sizeof Udphdr w/o padding */
-+};
-+
-+static char lsrv[6] = "666";
-+
-+struct Addr{
-+	Udphdr h;
-+	char srv[6];	/* convenience */
-+	int ready;	/* is connected to udp!*!lsrv */
-+	long called;
-+};
-+static Addr raddr[MAXNETNODES];
-+
-+static int ucfd;
-+static int udfd;
-+static int upfd[2];
-+static int upid;
-+
-+
-+static void
-+conreq(doomdata_t *d)
- {
--printf("PORTME i_net.c I_InitNetwork (use 9P)\n");
-+	int fd;
-+	long t;
-+	char ip[64];
-+	Addr *p;
- 
--	doomcom = malloc (sizeof(*doomcom));
--	memset (doomcom, 0, sizeof(*doomcom));
-+	p = &raddr[doomcom->remotenode];
- 
--	/* set up for network */
--	doomcom->ticdup = 1;
--	doomcom->extratics = 0;
-+	t = time(nil);
-+	if(t - p->called < 1)
-+		return;
- 
--//	netsend = PacketSend;
--//	netget = PacketGet;
--//	netgame = true;
-+	snprint(ip, sizeof ip, "%I", p->h.raddr);
-+	if((fd = dial(netmkaddr(ip, "udp", p->srv), lsrv, nil, nil)) < 0)
-+		sysfatal("dial: %r");
-+	if(write(fd, d, doomcom->datalength) != doomcom->datalength)
-+		sysfatal("conreq: %r");
-+	close(fd);
-+	p->called = t;
-+}
- 
--	/* parse player number and host list */
--//	doomcom->consoleplayer = myargv[i+1][0]-'1';
-+static void
-+dsend(void)
-+{
-+	int i;
-+	uchar buf[HDRSZ+sizeof(doomdata_t)];
-+	doomdata_t d;
- 
--	doomcom->numnodes = 1;	// this node for sure
-+	hnputl(&d.checksum, netbuffer->checksum);
-+	d.player = netbuffer->player;
-+	d.retransmitfrom = netbuffer->retransmitfrom;
-+	d.starttic = netbuffer->starttic;
-+	d.numtics = netbuffer->numtics;
- 
--	doomcom->id = DOOMCOM_ID;
--	doomcom->numplayers = doomcom->numnodes;
-+	for(i = 0; i < netbuffer->numtics; i++){
-+		d.cmds[i].forwardmove = netbuffer->cmds[i].forwardmove;
-+		d.cmds[i].sidemove = netbuffer->cmds[i].sidemove;
-+		hnputs(&d.cmds[i].angleturn, netbuffer->cmds[i].angleturn);
-+		hnputs(&d.cmds[i].consistancy, netbuffer->cmds[i].consistancy);
-+		d.cmds[i].chatchar = netbuffer->cmds[i].chatchar;
-+		d.cmds[i].buttons = netbuffer->cmds[i].buttons;
-+	}
- 
--/*
--    boolean		trueval = true;
--    int			i;
--    int			p;
--    struct hostent*	hostentry;	// host information entry
--	
--    doomcom = malloc (sizeof (*doomcom) );
--    memset (doomcom, 0, sizeof(*doomcom) );
--    
--    // set up for network
--    i = M_CheckParm ("-dup");
--    if (i && i< myargc-1)
--    {
--	doomcom->ticdup = myargv[i+1][0]-'0';
--	if (doomcom->ticdup < 1)
--	    doomcom->ticdup = 1;
--	if (doomcom->ticdup > 9)
--	    doomcom->ticdup = 9;
--    }
--    else
--	doomcom-> ticdup = 1;
--	
--    if (M_CheckParm ("-extratic"))
--	doomcom-> extratics = 1;
--    else
--	doomcom-> extratics = 0;
--		
--    p = M_CheckParm ("-port");
--    if (p && p<myargc-1)
--    {
--	DOOMPORT = atoi (myargv[p+1]);
--	printf ("using alternate port %i\n",DOOMPORT);
--    }
--    
--    // parse network game options,
--    //  -net <consoleplayer> <host> <host> ...
--    i = M_CheckParm ("-net");
--    if (!i)
--    {
--	// single player game
--	netgame = false;
--	doomcom->id = DOOMCOM_ID;
--	doomcom->numplayers = doomcom->numnodes = 1;
--	doomcom->deathmatch = false;
--	doomcom->consoleplayer = 0;
--	return;
--    }
-+	if(!raddr[doomcom->remotenode].ready){
-+		conreq(&d);
-+		return;
-+	}
-+	memcpy(buf, &raddr[doomcom->remotenode].h, HDRSZ);
-+	memcpy(buf+HDRSZ, &d, sizeof d);
- 
--    netsend = PacketSend;
--    netget = PacketGet;
--    netgame = true;
-+	i = doomcom->datalength + HDRSZ;
-+	if(write(udfd, buf, i) != i)
-+		sysfatal("dsend: %r");
-+}
- 
--    // parse player number and host list
--    doomcom->consoleplayer = myargv[i+1][0]-'1';
-+static void
-+drecv(void)
-+{
-+	int n;
-+	ushort i;
-+	doomdata_t d;
- 
--    doomcom->numnodes = 1;	// this node for sure
--	
--    i++;
--    while (++i < myargc && myargv[i][0] != '-')
--    {
--	sendaddress[doomcom->numnodes].sin_family = AF_INET;
--	sendaddress[doomcom->numnodes].sin_port = htons(DOOMPORT);
--	if (myargv[i][0] == '.')
--	{
--	    sendaddress[doomcom->numnodes].sin_addr.s_addr 
--		= inet_addr (myargv[i]+1);
-+	if(filelength(upfd[1]) < 1){
-+		doomcom->remotenode = -1;
-+		return;
- 	}
--	else
--	{
--	    hostentry = gethostbyname (myargv[i]);
--	    if (!hostentry)
--		I_Error ("gethostbyname: couldn't find %s", myargv[i]);
--	    sendaddress[doomcom->numnodes].sin_addr.s_addr 
--		= *(int *)hostentry->h_addr_list[0];
-+	if((n = read(upfd[1], &d, sizeof d)) <= 0
-+	|| read(upfd[1], &i, sizeof i) <= 0)
-+		sysfatal("drecv: %r");
-+
-+	doomcom->remotenode = i;
-+	doomcom->datalength = n;
-+
-+	/* FIXME: proper read/write from/to struct */
-+	netbuffer->checksum = nhgetl(&d.checksum);
-+	netbuffer->player = d.player;
-+	netbuffer->retransmitfrom = d.retransmitfrom;
-+	netbuffer->starttic = d.starttic;
-+	netbuffer->numtics = d.numtics;
-+	for(i = 0; i < netbuffer->numtics; i++){
-+		netbuffer->cmds[i].forwardmove = d.cmds[i].forwardmove;
-+		netbuffer->cmds[i].sidemove = d.cmds[i].sidemove;
-+		netbuffer->cmds[i].angleturn = nhgets(&d.cmds[i].angleturn);
-+		netbuffer->cmds[i].consistancy = nhgets(&d.cmds[i].consistancy);
-+		netbuffer->cmds[i].chatchar = d.cmds[i].chatchar;
-+		netbuffer->cmds[i].buttons = d.cmds[i].buttons;
- 	}
--	doomcom->numnodes++;
--    }
--	
--    doomcom->id = DOOMCOM_ID;
--    doomcom->numplayers = doomcom->numnodes;
--*/
- }
- 
-+static void
-+uproc(void*)
-+{
-+	int n;
-+	ushort i;
-+	uchar buf[HDRSZ+sizeof(doomdata_t)];
-+	Udphdr h;
- 
--void I_NetCmd (void)
-+	upid = getpid();
-+	for(;;){
-+		if((n = read(udfd, buf, sizeof buf)) <= 0)
-+			break;
-+		memcpy(&h, buf, HDRSZ);
-+
-+		for(i = 0; i < doomcom->numnodes; i++)
-+			if(equivip6(h.raddr, raddr[i].h.raddr)
-+			&& nhgets(h.rport) == nhgets(raddr[i].h.rport))
-+				break;
-+		if(i == doomcom->numnodes)
-+			continue;	/* ignore messages from strangers */
-+		if(!raddr[i].ready){	/* FIXME: urgh */
-+			raddr[i].ready++;
-+			memcpy(&raddr[i].h, &h, sizeof h);
-+		}
-+
-+		if(write(upfd[0], buf+HDRSZ, n - HDRSZ) != n - HDRSZ
-+		|| write(upfd[0], &i, sizeof i) != sizeof i)
-+			break;
-+	}
-+}
-+
-+void
-+I_NetCmd(void)
- {
--/*
--    if (doomcom->command == CMD_SEND)
--    {
--	netsend ();
--    }
--    else if (doomcom->command == CMD_GET)
--    {
--	netget ();
--    }
--    else
--	I_Error ("Bad net cmd: %i\n",doomcom->command);
--*/
-+	if(doomcom->command == CMD_SEND)
-+		dsend();
-+	else if(doomcom->command == CMD_GET)
-+		drecv();
-+	else
-+		I_Error("invalid netcmd %d", doomcom->command);
-+}
-+
-+void
-+I_ShutdownNet(void)
-+{
-+	postnote(PNPROC, upid, "shutdown");
-+	close(upfd[0]);
-+	close(upfd[1]);
-+	close(udfd);
-+	close(ucfd);
-+}
-+
-+static void
-+initudp(void)
-+{
-+	char data[64], adir[40];
-+
-+	/* FIXME */
-+	//if(myipaddr(raddr[0].h.raddr, nil) < 0)
-+	//	sysfatal("myipaddr: %r");
-+
-+	if((ucfd = announce(netmkaddr("*", "udp", lsrv), adir)) < 0)
-+		sysfatal("announce: %r");
-+	if(fprint(ucfd, "headers") < 0)
-+		sysfatal("failed to set headers mode: %r");
-+	snprint(data, sizeof data, "%s/data", adir);
-+	if((udfd = open(data, ORDWR)) < 0)
-+		sysfatal("open: %r");
-+
-+	if(pipe(upfd) < 0)
-+		sysfatal("pipe: %r");
-+	if(procrfork(uproc, nil, mainstacksize, RFFDG) < 0)
-+		sysfatal("procrfork: %r");
-+}
-+
-+static void
-+csip(char *s, Addr *a)	/* raddr!rsrv */
-+{
-+	int fd, n;
-+	char buf[128], *f[3];
-+
-+	/* FIXME: get netmnt... */
-+
-+	if((fd = open("/net/cs", ORDWR)) < 0)
-+		sysfatal("open: %r");
-+
-+	snprint(buf, sizeof buf, "udp!%s", s);
-+	n = strlen(buf);
-+	if(write(fd, buf, n) != n)
-+		sysfatal("translating %s: %r", s);
-+
-+	seek(fd, 0, 0);
-+	if((n = read(fd, buf, sizeof(buf)-1)) <= 0)
-+		sysfatal("reading cs tables: %r");
-+	buf[n] = 0;
-+	close(fd);
-+
-+	if(getfields(buf, f, 3, 1, " !") < 2)
-+		sysfatal("bad cs entry %s", buf);
-+
-+	if(parseip(a->h.raddr, f[1]) < 0)
-+		sysfatal("parseip: %r");
-+	hnputs(a->h.rport, atoi(f[2]));	/* FIXME */
-+	strncpy(a->srv, f[2], sizeof(a->srv)-1);
-+}
-+
-+static int
-+netopts(void)
-+{
-+	int i;
-+
-+	if((i = M_CheckParm("-dup")) && i < myargc - 1){
-+		doomcom->ticdup = myargv[i+1][0] - '0';
-+		if(doomcom->ticdup < 1)
-+			doomcom->ticdup = 1;
-+		if(doomcom->ticdup > 9)
-+			doomcom->ticdup = 9;
-+	}
-+
-+	if(M_CheckParm("-extratic"))
-+		doomcom->extratics = 1;
-+
-+	if((i = M_CheckParm("-srv")) && i < myargc - 1)
-+		strncpy(lsrv, myargv[i+1], sizeof(lsrv)-1);
-+
-+	/* [0-3], default 0; player 0 is special */
-+	if((i = M_CheckParm("-pn")) && i < myargc - 1)
-+		doomcom->consoleplayer = myargv[i+1][0] - '0';
-+
-+	/* FIXME: d_net.c: don't use remoteaddr=0 as special case (max+1?) */
-+	/* remote host address list: -net raddr!rsrv.. */
-+	if((i = M_CheckParm("-net")) == 0){
-+		/* single player game */
-+		doomcom->id = DOOMCOM_ID;
-+		doomcom->numplayers = doomcom->numnodes = 1;
-+		doomcom->deathmatch = false;
-+		netgame = false;
-+		return -1;
-+	}
-+	doomcom->numnodes++;	/* raddr[0] is special cased because ??? */
-+	while(++i < myargc && myargv[i][0] != '-'){
-+		csip(myargv[i], &raddr[doomcom->numnodes]);
-+		doomcom->numnodes++;
-+	}
-+
-+	return 0;
-+}
-+
-+void
-+I_InitNetwork(void)
-+{
-+	doomcom = malloc(sizeof *doomcom);
-+	memset(doomcom, 0, sizeof *doomcom);
-+
-+	doomcom->ticdup = 1;
-+	doomcom->extratics = 0;
-+	if(netopts() < 0)
-+		return;
-+	if(doomcom->numnodes < 2)
-+		I_Error("netgame with a single node");
-+	doomcom->id = DOOMCOM_ID;
-+	doomcom->numplayers = doomcom->numnodes;
-+
-+	fmtinstall('I', eipfmt);
-+	initudp();
-+
-+	netgame = true;
- }
---- a/sys/src/games/doom/i_net.h
-+++ b/sys/src/games/doom/i_net.h
-@@ -35,6 +35,7 @@
- 
- void I_InitNetwork (void);
- void I_NetCmd (void);
-+void I_ShutdownNet (void);
- 
- 
- #endif
---- a/sys/src/games/doom/i_system.c
-+++ b/sys/src/games/doom/i_system.c
-@@ -6,6 +6,7 @@
- #include "i_system.h"
- #include "i_sound.h"
- #include "i_video.h"
-+#include "i_net.h"
- 
- #include "d_main.h"
- #include "d_net.h"
-@@ -42,6 +43,7 @@
- void I_Quit (void)
- {
- 	D_QuitNetGame ();
-+	I_ShutdownNet();
- 	I_ShutdownSound();
- 	I_ShutdownMusic();
- 	M_SaveDefaults ();
-@@ -86,6 +88,7 @@
- 	G_CheckDemoStatus();
- 
-     D_QuitNetGame ();
-+    I_ShutdownNet();
-     I_ShutdownGraphics();
- 
-     exits("I_Error");
---- a/sys/src/games/doom/w_wad.h
-+++ b/sys/src/games/doom/w_wad.h
-@@ -67,6 +67,8 @@
- void*	W_CacheLumpNum (int lump, int tag);
- void*	W_CacheLumpName (char* name, int tag);
- 
-+vlong	filelength(int);
-+
- #endif
- //-----------------------------------------------------------------------------
- //
--- a/kbdfs-fshalt
+++ /dev/null
@@ -1,39 +1,0 @@
-diff 27a63ae22975171efbee5549d100f416ccb4066a uncommitted
---- a/sys/src/cmd/aux/kbdfs/kbdfs.c
-+++ b/sys/src/cmd/aux/kbdfs/kbdfs.c
-@@ -366,6 +366,25 @@
- }
- 
- void
-+emergencywarp(void)
-+{
-+	int fd;
-+
-+	if(debug)
-+		return;
-+
-+	if(access("/srv/cwfs.cmd", AEXIST) == 0 && (fd = eopen("/srv/cwfs.cmd", OWRITE)) >= 0){
-+		fprint(fd, "halt\n");
-+		close(fd);
-+	}
-+	if(access("/srv/hjfs.cmd", AEXIST) == 0 && (fd = eopen("/srv/hjfs.cmd", OWRITE)) >= 0){
-+		fprint(fd, "halt\n");
-+		close(fd);
-+	}
-+	reboot();
-+}
-+
-+void
- shutdown(void)
- {
- 	if(notefd >= 0)
-@@ -443,6 +462,9 @@
- 
- 	if(scan->caps && key.r<='z' && key.r>='a')
- 		key.r += 'A' - 'a';
-+
-+	if(scan->ctl && scan->altgr && key.r == Kdel)
-+		emergencywarp();
- 
- 	if(scan->ctl && scan->alt && key.r == Kdel){
- 		if(scan->shift)
--- a/mothra-font
+++ /dev/null
@@ -1,45 +1,0 @@
-diff -r b012b1555646 sys/src/cmd/mothra/rdhtml.c
---- a/sys/src/cmd/mothra/rdhtml.c	Sat Apr 25 20:46:45 2020 -0700
-+++ b/sys/src/cmd/mothra/rdhtml.c	Sun Apr 26 11:07:53 2020 +0200
-@@ -14,25 +14,25 @@
- 	int space;
- }fontlist[4][4]={
- /* original */
--	"lucidasans/unicode.7", 0, 0,
--	"lucidasans/unicode.8", 0, 0,
--	"lucidasans/unicode.10", 0, 0,
--	"lucidasans/unicode.13", 0, 0,
-+	"dejavusans/unicode.12", 0, 0,
-+	"dejavusans/unicode.12", 0, 0,
-+	"dejavusans/unicode.14", 0, 0,
-+	"dejavusans/unicode.16", 0, 0,
- 
--	"lucidasans/italicunicode.7", 0, 0,
--	"lucidasans/italicunicode.8", 0, 0,
--	"lucidasans/italicunicode.10", 0, 0,
--	"lucidasans/italicunicode.13", 0, 0,
-+	"dejavusansit/unicode.12", 0, 0,
-+	"dejavusansit/unicode.12", 0, 0,
-+	"dejavusansit/unicode.14", 0, 0,
-+	"dejavusansit/unicode.16", 0, 0,
- 
--	"lucidasans/boldunicode.7", 0, 0,
--	"lucidasans/boldunicode.8", 0, 0,
--	"lucidasans/boldunicode.10", 0, 0,
--	"lucidasans/boldunicode.13", 0, 0,
-+	"dejavusansbd/unicode.12", 0, 0,
-+	"dejavusansbd/unicode.12", 0, 0,
-+	"dejavusansbd/unicode.14", 0, 0,
-+	"dejavusansbd/unicode.16", 0, 0,
- 
--	"lucidasans/typeunicode.7", 0, 0,
--	"pelm/unicode.8", 0, 0,
--	"lucidasans/typeunicode.12", 0, 0,
--	"lucidasans/typeunicode.16", 0, 0,
-+	"terminus/unicode.12", 0, 0,
-+	"terminus/unicode.12", 0, 0,
-+	"terminus/unicode.14", 0, 0,
-+	"terminus/unicode.16", 0, 0,
- };
- 
- static struct{
--- a/mothra-unifont
+++ /dev/null
@@ -1,384 +1,0 @@
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/draw.c
---- a/sys/src/cmd/mothra/libpanel/draw.c	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/draw.c	Wed Feb 13 15:03:32 2019 +0100
-@@ -15,14 +15,16 @@
- #define	CKBORDER 2	/* space around X inside frame */
- static int plldepth;
- static Image *pl_white, *pl_light, *pl_dark, *pl_black, *pl_hilit;
-+Image *txtcol;
- int pl_drawinit(int ldepth){
- 	plldepth=ldepth;
--	pl_white=allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xFFFFFFFF);
--	pl_light=allocimagemix(display, DPalebluegreen, DWhite);
--	pl_dark =allocimage(display, Rect(0,0,1,1), screen->chan, 1, DPurpleblue);
--	pl_black=allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x000000FF);
-+	pl_white=display->black;
-+	pl_light=display->black;
-+	pl_dark=allocimage(display, Rect(0,0,1,1), CMAP8, 1, 0x222222FF);
-+	pl_black=allocimage(display, Rect(0,0,1,1), CMAP8, 1, 0x770000FF);
- 	pl_hilit=allocimage(display, Rect(0,0,1,1), CHAN1(CAlpha,8), 1, 0x80);
--	if(pl_white==0 || pl_light==0 || pl_black==0 || pl_dark==0) return 0;
-+	txtcol=allocimage(display, Rect(0,0,1,1), CMAP8, 1, 0x884400FF);
-+	if(pl_white==0 || pl_light==0 || pl_black==0 || pl_dark==0 || txtcol==0) return 0;
- 	return 1;
- }
- void pl_relief(Image *b, Image *ul, Image *lr, Rectangle r, int wid){
-@@ -38,6 +40,13 @@
- }
- Rectangle pl_boxoutline(Image *b, Rectangle r, int style, int fill){
- 	if(plldepth==0) switch(style){
-+	case SUP:
-+	case TUP:
-+		pl_relief(b, pl_white, pl_white, r, BWID);
-+		r=insetrect(r, BWID);
-+		if(fill) draw(b, r, pl_white, 0, ZP);
-+		else border(b, r, SPACE, pl_white, ZP);
-+		break;
- 	case UP:
- 		pl_relief(b, pl_black, pl_black, r, BWID);
- 		r=insetrect(r, BWID);
-@@ -68,6 +77,13 @@
- 		break;
- 	}
- 	else switch(style){
-+	case SUP:
-+	case TUP:
-+		pl_relief(b, pl_white, pl_white, r, BWID);
-+		r=insetrect(r, BWID);
-+		if(fill) draw(b, r, pl_light, 0, ZP);
-+		else border(b, r, SPACE, pl_white, ZP);
-+		break;
- 	case UP:
- 		pl_relief(b, pl_white, pl_black, r, BWID);
- 		r=insetrect(r, BWID);
-@@ -97,7 +113,10 @@
- 		else border(b, r, SPACE, pl_white, ZP);
- 		break;
- 	}
--	return insetrect(r, SPACE);
-+	switch(style){
-+	case SUP: return insetrect(r, SPACE-SPACE);
-+	default: return insetrect(r, SPACE);
-+	}
- }
- Rectangle pl_outline(Image *b, Rectangle r, int style){
- 	return pl_boxoutline(b, r, style, 0);
-@@ -269,7 +288,7 @@
- 	draw(b, r, pl_dark, pl_hilit, ZP);
- }
- void pl_clr(Image *b, Rectangle r){
--	draw(b, r, display->white, 0, ZP);
-+	draw(b, r, display->black, 0, ZP);
- }
- void pl_fill(Image *b, Rectangle r){
- 	draw(b, r, plldepth==0? pl_white : pl_light, 0, ZP);
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/message.c
---- a/sys/src/cmd/mothra/libpanel/message.c	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/message.c	Wed Feb 13 15:03:32 2019 +0100
-@@ -29,7 +29,7 @@
- 			end=s;
- 		c=*end;
- 		*end='\0';
--		string(b, where, display->black, ZP, f, start);
-+		string(b, where, txtcol, ZP, f, start);
- 		*end=c;
- 		where.y+=font->height;
- 		s=end;
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/panel.h
---- a/sys/src/cmd/mothra/libpanel/panel.h	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/panel.h	Wed Feb 13 15:03:32 2019 +0100
-@@ -108,6 +108,7 @@
- #define PL_STR		4
- 
- Panel *plkbfocus;			/* the panel in keyboard focus */
-+extern Image *txtcol;
- 
- int plinit(int);			/* initialization */
- void plpack(Panel *, Rectangle);	/* figure out where to put the Panel & children */
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/pldefs.h
---- a/sys/src/cmd/mothra/libpanel/pldefs.h	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/pldefs.h	Wed Feb 13 15:03:32 2019 +0100
-@@ -17,7 +17,9 @@
-  * States, also styles
-  */
- enum{
--	UP,
-+	SUP,	// scrollbar
-+	TUP,	// textview
-+	UP,	// deprecated
- 	DOWN1,
- 	DOWN2,
- 	DOWN3,
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/rtext.c
---- a/sys/src/cmd/mothra/libpanel/rtext.c	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/rtext.c	Wed Feb 13 15:03:32 2019 +0100
-@@ -11,7 +11,7 @@
- #include "rtext.h"
- 
- #define LEAD	4	/* extra space between lines */
--#define BORD	2	/* extra border for images */
-+#define BORD	0	/* extra border for images */
- 
- Rtext *pl_rtnew(Rtext **t, int space, int indent, int voff, Image *b, Panel *p, Font *f, char *s, int flags, void *user){
- 	Rtext *new;
-@@ -195,14 +195,14 @@
- 		&& dr.min.x<r.max.x){
- 			if(t->b){
- 				draw(b, insetrect(dr, BORD), t->b, 0, t->b->r.min);
--				if(t->flags&PL_HOT) border(b, dr, 1, display->black, ZP);
-+				if(t->flags&PL_HOT) border(b, dr, 1, txtcol, ZP);
- 				if(t->flags&PL_STR) {
- 					line(b, Pt(dr.min.x, dr.min.y), Pt(dr.max.x, dr.max.y),
- 						Endsquare, Endsquare, 0,
--						display->black, ZP);
-+						txtcol, ZP);
- 					line(b, Pt(dr.min.x, dr.max.y), Pt(dr.max.x, dr.min.y),
- 						Endsquare, Endsquare, 0,
--						display->black, ZP);
-+						txtcol, ZP);
- 				}
- 				if(t->flags&PL_SEL)
- 					pl_highlight(b, dr);
-@@ -214,7 +214,7 @@
- 					pl_stuffbitmap(t->p, bb);
- 			}
- 			else{
--				string(b, dr.min, display->black, ZP, t->font, t->text);
-+				string(b, dr.min, txtcol, ZP, t->font, t->text);
- 				if(t->flags&PL_SEL)
- 					pl_highlight(b, dr);
- 				if(t->flags&PL_STR){
-@@ -223,7 +223,7 @@
- 						sp = Pt(dr.min.x, y);
- 					line(b, sp, Pt(dr.max.x, y),
- 						Endsquare, Endsquare, 0,
--						display->black, ZP);
-+						txtcol, ZP);
- 					sp = Pt(dr.max.x, y);
- 				} else
- 					sp = ZP;
-@@ -233,7 +233,7 @@
- 						lp = Pt(dr.min.x, y);
- 					line(b, lp, Pt(dr.max.x, y),
- 						Endsquare, Endsquare, 0,
--						display->black, ZP);
-+						txtcol, ZP);
- 					lp = Pt(dr.max.x, y);
- 				} else
- 					lp = ZP;
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/scrollbar.c
---- a/sys/src/cmd/mothra/libpanel/scrollbar.c	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/scrollbar.c	Wed Feb 13 15:03:32 2019 +0100
-@@ -16,7 +16,7 @@
- void pl_drawscrollbar(Panel *p){
- 	Scrollbar *sp;
- 	sp=p->data;
--	sp->interior=pl_outline(p->b, p->r, p->state);
-+	sp->interior=pl_outline(p->b, p->r, SUP); /* SUP was p->state */
- 	pl_sliderupd(p->b, sp->interior, sp->dir, sp->lo, sp->hi);
- }
- int pl_hitscrollbar(Panel *g, Mouse *m){
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/textview.c
---- a/sys/src/cmd/mothra/libpanel/textview.c	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/textview.c	Wed Feb 13 15:03:32 2019 +0100
-@@ -47,7 +47,7 @@
- 	Point size;
- 
- 	tp=p->data;
--	r=pl_outline(p->b, p->r, UP);
-+	r=pl_outline(p->b, p->r, TUP);
- 	twid=r.max.x-r.min.x;
- 	if(twid!=tp->twid){
- 		tp->twid=twid;
-@@ -80,7 +80,7 @@
- 	if(oldhitword==oldhitfirst)
- 		pl_passon(oldhitword, m);
- 	if(m->buttons&OUT)
--		p->state=UP;
-+		p->state=PASSIVE;
- 	else if(m->buttons&7){
- 		p->state=DOWN;
- 		tp->buttons=m->buttons;
-@@ -100,7 +100,7 @@
- 	}
- 	else{
- 		if(p->state==DOWN) hitme=1;
--		p->state=UP;
-+		p->state=PASSIVE;
- 	}
- 	if(tp->hitfirst!=oldhitfirst || tp->hitword!=oldhitword){
- 		plrtseltext(tp->text, tp->hitword, tp->hitfirst);
-@@ -214,7 +214,7 @@
- 	Textview *tp;
- 	tp=v->data;
- 	v->flags=flags|LEAF;
--	v->state=UP;
-+	v->state=PASSIVE;
- 	v->draw=pl_drawtextview;
- 	v->hit=pl_hittextview;
- 	v->type=pl_typetextview;
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/textwin.c
---- a/sys/src/cmd/mothra/libpanel/textwin.c	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/textwin.c	Wed Feb 13 15:03:32 2019 +0100
-@@ -136,7 +136,7 @@
- 	er=t->text+last;
- 	for(r=t->text+first,lp=t->loc+(first-t->top);r!=er;r++,lp++){
- 		if(lp->y+t->hgt>t->r.max.y){
--			fprint(2, "chr %C, index %ld of %d, loc %d %d, off bottom\n",
-+			fprint(2, "chr %C, index %zd of %d, loc %d %d, off bottom\n",
- 				*r, lp-t->loc, t->bot-t->top, lp->x, lp->y);
- 			return;
- 		}
-@@ -155,7 +155,7 @@
- 		default:
- 			buf[runetochar(buf, r)]='\0';
- 	/***/		pl_clr(t->b, Rpt(*lp, addpt(*lp, stringsize(t->font, buf))));
--			ur=string(t->b, *lp, display->black, ZP, t->font, buf);
-+			ur=string(t->b, *lp, txtcol, ZP, t->font, buf);
- 			break;
- 		}
- 		if(lp[1].y!=lp[0].y)
-diff -r b619d1fc23f6 sys/src/cmd/mothra/mothra.c
---- a/sys/src/cmd/mothra/mothra.c	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/mothra.c	Wed Feb 13 15:03:32 2019 +0100
-@@ -39,17 +39,17 @@
- 	0x10, 0x08, 0x14, 0x08, 0x14, 0x28, 0x12, 0x28,
- 	0x0A, 0x50, 0x16, 0x68, 0x20, 0x04, 0x3F, 0xFC,
- };
--Cursor confirmcursor={
-+Cursor confirmcurs={
- 	0, 0,
--	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
--	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
--	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
--	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-+	0x0F, 0xBF, 0x0F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
-+	0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE,
-+	0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF,
-+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC,
- 
- 	0x00, 0x0E, 0x07, 0x1F, 0x03, 0x17, 0x73, 0x6F,
- 	0xFB, 0xCE, 0xDB, 0x8C, 0xDB, 0xC0, 0xFB, 0x6C,
- 	0x77, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03,
--	0x94, 0xA6, 0x63, 0x3C, 0x63, 0x18, 0x94, 0x90,
-+	0x94, 0xA6, 0x63, 0x3C, 0x63, 0x18, 0x94, 0x90
- };
- Cursor readingcurs={
- 	-10, -3,
-@@ -351,15 +351,15 @@
- 	plinit(screen->depth);
- 	if(debug) notify(dienow);
- 	getfonts();
--	hrule=allocimage(display, Rect(0, 0, 1, 5), screen->chan, 1, DWhite);
-+	hrule=allocimage(display, Rect(0, 0, 2048, 5), screen->chan, 1, DBlack);
- 	if(hrule==0)
- 		sysfatal("can't allocimage!");
--	draw(hrule, Rect(0,1,1,3), display->black, 0, ZP);
--	linespace=allocimage(display, Rect(0, 0, 1, 5), screen->chan, 1, DWhite);
-+	draw(hrule, Rect(0,1,1280,3), txtcol, 0, ZP);
-+	linespace=display->black;
- 	if(linespace==0)
- 		sysfatal("can't allocimage!");
--	bullet=allocimage(display, Rect(0,0,25, 8), screen->chan, 0, DWhite);
--	fillellipse(bullet, Pt(4,4), 3, 3, display->black, ZP);
-+	bullet=allocimage(display, Rect(0,0,25, 8), screen->chan, 0, DBlack);
-+	fillellipse(bullet, Pt(4,4), 3, 3, txtcol, ZP);
- 	mkpanels();
- 	unlockdisplay(display);
- 	eresized(0);
-@@ -423,11 +423,17 @@
- 				search();
- 				break;
- 			case Kright:
--				sidescroll(text->size.x/4, 1);
-+				scrolltext(text->size.y/24, 1); /* down one line */
- 				break;
- 			case Kleft:
-+				scrolltext(-text->size.y/24, 1); /* up one line */
-+				break;
-+			case Kins:
- 				sidescroll(-text->size.x/4, 1);
- 				break;
-+			case Kdel:
-+				sidescroll(text->size.x/4, 1);
-+				break;
- 			}
- 			break;
- 		case Emouse:
-@@ -450,6 +456,18 @@
- 		}
- 	}
- }
-+Cursor confirmcursor={
-+	0, 0,
-+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-+
-+	0x00, 0x0E, 0x07, 0x1F, 0x03, 0x17, 0x73, 0x6F,
-+	0xFB, 0xCE, 0xDB, 0x8C, 0xDB, 0xC0, 0xFB, 0x6C,
-+	0x77, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03,
-+	0x94, 0xA6, 0x63, 0x3C, 0x63, 0x18, 0x94, 0x90,
-+};
- int confirm(int b){
- 	Mouse down, up;
- 	esetcursor(&confirmcursor);
-diff -r b619d1fc23f6 sys/src/cmd/mothra/mothra.h
---- a/sys/src/cmd/mothra/mothra.h	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/mothra.h	Wed Feb 13 15:03:32 2019 +0100
-@@ -1,7 +1,7 @@
- enum{
- 	NWWW=64,	/* # of pages we hold in the log */
--	NXPROC=5,	/* # of parallel procs loading the pix */
--	NPIXMB=8,	/* megabytes of image data to keep arround */
-+	NXPROC=16,	/* # of parallel procs loading the pix */
-+	NPIXMB=48,	/* megabytes of image data to keep arround */
- 	NNAME=512,
- 	NLINE=256,
- 	NAUTH=128,
-diff -r b619d1fc23f6 sys/src/cmd/mothra/rdhtml.c
---- a/sys/src/cmd/mothra/rdhtml.c	Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/rdhtml.c	Wed Feb 13 15:03:32 2019 +0100
-@@ -13,25 +13,25 @@
- 	Font *font;
- 	int space;
- }fontlist[4][4]={
--	"dejavusans/unicode.12", 0, 0,
--	"dejavusans/unicode.12", 0, 0,
--	"dejavusans/unicode.14", 0, 0,
--	"dejavusans/unicode.16", 0, 0,
-+	"unifont/unifont.12", 0, 0,
-+	"unifont/unifont.12", 0, 0,
-+	"unifont/unifont.14", 0, 0,
-+	"unifont/unifont.16", 0, 0,
- 
--	"dejavusansit/unicode.12", 0, 0,
--	"dejavusansit/unicode.12", 0, 0,
--	"dejavusansit/unicode.14", 0, 0,
--	"dejavusansit/unicode.16", 0, 0,
-+	"unifont/unifont.12", 0, 0,
-+	"unifont/unifont.12", 0, 0,
-+	"unifont/unifont.14", 0, 0,
-+	"unifont/unifont.16", 0, 0,
- 
--	"dejavusansbd/unicode.12", 0, 0,
--	"dejavusansbd/unicode.12", 0, 0,
--	"dejavusansbd/unicode.14", 0, 0,
--	"dejavusansbd/unicode.16", 0, 0,
-+	"unifont/unifont.12", 0, 0,
-+	"unifont/unifont.12", 0, 0,
-+	"unifont/unifont.14", 0, 0,
-+	"unifont/unifont.16", 0, 0,
- 
--	"terminus/unicode.12", 0, 0,
--	"terminus/unicode.14", 0, 0,
--	"terminus/unicode.16", 0, 0,
--	"terminus/unicode.18", 0, 0,
-+	"unifont/unifont.12", 0, 0,
-+	"unifont/unifont.14", 0, 0,
-+	"unifont/unifont.16", 0, 0,
-+	"unifont/unifont.18", 0, 0,
- };
- 
- Font *pl_whichfont(int f, int s, int *space){
--- a/spred-col
+++ /dev/null
@@ -1,38 +1,0 @@
-diff -r 4136602b93e9 sys/src/cmd/spred/cmdw.c
---- a/sys/src/cmd/spred/cmdw.c	Wed Nov 14 11:33:52 2018 -0800
-+++ b/sys/src/cmd/spred/cmdw.c	Fri Nov 23 17:25:25 2018 +0100
-@@ -332,9 +332,11 @@
- 	.rmb = cmdrmb,
- 	.key = cmdkey,
- 	.hexcols = {
--		[BORD] DPurpleblue,
--		[DISB] 0xCCCCEEFF,
--		[BACK] 0xCCFFFFFF,
--		[HIGH] DPalegreygreen
-+		[BORD] 0x440000FF,
-+		[TEXT] 0x770000FF,
-+		[DISB] 0x111111FF,
-+		[BACK] 0x000000FF,
-+		[HIGH] 0x111111FF,
-+		[HTEXT] 0x770000FF,
- 	}
- };
-diff -r 4136602b93e9 sys/src/cmd/spred/win.c
---- a/sys/src/cmd/spred/win.c	Wed Nov 14 11:33:52 2018 -0800
-+++ b/sys/src/cmd/spred/win.c	Fri Nov 23 17:25:25 2018 +0100
-@@ -38,6 +38,7 @@
- 	scr = allocscreen(screen, display->white, 0);
- 	if(scr == nil)
- 		sysfatal("allocscreen: %r");
-+	draw(screen, screen->r, display->black, nil, ZP);
- 	for(i = 0; i < NTYPES; i++)
- 		for(j = 0; j < NCOLS; j++)
- 			tabs[i]->cols[j] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, tabs[i]->hexcols[j]);
-@@ -254,6 +255,7 @@
- 	scr = allocscreen(screen, display->white, 0);
- 	if(scr == nil)
- 		sysfatal("allocscreen: %r");
-+	draw(screen, screen->r, display->black, nil, ZP);
- 	for(w = wlist.next; w != &wlist; w = w->next){
- 		r = rectsubpt(w->entire, old.min);
- 		r.min.x = muldiv(r.min.x, dxn, dxo);