|
|
@@ -46,17 +46,7 @@ namespace Client |
|
|
isClientStocked = true; |
|
|
isClientStocked = true; |
|
|
isPlaybackMode = false; |
|
|
isPlaybackMode = false; |
|
|
isSpectatorMode = false; |
|
|
isSpectatorMode = false; |
|
|
lockOfProp = new(); |
|
|
|
|
|
lockOfStudent = new(); |
|
|
|
|
|
lockOfTricker = new(); |
|
|
|
|
|
lockOfBullet = new(); |
|
|
|
|
|
lockOfBombedBullet = new(); |
|
|
|
|
|
lockOfAll = new(); |
|
|
|
|
|
lockOfChest = new(); |
|
|
|
|
|
lockOfClassroom = new(); |
|
|
|
|
|
lockOfDoor = new(); |
|
|
|
|
|
lockOfGate = new(); |
|
|
|
|
|
lockOfHiddenGate = new(); |
|
|
|
|
|
|
|
|
drawPicLock = new(); |
|
|
listOfProp = new List<MessageOfProp>(); |
|
|
listOfProp = new List<MessageOfProp>(); |
|
|
listOfHuman = new List<MessageOfStudent>(); |
|
|
listOfHuman = new List<MessageOfStudent>(); |
|
|
listOfButcher = new List<MessageOfTricker>(); |
|
|
listOfButcher = new List<MessageOfTricker>(); |
|
|
@@ -122,7 +112,7 @@ namespace Client |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
_ = Parser.Default.ParseArguments<ArgumentOptions>(args).WithParsed(o => |
|
|
_ = Parser.Default.ParseArguments<ArgumentOptions>(args).WithParsed(o => |
|
|
{ options = o; }); |
|
|
|
|
|
|
|
|
{ options = o; }); |
|
|
if (options != null && Convert.ToInt64(options.PlayerID) > 2023) |
|
|
if (options != null && Convert.ToInt64(options.PlayerID) > 2023) |
|
|
{ |
|
|
{ |
|
|
isSpectatorMode = true; |
|
|
isSpectatorMode = true; |
|
|
@@ -169,7 +159,7 @@ namespace Client |
|
|
{ |
|
|
{ |
|
|
var pbClient = new PlaybackClient(fileName, pbSpeed); |
|
|
var pbClient = new PlaybackClient(fileName, pbSpeed); |
|
|
int[,]? map; |
|
|
int[,]? map; |
|
|
if ((map = pbClient.ReadDataFromFile(listOfProp, listOfHuman, listOfButcher, listOfBullet, listOfBombedBullet, listOfAll, listOfChest, listOfClassroom, listOfDoor, listOfHiddenGate, listOfGate, lockOfProp, lockOfStudent, lockOfTricker, lockOfBullet, lockOfBombedBullet, lockOfAll, lockOfChest, lockOfClassroom, lockOfDoor, lockOfHiddenGate, lockOfGate)) != null) |
|
|
|
|
|
|
|
|
if ((map = pbClient.ReadDataFromFile(listOfProp, listOfHuman, listOfButcher, listOfBullet, listOfBombedBullet, listOfAll, listOfChest, listOfClassroom, listOfDoor, listOfHiddenGate, listOfGate, drawPicLock)) != null) |
|
|
{ |
|
|
{ |
|
|
isClientStocked = false; |
|
|
isClientStocked = false; |
|
|
PorC.Content = "⏸"; |
|
|
PorC.Content = "⏸"; |
|
|
@@ -412,298 +402,160 @@ namespace Client |
|
|
{ |
|
|
{ |
|
|
while (responseStream != null && await responseStream.ResponseStream.MoveNext()) |
|
|
while (responseStream != null && await responseStream.ResponseStream.MoveNext()) |
|
|
{ |
|
|
{ |
|
|
// 加锁是必要的,画图操作和接收信息操作不能同时进行,否则画图时foreach会有bug |
|
|
|
|
|
lock (lockOfStudent) |
|
|
|
|
|
|
|
|
lock (drawPicLock) // 加锁是必要的,画图操作和接收信息操作不能同时进行,否则画图时foreach会有bug |
|
|
{ |
|
|
{ |
|
|
listOfHuman.Clear(); |
|
|
listOfHuman.Clear(); |
|
|
} |
|
|
|
|
|
lock (lockOfTricker) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfButcher.Clear(); |
|
|
listOfButcher.Clear(); |
|
|
} |
|
|
|
|
|
lock(lockOfProp) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfProp.Clear(); |
|
|
listOfProp.Clear(); |
|
|
} |
|
|
|
|
|
lock (lockOfBombedBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfBombedBullet.Clear(); |
|
|
listOfBombedBullet.Clear(); |
|
|
} |
|
|
|
|
|
lock (lockOfBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfBullet.Clear(); |
|
|
listOfBullet.Clear(); |
|
|
} |
|
|
|
|
|
lock (lockOfAll) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfAll.Clear(); |
|
|
listOfAll.Clear(); |
|
|
} |
|
|
|
|
|
lock (lockOfChest) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfChest.Clear(); |
|
|
listOfChest.Clear(); |
|
|
} |
|
|
|
|
|
lock (lockOfClassroom) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfClassroom.Clear(); |
|
|
listOfClassroom.Clear(); |
|
|
} |
|
|
|
|
|
lock (lockOfDoor) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfDoor.Clear(); |
|
|
listOfDoor.Clear(); |
|
|
} |
|
|
|
|
|
lock (lockOfHiddenGate) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfHiddenGate.Clear(); |
|
|
listOfHiddenGate.Clear(); |
|
|
} |
|
|
|
|
|
lock (lockOfGate) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfGate.Clear(); |
|
|
listOfGate.Clear(); |
|
|
} |
|
|
|
|
|
MessageToClient content = responseStream.ResponseStream.Current; |
|
|
|
|
|
switch (content.GameState) |
|
|
|
|
|
{ |
|
|
|
|
|
case GameState.GameStart: |
|
|
|
|
|
foreach (var obj in content.ObjMessage) |
|
|
|
|
|
{ |
|
|
|
|
|
switch (obj.MessageOfObjCase) |
|
|
|
|
|
|
|
|
MessageToClient content = responseStream.ResponseStream.Current; |
|
|
|
|
|
switch (content.GameState) |
|
|
|
|
|
{ |
|
|
|
|
|
case GameState.GameStart: |
|
|
|
|
|
foreach (var obj in content.ObjMessage) |
|
|
{ |
|
|
{ |
|
|
case MessageOfObj.MessageOfObjOneofCase.StudentMessage: |
|
|
|
|
|
if (humanOrButcher && obj.StudentMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
human = obj.StudentMessage; |
|
|
|
|
|
} |
|
|
|
|
|
lock (lockOfStudent) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
switch (obj.MessageOfObjCase) |
|
|
|
|
|
{ |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.StudentMessage: |
|
|
|
|
|
if (humanOrButcher && obj.StudentMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
human = obj.StudentMessage; |
|
|
|
|
|
} |
|
|
listOfHuman.Add(obj.StudentMessage); |
|
|
listOfHuman.Add(obj.StudentMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: |
|
|
|
|
|
if (!humanOrButcher && obj.TrickerMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
butcher = obj.TrickerMessage; |
|
|
|
|
|
} |
|
|
|
|
|
lock (lockOfTricker) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: |
|
|
|
|
|
if (!humanOrButcher && obj.TrickerMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
butcher = obj.TrickerMessage; |
|
|
|
|
|
} |
|
|
listOfButcher.Add(obj.TrickerMessage); |
|
|
listOfButcher.Add(obj.TrickerMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.PropMessage: |
|
|
|
|
|
lock (lockOfProp) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.PropMessage: |
|
|
listOfProp.Add(obj.PropMessage); |
|
|
listOfProp.Add(obj.PropMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: |
|
|
|
|
|
lock (lockOfBombedBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: |
|
|
listOfBombedBullet.Add(obj.BombedBulletMessage); |
|
|
listOfBombedBullet.Add(obj.BombedBulletMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BulletMessage: |
|
|
|
|
|
lock (lockOfBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BulletMessage: |
|
|
listOfBullet.Add(obj.BulletMessage); |
|
|
listOfBullet.Add(obj.BulletMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ChestMessage: |
|
|
|
|
|
lock (lockOfChest) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ChestMessage: |
|
|
listOfChest.Add(obj.ChestMessage); |
|
|
listOfChest.Add(obj.ChestMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: |
|
|
|
|
|
lock (lockOfClassroom) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: |
|
|
listOfClassroom.Add(obj.ClassroomMessage); |
|
|
listOfClassroom.Add(obj.ClassroomMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.DoorMessage: |
|
|
|
|
|
lock (lockOfDoor) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.DoorMessage: |
|
|
listOfDoor.Add(obj.DoorMessage); |
|
|
listOfDoor.Add(obj.DoorMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.GateMessage: |
|
|
|
|
|
lock (lockOfGate) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.GateMessage: |
|
|
listOfGate.Add(obj.GateMessage); |
|
|
listOfGate.Add(obj.GateMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.MapMessage: |
|
|
|
|
|
GetMap(obj.MapMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.MapMessage: |
|
|
|
|
|
GetMap(obj.MapMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfAll) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfAll.Add(content.AllMessage); |
|
|
listOfAll.Add(content.AllMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case GameState.GameRunning: |
|
|
|
|
|
foreach (var obj in content.ObjMessage) |
|
|
|
|
|
{ |
|
|
|
|
|
switch (obj.MessageOfObjCase) |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case GameState.GameRunning: |
|
|
|
|
|
foreach (var obj in content.ObjMessage) |
|
|
{ |
|
|
{ |
|
|
case MessageOfObj.MessageOfObjOneofCase.StudentMessage: |
|
|
|
|
|
if (humanOrButcher && obj.StudentMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
human = obj.StudentMessage; |
|
|
|
|
|
} |
|
|
|
|
|
lock (lockOfStudent) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
switch (obj.MessageOfObjCase) |
|
|
|
|
|
{ |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.StudentMessage: |
|
|
|
|
|
if (humanOrButcher && obj.StudentMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
human = obj.StudentMessage; |
|
|
|
|
|
} |
|
|
listOfHuman.Add(obj.StudentMessage); |
|
|
listOfHuman.Add(obj.StudentMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: |
|
|
|
|
|
if (!humanOrButcher && obj.TrickerMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
butcher = obj.TrickerMessage; |
|
|
|
|
|
} |
|
|
|
|
|
lock (lockOfTricker) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: |
|
|
|
|
|
if (!humanOrButcher && obj.TrickerMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
butcher = obj.TrickerMessage; |
|
|
|
|
|
} |
|
|
listOfButcher.Add(obj.TrickerMessage); |
|
|
listOfButcher.Add(obj.TrickerMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.PropMessage: |
|
|
|
|
|
lock (lockOfProp) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.PropMessage: |
|
|
listOfProp.Add(obj.PropMessage); |
|
|
listOfProp.Add(obj.PropMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: |
|
|
|
|
|
lock (lockOfBombedBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: |
|
|
listOfBombedBullet.Add(obj.BombedBulletMessage); |
|
|
listOfBombedBullet.Add(obj.BombedBulletMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BulletMessage: |
|
|
|
|
|
lock (lockOfBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BulletMessage: |
|
|
listOfBullet.Add(obj.BulletMessage); |
|
|
listOfBullet.Add(obj.BulletMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ChestMessage: |
|
|
|
|
|
lock (lockOfChest) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ChestMessage: |
|
|
listOfChest.Add(obj.ChestMessage); |
|
|
listOfChest.Add(obj.ChestMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: |
|
|
|
|
|
lock (lockOfClassroom) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: |
|
|
listOfClassroom.Add(obj.ClassroomMessage); |
|
|
listOfClassroom.Add(obj.ClassroomMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.DoorMessage: |
|
|
|
|
|
lock (lockOfDoor) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.DoorMessage: |
|
|
listOfDoor.Add(obj.DoorMessage); |
|
|
listOfDoor.Add(obj.DoorMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.GateMessage: |
|
|
|
|
|
lock (lockOfGate) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.GateMessage: |
|
|
listOfGate.Add(obj.GateMessage); |
|
|
listOfGate.Add(obj.GateMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.HiddenGateMessage: |
|
|
|
|
|
lock (lockOfHiddenGate) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.HiddenGateMessage: |
|
|
listOfHiddenGate.Add(obj.HiddenGateMessage); |
|
|
listOfHiddenGate.Add(obj.HiddenGateMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.MapMessage: |
|
|
|
|
|
GetMap(obj.MapMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.MapMessage: |
|
|
|
|
|
GetMap(obj.MapMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfAll) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfAll.Add(content.AllMessage); |
|
|
listOfAll.Add(content.AllMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case GameState.GameEnd: |
|
|
|
|
|
MessageBox.Show("Game Over!"); |
|
|
|
|
|
foreach (var obj in content.ObjMessage) |
|
|
|
|
|
{ |
|
|
|
|
|
switch (obj.MessageOfObjCase) |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case GameState.GameEnd: |
|
|
|
|
|
MessageBox.Show("Game Over!"); |
|
|
|
|
|
foreach (var obj in content.ObjMessage) |
|
|
{ |
|
|
{ |
|
|
case MessageOfObj.MessageOfObjOneofCase.StudentMessage: |
|
|
|
|
|
if (humanOrButcher && obj.StudentMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
human = obj.StudentMessage; |
|
|
|
|
|
} |
|
|
|
|
|
lock (lockOfStudent) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
switch (obj.MessageOfObjCase) |
|
|
|
|
|
{ |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.StudentMessage: |
|
|
listOfHuman.Add(obj.StudentMessage); |
|
|
listOfHuman.Add(obj.StudentMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: |
|
|
|
|
|
if (!humanOrButcher && obj.TrickerMessage.PlayerId == playerID) |
|
|
|
|
|
{ |
|
|
|
|
|
butcher = obj.TrickerMessage; |
|
|
|
|
|
} |
|
|
|
|
|
lock (lockOfTricker) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.TrickerMessage: |
|
|
listOfButcher.Add(obj.TrickerMessage); |
|
|
listOfButcher.Add(obj.TrickerMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.PropMessage: |
|
|
|
|
|
lock (lockOfProp) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.PropMessage: |
|
|
listOfProp.Add(obj.PropMessage); |
|
|
listOfProp.Add(obj.PropMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: |
|
|
|
|
|
lock (lockOfBombedBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BombedBulletMessage: |
|
|
listOfBombedBullet.Add(obj.BombedBulletMessage); |
|
|
listOfBombedBullet.Add(obj.BombedBulletMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BulletMessage: |
|
|
|
|
|
lock (lockOfBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.BulletMessage: |
|
|
listOfBullet.Add(obj.BulletMessage); |
|
|
listOfBullet.Add(obj.BulletMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ChestMessage: |
|
|
|
|
|
lock (lockOfChest) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ChestMessage: |
|
|
listOfChest.Add(obj.ChestMessage); |
|
|
listOfChest.Add(obj.ChestMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: |
|
|
|
|
|
lock (lockOfClassroom) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.ClassroomMessage: |
|
|
listOfClassroom.Add(obj.ClassroomMessage); |
|
|
listOfClassroom.Add(obj.ClassroomMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.DoorMessage: |
|
|
|
|
|
lock (lockOfDoor) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.DoorMessage: |
|
|
listOfDoor.Add(obj.DoorMessage); |
|
|
listOfDoor.Add(obj.DoorMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.GateMessage: |
|
|
|
|
|
lock (lockOfGate) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.GateMessage: |
|
|
listOfGate.Add(obj.GateMessage); |
|
|
listOfGate.Add(obj.GateMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.HiddenGateMessage: |
|
|
|
|
|
lock (lockOfHiddenGate) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.HiddenGateMessage: |
|
|
listOfHiddenGate.Add(obj.HiddenGateMessage); |
|
|
listOfHiddenGate.Add(obj.HiddenGateMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case MessageOfObj.MessageOfObjOneofCase.MapMessage: |
|
|
|
|
|
GetMap(obj.MapMessage); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfAll) |
|
|
|
|
|
{ |
|
|
|
|
|
listOfAll.Add(content.AllMessage); |
|
|
listOfAll.Add(content.AllMessage); |
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (responseStream == null) |
|
|
if (responseStream == null) |
|
|
{ |
|
|
{ |
|
|
@@ -720,8 +572,8 @@ namespace Client |
|
|
|
|
|
|
|
|
private bool CanSee(MessageOfStudent msg) |
|
|
private bool CanSee(MessageOfStudent msg) |
|
|
{ |
|
|
{ |
|
|
//if (msg.PlayerState == PlayerState.Quit || msg.PlayerState == PlayerState.Graduated) |
|
|
|
|
|
// return false; |
|
|
|
|
|
|
|
|
if (msg.PlayerState == PlayerState.Quit || msg.PlayerState == PlayerState.Graduated) |
|
|
|
|
|
return false; |
|
|
//if (isSpectatorMode || isPlaybackMode) |
|
|
//if (isSpectatorMode || isPlaybackMode) |
|
|
// return true; |
|
|
// return true; |
|
|
//if (humanOrButcher && human != null) |
|
|
//if (humanOrButcher && human != null) |
|
|
@@ -827,14 +679,13 @@ namespace Client |
|
|
|
|
|
|
|
|
private void Refresh(object? sender, EventArgs e) //log未更新 |
|
|
private void Refresh(object? sender, EventArgs e) //log未更新 |
|
|
{ |
|
|
{ |
|
|
//加锁是必要的,画图操作和接收信息操作不能同时进行 |
|
|
|
|
|
// Bonus(); |
|
|
|
|
|
if (WindowState == WindowState.Maximized) |
|
|
|
|
|
MaxButton.Content = "❐"; |
|
|
|
|
|
else |
|
|
|
|
|
MaxButton.Content = "🗖"; |
|
|
|
|
|
lock (lockOfStudent) |
|
|
|
|
|
|
|
|
lock (drawPicLock) // 加锁是必要的,画图操作和接收信息操作不能同时进行 |
|
|
{ |
|
|
{ |
|
|
|
|
|
// Bonus(); |
|
|
|
|
|
if (WindowState == WindowState.Maximized) |
|
|
|
|
|
MaxButton.Content = "❐"; |
|
|
|
|
|
else |
|
|
|
|
|
MaxButton.Content = "🗖"; |
|
|
foreach (var obj in listOfHuman) |
|
|
foreach (var obj in listOfHuman) |
|
|
{ |
|
|
{ |
|
|
if (!isDataFixed[obj.PlayerId] && obj.PlayerId < GameData.numOfStudent && obj.StudentType != StudentType.Robot) |
|
|
if (!isDataFixed[obj.PlayerId] && obj.PlayerId < GameData.numOfStudent && obj.StudentType != StudentType.Robot) |
|
|
@@ -852,9 +703,6 @@ namespace Client |
|
|
isDataFixed[obj.PlayerId] = true; |
|
|
isDataFixed[obj.PlayerId] = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfTricker) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var obj in listOfButcher) |
|
|
foreach (var obj in listOfButcher) |
|
|
{ |
|
|
{ |
|
|
if (!isDataFixed[obj.PlayerId]) |
|
|
if (!isDataFixed[obj.PlayerId]) |
|
|
@@ -870,41 +718,34 @@ namespace Client |
|
|
isDataFixed[obj.PlayerId] = true; |
|
|
isDataFixed[obj.PlayerId] = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < GameData.numOfStudent; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
StatusBarsOfSurvivor[i].NewData(totalLife, totalDeath, coolTime); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
for (int i = 0; i < GameData.numOfStudent; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
StatusBarsOfSurvivor[i].NewData(totalLife, totalDeath, coolTime); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
StatusBarsOfHunter.NewData(totalLife, totalDeath, coolTime); |
|
|
|
|
|
|
|
|
StatusBarsOfHunter.NewData(totalLife, totalDeath, coolTime); |
|
|
|
|
|
|
|
|
for (int i = 0; i < GameData.numOfStudent; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
StatusBarsOfSurvivor[i].SetFontSize(12 * unitFontsize); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
StatusBarsOfHunter.SetFontSize(12 * unitFontsize); |
|
|
|
|
|
StatusBarsOfCircumstance.SetFontSize(12 * unitFontsize); |
|
|
|
|
|
|
|
|
for (int i = 0; i < GameData.numOfStudent; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
StatusBarsOfSurvivor[i].SetFontSize(12 * unitFontsize); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (!isClientStocked) |
|
|
|
|
|
{ |
|
|
|
|
|
try |
|
|
|
|
|
|
|
|
StatusBarsOfHunter.SetFontSize(12 * unitFontsize); |
|
|
|
|
|
StatusBarsOfCircumstance.SetFontSize(12 * unitFontsize); |
|
|
|
|
|
if (!isClientStocked) |
|
|
{ |
|
|
{ |
|
|
UpperLayerOfMap.Children.Clear(); |
|
|
|
|
|
lock (lockOfAll) |
|
|
|
|
|
|
|
|
try |
|
|
{ |
|
|
{ |
|
|
|
|
|
UpperLayerOfMap.Children.Clear(); |
|
|
foreach (var data in listOfAll) |
|
|
foreach (var data in listOfAll) |
|
|
{ |
|
|
{ |
|
|
StatusBarsOfCircumstance.SetValue(data, gateOpened, isEmergencyDrawed, isEmergencyOpened, playerID, isPlaybackMode); |
|
|
StatusBarsOfCircumstance.SetValue(data, gateOpened, isEmergencyDrawed, isEmergencyOpened, playerID, isPlaybackMode); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
if (!hasDrawed && mapFlag) |
|
|
|
|
|
{ |
|
|
|
|
|
DrawMap(); |
|
|
|
|
|
} |
|
|
|
|
|
lock (lockOfStudent) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
if (!hasDrawed && mapFlag) |
|
|
|
|
|
{ |
|
|
|
|
|
DrawMap(); |
|
|
|
|
|
} |
|
|
foreach (var data in listOfHuman) |
|
|
foreach (var data in listOfHuman) |
|
|
{ |
|
|
{ |
|
|
if (data.StudentType != StudentType.Robot) |
|
|
if (data.StudentType != StudentType.Robot) |
|
|
@@ -922,29 +763,25 @@ namespace Client |
|
|
}; |
|
|
}; |
|
|
if (data.StudentType == StudentType.Robot) |
|
|
if (data.StudentType == StudentType.Robot) |
|
|
icon.Fill = Brushes.Gray; |
|
|
icon.Fill = Brushes.Gray; |
|
|
TextBox num = new() |
|
|
|
|
|
|
|
|
TextBlock num = new() |
|
|
{ |
|
|
{ |
|
|
FontSize = 7 * unitFontsize, |
|
|
FontSize = 7 * unitFontsize, |
|
|
Width = 2 * radiusTimes * unitWidth, |
|
|
Width = 2 * radiusTimes * unitWidth, |
|
|
Height = 2 * radiusTimes * unitHeight, |
|
|
Height = 2 * radiusTimes * unitHeight, |
|
|
Text = Convert.ToString(data.PlayerId), |
|
|
Text = Convert.ToString(data.PlayerId), |
|
|
|
|
|
TextAlignment = TextAlignment.Center, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth * radiusTimes, data.X * unitHeight / 1000.0 - unitHeight * radiusTimes, 0, 0), |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth * radiusTimes, data.X * unitHeight / 1000.0 - unitHeight * radiusTimes, 0, 0), |
|
|
Background = Brushes.Transparent, |
|
|
Background = Brushes.Transparent, |
|
|
BorderBrush = Brushes.Transparent, |
|
|
|
|
|
IsReadOnly = true, |
|
|
|
|
|
Foreground = Brushes.White, |
|
|
Foreground = Brushes.White, |
|
|
}; |
|
|
}; |
|
|
if (data.StudentType == StudentType.Robot) |
|
|
|
|
|
num.Text = Convert.ToString(data.PlayerId - Preparation.Utility.GameData.numOfPeople); |
|
|
|
|
|
|
|
|
//if (data.StudentType == StudentType.Robot) |
|
|
|
|
|
// num.Text = Convert.ToString(data.PlayerId - Preparation.Utility.GameData.numOfPeople); |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
UpperLayerOfMap.Children.Add(num); |
|
|
UpperLayerOfMap.Children.Add(num); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfTricker) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var data in listOfButcher) |
|
|
foreach (var data in listOfButcher) |
|
|
{ |
|
|
{ |
|
|
StatusBarsOfHunter.SetValue(data); |
|
|
StatusBarsOfHunter.SetValue(data); |
|
|
@@ -962,9 +799,6 @@ namespace Client |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfProp) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var data in listOfProp) |
|
|
foreach (var data in listOfProp) |
|
|
{ |
|
|
{ |
|
|
if (CanSee(data)) |
|
|
if (CanSee(data)) |
|
|
@@ -1001,9 +835,6 @@ namespace Client |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var data in listOfBullet) |
|
|
foreach (var data in listOfBullet) |
|
|
{ |
|
|
{ |
|
|
if (CanSee(data)) |
|
|
if (CanSee(data)) |
|
|
@@ -1033,9 +864,6 @@ namespace Client |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfBombedBullet) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var data in listOfBombedBullet) |
|
|
foreach (var data in listOfBombedBullet) |
|
|
{ |
|
|
{ |
|
|
if (CanSee(data)) |
|
|
if (CanSee(data)) |
|
|
@@ -1083,24 +911,20 @@ namespace Client |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfClassroom) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var data in listOfClassroom) |
|
|
foreach (var data in listOfClassroom) |
|
|
{ |
|
|
{ |
|
|
int deg = (int)(100.0 * data.Progress / Preparation.Utility.GameData.degreeOfFixedGenerator); |
|
|
int deg = (int)(100.0 * data.Progress / Preparation.Utility.GameData.degreeOfFixedGenerator); |
|
|
TextBox icon = new() |
|
|
|
|
|
|
|
|
TextBlock icon = new() |
|
|
{ |
|
|
{ |
|
|
FontSize = 8 * unitFontsize, |
|
|
FontSize = 8 * unitFontsize, |
|
|
Width = unitWidth, |
|
|
Width = unitWidth, |
|
|
Height = unitHeight, |
|
|
Height = unitHeight, |
|
|
Text = Convert.ToString(deg), |
|
|
Text = Convert.ToString(deg), |
|
|
|
|
|
TextAlignment = TextAlignment.Center, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Background = Brushes.Transparent, |
|
|
Background = Brushes.Transparent, |
|
|
BorderBrush = Brushes.Transparent, |
|
|
|
|
|
IsReadOnly = true |
|
|
|
|
|
}; |
|
|
}; |
|
|
if (deg == 100) |
|
|
if (deg == 100) |
|
|
{ |
|
|
{ |
|
|
@@ -1108,24 +932,20 @@ namespace Client |
|
|
} |
|
|
} |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfChest) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var data in listOfChest) |
|
|
foreach (var data in listOfChest) |
|
|
{ |
|
|
{ |
|
|
int deg = (int)(100.0 * data.Progress / Preparation.Utility.GameData.degreeOfOpenedChest); |
|
|
int deg = (int)(100.0 * data.Progress / Preparation.Utility.GameData.degreeOfOpenedChest); |
|
|
TextBox icon = new() |
|
|
|
|
|
|
|
|
TextBlock icon = new() |
|
|
{ |
|
|
{ |
|
|
FontSize = 8 * unitFontsize, |
|
|
FontSize = 8 * unitFontsize, |
|
|
Width = unitWidth, |
|
|
Width = unitWidth, |
|
|
Height = unitHeight, |
|
|
Height = unitHeight, |
|
|
Text = Convert.ToString(deg), |
|
|
Text = Convert.ToString(deg), |
|
|
|
|
|
TextAlignment = TextAlignment.Center, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Background = Brushes.Transparent, |
|
|
Background = Brushes.Transparent, |
|
|
BorderBrush = Brushes.Transparent, |
|
|
|
|
|
IsReadOnly = true |
|
|
|
|
|
}; |
|
|
}; |
|
|
if (deg == 100) |
|
|
if (deg == 100) |
|
|
{ |
|
|
{ |
|
|
@@ -1133,24 +953,20 @@ namespace Client |
|
|
} |
|
|
} |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfGate) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var data in listOfGate) |
|
|
foreach (var data in listOfGate) |
|
|
{ |
|
|
{ |
|
|
int deg = (int)(100.0 * data.Progress / Preparation.Utility.GameData.degreeOfOpenedDoorway); |
|
|
int deg = (int)(100.0 * data.Progress / Preparation.Utility.GameData.degreeOfOpenedDoorway); |
|
|
TextBox icon = new() |
|
|
|
|
|
|
|
|
TextBlock icon = new() |
|
|
{ |
|
|
{ |
|
|
FontSize = 8 * unitFontsize, |
|
|
FontSize = 8 * unitFontsize, |
|
|
Width = unitWidth, |
|
|
Width = unitWidth, |
|
|
Height = unitHeight, |
|
|
Height = unitHeight, |
|
|
Text = Convert.ToString(deg), |
|
|
Text = Convert.ToString(deg), |
|
|
|
|
|
TextAlignment = TextAlignment.Center, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Background = Brushes.Transparent, |
|
|
Background = Brushes.Transparent, |
|
|
BorderBrush = Brushes.Transparent, |
|
|
|
|
|
IsReadOnly = true |
|
|
|
|
|
}; |
|
|
}; |
|
|
if (deg == 100) |
|
|
if (deg == 100) |
|
|
{ |
|
|
{ |
|
|
@@ -1159,22 +975,18 @@ namespace Client |
|
|
} |
|
|
} |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfDoor) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var data in listOfDoor) |
|
|
foreach (var data in listOfDoor) |
|
|
{ |
|
|
{ |
|
|
TextBox icon = new() |
|
|
|
|
|
|
|
|
TextBlock icon = new() |
|
|
{ |
|
|
{ |
|
|
FontSize = 9 * unitFontsize, |
|
|
FontSize = 9 * unitFontsize, |
|
|
Width = unitWidth, |
|
|
Width = unitWidth, |
|
|
Height = unitHeight, |
|
|
Height = unitHeight, |
|
|
|
|
|
TextAlignment = TextAlignment.Center, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Background = Brushes.Transparent, |
|
|
Background = Brushes.Transparent, |
|
|
BorderBrush = Brushes.Transparent, |
|
|
|
|
|
IsReadOnly = true |
|
|
|
|
|
}; |
|
|
}; |
|
|
if (data.IsOpen) |
|
|
if (data.IsOpen) |
|
|
{ |
|
|
{ |
|
|
@@ -1186,9 +998,6 @@ namespace Client |
|
|
} |
|
|
} |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
lock (lockOfHiddenGate) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var data in listOfHiddenGate) |
|
|
foreach (var data in listOfHiddenGate) |
|
|
{ |
|
|
{ |
|
|
if (!isEmergencyDrawed) |
|
|
if (!isEmergencyDrawed) |
|
|
@@ -1200,33 +1009,32 @@ namespace Client |
|
|
if (data.Opened) |
|
|
if (data.Opened) |
|
|
{ |
|
|
{ |
|
|
isEmergencyOpened = true; |
|
|
isEmergencyOpened = true; |
|
|
TextBox icon = new() |
|
|
|
|
|
|
|
|
TextBlock icon = new() |
|
|
{ |
|
|
{ |
|
|
FontSize = 9 * unitFontsize, |
|
|
FontSize = 9 * unitFontsize, |
|
|
Width = unitWidth, |
|
|
Width = unitWidth, |
|
|
Height = unitHeight, |
|
|
Height = unitHeight, |
|
|
Text = Convert.ToString("🔓"), |
|
|
Text = Convert.ToString("🔓"), |
|
|
|
|
|
TextAlignment = TextAlignment.Center, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
HorizontalAlignment = HorizontalAlignment.Left, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
VerticalAlignment = VerticalAlignment.Top, |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Margin = new Thickness(data.Y * unitWidth / 1000.0 - unitWidth / 2, data.X * unitHeight / 1000.0 - unitHeight / 2, 0, 0), |
|
|
Background = Brushes.Transparent, |
|
|
Background = Brushes.Transparent, |
|
|
BorderBrush = Brushes.Transparent, |
|
|
|
|
|
IsReadOnly = true |
|
|
|
|
|
}; |
|
|
}; |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
UpperLayerOfMap.Children.Add(icon); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
catch (Exception exc) |
|
|
|
|
|
{ |
|
|
|
|
|
ErrorDisplayer error = new("Error: " + exc.ToString()); |
|
|
|
|
|
error.Show(); |
|
|
|
|
|
isClientStocked = true; |
|
|
|
|
|
PorC.Content = "▶"; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
catch (Exception exc) |
|
|
|
|
|
{ |
|
|
|
|
|
ErrorDisplayer error = new("Error: " + exc.ToString()); |
|
|
|
|
|
error.Show(); |
|
|
|
|
|
isClientStocked = true; |
|
|
|
|
|
PorC.Content = "▶"; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
counter++; |
|
|
} |
|
|
} |
|
|
counter++; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 键盘控制 |
|
|
// 键盘控制 |
|
|
@@ -1602,17 +1410,7 @@ namespace Client |
|
|
private List<MessageOfDoor> listOfDoor; |
|
|
private List<MessageOfDoor> listOfDoor; |
|
|
private List<MessageOfGate> listOfGate; |
|
|
private List<MessageOfGate> listOfGate; |
|
|
private List<MessageOfHiddenGate> listOfHiddenGate; |
|
|
private List<MessageOfHiddenGate> listOfHiddenGate; |
|
|
private object lockOfProp = new object(); |
|
|
|
|
|
private object lockOfStudent = new object(); |
|
|
|
|
|
private object lockOfTricker = new object(); |
|
|
|
|
|
private object lockOfBullet = new object(); |
|
|
|
|
|
private object lockOfBombedBullet = new object(); |
|
|
|
|
|
private object lockOfAll = new object(); |
|
|
|
|
|
private object lockOfChest = new object(); |
|
|
|
|
|
private object lockOfClassroom = new object(); |
|
|
|
|
|
private object lockOfDoor = new object(); |
|
|
|
|
|
private object lockOfGate = new object(); |
|
|
|
|
|
private object lockOfHiddenGate = new object(); |
|
|
|
|
|
|
|
|
private object drawPicLock = new object(); |
|
|
private MessageOfStudent? human = null; |
|
|
private MessageOfStudent? human = null; |
|
|
private MessageOfTricker? butcher = null; |
|
|
private MessageOfTricker? butcher = null; |
|
|
private bool humanOrButcher;//true for human |
|
|
private bool humanOrButcher;//true for human |
|
|
@@ -1685,4 +1483,4 @@ namespace Client |
|
|
private int[] totalLife = new int[4] { 100, 100, 100, 100 }, totalDeath = new int[4] { 100, 100, 100, 100 }; |
|
|
private int[] totalLife = new int[4] { 100, 100, 100, 100 }, totalDeath = new int[4] { 100, 100, 100, 100 }; |
|
|
private int[,] coolTime = new int[3, 5] { { 100, 100, 100, 100, 100 }, { 100, 100, 100, 100, 100 }, { 100, 100, 100, 100, 100 } }; |
|
|
private int[,] coolTime = new int[3, 5] { { 100, 100, 100, 100, 100 }, { 100, 100, 100, 100, 100 }, { 100, 100, 100, 100, 100 } }; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |