Commit 5880e010 authored by Tt's avatar Tt

修改效果

parent 9d26ddce
...@@ -19,6 +19,7 @@ export default class Game { ...@@ -19,6 +19,7 @@ export default class Game {
public playerScore: number; public playerScore: number;
public robotScore: number; public robotScore: number;
public robotLevel: number; public robotLevel: number;
public audioing: boolean;
constructor() { constructor() {
// //
this.start = false; this.start = false;
...@@ -34,6 +35,7 @@ export default class Game { ...@@ -34,6 +35,7 @@ export default class Game {
this.playerScore = null; this.playerScore = null;
this.robotScore = null; this.robotScore = null;
this.robotLevel = null; this.robotLevel = null;
this.audioing = false;
} }
public start: boolean; public start: boolean;
reset() { reset() {
...@@ -41,6 +43,7 @@ export default class Game { ...@@ -41,6 +43,7 @@ export default class Game {
this.lists = JSON.parse(JSON.stringify(this.data.list)); this.lists = JSON.parse(JSON.stringify(this.data.list));
this.pause = false; this.pause = false;
this.isRobot = false; this.isRobot = false;
this.audioing = false;
this.playerScore = 0; this.playerScore = 0;
this.robotScore = 0; this.robotScore = 0;
let rand = Math.random(); let rand = Math.random();
...@@ -57,11 +60,29 @@ export default class Game { ...@@ -57,11 +60,29 @@ export default class Game {
this.robotScore++; this.robotScore++;
} else { } else {
this.playerScore++; this.playerScore++;
this.nowStem.stem.times--;
} }
this.nowStem.stem.times--; // if (this.nowStem.stem.times == 0) {
// return false;
// }
this.nowStem = null; this.nowStem = null;
return true;
}
get nowAudio() {
if (!this.start) return null;
if (this.nowStem) {
return this.nowStem.stem.audio_url;
}
//每一个企鹅是什么应该在这边获取。
let items: any = this.lists.filter(li => {
return li.stem.times > 0;
});
let item = items[Math.floor(Math.random() * items.length)]
this.nowStem = item;
return item.stem.audio_url;
} }
get nowList() { get nowList() {
if (!this.start) return null;
if (this.nowStem) { if (this.nowStem) {
return this.nowStem.list; return this.nowStem.list;
} }
......
This diff is collapsed.
...@@ -67,9 +67,15 @@ export default class NewClass extends MyCocosSceneComponent { ...@@ -67,9 +67,15 @@ export default class NewClass extends MyCocosSceneComponent {
this.log("test onGameStart") this.log("test onGameStart")
Game.getIns().reset(); Game.getIns().reset();
this.scheduleOnce(() => { this.scheduleOnce(() => {
pg.event.emit("game_start_loop") // pg.event.emit("game_start_loop")
pg.event.emit("play_stem");
}, 2) }, 2)
this.schedule(this.updatePlayer, 1);
} }
updatePlayer() {
pg.event.emit("player_point_update");
}
private touchData: any; private touchData: any;
onTouchRight(data) { onTouchRight(data) {
pg.event.emit("player_point_update"); pg.event.emit("player_point_update");
...@@ -83,10 +89,18 @@ export default class NewClass extends MyCocosSceneComponent { ...@@ -83,10 +89,18 @@ export default class NewClass extends MyCocosSceneComponent {
onSpeakScueess() { onSpeakScueess() {
//执行后续的动作。 //执行后续的动作。
this.touchData && this.touchData.cbSuccess && this.touchData.cbSuccess(); this.touchData && this.touchData.cbSuccess && this.touchData.cbSuccess();
Game.getIns().addScore() Game.getIns().addScore();
pg.event.emit("player_point_update"); pg.event.emit("player_point_update");
//跳转下一个或者结束了。
if (Game.getIns().isOver) { if (Game.getIns().isOver) {
this.gameOver(); this.gameOver();
} else {
//播放题干后继续
pg.event.emit("game_stop_loop");
this.scheduleOnce(() => {
//播放题干然后继续
pg.event.emit("play_stem");
}, 0.4)
} }
} }
onSpeakFail() { onSpeakFail() {
......
...@@ -61,16 +61,14 @@ export default class NewClass extends cc.Component { ...@@ -61,16 +61,14 @@ export default class NewClass extends cc.Component {
}).start(); }).start();
cc.tween(this.panel_text).to(0.2, { opacity: 255 }).delay(2.4).to(0.2, { opacity: 0 }).start(); cc.tween(this.panel_text).to(0.2, { opacity: 255 }).delay(2.4).to(0.2, { opacity: 0 }).start();
let point = 6 - Game.getIns().robotLevel;// let wait = Game.getIns().robotLevel * 0.65;//
if (data.right == "1") { if (data.right == "1") {
if (Math.random() * point >= 3) { let time = 0.4 + wait + Math.random() * 2;
let time = 0.4 + Math.random() * 2 + Game.getIns().robotLevel * 0.65; this.scheduleOnce(() => {
this.scheduleOnce(() => { if (this.touched) return;
if (this.touched) return; Game.getIns().isRobot = true;
Game.getIns().isRobot = true; this.onTouchText();
this.onTouchText(); }, time);
}, time);
}
} }
} }
showSuccessAni() { showSuccessAni() {
...@@ -111,7 +109,10 @@ export default class NewClass extends cc.Component { ...@@ -111,7 +109,10 @@ export default class NewClass extends cc.Component {
if (Game.getIns().isRobot) { if (Game.getIns().isRobot) {
if (data.right == "1") { if (data.right == "1") {
pg.view.visible(this.right, true); pg.view.visible(this.right, true);
pg.hw.playLocalAudio("right"); Game.getIns().audioing = true;
pg.hw.playLocalAudio("right").then(() => {
Game.getIns().audioing = false;
})
pg.view.playDBAnimation(this.right, "newAnimation", 1); pg.view.playDBAnimation(this.right, "newAnimation", 1);
pg.event.emit("item_touch_right", data); pg.event.emit("item_touch_right", data);
} }
...@@ -122,13 +123,17 @@ export default class NewClass extends cc.Component { ...@@ -122,13 +123,17 @@ export default class NewClass extends cc.Component {
Game.getIns().pause = true; Game.getIns().pause = true;
//正确 //正确
pg.view.visible(this.right, true); pg.view.visible(this.right, true);
pg.hw.playLocalAudio("right"); Game.getIns().audioing = true;
pg.hw.playLocalAudio("right").then(() => {
Game.getIns().audioing = false;
})
pg.view.playDBAnimation(this.right, "newAnimation", 1); pg.view.playDBAnimation(this.right, "newAnimation", 1);
data.cbSuccess = () => { data.cbSuccess = () => {
//执行 //执行
this.showSuccessAni(); this.showSuccessAni();
} }
data.cbFailed = () => { data.cbFailed = () => {
Game.getIns().pause = false;
this.showErrorAni(); this.showErrorAni();
} }
pg.event.emit("item_touch_right", data); pg.event.emit("item_touch_right", data);
......
...@@ -24,11 +24,15 @@ export default class NewClass extends cc.Component { ...@@ -24,11 +24,15 @@ export default class NewClass extends cc.Component {
onLoad() { onLoad() {
pg.event.on("game_start_loop", () => { this.startLoop() }) pg.event.on("game_start_loop", () => { this.startLoop() })
pg.event.on("game_stop_loop", () => { this.stopLoop() })
} }
protected onDestroy(): void { protected onDestroy(): void {
pg.event.off("game_start_loop"); pg.event.off("game_start_loop");
pg.event.off("game_stop_loop");
this.unschedule(this.createItem);
} }
startLoop() { startLoop() {
//播放一次题干后继续
this.lastId = []; this.lastId = [];
this.unschedule(this.createItem); this.unschedule(this.createItem);
this.schedule(this.createItem, 1); this.schedule(this.createItem, 1);
...@@ -36,6 +40,7 @@ export default class NewClass extends cc.Component { ...@@ -36,6 +40,7 @@ export default class NewClass extends cc.Component {
pauseLoop() { pauseLoop() {
} }
stopLoop() { stopLoop() {
this.unschedule(this.createItem);
} }
private lastId: Array<number>; private lastId: Array<number>;
createItem() { createItem() {
......
// Learn TypeScript:
// - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
// - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
// - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
import Game from "./Game";
import pg from "./pg";
const { ccclass, property } = cc._decorator;
@ccclass
export default class NewClass extends cc.Component {
// LIFE-CYCLE CALLBACKS:
onLoad() {
pg.view.touchOn(this.node, this.onTouchLaba, this);
pg.event.on("play_stem", () => {
this.onTouchLaba().then(() => {
pg.event.emit("game_start_loop")
})
});
}
protected onDestroy(): void {
this.unschedule(this.labaAni);
pg.event.off("play_stem");
}
onTouchLaba() {
return new Promise((resolve, reject) => {
this.showAni();
pg.audio.playAudioByUrl(Game.getIns().nowAudio).then(() => {
this.stopAni();
resolve('');
})
});
}
private count: number;
showAni() {
this.count = 0;
this.schedule(this.labaAni, 0.1);
}
stopAni() {
this.unschedule(this.labaAni);
this.count = 2;
this.labaAni();
}
labaAni() {
this.count++;
switch (this.count) {
case 0:
pg.view.visible(pg.view.find(this, "btn_laba2"), true);
pg.view.visible(pg.view.find(this, "btn_laba3"), false);
pg.view.visible(pg.view.find(this, "btn_laba4"), false);
break;
case 1:
pg.view.visible(pg.view.find(this, "btn_laba2"), false);
pg.view.visible(pg.view.find(this, "btn_laba3"), true);
pg.view.visible(pg.view.find(this, "btn_laba4"), false);
break;
case 2:
pg.view.visible(pg.view.find(this, "btn_laba2"), false);
pg.view.visible(pg.view.find(this, "btn_laba3"), false);
pg.view.visible(pg.view.find(this, "btn_laba4"), true);
break;
case 3:
pg.view.visible(pg.view.find(this, "btn_laba2"), false);
pg.view.visible(pg.view.find(this, "btn_laba3"), false);
pg.view.visible(pg.view.find(this, "btn_laba4"), false);
this.count = -1;
break;
}
}
// update (dt) {}
}
{
"ver": "1.0.8",
"uuid": "c069d169-b00d-461a-a11c-bde57ab6c49f",
"isPlugin": false,
"loadPluginInWeb": true,
"loadPluginInNative": true,
"loadPluginInEditor": false,
"subMetas": {}
}
\ No newline at end of file
...@@ -431,6 +431,17 @@ let pg = { ...@@ -431,6 +431,17 @@ let pg = {
} }
}, },
audio: { audio: {
playAudioByUrl(audio_url) {
return new Promise((resolve, reject) => {
if (!audio_url) return resolve(null);
cc.assetManager.loadRemote(audio_url, (err, audioClip: any) => {
const audioId = cc.audioEngine.play(audioClip, false, 0.8);
cc.audioEngine.setFinishCallback(audioId, () => {
resolve(audioClip);
});
});
});
},
stopAudio(audioId) { stopAudio(audioId) {
if (!audioId) return; if (!audioId) return;
cc.audioEngine.stopEffect(audioId); cc.audioEngine.stopEffect(audioId);
......
...@@ -31,13 +31,13 @@ export default class NewClass extends cc.Component { ...@@ -31,13 +31,13 @@ export default class NewClass extends cc.Component {
let icon_player = pg.view.find(this.player, "icon_player"); let icon_player = pg.view.find(this.player, "icon_player");
let icon_player_dice = pg.view.find(this.player, "icon_player_dice"); let icon_player_dice = pg.view.find(this.player, "icon_player_dice");
pg.view.visible(icon_player, Game.getIns().isRobot); pg.view.visible(icon_player, Game.getIns().isRobot);
pg.view.visible(icon_player_dice, !Game.getIns().isRobot); pg.view.visible(icon_player_dice, !Game.getIns().isRobot && Game.getIns().audioing);
} }
updateRobot() { updateRobot() {
let icon_robot = pg.view.find(this.robot, "icon_robot"); let icon_robot = pg.view.find(this.robot, "icon_robot");
let icon_robot_dice = pg.view.find(this.robot, "icon_robot_dice"); let icon_robot_dice = pg.view.find(this.robot, "icon_robot_dice");
pg.view.visible(icon_robot, !Game.getIns().isRobot); pg.view.visible(icon_robot, !Game.getIns().isRobot);
pg.view.visible(icon_robot_dice, Game.getIns().isRobot); pg.view.visible(icon_robot_dice, Game.getIns().isRobot && Game.getIns().audioing);
} }
updateScore() { updateScore() {
let score = pg.view.find(this, "score"); let score = pg.view.find(this, "score");
......
...@@ -55,7 +55,11 @@ export default class NewClass extends cc.Component { ...@@ -55,7 +55,11 @@ export default class NewClass extends cc.Component {
} }
private tryCount: number; private tryCount: number;
private val: string; private val: string;
private tipId: any;
open(value) { open(value) {
pg.hw.playLocalAudio("tips").then(id => {
this.tipId = id;
})
this.val = value; this.val = value;
pg.view.visible(this.btn_audio_start, true); pg.view.visible(this.btn_audio_start, true);
pg.view.visible(this.btn_audio_stop, false); pg.view.visible(this.btn_audio_stop, false);
...@@ -72,6 +76,10 @@ export default class NewClass extends cc.Component { ...@@ -72,6 +76,10 @@ export default class NewClass extends cc.Component {
} }
onTouchStart() { onTouchStart() {
if (this.tipId) {
pg.audio.stopAudio(this.tipId);
this.tipId = null;
}
pg.view.playDBAnimation(this.speak_ske, "newAnimation", 0); pg.view.playDBAnimation(this.speak_ske, "newAnimation", 0);
pg.view.visible(this.btn_audio_start, false); pg.view.visible(this.btn_audio_start, false);
pg.view.visible(this.btn_audio_stop, true); pg.view.visible(this.btn_audio_stop, true);
...@@ -96,7 +104,7 @@ export default class NewClass extends cc.Component { ...@@ -96,7 +104,7 @@ export default class NewClass extends cc.Component {
"fluency": 60, "fluency": 60,
"rhythm": 90, "rhythm": 90,
"kernel_version": "5.2.4", "kernel_version": "5.2.4",
"overall": 75, "overall": 75,//75
"integrity": 100, "integrity": 100,
"duration": "6.779", "duration": "6.779",
"rear_tone": "fall", "rear_tone": "fall",
......
export const defaultData = { export const defaultData = { "list": [{ "id": 0, "stem": { "times": 5, "audio_url": "http://staging-teach.cdn.ireadabc.com/a5fb06cfafd5c74d143d00b8cafbed2e.mp3" }, "list": [{ "id": 2001, "text": "door", "pic": "", "type": "text", "right": "1" }, { "id": 2002, "text": "ijfs", "pic": "", "type": "text", "right": "1" }, { "id": 2003, "text": "", "pic": "http://staging-teach.cdn.ireadabc.com/d0414e91f8519ece2909b15cedf23f08.png", "type": "pic", "right": "0" }, { "id": 2004, "text": "", "pic": "http://staging-teach.cdn.ireadabc.com/ae28013163687fee4124a85261a7b48f.png", "type": "pic", "right": "0" }] }, { "id": 1, "stem": { "times": 4, "audio_url": "http://staging-teach.cdn.ireadabc.com/b6400b57190622a34f1320d3e118db60.mp3" }, "list": [{ "id": 2001, "text": "window", "pic": "", "type": "text", "right": "1" }, { "id": 2002, "text": "winxa", "pic": "", "type": "text", "right": "0" }, { "id": 2003, "text": "indowa", "pic": "", "type": "text", "right": "0" }, { "id": 2004, "text": "", "pic": "http://staging-teach.cdn.ireadabc.com/444d37818d6075febadc6052af5f995b.png", "type": "pic", "right": "0" }] }] }
"list": \ No newline at end of file
[
{
"id": 0,
"stem": {
"times": 3
},
"list": [
{
"id": 2001, "text": "door", "pic": "", "type": "text", "right": "1"
},
{
"id": 2002, "text": "ijfs", "pic": "", "type": "text", "right": "0"
},
{
"id": 2003, "text": "", "pic": "http://staging-teach.cdn.ireadabc.com/d0414e91f8519ece2909b15cedf23f08.png", "type": "pic", "right": "0"
},
{
"id": 2004, "text": "", "pic": "http://staging-teach.cdn.ireadabc.com/ae28013163687fee4124a85261a7b48f.png", "type": "pic", "right": "0"
}
]
},
{
"id": 1,
"stem": {
"times": 2
},
"list":
[
{
"id": 2001, "text": "window", "pic": "", "type": "text", "right": "1"
},
{
"id": 2002, "text": "winxa", "pic": "", "type": "text", "right": "0"
},
{
"id": 2003, "text": "indowa", "pic": "", "type": "text", "right": "0"
},
{
"id": 2004, "text": "", "pic": "http://staging-teach.cdn.ireadabc.com/444d37818d6075febadc6052af5f995b.png", "type": "pic", "right": "0"
}
]
}]
}
\ No newline at end of file
{
"ver": "1.1.2",
"uuid": "0ae9eec8-3fe1-4a85-9c87-08d5a796a207",
"isBundle": false,
"bundleName": "",
"priority": 1,
"compressionType": {},
"optimizeHotUpdate": {},
"inlineSpriteFrames": {},
"isRemoteBundle": {},
"subMetas": {}
}
\ No newline at end of file
{
"ver": "2.3.5",
"uuid": "1e095c56-46f0-4e2a-85fa-ef8bdc7b21ff",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"width": 86,
"height": 92,
"platformSettings": {},
"subMetas": {
"btn_laba": {
"ver": "1.0.4",
"uuid": "5271a7b2-583c-41cc-b714-0876bb83ffb1",
"rawTextureUuid": "1e095c56-46f0-4e2a-85fa-ef8bdc7b21ff",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 86,
"height": 92,
"rawWidth": 86,
"rawHeight": 92,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}
\ No newline at end of file
{
"ver": "2.3.5",
"uuid": "a4f62460-7b97-4d17-8887-f5c04a2dd3d5",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"width": 86,
"height": 92,
"platformSettings": {},
"subMetas": {
"btn_laba2": {
"ver": "1.0.4",
"uuid": "fda205f8-4abd-4ce6-b9ac-4b6736f1296b",
"rawTextureUuid": "a4f62460-7b97-4d17-8887-f5c04a2dd3d5",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 86,
"height": 92,
"rawWidth": 86,
"rawHeight": 92,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}
\ No newline at end of file
{
"ver": "2.3.5",
"uuid": "9685ac68-3d7e-4df9-b9df-57f53ed31d76",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"width": 86,
"height": 92,
"platformSettings": {},
"subMetas": {
"btn_laba3": {
"ver": "1.0.4",
"uuid": "303081dc-74dd-4e51-8e5a-fe9c5f8ada9b",
"rawTextureUuid": "9685ac68-3d7e-4df9-b9df-57f53ed31d76",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 86,
"height": 92,
"rawWidth": 86,
"rawHeight": 92,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}
\ No newline at end of file
{
"ver": "2.3.5",
"uuid": "1b2204f0-d0b2-4895-9e1c-60aed6ccece2",
"type": "sprite",
"wrapMode": "clamp",
"filterMode": "bilinear",
"premultiplyAlpha": false,
"genMipmaps": false,
"packable": true,
"width": 86,
"height": 92,
"platformSettings": {},
"subMetas": {
"btn_laba4": {
"ver": "1.0.4",
"uuid": "c42e93ab-cedd-42b6-b2ae-21ee1fec673f",
"rawTextureUuid": "1b2204f0-d0b2-4895-9e1c-60aed6ccece2",
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 86,
"height": 92,
"rawWidth": 86,
"rawHeight": 92,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"subMetas": {}
}
}
}
\ No newline at end of file
{
"__type__": "cc.AnimationClip",
"_name": "laba",
"_objFlags": 0,
"_native": "",
"_duration": 0.7,
"sample": 30,
"speed": 1,
"wrapMode": 2,
"curveData": {
"comps": {
"cc.Sprite": {
"spriteFrame": [
{
"frame": 0,
"value": {
"__uuid__": "ba7e8674-648a-49ee-9f6f-2903e1beac33"
}
},
{
"frame": 0.16666666666666666,
"value": {
"__uuid__": "3edc4858-a88c-40ec-8e42-b8c2fb8f96c6"
}
},
{
"frame": 0.3333333333333333,
"value": {
"__uuid__": "eec66180-f070-4a45-a310-084145e34d85"
}
},
{
"frame": 0.5,
"value": {
"__uuid__": "1e09c00a-5260-4099-bbae-b9c6340aeb3f"
}
},
{
"frame": 0.6666666666666666,
"value": {
"__uuid__": "ba7e8674-648a-49ee-9f6f-2903e1beac33"
}
}
]
}
}
},
"events": []
}
\ No newline at end of file
{
"ver": "2.1.0",
"uuid": "37674e36-47b4-45c9-b5f4-a7ac1205bcac",
"subMetas": {}
}
\ No newline at end of file
...@@ -4,7 +4,10 @@ ...@@ -4,7 +4,10 @@
<div style="border: 1px solid #000;margin:10px;padding:20px"> <div style="border: 1px solid #000;margin:10px;padding:20px">
<h1>第 {{ i+1 }}题</h1> <h1>第 {{ i+1 }}题</h1>
<hr /> <hr />
<h2>回答正确次数【小朋友和机器人回答正确均消耗次数】</h2> <h2>题干音频</h2>
<app-audio-recorder [audioUrl]="li.stem.audio_url" (audioUploaded)="onAudioUploadSuccess($event, li)">
</app-audio-recorder>
<h2>回答正确次数</h2>
<input type="number" nz-input [(ngModel)]="li.stem.times" (blur)="save()"> <input type="number" nz-input [(ngModel)]="li.stem.times" (blur)="save()">
<hr /> <hr />
<div style="display: flex;flex-wrap: wrap;"> <div style="display: flex;flex-wrap: wrap;">
......
...@@ -84,6 +84,7 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -84,6 +84,7 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
return { return {
id: this.item.list.length, id: this.item.list.length,
stem: { stem: {
audio_url: "",
times: 1, times: 1,
}, },
list: [{ list: [{
...@@ -149,8 +150,9 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy { ...@@ -149,8 +150,9 @@ export class FormComponent implements OnInit, OnChanges, OnDestroy {
* 储存音频数据 * 储存音频数据
* @param e * @param e
*/ */
onAudioUploadSuccess(e, key) { onAudioUploadSuccess(e, li) {
this.item[key] = e.url; li.stem.audio_url = e.url;
// this.item[key] = e.url;
this.save(); this.save();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment