Commit 1722c6f81bf5f93dac6f8431a6cd70a3daa57e96

Authored by Carlos Picanco
1 parent 1a5f5479
Exists in master

work on criteria, prompt, messages and refac dumps

units/game_actors.pas
@@ -80,23 +80,30 @@ type @@ -80,23 +80,30 @@ type
80 private 80 private
81 FAppendicePlural: UTF8String; 81 FAppendicePlural: UTF8String;
82 FAppendiceSingular: UTF8String; 82 FAppendiceSingular: UTF8String;
  83 + FLastPresentedMessage: UTF8string;
83 FNicname: UTF8String; 84 FNicname: UTF8String;
84 - protected  
85 FStyle : TConsequenceStyle; 85 FStyle : TConsequenceStyle;
86 FP : TGamePoint; 86 FP : TGamePoint;
87 FMessage : TPopupNotifier; 87 FMessage : TPopupNotifier;
  88 + function GetShouldPublishMessage: Boolean;
  89 + protected
  90 + FConsequenceByPlayerID : TStringList;
88 procedure StopTimer(Sender:TObject;var ACloseAction:TCloseAction); 91 procedure StopTimer(Sender:TObject;var ACloseAction:TCloseAction);
89 procedure TimerTimer(Sender:TOBject);virtual; 92 procedure TimerTimer(Sender:TOBject);virtual;
90 public 93 public
91 constructor Create(AOwner:TComponent; AP:TGamePoint; AStyle:TConsequenceStyle; AAppendiceSingular,AAppendicePlural:UTF8String);overload; 94 constructor Create(AOwner:TComponent; AP:TGamePoint; AStyle:TConsequenceStyle; AAppendiceSingular,AAppendicePlural:UTF8String);overload;
92 constructor Create(AOwner:TComponent; AP:integer; AStyle: TConsequenceStyle; AMessage:array of UTF8string);overload; 95 constructor Create(AOwner:TComponent; AP:integer; AStyle: TConsequenceStyle; AMessage:array of UTF8string);overload;
93 - constructor Create(AOwner:TComponent; AConsequenceString: UTF8String);overload; 96 + constructor Create(AOwner:TComponent; AConsequenceString: UTF8String);virtual;overload;
94 destructor Destroy;override; 97 destructor Destroy;override;
95 - function AsString: utf8string;  
96 - procedure Present(Sender:TObject;ForGroup:Boolean);virtual; 98 + function AsString(AID :UTF8String): UTF8String;
  99 + function PointMessage(ForGroup: Boolean):UTF8String;
  100 + procedure Present(ForGroup: Boolean);
  101 + property ShouldPublishMessage : Boolean read GetShouldPublishMessage;
  102 + property LastPresentedMessage : UTF8string read FLastPresentedMessage;
97 property PlayerNicname : UTF8String read FNicname write FNicname; 103 property PlayerNicname : UTF8String read FNicname write FNicname;
98 property AppendiceSingular : UTF8String read FAppendiceSingular; 104 property AppendiceSingular : UTF8String read FAppendiceSingular;
99 property AppendicePlural : UTF8String read FAppendicePlural; 105 property AppendicePlural : UTF8String read FAppendicePlural;
  106 + property ConsequenseByPlayerID : TStringList read FConsequenceByPlayerID;
100 end; 107 end;
101 108
102 { TContingency } 109 { TContingency }
@@ -130,13 +137,20 @@ type @@ -130,13 +137,20 @@ type
130 137
131 TPrompt = class(TConsequence) 138 TPrompt = class(TConsequence)
132 private 139 private
  140 + FResponses : array of UTF8String;
  141 + FResult : UTF8String;
133 FPromptTargets : TContingencies; // need to test this 142 FPromptTargets : TContingencies; // need to test this
  143 + FPromptStyle : TPromptStyle;
  144 + FPromptMessage : UTF8String;
  145 + procedure ClearResponses;
134 public 146 public
135 - PromptStyle : TPromptStyle;  
136 - PromptMessage : string;  
137 - public  
138 - procedure Present(Sender:TObject;ForGroup:Boolean);override;  
139 - property APromptTargets: TContingencies read FPromptTargets; 147 + constructor Create(AOwner:TComponent; APStyle:TPromptStyle; APTarget : TContingencies; AMessage:UTF8string);reintroduce;
  148 + function ResponsesCount : integer;
  149 + procedure AppendResponse(AID,R:UTF8String);
  150 + function AsString: TStringList; overload;
  151 + property Question: UTF8String read FPromptMessage;
  152 + property PromptResult:UTF8String read FResult;
  153 +
140 end; 154 end;
141 155
142 TEndConditionCriterium = record 156 TEndConditionCriterium = record
@@ -153,6 +167,10 @@ type @@ -153,6 +167,10 @@ type
153 TCondition = record 167 TCondition = record
154 ConditionName : string; 168 ConditionName : string;
155 Contingencies : TContingencies; // for producing points during the condition 169 Contingencies : TContingencies; // for producing points during the condition
  170 + Interlocks : record
  171 + Count : integer; // culturant,
  172 + History: array of Boolean; // to calculate interlock porcentage in the last cycles. sync with OnCycles
  173 + end;
156 174
157 Points : record 175 Points : record
158 Count : TPoints; // sum of points produced during the condition 176 Count : TPoints; // sum of points produced during the condition
@@ -165,7 +183,7 @@ type @@ -165,7 +183,7 @@ type
165 Random: Boolean; // if we should change Players[i].Turn OnCycle 183 Random: Boolean; // if we should change Players[i].Turn OnCycle
166 end; 184 end;
167 185
168 - Cycles : record // for changing generations 186 + Cycles : record // for changing generations //absolute value is (Value * Generation)+Count
169 Count, // current cycle 187 Count, // current cycle
170 Value, // CyclesPerLineage, CyclesPerGeneration 188 Value, // CyclesPerLineage, CyclesPerGeneration
171 Generation : integer; 189 Generation : integer;
@@ -176,7 +194,7 @@ type @@ -176,7 +194,7 @@ type
176 194
177 implementation 195 implementation
178 196
179 -uses ButtonPanel,Controls,ExtCtrls,strutils, string_methods, 197 +uses Graphics, strutils, string_methods,
180 form_matrixgame{,StdCtrls}; 198 form_matrixgame{,StdCtrls};
181 199
182 { TContingency } 200 { TContingency }
@@ -198,8 +216,8 @@ end; @@ -198,8 +216,8 @@ end;
198 216
199 procedure TContingency.CriteriaEvent; 217 procedure TContingency.CriteriaEvent;
200 begin 218 begin
201 - // FConsequence.Present(FMeta);  
202 - // do admin internals 219 + FFired:=True;
  220 + if Assigned(FOnCriteria) then FOnCriteria(Self);
203 end; 221 end;
204 222
205 constructor TContingency.Create(AOwner:TComponent;AConsequence:TConsequence;ACriteria:TCriteria;IsMeta:Boolean); 223 constructor TContingency.Create(AOwner:TComponent;AConsequence:TConsequence;ACriteria:TCriteria;IsMeta:Boolean);
@@ -220,13 +238,7 @@ begin @@ -220,13 +238,7 @@ begin
220 Result += GetRowString(R) + ','; 238 Result += GetRowString(R) + ',';
221 Result += '|'; 239 Result += '|';
222 240
223 - case FCriteria.Style of  
224 - gtNone : Result += 'INDIFERENTE';  
225 - gtRowsAndColors : Result += 'E';  
226 - gtRowsOrColors : Result += 'OU';  
227 - gtRowsOnly: Result += 'LINHAS';  
228 - gtColorsOnly:Result += 'CORES';  
229 - end; 241 + Result += GetCriteriaStyleString(FCriteria.Style);
230 Result += ','; 242 Result += ',';
231 Result += '|'; 243 Result += '|';
232 244
@@ -255,7 +267,7 @@ begin @@ -255,7 +267,7 @@ begin
255 gtRowsOrColors: Result := LRow or LColor; 267 gtRowsOrColors: Result := LRow or LColor;
256 end; 268 end;
257 if Result then 269 if Result then
258 - if Assigned(FOnCriteria) then FOnCriteria(Self); 270 + CriteriaEvent;
259 end; 271 end;
260 272
261 function TContingency.ResponseMeetsCriteriaG(Players: TPlayers): Boolean; 273 function TContingency.ResponseMeetsCriteriaG(Players: TPlayers): Boolean;
@@ -269,48 +281,50 @@ var i : integer; @@ -269,48 +281,50 @@ var i : integer;
269 function AllColorsEqual:Boolean; 281 function AllColorsEqual:Boolean;
270 var i : integer; 282 var i : integer;
271 begin 283 begin
272 - Result := True; 284 + Result := not (gcNot in Criteria.Colors);
273 for i := 0 to Len-2 do 285 for i := 0 to Len-2 do
274 if Cs[i] <> Cs[i+1] then 286 if Cs[i] <> Cs[i+1] then
275 begin 287 begin
276 - Result := False;  
277 - Break; 288 + Result := not Result;
  289 + Break;
278 end; 290 end;
279 end; 291 end;
280 292
281 function AllColorsDiff:Boolean; 293 function AllColorsDiff:Boolean;
282 var i : integer; 294 var i : integer;
283 begin 295 begin
284 - Result := True; 296 + Result := not (gcNot in Criteria.Colors);
285 for i := 0 to Len-2 do 297 for i := 0 to Len-2 do
286 if Cs[i] = Cs[i+1] then 298 if Cs[i] = Cs[i+1] then
287 begin 299 begin
288 - Result := False;  
289 - Break; 300 + Result := not Result;
  301 + Break;
290 end; 302 end;
291 end; 303 end;
292 304
293 function AllRowsOdd: Boolean; 305 function AllRowsOdd: Boolean;
294 begin 306 begin
  307 + Result := not (grNot in Criteria.Rows);
295 for R in Rs do 308 for R in Rs do
296 if RowMod(R) = grEven then 309 if RowMod(R) = grEven then
297 begin 310 begin
298 - Result := False;  
299 - Exit; 311 + Result := not Result;
  312 + Break;
300 end; 313 end;
301 end; 314 end;
302 315
303 function AllRowsEven: Boolean; 316 function AllRowsEven: Boolean;
304 begin 317 begin
  318 + Result := not (grNot in Criteria.Rows);
305 for R in Rs do 319 for R in Rs do
306 if RowMod(R) = grOdd then 320 if RowMod(R) = grOdd then
307 begin 321 begin
308 - Result := False;  
309 - Exit; 322 + Result := not Result;
  323 + Break;
310 end; 324 end;
311 end; 325 end;
312 326
313 -begin // grDiff,grEqual,grAll 327 +begin // All -> (Diff,Equal,Even, Odd) or not all
314 Result := False; 328 Result := False;
315 Len := Length(Players); 329 Len := Length(Players);
316 SetLength(Cs,Len); 330 SetLength(Cs,Len);
@@ -348,13 +362,13 @@ begin // grDiff,grEqual,grAll @@ -348,13 +362,13 @@ begin // grDiff,grEqual,grAll
348 Result := AllColorsDiff and AllRowsOdd; 362 Result := AllColorsDiff and AllRowsOdd;
349 363
350 if (gcDiff in Criteria.Colors) and (grEven in Criteria.Rows) then 364 if (gcDiff in Criteria.Colors) and (grEven in Criteria.Rows) then
351 - Result := AllColorsDiff and AllRowsEven; 365 + Result := AllColorsDiff and AllRowsEven;
352 366
353 if (gcEqual in Criteria.Colors) and (grOdd in Criteria.Rows) then 367 if (gcEqual in Criteria.Colors) and (grOdd in Criteria.Rows) then
354 - Result := AllColorsEqual and AllRowsOdd; 368 + Result := AllColorsEqual and AllRowsOdd;
355 369
356 if (gcEqual in Criteria.Colors) and (grEven in Criteria.Rows) then 370 if (gcEqual in Criteria.Colors) and (grEven in Criteria.Rows) then
357 - Result := AllColorsEqual and AllRowsEven; 371 + Result := AllColorsEqual and AllRowsEven;
358 end; 372 end;
359 gtRowsOrColors: 373 gtRowsOrColors:
360 begin 374 begin
@@ -362,61 +376,118 @@ begin // grDiff,grEqual,grAll @@ -362,61 +376,118 @@ begin // grDiff,grEqual,grAll
362 Result := AllColorsDiff or AllRowsOdd; 376 Result := AllColorsDiff or AllRowsOdd;
363 377
364 if (gcDiff in Criteria.Colors) and (grEven in Criteria.Rows) then 378 if (gcDiff in Criteria.Colors) and (grEven in Criteria.Rows) then
365 - Result := AllColorsDiff or AllRowsEven; 379 + Result := AllColorsDiff or AllRowsEven;
366 380
367 if (gcEqual in Criteria.Colors) and (grOdd in Criteria.Rows) then 381 if (gcEqual in Criteria.Colors) and (grOdd in Criteria.Rows) then
368 - Result := AllColorsEqual or AllRowsOdd; 382 + Result := AllColorsEqual or AllRowsOdd;
369 383
370 if (gcEqual in Criteria.Colors) and (grEven in Criteria.Rows) then 384 if (gcEqual in Criteria.Colors) and (grEven in Criteria.Rows) then
371 - Result := AllColorsEqual or AllRowsEven; 385 + Result := AllColorsEqual or AllRowsEven;
372 end; 386 end;
373 end; 387 end;
374 if Result then 388 if Result then
375 - if Assigned(FOnCriteria) then FOnCriteria(Self); 389 + CriteriaEvent;
376 end; 390 end;
377 391
378 392
379 { TPrompt } 393 { TPrompt }
380 394
381 -procedure TPrompt.Present(Sender: TObject; ForGroup: Boolean); 395 +procedure TPrompt.ClearResponses;
  396 +begin
  397 + FResponses := nil;
  398 +end;
  399 +
  400 +constructor TPrompt.Create(AOwner: TComponent; APStyle: TPromptStyle;
  401 + APTarget: TContingencies; AMessage: UTF8string);
  402 +begin
  403 + inherited Create(AOwner);
  404 + FPromptStyle := APStyle;
  405 + FPromptTargets := APTarget;
  406 + FPromptMessage := AMessage;
  407 +end;
  408 +
  409 +function TPrompt.ResponsesCount: integer;
  410 +begin
  411 + Result := Length(FResponses);
  412 +end;
382 413
383 - function AskQuestion: boolean;  
384 - var  
385 - dlg: TForm;  
386 - buttonPanel: TButtonPanel;  
387 - mainPanel: TPanel;  
388 - mr: TModalResult; 414 +procedure TPrompt.AppendResponse(AID, R: UTF8String);
  415 +begin
  416 + SetLength(FResponses,Length(FResponses)+1);
  417 + FResponses[High(FResponses)] := AID+'|'+R+'|';
  418 +end;
  419 +
  420 +function TPrompt.AsString: TStringList;
  421 +var
  422 + j,i : integer;
  423 + LID,LConsequence : UTF8string;
  424 + LCsqStyle : TConsequenceStyle;
  425 + Pts : integer;
  426 +
  427 + function AllPlayersClickedYes: Boolean;
  428 + var i : integer;
389 begin 429 begin
390 - dlg:=TForm.CreateNew(nil);  
391 - try  
392 - with dlg do begin  
393 - BorderStyle:=bsNone;  
394 - WindowState:=wsFullScreen;  
395 - //Position:=poScreenCenter;  
396 - Caption:='Task ' + IntToStr(0 {Succ(0)});  
397 - buttonPanel:=TButtonPanel.Create(dlg);  
398 - with buttonPanel do begin  
399 - ShowButtons:=[pbCancel, pbOK];  
400 - ShowBevel:=False;  
401 - Parent:=dlg;  
402 - end;  
403 - mainPanel:=TPanel.Create(dlg);  
404 - with mainPanel do begin  
405 - Align:=alClient;  
406 - Caption:=Format('Task %d - GUI buttons/edits etc. go here',[0]);  
407 - Parent:=dlg; 430 + Result := True;
  431 + for i := 0 to Length(FResponses)-1 do
  432 + if ExtractDelimited(2,FResponses[i],['|']) = 'N' then
  433 + begin
  434 + Result := False;
408 end; 435 end;
  436 + end;
  437 +
  438 + procedure ApplyPointsConditions(IsMeta:Boolean);
  439 + var
  440 + S : UTF8string;
  441 + begin
  442 + Pts := StrToInt(ExtractDelimited(1,LConsequence, ['|']));
  443 + if gsRevertPoints in FPromptStyle then
  444 + Pts := Pts*-1;
409 445
410 - mr:=ShowModal;  
411 - Result:=(mr = mrOK); 446 + if (gscB in LCsqStyle) and (gsBasA in FPromptStyle) then
  447 + begin
  448 + LCsqStyle += [gscB];
  449 + LCsqStyle -= [gscA];
412 end; 450 end;
413 - finally  
414 - dlg.Free;  
415 - end; 451 +
  452 + if IsMeta then
  453 + S := 'M'
  454 + else
  455 + S := LID;
  456 +
  457 + LConsequence := S + '+' +
  458 + IntToStr(Pts) +'|'+
  459 + GetConsequenceStylesString(LCsqStyle) +'|'+
  460 + ExtractDelimited(3,LConsequence, ['|']) +'|'+
  461 + ExtractDelimited(4,LConsequence, ['|']) +'|'+
  462 + ExtractDelimited(5,LConsequence, ['|']);
416 end; 463 end;
417 begin 464 begin
418 - inherited Present(Sender, ForGroup);  
419 - //SendMessage(AskQuestion); 465 + // to do, sanitize FPromptStyle first
  466 + Pts:= 0;
  467 + if (gsAll in FPromptStyle) and (gsYes in FPromptStyle) then
  468 + if AllPlayersClickedYes then
  469 + for i := 0 to Length(FPromptTargets)-1 do
  470 + for j := 0 to FPromptTargets[i].Consequence.ConsequenseByPlayerID.Count do
  471 + begin
  472 + LID := FPromptTargets[i].Consequence.ConsequenseByPlayerID.Names[j];
  473 + LConsequence := FPromptTargets[i].Consequence.ConsequenseByPlayerID.Values[LID];
  474 + LCsqStyle := GetConsequenceStylesFromString(ExtractDelimited(2,LConsequence, ['|']));
  475 +
  476 + if gsContingency in FPromptStyle then
  477 + if (FPromptTargets[i].Fired) and (not FPromptTargets[i].Meta) then
  478 + if (gscA in LCsqStyle) or (gscB in LCsqStyle) then
  479 + ApplyPointsConditions(False);
  480 +
  481 +
  482 + if gsMetacontingency in FPromptStyle then
  483 + if (FPromptTargets[i].Fired) and FPromptTargets[i].Meta then
  484 + if gscG in LCsqStyle then
  485 + ApplyPointsConditions(True);
  486 +
  487 + Result := TStringList.Create;
  488 + Result.Add(LConsequence);
  489 + end;
  490 +
420 end; 491 end;
421 492
422 { TConsequence } 493 { TConsequence }
@@ -431,6 +502,7 @@ begin @@ -431,6 +502,7 @@ begin
431 FAppendicePlural:=AAppendicePlural; 502 FAppendicePlural:=AAppendicePlural;
432 FP := AP; 503 FP := AP;
433 FMessage := TPopupNotifier.Create(AOwner); 504 FMessage := TPopupNotifier.Create(AOwner);
  505 + FConsequenceByPlayerID := TStringList.Create;
434 end; 506 end;
435 507
436 constructor TConsequence.Create(AOwner: TComponent; AP: integer; 508 constructor TConsequence.Create(AOwner: TComponent; AP: integer;
@@ -443,83 +515,65 @@ begin @@ -443,83 +515,65 @@ begin
443 FAppendicePlural:=AMessage[2]; 515 FAppendicePlural:=AMessage[2];
444 FP := TGamePoint.Create(AOwner,AP); 516 FP := TGamePoint.Create(AOwner,AP);
445 FMessage := TPopupNotifier.Create(AOwner); 517 FMessage := TPopupNotifier.Create(AOwner);
  518 + FConsequenceByPlayerID := TStringList.Create;
446 end; 519 end;
447 520
448 constructor TConsequence.Create(AOwner: TComponent; 521 constructor TConsequence.Create(AOwner: TComponent;
449 AConsequenceString: UTF8String); 522 AConsequenceString: UTF8String);
450 -  
451 - function GetConsequenceStyleFromString(S:UTF8String):TConsequenceStyle;  
452 - var  
453 - LCount,  
454 - i : integer;  
455 - begin  
456 - Result := [];  
457 - LCount := WordCount(S,[#0,',']);  
458 - for i:= 1 to LCount do  
459 - case ExtractDelimited(i,S,[',']) of  
460 - '0':Result+=[gscNone];  
461 - 'M':Result+=[gscMessage];  
462 - 'C':Result+=[gscBroadcastMessage];  
463 - 'P':Result+=[gscPoints];  
464 - 'V':Result+=[gscVariablePoints];  
465 - 'A':Result+=[gscA];  
466 - 'B':Result+=[gscB];  
467 - end;  
468 - end;  
469 -  
470 begin 523 begin
471 inherited Create(AOwner); 524 inherited Create(AOwner);
472 FP := TGamePoint.Create(AOwner,ExtractDelimited(1,AConsequenceString,['|'])); 525 FP := TGamePoint.Create(AOwner,ExtractDelimited(1,AConsequenceString,['|']));
473 - FStyle:=GetConsequenceStyleFromString(ExtractDelimited(2,AConsequenceString,['|'])); 526 + FStyle:=GetConsequenceStylesFromString(ExtractDelimited(2,AConsequenceString,['|']));
474 FNicname:=ExtractDelimited(3,AConsequenceString,['|']); 527 FNicname:=ExtractDelimited(3,AConsequenceString,['|']);
475 FAppendiceSingular:=ExtractDelimited(4,AConsequenceString,['|']); 528 FAppendiceSingular:=ExtractDelimited(4,AConsequenceString,['|']);
476 FAppendicePlural:=ExtractDelimited(5,AConsequenceString,['|']); 529 FAppendicePlural:=ExtractDelimited(5,AConsequenceString,['|']);
477 FMessage := TPopupNotifier.Create(AOwner); 530 FMessage := TPopupNotifier.Create(AOwner);
  531 + FConsequenceByPlayerID := TStringList.Create;
478 end; 532 end;
479 533
480 destructor TConsequence.Destroy; 534 destructor TConsequence.Destroy;
481 begin 535 begin
  536 + FConsequenceByPlayerID.Free;
482 inherited Destroy; 537 inherited Destroy;
483 end; 538 end;
484 539
485 -function TConsequence.AsString: utf8string;  
486 - function GetConsequenceStyleString(CS:TConsequenceStyle): UTF8String;  
487 - var ConsequenceStyle : TGameConsequenceStyle;  
488 - begin  
489 - Result := '';  
490 - for ConsequenceStyle in CS do  
491 - begin  
492 - case ConsequenceStyle of  
493 - gscNone: Result += '0';  
494 - gscMessage:Result += 'M';  
495 - gscBroadcastMessage:Result += 'C';  
496 - gscPoints:Result += 'P';  
497 - gscVariablePoints:Result += 'V';  
498 - gscA:Result += 'A';  
499 - gscB:Result += 'B';  
500 - end;  
501 - Result += ',';  
502 - end;  
503 - end;  
504 - 540 +function TConsequence.AsString(AID: UTF8String): UTF8String;
505 begin 541 begin
506 - Result := IntToStr(FP.Value)+','+IntToStr(FP.Variation) + '|';  
507 - Result += GetConsequenceStyleString(FStyle)+'|'; 542 + Result := IntToStr(FP.ValueWithVariation) + '|';
  543 + Result += GetConsequenceStylesString(FStyle)+'|';
508 Result += FNicname +'|'; 544 Result += FNicname +'|';
509 Result += FAppendiceSingular + '|'; 545 Result += FAppendiceSingular + '|';
510 Result += FAppendicePlural + '|'; 546 Result += FAppendicePlural + '|';
  547 + FConsequenceByPlayerID.Values[AID]:=Result;
511 end; 548 end;
512 549
  550 +function TConsequence.PointMessage(ForGroup: Boolean): UTF8String;
  551 +begin
  552 + Result := FP.PointMessage(FNicname,FAppendicePlural, FAppendiceSingular,ForGroup);
  553 +
  554 + if gscA in FStyle then
  555 + FormMatrixGame.LabelIndACount.Caption := IntToStr(StrToInt(FormMatrixGame.LabelIndACount.Caption) + FP.ResultAsInteger);
513 556
514 -procedure TConsequence.Present(Sender: TObject; ForGroup: Boolean); 557 + if gscB in FStyle then
  558 + FormMatrixGame.LabelIndBCount.Caption := IntToStr(StrToInt(FormMatrixGame.LabelIndBCount.Caption) + FP.ResultAsInteger);
  559 +
  560 + if gscG in FStyle then
  561 + FormMatrixGame.LabelGroupCount.Caption:= IntToStr(StrToInt(FormMatrixGame.LabelGroupCount.Caption) + FP.ResultAsInteger);
  562 +end;
  563 +
  564 +
  565 +procedure TConsequence.Present(ForGroup: Boolean);
515 var 566 var
516 PopUpPos : TPoint; 567 PopUpPos : TPoint;
517 begin 568 begin
518 - PopUpPos.X := FormMatrixGame.StringGridMatrix.Left+FormMatrixGame.StringGridMatrix.Width;  
519 - PopUpPos.Y := FormMatrixGame.StringGridMatrix.Top;  
520 - PopUpPos := FormMatrixGame.StringGridMatrix.ClientToScreen(PopUpPos); 569 + PopUpPos.X := FormMatrixGame.GBIndividualAB.Left;
  570 + PopUpPos.Y := FormMatrixGame.GBIndividualAB.Top+FormMatrixGame.GBIndividual.Height-10;
  571 + PopUpPos := FormMatrixGame.ClientToScreen(PopUpPos);
521 572
  573 + FMessage.Color:=clTeal;
  574 + FMessage.Title:='';
522 FMessage.Text := FP.PointMessage(FNicname,FAppendicePlural, FAppendiceSingular,ForGroup); 575 FMessage.Text := FP.PointMessage(FNicname,FAppendicePlural, FAppendiceSingular,ForGroup);
  576 + FLastPresentedMessage := FMessage.Text;
523 FMessage.OnClose:=@StopTimer; 577 FMessage.OnClose:=@StopTimer;
524 FormMatrixGame.Timer.OnTimer := @TimerTimer; 578 FormMatrixGame.Timer.OnTimer := @TimerTimer;
525 579
@@ -532,15 +586,20 @@ begin @@ -532,15 +586,20 @@ begin
532 if gscG in FStyle then 586 if gscG in FStyle then
533 FormMatrixGame.LabelGroupCount.Caption:= IntToStr(StrToInt(FormMatrixGame.LabelGroupCount.Caption) + FP.ResultAsInteger); 587 FormMatrixGame.LabelGroupCount.Caption:= IntToStr(StrToInt(FormMatrixGame.LabelGroupCount.Caption) + FP.ResultAsInteger);
534 588
  589 + if gscBroadcastMessage in FStyle then Exit;
535 FMessage.ShowAtPos(PopUpPos.X, PopUpPos.Y); 590 FMessage.ShowAtPos(PopUpPos.X, PopUpPos.Y);
536 FormMatrixGame.Timer.Enabled:=True; 591 FormMatrixGame.Timer.Enabled:=True;
537 end; 592 end;
538 593
  594 +function TConsequence.GetShouldPublishMessage: Boolean;
  595 +begin
  596 + Result := gscBroadcastMessage in FStyle;
  597 +end;
  598 +
539 procedure TConsequence.StopTimer(Sender: TObject; var ACloseAction: TCloseAction 599 procedure TConsequence.StopTimer(Sender: TObject; var ACloseAction: TCloseAction
540 ); 600 );
541 begin 601 begin
542 FormMatrixGame.Timer.Enabled:=False; 602 FormMatrixGame.Timer.Enabled:=False;
543 - Free;  
544 end; 603 end;
545 604
546 procedure TConsequence.TimerTimer(Sender: TOBject); 605 procedure TConsequence.TimerTimer(Sender: TOBject);
units/game_actors_point.pas
@@ -19,15 +19,15 @@ type @@ -19,15 +19,15 @@ type
19 function GetResult: integer; 19 function GetResult: integer;
20 function GetResultAsString: string; 20 function GetResultAsString: string;
21 function GetValue: integer; 21 function GetValue: integer;
22 - procedure SetValue(AValue: integer);  
23 public 22 public
24 //Cycles : integer; // specify when present points regarding condition cycles 23 //Cycles : integer; // specify when present points regarding condition cycles
25 constructor Create(AOwner:TComponent;AValue : integer);overload; 24 constructor Create(AOwner:TComponent;AValue : integer);overload;
26 constructor Create(AOwner:TComponent;AValue : array of integer); overload; 25 constructor Create(AOwner:TComponent;AValue : array of integer); overload;
27 - constructor Create(AOwner:TComponent;AValue : utf8string); overload; 26 + constructor Create(AOwner:TComponent;AResult : UTF8String); overload;
28 function PointMessage(APrepend, AAppendicePlural, AAppendiceSingular: string; IsGroupPoint: Boolean) : string; 27 function PointMessage(APrepend, AAppendicePlural, AAppendiceSingular: string; IsGroupPoint: Boolean) : string;
29 - property Value : integer read GetValue write SetValue; 28 + property ValueWithVariation : integer read GetValue write FValue;
30 property Variation : integer read FVariation write FVariation; 29 property Variation : integer read FVariation write FVariation;
  30 +
31 property AsString : string read GetResultAsString; 31 property AsString : string read GetResultAsString;
32 property ResultAsInteger : integer read GetResult; 32 property ResultAsInteger : integer read GetResult;
33 end; 33 end;
@@ -67,11 +67,6 @@ begin @@ -67,11 +67,6 @@ begin
67 Result := IntToStr(FResult); 67 Result := IntToStr(FResult);
68 end; 68 end;
69 69
70 -procedure TGamePoint.SetValue(AValue: integer);  
71 -begin  
72 - FValue := AValue;  
73 -end;  
74 -  
75 constructor TGamePoint.Create(AOwner: TComponent; AValue: integer); 70 constructor TGamePoint.Create(AOwner: TComponent; AValue: integer);
76 begin 71 begin
77 inherited Create(AOwner); 72 inherited Create(AOwner);
@@ -86,15 +81,15 @@ begin @@ -86,15 +81,15 @@ begin
86 FVariation := AValue[1]; 81 FVariation := AValue[1];
87 end; 82 end;
88 83
89 -constructor TGamePoint.Create(AOwner: TComponent; AValue: utf8string); 84 +constructor TGamePoint.Create(AOwner: TComponent; AResult: utf8string);
90 begin 85 begin
91 - FValue := StrToInt(ExtractDelimited(1,AValue,[',']));  
92 - FVariation := StrToInt(ExtractDelimited(2,AValue,[','])); 86 + FValue := 0;//does not matter here, this creation method is called by a player, admin sent a result
  87 + FVariation := 0;
  88 + FResult := StrToInt(AResult);
93 end; 89 end;
94 90
95 function TGamePoint.PointMessage(APrepend, AAppendicePlural, AAppendiceSingular: string; IsGroupPoint: Boolean): string; 91 function TGamePoint.PointMessage(APrepend, AAppendicePlural, AAppendiceSingular: string; IsGroupPoint: Boolean): string;
96 begin 92 begin
97 - Self.Value;  
98 if IsGroupPoint then 93 if IsGroupPoint then
99 begin 94 begin
100 if APrepend = '' then 95 if APrepend = '' then
@@ -108,8 +103,8 @@ begin @@ -108,8 +103,8 @@ begin
108 -MaxInt..-2: Result += ' produziram a perda de '+Self.AsString+ ' pontos para o grupo'; 103 -MaxInt..-2: Result += ' produziram a perda de '+Self.AsString+ ' pontos para o grupo';
109 -1 : Result += ' produziram a perda de 1 ponto para o grupo'; 104 -1 : Result += ' produziram a perda de 1 ponto para o grupo';
110 0 : Result += ' pontos do grupo não foram produzidos nem perdidos'; 105 0 : Result += ' pontos do grupo não foram produzidos nem perdidos';
111 - 1 : Result += 'produziram 1 ponto para o grupo';  
112 - 2..MaxInt: Result += 'produziu '+Self.AsString+' pontos para o grupo' 106 + 1 : Result += ' produziram 1 ponto para o grupo';
  107 + 2..MaxInt: Result += ' produziram '+Self.AsString+' pontos para o grupo'
113 end; 108 end;
114 end 109 end
115 else 110 else
@@ -118,8 +113,8 @@ begin @@ -118,8 +113,8 @@ begin
118 -MaxInt..-2: Result += ' produziram a perda de '+Self.AsString+ ' ' + AAppendicePlural; 113 -MaxInt..-2: Result += ' produziram a perda de '+Self.AsString+ ' ' + AAppendicePlural;
119 -1 : Result += ' produziram a perda de 1'+ ' ' + AAppendiceSingular; 114 -1 : Result += ' produziram a perda de 1'+ ' ' + AAppendiceSingular;
120 0 : Result += ' não produziram ' + AAppendicePlural; 115 0 : Result += ' não produziram ' + AAppendicePlural;
121 - 1 : Result += ' produziram 1 ponto ' + AAppendiceSingular;  
122 - 2..MaxInt: Result += 'produziu '+Self.AsString+ ' ' + AAppendicePlural; 116 + 1 : Result += ' produziram 1 ' + AAppendiceSingular;
  117 + 2..MaxInt: Result += ' produziram '+Self.AsString+ ' ' + AAppendicePlural;
123 end; 118 end;
124 end; 119 end;
125 end 120 end
@@ -137,17 +132,17 @@ begin @@ -137,17 +132,17 @@ begin
137 -1 : Result += ' perdeu 1 ponto'; 132 -1 : Result += ' perdeu 1 ponto';
138 0 : Result += ' não perdeu nem ganhou pontos'; 133 0 : Result += ' não perdeu nem ganhou pontos';
139 1 : Result += ' ganhou 1 ponto'; 134 1 : Result += ' ganhou 1 ponto';
140 - 2..MaxInt: Result += 'ganhou '+Self.AsString+' pontos' 135 + 2..MaxInt: Result += ' ganhou '+Self.AsString+' pontos'
141 end; 136 end;
142 end 137 end
143 else 138 else
144 begin 139 begin
145 case FValue of 140 case FValue of
146 -MaxInt..-2: Result += ' perdeu '+Self.AsString+ ' ' + AAppendicePlural; 141 -MaxInt..-2: Result += ' perdeu '+Self.AsString+ ' ' + AAppendicePlural;
147 - -1 : Result += ' ponto 1'+ ' ' + AAppendiceSingular; 142 + -1 : Result += ' ponto 1 ' + AAppendiceSingular;
148 0 : Result += ' não perdeu nem ganhou ' + AAppendicePlural; 143 0 : Result += ' não perdeu nem ganhou ' + AAppendicePlural;
149 - 1 : Result += ' ganhou 1 ponto ' + AAppendiceSingular;  
150 - 2..MaxInt: Result += 'ganhou '+Self.AsString+ ' ' + AAppendicePlural; 144 + 1 : Result += ' ganhou 1 ' + AAppendiceSingular;
  145 + 2..MaxInt: Result += ' ganhou '+Self.AsString+ ' ' + AAppendicePlural;
151 end; 146 end;
152 end; 147 end;
153 end; 148 end;
units/game_control.pas
@@ -43,12 +43,21 @@ type @@ -43,12 +43,21 @@ type
43 procedure SetMustDrawDotsClear(AValue: Boolean); 43 procedure SetMustDrawDotsClear(AValue: Boolean);
44 procedure SetRowBase(AValue: integer); 44 procedure SetRowBase(AValue: integer);
45 private 45 private
46 - function ShouldStartExperiment : Boolean; 46 + function AskQuestion(AQuestion:UTF8string):UTF8String;
  47 + procedure ShowPopUp(AText:UTF8String);
  48 + procedure DisableConfirmationButton;
  49 + procedure CleanMatrix(AEnabled : Boolean);
  50 + procedure EnablePlayerMatrix(AID:UTF8String; ATurn:integer; AEnabled:Boolean);
  51 + private
  52 + function ShouldStartCycle : Boolean;
  53 + function ShouldAskQuestion : Boolean;
47 procedure KickPlayer(AID:string); 54 procedure KickPlayer(AID:string);
48 procedure NextTurn(Sender: TObject); 55 procedure NextTurn(Sender: TObject);
49 procedure NextCycle(Sender: TObject); 56 procedure NextCycle(Sender: TObject);
50 procedure NextLineage(Sender: TObject); 57 procedure NextLineage(Sender: TObject);
51 procedure NextCondition(Sender: TObject); 58 procedure NextCondition(Sender: TObject);
  59 + procedure Interlocking(Sender: TObject);
  60 + procedure Consequence(Sender: TObject);
52 procedure EndExperiment(Sender: TObject); 61 procedure EndExperiment(Sender: TObject);
53 procedure StartExperiment; 62 procedure StartExperiment;
54 public 63 public
@@ -77,6 +86,7 @@ const @@ -77,6 +86,7 @@ const
77 K_REFUSED = '.Refused'; 86 K_REFUSED = '.Refused';
78 K_CHAT_M = '.ChatM'; 87 K_CHAT_M = '.ChatM';
79 K_CHOICE = '.Choice'; 88 K_CHOICE = '.Choice';
  89 + K_MESSAGE = '.Message';
80 K_START = '.Start'; 90 K_START = '.Start';
81 K_LEFT = '.Left'; 91 K_LEFT = '.Left';
82 K_RESUME = '.Resume'; 92 K_RESUME = '.Resume';
@@ -84,6 +94,7 @@ const @@ -84,6 +94,7 @@ const
84 K_LOGIN = '.Login'; 94 K_LOGIN = '.Login';
85 K_KICK = '.Kick'; 95 K_KICK = '.Kick';
86 K_QUESTION = '.Question'; 96 K_QUESTION = '.Question';
  97 + K_QMESSAGE = '.QMessage';
87 // 98 //
88 K_STATUS = '.Status'; 99 K_STATUS = '.Status';
89 K_CYCLES = '.OnEndCycle'; 100 K_CYCLES = '.OnEndCycle';
@@ -92,7 +103,9 @@ const @@ -92,7 +103,9 @@ const
92 103
93 implementation 104 implementation
94 105
95 -uses LazUTF8, form_matrixgame, form_chooseactor, game_resources, strutils, string_methods, zhelpers; 106 +uses ButtonPanel,Controls,ExtCtrls,
  107 + LazUTF8, Forms, strutils, zhelpers,
  108 + form_matrixgame, form_chooseactor, game_resources, string_methods ;
96 109
97 const 110 const
98 GA_ADMIN = 'Admin'; 111 GA_ADMIN = 'Admin';
@@ -117,11 +130,17 @@ end; @@ -117,11 +130,17 @@ end;
117 130
118 { TGameControl } 131 { TGameControl }
119 132
120 -function TGameControl.ShouldStartExperiment: Boolean; 133 +function TGameControl.ShouldStartCycle: Boolean; // starts experiment too
121 begin 134 begin
122 Result := FExperiment.PlayersCount = FExperiment.Condition[FExperiment.CurrentCondition].Turn.Value; 135 Result := FExperiment.PlayersCount = FExperiment.Condition[FExperiment.CurrentCondition].Turn.Value;
123 end; 136 end;
124 137
  138 +function TGameControl.ShouldAskQuestion: Boolean; // end cycle, restart alias
  139 +begin
  140 + // TODO: prompt only when an odd row was selected
  141 + Result := ShouldStartCycle and FExperiment.Condition[FExperiment.CurrentCondition].Contingencies[3].Fired;
  142 +end;
  143 +
125 procedure TGameControl.KickPlayer(AID: string); 144 procedure TGameControl.KickPlayer(AID: string);
126 begin 145 begin
127 FZMQActor.SendMessage([K_KICK, AID]); 146 FZMQActor.SendMessage([K_KICK, AID]);
@@ -134,9 +153,7 @@ begin @@ -134,9 +153,7 @@ begin
134 153
135 // inform players 154 // inform players
136 155
137 -{$IFDEF DEBUG}  
138 - WriteLn('TGameControl.NextTurn');  
139 -{$ENDIF} 156 +
140 end; 157 end;
141 158
142 procedure TGameControl.NextCycle(Sender: TObject); 159 procedure TGameControl.NextCycle(Sender: TObject);
@@ -144,8 +161,9 @@ begin @@ -144,8 +161,9 @@ begin
144 // prompt question to all players 161 // prompt question to all players
145 FormMatrixGame.LabelExpCountCycle.Caption:=IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Cycles.Count); 162 FormMatrixGame.LabelExpCountCycle.Caption:=IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Cycles.Count);
146 {$IFDEF DEBUG} 163 {$IFDEF DEBUG}
147 - WriteLn('TGameControl.NextTurn'); 164 + WriteLn('cycle:',FExperiment.ConsequenceStringFromChoices);
148 {$ENDIF} 165 {$ENDIF}
  166 + //FZMQActor.SendMessage([K_CYCLES])
149 end; 167 end;
150 168
151 procedure TGameControl.NextLineage(Sender: TObject); 169 procedure TGameControl.NextLineage(Sender: TObject);
@@ -166,6 +184,20 @@ begin @@ -166,6 +184,20 @@ begin
166 // append which player 184 // append which player
167 end; 185 end;
168 186
  187 +procedure TGameControl.Interlocking(Sender: TObject);
  188 +begin
  189 + FormMatrixGame.LabelExpCountInterlocks.Caption:= IntToStr(FExperiment.Condition[FExperiment.CurrentCondition].Interlocks.Count);
  190 +
  191 +end;
  192 +
  193 +procedure TGameControl.Consequence(Sender: TObject);
  194 +begin
  195 +{$IFDEF DEBUG}
  196 + if Sender is TConsequence then
  197 + FormMatrixGame.ChatMemoRecv.Lines.Append(('['+TConsequence(Sender).PlayerNicname+']: ')+TConsequence(Sender).AsString(''));
  198 +{$ENDIF}
  199 +end;
  200 +
169 procedure TGameControl.EndExperiment(Sender: TObject); 201 procedure TGameControl.EndExperiment(Sender: TObject);
170 begin 202 begin
171 203
@@ -298,7 +330,7 @@ end; @@ -298,7 +330,7 @@ end;
298 330
299 function TGameControl.GetSelectedColorF(AStringGrid: TStringGrid): UTF8string; 331 function TGameControl.GetSelectedColorF(AStringGrid: TStringGrid): UTF8string;
300 begin 332 begin
301 - Result := GetRowColorString(GetRowColor(AStringGrid.Selection.Top,RowBase)); 333 + Result := GetColorString(GetRowColor(AStringGrid.Selection.Top,RowBase));
302 end; 334 end;
303 335
304 function TGameControl.GetSelectedRowF(AStringGrid: TStringGrid): UTF8string; 336 function TGameControl.GetSelectedRowF(AStringGrid: TStringGrid): UTF8string;
@@ -332,6 +364,80 @@ begin @@ -332,6 +364,80 @@ begin
332 FRowBase:=AValue; 364 FRowBase:=AValue;
333 end; 365 end;
334 366
  367 +function TGameControl.AskQuestion(AQuestion: UTF8string): UTF8String;
  368 +var
  369 + Prompt: TForm;
  370 + ButtonPanel: TButtonPanel;
  371 + QuestionPanel: TPanel;
  372 + mr: TModalResult;
  373 +begin
  374 + Prompt:=TForm.CreateNew(nil);
  375 + try
  376 + with Prompt do begin
  377 + BorderStyle:=bsNone;
  378 + Position:=poScreenCenter;
  379 + ButtonPanel:=TButtonPanel.Create(Prompt);
  380 + with ButtonPanel do begin
  381 + ButtonOrder:=boCloseOKCancel;
  382 + OKButton.Caption:='Sim';
  383 + CancelButton.Caption:='Não';
  384 + ShowButtons:=[pbOK, pbCancel];
  385 + ShowBevel:=True;
  386 + ShowGlyphs:=[];
  387 + Parent:=Prompt;
  388 + end;
  389 + QuestionPanel:=TPanel.Create(Prompt);
  390 + with QuestionPanel do begin
  391 + Align:=alClient;
  392 + Caption:= AQuestion;
  393 + Parent:=Prompt;
  394 + end;
  395 +
  396 + mr:=ShowModal;
  397 + if mr = mrOK then
  398 + Result := 'S'
  399 + else Result := 'N';
  400 + end;
  401 + finally
  402 + Prompt.Free;
  403 + end;
  404 +end;
  405 +
  406 +procedure TGameControl.ShowPopUp(AText: UTF8String);
  407 +var PopUpPos : TPoint;
  408 +begin
  409 + PopUpPos.X := FormMatrixGame.GBIndividualAB.Left;
  410 + PopUpPos.Y := FormMatrixGame.GBIndividualAB.Top+FormMatrixGame.GBIndividual.Height-10;
  411 + PopUpPos := FormMatrixGame.ClientToScreen(PopUpPos);
  412 + FormMatrixGame.PopupNotifier.Title:='';
  413 + FormMatrixGame.PopupNotifier.Text:=AText;
  414 + FormMatrixGame.PopupNotifier.ShowAtPos(PopUpPos.X,PopUpPos.Y);
  415 + FormMatrixGame.Timer.OnTimer:=@FormMatrixGame.TimerTimer;
  416 + FormMatrixGame.Timer.Enabled:=True;
  417 +end;
  418 +
  419 +procedure TGameControl.DisableConfirmationButton;
  420 +begin
  421 + FormMatrixGame.StringGridMatrix.Enabled:= False;
  422 + FormMatrixGame.btnConfirmRow.Enabled:=False;
  423 + FormMatrixGame.btnConfirmRow.Caption:='OK';
  424 +end;
  425 +
  426 +procedure TGameControl.CleanMatrix(AEnabled : Boolean);
  427 +begin
  428 + FormMatrixGame.StringGridMatrix.Enabled:=AEnabled;
  429 + FormMatrixGame.StringGridMatrix.Options := FormMatrixGame.StringGridMatrix.Options-[goRowSelect];
  430 + FormMatrixGame.btnConfirmRow.Enabled:=True;
  431 + FormMatrixGame.btnConfirmRow.Caption:='Confirmar';
  432 + FormMatrixGame.btnConfirmRow.Visible := False;
  433 +end;
  434 +
  435 +procedure TGameControl.EnablePlayerMatrix(AID:UTF8String; ATurn:integer; AEnabled:Boolean);
  436 +begin
  437 + if FExperiment.PlayerFromID[AID].Turn = ATurn then
  438 + CleanMatrix(AEnabled);
  439 +end;
  440 +
335 constructor TGameControl.Create(AOwner: TComponent); 441 constructor TGameControl.Create(AOwner: TComponent);
336 begin 442 begin
337 FZMQActor := TZMQActor(AOwner); 443 FZMQActor := TZMQActor(AOwner);
@@ -358,13 +464,18 @@ begin @@ -358,13 +464,18 @@ begin
358 FExperiment.OnEndTurn := @NextTurn; 464 FExperiment.OnEndTurn := @NextTurn;
359 FExperiment.OnEndCycle := @NextCycle; 465 FExperiment.OnEndCycle := @NextCycle;
360 FExperiment.OnEndGeneration:=@NextLineage; 466 FExperiment.OnEndGeneration:=@NextLineage;
  467 + FExperiment.OnInterlocking:=@Interlocking;
  468 + FExperiment.OnConsequence:=@Consequence;
361 FExperiment.OnEndCondition:= @NextCondition; 469 FExperiment.OnEndCondition:= @NextCondition;
362 FExperiment.OnEndExperiment:= @EndExperiment; 470 FExperiment.OnEndExperiment:= @EndExperiment;
  471 + FExperiment.OnInterlocking := @Interlocking;
363 472
364 NextTurn(Self); 473 NextTurn(Self);
365 NextCycle(Self); 474 NextCycle(Self);
366 NextLineage(Self); 475 NextLineage(Self);
367 NextCondition(Self); 476 NextCondition(Self);
  477 + Interlocking(Self);
  478 + Consequence(Self);
368 479
369 SendRequest(K_LOGIN); 480 SendRequest(K_LOGIN);
370 end; 481 end;
@@ -480,11 +591,6 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList); @@ -480,11 +591,6 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList);
480 var P : TPlayer; 591 var P : TPlayer;
481 begin 592 begin
482 case FActor of 593 case FActor of
483 - gaAdmin:  
484 - begin  
485 - // do nothing  
486 - end;  
487 -  
488 gaPlayer: 594 gaPlayer:
489 begin 595 begin
490 P := FExperiment.PlayerFromString[AMessage[1]]; 596 P := FExperiment.PlayerFromString[AMessage[1]];
@@ -497,19 +603,6 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList); @@ -497,19 +603,6 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList);
497 CreatePlayerBox(P,False); 603 CreatePlayerBox(P,False);
498 end; 604 end;
499 end; 605 end;
500 -  
501 - end;  
502 -  
503 - procedure SetPMatrix(ATurn:integer; AEnabled:Boolean);  
504 - begin  
505 - if FExperiment.PlayerFromID[Self.ID].Turn = ATurn then  
506 - begin  
507 - FormMatrixGame.StringGridMatrix.Enabled:=AEnabled;  
508 - FormMatrixGame.StringGridMatrix.Options := FormMatrixGame.StringGridMatrix.Options-[goRowSelect];  
509 - FormMatrixGame.btnConfirmRow.Enabled:=True;  
510 - FormMatrixGame.btnConfirmRow.Caption:='Confirmar';  
511 - FormMatrixGame.btnConfirmRow.Visible := False;  
512 - end;  
513 end; 606 end;
514 607
515 procedure ReceiveChoice; 608 procedure ReceiveChoice;
@@ -521,52 +614,58 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList); @@ -521,52 +614,58 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList);
521 with GetPlayerBox(P.ID) do 614 with GetPlayerBox(P.ID) do
522 begin 615 begin
523 LabelLastRowCount.Caption := AMessage[2]; 616 LabelLastRowCount.Caption := AMessage[2];
524 - PanelLastColor.Color := GetRowColorFromString(AMessage[3]); 617 + PanelLastColor.Color := GetColorFromString(AMessage[3]);
525 PanelLastColor.Caption:=''; 618 PanelLastColor.Caption:='';
526 end; 619 end;
527 620
528 case FActor of 621 case FActor of
529 gaPlayer:begin 622 gaPlayer:begin
  623 + if FExperiment.PlayersCount = P.Turn+1 then
  624 + begin
  625 + // update next turn
  626 + if Self.ID = P.ID then
  627 + begin
  628 + P.Turn := StrToInt(AMessage[4]);
  629 + FExperiment.Player[Self.ID] := P;
  630 + end;
  631 +
  632 + // no wait turns
  633 + // EnablePlayerMatrix(Self.ID,0, True);
  634 +
  635 + //CleanMatrix;
  636 + CleanMatrix(False);
  637 +
  638 + // wait for server
  639 + Exit;
  640 + end;
  641 +
530 if Self.ID = P.ID then 642 if Self.ID = P.ID then
531 begin 643 begin
532 - FormMatrixGame.StringGridMatrix.Enabled:= False;  
533 - FormMatrixGame.btnConfirmRow.Enabled:=False;  
534 - FormMatrixGame.btnConfirmRow.Caption:='OK'; 644 + // update confirmation button
  645 + DisableConfirmationButton;
  646 +
  647 + // update next turn
  648 + P.Turn := StrToInt(AMessage[4]);
  649 + FExperiment.Player[Self.ID] := P;
535 end 650 end
536 else 651 else
537 - SetPMatrix(P.Turn+1, True);  
538 - end;  
539 -  
540 - gaAdmin:begin  
541 - FExperiment.NextTurn; 652 + EnablePlayerMatrix(Self.ID,P.Turn+1, True);
542 end; 653 end;
543 end; 654 end;
544 end; 655 end;
545 656
546 procedure NotifyPlayers; 657 procedure NotifyPlayers;
547 - var PopUpPos : TPoint;  
548 begin 658 begin
549 case FActor of 659 case FActor of
550 gaPlayer: 660 gaPlayer:
551 - begin  
552 - PopUpPos.X := FormMatrixGame.StringGridMatrix.Left+FormMatrixGame.StringGridMatrix.Width;  
553 - PopUpPos.Y := FormMatrixGame.StringGridMatrix.Top;  
554 - PopUpPos := FormMatrixGame.StringGridMatrix.ClientToScreen(PopUpPos);  
555 if FExperiment.PlayerFromID[Self.ID].Turn = 0 then 661 if FExperiment.PlayerFromID[Self.ID].Turn = 0 then
556 begin 662 begin
557 - PopUpPos.X := FormMatrixGame.StringGridMatrix.Left+FormMatrixGame.StringGridMatrix.Width;  
558 - PopUpPos.Y := FormMatrixGame.StringGridMatrix.Top;  
559 - SetPMatrix(0, True);  
560 - FormMatrixGame.PopupNotifier.Text:='É sua vez! Clique sobre uma linha da matrix e confirme sua escolha.';  
561 - FormMatrixGame.PopupNotifier.ShowAtPos(PopUpPos.X,PopUpPos.Y); 663 + EnablePlayerMatrix(Self.ID, 0, True);
  664 + ShowPopUp('É sua vez! Clique sobre uma linha da matrix e confirme sua escolha.');
562 end 665 end
563 else 666 else
564 - begin  
565 - FormMatrixGame.PopupNotifier.Text:='Começou! Aguarde sua vez.';  
566 - FormMatrixGame.PopupNotifier.ShowAtPos(PopUpPos.X,PopUpPos.Y);  
567 - end;  
568 - FormMatrixGame.Timer.Enabled:=True;  
569 - end; 667 + ShowPopUp('Começou! Aguarde sua vez.');
  668 +
570 end; 669 end;
571 end; 670 end;
572 671
@@ -578,19 +677,7 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList); @@ -578,19 +677,7 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList);
578 case FActor of 677 case FActor of
579 gaPlayer: 678 gaPlayer:
580 begin 679 begin
581 - if FExperiment.PlayerFromID[Self.ID].Turn = 0 then  
582 - begin  
583 - SetPMatrix(0,True);  
584 - end  
585 - else  
586 - begin  
587 - //CleanMatrix;  
588 - FormMatrixGame.StringGridMatrix.Enabled:=False;  
589 - FormMatrixGame.StringGridMatrix.Options := FormMatrixGame.StringGridMatrix.Options-[goRowSelect];  
590 - FormMatrixGame.btnConfirmRow.Enabled:=True;  
591 - FormMatrixGame.btnConfirmRow.Caption:='Confirmar';  
592 - FormMatrixGame.btnConfirmRow.Visible := False;  
593 - end; 680 +
594 end; 681 end;
595 end; 682 end;
596 end; 683 end;
@@ -619,49 +706,80 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList); @@ -619,49 +706,80 @@ procedure TGameControl.ReceiveMessage(AMessage: TStringList);
619 end; 706 end;
620 end; 707 end;
621 708
622 - procedure ResumeActor; 709 + procedure ShowQuestion;
623 begin 710 begin
624 case FActor of 711 case FActor of
625 - gaPlayer:begin  
626 -  
627 - end;  
628 - gaAdmin:begin  
629 -  
630 - end; 712 + gaPlayer:FZMQActor.Request([
  713 + FZMQActor.ID
  714 + , ' '
  715 + , GA_PLAYER+K_QUESTION
  716 + , AskQuestion(AMessage[1])
  717 + ]);
631 end; 718 end;
632 end; 719 end;
633 -  
634 - procedure ReceiveLogin; 720 +//
  721 +// procedure ResumeActor;
  722 +// begin
  723 +// case FActor of
  724 +// gaPlayer:begin
  725 +//
  726 +// end;
  727 +// gaAdmin:begin
  728 +//
  729 +// end;
  730 +// end;
  731 +// end;
  732 +
  733 +
  734 + procedure QuestionMessages;
  735 + var
  736 + LConsequence : TConsequence;
  737 + i : integer;
  738 + MID : UTF8String;
635 begin 739 begin
636 case FActor of 740 case FActor of
  741 + // AMessage[i] :=
  742 + // S + '+' +
  743 + // IntToStr(Pts) +'|'+
  744 + // GetConsequenceStylesString(LCsqStyle) +'|'+
  745 + // ExtractDelimited(3,LConsequence, ['|']) +'|'+
  746 + // ExtractDelimited(4,LConsequence, ['|']) +'|'+
  747 + // ExtractDelimited(5,LConsequence, ['|']);
637 gaPlayer:begin 748 gaPlayer:begin
638 -  
639 - end;  
640 - gaAdmin:begin  
641 - 749 + if AMessage.Count > 1 then
  750 + begin
  751 + for i := 1 to AMessage.Count -1 do
  752 + begin
  753 + MID := ExtractDelimited(1,AMessage[i],['+']);
  754 + if (MID = 'M') or (MID = Self.ID) then
  755 + begin
  756 + LConsequence := TConsequence.Create(FormMatrixGame,ExtractDelimited(2,AMessage[i],['+']));
  757 + //LConsequence.PlayerNicname := P.Nicname;
  758 + ShowPopUp(LConsequence.PointMessage(MID = 'M'));
  759 + while FormMatrixGame.PopupNotifier.Visible do
  760 + Application.ProcessMessages;
  761 +
  762 + {$IFDEF DEBUG}
  763 + WriteLn('A consequence should have shown.');
  764 + {$ENDIF}
  765 + end;
  766 + end;
  767 + end;
642 end; 768 end;
643 end; 769 end;
644 end; 770 end;
645 771
646 - procedure ReceiveLogout;  
647 - begin  
648 - case FActor of  
649 - gaPlayer:begin  
650 -  
651 - end;  
652 - gaAdmin:begin  
653 -  
654 - end;  
655 - end;  
656 - end;  
657 772
658 begin 773 begin
659 if MHas(K_ARRIVED) then ReceiveActor; 774 if MHas(K_ARRIVED) then ReceiveActor;
660 if MHas(K_CHAT_M) then ReceiveChat; 775 if MHas(K_CHAT_M) then ReceiveChat;
661 if MHas(K_CHOICE) then ReceiveChoice; 776 if MHas(K_CHOICE) then ReceiveChoice;
  777 + if MHas(K_MESSAGE) then ShowPopUp(AMessage[1]);
662 if MHas(K_KICK) then SayGoodBye; 778 if MHas(K_KICK) then SayGoodBye;
663 if MHas(K_START) then NotifyPlayers; 779 if MHas(K_START) then NotifyPlayers;
664 if MHas(K_CYCLES) then OnEndCycle; 780 if MHas(K_CYCLES) then OnEndCycle;
  781 + if MHas(K_QUESTION) then ShowQuestion;
  782 + if MHas(K_QMESSAGE) then QuestionMessages;
665 end; 783 end;
666 784
667 // Here FActor is garanted to be a TZMQAdmin 785 // Here FActor is garanted to be a TZMQAdmin
@@ -738,8 +856,8 @@ procedure TGameControl.ReceiveRequest(var ARequest: TStringList); @@ -738,8 +856,8 @@ procedure TGameControl.ReceiveRequest(var ARequest: TStringList);
738 // inform all players about the new player, including itself 856 // inform all players about the new player, including itself
739 FZMQActor.SendMessage([K_ARRIVED,PS]); 857 FZMQActor.SendMessage([K_ARRIVED,PS]);
740 858
741 - // start Experiment if allowed  
742 - if ShouldStartExperiment then 859 + // start Experiment
  860 + if ShouldStartCycle then
743 StartExperiment; 861 StartExperiment;
744 862
745 end 863 end
@@ -759,18 +877,66 @@ procedure TGameControl.ReceiveRequest(var ARequest: TStringList); @@ -759,18 +877,66 @@ procedure TGameControl.ReceiveRequest(var ARequest: TStringList);
759 begin 877 begin
760 P := FExperiment.PlayerFromID[ARequest[0]]; 878 P := FExperiment.PlayerFromID[ARequest[0]];
761 P.Choice.Row:= GetRowFromString(ARequest[3]); // row 879 P.Choice.Row:= GetRowFromString(ARequest[3]); // row
762 - P.Choice.Color:= GetColorFromString(ARequest[4]); // color 880 + P.Choice.Color:= GetGameColorFromString(ARequest[4]); // color
763 ARequest[2] := K_CHOICE+K_ARRIVED; 881 ARequest[2] := K_CHOICE+K_ARRIVED;
764 - ARequest.Append(FExperiment.ConsequenceStringFromChoice[P]); //individual consequences  
765 - FZMQActor.SendMessage([K_CHOICE,P.ID,ARequest[3],ARequest[4]]); 882 +
  883 + //individual consequences
  884 + ARequest.Append(FExperiment.ConsequenceStringFromChoice[P]);
  885 +
  886 + // update turn
  887 + P.Turn := FExperiment.NextTurn;
  888 + FExperiment.Player[P.ID] := P;
  889 +
  890 + // broadcast choice
  891 + FZMQActor.SendMessage([K_CHOICE,P.ID,ARequest[3],ARequest[4],IntToStr(P.Turn)]);
  892 +
  893 + if ShouldAskQuestion then // TODO: prompt only when an odd row was selected
  894 + begin
  895 + P.Turn := 0;
  896 + FZMQActor.SendMessage([K_QUESTION,FExperiment.Condition[FExperiment.CurrentCondition].Prompt.Question]);
  897 + end;
766 end; 898 end;
767 899
  900 + procedure ValidateQuestionResponse;
  901 + var
  902 + P : TPlayer;
  903 + M : array of UTF8string;
  904 + i : integer;
  905 + LPromptConsequences : TStringList;
  906 + begin
  907 + P := FExperiment.PlayerFromID[ARequest[0]];
  908 + ARequest[2] := K_QUESTION+K_ARRIVED;
  909 +
  910 + // append response of each player
  911 + FExperiment.Condition[FExperiment.CurrentCondition].Prompt.AppendResponse(P.ID,ARequest[3]);
  912 +
  913 + // return to experiment and present the prompt consequence, if any
  914 + if FExperiment.Condition[FExperiment.CurrentCondition].Prompt.ResponsesCount = Experiment.PlayersCount then
  915 + begin
  916 + // M setup
  917 +
  918 +
  919 + // generate messages
  920 + LPromptConsequences := FExperiment.Condition[FExperiment.CurrentCondition].Prompt.AsString;
  921 + if LPromptConsequences.Count > 0 then
  922 + begin
  923 + SetLength(M, 1+LPromptConsequences.Count);
  924 + M[0] := GA_ADMIN+K_QUESTION+K_QMESSAGE;
  925 + for i := 0 to LPromptConsequences.Count -1 do
  926 + M[i+1] := LPromptConsequences[i]
  927 + end;
  928 +
  929 + // send identified messages; each player takes only its own message and ignore the rest
  930 + FZMQActor.SendMessage(M);
  931 + end;
  932 + end;
768 begin 933 begin
769 if MHas(K_LOGIN) then ReplyLoginRequest; 934 if MHas(K_LOGIN) then ReplyLoginRequest;
770 if MHas(K_CHOICE) then ValidateChoice; 935 if MHas(K_CHOICE) then ValidateChoice;
  936 + if MHas(K_QUESTION) then ValidateQuestionResponse;
771 end; 937 end;
772 938
773 -// Here FActor is garanted to be a TZMQPlayer, reply 939 +// Here FActor is garanted to be a TZMQPlayer, reply by:
774 // - sending private data to player player 940 // - sending private data to player player
775 // - sending data from early history to income players 941 // - sending data from early history to income players
776 procedure TGameControl.ReceiveReply(AReply: TStringList); 942 procedure TGameControl.ReceiveReply(AReply: TStringList);
@@ -814,11 +980,11 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); @@ -814,11 +980,11 @@ procedure TGameControl.ReceiveReply(AReply: TStringList);
814 LConsequence : TConsequence; 980 LConsequence : TConsequence;
815 LCount, 981 LCount,
816 i : integer; 982 i : integer;
817 - P : TPlayer; 983 + //P : TPlayer;
818 begin 984 begin
819 if Self.ID = AReply[0] then 985 if Self.ID = AReply[0] then
820 begin 986 begin
821 - P := FExperiment.PlayerFromID[Self.ID]; 987 + //P := FExperiment.PlayerFromID[Self.ID];
822 LCount := WordCount(AReply[5],['+']); 988 LCount := WordCount(AReply[5],['+']);
823 {$IFDEF DEBUG} 989 {$IFDEF DEBUG}
824 WriteLn('LCount:',LCount); 990 WriteLn('LCount:',LCount);
@@ -828,7 +994,9 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); @@ -828,7 +994,9 @@ procedure TGameControl.ReceiveReply(AReply: TStringList);
828 begin 994 begin
829 LConsequence := TConsequence.Create(FormMatrixGame,ExtractDelimited(i,AReply[5],['+'])); 995 LConsequence := TConsequence.Create(FormMatrixGame,ExtractDelimited(i,AReply[5],['+']));
830 //LConsequence.PlayerNicname := P.Nicname; 996 //LConsequence.PlayerNicname := P.Nicname;
831 - LConsequence.Present(Self, False); 997 + LConsequence.Present(False);
  998 + if LConsequence.ShouldPublishMessage then
  999 + FZMQActor.SendMessage([K_MESSAGE,LConsequence.LastPresentedMessage]);
832 {$IFDEF DEBUG} 1000 {$IFDEF DEBUG}
833 WriteLn('A consequence should have shown.'); 1001 WriteLn('A consequence should have shown.');
834 {$ENDIF} 1002 {$ENDIF}
@@ -836,6 +1004,10 @@ procedure TGameControl.ReceiveReply(AReply: TStringList); @@ -836,6 +1004,10 @@ procedure TGameControl.ReceiveReply(AReply: TStringList);
836 1004
837 end; 1005 end;
838 end; 1006 end;
  1007 + procedure QuestionValidated;
  1008 + begin
  1009 + // wait
  1010 + end;
839 1011
840 procedure ResumePlayer; 1012 procedure ResumePlayer;
841 begin 1013 begin
@@ -846,6 +1018,7 @@ begin @@ -846,6 +1018,7 @@ begin
846 if MHas(K_RESUME+K_ARRIVED) then ResumePlayer; 1018 if MHas(K_RESUME+K_ARRIVED) then ResumePlayer;
847 if MHas(K_LOGIN+K_ARRIVED) then LoginAccepted; 1019 if MHas(K_LOGIN+K_ARRIVED) then LoginAccepted;
848 if MHas(K_CHOICE+K_ARRIVED) then ChoiceValidated; 1020 if MHas(K_CHOICE+K_ARRIVED) then ChoiceValidated;
  1021 + if MHas(K_QUESTION+K_ARRIVED) then QuestionValidated;
849 end; 1022 end;
850 1023
851 1024
units/game_experiment.pas
@@ -25,6 +25,8 @@ type @@ -25,6 +25,8 @@ type
25 FExperimentName, 25 FExperimentName,
26 FFilename, 26 FFilename,
27 FResearcher : UTF8string; 27 FResearcher : UTF8string;
  28 + FOnConsequence: TNotifyEvent;
  29 + FOnInterlocking: TNotifyEvent;
28 FOnEndTurn: TNotifyEvent; 30 FOnEndTurn: TNotifyEvent;
29 FOnEndCondition: TNotifyEvent; 31 FOnEndCondition: TNotifyEvent;
30 FOnEndCycle: TNotifyEvent; 32 FOnEndCycle: TNotifyEvent;
@@ -52,27 +54,33 @@ type @@ -52,27 +54,33 @@ type
52 function GetNextCondition:integer; 54 function GetNextCondition:integer;
53 function GetPlayer(I : integer): TPlayer; overload; 55 function GetPlayer(I : integer): TPlayer; overload;
54 function GetPlayer(AID : UTF8string): TPlayer; overload; 56 function GetPlayer(AID : UTF8string): TPlayer; overload;
55 - function GetPlayerAsString(P: TPlayer): UTF8string;  
56 - function GetPlayerFromString(s : UTF8string): TPlayer; 57 + function AliasPlayerAsString(P: TPlayer): UTF8string;
  58 + function AliasPlayerFromString(s : UTF8string): TPlayer;
57 function GetPlayerIndexFromID(AID : UTF8string): integer; 59 function GetPlayerIndexFromID(AID : UTF8string): integer;
58 function GetPlayerIsPlaying(AID : UTF8string): Boolean; 60 function GetPlayerIsPlaying(AID : UTF8string): Boolean;
59 function GetPlayersCount: integer; 61 function GetPlayersCount: integer;
60 function GetInterlockingsIn(ALastCycles : integer):integer; 62 function GetInterlockingsIn(ALastCycles : integer):integer;
61 function GetConsequenceStringFromChoice(P:TPlayer): Utf8string; 63 function GetConsequenceStringFromChoice(P:TPlayer): Utf8string;
  64 + function GetConsequenceStringFromChoices:UTF8String;
62 procedure SetCondition(I : Integer; AValue: TCondition); 65 procedure SetCondition(I : Integer; AValue: TCondition);
63 procedure SetContingency(ACondition, I : integer; AValue: TContingency); 66 procedure SetContingency(ACondition, I : integer; AValue: TContingency);
64 procedure SetMatrixType(AValue: TGameMatrixType); 67 procedure SetMatrixType(AValue: TGameMatrixType);
  68 + procedure SetOnConsequence(AValue: TNotifyEvent);
65 procedure SetOnEndCondition(AValue: TNotifyEvent); 69 procedure SetOnEndCondition(AValue: TNotifyEvent);
66 procedure SetOnEndCycle(AValue: TNotifyEvent); 70 procedure SetOnEndCycle(AValue: TNotifyEvent);
67 procedure SetOnEndExperiment(AValue: TNotifyEvent); 71 procedure SetOnEndExperiment(AValue: TNotifyEvent);
68 procedure SetOnEndGeneration(AValue: TNotifyEvent); 72 procedure SetOnEndGeneration(AValue: TNotifyEvent);
69 procedure SetOnEndTurn(AValue: TNotifyEvent); 73 procedure SetOnEndTurn(AValue: TNotifyEvent);
  74 + procedure SetOnInterlocking(AValue: TNotifyEvent);
70 procedure SetPlayer(I : integer; AValue: TPlayer); overload; 75 procedure SetPlayer(I : integer; AValue: TPlayer); overload;
71 procedure SetPlayer(S : UTF8string ; AValue: TPlayer); overload; 76 procedure SetPlayer(S : UTF8string ; AValue: TPlayer); overload;
72 procedure SetResearcherCanChat(AValue: Boolean); 77 procedure SetResearcherCanChat(AValue: Boolean);
73 procedure SetResearcherCanPlay(AValue: Boolean); 78 procedure SetResearcherCanPlay(AValue: Boolean);
74 procedure SetSendChatHistoryForNewPlayers(AValue: Boolean); 79 procedure SetSendChatHistoryForNewPlayers(AValue: Boolean);
75 procedure SetState(AValue: TExperimentState); 80 procedure SetState(AValue: TExperimentState);
  81 + private
  82 + procedure Consequence(Sender : TObject);
  83 + procedure Interlocking(Sender : TObject);
76 public 84 public
77 constructor Create(AOwner:TComponent);override; 85 constructor Create(AOwner:TComponent);override;
78 constructor Create(AFilename: string; AOwner:TComponent); overload; 86 constructor Create(AFilename: string; AOwner:TComponent); overload;
@@ -106,9 +114,10 @@ type @@ -106,9 +114,10 @@ type
106 property PlayersCount : integer read GetPlayersCount; 114 property PlayersCount : integer read GetPlayersCount;
107 property PlayerIsPlaying[s : UTF8string] : Boolean read GetPlayerIsPlaying; 115 property PlayerIsPlaying[s : UTF8string] : Boolean read GetPlayerIsPlaying;
108 property PlayerIndexFromID[s : UTF8string]: integer read GetPlayerIndexFromID; 116 property PlayerIndexFromID[s : UTF8string]: integer read GetPlayerIndexFromID;
109 - property PlayerAsString[P:TPlayer]: UTF8string read GetPlayerAsString;  
110 - property PlayerFromString[s : UTF8string]: TPlayer read GetPlayerFromString; 117 + property PlayerAsString[P:TPlayer]: UTF8string read AliasPlayerAsString;
  118 + property PlayerFromString[s : UTF8string]: TPlayer read AliasPlayerFromString;
111 property ConsequenceStringFromChoice[P:Tplayer]:UTF8String read GetConsequenceStringFromChoice; 119 property ConsequenceStringFromChoice[P:Tplayer]:UTF8String read GetConsequenceStringFromChoice;
  120 + property ConsequenceStringFromChoices: UTF8String read GetConsequenceStringFromChoices;
112 property ShowChat : Boolean read FShowChat write FShowChat; 121 property ShowChat : Boolean read FShowChat write FShowChat;
113 property SendChatHistoryForNewPlayers : Boolean read FSendChatHistoryForNewPlayers write SetSendChatHistoryForNewPlayers; 122 property SendChatHistoryForNewPlayers : Boolean read FSendChatHistoryForNewPlayers write SetSendChatHistoryForNewPlayers;
114 property MatrixType : TGameMatrixType read FMatrixType write SetMatrixType; 123 property MatrixType : TGameMatrixType read FMatrixType write SetMatrixType;
@@ -123,6 +132,9 @@ type @@ -123,6 +132,9 @@ type
123 property OnEndGeneration : TNotifyEvent read FOnEndGeneration write SetOnEndGeneration; 132 property OnEndGeneration : TNotifyEvent read FOnEndGeneration write SetOnEndGeneration;
124 property OnEndCondition : TNotifyEvent read FOnEndCondition write SetOnEndCondition; 133 property OnEndCondition : TNotifyEvent read FOnEndCondition write SetOnEndCondition;
125 property OnEndExperiment : TNotifyEvent read FOnEndExperiment write SetOnEndExperiment; 134 property OnEndExperiment : TNotifyEvent read FOnEndExperiment write SetOnEndExperiment;
  135 + public
  136 + property OnConsequence : TNotifyEvent read FOnConsequence write SetOnConsequence;
  137 + property OnInterlocking : TNotifyEvent read FOnInterlocking write SetOnInterlocking;
126 end; 138 end;
127 139
128 resourcestring 140 resourcestring
@@ -130,7 +142,7 @@ resourcestring @@ -130,7 +142,7 @@ resourcestring
130 142
131 implementation 143 implementation
132 144
133 -uses game_file_methods, game_actors_point, game_resources, strutils; 145 +uses game_file_methods, game_actors_point, game_resources, string_methods;
134 146
135 { TExperiment } 147 { TExperiment }
136 148
@@ -161,13 +173,11 @@ begin @@ -161,13 +173,11 @@ begin
161 else 173 else
162 Result := FConditions[CurrentCondition].Turn.Count; 174 Result := FConditions[CurrentCondition].Turn.Count;
163 if Assigned(FOnEndTurn) then FOnEndTurn(Self); 175 if Assigned(FOnEndTurn) then FOnEndTurn(Self);
164 -  
165 if FConditions[CurrentCondition].Turn.Count < FConditions[CurrentCondition].Turn.Value then 176 if FConditions[CurrentCondition].Turn.Count < FConditions[CurrentCondition].Turn.Value then
166 Inc(FConditions[CurrentCondition].Turn.Count) 177 Inc(FConditions[CurrentCondition].Turn.Count)
167 else 178 else
168 begin 179 begin
169 FConditions[CurrentCondition].Turn.Count := 0; 180 FConditions[CurrentCondition].Turn.Count := 0;
170 - if Assigned(FOnEndCycle) then FOnEndCycle(Self);  
171 NextCycle; 181 NextCycle;
172 end; 182 end;
173 {$IFDEF DEBUG} 183 {$IFDEF DEBUG}
@@ -184,16 +194,15 @@ end; @@ -184,16 +194,15 @@ end;
184 function TExperiment.GetNextCycle: integer; 194 function TExperiment.GetNextCycle: integer;
185 begin 195 begin
186 Result := FConditions[CurrentCondition].Cycles.Count; 196 Result := FConditions[CurrentCondition].Cycles.Count;
  197 + if Assigned(FOnEndCycle) then FOnEndCycle(Self);
187 if FConditions[CurrentCondition].Cycles.Count < FConditions[CurrentCondition].Cycles.Value then 198 if FConditions[CurrentCondition].Cycles.Count < FConditions[CurrentCondition].Cycles.Value then
188 Inc(FConditions[CurrentCondition].Cycles.Count) 199 Inc(FConditions[CurrentCondition].Cycles.Count)
189 else 200 else
190 begin 201 begin
191 FConditions[CurrentCondition].Cycles.Count := 0; 202 FConditions[CurrentCondition].Cycles.Count := 0;
192 - if State = xsRunning then  
193 - begin  
194 - if Assigned(FOnEndGeneration) then FOnEndGeneration(Self);  
195 - NextCondition;  
196 - end; 203 + Inc(FConditions[CurrentCondition].Cycles.Generation);
  204 + if Assigned(FOnEndGeneration) then FOnEndGeneration(Self);
  205 + NextCondition;
197 end; 206 end;
198 {$IFDEF DEBUG} 207 {$IFDEF DEBUG}
199 WriteLn('TExperiment.GetNextCycle:',Result); 208 WriteLn('TExperiment.GetNextCycle:',Result);
@@ -212,7 +221,6 @@ var @@ -212,7 +221,6 @@ var
212 end; 221 end;
213 222
214 begin 223 begin
215 - Inc(FConditions[CurrentCondition].Cycles.Generation);  
216 Result := CurrentCondition; 224 Result := CurrentCondition;
217 LAbsCycles := (FConditions[CurrentCondition].Cycles.Value * 225 LAbsCycles := (FConditions[CurrentCondition].Cycles.Value *
218 FConditions[CurrentCondition].Cycles.Generation) + FConditions[CurrentCondition].Cycles.Count; 226 FConditions[CurrentCondition].Cycles.Generation) + FConditions[CurrentCondition].Cycles.Count;
@@ -261,147 +269,14 @@ begin @@ -261,147 +269,14 @@ begin
261 end; 269 end;
262 270
263 // fewer as possible data 271 // fewer as possible data
264 -function TExperiment.GetPlayerAsString(P: TPlayer): UTF8string;  
265 -var  
266 - i : integer;  
267 - M : array of UTF8String;  
268 -  
269 - procedure SetM(A : array of UTF8String);  
270 - var i : integer;  
271 - begin  
272 - SetLength(M,Length(A));  
273 - for i := 0 to Length(A) -1 do  
274 - M[i] := A[i];  
275 - end;  
276 -  
277 - function GetPPointsString(APPoints : TPlayerPoints) : string;  
278 - begin  
279 - Result := IntToStr(APPoints.A)+VV_SEP+IntToStr(APPoints.B);  
280 - end;  
281 -  
282 - function GetStatusString(AStatus : TGamePlayerStatus): string;  
283 - begin  
284 - case AStatus of  
285 - gpsWaiting: Result := '0';  
286 - gpsPlaying: Result := '1';  
287 - gpsPlayed: Result := '2';  
288 - end;  
289 - end;  
290 -  
291 - function GetRowString(ARow: TGameRow): string;  
292 - begin  
293 - case ARow of  
294 - grNone : Result := '.';  
295 - grOne : Result := '1';  
296 - grTwo : Result := '2';  
297 - grThree : Result :='3';  
298 - grFour : Result := '4';  
299 - grFive : Result := '5';  
300 - grSix : Result := '6';  
301 - grSeven : Result := '7';  
302 - grEight : Result := '8';  
303 - grNine : Result := '9';  
304 - grTen : Result := '0';  
305 - end;  
306 - end;  
307 -  
308 - function GetColorString(AColor: TGameColor): string;  
309 - begin  
310 - case AColor of  
311 - gcNone :Result := '0';  
312 - gcYellow :Result := '1';  
313 - gcRed :Result := '2';  
314 - gcMagenta :Result := '3';  
315 - gcBlue :Result := '4';  
316 - gcGreen :Result := '5';  
317 - end;  
318 - end;  
319 -  
320 - function GetChoiceString(AChoice : TPlayerChoice) : string;  
321 - begin  
322 - Result := GetRowString(AChoice.Row) + VV_SEP;  
323 - Result := Result+ GetColorString(AChoice.Color);  
324 - end;  
325 - 272 +function TExperiment.AliasPlayerAsString(P: TPlayer): UTF8string;
326 begin 273 begin
327 - Result := '';  
328 - SetM([P.ID  
329 - , P.Nicname  
330 - , GetPPointsString(P.Points)  
331 - , GetStatusString(P.Status)  
332 - , GetChoiceString(P.Choice)  
333 - , IntToStr(P.Turn)  
334 - ]);  
335 - for i := 0 to Length(M)-1 do  
336 - Result += M[i] + '|'; 274 + Result:= GetPlayerAsString(P);
337 end; 275 end;
338 276
339 -function TExperiment.GetPlayerFromString(s: UTF8string): TPlayer;  
340 -  
341 - function GetRowFromString(S: string): TGameRow;  
342 - begin  
343 - case S of  
344 - '.' : Result := grNone;  
345 - '1' : Result := grOne;  
346 - '2' : Result := grTwo;  
347 - '3' : Result := grThree;  
348 - '4' : Result := grFour;  
349 - '5' : Result := grFive;  
350 - '6' : Result := grSix;  
351 - '7' : Result := grSeven;  
352 - '8' : Result := grEight;  
353 - '9' : Result := grNine;  
354 - '0' : Result := grTen;  
355 - end;  
356 - end;  
357 -  
358 - function GetColorFromString(S: string): TGameColor;  
359 - begin  
360 - case S of  
361 - '0' : Result := gcNone;  
362 - '1' : Result := gcYellow;  
363 - '2' : Result := gcRed;  
364 - '3' : Result := gcMagenta;  
365 - '4' : Result := gcBlue;  
366 - '5' : Result := gcGreen;  
367 - end;  
368 - end;  
369 -  
370 - function GetChoiceFromString(S:string) : TPlayerChoice;  
371 - begin  
372 - Result.Row := GetRowFromString(ExtractDelimited(1,S,[',']));  
373 - Result.Color := GetColorFromString(ExtractDelimited(2,S,[',']));  
374 - end;  
375 -  
376 - function GetPPointsFromString(S:string) : TPlayerPoints;  
377 - begin  
378 - Result.A := StrToInt(ExtractDelimited(1,S,[',']));  
379 - Result.B := StrToInt(ExtractDelimited(2,S,[',']));  
380 - end;  
381 -  
382 - function GetStatusFromString(S : string): TGamePlayerStatus;  
383 - begin  
384 - case S of  
385 - '0': Result := gpsWaiting;  
386 - '1': Result := gpsPlaying;  
387 - '2': Result := gpsPlayed;  
388 - end;  
389 - end; 277 +function TExperiment.AliasPlayerFromString(s: UTF8string): TPlayer;
390 begin 278 begin
391 - {$IFDEF DEBUG}  
392 - WriteLn(ExtractDelimited(1,s,['|']));  
393 - WriteLn(ExtractDelimited(2,s,['|']));  
394 - WriteLn(ExtractDelimited(3,s,['|']));  
395 - WriteLn(ExtractDelimited(4,s,['|']));  
396 - WriteLn(ExtractDelimited(5,s,['|']));  
397 - WriteLn(ExtractDelimited(6,s,['|']));  
398 - {$ENDIF}  
399 - Result.ID := ExtractDelimited(1,s,['|']);  
400 - Result.Nicname := ExtractDelimited(2,s,['|']);  
401 - Result.Points := GetPPointsFromString(ExtractDelimited(3,s,['|']));  
402 - Result.Status := GetStatusFromString(ExtractDelimited(4,s,['|']));  
403 - Result.Choice := GetChoiceFromString(ExtractDelimited(5,s,['|']));  
404 - Result.Turn:=StrToInt(ExtractDelimited(6,s,['|'])); 279 + Result := GetPlayerFromString(S);
405 end; 280 end;
406 281
407 function TExperiment.GetPlayerIndexFromID(AID: UTF8string): integer; 282 function TExperiment.GetPlayerIndexFromID(AID: UTF8string): integer;
@@ -449,7 +324,20 @@ begin @@ -449,7 +324,20 @@ begin
449 for i :=0 to ContingenciesCount[c] -1 do 324 for i :=0 to ContingenciesCount[c] -1 do
450 if not Contingency[c,i].Meta then 325 if not Contingency[c,i].Meta then
451 if Contingency[c,i].ResponseMeetsCriteriaI(P.Choice.Row,P.Choice.Color) then 326 if Contingency[c,i].ResponseMeetsCriteriaI(P.Choice.Row,P.Choice.Color) then
452 - Result += Contingency[c,i].Consequence.AsString + '+'; 327 + Result += Contingency[c,i].Consequence.AsString(P.ID) + '+';
  328 +end;
  329 +
  330 +function TExperiment.GetConsequenceStringFromChoices: UTF8String;
  331 +var
  332 + i : integer;
  333 + c : integer;
  334 +begin
  335 + c := CurrentCondition;
  336 + Result:= '';
  337 + for i :=0 to ContingenciesCount[c] -1 do
  338 + if Contingency[c,i].Meta then
  339 + if Contingency[c,i].ResponseMeetsCriteriaG(FPlayers) then
  340 + Result += Contingency[c,i].Consequence.AsString(IntToStr(i)) + '+';
453 end; 341 end;
454 342
455 procedure TExperiment.SetCondition(I : Integer; AValue: TCondition); 343 procedure TExperiment.SetCondition(I : Integer; AValue: TCondition);
@@ -460,6 +348,10 @@ end; @@ -460,6 +348,10 @@ end;
460 procedure TExperiment.SetContingency(ACondition, I : integer; AValue: TContingency); 348 procedure TExperiment.SetContingency(ACondition, I : integer; AValue: TContingency);
461 begin 349 begin
462 FConditions[ACondition].Contingencies[I] := AValue; 350 FConditions[ACondition].Contingencies[I] := AValue;
  351 + if FConditions[ACondition].Contingencies[I].Meta then
  352 + FConditions[ACondition].Contingencies[I].OnCriteria:=@Interlocking
  353 + else
  354 + FConditions[ACondition].Contingencies[I].OnCriteria:=@Consequence;
463 end; 355 end;
464 356
465 procedure TExperiment.SetMatrixType(AValue: TGameMatrixType); 357 procedure TExperiment.SetMatrixType(AValue: TGameMatrixType);
@@ -468,6 +360,12 @@ begin @@ -468,6 +360,12 @@ begin
468 FMatrixType:=AValue; 360 FMatrixType:=AValue;
469 end; 361 end;
470 362
  363 +procedure TExperiment.SetOnConsequence(AValue: TNotifyEvent);
  364 +begin
  365 + if FOnConsequence=AValue then Exit;
  366 + FOnConsequence:=AValue;
  367 +end;
  368 +
471 procedure TExperiment.SetOnEndCondition(AValue: TNotifyEvent); 369 procedure TExperiment.SetOnEndCondition(AValue: TNotifyEvent);
472 begin 370 begin
473 if FOnEndCondition=AValue then Exit; 371 if FOnEndCondition=AValue then Exit;
@@ -498,6 +396,12 @@ begin @@ -498,6 +396,12 @@ begin
498 FOnEndTurn:=AValue; 396 FOnEndTurn:=AValue;
499 end; 397 end;
500 398
  399 +procedure TExperiment.SetOnInterlocking(AValue: TNotifyEvent);
  400 +begin
  401 + if FOnInterlocking=AValue then Exit;
  402 + FOnInterlocking:=AValue;
  403 +end;
  404 +
501 405
502 procedure TExperiment.SetPlayer(I : integer; AValue: TPlayer); 406 procedure TExperiment.SetPlayer(I : integer; AValue: TPlayer);
503 begin 407 begin
@@ -541,6 +445,16 @@ begin @@ -541,6 +445,16 @@ begin
541 FState:=AValue; 445 FState:=AValue;
542 end; 446 end;
543 447
  448 +procedure TExperiment.Consequence(Sender: TObject);
  449 +begin
  450 + if Assigned(FOnConsequence) then FOnConsequence(Sender);
  451 +end;
  452 +
  453 +procedure TExperiment.Interlocking(Sender: TObject);
  454 +begin
  455 + if Assigned(FOnInterlocking) then FOnInterlocking(Sender);
  456 +end;
  457 +
544 constructor TExperiment.Create(AOwner: TComponent); 458 constructor TExperiment.Create(AOwner: TComponent);
545 begin 459 begin
546 inherited Create(AOwner); 460 inherited Create(AOwner);
units/game_file_methods.pas
@@ -48,6 +48,17 @@ var @@ -48,6 +48,17 @@ var
48 Colors:[]; 48 Colors:[];
49 ); 49 );
50 50
  51 + LCriteria3 : TCriteria = (
  52 + Style:(gtRowsAndColors);
  53 + Rows:[grEven];
  54 + Colors:[gcDiff];
  55 + );
  56 +
  57 + LCriteria4 : TCriteria = (
  58 + Style:(gtRowsOrColors);
  59 + Rows:[grNot,grEven];
  60 + Colors:[gcNot,gcDiff];
  61 + );
51 begin 62 begin
52 Result := False; 63 Result := False;
53 with AExperiment do 64 with AExperiment do
@@ -61,26 +72,40 @@ begin @@ -61,26 +72,40 @@ begin
61 GenPlayersAsNeeded:=True; 72 GenPlayersAsNeeded:=True;
62 CurrentCondition := 0; 73 CurrentCondition := 0;
63 MatrixType:=[gmRows]; 74 MatrixType:=[gmRows];
  75 +
64 //AppendPlayer(C_PLAYER_TEMPLATE); 76 //AppendPlayer(C_PLAYER_TEMPLATE);
65 //AppendPlayer(C_PLAYER_TEMPLATE); 77 //AppendPlayer(C_PLAYER_TEMPLATE);
  78 +
66 C := C_CONDITION_TEMPLATE; 79 C := C_CONDITION_TEMPLATE;
67 with C do 80 with C do
68 begin 81 begin
69 - SetLength(Contingencies, 2);  
70 - LConcequence := TConsequence.Create(AExperiment,1,[gscPoints, gscB, gscMessage,gscBroadcastMessage],['NICNAME','queijo','queijos']);  
71 - Contingencies[0] := TContingency.Create(AExperiment,LConcequence,LCriteria1,False);  
72 - LConcequence := TConsequence.Create(AExperiment,3,[gscPoints, gscA, gscMessage,gscBroadcastMessage],['NICNAME','queijo','queijos']);  
73 - Contingencies[1] := TContingency.Create(AExperiment,LConcequence,LCriteria2,False);  
74 -  
75 - ConditionName := SEC_CONDITION+IntToStr(1); 82 + ConditionName := SEC_CONDITION+'1';
76 Turn.Count:=0; 83 Turn.Count:=0;
77 Turn.Value:=2; 84 Turn.Value:=2;
78 Turn.Random:=False; 85 Turn.Random:=False;
79 Cycles.Count:=0; 86 Cycles.Count:=0;
80 Cycles.Value:=4; 87 Cycles.Value:=4;
81 Cycles.Generation:=0; 88 Cycles.Generation:=0;
  89 + SetLength(Contingencies, 4);
  90 + LConcequence := TConsequence.Create(AExperiment,1,[gscPoints, gscB, gscMessage,gscBroadcastMessage],['$NICNAME','queijo','queijos']);
  91 + Contingencies[0] := TContingency.Create(AExperiment,LConcequence,LCriteria1,False);
  92 + LConcequence := TConsequence.Create(AExperiment,3,[gscPoints, gscA, gscMessage,gscBroadcastMessage],['$NICNAME','pão','pães']);
  93 + Contingencies[1] := TContingency.Create(AExperiment,LConcequence,LCriteria2,False);
  94 + LConcequence := TConsequence.Create(AExperiment,1,[gscPoints, gscG, gscMessage,gscBroadcastMessage],['','item escolar','itens escolares']);
  95 + Contingencies[2] := TContingency.Create(AExperiment,LConcequence,LCriteria3,True);
  96 + LConcequence := TConsequence.Create(AExperiment,-1,[gscPoints, gscG, gscMessage,gscBroadcastMessage],['','item escolar','itens escolares']);
  97 + Contingencies[3] := TContingency.Create(AExperiment,LConcequence,LCriteria4,True);
  98 +
  99 + Prompt := TPrompt.Create(
  100 + AExperiment
  101 + , [gsAll,gsYes,gsMetacontingency,gsContingency,gsRevertPoints,gsBasA]
  102 + , Contingencies
  103 + , 'Um item escolar foi perdido, desejam recuperá-lo gastando pontos do Tipo A?'
  104 + );
  105 + // (gsYes, gsNo, gsAll, gsMetacontingency, gsContingency, gsBasA, gsRevertPoints);
82 end; 106 end;
83 - AppendCondition(C); 107 +
  108 + Condition[AppendCondition] := C;
84 end; 109 end;
85 end; 110 end;
86 111
@@ -96,59 +121,40 @@ var @@ -96,59 +121,40 @@ var
96 //end; 121 //end;
97 122
98 function GetEndCriteria(S:string) : TEndConditionCriterium; 123 function GetEndCriteria(S:string) : TEndConditionCriterium;
99 - var  
100 - LS : string;  
101 begin 124 begin
102 - // 2,20,10,10,  
103 - LS := S + VV_SEP;  
104 - case StrToIntDef(GetAndDelFirstValue(LS),2) of 125 + case StrToIntDef(ExtractDelimited(1,S,[',']),2) of
105 0: Result.Value := gecAbsoluteCycles; 126 0: Result.Value := gecAbsoluteCycles;
106 1: Result.Value := gecInterlockingPorcentage; 127 1: Result.Value := gecInterlockingPorcentage;
107 2: Result.Value := gecWhichComeFirst; 128 2: Result.Value := gecWhichComeFirst;
108 end; 129 end;
109 - Result.AbsoluteCycles := StrToIntDef(GetAndDelFirstValue(LS), 20);  
110 - Result.InterlockingPorcentage := StrToIntDef(GetAndDelFirstValue(LS),10);  
111 - Result.LastCycles := StrToIntDef(GetAndDelFirstValue(LS), 10); 130 + Result.AbsoluteCycles := StrToIntDef(ExtractDelimited(2,S,[',']), 20);
  131 + Result.InterlockingPorcentage := StrToIntDef(ExtractDelimited(3,S,[',']),10);
  132 + Result.LastCycles := StrToIntDef(ExtractDelimited(4,S,[',']), 10);
112 end; 133 end;
113 134
114 function GetPoints(S: string) : TPoints; 135 function GetPoints(S: string) : TPoints;
115 - var  
116 - LS : string;  
117 begin 136 begin
118 - // A,B,G,  
119 - LS := S + VV_SEP;  
120 - Result.A := StrToIntDef(GetAndDelFirstValue(LS),0);  
121 - Result.B := StrToIntDef(GetAndDelFirstValue(LS),0);  
122 - Result.G := StrToIntDef(GetAndDelFirstValue(LS),0); 137 + Result.A := StrToIntDef(ExtractDelimited(1,S,[',']),0);
  138 + Result.B := StrToIntDef(ExtractDelimited(2,S,[',']),0);
  139 + Result.G := StrToIntDef(ExtractDelimited(3,S,[',']),0);
123 end; 140 end;
124 141
125 142
126 function GetChoiceFromString(S:string) : TPlayerChoice; 143 function GetChoiceFromString(S:string) : TPlayerChoice;
127 - var  
128 - LS : string;  
129 begin 144 begin
130 - // 0,NONE,  
131 - LS := S + VV_SEP;  
132 - Result.Row := GetRowFromString(GetAndDelFirstValue(LS));  
133 - Result.Color := GetColorFromString(GetAndDelFirstValue(LS)); 145 + Result.Row := GetRowFromString(ExtractDelimited(1,S,[',']));
  146 + Result.Color := GetGameColorFromString(ExtractDelimited(2,S,[',']));
134 end; 147 end;
135 148
136 function GetPPointsFromString(S:string) : TPlayerPoints; 149 function GetPPointsFromString(S:string) : TPlayerPoints;
137 - var  
138 - LS : string;  
139 begin 150 begin
140 - // 0,0,  
141 - LS := S + VV_SEP;  
142 - Result.A := StrToIntDef(GetAndDelFirstValue(LS),0);  
143 - Result.B := StrToIntDef(GetAndDelFirstValue(LS),0); 151 + Result.A := StrToIntDef(ExtractDelimited(1,S,[',']),0);
  152 + Result.B := StrToIntDef(ExtractDelimited(2,S,[',']),0);
144 end; 153 end;
145 154
146 function GetStatusFromString(S : string): TGamePlayerStatus; 155 function GetStatusFromString(S : string): TGamePlayerStatus;
147 - var  
148 - LS : string;  
149 begin 156 begin
150 - LS := S + VV_SEP;  
151 - case GetAndDelFirstValue(LS) of 157 + case ExtractDelimited(1,S,[',']) of
152 'esperando': Result := gpsWaiting; 158 'esperando': Result := gpsWaiting;
153 'jogou': Result := gpsPlayed; 159 'jogou': Result := gpsPlayed;
154 'jogando': Result := gpsPlaying; 160 'jogando': Result := gpsPlaying;
@@ -157,14 +163,12 @@ var @@ -157,14 +163,12 @@ var
157 163
158 function GetPromptStyle(S:string):TPromptStyle; 164 function GetPromptStyle(S:string):TPromptStyle;
159 var 165 var
160 - LS : string;  
161 i : integer; 166 i : integer;
162 begin 167 begin
163 // Yes,All,Metacontingency,RecoverLostPoints, 168 // Yes,All,Metacontingency,RecoverLostPoints,
164 Result := []; 169 Result := [];
165 - LS := S + VV_SEP;  
166 - for i := 0 to 3 do  
167 - Result := Result + GetPromptStyleFromString(GetAndDelFirstValue(LS)); 170 + for i := 1 to 4 do
  171 + Result := Result + GetPromptStyleFromString(ExtractDelimited(i,S,[',']));
168 end; 172 end;
169 173
170 procedure ReadExperiment; 174 procedure ReadExperiment;
@@ -242,7 +246,7 @@ var @@ -242,7 +246,7 @@ var
242 LCount := WordCount(LS,[#0,',']); 246 LCount := WordCount(LS,[#0,',']);
243 Result.Colors := []; 247 Result.Colors := [];
244 for i := 1 to LCount do 248 for i := 1 to LCount do
245 - Result.Colors += [GetColorFromString(ExtractDelimited(i,LS,[',']))]; 249 + Result.Colors += [GetGameColorFromString(ExtractDelimited(i,LS,[',']))];
246 end; 250 end;
247 251
248 procedure SetLCK(i:integer); 252 procedure SetLCK(i:integer);
@@ -307,9 +311,12 @@ var @@ -307,9 +311,12 @@ var
307 311
308 // if no contingencies, return false... 312 // if no contingencies, return false...
309 313
310 - Prompt := TPrompt.Create(AExperiment,ReadString(LS,KEY_PROMPT_STYLE,'todos,sim,metacontingência,recuperar pontos,'));  
311 - Prompt.PromptStyle:= GetPromptStyle(ReadString(LS,KEY_PROMPT_STYLE,'todos,sim,metacontingência,recuperar pontos,'));  
312 - Prompt.PromptMessage := ReadString(LS,KEY_PROMPT_MESSAGE,DEF_PROMPTMESSAGE); 314 + Prompt := TPrompt.Create(
  315 + AExperiment
  316 + , GetPromptStyle(ReadString(LS,KEY_PROMPT_STYLE,'todos,sim,metacontingência,recuperar pontos,'))
  317 + , Contingencies
  318 + , ReadString(LS,KEY_PROMPT_MESSAGE,DEF_PROMPTMESSAGE)
  319 + );
313 320
314 end; 321 end;
315 AExperiment.Condition[i]:= C; 322 AExperiment.Condition[i]:= C;
@@ -350,47 +357,6 @@ var @@ -350,47 +357,6 @@ var
350 LC, 357 LC,
351 LCK : string; 358 LCK : string;
352 359
353 - function GetEndCriteriaString(AEndCriterium:TEndConditionCriterium) : string;  
354 - begin  
355 - // 2,20,10,10,  
356 - case AEndCriterium.Value of  
357 - gecAbsoluteCycles: Result := '0';  
358 - gecInterlockingPorcentage: Result := '1';  
359 - gecWhichComeFirst: Result := '2';  
360 - end;  
361 - Result := Result + VV_SEP;  
362 - Result := Result + IntToStr(AEndCriterium.AbsoluteCycles) + VV_SEP;  
363 - Result := Result + IntToStr(AEndCriterium.InterlockingPorcentage) + VV_SEP;  
364 - Result := Result + IntToStr(AEndCriterium.LastCycles) + VV_SEP;  
365 - end;  
366 -  
367 - function GetPointsString(APoints : TPoints) : string;  
368 - begin  
369 - Result := IntToStr(APoints.A) + VV_SEP;  
370 - Result := Result + IntToStr(APoints.B) + VV_SEP;  
371 - Result := Result + IntToStr(APoints.G) + VV_SEP;  
372 - end;  
373 -  
374 - function GetChoiceString(AChoice : TPlayerChoice) : string;  
375 - begin  
376 - Result := GetRowString(AChoice.Row) + VV_SEP;  
377 - Result := Result+ GetColorString(AChoice.Color) + VV_SEP;  
378 - end;  
379 -  
380 - function GetPPointsString(APPoints : TPlayerPoints) : string;  
381 - begin  
382 - Result := IntToStr(APPoints.A)+VV_SEP+IntToStr(APPoints.B);  
383 - end;  
384 -  
385 - function GetStatusString(AStatus : TGamePlayerStatus): string;  
386 - begin  
387 - case AStatus of  
388 - gpsWaiting: Result := 'esperando';  
389 - gpsPlayed: Result := 'jogou';  
390 - gpsPlaying: Result := 'jogando';  
391 - end;  
392 - end;  
393 -  
394 begin 360 begin
395 LWriter := TRegData.Create(nil,AFilename); 361 LWriter := TRegData.Create(nil,AFilename);
396 LIniFile:= TCIniFile.Create(LWriter.FileName); 362 LIniFile:= TCIniFile.Create(LWriter.FileName);
@@ -414,8 +380,8 @@ begin @@ -414,8 +380,8 @@ begin
414 WriteInteger(LC, KEY_CYCLES_VALUE,Cycles.Value); 380 WriteInteger(LC, KEY_CYCLES_VALUE,Cycles.Value);
415 WriteInteger(LC, KEY_CYCLES_GEN,Cycles.Generation); 381 WriteInteger(LC, KEY_CYCLES_GEN,Cycles.Generation);
416 //WriteBool(LC, KEY_PROMPT_VALUE,Prompt.Value); 382 //WriteBool(LC, KEY_PROMPT_VALUE,Prompt.Value);
417 - WriteString(LC, KEY_PROMPT_MESSAGE, Prompt.PromptMessage);  
418 - WriteString(LC, KEY_PROMPT_STYLE, GetPromptStyleString(Prompt.PromptStyle)); 383 + //WriteString(LC, KEY_PROMPT_MESSAGE, Prompt.PromptMessage); TODO: write prompt as string
  384 + //WriteString(LC, KEY_PROMPT_STYLE, GetPromptStyleString(Prompt.PromptStyle));
419 385
420 for j := 0 to High(Contingencies) do 386 for j := 0 to High(Contingencies) do
421 begin 387 begin
@@ -426,7 +392,7 @@ begin @@ -426,7 +392,7 @@ begin
426 392
427 with Contingencies[j] do 393 with Contingencies[j] do
428 begin 394 begin
429 - WriteString(LC,LCK+KEY_CONSEQUE,Consequence.AsString); 395 + WriteString(LC,LCK+KEY_CONSEQUE,Consequence.AsString('')); // TODO review this
430 WriteString(LC,LCK+KEY_CRITERIA,CriteriaString); 396 WriteString(LC,LCK+KEY_CRITERIA,CriteriaString);
431 end; 397 end;
432 end; 398 end;
units/game_resources.pas
@@ -174,66 +174,19 @@ const @@ -174,66 +174,19 @@ const
174 // Meta : True; 174 // Meta : True;
175 // ); 175 // );
176 176
177 - //C_METACONTINGENCY_A2 : TContingency =  
178 - // (  
179 - // Consequence : (  
180 - // Style : [gscShowMessage,gscPoints,gscBroadcastMessage];  
181 - // Points :( A : 0; B : 0; G : -1;);  
182 - // Message : 'Vocês perderam 1 item escolar.'; // show first in case of last participant  
183 - // Cycles : 0; // absolute,  
184 - // VariationMin: 0; // porcentage,  
185 - // VariationMax : 0; // porcentage  
186 - // Prompt : (  
187 - // Message : '';  
188 - // Style : [];  
189 - // );  
190 - // );  
191 - //  
192 - // Response : (  
193 - // Operator_ : goNONE;  
194 - // Rows : [grOdd,grSome];  
195 - // Colors : [gcNone];  
196 - // );  
197 - //  
198 - // Meta : True;  
199 - // );  
200 -  
201 - //C_METACONTINGENCY_B1: TContingency =  
202 - // (  
203 - // Consequence : (  
204 - // Style : [gscShowMessage,gscPoints,gscBroadcastMessage];  
205 - // Points :(A :-1; B : 0; G : -1;);  
206 - // Message : 'Vocês perderam 1 item escolar e uma quantidade de pontos do Tipo A.';  
207 - // Cycles : 0; // absolute,  
208 - // VariationMin: 0; // porcentage,  
209 - // VariationMax : 0; // porcentage  
210 - // Prompt : (  
211 - // Message : '';  
212 - // Style : [];  
213 - // );  
214 - // );  
215 - //  
216 - // Response : (  
217 - // Operator_ : goNONE;  
218 - // Rows : [grOdd, grSome];  
219 - // Colors : [gcNone];  
220 - // );  
221 - //  
222 - // Meta : True;  
223 - // );  
224 177
225 //C_METACONTINGENCY_B2: TContingency = 178 //C_METACONTINGENCY_B2: TContingency =
226 // ( 179 // (
227 // Consequence : ( 180 // Consequence : (
228 // Style : [gscShowMessage,gscPoints,gscBroadcastMessage,gscPromptQuestion]; 181 // Style : [gscShowMessage,gscPoints,gscBroadcastMessage,gscPromptQuestion];
229 - // Points :(A :-3; B : 0; G : -1;);  
230 - // Message : 'Vocês perderam 1 item escolar.'; 182 + // Points :(A :0; B : 0; G : -1;);
  183 + // Message : 'Vocês produziram a perda de 1 item escolar.';
231 // Cycles : 0; // absolute, 184 // Cycles : 0; // absolute,
232 // VariationMin: 0; // porcentage, 185 // VariationMin: 0; // porcentage,
233 // VariationMax : 0; // porcentage 186 // VariationMax : 0; // porcentage
234 // Prompt : ( 187 // Prompt : (
235 - // Message : 'Vocês perderam 1 item escolar, desejam recuperá-lo gastando pontos do Tipo A?';  
236 - // Style : [gsAll,gsYes,gsMetacontingency,gsRecoverLostPoints]; 188 + // Message : 'Um item escolar foi perdido, desejam recuperá-lo gastando pontos do Tipo A?';
  189 + // Style : [gsAll,gsYes,gsMetacontingency,gsRecoverLostPoints, gsContingency, gsBasA];
237 // ); 190 // );
238 // ); 191 // );
239 // 192 //
@@ -250,30 +203,34 @@ const @@ -250,30 +203,34 @@ const
250 ( 203 (
251 ConditionName : ''; 204 ConditionName : '';
252 Contingencies : nil; 205 Contingencies : nil;
  206 + Interlocks : (
  207 + Count : 0;
  208 + History : nil;
  209 + );
253 210
254 Points : ( 211 Points : (
255 - Count : ( A:1; B:2; G:3; );  
256 - OnStart : ( A:3; B:1; G:0; ); 212 + Count : ( A:0; B:0; G:0; );
  213 + OnStart : ( A:0; B:0; G:0; );
257 ); 214 );
258 215
259 Turn : ( 216 Turn : (
260 Count: 0; 217 Count: 0;
261 - Value : 3; 218 + Value : 0;
262 Random: False; 219 Random: False;
263 ); 220 );
264 221
265 Cycles : ( 222 Cycles : (
266 Count : 0; 223 Count : 0;
267 - Value : 3; 224 + Value : 0;
268 Generation : 0; 225 Generation : 0;
269 ); 226 );
270 227
271 Prompt : nil; 228 Prompt : nil;
272 EndCriterium : ( 229 EndCriterium : (
273 Value : gecWhichComeFirst; 230 Value : gecWhichComeFirst;
274 - InterlockingPorcentage : 10;  
275 - LastCycles : 6;  
276 - AbsoluteCycles: 8; 231 + InterlockingPorcentage : 50;
  232 + LastCycles : 4;
  233 + AbsoluteCycles: 6;
277 ); 234 );
278 ); 235 );
279 236
units/string_methods.pas
@@ -10,19 +10,36 @@ uses @@ -10,19 +10,36 @@ uses
10 , game_resources 10 , game_resources
11 ; 11 ;
12 12
13 -function GetAndDelFirstValue(var S: string;Sep:Char=','):string;  
14 -function GetRowString(ARow : TGameRow) : string;  
15 -function GetRowFromString(S : string):TGameRow;  
16 -function GetRowColorFromString(S:string): TColor;  
17 -function GetColorString(AColor : TGameColor) : string;  
18 -function GetColorFromString(S : string) : TGameColor;  
19 -function GetPromptStyleFromString(S : string) : TPromptStyle;  
20 -function GetPromptStyleString(AStyle : TPromptStyle) : string;  
21 -function GetConsequenceStyleFromString(s:string):TGameConsequenceStyle;  
22 -function GetConsequenceStyleString(AStyle: TGameConsequenceStyle): string;  
23 -function GetResponseString(ACriteria : TCriteria) : string;  
24 -function GetResponseFromString(S: string) : TCriteria;  
25 -function GetRowColorString(C: TColor):string; 13 +function GetAndDelFirstValue(var S: string;Sep:Char=','):string; deprecated 'Use ExtracteDelimited from strutils instead';
  14 +
  15 +function GetRowString(ARow : TGameRow) : UTF8String;
  16 +function GetRowFromString(S : UTF8String):TGameRow;
  17 +
  18 +function GetColorString(C : TColor):UTF8String; overload;
  19 +function GetColorFromString(S : UTF8String): TColor;
  20 +function GetColorString(AColor : TGameColor) : UTF8String; overload;
  21 +function GetGameColorFromString(S : UTF8String) : TGameColor;
  22 +
  23 +function GetPromptStyleFromString(S : UTF8String) : TPromptStyle;
  24 +function GetPromptStyleString(AStyle : TPromptStyle) : UTF8String;
  25 +
  26 +function GetConsequenceStyleFromString(s : UTF8String):TGameConsequenceStyle;
  27 +function GetConsequenceStyleString(AStyle : TGameConsequenceStyle): UTF8String;
  28 +function GetConsequenceStylesFromString(S : UTF8String):TConsequenceStyle;
  29 +function GetConsequenceStylesString(CS : TConsequenceStyle): UTF8String;
  30 +
  31 +function GetCriteriaString(ACriteria : TCriteria) : UTF8String;
  32 +function GetCriteriaFromString(S : UTF8String) : TCriteria;
  33 +function GetCriteriaStyleString(AStyle: TGameStyle) : UTF8String;
  34 +
  35 +function GetStatusString(AStatus : TGamePlayerStatus): UTF8String;
  36 +function GetPPointsString(APPoints : TPlayerPoints) : UTF8String;
  37 +function GetChoiceString(AChoice : TPlayerChoice) : UTF8String;
  38 +function GetPointsString(APoints : TPoints) : UTF8String;
  39 +function GetEndCriteriaString(AEndCriterium:TEndConditionCriterium) : UTF8String;
  40 +
  41 +function GetPlayerFromString(s: UTF8string): TPlayer;
  42 +function GetPlayerAsString(P: TPlayer): UTF8string;
26 43
27 implementation 44 implementation
28 45
@@ -35,7 +52,7 @@ begin @@ -35,7 +52,7 @@ begin
35 if Length(S) > 0 then while S[1] = Sep do Delete(S, 1, 1); 52 if Length(S) > 0 then while S[1] = Sep do Delete(S, 1, 1);
36 end; 53 end;
37 54
38 -function GetRowString(ARow: TGameRow): string; 55 +function GetRowString(ARow: TGameRow): UTF8String;
39 begin 56 begin
40 case ARow of 57 case ARow of
41 grNone : Result := '0'; 58 grNone : Result := '0';
@@ -54,7 +71,7 @@ begin @@ -54,7 +71,7 @@ begin
54 end; 71 end;
55 end; 72 end;
56 73
57 -function GetRowFromString(S: string): TGameRow; 74 +function GetRowFromString(S: UTF8String): TGameRow;
58 begin 75 begin
59 case UpperCase(S) of 76 case UpperCase(S) of
60 'NA', '.' , '0', 'NONE' : Result := grNone; 77 'NA', '.' , '0', 'NONE' : Result := grNone;
@@ -73,7 +90,7 @@ begin @@ -73,7 +90,7 @@ begin
73 end; 90 end;
74 end; 91 end;
75 92
76 -function GetColorString(AColor: TGameColor): string; 93 +function GetColorString(AColor: TGameColor): UTF8String;
77 begin 94 begin
78 case AColor of 95 case AColor of
79 gcNone :Result := 'INDIFERENTE'; 96 gcNone :Result := 'INDIFERENTE';
@@ -87,7 +104,7 @@ begin @@ -87,7 +104,7 @@ begin
87 end; 104 end;
88 end; 105 end;
89 106
90 -function GetColorFromString(S: string): TGameColor; 107 +function GetGameColorFromString(S: UTF8String): TGameColor;
91 begin 108 begin
92 case UpperCase(S) of 109 case UpperCase(S) of
93 '.', 'INDIFERENTE', 'NONE' : Result := gcNone; 110 '.', 'INDIFERENTE', 'NONE' : Result := gcNone;
@@ -96,13 +113,13 @@ begin @@ -96,13 +113,13 @@ begin
96 'G', 'VERDE', 'GREEN' : Result := gcGreen; 113 'G', 'VERDE', 'GREEN' : Result := gcGreen;
97 'R', 'VERMELHO', 'RED' : Result := gcRed; 114 'R', 'VERMELHO', 'RED' : Result := gcRed;
98 'M', 'ROXO','MAGENTA', 'VIOLETA' : Result := gcMagenta; 115 'M', 'ROXO','MAGENTA', 'VIOLETA' : Result := gcMagenta;
99 - '!=','<>','DIFERENTES', 'DIFFERENT' : Result := gcDiff; 116 + '!','<>','DIFERENTES', 'DIFFERENT' : Result := gcDiff;
100 '=','IGUAIS', 'EQUAL' : Result := gcEqual; 117 '=','IGUAIS', 'EQUAL' : Result := gcEqual;
101 end; 118 end;
102 end; 119 end;
103 120
104 121
105 -function GetPromptStyleFromString(S: string): TPromptStyle; 122 +function GetPromptStyleFromString(S: UTF8String): TPromptStyle;
106 begin 123 begin
107 // todos,sim,metacontingência,recuperar pontos, 124 // todos,sim,metacontingência,recuperar pontos,
108 case UpperCase(S) of 125 case UpperCase(S) of
@@ -117,7 +134,7 @@ begin @@ -117,7 +134,7 @@ begin
117 end; 134 end;
118 end; 135 end;
119 136
120 -function GetPromptStyleString(AStyle: TPromptStyle): string; 137 +function GetPromptStyleString(AStyle: TPromptStyle): UTF8String;
121 var Style : TGamePromptStyle; 138 var Style : TGamePromptStyle;
122 begin 139 begin
123 Result:=''; 140 Result:='';
@@ -134,7 +151,7 @@ begin @@ -134,7 +151,7 @@ begin
134 end; 151 end;
135 end; 152 end;
136 153
137 -function GetConsequenceStyleFromString(s: string): TGameConsequenceStyle; 154 +function GetConsequenceStyleFromString(s: UTF8String): TGameConsequenceStyle;
138 begin 155 begin
139 case UpperCase(S) of 156 case UpperCase(S) of
140 'NADA': Result:= gscNone; 157 'NADA': Result:= gscNone;
@@ -145,7 +162,7 @@ begin @@ -145,7 +162,7 @@ begin
145 end; 162 end;
146 end; 163 end;
147 164
148 -function GetConsequenceStyleString(AStyle: TGameConsequenceStyle): string; 165 +function GetConsequenceStyleString(AStyle: TGameConsequenceStyle): UTF8String;
149 begin 166 begin
150 case AStyle of 167 case AStyle of
151 gscNone : Result:= 'NADA'; 168 gscNone : Result:= 'NADA';
@@ -156,61 +173,62 @@ begin @@ -156,61 +173,62 @@ begin
156 end; 173 end;
157 end; 174 end;
158 175
159 -function GetResponseString(ACriteria : TCriteria) : string; 176 +function GetCriteriaString(ACriteria: TCriteria): UTF8String;
160 var R : TGameRow; 177 var R : TGameRow;
161 C : TGameColor; 178 C : TGameColor;
162 begin 179 begin
163 - Result := '[';  
164 for R in ACriteria.Rows do 180 for R in ACriteria.Rows do
165 Result += GetRowString(R) + VV_SEP; 181 Result += GetRowString(R) + VV_SEP;
166 - Result += ']'; 182 + Result += '|';
167 183
168 - Result += '[';  
169 - case ACriteria.Style of  
170 - gtNone : Result += 'INDIFERENTE'+ VV_SEP;  
171 - gtRowsAndColors : Result += 'E'+ VV_SEP;  
172 - gtRowsOrColors : Result += 'OU'+ VV_SEP;  
173 - end;  
174 - Result += ']'; 184 + Result += GetCriteriaStyleString(ACriteria.Style)+'|';
175 185
176 - Result += '[';  
177 for C in ACriteria.Colors do 186 for C in ACriteria.Colors do
178 Result += GetColorString(C) + VV_SEP; 187 Result += GetColorString(C) + VV_SEP;
179 - Result += ']'; 188 + Result += '|';
180 end; 189 end;
181 190
182 -function GetResponseFromString(S: string) : TCriteria; 191 +function GetCriteriaFromString(S: UTF8String): TCriteria;
183 var 192 var
184 - R : TGameRow;  
185 - C : TGameColor;  
186 - LS : string;  
187 s1 : string; 193 s1 : string;
188 i : integer; 194 i : integer;
189 begin 195 begin
190 - LS := S + VV_SEP;  
191 - s1 := ExtractDelimited(2,LS,['[',']']); 196 + s1 := ExtractDelimited(1,S,['|']);
192 Result.Rows := []; 197 Result.Rows := [];
193 - for i := 0 to 10 do  
194 - if s1 <> '' then  
195 - Result.Rows += [GetRowFromString(UpperCase(GetAndDelFirstValue(s1)))] 198 +
  199 + for i := 1 to WordCount(s1,[#0,',']) do
  200 + if ExtractDelimited(i,s1,[',']) <> '' then
  201 + Result.Rows += [GetRowFromString(ExtractDelimited(i,s1,[',']))]
196 else Break; 202 else Break;
197 203
198 - s1 := ExtractDelimited(4,LS,['[',']']);  
199 - case UpperCase(GetAndDelFirstValue(s1)) of 204 + s1 := ExtractDelimited(2,S,['|']);
  205 + case UpperCase(s1) of
200 '','INDIFERENTE', 'NONE' : Result.Style := gtNone; 206 '','INDIFERENTE', 'NONE' : Result.Style := gtNone;
201 'E', 'AND' : Result.Style := gtRowsAndColors; 207 'E', 'AND' : Result.Style := gtRowsAndColors;
202 'OU', 'OR' : Result.Style := gtRowsOrColors; 208 'OU', 'OR' : Result.Style := gtRowsOrColors;
  209 +
203 end; 210 end;
204 211
205 - s1 := ExtractDelimited(6,LS,['[',']']); 212 + s1 := ExtractDelimited(3,S,['|']);
206 Result.Colors := []; 213 Result.Colors := [];
207 - for i := 0 to 10 do  
208 - if s1 <> '' then  
209 - Result.Colors += [GetColorFromString(UpperCase(GetAndDelFirstValue(s1)))] 214 + for i := 1 to WordCount(s1,[#0,',']) do
  215 + if ExtractDelimited(i,s1,[',']) <> '' then
  216 + Result.Colors += [GetGameColorFromString(ExtractDelimited(i,s1,[',']))]
210 else Break; 217 else Break;
211 end; 218 end;
212 219
213 -function GetRowColorString(C: TColor): string; 220 +function GetCriteriaStyleString(AStyle: TGameStyle): UTF8String;
  221 +begin
  222 + case AStyle of
  223 + gtNone : Result := 'INDIFERENTE';
  224 + gtRowsAndColors : Result := 'E';
  225 + gtRowsOrColors : Result := 'OU';
  226 + gtRowsOnly: Result := 'LINHAS';
  227 + gtColorsOnly:Result := 'CORES';
  228 + end;
  229 +end;
  230 +
  231 +function GetColorString(C: TColor): UTF8String;
214 begin 232 begin
215 case C of 233 case C of
216 ccYellow: Result := 'Y'; 234 ccYellow: Result := 'Y';
@@ -221,7 +239,7 @@ begin @@ -221,7 +239,7 @@ begin
221 end; 239 end;
222 end; 240 end;
223 241
224 -function GetRowColorFromString(S:string): TColor; 242 +function GetColorFromString(S: UTF8String): TColor;
225 begin 243 begin
226 case S of 244 case S of
227 'Y' : Result := ccYellow; 245 'Y' : Result := ccYellow;
@@ -232,18 +250,230 @@ begin @@ -232,18 +250,230 @@ begin
232 end; 250 end;
233 end; 251 end;
234 252
235 -//function ValidateString(S: String): string;  
236 -////var  
237 -//// i:integer;  
238 -//begin  
239 -// //for i:= Low(S) to High(S) do  
240 -// // case S[i] of  
241 -// // #32 : S[i] := #  
242 -// // #128 : S[i] := #128;  
243 -// //  
244 -// // end;  
245 -// //Result := AnsiToUtf8(S);  
246 -//end; 253 +function GetConsequenceStylesFromString(S:UTF8String):TConsequenceStyle;
  254 +var
  255 + LCount,
  256 + i : integer;
  257 +begin
  258 + Result := [];
  259 + LCount := WordCount(S,[#0,',']);
  260 + for i:= 1 to LCount do
  261 + case ExtractDelimited(i,S,[',']) of
  262 + '0':Result+=[gscNone];
  263 + 'M':Result+=[gscMessage];
  264 + 'C':Result+=[gscBroadcastMessage];
  265 + 'P':Result+=[gscPoints];
  266 + 'V':Result+=[gscVariablePoints];
  267 + 'A':Result+=[gscA];
  268 + 'B':Result+=[gscB];
  269 + 'G':Result+=[gscG]
  270 + end;
  271 +end;
  272 +
  273 +function GetConsequenceStylesString(CS: TConsequenceStyle): UTF8String;
  274 +var ConsequenceStyle : TGameConsequenceStyle;
  275 +begin
  276 + Result := '';
  277 + for ConsequenceStyle in CS do
  278 + begin
  279 + case ConsequenceStyle of
  280 + gscNone: Result += '0';
  281 + gscMessage:Result += 'M';
  282 + gscBroadcastMessage:Result += 'C';
  283 + gscPoints:Result += 'P';
  284 + gscVariablePoints:Result += 'V';
  285 + gscA:Result += 'A';
  286 + gscB:Result += 'B';
  287 + gscG:Result += 'G';
  288 + end;
  289 + Result += ',';
  290 + end;
  291 +end;
  292 +
  293 +function GetEndCriteriaString(AEndCriterium: TEndConditionCriterium
  294 + ): UTF8String;
  295 +begin
  296 + // 2,20,10,10,
  297 + case AEndCriterium.Value of
  298 + gecAbsoluteCycles: Result := '0';
  299 + gecInterlockingPorcentage: Result := '1';
  300 + gecWhichComeFirst: Result := '2';
  301 + end;
  302 + Result := Result + VV_SEP;
  303 + Result := Result + IntToStr(AEndCriterium.AbsoluteCycles) + VV_SEP;
  304 + Result := Result + IntToStr(AEndCriterium.InterlockingPorcentage) + VV_SEP;
  305 + Result := Result + IntToStr(AEndCriterium.LastCycles) + VV_SEP;
  306 +end;
  307 +
  308 +function GetPointsString(APoints: TPoints): UTF8String;
  309 +begin
  310 + Result := IntToStr(APoints.A) + VV_SEP;
  311 + Result := Result + IntToStr(APoints.B) + VV_SEP;
  312 + Result := Result + IntToStr(APoints.G) + VV_SEP;
  313 +end;
  314 +
  315 +function GetChoiceString(AChoice: TPlayerChoice): UTF8String;
  316 +begin
  317 + Result := GetRowString(AChoice.Row) + VV_SEP;
  318 + Result := Result+ GetColorString(AChoice.Color) + VV_SEP;
  319 +end;
  320 +
  321 +function GetPPointsString(APPoints: TPlayerPoints): UTF8String;
  322 +begin
  323 + Result := IntToStr(APPoints.A)+VV_SEP+IntToStr(APPoints.B);
  324 +end;
  325 +
  326 +function GetStatusString(AStatus: TGamePlayerStatus): UTF8String;
  327 +begin
  328 + case AStatus of
  329 + gpsWaiting: Result := 'esperando';
  330 + gpsPlayed: Result := 'jogou';
  331 + gpsPlaying: Result := 'jogando';
  332 + end;
  333 +end;
  334 +
  335 +function GetPlayerAsString(P: TPlayer): UTF8string;
  336 +var
  337 + i : integer;
  338 + M : array of UTF8String;
  339 +
  340 + procedure SetM(A : array of UTF8String);
  341 + var i : integer;
  342 + begin
  343 + SetLength(M,Length(A));
  344 + for i := 0 to Length(A) -1 do
  345 + M[i] := A[i];
  346 + end;
  347 +
  348 + function PointsString(APPoints : TPlayerPoints) : string;
  349 + begin
  350 + Result := IntToStr(APPoints.A)+VV_SEP+IntToStr(APPoints.B);
  351 + end;
  352 +
  353 + function StatusString(AStatus : TGamePlayerStatus): string;
  354 + begin
  355 + case AStatus of
  356 + gpsWaiting: Result := '0';
  357 + gpsPlaying: Result := '1';
  358 + gpsPlayed: Result := '2';
  359 + end;
  360 + end;
  361 +
  362 + function RowString(ARow: TGameRow): string;
  363 + begin
  364 + case ARow of
  365 + grNone : Result := '.';
  366 + grOne : Result := '1';
  367 + grTwo : Result := '2';
  368 + grThree : Result :='3';
  369 + grFour : Result := '4';
  370 + grFive : Result := '5';
  371 + grSix : Result := '6';
  372 + grSeven : Result := '7';
  373 + grEight : Result := '8';
  374 + grNine : Result := '9';
  375 + grTen : Result := '0';
  376 + end;
  377 + end;
  378 +
  379 + function ColorString(AColor: TGameColor): string;
  380 + begin
  381 + case AColor of
  382 + gcNone :Result := '0';
  383 + gcYellow :Result := '1';
  384 + gcRed :Result := '2';
  385 + gcMagenta :Result := '3';
  386 + gcBlue :Result := '4';
  387 + gcGreen :Result := '5';
  388 + end;
  389 + end;
  390 +
  391 + function ChoiceString(AChoice : TPlayerChoice) : string;
  392 + begin
  393 + Result := RowString(AChoice.Row) + VV_SEP;
  394 + Result := Result+ ColorString(AChoice.Color);
  395 + end;
  396 +
  397 +begin
  398 + Result := '';
  399 + SetM([P.ID
  400 + , P.Nicname
  401 + , PointsString(P.Points)
  402 + , StatusString(P.Status)
  403 + , ChoiceString(P.Choice)
  404 + , IntToStr(P.Turn)
  405 + ]);
  406 + for i := 0 to Length(M)-1 do
  407 + Result += M[i] + '|';
  408 +end;
  409 +
  410 +function GetPlayerFromString(s: UTF8string): TPlayer;
  411 +
  412 + function RowFromString(S: string): TGameRow;
  413 + begin
  414 + case S of
  415 + '.' : Result := grNone;
  416 + '1' : Result := grOne;
  417 + '2' : Result := grTwo;
  418 + '3' : Result := grThree;
  419 + '4' : Result := grFour;
  420 + '5' : Result := grFive;
  421 + '6' : Result := grSix;
  422 + '7' : Result := grSeven;
  423 + '8' : Result := grEight;
  424 + '9' : Result := grNine;
  425 + '0' : Result := grTen;
  426 + end;
  427 + end;
  428 +
  429 + function ColorFromString(S: string): TGameColor;
  430 + begin
  431 + case S of
  432 + '0' : Result := gcNone;
  433 + '1' : Result := gcYellow;
  434 + '2' : Result := gcRed;
  435 + '3' : Result := gcMagenta;
  436 + '4' : Result := gcBlue;
  437 + '5' : Result := gcGreen;
  438 + end;
  439 + end;
  440 +
  441 + function ChoiceFromString(S:string) : TPlayerChoice;
  442 + begin
  443 + Result.Row := RowFromString(ExtractDelimited(1,S,[',']));
  444 + Result.Color := ColorFromString(ExtractDelimited(2,S,[',']));
  445 + end;
  446 +
  447 + function PointsFromString(S:string) : TPlayerPoints;
  448 + begin
  449 + Result.A := StrToInt(ExtractDelimited(1,S,[',']));
  450 + Result.B := StrToInt(ExtractDelimited(2,S,[',']));
  451 + end;
  452 +
  453 + function StatusFromString(S : string): TGamePlayerStatus;
  454 + begin
  455 + case S of
  456 + '0': Result := gpsWaiting;
  457 + '1': Result := gpsPlaying;
  458 + '2': Result := gpsPlayed;
  459 + end;
  460 + end;
  461 +begin
  462 + {$IFDEF DEBUG}
  463 + WriteLn(ExtractDelimited(1,s,['|']));
  464 + WriteLn(ExtractDelimited(2,s,['|']));
  465 + WriteLn(ExtractDelimited(3,s,['|']));
  466 + WriteLn(ExtractDelimited(4,s,['|']));
  467 + WriteLn(ExtractDelimited(5,s,['|']));
  468 + WriteLn(ExtractDelimited(6,s,['|']));
  469 + {$ENDIF}
  470 + Result.ID := ExtractDelimited(1,s,['|']);
  471 + Result.Nicname := ExtractDelimited(2,s,['|']);
  472 + Result.Points := PointsFromString(ExtractDelimited(3,s,['|']));
  473 + Result.Status := StatusFromString(ExtractDelimited(4,s,['|']));
  474 + Result.Choice := ChoiceFromString(ExtractDelimited(5,s,['|']));
  475 + Result.Turn:=StrToInt(ExtractDelimited(6,s,['|']));
  476 +end;
247 477
248 end. 478 end.
249 479