76:- include(env_gen). 77
78:- dynamic bye_message_received/0. 79
86name_dev(clima06).
87
89:- set_debug_level(5). 90
91
92
99initializeInterfaces(L) :-
100 101 member([ipsim,SIP], L),
102 member([portsim, SP], L), 103 member([agentLogin, AL], L),
104 member([agentPass, AP], L), 105 string_to_number(SP, Port),
106 string_to_atom(SIP, IP),
107 assert(clima_location(IP, Port)), 108 assert(clima_agentid(AL, AP)), 109 110 report_message(system(2),'Establishing connection to CLIMA SIMULATOR'),
111 printKbInstructions,
112 connectToGameSimulator.
113
114finalizeInterfaces(_) :-
115 disconnectFromGameSimulator,
116 report_message(system(2), 'Disconnection from CLIMA SIMULATOR successful').
117
118
119
121printKbInstructions :-
122 writeln('*********************************************************'),
123 writeln('* NOTE: This is the CLIMA SIMULATOR device manager'),
124 writeln('* This window will show the communication'),
125 writeln('* with the CLIMA GAME SIMULATOR'),
126 writeln('*********************************************************'),
127 nl.
128
129
131connectToGameSimulator :-
132 clima_location(Host, Port),
133 clima_agentid(AgentUser, AgentPass),
134 clima_connect(Host, Port, comm_sim),
135 clima_authenticate(comm_sim, AgentUser, AgentPass, R), !,
136 (R = ok ->
137 report_message(system(2), 'Communication with CLIMA SIMULATOR established'),
138 assert(listen_to(socket, comm_sim, comm_sim)),
139 sleep(1),
140 report_exog_event(connected(climaServer), _)
141 ;
142 report_message(error, ['Cannot authenticate to game server: ',R])
143 ).
144
146disconnectFromGameSimulator :-
147 retractall(listen_to(socket, comm_sim, comm_sim)),
148 clima_disconnect(comm_sim).
149
150
151
160:- dynamic actionStatus/3. 161
162
164handle_stream(comm_sim) :-
165 get_socket_stream(comm_sim, read, Read),
166 at_end_of_stream(Read),
167 report_message(system(2), ['Game server disconnection']), !,
168 (bye_message_received ->
169 report_message(system(2),
170 ['Bye message was already received. Ready for termination.']),
171 disconnectFromGameSimulator
172
173 ;
174 repeat,
175 report_message(system(2), ['Reconnecting to game server...']),
176 disconnectFromGameSimulator,
177 sleep(5),
178 (connectToGameSimulator -> true ; fail)
179 ).
180
181
182
183handle_stream(comm_sim) :-
184 get_socket_stream(comm_sim, read, Read),
185 \+ at_end_of_stream(Read),
186 clima_receive_XML(comm_sim, XMLMess), !,
187 report_message(system(3), ['Message from game server: ', XMLMess]),
188 handle_xml_message(XMLMess).
189
190
191
192
195handle_xml_message(XMLMess) :-
196 unfold_clima_message(XMLMess, sim-start, TimeStamp, BodyXMLMess), !,
197 report_exog_event(simStart(TimeStamp, BodyXMLMess), _).
198handle_xml_message(XMLMess) :-
199 unfold_clima_message(XMLMess, request-action, TimeStamp, BodyXMLMess), !,
200 member(id(IdAction), BodyXMLMess),
201 member(deadline(Deadline), BodyXMLMess),
202 asserta(actionStatus(Deadline, IdAction, pending)), 203 report_exog_event(requestAction(TimeStamp, BodyXMLMess), _).
204 205handle_xml_message(XMLMess) :-
206 unfold_clima_message(XMLMess, bye, _, _), !,
207 assert(bye_message_received),
208 report_exog_event(halt_exec, _).
209handle_xml_message(XMLMess) :-
210 unfold_clima_message(XMLMess, sim-end, TimeStamp, BodyXMLMess), !,
211 report_exog_event(simEnd(TimeStamp, BodyXMLMess), _).
212handle_xml_message(XMLMess) :-
213 report_message(warning, ['Message unknown from game simulator: ', XMLMess]).
214
215:- dynamic justDropped/0. 216
217drop_at_depot(Data) :-
218 member(cells(LCells), Data),
219 member(cell(cur, LCellProp), LCells),
220 member(depot,LCellProp), !,
221 execute(drop, _, 0, _),
222 assert(justDropped).
223drop_at_depot(_).
224
225
226
227
228
238execute(Action, _, N, Sensing) :-
239 (retract(actionStatus(Deadline, IdAction, pending)) ->
240 true
241 ;
242 report_message(warning,['Action *',(Action,N),'* is being sent without any previous request pending']),
243 IdAction=0
244
245 ),
246 247 report_message(action, ['Executing non-sensing action: *',(Action,N,IdAction),'*']),
248 (clima_execute(comm_sim, Action, IdAction, ok) ->
249 Sensing=ok,
250 report_message(system(4), ['The action *',(Action,N,IdAction),'* was sent to game server'])
251 ;
252 Sensing=failed,
253 report_message(system(4), ['The following action failed to execute: *', (Action,N,IdAction),'*'])
254 ),
255 asserta(actionStatus(Deadline, IdAction, Sensing)).
256
258tooLate(_) :- fail.
259
263
264
265
269
271clima_connect(Host, Port, ConnID) :-
272 catch(socket(internet, stream, ConnID), E,
273 (report_message(error, ['Cannot create socket : ',E]),fail) ),
274 catch(connect(ConnID, Host/Port), E,
275 (report_message(error, ['Cannot connect to game server: ',E]),fail) ),
276 get_socket_stream(ConnID, write, StreamW),
277 get_socket_stream(ConnID, read, StreamR),
278 set_stream(StreamW, encoding(text)),
279 set_stream(StreamR, encoding(utf8)).
280
281clima_disconnect(ConnID) :- close_socket(ConnID).
282
284clima_authenticate(ConnID, AgentUser, AgentPass, Result) :-
285 unfold_clima_message(XMLMess, auth-request, -1, [username(AgentUser),
286 password(AgentPass)]),
287 clima_send_XML(ConnID, XMLMess), !,
288 (select([ConnID], 5, [ConnID]) ->
289 clima_receive_XML(ConnID,MessReply), !,
290 unfold_clima_message(MessReply, auth-response, _, BodyMess),
291 member(result(Result), BodyMess)
292 ;
293 Result=timeout
294 ).
295
296
298clima_execute(ConnID, Action, IdAction, ok) :-
299 atom(Action),
300 unfold_clima_message(XMLMess, action, -1, [type(Action), id(IdAction)]),
301 clima_send_XML(ConnID, XMLMess), !.
302clima_execute(ConnID, Action, IdAction, ok) :-
303 compound(Action),
304 Action =.. [Name|Param],
305 unfold_clima_message(XMLMess, action, -1, [type(Name), param(Param), id(IdAction)]),
306 clima_send_XML(ConnID, XMLMess), !.
307clima_execute(_, _, _, failed).
308
309
310
311
313
325
326
330
332clima_send_XML(ConnID, XMLMess) :-
333 get_socket_stream(ConnID, write, Stream),
334 xml_write(Stream, XMLMess, []),
335 swritef(NullByte, '\0'),
336 write(Stream, NullByte), 337 flush(Stream).
338
339clima_receive_XML(ConnID, XMLMess) :-
340 get_socket_stream(ConnID, read, Stream),
341 ( (peek_code(Stream, R), member(R,[0,10])) ->
342 get_code(Stream, _),
343 XMLMess=element(message, null, null)
344 ;
345 catch(load_structure(Stream, LXMLMess, [parse(element)]), _,
346 (LXMLMess=[element(message,null,null)], writeln(segmentation)) ),
347 (peek_code(Stream, 10) -> get_code(Stream,10) ; true),
348 (peek_code(Stream, 0) -> get_code(Stream,0) ; true),
349 XMLMess=element(message, _, _),
350 member(XMLMess, LXMLMess)
351 ).
352
353
354
355
359
361clima_message(Mess, Type, TimeStamp, ListElements) :-
362 \+ var(Mess),
363 Mess=element(message, LAttrMess, LContentMess),
364 member(type=Type, LAttrMess),
365 (member(timestamp=TimeStamp, LAttrMess) -> true ; TimeStamp = -1),
366 findall([NameE, LAttrE, LContE],
367 member(element(NameE, LAttrE, LContE), LContentMess), ListElements).
368
369clima_message(Mess, Type, TimeStamp, ListElements) :-
370 var(Mess),
371 Mess=element(message, [type=Type|LAttrMess], LContentMess),
372 (TimeStamp = -1 -> LAttrMess=[] ; LAttrMess=[timestamp=TimeStamp]),
373 setof(element(NameE, LAttrE, LContE),
374 member([NameE, LAttrE, LContE], ListElements), LContentMess).
375
376
379
381unfold_clima_message(XMLMess, auth-response, NTimeStamp, Data) :-
382 permutation(Data, [result(Result)]), !,
383 (T= 'auth-response' ; T = auth-response),
384 clima_message(XMLMess, T, TimeStamp, LElements),
385 any_to_number(TimeStamp, NTimeStamp),
386 member([authentication,LAttr,[]], LElements),
387 member(result=Result, LAttr).
388unfold_clima_message(XMLMess, sim-start, NTimeStamp, Data) :-
389 permutation(Data,
390 [id(Id), opponent(Opp), steps(NSteps),
391 gsizeX(NGX), gsizeY(NGY), depotX(NDX), depotY(NDY)]), !,
392 (T= 'sim-start' ; T = sim-start),
393 clima_message(XMLMess, T, TimeStamp, LElements),
394 any_to_number(TimeStamp, NTimeStamp),
395 member([simulation,LAttr,[]], LElements),
396 member(id=Id, LAttr),
397 member(opponent=Opp, LAttr),
398 member(steps=Steps, LAttr), any_to_number(Steps, NSteps),
399 member(gsizex=GX, LAttr), any_to_number(GX, NGX),
400 member(gsizey=GY, LAttr), any_to_number(GY, NGY),
401 member(depotx=DX, LAttr), any_to_number(DX, NDX),
402 member(depoty=DY, LAttr), any_to_number(DY, NDY).
403unfold_clima_message(XMLMess, sim-end, NTimeStamp, Data) :-
404 permutation(Data, [score(NScore), result(Result)]), !,
405 (T= 'sim-end' ; T = sim-end),
406 clima_message(XMLMess, T, TimeStamp, LElements),
407 any_to_number(TimeStamp, NTimeStamp),
408 (member([sim-result, LAttr, []], LElements) ;
409 member(['sim-result', LAttr, []], LElements)),
410 member(score=Score, LAttr), any_to_number(Score, NScore),
411 member(result=Result, LAttr).
412unfold_clima_message(XMLMess, bye, TimeStamp, []) :-
413 (T= 'bye' ; T = bye),
414 clima_message(XMLMess, T, TimeStamp, []).
415unfold_clima_message(XMLMess, request-action, NTimeStamp, Data) :-
416 permutation(Data, [step(NStep),posX(NPosX),posY(NPosY),items(NItems),
417 deadline(NDeadline),id(Id),cells(CellsInfo)]), !,
418 419 (T= 'requestaction' ; T = requestaction ; T=request-action ; T='request-action'),
420 clima_message(XMLMess, T, TimeStamp, LElements),
421 any_to_number(TimeStamp, NTimeStamp),
422 member([perception,LAttr,LCont], LElements),
423 member(step=Step, LAttr), any_to_number(Step, NStep),
424 member(posx=PosX, LAttr), any_to_number(PosX, NPosX),
425 member(posy=PosY, LAttr), any_to_number(PosY, NPosY),
426 427 (member(items=Items, LAttr) -> any_to_number(Items, NItems) ; NItems=(-1)),
428 member(deadline=Deadline, LAttr), any_to_number(Deadline, NDeadline),
429 member(id=Id, LAttr),
430 extract_cells_info(LCont, CellsInfo).
431
432
433
435unfold_clima_message(XMLMess, action, TimeStamp, Data) :-
436 (TypeData = [id(Id), type(Action), param(Param)] ; TypeData = [id(Id), type(Action)]),
437 length(TypeData, LenTypeData),
438 permutation(Data, TypeData), !,
439 (T= 'action' ; T = action),
440 length(LElements, 1),
441 length(LAttr,LenTypeData),
442 clima_message(XMLMess, T, TimeStamp, LElements),
443 member([action, LAttr, []], LElements),
444 member(type=Action, LAttr),
445 member(id=Id, LAttr),
446 (LenTypeData=3 -> member(param=Param, LAttr) ; true).
447
448unfold_clima_message(XMLMess, auth-request, TimeStamp, Data) :-
449 TypeData = [username(AgentUser), password(AgentPass)],
450 length(TypeData, LenTypeData),
451 permutation(Data, TypeData), !,
452 (T= 'auth-request' ; T = auth-request),
453 length(LElements,1),
454 length(LAttr,LenTypeData),
455 clima_message(XMLMess, T, TimeStamp, LElements),
456 member([authentication, LAttr, []], LElements),
457 member(username=AgentUser, LAttr),
458 member(password=AgentPass, LAttr).
459
460
461
462
463
(LContCells, LCellsInfo) :-
467 findall(cell(IDCell,PropCell),
468 (member(element(cell,[id=IDCell], PropCellRaw), LContCells),
469 extract_cell_info(PropCellRaw,PropCell),
470 PropCell\=[]), LCellsInfo). (PropCellRaw, LPropCell) :-
472 findall(agent(AgentType),
473 member(element(agent, [type=AgentType], []), PropCellRaw), L1),
474 findall(obstacle, member(element(obstacle, [], []), PropCellRaw), L2),
475 findall(gold, member(element(gold, [], []), PropCellRaw), L3),
476 findall(mark(Mark), member(element(mark, [value=Mark], []), PropCellRaw), L4),
477 findall(empty, member(element(empty, [], []), PropCellRaw), L5),
478 findall(depot, member(element(depot, [], []), PropCellRaw), L6),
479 LL=[L1,L2,L3,L4,L5,L6],
480 flatten(LL, LPropCell).
481
482
486