OSDN Git Service

update multi login
[internetcity/prototype.git] / vc2010_server / vc2010_server / CServerModel.cpp
1 #include "../../common/Environment.h"
2 #include "CServerModel.h"
3
4 #include <iostream>
5
6 ////////////////////////////////////////////////////////////////////////////////
7 // constructor
8 ////////////////////////////////////////////////////////////////////////////////
9 CServerModel::CServerModel()
10 {
11 }
12
13 ////////////////////////////////////////////////////////////////////////////////
14 // destructor
15 ////////////////////////////////////////////////////////////////////////////////
16 CServerModel::~CServerModel()
17 {
18         for(size_t i = 0; i < m_Connections.size(); i++){
19                 delete m_Connections[i].m_pConnection;
20         }
21         for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
22                 delete *p;
23         }
24 }
25
26 ////////////////////////////////////////////////////////////////////////////////
27 // initialize
28 ////////////////////////////////////////////////////////////////////////////////
29 bool CServerModel::initialize()
30 {
31         m_ServerSocket.initialize();
32         m_ServerSocket.openPort();
33
34         m_Connections.resize(MAX_CONNECTION_NUMBER);
35         for(size_t i = 0; i < m_Connections.size(); i++){
36                 ConnectionTuple temp;
37                 temp.m_pConnection = new CServerConnection();
38                 temp.m_pConnection->initialize();
39                 m_ServerSocket.accept(temp.m_pConnection);
40                 temp.m_pAvatarInformation = NULL;
41                 m_Connections[i] = temp;
42         }
43         return true;
44 }
45
46 ////////////////////////////////////////////////////////////////////////////////
47 // \8f\88\97\9d
48 ////////////////////////////////////////////////////////////////////////////////
49 bool CServerModel::process()
50 {
51         // \92Ê\90M\83N\83\89\83X\82©\82ç\83f\81[\83^\8eæ\93¾
52         for(ConnectionVector::iterator p = m_Connections.begin(); p != m_Connections.end(); p++){
53                 CommunicationData* a_pData;
54                 if(p->m_pConnection->receive(&a_pData)){
55                         // \83\8d\83O\83C\83\93\8f\88\97\9d\81i\83Z\83b\83V\83\87\83\93\82Æ\83\8d\83O\83C\83\93\83l\81[\83\80\82Æ\81i\83p\83X\83\8f\81[\83h\81j\82ð\93n\82·\81j
56                         if(a_pData->m_DataType == 'i'){
57                                 if(login(p, a_pData->m_Data.m_LoginData.m_Name)){
58                                         std::cout << "login " << a_pData->m_Data.m_LoginData.m_Name << std::endl;
59                                 }
60                         }
61                         // \83\8d\83O\83A\83E\83g\8f\88\97\9d
62                         else if(a_pData->m_DataType == 'o'){
63                                 logout(p, p->m_pAvatarInformation->m_Name);
64                         }
65                         // \8dÀ\95W\8eæ\93¾
66                         else if(a_pData->m_DataType == 'p'){
67                                 requestPosition(p);
68                         }
69                         // \83A\83N\83V\83\87\83\93\83R\83}\83\93\83h\82ð\8f\88\97\9d
70                         else if(a_pData->m_DataType == 'a'){
71                                 requestMove(p, a_pData->m_Data.m_ActionCommand.m_CommandType);
72                         }
73                 }
74         }
75
76         // \89¹\90º\82ð\8d\87\90¬
77
78         // \8eæ\93¾\83R\83}\83\93\83h\82É\91Î\82µ\82Ä\83f\81[\83^\91\97\90M
79         return true;
80 }
81
82 ////////////////////////////////////////////////////////////////////////////////
83 // login
84 ////////////////////////////////////////////////////////////////////////////////
85 bool CServerModel::login(ConnectionVector::iterator io_ConnectionIterator, const char* in_pLoginName)
86 {
87         AvatarInformation* temp = new AvatarInformation;
88         strcpy(temp->m_Name, in_pLoginName);
89         temp->m_Position[0] = 0;
90         temp->m_Position[1] = 0;
91         temp->m_Position[2] = 0;
92         temp->m_Direction[0] = 1;
93         temp->m_Direction[1] = 0;
94         temp->m_Direction[2] = 0;
95         temp->m_Radias = 0.3;
96         m_AvatarInformations.push_back(temp);
97
98         CommunicationData a_SendData;
99         a_SendData.m_DataType = 'i';
100         strcpy(a_SendData.m_Data.m_LoginData.m_Name, in_pLoginName);
101         io_ConnectionIterator->m_pConnection->send(&a_SendData);
102         io_ConnectionIterator->m_pAvatarInformation = temp;
103         return true;
104 }
105
106 ////////////////////////////////////////////////////////////////////////////////
107 // logout
108 ////////////////////////////////////////////////////////////////////////////////
109 bool CServerModel::logout(ConnectionVector::iterator io_ConnectionIterator, const char* in_pLoginName)
110 {
111         // \96¢\83\8d\83O\83C\83\93
112         if(io_ConnectionIterator->m_pAvatarInformation == NULL){
113                 return false;
114         }
115
116         CommunicationData a_SendData;
117         a_SendData.m_DataType = 'o';
118         strcpy(a_SendData.m_Data.m_LoginData.m_Name, in_pLoginName);
119         io_ConnectionIterator->m_pConnection->send(&a_SendData);
120
121         std::cout << "logout " << io_ConnectionIterator->m_pAvatarInformation->m_Name << std::endl;
122
123         // \83A\83o\83^\81[\82ð\8dí\8f\9c\82·\82é
124         for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
125                 if(*p == io_ConnectionIterator->m_pAvatarInformation){
126                         delete *p;
127                 }
128                 m_AvatarInformations.erase(p);
129                 break;
130         }
131         io_ConnectionIterator->m_pAvatarInformation = NULL;
132         return true;
133 }
134
135 ////////////////////////////////////////////////////////////////////////////////
136 // position
137 ////////////////////////////////////////////////////////////////////////////////
138 bool CServerModel::requestPosition(ConnectionVector::iterator io_ConnectionIterator)
139 {
140         // \96¢\83\8d\83O\83C\83\93
141         if(io_ConnectionIterator->m_pAvatarInformation == NULL){
142                 return false;
143         }
144
145         if(!m_AvatarInformations.empty()){
146                 for(AvatarInformationList::iterator p = m_AvatarInformations.begin(); p != m_AvatarInformations.end(); p++){
147                         CommunicationData a_SendData;
148                         a_SendData.m_DataType = 'p';
149                         strcpy(a_SendData.m_Data.m_AvatarData.m_Name, (*p)->m_Name);
150                         a_SendData.m_Data.m_AvatarData.m_Position[0] = (*p)->m_Position[0];
151                         a_SendData.m_Data.m_AvatarData.m_Position[1] = (*p)->m_Position[1];
152                         a_SendData.m_Data.m_AvatarData.m_Position[2] = (*p)->m_Position[2];
153                         a_SendData.m_Data.m_AvatarData.m_Direction[0] = (*p)->m_Direction[0];
154                         a_SendData.m_Data.m_AvatarData.m_Direction[1] = (*p)->m_Direction[1];
155                         a_SendData.m_Data.m_AvatarData.m_Direction[2] = (*p)->m_Direction[2];
156                         a_SendData.m_Data.m_AvatarData.m_Radias = (*p)->m_Radias;
157
158                         if(!io_ConnectionIterator->m_pConnection->send(&a_SendData)){
159                                 std::cout << "do not send position" << std::endl;
160                         }
161                 }
162         }
163         /*
164         else{
165                 CommunicationData a_SendData;
166                 a_SendBuffer.m_Length = sprintf(a_SendBuffer.m_Buffer, "p;");
167                 if(!io_pConnection->send(&a_SendBuffer)){
168                         std::cout << "do not send position" << std::endl;
169                 }
170         }
171         */
172         return true;
173 }
174
175 ////////////////////////////////////////////////////////////////////////////////
176 // move
177 ////////////////////////////////////////////////////////////////////////////////
178 bool CServerModel::requestMove(ConnectionVector::iterator io_ConnectionIterator, char in_pMoveDirection)
179 {
180         const double M_PI = 3.14159265357989;
181         // \90l\82Ì\95à\82­\91¬\93x\82ð1\95b\8aÔ\82É1m\82Æ\82·\82é
182         const double a_VelocityParTimes = 1.0 / 60;
183         // 2\95b\82Å\90U\82è\95Ô\82é\81i180\93x = pi\81j\82Æ\82·\82é\81B
184         const double a_RotateParTimes = M_PI / (2 * 60);
185
186         // \96¢\83\8d\83O\83C\83\93
187         if(io_ConnectionIterator->m_pAvatarInformation == NULL){
188                 return false;
189         }
190
191         AvatarInformation* a_pAvatarInformation = io_ConnectionIterator->m_pAvatarInformation;
192
193         if(in_pMoveDirection == 'f'){
194                 a_pAvatarInformation->m_Position[0] += a_pAvatarInformation->m_Direction[0] * a_VelocityParTimes;
195                 a_pAvatarInformation->m_Position[1] += a_pAvatarInformation->m_Direction[1] * a_VelocityParTimes;
196                 a_pAvatarInformation->m_Position[2] += a_pAvatarInformation->m_Direction[2] * a_VelocityParTimes;
197         }
198         // \8cã\95û\82Ö\88Ú\93®
199         else if(in_pMoveDirection == 'b'){
200                 a_pAvatarInformation->m_Position[0] -= a_pAvatarInformation->m_Direction[0] * a_VelocityParTimes;
201                 a_pAvatarInformation->m_Position[1] -= a_pAvatarInformation->m_Direction[1] * a_VelocityParTimes;
202                 a_pAvatarInformation->m_Position[2] -= a_pAvatarInformation->m_Direction[2] * a_VelocityParTimes;
203         }
204         // \89E\90ù\89ñ
205         else if(in_pMoveDirection == 'r'){
206                 double x = a_pAvatarInformation->m_Direction[0];
207                 double y = a_pAvatarInformation->m_Direction[1];
208                 a_pAvatarInformation->m_Direction[0] =  x * cos(a_RotateParTimes) + y * sin(a_RotateParTimes);
209                 a_pAvatarInformation->m_Direction[1] = -x * sin(a_RotateParTimes) + y * cos(a_RotateParTimes);
210         }
211         // \8d\90ù\89ñ
212         else if(in_pMoveDirection == 'l'){
213                 double x = a_pAvatarInformation->m_Direction[0];
214                 double y = a_pAvatarInformation->m_Direction[1];
215                 a_pAvatarInformation->m_Direction[0] =  x * cos(a_RotateParTimes) - y * sin(a_RotateParTimes);
216                 a_pAvatarInformation->m_Direction[1] =  x * sin(a_RotateParTimes) + y * cos(a_RotateParTimes);
217         }
218         return true;
219 }