[proto] update

This commit is contained in:
2020-05-25 17:29:31 +03:00
parent c878bd60d9
commit f7f6423938
17 changed files with 178 additions and 71 deletions

View File

@@ -1,20 +1,24 @@
package ru.m.puzzlez.net;
import haxe.Unserializer;
import com.hurlant.crypto.extra.UUID;
import com.hurlant.crypto.prng.Random;
import hw.connect.ConnectionFactory;
import hw.connect.IConnection;
import hw.signal.Signal;
import hw.storage.SharedObjectStorage;
import promhx.Promise;
import ru.m.data.IDataSource;
import ru.m.puzzlez.core.GameEvent;
import ru.m.puzzlez.core.GameState;
import ru.m.puzzlez.core.Id;
import ru.m.puzzlez.proto.core.GameProto;
import ru.m.puzzlez.proto.core.UserProto;
import ru.m.puzzlez.proto.pack.GameCreateRequest;
import ru.m.puzzlez.proto.pack.GameJoinRequest;
import ru.m.puzzlez.proto.pack.LoginRequest;
import ru.m.puzzlez.proto.pack.Request;
import ru.m.puzzlez.proto.pack.Response;
@:provide class Network {
@:provide class Network implements IDataIndex<ImageId> {
public var user(default, null):UserProto;
public var userSignal(default, null):Signal<UserProto> = new Signal();
@@ -33,11 +37,11 @@ import ru.m.puzzlez.proto.pack.Response;
public function new() {
gameList = [];
storage = new SharedObjectStorage("netwok");
storage = new SharedObjectStorage("network");
if (storage.exists(USER_KEY)) {
user = storage.read(USER_KEY);
} else {
user = new UserProto().setName('Anonimus #${UUID.generateRandom(new Random()).toString().split("-").shift()}');
user = new UserProto().setName('Anonimus #${IdUtil.generate()}');
storage.write(USER_KEY, user);
}
connection = ConnectionFactory.buildClientConnection("127.0.0.1", 5000, Response);
@@ -50,6 +54,14 @@ import ru.m.puzzlez.proto.pack.Response;
connection.send(new Request().setLogin(new LoginRequest().setUser(user)));
}
public function startGame(state:GameState):Void {
connection.send(new Request().setGameCreate(new GameCreateRequest().setImageId(state.preset.imageId)));
}
public function joinGame(state:GameState):Void {
connection.send(new Request().setGameJoin(new GameJoinRequest().setGameId(state.id)));
}
private function onConnectionChange(event:ConnectionEvent):Void {
L.i("network", '${event}');
switch event {
@@ -82,4 +94,14 @@ import ru.m.puzzlez.proto.pack.Response;
}
}
}
public function getIndexPage(page:Page):Promise<DataPage<ImageId>> {
// ToDo: return gameList
var data = {
page: page,
total: 1,
data: [new ImageId('asset', 'resources/image/raccoon.jpg')],
}
return Promise.promise(data);
}
}

View File

@@ -0,0 +1,41 @@
package ru.m.puzzlez.net;
import hw.signal.Signal;
import ru.m.puzzlez.core.GameState;
import ru.m.puzzlez.core.GameEvent;
import ru.m.puzzlez.core.IGame;
class NetworkGame implements IGame {
public var state(default, null):GameState;
public var signal(default, null):Signal<GameEvent>;
@:provide private var network:Network;
public function new(state:GameState) {
this.state = state;
signal = new Signal();
}
private function onEvent(event:GameEvent):Void {
signal.emit(event);
}
public function start():Void {
network.gameEventSignal.connect(onEvent);
switch state.status {
case READY:
network.startGame(state);
case _:
network.joinGame(state);
}
}
public function stop():Void {
network.gameEventSignal.disconnect(onEvent);
}
public function dispose():Void {
stop();
signal.dispose();
}
}

View File

@@ -9,6 +9,7 @@ import ru.m.puzzlez.core.Game;
import ru.m.puzzlez.core.GameEvent;
import ru.m.puzzlez.core.GameState;
import ru.m.puzzlez.core.IGame;
import ru.m.puzzlez.net.NetworkGame;
import ru.m.puzzlez.render.IRender;
import ru.m.puzzlez.storage.GameStorage;
import ru.m.puzzlez.storage.SettingsStorage;
@@ -32,7 +33,11 @@ import ru.m.puzzlez.view.popup.PreviewPopup;
override public function onShow(state:GameState):Void {
onHide();
game = new Game(state);
if (state.online) {
game = new NetworkGame(state);
} else {
game = new Game(state);
}
game.signal.connect(render.onGameEvent);
game.signal.connect(onGameEvent);
render.signal.connect(game.signal.emit);

View File

@@ -1,5 +1,6 @@
package ru.m.puzzlez.view;
import ru.m.puzzlez.net.Network;
import hw.geom.IntPoint;
import hw.view.data.DataView;
import hw.view.form.ToggleButtonView;
@@ -18,6 +19,7 @@ import ru.m.puzzlez.view.common.PresetView;
@:provide var imageStorage:ImageStorage;
@:provide var switcher:FrameSwitcher;
@:provide var network:Network;
private var imageId:ImageId;
@@ -53,7 +55,8 @@ import ru.m.puzzlez.view.common.PresetView;
selectSize(sizesView.data[sizesView.data.length - 1]);
}
private function start():Void {
private function start(online:Bool = false):Void {
imageView.state.online = online;
switcher.change(GameFrame.ID, imageView.state);
}

View File

@@ -24,6 +24,11 @@ views:
geometry.margin.left: 15
text: Start
+onPress: ~start()
- $type: hw.view.form.ButtonView
style: button.active
geometry.margin.left: 15
text: Network
+onPress: ~start(true)
- id: image
$type: ru.m.puzzlez.view.common.PresetView
geometry.stretch: true

View File

@@ -1,5 +1,6 @@
package ru.m.puzzlez.view;
import ru.m.puzzlez.net.Network;
import hw.view.data.DataView;
import hw.view.form.ButtonView;
import hw.view.frame.FrameSwitcher;
@@ -26,6 +27,7 @@ import ru.m.update.Updater;
@:provide var storage:ImageStorage;
@:provide var switcher:FrameSwitcher;
@:provide var gameStorage:GameStorage;
@:provide var network:Network;
@:provide static var appUpdater:Updater;
public function new() {
@@ -75,7 +77,11 @@ import ru.m.update.Updater;
switcher.change(ImageListFrame.ID, source);
}
private function games(status:GameStatus):Void {
private function openGames(status:GameStatus):Void {
switcher.change(ImageListFrame.ID, gameStorage.statusSource(status));
}
private function openNetwork():Void {
switcher.change(ImageListFrame.ID, {title: 'Network', source: network});
}
}

View File

@@ -35,11 +35,15 @@ views:
- id: load
$type: hw.view.form.ButtonView
text: Load
+onPress: ~games('started')
+onPress: ~openGames('started')
- id: complete
$type: hw.view.form.ButtonView
text: Complete
+onPress: ~games('complete')
+onPress: ~openGames('complete')
- id: network
$type: hw.view.form.ButtonView
text: Network
+onPress: ~openNetwork()
- $type: hw.view.SpriteView
geometry.width: 100%
- $type: hw.view.form.LabelView