Skip to content

Commit 7fa25c8

Browse files
committed
UI & Authority
1 parent e0387c1 commit 7fa25c8

10 files changed

Lines changed: 73 additions & 41 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ target
33
*.iml
44
engine/program.some
55
engine/*.png
6+
*.png

engine/src/main/java/ru/base/game/engine/Game.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import ru.base.game.engine.lang.Parser;
77
import ru.base.game.engine.lang.VirtualMachine;
88
import ru.base.game.engine.map.StandardMapGenerator;
9+
import ru.base.game.engine.messages.SourceLevel;
910

1011
import java.util.concurrent.atomic.AtomicInteger;
1112

@@ -16,13 +17,13 @@ public final class Game implements Evaluator.ObjectTarget, Context {
1617
private final Map.Generator generator = new StandardMapGenerator();
1718
private final int width = 41;
1819
private final int height = 41;
19-
private final Listener listener;
20+
private final Message.Listener listener;
2021
private final Player player = new Player();
2122
private boolean userAttacked = false;
2223
private Map map;
2324
private State state = State.INITIATE;
2425

25-
public Game(Listener listener) {
26+
public Game(Message.Listener listener) {
2627
this.listener = listener;
2728
}
2829

@@ -52,7 +53,7 @@ public void tick() {
5253
.filter(co -> co.source() instanceof Event e && e.type() == Event.Type.ENTER)
5354
.findAny().ifPresent(c -> player.flyTo(c.x(), c.y()));
5455
change(State.RUNNING);
55-
emitRefresh();
56+
emitLevel();
5657
break;
5758
}
5859
default: {
@@ -61,8 +62,21 @@ public void tick() {
6162
}
6263
}
6364

64-
private void emitRefresh() {
65-
listener.emit(new Listener.Refresh(map, player));
65+
private void emitLevel() {
66+
int[][] layers = new int[width][height];
67+
for (int y = 0; y < height; y++) {
68+
for (int x = 0; x < width; x++) {
69+
layers[x][y] = ((Map.BlockType) map.at(x, y, Map.Layer.BLOCKS)).ordinal() + 2;
70+
}
71+
}
72+
var assets = new SourceLevel.Asset[]{
73+
new SourceLevel.Asset("grass-short", false, 0),
74+
new SourceLevel.Asset("grass-tall", false, 1),
75+
new SourceLevel.Asset("bush", true, 0),
76+
new SourceLevel.Asset("wave", true, 1),
77+
};
78+
listener.emit(new Message<>(Message.Type.LEVEL,
79+
new SourceLevel(width, height, layers, player.x(), player.y(), player.viewport(), assets)));
6680
}
6781

6882
private void change(State state) {
@@ -113,7 +127,7 @@ private void actionTo(int x, int y) {
113127
map.set(x, y, Map.Layer.EVENTS, null);
114128
}
115129
}
116-
emitRefresh();
130+
emitLevel();
117131
} else {
118132
change(State.BATTLE);
119133
if (userAttacked) {
@@ -139,7 +153,7 @@ private void actionTo(int x, int y) {
139153
change(State.BATTLE);
140154
}
141155
}
142-
emitRefresh();
156+
emitLevel();
143157
}
144158
}
145159

engine/src/main/java/ru/base/game/engine/Listener.java

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package ru.base.game.engine;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
5+
public record Message<S extends Message.Source>(@SerializedName("type") Type type, @SerializedName("source") S source) {
6+
public enum Type {
7+
LEVEL
8+
}
9+
10+
@FunctionalInterface
11+
public interface Listener {
12+
<S extends Source> void emit(Message<S> message);
13+
}
14+
15+
public interface Source {
16+
17+
}
18+
}

engine/src/main/java/ru/base/game/engine/Player.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ public int y() {
2020
return y;
2121
}
2222

23-
public int visibleRadius() {
24-
return 3;
23+
public int viewport() {
24+
return 20;
2525
}
2626

2727
@Override
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package ru.base.game.engine.messages;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import ru.base.game.engine.Message;
5+
6+
public record SourceLevel(@SerializedName("width") int width,
7+
@SerializedName("height") int height,
8+
@SerializedName("layout") int[][] layers,
9+
@SerializedName("x") int x,
10+
@SerializedName("y") int y,
11+
@SerializedName("viewport") int viewport,
12+
@SerializedName("assets") Asset[] assets) implements Message.Source {
13+
public record Asset(@SerializedName("file_name") String name,
14+
@SerializedName("collision") boolean collision,
15+
@SerializedName("frames") int frames) {
16+
17+
}
18+
}

server/src/main/java/ru/base/game/server/service/GameCircle.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
package ru.base.game.server.service;
22

33
import ru.base.game.engine.Game;
4-
import ru.base.game.engine.Listener;
5-
import ru.base.game.engine.Map;
6-
import ru.base.game.engine.Player;
4+
import ru.base.game.engine.Message;
75
import ru.base.game.server.dto.EventObject;
8-
import ru.base.game.server.dto.RefreshObject;
96

107
import java.time.LocalDateTime;
8+
import java.util.Locale;
119
import java.util.concurrent.atomic.AtomicBoolean;
1210

1311
@SuppressWarnings({"PMD.UnusedPrivateField", "PMD.EmptyCatchBlock"})
14-
public final class GameCircle implements Runnable, Listener {
12+
public final class GameCircle implements Runnable, Message.Listener {
1513
final String username;
1614
final Game game;
1715
private final AtomicBoolean running = new AtomicBoolean(true);
@@ -50,11 +48,8 @@ public void run() {
5048
}
5149

5250
@Override
53-
public <E> void emit(Event<E> event) {
54-
if (event instanceof Refresh refresh) {
55-
Player player = refresh.player();
56-
Map.Coordinated<Map.Matrix> matrix = refresh.data().matrix(player.x(), player.y(), player.visibleRadius());
57-
userGameService.sendEvent(username, new EventObject<>("refresh", new RefreshObject(player, matrix.source())));
58-
}
51+
public <S extends Message.Source> void emit(Message<S> message) {
52+
userGameService.sendEvent(username, new EventObject<>(
53+
message.type().name().toLowerCase(Locale.ROOT), message.source()));
5954
}
6055
}

server/src/main/resources/web/js/map.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const Map = function () {
77

88

99
Map.prototype = {
10-
refresh: function (data) {
10+
initiate: function (data) {
1111
map.data = data;
1212
map.width = data.width;
1313
map.height = data.height;

server/src/main/resources/web/js/player.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const Player = function(tile_x, tile_y) {
2020
y: tile_y
2121
};
2222
this.torch = {
23-
lit: false,
23+
lit: true,
2424
frame: 0
2525
};
2626
};
@@ -51,7 +51,7 @@ Player.prototype = {
5151
let light_x = pos_x + (config.size.tile / 2);
5252
let light_y = pos_y + (config.size.tile / 2);
5353

54-
let radius = 100;
54+
let radius = map.data.viewport;
5555
let radialGradient = context.createRadialGradient(light_x, light_y, 0, light_x, light_y, radius);
5656

5757
radialGradient.addColorStop(0, "rgba(238, 229, 171, 0.325)");

server/src/main/resources/web/js/ws.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ function OnWebSocket() {
2121
console.error(error);
2222
return;
2323
}
24-
if (output.type === "refresh") {
25-
map.refresh(output.data);
26-
player.pos.x = output.data.player.x;
27-
player.pos.y = output.data.player.y;
24+
if (output.type === "level") {
25+
player.pos.x = output.data.x * config.size.char;
26+
player.pos.y = output.data.y * config.size.char;
27+
map.initiate(output.data);
2828
}
2929
console.log(output);
3030
}

0 commit comments

Comments
 (0)