Browse Source

Merge branch 'eesast:dev' into dev

tags/0.1.0
OctaAcid GitHub 3 years ago
parent
commit
cb673ef3d8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 377 additions and 176 deletions
  1. +7
    -3
      CAPI/cpp/API/include/structures.h
  2. +27
    -24
      CAPI/cpp/API/include/utils.hpp
  3. +7
    -8
      CAPI/cpp/API/src/AI.cpp
  4. +0
    -1
      CAPI/cpp/API/src/Communication.cpp
  5. +5
    -0
      CAPI/cpp/API/src/logic.cpp
  6. +7
    -7
      CAPI/cpp/API/src/main.cpp
  7. +39
    -37
      CAPI/cpp/proto/MessageType.pb.cc
  8. +21
    -20
      CAPI/cpp/proto/MessageType.pb.h
  9. +41
    -10
      CAPI/python/PyAPI/AI.py
  10. +3
    -3
      CAPI/python/PyAPI/API.py
  11. +5
    -5
      CAPI/python/PyAPI/DebugAPI.py
  12. +3
    -3
      CAPI/python/PyAPI/Interface.py
  13. +6
    -4
      CAPI/python/PyAPI/logic.py
  14. +7
    -6
      CAPI/python/PyAPI/main.py
  15. +15
    -8
      CAPI/python/PyAPI/structures.py
  16. +25
    -21
      CAPI/python/PyAPI/utils.py
  17. +12
    -0
      CAPI/python/generate_proto.sh
  18. +2
    -2
      CAPI/python/requirements.txt
  19. +3
    -1
      CAPI/python/run.sh
  20. +2
    -0
      logic/Client/MainWindow.xaml.cs
  21. +1
    -1
      logic/Client/Properties/launchSettings.json
  22. +0
    -2
      logic/Gaming/ActionManager.cs
  23. +133
    -6
      logic/Server/RpcServices.cs
  24. +2
    -4
      logic/cmd/gameServer.cmd
  25. +4
    -0
      logic/规则Logic.md

+ 7
- 3
CAPI/cpp/API/include/structures.h View File

@@ -52,7 +52,7 @@ namespace THUAI6
Key5 = 2, Key5 = 2,
Key6 = 3, Key6 = 3,
AddSpeed = 4, AddSpeed = 4,
AddLifeOrAp = 5,
AddLifeOrClairaudience = 5,
AddHpOrAp = 6, AddHpOrAp = 6,
ShieldOrSpear = 7, ShieldOrSpear = 7,
RecoveryFromDizziness = 8, RecoveryFromDizziness = 8,
@@ -83,7 +83,8 @@ namespace THUAI6
Athlete = 1, Athlete = 1,
Teacher = 2, Teacher = 2,
StraightAStudent = 3, StraightAStudent = 3,
StudentType4 = 4,
Robot = 4,
TechOtaku = 5,
}; };


// 捣蛋鬼类型 // 捣蛋鬼类型
@@ -282,12 +283,15 @@ namespace THUAI6
{StudentType::Athlete, "Athlete"}, {StudentType::Athlete, "Athlete"},
{StudentType::Teacher, "Teacher"}, {StudentType::Teacher, "Teacher"},
{StudentType::StraightAStudent, "StraightAStudent"}, {StudentType::StraightAStudent, "StraightAStudent"},
{StudentType::Robot, "Robot"},
{StudentType::TechOtaku, "TechOtaku"},
}; };


inline std::map<TrickerType, std::string> trickerTypeDict{ inline std::map<TrickerType, std::string> trickerTypeDict{
{TrickerType::NullTrickerType, "NullTrickerType"}, {TrickerType::NullTrickerType, "NullTrickerType"},
{TrickerType::Assassin, "Assassin"}, {TrickerType::Assassin, "Assassin"},
{TrickerType::Klee, "Klee"}, {TrickerType::Klee, "Klee"},
{TrickerType::ANoisyPerson, "ANoisyPerson"},
}; };


inline std::map<PlayerState, std::string> playerStateDict{ inline std::map<PlayerState, std::string> playerStateDict{
@@ -339,7 +343,7 @@ namespace THUAI6
{PropType::Key5, "Key5"}, {PropType::Key5, "Key5"},
{PropType::Key6, "Key6"}, {PropType::Key6, "Key6"},
{PropType::AddSpeed, "AddSpeed"}, {PropType::AddSpeed, "AddSpeed"},
{PropType::AddLifeOrAp, "AddLifeOrAp"},
{PropType::AddLifeOrClairaudience, "AddLifeOrClairaudience"},
{PropType::AddHpOrAp, "AddHpOrAp"}, {PropType::AddHpOrAp, "AddHpOrAp"},
{PropType::ShieldOrSpear, "ShieldOrSpear"}, {PropType::ShieldOrSpear, "ShieldOrSpear"},
{PropType::RecoveryFromDizziness, "RecoveryFromDizziness"}, {PropType::RecoveryFromDizziness, "RecoveryFromDizziness"},


+ 27
- 24
CAPI/cpp/API/include/utils.hpp View File

@@ -4,6 +4,7 @@
#define UTILS_HPP #define UTILS_HPP


#include <cstdint> #include <cstdint>
#include <cmath>
#include "Message2Clients.pb.h" #include "Message2Clients.pb.h"
#include "Message2Server.pb.h" #include "Message2Server.pb.h"
#include "MessageType.pb.h" #include "MessageType.pb.h"
@@ -93,7 +94,7 @@ namespace Proto2THUAI6
{protobuf::PropType::KEY6, THUAI6::PropType::Key6}, {protobuf::PropType::KEY6, THUAI6::PropType::Key6},
{protobuf::PropType::ADD_SPEED, THUAI6::PropType::AddSpeed}, {protobuf::PropType::ADD_SPEED, THUAI6::PropType::AddSpeed},
{protobuf::PropType::ADD_HP_OR_AP, THUAI6::PropType::AddHpOrAp}, {protobuf::PropType::ADD_HP_OR_AP, THUAI6::PropType::AddHpOrAp},
{protobuf::PropType::ADD_LIFE_OR_AP, THUAI6::PropType::AddLifeOrAp},
{protobuf::PropType::ADD_LIFE_OR_CLAIRAUDIENCE, THUAI6::PropType::AddLifeOrClairaudience},
{protobuf::PropType::SHIELD_OR_SPEAR, THUAI6::PropType::ShieldOrSpear}, {protobuf::PropType::SHIELD_OR_SPEAR, THUAI6::PropType::ShieldOrSpear},
{protobuf::PropType::RECOVERY_FROM_DIZZINESS, THUAI6::PropType::RecoveryFromDizziness}, {protobuf::PropType::RECOVERY_FROM_DIZZINESS, THUAI6::PropType::RecoveryFromDizziness},
}; };
@@ -107,34 +108,35 @@ namespace Proto2THUAI6
inline std::map<protobuf::StudentType, THUAI6::StudentType> studentTypeDict{ inline std::map<protobuf::StudentType, THUAI6::StudentType> studentTypeDict{
{protobuf::StudentType::NULL_STUDENT_TYPE, THUAI6::StudentType::NullStudentType}, {protobuf::StudentType::NULL_STUDENT_TYPE, THUAI6::StudentType::NullStudentType},
{protobuf::StudentType::ATHLETE, THUAI6::StudentType::Athlete}, {protobuf::StudentType::ATHLETE, THUAI6::StudentType::Athlete},
{protobuf::StudentType::STUDENTTYPE2, THUAI6::StudentType::Teacher},
{protobuf::StudentType::STUDENTTYPE3, THUAI6::StudentType::StraightAStudent},
{protobuf::StudentType::STUDENTTYPE4, THUAI6::StudentType::StudentType4},
{protobuf::StudentType::TEACHER, THUAI6::StudentType::Teacher},
{protobuf::StudentType::STRAIGHT_A_STUDENT, THUAI6::StudentType::StraightAStudent},
{protobuf::StudentType::ROBOT, THUAI6::StudentType::Robot},
{protobuf::StudentType::TECH_OTAKU, THUAI6::StudentType::TechOtaku},
}; };


inline std::map<protobuf::TrickerType, THUAI6::TrickerType> trickerTypeDict{ inline std::map<protobuf::TrickerType, THUAI6::TrickerType> trickerTypeDict{
{protobuf::TrickerType::NULL_TRICKER_TYPE, THUAI6::TrickerType::NullTrickerType}, {protobuf::TrickerType::NULL_TRICKER_TYPE, THUAI6::TrickerType::NullTrickerType},
{protobuf::TrickerType::ASSASSIN, THUAI6::TrickerType::Assassin}, {protobuf::TrickerType::ASSASSIN, THUAI6::TrickerType::Assassin},
{protobuf::TrickerType::TRICKERTYPE2, THUAI6::TrickerType::Klee},
{protobuf::TrickerType::TRICKERTYPE3, THUAI6::TrickerType::ANoisyPerson},
{protobuf::TrickerType::KLEE, THUAI6::TrickerType::Klee},
{protobuf::TrickerType::A_NOISY_PERSON, THUAI6::TrickerType::ANoisyPerson},
{protobuf::TrickerType::TRICKERTYPE4, THUAI6::TrickerType::TrickerType4}, {protobuf::TrickerType::TRICKERTYPE4, THUAI6::TrickerType::TrickerType4},
}; };


inline std::map<protobuf::StudentBuffType, THUAI6::StudentBuffType> studentBuffTypeDict{ inline std::map<protobuf::StudentBuffType, THUAI6::StudentBuffType> studentBuffTypeDict{
{protobuf::StudentBuffType::NULL_SBUFF_TYPE, THUAI6::StudentBuffType::NullStudentBuffType}, {protobuf::StudentBuffType::NULL_SBUFF_TYPE, THUAI6::StudentBuffType::NullStudentBuffType},
{protobuf::StudentBuffType::SBUFFTYPE1, THUAI6::StudentBuffType::AddSpeed},
{protobuf::StudentBuffType::SBUFFTYPE2, THUAI6::StudentBuffType::AddLife},
{protobuf::StudentBuffType::SBUFFTYPE3, THUAI6::StudentBuffType::Shield},
{protobuf::StudentBuffType::SBUFFTYPE4, THUAI6::StudentBuffType::Invisible},
{protobuf::StudentBuffType::STUDENT_ADD_SPEED, THUAI6::StudentBuffType::AddSpeed},
{protobuf::StudentBuffType::ADD_LIFE, THUAI6::StudentBuffType::AddLife},
{protobuf::StudentBuffType::SHIELD, THUAI6::StudentBuffType::Shield},
{protobuf::StudentBuffType::STUDENT_INVISIBLE, THUAI6::StudentBuffType::Invisible},
}; };


inline std::map<protobuf::TrickerBuffType, THUAI6::TrickerBuffType> trickerBuffTypeDict{ inline std::map<protobuf::TrickerBuffType, THUAI6::TrickerBuffType> trickerBuffTypeDict{
{protobuf::TrickerBuffType::NULL_TBUFF_TYPE, THUAI6::TrickerBuffType::NullTrickerBuffType}, {protobuf::TrickerBuffType::NULL_TBUFF_TYPE, THUAI6::TrickerBuffType::NullTrickerBuffType},
{protobuf::TrickerBuffType::TBUFFTYPE1, THUAI6::TrickerBuffType::AddSpeed},
{protobuf::TrickerBuffType::TBUFFTYPE2, THUAI6::TrickerBuffType::Spear},
{protobuf::TrickerBuffType::TBUFFTYPE3, THUAI6::TrickerBuffType::AddAp},
{protobuf::TrickerBuffType::TBUFFTYPE4, THUAI6::TrickerBuffType::Clairaudience},
{protobuf::TrickerBuffType::INVISIBLE, THUAI6::TrickerBuffType::Invisible},
{protobuf::TrickerBuffType::TRICKER_ADD_SPEED, THUAI6::TrickerBuffType::AddSpeed},
{protobuf::TrickerBuffType::SPEAR, THUAI6::TrickerBuffType::Spear},
{protobuf::TrickerBuffType::ADD_AP, THUAI6::TrickerBuffType::AddAp},
{protobuf::TrickerBuffType::CLAIRAUDIENCE, THUAI6::TrickerBuffType::Clairaudience},
{protobuf::TrickerBuffType::TRICKER_INVISIBLE, THUAI6::TrickerBuffType::Invisible},
}; };


inline std::map<protobuf::PlayerState, THUAI6::PlayerState> playerStateDict{ inline std::map<protobuf::PlayerState, THUAI6::PlayerState> playerStateDict{
@@ -170,8 +172,8 @@ namespace Proto2THUAI6
{protobuf::BulletType::NULL_BULLET_TYPE, THUAI6::BulletType::NullBulletType}, {protobuf::BulletType::NULL_BULLET_TYPE, THUAI6::BulletType::NullBulletType},
{protobuf::BulletType::FLYING_KNIFE, THUAI6::BulletType::FlyingKnife}, {protobuf::BulletType::FLYING_KNIFE, THUAI6::BulletType::FlyingKnife},
{protobuf::BulletType::COMMON_ATTACK_OF_TRICKER, THUAI6::BulletType::CommonAttackOfTricker}, {protobuf::BulletType::COMMON_ATTACK_OF_TRICKER, THUAI6::BulletType::CommonAttackOfTricker},
{protobuf::BulletType::FAST_BULLET, THUAI6::BulletType::BombBomb},
{protobuf::BulletType::ORDINARY_BULLET, THUAI6::BulletType::JumpyDumpty},
{protobuf::BulletType::BOMB_BOMB, THUAI6::BulletType::BombBomb},
{protobuf::BulletType::JUMPY_DUMPTY, THUAI6::BulletType::JumpyDumpty},
{protobuf::BulletType::ATOM_BOMB, THUAI6::BulletType::AtomBomb}, {protobuf::BulletType::ATOM_BOMB, THUAI6::BulletType::AtomBomb},
}; };


@@ -350,7 +352,7 @@ namespace THUAI62Proto
{THUAI6::PropType::Key5, protobuf::PropType::KEY5}, {THUAI6::PropType::Key5, protobuf::PropType::KEY5},
{THUAI6::PropType::Key6, protobuf::PropType::KEY6}, {THUAI6::PropType::Key6, protobuf::PropType::KEY6},
{THUAI6::PropType::AddHpOrAp, protobuf::PropType::ADD_HP_OR_AP}, {THUAI6::PropType::AddHpOrAp, protobuf::PropType::ADD_HP_OR_AP},
{THUAI6::PropType::AddLifeOrAp, protobuf::PropType::ADD_LIFE_OR_AP},
{THUAI6::PropType::AddLifeOrClairaudience, protobuf::PropType::ADD_LIFE_OR_CLAIRAUDIENCE},
{THUAI6::PropType::AddSpeed, protobuf::PropType::ADD_SPEED}, {THUAI6::PropType::AddSpeed, protobuf::PropType::ADD_SPEED},
{THUAI6::PropType::ShieldOrSpear, protobuf::PropType::SHIELD_OR_SPEAR}, {THUAI6::PropType::ShieldOrSpear, protobuf::PropType::SHIELD_OR_SPEAR},
}; };
@@ -364,14 +366,15 @@ namespace THUAI62Proto
inline std::map<THUAI6::StudentType, protobuf::StudentType> studentTypeDict{ inline std::map<THUAI6::StudentType, protobuf::StudentType> studentTypeDict{
{THUAI6::StudentType::NullStudentType, protobuf::StudentType::NULL_STUDENT_TYPE}, {THUAI6::StudentType::NullStudentType, protobuf::StudentType::NULL_STUDENT_TYPE},
{THUAI6::StudentType::Athlete, protobuf::StudentType::ATHLETE}, {THUAI6::StudentType::Athlete, protobuf::StudentType::ATHLETE},
{THUAI6::StudentType::Teacher, protobuf::StudentType::STUDENTTYPE2},
{THUAI6::StudentType::StraightAStudent, protobuf::StudentType::STUDENTTYPE3},
{THUAI6::StudentType::StudentType4, protobuf::StudentType::STUDENTTYPE4},
{THUAI6::StudentType::Teacher, protobuf::StudentType::TEACHER},
{THUAI6::StudentType::StraightAStudent, protobuf::StudentType::STRAIGHT_A_STUDENT},
{THUAI6::StudentType::Robot, protobuf::StudentType::ROBOT},
{THUAI6::StudentType::TechOtaku, protobuf::StudentType::TECH_OTAKU},
}; };


// inline std::map<THUAI6::StudentBuffType, protobuf::StudentBuffType> studentBuffTypeDict{ // inline std::map<THUAI6::StudentBuffType, protobuf::StudentBuffType> studentBuffTypeDict{
// {THUAI6::StudentBuffType::NullStudentBuffType, protobuf::StudentBuffType::NULL_SBUFF_TYPE}, // {THUAI6::StudentBuffType::NullStudentBuffType, protobuf::StudentBuffType::NULL_SBUFF_TYPE},
// {THUAI6::StudentBuffType::StudentBuffType1, protobuf::StudentBuffType::SBUFFTYPE1},
// {THUAI6::StudentBuffType::StudentBuffType1, protobuf::StudentBuffType::ADD_SPEED},
// {THUAI6::StudentBuffType::StudentBuffType2, protobuf::StudentBuffType::SBUFFTYPE2}, // {THUAI6::StudentBuffType::StudentBuffType2, protobuf::StudentBuffType::SBUFFTYPE2},
// {THUAI6::StudentBuffType::StudentBuffType3, protobuf::StudentBuffType::SBUFFTYPE3}, // {THUAI6::StudentBuffType::StudentBuffType3, protobuf::StudentBuffType::SBUFFTYPE3},
// {THUAI6::StudentBuffType::StudentBuffType4, protobuf::StudentBuffType::SBUFFTYPE4}, // {THUAI6::StudentBuffType::StudentBuffType4, protobuf::StudentBuffType::SBUFFTYPE4},
@@ -380,8 +383,8 @@ namespace THUAI62Proto
inline std::map<THUAI6::TrickerType, protobuf::TrickerType> trickerTypeDict{ inline std::map<THUAI6::TrickerType, protobuf::TrickerType> trickerTypeDict{
{THUAI6::TrickerType::NullTrickerType, protobuf::TrickerType::NULL_TRICKER_TYPE}, {THUAI6::TrickerType::NullTrickerType, protobuf::TrickerType::NULL_TRICKER_TYPE},
{THUAI6::TrickerType::Assassin, protobuf::TrickerType::ASSASSIN}, {THUAI6::TrickerType::Assassin, protobuf::TrickerType::ASSASSIN},
{THUAI6::TrickerType::Klee, protobuf::TrickerType::TRICKERTYPE2},
{THUAI6::TrickerType::ANoisyPerson, protobuf::TrickerType::TRICKERTYPE3},
{THUAI6::TrickerType::Klee, protobuf::TrickerType::KLEE},
{THUAI6::TrickerType::ANoisyPerson, protobuf::TrickerType::A_NOISY_PERSON},
{THUAI6::TrickerType::TrickerType4, protobuf::TrickerType::TRICKERTYPE4}, {THUAI6::TrickerType::TrickerType4, protobuf::TrickerType::TRICKERTYPE4},
}; };




+ 7
- 8
CAPI/cpp/API/src/AI.cpp View File

@@ -6,7 +6,7 @@
extern const bool asynchronous = false; extern const bool asynchronous = false;


// 选手必须定义该变量来选择自己的阵营 // 选手必须定义该变量来选择自己的阵营
extern const THUAI6::PlayerType playerType = THUAI6::PlayerType::StudentPlayer;
extern const THUAI6::PlayerType playerType = THUAI6::PlayerType::TrickerPlayer;


// 选手需要将两个都定义,本份代码中不选择的阵营任意定义即可 // 选手需要将两个都定义,本份代码中不选择的阵营任意定义即可
extern const THUAI6::TrickerType trickerType = THUAI6::TrickerType::Assassin; extern const THUAI6::TrickerType trickerType = THUAI6::TrickerType::Assassin;
@@ -17,15 +17,14 @@ extern const THUAI6::StudentType studentType = THUAI6::StudentType::Athlete;


void AI::play(IStudentAPI& api) void AI::play(IStudentAPI& api)
{ {
api.SendMessage(1, "Hello, I'm player 0 using C++ interface!");
if (api.HaveMessage())
{
auto msg = api.GetMessage();
api.Print("Player " + std::to_string(msg.first) + " says: " + msg.second);
}
api.PrintTricker();
} }


void AI::play(ITrickerAPI& api) void AI::play(ITrickerAPI& api)
{ {
api.Move(100, 1);
if (api.HaveMessage())
{
auto msg = api.GetMessage();
api.Print("Message from " + std::to_string(msg.first) + ": " + msg.second);
}
} }

+ 0
- 1
CAPI/cpp/API/src/Communication.cpp View File

@@ -215,7 +215,6 @@ bool Communication::TryConnection(int64_t playerID)
auto status = THUAI6Stub->TryConnection(&context, request, &reply); auto status = THUAI6Stub->TryConnection(&context, request, &reply);
if (status.ok()) if (status.ok())
{ {
std::cout << "Connection success!" << std::endl;
return true; return true;
} }
else else


+ 5
- 0
CAPI/cpp/API/src/logic.cpp View File

@@ -75,6 +75,11 @@ std::vector<std::vector<THUAI6::PlaceType>> Logic::GetFullMap() const
THUAI6::PlaceType Logic::GetPlaceType(int32_t cellX, int32_t cellY) const THUAI6::PlaceType Logic::GetPlaceType(int32_t cellX, int32_t cellY) const
{ {
std::unique_lock<std::mutex> lock(mtxState); std::unique_lock<std::mutex> lock(mtxState);
if (cellX < 0 || cellX >= currentState->gameMap.size() || cellY < 0 || cellY >= currentState->gameMap[0].size())
{
logger->warn("Invalid position!");
return THUAI6::PlaceType::NullPlaceType;
}
logger->debug("Called GetPlaceType"); logger->debug("Called GetPlaceType");
return currentState->gameMap[cellX][cellY]; return currentState->gameMap[cellX][cellY];
} }


+ 7
- 7
CAPI/cpp/API/src/main.cpp View File

@@ -18,13 +18,13 @@ int THUAI6Main(int argc, char** argv, CreateAIFunc AIBuilder)
extern const THUAI6::PlayerType playerType; extern const THUAI6::PlayerType playerType;
extern const THUAI6::TrickerType trickerType; extern const THUAI6::TrickerType trickerType;
extern const THUAI6::StudentType studentType; extern const THUAI6::StudentType studentType;
{
file = true;
print = true;
Logic logic(playerType, pID, trickerType, studentType);
logic.Main(AIBuilder, sIP, sPort, file, print, warnOnly);
return 0;
}
// {
// file = true;
// print = true;
// Logic logic(playerType, pID, trickerType, studentType);
// logic.Main(AIBuilder, sIP, sPort, file, print, warnOnly);
// return 0;
// }


// 使用cmdline的正式版本 // 使用cmdline的正式版本
try try


+ 39
- 37
CAPI/cpp/proto/MessageType.pb.cc View File

@@ -30,48 +30,49 @@ static constexpr ::_pbi::MigrationSchema* schemas = nullptr;
static constexpr ::_pb::Message* const* file_default_instances = nullptr; static constexpr ::_pb::Message* const* file_default_instances = nullptr;


const char descriptor_table_protodef_MessageType_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = const char descriptor_table_protodef_MessageType_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
"\n\021MessageType.proto\022\010protobuf*\207\001\n\nBullet"
"\n\021MessageType.proto\022\010protobuf*\202\001\n\nBullet"
"Type\022\024\n\020NULL_BULLET_TYPE\020\000\022\020\n\014FLYING_KNI" "Type\022\024\n\020NULL_BULLET_TYPE\020\000\022\020\n\014FLYING_KNI"
"FE\020\001\022\034\n\030COMMON_ATTACK_OF_TRICKER\020\002\022\017\n\013FA"
"ST_BULLET\020\003\022\023\n\017ORDINARY_BULLET\020\004\022\r\n\tATOM"
"_BOMB\020\005*\241\001\n\tPlaceType\022\023\n\017NULL_PLACE_TYPE"
"\020\000\022\010\n\004LAND\020\001\022\010\n\004WALL\020\002\022\t\n\005GRASS\020\003\022\r\n\tCLA"
"SSROOM\020\004\022\010\n\004GATE\020\005\022\017\n\013HIDDEN_GATE\020\006\022\n\n\006W"
"INDOW\020\007\022\t\n\005DOOR3\020\010\022\t\n\005DOOR5\020\t\022\t\n\005DOOR6\020\n"
"\022\t\n\005CHEST\020\013*8\n\tShapeType\022\023\n\017NULL_SHAPE_T"
"YPE\020\000\022\n\n\006CIRCLE\020\001\022\n\n\006SQUARE\020\002*\243\001\n\010PropTy"
"pe\022\022\n\016NULL_PROP_TYPE\020\000\022\r\n\tADD_SPEED\020\001\022\022\n"
"\016ADD_LIFE_OR_AP\020\002\022\020\n\014ADD_HP_OR_AP\020\003\022\023\n\017S"
"HIELD_OR_SPEAR\020\004\022\010\n\004KEY3\020\005\022\010\n\004KEY5\020\006\022\010\n\004"
"KEY6\020\007\022\033\n\027RECOVERY_FROM_DIZZINESS\020\010*f\n\017S"
"tudentBuffType\022\023\n\017NULL_SBUFF_TYPE\020\000\022\016\n\nS"
"BUFFTYPE1\020\001\022\016\n\nSBUFFTYPE2\020\002\022\016\n\nSBUFFTYPE"
"3\020\003\022\016\n\nSBUFFTYPE4\020\004*\251\002\n\013PlayerState\022\017\n\013N"
"ULL_STATUS\020\000\022\010\n\004IDLE\020\001\022\014\n\010LEARNING\020\002\022\014\n\010"
"ADDICTED\020\003\022\010\n\004QUIT\020\004\022\r\n\tGRADUATED\020\005\022\013\n\007T"
"REATED\020\006\022\013\n\007RESCUED\020\007\022\013\n\007STUNNED\020\010\022\014\n\010TR"
"EATING\020\t\022\014\n\010RESCUING\020\n\022\014\n\010SWINGING\020\013\022\r\n\t"
"ATTACKING\020\014\022\013\n\007LOCKING\020\r\022\r\n\tRUMMAGING\020\016\022"
"\014\n\010CLIMBING\020\017\022\023\n\017OPENING_A_CHEST\020\020\022\027\n\023US"
"ING_SPECIAL_SKILL\020\021\022\022\n\016OPENING_A_GATE\020\022*"
"u\n\017TrickerBuffType\022\023\n\017NULL_TBUFF_TYPE\020\000\022"
"\016\n\nTBUFFTYPE1\020\001\022\016\n\nTBUFFTYPE2\020\002\022\016\n\nTBUFF"
"TYPE3\020\003\022\016\n\nTBUFFTYPE4\020\004\022\r\n\tINVISIBLE\020\005*J"
"\n\nPlayerType\022\024\n\020NULL_PLAYER_TYPE\020\000\022\022\n\016ST"
"UDENT_PLAYER\020\001\022\022\n\016TRICKER_PLAYER\020\002*g\n\013St"
"udentType\022\025\n\021NULL_STUDENT_TYPE\020\000\022\013\n\007ATHL"
"ETE\020\001\022\020\n\014STUDENTTYPE2\020\002\022\020\n\014STUDENTTYPE3\020"
"\003\022\020\n\014STUDENTTYPE4\020\004*h\n\013TrickerType\022\025\n\021NU"
"LL_TRICKER_TYPE\020\000\022\014\n\010ASSASSIN\020\001\022\020\n\014TRICK"
"ERTYPE2\020\002\022\020\n\014TRICKERTYPE3\020\003\022\020\n\014TRICKERTY"
"PE4\020\004*P\n\tGameState\022\023\n\017NULL_GAME_STATE\020\000\022"
"\016\n\nGAME_START\020\001\022\020\n\014GAME_RUNNING\020\002\022\014\n\010GAM"
"E_END\020\003b\006proto3";
"FE\020\001\022\034\n\030COMMON_ATTACK_OF_TRICKER\020\002\022\r\n\tBO"
"MB_BOMB\020\003\022\020\n\014JUMPY_DUMPTY\020\004\022\r\n\tATOM_BOMB"
"\020\005*\241\001\n\tPlaceType\022\023\n\017NULL_PLACE_TYPE\020\000\022\010\n"
"\004LAND\020\001\022\010\n\004WALL\020\002\022\t\n\005GRASS\020\003\022\r\n\tCLASSROO"
"M\020\004\022\010\n\004GATE\020\005\022\017\n\013HIDDEN_GATE\020\006\022\n\n\006WINDOW"
"\020\007\022\t\n\005DOOR3\020\010\022\t\n\005DOOR5\020\t\022\t\n\005DOOR6\020\n\022\t\n\005C"
"HEST\020\013*8\n\tShapeType\022\023\n\017NULL_SHAPE_TYPE\020\000"
"\022\n\n\006CIRCLE\020\001\022\n\n\006SQUARE\020\002*\256\001\n\010PropType\022\022\n"
"\016NULL_PROP_TYPE\020\000\022\r\n\tADD_SPEED\020\001\022\035\n\031ADD_"
"LIFE_OR_CLAIRAUDIENCE\020\002\022\020\n\014ADD_HP_OR_AP\020"
"\003\022\023\n\017SHIELD_OR_SPEAR\020\004\022\010\n\004KEY3\020\005\022\010\n\004KEY5"
"\020\006\022\010\n\004KEY6\020\007\022\033\n\027RECOVERY_FROM_DIZZINESS\020"
"\010*n\n\017StudentBuffType\022\023\n\017NULL_SBUFF_TYPE\020"
"\000\022\025\n\021STUDENT_ADD_SPEED\020\001\022\014\n\010ADD_LIFE\020\002\022\n"
"\n\006SHIELD\020\003\022\025\n\021STUDENT_INVISIBLE\020\004*\251\002\n\013Pl"
"ayerState\022\017\n\013NULL_STATUS\020\000\022\010\n\004IDLE\020\001\022\014\n\010"
"LEARNING\020\002\022\014\n\010ADDICTED\020\003\022\010\n\004QUIT\020\004\022\r\n\tGR"
"ADUATED\020\005\022\013\n\007TREATED\020\006\022\013\n\007RESCUED\020\007\022\013\n\007S"
"TUNNED\020\010\022\014\n\010TREATING\020\t\022\014\n\010RESCUING\020\n\022\014\n\010"
"SWINGING\020\013\022\r\n\tATTACKING\020\014\022\013\n\007LOCKING\020\r\022\r"
"\n\tRUMMAGING\020\016\022\014\n\010CLIMBING\020\017\022\023\n\017OPENING_A"
"_CHEST\020\020\022\027\n\023USING_SPECIAL_SKILL\020\021\022\022\n\016OPE"
"NING_A_GATE\020\022*~\n\017TrickerBuffType\022\023\n\017NULL"
"_TBUFF_TYPE\020\000\022\025\n\021TRICKER_ADD_SPEED\020\001\022\t\n\005"
"SPEAR\020\002\022\n\n\006ADD_AP\020\003\022\021\n\rCLAIRAUDIENCE\020\004\022\025"
"\n\021TRICKER_INVISIBLE\020\005*J\n\nPlayerType\022\024\n\020N"
"ULL_PLAYER_TYPE\020\000\022\022\n\016STUDENT_PLAYER\020\001\022\022\n"
"\016TRICKER_PLAYER\020\002*q\n\013StudentType\022\025\n\021NULL"
"_STUDENT_TYPE\020\000\022\013\n\007ATHLETE\020\001\022\013\n\007TEACHER\020"
"\002\022\026\n\022STRAIGHT_A_STUDENT\020\003\022\t\n\005ROBOT\020\004\022\016\n\n"
"TECH_OTAKU\020\005*b\n\013TrickerType\022\025\n\021NULL_TRIC"
"KER_TYPE\020\000\022\014\n\010ASSASSIN\020\001\022\010\n\004KLEE\020\002\022\022\n\016A_"
"NOISY_PERSON\020\003\022\020\n\014TRICKERTYPE4\020\004*P\n\tGame"
"State\022\023\n\017NULL_GAME_STATE\020\000\022\016\n\nGAME_START"
"\020\001\022\020\n\014GAME_RUNNING\020\002\022\014\n\010GAME_END\020\003b\006prot"
"o3";
static ::_pbi::once_flag descriptor_table_MessageType_2eproto_once; static ::_pbi::once_flag descriptor_table_MessageType_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_MessageType_2eproto = { const ::_pbi::DescriptorTable descriptor_table_MessageType_2eproto = {
false, false,
false, false,
1455,
1482,
descriptor_table_protodef_MessageType_2eproto, descriptor_table_protodef_MessageType_2eproto,
"MessageType.proto", "MessageType.proto",
&descriptor_table_MessageType_2eproto_once, &descriptor_table_MessageType_2eproto_once,
@@ -291,6 +292,7 @@ namespace protobuf
case 2: case 2:
case 3: case 3:
case 4: case 4:
case 5:
return true; return true;
default: default:
return false; return false;


+ 21
- 20
CAPI/cpp/proto/MessageType.pb.h View File

@@ -55,8 +55,8 @@ namespace protobuf
NULL_BULLET_TYPE = 0, NULL_BULLET_TYPE = 0,
FLYING_KNIFE = 1, FLYING_KNIFE = 1,
COMMON_ATTACK_OF_TRICKER = 2, COMMON_ATTACK_OF_TRICKER = 2,
FAST_BULLET = 3,
ORDINARY_BULLET = 4,
BOMB_BOMB = 3,
JUMPY_DUMPTY = 4,
ATOM_BOMB = 5, ATOM_BOMB = 5,
BulletType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(), BulletType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(),
BulletType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max() BulletType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max()
@@ -156,7 +156,7 @@ namespace protobuf
{ {
NULL_PROP_TYPE = 0, NULL_PROP_TYPE = 0,
ADD_SPEED = 1, ADD_SPEED = 1,
ADD_LIFE_OR_AP = 2,
ADD_LIFE_OR_CLAIRAUDIENCE = 2,
ADD_HP_OR_AP = 3, ADD_HP_OR_AP = 3,
SHIELD_OR_SPEAR = 4, SHIELD_OR_SPEAR = 4,
KEY3 = 5, KEY3 = 5,
@@ -191,16 +191,16 @@ namespace protobuf
enum StudentBuffType : int enum StudentBuffType : int
{ {
NULL_SBUFF_TYPE = 0, NULL_SBUFF_TYPE = 0,
SBUFFTYPE1 = 1,
SBUFFTYPE2 = 2,
SBUFFTYPE3 = 3,
SBUFFTYPE4 = 4,
STUDENT_ADD_SPEED = 1,
ADD_LIFE = 2,
SHIELD = 3,
STUDENT_INVISIBLE = 4,
StudentBuffType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(), StudentBuffType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(),
StudentBuffType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max() StudentBuffType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max()
}; };
bool StudentBuffType_IsValid(int value); bool StudentBuffType_IsValid(int value);
constexpr StudentBuffType StudentBuffType_MIN = NULL_SBUFF_TYPE; constexpr StudentBuffType StudentBuffType_MIN = NULL_SBUFF_TYPE;
constexpr StudentBuffType StudentBuffType_MAX = SBUFFTYPE4;
constexpr StudentBuffType StudentBuffType_MAX = STUDENT_INVISIBLE;
constexpr int StudentBuffType_ARRAYSIZE = StudentBuffType_MAX + 1; constexpr int StudentBuffType_ARRAYSIZE = StudentBuffType_MAX + 1;


const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* StudentBuffType_descriptor(); const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* StudentBuffType_descriptor();
@@ -269,17 +269,17 @@ namespace protobuf
enum TrickerBuffType : int enum TrickerBuffType : int
{ {
NULL_TBUFF_TYPE = 0, NULL_TBUFF_TYPE = 0,
TBUFFTYPE1 = 1,
TBUFFTYPE2 = 2,
TBUFFTYPE3 = 3,
TBUFFTYPE4 = 4,
INVISIBLE = 5,
TRICKER_ADD_SPEED = 1,
SPEAR = 2,
ADD_AP = 3,
CLAIRAUDIENCE = 4,
TRICKER_INVISIBLE = 5,
TrickerBuffType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(), TrickerBuffType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(),
TrickerBuffType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max() TrickerBuffType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max()
}; };
bool TrickerBuffType_IsValid(int value); bool TrickerBuffType_IsValid(int value);
constexpr TrickerBuffType TrickerBuffType_MIN = NULL_TBUFF_TYPE; constexpr TrickerBuffType TrickerBuffType_MIN = NULL_TBUFF_TYPE;
constexpr TrickerBuffType TrickerBuffType_MAX = INVISIBLE;
constexpr TrickerBuffType TrickerBuffType_MAX = TRICKER_INVISIBLE;
constexpr int TrickerBuffType_ARRAYSIZE = TrickerBuffType_MAX + 1; constexpr int TrickerBuffType_ARRAYSIZE = TrickerBuffType_MAX + 1;


const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* TrickerBuffType_descriptor(); const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* TrickerBuffType_descriptor();
@@ -333,15 +333,16 @@ namespace protobuf
{ {
NULL_STUDENT_TYPE = 0, NULL_STUDENT_TYPE = 0,
ATHLETE = 1, ATHLETE = 1,
STUDENTTYPE2 = 2,
STUDENTTYPE3 = 3,
STUDENTTYPE4 = 4,
TEACHER = 2,
STRAIGHT_A_STUDENT = 3,
ROBOT = 4,
TECH_OTAKU = 5,
StudentType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(), StudentType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(),
StudentType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max() StudentType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max()
}; };
bool StudentType_IsValid(int value); bool StudentType_IsValid(int value);
constexpr StudentType StudentType_MIN = NULL_STUDENT_TYPE; constexpr StudentType StudentType_MIN = NULL_STUDENT_TYPE;
constexpr StudentType StudentType_MAX = STUDENTTYPE4;
constexpr StudentType StudentType_MAX = TECH_OTAKU;
constexpr int StudentType_ARRAYSIZE = StudentType_MAX + 1; constexpr int StudentType_ARRAYSIZE = StudentType_MAX + 1;


const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* StudentType_descriptor(); const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* StudentType_descriptor();
@@ -365,8 +366,8 @@ namespace protobuf
{ {
NULL_TRICKER_TYPE = 0, NULL_TRICKER_TYPE = 0,
ASSASSIN = 1, ASSASSIN = 1,
TRICKERTYPE2 = 2,
TRICKERTYPE3 = 3,
KLEE = 2,
A_NOISY_PERSON = 3,
TRICKERTYPE4 = 4, TRICKERTYPE4 = 4,
TrickerType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(), TrickerType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::min(),
TrickerType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max() TrickerType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<int32_t>::max()


+ 41
- 10
CAPI/python/PyAPI/AI.py View File

@@ -2,6 +2,8 @@ import PyAPI.structures as THUAI6
from PyAPI.Interface import IStudentAPI, ITrickerAPI, IAI from PyAPI.Interface import IStudentAPI, ITrickerAPI, IAI
from typing import Union, Final, cast from typing import Union, Final, cast


import time



class Setting: class Setting:
# 为假则play()期间确保游戏状态不更新,为真则只保证游戏状态在调用相关方法时不更新 # 为假则play()期间确保游戏状态不更新,为真则只保证游戏状态在调用相关方法时不更新
@@ -39,20 +41,49 @@ class AssistFunction:
return grid // numOfGridPerCell return grid // numOfGridPerCell




arrive: bool = False


class AI(IAI): class AI(IAI):
# 选手在这里实现自己的逻辑,要求和上面选择的阵营保持一致 # 选手在这里实现自己的逻辑,要求和上面选择的阵营保持一致
def StudentPlay(self, api: IStudentAPI) -> None: def StudentPlay(self, api: IStudentAPI) -> None:
studentSelfInfo = api.GetSelfInfo()

if studentSelfInfo.playerID == 0:
api.SendMessage(1, "Hello, I'm player 0 using python interface!")
if studentSelfInfo.playerID == 1:
api.SendMessage(0, "Hello, I'm player 1 using python interface!")
api.Attack(float('nan'))
time.sleep(0.5)
api.PrintSelfInfo()
# api.SendMessage(4, "Hello World!")
# api.PrintSelfInfo()
# global arrive
# if not arrive:
# if api.GetSelfInfo().x < 25500:
# api.MoveDown(50)
# return
# if api.GetSelfInfo().y > 10500:
# api.MoveLeft(50)
# return
# arrive = True
# else:
# api.SkipWindow()
# # time.sleep(1)

# api.PrintSelfInfo()

# if api.GetSelfInfo().y < 18500:
# api.MoveRight(50)
# return
# api.StartLearning()

# if api.GetSelfInfo().y > 7000:
# api.MoveLeft(50)
# return
# if api.GetSelfInfo().x > 20500:
# api.MoveUp(50)
# return
# if api.GetSelfInfo().y > 4500:
# api.MoveLeft(50)
# return

api.PrintTricker()


if api.HaveMessage():
message = api.GetMessage()
api.Print(
f"Recieved Message from player {message[0]}: {message[1]}")
return return


def TrickerPlay(self, api: ITrickerAPI) -> None: def TrickerPlay(self, api: ITrickerAPI) -> None:


+ 3
- 3
CAPI/python/PyAPI/API.py View File

@@ -2,7 +2,7 @@ import PyAPI.structures as THUAI6
from PyAPI.Interface import ILogic, IStudentAPI, ITrickerAPI, IGameTimer, IAI from PyAPI.Interface import ILogic, IStudentAPI, ITrickerAPI, IGameTimer, IAI
from math import pi from math import pi
from concurrent.futures import ThreadPoolExecutor, Future from concurrent.futures import ThreadPoolExecutor, Future
from typing import List, cast
from typing import List, cast, Tuple




class StudentAPI(IStudentAPI, IGameTimer): class StudentAPI(IStudentAPI, IGameTimer):
@@ -71,7 +71,7 @@ class StudentAPI(IStudentAPI, IGameTimer):
def HaveMessage(self) -> bool: def HaveMessage(self) -> bool:
return self.__logic.HaveMessage() return self.__logic.HaveMessage()


def GetMessage(self) -> tuple[int, str]:
def GetMessage(self) -> Tuple[int, str]:
return self.__logic.GetMessage() return self.__logic.GetMessage()


# 等待下一帧 # 等待下一帧
@@ -238,7 +238,7 @@ class TrickerAPI(ITrickerAPI, IGameTimer):
def HaveMessage(self) -> bool: def HaveMessage(self) -> bool:
return self.__logic.HaveMessage() return self.__logic.HaveMessage()


def GetMessage(self) -> tuple[int, str]:
def GetMessage(self) -> Tuple[int, str]:
return self.__logic.GetMessage() return self.__logic.GetMessage()


# 等待下一帧 # 等待下一帧


+ 5
- 5
CAPI/python/PyAPI/DebugAPI.py View File

@@ -1,6 +1,6 @@
from math import pi from math import pi
from concurrent.futures import ThreadPoolExecutor, Future from concurrent.futures import ThreadPoolExecutor, Future
from typing import List, cast
from typing import List, cast, Tuple
import logging import logging
import os import os
import datetime import datetime
@@ -18,7 +18,7 @@ class StudentDebugAPI(IStudentAPI, IGameTimer):
self.__logger = logging.getLogger("api " + str(playerID)) self.__logger = logging.getLogger("api " + str(playerID))
self.__logger.setLevel(logging.DEBUG) self.__logger.setLevel(logging.DEBUG)
formatter = logging.Formatter( formatter = logging.Formatter(
"[%(name)s] [%(asctime)s] [%(levelname)s] %(message)s", "%H:%M:%S.%e")
"[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s", '%H:%M:%S')
# 确保文件存在 # 确保文件存在
if not os.path.exists(os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + "/logs"): if not os.path.exists(os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + "/logs"):
os.makedirs(os.path.dirname(os.path.dirname( os.makedirs(os.path.dirname(os.path.dirname(
@@ -225,7 +225,7 @@ class StudentDebugAPI(IStudentAPI, IGameTimer):
f"HaveMessage: failed at {self.__GetTime()}ms") f"HaveMessage: failed at {self.__GetTime()}ms")
return result return result


def GetMessage(self) -> tuple[int, str]:
def GetMessage(self) -> Tuple[int, str]:
self.__logger.info( self.__logger.info(
f"GetMessage: called at {self.__GetTime()}ms") f"GetMessage: called at {self.__GetTime()}ms")
result = self.__logic.GetMessage() result = self.__logic.GetMessage()
@@ -452,7 +452,7 @@ class TrickerDebugAPI(ITrickerAPI, IGameTimer):
self.__logger = logging.getLogger("api " + str(playerID)) self.__logger = logging.getLogger("api " + str(playerID))
self.__logger.setLevel(logging.DEBUG) self.__logger.setLevel(logging.DEBUG)
formatter = logging.Formatter( formatter = logging.Formatter(
"[%(name)s] [%(asctime)s] [%(levelname)s] %(message)s", "%H:%M:%S.%e")
"[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s", '%H:%M:%S')
# 确保文件存在 # 确保文件存在
if not os.path.exists(os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + "/logs"): if not os.path.exists(os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + "/logs"):
os.makedirs(os.path.dirname(os.path.dirname( os.makedirs(os.path.dirname(os.path.dirname(
@@ -661,7 +661,7 @@ class TrickerDebugAPI(ITrickerAPI, IGameTimer):
f"HaveMessage: failed at {self.__GetTime()}ms") f"HaveMessage: failed at {self.__GetTime()}ms")
return result return result


def GetMessage(self) -> tuple[int, str]:
def GetMessage(self) -> Tuple[int, str]:
self.__logger.info( self.__logger.info(
f"GetMessage: called at {self.__GetTime()}ms") f"GetMessage: called at {self.__GetTime()}ms")
result = self.__logic.GetMessage() result = self.__logic.GetMessage()


+ 3
- 3
CAPI/python/PyAPI/Interface.py View File

@@ -1,4 +1,4 @@
from typing import List, Union
from typing import List, Union, Tuple
from concurrent.futures import Future from concurrent.futures import Future
from abc import abstractmethod, ABCMeta from abc import abstractmethod, ABCMeta
import PyAPI.structures as THUAI6 import PyAPI.structures as THUAI6
@@ -85,7 +85,7 @@ class ILogic(metaclass=ABCMeta):
pass pass


@abstractmethod @abstractmethod
def GetMessage(self) -> tuple[int, str]:
def GetMessage(self) -> Tuple[int, str]:
pass pass


@abstractmethod @abstractmethod
@@ -227,7 +227,7 @@ class IAPI(metaclass=ABCMeta):
pass pass


@abstractmethod @abstractmethod
def GetMessage(self) -> tuple[int, str]:
def GetMessage(self) -> Tuple[int, str]:
pass pass


# 等待下一帧 # 等待下一帧


+ 6
- 4
CAPI/python/PyAPI/logic.py View File

@@ -1,6 +1,5 @@
import os import os
from abc import abstractmethod
from typing import List, Union, Callable
from typing import List, Union, Callable, Tuple
import threading import threading
import logging import logging
import proto.MessageType_pb2 as MessageType import proto.MessageType_pb2 as MessageType
@@ -96,6 +95,9 @@ class Logic(ILogic):


def GetPlaceType(self, x: int, y: int) -> THUAI6.PlaceType: def GetPlaceType(self, x: int, y: int) -> THUAI6.PlaceType:
with self.__mtxState: with self.__mtxState:
if x < 0 or x >= len(self.__currentState.gameMap) or y < 0 or y >= len(self.__currentState.gameMap[0]):
self.__logger.warning("Invalid position")
return THUAI6.PlaceType.NullPlaceType
self.__logger.debug("Called GetPlaceType") self.__logger.debug("Called GetPlaceType")
return self.__currentState.gameMap[x][y] return self.__currentState.gameMap[x][y]


@@ -182,7 +184,7 @@ class Logic(ILogic):
self.__logger.debug("Called HaveMessage") self.__logger.debug("Called HaveMessage")
return not self.__messageQueue.empty() return not self.__messageQueue.empty()


def GetMessage(self) -> tuple[int, str]:
def GetMessage(self) -> Tuple[int, str]:
self.__logger.debug("Called GetMessage") self.__logger.debug("Called GetMessage")
if self.__messageQueue.empty(): if self.__messageQueue.empty():
self.__logger.warning("Message queue is empty!") self.__logger.warning("Message queue is empty!")
@@ -544,7 +546,7 @@ class Logic(ILogic):
# 建立日志组件 # 建立日志组件
self.__logger.setLevel(logging.DEBUG) self.__logger.setLevel(logging.DEBUG)
formatter = logging.Formatter( formatter = logging.Formatter(
"[%(name)s] [%(asctime)s] [%(levelname)s] %(message)s", "%H:%M:%S.%e")
"[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s", '%H:%M:%S')
# 确保文件存在 # 确保文件存在
if not os.path.exists(os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + "/logs"): if not os.path.exists(os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + "/logs"):
os.makedirs(os.path.dirname(os.path.dirname( os.makedirs(os.path.dirname(os.path.dirname(


+ 7
- 6
CAPI/python/PyAPI/main.py View File

@@ -26,12 +26,12 @@ def THUAI6Main(argv: List[str], AIBuilder: Callable) -> None:
help="Server`s Port 8888 in default", dest="sPort", default="8888") help="Server`s Port 8888 in default", dest="sPort", default="8888")
parser.add_argument("-p", type=int, required=True, parser.add_argument("-p", type=int, required=True,
help="Player`s ID", dest="pID", choices=[0, 1, 2, 3, 4]) help="Player`s ID", dest="pID", choices=[0, 1, 2, 3, 4])
parser.add_argument("-d", type=bool, required=False,
help="Set this flag to save the debug log to ./logs folder", dest="file", default=False, const=True, nargs='?')
parser.add_argument("-o", type=bool, required=False,
help="Set this flag to print the debug log to the screen", dest="screen", default=False, const=True, nargs='?')
parser.add_argument("-w", type=bool, required=False,
help="Set this flag to only print warning on the screen", dest="warnOnly", default=False, const=True, nargs='?')
parser.add_argument("-d", action='store_true',
help="Set this flag to save the debug log to ./logs folder", dest="file")
parser.add_argument("-o", action='store_true',
help="Set this flag to print the debug log to the screen", dest="screen")
parser.add_argument("-w", action='store_true',
help="Set this flag to only print warning on the screen", dest="warnOnly")
args = parser.parse_args() args = parser.parse_args()
pID = args.pID pID = args.pID
sIP = args.sIP sIP = args.sIP
@@ -39,6 +39,7 @@ def THUAI6Main(argv: List[str], AIBuilder: Callable) -> None:
file = args.file file = args.file
screen = args.screen screen = args.screen
warnOnly = args.warnOnly warnOnly = args.warnOnly
print(warnOnly)
logic = Logic(pID) logic = Logic(pID)
logic.Main(AIBuilder, sIP, sPort, file, screen, warnOnly) logic.Main(AIBuilder, sIP, sPort, file, screen, warnOnly)




+ 15
- 8
CAPI/python/PyAPI/structures.py View File

@@ -1,6 +1,11 @@
from enum import Enum from enum import Enum
from typing import List, Dict, Tuple
from typing import List, Dict
import sys


if sys.version_info < (3, 9):
from typing import Tuple
else:
Tuple = tuple


class GameState(Enum): class GameState(Enum):
NullGameState = 0 NullGameState = 0
@@ -42,7 +47,7 @@ class PropType(Enum):
Key5 = 2 Key5 = 2
Key6 = 3 Key6 = 3
AddSpeed = 4 AddSpeed = 4
AddLifeOrAp = 5
AddLifeOrClairaudience = 5
AddHpOrAp = 6 AddHpOrAp = 6
ShieldOrSpear = 7 ShieldOrSpear = 7
RecoveryFromDizziness = 8 RecoveryFromDizziness = 8
@@ -62,6 +67,8 @@ class StudentType(Enum):
Athlete = 1 Athlete = 1
Teacher = 2 Teacher = 2
StraightAStudent = 3 StraightAStudent = 3
Robot = 4
TechOtaku = 5




class TrickerType(Enum): class TrickerType(Enum):
@@ -200,12 +207,12 @@ class BombedBullet:




class GameMap: class GameMap:
classroomState: Dict[tuple[int, int], int] = {}
gateState: Dict[tuple[int, int], int] = {}
chestState: Dict[tuple[int, int], int] = {}
doorState: Dict[tuple[int, int], bool] = {}
doorProgress: Dict[tuple[int, int], int] = {}
hiddenGateState: Dict[tuple[int, int], HiddenGateState] = {}
classroomState: Dict[Tuple[int, int], int] = {}
gateState: Dict[Tuple[int, int], int] = {}
chestState: Dict[Tuple[int, int], int] = {}
doorState: Dict[Tuple[int, int], bool] = {}
doorProgress: Dict[Tuple[int, int], int] = {}
hiddenGateState: Dict[Tuple[int, int], HiddenGateState] = {}




class GameInfo: class GameInfo:


+ 25
- 21
CAPI/python/PyAPI/utils.py View File

@@ -90,7 +90,7 @@ class Proto2THUAI6(NoInstance):
MessageType.KEY6: THUAI6.PropType.Key6, MessageType.KEY6: THUAI6.PropType.Key6,
MessageType.ADD_SPEED: THUAI6.PropType.AddSpeed, MessageType.ADD_SPEED: THUAI6.PropType.AddSpeed,
MessageType.ADD_HP_OR_AP: THUAI6.PropType.AddHpOrAp, MessageType.ADD_HP_OR_AP: THUAI6.PropType.AddHpOrAp,
MessageType.ADD_LIFE_OR_AP: THUAI6.PropType.AddLifeOrAp,
MessageType.ADD_LIFE_OR_CLAIRAUDIENCE: THUAI6.PropType.AddLifeOrClairaudience,
MessageType.SHIELD_OR_SPEAR: THUAI6.PropType.ShieldOrSpear, MessageType.SHIELD_OR_SPEAR: THUAI6.PropType.ShieldOrSpear,
MessageType.RECOVERY_FROM_DIZZINESS: THUAI6.PropType.RecoveryFromDizziness, } MessageType.RECOVERY_FROM_DIZZINESS: THUAI6.PropType.RecoveryFromDizziness, }


@@ -102,29 +102,31 @@ class Proto2THUAI6(NoInstance):
studentTypeDict: Final[dict] = { studentTypeDict: Final[dict] = {
MessageType.NULL_STUDENT_TYPE: THUAI6.StudentType.NullStudentType, MessageType.NULL_STUDENT_TYPE: THUAI6.StudentType.NullStudentType,
MessageType.ATHLETE: THUAI6.StudentType.Athlete, MessageType.ATHLETE: THUAI6.StudentType.Athlete,
MessageType.STUDENTTYPE2: THUAI6.StudentType.Teacher,
MessageType.STUDENTTYPE3: THUAI6.StudentType.StraightAStudent, }
MessageType.TEACHER: THUAI6.StudentType.Teacher,
MessageType.STRAIGHT_A_STUDENT: THUAI6.StudentType.StraightAStudent,
MessageType.ROBOT: THUAI6.StudentType.Robot,
MessageType.TECH_OTAKU: THUAI6.StudentType.TechOtaku, }


trickerTypeDict: Final[dict] = { trickerTypeDict: Final[dict] = {
MessageType.NULL_TRICKER_TYPE: THUAI6.TrickerType.NullTrickerType, MessageType.NULL_TRICKER_TYPE: THUAI6.TrickerType.NullTrickerType,
MessageType.ASSASSIN: THUAI6.TrickerType.Assassin, MessageType.ASSASSIN: THUAI6.TrickerType.Assassin,
MessageType.TRICKERTYPE2: THUAI6.TrickerType.Klee,
MessageType.TRICKERTYPE3: THUAI6.TrickerType.ANoisyPerson, }
MessageType.KLEE: THUAI6.TrickerType.Klee,
MessageType.A_NOISY_PERSON: THUAI6.TrickerType.ANoisyPerson, }


studentBuffTypeDict: Final[dict] = { studentBuffTypeDict: Final[dict] = {
MessageType.NULL_SBUFF_TYPE: THUAI6.StudentBuffType.NullStudentBuffType, MessageType.NULL_SBUFF_TYPE: THUAI6.StudentBuffType.NullStudentBuffType,
MessageType.SBUFFTYPE1: THUAI6.StudentBuffType.AddSpeed,
MessageType.SBUFFTYPE2: THUAI6.StudentBuffType.AddLife,
MessageType.SBUFFTYPE3: THUAI6.StudentBuffType.Shield,
MessageType.SBUFFTYPE4: THUAI6.StudentBuffType.Invisible, }
MessageType.STUDENT_ADD_SPEED: THUAI6.StudentBuffType.AddSpeed,
MessageType.ADD_LIFE: THUAI6.StudentBuffType.AddLife,
MessageType.SHIELD: THUAI6.StudentBuffType.Shield,
MessageType.STUDENT_INVISIBLE: THUAI6.StudentBuffType.Invisible, }


trickerBuffTypeDict: Final[dict] = { trickerBuffTypeDict: Final[dict] = {
MessageType.NULL_TBUFF_TYPE: THUAI6.TrickerBuffType.NullTrickerBuffType, MessageType.NULL_TBUFF_TYPE: THUAI6.TrickerBuffType.NullTrickerBuffType,
MessageType.TBUFFTYPE1: THUAI6.TrickerBuffType.AddSpeed,
MessageType.TBUFFTYPE2: THUAI6.TrickerBuffType.Spear,
MessageType.TBUFFTYPE3: THUAI6.TrickerBuffType.AddAp,
MessageType.TBUFFTYPE4: THUAI6.TrickerBuffType.Clairaudience,
MessageType.INVISIBLE: THUAI6.TrickerBuffType.Invisible, }
MessageType.TRICKER_ADD_SPEED: THUAI6.TrickerBuffType.AddSpeed,
MessageType.SPEAR: THUAI6.TrickerBuffType.Spear,
MessageType.ADD_AP: THUAI6.TrickerBuffType.AddAp,
MessageType.CLAIRAUDIENCE: THUAI6.TrickerBuffType.Clairaudience,
MessageType.TRICKER_INVISIBLE: THUAI6.TrickerBuffType.Invisible, }


playerStateDict: Final[dict] = { playerStateDict: Final[dict] = {
MessageType.NULL_STATUS: THUAI6.PlayerState.NullState, MessageType.NULL_STATUS: THUAI6.PlayerState.NullState,
@@ -156,9 +158,9 @@ class Proto2THUAI6(NoInstance):
bulletTypeDict: Final[dict] = { bulletTypeDict: Final[dict] = {
MessageType.NULL_BULLET_TYPE: THUAI6.BulletType.NullBulletType, MessageType.NULL_BULLET_TYPE: THUAI6.BulletType.NullBulletType,
MessageType.FLYING_KNIFE: THUAI6.BulletType.FlyingKnife, MessageType.FLYING_KNIFE: THUAI6.BulletType.FlyingKnife,
MessageType.FAST_BULLET: THUAI6.BulletType.BombBomb,
MessageType.BOMB_BOMB: THUAI6.BulletType.BombBomb,
MessageType.COMMON_ATTACK_OF_TRICKER: THUAI6.BulletType.CommonAttackOfTricker, MessageType.COMMON_ATTACK_OF_TRICKER: THUAI6.BulletType.CommonAttackOfTricker,
MessageType.ORDINARY_BULLET: THUAI6.BulletType.JumpyDumpty,
MessageType.JUMPY_DUMPTY: THUAI6.BulletType.JumpyDumpty,
MessageType.ATOM_BOMB: THUAI6.BulletType.AtomBomb, } MessageType.ATOM_BOMB: THUAI6.BulletType.AtomBomb, }


# 用于将Proto的对象转为THUAI6的对象 # 用于将Proto的对象转为THUAI6的对象
@@ -303,14 +305,16 @@ class THUAI62Proto(NoInstance):
studentTypeDict: Final[dict] = { studentTypeDict: Final[dict] = {
THUAI6.StudentType.NullStudentType: MessageType.NULL_STUDENT_TYPE, THUAI6.StudentType.NullStudentType: MessageType.NULL_STUDENT_TYPE,
THUAI6.StudentType.Athlete: MessageType.ATHLETE, THUAI6.StudentType.Athlete: MessageType.ATHLETE,
THUAI6.StudentType.Teacher: MessageType.STUDENTTYPE2,
THUAI6.StudentType.StraightAStudent: MessageType.STUDENTTYPE3, }
THUAI6.StudentType.Teacher: MessageType.TEACHER,
THUAI6.StudentType.StraightAStudent: MessageType.STRAIGHT_A_STUDENT,
THUAI6.StudentType.Robot: MessageType.ROBOT,
THUAI6.StudentType.TechOtaku: MessageType.TECH_OTAKU, }


trickerTypeDict: Final[dict] = { trickerTypeDict: Final[dict] = {
THUAI6.TrickerType.NullTrickerType: MessageType.NULL_TRICKER_TYPE, THUAI6.TrickerType.NullTrickerType: MessageType.NULL_TRICKER_TYPE,
THUAI6.TrickerType.Assassin: MessageType.ASSASSIN, THUAI6.TrickerType.Assassin: MessageType.ASSASSIN,
THUAI6.TrickerType.Klee: MessageType.TRICKERTYPE2,
THUAI6.TrickerType.ANoisyPerson: MessageType.TRICKERTYPE3, }
THUAI6.TrickerType.Klee: MessageType.KLEE,
THUAI6.TrickerType.ANoisyPerson: MessageType.A_NOISY_PERSON, }


propTypeDict: Final[dict] = { propTypeDict: Final[dict] = {
THUAI6.PropType.NullPropType: MessageType.NULL_PROP_TYPE, THUAI6.PropType.NullPropType: MessageType.NULL_PROP_TYPE,
@@ -318,7 +322,7 @@ class THUAI62Proto(NoInstance):
THUAI6.PropType.Key5: MessageType.KEY5, THUAI6.PropType.Key5: MessageType.KEY5,
THUAI6.PropType.Key6: MessageType.KEY6, THUAI6.PropType.Key6: MessageType.KEY6,
THUAI6.PropType.AddHpOrAp: MessageType.ADD_HP_OR_AP, THUAI6.PropType.AddHpOrAp: MessageType.ADD_HP_OR_AP,
THUAI6.PropType.AddLifeOrAp: MessageType.ADD_LIFE_OR_AP,
THUAI6.PropType.AddLifeOrClairaudience: MessageType.ADD_LIFE_OR_CLAIRAUDIENCE,
THUAI6.PropType.AddSpeed: MessageType.ADD_SPEED, THUAI6.PropType.AddSpeed: MessageType.ADD_SPEED,
THUAI6.PropType.ShieldOrSpear: MessageType.SHIELD_OR_SPEAR, } THUAI6.PropType.ShieldOrSpear: MessageType.SHIELD_OR_SPEAR, }




+ 12
- 0
CAPI/python/generate_proto.sh View File

@@ -0,0 +1,12 @@
#!/usr/bin/env bash

python3 -m pip install -r requirements.txt

mkdir -p proto

python3 -m grpc_tools.protoc -I../../dependency/proto/ --python_out=./proto --pyi_out=./proto MessageType.proto
python3 -m grpc_tools.protoc -I../../dependency/proto/ --python_out=./proto --pyi_out=./proto Message2Clients.proto
python3 -m grpc_tools.protoc -I../../dependency/proto/ --python_out=./proto --pyi_out=./proto Message2Server.proto
python3 -m grpc_tools.protoc -I../../dependency/proto/ --python_out=./proto --pyi_out=./proto --grpc_python_out=./proto Services.proto



+ 2
- 2
CAPI/python/requirements.txt View File

@@ -1,2 +1,2 @@
grpcio==1.53.0
grpcio-tools==1.53.0
grpcio==1.52.0
grpcio-tools==1.52.0

+ 3
- 1
CAPI/python/run.sh View File

@@ -1,2 +1,4 @@
#!/usr/bin/env bash

python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 0 -d -o & python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 0 -d -o &
python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 1 -d -o &
# python PyAPI/main.py -I 172.22.32.1 -P 8888 -p 1 -d -o &

+ 2
- 0
logic/Client/MainWindow.xaml.cs View File

@@ -999,6 +999,7 @@ namespace Client
TreatAndRescueMsg msgR = new() TreatAndRescueMsg msgR = new()
{ {
PlayerId = playerID, PlayerId = playerID,
ToPlayerId = -1,
}; };
client.StartRescueMate(msgR); client.StartRescueMate(msgR);
break; break;
@@ -1006,6 +1007,7 @@ namespace Client
TreatAndRescueMsg msgT = new() TreatAndRescueMsg msgT = new()
{ {
PlayerId = playerID, PlayerId = playerID,
ToPlayerId = -1,
}; };
client.StartTreatMate(msgT); client.StartTreatMate(msgT);
break; break;


+ 1
- 1
logic/Client/Properties/launchSettings.json View File

@@ -2,7 +2,7 @@
"profiles": { "profiles": {
"Client": { "Client": {
"commandName": "Project", "commandName": "Project",
"commandLineArgs": " --cl --port 8888 --characterID 0 --type 1 --occupation 1"
"commandLineArgs": "--ip 183.172.235.138 --cl --port 8888 --characterID 0 --type 1 --occupation 1"
} }
} }
} }

+ 0
- 2
logic/Gaming/ActionManager.cs View File

@@ -202,8 +202,6 @@ namespace Gaming
playerTreated.HP == playerTreated.MaxHp || !GameData.ApproachToInteract(playerTreated.Position, player.Position)) playerTreated.HP == playerTreated.MaxHp || !GameData.ApproachToInteract(playerTreated.Position, player.Position))
return false; return false;


Preparation.Utility.Debugger.Output(player, "treat " + playerTreated.ToString());

if (playerTreated.HP + playerTreated.DegreeOfTreatment >= playerTreated.MaxHp) if (playerTreated.HP + playerTreated.DegreeOfTreatment >= playerTreated.MaxHp)
{ {
playerTreated.HP = playerTreated.MaxHp; playerTreated.HP = playerTreated.MaxHp;


+ 133
- 6
logic/Server/RpcServices.cs View File

@@ -54,6 +54,22 @@ namespace Server
semaDict.Add(request.PlayerId, temp); semaDict.Add(request.PlayerId, temp);
} }
} }
do
{
semaDict[request.PlayerId].Item1.Wait();
try
{
if (currentGameInfo != null)
{
await responseStream.WriteAsync(currentGameInfo);
//Console.WriteLine("Send!");
}
}
finally
{
semaDict[request.PlayerId].Item2.Release();
}
} while (game.GameMap.Timer.IsGaming);
return; return;
} }


@@ -112,9 +128,19 @@ namespace Server
#if DEBUG #if DEBUG
Console.WriteLine($"Attack ID: {request.PlayerId}"); Console.WriteLine($"Attack ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
if (request.Angle == double.NaN)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
game.Attack(gameID, request.Angle); game.Attack(gameID, request.Angle);
BoolRes boolRes = new();
boolRes.ActSuccess = true; boolRes.ActSuccess = true;
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
} }
@@ -125,8 +151,18 @@ namespace Server
#if DEBUG #if DEBUG
Console.WriteLine($"Move ID: {request.PlayerId}, TimeInMilliseconds: {request.TimeInMilliseconds}"); Console.WriteLine($"Move ID: {request.PlayerId}, TimeInMilliseconds: {request.TimeInMilliseconds}");
#endif #endif
var gameID = communicationToGameID[request.PlayerId];
MoveRes moveRes = new(); MoveRes moveRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
moveRes.ActSuccess = false;
return Task.FromResult(moveRes);
}
if (request.Angle == double.NaN)
{
moveRes.ActSuccess = false;
return Task.FromResult(moveRes);
}
var gameID = communicationToGameID[request.PlayerId];
game.MovePlayer(gameID, (int)request.TimeInMilliseconds, request.Angle); game.MovePlayer(gameID, (int)request.TimeInMilliseconds, request.Angle);
// 之后game.MovePlayer可能改为bool类 // 之后game.MovePlayer可能改为bool类
moveRes.ActSuccess = true; moveRes.ActSuccess = true;
@@ -137,6 +173,11 @@ namespace Server
public override Task<BoolRes> SendMessage(SendMsg request, ServerCallContext context) public override Task<BoolRes> SendMessage(SendMsg request, ServerCallContext context)
{ {
var boolRes = new BoolRes(); var boolRes = new BoolRes();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
if (!ValidPlayerID(request.PlayerId) || !ValidPlayerID(request.ToPlayerId) if (!ValidPlayerID(request.PlayerId) || !ValidPlayerID(request.ToPlayerId)
|| PlayerIDToTeamID(request.PlayerId) != PlayerIDToTeamID(request.ToPlayerId) || request.PlayerId == request.ToPlayerId) || PlayerIDToTeamID(request.PlayerId) != PlayerIDToTeamID(request.ToPlayerId) || request.PlayerId == request.ToPlayerId)
{ {
@@ -174,6 +215,11 @@ namespace Server
Console.WriteLine($"PickProp ID: {request.PlayerId}"); Console.WriteLine($"PickProp ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.PickProp(gameID, CopyInfo.ToPropType(request.PropType)); boolRes.ActSuccess = game.PickProp(gameID, CopyInfo.ToPropType(request.PropType));
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
@@ -185,6 +231,11 @@ namespace Server
Console.WriteLine($"UseProp ID: {request.PlayerId}"); Console.WriteLine($"UseProp ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
game.UseProp(gameID, CopyInfo.ToPropType(request.PropType)); game.UseProp(gameID, CopyInfo.ToPropType(request.PropType));
boolRes.ActSuccess = true; boolRes.ActSuccess = true;
@@ -196,6 +247,11 @@ namespace Server
Console.WriteLine($"ThrowProp ID: {request.PlayerId}"); Console.WriteLine($"ThrowProp ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
game.ThrowProp(gameID, CopyInfo.ToPropType(request.PropType)); game.ThrowProp(gameID, CopyInfo.ToPropType(request.PropType));
boolRes.ActSuccess = true; boolRes.ActSuccess = true;
@@ -207,6 +263,11 @@ namespace Server
Console.WriteLine($"UseSkill ID: {request.PlayerId}"); Console.WriteLine($"UseSkill ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.UseActiveSkill(gameID, request.SkillId); boolRes.ActSuccess = game.UseActiveSkill(gameID, request.SkillId);
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
@@ -218,6 +279,11 @@ namespace Server
Console.WriteLine($"Graduate ID: {request.PlayerId}"); Console.WriteLine($"Graduate ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.Escape(gameID); boolRes.ActSuccess = game.Escape(gameID);
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
@@ -228,9 +294,22 @@ namespace Server
Console.WriteLine($"StartRescueMate ID: {request.PlayerId}"); Console.WriteLine($"StartRescueMate ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
var toGameID = communicationToGameID[request.ToPlayerId];
boolRes.ActSuccess = game.Rescue(gameID, toGameID);
if (request.ToPlayerId >= 0 && request.ToPlayerId < options.MaxStudentCount)
{
var toGameID = communicationToGameID[request.ToPlayerId];
boolRes.ActSuccess = game.Rescue(gameID, toGameID);
}
else
{
boolRes.ActSuccess = game.Rescue(gameID);
}

return Task.FromResult(boolRes); return Task.FromResult(boolRes);
} }
public override Task<BoolRes> StartTreatMate(TreatAndRescueMsg request, ServerCallContext context) public override Task<BoolRes> StartTreatMate(TreatAndRescueMsg request, ServerCallContext context)
@@ -239,9 +318,22 @@ namespace Server
Console.WriteLine($"StartTreatMate ID: {request.PlayerId}"); Console.WriteLine($"StartTreatMate ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
var toGameID = communicationToGameID[request.ToPlayerId];
boolRes.ActSuccess = game.Treat(gameID, toGameID);
if (request.ToPlayerId >= 0 && request.ToPlayerId < options.MaxStudentCount)
{
var toGameID = communicationToGameID[request.ToPlayerId];
boolRes.ActSuccess = game.Treat(gameID, toGameID);
}
else
{
boolRes.ActSuccess = game.Treat(gameID);
}

return Task.FromResult(boolRes); return Task.FromResult(boolRes);
} }
public override Task<BoolRes> StartLearning(IDMsg request, ServerCallContext context) public override Task<BoolRes> StartLearning(IDMsg request, ServerCallContext context)
@@ -250,6 +342,11 @@ namespace Server
Console.WriteLine($"StartLearning ID: {request.PlayerId}"); Console.WriteLine($"StartLearning ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.Fix(gameID); boolRes.ActSuccess = game.Fix(gameID);
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
@@ -260,6 +357,11 @@ namespace Server
Console.WriteLine($"StartOpenChest ID: {request.PlayerId}"); Console.WriteLine($"StartOpenChest ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.OpenChest(gameID); boolRes.ActSuccess = game.OpenChest(gameID);
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
@@ -271,6 +373,11 @@ namespace Server
Console.WriteLine($"StartOpenGate ID: {request.PlayerId}"); Console.WriteLine($"StartOpenGate ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.OpenDoorway(gameID); boolRes.ActSuccess = game.OpenDoorway(gameID);
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
@@ -281,6 +388,11 @@ namespace Server
Console.WriteLine($"OpenDoor ID: {request.PlayerId}"); Console.WriteLine($"OpenDoor ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.LockOrOpenDoor(gameID); boolRes.ActSuccess = game.LockOrOpenDoor(gameID);
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
@@ -292,6 +404,11 @@ namespace Server
Console.WriteLine($"CloseDoor ID: {request.PlayerId}"); Console.WriteLine($"CloseDoor ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.LockOrOpenDoor(gameID); boolRes.ActSuccess = game.LockOrOpenDoor(gameID);
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
@@ -303,6 +420,11 @@ namespace Server
Console.WriteLine($"EndAllAction ID: {request.PlayerId}"); Console.WriteLine($"EndAllAction ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.Stop(gameID); boolRes.ActSuccess = game.Stop(gameID);
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
@@ -315,6 +437,11 @@ namespace Server
Console.WriteLine($"SkipWindow ID: {request.PlayerId}"); Console.WriteLine($"SkipWindow ID: {request.PlayerId}");
#endif #endif
BoolRes boolRes = new(); BoolRes boolRes = new();
if (request.PlayerId >= spectatorMinPlayerID)
{
boolRes.ActSuccess = false;
return Task.FromResult(boolRes);
}
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.ClimbingThroughWindow(gameID); boolRes.ActSuccess = game.ClimbingThroughWindow(gameID);
return Task.FromResult(boolRes); return Task.FromResult(boolRes);


+ 2
- 4
logic/cmd/gameServer.cmd View File

@@ -6,12 +6,10 @@ ping -n 2 127.0.0.1 > NUL


start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 4 --type 2 --occupation 1 start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 4 --type 2 --occupation 1


ping -n 2 127.0.0.1 > NUL

start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 0 --type 1 --occupation 2
start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 0 --type 1 --occupation 1


ping -n 2 127.0.0.1 > NUL ping -n 2 127.0.0.1 > NUL


start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 1 --type 1 --occupation 5
start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --port 8888 --characterID 1 --type 1 --occupation 3


ping -n 2 127.0.0.1 > NUL ping -n 2 127.0.0.1 > NUL

+ 4
- 0
logic/规则Logic.md View File

@@ -532,6 +532,10 @@
} }
~~~ ~~~


#### 喧哗者


### 学生(&老师) ### 学生(&老师)


#### 运动员 #### 运动员


Loading…
Cancel
Save