From 155a504194ae917cd37eed30287429d4b6630a27 Mon Sep 17 00:00:00 2001 From: MarianoGNU Date: Sun, 16 Sep 2012 08:02:11 -0300 Subject: [PATCH 1/2] Generate Autotiles for D1-D12 blocks --- .../binding_sample_game.rproject | 6 + binding_sample_game/data/actors/actor1.xml | 54 +++++ binding_sample_game/data/actors/actor2.xml | 46 +++++ binding_sample_game/data/game.xml | 24 +++ binding_sample_game/data/items/item1.xml | 4 + binding_sample_game/data/maps/map1.xml | 43 ++++ binding_sample_game/data/maps/map2.xml | 43 ++++ binding_sample_game/data/maps/maptree.xml | 5 + binding_sample_game/data/skills/skill1.xml | 51 +++++ binding_sample_game/data/skills/skill2.xml | 51 +++++ .../graphics/tilesets/basis.png | Bin 0 -> 35006 bytes .../graphics/tilesets/debug.png | Bin 0 -> 3481 bytes .../graphics/tilesets/template.png | Bin 0 -> 5925 bytes src/tiled_map_drawingarea.vala | 43 +++- src/tileset.vala | 189 +++++++++++++++--- 15 files changed, 530 insertions(+), 29 deletions(-) create mode 100644 binding_sample_game/binding_sample_game.rproject create mode 100644 binding_sample_game/data/actors/actor1.xml create mode 100644 binding_sample_game/data/actors/actor2.xml create mode 100644 binding_sample_game/data/game.xml create mode 100644 binding_sample_game/data/items/item1.xml create mode 100644 binding_sample_game/data/maps/map1.xml create mode 100644 binding_sample_game/data/maps/map2.xml create mode 100644 binding_sample_game/data/maps/maptree.xml create mode 100644 binding_sample_game/data/skills/skill1.xml create mode 100644 binding_sample_game/data/skills/skill2.xml create mode 100644 binding_sample_game/graphics/tilesets/basis.png create mode 100644 binding_sample_game/graphics/tilesets/debug.png create mode 100644 binding_sample_game/graphics/tilesets/template.png diff --git a/binding_sample_game/binding_sample_game.rproject b/binding_sample_game/binding_sample_game.rproject new file mode 100644 index 0000000..6034d1c --- /dev/null +++ b/binding_sample_game/binding_sample_game.rproject @@ -0,0 +1,6 @@ + + + 1 + 0 + 0 + diff --git a/binding_sample_game/data/actors/actor1.xml b/binding_sample_game/data/actors/actor1.xml new file mode 100644 index 0000000..f190b67 --- /dev/null +++ b/binding_sample_game/data/actors/actor1.xml @@ -0,0 +1,54 @@ + + + Alex + Soldier + 1 + 99 + false + 30 + false + false + false + false + + + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + + 1 + Chara1.png + false + 1 + Chara1.png + 1 + 10 + 50 + 0 + + + + 1 + + + + + true + Sortilege + + + 2 + 1 + + + 1 + 1 + + + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 1 3 4 5 + diff --git a/binding_sample_game/data/actors/actor2.xml b/binding_sample_game/data/actors/actor2.xml new file mode 100644 index 0000000..a9b68b0 --- /dev/null +++ b/binding_sample_game/data/actors/actor2.xml @@ -0,0 +1,46 @@ + + + Enrike + Hunter + 1 + 99 + true + 30 + false + false + false + false + + + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 + + 10 + Chara2.png + false + 2 + Chara4.png + 1 + 1 + 677 + 0 + + + + + + + + + false + + + + 3 3 3 3 3 3 3 3 3 3 + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 + 1 3 4 5 + diff --git a/binding_sample_game/data/game.xml b/binding_sample_game/data/game.xml new file mode 100644 index 0000000..50e446b --- /dev/null +++ b/binding_sample_game/data/game.xml @@ -0,0 +1,24 @@ + + + Sample Game + + 1 + 2 + 3 + + + 1 + 5 + 6 + + + 1 + 8 + 9 + + + 1 + 11 + 12 + + diff --git a/binding_sample_game/data/items/item1.xml b/binding_sample_game/data/items/item1.xml new file mode 100644 index 0000000..39fec15 --- /dev/null +++ b/binding_sample_game/data/items/item1.xml @@ -0,0 +1,4 @@ + + + + diff --git a/binding_sample_game/data/maps/map1.xml b/binding_sample_game/data/maps/map1.xml new file mode 100644 index 0000000..4d8803d --- /dev/null +++ b/binding_sample_game/data/maps/map1.xml @@ -0,0 +1,43 @@ + + + Map1 + 20 + 16 + debug.png + 0 + + + false + false + 0 + false + false + 0 + + + 1 + + + + 1 + + + + 1 + true + + + 1 + true + + + 1 + true + + + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4 5 6 20 20 20 7 20 20 20 20 20 9 20 20 20 20 20 10 20 20 20 20 20 20 7 7 7 20 20 20 9 9 9 20 20 20 10 10 10 20 20 20 20 7 7 7 7 7 20 9 9 9 9 9 20 10 10 10 10 10 20 20 20 20 7 7 7 20 11 20 9 9 9 20 12 20 10 10 10 20 20 20 20 20 20 7 20 11 11 11 20 9 20 12 12 12 20 10 20 20 20 20 20 20 20 20 11 11 11 11 11 20 12 12 12 12 12 20 20 20 20 20 20 20 20 13 20 11 11 11 20 14 20 12 12 12 20 15 20 20 20 20 20 20 13 13 13 20 11 20 14 14 14 20 12 20 15 15 15 20 20 20 20 13 13 13 13 13 20 14 14 14 14 14 20 15 15 15 15 15 20 20 20 20 13 13 13 20 16 20 14 14 14 20 17 20 15 15 15 20 20 20 20 20 20 13 20 16 16 16 20 14 20 17 17 17 20 15 20 20 20 20 20 20 20 20 16 16 16 16 16 20 17 17 17 17 17 20 20 20 20 20 20 20 20 20 20 16 16 16 20 20 20 17 17 17 20 20 20 20 20 20 20 20 20 20 20 20 16 20 20 20 20 20 17 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + 25 + 0 + diff --git a/binding_sample_game/data/maps/map2.xml b/binding_sample_game/data/maps/map2.xml new file mode 100644 index 0000000..a1d6e6f --- /dev/null +++ b/binding_sample_game/data/maps/map2.xml @@ -0,0 +1,43 @@ + + + Map2 + 20 + 16 + basis.png + 0 + + + false + false + 0 + false + false + 0 + + + 1 + + + + 1 + + + + 1 + true + + + 1 + true + + + 1 + true + + + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4 5 6 20 20 20 7 20 20 20 20 20 9 20 20 20 20 20 10 20 20 20 20 20 20 7 7 7 20 20 20 9 9 9 20 20 20 10 10 10 20 20 20 20 7 7 7 7 7 20 9 9 9 9 9 20 10 10 10 10 10 20 20 20 20 7 7 7 20 11 20 9 9 9 20 12 20 10 10 10 20 20 20 20 20 20 7 20 11 11 11 20 9 20 12 12 12 20 10 20 20 20 20 20 20 20 20 11 11 11 11 11 20 12 12 12 12 12 20 20 20 20 20 20 20 20 13 20 11 11 11 20 14 20 12 12 12 20 15 20 20 20 20 20 20 13 13 13 20 11 20 14 14 14 20 12 20 15 15 15 20 20 20 20 13 13 13 13 13 20 14 14 14 14 14 20 15 15 15 15 15 20 20 20 20 13 13 13 20 16 20 14 14 14 20 17 20 15 15 15 20 20 20 20 20 20 13 20 16 16 16 20 14 20 17 17 17 20 15 20 20 20 20 20 20 20 20 16 16 16 16 16 20 17 17 17 17 17 20 20 20 20 20 20 20 20 20 20 16 16 16 20 20 20 17 17 17 20 20 20 20 20 20 20 20 20 20 20 20 16 20 20 20 20 20 17 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + 25 + 0 + diff --git a/binding_sample_game/data/maps/maptree.xml b/binding_sample_game/data/maps/maptree.xml new file mode 100644 index 0000000..70f41b8 --- /dev/null +++ b/binding_sample_game/data/maps/maptree.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/binding_sample_game/data/skills/skill1.xml b/binding_sample_game/data/skills/skill1.xml new file mode 100644 index 0000000..ae54d88 --- /dev/null +++ b/binding_sample_game/data/skills/skill1.xml @@ -0,0 +1,51 @@ + + + false + false + false + false + false + true + false + false + 1 + + false false false false false false false false false false false false false false false false false + + 3 + + 1 + 0 + 0 + 3 + + Heal some HP + 0 + 100 + false + 3 + Cure + true + true + 0 + 25 + 3 + + null + 50 + 100 + 100 + + 5 + 1 + 0 + 0 + + false false false false false false false false false false + + 0 + 0 + casts Cure + + 4 + diff --git a/binding_sample_game/data/skills/skill2.xml b/binding_sample_game/data/skills/skill2.xml new file mode 100644 index 0000000..1482d10 --- /dev/null +++ b/binding_sample_game/data/skills/skill2.xml @@ -0,0 +1,51 @@ + + + false + false + false + false + false + true + false + false + 1 + + false false false false true false false false false false false false false false false false false + + 3 + + 1 + 0 + 0 + 3 + + Fire elemental attack + 0 + 100 + false + 3 + Fire 1 + true + false + 0 + 20 + 0 + + null + 50 + 100 + 100 + + 4 + 1 + 0 + 0 + + false false false false false false false false false false + + 0 + 0 + casts Fire 1 + + 4 + diff --git a/binding_sample_game/graphics/tilesets/basis.png b/binding_sample_game/graphics/tilesets/basis.png new file mode 100644 index 0000000000000000000000000000000000000000..342056003da0a040bfb1e22b00c78bec1065f7fe GIT binary patch literal 35006 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 literal 0 HcmV?d00001 diff --git a/binding_sample_game/graphics/tilesets/template.png b/binding_sample_game/graphics/tilesets/template.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e2a5eb1a365e8854017ee58a141ab161cf6705 GIT binary patch literal 5925 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 + return null; + + /** + * Generate binding_grid + */ + int u = 0; + int d = 0; + int l = 0; + int r = 0; + int ul = 0; + int ur = 0; + int dl = 0; + int dr = 0; + int h = this.height_in_tiles; + int w = this.width_in_tiles; + + if (y > 0 && this.lower_layer[y-1,x] != tile_id) + u = 1; + if (y < h && this.lower_layer[y+1,x] != tile_id) + d = 2; + if (x > 0 && this.lower_layer[y,x-1] != tile_id) + l = 4; + if (x < w && this.lower_layer[y,x+1] != tile_id) + r = 8; + if (x > 0 && y > 0 && (u+l) == 0 && this.lower_layer[y-1,x-1] != tile_id) + ul = 16; + if (x < w && y > 0 && (u+r) == 0 && this.lower_layer[y-1,x+1] != tile_id) + ur = 32; + if (x > 0 && y < h && (d+l) == 0 && this.lower_layer[y+1,x-1] != tile_id) + dl = 64; + if (x < w && y < h && (d+r) == 0 && this.lower_layer[y+1,x+1] != tile_id) + dr = 128; + + return u+r+l+d+ul+ur+dl+dr; + } } \ No newline at end of file diff --git a/src/tileset.vala b/src/tileset.vala index e8711e8..7b5a210 100644 --- a/src/tileset.vala +++ b/src/tileset.vala @@ -135,8 +135,10 @@ public class Tileset { ctx.set_source_surface (surface_tileset, dest_x - orig_x, dest_y - orig_y); ctx.fill (); - // Store the surface in the autotiles hashtable - this.autotiles.set (tile_id, surface_block); + /** + * Generate binded cache and store them on hash table + */ + this.generate_binded_tiles (tile_id, surface_block); tile_id++; block_col++; @@ -155,6 +157,134 @@ public class Tileset { } } + private void generate_binded_tiles (int tile_id, Cairo.ImageSurface surface_block){ + + /** + * Simulate al posible combinations + */ + + bool[2] is_binded = {true,false}; + + foreach (bool bu in is_binded) + foreach (bool bd in is_binded) + foreach (bool bl in is_binded) + foreach (bool br in is_binded) + foreach (bool bul in is_binded) + foreach (bool bur in is_binded) + foreach (bool bdl in is_binded) + foreach (bool bdr in is_binded){ + + int u = 0; + int d = 0; + int l = 0; + int r = 0; + if (bu) u = 1; + if (bd) d = 2; + if (bl) l = 4; + if (br) r = 8; + int ul = 0; + int ur = 0; + int dl = 0; + int dr = 0; + if (u + l == 0 && bul) + ul = 16; + if (u + r == 0 && bur) + ur = 32; + if (d + l == 0 && bdl) + dl = 64; + if (d + r == 0 && bdr) + dr = 128; + + + /* + * Get base + */ + var surface_tile = new Cairo.ImageSurface (Cairo.Format.ARGB32, 16, 16); + var ctx = new Cairo.Context (surface_tile); + ctx.set_operator (Cairo.Operator.SOURCE); + ctx.rectangle (0, 0, 16, 16); + ctx.set_source_surface (surface_block, -16, -32); + ctx.fill (); + + /* + * Draw upper_left corner + */ + int dest_x = 0; + int dest_y = 0; + if ((u + l + ul) != 0){ + ctx.rectangle (dest_x, dest_y, 8, 8); + if (u + l + ul == 1) + ctx.set_source_surface (surface_block, dest_x-16, dest_y-16); + if (u + l + ul == 4) + ctx.set_source_surface (surface_block, dest_x-0, dest_y-32); + if (u + l + ul == 5) + ctx.set_source_surface (surface_block, dest_x-0, dest_y-16); + if (u + l + ul == 16) + ctx.set_source_surface (surface_block, dest_x-32, dest_y-0); + ctx.fill(); + } + + /* + * Draw upper_right corner + */ + dest_x = 8; + if (u + r + ur > 0){ + ctx.rectangle (8, 0, 8, 8); + if (u + r + ur == 1) + ctx.set_source_surface (surface_block, dest_x-24, dest_y-16); + if (u + r + ur == 8) + ctx.set_source_surface (surface_block, dest_x-40, dest_y-32); + if (u + r + ur == 9) + ctx.set_source_surface (surface_block, dest_x-40, dest_y-16); + if (u + r + ur == 32) + ctx.set_source_surface (surface_block, dest_x-40, dest_y-0); + ctx.fill(); + } + + /* + * Draw down_left corner + */ + dest_x = 0; + dest_y = 8; + if (d + l + dl > 0){ + ctx.rectangle (0, 8, 8, 8); + if (d + l + dl == 2) + ctx.set_source_surface (surface_block, dest_x-16, dest_y-56); + if (d + l + dl == 4) + ctx.set_source_surface (surface_block, dest_x-0, dest_y-40); + if (d + l + dl == 6) + ctx.set_source_surface (surface_block, dest_x-0, dest_y-56); + if (d + l + dl == 64) + ctx.set_source_surface (surface_block, dest_x-32, dest_y-8); + ctx.fill (); + } + + /* + * Draw down_right corner + */ + dest_x = 8; + if (d + r + dr > 0){ + ctx.rectangle (8, 8, 8, 8); + if (d + r + dr == 2) + ctx.set_source_surface (surface_block, dest_x-24, dest_y-56); + if (d + r + dr == 8) + ctx.set_source_surface (surface_block, dest_x-40, dest_y-40); + if (d + r + dr == 10) + ctx.set_source_surface (surface_block, dest_x-40, dest_y-56); + if (d + r + dr == 128) + ctx.set_source_surface (surface_block, dest_x-40, dest_y-8); + ctx.fill (); + } + + /* + * Register tile + */ + int binding_code = (tile_id + 2)*250+ul+u+ur+l+r+dl+d+dr; + this.autotiles.set (binding_code, surface_tile); + } + } + + /** * Builds the lower tiles surface (used when designing the lower layer). */ @@ -169,41 +299,40 @@ public class Tileset { int orig_x = 0; int orig_y = 0; - // For each autotile block, copy its representative tile to the palette - for (int tile_id = 1; tile_id < 17; tile_id++) { - surface_autotile = this.autotiles.get (tile_id); - - // First three animated autotile blocks - if (tile_id < 4) { - dest_x = (tile_id - 1) * 16; - ctx.rectangle (dest_x, dest_y, 16, 16); - ctx.set_source_surface (surface_autotile, dest_x, dest_y); - } - // The fourth animated autotile block works in a different way - else if (tile_id == 4) { - dest_x = (tile_id - 1) * 16; - ctx.rectangle (dest_x, dest_y, 48, 16); - ctx.set_source_surface (surface_autotile, dest_x, dest_y); - } - // The remaining autotiles - else { - dest_x = ((tile_id + 1) % 6) * 16; - dest_y = ((tile_id + 1) / 6) * 16; - ctx.rectangle (dest_x, dest_y, 16, 16); - } + // For each autotile block, copy its representative tile to the palette + + ctx.rectangle (0, 0, 16, 16); + ctx.set_source_surface (surface_tileset, 0, 0); + ctx.fill(); + ctx.rectangle (16, 0, 16, 16); + ctx.set_source_surface (surface_tileset, 16-48, 0); + ctx.fill(); + ctx.rectangle (32, 0, 16, 16); + ctx.set_source_surface (surface_tileset, 32, -80); + ctx.fill(); + // The fourth animated autotile block works in a different way + ctx.rectangle (48, 0, 48, 16); + ctx.set_source_surface (surface_tileset, 0, -64); + ctx.fill(); + // The remaining autotiles + for (int tile_id = 5; tile_id < 17; tile_id++) { + surface_autotile = this.autotiles.get ((tile_id + 2) * 250+15); + dest_x = ((tile_id+1) % 6) * 16; + dest_y = ((tile_id+1) / 6) * 16; + ctx.rectangle (dest_x, dest_y, 16, 16); ctx.set_source_surface (surface_autotile, dest_x, dest_y); ctx.fill (); } - + // First part of the lower tiles (third tileset column, 96x256) dest_x = 0; dest_y = 48; orig_x = 192; orig_y = 0; - + ctx.rectangle (dest_x, dest_y, 96, 256); - ctx.set_source_surface (surface_tileset, dest_x - orig_x, dest_y - orig_y); + ctx.set_source_surface (surface_tileset, -192, 48); ctx.fill (); // Second part of the lower tiles (fourth tileset column, 96x128) @@ -257,9 +386,13 @@ public class Tileset { /** * Returns a 16x16 surface with the desired tile. */ - public Cairo.ImageSurface get_tile (int tile_id, LayerType layer) { + public Cairo.ImageSurface get_tile (int tile_id, LayerType layer, int? binding_code = null) { var surface_tile = new Cairo.ImageSurface (Cairo.Format.ARGB32, 16, 16); + // Is an autotile? + if (binding_code != null) + return this.autotiles.get(tile_id * 250 + binding_code); + // Find the tile coordinates int orig_x = ((tile_id - 1) % 6) * 16; int orig_y = ((tile_id - 1) / 6) * 16; From 19cc49ff12aa02e4e36cca7d82103fe1b1451b7f Mon Sep 17 00:00:00 2001 From: MarianoGNU Date: Tue, 18 Sep 2012 20:51:33 -0300 Subject: [PATCH 2/2] Bind WaterA WaterB and Deep Water --- binding_sample_game/data/maps/map1.xml | 2 +- binding_sample_game/data/maps/map2.xml | 2 +- binding_sample_game/data/maps/map3.xml | 43 ++++ binding_sample_game/data/maps/map4.xml | 43 ++++ binding_sample_game/data/maps/maptree.xml | 6 +- src/tiled_map_drawingarea.vala | 108 ++++++++- src/tileset.vala | 260 ++++++++++++++++++++-- 7 files changed, 434 insertions(+), 30 deletions(-) create mode 100644 binding_sample_game/data/maps/map3.xml create mode 100644 binding_sample_game/data/maps/map4.xml diff --git a/binding_sample_game/data/maps/map1.xml b/binding_sample_game/data/maps/map1.xml index 4d8803d..56a9186 100644 --- a/binding_sample_game/data/maps/map1.xml +++ b/binding_sample_game/data/maps/map1.xml @@ -1,6 +1,6 @@ - Map1 + DBlocks-Debug 20 16 debug.png diff --git a/binding_sample_game/data/maps/map2.xml b/binding_sample_game/data/maps/map2.xml index a1d6e6f..f91056a 100644 --- a/binding_sample_game/data/maps/map2.xml +++ b/binding_sample_game/data/maps/map2.xml @@ -1,6 +1,6 @@ - Map2 + DBlocks-Basis 20 16 basis.png diff --git a/binding_sample_game/data/maps/map3.xml b/binding_sample_game/data/maps/map3.xml new file mode 100644 index 0000000..cf37bd1 --- /dev/null +++ b/binding_sample_game/data/maps/map3.xml @@ -0,0 +1,43 @@ + + + Water-Debug + 20 + 16 + debug.png + 0 + + + false + false + 0 + false + false + 0 + + + 1 + + + + 1 + + + + 1 + true + + + 1 + true + + + 1 + true + + + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 1 1 1 1 1 1 7 7 3 1 1 1 1 1 3 7 7 7 1 3 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 3 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 7 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 7 7 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 7 7 3 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 3 7 7 3 1 1 1 1 1 1 1 1 3 1 1 3 3 3 1 1 3 7 16 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 2 2 2 16 16 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 2 2 2 16 16 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 16 16 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 16 16 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 16 16 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 16 16 16 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + 25 + 0 + diff --git a/binding_sample_game/data/maps/map4.xml b/binding_sample_game/data/maps/map4.xml new file mode 100644 index 0000000..22217c6 --- /dev/null +++ b/binding_sample_game/data/maps/map4.xml @@ -0,0 +1,43 @@ + + + Water-Basis + 20 + 16 + basis.png + 0 + + + false + false + 0 + false + false + 0 + + + 1 + + + + 1 + + + + 1 + true + + + 1 + true + + + 1 + true + + + 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 1 1 1 1 1 1 7 7 3 1 1 1 1 1 3 7 7 7 1 3 1 1 1 1 1 3 1 3 3 1 1 1 1 1 1 3 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 7 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 7 7 1 1 1 1 1 3 1 1 1 3 1 1 1 1 1 1 1 1 7 7 3 1 1 1 1 1 1 1 3 1 3 1 1 1 1 1 1 3 7 7 3 1 1 1 1 1 1 1 1 3 1 1 3 3 3 1 1 3 7 16 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 2 2 2 16 16 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 2 2 2 16 16 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 16 16 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 16 16 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 16 16 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 16 16 16 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + 25 + 0 + diff --git a/binding_sample_game/data/maps/maptree.xml b/binding_sample_game/data/maps/maptree.xml index 70f41b8..ad303aa 100644 --- a/binding_sample_game/data/maps/maptree.xml +++ b/binding_sample_game/data/maps/maptree.xml @@ -1,5 +1,7 @@ - - + + + + diff --git a/src/tiled_map_drawingarea.vala b/src/tiled_map_drawingarea.vala index 63ca38e..607b027 100644 --- a/src/tiled_map_drawingarea.vala +++ b/src/tiled_map_drawingarea.vala @@ -507,23 +507,18 @@ public abstract class TiledMapDrawingArea : TiledDrawingArea { private int? generate_binding_code(int y, int x){ int tile_id = this.lower_layer[y,x]; - //TODO: bind Water + if (is_water (y,x)) + return generate_water_binding_code (y,x); if (tile_id < 7 || tile_id >18) return null; /** * Generate binding_grid */ - int u = 0; - int d = 0; - int l = 0; - int r = 0; - int ul = 0; - int ur = 0; - int dl = 0; - int dr = 0; - int h = this.height_in_tiles; - int w = this.width_in_tiles; + int u = 0, d = 0, l = 0, r = 0, ul = 0, ur = 0, dl = 0, dr = 0; + + int h = this.height_in_tiles -1; + int w = this.width_in_tiles -1; if (y > 0 && this.lower_layer[y-1,x] != tile_id) u = 1; @@ -544,4 +539,95 @@ public abstract class TiledMapDrawingArea : TiledDrawingArea { return u+r+l+d+ul+ur+dl+dr; } + + /** + * Used for water binding code generation + * 1- WaterA + * 2- WaterB + * 3- DeepWater + **/ + private bool is_water(int y, int x){ + if (this.lower_layer[y,x] < 4 && this.lower_layer[y,x] > 0) + return true; + else + return false; + } + + /** + * Used for water binding code generation + **/ + private bool is_dwater(int y, int x){ + if (this.lower_layer[y,x] == 3) + return true; + else + return false; + } + + /** + * Used for water binding code generation + **/ + private bool is_abwater(int y, int x){ + if (this.lower_layer[y,x] == 1 || this.lower_layer[y,x] == 2) + return true; + else + return false; + } + + private int? generate_water_binding_code(int y, int x){ + /** + * Generate binding_grid + */ + int u=1, d=2, l=4, r=8, ul=0, ur=0, dl=0, dr=0; + + int h = this.height_in_tiles -1; + int w = this.width_in_tiles -1; + + if (y == 0 || is_water(y-1,x)) + u = 0; + if (y == h || is_water(y+1,x)) + d = 0; + if (x == 0 || is_water(y,x-1)) + l = 0; + if (x == w || is_water(y,x+1)) + r = 0; + + if ((u+l) == 0 && x > 0 && y > 0){ + if (is_water(y-1,x-1) == false) + ul = 16; + else if (is_abwater(y,x) && is_dwater (y-1,x) && is_dwater (y,x-1)) + ul = 21; + else if (is_dwater (y,x) && is_abwater(y-1,x) && is_abwater (y,x-1) && is_abwater (y-1,x-1)) + ul = 21; + } + + if ((u+r) == 0 && x < w && y > 0){ + if (is_water(y-1,x+1) == false) + ur = 32; + else if (is_abwater(y,x) && is_dwater (y-1,x) && is_dwater (y,x+1)) + ur = 41; + else if (is_dwater (y,x) && is_abwater(y-1,x) && is_abwater (y,x+1) && is_abwater (y-1,x+1)) + ur = 41; + } + + if ((d+l) == 0 && x > 0 && y < h){ + if (is_water(y+1,x-1) == false) + dl = 64; + else if (is_abwater(y,x) && is_dwater (y+1,x) && is_dwater (y,x-1)) + dl = 70; + else if (is_dwater (y,x) && is_abwater(y+1,x) && is_abwater (y,x-1) && is_abwater (y+1,x-1)) + dl = 70; + } + + if ((d+r) == 0 && x < w && y < h){ + if (is_water(y+1,x+1) == false) + dr = 128; + else if (is_abwater(y,x) && is_dwater (y+1,x) && is_dwater (y,x+1)) + dr = 138; + else if (is_dwater (y,x) && is_abwater(y+1,x) && is_abwater (y,x+1) && is_abwater (y+1,x+1)) + dr = 138; + } + + return (u+d+l+r+ul+ur+dl+dr); + } + } \ No newline at end of file diff --git a/src/tileset.vala b/src/tileset.vala index 7b5a210..77054f0 100644 --- a/src/tileset.vala +++ b/src/tileset.vala @@ -109,14 +109,19 @@ public class Tileset { Cairo.Context ctx; Cairo.ImageSurface surface_block; + // Since water binds in a diferent way and merges with deep water, + // we need a diferent way to bind it + this.generate_binded_water(surface_tileset); + // Each tileset contains 5 columns with a size of 6x16 tiles (96x256 pixels) int tileset_col = 0; // Each tileset column contains 4 blocks with a size of 3x4 tiles (48x64 pixels) - int block_col = 0; - int block_row = 0; + // Anyway we should skip water colums because they are already stored + int block_col = 1; + int block_row = 1; - int tile_id = 1; + int tile_id = 4; while (tileset_col < 2) { surface_block = new Cairo.ImageSurface (Cairo.Format.ARGB32, 48, 64); @@ -157,10 +162,241 @@ public class Tileset { } } + /** + * Used for water binding code generation + * 1- WaterA + * 2- WaterB + * 3- DeepWater + * 4- Ground + **/ + private bool is_water(int tile_id){ + if (tile_id < 4) + return true; + return false; + } + + /** + * Used for water binding code generation + **/ + private bool is_dwater(int tile_id){ + if (tile_id == 3) + return true; + return false; + } + + /** + * Used for water binding code generation + **/ + private bool is_abwater(int tile_id){ + if (tile_id == 1 || tile_id == 2) + return true; + return false; + } + + /** + * Generate al posible water combinations and store them on autotiles + */ + private void generate_binded_water(Cairo.ImageSurface surcace_tileset){ + + /** + * Simulate all posible combinations + **/ + int[4] terrain_ids = {1,2,3,4}; + /** + * 1- WaterA + * 2- WaterB + * 3- DeepWater + * 4- Ground + **/ + + // Main foreach controlates base water type + foreach (int tile_id in terrain_ids) + foreach (int tile_u in terrain_ids) + foreach (int tile_d in terrain_ids) + foreach (int tile_l in terrain_ids) + foreach (int tile_r in terrain_ids) + foreach (int tile_ul in terrain_ids) + foreach (int tile_ur in terrain_ids) + foreach (int tile_dl in terrain_ids) + foreach (int tile_dr in terrain_ids){ + if (tile_id == 4) + // Once main foreach reaches ground, we have finished + break; + // Initialize code vars + int u=1, d=2, l=4, r=8, ul=0, ur=0, dl=0, dr=0; + + if (is_water (tile_u)) + u = 0; + if (is_water (tile_d)) + d = 0; + if (is_water (tile_l)) + l = 0; + if (is_water (tile_r)) + r = 0; + // DeepWater Special Corners + //UpperLeft + if (is_dwater (tile_id)){ + if (is_abwater(tile_u) && is_abwater (tile_l) && is_abwater (tile_ul)) + ul = 21;} + else{ + if (is_dwater (tile_u) && is_dwater (tile_l)) + ul = 21;} + //UpperRight + if (is_dwater (tile_id)){ + if (is_abwater(tile_u) && is_abwater (tile_r) && is_abwater (tile_ur)) + ur = 41;} + else{ + if (is_dwater (tile_u) && is_dwater (tile_r)) + ur = 41;} + //LowerLeft + if (is_dwater (tile_id)){ + if (is_abwater(tile_d) && is_abwater (tile_l) && is_abwater (tile_dl)) + dl = 70;} + else{ + if (is_dwater (tile_d) && is_dwater (tile_l)) + dl = 70;} + //LowerRight + if (is_dwater (tile_id)){ + if (is_abwater(tile_d) && is_abwater (tile_r) && is_abwater (tile_dr)) + dr = 138;} + else{ + if (is_dwater (tile_d) && is_dwater (tile_r)) + dr = 138;} + //Overdraw ground corners + if ((u+l) == 0 && tile_ul == 4) + ul = 16; + if ((u+r) == 0 && tile_ur == 4) + ur = 32; + if ((d+l) == 0 && tile_dl == 4) + dl = 64; + if ((d+r) == 0 && tile_dr == 4) + dr = 128; + + int binding_code = tile_id * 300 + u+d+l+r+ul+ur+dl+dr; + // Skip painting if tile is already stored + if (this.autotiles.get(binding_code) != null) + continue; + + // Water B uses second block of 3x4 tiles for borders + // Water A and Deep Water uses first block + int border_xoffset = (tile_id == 2) ? 48 : 0; + + /* + * Get base + */ + var surface_tile = new Cairo.ImageSurface (Cairo.Format.ARGB32, 16, 16); + var ctx = new Cairo.Context (surface_tile); + ctx.set_operator (Cairo.Operator.SOURCE); + ctx.rectangle (0, 0, 16, 16); + if (is_abwater (tile_id)) + ctx.set_source_surface (surcace_tileset, 0, -64); + else + ctx.set_source_surface (surcace_tileset, 0, -112); + ctx.fill (); + + // Draw Corners + //UpperLeft corner + int dest_x = 0, dest_y = 0; + int corner = u+l+ul; + if (corner > 0){ + ctx.rectangle (dest_x, dest_y, 8, 8); + if (corner == 1) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-0, dest_y-32); + if (corner == 4) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-0, dest_y-16); + if (corner == 5) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-0, dest_y-0); + if (corner == 16) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-0, dest_y-48); + if (corner == 21){ + if (is_abwater (tile_id)) + ctx.set_source_surface (surcace_tileset, dest_x-0, dest_y-80); + else + ctx.set_source_surface (surcace_tileset, dest_x-0, dest_y-96); + } + ctx.fill(); + } + + //UpperRight corner + dest_x = 8; + dest_y = 0; + corner = u+r+ur; + if (corner > 0){ + ctx.rectangle (dest_x, dest_y, 8, 8); + if (corner == 1) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-8, dest_y-32); + if (corner == 8) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-8, dest_y-16); + if (corner == 9) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-8, dest_y-0); + if (corner == 32) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-8, dest_y-48); + if (corner == 41){ + if (is_abwater (tile_id)) + ctx.set_source_surface (surcace_tileset, dest_x-8, dest_y-80); + else + ctx.set_source_surface (surcace_tileset, dest_x-8, dest_y-96); + } + ctx.fill(); + } + // corner + dest_x = 0; + dest_y = 8; + corner = d+l+dl; + if (corner > 0){ + ctx.rectangle (dest_x, dest_y, 8, 8); + if (corner == 2) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-0, dest_y-40); + if (corner == 4) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-0, dest_y-24); + if (corner == 6) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-0, dest_y-8); + if (corner == 64) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-0, dest_y-56); + if (corner == 70){ + if (is_abwater (tile_id)) + ctx.set_source_surface (surcace_tileset, dest_x-0, dest_y-88); + else + ctx.set_source_surface (surcace_tileset, dest_x-0, dest_y-104); + } + ctx.fill(); + } + + // corner + dest_x = 8; + dest_y = 8; + corner = d+r+dr; + if (corner > 0){ + ctx.rectangle (dest_x, dest_y, 8, 8); + if (corner == 2) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-8, dest_y-40); + if (corner == 8) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-8, dest_y-24); + if (corner == 10) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-8, dest_y-8); + if (corner == 128) + ctx.set_source_surface (surcace_tileset, dest_x-border_xoffset-8, dest_y-56); + if (corner == 138){ + if (is_abwater (tile_id)) + ctx.set_source_surface (surcace_tileset, dest_x-8, dest_y-88); + else + ctx.set_source_surface (surcace_tileset, dest_x-8, dest_y-104); + } + ctx.fill(); + } + /* + * Register tile + */ + this.autotiles.set (binding_code, surface_tile); + } + } + /** + * Generate al posible ground combinations and store them on autotiles + */ private void generate_binded_tiles (int tile_id, Cairo.ImageSurface surface_block){ /** - * Simulate al posible combinations + * Simulate all posible combinations */ bool[2] is_binded = {true,false}; @@ -174,18 +410,12 @@ public class Tileset { foreach (bool bdl in is_binded) foreach (bool bdr in is_binded){ - int u = 0; - int d = 0; - int l = 0; - int r = 0; + int u = 0, d = 0, l = 0, r = 0; if (bu) u = 1; if (bd) d = 2; if (bl) l = 4; if (br) r = 8; - int ul = 0; - int ur = 0; - int dl = 0; - int dr = 0; + int ul = 0, ur = 0, dl = 0, dr = 0; if (u + l == 0 && bul) ul = 16; if (u + r == 0 && bur) @@ -279,7 +509,7 @@ public class Tileset { /* * Register tile */ - int binding_code = (tile_id + 2)*250+ul+u+ur+l+r+dl+d+dr; + int binding_code = (tile_id + 2)*300+ul+u+ur+l+r+dl+d+dr; this.autotiles.set (binding_code, surface_tile); } } @@ -317,7 +547,7 @@ public class Tileset { ctx.fill(); // The remaining autotiles for (int tile_id = 5; tile_id < 17; tile_id++) { - surface_autotile = this.autotiles.get ((tile_id + 2) * 250+15); + surface_autotile = this.autotiles.get ((tile_id + 2) * 300+15); dest_x = ((tile_id+1) % 6) * 16; dest_y = ((tile_id+1) / 6) * 16; ctx.rectangle (dest_x, dest_y, 16, 16); @@ -391,7 +621,7 @@ public class Tileset { // Is an autotile? if (binding_code != null) - return this.autotiles.get(tile_id * 250 + binding_code); + return this.autotiles.get(tile_id * 300 + binding_code); // Find the tile coordinates int orig_x = ((tile_id - 1) % 6) * 16;