Commit 8625dfa5 authored by rarnu's avatar rarnu

add: 上传全新的代码,改用FMX框架

parent c1825019
.idea/
.vscode/
.fleet/
.kotlin/
*.o
*.ppu
*.dcu
*.rsm
### Mac OS ###
.DS_Store
......@@ -21,4 +26,10 @@ Thumbs.db
lib/
cardimg/*.jpg
Debug/
Release/
*.identcache
*.dproj.local
*.groupproj.local
unit untAPI;
interface
uses
Classes, SysUtils, System.Net.HttpClientComponent, System.Net.URLClient,
System.Net.HttpClient, System.JSON.Serializers;
const
BASE_URL = 'https://sapi.moecube.com:444';
API_ACC_SIGNIN = '/accounts/signin';
API_ACC_AUTHUSER = '/accounts/authUser';
PUZZLE_URL = 'http://rarnu.xyz:38383/api/mdpro3/puzzle/save';
type
TCommonResult = class(TPersistent)
private
[JsonName('code')]
FCode: Integer;
[JsonName('message')]
FMessage: string;
published
property Code: Integer read FCode write FCode;
property Message: string read FMessage write FMessage;
end;
TSavePuzzleResult = class(TCommonResult)
private
[JsonName('data')]
FData: Int64;
published
property Data: Int64 read FData write FData;
end;
type
TMCSignInReq = class(TPersistent)
private
[JsonName('account')]
FAccount: string;
[JsonName('password')]
FPassword: string;
public
constructor Create(Acc, Pwd: string);
published
property Account: string read FAccount write FAccount;
property Password: string read FPassword write FPassword;
end;
type
TMCUser = class(TPersistent)
private
[JsonName('id')]
FId: Int64;
[JsonName('username')]
FUsername: string;
[JsonName('name')]
FName: string;
[JsonName('email')]
FEmail: string;
[JsonName('avatar')]
FAvatar: string;
published
property Id: Int64 read FId write FId;
property Username: string read FUsername write FUsername;
property Name: string read FName write FName;
property Email: string read FEmail write FEmail;
property Avatar: string read FAvatar write FAvatar;
end;
TMCUserWithToken = class(TPersistent)
private
[JsonName('token')]
FToken: String;
[JsonName('user')]
FUser: TMCUser;
public
constructor Create;
destructor Destroy; override;
published
property User: TMCUser read FUser;
property Token: String read FToken write FToken;
end;
type
TEntityPuzzle = class(TPersistent)
private
[JsonName('id')]
FId: Int64;
[JsonName('contributor')]
FContributor: string;
[JsonName('coverCard')]
FCoverCard: Int64;
[JsonName('luaScript')]
FLuaScript: String;
[JsonName('message')]
FMessage: string;
[JsonName('name')]
FName: string;
[JsonName('solution')]
FSolution: string;
[JsonName('userId')]
FUserId: Int64;
published
property Id: Int64 read FId write FId;
property Name: string read FName write FName;
property UserId: Int64 read FUserId write FUserId;
property Contributor: string read FContributor write FContributor;
property Message: string read FMessage write FMessage;
property Solution: string read FSolution write FSolution;
property CoverCard: Int64 read FCoverCard write FCoverCard;
property LuaScript: String read FLuaScript write FLuaScript;
end;
type
TAPI = class
public
class function MCLogin(AAccount: String; APassword: String): TMCUserWithToken;
class function MCValidate(AToken: String): TMCUser;
class function SavePuzzle(AP: TEntityPuzzle; AUserId: Int64; AToken: String): TSavePuzzleResult;
end;
implementation
uses
untJSON;
{ TAPI }
class function TAPI.MCLogin(AAccount, APassword: String): TMCUserWithToken;
var
http: TNetHTTPClient;
url: string;
signInReq: TMCSignInReq;
ssReq: TStringStream;
resp: IHTTPResponse;
retJson: string;
begin
Result := nil;
url := Format('%s%s', [BASE_URL, API_ACC_SIGNIN]);
http := TNetHTTPClient.Create(nil);
http.Asynchronous := False;
http.CustomHeaders['origin'] := 'https://accounts.moecube.com';
http.CustomHeaders['referer'] := 'https://accounts.moecube.com';
http.CustomHeaders['sec-fetch-dest'] := 'empty';
http.CustomHeaders['sec-fetch-mode'] := 'cors';
http.CustomHeaders['sec-fetch-site'] := 'same-site';
http.ContentType := 'application/json; charset=UTF-8';
signInReq:= TMCSignInReq.Create(AAccount, APassword);
ssReq := TStringStream.Create(TJSON.ObjectToJson<TMCSignInReq>(signInReq), TEncoding.UTF8);
signInReq.Free;
try
resp := http.Post(url, ssReq, nil);
if resp.StatusCode = 200 then begin
retJson := resp.ContentAsString(TEncoding.UTF8);
Result := TJSON.JsonToObject<TMCUserWithToken>(retJson);
end;
except
end;
ssReq.Free;
http.Free;
end;
class function TAPI.MCValidate(AToken: String): TMCUser;
var
http: TNetHTTPClient;
url: string;
resp: IHTTPResponse;
retJson: string;
begin
Result := nil;
url := Format('%s%s', [BASE_URL, API_ACC_AUTHUSER]);
http := TNetHTTPClient.Create(nil);
http.Asynchronous := False;
http.CustomHeaders['Authorization'] := Format('Bearer %s', [AToken]);
try
resp := http.Get(url);
if resp.StatusCode = 200 then begin
retJson := resp.ContentAsString(TEncoding.UTF8);
Result := TJSON.JsonToObject<TMCUser>(retJson);
end;
except
end;
http.Free;
end;
class function TAPI.SavePuzzle(AP: TEntityPuzzle; AUserId: Int64; AToken: String): TSavePuzzleResult;
var
http: TNetHTTPClient;
url: string;
ssReq: TStringStream;
resp: IHTTPResponse;
retJson: string;
begin
Result := nil;
url := PUZZLE_URL;
http := TNetHTTPClient.Create(nil);
http.Asynchronous := False;
http.CustomHeaders['ReqSource'] := 'MDPro3';
http.CustomHeaders['userId'] := AUserId.ToString();
http.CustomHeaders['token'] := AToken;
http.ContentType := 'application/json; charset=UTF-8';
ssReq := TStringStream.Create(TJSON.ObjectToJson<TEntityPuzzle>(AP), TEncoding.UTF8);
try
resp := http.Post(url, ssReq, nil);
if resp.StatusCode = 200 then begin
retJson := resp.ContentAsString(TEncoding.UTF8);
Result := TJSON.JsonToObject<TSavePuzzleResult>(retJson);
end;
except
end;
ssReq.Free;
http.Free;
end;
{ TMCSignInReq }
constructor TMCSignInReq.Create(Acc, Pwd: string);
begin
FAccount := Acc;
FPassword := Pwd;
end;
{ TMCUserWithToken }
constructor TMCUserWithToken.Create;
begin
FUser := TMCUser.Create;
end;
destructor TMCUserWithToken.Destroy;
begin
FUser.Free;
inherited;
end;
end.
unit untConstant;
{$mode ObjFPC}{$H+}
unit untConstant;
interface
uses
Classes, SysUtils;
const
OWNER_SELF = '自己的';
......@@ -14,10 +9,10 @@ const
OWNER_SHARE = '共享的';
OWNER_NONE = '无';
COLOR_SELF = '#FF63B8FF';
COLOR_OPPONENT = '#FFFF6347';
COLOR_SHARE = '#FFFFFF00';
COLOR_NONE = '#FFFFFFFF';
COLOR_SELF = $FF63B8FF;
COLOR_OPPONENT = $FFFF6347;
COLOR_SHARE = $FFFFFF00;
COLOR_NONE = $FFFFFFFF;
LOC_MZONE = '怪兽区(%d)';
LOC_SZONE = '魔陷区(%d)';
......@@ -30,9 +25,6 @@ const
LOC_GRAVE = '墓地';
LOC_REMOVED = '除外区';
AS_SPELL = '';
implementation
end.
This source diff could not be displayed because it is too large. You can view the blob instead.
unit frmAbout;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Layouts, FMX.Objects, FMX.Effects, FMX.Filter.Effects, FMX.Ani, Winapi.ShellAPI, Winapi.Windows;
type
TFormAbout = class(TForm)
txtGitlab: TText;
layBackground: TLayout;
procedure layBackgroundClick(Sender: TObject);
procedure txtGitlabClick(Sender: TObject);
procedure txtGitlabMouseEnter(Sender: TObject);
procedure txtGitlabMouseLeave(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormAbout: TFormAbout;
implementation
uses
frmStyleModule;
{$R *.fmx}
procedure TFormAbout.layBackgroundClick(Sender: TObject);
begin
Close;
end;
procedure TFormAbout.txtGitlabClick(Sender: TObject);
begin
ShellExecute(0, 'open', 'https://code.moenext.com/rarnu/puzzle-editor', nil, nil, SW_NORMAL);
end;
procedure TFormAbout.txtGitlabMouseEnter(Sender: TObject);
begin
txtGitlab.TextSettings.Font.Style := [TFontStyle.fsBold, TFontStyle.fsUnderline];
end;
procedure TFormAbout.txtGitlabMouseLeave(Sender: TObject);
begin
txtGitlab.TextSettings.Font.Style := [TFontStyle.fsBold];
end;
end.
object FormCardList: TFormCardList
Left = 0
Top = 0
BorderIcons = [biSystemMenu]
BorderStyle = Single
Caption = #21345#29255#21015#34920
ClientHeight = 800
ClientWidth = 600
Padding.Left = 8.000000000000000000
Padding.Top = 8.000000000000000000
Padding.Right = 8.000000000000000000
Padding.Bottom = 8.000000000000000000
Position = MainFormCenter
StyleBook = StyleManager.StyleBook
Constraints.MaxHeight = 800.000000000000000000
Constraints.MaxWidth = 600.000000000000000000
Constraints.MinHeight = 800.000000000000000000
Constraints.MinWidth = 600.000000000000000000
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnCreate = FormCreate
OnDestroy = FormDestroy
DesignerMasterStyle = 0
object TLayout
Align = Bottom
Position.X = 8.000000000000000000
Position.Y = 742.000000000000000000
Size.Width = 584.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object btnOK: TCornerButton
Align = MostRight
StyledSettings = [Size]
ModalResult = 1
Margins.Top = 8.000000000000000000
Margins.Bottom = 8.000000000000000000
Position.X = 524.000000000000000000
Position.Y = 8.000000000000000000
Sides = [Top, Left, Bottom, Right]
Size.Width = 60.000000000000000000
Size.Height = 34.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
Text = #30830#23450
TextSettings.Font.Family = 'Microsoft YaHei'
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = claWhite
TextSettings.Trimming = None
XRadius = 3.000000000000000000
YRadius = 3.000000000000000000
end
object btnCancel: TCornerButton
Align = Right
StyledSettings = [Size]
ModalResult = 2
Margins.Top = 8.000000000000000000
Margins.Right = 8.000000000000000000
Margins.Bottom = 8.000000000000000000
Position.X = 456.000000000000000000
Position.Y = 8.000000000000000000
Sides = [Top, Left, Bottom, Right]
Size.Width = 60.000000000000000000
Size.Height = 34.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
Text = #21462#28040
TextSettings.Font.Family = 'Microsoft YaHei'
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = claWhite
TextSettings.Trimming = None
XRadius = 3.000000000000000000
YRadius = 3.000000000000000000
end
object btnAddCard: TCornerButton
Align = Left
StyledSettings = [Size]
Margins.Left = 8.000000000000000000
Margins.Top = 8.000000000000000000
Margins.Bottom = 8.000000000000000000
Position.X = 8.000000000000000000
Position.Y = 8.000000000000000000
Sides = [Top, Left, Bottom, Right]
Size.Width = 100.000000000000000000
Size.Height = 34.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
Text = #28155#21152#21345#29255
TextSettings.Font.Family = 'Microsoft YaHei'
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = claWhite
TextSettings.Trimming = None
XRadius = 3.000000000000000000
YRadius = 3.000000000000000000
OnClick = btnAddCardClick
end
end
object lstCards: TListBox
Align = Client
Size.Width = 584.000000000000000000
Size.Height = 734.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
DisableFocusEffect = True
DefaultItemStyles.ItemStyle = ''
DefaultItemStyles.GroupHeaderStyle = ''
DefaultItemStyles.GroupFooterStyle = ''
Viewport.Width = 580.000000000000000000
Viewport.Height = 730.000000000000000000
end
end
unit frmCardList;
{$mode Delphi}{$H+}
unit frmCardList;
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, orca_scene2d, fgl, untData, untCard;
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.ListBox, untCard;
type
{ TFormCardList }
TFormCardList = class(TForm)
btnOK: TD2CornerButton;
btnCancel: TD2CornerButton;
btnAddCard: TD2CornerButton;
D2Resources1: TD2Resources;
Layout1: TD2Layout;
lstCards: TD2ListBox;
Root: TD2Background;
Scene: TD2Scene;
btnOK: TCornerButton;
btnCancel: TCornerButton;
btnAddCard: TCornerButton;
lstCards: TListBox;
procedure btnAddCardClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FCardList: TFPGList<Int64>;
procedure addOneCardItem(ACard: TCard);
FCardList: TArray<Int64>;
procedure addOneCardItem(ACard: ICard);
procedure deleteCardItem(ACardId: Int64; AIndex: Integer);
public
procedure FillCardIds(list: TFPGList<Int64>);
procedure FillCardIds(list: TArray<Int64>);
published
property CardList: TFPGList<Int64> read FCardList;
property CardList: TArray<Int64> read FCardList;
end;
var
......@@ -38,32 +31,51 @@ var
implementation
uses untListItem, frmSearchCard, untConfig;
uses
untCardOperationItem, frmSearchCard, untArrayHelper, moduleData, frmStyleModule;
{$R *.lfm}
{$R *.fmx}
{ TFormCardList }
procedure TFormCardList.addOneCardItem(ACard: ICard);
var
item: TCardOperItem;
c: ICard;
begin
c := DMData.GetCardInfo(ACard.GetCardId);
FCardList.Add(ACard.GetCardId);
lstCards.BeginUpdate;
item:= TCardOperItem.Create(lstCards);
item.CardName:= c.GetCardName;
item.CardId:= c.GetCardId;
item.Card := c;
item.ShowFace:= False;
item.Index:= lstCards.Count - 1;
item.OnDelete:= deleteCardItem;
item.OnCardAddOneClicked:= addOneCardItem;
lstCards.EndUpdate;
end;
procedure TFormCardList.btnAddCardClick(Sender: TObject);
var
cid: Int64 = 0;
c: TCard;
item: TCardListItemOp;
cid: Int64;
c: ICard;
item: TCardOperItem;
begin
cid := 0;
with TFormSearchCard.Create(Self) do begin
if ShowModal = mrOK then begin
if ShowModal = mrOk then begin
cid := CardId;
end;
Free;
end;
if cid > 0 then begin
FCardList.Add(cid);
c := Cards.GetCardInfo(cid);
c := DMData.GetCardInfo(cid);
lstCards.BeginUpdate;
item := TCardListItemOp.Create(lstCards);
item.CardName:= c.CardName;
item.Id:= cid;
item.SetCardForFree(c, True);
item := TCardOperItem.Create(lstCards);
item.CardName:= c.GetCardName;
item.CardId:= cid;
item.Card := c;
item.ShowFace := False;
item.Index:= lstCards.Count - 1;
item.OnDelete:= deleteCardItem;
......@@ -72,36 +84,18 @@ begin
end;
end;
procedure TFormCardList.FormCreate(Sender: TObject);
var
AScale: Double;
begin
FCardList := TFPGList<Int64>.Create;
AScale:= TConfigReader.GetScale();
self.Width:= Trunc(600 * AScale);
self.Height:= Trunc(800 * AScale);
Root.Scale.X:= AScale;
Root.Scale.Y:= AScale;
end;
procedure TFormCardList.FormDestroy(Sender: TObject);
begin
FCardList.Free;
end;
procedure TFormCardList.deleteCardItem(ACardId: Int64; AIndex: Integer);
var
cid: Int64;
i, j: Integer;
item: TCardListItemOp;
item: TCardOperItem;
begin
// index matches
for i:= 0 to FCardList.Count - 1 do begin
cid := FCardList[i];
if cid = ACardId then begin
for j := 0 to lstCards.Count - 1 do begin
item := TCardListItemOp(lstCards.Items[j]);
if (item.Id = ACardId) and (item.Index = AIndex) then begin
item := TCardOperItem(lstCards.ListItems[j]);
if (item.CardId = ACardId) and (item.Index = AIndex) then begin
FCardList.Delete(i);
item.Free;
Break;
......@@ -112,49 +106,35 @@ begin
end;
for i := 0 to lstCards.Count - 1 do begin
item := TCardListItemOp(lstCards.Items[i]);
item := TCardOperItem(lstCards.ListItems[i]);
item.Index:= i;
end;
end;
procedure TFormCardList.addOneCardItem(ACard: TCard);
var
item: TCardListItemOp;
c: TCard;
begin
c := Cards.GetCardInfo(ACard.CardId);
FCardList.Add(ACard.CardId);
lstCards.BeginUpdate;
item:= TCardListItemOp.Create(lstCards);
item.CardName:= c.CardName;
item.Id:= c.CardId;
item.SetCardForFree(c, True);
item.ShowFace:= False;
item.Index:= lstCards.Count - 1;
item.OnDelete:= deleteCardItem;
item.OnCardAddOneClicked:= addOneCardItem;
lstCards.EndUpdate;
end;
procedure TFormCardList.FillCardIds(list: TFPGList<Int64>);
procedure TFormCardList.FillCardIds(list: TArray<Int64>);
var
i: Integer;
item: TCardListItemOp;
cn: string;
c: TCard;
item: TCardOperItem;
c: ICard;
begin
FCardList.Clear;
FCardList.AddList(list);
SetLength(FCardList, 0);
SetLength(FCardList, list.Count);
for i := 0 to list.Count - 1 do begin
FCardList[i] := list[i];
end;
lstCards.Clear;
if (list.Count > 0) then begin
lstCards.BeginUpdate;
for i:= 0 to FCardList.Count - 1 do begin
c := Cards.GetCardInfo(FCardList[i]);
item := TCardListItemOp.Create(lstCards);
item.CardName:= c.CardName;
item.Id:= FCardList[i];
c := DMData.GetCardInfo(FCardList[i]);
item := TCardOperItem.Create(lstCards);
item.CardName:= c.GetCardName;
item.CardId:= FCardList[i];
item.ShowFace := False;
item.SetCardForFree(c, True);
item.Card := c;
item.Index:= i;
item.OnDelete:= deleteCardItem;
item.OnCardAddOneClicked:= addOneCardItem;
......@@ -163,5 +143,14 @@ begin
end;
end;
end.
procedure TFormCardList.FormCreate(Sender: TObject);
begin
SetLength(FCardList, 0);
end;
procedure TFormCardList.FormDestroy(Sender: TObject);
begin
SetLength(FCardList, 0);
end;
end.
object FormContinousEffected: TFormContinousEffected
Left = 0
Top = 0
BorderIcons = [biSystemMenu]
BorderStyle = Single
Caption = #24433#21709#21345#29255
ClientHeight = 800
ClientWidth = 600
Padding.Left = 8.000000000000000000
Padding.Top = 8.000000000000000000
Padding.Right = 8.000000000000000000
Padding.Bottom = 8.000000000000000000
Position = MainFormCenter
StyleBook = StyleManager.StyleBook
Constraints.MaxHeight = 800.000000000000000000
Constraints.MaxWidth = 600.000000000000000000
Constraints.MinHeight = 800.000000000000000000
Constraints.MinWidth = 600.000000000000000000
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnCreate = FormCreate
OnDestroy = FormDestroy
DesignerMasterStyle = 0
object TLayout
Align = Bottom
Position.X = 8.000000000000000000
Position.Y = 742.000000000000000000
Size.Width = 584.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object btnOK: TCornerButton
Align = MostRight
StyledSettings = [Size]
Padding.Top = 8.000000000000000000
ModalResult = 1
Margins.Top = 8.000000000000000000
Margins.Bottom = 8.000000000000000000
Position.X = 524.000000000000000000
Position.Y = 8.000000000000000000
Sides = [Top, Left, Bottom, Right]
Size.Width = 60.000000000000000000
Size.Height = 34.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
Text = #30830#23450
TextSettings.Font.Family = 'Microsoft YaHei'
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = claWhite
TextSettings.Trimming = None
XRadius = 3.000000000000000000
YRadius = 3.000000000000000000
OnClick = btnOKClick
end
object btnCancel: TCornerButton
Align = Right
StyledSettings = [Size]
ModalResult = 2
Margins.Top = 8.000000000000000000
Margins.Right = 8.000000000000000000
Margins.Bottom = 8.000000000000000000
Position.X = 456.000000000000000000
Position.Y = 8.000000000000000000
Sides = [Top, Left, Bottom, Right]
Size.Width = 60.000000000000000000
Size.Height = 34.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
Text = #21462#28040
TextSettings.Font.Family = 'Microsoft YaHei'
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = claWhite
TextSettings.Trimming = None
XRadius = 3.000000000000000000
YRadius = 3.000000000000000000
end
end
object lstCards: TListBox
Align = Client
Size.Width = 584.000000000000000000
Size.Height = 734.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
DisableFocusEffect = True
DefaultItemStyles.ItemStyle = ''
DefaultItemStyles.GroupHeaderStyle = ''
DefaultItemStyles.GroupFooterStyle = ''
Viewport.Width = 580.000000000000000000
Viewport.Height = 730.000000000000000000
end
end
unit frmContinousEffected;
{$mode Delphi}{$H+}
unit frmContinousEffected;
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, orca_scene2d, untCard, untListItem, fgl, untData;
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.ListBox, untCard;
type
{ TFormContinousEffected }
TFormContinousEffected = class(TForm)
CornerButton1: TD2CornerButton;
CornerButton2: TD2CornerButton;
D2Resources1: TD2Resources;
Layout1: TD2Layout;
lstCards: TD2ListBox;
Root: TD2Background;
Scene: TD2Scene;
procedure CornerButton1Click(Sender: TObject);
btnOK: TCornerButton;
btnCancel: TCornerButton;
lstCards: TListBox;
procedure btnOKClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FCESelectedCards: TFPGList<TCard>;
FCurrentCard: TCard;
FCESelectedCards: TArray<ICard>;
FCurrentCard: ICard;
FPuzzle: TPuzzleField;
public
procedure RefreshList();
published
// managed by FormHome
property CEPuzzle: TPuzzleField read FPuzzle write FPuzzle;
property CECurrentCard: TCard read FCurrentCard write FCurrentCard;
property CESelectedCards: TFPGList<TCard> read FCESelectedCards;
property CECurrentCard: ICard read FCurrentCard write FCurrentCard;
property CESelectedCards: TArray<ICard> read FCESelectedCards;
end;
var
......@@ -43,49 +34,40 @@ var
implementation
uses
untUtils, untConfig;
{$R *.lfm}
untCardCheckItem, untArrayHelper, untUtils, frmStyleModule;
{ TFormContinousEffected }
procedure TFormContinousEffected.FormCreate(Sender: TObject);
var
AScale: Double;
begin
FCESelectedCards := TFPGList<TCard>.Create;
AScale:= TConfigReader.GetScale();
self.Width:= Trunc(600 * AScale);
self.Height:= Trunc(800 * AScale);
Root.Scale.X:= AScale;
Root.Scale.Y:= AScale;
end;
{$R *.fmx}
procedure TFormContinousEffected.CornerButton1Click(Sender: TObject);
procedure TFormContinousEffected.btnOKClick(Sender: TObject);
var
i: Integer;
item: TCardListItemCheck;
item: TCardCheckItem;
begin
FCESelectedCards.Clear;
SetLength(FCESelectedCards, 0);
for i := 0 to lstCards.Count - 1 do begin
item := TCardListItemCheck(lstCards.Items[i]);
item := TCardCheckItem(lstCards.ListItems[i]);
if (item.Checked) then begin
FCESelectedCards.Add(item.Card);
end;
end;
end;
procedure TFormContinousEffected.FormCreate(Sender: TObject);
begin
SetLength(FCESelectedCards, 0);
end;
procedure TFormContinousEffected.FormDestroy(Sender: TObject);
begin
FCESelectedCards.Free;
// FreeCards(FCESelectedCards);
SetLength(FCESelectedCards, 0);
end;
procedure TFormContinousEffected.RefreshList();
procedure TFormContinousEffected.RefreshList;
var
i: Integer;
c: TCard;
item: TCardListItemCheck;
c: ICard;
item: TCardCheckItem;
begin
if FPuzzle = nil then Exit;
if FCurrentCard = nil then Exit;
......@@ -96,64 +78,69 @@ begin
for i:= 0 to 4 do begin
c := FPuzzle.MCard[0, i];
if (c <> nil) then begin
item := TCardListItemCheck.Create(lstCards);
item.CardName:= c.CardName;
item.Id:= c.CardId;
item := TCardCheckItem.Create(lstCards);
item.CardName:= c.GetCardName;
item.CardId:= c.GetCardId;
item.Player:= 0;
item.Card := c;
item.Checked:= PickOneCardFromList(FCurrentCard.ContinousEffectTo, c.CardId, c.Owner, c.Player, c.Location, c.Seq) <> nil;
item.Checked:= PickOneCardFromList(FCurrentCard.GetContinousEffectTo, c.GetCardId, c.GetOwner, c.GetPlayer, c.GetLocation, c.GetSeq) <> nil;
end;
end;
for i:= 0 to 5 do begin
c := FPuzzle.SCard[0, i];
if (c <> nil) then begin
item := TCardListItemCheck.Create(lstCards);
item.CardName:= c.CardName;
item.Id:= c.CardId;
item := TCardCheckItem.Create(lstCards);
item.CardName:= c.GetCardName;
item.CardId:= c.GetCardId;
item.Player:= 0;
item.Card := c;
item.Checked:= PickOneCardFromList(FCurrentCard.ContinousEffectTo, c.CardId, c.Owner, c.Player, c.Location, c.Seq) <> nil;
item.Checked:= PickOneCardFromList(FCurrentCard.GetContinousEffectTo, c.GetCardId, c.GetOwner, c.GetPlayer, c.GetLocation, c.GetSeq) <> nil;
end;
end;
for i := 5 to 6 do begin
c := FPuzzle.ExtraMonster[i];
if (c <> nil) then begin
item := TCardListItemCheck.Create(lstCards);
item.CardName:= c.CardName;
item.Id:= c.CardId;
item.Player:= IfThen<Integer>(c.Owner = coSelf, 0, 1);
item := TCardCheckItem.Create(lstCards);
item.CardName:= c.GetCardName;
item.CArdId:= c.GetCardId;
item.Player:= EXT.IfThen<Integer>(c.GetOwner = coSelf, 0, 1);
item.Card := c;
item.Checked:= PickOneCardFromList(FCurrentCard.ContinousEffectTo, c.CardId, c.Owner, c.Player, c.Location, c.Seq) <> nil;
item.Checked:= PickOneCardFromList(FCurrentCard.GetContinousEffectTo, c.GetCardId, c.GetOwner, c.GetPlayer, c.GetLocation, c.GetSeq) <> nil;
end;
end;
for i := 1 to 4 do begin
c := FPuzzle.MCard[1, i];
if (c <> nil) then begin
item := TCardListItemCheck.Create(lstCards);
item.CardName:= c.CardName;
item.Id:= c.CardId;
item := TCardCheckItem.Create(lstCards);
item.CardName:= c.GetCardName;
item.CardId:= c.GetCardId;
item.Player:= 1;
item.Card := c;
item.Checked:= PickOneCardFromList(FCurrentCard.ContinousEffectTo, c.CardId, c.Owner, c.Player, c.Location, c.Seq) <> nil;
item.Checked:= PickOneCardFromList(FCurrentCard.GetContinousEffectTo, c.GetCardId, c.GetOwner, c.GetPlayer, c.GetLocation, c.GetSeq) <> nil;
end;
end;
for i := 1 to 5 do begin
c := FPuzzle.SCard[1, i];
if (c <> nil) then begin
item := TCardListItemCheck.Create(lstCards);
item.CardName:= c.CardName;
item.Id:= c.CardId;
item := TCardCheckItem.Create(lstCards);
item.CardName:= c.GetCardName;
item.CardId:= c.GetCardId;
item.Player:= 1;
item.Card := c;
item.Checked:= PickOneCardFromList(FCurrentCard.ContinousEffectTo, c.CardId, c.Owner, c.Player, c.Location, c.Seq) <> nil;
item.Checked:= PickOneCardFromList(FCurrentCard.GetContinousEffectTo, c.GetCardId, c.GetOwner, c.GetPlayer, c.GetLocation, c.GetSeq) <> nil;
end;
end;
lstCards.EndUpdate;
(*
*)
end;
end.
object FormLogin: TFormLogin
Left = 0
Top = 0
ActiveControl = edtAccount
BorderIcons = [biSystemMenu]
BorderStyle = Single
Caption = 'MC'#29992#25143#30331#24405
ClientHeight = 200
ClientWidth = 400
Padding.Left = 8.000000000000000000
Padding.Top = 8.000000000000000000
Padding.Right = 8.000000000000000000
Padding.Bottom = 8.000000000000000000
Position = MainFormCenter
StyleBook = StyleManager.StyleBook
Constraints.MaxHeight = 200.000000000000000000
Constraints.MaxWidth = 400.000000000000000000
Constraints.MinHeight = 200.000000000000000000
Constraints.MinWidth = 400.000000000000000000
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
DesignerMasterStyle = 0
object TLayout
Align = Bottom
Position.X = 8.000000000000000000
Position.Y = 142.000000000000000000
Size.Width = 384.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
TabStop = False
object btnOK: TCornerButton
Align = MostRight
StyledSettings = [Size]
Margins.Top = 8.000000000000000000
Margins.Bottom = 8.000000000000000000
Position.X = 324.000000000000000000
Position.Y = 8.000000000000000000
Sides = [Top, Left, Bottom, Right]
Size.Width = 60.000000000000000000
Size.Height = 34.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
Text = #30830#23450
TextSettings.Font.Family = 'Microsoft YaHei'
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = claWhite
TextSettings.Trimming = None
XRadius = 3.000000000000000000
YRadius = 3.000000000000000000
OnClick = btnOKClick
end
object btnCancel: TCornerButton
Align = Right
StyledSettings = [Size]
ModalResult = 2
Margins.Top = 8.000000000000000000
Margins.Right = 8.000000000000000000
Margins.Bottom = 8.000000000000000000
Position.X = 256.000000000000000000
Position.Y = 8.000000000000000000
Sides = [Top, Left, Bottom, Right]
Size.Width = 60.000000000000000000
Size.Height = 34.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
Text = #21462#28040
TextSettings.Font.Family = 'Microsoft YaHei'
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = claWhite
TextSettings.Trimming = None
XRadius = 3.000000000000000000
YRadius = 3.000000000000000000
end
end
object TLayout
Align = Top
Margins.Top = 8.000000000000000000
Position.X = 8.000000000000000000
Position.Y = 16.000000000000000000
Size.Width = 384.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
TabStop = False
object TLabel
Align = Left
StyledSettings = []
Size.Width = 80.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Microsoft YaHei'
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = claWhite
Text = #29992#25143#21517
TabStop = False
end
object edtAccount: TEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Client
TabOrder = 0
TextSettings.FontColor = claWhite
Margins.Top = 8.000000000000000000
Margins.Right = 4.000000000000000000
Margins.Bottom = 8.000000000000000000
Size.Width = 300.000000000000000000
Size.Height = 34.000000000000000000
Size.PlatformDefault = False
StyledSettings = [Family, Size, Style]
object ClearEditButton1: TClearEditButton
Touch.InteractiveGestures = [LongTap]
CanFocus = False
Cursor = crArrow
TextSettings.Trimming = None
TabOrder = 0
end
end
end
object TLayout
Align = Top
Position.X = 8.000000000000000000
Position.Y = 66.000000000000000000
Size.Width = 384.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
TabStop = False
object TLabel
Align = Left
StyledSettings = []
Size.Width = 80.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Microsoft YaHei'
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = claWhite
Text = #23494#30721
TabStop = False
end
object edtPassword: TEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Client
TabOrder = 0
Password = True
TextSettings.FontColor = claWhite
Margins.Top = 8.000000000000000000
Margins.Right = 4.000000000000000000
Margins.Bottom = 8.000000000000000000
Size.Width = 300.000000000000000000
Size.Height = 34.000000000000000000
Size.PlatformDefault = False
StyledSettings = [Family, Size, Style]
object PasswordEditButton1: TPasswordEditButton
Touch.InteractiveGestures = [LongTap]
CanFocus = False
Cursor = crArrow
TextSettings.Trimming = None
TabOrder = 0
end
object ClearEditButton2: TClearEditButton
Touch.InteractiveGestures = [LongTap]
CanFocus = False
Cursor = crArrow
TextSettings.Trimming = None
Position.X = 28.000000000000000000
TabOrder = 1
end
end
end
end
unit frmLogin;
{$mode ObjFPC}{$H+}
unit frmLogin;
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, orca_scene2d;
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.Edit;
type
{ TFormLogin }
TFormLogin = class(TForm)
btnOK: TD2CornerButton;
btnCancel: TD2CornerButton;
Label1: TD2Label;
Label2: TD2Label;
Layout1: TD2Layout;
Layout2: TD2Layout;
Layout4: TD2Layout;
Root: TD2Background;
Scene: TD2Scene;
edtAccount: TD2TextBox;
edtPassword: TD2TextBox;
btnOK: TCornerButton;
btnCancel: TCornerButton;
edtAccount: TEdit;
edtPassword: TEdit;
ClearEditButton1: TClearEditButton;
PasswordEditButton1: TPasswordEditButton;
ClearEditButton2: TClearEditButton;
procedure btnOKClick(Sender: TObject);
procedure edtAccountChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FUserAccount: string;
FUserPassword: string;
public
published
property UserAccount: string read FUserAccount write FUserAccount;
property UserPassword: string read FUserPassword write FUserPassword;
......@@ -42,38 +33,22 @@ var
implementation
uses
untConfig;
{$R *.lfm}
frmStyleModule;
{ TFormLogin }
{$R *.fmx}
procedure TFormLogin.edtAccountChange(Sender: TObject);
procedure TFormLogin.btnOKClick(Sender: TObject);
var
acc: string;
pwd: string;
begin
acc := edtAccount.Text;
pwd := edtPassword.Text;
btnOK.Enabled:= (acc <> '') and (pwd <> '');
end;
if (acc = '') or (pwd = '') then Exit;
procedure TFormLogin.FormCreate(Sender: TObject);
var
AScale: Double;
begin
AScale:= TConfigReader.GetScale();
self.Width:= Trunc(500 * AScale);
self.Height:= Trunc(200 * AScale);
Root.Scale.X:= AScale;
Root.Scale.Y:= AScale;
end;
procedure TFormLogin.btnOKClick(Sender: TObject);
begin
FUserAccount:= edtAccount.Text;
FUserPassword:= edtPassword.Text;
FUserAccount:= acc;
FUserPassword:= pwd;
self.ModalResult := mrOk;
end;
end.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
unit frmOverride;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation, FMX.StdCtrls,
FMX.Edit, untCard;
type
TFormOverride = class(TForm)
edtLevelOverride: TEdit;
edtRankOverride: TEdit;
cmbAttrOverride: TComboBox;
cmbRaceOverride: TComboBox;
edtAtkOverride: TEdit;
edtDefOverride: TEdit;
btnOK: TCornerButton;
btnCancel: TCornerButton;
chkUseLevelOverride: TCheckBox;
chkUseRankOverride: TCheckBox;
chkUseAttrOverride: TCheckBox;
chkUseRaceOverride: TCheckBox;
chkUseAtkOverride: TCheckBox;
chkUseDefOverride: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure btnOKClick(Sender: TObject);
private
FOverrideCard: ICard;
FOverrideInfo: ICardOverride;
procedure SetOverrideCard(const Value: ICard);
public
published
property OverrideCard: ICard read FOverrideCard write SetOverrideCard;
property OverrideInfo: ICardOverride read FOverrideInfo;
end;
var
FormOverride: TFormOverride;
implementation
uses
untAttrRace, untTextItem, frmStyleModule;
{$R *.fmx}
{ TFormOverride }
procedure TFormOverride.btnOKClick(Sender: TObject);
begin
FOverrideInfo := TCardOverride.Create;
FOverrideInfo.SetUseLevel(chkUseLevelOverride.IsChecked);
FOverrideInfo.SetUseRank(chkUseRankOverride.IsChecked);
FOverrideInfo.SetUseAttr(chkUseAttrOverride.IsChecked);
FOverrideInfo.SetUseRace(chkUseRaceOverride.IsChecked);
FOverrideInfo.SetUseAtk(chkUseAtkOverride.IsChecked);
FOverrideInfo.SetUseDef(chkUseDefOverride.IsChecked);
FOverrideInfo.SetLevel(StrToIntDef(edtLevelOverride.Text, 0));
FOverrideInfo.SetRank(StrToIntDef(edtRankOverride.Text, 0));
if cmbAttrOverride.ItemIndex = 0 then begin
FOverrideInfo.SetAttr(0);
end else begin
FOverrideInfo.SetAttr(TTextItem(cmbAttrOverride.ListItems[cmbAttrOverride.ItemIndex]).OptionId);
end;
if cmbRaceOverride.ItemIndex = 0 then begin
FOverrideInfo.SetRace(0);
end else begin
FOverrideInfo.SetRace(TTextItem(cmbRaceOverride.ListItems[cmbRaceOverride.ItemIndex]).OptionId);
end;
FOverrideInfo.SetAtk(StrToIntDef(edtAtkOverride.Text, 0));
FOverrideInfo.SetDef(StrToIntDef(edtDefOverride.Text, 0));
end;
procedure TFormOverride.FormCreate(Sender: TObject);
var
i: Integer;
arr: TArray<TTriple<Int64, String, String>>;
item: TTriple<Int64, String, String>;
begin
cmbAttrOverride.Clear;
cmbRaceOverride.Clear;
cmbAttrOverride.AddObject(TTextItem.Create(cmbAttrOverride, '无', 0));
cmbRaceOverride.AddObject(TTextItem.Create(cmbRaceOverride, '无', 0));
arr := TYGOValueList.GetAttrList;
for i := 0 to Length(arr) - 1 do begin
item := arr[i];
cmbAttrOverride.AddObject(TTextItem.Create(cmbAttrOverride, item.Third, item.First));
end;
arr := TYGOValueList.GetRaceList;
for i := 0 to Length(arr) - 1 do begin
item := arr[i];
cmbRaceOverride.AddObject(TTextItem.Create(cmbRaceOverride, item.Third + '族', item.First));
end;
cmbAttrOverride.ItemIndex := 0;
cmbRaceOverride.ItemIndex := 0;
end;
procedure TFormOverride.SetOverrideCard(const Value: ICard);
var
item: TTextItem;
i: Integer;
begin
FOverrideCard := Value;
// value input
chkUseLevelOverride.IsChecked := FOverrideCard.GetOverride.GetUseLevel;
chkUseRankOverride.IsChecked := FOverrideCard.GetOverride.GetUseRank;
chkUseAttrOverride.IsChecked := FOverrideCard.GetOverride.GetUseAttr;
chkUseRaceOverride.IsChecked := FOverrideCard.GetOverride.GetUseRace;
chkUseAtkOverride.IsChecked := FOverrideCard.GetOverride.GetUseAtk;
chkUseDefOverride.IsChecked := FOverrideCard.GetOverride.GetUseDef;
edtLevelOverride.Text := IntToStr(FOverrideCard.GetOverride.GetLevel);
edtRankOverride.Text := IntToStr(FOverrideCard.GetOverride.GetRank);
edtAtkOverride.Text := IntToStr(FOverrideCard.GetOverride.GetAtk);
edtDefOverride.Text := IntToStr(FOverrideCard.GetOverride.GetDef);
if FOverrideCard.GetOverride.GetAttr = 0 then begin
cmbAttrOverride.ItemIndex := 0;
end else begin
for i := 0 to cmbAttrOverride.Count - 1 do begin
item := TTextItem(cmbAttrOverride.ListItems[i]);
if item.OptionId = FOverrideCard.GetOverride.GetAttr then begin
cmbAttrOverride.ItemIndex := i;
Break;
end;
end;
end;
if FOverrideCard.GetOverride.GetRace = 0 then begin
cmbRaceOverride.ItemIndex := 0;
end else begin
for i := 0 to cmbRaceOverride.Count - 1 do begin
item := TTextItem(cmbRaceOverride.ListItems[i]);
if item.OptionId = FOverrideCard.GetOverride.GetRace then begin
cmbRaceOverride.ItemIndex := i;
Break;
end;
end;
end;
// enabled
chkUseLevelOverride.Enabled := (not FOverrideCard.GetIsXyzMonster) and (not FOverrideCard.GetIsLinkMonster);
edtLevelOverride.Enabled := chkUseLevelOverride.Enabled;
chkUseRankOverride.Enabled := FOverrideCard.GetIsXyzMonster;
edtRankOverride.Enabled := chkUseRankOverride.Enabled;
end;
end.
This diff is collapsed.
unit frmPuzzleConfig;
{$mode ObjFPC}{$H+}
unit frmPuzzleConfig;
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, orca_scene2d;
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.Edit,
FMX.Memo.Types, FMX.ScrollBox, FMX.Memo;
type
{ TFormPuzzleConfig }
TFormPuzzleConfig = class(TForm)
CornerButton1: TD2CornerButton;
CornerButton2: TD2CornerButton;
D2Resources1: TD2Resources;
Label1: TD2Label;
Label2: TD2Label;
Label3: TD2Label;
Label4: TD2Label;
Label5: TD2Label;
Label6: TD2Label;
Layout1: TD2Layout;
Layout2: TD2Layout;
Layout3: TD2Layout;
Layout4: TD2Layout;
Layout5: TD2Layout;
edtSelfLP: TD2NumberBox;
edtOpponentLP: TD2NumberBox;
Layout6: TD2Layout;
Layout7: TD2Layout;
mmMessage: TD2Memo;
mmSolution: TD2Memo;
Root: TD2Background;
Scene: TD2Scene;
edtAIName: TD2TextBox;
edtPuzzleName: TD2TextBox;
procedure FormCreate(Sender: TObject);
btnOK: TCornerButton;
btnCancel: TCornerButton;
edtPuzzleName: TEdit;
edtAIName: TEdit;
edtOpponentLife: TEdit;
edtSelfLife: TEdit;
mmMessage: TMemo;
mmSolution: TMemo;
ClearEditButton1: TClearEditButton;
ClearEditButton2: TClearEditButton;
private
function GetAIName: string;
function GetP0LP: Integer;
......@@ -50,7 +33,6 @@ type
procedure SetPMessage(AValue: string);
procedure SetPPuzzleName(AValue: string);
procedure SetPSolution(AValue: string);
public
published
......@@ -68,23 +50,12 @@ var
implementation
uses
untConfig;
frmStyleModule;
{$R *.lfm}
{$R *.fmx}
{ TFormPuzzleConfig }
procedure TFormPuzzleConfig.FormCreate(Sender: TObject);
var
AScale: Double;
begin
AScale:= TConfigReader.GetScale();
self.Width:= Trunc(600 * AScale);
self.Height:= Trunc(800 * AScale);
Root.Scale.X:= AScale;
Root.Scale.Y:= AScale;
end;
function TFormPuzzleConfig.GetAIName: string;
begin
Exit(edtAIName.Text);
......@@ -92,12 +63,12 @@ end;
function TFormPuzzleConfig.GetP0LP: Integer;
begin
Exit(Trunc(edtSelfLP.Value));
Exit(StrToInt(edtSelfLife.Text));
end;
function TFormPuzzleConfig.GetP1LP: Integer;
begin
Exit(Trunc(edtOpponentLP.Value));
Exit(StrToInt(edtOpponentLife.Text));
end;
function TFormPuzzleConfig.GetPMessage: string;
......@@ -122,12 +93,12 @@ end;
procedure TFormPuzzleConfig.SetP0LP(AValue: Integer);
begin
edtSelfLP.Value:= AValue;
edtSelfLife.Text := IntToStr(AValue);
end;
procedure TFormPuzzleConfig.SetP1LP(AValue: Integer);
begin
edtOpponentLP.Value:= AValue;
edtOpponentLife.Text := IntToStr(AValue);
end;
procedure TFormPuzzleConfig.SetPMessage(AValue: string);
......@@ -146,4 +117,3 @@ begin
end;
end.
This diff is collapsed.
unit frmSearchCard;
{$mode Delphi}{$H+}
unit frmSearchCard;
interface
uses
Windows, Classes, SysUtils, Forms, Controls, Graphics, Dialogs, orca_scene2d, untData, untCard, fgl;
Windows, System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Layouts, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Edit,
FMX.ListBox, FMX.Objects, FMX.Effects;
type
{ TFormSearchCard }
TFormSearchCard = class(TForm)
btnSearchCard: TD2CornerButton;
btnCancel: TD2CornerButton;
btnOK: TD2CornerButton;
CircleButton1: TD2CircleButton;
D2Resources1: TD2Resources;
Label1: TD2Label;
Layout1: TD2Layout;
Layout2: TD2Layout;
layHistory: TD2Layout;
Layout3: TD2Layout;
Layout4: TD2Layout;
Layout5: TD2Layout;
lstCards: TD2ListBox;
Root: TD2Background;
Scene: TD2Scene;
edtCardName: TD2TextBoxClearBtn;
txtHistory1: TD2Text;
txtHistory4: TD2Text;
txtHistory3: TD2Text;
txtHistory2: TD2Text;
txtHistory5: TD2Text;
txtHistory9: TD2Text;
txtHistory8: TD2Text;
txtHistory7: TD2Text;
txtHistory6: TD2Text;
txtHistory0: TD2Text;
procedure btnOKClick(Sender: TObject);
procedure btnSearchCardClick(Sender: TObject);
procedure CircleButton1Click(Sender: TObject);
procedure edtCardNameKeyUp(Sender: TObject; var Key: Word;
var KeyChar: System.Widechar; Shift: TShiftState);
layMain: TLayout;
edtCardName: TEdit;
btnOK: TCornerButton;
btnCancel: TCornerButton;
lstCards: TListBox;
btnCleanHistory: TCornerButton;
txtHistory0: TText;
txtHistory4: TText;
txtHistory3: TText;
txtHistory2: TText;
txtHistory1: TText;
txtHistory5: TText;
txtHistory9: TText;
txtHistory8: TText;
txtHistory7: TText;
txtHistory6: TText;
btnSearch: TSearchEditButton;
procedure btnCleanHistoryClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure lstCardsClick(Sender: TObject);
procedure btnSearchClick(Sender: TObject);
procedure edtCardNameKeyUp(Sender: TObject; var Key: Word;
var KeyChar: WideChar; Shift: TShiftState);
procedure lstCardsDblClick(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure txtHistory0Click(Sender: TObject);
private
FCardId: Int64;
FHistory: array[0..9] of TD2Text;
FHistory: array[0..9] of TText;
procedure SearchCard(Keyword: string);
procedure SaveHistory(ALast: string);
public
......@@ -64,52 +52,60 @@ var
implementation
uses
untListItem, untConfig;
moduleData, untConfig, untSearchCardItem, untCard, untArrayHelper, frmStyleModule;
{$R *.lfm}
{$R *.fmx}
{ TFormSearchCard }
procedure TFormSearchCard.btnSearchCardClick(Sender: TObject);
var
keyword: string;
begin
keyword:= edtCardName.Text;
SearchCard(keyword);
end;
procedure TFormSearchCard.CircleButton1Click(Sender: TObject);
procedure TFormSearchCard.btnCleanHistoryClick(Sender: TObject);
var
i: Integer;
Arr: TStringArray;
Arr: TArray<String>;
begin
Arr := TConfigReader.GetSearchHistory();
// clean history
Arr := TConfig.GetSearchHistory();
for i:= 0 to 9 do begin
Arr[i] := '';
FHistory[i].Text:= '';
end;
TConfigReader.SetSearchHistory(Arr);
TConfig.SetSearchHistory(Arr);
end;
procedure TFormSearchCard.btnOKClick(Sender: TObject);
var
item: TSearchCardListItem;
begin
if lstCards.ItemIndex = -1 then Exit;
item := TSearchCardListItem(lstCards.ListItems[lstCards.ItemIndex]);
if (not item.Ready) then Exit;
FCardId := item.CardId;
self.ModalResult:= mrOK;
end;
procedure TFormSearchCard.btnSearchClick(Sender: TObject);
var
keyword: string;
begin
keyword:= edtCardName.Text;
SearchCard(keyword);
end;
procedure TFormSearchCard.edtCardNameKeyUp(Sender: TObject; var Key: Word;
var KeyChar: System.Widechar; Shift: TShiftState);
var KeyChar: WideChar; Shift: TShiftState);
begin
if (Key = VK_RETURN) then begin
btnSearchCardClick(btnSearchCard);
btnSearchClick(btnSearch);
end;
end;
procedure TFormSearchCard.FormCreate(Sender: TObject);
var
AScale: Double;
Arr: TStringArray;
Arr: TArray<String>;
i: Integer;
begin
AScale:= TConfigReader.GetScale();
self.Width:= Trunc(600 * AScale);
self.Height:= Trunc(800 * AScale);
Root.Scale.X:= AScale;
Root.Scale.Y:= AScale;
FHistory[0] := txtHistory0;
FHistory[1] := txtHistory1;
......@@ -122,17 +118,12 @@ begin
FHistory[8] := txtHistory8;
FHistory[9] := txtHistory9;
Arr := TConfigReader.GetSearchHistory();
Arr := TConfig.GetSearchHistory;
for i:= 0 to 9 do begin
FHistory[i].Text:= Arr[i];
end;
end;
procedure TFormSearchCard.lstCardsClick(Sender: TObject);
begin
btnOK.Enabled:= lstCards.ItemIndex > -1;
end;
procedure TFormSearchCard.lstCardsDblClick(Sender: TObject);
var
idx: Integer;
......@@ -143,64 +134,55 @@ begin
end;
end;
procedure TFormSearchCard.txtHistory0Click(Sender: TObject);
procedure TFormSearchCard.SaveHistory(ALast: string);
var
keyword: string;
Arr: TArray<String>;
i: Integer;
begin
keyword:= TD2Text(Sender).Text;
SearchCard(keyword);
Arr := TConfig.GetSearchHistory;
for i := 0 to 9 do begin
if Arr[i] = ALast then Exit;
end;
for i := 9 downto 1 do begin
Arr[i] := Arr[i - 1];
FHistory[i].Text:= Arr[i];
end;
Arr[0] := ALast;
FHistory[0].Text:= Arr[0];
TConfig.SetSearchHistory(Arr);
end;
procedure TFormSearchCard.SearchCard(Keyword: string);
var
list: TFPGList<TCard>;
list: TArray<ICard>;
i: Integer;
item: TCardListItem;
item: TSearchCardListItem;
begin
if (keyword = '') then Exit;
list := Cards.SearchCards(keyword);
lstCards.Enabled := False;
list := DMData.SearchCards(Keyword);
lstCards.Clear;
lstCards.BeginUpdate;
for i := 0 to list.Count - 1 do begin
item := TCardListItem.Create(lstCards);
item.CardName:= list[i].CardName;
item.Id:= list[i].CardId;
item := TSearchCardListItem.Create(lstCards);
item.CardName := list[i].GetCardName;
item.CardId := list[i].GetCardId;
end;
lstCards.EndUpdate;
FreeCards(list);
btnOK.Enabled:= False;
// deselect all
lstCards.ItemIndex:= -1;
lstCards.ItemIndex := -1;
// save history
SaveHistory(keyword);
SaveHistory(Keyword);
lstCards.Enabled := True;
end;
procedure TFormSearchCard.SaveHistory(ALast: string);
procedure TFormSearchCard.txtHistory0Click(Sender: TObject);
var
Arr: TStringArray;
i: Integer;
begin
Arr := TConfigReader.GetSearchHistory();
for i := 0 to 9 do begin
if Arr[i] = ALast then begin
Exit;
end;
end;
for i := 9 downto 1 do begin
Arr[i] := Arr[i - 1];
FHistory[i].Text:= Arr[i];
end;
Arr[0] := ALast;
FHistory[0].Text:= Arr[0];
TConfigReader.SetSearchHistory(Arr);
end;
procedure TFormSearchCard.btnOKClick(Sender: TObject);
keyword: string;
begin
FCardId := TCardListItem(lstCards.Items[lstCards.ItemIndex]).Id;
self.ModalResult:= mrOK;
keyword:= TText(Sender).Text;
SearchCard(keyword);
end;
end.
This diff is collapsed.
unit frmStyleModule;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs;
type
TStyleManager = class(TForm)
StyleBook: TStyleBook;
private
public
end;
var
StyleManager: TStyleManager;
implementation
{$R *.fmx}
initialization
// 在这里初始化,不进 Application 的生命周期
StyleManager:= TStyleManager.Create(nil);
finalization
StyleManager.Free;
end.
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
<Title Value="PuzzleEditor"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
<Icon Value="0"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages>
<Item>
<PackageName Value="pl_orca"/>
</Item>
<Item>
<PackageName Value="FCL"/>
</Item>
<Item>
<PackageName Value="SQLDBLaz"/>
</Item>
<Item>
<PackageName Value="LCL"/>
</Item>
</RequiredPackages>
<Units>
<Unit>
<Filename Value="PuzzleEditor.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="untdata.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="untData"/>
</Unit>
<Unit>
<Filename Value="frmhome.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FormHome"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="frmHome"/>
</Unit>
<Unit>
<Filename Value="untconstant.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="untConstant"/>
</Unit>
<Unit>
<Filename Value="untcard.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="untCard"/>
</Unit>
<Unit>
<Filename Value="untutils.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="untUtils"/>
</Unit>
<Unit>
<Filename Value="frmsearchcard.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FormSearchCard"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="frmSearchCard"/>
</Unit>
<Unit>
<Filename Value="untlistitem.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="untListItem"/>
</Unit>
<Unit>
<Filename Value="iscbase\ISCHttp.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="iscbase\ISCJSON.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="iscbase\ISCThread.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="iscbase\untimagedownloader.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="untImageDownloader"/>
</Unit>
<Unit>
<Filename Value="frmcardlist.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FormCardList"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="frmCardList"/>
</Unit>
<Unit>
<Filename Value="untcardjson.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="untCardJson"/>
</Unit>
<Unit>
<Filename Value="frmcontinouseffected.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FormContinousEffected"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="frmContinousEffected"/>
</Unit>
<Unit>
<Filename Value="frmpuzzleconfig.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FormPuzzleConfig"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="frmPuzzleConfig"/>
</Unit>
<Unit>
<Filename Value="untscriptgenerator.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="untScriptGenerator"/>
</Unit>
<Unit>
<Filename Value="frmabout.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FormAbout"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="frmAbout"/>
</Unit>
<Unit>
<Filename Value="untapi.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="untAPI"/>
</Unit>
<Unit>
<Filename Value="untconfig.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="untConfig"/>
</Unit>
<Unit>
<Filename Value="frmlogin.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="FormLogin"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="frmLogin"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="PuzzleEditor"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="iscbase"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
<Item>
<Name Value="EFileNotFoundException"/>
</Item>
<Item>
<Name Value="ESSLSocketError"/>
</Item>
<Item>
<Name Value="EInOutError"/>
</Item>
<Item>
<Name Value="RunError(5)"/>
</Item>
<Item>
<Name Value="RunError(103)"/>
</Item>
<Item>
<Name Value="ESocketError"/>
</Item>
<Item>
<Name Value="EHTTPClient"/>
</Item>
<Item>
<Name Value="EAccessViolation"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>
This diff is collapsed.
# 残局编辑器
## 使用方法
```PuzzleEditor.exe``` 放置到 MDPro3 的根目录下,双击即可打开。
## 功能清单
1. [x] 决斗场地
2. [x] 向卡片区域添加卡片
3. [x] 按名字模糊搜索卡片
4. [x] 向卡片列表区域添加卡片
5. [x] 为卡片设置属性
6. [x] 为超量怪兽设置超量素材
7. [x] 设置在列表中的卡片属性
8. [x] 为连接怪兽的特殊处理
9. [x] 为灵摆怪兽的特殊处理
10. [x] 卡片装备到另一张卡片
11. [x] 卡片的永续效果影响其他卡片
12. [x] 卡片变更控制权
13. [x] 变更卡片的类型(如百夫长在后场视为永续陷阱)
14. [x] 保存和读取残局设置
15. [x] 导出为残局脚本(lua脚本)
## 软件截图
![](screenshot/p1.png)
![](screenshot/pro3.png)
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<Makefile Value="2"/>
<Params Value="-Fu.;source;source/FX11;source/Math;source/Classes;../../../packager/units/$(CPU_TARGET)-$(OS_TARGET) -Fisource;source/FX11;source/Math;source/Classes -MObjFPC -Scghi -O1 -gw2 -godwarfsets -gl -l -vewnhibq pl_win_directx12.pas"/>
</CONFIG>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment