From b968c38592779d2185624bdeac6d3b98c829d80a Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 18 Jun 2013 05:12:43 +0200 Subject: [PATCH 0001/1113] Added a reference to a builtin resource jar. --- build.xml | 5 ++++- lib/.gitignore | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 654f1566be..493aff7b0d 100644 --- a/build.xml +++ b/build.xml @@ -65,7 +65,7 @@ - + @@ -78,6 +78,8 @@ --> + + @@ -86,6 +88,7 @@ + diff --git a/lib/.gitignore b/lib/.gitignore index 43ad0d7c9a..39d5800a5b 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -1 +1,2 @@ /haven-res.jar +/builtin-res.jar From 2908ddd6e9a1054ec85155048f13c841377ac4ef Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 18 Jun 2013 05:20:54 +0200 Subject: [PATCH 0002/1113] Renamed environment name references. --- build.xml | 26 +++++++++++++------------- lib/.gitignore | 2 +- src/haven/FileCache.java | 2 +- src/haven/Resource.java | 2 +- src/haven/Session.java | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/build.xml b/build.xml index 493aff7b0d..c5ca763d6f 100644 --- a/build.xml +++ b/build.xml @@ -1,10 +1,10 @@ - + - + @@ -18,7 +18,7 @@ - + @@ -59,16 +59,16 @@ - - + + - + - + @@ -76,8 +76,8 @@ --> - - + + @@ -87,7 +87,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -106,11 +106,11 @@ - + - + diff --git a/lib/.gitignore b/lib/.gitignore index 39d5800a5b..ca8c34e2e6 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -1,2 +1,2 @@ -/haven-res.jar +/hafen-res.jar /builtin-res.jar diff --git a/src/haven/FileCache.java b/src/haven/FileCache.java index 32de6d8a8a..07f45f1e96 100644 --- a/src/haven/FileCache.java +++ b/src/haven/FileCache.java @@ -43,7 +43,7 @@ public static FileCache foruser() { File home = new File(path); if(!home.exists() || !home.isDirectory() || !home.canRead() || !home.canWrite()) return(null); - File base = new File(new File(home, ".haven"), "cache"); + File base = new File(new File(new File(home, ".haven"), "hafen"), "cache"); if(!base.exists() && !base.mkdirs()) return(null); return(new FileCache(base)); diff --git a/src/haven/Resource.java b/src/haven/Resource.java index 48c26a28c0..0d6c38f1d0 100644 --- a/src/haven/Resource.java +++ b/src/haven/Resource.java @@ -66,7 +66,7 @@ public class Resource implements Comparable, Prioritized, Serializable try { String dir = Config.resdir; if(dir == null) - dir = System.getenv("HAVEN_RESDIR"); + dir = System.getenv("HAFEN_RESDIR"); if(dir != null) chainloader(new Loader(new FileSource(new File(dir)))); } catch(Exception e) { diff --git a/src/haven/Session.java b/src/haven/Session.java index d3b90b69a3..e3b1171de8 100644 --- a/src/haven/Session.java +++ b/src/haven/Session.java @@ -647,7 +647,7 @@ public void run() { } Message msg = new Message(MSG_SESS); msg.adduint16(2); - msg.addstring("Haven"); + msg.addstring("Hafen"); msg.adduint16(PVER); msg.addstring(username); msg.adduint16(cookie.length); From 89fef82cf1be77294cece6522c7dfd13f044236e Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 30 Jul 2013 03:22:47 +0200 Subject: [PATCH 0003/1113] Properly added a prefspec. --- src/haven/Config.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/Config.java b/src/haven/Config.java index 0101ad0fd9..6a56222708 100644 --- a/src/haven/Config.java +++ b/src/haven/Config.java @@ -49,7 +49,7 @@ public class Config { public static int authport = getint("haven.authport", 1871); public static boolean softres = getprop("haven.softres", "on").equals("on"); public static byte[] authck = null; - public static String prefspec = null; + public static String prefspec = "hafen"; static { String p; From 7517efd6626a6cc971c7cca324adfefca7b8f7eb Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 8 Oct 2013 04:29:34 +0200 Subject: [PATCH 0004/1113] Added material name for cel-shading. --- src/haven/Light.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/haven/Light.java b/src/haven/Light.java index e1465351ce..e1aca3cdb7 100644 --- a/src/haven/Light.java +++ b/src/haven/Light.java @@ -145,6 +145,12 @@ public boolean reqshaders() { return(true); } }; + @Material.ResName("cel") + public static class $cel implements Material.ResCons { + public GLState cons(Resource res, Object... args) { + return(celshade); + } + } public static final GLState deflight = new GLState() { public void apply(GOut g) {} From 3a00b207121947312019a6240d14e9ccb72988c4 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 8 Oct 2013 08:25:06 +0200 Subject: [PATCH 0005/1113] WIP: Terrain-tile blending. --- src/haven/resutil/TerrainTile.java | 102 +++++++++++++++++++++++++---- 1 file changed, 91 insertions(+), 11 deletions(-) diff --git a/src/haven/resutil/TerrainTile.java b/src/haven/resutil/TerrainTile.java index 866336658e..0bf2306199 100644 --- a/src/haven/resutil/TerrainTile.java +++ b/src/haven/resutil/TerrainTile.java @@ -31,24 +31,100 @@ import java.awt.Color; public class TerrainTile extends Tiler { - public final GLState mat; + public final GLState base; + public final SNoise3 noise; + public final Var[] var; + + public static class Var { + public final GLState mat; + public final double thr; + public final double nz; + + public Var(GLState mat, double thr, double nz) { + this.mat = mat; this.thr = thr; this.nz = nz; + } + } + + public static class Scan { + public final Coord ul, sz, br; + public final int l; + + public Scan(Coord ul, Coord sz) { + this.ul = ul; + this.sz = sz; + this.br = sz.add(ul); + this.l = sz.x * sz.y; + } + + public int o(int x, int y) { + return((x - ul.x) + ((y - ul.y) * sz.x)); + } + + public int o(Coord in) { + return(o(in.x, in.y)); + } + } + + public class Blend { + final MapMesh m; + final Scan bscan; + final GLState[] bmat; + + private Blend(MapMesh m) { + this.m = m; + bscan = new Scan(Coord.z, m.sz); + bmat = new GLState[bscan.l]; + for(int y = bscan.ul.y; y < bscan.br.y; y++) { + for(int x = bscan.ul.x; x < bscan.br.x; x++) { + bmat[bscan.o(x, y)] = base; + for(Var v : var) { + if(noise.get(10, x + m.ul.x, y + m.ul.y, v.nz) >= v.thr) + bmat[bscan.o(x, y)] = v.mat; + } + } + } + } + } + private final MapMesh.DataID blend = new MapMesh.DataID() { + public Blend make(MapMesh m) { + return(new Blend(m)); + } + }; @ResName("trn") public static class Factory implements Tiler.Factory { public Tiler create(int id, Resource.Tileset set) { - Material.Res mat = set.getres().layer(Material.Res.class); - return(new TerrainTile(id, mat.get())); + Resource res = set.getres(); + Material base = null; + Collection var = new LinkedList(); + for(Object rdesc : set.ta) { + Object[] desc = (Object[])rdesc; + String p = (String)desc[0]; + if(p.equals("base")) { + int mid = (Integer)desc[1]; + base = res.layer(Material.Res.class, mid).get(); + } else if(p.equals("var")) { + int mid = (Integer)desc[1]; + float thr = (Float)desc[2]; + double nz = (res.name.hashCode() * mid) % 10000; + var.add(new Var(res.layer(Material.Res.class, mid).get(), thr, nz)); + } + } + return(new TerrainTile(id, res.name.hashCode(), base, var.toArray(new Var[0]))); } } - public TerrainTile(int id, GLState mat) { + public TerrainTile(int id, long nseed, GLState base, Var[] var) { super(id); - this.mat = mat; + this.noise = new SNoise3(nseed); + this.base = GLState.compose(base, States.vertexcolor); + this.var = var; } - public static class Plane extends MapMesh.Shape { + public class Plane extends MapMesh.Shape { public MapMesh.SPoint[] vrt; public Coord3f[] tc; + float u, l; public Plane(MapMesh m, MapMesh.Surface surf, Coord sc, int z, GLState mat) { m.super(z, mat); @@ -60,24 +136,28 @@ public Plane(MapMesh m, MapMesh.Surface surf, Coord sc, int z, GLState mat) { new Coord3f((sc.x + 1) / fac, (sc.y + 1) / fac, 0), new Coord3f((sc.x + 1) / fac, (sc.y + 0) / fac, 0), }; + l = m.ul.x * 11; + u = m.ul.y * 11; } public void build(MeshBuf buf) { MeshBuf.Tex btex = buf.layer(MeshBuf.tex); + MeshBuf.Col bcol = buf.layer(MeshBuf.col); MeshBuf.Vertex v1 = buf.new Vertex(vrt[0].pos, vrt[0].nrm); MeshBuf.Vertex v2 = buf.new Vertex(vrt[1].pos, vrt[1].nrm); MeshBuf.Vertex v3 = buf.new Vertex(vrt[2].pos, vrt[2].nrm); MeshBuf.Vertex v4 = buf.new Vertex(vrt[3].pos, vrt[3].nrm); - btex.set(v1, tc[0]); - btex.set(v2, tc[1]); - btex.set(v3, tc[2]); - btex.set(v4, tc[3]); + btex.set(v1, tc[0]); bcol.set(v1, new Color(255, noise.geti(0, 256, 100, vrt[0].pos.x + l, -vrt[0].pos.y + u, 0), 255)); + btex.set(v2, tc[1]); bcol.set(v2, new Color(255, noise.geti(0, 256, 100, vrt[1].pos.x + l, -vrt[1].pos.y + u, 0), 255)); + btex.set(v3, tc[2]); bcol.set(v3, new Color(255, noise.geti(0, 256, 100, vrt[2].pos.x + l, -vrt[2].pos.y + u, 0), 255)); + btex.set(v4, tc[3]); bcol.set(v4, new Color(255, noise.geti(0, 256, 100, vrt[3].pos.x + l, -vrt[3].pos.y + u, 0), 255)); MapMesh.splitquad(buf, v1, v2, v3, v4); } } public void lay(MapMesh m, Random rnd, Coord lc, Coord gc) { - new Plane(m, m.gnd(), lc, 0, mat); + Blend b = m.data(blend); + new Plane(m, m.gnd(), lc, 0, b.bmat[b.bscan.o(lc)]); } public void trans(MapMesh m, Random rnd, Tiler gt, Coord lc, Coord gc, int z, int bmask, int cmask) { From 6cc9ac368fa921bf54439167e0ae6ca0d390ec68 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 8 Oct 2013 09:23:48 +0200 Subject: [PATCH 0006/1113] Probably working tile blending. --- src/haven/resutil/TerrainTile.java | 120 +++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 23 deletions(-) diff --git a/src/haven/resutil/TerrainTile.java b/src/haven/resutil/TerrainTile.java index 0bf2306199..16d0c7da7e 100644 --- a/src/haven/resutil/TerrainTile.java +++ b/src/haven/resutil/TerrainTile.java @@ -36,9 +36,9 @@ public class TerrainTile extends Tiler { public final Var[] var; public static class Var { - public final GLState mat; - public final double thr; - public final double nz; + public GLState mat; + public double thr; + public double nz; public Var(GLState mat, double thr, double nz) { this.mat = mat; this.thr = thr; this.nz = nz; @@ -65,21 +65,86 @@ public int o(Coord in) { } } + private static final int sr = 7; public class Blend { final MapMesh m; - final Scan bscan; - final GLState[] bmat; + final Scan vs, es; + final float[][] bv; + final boolean[][] en; private Blend(MapMesh m) { this.m = m; - bscan = new Scan(Coord.z, m.sz); - bmat = new GLState[bscan.l]; - for(int y = bscan.ul.y; y < bscan.br.y; y++) { - for(int x = bscan.ul.x; x < bscan.br.x; x++) { - bmat[bscan.o(x, y)] = base; - for(Var v : var) { - if(noise.get(10, x + m.ul.x, y + m.ul.y, v.nz) >= v.thr) - bmat[bscan.o(x, y)] = v.mat; + vs = new Scan(Coord.z.sub(sr, sr), m.sz.add(sr * 2 + 1, sr * 2 + 1)); + float[][] buf1 = new float[var.length + 1][vs.l]; + setbase(buf1); + for(int i = 0; i < sr; i++) { + float[][] buf2 = new float[var.length + 1][vs.l]; + for(int y = vs.ul.y; y < vs.br.y; y++) { + for(int x = vs.ul.x; x < vs.br.x; x++) { + for(int o = 0; o < var.length + 1; o++) { + float s = buf1[o][vs.o(x, y)] * 4; + int w = 4; + if(x > vs.ul.x) { + s += buf1[o][vs.o(x - 1, y)]; + w++; + } + if(y > vs.ul.y) { + s += buf1[o][vs.o(x, y - 1)]; + w++; + } + if(x < vs.br.x - 1) { + s += buf1[o][vs.o(x + 1, y)]; + w++; + } + if(y < vs.br.y - 1) { + s += buf1[o][vs.o(x, y + 1)]; + w++; + } + buf2[o][vs.o(x, y)] = s / w; + } + } + } + buf1 = buf2; + } + bv = buf1; + en = new boolean[var.length + 1][vs.l]; + es = new Scan(Coord.z, m.sz); + for(int y = es.ul.y; y < es.br.y; y++) { + for(int x = es.ul.x; x < es.br.x; x++) { + boolean fall = false; + for(int i = var.length; i >= 0; i--) { + if(fall) { + en[i][es.o(x, y)] = false; + } else if((bv[i][vs.o(x , y )] < 0.001f) && (bv[i][vs.o(x + 1, y )] < 0.001f) && + (bv[i][vs.o(x , y + 1)] < 0.001f) && (bv[i][vs.o(x + 1, y + 1)] < 0.001f)) { + en[i][es.o(x, y)] = false; + } else { + en[i][es.o(x, y)] = true; + if((bv[i][vs.o(x , y )] > 0.99f) && (bv[i][vs.o(x + 1, y )] > 0.99f) && + (bv[i][vs.o(x , y + 1)] > 0.99f) && (bv[i][vs.o(x + 1, y + 1)] > 0.99f)) { + fall = true; + } + } + } + } + } + } + + private void setbase(float[][] bv) { + for(int y = vs.ul.y; y < vs.br.y - 1; y++) { + for(int x = vs.ul.x; x < vs.br.x - 1; x++) { + bv[0][vs.o(x, y)] = 1; + bv[0][vs.o(x + 1, y)] = 1; + bv[0][vs.o(x, y + 1)] = 1; + bv[0][vs.o(x + 1, y + 1)] = 1; + for(int i = 0; i < var.length; i++) { + Var v = var[i]; + if(noise.get(10, x + m.ul.x, y + m.ul.y, v.nz) >= v.thr) { + bv[i + 1][vs.o(x, y)] = 1; + bv[i + 1][vs.o(x + 1, y)] = 1; + bv[i + 1][vs.o(x, y + 1)] = 1; + bv[i + 1][vs.o(x + 1, y + 1)] = 1; + } } } } @@ -118,15 +183,16 @@ public TerrainTile(int id, long nseed, GLState base, Var[] var) { super(id); this.noise = new SNoise3(nseed); this.base = GLState.compose(base, States.vertexcolor); - this.var = var; + for(Var v : this.var = var) + v.mat = GLState.compose(v.mat, States.vertexcolor); } public class Plane extends MapMesh.Shape { public MapMesh.SPoint[] vrt; public Coord3f[] tc; - float u, l; + public int[] alpha; - public Plane(MapMesh m, MapMesh.Surface surf, Coord sc, int z, GLState mat) { + public Plane(MapMesh m, MapMesh.Surface surf, Coord sc, int z, GLState mat, int[] alpha) { m.super(z, mat); vrt = surf.fortile(sc); float fac = 25f / 4f; @@ -136,8 +202,7 @@ public Plane(MapMesh m, MapMesh.Surface surf, Coord sc, int z, GLState mat) { new Coord3f((sc.x + 1) / fac, (sc.y + 1) / fac, 0), new Coord3f((sc.x + 1) / fac, (sc.y + 0) / fac, 0), }; - l = m.ul.x * 11; - u = m.ul.y * 11; + this.alpha = alpha; } public void build(MeshBuf buf) { @@ -147,17 +212,26 @@ public void build(MeshBuf buf) { MeshBuf.Vertex v2 = buf.new Vertex(vrt[1].pos, vrt[1].nrm); MeshBuf.Vertex v3 = buf.new Vertex(vrt[2].pos, vrt[2].nrm); MeshBuf.Vertex v4 = buf.new Vertex(vrt[3].pos, vrt[3].nrm); - btex.set(v1, tc[0]); bcol.set(v1, new Color(255, noise.geti(0, 256, 100, vrt[0].pos.x + l, -vrt[0].pos.y + u, 0), 255)); - btex.set(v2, tc[1]); bcol.set(v2, new Color(255, noise.geti(0, 256, 100, vrt[1].pos.x + l, -vrt[1].pos.y + u, 0), 255)); - btex.set(v3, tc[2]); bcol.set(v3, new Color(255, noise.geti(0, 256, 100, vrt[2].pos.x + l, -vrt[2].pos.y + u, 0), 255)); - btex.set(v4, tc[3]); bcol.set(v4, new Color(255, noise.geti(0, 256, 100, vrt[3].pos.x + l, -vrt[3].pos.y + u, 0), 255)); + btex.set(v1, tc[0]); bcol.set(v1, new Color(255, 255, 255, alpha[0])); + btex.set(v2, tc[1]); bcol.set(v2, new Color(255, 255, 255, alpha[1])); + btex.set(v3, tc[2]); bcol.set(v3, new Color(255, 255, 255, alpha[2])); + btex.set(v4, tc[3]); bcol.set(v4, new Color(255, 255, 255, alpha[3])); MapMesh.splitquad(buf, v1, v2, v3, v4); } } public void lay(MapMesh m, Random rnd, Coord lc, Coord gc) { Blend b = m.data(blend); - new Plane(m, m.gnd(), lc, 0, b.bmat[b.bscan.o(lc)]); + for(int i = 0; i < var.length + 1; i++) { + GLState mat = (i == 0)?base:(var[i - 1].mat); + if(b.en[i][b.es.o(lc)]) + new Plane(m, m.gnd(), lc, i, mat, new int[] { + (int)(b.bv[i][b.vs.o(lc)] * 255), + (int)(b.bv[i][b.vs.o(lc.add(0, 1))] * 255), + (int)(b.bv[i][b.vs.o(lc.add(1, 1))] * 255), + (int)(b.bv[i][b.vs.o(lc.add(1, 0))] * 255), + }); + } } public void trans(MapMesh m, Random rnd, Tiler gt, Coord lc, Coord gc, int z, int bmask, int cmask) { From fe2d5d4155ca5bca0f12dcf344f3a2c5620941ce Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 8 Oct 2013 16:57:01 +0200 Subject: [PATCH 0007/1113] Recognize material-texture flag for turning of alpha-clipping. --- src/haven/TexGL.java | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/haven/TexGL.java b/src/haven/TexGL.java index cac182f58a..873b0260fa 100644 --- a/src/haven/TexGL.java +++ b/src/haven/TexGL.java @@ -383,13 +383,23 @@ public static class $tex implements Material.ResCons2 { public void cons(final Resource res, List states, List left, Object... args) { final Resource tres; final int tid; - if(args[0] instanceof String) { - tres = Resource.load((String)args[0], (Integer)args[1]); - tid = (Integer)args[2]; + int a = 0; + if(args[a] instanceof String) { + tres = Resource.load((String)args[a], (Integer)args[a + 1]); + tid = (Integer)args[a + 2]; + a += 3; } else { tres = res; - tid = (Integer)args[0]; + tid = (Integer)args[a]; + a += 1; } + boolean tclip = true; + while(a < args.length) { + String f = (String)args[a++]; + if(f.equals("a")) + tclip = false; + } + final boolean clip = tclip; /* ¦] */ left.add(new Material.Res.Resolver() { public void resolve(Collection buf) { Tex tex; @@ -405,7 +415,8 @@ public void resolve(Collection buf) { } } buf.add(tex.draw()); - buf.add(tex.clip()); + if(clip) + buf.add(tex.clip()); } }); } From 150f1c0eb320dd328f1fd10ea21abdaf951cb877 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 8 Oct 2013 17:02:18 +0200 Subject: [PATCH 0008/1113] Tuned terrain tiles a bit. --- src/haven/resutil/TerrainTile.java | 43 +++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/haven/resutil/TerrainTile.java b/src/haven/resutil/TerrainTile.java index 16d0c7da7e..4cc119341a 100644 --- a/src/haven/resutil/TerrainTile.java +++ b/src/haven/resutil/TerrainTile.java @@ -107,8 +107,19 @@ private Blend(MapMesh m) { buf1 = buf2; } bv = buf1; - en = new boolean[var.length + 1][vs.l]; + for(int y = vs.ul.y; y < vs.br.y; y++) { + for(int x = vs.ul.x; x < vs.br.x; x++) { + for(int i = 0; i < var.length + 1; i++) { + float v = bv[i][vs.o(x, y)]; + v = v * 1.2f - 0.1f; + if(v < 0) v = 0; + if(v > 1) v = 1; + bv[i][vs.o(x, y)] = v; + } + } + } es = new Scan(Coord.z, m.sz); + en = new boolean[var.length + 1][es.l]; for(int y = es.ul.y; y < es.br.y; y++) { for(int x = es.ul.x; x < es.br.x; x++) { boolean fall = false; @@ -133,18 +144,24 @@ private Blend(MapMesh m) { private void setbase(float[][] bv) { for(int y = vs.ul.y; y < vs.br.y - 1; y++) { for(int x = vs.ul.x; x < vs.br.x - 1; x++) { - bv[0][vs.o(x, y)] = 1; - bv[0][vs.o(x + 1, y)] = 1; - bv[0][vs.o(x, y + 1)] = 1; - bv[0][vs.o(x + 1, y + 1)] = 1; - for(int i = 0; i < var.length; i++) { - Var v = var[i]; - if(noise.get(10, x + m.ul.x, y + m.ul.y, v.nz) >= v.thr) { - bv[i + 1][vs.o(x, y)] = 1; - bv[i + 1][vs.o(x + 1, y)] = 1; - bv[i + 1][vs.o(x, y + 1)] = 1; - bv[i + 1][vs.o(x + 1, y + 1)] = 1; + fall: { + for(int i = var.length - 1; i >= 0; i--) { + Var v = var[i]; + double n = 0; + for(double s = 64, f = 1; s >= 8; s /= 2, f /= 2) + n += noise.get(s, x + m.ul.x, y + m.ul.y, v.nz); + if((n / 2) >= v.thr) { + bv[i + 1][vs.o(x, y)] = 1; + bv[i + 1][vs.o(x + 1, y)] = 1; + bv[i + 1][vs.o(x, y + 1)] = 1; + bv[i + 1][vs.o(x + 1, y + 1)] = 1; + break fall; + } } + bv[0][vs.o(x, y)] = 1; + bv[0][vs.o(x + 1, y)] = 1; + bv[0][vs.o(x, y + 1)] = 1; + bv[0][vs.o(x + 1, y + 1)] = 1; } } } @@ -171,7 +188,7 @@ public Tiler create(int id, Resource.Tileset set) { } else if(p.equals("var")) { int mid = (Integer)desc[1]; float thr = (Float)desc[2]; - double nz = (res.name.hashCode() * mid) % 10000; + double nz = (res.name.hashCode() * mid * 8129) % 10000; var.add(new Var(res.layer(Material.Res.class, mid).get(), thr, nz)); } } From c4ac4bf37c9650bc3fc50e1c783d53407511313d Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 10 Oct 2013 03:48:09 +0200 Subject: [PATCH 0009/1113] Set the default skelsprite interpolation positive. --- src/haven/SkelSprite.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/SkelSprite.java b/src/haven/SkelSprite.java index 33976cd2b8..09b919749c 100644 --- a/src/haven/SkelSprite.java +++ b/src/haven/SkelSprite.java @@ -36,7 +36,7 @@ public class SkelSprite extends Sprite implements Gob.Overlay.CUpd { morphed = new Material.Colors(java.awt.Color.RED), unboned = new Material.Colors(java.awt.Color.YELLOW); public static boolean bonedb = false; - public static final float defipol = 0; + public static final float defipol = 0.3f; private final Skeleton skel; public final Pose pose; private Pose oldpose; From 3de8ee8c1b640f49f913df69e9e5afee98f5d7f8 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sat, 12 Oct 2013 19:51:47 +0200 Subject: [PATCH 0010/1113] Decrease audio buffer size for more proper synchronization. --- src/haven/Audio.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/Audio.java b/src/haven/Audio.java index af36a77664..024bc2c00c 100644 --- a/src/haven/Audio.java +++ b/src/haven/Audio.java @@ -38,7 +38,7 @@ public class Audio { private static Collection ncl = new LinkedList(); private static Object queuemon = new Object(); private static Collection queue = new LinkedList(); - private static int bufsize = 32768; + private static int bufsize = 4096; public static double volume = 1.0; static { From 5b962c0b879588ff7bd86789361a2624e254cf5d Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sun, 13 Oct 2013 01:43:49 +0200 Subject: [PATCH 0011/1113] Changed equipory layout and appearance. --- src/haven/Equipory.java | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/haven/Equipory.java b/src/haven/Equipory.java index 1e9014bf2c..973418a229 100644 --- a/src/haven/Equipory.java +++ b/src/haven/Equipory.java @@ -30,23 +30,25 @@ import static haven.Inventory.invsq; public class Equipory extends Widget implements DTarget { + private static final Tex bg = Resource.loadtex("gfx/hud/equip/bg"); + private static final int rx = 34 + bg.sz().x; static Coord ecoords[] = { new Coord(0, 0), - new Coord(299, 0), + new Coord(rx, 0), new Coord(0, 33), - new Coord(299, 33), + new Coord(rx, 33), new Coord(0, 66), - new Coord(299, 66), + new Coord(rx, 66), new Coord(0, 99), - new Coord(299, 99), + new Coord(rx, 99), new Coord(0, 132), - new Coord(299, 132), + new Coord(rx, 132), new Coord(0, 165), - new Coord(299, 165), + new Coord(rx, 165), new Coord(0, 198), - new Coord(299, 198), + new Coord(rx, 198), new Coord(0, 231), - new Coord(299, 231), + new Coord(rx, 231), }; static Coord isz; static { @@ -74,10 +76,23 @@ public Widget create(Coord c, Widget parent, Object[] args) { public Equipory(Coord c, Widget parent, long gobid) { super(c, isz, parent); - Avaview ava = new Avaview(new Coord(34, 0), new Coord(265, 265), this, gobid, "equcam") { + Avaview ava = new Avaview(new Coord(34, 0), bg.sz(), this, gobid, "equcam") { public boolean mousedown(Coord c, int button) { return(false); } + + public void draw(GOut g) { + g.image(bg, Coord.z); + super.draw(g); + } + + Outlines outlines = new Outlines(true); + protected void setup(RenderList rl) { + super.setup(rl); + rl.add(outlines, null); + } + + protected java.awt.Color clearcolor() {return(null);} }; ava.color = null; } From 277ff76b0720b2113257e1570b0559e7ff64e26d Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Mon, 14 Oct 2013 01:09:53 +0200 Subject: [PATCH 0012/1113] Improved outline depth detection. --- src/haven/MapView.java | 7 ++----- src/haven/Outlines.java | 21 ++++++++++++++++++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/haven/MapView.java b/src/haven/MapView.java index b34caa4d1a..2ea829c071 100644 --- a/src/haven/MapView.java +++ b/src/haven/MapView.java @@ -457,7 +457,7 @@ public boolean setup(RenderList rl) { private Coord3f smapcc = null; private ShadowMap smap = null; private long lsmch = 0; - private Outlines outlines = null; + private Outlines outlines = new Outlines(false); public void setup(RenderList rl) { Gob pl = player(); if(pl != null) @@ -498,11 +498,8 @@ public void setup(RenderList rl) { amb = null; } } - if(rl.cfg.pref.outline.val) { - if(outlines == null) - outlines = new Outlines(false); + if(rl.cfg.pref.outline.val) rl.add(outlines, null); - } rl.add(map, null); rl.add(mapol, null); rl.add(gobs, null); diff --git a/src/haven/Outlines.java b/src/haven/Outlines.java index d806d9502a..d1783f3e4e 100644 --- a/src/haven/Outlines.java +++ b/src/haven/Outlines.java @@ -54,18 +54,33 @@ public Outlines(final boolean symmetric) { LValue ret = code.local(FLOAT, l(0.0)).ref(); Expression lnrm = code.local(VEC3, mul(sub(pick(texture2D(snrm.ref(), tc), "rgb"), l(0.5)), l(2.0))).ref(); Expression ldep = code.local(FLOAT, pick(texture2D(sdep.ref(), tc), "z")).ref(); + /* XXX: Current depth detection doesn't work well + * with frustum projections, perhaps because of + * the lack of precision in the depth buffer + * (though I'm not sure I buy that explanation + * yet). */ + LValue dh = code.local(FLOAT, l(0.0002)).ref(), dl = code.local(FLOAT, l(-0.0002)).ref(); for(int i = 0; i < points.length; i++) { Expression ctc = add(tc, mul(vec2(points[i]), MiscLib.pixelpitch.ref())); - Expression cnrm = mul(sub(pick(texture2D(snrm.ref(), ctc), "rgb"), l(0.5)), l(2.0)); Expression cdep = pick(texture2D(sdep.ref(), ctc), "z"); + cdep = sub(ldep, cdep); + cdep = code.local(FLOAT, cdep).ref(); + code.add(stmt(ass(dh, max(dh, cdep)))); + code.add(stmt(ass(dl, min(dl, cdep)))); + } + if(symmetric) + code.add(aadd(ret, smoothstep(l(5.0), l(6.0), max(div(dh, neg(dl)), div(dl, neg(dh)))))); + else + code.add(aadd(ret, smoothstep(l(5.0), l(6.0), div(dh, neg(dl))))); + for(int i = 0; i < points.length; i++) { + Expression ctc = add(tc, mul(vec2(points[i]), MiscLib.pixelpitch.ref())); + Expression cnrm = mul(sub(pick(texture2D(snrm.ref(), ctc), "rgb"), l(0.5)), l(2.0)); if(symmetric) { code.add(aadd(ret, sub(l(1.0), abs(dot(lnrm, cnrm))))); - code.add(aadd(ret, smoothstep(l(1 / 3000.0), l(1 / 2000.0), abs(sub(cdep, ldep))))); } else { cnrm = code.local(VEC3, cnrm).ref(); code.add(new If(gt(pick(cross(lnrm, cnrm), "z"), l(0.0)), stmt(aadd(ret, sub(l(1.0), abs(dot(lnrm, cnrm))))))); - code.add(aadd(ret, smoothstep(l(1 / 3000.0), l(1 / 2000.0), max(sub(ldep, cdep), l(0.0))))); } } code.add(new Return(smoothstep(l(0.4), l(0.6), min(ret, l(1.0))))); From 304e47b4d80c1fbf27b49ab62ad99167e84e1fb7 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 16 Oct 2013 23:21:09 +0200 Subject: [PATCH 0013/1113] Lock the orthocamera to the actually isometric angles. --- src/haven/MapView.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/haven/MapView.java b/src/haven/MapView.java index 2ea829c071..aca4426dee 100644 --- a/src/haven/MapView.java +++ b/src/haven/MapView.java @@ -315,9 +315,13 @@ public void drag(Coord c) { tangl = anglorig + ((float)(c.x - dragorig.x) / 100.0f); } + public void release() { + tangl = (float)(Math.PI * 0.5 * (Math.floor(tangl / (Math.PI * 0.5)) + 0.5)); + } + public boolean wheel(Coord c, int amount) { tfield += amount * 10; - tfield = Math.max(Math.min(tfield, 200), 50); + tfield = Math.max(Math.min(tfield, sz.x * (float)Math.sqrt(2) / 8f), 50); return(true); } } From 0ae2e38fd0856b964498295cc012162c9dfac5ce Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 22 Oct 2013 04:56:05 +0200 Subject: [PATCH 0014/1113] Added support for server-defined weather effects. --- src/haven/Glob.java | 90 +++++++++++++++++++++++++++++++++++++++++- src/haven/MapView.java | 8 +++- 2 files changed, 95 insertions(+), 3 deletions(-) diff --git a/src/haven/Glob.java b/src/haven/Glob.java index 26ff485c7f..4ba400731f 100644 --- a/src/haven/Glob.java +++ b/src/haven/Glob.java @@ -34,6 +34,7 @@ public class Glob { public static final int GMSG_ASTRO = 1; public static final int GMSG_LIGHT = 2; public static final int GMSG_SKY = 3; + public static final int GMSG_WEATHER = 4; public long time, epoch = System.currentTimeMillis(); public OCache oc = new OCache(this); @@ -54,13 +55,21 @@ public class Glob { public long lchange = -1; public Indir sky1 = null, sky2 = null; public double skyblend = 0.0; + private Map, Object> wmap = new HashMap, Object>(); public Glob(Session sess) { this.sess = sess; map = new MCache(sess); party = new Party(this); } - + + @Resource.PublishedCode(name = "wtr") + public static interface Weather { + public void gsetup(RenderList rl); + public void update(Object... args); + public boolean tick(int dt); + } + public static class CAttr extends Observable { String nm; int base, comp; @@ -277,12 +286,89 @@ public void blob(Message msg) { } } break; + case GMSG_WEATHER: + synchronized(this) { + if(!inc) + wmap.clear(); + Collection old = new LinkedList(wmap.keySet()); + while(true) { + int resid = msg.uint16(); + if(resid == 65535) + break; + Indir res = sess.getres(resid); + Object[] args = msg.list(); + Object curv = wmap.get(res); + if(curv instanceof Weather) { + Weather cur = (Weather)curv; + cur.update(args); + } else { + wmap.put(res, args); + } + old.remove(res); + } + for(Object p : old) + wmap.remove(p); + } + break; default: throw(new RuntimeException("Unknown globlob type: " + t)); } } } - + + public final Iterable weather = new Iterable() { + public Iterator iterator() { + return(new Iterator() { + Iterator, Object>> bk = wmap.entrySet().iterator(); + Weather n = null; + + public boolean hasNext() { + if(n == null) { + while(true) { + if(!bk.hasNext()) + return(false); + Map.Entry, Object> cur = bk.next(); + Object v = cur.getValue(); + if(v instanceof Weather) { + n = (Weather)v; + break; + } + Class cl = cur.getKey().get().layer(Resource.CodeEntry.class).getcl(Weather.class); + Weather w; + try { + w = Utils.construct(cl.getConstructor(Object[].class), new Object[] {v}); + } catch(NoSuchMethodException e) { + throw(new RuntimeException(e)); + } + cur.setValue(n = w); + } + } + return(true); + } + + public Weather next() { + if(!hasNext()) + throw(new NoSuchElementException()); + Weather ret = n; + n = null; + return(ret); + } + + public void remove() { + throw(new UnsupportedOperationException()); + } + }); + } + }; + + /* XXX: This is actually quite ugly and there should be a better + * way, but until I can think of such a way, have this as a known + * entry-point to be forwards-compatible with compiled + * resources. */ + public static DirLight amblight(RenderList rl) { + return(((MapView)((PView.WidgetContext)rl.state().get(PView.ctx)).widget()).amb); + } + public Pagina paginafor(Resource res) { if(res == null) return(null); diff --git a/src/haven/MapView.java b/src/haven/MapView.java index 27dd0080c4..7d8ff0f953 100644 --- a/src/haven/MapView.java +++ b/src/haven/MapView.java @@ -490,7 +490,7 @@ private void updsmap(RenderList rl, DirLight light) { } } - public Light amb = null; + public DirLight amb = null; private Outlines outlines = new Outlines(false); public void setup(RenderList rl) { Gob pl = player(); @@ -505,6 +505,12 @@ public void setup(RenderList rl) { } else { amb = null; } + for(Glob.Weather w : glob.weather) + w.gsetup(rl); + for(Glob.Weather w : glob.weather) { + if(w instanceof Rendered) + rl.add((Rendered)w, null); + } } if(rl.cfg.pref.outline.val) rl.add(outlines, null); From 1b979c403e45b0d5aa7f02a98831b9310a48f902 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 22 Oct 2013 05:08:29 +0200 Subject: [PATCH 0015/1113] Log GL-OOM errors in more detail when creating textures. --- src/haven/TexGL.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/haven/TexGL.java b/src/haven/TexGL.java index 873b0260fa..d390d024f7 100644 --- a/src/haven/TexGL.java +++ b/src/haven/TexGL.java @@ -296,7 +296,11 @@ private void create(GOut g) { t = null; throw(l); } - checkerr(gl); + try { + checkerr(gl); + } catch(GOut.GLOutOfMemoryException e) { + throw(new RuntimeException("Out of memory when create texture " + this, e)); + } } public float tcx(int x) { From 0f3d3c9221a406e6b27bd07f0742385e7cbcc36e Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 6 Mar 2014 01:00:45 +0100 Subject: [PATCH 0016/1113] Use the window resources for flower-menus. --- src/haven/FlowerMenu.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haven/FlowerMenu.java b/src/haven/FlowerMenu.java index 5ea070566a..3971bba290 100644 --- a/src/haven/FlowerMenu.java +++ b/src/haven/FlowerMenu.java @@ -33,7 +33,7 @@ public class FlowerMenu extends Widget { public static Color pink = new Color(255, 0, 128); public static IBox pbox; - public static Tex pbg = Resource.loadtex("gfx/hud/bgtex"); + public static Tex pbg = Window.bg; static Color ptc = Color.YELLOW; static Text.Foundry ptf = new Text.Foundry(new Font("SansSerif", Font.PLAIN, 12)); static int ph = 30, ppl = 8; @@ -52,7 +52,7 @@ public Widget create(Coord c, Widget parent, Object[] args) { } static { - pbox = new IBox("gfx/hud", "tl", "tr", "bl", "br", "extvl", "extvr", "extht", "exthb"); + pbox = Window.wbox; } public class Petal extends Widget { From 373cd9f8c1897ebcdbb31fd506fd6f5420492a7f Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 25 Mar 2014 04:13:10 +0100 Subject: [PATCH 0017/1113] Added some offset to the speech-bubbles. --- src/haven/Speaking.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/Speaking.java b/src/haven/Speaking.java index 90208c66a8..01a07d6113 100644 --- a/src/haven/Speaking.java +++ b/src/haven/Speaking.java @@ -66,7 +66,7 @@ public void draw(GOut g, Coord c) { final PView.Draw2D fx = new PView.Draw2D() { public void draw2d(GOut g) { if(gob.sc != null) - Speaking.this.draw(g, gob.sc.add(new Coord(gob.sczu.mul(zo)))); + Speaking.this.draw(g, gob.sc.add(new Coord(gob.sczu.mul(zo))).add(3, 0)); } }; } From a56e333a470b5ae96f57bcf2f3f7fd0f36bac9be Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 16 Apr 2014 23:50:22 +0200 Subject: [PATCH 0018/1113] Restored progress hourglass. --- src/haven/GameUI.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/haven/GameUI.java b/src/haven/GameUI.java index 573487f834..21c9f302fa 100644 --- a/src/haven/GameUI.java +++ b/src/haven/GameUI.java @@ -225,17 +225,20 @@ public void cdestroy(Widget w) { } } - static Text.Furnace progf = new PUtils.BlurFurn(new Text.Foundry(new java.awt.Font("serif", java.awt.Font.BOLD, 24)).aa(true), 2, 1, new Color(0, 16, 16)); - Text progt = null; + static final Tex[] progt; + static { + Tex[] p = new Tex[22]; + for(int i = 0; i < p.length; i++) + p[i] = Resource.loadtex(String.format("gfx/hud/prog/%02d", i)); + progt = p; + } public void draw(GOut g) { boolean beltp = !chat.expanded; beltwdg.show(beltp); super.draw(g); if(prog >= 0) { - String progs = String.format("%d%%", prog); - if((progt == null) || !progs.equals(progt.text)) - progt = progf.render(progs); - g.aimage(progt.tex(), new Coord(sz.x / 2, (sz.y * 4) / 10), 0.5, 0.5); + Tex pi = progt[Utils.clip((prog * progt.length + 50) / 100, 0, progt.length - 1)]; + g.aimage(pi, new Coord(sz.x / 2, (sz.y * 4) / 10), 0.5, 0.5); } int by = sz.y; if(chat.expanded) From 3465b05557efd4b41fa75e8ad62f1a3b7a62cce8 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 17 Apr 2014 02:04:27 +0200 Subject: [PATCH 0019/1113] Added a gameui placement for arbitrary meters. --- src/haven/GameUI.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/haven/GameUI.java b/src/haven/GameUI.java index 21c9f302fa..0cf6b8b228 100644 --- a/src/haven/GameUI.java +++ b/src/haven/GameUI.java @@ -34,11 +34,13 @@ public class GameUI extends ConsoleHost implements Console.Directory { public final String chrid; public final long plid; + public Avaview portrait; public MenuGrid menu; public MapView map; public MiniMap mmap; public Fightview fv; public static final Text.Foundry errfoundry = new Text.Foundry(new java.awt.Font("SansSerif", java.awt.Font.BOLD, 14), new Color(192, 0, 0)); + private Widget[] meters = {}; private Text lasterr; private long errtime; private Window invwnd, equwnd, makewnd; @@ -99,7 +101,7 @@ public GameUI(Widget parent, String chrid, long plid) { setcanfocus(true); setfocusctl(true); menu = new MenuGrid(Coord.z, this); - new Avaview(new Coord(10, 10), Avaview.dasz, this, plid, "avacam"); + portrait = new Avaview(new Coord(10, 10), Avaview.dasz, this, plid, "avacam"); new Bufflist(new Coord(95, 50), this); chat = new ChatUI(Coord.z, 0, this); syslog = new ChatUI.Log(chat, "System"); @@ -209,6 +211,12 @@ public void cdestroy(Widget w) { return(chat.makechild(type, new Object[] {}, cargs)); } else if(place == "party") { return(gettype(type).create(new Coord(10, 95), this, cargs)); + } else if(place == "meter") { + int x = (meters.length % 3) * 65; + int y = (meters.length / 3) * 20; + Widget ret = gettype(type).create(new Coord(portrait.c.x + portrait.sz.x + 10 + x, portrait.c.y + y), this, cargs); + meters = Utils.extend(meters, ret); + return(ret); } else if(place == "misc") { return(gettype(type).create((Coord)pargs[1], this, cargs)); } else { From 012ab7743cd13c82906ae333eadc6e01f7d2ef71 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 17 Apr 2014 02:04:40 +0200 Subject: [PATCH 0020/1113] Improved the speedget a bit. --- src/haven/Speedget.java | 42 +++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/haven/Speedget.java b/src/haven/Speedget.java index a2e117ce34..72bb6df340 100644 --- a/src/haven/Speedget.java +++ b/src/haven/Speedget.java @@ -26,11 +26,13 @@ package haven; +import java.awt.event.KeyEvent; + public class Speedget extends Widget { public static final Tex imgs[][]; public static final Coord tsz; - private int cur, max; - + public int cur, max; + static { imgs = new Tex[4][3]; String[] names = {"crawl", "walk", "run", "sprint"}; @@ -58,7 +60,7 @@ public Speedget(Coord c, Widget parent, int cur, int max) { this.cur = cur; this.max = max; } - + public void draw(GOut g) { int x = 0; for(int i = 0; i < 4; i++) { @@ -73,29 +75,53 @@ else if(i > max) x += t.sz().x; } } - + public void uimsg(String msg, Object... args) { if(msg == "cur") cur = (Integer)args[0]; else if(msg == "max") max = (Integer)args[0]; } - + + public void set(int s) { + wdgmsg("set", s); + } + public boolean mousedown(Coord c, int button) { int x = 0; for(int i = 0; i < 4; i++) { x += imgs[i][0].sz().x; if(c.x < x) { - wdgmsg("set", i); + set(i); break; } } return(true); } - + public boolean mousewheel(Coord c, int amount) { if(max >= 0) - wdgmsg("set", (cur + max + 1 + amount) % (max + 1)); + set((cur + max + 1 + amount) % (max + 1)); return(true); } + + public boolean globtype(char key, KeyEvent ev) { + if(key == 18) { + int n; + if((ev.getModifiersEx() & KeyEvent.SHIFT_DOWN_MASK) == 0) { + if(cur > max) + n = 0; + else + n = Math.min(cur + 1, max); + } else { + if(cur > max) + n = max; + else + n = Math.max(cur - 1, 0); + } + set(n); + return(true); + } + return(super.globtype(key, ev)); + } } From c6566d67ed95814aadb2a9edee5adbb7be7f384c Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 17 Apr 2014 02:16:29 +0200 Subject: [PATCH 0021/1113] Cycle the speedget. --- src/haven/Speedget.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haven/Speedget.java b/src/haven/Speedget.java index 72bb6df340..49d7ad8d10 100644 --- a/src/haven/Speedget.java +++ b/src/haven/Speedget.java @@ -112,12 +112,12 @@ public boolean globtype(char key, KeyEvent ev) { if(cur > max) n = 0; else - n = Math.min(cur + 1, max); + n = (cur + 1) % (max + 1); } else { if(cur > max) n = max; else - n = Math.max(cur - 1, 0); + n = (cur + max) % (max + 1); } set(n); return(true); From c57428066901695c75f5bfd6e66a7de145e24603 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 24 Apr 2014 04:10:42 +0200 Subject: [PATCH 0022/1113] Load Fraktur font. --- src/haven/Text.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/haven/Text.java b/src/haven/Text.java index c281a3c247..ddb0763621 100644 --- a/src/haven/Text.java +++ b/src/haven/Text.java @@ -35,6 +35,7 @@ public class Text { public static final Font serif = new Font("Serif", Font.PLAIN, 10); public static final Font sans = new Font("Sans", Font.PLAIN, 10); public static final Font mono = new Font("Monospaced", Font.PLAIN, 10); + public static final Font fraktur = Resource.load("ui/fraktur").loadwait().layer(Resource.Font.class).font; public static final Font dfont = sans; public static final Foundry std; public final BufferedImage img; From 72c1dfe1b440e30c56b3c2f09bb41fca24eeebad Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 1 May 2014 03:39:36 +0200 Subject: [PATCH 0023/1113] Fixed speedget crash when max-speed is < 0. --- src/haven/Speedget.java | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/haven/Speedget.java b/src/haven/Speedget.java index 49d7ad8d10..67a745b52d 100644 --- a/src/haven/Speedget.java +++ b/src/haven/Speedget.java @@ -107,19 +107,21 @@ public boolean mousewheel(Coord c, int amount) { public boolean globtype(char key, KeyEvent ev) { if(key == 18) { - int n; - if((ev.getModifiersEx() & KeyEvent.SHIFT_DOWN_MASK) == 0) { - if(cur > max) - n = 0; - else - n = (cur + 1) % (max + 1); - } else { - if(cur > max) - n = max; - else - n = (cur + max) % (max + 1); + if(max >= 0) { + int n; + if((ev.getModifiersEx() & KeyEvent.SHIFT_DOWN_MASK) == 0) { + if(cur > max) + n = 0; + else + n = (cur + 1) % (max + 1); + } else { + if(cur > max) + n = max; + else + n = (cur + max) % (max + 1); + } + set(n); } - set(n); return(true); } return(super.globtype(key, ev)); From 51f517fd913481f77c5a4848ac03011a892e2d11 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 26 Jun 2014 04:28:54 +0200 Subject: [PATCH 0024/1113] Improved dragging behavior on buttons. \o/ --- src/haven/Button.java | 27 ++++++++++++++++++++------- src/haven/IButton.java | 24 ++++++++++++++++-------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/haven/Button.java b/src/haven/Button.java index 0ba73e772e..e0cb213515 100644 --- a/src/haven/Button.java +++ b/src/haven/Button.java @@ -41,7 +41,8 @@ public class Button extends SSWidget { public Text text; public BufferedImage cont; static Text.Foundry tf = new Text.Foundry(Text.serif, 12, Color.YELLOW); - UI.Grab a = null; + boolean a = false; + UI.Grab d = null; @RName("btn") public static class $Btn implements Factory { @@ -84,13 +85,13 @@ public Button(Coord c, Integer w, Widget parent, BufferedImage cont) { public void render() { synchronized(this) { Graphics g = graphics(); - g.drawImage((a != null)?dt:ut, 3, 3, sz.x - 6, 13, null); + g.drawImage(a?dt:ut, 3, 3, sz.x - 6, 13, null); g.drawImage(bl, 0, 0, null); g.drawImage(br, sz.x - br.getWidth(), 0, null); g.drawImage(bt, 3, 0, sz.x - 6, bt.getHeight(), null); g.drawImage(bb, 3, sz.y - bb.getHeight(), sz.x - 6, bb.getHeight(), null); Coord tc = sz.div(2).add(Utils.imgsz(cont).div(2).inv()); - if(a != null) + if(a) tc = tc.add(1, 1); g.drawImage(cont, tc.x, tc.y, null); update(); @@ -122,18 +123,30 @@ public void uimsg(String msg, Object... args) { } } + public void mousemove(Coord c) { + if(d != null) { + boolean a = c.isect(Coord.z, sz); + if(a != this.a) { + this.a = a; + render(); + } + } + } + public boolean mousedown(Coord c, int button) { if(button != 1) return(false); - a = ui.grabmouse(this); + a = true; + d = ui.grabmouse(this); render(); return(true); } public boolean mouseup(Coord c, int button) { - if((a != null) && button == 1) { - a.remove(); - a = null; + if((d != null) && button == 1) { + d.remove(); + d = null; + a = false; render(); if(c.isect(new Coord(0, 0), sz)) click(); diff --git a/src/haven/IButton.java b/src/haven/IButton.java index c8c65d0f36..364fb21277 100644 --- a/src/haven/IButton.java +++ b/src/haven/IButton.java @@ -32,7 +32,8 @@ public class IButton extends SSWidget { BufferedImage up, down, hover; boolean h = false; - UI.Grab a = null; + boolean a = false; + UI.Grab d = null; @RName("ibtn") public static class $_ implements Factory { @@ -56,7 +57,7 @@ public IButton(Coord c, Widget parent, BufferedImage up, BufferedImage down) { public void render() { clear(); Graphics g = graphics(); - if(a != null) + if(a) g.drawImage(down, 0, 0, null); else if(h) g.drawImage(hover, 0, 0, null); @@ -82,18 +83,19 @@ public boolean mousedown(Coord c, int button) { return(false); if(!checkhit(c)) return(false); - a = ui.grabmouse(this); + a = true; + d = ui.grabmouse(this); render(); return(true); } public boolean mouseup(Coord c, int button) { - if((a != null) && button == 1) { - a.remove(); - a = null; + if((d != null) && button == 1) { + d.remove(); + d = null; + mousemove(c); if(checkhit(c)) click(); - render(); return(true); } return(false); @@ -101,8 +103,14 @@ public boolean mouseup(Coord c, int button) { public void mousemove(Coord c) { boolean h = checkhit(c); - if(h != this.h) { + boolean a = false; + if(d != null) { + a = h; + h = true; + } + if((h != this.h) || (a != this.a)) { this.h = h; + this.a = a; render(); } } From 91ca9bf58140674aeda9a69f86deb2f75c9577d4 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 10 Jul 2014 04:00:04 +0200 Subject: [PATCH 0025/1113] New windows. --- src/haven/Window.java | 104 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 86 insertions(+), 18 deletions(-) diff --git a/src/haven/Window.java b/src/haven/Window.java index 5ab7860e25..57038c129c 100644 --- a/src/haven/Window.java +++ b/src/haven/Window.java @@ -29,16 +29,32 @@ import java.awt.Color; import java.awt.Font; import java.awt.image.BufferedImage; +import static haven.PUtils.*; public class Window extends Widget implements DTarget { - public static final Tex bg = Resource.loadtex("gfx/hud/wnd/bgtex"); - public static final Tex cl = Resource.loadtex("gfx/hud/wnd/cleft"); - public static final Tex cm = Resource.loadtex("gfx/hud/wnd/cmain"); - public static final Tex cr = Resource.loadtex("gfx/hud/wnd/cright"); + public static final Tex bg = Resource.loadtex("gfx/hud/wnd/lg/bg"); + public static final Tex bgl = Resource.loadtex("gfx/hud/wnd/lg/bgl"); + public static final Tex bgr = Resource.loadtex("gfx/hud/wnd/lg/bgr"); + public static final Tex cl = Resource.loadtex("gfx/hud/wnd/lg/cl"); + public static final TexI cm = new TexI(Resource.loadimg("gfx/hud/wnd/lg/cm")); + public static final Tex cr = Resource.loadtex("gfx/hud/wnd/lg/cr"); + public static final Tex tm = Resource.loadtex("gfx/hud/wnd/lg/tm"); + public static final Tex tr = Resource.loadtex("gfx/hud/wnd/lg/tr"); + public static final Tex lm = Resource.loadtex("gfx/hud/wnd/lg/lm"); + public static final Tex lb = Resource.loadtex("gfx/hud/wnd/lg/lb"); + public static final Tex rm = Resource.loadtex("gfx/hud/wnd/lg/rm"); + public static final Tex bl = Resource.loadtex("gfx/hud/wnd/lg/bl"); + public static final Tex bm = Resource.loadtex("gfx/hud/wnd/lg/bm"); + public static final Tex br = Resource.loadtex("gfx/hud/wnd/lg/br"); + public static final Coord tlm = new Coord(18, 30), brm = new Coord(13, 22), cpo = new Coord(36, 17); public static final int capo = 7, capio = 2; - public static final Coord mrgn = new Coord(13, 13); - public static final Color cc = Color.YELLOW; - public static final Text.Foundry cf = new Text.Foundry(Text.serif, 12); + public static final Coord mrgn = new Coord(9, 9); + public static final Color cc = new Color(255, 224, 0); + public static final Text.Furnace cf = new Text.Imager(new Text.Foundry(Text.fraktur, 15, cc).aa(true)) { + protected BufferedImage proc(Text text) { + return(rasterimg(blurmask2(text.img.getRaster(), 1, 1, Color.BLACK))); + } + }; public static final IBox wbox = new IBox("gfx/hud/wnd", "tl", "tr", "bl", "br", "extvl", "extvr", "extht", "exthb") { final Coord co = new Coord(3, 3), bo = new Coord(2, 2); @@ -48,14 +64,15 @@ public class Window extends Widget implements DTarget { public Coord cisz() {return(super.cisz().sub(co.mul(2)));} }; private static final BufferedImage[] cbtni = new BufferedImage[] { - Resource.loadimg("gfx/hud/wnd/cbtn"), - Resource.loadimg("gfx/hud/wnd/cbtnd"), - Resource.loadimg("gfx/hud/wnd/cbtnh")}; + Resource.loadimg("gfx/hud/wnd/lg/cbtnu"), + Resource.loadimg("gfx/hud/wnd/lg/cbtnd"), + Resource.loadimg("gfx/hud/wnd/lg/cbtnh")}; public final Coord tlo, rbo; public final IButton cbtn; public boolean dt = false; public Text cap; - public Coord wtl, wsz, ctl, csz, atl, asz; + public Coord wsz, ctl, csz, atl, asz, cptl, cpsz; + public int cmw; private UI.Grab dm = null; private Coord doff; @@ -88,19 +105,64 @@ public void chcap(String cap) { if(cap == null) this.cap = null; else - this.cap = cf.render(cap, cc); + this.cap = cf.render(cap); } public void cdraw(GOut g) { } + private void drawframe(GOut g) { + Coord mdo, cbr; + g.image(cl, tlo); + mdo = tlo.add(cl.sz().x, 0); + cbr = mdo.add(cmw, cm.sz().y); + for(int x = 0; x < cmw; x++) + g.image(cm, mdo.add(x, 0), Coord.z, cbr); + g.image(cr, tlo.add(cl.sz().x + cmw, 0)); + g.image(cap.tex(), tlo.add(cpo)); + mdo = tlo.add(cl.sz().x + cmw + cr.sz().x, 0); + cbr = tlo.add(wsz.add(-tr.sz().x, tm.sz().y)); + for(; mdo.x < cbr.x; mdo.x += tm.sz().x) + g.image(tm, mdo, Coord.z, cbr); + g.image(tr, tlo.add(wsz.x - tr.sz().x, 0)); + + mdo = tlo.add(0, cl.sz().y); + cbr = tlo.add(lm.sz().x, wsz.y - bl.sz().y); + if(cbr.y - mdo.y >= lb.sz().y) { + cbr.y -= lb.sz().y; + g.image(lb, new Coord(tlo.x, cbr.y)); + } + for(; mdo.y < cbr.y; mdo.y += lm.sz().y) + g.image(lm, mdo, Coord.z, cbr); + + mdo = tlo.add(wsz.x - rm.sz().x, tr.sz().y); + cbr = tlo.add(wsz.x, wsz.y - br.sz().y); + for(; mdo.y < cbr.y; mdo.y += rm.sz().y) + g.image(rm, mdo, Coord.z, cbr); + + g.image(bl, tlo.add(0, wsz.y - bl.sz().y)); + mdo = tlo.add(bl.sz().x, wsz.y - bm.sz().y); + cbr = tlo.add(wsz.x - br.sz().x, wsz.y); + for(; mdo.x < cbr.x; mdo.x += bm.sz().x) + g.image(bm, mdo, Coord.z, cbr); + g.image(br, tlo.add(wsz.sub(br.sz()))); + } + public void draw(GOut g) { Coord bgc = new Coord(); for(bgc.y = ctl.y; bgc.y < ctl.y + csz.y; bgc.y += bg.sz().y) { for(bgc.x = ctl.x; bgc.x < ctl.x + csz.x; bgc.x += bg.sz().x) g.image(bg, bgc, ctl, csz); } + bgc.x = ctl.x; + for(bgc.y = ctl.y; bgc.y < ctl.y + csz.y; bgc.y += bgl.sz().y) + g.image(bgl, bgc, ctl, csz); + bgc.x = ctl.x + csz.x - bgr.sz().x; + for(bgc.y = ctl.y; bgc.y < ctl.y + csz.y; bgc.y += bgr.sz().y) + g.image(bgr, bgc, ctl, csz); cdraw(g.reclip(atl, asz)); + drawframe(g); + /* wbox.draw(g, wtl, wsz); if(cap != null) { int w = cap.sz().x; @@ -110,6 +172,7 @@ public void draw(GOut g) { g.image(cr, new Coord(wtl.x + (wsz.x / 2) + (w / 2), y)); g.image(cap.tex(), new Coord(wtl.x + (wsz.x / 2) - (w / 2), y + capio)); } + */ super.draw(g); } @@ -136,12 +199,16 @@ private void placecbtn() { public void resize(Coord sz) { asz = sz; csz = asz.add(mrgn.mul(2)); - wsz = csz.add(wbox.bisz()); - wtl = new Coord(tlo.x, Math.max(tlo.y, capo)); - this.sz = wsz.add(wtl).add(rbo); - ctl = wtl.add(wbox.btloff()); + wsz = csz.add(tlm).add(brm); + this.sz = wsz.add(tlo).add(rbo); + ctl = tlo.add(tlm); atl = ctl.add(mrgn); - placecbtn(); + cmw = (cap == null)?0:(cap.sz().x); + cmw = Math.max(cmw, wsz.x / 4); + cptl = new Coord(ctl.x, tlo.y); + cpsz = tlo.add(cpo.x + cmw, cm.sz().y).sub(cptl); + cmw = cmw - (cl.sz().x - cpo.x) - 5; + cbtn.c = xlate(tlo.add(wsz.x - cbtn.sz.x, 0), false); for(Widget ch = child; ch != null; ch = ch.next) ch.presize(); } @@ -171,7 +238,8 @@ public boolean mousedown(Coord c, int button) { raise(); if(super.mousedown(c, button)) return(true); - if(c.isect(wtl, wsz) || ((cap != null) && c.isect(wtl.add((wsz.x / 2) - (cap.sz().x / 2), -capo), new Coord(cap.sz().x, capo)))) { + Coord cpc = c.sub(cptl); + if(c.isect(ctl, csz) || (c.isect(cptl, cpsz) && (cm.back.getRaster().getSample(cpc.x % cm.back.getWidth(), cpc.y, 3) >= 128))) { if(button == 1) { dm = ui.grabmouse(this); doff = c; From 45566739ceedf18d43f93fe395c661eddcf878be Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Fri, 11 Jul 2014 03:31:50 +0200 Subject: [PATCH 0026/1113] Use Fraktur in ISBoxen. --- src/haven/ISBox.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/ISBox.java b/src/haven/ISBox.java index 4c9b0b0790..ce29559e56 100644 --- a/src/haven/ISBox.java +++ b/src/haven/ISBox.java @@ -32,7 +32,7 @@ public class ISBox extends Widget implements DTarget { private Indir res; private Text label; static { - lf = new Text.Foundry(Text.sans, 18, java.awt.Color.WHITE); + lf = new Text.Foundry(Text.fraktur, 22, java.awt.Color.WHITE); lf.aa = true; } From efc931f95151f56c37aa4cec30dd66e7cf56534e Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 15 Jul 2014 01:03:44 +0200 Subject: [PATCH 0027/1113] Updated text-button appearance. --- src/haven/Button.java | 78 +++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/src/haven/Button.java b/src/haven/Button.java index e0cb213515..65d99101c1 100644 --- a/src/haven/Button.java +++ b/src/haven/Button.java @@ -31,16 +31,20 @@ import java.awt.Font; import java.awt.image.BufferedImage; -public class Button extends SSWidget { - static BufferedImage bl = Resource.loadimg("gfx/hud/buttons/tbtn/left"); - static BufferedImage br = Resource.loadimg("gfx/hud/buttons/tbtn/right"); - static BufferedImage bt = Resource.loadimg("gfx/hud/buttons/tbtn/top"); - static BufferedImage bb = Resource.loadimg("gfx/hud/buttons/tbtn/bottom"); - static BufferedImage dt = Resource.loadimg("gfx/hud/buttons/tbtn/dtex"); - static BufferedImage ut = Resource.loadimg("gfx/hud/buttons/tbtn/utex"); +public class Button extends SIWidget { + public static final BufferedImage bl = Resource.loadimg("gfx/hud/buttons/tbtn/left"); + public static final BufferedImage br = Resource.loadimg("gfx/hud/buttons/tbtn/right"); + public static final BufferedImage bt = Resource.loadimg("gfx/hud/buttons/tbtn/top"); + public static final BufferedImage bb = Resource.loadimg("gfx/hud/buttons/tbtn/bottom"); + public static final BufferedImage dt = Resource.loadimg("gfx/hud/buttons/tbtn/dtex"); + public static final BufferedImage ut = Resource.loadimg("gfx/hud/buttons/tbtn/utex"); + public static final BufferedImage bm = Resource.loadimg("gfx/hud/buttons/tbtn/mid"); + public static final int hs = bl.getHeight(), hl = bm.getHeight(); + public boolean lg; public Text text; public BufferedImage cont; - static Text.Foundry tf = new Text.Foundry(Text.serif, 12, Color.YELLOW); + static Text.Foundry tf = new Text.Foundry(Text.serif.deriveFont(Font.BOLD, 12)).aa(true); + static Text.Furnace nf = new PUtils.BlurFurn(new PUtils.TexFurn(tf, Window.ctex), 1, 1, new Color(80, 40, 0)); boolean a = false; UI.Grab d = null; @@ -62,46 +66,54 @@ public static Button wrapped(Coord c, int w, Widget parent, String text) { return(ret); } + private Button(Coord c, int w, Widget parent, boolean lg) { + super(c, new Coord(w, lg?hl:hs), parent); + this.lg = lg; + } + + private Button(Coord c, int w, Widget parent) { + this(c, w, parent, w >= (bl.getWidth() + bm.getWidth() + br.getWidth())); + } + public Button(Coord c, Integer w, Widget parent, String text) { - super(c, new Coord(w, 19), parent); - this.text = tf.render(text); + this(c, w, parent); + this.text = nf.render(text); this.cont = this.text.img; - render(); } public Button(Coord c, Integer w, Widget parent, Text text) { - super(c, new Coord(w, 19), parent); + this(c, w, parent); this.text = text; this.cont = text.img; - render(); } public Button(Coord c, Integer w, Widget parent, BufferedImage cont) { - super(c, new Coord(w, 19), parent); + this(c, w, parent); this.cont = cont; - render(); } - public void render() { - synchronized(this) { - Graphics g = graphics(); - g.drawImage(a?dt:ut, 3, 3, sz.x - 6, 13, null); - g.drawImage(bl, 0, 0, null); - g.drawImage(br, sz.x - br.getWidth(), 0, null); - g.drawImage(bt, 3, 0, sz.x - 6, bt.getHeight(), null); - g.drawImage(bb, 3, sz.y - bb.getHeight(), sz.x - 6, bb.getHeight(), null); - Coord tc = sz.div(2).add(Utils.imgsz(cont).div(2).inv()); - if(a) - tc = tc.add(1, 1); - g.drawImage(cont, tc.x, tc.y, null); - update(); - } + public void draw(BufferedImage img) { + Graphics g = img.getGraphics(); + int yo = lg?((hl - hs) / 2):0; + g.drawImage(a?dt:ut, 4, yo + 4, sz.x - 8, hs - 8, null); + + Coord tc = sz.sub(Utils.imgsz(cont)).div(2); + if(a) + tc = tc.add(1, 1); + g.drawImage(cont, tc.x, tc.y, null); + + g.drawImage(bl, 0, yo, null); + g.drawImage(br, sz.x - br.getWidth(), yo, null); + g.drawImage(bt, bl.getWidth(), yo, sz.x - bl.getWidth() - br.getWidth(), bt.getHeight(), null); + g.drawImage(bb, bl.getWidth(), yo + hs - bb.getHeight(), sz.x - bl.getWidth() - br.getWidth(), bb.getHeight(), null); + if(lg) + g.drawImage(bm, (sz.x - bm.getWidth()) / 2, 0, null); } public void change(String text, Color col) { this.text = tf.render(text, col); this.cont = this.text.img; - render(); + redraw(); } public void change(String text) { @@ -128,7 +140,7 @@ public void mousemove(Coord c) { boolean a = c.isect(Coord.z, sz); if(a != this.a) { this.a = a; - render(); + redraw(); } } } @@ -138,7 +150,7 @@ public boolean mousedown(Coord c, int button) { return(false); a = true; d = ui.grabmouse(this); - render(); + redraw(); return(true); } @@ -147,7 +159,7 @@ public boolean mouseup(Coord c, int button) { d.remove(); d = null; a = false; - render(); + redraw(); if(c.isect(new Coord(0, 0), sz)) click(); return(true); From d21c4c3c34b9209c517b5fd219360ee8703f35a3 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 15 Jul 2014 01:07:15 +0200 Subject: [PATCH 0028/1113] Changed window title rendering. --- src/haven/Window.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haven/Window.java b/src/haven/Window.java index 57038c129c..06cadcaba3 100644 --- a/src/haven/Window.java +++ b/src/haven/Window.java @@ -49,8 +49,8 @@ public class Window extends Widget implements DTarget { public static final Coord tlm = new Coord(18, 30), brm = new Coord(13, 22), cpo = new Coord(36, 17); public static final int capo = 7, capio = 2; public static final Coord mrgn = new Coord(9, 9); - public static final Color cc = new Color(255, 224, 0); - public static final Text.Furnace cf = new Text.Imager(new Text.Foundry(Text.fraktur, 15, cc).aa(true)) { + public static final BufferedImage ctex = Resource.loadimg("gfx/hud/fonttex"); + public static final Text.Furnace cf = new Text.Imager(new PUtils.TexFurn(new Text.Foundry(Text.fraktur, 15).aa(true), ctex)) { protected BufferedImage proc(Text text) { return(rasterimg(blurmask2(text.img.getRaster(), 1, 1, Color.BLACK))); } From f5b250b735ee0d58cc5c12e2f068a48c2700ba58 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 15 Jul 2014 01:07:34 +0200 Subject: [PATCH 0029/1113] Added a very basic character window. --- src/haven/CharWnd.java | 133 +++++++++++++++++++++++++++++++++++++++++ src/haven/GameUI.java | 14 +++++ 2 files changed, 147 insertions(+) create mode 100644 src/haven/CharWnd.java diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java new file mode 100644 index 0000000000..52141547de --- /dev/null +++ b/src/haven/CharWnd.java @@ -0,0 +1,133 @@ +/* + * This file is part of the Haven & Hearth game client. + * Copyright (C) 2009 Fredrik Tolf , and + * Björn Johannessen + * + * Redistribution and/or modification of this file is subject to the + * terms of the GNU Lesser General Public License, version 3, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Other parts of this source tree adhere to other copying + * rights. Please see the file `COPYING' in the root directory of the + * source tree for details. + * + * A copy the GNU Lesser General Public License is distributed along + * with the source tree of which this file is a part in the file + * `doc/LPGL-3'. If it is missing for any reason, please see the Free + * Software Foundation's website at , or write + * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + */ + +package haven; + +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.awt.font.TextAttribute; +import java.util.*; +import static haven.Window.wbox; + +public class CharWnd extends Window { + public static final Text.Furnace catf = new PUtils.BlurFurn(new PUtils.TexFurn(new Text.Foundry(Text.fraktur, 25).aa(true), Window.ctex), 3, 1, new Color(128, 64, 0)); + public static final Text.Foundry attrf = new Text.Foundry(Text.fraktur, 18).aa(true); + public static final Color debuff = new Color(255, 128, 128); + public static final Color buff = new Color(128, 255, 128); + + public static class FoodMeter extends Widget { + public static final Tex frame = Resource.loadtex("gfx/hud/chr/foodm"); + public static final Coord marg = new Coord(5, 5); + + public FoodMeter(Coord c, Widget parent) { + super(c, frame.sz(), parent); + } + + public void draw(GOut g) { + g.chcolor(0, 0, 0, 255); + g.frect(marg, sz.sub(marg.mul(2))); + g.chcolor(); + g.image(frame, Coord.z); + } + } + + public static final int attrw = FoodMeter.frame.sz().x - wbox.bisz().x; + public class Attr extends Widget { + public final String nm; + public final Text rnm; + public final Glob.CAttr attr; + public final Tex img; + public final Color bg; + private Text ct; + private int cv; + + private Attr(String attr, String rnm, Coord c, Color bg) { + super(c, new Coord(attrw, attrf.height() + 2), CharWnd.this); + this.nm = attr; + this.img = Resource.load("gfx/hud/chr/" + attr).loadwait().layer(Resource.imgc).tex(); + this.rnm = attrf.render(rnm); + this.attr = ui.sess.glob.cattr.get(attr); + this.bg = bg; + } + + public void tick(double dt) { + if(attr.comp != cv) { + cv = attr.comp; + Color c = Color.WHITE; + if(attr.comp > attr.base) { + c = buff; + tooltip = Text.render(String.format("%d + %d", attr.base, attr.comp - attr.base)); + } else if(attr.comp < attr.base) { + c = debuff; + tooltip = Text.render(String.format("%d - %d", attr.base, attr.base - attr.comp)); + } else { + tooltip = null; + } + ct = attrf.render(Integer.toString(cv), c); + } + } + + public void draw(GOut g) { + g.chcolor(bg); + g.frect(Coord.z, sz); + g.chcolor(); + Coord cn = new Coord(0, sz.y / 2); + g.aimage(img, cn.add(5, 0), 0, 0.5); + g.aimage(rnm.tex(), cn.add(img.sz().x + 10, 1), 0, 0.5); + g.aimage(ct.tex(), cn.add(sz.x - 7, 1), 1, 0.5); + } + } + + @RName("chr") + public static class $_ implements Factory { + public Widget create(Coord c, Widget parent, Object[] args) { + return(new CharWnd(c, parent)); + } + } + + public CharWnd(Coord pc, Widget parent) { + super(pc, new Coord(300, 290), parent, "Character Sheet"); + + int x = 15, y = 10; + new Img(new Coord(x, y), catf.render("Base Attributes").tex(), this); y += 35; + List base = new ArrayList(); + Attr aw; + Color every = new Color(255, 255, 255, 16), other = new Color(255, 255, 255, 32); + base.add(aw = new Attr("str", "Strength", wbox.btloff().add(x, y), every)); y += aw.sz.y; + base.add(aw = new Attr("agi", "Agility", wbox.btloff().add(x, y), other)); y += aw.sz.y; + base.add(aw = new Attr("int", "Intelligence", wbox.btloff().add(x, y), every)); y += aw.sz.y; + base.add(aw = new Attr("con", "Constitution", wbox.btloff().add(x, y), other)); y += aw.sz.y; + base.add(aw = new Attr("prc", "Perception", wbox.btloff().add(x, y), every)); y += aw.sz.y; + base.add(aw = new Attr("csm", "Charisma", wbox.btloff().add(x, y), other)); y += aw.sz.y; + base.add(aw = new Attr("dex", "Dexterity", wbox.btloff().add(x, y), every)); y += aw.sz.y; + base.add(aw = new Attr("psy", "Psyche", wbox.btloff().add(x, y), other)); y += aw.sz.y; + Frame.around(this, base); + y += 20; + new FoodMeter(new Coord(x, y), this); + + resize(contentsz().add(15, 10)); + } +} diff --git a/src/haven/GameUI.java b/src/haven/GameUI.java index 02a79491f3..6ea84cfa9c 100644 --- a/src/haven/GameUI.java +++ b/src/haven/GameUI.java @@ -45,6 +45,7 @@ public class GameUI extends ConsoleHost implements Console.Directory { private long errtime; private Window invwnd, equwnd, makewnd; public Inventory maininv; + public CharWnd chrwdg; public BuddyWnd buddies; public Polity polity; public HelpWnd help; @@ -190,6 +191,10 @@ public Widget makechild(String type, Object[] pargs, Object[] cargs) { hand.add(new DraggedItem(g, lc)); updhand(); return(g); + } else if(place == "chr") { + chrwdg = (CharWnd)gettype(type).create(new Coord(100, 50), this, cargs); + chrwdg.hide(); + return(chrwdg); } else if(place == "craft") { final Widget[] mk = {null}; makewnd = new Window(new Coord(200, 100), Coord.z, this, "Crafting") { @@ -246,6 +251,8 @@ public void cdestroy(Widget w) { } } else if(w == polity) { polity = null; + } else if(w == chrwdg) { + chrwdg = null; } } @@ -345,6 +352,8 @@ public void wdgmsg(Widget sender, String msg, Object... args) { if(sender == menu) { wdgmsg(msg, args); return; + } else if((sender == chrwdg) && (msg == "close")) { + chrwdg.hide(); } else if((sender == buddies) && (msg == "close")) { buddies.hide(); } else if((sender == polity) && (msg == "close")) { @@ -384,6 +393,11 @@ public boolean globtype(char key, KeyEvent ev) { fitwdg(equwnd); } return(true); + } else if(key == 20) { + if((chrwdg != null) && chrwdg.show(!chrwdg.visible)) { + chrwdg.raise(); + fitwdg(chrwdg); + } } else if(key == 2) { if((buddies != null) && buddies.show(!buddies.visible)) { buddies.raise(); From 0db5e657ad7447e0c54f1977c559889ec22f7a11 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 15 Jul 2014 04:08:03 +0200 Subject: [PATCH 0030/1113] More fully implemented food-meter. --- src/haven/CharWnd.java | 106 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 103 insertions(+), 3 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 52141547de..f53a4248de 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -37,21 +37,98 @@ public class CharWnd extends Window { public static final Text.Foundry attrf = new Text.Foundry(Text.fraktur, 18).aa(true); public static final Color debuff = new Color(255, 128, 128); public static final Color buff = new Color(128, 255, 128); + public final Collection base; + public final FoodMeter feps; public static class FoodMeter extends Widget { public static final Tex frame = Resource.loadtex("gfx/hud/chr/foodm"); public static final Coord marg = new Coord(5, 5); + public double cap; + public List els = new LinkedList(), enew = null; + + @Resource.LayerName("foodev") + public static class Event extends Resource.Layer { + public final Color col; + public final String nm; + public final int sort; + + public Event(Resource res, byte[] bbuf) { + res.super(); + Message buf = new Message(0, bbuf); + int ver = buf.uint8(); + if(ver == 1) { + col = new Color(buf.uint8(), buf.uint8(), buf.uint8(), buf.uint8()); + nm = buf.string(); + sort = buf.int16(); + } else { + throw(new Resource.LoadException("unknown foodev version: " + ver, res)); + } + } + + public void init() {} + } + + public static class El { + public final Indir res; + public double a; + + public El(Indir res, double a) {this.res = res; this.a = a;} + + private Event ev = null; + public Event ev() { + if(ev == null) + ev = res.get().layer(Event.class); + return(ev); + } + } public FoodMeter(Coord c, Widget parent) { super(c, frame.sz(), parent); } + public void tick(double dt) { + if(enew != null) { + try { + Collections.sort(enew, new Comparator() { + public int compare(El a, El b) { + int c; + if((c = (a.ev().sort - b.ev().sort)) != 0) + return(c); + return(a.ev().nm.compareTo(b.ev().nm)); + } + }); + els = enew; + } catch(Loading l) { + } + } + } + public void draw(GOut g) { g.chcolor(0, 0, 0, 255); g.frect(marg, sz.sub(marg.mul(2))); + double x = 0; + int w = sz.x - (marg.x * 2); + for(El el : els) { + int l = (int)Math.floor((x / cap) * w); + int r = (int)Math.floor(((x += el.a) / cap) * w); + g.chcolor(el.ev().col); + g.frect(new Coord(marg.x + l, marg.y), new Coord(marg.x + r - l, sz.y - (marg.y * 2))); + } g.chcolor(); g.image(frame, Coord.z); } + + public void update(Object... args) { + int n = 0; + this.cap = (Float)args[n++]; + List enew = new LinkedList(); + while(n < args.length) { + Indir res = ui.sess.getres((Integer)args[n++]); + double a = (Float)args[n++]; + enew.add(new El(res, a)); + } + this.enew = enew; + } } public static final int attrw = FoodMeter.frame.sz().x - wbox.bisz().x; @@ -61,6 +138,7 @@ public class Attr extends Widget { public final Glob.CAttr attr; public final Tex img; public final Color bg; + private double lvlt = 0.0; private Text ct; private int cv; @@ -88,10 +166,15 @@ public void tick(double dt) { } ct = attrf.render(Integer.toString(cv), c); } + if((lvlt > 0.0) && ((lvlt -= dt) < 0)) + lvlt = 0.0; } public void draw(GOut g) { - g.chcolor(bg); + if(lvlt != 0.0) + g.chcolor(Utils.blendcol(bg, new Color(128, 255, 128, 128), lvlt)); + else + g.chcolor(bg); g.frect(Coord.z, sz); g.chcolor(); Coord cn = new Coord(0, sz.y / 2); @@ -99,6 +182,10 @@ public void draw(GOut g) { g.aimage(rnm.tex(), cn.add(img.sz().x + 10, 1), 0, 0.5); g.aimage(ct.tex(), cn.add(sz.x - 7, 1), 1, 0.5); } + + public void lvlup() { + lvlt = 1.0; + } } @RName("chr") @@ -113,7 +200,7 @@ public CharWnd(Coord pc, Widget parent) { int x = 15, y = 10; new Img(new Coord(x, y), catf.render("Base Attributes").tex(), this); y += 35; - List base = new ArrayList(); + base = new ArrayList(); Attr aw; Color every = new Color(255, 255, 255, 16), other = new Color(255, 255, 255, 32); base.add(aw = new Attr("str", "Strength", wbox.btloff().add(x, y), every)); y += aw.sz.y; @@ -126,8 +213,21 @@ public CharWnd(Coord pc, Widget parent) { base.add(aw = new Attr("psy", "Psyche", wbox.btloff().add(x, y), other)); y += aw.sz.y; Frame.around(this, base); y += 20; - new FoodMeter(new Coord(x, y), this); + feps = new FoodMeter(new Coord(x, y), this); resize(contentsz().add(15, 10)); } + + public void uimsg(String nm, Object... args) { + if(nm == "food") { + feps.update(args); + } else if(nm == "lvl") { + for(Attr aw : base) { + if(aw.nm.equals(args[0])) + aw.lvlup(); + } + } else { + super.uimsg(nm, args); + } + } } From c9cb9cf931e86d344331c5055ff8ddd11a689150 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 15 Jul 2014 04:48:24 +0200 Subject: [PATCH 0031/1113] Changed make-window default placement. --- src/haven/GameUI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/GameUI.java b/src/haven/GameUI.java index 6ea84cfa9c..07befcfbc0 100644 --- a/src/haven/GameUI.java +++ b/src/haven/GameUI.java @@ -197,7 +197,7 @@ public Widget makechild(String type, Object[] pargs, Object[] cargs) { return(chrwdg); } else if(place == "craft") { final Widget[] mk = {null}; - makewnd = new Window(new Coord(200, 100), Coord.z, this, "Crafting") { + makewnd = new Window(new Coord(400, 200), Coord.z, this, "Crafting") { public void wdgmsg(Widget sender, String msg, Object... args) { if((sender == this) && msg.equals("close")) { mk[0].wdgmsg("close"); From 67fe1f27a58a7e40c4deca899ab966413056b2d3 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 15 Jul 2014 04:53:31 +0200 Subject: [PATCH 0032/1113] Changed character window default placement. --- src/haven/GameUI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/GameUI.java b/src/haven/GameUI.java index 07befcfbc0..037fc0ede1 100644 --- a/src/haven/GameUI.java +++ b/src/haven/GameUI.java @@ -192,7 +192,7 @@ public Widget makechild(String type, Object[] pargs, Object[] cargs) { updhand(); return(g); } else if(place == "chr") { - chrwdg = (CharWnd)gettype(type).create(new Coord(100, 50), this, cargs); + chrwdg = (CharWnd)gettype(type).create(new Coord(300, 50), this, cargs); chrwdg.hide(); return(chrwdg); } else if(place == "craft") { From b17cbeb5eabdf5984986dc702a2c19392b1b4635 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 15 Jul 2014 05:59:41 +0200 Subject: [PATCH 0033/1113] Fixed food-meter loading bug. --- src/haven/CharWnd.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index f53a4248de..11c6d55644 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -111,8 +111,11 @@ public void draw(GOut g) { for(El el : els) { int l = (int)Math.floor((x / cap) * w); int r = (int)Math.floor(((x += el.a) / cap) * w); - g.chcolor(el.ev().col); - g.frect(new Coord(marg.x + l, marg.y), new Coord(marg.x + r - l, sz.y - (marg.y * 2))); + try { + g.chcolor(el.ev().col); + g.frect(new Coord(marg.x + l, marg.y), new Coord(marg.x + r - l, sz.y - (marg.y * 2))); + } catch(Loading e) { + } } g.chcolor(); g.image(frame, Coord.z); From 442ce92951b39a8b13d2b78b6ee7977d6099850f Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 15 Jul 2014 06:37:50 +0200 Subject: [PATCH 0034/1113] Increased make-window button sizes. --- src/haven/Makewindow.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haven/Makewindow.java b/src/haven/Makewindow.java index 60f356d6ed..a9c42493ef 100644 --- a/src/haven/Makewindow.java +++ b/src/haven/Makewindow.java @@ -64,8 +64,8 @@ public Makewindow(Coord c, Widget parent, String rcpnm) { nm.c = new Coord(sz.x - nm.sz.x, 0); new Label(new Coord(0, 8), this, "Input:"); new Label(new Coord(0, 63), this, "Result:"); - obtn = new Button(new Coord(290, 71), 60, this, "Craft"); - cbtn = new Button(new Coord(360, 71), 60, this, "Craft All"); + obtn = new Button(new Coord(265, 71), 85, this, "Craft"); + cbtn = new Button(new Coord(360, 71), 85, this, "Craft All"); pack(); } From 8cb39560685f1f09f4a06ec0dde30e2fd39e557f Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 16 Jul 2014 19:45:06 +0200 Subject: [PATCH 0035/1113] Receive food-event trigger messages. --- src/haven/CharWnd.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 11c6d55644..0b86798c58 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -132,6 +132,9 @@ public void update(Object... args) { } this.enew = enew; } + + public void trig(Indir ev) { + } } public static final int attrw = FoodMeter.frame.sz().x - wbox.bisz().x; @@ -224,6 +227,8 @@ public CharWnd(Coord pc, Widget parent) { public void uimsg(String nm, Object... args) { if(nm == "food") { feps.update(args); + } else if(nm == "ftrig") { + feps.trig(ui.sess.getres((Integer)args[0])); } else if(nm == "lvl") { for(Attr aw : base) { if(aw.nm.equals(args[0])) From cbfe829d06f488c54992007c5e8934158b04ae30 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 16 Jul 2014 20:51:31 +0200 Subject: [PATCH 0036/1113] Draw triggered events specially. --- src/haven/CharWnd.java | 91 ++++++++++++++++++++++++++++++++---------- 1 file changed, 70 insertions(+), 21 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 0b86798c58..894deb0f1e 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -27,13 +27,15 @@ package haven; import java.awt.Color; +import java.awt.Graphics; import java.awt.image.BufferedImage; import java.awt.font.TextAttribute; import java.util.*; import static haven.Window.wbox; +import static haven.PUtils.*; public class CharWnd extends Window { - public static final Text.Furnace catf = new PUtils.BlurFurn(new PUtils.TexFurn(new Text.Foundry(Text.fraktur, 25).aa(true), Window.ctex), 3, 1, new Color(128, 64, 0)); + public static final Text.Furnace catf = new BlurFurn(new TexFurn(new Text.Foundry(Text.fraktur, 25).aa(true), Window.ctex), 3, 1, new Color(128, 64, 0)); public static final Text.Foundry attrf = new Text.Foundry(Text.fraktur, 18).aa(true); public static final Color debuff = new Color(255, 128, 128); public static final Color buff = new Color(128, 255, 128); @@ -42,9 +44,13 @@ public class CharWnd extends Window { public static class FoodMeter extends Widget { public static final Tex frame = Resource.loadtex("gfx/hud/chr/foodm"); - public static final Coord marg = new Coord(5, 5); + public static final Coord marg = new Coord(5, 5), trmg = new Coord(10, 10); public double cap; - public List els = new LinkedList(), enew = null; + public List els = new LinkedList(); + private List enew = null, etr = null; + private Indir trev = null; + private Tex trol; + private long trtm = 0; @Resource.LayerName("foodev") public static class Event extends Resource.Layer { @@ -81,44 +87,85 @@ public Event ev() { return(ev); } } + public static final Comparator dcmp = new Comparator() { + public int compare(El a, El b) { + int c; + if((c = (a.ev().sort - b.ev().sort)) != 0) + return(c); + return(a.ev().nm.compareTo(b.ev().nm)); + } + }; public FoodMeter(Coord c, Widget parent) { super(c, frame.sz(), parent); } - public void tick(double dt) { - if(enew != null) { - try { - Collections.sort(enew, new Comparator() { - public int compare(El a, El b) { - int c; - if((c = (a.ev().sort - b.ev().sort)) != 0) - return(c); - return(a.ev().nm.compareTo(b.ev().nm)); - } - }); - els = enew; - } catch(Loading l) { + private BufferedImage mktrol(List els, Indir trev) { + BufferedImage buf = TexI.mkbuf(sz.add(trmg.mul(2))); + Coord marg2 = marg.add(trmg); + Graphics g = buf.getGraphics(); + double x = 0; + int w = sz.x - (marg.x * 2); + for(El el : els) { + int l = (int)Math.floor((x / cap) * w); + int r = (int)Math.floor(((x += el.a) / cap) * w); + if(el.res == trev) { + g.setColor(Utils.blendcol(el.ev().col, Color.WHITE, 0.5)); + g.fillRect(marg2.x - (trmg.x / 2) + l, marg2.y - (trmg.y / 2), r - l + trmg.x, sz.y - (marg.y * 2) + trmg.y); } } + imgblur(buf.getRaster(), trmg.x, trmg.y); + return(buf); } - public void draw(GOut g) { - g.chcolor(0, 0, 0, 255); - g.frect(marg, sz.sub(marg.mul(2))); + private void drawels(GOut g, List els, int alpha) { double x = 0; int w = sz.x - (marg.x * 2); for(El el : els) { int l = (int)Math.floor((x / cap) * w); int r = (int)Math.floor(((x += el.a) / cap) * w); try { - g.chcolor(el.ev().col); - g.frect(new Coord(marg.x + l, marg.y), new Coord(marg.x + r - l, sz.y - (marg.y * 2))); + Color col = el.ev().col; + g.chcolor(new Color(col.getRed(), col.getGreen(), col.getBlue(), alpha)); + g.frect(new Coord(marg.x + l, marg.y), new Coord(r - l, sz.y - (marg.y * 2))); } catch(Loading e) { } } + } + + public void tick(double dt) { + if(enew != null) { + try { + Collections.sort(enew, dcmp); + els = enew; + } catch(Loading l) {} + } + if(trev != null) { + try { + Collections.sort(etr, dcmp); + trol = new TexI(mktrol(etr, trev)); + trtm = System.currentTimeMillis(); + trev = null; + } catch(Loading l) {} + } + } + + public void draw(GOut g) { + int d = (trtm > 0)?((int)(System.currentTimeMillis() - trtm)):Integer.MAX_VALUE; + g.chcolor(0, 0, 0, 255); + g.frect(marg, sz.sub(marg.mul(2))); + drawels(g, els, 255); + if(d < 1000) + drawels(g, etr, 255 - ((d * 255) / 1000)); g.chcolor(); g.image(frame, Coord.z); + if(d < 2500) { + GOut g2 = g.reclipl(trmg.inv(), sz.add(trmg.mul(2))); + g2.chcolor(255, 255, 255, 255 - ((d * 255) / 2500)); + g2.image(trol, Coord.z); + } else { + trtm = 0; + } } public void update(Object... args) { @@ -134,6 +181,8 @@ public void update(Object... args) { } public void trig(Indir ev) { + etr = (enew != null)?enew:els; + trev = ev; } } From 926e03bdd37bebcb0bc92f6e43bd9c17abd1f419 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 31 Jul 2014 04:33:37 +0200 Subject: [PATCH 0037/1113] Fix Frame name conflict in MainFrame. --- src/haven/MainFrame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/MainFrame.java b/src/haven/MainFrame.java index acb9646e20..4ef8929201 100644 --- a/src/haven/MainFrame.java +++ b/src/haven/MainFrame.java @@ -32,7 +32,7 @@ import java.util.*; import java.lang.reflect.*; -public class MainFrame extends Frame implements Runnable, Console.Directory { +public class MainFrame extends java.awt.Frame implements Runnable, Console.Directory { HavenPanel p; private final ThreadGroup g; public final Thread mt; From 2de6ee66cf2ead600f76ee6c8748d169b7168e9a Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Mon, 4 Aug 2014 08:43:10 +0200 Subject: [PATCH 0038/1113] Decreased the default ridge segment-height. --- src/haven/resutil/Ridges.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/resutil/Ridges.java b/src/haven/resutil/Ridges.java index 8eaa3911a7..993716e69a 100644 --- a/src/haven/resutil/Ridges.java +++ b/src/haven/resutil/Ridges.java @@ -40,7 +40,7 @@ public class Ridges extends MapMesh.Hooks { public static final MapMesh.DataID id = MapMesh.makeid(Ridges.class); - public static final int segh = 11; + public static final int segh = 5; public final MapMesh m; private final MapMesh.MapSurface ms; private final boolean[] breaks; From 36c2adc84b6332845069de8a5c691b7562e69361 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 5 Aug 2014 21:13:02 +0200 Subject: [PATCH 0039/1113] Improved GLProgram error reporting. --- src/haven/GLProgram.java | 77 +++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 25 deletions(-) diff --git a/src/haven/GLProgram.java b/src/haven/GLProgram.java index e1a93a0b7e..60e413f9d9 100644 --- a/src/haven/GLProgram.java +++ b/src/haven/GLProgram.java @@ -69,6 +69,41 @@ else if(s instanceof FragmentShader) shaders.add(FragmentShader.makemain(fs)); } + public static class ProgramException extends RuntimeException { + public final GLProgram program; + + public ProgramException(String msg, GLProgram program) { + super(msg); + this.program = program; + } + } + + public static class UnknownExternException extends ProgramException { + public final String type, symbol; + + public UnknownExternException(String msg, GLProgram program, String type, String symbol) { + super(msg, program); + this.type = type; + this.symbol = symbol; + } + } + + public static class LinkException extends ProgramException { + public final String info; + + public LinkException(String msg, GLProgram program, String info) { + super(msg, program); + this.info = info; + } + + public String toString() { + if(info == null) + return(super.toString()); + else + return(super.toString() + "\nLog:\n" + info); + } + } + public static class ProgOb extends GLObject { public final int id; @@ -96,43 +131,25 @@ public void link(GLProgram prog) { /* The "platform's default charset" is probably a reasonable choice. */ info = new String(logbuf, 0, buf[0]); } - throw(new ProgramException("Failed to link GL program", prog, info)); + throw(new LinkException("Failed to link GL program", prog, info)); } } public int uniform(String name) { int r = gl.glGetUniformLocationARB(id, name); if(r < 0) - throw(new RuntimeException("Unknown uniform name: " + name)); + throw(new NoSuchElementException(name)); return(r); } public int attrib(String name) { int r = gl.glGetAttribLocation(id, name); if(r < 0) - throw(new RuntimeException("Unknown uniform name: " + name)); + throw(new NoSuchElementException(name)); return(r); } } - public static class ProgramException extends RuntimeException { - public final GLProgram program; - public final String info; - - public ProgramException(String msg, GLProgram program, String info) { - super(msg); - this.program = program; - this.info = info; - } - - public String toString() { - if(info == null) - return(super.toString()); - else - return(super.toString() + "\nLog:\n" + info); - } - } - public void apply(GOut g) { synchronized(this) { if((glp != null) && (glp.gl != g.gl)) @@ -160,16 +177,26 @@ public void dispose() { private final Map umap = new IdentityHashMap(); public int uniform(String name) { Integer r = umap.get(name); - if(r == null) - umap.put(name, r = new Integer(glp.uniform(name))); + if(r == null) { + try { + umap.put(name, r = new Integer(glp.uniform(name))); + } catch(NoSuchElementException e) { + throw(new UnknownExternException("Unknown uniform name: " + name, this, "uniform", name)); + } + } return(r.intValue()); } private final Map amap = new IdentityHashMap(); public int attrib(String name) { Integer r = amap.get(name); - if(r == null) - amap.put(name, r = new Integer(glp.attrib(name))); + if(r == null) { + try { + amap.put(name, r = new Integer(glp.attrib(name))); + } catch(NoSuchElementException e) { + throw(new UnknownExternException("Unknown attribute name: " + name, this, "attrib", name)); + } + } return(r.intValue()); } } From ee4995c165f4d3c09c9c1383353c832c65dcc233 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 6 Aug 2014 21:32:39 +0200 Subject: [PATCH 0040/1113] Updated ShaderMacro to use new exceptions. --- src/haven/glsl/ShaderMacro.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haven/glsl/ShaderMacro.java b/src/haven/glsl/ShaderMacro.java index e3e7cd67cb..9145783f81 100644 --- a/src/haven/glsl/ShaderMacro.java +++ b/src/haven/glsl/ShaderMacro.java @@ -158,7 +158,7 @@ public int cuniform(Uniform var) { public int uniform(Uniform var) { int r = cuniform(var); if(r < 0) - throw(new ProgramException("Uniform not found in symtab: " + var, this, null)); + throw(new UnknownExternException("Uniform not found in symtab: " + var, this, "uniform", var.toString())); return(r); } private final Map amap = new IdentityHashMap(); @@ -177,7 +177,7 @@ public int cattrib(Attribute var) { public int attrib(Attribute var) { int r = cattrib(var); if(r < 0) - throw(new ProgramException("Attribute not found in symtab: " + var, this, null)); + throw(new UnknownExternException("Attribute not found in symtab: " + var, this, "attrib", var.toString())); return(r); } } From 49a6d66cb2c2a5f9635ac6dfaf502ef7f5bdced6 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 6 Aug 2014 21:36:49 +0200 Subject: [PATCH 0041/1113] Made shadermacro program symtabs transient. --- src/haven/glsl/ShaderMacro.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haven/glsl/ShaderMacro.java b/src/haven/glsl/ShaderMacro.java index 9145783f81..621bb4a0ce 100644 --- a/src/haven/glsl/ShaderMacro.java +++ b/src/haven/glsl/ShaderMacro.java @@ -142,7 +142,7 @@ public void dispose() { } /* XXX: It would be terribly nice to replace these with some faster operation. */ - private final Map umap = new IdentityHashMap(); + private final transient Map umap = new IdentityHashMap(); public int cuniform(Uniform var) { Integer r = umap.get(var); if(r == null) { @@ -161,7 +161,7 @@ public int uniform(Uniform var) { throw(new UnknownExternException("Uniform not found in symtab: " + var, this, "uniform", var.toString())); return(r); } - private final Map amap = new IdentityHashMap(); + private final transient Map amap = new IdentityHashMap(); public int cattrib(Attribute var) { Integer r = amap.get(var); if(r == null) { From 96109bd90b889cfa6004f488f4cacde73edf9664 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 12 Aug 2014 00:39:31 +0200 Subject: [PATCH 0042/1113] Adjusted character sheet a bit. --- src/haven/CharWnd.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 894deb0f1e..ec813860ed 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -35,7 +35,7 @@ import static haven.PUtils.*; public class CharWnd extends Window { - public static final Text.Furnace catf = new BlurFurn(new TexFurn(new Text.Foundry(Text.fraktur, 25).aa(true), Window.ctex), 3, 1, new Color(128, 64, 0)); + public static final Text.Furnace catf = new BlurFurn(new TexFurn(new Text.Foundry(Text.fraktur, 25).aa(true), Window.ctex), 3, 1, new Color(96, 48, 0)); public static final Text.Foundry attrf = new Text.Foundry(Text.fraktur, 18).aa(true); public static final Color debuff = new Color(255, 128, 128); public static final Color buff = new Color(128, 255, 128); @@ -268,6 +268,7 @@ public CharWnd(Coord pc, Widget parent) { base.add(aw = new Attr("psy", "Psyche", wbox.btloff().add(x, y), other)); y += aw.sz.y; Frame.around(this, base); y += 20; + new Img(new Coord(x, y), catf.render("Food Event Points").tex(), this); y += 35; feps = new FoodMeter(new Coord(x, y), this); resize(contentsz().add(15, 10)); From 3ba43f9d7f14296beddec1fdd5bb13e9686a9454 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 12 Aug 2014 00:44:06 +0200 Subject: [PATCH 0043/1113] Adjusted char-sheet blur radius by 1 pixel. --- src/haven/CharWnd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index ec813860ed..39f7f05abb 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -35,7 +35,7 @@ import static haven.PUtils.*; public class CharWnd extends Window { - public static final Text.Furnace catf = new BlurFurn(new TexFurn(new Text.Foundry(Text.fraktur, 25).aa(true), Window.ctex), 3, 1, new Color(96, 48, 0)); + public static final Text.Furnace catf = new BlurFurn(new TexFurn(new Text.Foundry(Text.fraktur, 25).aa(true), Window.ctex), 3, 2, new Color(96, 48, 0)); public static final Text.Foundry attrf = new Text.Foundry(Text.fraktur, 18).aa(true); public static final Color debuff = new Color(255, 128, 128); public static final Color buff = new Color(128, 255, 128); From 5fe4bd8064bb62088991aa92751fae2593cc0c37 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 12 Aug 2014 00:46:32 +0200 Subject: [PATCH 0044/1113] Adjusted charsheet a slight bit further. --- src/haven/CharWnd.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 39f7f05abb..632dac38ac 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -254,7 +254,7 @@ public CharWnd(Coord pc, Widget parent) { super(pc, new Coord(300, 290), parent, "Character Sheet"); int x = 15, y = 10; - new Img(new Coord(x, y), catf.render("Base Attributes").tex(), this); y += 35; + new Img(new Coord(x - 5, y), catf.render("Base Attributes").tex(), this); y += 35; base = new ArrayList(); Attr aw; Color every = new Color(255, 255, 255, 16), other = new Color(255, 255, 255, 32); @@ -268,7 +268,7 @@ public CharWnd(Coord pc, Widget parent) { base.add(aw = new Attr("psy", "Psyche", wbox.btloff().add(x, y), other)); y += aw.sz.y; Frame.around(this, base); y += 20; - new Img(new Coord(x, y), catf.render("Food Event Points").tex(), this); y += 35; + new Img(new Coord(x - 5, y), catf.render("Food Event Points").tex(), this); y += 35; feps = new FoodMeter(new Coord(x, y), this); resize(contentsz().add(15, 10)); From 18d2bc5e9cb395a6cb37a6c360bb3291ca330c94 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 21 Aug 2014 20:11:31 +0200 Subject: [PATCH 0045/1113] Changed item meter appearance. --- src/haven/WItem.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/haven/WItem.java b/src/haven/WItem.java index 56129e3d24..57e72674bf 100644 --- a/src/haven/WItem.java +++ b/src/haven/WItem.java @@ -206,10 +206,11 @@ public void draw(GOut g) { } else if(itemnum.get() != null) { g.aimage(itemnum.get(), sz, 1, 1); } - if(item.meter > 0) { - double a = ((double)item.meter) / 100.0; + if (item.meter > 0) { + double a = ((double) item.meter) / 100.0; g.chcolor(255, 255, 255, 64); - g.fellipse(this.sz.div(2), new Coord(15, 15), 90, (int)(90 + (360 * a))); + Coord half = Inventory.sqsz.div(2); + g.prect(half, half.inv(), half, a * Math.PI * 2); g.chcolor(); } } else { From f3141a19b2f16d08c5e589333ef287512f53c65c Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 3 Sep 2014 01:23:25 +0200 Subject: [PATCH 0046/1113] Fixed window caption rendering bug. --- src/haven/Window.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/Window.java b/src/haven/Window.java index 06cadcaba3..546672ed8e 100644 --- a/src/haven/Window.java +++ b/src/haven/Window.java @@ -116,7 +116,7 @@ private void drawframe(GOut g) { g.image(cl, tlo); mdo = tlo.add(cl.sz().x, 0); cbr = mdo.add(cmw, cm.sz().y); - for(int x = 0; x < cmw; x++) + for(int x = 0; x < cmw; x += cm.sz().x) g.image(cm, mdo.add(x, 0), Coord.z, cbr); g.image(cr, tlo.add(cl.sz().x + cmw, 0)); g.image(cap.tex(), tlo.add(cpo)); From c95cd0860a3937c216a741010640256d982eecf6 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 9 Sep 2014 02:55:17 +0200 Subject: [PATCH 0047/1113] Added satiation display. --- src/haven/CharWnd.java | 103 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 632dac38ac..63dfe81f25 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -39,8 +39,10 @@ public class CharWnd extends Window { public static final Text.Foundry attrf = new Text.Foundry(Text.fraktur, 18).aa(true); public static final Color debuff = new Color(255, 128, 128); public static final Color buff = new Color(128, 255, 128); + public static final Color every = new Color(255, 255, 255, 16), other = new Color(255, 255, 255, 32); public final Collection base; public final FoodMeter feps; + public final Constipations cons; public static class FoodMeter extends Widget { public static final Tex frame = Resource.loadtex("gfx/hud/chr/foodm"); @@ -186,6 +188,94 @@ public void trig(Indir ev) { } } + public static class Constipations extends Listbox { + public static final Text.Foundry elf = attrf; + public static final Convolution tflt = new Hanning(1); + public static final Color full = new Color(250, 230, 64), none = new Color(250, 19, 43); + public final List els = new ArrayList(); + + public static class El { + public static final int h = elf.height() + 2; + public final Indir t; + public double a; + private Tex tt, at; + + public El(Indir t, double a) {this.t = t; this.a = a;} + public void update(double a) {this.a = a; at = null;} + + public Tex tt() { + if(tt == null) { + BufferedImage img = t.get().layer(Resource.imgc).img; + String nm = t.get().layer(Resource.tooltip).t; + Text rnm = elf.render(nm); + BufferedImage buf = TexI.mkbuf(new Coord(El.h + 5 + rnm.sz().x, h)); + Graphics g = buf.getGraphics(); + g.drawImage(convolvedown(img, new Coord(h, h), tflt), 0, 0, null); + g.drawImage(rnm.img, h + 5, ((h - rnm.sz().y) / 2) + 1, null); + g.dispose(); + tt = new TexI(buf); + } + return(tt); + } + + public Tex at() { + if(at == null) + at = elf.render(String.format("%d%%", (int)Math.floor(a * 100)), Utils.blendcol(none, full, a)).tex(); + return(at); + } + } + + public static final Comparator ecmp = new Comparator() { + public int compare(El a, El b) { + if(a.a < b.a) + return(-1); + else if(a.a > b.a) + return(1); + return(0); + } + }; + + public Constipations(Coord c, Widget parent, int w, int h) { + super(c, parent, w, h, El.h); + } + + protected void drawbg(GOut g) {} + protected El listitem(int i) {return(els.get(i));} + protected int listitems() {return(els.size());} + + protected void drawitem(GOut g, El el, int idx) { + g.chcolor(((idx % 2) == 0)?every:other); + g.frect(Coord.z, g.sz); + g.chcolor(); + try { + g.image(el.tt(), Coord.z); + } catch(Loading e) {} + Tex at = el.at(); + g.image(at, new Coord(sz.x - at.sz().x, (El.h - at.sz().y) / 2)); + } + + public void update(Indir t, double a) { + prev: { + for(Iterator i = els.iterator(); i.hasNext();) { + El el = i.next(); + if(el.t != t) + continue; + if(a == 1.0) + i.remove(); + else + el.update(a); + break prev; + } + els.add(new El(t, a)); + } + Collections.sort(els, ecmp); + } + + public boolean mousedown(Coord c, int button) { + return(false); + } + } + public static final int attrw = FoodMeter.frame.sz().x - wbox.bisz().x; public class Attr extends Widget { public final String nm; @@ -257,7 +347,6 @@ public CharWnd(Coord pc, Widget parent) { new Img(new Coord(x - 5, y), catf.render("Base Attributes").tex(), this); y += 35; base = new ArrayList(); Attr aw; - Color every = new Color(255, 255, 255, 16), other = new Color(255, 255, 255, 32); base.add(aw = new Attr("str", "Strength", wbox.btloff().add(x, y), every)); y += aw.sz.y; base.add(aw = new Attr("agi", "Agility", wbox.btloff().add(x, y), other)); y += aw.sz.y; base.add(aw = new Attr("int", "Intelligence", wbox.btloff().add(x, y), every)); y += aw.sz.y; @@ -271,6 +360,11 @@ public CharWnd(Coord pc, Widget parent) { new Img(new Coord(x - 5, y), catf.render("Food Event Points").tex(), this); y += 35; feps = new FoodMeter(new Coord(x, y), this); + x = 275; y = 10; + new Img(new Coord(x - 5, y), catf.render("Food Satiations").tex(), this); y += 35; + cons = new Constipations(wbox.btloff().add(x, y), this, attrw, base.size()); + Frame.around(this, Collections.singletonList(cons)); + resize(contentsz().add(15, 10)); } @@ -284,6 +378,13 @@ public void uimsg(String nm, Object... args) { if(aw.nm.equals(args[0])) aw.lvlup(); } + } else if(nm == "const") { + int a = 0; + while(a < args.length) { + Indir t = ui.sess.getres((Integer)args[a++]); + double m = ((Number)args[a++]).doubleValue(); + cons.update(t, m); + } } else { super.uimsg(nm, args); } From 3f806e1304a332abbc85f276c7cdd5427a923c7f Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 11 Sep 2014 01:05:38 +0200 Subject: [PATCH 0048/1113] Fixed satiation rounding mode. --- src/haven/CharWnd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 63dfe81f25..240f7704c1 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -220,7 +220,7 @@ public Tex tt() { public Tex at() { if(at == null) - at = elf.render(String.format("%d%%", (int)Math.floor(a * 100)), Utils.blendcol(none, full, a)).tex(); + at = elf.render(String.format("%d%%", (int)Math.round(a * 100)), Utils.blendcol(none, full, a)).tex(); return(at); } } From 2cdeab4ef2424f339fcbf0b147d01e2a755427ea Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 11 Sep 2014 02:11:20 +0200 Subject: [PATCH 0049/1113] Always adapt WItem sizes to whole sqsz units. --- src/haven/WItem.java | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/haven/WItem.java b/src/haven/WItem.java index 57e72674bf..db243a114b 100644 --- a/src/haven/WItem.java +++ b/src/haven/WItem.java @@ -31,6 +31,7 @@ import java.awt.image.BufferedImage; import java.util.*; import static haven.ItemInfo.find; +import static haven.Inventory.sqsz; public class WItem extends Widget implements DTarget { public static final Resource missing = Resource.load("gfx/invobjs/missing"); @@ -39,7 +40,7 @@ public class WItem extends Widget implements DTarget { private Message csdt = Message.nil; public WItem(Coord c, Widget parent, GItem item) { - super(c, Inventory.sqsz, parent); + super(c, sqsz, parent); this.item = item; } @@ -179,17 +180,22 @@ protected Tex find(List info) { return(new TexI(Utils.outline2(Text.render(Integer.toString(ninf.itemnum()), Color.WHITE).img, Utils.contrast(Color.WHITE)))); } }; - + + private GSprite lspr = null; public void tick(double dt) { /* XXX: This is ugly and there should be a better way to * ensure the resizing happens as it should, but I can't think * of one yet. */ if(item.spr == null) item.tick(0); - if(item.spr != null) { - Coord sz = item.spr.sz(); - if(!sz.equals(this.sz)) - resize(sz); + if((item.spr != null) && (item.spr != lspr)) { + Coord sz = new Coord(item.spr.sz()); + if((sz.x % sqsz.x) != 0) + sz.x = sqsz.x * ((sz.x / sqsz.x) + 1); + if((sz.y % sqsz.y) != 0) + sz.y = sqsz.y * ((sz.y / sqsz.y) + 1); + resize(sz); + lspr = item.spr; } } @@ -209,7 +215,7 @@ public void draw(GOut g) { if (item.meter > 0) { double a = ((double) item.meter) / 100.0; g.chcolor(255, 255, 255, 64); - Coord half = Inventory.sqsz.div(2); + Coord half = sqsz.div(2); g.prect(half, half.inv(), half, a * Math.PI * 2); g.chcolor(); } From 020b307e88dd6ba251cbe6f1fa388f485d5594bb Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sat, 18 Oct 2014 02:16:18 +0200 Subject: [PATCH 0050/1113] Added some random time modulation for composited poses. --- src/haven/Composited.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/haven/Composited.java b/src/haven/Composited.java index a69ae37168..17a66ce4c7 100644 --- a/src/haven/Composited.java +++ b/src/haven/Composited.java @@ -46,6 +46,8 @@ public class Poses { float ipold = 0.0f, ipol = 0.0f; public float limit = -1.0f; public boolean stat, ldone; + private Random srnd = new Random(); + private float rsmod = (srnd.nextFloat() * 0.1f) + 0.95f; public Poses() { this.mods = new PoseMod[0]; @@ -81,6 +83,8 @@ public void set(float ipol) { } public void tick(float dt) { + rsmod = Utils.clip(rsmod + (srnd.nextFloat() * 0.005f) - 0.0025f, 0.90f, 1.10f); + dt *= rsmod; boolean build = false; if(limit >= 0) { if((limit -= dt) < 0) From ddaf25039fcfcd06760ae81fbb60d9b342fd9616 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 21 Oct 2014 02:05:26 +0200 Subject: [PATCH 0051/1113] Fixed item meter. --- src/haven/WItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/WItem.java b/src/haven/WItem.java index db243a114b..9b74593b19 100644 --- a/src/haven/WItem.java +++ b/src/haven/WItem.java @@ -215,7 +215,7 @@ public void draw(GOut g) { if (item.meter > 0) { double a = ((double) item.meter) / 100.0; g.chcolor(255, 255, 255, 64); - Coord half = sqsz.div(2); + Coord half = sz.div(2); g.prect(half, half.inv(), half, a * Math.PI * 2); g.chcolor(); } From 58a1a9a8d9f43083c731dfd246c4a8bbfdb4539e Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 23 Oct 2014 01:11:10 +0200 Subject: [PATCH 0052/1113] Removed stray space. --- src/haven/WItem.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haven/WItem.java b/src/haven/WItem.java index 9b74593b19..099e6d36af 100644 --- a/src/haven/WItem.java +++ b/src/haven/WItem.java @@ -212,8 +212,8 @@ public void draw(GOut g) { } else if(itemnum.get() != null) { g.aimage(itemnum.get(), sz, 1, 1); } - if (item.meter > 0) { - double a = ((double) item.meter) / 100.0; + if(item.meter > 0) { + double a = ((double)item.meter) / 100.0; g.chcolor(255, 255, 255, 64); Coord half = sz.div(2); g.prect(half, half.inv(), half, a * Math.PI * 2); From 617d0981b4ba1c7ddba77dc0a54173bfc11f9711 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 5 Nov 2014 23:00:11 +0100 Subject: [PATCH 0053/1113] Added pursuing to combat UI. --- src/haven/Fightview.java | 58 +++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/src/haven/Fightview.java b/src/haven/Fightview.java index 44b75a29c0..5ca6f713f6 100644 --- a/src/haven/Fightview.java +++ b/src/haven/Fightview.java @@ -36,6 +36,7 @@ public class Fightview extends Widget { static Coord avasz = new Coord(27, 27); static Coord cavac = new Coord(width - Avaview.dasz.x - 10, 10); static Coord cgivec = new Coord(cavac.x - 35, cavac.y); + static Coord cpursc = new Coord(cavac.x - 75, cgivec.y + 35); LinkedList lsrel = new LinkedList(); public Relation current = null; public Indir blk, batk, iatk; @@ -43,16 +44,19 @@ public class Fightview extends Widget { public int off, def; private GiveButton curgive; private Avaview curava; + private Button curpurs; public class Relation { long gobid; Avaview ava; GiveButton give; + Button purs; public Relation(long gobid) { this.gobid = gobid; this.ava = new Avaview(Coord.z, avasz, Fightview.this, gobid, "avacam"); this.give = new GiveButton(Coord.z, Fightview.this, 0, new Coord(15, 15)); + this.purs = new Button(Coord.z, 70, Fightview.this, "Pursue"); } public void give(int state) { @@ -64,11 +68,13 @@ public void give(int state) { public void show(boolean state) { ava.show(state); give.show(state); + purs.show(state); } public void remove() { ui.destroy(ava); ui.destroy(give); + ui.destroy(purs); } } @@ -85,23 +91,16 @@ public Fightview(Coord c, Widget parent) { private void setcur(Relation rel) { if((current == null) && (rel != null)) { - curgive = new GiveButton(cgivec, this, 0) { - public void wdgmsg(String name, Object... args) { - if(name == "click") - Fightview.this.wdgmsg("give", (int)current.gobid, args[0]); - } - }; - curava = new Avaview(cavac, Avaview.dasz, this, rel.gobid, "avacam") { - public void wdgmsg(String name, Object... args) { - if(name == "click") - Fightview.this.wdgmsg("click", (int)current.gobid, args[0]); - } - }; + curgive = new GiveButton(cgivec, this, 0); + curava = new Avaview(cavac, Avaview.dasz, this, rel.gobid, "avacam"); + curpurs = new Button(cpursc, 70, this, "Pursue"); } else if((current != null) && (rel == null)) { ui.destroy(curgive); ui.destroy(curava); + ui.destroy(curpurs); curgive = null; curava = null; + curpurs = null; } else if((current != null) && (rel != null)) { curgive.state = rel.give.state; curava.avagob = rel.gobid; @@ -127,6 +126,7 @@ public void draw(GOut g) { g.image(bg, new Coord(x, y)); rel.ava.c = new Coord(x + 25, ((bg.sz().y - rel.ava.sz.y) / 2) + y); rel.give.c = new Coord(x + 5, 4 + y); + rel.purs.c = new Coord(rel.ava.c.x + rel.ava.sz.x + 5, 4 + y); rel.show(true); y += bg.sz().y + ymarg; } @@ -151,19 +151,27 @@ private Relation getrel(long gobid) { } public void wdgmsg(Widget sender, String msg, Object... args) { - if(sender instanceof Avaview) { - for(Relation rel : lsrel) { - if(rel.ava == sender) - wdgmsg("click", (int)rel.gobid, args[0]); - } - return; - } - if(sender instanceof GiveButton) { - for(Relation rel : lsrel) { - if(rel.give == sender) - wdgmsg("give", (int)rel.gobid, args[0]); - } - return; + if(sender == curava) { + wdgmsg("click", (int)current.gobid, args[0]); + return; + } else if(sender == curgive) { + wdgmsg("give", (int)current.gobid, args[0]); + return; + } else if(sender == curpurs) { + wdgmsg("prs", (int)current.gobid); + return; + } + for(Relation rel : lsrel) { + if(sender == rel.ava) { + wdgmsg("click", (int)rel.gobid, args[0]); + return; + } else if(sender == rel.give) { + wdgmsg("give", (int)rel.gobid, args[0]); + return; + } else if(sender == rel.purs) { + wdgmsg("prs", (int)rel.gobid); + return; + } } super.wdgmsg(sender, msg, args); } From 05d549998905466abf944421a479009db4ada906 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 25 Nov 2014 01:59:33 +0100 Subject: [PATCH 0054/1113] Iterate globtyping in reverse. --- src/haven/Widget.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/Widget.java b/src/haven/Widget.java index 2810ca5a23..59f562c671 100644 --- a/src/haven/Widget.java +++ b/src/haven/Widget.java @@ -571,7 +571,7 @@ public void mousemove(Coord c) { } public boolean globtype(char key, KeyEvent ev) { - for(Widget wdg = child; wdg != null; wdg = wdg.next) { + for(Widget wdg = lchild; wdg != null; wdg = wdg.prev) { if(wdg.globtype(key, ev)) return(true); } From 84498f8fcd4e4899780c912e5d1698b7d6be1f60 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 25 Nov 2014 01:59:14 +0100 Subject: [PATCH 0055/1113] WIP: Fighting --- src/haven/Fightsess.java | 92 ++++++++++++++++++++++++++++++++++++++++ src/haven/GameUI.java | 2 + 2 files changed, 94 insertions(+) create mode 100644 src/haven/Fightsess.java diff --git a/src/haven/Fightsess.java b/src/haven/Fightsess.java new file mode 100644 index 0000000000..10028e12ea --- /dev/null +++ b/src/haven/Fightsess.java @@ -0,0 +1,92 @@ +/* + * This file is part of the Haven & Hearth game client. + * Copyright (C) 2009 Fredrik Tolf , and + * Björn Johannessen + * + * Redistribution and/or modification of this file is subject to the + * terms of the GNU Lesser General Public License, version 3, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Other parts of this source tree adhere to other copying + * rights. Please see the file `COPYING' in the root directory of the + * source tree for details. + * + * A copy the GNU Lesser General Public License is distributed along + * with the source tree of which this file is a part in the file + * `doc/LPGL-3'. If it is missing for any reason, please see the Free + * Software Foundation's website at , or write + * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + */ + +package haven; + +import java.util.*; +import java.awt.event.KeyEvent; + +public class Fightsess extends Widget { + public static final int actpitch = 50; + public final Indir[] actions; + public Coord pcc; + + @RName("fsess") + public static class $_ implements Factory { + public Widget create(Coord c, Widget parent, Object[] args) { + int nact = (Integer)args[0]; + return(new Fightsess(parent, nact)); + } + } + + @SuppressWarnings("unchecked") + public Fightsess(Widget parent, int nact) { + super(Coord.z, parent.sz, parent); + pcc = sz.div(2); + this.actions = (Indir[])new Indir[nact]; + } + + private void updatepos() { + MapView map; + Gob pl; + if(((map = getparent(GameUI.class).map) == null) || ((pl = map.player()) == null) || (pl.sc == null)) + return; + pcc = pl.sc; + } + + public void draw(GOut g) { + updatepos(); + Coord ca = pcc.add(-(actions.length * actpitch) / 2, 25); + for(Indir act : actions) { + try { + if(act != null) { + Tex img = act.get().layer(Resource.imgc).tex(); + g.image(img, ca); + } + } catch(Loading l) {} + ca.x += actpitch; + } + } + + public void uimsg(String msg, Object... args) { + if(msg == "act") { + int n = (Integer)args[0]; + Indir res = (args.length > 1)?ui.sess.getres((Integer)args[1]):null; + actions[n] = res; + } else { + super.uimsg(msg, args); + } + } + + public boolean globtype(char key, KeyEvent ev) { + int c = ev.getKeyChar(); + if((key == 0) && (c >= KeyEvent.VK_1) && (key < KeyEvent.VK_1 + actions.length)) { + wdgmsg("use", c - KeyEvent.VK_1); + return(true); + } + return(super.globtype(key, ev)); + } +} diff --git a/src/haven/GameUI.java b/src/haven/GameUI.java index 37a51aabf3..cd9a83f070 100644 --- a/src/haven/GameUI.java +++ b/src/haven/GameUI.java @@ -172,6 +172,8 @@ public Widget makechild(String type, Object[] pargs, Object[] cargs) { } else if(place == "fight") { fv = (Fightview)gettype(type).create(new Coord(sz.x - Fightview.width, 0), this, cargs); return(fv); + } else if(place == "fsess") { + return(gettype(type).create(Coord.z, this, cargs)); } else if(place == "inv") { invwnd = new Hidewnd(new Coord(100, 100), Coord.z, this, "Inventory") { public void cresize(Widget ch) { From 7d797d1f050f76aad8744cd5c3ba2bf400bcf49d Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 2 Dec 2014 01:21:37 +0100 Subject: [PATCH 0056/1113] Display current username in window title. --- src/haven/MainFrame.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/haven/MainFrame.java b/src/haven/MainFrame.java index 4ef8929201..aee1f4afe2 100644 --- a/src/haven/MainFrame.java +++ b/src/haven/MainFrame.java @@ -241,8 +241,10 @@ public void run() { Config.authck = null; } fun = bill; + setTitle("Haven and Hearth"); } else { fun = new RemoteUI(sess); + setTitle("Haven and Hearth \u2013 " + sess.username); } sess = fun.run(p.newui(sess)); } From 7b38f046dd66651b51cbd9f80cd5093cb45556d7 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 4 Dec 2014 22:43:57 +0100 Subject: [PATCH 0057/1113] Added display of cooldown and action use. --- src/haven/Fightsess.java | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/haven/Fightsess.java b/src/haven/Fightsess.java index 10028e12ea..dbe479e415 100644 --- a/src/haven/Fightsess.java +++ b/src/haven/Fightsess.java @@ -32,6 +32,8 @@ public class Fightsess extends Widget { public static final int actpitch = 50; public final Indir[] actions; + public double atkcs, atkct; + public int use = -1; public Coord pcc; @RName("fsess") @@ -59,12 +61,26 @@ private void updatepos() { public void draw(GOut g) { updatepos(); - Coord ca = pcc.add(-(actions.length * actpitch) / 2, 25); - for(Indir act : actions) { + double now = System.currentTimeMillis() / 1000.0; + if(now < atkct) { + int w = (int)((atkct - now) * 20); + g.chcolor(255, 0, 128, 255); + g.frect(pcc.add(-w, 20), new Coord(w * 2, 15)); + g.chcolor(); + } + Coord ca = pcc.add(-(actions.length * actpitch) / 2, 45); + for(int i = 0; i < actions.length; i++) { + Indir act = actions[i]; try { if(act != null) { Tex img = act.get().layer(Resource.imgc).tex(); g.image(img, ca); + if(i == use) { + g.chcolor(255, 0, 128, 255); + Coord cc = ca.add(img.sz().x / 2, img.sz().y + 5); + g.frect(cc.sub(2, 2), new Coord(5, 5)); + g.chcolor(); + } } } catch(Loading l) {} ca.x += actpitch; @@ -76,6 +92,12 @@ public void uimsg(String msg, Object... args) { int n = (Integer)args[0]; Indir res = (args.length > 1)?ui.sess.getres((Integer)args[1]):null; actions[n] = res; + } else if(msg == "atkc") { + atkcs = System.currentTimeMillis() / 1000.0; + atkct = atkcs + (((Integer)args[0]) * 0.06); + } else if(msg == "use") { + this.use = (Integer)args[0]; + } else if(msg == "used") { } else { super.uimsg(msg, args); } From 4172c57ec39a4aea2ef926a7fcd393e0da822d2d Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Fri, 5 Dec 2014 04:29:30 +0100 Subject: [PATCH 0058/1113] Store the cooldown time in the Fightview instead. --- src/haven/Fightsess.java | 10 ++++------ src/haven/Fightview.java | 7 ++++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/haven/Fightsess.java b/src/haven/Fightsess.java index dbe479e415..5b1f6a5ba6 100644 --- a/src/haven/Fightsess.java +++ b/src/haven/Fightsess.java @@ -32,9 +32,9 @@ public class Fightsess extends Widget { public static final int actpitch = 50; public final Indir[] actions; - public double atkcs, atkct; public int use = -1; public Coord pcc; + private final Fightview fv; @RName("fsess") public static class $_ implements Factory { @@ -47,6 +47,7 @@ public Widget create(Coord c, Widget parent, Object[] args) { @SuppressWarnings("unchecked") public Fightsess(Widget parent, int nact) { super(Coord.z, parent.sz, parent); + this.fv = getparent(GameUI.class).fv; pcc = sz.div(2); this.actions = (Indir[])new Indir[nact]; } @@ -62,8 +63,8 @@ private void updatepos() { public void draw(GOut g) { updatepos(); double now = System.currentTimeMillis() / 1000.0; - if(now < atkct) { - int w = (int)((atkct - now) * 20); + if(now < fv.atkct) { + int w = (int)((fv.atkct - now) * 20); g.chcolor(255, 0, 128, 255); g.frect(pcc.add(-w, 20), new Coord(w * 2, 15)); g.chcolor(); @@ -92,9 +93,6 @@ public void uimsg(String msg, Object... args) { int n = (Integer)args[0]; Indir res = (args.length > 1)?ui.sess.getres((Integer)args[1]):null; actions[n] = res; - } else if(msg == "atkc") { - atkcs = System.currentTimeMillis() / 1000.0; - atkct = atkcs + (((Integer)args[0]) * 0.06); } else if(msg == "use") { this.use = (Integer)args[0]; } else if(msg == "used") { diff --git a/src/haven/Fightview.java b/src/haven/Fightview.java index 5ca6f713f6..e496f763f2 100644 --- a/src/haven/Fightview.java +++ b/src/haven/Fightview.java @@ -40,7 +40,7 @@ public class Fightview extends Widget { LinkedList lsrel = new LinkedList(); public Relation current = null; public Indir blk, batk, iatk; - public long atkc = -1; + public double atkcs, atkct; public int off, def; private GiveButton curgive; private Avaview curava; @@ -209,8 +209,9 @@ public void uimsg(String msg, Object... args) { setcur(null); } return; - } else if(msg == "atkc") { - atkc = System.currentTimeMillis() + (((Integer)args[0]) * 60); + } else if(msg == "atkc") { + atkcs = System.currentTimeMillis() / 1000.0; + atkct = atkcs + (((Integer)args[0]) * 0.06); return; } else if(msg == "blk") { blk = n2r((Integer)args[0]); From 8ee72e504f101d1c9d90fce504ab572eae9475a0 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Fri, 5 Dec 2014 05:38:51 +0100 Subject: [PATCH 0059/1113] Added combat buff display UI. --- src/haven/Fightsess.java | 11 +++++++++++ src/haven/Fightview.java | 23 +++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/haven/Fightsess.java b/src/haven/Fightsess.java index 5b1f6a5ba6..1761565520 100644 --- a/src/haven/Fightsess.java +++ b/src/haven/Fightsess.java @@ -34,6 +34,7 @@ public class Fightsess extends Widget { public final Indir[] actions; public int use = -1; public Coord pcc; + public int pho; private final Fightview fv; @RName("fsess") @@ -49,6 +50,7 @@ public Fightsess(Widget parent, int nact) { super(Coord.z, parent.sz, parent); this.fv = getparent(GameUI.class).fv; pcc = sz.div(2); + pho = -40; this.actions = (Indir[])new Indir[nact]; } @@ -58,11 +60,20 @@ private void updatepos() { if(((map = getparent(GameUI.class).map) == null) || ((pl = map.player()) == null) || (pl.sc == null)) return; pcc = pl.sc; + pho = (int)(pl.sczu.mul(20f).y) - 20; } public void draw(GOut g) { updatepos(); double now = System.currentTimeMillis() / 1000.0; + + for(Buff buff : fv.buffs.children(Buff.class)) + buff.draw(g.reclip(pcc.add(-buff.c.x - Buff.cframe.sz().x - 20, buff.c.y + pho - Buff.cframe.sz().y), buff.sz)); + if(fv.current != null) { + for(Buff buff : fv.current.buffs.children(Buff.class)) + buff.draw(g.reclip(pcc.add(buff.c.x + 20, buff.c.y + pho - Buff.cframe.sz().y), buff.sz)); + } + if(now < fv.atkct) { int w = (int)((fv.atkct - now) * 20); g.chcolor(255, 0, 128, 255); diff --git a/src/haven/Fightview.java b/src/haven/Fightview.java index e496f763f2..7e1c651f91 100644 --- a/src/haven/Fightview.java +++ b/src/haven/Fightview.java @@ -45,12 +45,14 @@ public class Fightview extends Widget { private GiveButton curgive; private Avaview curava; private Button curpurs; + public final Bufflist buffs = new Bufflist(Coord.z, this); {buffs.hide();} public class Relation { - long gobid; - Avaview ava; - GiveButton give; - Button purs; + public final long gobid; + public final Avaview ava; + public final GiveButton give; + public final Button purs; + public final Bufflist buffs = new Bufflist(Coord.z, Fightview.this); {buffs.hide();} public Relation(long gobid) { this.gobid = gobid; @@ -89,6 +91,19 @@ public Fightview(Coord c, Widget parent) { super(c, new Coord(width, (bg.sz().y + ymarg) * height), parent); } + public Widget makechild(String type, Object[] pargs, Object[] cargs) { + if(pargs[0].equals("buff")) { + Widget p; + if(pargs[1] == null) + p = buffs; + else + p = getrel((Integer)pargs[1]).buffs; + return(p.makechild(type, new Object[] {}, cargs)); + } else { + return(super.makechild(type, pargs, cargs)); + } + } + private void setcur(Relation rel) { if((current == null) && (rel != null)) { curgive = new GiveButton(cgivec, this, 0); From 2e6a6e1bc031a6a52d3584ad357fca4f1f2cac3e Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 9 Dec 2014 00:22:11 +0100 Subject: [PATCH 0060/1113] Added IP to combat. --- src/haven/Fightsess.java | 12 ++++++++++++ src/haven/Fightview.java | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/src/haven/Fightsess.java b/src/haven/Fightsess.java index 1761565520..165c6c36ec 100644 --- a/src/haven/Fightsess.java +++ b/src/haven/Fightsess.java @@ -27,6 +27,7 @@ package haven; import java.util.*; +import java.awt.Color; import java.awt.event.KeyEvent; public class Fightsess extends Widget { @@ -63,6 +64,14 @@ private void updatepos() { pho = (int)(pl.sczu.mul(20f).y) - 20; } + private static final Text.Furnace ipf = new PUtils.BlurFurn(new Text.Foundry(Text.serif, 18, new Color(128, 128, 255)).aa(true), 1, 1, new Color(48, 48, 96)); + private final Text.UText ip = new Text.UText(ipf) { + public String text() {return("IP: " + fv.current.ip);} + }; + private final Text.UText oip = new Text.UText(ipf) { + public String text() {return("IP: " + fv.current.oip);} + }; + public void draw(GOut g) { updatepos(); double now = System.currentTimeMillis() / 1000.0; @@ -72,6 +81,9 @@ public void draw(GOut g) { if(fv.current != null) { for(Buff buff : fv.current.buffs.children(Buff.class)) buff.draw(g.reclip(pcc.add(buff.c.x + 20, buff.c.y + pho - Buff.cframe.sz().y), buff.sz)); + + g.aimage(ip.get().tex(), pcc.add(-75, 0), 1, 0.5); + g.aimage(oip.get().tex(), pcc.add(75, 0), 0, 0.5); } if(now < fv.atkct) { diff --git a/src/haven/Fightview.java b/src/haven/Fightview.java index 7e1c651f91..c44bcda93c 100644 --- a/src/haven/Fightview.java +++ b/src/haven/Fightview.java @@ -53,6 +53,7 @@ public class Relation { public final GiveButton give; public final Button purs; public final Bufflist buffs = new Bufflist(Coord.z, Fightview.this); {buffs.hide();} + public int ip, oip; public Relation(long gobid) { this.gobid = gobid; @@ -201,6 +202,8 @@ public void uimsg(String msg, Object... args) { if(msg == "new") { Relation rel = new Relation((Integer)args[0]); rel.give((Integer)args[1]); + rel.ip = (Integer)args[2]; + rel.oip = (Integer)args[3]; lsrel.addFirst(rel); return; } else if(msg == "del") { @@ -213,6 +216,8 @@ public void uimsg(String msg, Object... args) { } else if(msg == "upd") { Relation rel = getrel((Integer)args[0]); rel.give((Integer)args[1]); + rel.ip = (Integer)args[2]; + rel.oip = (Integer)args[3]; return; } else if(msg == "cur") { try { From 164ed2caf64e66b8d79e8deb0b19c5566226544b Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 9 Dec 2014 00:37:54 +0100 Subject: [PATCH 0061/1113] Added dropping of combat actions. --- src/haven/Fightsess.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/haven/Fightsess.java b/src/haven/Fightsess.java index 165c6c36ec..0860af19f5 100644 --- a/src/haven/Fightsess.java +++ b/src/haven/Fightsess.java @@ -119,6 +119,7 @@ public void uimsg(String msg, Object... args) { } else if(msg == "use") { this.use = (Integer)args[0]; } else if(msg == "used") { + } else if(msg == "dropped") { } else { super.uimsg(msg, args); } @@ -127,7 +128,11 @@ public void uimsg(String msg, Object... args) { public boolean globtype(char key, KeyEvent ev) { int c = ev.getKeyChar(); if((key == 0) && (c >= KeyEvent.VK_1) && (key < KeyEvent.VK_1 + actions.length)) { - wdgmsg("use", c - KeyEvent.VK_1); + int n = c - KeyEvent.VK_1; + if((ev.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0) + wdgmsg("drop", n); + else + wdgmsg("use", n); return(true); } return(super.globtype(key, ev)); From 22fedbbc2d7594ed2d80962e1f4417b591d015a1 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 11 Dec 2014 03:42:31 +0100 Subject: [PATCH 0062/1113] WIP: Fight-manager UI --- src/haven/FightWnd.java | 178 ++++++++++++++++++++++++++++++++++++++++ src/haven/GameUI.java | 14 ++++ 2 files changed, 192 insertions(+) create mode 100644 src/haven/FightWnd.java diff --git a/src/haven/FightWnd.java b/src/haven/FightWnd.java new file mode 100644 index 0000000000..ddd0130d23 --- /dev/null +++ b/src/haven/FightWnd.java @@ -0,0 +1,178 @@ +/* + * This file is part of the Haven & Hearth game client. + * Copyright (C) 2009 Fredrik Tolf , and + * Björn Johannessen + * + * Redistribution and/or modification of this file is subject to the + * terms of the GNU Lesser General Public License, version 3, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Other parts of this source tree adhere to other copying + * rights. Please see the file `COPYING' in the root directory of the + * source tree for details. + * + * A copy the GNU Lesser General Public License is distributed along + * with the source tree of which this file is a part in the file + * `doc/LPGL-3'. If it is missing for any reason, please see the Free + * Software Foundation's website at , or write + * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + */ + +package haven; + +import java.util.*; +import java.awt.Color; + +public class FightWnd extends Window { + public final int nsave; + public final Actions actlist; + public List acts = new ArrayList(); + private final CheckBox[] savesel; + + public class Action { + public final Indir res; + private final int id; + public int a, u; + private Text rnm, ru; + + public Action(Indir res, int id, int a, int u) {this.res = res; this.id = id; this.a = a; this.u = u;} + } + + public class Actions extends Listbox { + static final int eh = 33; + private boolean loading = false; + + public Actions(Coord c, Widget parent, int w, int h) { + super(c, parent, w, h, eh); + } + + protected Action listitem(int n) {return(acts.get(n));} + protected int listitems() {return(acts.size());} + + protected void drawitem(GOut g, Action act, int idx) { + if(act.ru == null) act.ru = Text.render(String.format("%d/%d", act.u, act.a)); + try { + g.image(act.res.get().layer(Resource.imgc).tex(), Coord.z); + } catch(Loading l) { + WItem.missing.loadwait(); + g.image(WItem.missing.layer(Resource.imgc).tex(), Coord.z, sz); + } + int ty = (eh - act.rnm.sz().y) / 2; + g.image(act.rnm.tex(), new Coord(40, ty)); + g.image(act.ru.tex(), new Coord(sz.x - 50, ty)); + } + + public boolean mousewheel(Coord c, int am) { + if(ui.modshift) { + Action act = itemat(c); + if(act != null) { + act.u = Utils.clip(act.u - am, 0, act.a); + act.ru = null; + } + return(true); + } + return(super.mousewheel(c, am)); + } + + public void draw(GOut g) { + if(loading) { + loading = false; + for(Action act : acts) { + try { + act.rnm = Text.render(act.res.get().layer(Resource.tooltip).t); + } catch(Loading l) { + act.rnm = Text.render("..."); + loading = true; + } + } + Collections.sort(acts, new Comparator() { + public int compare(Action a, Action b) { + return(a.rnm.text.compareTo(a.rnm.text)); + } + }); + } + super.draw(g); + } + } + + @RName("fmg") + public static class $_ implements Factory { + public Widget create(Coord c, Widget parent, Object[] args) { + return(new FightWnd(c, parent, (Integer)args[0])); + } + } + + private void save(int n) { + List args = new LinkedList(); + args.add(n); + for(Action act : acts) { + args.add(act.id); + args.add(act.u); + } + args.add(-1); + FightWnd.this.wdgmsg("save", args.toArray(new Object[0])); + } + + public FightWnd(Coord c, Widget parent, int nsave) { + super(c, new Coord(475, 450), parent, ""); + this.nsave = nsave; + this.savesel = new CheckBox[nsave]; + actlist = new Actions(new Coord(10, 10), this, 250, 12); + int y = actlist.sz.y; + for(int i = nsave - 1; i >= 0; i--) { + final int n = i; + new Button(new Coord(270, y - Button.hs), 50, this, "Load") { + public void click() { + FightWnd.this.wdgmsg("load", n); + } + }; + new Button(new Coord(330, y - Button.hs), 50, this, "Save") { + public void click() { + save(n); + } + }; + savesel[n] = new CheckBox(new Coord(390, y - CheckBox.box.sz().y), this, "Use") { + public boolean mousedown(Coord c, int button) { + if(button == 1) { + if(a) + FightWnd.this.wdgmsg("use", -1); + else + FightWnd.this.wdgmsg("use", n); + } + return(true); + } + }; + y -= Button.hs + 15; + } + } + + public void uimsg(String nm, Object... args) { + if(nm == "act") { + List acts = new ArrayList(); + int a = 0; + while(true) { + int resid = (Integer)args[a++]; + if(resid < 0) + break; + int av = (Integer)args[a++]; + int us = (Integer)args[a++]; + acts.add(new Action(ui.sess.getres(resid), resid, av, us)); + } + this.acts = acts; + actlist.loading = true; + } else if(nm == "use") { + int n = (Integer)args[0]; + for(int i = 0; i < nsave; i++) { + savesel[i].a = (i == n); + } + } else { + super.uimsg(nm, args); + } + } +} diff --git a/src/haven/GameUI.java b/src/haven/GameUI.java index d77f0a5170..c9433986a7 100644 --- a/src/haven/GameUI.java +++ b/src/haven/GameUI.java @@ -39,6 +39,7 @@ public class GameUI extends ConsoleHost implements Console.Directory { public MapView map; public MiniMap mmap; public Fightview fv; + public FightWnd fw; public static final Text.Foundry errfoundry = new Text.Foundry(Text.dfont, 14, new Color(192, 0, 0)); private Widget[] meters = {}; private Text lasterr; @@ -173,6 +174,10 @@ public Widget makechild(String type, Object[] pargs, Object[] cargs) { } else if(place == "fight") { fv = (Fightview)gettype(type).create(new Coord(sz.x - Fightview.width, 0), this, cargs); return(fv); + } else if(place == "fmg") { + fw = (FightWnd)gettype(type).create(new Coord(50, 50), this, cargs); + fw.hide(); + return(fw); } else if(place == "fsess") { return(gettype(type).create(Coord.z, this, cargs)); } else if(place == "inv") { @@ -262,6 +267,8 @@ public void cdestroy(Widget w) { polity = null; } else if(w == chrwdg) { chrwdg = null; + } else if(w == fw) { + fw = null; } } @@ -371,6 +378,8 @@ public void wdgmsg(Widget sender, String msg, Object... args) { ui.destroy(help); help = null; return; + } else if((sender == fw) && (msg == "close")) { + fw.hide(); } super.wdgmsg(sender, msg, args); } @@ -407,6 +416,11 @@ public boolean globtype(char key, KeyEvent ev) { chrwdg.raise(); fitwdg(chrwdg); } + } else if(key == 6) { + if((fw != null) && fw.show(!fw.visible)) { + fw.raise(); + fitwdg(fw); + } } else if(key == 2) { if((buddies != null) && buddies.show(!buddies.visible)) { buddies.raise(); From ec1cbc06c5b03311b8d05f9c79c675d71c959be8 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 13 Jan 2015 02:16:51 +0100 Subject: [PATCH 0063/1113] Fixed some fight-window stuffs. --- src/haven/FightWnd.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/haven/FightWnd.java b/src/haven/FightWnd.java index ddd0130d23..62fe6329e4 100644 --- a/src/haven/FightWnd.java +++ b/src/haven/FightWnd.java @@ -45,7 +45,7 @@ public class Action { } public class Actions extends Listbox { - static final int eh = 33; + static final int eh = 34; private boolean loading = false; public Actions(Coord c, Widget parent, int w, int h) { @@ -93,7 +93,8 @@ public void draw(GOut g) { } Collections.sort(acts, new Comparator() { public int compare(Action a, Action b) { - return(a.rnm.text.compareTo(a.rnm.text)); + int ret = a.rnm.text.compareTo(b.rnm.text); + return(ret); } }); } From 0dde7db2d17462339f72b562f7dea31a8b44490e Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 28 Jan 2015 21:16:52 +0100 Subject: [PATCH 0064/1113] Start putting charwnd contents into tabs. --- src/haven/CharWnd.java | 52 +++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 240f7704c1..3a1a91be5c 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -287,8 +287,8 @@ public class Attr extends Widget { private Text ct; private int cv; - private Attr(String attr, String rnm, Coord c, Color bg) { - super(c, new Coord(attrw, attrf.height() + 2), CharWnd.this); + private Attr(String attr, String rnm, Coord c, Widget parent, Color bg) { + super(c, new Coord(attrw, attrf.height() + 2), parent); this.nm = attr; this.img = Resource.load("gfx/hud/chr/" + attr).loadwait().layer(Resource.imgc).tex(); this.rnm = attrf.render(rnm); @@ -343,27 +343,33 @@ public Widget create(Coord c, Widget parent, Object[] args) { public CharWnd(Coord pc, Widget parent) { super(pc, new Coord(300, 290), parent, "Character Sheet"); - int x = 15, y = 10; - new Img(new Coord(x - 5, y), catf.render("Base Attributes").tex(), this); y += 35; - base = new ArrayList(); - Attr aw; - base.add(aw = new Attr("str", "Strength", wbox.btloff().add(x, y), every)); y += aw.sz.y; - base.add(aw = new Attr("agi", "Agility", wbox.btloff().add(x, y), other)); y += aw.sz.y; - base.add(aw = new Attr("int", "Intelligence", wbox.btloff().add(x, y), every)); y += aw.sz.y; - base.add(aw = new Attr("con", "Constitution", wbox.btloff().add(x, y), other)); y += aw.sz.y; - base.add(aw = new Attr("prc", "Perception", wbox.btloff().add(x, y), every)); y += aw.sz.y; - base.add(aw = new Attr("csm", "Charisma", wbox.btloff().add(x, y), other)); y += aw.sz.y; - base.add(aw = new Attr("dex", "Dexterity", wbox.btloff().add(x, y), every)); y += aw.sz.y; - base.add(aw = new Attr("psy", "Psyche", wbox.btloff().add(x, y), other)); y += aw.sz.y; - Frame.around(this, base); - y += 20; - new Img(new Coord(x - 5, y), catf.render("Food Event Points").tex(), this); y += 35; - feps = new FoodMeter(new Coord(x, y), this); - - x = 275; y = 10; - new Img(new Coord(x - 5, y), catf.render("Food Satiations").tex(), this); y += 35; - cons = new Constipations(wbox.btloff().add(x, y), this, attrw, base.size()); - Frame.around(this, Collections.singletonList(cons)); + final Tabs tabs = new Tabs(new Coord(15, 10), Coord.z, this); + Tabs.Tab battr; + { + int x = 5, y = 0; + + battr = tabs.new Tab(); + new Img(new Coord(x - 5, y), catf.render("Base Attributes").tex(), battr); y += 35; + base = new ArrayList(); + Attr aw; + base.add(aw = new Attr("str", "Strength", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; + base.add(aw = new Attr("agi", "Agility", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; + base.add(aw = new Attr("int", "Intelligence", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; + base.add(aw = new Attr("con", "Constitution", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; + base.add(aw = new Attr("prc", "Perception", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; + base.add(aw = new Attr("csm", "Charisma", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; + base.add(aw = new Attr("dex", "Dexterity", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; + base.add(aw = new Attr("psy", "Psyche", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; + Frame.around(battr, base); + y += 20; + new Img(new Coord(x - 5, y), catf.render("Food Event Points").tex(), battr); y += 35; + feps = new FoodMeter(new Coord(x, y), battr); + + x = 260; y = 0; + new Img(new Coord(x - 5, y), catf.render("Food Satiations").tex(), battr); y += 35; + cons = new Constipations(wbox.btloff().add(x, y), battr, attrw, base.size()); + Frame.around(battr, Collections.singletonList(cons)); + } resize(contentsz().add(15, 10)); } From 1981eeeee09c45dc492327e2b3dfacf278e20f72 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 28 Jan 2015 22:15:48 +0100 Subject: [PATCH 0065/1113] Receive the study inventory from the server. --- src/haven/CharWnd.java | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 3a1a91be5c..258b4da52c 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -43,6 +43,7 @@ public class CharWnd extends Window { public final Collection base; public final FoodMeter feps; public final Constipations cons; + private final Tabs.Tab sattr; public static class FoodMeter extends Widget { public static final Tex frame = Resource.loadtex("gfx/hud/chr/foodm"); @@ -371,9 +372,42 @@ public CharWnd(Coord pc, Widget parent) { Frame.around(battr, Collections.singletonList(cons)); } + { + sattr = tabs.new Tab(); + } + + { + Widget prev; + + class TB extends IButton { + final Tabs.Tab tab; + TB(Coord c, String nm, Tabs.Tab tab) { + super(c, CharWnd.this, Resource.loadimg("gfx/hud/chr/" + nm + "u"), Resource.loadimg("gfx/hud/chr/" + nm + "d")); + this.tab = tab; + } + + public void click() { + tabs.showtab(tab); + } + } + + tabs.pack(); + prev = new TB(new Coord(tabs.c.x + 5, tabs.c.y + tabs.sz.y + 10), "battr", battr); + prev = new TB(new Coord(prev.c.x + prev.sz.x + 10, prev.c.y), "sattr", sattr); + } + resize(contentsz().add(15, 10)); } + public Widget makechild(String type, Object[] pargs, Object[] cargs) { + String place = (pargs[0] instanceof String)?(((String)pargs[0]).intern()):null; + if(place == "study") { + return(gettype(type).create(Coord.z, sattr, cargs)); + } else { + return(super.makechild(type, pargs, cargs)); + } + } + public void uimsg(String nm, Object... args) { if(nm == "food") { feps.update(args); From 333e632b07eb8cdb1e66b0e54df5dc63a85dbd92 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 28 Jan 2015 23:38:45 +0100 Subject: [PATCH 0066/1113] Added an LP label. --- src/haven/CharWnd.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 258b4da52c..957fdb6b4b 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -43,7 +43,9 @@ public class CharWnd extends Window { public final Collection base; public final FoodMeter feps; public final Constipations cons; + public int exp; private final Tabs.Tab sattr; + private final Label explbl; public static class FoodMeter extends Widget { public static final Tex frame = Resource.loadtex("gfx/hud/chr/foodm"); @@ -334,6 +336,10 @@ public void lvlup() { } } + private void updexp() { + explbl.settext(Utils.thformat(exp)); + } + @RName("chr") public static class $_ implements Factory { public Widget create(Coord c, Widget parent, Object[] args) { @@ -374,6 +380,8 @@ public CharWnd(Coord pc, Widget parent) { { sattr = tabs.new Tab(); + new Label(new Coord(0, 150), sattr, "Learning Points:"); + explbl = new Label(new Coord(90, 150), sattr, "0"); } { @@ -409,7 +417,10 @@ public Widget makechild(String type, Object[] pargs, Object[] cargs) { } public void uimsg(String nm, Object... args) { - if(nm == "food") { + if(nm == "exp") { + exp = ((Number)args[0]).intValue(); + updexp(); + } else if(nm == "food") { feps.update(args); } else if(nm == "ftrig") { feps.trig(ui.sess.getres((Integer)args[0])); From 0b297e724c6b792a6238e91b65cdd664ff3b0659 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 11 Feb 2015 20:48:41 +0100 Subject: [PATCH 0067/1113] Improved check-box. --- src/haven/CheckBox.java | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/haven/CheckBox.java b/src/haven/CheckBox.java index 37c0b06acb..d71e9097c8 100644 --- a/src/haven/CheckBox.java +++ b/src/haven/CheckBox.java @@ -27,7 +27,10 @@ package haven; public class CheckBox extends Widget { - static Tex box, mark; + public static final Tex lbox = Resource.loadtex("gfx/hud/chkbox"), lmark = Resource.loadtex("gfx/hud/chkmark"); + public static final Tex sbox = Resource.loadtex("gfx/hud/chkboxs"), smark = Resource.loadtex("gfx/hud/chkmarks"); + public final Tex box, mark; + public final Coord loff; public boolean a = false; Text lbl; @@ -40,37 +43,43 @@ public Widget create(Coord c, Widget parent, Object[] args) { } } - static { - box = Resource.loadtex("gfx/hud/chkbox"); - mark = Resource.loadtex("gfx/hud/chkmark"); + public CheckBox(Coord c, Widget parent, String lbl, boolean lg) { + super(c, Coord.z, parent); + this.lbl = Text.std.render(lbl, java.awt.Color.WHITE); + if(lg) { + box = lbox; mark = lmark; + loff = new Coord(0, -3); + } else { + box = sbox; mark = smark; + loff = new Coord(5, 0); + } + sz = new Coord(box.sz().x + 5 + this.lbl.sz().x, Math.max(box.sz().y, this.lbl.sz().y)); } - + public CheckBox(Coord c, Widget parent, String lbl) { - super(c, box.sz(), parent); - this.lbl = Text.std.render(lbl, java.awt.Color.WHITE); - sz = box.sz().add(this.lbl.sz()); + this(c, parent, lbl, false); } - + public boolean mousedown(Coord c, int button) { if(button != 1) return(false); set(!a); return(true); } - + public void set(boolean a) { this.a = a; changed(a); } public void draw(GOut g) { - g.image(lbl.tex(), new Coord(box.sz().x, box.sz().y - lbl.sz().y)); + g.image(lbl.tex(), loff.add(box.sz().x, box.sz().y - lbl.sz().y)); g.image(box, Coord.z); if(a) g.image(mark, Coord.z); super.draw(g); } - + public void changed(boolean val) { if(canactivate) wdgmsg("ch", a); From f0bb8ae7fd6a94761604edbac6695ea640d6ee0b Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 11 Feb 2015 21:25:33 +0100 Subject: [PATCH 0068/1113] Updated fight-window checkbox usage. --- src/haven/FightWnd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/FightWnd.java b/src/haven/FightWnd.java index 62fe6329e4..7782d84156 100644 --- a/src/haven/FightWnd.java +++ b/src/haven/FightWnd.java @@ -138,7 +138,7 @@ public void click() { save(n); } }; - savesel[n] = new CheckBox(new Coord(390, y - CheckBox.box.sz().y), this, "Use") { + savesel[n] = new CheckBox(new Coord(390, y - CheckBox.lbox.sz().y), this, "Use", true) { public boolean mousedown(Coord c, int button) { if(button == 1) { if(a) From c3e77ef5bb9c5f3b923744a442ed540f88720bbd Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 11 Feb 2015 21:25:50 +0100 Subject: [PATCH 0069/1113] Updated text-boxes. --- src/haven/TextEntry.java | 64 +++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/src/haven/TextEntry.java b/src/haven/TextEntry.java index 7efb246d93..41832f13ba 100644 --- a/src/haven/TextEntry.java +++ b/src/haven/TextEntry.java @@ -28,10 +28,16 @@ import java.awt.*; import java.awt.event.KeyEvent; - -public class TextEntry extends Widget { - public static final Text.Foundry fnd = new Text.Foundry(Text.dfont, 12, Color.BLACK); - public static final int defh = fnd.height() + 2; +import java.awt.image.BufferedImage; + +public class TextEntry extends SIWidget { + public static final Text.Foundry fnd = new Text.Foundry(Text.serif, 12, new Color(255, 205, 109)).aa(true); + public static final BufferedImage lcap = Resource.loadimg("gfx/hud/text/l"); + public static final BufferedImage rcap = Resource.loadimg("gfx/hud/text/r"); + public static final BufferedImage mext = Resource.loadimg("gfx/hud/text/m"); + public static final BufferedImage caret = Resource.loadimg("gfx/hud/text/caret"); + public static final Coord toff = new Coord(lcap.getWidth() - 1, 3); + public static final Coord coff = new Coord(-3, -1); public LineEdit buf; public int sx; public boolean pw = false; @@ -59,6 +65,7 @@ protected void done(String line) { } protected void changed() { + redraw(); TextEntry.this.text = line; TextEntry.this.changed(); } @@ -77,10 +84,45 @@ public void uimsg(String name, Object... args) { } } - protected void drawbg(GOut g) { - g.frect(Coord.z, sz); + protected String dtext() { + if(pw) { + String ret = ""; + for(int i = 0; i < buf.line.length(); i++) + ret += "\u2022"; + return(ret); + } else { + return(buf.line); + } + } + + public void draw(BufferedImage img) { + Graphics g = img.getGraphics(); + String dtext = dtext(); + if((tcache == null) || !tcache.text.equals(dtext)) + tcache = fnd.render(dtext); + g.drawImage(mext, 0, 0, sz.x, sz.y, null); + + int cx = tcache.advance(buf.point); + if(cx < sx) sx = cx; + if(cx > sx + (sz.x - 1)) sx = cx - (sz.x - 1); + g.drawImage(tcache.img, toff.x - sx, toff.y, null); + + g.drawImage(lcap, 0, 0, null); + g.drawImage(rcap, sz.x - rcap.getWidth(), 0, null); + + g.dispose(); + } + + public void draw(GOut g) { + super.draw(g); + if(hasfocus && ((System.currentTimeMillis() % 1000) > 500)) { + int cx = tcache.advance(buf.point); + int lx = cx - sx + 1; + g.image(caret, toff.add(coff).add(lx, 0)); + } } + /* public void draw(GOut g) { super.draw(g); String dtext; @@ -105,15 +147,17 @@ public void draw(GOut g) { g.chcolor(); } } + */ - public TextEntry(Coord c, Coord sz, Widget parent, String deftext) { - super(c, sz, parent); + public TextEntry(Coord c, int w, Widget parent, String deftext) { + super(c, new Coord(w, mext.getHeight()), parent); rsettext(deftext); setcanfocus(true); } - public TextEntry(Coord c, int w, Widget parent, String deftext) { - this(c, new Coord(w, defh), parent, deftext); + @Deprecated + public TextEntry(Coord c, Coord sz, Widget parent, String deftext) { + this(c, sz.x, parent, deftext); } protected void changed() { From f260ad22a43632ff4db0c55703a951144ab8f09c Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 11 Feb 2015 21:26:23 +0100 Subject: [PATCH 0070/1113] Adjusted login screen. --- src/haven/Button.java | 2 ++ src/haven/LoginScreen.java | 11 ++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/haven/Button.java b/src/haven/Button.java index 65d99101c1..9d4ea12893 100644 --- a/src/haven/Button.java +++ b/src/haven/Button.java @@ -108,6 +108,8 @@ public void draw(BufferedImage img) { g.drawImage(bb, bl.getWidth(), yo + hs - bb.getHeight(), sz.x - bl.getWidth() - br.getWidth(), bb.getHeight(), null); if(lg) g.drawImage(bm, (sz.x - bm.getWidth()) / 2, 0, null); + + g.dispose(); } public void change(String text, Color col) { diff --git a/src/haven/LoginScreen.java b/src/haven/LoginScreen.java index b28c6fe19f..9f30497885 100644 --- a/src/haven/LoginScreen.java +++ b/src/haven/LoginScreen.java @@ -66,10 +66,10 @@ private Pwbox(String username, boolean save) { setfocustab(true); new Label(new Coord(0, 0), this, "User name", textf); user = new TextEntry(new Coord(0, 20), new Coord(150, 20), this, username); - new Label(new Coord(0, 60), this, "Password", textf); - pass = new TextEntry(new Coord(0, 80), new Coord(150, 20), this, ""); + new Label(new Coord(0, 50), this, "Password", textf); + pass = new TextEntry(new Coord(0, 70), new Coord(150, 20), this, ""); pass.pw = true; - savepass = new CheckBox(new Coord(0, 110), this, "Remember me"); + savepass = new CheckBox(new Coord(0, 100), this, "Remember me", true); savepass.a = save; if(user.text.equals("")) setfocus(user); @@ -110,7 +110,7 @@ private class Tokenbox extends Login { Button btn; private Tokenbox(String username) { - super(new Coord(295, 310), new Coord(250, 100), LoginScreen.this); + super(new Coord(295, 330), new Coord(250, 100), LoginScreen.this); label = textfs.render("Identity is saved for " + username, java.awt.Color.WHITE); btn = new Button(new Coord(75, 30), 100, this, "Forget me"); } @@ -147,7 +147,8 @@ public boolean globtype(char k, KeyEvent ev) { private void mklogin() { synchronized(ui) { - btn = new IButton(new Coord(373, 460), this, Resource.loadimg("gfx/hud/buttons/loginu"), Resource.loadimg("gfx/hud/buttons/logind")); + btn = new IButton(new Coord(420, 510), this, "gfx/hud/buttons/login", "u", "d", null); + btn.c = btn.c.sub(Utils.imgsz(btn.up).div(2)); progress(null); } } From 7b23fb70e4cb1125a2e5ff31ff0999be63a90a7f Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 11 Feb 2015 21:43:39 +0100 Subject: [PATCH 0071/1113] Offer a large-window option. --- src/haven/Window.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/haven/Window.java b/src/haven/Window.java index 546672ed8e..b1d6e320e6 100644 --- a/src/haven/Window.java +++ b/src/haven/Window.java @@ -48,7 +48,7 @@ public class Window extends Widget implements DTarget { public static final Tex br = Resource.loadtex("gfx/hud/wnd/lg/br"); public static final Coord tlm = new Coord(18, 30), brm = new Coord(13, 22), cpo = new Coord(36, 17); public static final int capo = 7, capio = 2; - public static final Coord mrgn = new Coord(9, 9); + public static final Coord dlmrgn = new Coord(23, 9), dsmrgn = new Coord(9, 9); public static final BufferedImage ctex = Resource.loadimg("gfx/hud/fonttex"); public static final Text.Furnace cf = new Text.Imager(new PUtils.TexFurn(new Text.Foundry(Text.fraktur, 15).aa(true), ctex)) { protected BufferedImage proc(Text text) { @@ -67,7 +67,7 @@ protected BufferedImage proc(Text text) { Resource.loadimg("gfx/hud/wnd/lg/cbtnu"), Resource.loadimg("gfx/hud/wnd/lg/cbtnd"), Resource.loadimg("gfx/hud/wnd/lg/cbtnh")}; - public final Coord tlo, rbo; + public final Coord tlo, rbo, mrgn; public final IButton cbtn; public boolean dt = false; public Text cap; @@ -79,17 +79,18 @@ protected BufferedImage proc(Text text) { @RName("wnd") public static class $_ implements Factory { public Widget create(Coord c, Widget parent, Object[] args) { - if(args.length < 2) - return(new Window(c, (Coord)args[0], parent, null)); - else - return(new Window(c, (Coord)args[0], parent, (String)args[1])); + Coord sz = (Coord)args[0]; + String cap = (args.length > 1)?(String)args[1]:null; + boolean lg = (args.length > 2)?((Integer)args[2] != 0):false; + return(new Window(c, sz, parent, cap, lg, Coord.z, Coord.z)); } } - public Window(Coord c, Coord sz, Widget parent, String cap, Coord tlo, Coord rbo) { + public Window(Coord c, Coord sz, Widget parent, String cap, boolean lg, Coord tlo, Coord rbo) { super(c, new Coord(0, 0), parent); this.tlo = tlo; this.rbo = rbo; + this.mrgn = lg?dlmrgn:dsmrgn; cbtn = new IButton(Coord.z, this, cbtni[0], cbtni[1], cbtni[2]); chcap(cap); resize(sz); @@ -98,7 +99,7 @@ public Window(Coord c, Coord sz, Widget parent, String cap, Coord tlo, Coord rbo } public Window(Coord c, Coord sz, Widget parent, String cap) { - this(c, sz, parent, cap, new Coord(0, 0), new Coord(0, 0)); + this(c, sz, parent, cap, false, Coord.z, Coord.z); } public void chcap(String cap) { From 61ed7677a834a1940092a27c6113d48e819920af Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 11 Feb 2015 21:50:44 +0100 Subject: [PATCH 0072/1113] Increase large-window margin somewhat. --- src/haven/Window.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/Window.java b/src/haven/Window.java index b1d6e320e6..f1a46069c9 100644 --- a/src/haven/Window.java +++ b/src/haven/Window.java @@ -48,7 +48,7 @@ public class Window extends Widget implements DTarget { public static final Tex br = Resource.loadtex("gfx/hud/wnd/lg/br"); public static final Coord tlm = new Coord(18, 30), brm = new Coord(13, 22), cpo = new Coord(36, 17); public static final int capo = 7, capio = 2; - public static final Coord dlmrgn = new Coord(23, 9), dsmrgn = new Coord(9, 9); + public static final Coord dlmrgn = new Coord(23, 14), dsmrgn = new Coord(9, 9); public static final BufferedImage ctex = Resource.loadimg("gfx/hud/fonttex"); public static final Text.Furnace cf = new Text.Imager(new PUtils.TexFurn(new Text.Foundry(Text.fraktur, 15).aa(true), ctex)) { protected BufferedImage proc(Text text) { From 7a03c56b56c49efd5ff599d83615eb069a357650 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 11 Feb 2015 23:57:59 +0100 Subject: [PATCH 0073/1113] Fixed text-box bug. --- src/haven/TextEntry.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/haven/TextEntry.java b/src/haven/TextEntry.java index 41832f13ba..54d5f5c0f0 100644 --- a/src/haven/TextEntry.java +++ b/src/haven/TextEntry.java @@ -56,6 +56,7 @@ public Widget create(Coord c, Widget parent, Object[] args) { public void settext(String text) { buf.setline(text); + redraw(); } public void rsettext(String text) { @@ -70,6 +71,7 @@ protected void changed() { TextEntry.this.changed(); } }; + redraw(); } public void uimsg(String name, Object... args) { From 6aee6e2e0a6191ab8c5ad6d2a76a294e89b3df3f Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 12 Feb 2015 00:21:14 +0100 Subject: [PATCH 0074/1113] Adapted fightsess to utext interface. --- src/haven/Fightsess.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/haven/Fightsess.java b/src/haven/Fightsess.java index 0860af19f5..a851d0d9fd 100644 --- a/src/haven/Fightsess.java +++ b/src/haven/Fightsess.java @@ -65,12 +65,14 @@ private void updatepos() { } private static final Text.Furnace ipf = new PUtils.BlurFurn(new Text.Foundry(Text.serif, 18, new Color(128, 128, 255)).aa(true), 1, 1, new Color(48, 48, 96)); - private final Text.UText ip = new Text.UText(ipf) { - public String text() {return("IP: " + fv.current.ip);} - }; - private final Text.UText oip = new Text.UText(ipf) { - public String text() {return("IP: " + fv.current.oip);} - }; + private final Text.UText ip = new Text.UText(ipf) { + public String text(Integer v) {return("IP: " + v);} + public Integer value() {return(fv.current.ip);} + }; + private final Text.UText oip = new Text.UText(ipf) { + public String text(Integer v) {return("IP: " + v);} + public Integer value() {return(fv.current.oip);} + }; public void draw(GOut g) { updatepos(); From e1cede7b5c4605c1762d63bac20558d2c0ecc025 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 12 Feb 2015 00:47:41 +0100 Subject: [PATCH 0075/1113] Added hover image for login button. --- src/haven/LoginScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/LoginScreen.java b/src/haven/LoginScreen.java index 9f30497885..715fa345df 100644 --- a/src/haven/LoginScreen.java +++ b/src/haven/LoginScreen.java @@ -147,7 +147,7 @@ public boolean globtype(char k, KeyEvent ev) { private void mklogin() { synchronized(ui) { - btn = new IButton(new Coord(420, 510), this, "gfx/hud/buttons/login", "u", "d", null); + btn = new IButton(new Coord(419, 510), this, "gfx/hud/buttons/login", "u", "d", "o"); btn.c = btn.c.sub(Utils.imgsz(btn.up).div(2)); progress(null); } From bcce4dcaa0c42bb9f3d27f8c9232fd5da9e40521 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 12 Feb 2015 01:04:25 +0100 Subject: [PATCH 0076/1113] Added a standard curiosity iteminfo. --- src/haven/Curiosity.java | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/haven/Curiosity.java diff --git a/src/haven/Curiosity.java b/src/haven/Curiosity.java new file mode 100644 index 0000000000..14c3de1045 --- /dev/null +++ b/src/haven/Curiosity.java @@ -0,0 +1,44 @@ +/* + * This file is part of the Haven & Hearth game client. + * Copyright (C) 2009 Fredrik Tolf , and + * Björn Johannessen + * + * Redistribution and/or modification of this file is subject to the + * terms of the GNU Lesser General Public License, version 3, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Other parts of this source tree adhere to other copying + * rights. Please see the file `COPYING' in the root directory of the + * source tree for details. + * + * A copy the GNU Lesser General Public License is distributed along + * with the source tree of which this file is a part in the file + * `doc/LPGL-3'. If it is missing for any reason, please see the Free + * Software Foundation's website at , or write + * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + */ + +package haven; + +import java.awt.Graphics; +import java.awt.image.BufferedImage; + +public class Curiosity extends ItemInfo.Tip { + public final int exp, mw; + + public Curiosity(Owner owner, int exp, int mw) { + super(owner); + this.exp = exp; + this.mw = mw; + } + + public BufferedImage longtip() { + return(RichText.render(String.format("Learning points: $col[192,192,255]{%s}\nMental weight: $col[255,192,255]{%d}", Utils.thformat(exp), mw), 0).img); + } +} From f226ca0c08c376bee5ecb79e37cff8adc70d20b5 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 12 Feb 2015 01:04:46 +0100 Subject: [PATCH 0077/1113] Added sattr display to charwnd. --- src/haven/CharWnd.java | 218 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 203 insertions(+), 15 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 957fdb6b4b..e7f6728cb8 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -39,13 +39,15 @@ public class CharWnd extends Window { public static final Text.Foundry attrf = new Text.Foundry(Text.fraktur, 18).aa(true); public static final Color debuff = new Color(255, 128, 128); public static final Color buff = new Color(128, 255, 128); + public static final Color tbuff = new Color(128, 128, 255); public static final Color every = new Color(255, 255, 255, 16), other = new Color(255, 255, 255, 32); public final Collection base; + public final Collection skill; public final FoodMeter feps; public final Constipations cons; public int exp; + private int scost; private final Tabs.Tab sattr; - private final Label explbl; public static class FoodMeter extends Widget { public static final Tex frame = Resource.loadtex("gfx/hud/chr/foodm"); @@ -288,7 +290,7 @@ public class Attr extends Widget { public final Color bg; private double lvlt = 0.0; private Text ct; - private int cv; + private int cbv, ccv; private Attr(String attr, String rnm, Coord c, Widget parent, Color bg) { super(c, new Coord(attrw, attrf.height() + 2), parent); @@ -300,19 +302,19 @@ private Attr(String attr, String rnm, Coord c, Widget parent, Color bg) { } public void tick(double dt) { - if(attr.comp != cv) { - cv = attr.comp; + if((attr.base != cbv) || (attr.comp != ccv)) { + cbv = attr.base; ccv = attr.comp; Color c = Color.WHITE; - if(attr.comp > attr.base) { + if(ccv > cbv) { c = buff; - tooltip = Text.render(String.format("%d + %d", attr.base, attr.comp - attr.base)); - } else if(attr.comp < attr.base) { + tooltip = Text.render(String.format("%d + %d", cbv, ccv - cbv)); + } else if(ccv < cbv) { c = debuff; - tooltip = Text.render(String.format("%d - %d", attr.base, attr.base - attr.comp)); + tooltip = Text.render(String.format("%d - %d", cbv, cbv - ccv)); } else { tooltip = null; } - ct = attrf.render(Integer.toString(cv), c); + ct = attrf.render(Integer.toString(ccv), c); } if((lvlt > 0.0) && ((lvlt -= dt) < 0)) lvlt = 0.0; @@ -336,8 +338,154 @@ public void lvlup() { } } - private void updexp() { - explbl.settext(Utils.thformat(exp)); + public class SAttr extends Widget { + public final String nm; + public final Text rnm; + public final Glob.CAttr attr; + public final Tex img; + public final Color bg; + public int tbv, tcv, cost; + private Text ct; + private int cbv, ccv; + + private SAttr(String attr, String rnm, Coord c, Widget parent, Color bg) { + super(c, new Coord(attrw, attrf.height() + 2), parent); + this.nm = attr; + this.img = Resource.load("gfx/hud/chr/" + attr).loadwait().layer(Resource.imgc).tex(); + this.rnm = attrf.render(rnm); + this.attr = ui.sess.glob.cattr.get(attr); + this.bg = bg; + new IButton(new Coord(sz.x - 19, (sz.y / 2) - 7), this, "gfx/hud/buttons/add", "u", "d", null) { + public void click() {adj(1);} + }; + new IButton(new Coord(sz.x - 34, (sz.y / 2) - 7), this, "gfx/hud/buttons/sub", "u", "d", null) { + public void click() {adj(-1);} + public boolean mousewheel(Coord c, int a) {adj(-a); return(true);} + }; + } + + public void tick(double dt) { + if((attr.base != cbv) || (attr.comp != ccv)) { + cbv = attr.base; ccv = attr.comp; + if(tbv <= cbv) { + tbv = cbv; tcv = ccv; + updcost(); + } + Color c = Color.WHITE; + if(ccv > cbv) { + c = buff; + tooltip = Text.render(String.format("%d + %d", cbv, ccv - cbv)); + } else if(ccv < cbv) { + c = debuff; + tooltip = Text.render(String.format("%d - %d", cbv, cbv - ccv)); + } else { + tooltip = null; + } + if(tcv > ccv) + c = tbuff; + ct = attrf.render(Integer.toString(tcv), c); + } + } + + public void draw(GOut g) { + g.chcolor(bg); + g.frect(Coord.z, sz); + g.chcolor(); + super.draw(g); + Coord cn = new Coord(0, sz.y / 2); + g.aimage(img, cn.add(5, 0), 0, 0.5); + g.aimage(rnm.tex(), cn.add(img.sz().x + 10, 1), 0, 0.5); + g.aimage(ct.tex(), cn.add(sz.x - 40, 1), 1, 0.5); + } + + private void updcost() { + int cost = 100 * ((tbv + (tbv * tbv)) - (attr.base + (attr.base * attr.base))) / 2; + scost += cost - this.cost; + this.cost = cost; + } + + public void adj(int a) { + if(tbv + a < attr.base) a = attr.base - tbv; + tbv += a; tcv += a; + cbv = ccv = 0; + updcost(); + } + + public boolean mousewheel(Coord c, int a) { + adj(-a); + return(true); + } + } + + public static class RLabel extends Label { + private Coord oc; + + public RLabel(Coord c, Widget parent, String text) { + super(c, parent, text); + oc = c; + this.c = oc.add(-sz.x, 0); + } + + public void settext(String text) { + super.settext(text); + this.c = oc.add(-sz.x, 0); + } + } + + public class ExpLabel extends RLabel { + private int cexp; + + public ExpLabel(Coord c, Widget parent) { + super(c, parent, "0"); + } + + public void draw(GOut g) { + super.draw(g); + if(exp != cexp) + settext(Utils.thformat(cexp = exp)); + } + } + + public class StudyInfo extends Widget { + public Widget study; + public int texp, tw; + private final Text.UText texpt = new Text.UText(Text.std) { + public Integer value() {return(texp);} + public String text(Integer v) {return(Utils.thformat(v));} + }; + private final Text.UText twt = new Text.UText(Text.std) { + private Glob.CAttr intv = ui.sess.glob.cattr.get("int"); + public Integer value() {return(tw);} + public String text(Integer v) {return(v + "/" + intv.comp);} + }; + + private StudyInfo(Coord c, Coord sz, Widget parent, Widget study) { + super(c, sz, parent); + this.study = study; + new Label(new Coord(2, 2), this, "Attention:"); + new Label(new Coord(2, sz.y - 32), this, "Learning points:"); + } + + private void upd() { + int texp = 0, tw = 0; + for(GItem item : study.children(GItem.class)) { + Curiosity ci = ItemInfo.find(Curiosity.class, item.info()); + if(ci != null) { + texp += ci.exp; + tw += ci.mw; + } + } + this.texp = texp; this.tw = tw; + } + + public void draw(GOut g) { + upd(); + super.draw(g); + g.chcolor(255, 192, 255, 255); + g.aimage(twt.get().tex(), new Coord(sz.x - 2, 17), 1.0, 0.0); + g.chcolor(192, 192, 255, 255); + g.aimage(texpt.get().tex(), sz.add(-2, -15), 1.0, 0.0); + } } @RName("chr") @@ -379,9 +527,46 @@ public CharWnd(Coord pc, Widget parent) { } { + int x = 5, y = 0; + sattr = tabs.new Tab(); - new Label(new Coord(0, 150), sattr, "Learning Points:"); - explbl = new Label(new Coord(90, 150), sattr, "0"); + new Img(new Coord(x - 5, y), catf.render("Skill Values").tex(), sattr); y += 35; + skill = new ArrayList(); + SAttr aw; + skill.add(aw = new SAttr("unarmed", "Unarmed Combat", wbox.btloff().add(x, y), sattr, every)); y += aw.sz.y; + Frame.around(sattr, skill); + + x = 260; y = 0; + new Img(new Coord(x - 5, y), catf.render("Study Report").tex(), sattr); y += 35; + y += 150; + int rx = x + attrw - 10; + new Frame(new Coord(x, y).add(wbox.btloff()), new Coord(attrw, 75), sattr); + new Label(new Coord(x + 15, y + 10), sattr, "Learning points:"); + new ExpLabel(new Coord(rx, y + 10), sattr); + new Label(new Coord(x + 15, y + 25), sattr, "Cost:"); + new RLabel(new Coord(rx, y + 25), sattr, "0") { + int cc; + + public void draw(GOut g) { + if(cc > exp) + g.chcolor(debuff); + super.draw(g); + if(cc != scost) + settext(Utils.thformat(cc = scost)); + } + }; + new Button(new Coord(rx - 75, y + 50), 75, sattr, "Buy") { + public void click() { + ArrayList args = new ArrayList(); + for(SAttr attr : skill) { + if(attr.tbv > attr.attr.base) { + args.add(attr.attr.nm); + args.add(attr.tbv); + } + } + CharWnd.this.wdgmsg("sattr", args.toArray(new Object[0])); + } + }; } { @@ -410,7 +595,11 @@ public void click() { public Widget makechild(String type, Object[] pargs, Object[] cargs) { String place = (pargs[0] instanceof String)?(((String)pargs[0]).intern()):null; if(place == "study") { - return(gettype(type).create(Coord.z, sattr, cargs)); + Widget ret = gettype(type).create(new Coord(260, 35).add(wbox.btloff()), sattr, cargs); + Frame.around(sattr, Collections.singletonList(ret)); + Widget inf = new StudyInfo(new Coord(260 + 150, ret.c.y).add(wbox.btloff().x, 0), new Coord(attrw - 150, ret.sz.y), sattr, ret); + Frame.around(sattr, Collections.singletonList(inf)); + return(ret); } else { return(super.makechild(type, pargs, cargs)); } @@ -419,7 +608,6 @@ public Widget makechild(String type, Object[] pargs, Object[] cargs) { public void uimsg(String nm, Object... args) { if(nm == "exp") { exp = ((Number)args[0]).intValue(); - updexp(); } else if(nm == "food") { feps.update(args); } else if(nm == "ftrig") { From 7c328be8a2d0a0e2bdb72bc58661ee2f8724472c Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 12 Feb 2015 02:24:34 +0100 Subject: [PATCH 0078/1113] Adjusted login-screen error position. --- src/haven/LoginScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/LoginScreen.java b/src/haven/LoginScreen.java index 715fa345df..4edd408b07 100644 --- a/src/haven/LoginScreen.java +++ b/src/haven/LoginScreen.java @@ -217,7 +217,7 @@ public void presize() { public void draw(GOut g) { super.draw(g); if(error != null) - g.image(error.tex(), new Coord(420 - (error.sz().x / 2), 500)); + g.image(error.tex(), new Coord(420 - (error.sz().x / 2), 450)); if(progress != null) g.image(progress.tex(), new Coord(420 - (progress.sz().x / 2), 350)); } From a1d28d208463e0a187c56ee3ec514cb5fe3030e1 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sat, 14 Feb 2015 06:14:10 +0100 Subject: [PATCH 0079/1113] Ported mostly everything to bincodec. --- src/haven/CharWnd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index e7f6728cb8..36b8c0de04 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -67,7 +67,7 @@ public static class Event extends Resource.Layer { public Event(Resource res, byte[] bbuf) { res.super(); - Message buf = new Message(0, bbuf); + Message buf = new MessageBuf(bbuf); int ver = buf.uint8(); if(ver == 1) { col = new Color(buf.uint8(), buf.uint8(), buf.uint8(), buf.uint8()); From 0340a4803e987631aa29a56d719b535b04abcc84 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sat, 14 Feb 2015 16:51:42 +0100 Subject: [PATCH 0080/1113] Changed resource layer-construction to use bincodecs in the interface. --- src/haven/CharWnd.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 36b8c0de04..f9dab4d5e3 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -65,9 +65,8 @@ public static class Event extends Resource.Layer { public final String nm; public final int sort; - public Event(Resource res, byte[] bbuf) { + public Event(Resource res, Message buf) { res.super(); - Message buf = new MessageBuf(bbuf); int ver = buf.uint8(); if(ver == 1) { col = new Color(buf.uint8(), buf.uint8(), buf.uint8(), buf.uint8()); From a3cb2b61d9d128db94701ba61bd8c1fb449e33e3 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 18 Feb 2015 00:54:31 +0100 Subject: [PATCH 0081/1113] Display skills and lore in char-sheet. --- src/haven/CharWnd.java | 343 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 341 insertions(+), 2 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index f9dab4d5e3..db527e197a 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -45,6 +45,8 @@ public class CharWnd extends Window { public final Collection skill; public final FoodMeter feps; public final Constipations cons; + public final SkillList csk, nsk; + public final ExperienceList exps; public int exp; private int scost; private final Tabs.Tab sattr; @@ -487,6 +489,211 @@ public void draw(GOut g) { } } + public static class LoadingTextBox extends RichTextBox { + private Indir text = null; + + public LoadingTextBox(Coord c, Coord sz, Widget parent, String text, RichText.Foundry fnd) {super(c, sz, parent, text, fnd);} + public LoadingTextBox(Coord c, Coord sz, Widget parent, String text, Object... attrs) {super(c, sz, parent, text, attrs);} + + public void settext(Indir text) { + this.text = text; + } + + public void draw(GOut g) { + if(text != null) { + try { + settext(text.get()); + text = null; + } catch(Loading l) { + } + } + super.draw(g); + } + } + + public class Skill { + public final String nm; + public final Indir res; + public final int cost; + private String sortkey; + private final Text.UText rnm = new Text.UText(attrf) { + public String value() { + try { + return(res.get().layer(Resource.tooltip).t); + } catch(Loading l) { + return("..."); + } + } + }; + + private Skill(String nm, Indir res, int cost) { + this.nm = nm; + this.res = res; + this.cost = cost; + this.sortkey = nm; + } + + public String rendertext() { + StringBuilder buf = new StringBuilder(); + Resource res = this.res.get(); + buf.append("$img[" + res.name + "]\n\n"); + buf.append("$b{$font[serif,16]{" + res.layer(Resource.tooltip).t + "}}\n\n\n"); + buf.append("Cost: " + cost + "\n\n"); + buf.append(res.layer(Resource.pagina).text); + return(buf.toString()); + } + } + + public class Experience { + public final Indir res; + public final int mtime; + private String sortkey = "\uffff"; + private final Text.UText rnm = new Text.UText(attrf) { + public String value() { + try { + return(res.get().layer(Resource.tooltip).t); + } catch(Loading l) { + return("..."); + } + } + }; + + private Experience(Indir res, int mtime) { + this.res = res; + this.mtime = mtime; + } + + public String rendertext() { + StringBuilder buf = new StringBuilder(); + Resource res = this.res.get(); + buf.append("$img[" + res.name + "]\n\n"); + buf.append("$b{$font[serif,16]{" + res.layer(Resource.tooltip).t + "}}\n\n\n"); + buf.append(res.layer(Resource.pagina).text); + return(buf.toString()); + } + } + + public static class SkillList extends Listbox { + public Skill[] skills = new Skill[0]; + private boolean loading = false; + private final Comparator skcomp = new Comparator() { + public int compare(Skill a, Skill b) { + return(a.sortkey.compareTo(b.sortkey)); + } + }; + + public SkillList(Coord c, int w, int h, Widget parent) { + super(c, parent, w, h, attrf.height() + 2); + } + + public void tick(double dt) { + if(loading) { + loading = false; + for(Skill sk : skills) { + try { + sk.sortkey = sk.res.get().layer(Resource.tooltip).t; + } catch(Loading l) { + sk.sortkey = sk.nm; + loading = true; + } + } + Arrays.sort(skills, skcomp); + } + } + + protected Skill listitem(int idx) {return(skills[idx]);} + protected int listitems() {return(skills.length);} + + protected void drawbg(GOut g) {} + + protected void drawitem(GOut g, Skill sk, int idx) { + g.chcolor((idx % 2 == 0)?every:other); + g.frect(Coord.z, g.sz); + g.chcolor(); + try { + g.image(sk.res.get().layer(Resource.imgc).tex(), Coord.z, new Coord(itemh, itemh)); + } catch(Loading e) { + WItem.missing.loadwait(); + g.image(WItem.missing.layer(Resource.imgc).tex(), Coord.z, new Coord(itemh, itemh)); + } + g.aimage(sk.rnm.get().tex(), new Coord(itemh + 5, itemh / 2), 0, 0.5); + } + + public void pop(Collection nsk) { + Skill[] skills = nsk.toArray(new Skill[0]); + sb.val = 0; + sb.max = skills.length - h; + Skill psel = sel; + sel = null; + this.skills = skills; + if(psel != null) { + for(Skill sk : skills) { + if(sk.nm.equals(psel.nm)) { + sel = sk; + break; + } + } + } + loading = true; + } + } + + public static class ExperienceList extends Listbox { + public Experience[] exps = new Experience[0]; + private boolean loading = false; + private final Comparator comp = new Comparator() { + public int compare(Experience a, Experience b) { + return(a.sortkey.compareTo(b.sortkey)); + } + }; + + public ExperienceList(Coord c, int w, int h, Widget parent) { + super(c, parent, w, h, attrf.height() + 2); + } + + public void tick(double dt) { + if(loading) { + loading = false; + for(Experience exp : exps) { + try { + exp.sortkey = exp.res.get().layer(Resource.tooltip).t; + } catch(Loading l) { + exp.sortkey = "\uffff"; + loading = true; + } + } + Arrays.sort(exps, comp); + } + } + + protected Experience listitem(int idx) {return(exps[idx]);} + protected int listitems() {return(exps.length);} + + protected void drawbg(GOut g) {} + + protected void drawitem(GOut g, Experience exp, int idx) { + g.chcolor((idx % 2 == 0)?every:other); + g.frect(Coord.z, g.sz); + g.chcolor(); + try { + g.image(exp.res.get().layer(Resource.imgc).tex(), Coord.z, new Coord(itemh, itemh)); + } catch(Loading e) { + WItem.missing.loadwait(); + g.image(WItem.missing.layer(Resource.imgc).tex(), Coord.z, new Coord(itemh, itemh)); + } + g.aimage(exp.rnm.get().tex(), new Coord(itemh + 5, itemh / 2), 0, 0.5); + } + + public void pop(Collection nl) { + Experience[] exps = nl.toArray(new Experience[0]); + sb.val = 0; + sb.max = exps.length - h; + sel = null; + this.exps = exps; + loading = true; + } + } + @RName("chr") public static class $_ implements Factory { public Widget create(Coord c, Widget parent, Object[] args) { @@ -515,7 +722,7 @@ public CharWnd(Coord pc, Widget parent) { base.add(aw = new Attr("dex", "Dexterity", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; base.add(aw = new Attr("psy", "Psyche", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; Frame.around(battr, base); - y += 20; + y += 24; new Img(new Coord(x - 5, y), catf.render("Food Event Points").tex(), battr); y += 35; feps = new FoodMeter(new Coord(x, y), battr); @@ -537,7 +744,7 @@ public CharWnd(Coord pc, Widget parent) { x = 260; y = 0; new Img(new Coord(x - 5, y), catf.render("Study Report").tex(), sattr); y += 35; - y += 150; + y += 156; int rx = x + attrw - 10; new Frame(new Coord(x, y).add(wbox.btloff()), new Coord(attrw, 75), sattr); new Label(new Coord(x + 15, y + 10), sattr, "Learning points:"); @@ -568,6 +775,103 @@ public void click() { }; } + Tabs.Tab skills; + { + int x = 5, y = 0; + + skills = tabs.new Tab(); + new Img(new Coord(x - 5, y), catf.render("Lore & Skills").tex(), skills); y += 35; + RichText.Foundry ifnd = new RichText.Foundry(java.awt.font.TextAttribute.FAMILY, "SansSerif", java.awt.font.TextAttribute.SIZE, 9).aa(true); + final LoadingTextBox info = new LoadingTextBox(new Coord(x, y).add(wbox.btloff()), new Coord(attrw, 260), skills, "", ifnd); + info.bg = new Color(0, 0, 0, 128); + Frame.around(skills, Collections.singletonList(info)); + + x = 260; y = 0; + new Img(new Coord(x - 5, y), catf.render("Entries").tex(), skills); y += 35; + Tabs lists = new Tabs(new Coord(x, y), new Coord(attrw + wbox.bisz().x, 0), skills); + Tabs.Tab nsk = lists.new Tab(); + { + this.nsk = new SkillList(wbox.btloff(), lists.sz.x - wbox.bisz().x, 7, nsk) { + public void change(final Skill sk) { + Skill p = sel; + super.change(sk); + CharWnd.this.csk.sel = null; + CharWnd.this.exps.sel = null; + if(sk != null) + info.settext(new Indir() {public String get() {return(sk.rendertext());}}); + else if(p != null) + info.settext(""); + } + }; + y = Frame.around(nsk, Collections.singletonList(this.nsk)).sz.y + 5; + int rx = attrw - 10; + new Frame(new Coord(0, y).add(wbox.btloff()), new Coord(attrw, 69), nsk); + new Label(new Coord(15, y + 10), nsk, "Learning points:"); + new ExpLabel(new Coord(rx, y + 10), nsk); + new Label(new Coord(15, y + 25), nsk, "Cost:"); + new RLabel(new Coord(rx, y + 25), nsk, "N/A") { + Integer cc = null; + + public void draw(GOut g) { + if((cc != null) && (cc > exp)) + g.chcolor(debuff); + super.draw(g); + if((CharWnd.this.nsk.sel == null) && (cc != null)) { + settext("N/A"); + cc = null; + } else if((CharWnd.this.nsk.sel != null) && (cc == null)) { + settext(Utils.thformat(cc = CharWnd.this.nsk.sel.cost)); + } + } + }; + new Button(new Coord(rx - 75, y + 44), 75, nsk, "Buy") { + public void click() { + if(CharWnd.this.nsk.sel != null) + CharWnd.this.wdgmsg("buy", CharWnd.this.nsk.sel.nm); + } + }; + } + Tabs.Tab csk = lists.new Tab(); + { + this.csk = new SkillList(wbox.btloff(), lists.sz.x - wbox.bisz().x, 11, csk) { + public void change(final Skill sk) { + Skill p = sel; + super.change(sk); + CharWnd.this.nsk.sel = null; + CharWnd.this.exps.sel = null; + if(sk != null) + info.settext(new Indir() {public String get() {return(sk.rendertext());}}); + else if(p != null) + info.settext(""); + } + }; + Frame.around(csk, Collections.singletonList(this.csk)); + } + Tabs.Tab exps = lists.new Tab(); + { + this.exps = new ExperienceList(wbox.btloff(), lists.sz.x - wbox.bisz().x, 11, exps) { + public void change(final Experience exp) { + Experience p = sel; + super.change(exp); + CharWnd.this.nsk.sel = null; + CharWnd.this.csk.sel = null; + if(exp != null) + info.settext(new Indir() {public String get() {return(exp.rendertext());}}); + else if(p != null) + info.settext(""); + } + }; + Frame.around(exps, Collections.singletonList(this.exps)); + } + lists.pack(); + int bw = (lists.sz.x + 5) / 3; + x = lists.c.x; + y = lists.c.y + lists.sz.y + 5; + lists.new TabButton(new Coord(x, y), bw - 5, "Available", nsk); + lists.new TabButton(new Coord(x + bw, y), bw - 5, "Current", csk); + lists.new TabButton(new Coord(x + bw * 2, y), bw - 5, "Lore", exps); + } + { Widget prev; @@ -586,6 +890,7 @@ public void click() { tabs.pack(); prev = new TB(new Coord(tabs.c.x + 5, tabs.c.y + tabs.sz.y + 10), "battr", battr); prev = new TB(new Coord(prev.c.x + prev.sz.x + 10, prev.c.y), "sattr", sattr); + prev = new TB(new Coord(prev.c.x + prev.sz.x + 10, prev.c.y), "skill", skills); } resize(contentsz().add(15, 10)); @@ -604,6 +909,23 @@ public Widget makechild(String type, Object[] pargs, Object[] cargs) { } } + private void decsklist(Collection buf, Object[] args, int a) { + while(a < args.length) { + String nm = (String)args[a++]; + Indir res = ui.sess.getres((Integer)args[a++]); + int cost = ((Number)args[a++]).intValue(); + buf.add(new Skill(nm, res, cost)); + } + } + + private void decexplist(Collection buf, Object[] args, int a) { + while(a < args.length) { + Indir res = ui.sess.getres((Integer)args[a++]); + int mtime = ((Number)args[a++]).intValue(); + buf.add(new Experience(res, mtime)); + } + } + public void uimsg(String nm, Object... args) { if(nm == "exp") { exp = ((Number)args[0]).intValue(); @@ -623,6 +945,23 @@ public void uimsg(String nm, Object... args) { double m = ((Number)args[a++]).doubleValue(); cons.update(t, m); } + } else if(nm == "csk") { + /* One *could* argue that rmessages should have some + * built-in fragmentation scheme. ^^ */ + boolean rst = ((Integer)args[0]) != 0; + Collection buf = rst?new ArrayList():new ArrayList(Arrays.asList(csk.skills)); + decsklist(buf, args, 1); + csk.pop(buf); + } else if(nm == "nsk") { + boolean rst = ((Integer)args[0]) != 0; + Collection buf = rst?new ArrayList():new ArrayList(Arrays.asList(nsk.skills)); + decsklist(buf, args, 1); + nsk.pop(buf); + } else if(nm == "exps") { + boolean rst = ((Integer)args[0]) != 0; + Collection buf = rst?new ArrayList():new ArrayList(Arrays.asList(exps.exps)); + decexplist(buf, args, 1); + exps.pop(buf); } else { super.uimsg(nm, args); } From aa6c332b3290a79674d43a0a2b30cd07245b81ce Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 18 Feb 2015 01:06:26 +0100 Subject: [PATCH 0082/1113] Scale down skill icons more nicely. --- src/haven/CharWnd.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index db527e197a..c9672558a2 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -511,11 +511,13 @@ public void draw(GOut g) { } } + private static final PUtils.Convolution iconfilter = new PUtils.Lanczos(3); public class Skill { public final String nm; public final Indir res; public final int cost; private String sortkey; + private Tex small; private final Text.UText rnm = new Text.UText(attrf) { public String value() { try { @@ -548,6 +550,7 @@ public class Experience { public final Indir res; public final int mtime; private String sortkey = "\uffff"; + private Tex small; private final Text.UText rnm = new Text.UText(attrf) { public String value() { try { @@ -611,7 +614,9 @@ protected void drawitem(GOut g, Skill sk, int idx) { g.frect(Coord.z, g.sz); g.chcolor(); try { - g.image(sk.res.get().layer(Resource.imgc).tex(), Coord.z, new Coord(itemh, itemh)); + if(sk.small == null) + sk.small = new TexI(PUtils.convolvedown(sk.res.get().layer(Resource.imgc).img, new Coord(itemh, itemh), iconfilter)); + g.image(sk.small, Coord.z); } catch(Loading e) { WItem.missing.loadwait(); g.image(WItem.missing.layer(Resource.imgc).tex(), Coord.z, new Coord(itemh, itemh)); @@ -676,7 +681,9 @@ protected void drawitem(GOut g, Experience exp, int idx) { g.frect(Coord.z, g.sz); g.chcolor(); try { - g.image(exp.res.get().layer(Resource.imgc).tex(), Coord.z, new Coord(itemh, itemh)); + if(exp.small == null) + exp.small = new TexI(PUtils.convolvedown(exp.res.get().layer(Resource.imgc).img, new Coord(itemh, itemh), iconfilter)); + g.image(exp.small, Coord.z); } catch(Loading e) { WItem.missing.loadwait(); g.image(WItem.missing.layer(Resource.imgc).tex(), Coord.z, new Coord(itemh, itemh)); From 059d04671172ab623fb783c9a0ac20e1097a7ef2 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Fri, 20 Feb 2015 16:41:51 +0100 Subject: [PATCH 0083/1113] Guard curiosity display against loading. --- src/haven/CharWnd.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index c9672558a2..caee0fed9f 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -470,10 +470,13 @@ private StudyInfo(Coord c, Coord sz, Widget parent, Widget study) { private void upd() { int texp = 0, tw = 0; for(GItem item : study.children(GItem.class)) { - Curiosity ci = ItemInfo.find(Curiosity.class, item.info()); - if(ci != null) { - texp += ci.exp; - tw += ci.mw; + try { + Curiosity ci = ItemInfo.find(Curiosity.class, item.info()); + if(ci != null) { + texp += ci.exp; + tw += ci.mw; + } + } catch(Loading l) { } } this.texp = texp; this.tw = tw; From 735baf7e394301b6341802fd004f0e97d181fa06 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 4 Mar 2015 19:00:53 +0100 Subject: [PATCH 0084/1113] Added FEP meter tooltip. --- src/haven/CharWnd.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index caee0fed9f..eb48c6dbf2 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -146,6 +146,7 @@ public void tick(double dt) { try { Collections.sort(enew, dcmp); els = enew; + rtip = null; } catch(Loading l) {} } if(trev != null) { @@ -192,6 +193,26 @@ public void trig(Indir ev) { etr = (enew != null)?enew:els; trev = ev; } + + private Tex rtip = null; + public Object tooltip(Coord c, Widget prev) { + List els = this.els; + if(els.isEmpty()) + return(null); + if(rtip == null) { + BufferedImage cur = null; + for(El el : els) { + Event ev = el.res.get().layer(Event.class); + BufferedImage ln = Text.render(String.format("%s: %s", ev.nm, Utils.odformat2(el.a, 2)), ev.col).img; + Resource.Image icon = el.res.get().layer(Resource.imgc); + if(icon != null) + ln = ItemInfo.catimgsh(5, icon.img, ln); + cur = ItemInfo.catimgs(0, cur, ln); + } + rtip = new TexI(cur); + } + return(rtip); + } } public static class Constipations extends Listbox { From 8357e29c53d7df8e11a0ddbff2bee2c9132d7b9c Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 17 Mar 2015 23:42:10 +0100 Subject: [PATCH 0085/1113] Added tooltips to charwnd tab buttons. --- src/haven/CharWnd.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index eb48c6dbf2..94406286ed 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -920,8 +920,11 @@ public void click() { tabs.pack(); prev = new TB(new Coord(tabs.c.x + 5, tabs.c.y + tabs.sz.y + 10), "battr", battr); + prev.settip("Base Attributes"); prev = new TB(new Coord(prev.c.x + prev.sz.x + 10, prev.c.y), "sattr", sattr); + prev.settip("Skill Values"); prev = new TB(new Coord(prev.c.x + prev.sz.x + 10, prev.c.y), "skill", skills); + prev.settip("Lore & Skills"); } resize(contentsz().add(15, 10)); From 473503d8c83d323cb36a6831f437f30b4b26571e Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 18 Mar 2015 19:38:43 +0100 Subject: [PATCH 0086/1113] Fixed window raising behavior a bit further. --- src/haven/Window.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/haven/Window.java b/src/haven/Window.java index e5bfbbb691..e3bb19aeac 100644 --- a/src/haven/Window.java +++ b/src/haven/Window.java @@ -235,19 +235,22 @@ public Coord xlate(Coord c, boolean in) { } public boolean mousedown(Coord c, int button) { - parent.setfocus(this); - raise(); - if(super.mousedown(c, button)) + if(super.mousedown(c, button)) { + parent.setfocus(this); + raise(); return(true); + } Coord cpc = c.sub(cptl); if(c.isect(ctl, csz) || (c.isect(cptl, cpsz) && (cm.back.getRaster().getSample(cpc.x % cm.back.getWidth(), cpc.y, 3) >= 128))) { if(button == 1) { dm = ui.grabmouse(this); doff = c; } + parent.setfocus(this); + raise(); return(true); } - return(true); + return(false); } public boolean mouseup(Coord c, int button) { From 373c9ed6ee075f3f11b287f337d1de3b1c7ab9eb Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 1 Apr 2015 19:05:00 +0200 Subject: [PATCH 0087/1113] Fixed up polity window. --- src/haven/Polity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/Polity.java b/src/haven/Polity.java index 2085472ff8..64dbb54af1 100644 --- a/src/haven/Polity.java +++ b/src/haven/Polity.java @@ -93,7 +93,7 @@ public MemberWidget(Coord c, Coord sz, Widget parent, int id) { public static final Text.Foundry membf = new Text.Foundry(Text.serif, 12); public Polity(Coord c, Widget parent, String name) { - super(c, new Coord(200, 200), parent, "Town"); + super(c, new Coord(200, 200), parent, "Village", true, Coord.z, Coord.z); this.name = name; new Label(new Coord(0, 5), this, name, nmf); new Label(new Coord(0, 45), this, "Members:"); From b87c44f6dd6f65ffed8eb64e9356c769fbd8f8e4 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 1 Apr 2015 19:05:18 +0200 Subject: [PATCH 0088/1113] Use attribute names from resources instead of hardcoding. --- src/haven/CharWnd.java | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 94406286ed..6bc0c0cb57 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -314,11 +314,12 @@ public class Attr extends Widget { private Text ct; private int cbv, ccv; - private Attr(String attr, String rnm, Coord c, Widget parent, Color bg) { + private Attr(String attr, Coord c, Widget parent, Color bg) { super(c, new Coord(attrw, attrf.height() + 2), parent); + Resource res = Resource.load("gfx/hud/chr/" + attr).loadwait(); this.nm = attr; - this.img = Resource.load("gfx/hud/chr/" + attr).loadwait().layer(Resource.imgc).tex(); - this.rnm = attrf.render(rnm); + this.img = res.layer(Resource.imgc).tex(); + this.rnm = attrf.render(res.layer(Resource.tooltip).t); this.attr = ui.sess.glob.cattr.get(attr); this.bg = bg; } @@ -370,11 +371,12 @@ public class SAttr extends Widget { private Text ct; private int cbv, ccv; - private SAttr(String attr, String rnm, Coord c, Widget parent, Color bg) { + private SAttr(String attr, Coord c, Widget parent, Color bg) { super(c, new Coord(attrw, attrf.height() + 2), parent); + Resource res = Resource.load("gfx/hud/chr/" + attr).loadwait(); this.nm = attr; - this.img = Resource.load("gfx/hud/chr/" + attr).loadwait().layer(Resource.imgc).tex(); - this.rnm = attrf.render(rnm); + this.img = res.layer(Resource.imgc).tex(); + this.rnm = attrf.render(res.layer(Resource.tooltip).t); this.attr = ui.sess.glob.cattr.get(attr); this.bg = bg; new IButton(new Coord(sz.x - 19, (sz.y / 2) - 7), this, "gfx/hud/buttons/add", "u", "d", null) { @@ -744,14 +746,14 @@ public CharWnd(Coord pc, Widget parent) { new Img(new Coord(x - 5, y), catf.render("Base Attributes").tex(), battr); y += 35; base = new ArrayList(); Attr aw; - base.add(aw = new Attr("str", "Strength", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; - base.add(aw = new Attr("agi", "Agility", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; - base.add(aw = new Attr("int", "Intelligence", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; - base.add(aw = new Attr("con", "Constitution", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; - base.add(aw = new Attr("prc", "Perception", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; - base.add(aw = new Attr("csm", "Charisma", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; - base.add(aw = new Attr("dex", "Dexterity", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; - base.add(aw = new Attr("psy", "Psyche", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; + base.add(aw = new Attr("str", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; + base.add(aw = new Attr("agi", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; + base.add(aw = new Attr("int", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; + base.add(aw = new Attr("con", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; + base.add(aw = new Attr("prc", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; + base.add(aw = new Attr("csm", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; + base.add(aw = new Attr("dex", wbox.btloff().add(x, y), battr, every)); y += aw.sz.y; + base.add(aw = new Attr("psy", wbox.btloff().add(x, y), battr, other)); y += aw.sz.y; Frame.around(battr, base); y += 24; new Img(new Coord(x - 5, y), catf.render("Food Event Points").tex(), battr); y += 35; @@ -770,7 +772,8 @@ public CharWnd(Coord pc, Widget parent) { new Img(new Coord(x - 5, y), catf.render("Skill Values").tex(), sattr); y += 35; skill = new ArrayList(); SAttr aw; - skill.add(aw = new SAttr("unarmed", "Unarmed Combat", wbox.btloff().add(x, y), sattr, every)); y += aw.sz.y; + skill.add(aw = new SAttr("unarmed", wbox.btloff().add(x, y), sattr, every)); y += aw.sz.y; + skill.add(aw = new SAttr("explore", wbox.btloff().add(x, y), sattr, every)); y += aw.sz.y; Frame.around(sattr, skill); x = 260; y = 0; From de385ae70bac0c9df1a98f94e36af280937d4318 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Thu, 2 Apr 2015 00:01:07 +0200 Subject: [PATCH 0089/1113] Fixed Exploration bg color. --- src/haven/CharWnd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haven/CharWnd.java b/src/haven/CharWnd.java index 6bc0c0cb57..614970f62b 100644 --- a/src/haven/CharWnd.java +++ b/src/haven/CharWnd.java @@ -773,7 +773,7 @@ public CharWnd(Coord pc, Widget parent) { skill = new ArrayList(); SAttr aw; skill.add(aw = new SAttr("unarmed", wbox.btloff().add(x, y), sattr, every)); y += aw.sz.y; - skill.add(aw = new SAttr("explore", wbox.btloff().add(x, y), sattr, every)); y += aw.sz.y; + skill.add(aw = new SAttr("explore", wbox.btloff().add(x, y), sattr, other)); y += aw.sz.y; Frame.around(sattr, skill); x = 260; y = 0; From dd51858eb649876d8c080adefa25fec6a6f44480 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 7 Apr 2015 19:52:02 +0200 Subject: [PATCH 0090/1113] WIP: Change widget construction to start out unlinked. --- src/haven/Widget.java | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/haven/Widget.java b/src/haven/Widget.java index 697bd141fc..23374ec483 100644 --- a/src/haven/Widget.java +++ b/src/haven/Widget.java @@ -176,23 +176,40 @@ public static Factory gettype(String name) { return(f); } + public Widget(Coord sz) { + this.c = Coord.z; + this.sz = sz; + } + + public Widget() { + this(Coord.z); + } + public Widget(UI ui, Coord c, Coord sz) { this.ui = ui; this.c = c; this.sz = sz; } - public Widget(Coord c, Coord sz, Widget parent) { - synchronized(parent.ui) { - this.ui = parent.ui; - this.c = c; - this.sz = sz; - this.parent = parent; - link(); - parent.newchild(this); + public Widget add(Widget child) { + synchronized(this.ui) { + child.c = c; + child.ui = this.ui; + child.parent = this; + child.link(); + child.added(); + newchild(child); + return(child); } } - + + public Widget add(Widget child, Coord c) { + child.c = c; + return(add(child)); + } + + protected void added() {} + private Coord relpos(String spec, Object[] args, int off) { int i = 0; Stack st = new Stack(); From e26cacf131521565972ecf7dc6c9bebfefbc05bc Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 7 Apr 2015 20:11:07 +0200 Subject: [PATCH 0091/1113] WIP: Adapted widget creation protocol. --- src/haven/UI.java | 3 ++- src/haven/Widget.java | 26 +++++++++++++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/haven/UI.java b/src/haven/UI.java index 82d5f19264..6384442e8e 100644 --- a/src/haven/UI.java +++ b/src/haven/UI.java @@ -146,11 +146,12 @@ public void draw(GOut g) { } public void newwidget(int id, String type, int parent, Object[] pargs, Object... cargs) throws InterruptedException { + Widget.Factory f = Widget.gettype2(type); synchronized(this) { Widget pwdg = widgets.get(parent); if(pwdg == null) throw(new UIException("Null parent widget " + parent + " for " + id, type, cargs)); - Widget wdg = pwdg.makechild(type.intern(), pargs, cargs); + Widget wdg = pwdg.makechild(f, pargs, cargs); bind(wdg, id); } } diff --git a/src/haven/Widget.java b/src/haven/Widget.java index 23374ec483..48ff31414f 100644 --- a/src/haven/Widget.java +++ b/src/haven/Widget.java @@ -99,7 +99,7 @@ public Widget makechild(String type, Object[] pargs, Object[] cargs) { @Resource.PublishedCode(name = "wdg", instancer = FactMaker.class) public interface Factory { - public Widget create(Coord c, Widget parent, Object[] par); + public Widget create(Widget parent, Object[] par); } public static class FactMaker implements Resource.PublishedCode.Instancer { @@ -107,13 +107,13 @@ public Factory make(Class cl) throws InstantiationException, IllegalAccessExc if(Factory.class.isAssignableFrom(cl)) return(cl.asSubclass(Factory.class).newInstance()); try { - final Method mkm = cl.getDeclaredMethod("mkwidget", Coord.class, Widget.class, Object[].class); + final Method mkm = cl.getDeclaredMethod("mkwidget", Widget.class, Object[].class); int mod = mkm.getModifiers(); if(Widget.class.isAssignableFrom(mkm.getReturnType()) && ((mod & Modifier.STATIC) != 0) && ((mod & Modifier.PUBLIC) != 0)) { return(new Factory() { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { try { - return((Widget)mkm.invoke(null, c, parent, args)); + return((Widget)mkm.invoke(null, parent, args)); } catch(Exception e) { if(e instanceof RuntimeException) throw((RuntimeException)e); throw(new RuntimeException(e)); @@ -302,16 +302,20 @@ private Coord relpos(String spec, Object[] args, int off) { return((Coord)st.pop()); } - public Widget makechild(String type, Object[] pargs, Object[] cargs) { - Coord c; - if(pargs[0] instanceof Coord) { - c = (Coord)pargs[0]; - } else if(pargs[0] instanceof String) { - c = relpos((String)pargs[0], pargs, 1); + public void addchild(Widget child, Object... args) { + if(args[0] instanceof Coord) { + add(child, (Coord)args[0]); + } else if(args[0] instanceof String) { + add(child, relpos((String)args[0], args, 1)); } else { throw(new RuntimeException("Unknown child widget creation specification.")); } - return(gettype(type).create(c, this, cargs)); + } + + public Widget makechild(Factory type, Object[] pargs, Object[] cargs) { + Widget child = type.create(this, cargs); + addchild(child, pargs); + return(child); } public void newchild(Widget w) { From 604b6736ea2c48e581f263bc450a75d8ac07fdfa Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 8 Apr 2015 01:58:06 +0200 Subject: [PATCH 0092/1113] WIP: Make Widget.add return type more precise. --- src/haven/Widget.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haven/Widget.java b/src/haven/Widget.java index 48ff31414f..208d196e8d 100644 --- a/src/haven/Widget.java +++ b/src/haven/Widget.java @@ -191,7 +191,7 @@ public Widget(UI ui, Coord c, Coord sz) { this.sz = sz; } - public Widget add(Widget child) { + public T add(T child) { synchronized(this.ui) { child.c = c; child.ui = this.ui; @@ -203,7 +203,7 @@ public Widget add(Widget child) { } } - public Widget add(Widget child, Coord c) { + public T add(T child, Coord c) { child.c = c; return(add(child)); } From a82a042d9da431cb3ffa596517de3039a26cfc9c Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 8 Apr 2015 03:15:56 +0200 Subject: [PATCH 0093/1113] WIP: Added some widget manipulation convenience functions. --- src/haven/Widget.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/haven/Widget.java b/src/haven/Widget.java index 208d196e8d..f5146ee025 100644 --- a/src/haven/Widget.java +++ b/src/haven/Widget.java @@ -208,6 +208,18 @@ public T add(T child, Coord c) { return(add(child)); } + public T add(T child, int x, int y) { + return(add(child, new Coord(x, y))); + } + + public T adda(T child, int x, int y, double ax, double ay) { + return(add(child, x - (int)(child.sz.x * ax), y - (int)(child.sz.y * ay))); + } + + public T adda(T child, Coord c, double ax, double ay) { + return(adda(child, c.x, c.y, ax, ay)); + } + protected void added() {} private Coord relpos(String spec, Object[] args, int off) { @@ -781,6 +793,10 @@ public void resize(Coord sz) { parent.cresize(this); } + public void resize(int x, int y) { + resize(new Coord(x, y)); + } + public void cresize(Widget ch) { } From c1dd5032954c04f09179299d4073c036415314f7 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 8 Apr 2015 03:25:51 +0200 Subject: [PATCH 0094/1113] WIP: Converted most of the simpler widgets. --- src/haven/AWidget.java | 4 ++-- src/haven/Button.java | 32 ++++++++++++++++---------------- src/haven/CheckBox.java | 12 ++++++------ src/haven/ConsoleHost.java | 4 ++-- src/haven/Dropbox.java | 9 +++++---- src/haven/Frame.java | 15 ++++++++++----- src/haven/HSlider.java | 4 ++-- src/haven/IButton.java | 16 ++++++++-------- src/haven/IMeter.java | 8 ++++---- src/haven/ISBox.java | 8 ++++---- src/haven/Img.java | 12 ++++++------ src/haven/Label.java | 22 +++++++++++----------- src/haven/ListWidget.java | 4 ++-- src/haven/Listbox.java | 6 +++--- src/haven/LocalMiniMap.java | 4 ++-- src/haven/MapView.java | 8 ++++---- src/haven/MiniMap.java | 4 ++-- src/haven/PView.java | 4 ++-- src/haven/Progress.java | 8 ++++---- src/haven/RichTextBox.java | 10 +++++----- src/haven/SIWidget.java | 4 ++-- src/haven/SSWidget.java | 4 ++-- src/haven/Scrollbar.java | 4 ++-- src/haven/Scrollport.java | 29 ++++++++++++++--------------- src/haven/Speedget.java | 8 ++++---- src/haven/TextEntry.java | 14 +++++++------- src/haven/Textlog.java | 8 ++++---- src/haven/VMeter.java | 8 ++++---- src/haven/Widget.java | 32 +++++++++++++++++--------------- 29 files changed, 156 insertions(+), 149 deletions(-) diff --git a/src/haven/AWidget.java b/src/haven/AWidget.java index db8f4fde57..49d9ac1c33 100644 --- a/src/haven/AWidget.java +++ b/src/haven/AWidget.java @@ -27,8 +27,8 @@ package haven; public class AWidget extends Widget { - public AWidget(Widget parent) { - super(Coord.z, Coord.z, parent); + public AWidget() { + super(Coord.z); hide(); } } diff --git a/src/haven/Button.java b/src/haven/Button.java index 9d4ea12893..da095a185b 100644 --- a/src/haven/Button.java +++ b/src/haven/Button.java @@ -50,45 +50,45 @@ public class Button extends SIWidget { @RName("btn") public static class $Btn implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Button(c, (Integer)args[0], parent, (String)args[1])); + public Widget create(Widget parent, Object[] args) { + return(new Button((Integer)args[0], (String)args[1])); } } @RName("ltbtn") public static class $LTBtn implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(wrapped(c, (Integer)args[0], parent, (String)args[1])); + public Widget create(Widget parent, Object[] args) { + return(wrapped((Integer)args[0], (String)args[1])); } } - public static Button wrapped(Coord c, int w, Widget parent, String text) { - Button ret = new Button(c, w, parent, tf.renderwrap(text, w - 10)); + public static Button wrapped(int w, String text) { + Button ret = new Button(w, tf.renderwrap(text, w - 10)); return(ret); } - private Button(Coord c, int w, Widget parent, boolean lg) { - super(c, new Coord(w, lg?hl:hs), parent); + private Button(int w, boolean lg) { + super(new Coord(w, lg?hl:hs)); this.lg = lg; } - private Button(Coord c, int w, Widget parent) { - this(c, w, parent, w >= (bl.getWidth() + bm.getWidth() + br.getWidth())); + private Button(int w) { + this(w, w >= (bl.getWidth() + bm.getWidth() + br.getWidth())); } - public Button(Coord c, Integer w, Widget parent, String text) { - this(c, w, parent); + public Button(Integer w, String text) { + this(w); this.text = nf.render(text); this.cont = this.text.img; } - public Button(Coord c, Integer w, Widget parent, Text text) { - this(c, w, parent); + public Button(Integer w, Text text) { + this(w); this.text = text; this.cont = text.img; } - public Button(Coord c, Integer w, Widget parent, BufferedImage cont) { - this(c, w, parent); + public Button(Integer w, BufferedImage cont) { + this(w); this.cont = cont; } diff --git a/src/haven/CheckBox.java b/src/haven/CheckBox.java index d71e9097c8..9f592a03da 100644 --- a/src/haven/CheckBox.java +++ b/src/haven/CheckBox.java @@ -36,15 +36,15 @@ public class CheckBox extends Widget { @RName("chk") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - CheckBox ret = new CheckBox(c, parent, (String)args[0]); + public Widget create(Widget parent, Object[] args) { + CheckBox ret = new CheckBox((String)args[0]); ret.canactivate = true; return(ret); } } - public CheckBox(Coord c, Widget parent, String lbl, boolean lg) { - super(c, Coord.z, parent); + public CheckBox(String lbl, boolean lg) { + super(Coord.z); this.lbl = Text.std.render(lbl, java.awt.Color.WHITE); if(lg) { box = lbox; mark = lmark; @@ -56,8 +56,8 @@ public CheckBox(Coord c, Widget parent, String lbl, boolean lg) { sz = new Coord(box.sz().x + 5 + this.lbl.sz().x, Math.max(box.sz().y, this.lbl.sz().y)); } - public CheckBox(Coord c, Widget parent, String lbl) { - this(c, parent, lbl, false); + public CheckBox(String lbl) { + this(lbl, false); } public boolean mousedown(Coord c, int button) { diff --git a/src/haven/ConsoleHost.java b/src/haven/ConsoleHost.java index b6872ff98d..2c54a692a0 100644 --- a/src/haven/ConsoleHost.java +++ b/src/haven/ConsoleHost.java @@ -92,8 +92,8 @@ public boolean key(char c, int code, int mod) { } } - public ConsoleHost(Coord c, Coord sz, Widget parent) { - super(c, sz, parent); + public ConsoleHost(Coord sz) { + super(sz); } public ConsoleHost(UI ui, Coord c, Coord sz) { diff --git a/src/haven/Dropbox.java b/src/haven/Dropbox.java index d759c62cd3..45f15c8187 100644 --- a/src/haven/Dropbox.java +++ b/src/haven/Dropbox.java @@ -34,8 +34,8 @@ public abstract class Dropbox extends ListWidget { private final Coord dropc; private Droplist dl; - public Dropbox(Coord c, Widget parent, int w, int listh, int itemh) { - super(c, new Coord(w, itemh), parent, itemh); + public Dropbox(int w, int listh, int itemh) { + super(new Coord(w, itemh), itemh); this.listh = listh; dropc = new Coord(sz.x - drop.sz().x, 0); } @@ -44,9 +44,10 @@ private class Droplist extends Listbox { private UI.Grab grab = null; private Droplist() { - super(Dropbox.this.rootpos().add(0, Dropbox.this.sz.y), Dropbox.this.ui.root, Dropbox.this.sz.x, Math.min(listh, Dropbox.this.listitems()), Dropbox.this.itemh); - grab = ui.grabmouse(this); + super(Dropbox.this.sz.x, Math.min(listh, Dropbox.this.listitems()), Dropbox.this.itemh); sel = Dropbox.this.sel; + Dropbox.this.ui.root.add(this, Dropbox.this.rootpos().add(0, Dropbox.this.sz.y)); + grab = ui.grabmouse(this); } protected T listitem(int i) {return(Dropbox.this.listitem(i));} diff --git a/src/haven/Frame.java b/src/haven/Frame.java index 1a92a7329c..137028f532 100644 --- a/src/haven/Frame.java +++ b/src/haven/Frame.java @@ -29,13 +29,18 @@ public class Frame extends Widget { private final IBox box; - public Frame(Coord c, Coord sz, Widget parent, IBox box) { - super(c.sub(box.btloff()), sz.add(box.bisz()), parent); + public Frame(Coord sz, IBox box) { + super(sz); this.box = box; } - public Frame(Coord c, Coord sz, Widget parent) { - this(c, sz, parent, Window.wbox); + public static Frame around(Widget parent, Area area, IBox box) { + return(parent.add(new Frame(area.sz().add(box.bisz()), box), + area.ul.sub(box.btloff()))); + } + + public static Frame around(Widget parent, Area area) { + return(around(parent, area, Window.wbox)); } public static Frame around(Widget parent, Iterable wl) { @@ -48,7 +53,7 @@ public static Frame around(Widget parent, Iterable wl) { if(wbr.x > br.x) br.x = wbr.x; if(wbr.y > br.y) br.y = wbr.y; } - return(new Frame(tl, br.sub(tl), parent)); + return(around(parent, new Area(tl, br))); } public Coord xlate(Coord c, boolean in) { diff --git a/src/haven/HSlider.java b/src/haven/HSlider.java index e457922b6e..051be7f79b 100644 --- a/src/haven/HSlider.java +++ b/src/haven/HSlider.java @@ -44,8 +44,8 @@ public class HSlider extends Widget { schain = new TexI(hc); } - public HSlider(Coord c, int w, Widget parent, int min, int max, int val) { - super(c, new Coord(w, sflarp.sz().y), parent); + public HSlider(int w, int min, int max, int val) { + super(new Coord(w, sflarp.sz().y)); this.val = val; this.min = min; this.max = max; diff --git a/src/haven/IButton.java b/src/haven/IButton.java index 979567bf51..81d0a59a72 100644 --- a/src/haven/IButton.java +++ b/src/haven/IButton.java @@ -37,25 +37,25 @@ public class IButton extends SSWidget { @RName("ibtn") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new IButton(c, parent, Resource.loadimg((String)args[0]), Resource.loadimg((String)args[1]))); + public Widget create(Widget parent, Object[] args) { + return(new IButton(Resource.loadimg((String)args[0]), Resource.loadimg((String)args[1]))); } } - public IButton(Coord c, Widget parent, BufferedImage up, BufferedImage down, BufferedImage hover) { - super(c, Utils.imgsz(up), parent); + public IButton(BufferedImage up, BufferedImage down, BufferedImage hover) { + super(Utils.imgsz(up)); this.up = up; this.down = down; this.hover = hover; render(); } - public IButton(Coord c, Widget parent, BufferedImage up, BufferedImage down) { - this(c, parent, up, down, up); + public IButton(BufferedImage up, BufferedImage down) { + this(up, down, up); } - public IButton(Coord c, Widget parent, String base, String up, String down, String hover) { - this(c, parent, Resource.loadimg(base + up), Resource.loadimg(base + down), Resource.loadimg(base + (hover == null?up:hover))); + public IButton(String base, String up, String down, String hover) { + this(Resource.loadimg(base + up), Resource.loadimg(base + down), Resource.loadimg(base + (hover == null?up:hover))); } public void render() { diff --git a/src/haven/IMeter.java b/src/haven/IMeter.java index 3391e51c09..383f60cf15 100644 --- a/src/haven/IMeter.java +++ b/src/haven/IMeter.java @@ -38,17 +38,17 @@ public class IMeter extends Widget { @RName("im") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { Indir bg = parent.ui.sess.getres((Integer)args[0]); List meters = new LinkedList(); for(int i = 1; i < args.length; i += 2) meters.add(new Meter((Color)args[i], (Integer)args[i + 1])); - return(new IMeter(c, parent, bg, meters)); + return(new IMeter(bg, meters)); } } - public IMeter(Coord c, Widget parent, Indir bg, List meters) { - super(c, fsz, parent); + public IMeter(Indir bg, List meters) { + super(fsz); this.bg = bg; this.meters = meters; } diff --git a/src/haven/ISBox.java b/src/haven/ISBox.java index ce29559e56..0bcc172b5e 100644 --- a/src/haven/ISBox.java +++ b/src/haven/ISBox.java @@ -38,13 +38,13 @@ public class ISBox extends Widget implements DTarget { @RName("isbox") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { Indir res; if(args[0] instanceof String) res = Resource.load((String)args[0]).indir(); else res = parent.ui.sess.getres((Integer)args[0]); - return(new ISBox(c, parent, res, (Integer)args[1], (Integer)args[2], (Integer)args[3])); + return(new ISBox(res, (Integer)args[1], (Integer)args[2], (Integer)args[3])); } } @@ -55,8 +55,8 @@ private void setlabel(int rem, int av, int bi) { label = lf.renderf("%d/%d/%d", rem, av, bi); } - public ISBox(Coord c, Widget parent, Indir res, int rem, int av, int bi) { - super(c, bg.sz(), parent); + public ISBox(Indir res, int rem, int av, int bi) { + super(bg.sz()); this.res = res; setlabel(rem, av, bi); } diff --git a/src/haven/Img.java b/src/haven/Img.java index 46e8f44bee..7540fdc1e8 100644 --- a/src/haven/Img.java +++ b/src/haven/Img.java @@ -33,7 +33,7 @@ public class Img extends Widget { @RName("img") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { Indir res; int a = 0; if(args[a] instanceof String) { @@ -43,7 +43,7 @@ public Widget create(Coord c, Widget parent, Object[] args) { } else { res = parent.ui.sess.getres((Integer)args[a++]); } - Img ret = new Img(c, res, parent); + Img ret = new Img(res); if(args.length > a) ret.hit = (Integer)args[a++] != 0; return(ret); @@ -62,14 +62,14 @@ public void draw(GOut g) { g.image(img, Coord.z); } - public Img(Coord c, Tex img, Widget parent) { - super(c, img.sz(), parent); + public Img(Tex img) { + super(img.sz()); this.res = null; this.img = img; } - public Img(Coord c, Indir res, Widget parent) { - super(c, Coord.z, parent); + public Img(Indir res) { + super(Coord.z); this.res = res; this.img = null; } diff --git a/src/haven/Label.java b/src/haven/Label.java index 4100ccb115..44a4f0ff89 100644 --- a/src/haven/Label.java +++ b/src/haven/Label.java @@ -36,11 +36,11 @@ public class Label extends Widget { @RName("lbl") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { if(args.length > 1) - return(new Label(c, parent, (String)args[0], (Integer)args[1])); + return(new Label((String)args[0], (Integer)args[1])); else - return(new Label(c, parent, (String)args[0])); + return(new Label((String)args[0])); } } @@ -48,26 +48,26 @@ public void draw(GOut g) { g.image(text.tex(), Coord.z); } - public Label(Coord c, Widget parent, String text, int w, Text.Foundry f) { - super(c, Coord.z, parent); + public Label(String text, int w, Text.Foundry f) { + super(Coord.z); this.f = f; this.text = f.renderwrap(texts = text, this.col, w); sz = this.text.sz(); } - public Label(Coord c, Widget parent, String text, Text.Foundry f) { - super(c, Coord.z, parent); + public Label(String text, Text.Foundry f) { + super(Coord.z); this.f = f; this.text = f.render(texts = text, this.col); sz = this.text.sz(); } - public Label(Coord c, Widget parent, String text, int w) { - this(c, parent, text, w, Text.std); + public Label(String text, int w) { + this(text, w, Text.std); } - public Label(Coord c, Widget parent, String text) { - this(c, parent, text, Text.std); + public Label(String text) { + this(text, Text.std); } public void settext(String text) { diff --git a/src/haven/ListWidget.java b/src/haven/ListWidget.java index 838991086c..dc52999073 100644 --- a/src/haven/ListWidget.java +++ b/src/haven/ListWidget.java @@ -30,8 +30,8 @@ public abstract class ListWidget extends Widget { public final int itemh; public T sel; - public ListWidget(Coord c, Coord sz, Widget parent, int itemh) { - super(c, sz, parent); + public ListWidget(Coord sz, int itemh) { + super(sz); this.itemh = itemh; } diff --git a/src/haven/Listbox.java b/src/haven/Listbox.java index ec5ee08f35..2678956479 100644 --- a/src/haven/Listbox.java +++ b/src/haven/Listbox.java @@ -32,10 +32,10 @@ public abstract class Listbox extends ListWidget { public final int h; public final Scrollbar sb; - public Listbox(Coord c, Widget parent, int w, int h, int itemh) { - super(c, new Coord(w, h * itemh), parent, itemh); + public Listbox(int w, int h, int itemh) { + super(new Coord(w, h * itemh), itemh); this.h = h; - this.sb = new Scrollbar(new Coord(sz.x, 0), sz.y, this, 0, 0); + this.sb = adda(new Scrollbar(sz.y, 0, 0), sz.x, 0, 1, 0); } protected void drawsel(GOut g) { diff --git a/src/haven/LocalMiniMap.java b/src/haven/LocalMiniMap.java index b039148943..31fc145bc0 100644 --- a/src/haven/LocalMiniMap.java +++ b/src/haven/LocalMiniMap.java @@ -129,8 +129,8 @@ public BufferedImage drawmap(Coord ul, Coord sz) { return(buf); } - public LocalMiniMap(Coord c, Coord sz, Widget parent, MapView mv) { - super(c, sz, parent); + public LocalMiniMap(Coord sz, MapView mv) { + super(sz); this.mv = mv; } diff --git a/src/haven/MapView.java b/src/haven/MapView.java index a09734ea56..67e7c7a21e 100644 --- a/src/haven/MapView.java +++ b/src/haven/MapView.java @@ -332,18 +332,18 @@ public boolean wheel(Coord c, int amount) { @RName("mapview") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { Coord sz = (Coord)args[0]; Coord mc = (Coord)args[1]; int pgob = -1; if(args.length > 2) pgob = (Integer)args[2]; - return(new MapView(c, sz, parent, mc, pgob)); + return(new MapView(sz, mc, pgob)); } } - public MapView(Coord c, Coord sz, Widget parent, Coord cc, long plgob) { - super(c, sz, parent); + public MapView(Coord sz, Coord cc, long plgob) { + super(sz); glob = ui.sess.glob; this.cc = cc; this.plgob = plgob; diff --git a/src/haven/MiniMap.java b/src/haven/MiniMap.java index 50a5b41716..6ec2ec4b73 100644 --- a/src/haven/MiniMap.java +++ b/src/haven/MiniMap.java @@ -140,8 +140,8 @@ void req(String nm) { } } - public MiniMap(Coord c, Coord sz, Widget parent, MapView mv) { - super(c, sz, parent); + public MiniMap(Coord sz, MapView mv) { + super(sz); this.mv = mv; } diff --git a/src/haven/PView.java b/src/haven/PView.java index 765e96f8ee..7465189d43 100644 --- a/src/haven/PView.java +++ b/src/haven/PView.java @@ -157,8 +157,8 @@ public Coord sz() { } } - public PView(Coord c, Coord sz, Widget parent) { - super(c, sz, parent); + public PView(Coord sz) { + super(sz); pstate = makeproj(); lm = new Light.Model(); lm.cc = GL2.GL_SEPARATE_SPECULAR_COLOR; diff --git a/src/haven/Progress.java b/src/haven/Progress.java index d41874409b..8a3853f816 100644 --- a/src/haven/Progress.java +++ b/src/haven/Progress.java @@ -31,13 +31,13 @@ public class Progress extends Widget { @RName("prog") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Progress(c, parent, (Integer)args[0])); + public Widget create(Widget parent, Object[] args) { + return(new Progress((Integer)args[0])); } } - public Progress(Coord c, Widget parent, int p) { - super(c, new Coord(75, 20), parent); + public Progress(int p) { + super(new Coord(75, 20)); text = Text.renderf(FlowerMenu.pink, "%d%%", p); } diff --git a/src/haven/RichTextBox.java b/src/haven/RichTextBox.java index 32d4c4514c..fbac274454 100644 --- a/src/haven/RichTextBox.java +++ b/src/haven/RichTextBox.java @@ -34,15 +34,15 @@ public class RichTextBox extends Widget { private RichText text; private Scrollbar sb; - public RichTextBox(Coord c, Coord sz, Widget parent, String text, RichText.Foundry fnd) { - super(c, sz, parent); + public RichTextBox(Coord sz, String text, RichText.Foundry fnd) { + super(sz); this.fnd = fnd; this.text = fnd.render(text, sz.x - 20); - this.sb = new Scrollbar(new Coord(sz.x, 0), sz.y, this, 0, this.text.sz().y + 20 - sz.y); + this.sb = adda(new Scrollbar(sz.y, 0, this.text.sz().y + 20 - sz.y), sz.x, 0, 1, 0); } - public RichTextBox(Coord c, Coord sz, Widget parent, String text, Object... attrs) { - this(c, sz, parent, text, new RichText.Foundry(attrs)); + public RichTextBox(Coord sz, String text, Object... attrs) { + this(sz, text, new RichText.Foundry(attrs)); } public void draw(GOut g) { diff --git a/src/haven/SIWidget.java b/src/haven/SIWidget.java index 2bd5952bb2..8a5672f066 100644 --- a/src/haven/SIWidget.java +++ b/src/haven/SIWidget.java @@ -31,8 +31,8 @@ public abstract class SIWidget extends Widget { private Tex surf = null; - public SIWidget(Coord c, Coord sz, Widget parent) { - super(c, sz, parent); + public SIWidget(Coord sz) { + super(sz); } protected abstract void draw(BufferedImage buf); diff --git a/src/haven/SSWidget.java b/src/haven/SSWidget.java index cf44db18b3..e697da7e53 100644 --- a/src/haven/SSWidget.java +++ b/src/haven/SSWidget.java @@ -34,8 +34,8 @@ public class SSWidget extends Widget { private TexIM surf; - public SSWidget(Coord c, Coord sz, Widget parent) { - super(c, sz, parent); + public SSWidget(Coord sz) { + super(sz); surf = new TexIM(sz); } diff --git a/src/haven/Scrollbar.java b/src/haven/Scrollbar.java index 56f52273a5..d6f4fe3556 100644 --- a/src/haven/Scrollbar.java +++ b/src/haven/Scrollbar.java @@ -32,8 +32,8 @@ public class Scrollbar extends Widget { public int val, min, max; private UI.Grab drag = null; - public Scrollbar(Coord c, int h, Widget parent, int min, int max) { - super(c.add(-sflarp.sz().x, 0), new Coord(sflarp.sz().x, h), parent); + public Scrollbar(int h, int min, int max) { + super(new Coord(sflarp.sz().x, h)); this.min = min; this.max = max; val = min; diff --git a/src/haven/Scrollport.java b/src/haven/Scrollport.java index b990b96845..f0c536d94e 100644 --- a/src/haven/Scrollport.java +++ b/src/haven/Scrollport.java @@ -32,30 +32,30 @@ public class Scrollport extends Widget { @RName("scr") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Scrollport(c, (Coord)args[0], parent)); + public Widget create(Widget parent, Object[] args) { + return(new Scrollport((Coord)args[0])); } } - public Scrollport(Coord c, Coord sz, Widget parent) { - super(c, sz, parent); - bar = new Scrollbar(new Coord(sz.x, 0), sz.y, this, 0, 0) { + public Scrollport(Coord sz) { + super(sz); + bar = adda(new Scrollbar(sz.y, 0, 0) { public void changed() { cont.sy = bar.val; } - }; - cont = new Scrollcont(Coord.z, sz.sub(bar.sz.x, 0), this) { + }, sz.x, 0, 1, 0); + cont = add(new Scrollcont(sz.sub(bar.sz.x, 0)) { public void update() { bar.max = Math.max(0, csz().y - sz.y); } - }; + }, Coord.z); } public static class Scrollcont extends Widget { public int sy = 0; - public Scrollcont(Coord c, Coord sz, Widget parent) { - super(c, sz, parent); + public Scrollcont(Coord sz) { + super(sz); } public Coord csz() { @@ -71,10 +71,9 @@ public Coord csz() { public void update() {} - public Widget makechild(String type, Object[] pargs, Object[] cargs) { - Widget ret = super.makechild(type, pargs, cargs); + public void addchild(Widget child, Object... args) { + super.addchild(child, args); update(); - return(ret); } public Coord xlate(Coord c, boolean in) { @@ -104,8 +103,8 @@ public boolean mousewheel(Coord c, int amount) { return(true); } - public Widget makechild(String type, Object[] pargs, Object[] cargs) { - return(cont.makechild(type, pargs, cargs)); + public void addchild(Widget child, Object... args) { + cont.addchild(child, args); } public void resize(Coord nsz) { diff --git a/src/haven/Speedget.java b/src/haven/Speedget.java index 67a745b52d..5a0b2ba271 100644 --- a/src/haven/Speedget.java +++ b/src/haven/Speedget.java @@ -48,15 +48,15 @@ public class Speedget extends Widget { @RName("speedget") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { int cur = (Integer)args[0]; int max = (Integer)args[1]; - return(new Speedget(c, parent, cur, max)); + return(new Speedget(cur, max)); } } - public Speedget(Coord c, Widget parent, int cur, int max) { - super(c, tsz, parent); + public Speedget(int cur, int max) { + super(tsz); this.cur = cur; this.max = max; } diff --git a/src/haven/TextEntry.java b/src/haven/TextEntry.java index 54d5f5c0f0..e30dfc0675 100644 --- a/src/haven/TextEntry.java +++ b/src/haven/TextEntry.java @@ -46,11 +46,11 @@ public class TextEntry extends SIWidget { @RName("text") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { if(args[0] instanceof Coord) - return(new TextEntry(c, (Coord)args[0], parent, (String)args[1])); + return(new TextEntry((Coord)args[0], (String)args[1])); else - return(new TextEntry(c, (Integer)args[0], parent, (String)args[1])); + return(new TextEntry((Integer)args[0], (String)args[1])); } } @@ -151,15 +151,15 @@ public void draw(GOut g) { } */ - public TextEntry(Coord c, int w, Widget parent, String deftext) { - super(c, new Coord(w, mext.getHeight()), parent); + public TextEntry(int w, String deftext) { + super(new Coord(w, mext.getHeight())); rsettext(deftext); setcanfocus(true); } @Deprecated - public TextEntry(Coord c, Coord sz, Widget parent, String deftext) { - this(c, sz.x, parent, deftext); + public TextEntry(Coord sz, String deftext) { + this(sz.x, deftext); } protected void changed() { diff --git a/src/haven/Textlog.java b/src/haven/Textlog.java index a30f9b6124..3016f620c6 100644 --- a/src/haven/Textlog.java +++ b/src/haven/Textlog.java @@ -42,8 +42,8 @@ public class Textlog extends Widget { @RName("log") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Textlog(c, (Coord)args[0], parent)); + public Widget create(Widget parent, Object[] args) { + return(new Textlog((Coord)args[0])); } } @@ -76,8 +76,8 @@ public void draw(GOut g) { } } - public Textlog(Coord c, Coord sz, Widget parent) { - super(c, sz, parent); + public Textlog(Coord sz) { + super(sz); lines = new LinkedList(); maxy = cury = 0; } diff --git a/src/haven/VMeter.java b/src/haven/VMeter.java index aed48130a8..10bae9230d 100644 --- a/src/haven/VMeter.java +++ b/src/haven/VMeter.java @@ -36,7 +36,7 @@ public class VMeter extends Widget { @RName("vm") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { Color cl; if(args.length > 4) { cl = new Color((Integer)args[1], @@ -50,12 +50,12 @@ public Widget create(Coord c, Widget parent, Object[] args) { } else { cl = (Color)args[1]; } - return(new VMeter(c, parent, (Integer)args[0], cl)); + return(new VMeter((Integer)args[0], cl)); } } - public VMeter(Coord c, Widget parent, int amount, Color cl) { - super(c, bg.sz(), parent); + public VMeter(int amount, Color cl) { + super(bg.sz()); this.amount = amount; this.cl = cl; } diff --git a/src/haven/Widget.java b/src/haven/Widget.java index f5146ee025..2e3f3f311d 100644 --- a/src/haven/Widget.java +++ b/src/haven/Widget.java @@ -55,44 +55,46 @@ public class Widget { @RName("cnt") public static class $Cont implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Widget(c, (Coord)args[0], parent)); + public Widget create(Widget parent, Object[] args) { + return(new Widget((Coord)args[0])); } } @RName("ccnt") public static class $CCont implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - Widget ret = new Widget(c, (Coord)args[0], parent) { + public Widget create(Widget parent, Object[] args) { + Widget ret = new Widget((Coord)args[0]) { public void presize() { c = parent.sz.div(2).sub(sz.div(2)); } + + protected void added() { + presize(); + } }; - ret.presize(); return(ret); } } @RName("fcnt") public static class $FCont implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - Widget ret = new Widget(c, parent.sz, parent) { + public Widget create(Widget parent, Object[] args) { + Widget ret = new Widget(parent.sz) { Collection fill = new ArrayList(); public void presize() { resize(parent.sz); for(Widget ch : fill) ch.resize(sz); } - public Widget makechild(String type, Object[] pargs, Object[] cargs) { - if((pargs[0] instanceof String) && pargs[0].equals("fill")) { - Widget ret = gettype(type).create(Coord.z, this, cargs); - ret.resize(sz); - fill.add(ret); - return(ret); + public void added() {presize();} + public void addchild(Widget child, Object... args) { + if((args[0] instanceof String) && args[0].equals("fill")) { + child.resize(sz); + fill.add(child); + add(child, Coord.z); } else { - return(super.makechild(type, pargs, cargs)); + super.addchild(child, args); } } }; - ret.presize(); return(ret); } } From e451c919af1149771abb2d58ff2a29aef4f2b217 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 8 Apr 2015 03:26:12 +0200 Subject: [PATCH 0095/1113] WIP: Allow hide() and show() on detached widgets. --- src/haven/Widget.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haven/Widget.java b/src/haven/Widget.java index 2e3f3f311d..09156bf9b2 100644 --- a/src/haven/Widget.java +++ b/src/haven/Widget.java @@ -962,13 +962,13 @@ public T getparent(Class cl) { public void hide() { visible = false; - if(canfocus) + if(canfocus && (parent != null)) parent.delfocusable(this); } public void show() { visible = true; - if(canfocus) + if(canfocus && (parent != null)) parent.newfocusable(this); } From 832a52ba965fa63bb0c614111b7b96d6f1330417 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 8 Apr 2015 04:05:39 +0200 Subject: [PATCH 0096/1113] WIP: Changed widget synchronization scheme. (I hope this works.) --- src/haven/Widget.java | 81 ++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/src/haven/Widget.java b/src/haven/Widget.java index 09156bf9b2..2c4dee6360 100644 --- a/src/haven/Widget.java +++ b/src/haven/Widget.java @@ -140,7 +140,7 @@ public static void initnames() { inited = true; } } - + public static Factory gettype2(String name) throws InterruptedException { if(name.indexOf('/') < 0) { synchronized(types) { @@ -162,7 +162,7 @@ public static Factory gettype2(String name) throws InterruptedException { } } } - + public static Factory gettype(String name) { long start = System.currentTimeMillis(); Factory f; @@ -177,7 +177,7 @@ public static Factory gettype(String name) { throw(new RuntimeException("No such widget type: " + name)); return(f); } - + public Widget(Coord sz) { this.c = Coord.z; this.sz = sz; @@ -192,16 +192,23 @@ public Widget(UI ui, Coord c, Coord sz) { this.c = c; this.sz = sz; } - + + public T add0(T child) { + child.ui = this.ui; + child.parent = this; + child.link(); + child.added(); + newchild(child); + return(child); + } + public T add(T child) { - synchronized(this.ui) { - child.c = c; - child.ui = this.ui; - child.parent = this; - child.link(); - child.added(); - newchild(child); - return(child); + if(ui != null) { + synchronized(ui) { + return(add0(child)); + } + } else { + return(add0(child)); } } @@ -336,40 +343,34 @@ public void newchild(Widget w) { } public void link() { - synchronized(ui) { - if(parent.lchild != null) - parent.lchild.next = this; - if(parent.child == null) - parent.child = this; - this.prev = parent.lchild; - parent.lchild = this; - } + if(parent.lchild != null) + parent.lchild.next = this; + if(parent.child == null) + parent.child = this; + this.prev = parent.lchild; + parent.lchild = this; } public void linkfirst() { - synchronized(ui) { - if(parent.child != null) - parent.child.prev = this; - if(parent.lchild == null) - parent.lchild = this; - this.next = parent.child; - parent.child = this; - } + if(parent.child != null) + parent.child.prev = this; + if(parent.lchild == null) + parent.lchild = this; + this.next = parent.child; + parent.child = this; } public void unlink() { - synchronized(ui) { - if(next != null) - next.prev = prev; - if(prev != null) - prev.next = next; - if(parent.child == this) - parent.child = next; - if(parent.lchild == this) - parent.lchild = prev; - next = null; - prev = null; - } + if(next != null) + next.prev = prev; + if(prev != null) + prev.next = next; + if(parent.child == this) + parent.child = next; + if(parent.lchild == this) + parent.lchild = prev; + next = null; + prev = null; } public Coord xlate(Coord c, boolean in) { From 641bb488b249026074e4a094a6c75eb7d71fd32c Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 8 Apr 2015 04:05:56 +0200 Subject: [PATCH 0097/1113] WIP: Fixed focus bug. --- src/haven/Widget.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/haven/Widget.java b/src/haven/Widget.java index 2c4dee6360..a60ea374b1 100644 --- a/src/haven/Widget.java +++ b/src/haven/Widget.java @@ -199,6 +199,8 @@ public T add0(T child) { child.link(); child.added(); newchild(child); + if(((Widget)child).canfocus) + newfocusable(child); return(child); } From 0b6f71a1272bd133269e49463a9abaac5b3f0139 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 8 Apr 2015 04:07:51 +0200 Subject: [PATCH 0098/1113] WIP: Converted login screen. --- src/haven/Bootstrap.java | 2 +- src/haven/LoginScreen.java | 67 +++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/haven/Bootstrap.java b/src/haven/Bootstrap.java index 17e58a0206..226a6309e5 100644 --- a/src/haven/Bootstrap.java +++ b/src/haven/Bootstrap.java @@ -69,7 +69,7 @@ private void setpref(String name, String val) { public Session run(UI ui) throws InterruptedException { ui.setreceiver(this); - ui.bind(new LoginScreen(ui.root), 1); + ui.bind(ui.root.add(new LoginScreen()), 1); String loginname = getpref("loginname", ""); boolean savepw = false; byte[] token = null; diff --git a/src/haven/LoginScreen.java b/src/haven/LoginScreen.java index 4edd408b07..e4ff8fe5fb 100644 --- a/src/haven/LoginScreen.java +++ b/src/haven/LoginScreen.java @@ -35,24 +35,19 @@ public class LoginScreen extends Widget { static Text.Foundry textf, textfs; static Tex bg = Resource.loadtex("gfx/loginscr"); Text progress = null; - + static { textf = new Text.Foundry(Text.sans, 16).aa(true); textfs = new Text.Foundry(Text.sans, 14).aa(true); } - - public LoginScreen(Widget parent) { - super(parent.sz.div(2).sub(bg.sz().div(2)), bg.sz(), parent); + + public LoginScreen() { + super(bg.sz()); setfocustab(true); - parent.setfocus(this); - new Img(Coord.z, bg, this); + add(new Img(bg), Coord.z); } private static abstract class Login extends Widget { - private Login(Coord c, Coord sz, Widget parent) { - super(c, sz, parent); - } - abstract Object[] data(); abstract boolean enter(); } @@ -60,30 +55,31 @@ private Login(Coord c, Coord sz, Widget parent) { private class Pwbox extends Login { TextEntry user, pass; CheckBox savepass; - + private Pwbox(String username, boolean save) { - super(new Coord(345, 310), new Coord(150, 150), LoginScreen.this); setfocustab(true); - new Label(new Coord(0, 0), this, "User name", textf); - user = new TextEntry(new Coord(0, 20), new Coord(150, 20), this, username); - new Label(new Coord(0, 50), this, "Password", textf); - pass = new TextEntry(new Coord(0, 70), new Coord(150, 20), this, ""); + add(new Label("User name", textf), Coord.z); + add(user = new TextEntry(150, username), new Coord(0, 20)); + add(new Label("Password", textf), new Coord(0, 50)); + add(pass = new TextEntry(150, ""), new Coord(0, 70)); pass.pw = true; - savepass = new CheckBox(new Coord(0, 100), this, "Remember me", true); + add(savepass = new CheckBox("Remember me", true), new Coord(0, 100)); savepass.a = save; if(user.text.equals("")) setfocus(user); else setfocus(pass); + resize(new Coord(150, 150)); + LoginScreen.this.add(this, new Coord(345, 310)); } - + public void wdgmsg(Widget sender, String name, Object... args) { } - + Object[] data() { return(new Object[] {new AuthClient.NativeCred(user.text, pass.text), savepass.a}); } - + boolean enter() { if(user.text.equals("")) { setfocus(user); @@ -104,15 +100,16 @@ public boolean globtype(char k, KeyEvent ev) { return(false); } } - + private class Tokenbox extends Login { Text label; Button btn; private Tokenbox(String username) { - super(new Coord(295, 330), new Coord(250, 100), LoginScreen.this); label = textfs.render("Identity is saved for " + username, java.awt.Color.WHITE); - btn = new Button(new Coord(75, 30), 100, this, "Forget me"); + add(btn = new Button(100, "Forget me"), new Coord(75, 30)); + resize(new Coord(250, 100)); + LoginScreen.this.add(this, new Coord(295, 330)); } Object[] data() { @@ -147,12 +144,11 @@ public boolean globtype(char k, KeyEvent ev) { private void mklogin() { synchronized(ui) { - btn = new IButton(new Coord(419, 510), this, "gfx/hud/buttons/login", "u", "d", "o"); - btn.c = btn.c.sub(Utils.imgsz(btn.up).div(2)); + adda(btn = new IButton("gfx/hud/buttons/login", "u", "d", "o"), 419, 510, 0.5, 0.5); progress(null); } } - + private void error(String error) { synchronized(ui) { if(this.error != null) @@ -161,7 +157,7 @@ private void error(String error) { this.error = textf.render(error, java.awt.Color.RED); } } - + private void progress(String p) { synchronized(ui) { if(progress != null) @@ -170,7 +166,7 @@ private void progress(String p) { progress = textf.render(p, java.awt.Color.WHITE); } } - + private void clear() { if(cur != null) { ui.destroy(cur); @@ -180,7 +176,7 @@ private void clear() { } progress(null); } - + public void wdgmsg(Widget sender, String msg, Object... args) { if(sender == btn) { if(cur.enter()) @@ -189,7 +185,7 @@ public void wdgmsg(Widget sender, String msg, Object... args) { } super.wdgmsg(sender, msg, args); } - + public void uimsg(String msg, Object... args) { synchronized(ui) { if(msg == "passwd") { @@ -209,11 +205,16 @@ public void uimsg(String msg, Object... args) { } } } - + public void presize() { c = parent.sz.div(2).sub(sz.div(2)); } - + + protected void added() { + presize(); + parent.setfocus(this); + } + public void draw(GOut g) { super.draw(g); if(error != null) @@ -221,7 +222,7 @@ public void draw(GOut g) { if(progress != null) g.image(progress.tex(), new Coord(420 - (progress.sz().x / 2), 350)); } - + public boolean type(char k, KeyEvent ev) { if(k == 10) { if((cur != null) && cur.enter()) From 28c99d5ccbe4f386213b21e74a1f45052ca47112 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 8 Apr 2015 04:17:54 +0200 Subject: [PATCH 0099/1113] WIP: Converted windows and charlist to new widget construction. --- src/haven/Charlist.java | 10 +++++----- src/haven/Chatwindow.java | 12 ++++++------ src/haven/Window.java | 18 ++++++++++-------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/haven/Charlist.java b/src/haven/Charlist.java index 74dae81ff7..d322f71811 100644 --- a/src/haven/Charlist.java +++ b/src/haven/Charlist.java @@ -49,13 +49,13 @@ public Char(String name) { @RName("charlist") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Charlist(c, parent, (Integer)args[0])); + public Widget create(Widget parent, Object[] args) { + return(new Charlist((Integer)args[0])); } } - public Charlist(Coord c, Widget parent, int height) { - super(c, new Coord(bg.sz().x, 40 + (bg.sz().y * height) + (margin * (height - 1))), parent); + public Charlist(int height) { + super(new Coord(bg.sz().x, 40 + (bg.sz().y * height) + (margin * (height - 1)))); this.height = height; y = 0; } @@ -120,7 +120,7 @@ public void uimsg(String msg, Object... args) { resl.add(ui.sess.getres((Integer)args[i])); // c.ava = new Avaview(new Coord(0, 0), this, resl); // c.ava.hide(); - c.plb = new Button(new Coord(0, 0), 100, this, "Play"); + c.plb = add(new Button(100, "Play")); c.plb.hide(); synchronized(chars) { chars.add(c); diff --git a/src/haven/Chatwindow.java b/src/haven/Chatwindow.java index 1596617071..0acab26b59 100644 --- a/src/haven/Chatwindow.java +++ b/src/haven/Chatwindow.java @@ -32,16 +32,16 @@ public class Chatwindow extends Window { @RName("chat") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Chatwindow(c, (Coord)args[0], parent)); + public Widget create(Widget parent, Object[] args) { + return(new Chatwindow((Coord)args[0])); } } - public Chatwindow(Coord c, Coord sz, Widget parent) { - super(c, sz, parent, "Chat"); - in = new TextEntry(new Coord(0, sz.y - 20), new Coord(sz.x, 20), this, ""); + public Chatwindow(Coord sz) { + super(sz, "Chat"); + in = add(new TextEntry(sz.x, ""), 0, sz.y - 20); in.canactivate = true; - out = new Textlog(Coord.z, new Coord(sz.x, sz.y - 20), this); + out = add(new Textlog(new Coord(sz.x, sz.y - 20)), Coord.z); } public void uimsg(String msg, Object... args) { diff --git a/src/haven/Window.java b/src/haven/Window.java index e3bb19aeac..aa5f33d50e 100644 --- a/src/haven/Window.java +++ b/src/haven/Window.java @@ -78,28 +78,30 @@ protected BufferedImage proc(Text text) { @RName("wnd") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { Coord sz = (Coord)args[0]; String cap = (args.length > 1)?(String)args[1]:null; boolean lg = (args.length > 2)?((Integer)args[2] != 0):false; - return(new Window(c, sz, parent, cap, lg, Coord.z, Coord.z)); + return(new Window(sz, cap, lg, Coord.z, Coord.z)); } } - public Window(Coord c, Coord sz, Widget parent, String cap, boolean lg, Coord tlo, Coord rbo) { - super(c, new Coord(0, 0), parent); + public Window(Coord sz, String cap, boolean lg, Coord tlo, Coord rbo) { this.tlo = tlo; this.rbo = rbo; this.mrgn = lg?dlmrgn:dsmrgn; - cbtn = new IButton(Coord.z, this, cbtni[0], cbtni[1], cbtni[2]); + cbtn = add(new IButton(cbtni[0], cbtni[1], cbtni[2])); chcap(cap); resize(sz); setfocustab(true); - parent.setfocus(this); } - public Window(Coord c, Coord sz, Widget parent, String cap) { - this(c, sz, parent, cap, false, Coord.z, Coord.z); + public Window(Coord sz, String cap) { + this(sz, cap, false, Coord.z, Coord.z); + } + + protected void added() { + parent.setfocus(this); } public void chcap(String cap) { From 9aba46c2407342c8ceedaccae8b8036e5a970226 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 8 Apr 2015 04:18:04 +0200 Subject: [PATCH 0100/1113] WIP: Fixed mapview bug. --- src/haven/MapView.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/haven/MapView.java b/src/haven/MapView.java index 67e7c7a21e..6c428840b7 100644 --- a/src/haven/MapView.java +++ b/src/haven/MapView.java @@ -338,13 +338,13 @@ public Widget create(Widget parent, Object[] args) { int pgob = -1; if(args.length > 2) pgob = (Integer)args[2]; - return(new MapView(sz, mc, pgob)); + return(new MapView(sz, parent.ui.sess.glob, mc, pgob)); } } - public MapView(Coord sz, Coord cc, long plgob) { + public MapView(Coord sz, Glob glob, Coord cc, long plgob) { super(sz); - glob = ui.sess.glob; + this.glob = glob; this.cc = cc; this.plgob = plgob; setcanfocus(true); From 2824cd138104c31f81e65bfd5dd2e0b064b0a498 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 8 Apr 2015 07:44:33 +0200 Subject: [PATCH 0101/1113] WIP: Converted most remaining widgets to new protocol. --- src/haven/Avaview.java | 8 ++--- src/haven/BuddyWnd.java | 67 ++++++++++++++++++++------------------- src/haven/Buff.java | 8 ++--- src/haven/Bufflist.java | 10 ++---- src/haven/Equipory.java | 28 ++++++++-------- src/haven/FightWnd.java | 38 +++++++++++----------- src/haven/Fightsess.java | 19 +++++++---- src/haven/Fightview.java | 36 ++++++++++----------- src/haven/FlowerMenu.java | 21 ++++++------ src/haven/GItem.java | 11 +++---- src/haven/GiveButton.java | 12 +++---- src/haven/HelpWnd.java | 16 +++++----- src/haven/Inventory.java | 20 ++++++------ src/haven/ItemDrag.java | 8 +++-- src/haven/Logout.java | 54 ------------------------------- src/haven/Makewindow.java | 21 ++++++------ src/haven/MapMod.java | 27 +++++++++------- src/haven/MenuGrid.java | 8 ++--- src/haven/NpcChat.java | 12 +++---- src/haven/Partyview.java | 14 ++++---- src/haven/Polity.java | 34 ++++++++++---------- src/haven/Profwnd.java | 4 +-- src/haven/RadioGroup.java | 7 ++-- src/haven/RootWidget.java | 7 ++-- src/haven/SessWidget.java | 7 ++-- src/haven/Tabs.java | 18 +++-------- src/haven/TestView.java | 4 +-- src/haven/WItem.java | 4 +-- 28 files changed, 233 insertions(+), 290 deletions(-) delete mode 100644 src/haven/Logout.java diff --git a/src/haven/Avaview.java b/src/haven/Avaview.java index 0d5e12a0e5..900c7a0a9b 100644 --- a/src/haven/Avaview.java +++ b/src/haven/Avaview.java @@ -41,13 +41,13 @@ public class Avaview extends PView { @RName("av") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Avaview(c, dasz, parent, (Integer)args[0], "avacam")); + public Widget create(Widget parent, Object[] args) { + return(new Avaview(dasz, (Integer)args[0], "avacam")); } } - public Avaview(Coord c, Coord sz, Widget parent, long avagob, String camnm) { - super(c, sz, parent); + public Avaview(Coord sz, long avagob, String camnm) { + super(sz); this.camnm = camnm; this.avagob = avagob; } diff --git a/src/haven/BuddyWnd.java b/src/haven/BuddyWnd.java index 6bd4055a80..452f3fdac7 100644 --- a/src/haven/BuddyWnd.java +++ b/src/haven/BuddyWnd.java @@ -77,8 +77,8 @@ public int compare(Buddy a, Buddy b) { @RName("buddy") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new BuddyWnd(c, parent)); + public Widget create(Widget parent, Object[] args) { + return(new BuddyWnd()); } } @@ -144,8 +144,8 @@ public Buddy find(int id) { public static class GroupSelector extends Widget { public int group; - public GroupSelector(Coord c, Widget parent, int group) { - super(c, new Coord((gc.length * 20) + 20, 20), parent); + public GroupSelector(int group) { + super(new Coord((gc.length * 20) + 20, 20)); this.group = group; } @@ -178,8 +178,8 @@ protected void changed(int group) { } private class BuddyList extends Listbox { - public BuddyList(Coord c, int w, int h, Widget parent) { - super(c, parent, w, h, 20); + public BuddyList(int w, int h) { + super(w, h, 20); } public Buddy listitem(int idx) {return(buddies.get(idx));} @@ -211,16 +211,16 @@ public void change(Buddy b) { } } else { if(editing == null) { - nicksel = new TextEntry(new Coord(10, 165), new Coord(180, 20), BuddyWnd.this, "") { + BuddyWnd.this.add(nicksel = new TextEntry(180, "") { public void activate(String text) { editing.chname(text); } - }; - grpsel = new GroupSelector(new Coord(10, 190), BuddyWnd.this, 0) { + }, new Coord(10, 165)); + BuddyWnd.this.add(grpsel = new GroupSelector(0) { public void changed(int group) { editing.chgrp(group); } - }; + }, new Coord(10, 190)); BuddyWnd.this.setfocus(nicksel); } editing = b; @@ -241,7 +241,7 @@ public void opts(final Buddy b, Coord c) { opts.add("Forget"); } if(menu == null) { - menu = new FlowerMenu(c, ui.root, opts.toArray(new String[0])) { + menu = new FlowerMenu(opts.toArray(new String[0])) { public void destroy() { menu = null; super.destroy(); @@ -264,6 +264,7 @@ public void choose(Petal opt) { } } }; + ui.root.add(menu, c); } } @@ -276,13 +277,13 @@ public void itemclick(Buddy b, int button) { } } - public BuddyWnd(Coord c, Widget parent) { - super(c, new Coord(200, 370), parent, "Kin"); - bl = new BuddyList(new Coord(10, 5), 180, 7, this); - new Label(new Coord(5, 215), this, "Sort by:"); - sbstatus = new Button(new Coord(10, 230), 50, this, "Status") { public void click() { setcmp(statuscmp); } }; - sbgroup = new Button(new Coord(75, 230), 50, this, "Group") { public void click() { setcmp(groupcmp); } }; - sbalpha = new Button(new Coord(140, 230), 50, this, "Name") { public void click() { setcmp(alphacmp); } }; + public BuddyWnd() { + super(new Coord(200, 370), "Kin"); + bl = add(new BuddyList(180, 7), new Coord(10, 5)); + add(new Label("Sort by:"), new Coord(5, 215)); + sbstatus = add(new Button(50, "Status") { public void click() { setcmp(statuscmp); } }, new Coord(10, 230)); + sbgroup = add(new Button(50, "Group") { public void click() { setcmp(groupcmp); } }, new Coord(75, 230)); + sbalpha = add(new Button(50, "Name") { public void click() { setcmp(alphacmp); } }, new Coord(140, 230)); String sort = Utils.getpref("buddysort", ""); if(sort.equals("")) { bcmp = statuscmp; @@ -291,28 +292,28 @@ public BuddyWnd(Coord c, Widget parent) { if(sort.equals("group")) bcmp = groupcmp; if(sort.equals("status")) bcmp = statuscmp; } - new Label(new Coord(0, 250), this, "My hearth secret:"); - charpass = new TextEntry(new Coord(0, 265), new Coord(190, 20), this, "") { + add(new Label("My hearth secret:"), new Coord(0, 250)); + charpass = add(new TextEntry(190, "") { public void activate(String text) { BuddyWnd.this.wdgmsg("pwd", text); } - }; - new Button(new Coord(0 , 290), 50, this, "Set") { public void click() {sendpwd(charpass.text);} }; - new Button(new Coord(60 , 290), 50, this, "Clear") { public void click() {sendpwd("");} }; - new Button(new Coord(120, 290), 50, this, "Random") { public void click() {sendpwd(randpwd());} }; - new Label(new Coord(0, 310), this, "Make kin by hearth secret:"); - opass = new TextEntry(new Coord(0, 325), new Coord(190, 20), this, "") { + }, new Coord(0, 265)); + add(new Button(50, "Set") { public void click() {sendpwd(charpass.text);} }, new Coord(0 , 290)); + add(new Button(50, "Clear") { public void click() {sendpwd("");} }, new Coord(60 , 290)); + add(new Button(50, "Random") { public void click() {sendpwd(randpwd());} }, new Coord(120, 290)); + add(new Label("Make kin by hearth secret:"), new Coord(0, 310)); + opass = add(new TextEntry(190, "") { public void activate(String text) { BuddyWnd.this.wdgmsg("bypwd", text); settext(""); } - }; - new Button(new Coord(0, 350), 50, this, "Add kin") { - public void click() { - BuddyWnd.this.wdgmsg("bypwd", opass.text); - opass.settext(""); - } - }; + }, new Coord(0, 325)); + add(new Button(50, "Add kin") { + public void click() { + BuddyWnd.this.wdgmsg("bypwd", opass.text); + opass.settext(""); + } + }, new Coord(0, 350)); } private String randpwd() { diff --git a/src/haven/Buff.java b/src/haven/Buff.java index 37cbffbe85..cc044c4ecb 100644 --- a/src/haven/Buff.java +++ b/src/haven/Buff.java @@ -47,14 +47,14 @@ public class Buff extends Widget { @RName("buff") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { Indir res = parent.ui.sess.getres((Integer)args[0]); - return(new Buff(c, parent, res)); + return(new Buff(res)); } } - public Buff(Coord c, Widget parent, Indir res) { - super(c, cframe.sz(), parent); + public Buff(Indir res) { + super(cframe.sz()); this.res = res; } diff --git a/src/haven/Bufflist.java b/src/haven/Bufflist.java index c6e84a7833..94494342d6 100644 --- a/src/haven/Bufflist.java +++ b/src/haven/Bufflist.java @@ -32,10 +32,6 @@ public class Bufflist extends Widget { static final int margin = 2; static final int num = 5; - public Bufflist(Coord c, Widget parent) { - super(c, Coord.z, parent); - } - private void arrange(Widget imm) { int i = 0; Coord br = new Coord(); @@ -55,10 +51,8 @@ private void arrange(Widget imm) { resize(br.add(Buff.cframe.sz())); } - public Widget makechild(String type, Object[] pargs, Object[] cargs) { - Widget ret = gettype(type).create(Coord.z, this, cargs); - arrange(ret); - return(ret); + public void addchild(Widget child, Object... args) { + arrange(child); } public void cdestroy(Widget ch) { diff --git a/src/haven/Equipory.java b/src/haven/Equipory.java index 973418a229..200db8546c 100644 --- a/src/haven/Equipory.java +++ b/src/haven/Equipory.java @@ -64,19 +64,19 @@ public class Equipory extends Widget implements DTarget { @RName("epry") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { long gobid; if(args.length < 1) gobid = parent.getparent(GameUI.class).plid; else gobid = (Integer)args[0]; - return(new Equipory(c, parent, gobid)); + return(new Equipory(gobid)); } } - public Equipory(Coord c, Widget parent, long gobid) { - super(c, isz, parent); - Avaview ava = new Avaview(new Coord(34, 0), bg.sz(), this, gobid, "equcam") { + public Equipory(long gobid) { + super(isz); + Avaview ava = add(new Avaview(bg.sz(), gobid, "equcam") { public boolean mousedown(Coord c, int button) { return(false); } @@ -93,22 +93,20 @@ protected void setup(RenderList rl) { } protected java.awt.Color clearcolor() {return(null);} - }; + }, new Coord(34, 0)); ava.color = null; } - public Widget makechild(String type, Object[] pargs, Object[] cargs) { - Widget ret = gettype(type).create(Coord.z, this, cargs); - if(ret instanceof GItem) { - GItem g = (GItem)ret; - WItem[] v = new WItem[pargs.length]; - for(int i = 0; i < pargs.length; i++) { - int ep = (Integer)pargs[i]; - v[i] = new WItem(ecoords[ep].add(1, 1), this, g); + public void addchild(Widget child, Object... args) { + if(child instanceof GItem) { + GItem g = (GItem)child; + WItem[] v = new WItem[args.length]; + for(int i = 0; i < args.length; i++) { + int ep = (Integer)args[i]; + v[i] = add(new WItem(g), ecoords[ep].add(1, 1)); } wmap.put(g, v); } - return(ret); } public void cdestroy(Widget w) { diff --git a/src/haven/FightWnd.java b/src/haven/FightWnd.java index 7782d84156..c36f572323 100644 --- a/src/haven/FightWnd.java +++ b/src/haven/FightWnd.java @@ -48,8 +48,8 @@ public class Actions extends Listbox { static final int eh = 34; private boolean loading = false; - public Actions(Coord c, Widget parent, int w, int h) { - super(c, parent, w, h, eh); + public Actions(int w, int h) { + super(w, h, eh); } protected Action listitem(int n) {return(acts.get(n));} @@ -104,8 +104,8 @@ public int compare(Action a, Action b) { @RName("fmg") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new FightWnd(c, parent, (Integer)args[0])); + public Widget create(Widget parent, Object[] args) { + return(new FightWnd((Integer)args[0])); } } @@ -120,25 +120,25 @@ private void save(int n) { FightWnd.this.wdgmsg("save", args.toArray(new Object[0])); } - public FightWnd(Coord c, Widget parent, int nsave) { - super(c, new Coord(475, 450), parent, ""); + public FightWnd(int nsave) { + super(new Coord(475, 450), ""); this.nsave = nsave; this.savesel = new CheckBox[nsave]; - actlist = new Actions(new Coord(10, 10), this, 250, 12); + actlist = add(new Actions(250, 12), new Coord(10, 10)); int y = actlist.sz.y; for(int i = nsave - 1; i >= 0; i--) { final int n = i; - new Button(new Coord(270, y - Button.hs), 50, this, "Load") { - public void click() { - FightWnd.this.wdgmsg("load", n); - } - }; - new Button(new Coord(330, y - Button.hs), 50, this, "Save") { - public void click() { - save(n); - } - }; - savesel[n] = new CheckBox(new Coord(390, y - CheckBox.lbox.sz().y), this, "Use", true) { + add(new Button(50, "Load") { + public void click() { + FightWnd.this.wdgmsg("load", n); + } + }, new Coord(270, y - Button.hs)); + add(new Button(50, "Save") { + public void click() { + save(n); + } + }, new Coord(330, y - Button.hs)); + savesel[n] = add(new CheckBox("Use", true) { public boolean mousedown(Coord c, int button) { if(button == 1) { if(a) @@ -148,7 +148,7 @@ public boolean mousedown(Coord c, int button) { } return(true); } - }; + }, new Coord(390, y - CheckBox.lbox.sz().y)); y -= Button.hs + 15; } } diff --git a/src/haven/Fightsess.java b/src/haven/Fightsess.java index a851d0d9fd..93ba7e99d3 100644 --- a/src/haven/Fightsess.java +++ b/src/haven/Fightsess.java @@ -40,21 +40,28 @@ public class Fightsess extends Widget { @RName("fsess") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { int nact = (Integer)args[0]; - return(new Fightsess(parent, nact)); + return(new Fightsess(nact, parent.getparent(GameUI.class).fv)); } } @SuppressWarnings("unchecked") - public Fightsess(Widget parent, int nact) { - super(Coord.z, parent.sz, parent); - this.fv = getparent(GameUI.class).fv; - pcc = sz.div(2); + public Fightsess(int nact, Fightview fv) { + this.fv = fv; pho = -40; this.actions = (Indir[])new Indir[nact]; } + public void presize() { + resize(parent.sz); + pcc = sz.div(2); + } + + protected void added() { + presize(); + } + private void updatepos() { MapView map; Gob pl; diff --git a/src/haven/Fightview.java b/src/haven/Fightview.java index c44bcda93c..cfd13cb6fe 100644 --- a/src/haven/Fightview.java +++ b/src/haven/Fightview.java @@ -45,21 +45,21 @@ public class Fightview extends Widget { private GiveButton curgive; private Avaview curava; private Button curpurs; - public final Bufflist buffs = new Bufflist(Coord.z, this); {buffs.hide();} + public final Bufflist buffs = add(new Bufflist()); {buffs.hide();} public class Relation { public final long gobid; public final Avaview ava; public final GiveButton give; public final Button purs; - public final Bufflist buffs = new Bufflist(Coord.z, Fightview.this); {buffs.hide();} + public final Bufflist buffs = add(new Bufflist()); {buffs.hide();} public int ip, oip; public Relation(long gobid) { this.gobid = gobid; - this.ava = new Avaview(Coord.z, avasz, Fightview.this, gobid, "avacam"); - this.give = new GiveButton(Coord.z, Fightview.this, 0, new Coord(15, 15)); - this.purs = new Button(Coord.z, 70, Fightview.this, "Pursue"); + add(this.ava = new Avaview(avasz, gobid, "avacam")); + add(this.give = new GiveButton(0, new Coord(15, 15))); + add(this.purs = new Button(70, "Pursue")); } public void give(int state) { @@ -83,33 +83,33 @@ public void remove() { @RName("frv") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Fightview(c, parent)); + public Widget create(Widget parent, Object[] args) { + return(new Fightview()); } } - public Fightview(Coord c, Widget parent) { - super(c, new Coord(width, (bg.sz().y + ymarg) * height), parent); + public Fightview() { + super(new Coord(width, (bg.sz().y + ymarg) * height)); } - public Widget makechild(String type, Object[] pargs, Object[] cargs) { - if(pargs[0].equals("buff")) { + public void addchild(Widget child, Object... args) { + if(args[0].equals("buff")) { Widget p; - if(pargs[1] == null) + if(args[1] == null) p = buffs; else - p = getrel((Integer)pargs[1]).buffs; - return(p.makechild(type, new Object[] {}, cargs)); + p = getrel((Integer)args[1]).buffs; + p.addchild(child); } else { - return(super.makechild(type, pargs, cargs)); + super.addchild(child, args); } } private void setcur(Relation rel) { if((current == null) && (rel != null)) { - curgive = new GiveButton(cgivec, this, 0); - curava = new Avaview(cavac, Avaview.dasz, this, rel.gobid, "avacam"); - curpurs = new Button(cpursc, 70, this, "Pursue"); + add(curgive = new GiveButton(0), cgivec); + add(curava = new Avaview(Avaview.dasz, rel.gobid, "avacam"), cavac); + add(curpurs = new Button(70, "Pursue"), cpursc); } else if((current != null) && (rel == null)) { ui.destroy(curgive); ui.destroy(curava); diff --git a/src/haven/FlowerMenu.java b/src/haven/FlowerMenu.java index 6b84f90e4c..5158906edd 100644 --- a/src/haven/FlowerMenu.java +++ b/src/haven/FlowerMenu.java @@ -42,13 +42,11 @@ public class FlowerMenu extends Widget { @RName("sm") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - if((c.x == -1) && (c.y == -1)) - c = parent.ui.lcc; + public Widget create(Widget parent, Object[] args) { String[] opts = new String[args.length]; for(int i = 0; i < args.length; i++) opts[i] = (String)args[i]; - return(new FlowerMenu(c, parent, opts)); + return(new FlowerMenu(opts)); } } @@ -60,10 +58,10 @@ public class Petal extends Widget { private double a = 1; public Petal(String name) { - super(Coord.z, Coord.z, FlowerMenu.this); + super(Coord.z); this.name = name; text = ptf.render(name, ptc); - sz = new Coord(text.sz().x + 25, ph); + resize(text.sz().x + 25, ph); } public void move(Coord c) { @@ -181,14 +179,19 @@ private void organize(Petal[] opts) { } } - public FlowerMenu(Coord c, Widget parent, String... options) { - super(c, Coord.z, parent); + public FlowerMenu(String... options) { + super(Coord.z); opts = new Petal[options.length]; for(int i = 0; i < options.length; i++) { - opts[i] = new Petal(options[i]); + add(opts[i] = new Petal(options[i])); opts[i].num = i; } organize(opts); + } + + protected void added() { + if(c.equals(-1, -1)) + c = parent.ui.lcc; mg = ui.grabmouse(this); kg = ui.grabkeys(this); new Opening(); diff --git a/src/haven/GItem.java b/src/haven/GItem.java index 7e2c449b73..9657c624ce 100644 --- a/src/haven/GItem.java +++ b/src/haven/GItem.java @@ -42,10 +42,10 @@ public class GItem extends AWidget implements ItemInfo.SpriteOwner, GSprite.Owne @RName("item") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { + public Widget create(Widget parent, Object[] args) { int res = (Integer)args[0]; Message sdt = (args.length > 1)?new MessageBuf((byte[])args[1]):Message.nil; - return(new GItem(parent, parent.ui.sess.getres(res), sdt)); + return(new GItem(parent.ui.sess.getres(res), sdt)); } } @@ -70,14 +70,13 @@ public int itemnum() { } } - public GItem(Widget parent, Indir res, Message sdt) { - super(parent); + public GItem(Indir res, Message sdt) { this.res = res; this.sdt = new MessageBuf(sdt); } - public GItem(Widget parent, Indir res) { - this(parent, res, Message.nil); + public GItem(Indir res) { + this(res, Message.nil); } private Random rnd = null; diff --git a/src/haven/GiveButton.java b/src/haven/GiveButton.java index f2703efdd9..398187f229 100644 --- a/src/haven/GiveButton.java +++ b/src/haven/GiveButton.java @@ -36,18 +36,18 @@ public class GiveButton extends Widget { @RName("give") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new GiveButton(c, parent, (Integer)args[0])); + public Widget create(Widget parent, Object[] args) { + return(new GiveButton((Integer)args[0])); } } - public GiveButton(Coord c, Widget parent, int state, Coord sz) { - super(c, sz, parent); + public GiveButton(int state, Coord sz) { + super(sz); this.state = state; } - public GiveButton(Coord c, Widget parent, int state) { - this(c, parent, state, bg.sz()); + public GiveButton(int state) { + this(state, bg.sz()); } public void draw(GOut g) { diff --git a/src/haven/HelpWnd.java b/src/haven/HelpWnd.java index c17c2c9fea..73e8c3b297 100644 --- a/src/haven/HelpWnd.java +++ b/src/haven/HelpWnd.java @@ -37,15 +37,15 @@ public class HelpWnd extends Window { fnd.aa = true; } - public HelpWnd(Coord c, Widget parent, Indir res) { - super(c, new Coord(300, 430), parent, "Help"); + public HelpWnd(Indir res) { + super(new Coord(300, 430), "Help"); this.res = res; - this.text = new RichTextBox(Coord.z, new Coord(300, 400), this, "", fnd); - new Button(new Coord(100, 410), 100, this, "Dismiss") { - public void click() { - HelpWnd.this.wdgmsg("close"); - } - }; + this.text = add(new RichTextBox(new Coord(300, 400), "", fnd), Coord.z); + add(new Button(100, "Dismiss") { + public void click() { + HelpWnd.this.wdgmsg("close"); + } + }, new Coord(100, 410)); } public void tick(double dt) { diff --git a/src/haven/Inventory.java b/src/haven/Inventory.java index 21a3bdf1ca..73ba04224e 100644 --- a/src/haven/Inventory.java +++ b/src/haven/Inventory.java @@ -36,8 +36,8 @@ public class Inventory extends Widget implements DTarget { @RName("inv") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Inventory(c, (Coord)args[0], parent)); + public Widget create(Widget parent, Object[] args) { + return(new Inventory((Coord)args[0])); } } @@ -51,8 +51,8 @@ public void draw(GOut g) { super.draw(g); } - public Inventory(Coord c, Coord sz, Widget parent) { - super(c, invsq.sz().add(new Coord(-1, -1)).mul(sz).add(new Coord(1, 1)), parent); + public Inventory(Coord sz) { + super(invsq.sz().add(new Coord(-1, -1)).mul(sz).add(new Coord(1, 1))); isz = sz; } @@ -69,14 +69,12 @@ else if(amount > 0) return(true); } - public Widget makechild(String type, Object[] pargs, Object[] cargs) { - Coord c = (Coord)pargs[0]; - Widget ret = gettype(type).create(c, this, cargs); - if(ret instanceof GItem) { - GItem i = (GItem)ret; - wmap.put(i, new WItem(c.mul(sqsz).add(1, 1), this, i)); + public void addchild(Widget child, Object... args) { + Coord c = (Coord)args[0]; + if(child instanceof GItem) { + GItem i = (GItem)child; + wmap.put(i, add(new WItem(i), c.mul(sqsz).add(1, 1))); } - return(ret); } public void cdestroy(Widget w) { diff --git a/src/haven/ItemDrag.java b/src/haven/ItemDrag.java index 7d1128a3df..e387c92177 100644 --- a/src/haven/ItemDrag.java +++ b/src/haven/ItemDrag.java @@ -29,9 +29,13 @@ public class ItemDrag extends WItem { public Coord doff; - public ItemDrag(Coord dc, Widget parent, GItem item) { - super(parent.ui.mc.add(dc.inv()), parent, item); + public ItemDrag(Coord dc, GItem item) { + super(item); this.doff = dc; + } + + protected void added() { + this.c = parent.ui.mc.add(doff.inv()); ui.grabmouse(this); } diff --git a/src/haven/Logout.java b/src/haven/Logout.java deleted file mode 100644 index 27ce114b50..0000000000 --- a/src/haven/Logout.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * This file is part of the Haven & Hearth game client. - * Copyright (C) 2009 Fredrik Tolf , and - * Björn Johannessen - * - * Redistribution and/or modification of this file is subject to the - * terms of the GNU Lesser General Public License, version 3, as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * Other parts of this source tree adhere to other copying - * rights. Please see the file `COPYING' in the root directory of the - * source tree for details. - * - * A copy the GNU Lesser General Public License is distributed along - * with the source tree of which this file is a part in the file - * `doc/LPGL-3'. If it is missing for any reason, please see the Free - * Software Foundation's website at , or write - * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307 USA - */ - -package haven; - -public class Logout extends Window { - Button y, n; - - public Logout(Coord c, Widget parent) { - super(c, new Coord(125, 50), parent, "Haven & Hearth"); - new Label(Coord.z, this, "Do you want to log out?"); - y = new Button(new Coord(0, 30), 50, this, "Yes"); - n = new Button(new Coord(75, 30), 50, this, "No"); - canactivate = true; - } - - public void wdgmsg(Widget sender, String msg, Object... args) { - if(sender == y) { - ui.sess.close(); - } else if(sender == n) { - ui.destroy(this); - } else if(sender == this) { - if(msg == "close") - ui.destroy(this); - if(msg == "activate") - ui.sess.close(); - } else { - super.wdgmsg(sender, msg, args); - } - } -} diff --git a/src/haven/Makewindow.java b/src/haven/Makewindow.java index 4d6377711c..257a4a104d 100644 --- a/src/haven/Makewindow.java +++ b/src/haven/Makewindow.java @@ -36,12 +36,12 @@ public class Makewindow extends Widget { List outputs = Collections.emptyList(); static Coord boff = new Coord(7, 9); final int xoff = 40, yoff = 55; - public static final Text.Foundry nmf = new Text.Foundry(Text.serif, 20); + public static final Text.Foundry nmf = new Text.Foundry(Text.serif, 20).aa(true); @RName("make") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new Makewindow(c, parent, (String)args[0])); + public Widget create(Widget parent, Object[] args) { + return(new Makewindow((String)args[0])); } } @@ -91,15 +91,14 @@ public void tick(double dt) { } } - public Makewindow(Coord c, Widget parent, String rcpnm) { - super(c, Coord.z, parent); - Label nm = new Label(new Coord(0, 0), this, rcpnm, nmf); - nm.c = new Coord(sz.x - nm.sz.x, 0); - new Label(new Coord(0, 8), this, "Input:"); - new Label(new Coord(0, 63), this, "Result:"); - obtn = new Button(new Coord(265, 71), 85, this, "Craft"); - cbtn = new Button(new Coord(360, 71), 85, this, "Craft All"); + public Makewindow(String rcpnm) { + super(); + add(new Label("Input:"), new Coord(0, 8)); + add(new Label("Result:"), new Coord(0, 63)); + obtn = add(new Button(85, "Craft"), new Coord(265, 71)); + cbtn = add(new Button(85, "Craft All"), new Coord(360, 71)); pack(); + adda(new Label(rcpnm, nmf), sz.x, 0, 1, 0); } public void uimsg(String msg, Object... args) { diff --git a/src/haven/MapMod.java b/src/haven/MapMod.java index eb9e26476e..07b8b7d2ee 100644 --- a/src/haven/MapMod.java +++ b/src/haven/MapMod.java @@ -42,25 +42,28 @@ public class MapMod extends Window implements MapView.Grabber { @RName("mapmod") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new MapMod(c, parent)); + public Widget create(Widget parent, Object[] args) { + return(new MapMod()); } } - public MapMod(Coord c, Widget parent) { - super(c, new Coord(200, 100), parent, "Kartlasskostning"); - map = ui.sess.glob.map; + public MapMod() { + super(new Coord(200, 100), "Kartlasskostning"); + walkmod = false; + cbox = add(new CheckBox("Walk drawing"), Coord.z); + cbox.canactivate = true; + add(new Button(40, "Change"), asz.add(-50, -30)); + text = add(new Label(String.format(fmt, 0, 0)), Coord.z); + tilenm = add(new TextEntry(50, ""), new Coord(0, 40)); + tilenm.canactivate = true; + } + + protected void added() { + map = ui.sess.glob.map; mv = getparent(GameUI.class).map; grab = mv.new GrabXL(this); - walkmod = false; mv.enol(17); mv.grab(grab); - cbox = new CheckBox(Coord.z, this, "Walk drawing"); - cbox.canactivate = true; - btn = new Button(asz.add(-50, -30), 40, this, "Change"); - text = new Label(Coord.z, this, String.format(fmt, 0, 0)); - tilenm = new TextEntry(new Coord(0, 40), new Coord(50, 17), this, ""); - tilenm.canactivate = true; } public void destroy() { diff --git a/src/haven/MenuGrid.java b/src/haven/MenuGrid.java index e8300fe346..26bd7e95a5 100644 --- a/src/haven/MenuGrid.java +++ b/src/haven/MenuGrid.java @@ -49,8 +49,8 @@ public class MenuGrid extends Widget { @RName("scm") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new MenuGrid(c, parent)); + public Widget create(Widget parent, Object[] args) { + return(new MenuGrid()); } } @@ -109,8 +109,8 @@ else if((parent != null) && !close.contains(parent) && !open.contains(parent)) return(ret); } - public MenuGrid(Coord c, Widget parent) { - super(c, bgsz.mul(gsz).add(1, 1), parent); + public MenuGrid() { + super(bgsz.mul(gsz).add(1, 1)); } private static Comparator sorter = new Comparator() { diff --git a/src/haven/NpcChat.java b/src/haven/NpcChat.java index 53588cd323..21ee92d8f3 100644 --- a/src/haven/NpcChat.java +++ b/src/haven/NpcChat.java @@ -35,14 +35,14 @@ public class NpcChat extends Window { @RName("npc") public static class $_ implements Factory { - public Widget create(Coord c, Widget parent, Object[] args) { - return(new NpcChat(c, (Coord)args[0], parent, (String)args[1])); + public Widget create(Widget parent, Object[] args) { + return(new NpcChat((Coord)args[0], (String)args[1])); } } - public NpcChat(Coord c, Coord sz, Widget parent, String title) { - super(c, sz, parent, title); - out = new Textlog(Coord.z, new Coord(sz.x, sz.y), this); + public NpcChat(Coord sz, String title) { + super(sz, title); + out = add(new Textlog(new Coord(sz.x, sz.y)), Coord.z); } public void uimsg(String msg, Object... args) { @@ -61,7 +61,7 @@ public void uimsg(String msg, Object... args) { int y = out.sz.y + 3; btns = new LinkedList