mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2026-04-26 04:31:40 +00:00
various fixes: platinum gem on end game, fix spawn chances, fix weird states regarding player leaves
This commit is contained in:
parent
d34bc7c363
commit
3964b43aca
8 changed files with 99 additions and 52 deletions
|
|
@ -375,9 +375,9 @@ class DifBuilder {
|
||||||
'pq_ray_wall_combo.normal.png', 'pq_ray_wall_combo.spec.png'),
|
'pq_ray_wall_combo.normal.png', 'pq_ray_wall_combo.spec.png'),
|
||||||
'multiplayer/interiors/platinumquest/pq_ray_wall_combo_2' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_2.png',
|
'multiplayer/interiors/platinumquest/pq_ray_wall_combo_2' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_2.png',
|
||||||
'pq_ray_wall_combo_2.normal.png', 'pq_ray_wall_combo_2.spec.png'),
|
'pq_ray_wall_combo_2.normal.png', 'pq_ray_wall_combo_2.spec.png'),
|
||||||
'multiplayer/interiors/platinumquest/pq_ray_wall_combo_2_medium' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_2.png',
|
'multiplayer/interiors/platinumquest/pq_ray_wall_combo_2_medium' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_2_medium.png',
|
||||||
'pq_ray_wall_combo_2.normal.png', 'pq_ray_wall_combo_2.spec.png'),
|
'pq_ray_wall_combo_2.normal.png', 'pq_ray_wall_combo_2.spec.png'),
|
||||||
'multiplayer/interiors/platinumquest/pq_ray_wall_combo_small' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo.png',
|
'multiplayer/interiors/platinumquest/pq_ray_wall_combo_small' => (onFinish) -> createPQMaterial(onFinish, 'pq_ray_wall_combo_small.png',
|
||||||
'pq_ray_wall_combo.normal.png', 'pq_ray_wall_combo.spec.png'),
|
'pq_ray_wall_combo.normal.png', 'pq_ray_wall_combo.spec.png'),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2070,10 +2070,17 @@ class MarbleWorld extends Scheduler {
|
||||||
#if js
|
#if js
|
||||||
lock = true;
|
lock = true;
|
||||||
|
|
||||||
|
var loadPerTick = 500; // Stack limits???
|
||||||
|
var loadedFuncs = 0;
|
||||||
var func = this.resourceLoadFuncs.shift();
|
var func = this.resourceLoadFuncs.shift();
|
||||||
|
|
||||||
var consumeFn;
|
var consumeFn;
|
||||||
consumeFn = () -> {
|
consumeFn = () -> {
|
||||||
|
if (loadedFuncs >= loadPerTick) {
|
||||||
|
lock = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
loadedFuncs += 1;
|
||||||
this._resourcesLoaded++;
|
this._resourcesLoaded++;
|
||||||
this.loadingGui.setProgress((1 - resourceLoadFuncs.length / _loadingLength));
|
this.loadingGui.setProgress((1 - resourceLoadFuncs.length / _loadingLength));
|
||||||
if (this.resourceLoadFuncs.length != 0) {
|
if (this.resourceLoadFuncs.length != 0) {
|
||||||
|
|
|
||||||
|
|
@ -141,15 +141,23 @@ class MPEndGameGui extends GuiImage {
|
||||||
middleCtrl.extent = new Vector(800, 480);
|
middleCtrl.extent = new Vector(800, 480);
|
||||||
this.addChild(middleCtrl);
|
this.addChild(middleCtrl);
|
||||||
|
|
||||||
|
var hasPlatinum = false;
|
||||||
|
var scores = @:privateAccess MarbleGame.instance.world.playGui.playerList;
|
||||||
|
for (player in scores) {
|
||||||
|
if (player.p > 0) {
|
||||||
|
hasPlatinum = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var headerML = new GuiText(domcasual36);
|
var headerML = new GuiText(domcasual36);
|
||||||
headerML.position = new Vector(25, 83);
|
headerML.position = new Vector(25, 83);
|
||||||
headerML.extent = new Vector(750, 14);
|
headerML.extent = new Vector(750, 14);
|
||||||
headerML.horizSizing = Width;
|
headerML.horizSizing = Width;
|
||||||
headerML.text.textColor = 0xFFFFFF;
|
headerML.text.textColor = 0xFFFFFF;
|
||||||
headerML.text.text = " Name Score Marble";
|
headerML.text.text = ' Name Score ${hasPlatinum ? " " : ""} Marble';
|
||||||
middleCtrl.addChild(headerML);
|
middleCtrl.addChild(headerML);
|
||||||
|
|
||||||
var scores = @:privateAccess MarbleGame.instance.world.playGui.playerList;
|
|
||||||
var ourRank = scores.indexOf(scores.filter(x -> x.us == true)[0]) + 1;
|
var ourRank = scores.indexOf(scores.filter(x -> x.us == true)[0]) + 1;
|
||||||
var rankSuffix = ourRank == 1 ? "st" : (ourRank == 2 ? "nd" : (ourRank == 3 ? "rd" : "th"));
|
var rankSuffix = ourRank == 1 ? "st" : (ourRank == 2 ? "nd" : (ourRank == 3 ? "rd" : "th"));
|
||||||
|
|
||||||
|
|
@ -181,6 +189,10 @@ class MPEndGameGui extends GuiImage {
|
||||||
middleCtrl.addChild(yellowGem);
|
middleCtrl.addChild(yellowGem);
|
||||||
var blueGem = buildObjectShow("data/shapes/items/gem.dts", new Vector(469, 65), new Vector(64, 64), 2.5, 0, ["base.gem" => "blue.gem"]);
|
var blueGem = buildObjectShow("data/shapes/items/gem.dts", new Vector(469, 65), new Vector(64, 64), 2.5, 0, ["base.gem" => "blue.gem"]);
|
||||||
middleCtrl.addChild(blueGem);
|
middleCtrl.addChild(blueGem);
|
||||||
|
if (hasPlatinum) {
|
||||||
|
var platinumGem = buildObjectShow("data/shapes/items/gem.dts", new Vector(521, 65), new Vector(64, 64), 2.5, 0, ["base.gem" => "platinum.gem"]);
|
||||||
|
middleCtrl.addChild(platinumGem);
|
||||||
|
}
|
||||||
|
|
||||||
var playerContainer = new GuiControl();
|
var playerContainer = new GuiControl();
|
||||||
playerContainer.horizSizing = Center;
|
playerContainer.horizSizing = Center;
|
||||||
|
|
@ -191,7 +203,7 @@ class MPEndGameGui extends GuiImage {
|
||||||
|
|
||||||
var idx = 0;
|
var idx = 0;
|
||||||
|
|
||||||
function addPlayer(rank:Int, playerName:String, score:Int, r:Int, y:Int, b:Int, marbleCat:Int, marbleSel:Int) {
|
function addPlayer(rank:Int, playerName:String, score:Int, r:Int, y:Int, b:Int, p:Int, marbleCat:Int, marbleSel:Int) {
|
||||||
var container = new GuiControl();
|
var container = new GuiControl();
|
||||||
container.position = new Vector(0, 44 * idx);
|
container.position = new Vector(0, 44 * idx);
|
||||||
container.extent = new Vector(750, 44);
|
container.extent = new Vector(750, 44);
|
||||||
|
|
@ -227,16 +239,27 @@ class MPEndGameGui extends GuiImage {
|
||||||
container.addChild(playerY);
|
container.addChild(playerY);
|
||||||
|
|
||||||
var playerB = new GuiText(domcasual36);
|
var playerB = new GuiText(domcasual36);
|
||||||
playerB.text.textColor = 0x0000FF;
|
playerB.text.textColor = 0x4040FF;
|
||||||
playerB.text.text = '${b}';
|
playerB.text.text = '${b}';
|
||||||
playerB.justify = Center;
|
playerB.justify = Center;
|
||||||
playerB.position = new Vector(452, 3);
|
playerB.position = new Vector(452, 3);
|
||||||
playerB.extent = new Vector(52, 14);
|
playerB.extent = new Vector(52, 14);
|
||||||
container.addChild(playerB);
|
container.addChild(playerB);
|
||||||
|
|
||||||
var marble = buildObjectShow(MarbleSelectGui.marbleData[marbleCat][marbleSel].dts, new Vector(524, -10), new Vector(64, 64), 2.4, 0, [
|
if (hasPlatinum) {
|
||||||
"base.marble" => MarbleSelectGui.marbleData[marbleCat][marbleSel].skin + ".marble"
|
var playerB = new GuiText(domcasual36);
|
||||||
]);
|
playerB.text.textColor = 0xCCCCCC;
|
||||||
|
playerB.text.text = '${p}';
|
||||||
|
playerB.justify = Center;
|
||||||
|
playerB.position = new Vector(504, 3);
|
||||||
|
playerB.extent = new Vector(52, 14);
|
||||||
|
container.addChild(playerB);
|
||||||
|
}
|
||||||
|
|
||||||
|
var marble = buildObjectShow(MarbleSelectGui.marbleData[marbleCat][marbleSel].dts, new Vector((hasPlatinum ? 52 : 0) + 524, -10),
|
||||||
|
new Vector(64, 64), 2.4, 0, [
|
||||||
|
"base.marble" => MarbleSelectGui.marbleData[marbleCat][marbleSel].skin + ".marble"
|
||||||
|
]);
|
||||||
|
|
||||||
container.addChild(marble);
|
container.addChild(marble);
|
||||||
|
|
||||||
|
|
@ -255,7 +278,7 @@ class MPEndGameGui extends GuiImage {
|
||||||
marb = c.marbleId;
|
marb = c.marbleId;
|
||||||
}
|
}
|
||||||
|
|
||||||
addPlayer(r, player.name, player.score, player.r, player.y, player.b, cat, marb);
|
addPlayer(r, player.name, player.score, player.r, player.y, player.b, player.p, cat, marb);
|
||||||
r += 1;
|
r += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,10 @@ class MPPreGameDlg extends GuiControl {
|
||||||
leaveBtn.extent = new Vector(94, 45);
|
leaveBtn.extent = new Vector(94, 45);
|
||||||
leaveBtn.pressedAction = (e) -> {
|
leaveBtn.pressedAction = (e) -> {
|
||||||
MarbleGame.instance.quitMission(true);
|
MarbleGame.instance.quitMission(true);
|
||||||
|
if (Net.isMP && Net.isClient) {
|
||||||
|
Net.disconnect();
|
||||||
|
MarbleGame.canvas.setContent(new JoinServerGui());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dialogImg.addChild(leaveBtn);
|
dialogImg.addChild(leaveBtn);
|
||||||
|
|
||||||
|
|
@ -240,6 +244,8 @@ class MPPreGameDlg extends GuiControl {
|
||||||
ready: Net.lobbyHostReady,
|
ready: Net.lobbyHostReady,
|
||||||
spectate: Net.hostSpectate
|
spectate: Net.hostSpectate
|
||||||
});
|
});
|
||||||
|
spectateBtn.pressed = Net.hostSpectate;
|
||||||
|
readyBtn.pressed = Net.lobbyHostReady;
|
||||||
}
|
}
|
||||||
if (Net.isClient) {
|
if (Net.isClient) {
|
||||||
playerListArr.push({
|
playerListArr.push({
|
||||||
|
|
@ -247,6 +253,8 @@ class MPPreGameDlg extends GuiControl {
|
||||||
ready: Net.lobbyClientReady,
|
ready: Net.lobbyClientReady,
|
||||||
spectate: Net.clientSpectate
|
spectate: Net.clientSpectate
|
||||||
});
|
});
|
||||||
|
spectateBtn.pressed = Net.clientSpectate;
|
||||||
|
readyBtn.pressed = Net.lobbyClientReady;
|
||||||
}
|
}
|
||||||
if (Net.clientIdMap != null) {
|
if (Net.clientIdMap != null) {
|
||||||
for (c => v in Net.clientIdMap) {
|
for (c => v in Net.clientIdMap) {
|
||||||
|
|
@ -279,6 +287,12 @@ class MPPreGameDlg extends GuiControl {
|
||||||
playerListLeft.setTexts(playerListCompiled);
|
playerListLeft.setTexts(playerListCompiled);
|
||||||
playerListRight.setTexts(playerListStateCompiled);
|
playerListRight.setTexts(playerListStateCompiled);
|
||||||
|
|
||||||
|
if (playerListArr.length == 1) {
|
||||||
|
// Disable spectating
|
||||||
|
Net.hostSpectate = false;
|
||||||
|
Net.clientSpectate = false;
|
||||||
|
}
|
||||||
|
|
||||||
// if (!showingCustoms)
|
// if (!showingCustoms)
|
||||||
// playerList.setTexts(playerListArr.map(player -> {
|
// playerList.setTexts(playerListArr.map(player -> {
|
||||||
// return '<img src="${player.state ? "ready" : "notready"}"></img><img src="${platformToString(player.platform)}"></img>${player.name}';
|
// return '<img src="${player.state ? "ready" : "notready"}"></img><img src="${platformToString(player.platform)}"></img>${player.name}';
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ class PlayerInfo {
|
||||||
var r:Int;
|
var r:Int;
|
||||||
var y:Int;
|
var y:Int;
|
||||||
var b:Int;
|
var b:Int;
|
||||||
|
var p:Int;
|
||||||
}
|
}
|
||||||
|
|
||||||
class PlayGui {
|
class PlayGui {
|
||||||
|
|
@ -724,7 +725,8 @@ class PlayGui {
|
||||||
score: 0,
|
score: 0,
|
||||||
r: 0,
|
r: 0,
|
||||||
y: 0,
|
y: 0,
|
||||||
b: 0
|
b: 0,
|
||||||
|
p: 0
|
||||||
});
|
});
|
||||||
redrawPlayerList();
|
redrawPlayerList();
|
||||||
}
|
}
|
||||||
|
|
@ -752,6 +754,9 @@ class PlayGui {
|
||||||
if (score == 5) {
|
if (score == 5) {
|
||||||
f[0].b += 1;
|
f[0].b += 1;
|
||||||
}
|
}
|
||||||
|
if (score == 10) {
|
||||||
|
f[0].p += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id == Net.clientId) {
|
if (id == Net.clientId) {
|
||||||
|
|
@ -769,6 +774,7 @@ class PlayGui {
|
||||||
player.r = scoreboardPacket.rBoard.exists(player.id) ? scoreboardPacket.rBoard.get(player.id) : 0;
|
player.r = scoreboardPacket.rBoard.exists(player.id) ? scoreboardPacket.rBoard.get(player.id) : 0;
|
||||||
player.y = scoreboardPacket.yBoard.exists(player.id) ? scoreboardPacket.yBoard.get(player.id) : 0;
|
player.y = scoreboardPacket.yBoard.exists(player.id) ? scoreboardPacket.yBoard.get(player.id) : 0;
|
||||||
player.b = scoreboardPacket.bBoard.exists(player.id) ? scoreboardPacket.bBoard.get(player.id) : 0;
|
player.b = scoreboardPacket.bBoard.exists(player.id) ? scoreboardPacket.bBoard.get(player.id) : 0;
|
||||||
|
player.p = scoreboardPacket.pBoard.exists(player.id) ? scoreboardPacket.pBoard.get(player.id) : 0;
|
||||||
}
|
}
|
||||||
redrawPlayerList();
|
redrawPlayerList();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -228,7 +228,7 @@ class HuntMode extends NullMode {
|
||||||
}
|
}
|
||||||
|
|
||||||
override function getPreloadFiles() {
|
override function getPreloadFiles() {
|
||||||
return ['data/sound/opponentdiamond.wav'];
|
return ['data/sound/opponentdiamond.wav', 'data/sound/firewrks.wav'];
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupGems() {
|
function setupGems() {
|
||||||
|
|
@ -285,33 +285,36 @@ class HuntMode extends NullMode {
|
||||||
var pos = furthest.gem.getAbsPos().getPosition();
|
var pos = furthest.gem.getAbsPos().getPosition();
|
||||||
|
|
||||||
var results = [];
|
var results = [];
|
||||||
var search = gemOctree.radiusSearch(pos, gemGroupRadius);
|
while (results.length == 0) {
|
||||||
for (elem in search) {
|
var search = gemOctree.radiusSearch(pos, gemGroupRadius);
|
||||||
var gemElem:GemSpawnPoint = cast elem;
|
for (elem in search) {
|
||||||
var gemPos = gemElem.gem.getAbsPos().getPosition();
|
var gemElem:GemSpawnPoint = cast elem;
|
||||||
|
var gemPos = gemElem.gem.getAbsPos().getPosition();
|
||||||
|
|
||||||
if (level.mission.missionInfo.game == "PlatinumQuest") {
|
if (level.mission.missionInfo.game == "PlatinumQuest") {
|
||||||
// Spawn chances!
|
// Spawn chances!
|
||||||
var chance = switch (gemElem.gem.gemColor) {
|
var chance = switch (gemElem.gem.gemColor.toLowerCase()) {
|
||||||
case "red":
|
case "red.gem":
|
||||||
level.mission.missionInfo.spawnchancered != null ? Std.parseFloat(level.mission.missionInfo.spawnchancered) : 0.9;
|
level.mission.missionInfo.spawnchancered != null ? Std.parseFloat(level.mission.missionInfo.spawnchancered) : 0.9;
|
||||||
case "yellow":
|
case "yellow.gem":
|
||||||
level.mission.missionInfo.spawnchanceyellow != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceyellow) : 0.65;
|
level.mission.missionInfo.spawnchanceyellow != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceyellow) : 0.65;
|
||||||
case "blue":
|
case "blue.gem":
|
||||||
level.mission.missionInfo.spawnchanceblue != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceblue) : 0.35;
|
level.mission.missionInfo.spawnchanceblue != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceblue) : 0.35;
|
||||||
case "platinum":
|
case "platinum.gem":
|
||||||
level.mission.missionInfo.spawnchanceplatinum != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceplatinum) : 0.18;
|
level.mission.missionInfo.spawnchanceplatinum != null ? Std.parseFloat(level.mission.missionInfo.spawnchanceplatinum) : 0.18;
|
||||||
default:
|
default:
|
||||||
1.0;
|
1.0;
|
||||||
};
|
};
|
||||||
if (Math.random() > chance)
|
var choice = Math.random();
|
||||||
continue; // Don't spawn!
|
if (choice > chance)
|
||||||
|
continue; // Don't spawn!
|
||||||
|
}
|
||||||
|
|
||||||
|
results.push({
|
||||||
|
gem: gemElem.netIndex,
|
||||||
|
weight: this.gemGroupRadius - gemPos.distance(pos) + rng.randRange(0, getGemWeight(gemElem.gem) + 3)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
results.push({
|
|
||||||
gem: gemElem.netIndex,
|
|
||||||
weight: this.gemGroupRadius - gemPos.distance(pos) + rng.randRange(0, getGemWeight(gemElem.gem) + 3)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
results.sort((a, b) -> {
|
results.sort((a, b) -> {
|
||||||
if (a.weight > b.weight)
|
if (a.weight > b.weight)
|
||||||
|
|
@ -437,13 +440,14 @@ class HuntMode extends NullMode {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getGemWeight(gem:Gem) {
|
function getGemWeight(gem:Gem) {
|
||||||
if (gem.gemColor == "red")
|
var col = gem.gemColor.toLowerCase();
|
||||||
|
if (col == "red.gem")
|
||||||
return 0;
|
return 0;
|
||||||
if (gem.gemColor == "yellow")
|
if (col == "yellow.gem")
|
||||||
return 1;
|
return 1;
|
||||||
if (gem.gemColor == "blue")
|
if (col == "blue.gem")
|
||||||
return 4;
|
return 4;
|
||||||
if (gem.gemColor == "platinum")
|
if (col == "platinum.gem")
|
||||||
return 9;
|
return 9;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -284,17 +284,6 @@ class NetCommands {
|
||||||
var conn = Net.clientIdMap.get(clientId);
|
var conn = Net.clientIdMap.get(clientId);
|
||||||
if (MarbleGame.instance.world != null) {
|
if (MarbleGame.instance.world != null) {
|
||||||
MarbleGame.instance.world.removePlayer(conn);
|
MarbleGame.instance.world.removePlayer(conn);
|
||||||
|
|
||||||
var allReady = true;
|
|
||||||
for (id => client in Net.clientIdMap) {
|
|
||||||
if (client.state != GameplayState.GAME && client != conn) {
|
|
||||||
allReady = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (allReady && MarbleGame.instance.world.serverStartTicks == 0) {
|
|
||||||
MarbleGame.instance.world.allClientsReady();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Net.clientIdMap.remove(clientId);
|
Net.clientIdMap.remove(clientId);
|
||||||
if (MarbleGame.canvas.content is MPPlayMissionGui) {
|
if (MarbleGame.canvas.content is MPPlayMissionGui) {
|
||||||
|
|
|
||||||
|
|
@ -317,12 +317,14 @@ class ScoreboardPacket implements NetPacket {
|
||||||
var rBoard:Map<Int, Int>;
|
var rBoard:Map<Int, Int>;
|
||||||
var yBoard:Map<Int, Int>;
|
var yBoard:Map<Int, Int>;
|
||||||
var bBoard:Map<Int, Int>;
|
var bBoard:Map<Int, Int>;
|
||||||
|
var pBoard:Map<Int, Int>;
|
||||||
|
|
||||||
public function new() {
|
public function new() {
|
||||||
scoreBoard = new Map();
|
scoreBoard = new Map();
|
||||||
rBoard = new Map();
|
rBoard = new Map();
|
||||||
yBoard = new Map();
|
yBoard = new Map();
|
||||||
bBoard = new Map();
|
bBoard = new Map();
|
||||||
|
pBoard = new Map();
|
||||||
}
|
}
|
||||||
|
|
||||||
public inline function deserialize(b:InputBitStream) {
|
public inline function deserialize(b:InputBitStream) {
|
||||||
|
|
@ -333,6 +335,7 @@ class ScoreboardPacket implements NetPacket {
|
||||||
rBoard[id] = b.readInt(10);
|
rBoard[id] = b.readInt(10);
|
||||||
yBoard[id] = b.readInt(10);
|
yBoard[id] = b.readInt(10);
|
||||||
bBoard[id] = b.readInt(10);
|
bBoard[id] = b.readInt(10);
|
||||||
|
pBoard[id] = b.readInt(10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -347,6 +350,7 @@ class ScoreboardPacket implements NetPacket {
|
||||||
b.writeInt(rBoard[key], 10);
|
b.writeInt(rBoard[key], 10);
|
||||||
b.writeInt(yBoard[key], 10);
|
b.writeInt(yBoard[key], 10);
|
||||||
b.writeInt(bBoard[key], 10);
|
b.writeInt(bBoard[key], 10);
|
||||||
|
b.writeInt(pBoard[key], 10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue