Commit 8625dfa5 authored by rarnu's avatar rarnu

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

parent c1825019
.idea/ .idea/
.vscode/ .vscode/
.fleet/ .fleet/
.kotlin/
*.o *.o
*.ppu *.ppu
*.dcu
*.rsm
### Mac OS ### ### Mac OS ###
.DS_Store .DS_Store
...@@ -21,4 +26,10 @@ Thumbs.db ...@@ -21,4 +26,10 @@ Thumbs.db
lib/ lib/
cardimg/*.jpg 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; unit untConstant;
{$mode ObjFPC}{$H+}
interface interface
uses
Classes, SysUtils;
const const
OWNER_SELF = '自己的'; OWNER_SELF = '自己的';
...@@ -14,10 +9,10 @@ const ...@@ -14,10 +9,10 @@ const
OWNER_SHARE = '共享的'; OWNER_SHARE = '共享的';
OWNER_NONE = '无'; OWNER_NONE = '无';
COLOR_SELF = '#FF63B8FF'; COLOR_SELF = $FF63B8FF;
COLOR_OPPONENT = '#FFFF6347'; COLOR_OPPONENT = $FFFF6347;
COLOR_SHARE = '#FFFFFF00'; COLOR_SHARE = $FFFFFF00;
COLOR_NONE = '#FFFFFFFF'; COLOR_NONE = $FFFFFFFF;
LOC_MZONE = '怪兽区(%d)'; LOC_MZONE = '怪兽区(%d)';
LOC_SZONE = '魔陷区(%d)'; LOC_SZONE = '魔陷区(%d)';
...@@ -30,9 +25,6 @@ const ...@@ -30,9 +25,6 @@ const
LOC_GRAVE = '墓地'; LOC_GRAVE = '墓地';
LOC_REMOVED = '除外区'; LOC_REMOVED = '除外区';
AS_SPELL = '';
implementation implementation
end. 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; unit frmCardList;
{$mode Delphi}{$H+}
interface interface
uses 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 type
{ TFormCardList }
TFormCardList = class(TForm) TFormCardList = class(TForm)
btnOK: TD2CornerButton; btnOK: TCornerButton;
btnCancel: TD2CornerButton; btnCancel: TCornerButton;
btnAddCard: TD2CornerButton; btnAddCard: TCornerButton;
D2Resources1: TD2Resources; lstCards: TListBox;
Layout1: TD2Layout;
lstCards: TD2ListBox;
Root: TD2Background;
Scene: TD2Scene;
procedure btnAddCardClick(Sender: TObject); procedure btnAddCardClick(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject); procedure FormDestroy(Sender: TObject);
private private
FCardList: TFPGList<Int64>; FCardList: TArray<Int64>;
procedure addOneCardItem(ACard: TCard); procedure addOneCardItem(ACard: ICard);
procedure deleteCardItem(ACardId: Int64; AIndex: Integer); procedure deleteCardItem(ACardId: Int64; AIndex: Integer);
public public
procedure FillCardIds(list: TFPGList<Int64>); procedure FillCardIds(list: TArray<Int64>);
published published
property CardList: TFPGList<Int64> read FCardList; property CardList: TArray<Int64> read FCardList;
end; end;
var var
...@@ -38,32 +31,51 @@ var ...@@ -38,32 +31,51 @@ var
implementation 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); procedure TFormCardList.btnAddCardClick(Sender: TObject);
var var
cid: Int64 = 0; cid: Int64;
c: TCard; c: ICard;
item: TCardListItemOp; item: TCardOperItem;
begin begin
cid := 0;
with TFormSearchCard.Create(Self) do begin with TFormSearchCard.Create(Self) do begin
if ShowModal = mrOK then begin if ShowModal = mrOk then begin
cid := CardId; cid := CardId;
end; end;
Free; Free;
end; end;
if cid > 0 then begin if cid > 0 then begin
FCardList.Add(cid); FCardList.Add(cid);
c := Cards.GetCardInfo(cid); c := DMData.GetCardInfo(cid);
lstCards.BeginUpdate; lstCards.BeginUpdate;
item := TCardListItemOp.Create(lstCards); item := TCardOperItem.Create(lstCards);
item.CardName:= c.CardName; item.CardName:= c.GetCardName;
item.Id:= cid; item.CardId:= cid;
item.SetCardForFree(c, True); item.Card := c;
item.ShowFace := False; item.ShowFace := False;
item.Index:= lstCards.Count - 1; item.Index:= lstCards.Count - 1;
item.OnDelete:= deleteCardItem; item.OnDelete:= deleteCardItem;
...@@ -72,36 +84,18 @@ begin ...@@ -72,36 +84,18 @@ begin
end; end;
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); procedure TFormCardList.deleteCardItem(ACardId: Int64; AIndex: Integer);
var var
cid: Int64; cid: Int64;
i, j: Integer; i, j: Integer;
item: TCardListItemOp; item: TCardOperItem;
begin begin
// index matches
for i:= 0 to FCardList.Count - 1 do begin for i:= 0 to FCardList.Count - 1 do begin
cid := FCardList[i]; cid := FCardList[i];
if cid = ACardId then begin if cid = ACardId then begin
for j := 0 to lstCards.Count - 1 do begin for j := 0 to lstCards.Count - 1 do begin
item := TCardListItemOp(lstCards.Items[j]); item := TCardOperItem(lstCards.ListItems[j]);
if (item.Id = ACardId) and (item.Index = AIndex) then begin if (item.CardId = ACardId) and (item.Index = AIndex) then begin
FCardList.Delete(i); FCardList.Delete(i);
item.Free; item.Free;
Break; Break;
...@@ -112,49 +106,35 @@ begin ...@@ -112,49 +106,35 @@ begin
end; end;
for i := 0 to lstCards.Count - 1 do begin for i := 0 to lstCards.Count - 1 do begin
item := TCardListItemOp(lstCards.Items[i]); item := TCardOperItem(lstCards.ListItems[i]);
item.Index:= i; item.Index:= i;
end; 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; end;
procedure TFormCardList.FillCardIds(list: TFPGList<Int64>); procedure TFormCardList.FillCardIds(list: TArray<Int64>);
var var
i: Integer; i: Integer;
item: TCardListItemOp; item: TCardOperItem;
cn: string; c: ICard;
c: TCard;
begin begin
FCardList.Clear; SetLength(FCardList, 0);
FCardList.AddList(list); SetLength(FCardList, list.Count);
for i := 0 to list.Count - 1 do begin
FCardList[i] := list[i];
end;
lstCards.Clear; lstCards.Clear;
if (list.Count > 0) then begin if (list.Count > 0) then begin
lstCards.BeginUpdate; lstCards.BeginUpdate;
for i:= 0 to FCardList.Count - 1 do begin for i:= 0 to FCardList.Count - 1 do begin
c := Cards.GetCardInfo(FCardList[i]); c := DMData.GetCardInfo(FCardList[i]);
item := TCardListItemOp.Create(lstCards); item := TCardOperItem.Create(lstCards);
item.CardName:= c.CardName; item.CardName:= c.GetCardName;
item.Id:= FCardList[i]; item.CardId:= FCardList[i];
item.ShowFace := False; item.ShowFace := False;
item.SetCardForFree(c, True); item.Card := c;
item.Index:= i; item.Index:= i;
item.OnDelete:= deleteCardItem; item.OnDelete:= deleteCardItem;
item.OnCardAddOneClicked:= addOneCardItem; item.OnCardAddOneClicked:= addOneCardItem;
...@@ -163,5 +143,14 @@ begin ...@@ -163,5 +143,14 @@ begin
end; end;
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; unit frmContinousEffected;
{$mode Delphi}{$H+}
interface interface
uses 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 type
{ TFormContinousEffected }
TFormContinousEffected = class(TForm) TFormContinousEffected = class(TForm)
CornerButton1: TD2CornerButton; btnOK: TCornerButton;
CornerButton2: TD2CornerButton; btnCancel: TCornerButton;
D2Resources1: TD2Resources; lstCards: TListBox;
Layout1: TD2Layout; procedure btnOKClick(Sender: TObject);
lstCards: TD2ListBox;
Root: TD2Background;
Scene: TD2Scene;
procedure CornerButton1Click(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject); procedure FormDestroy(Sender: TObject);
private private
FCESelectedCards: TFPGList<TCard>; FCESelectedCards: TArray<ICard>;
FCurrentCard: TCard; FCurrentCard: ICard;
FPuzzle: TPuzzleField; FPuzzle: TPuzzleField;
public public
procedure RefreshList(); procedure RefreshList();
published published
// managed by FormHome // managed by FormHome
property CEPuzzle: TPuzzleField read FPuzzle write FPuzzle; property CEPuzzle: TPuzzleField read FPuzzle write FPuzzle;
property CECurrentCard: TCard read FCurrentCard write FCurrentCard; property CECurrentCard: ICard read FCurrentCard write FCurrentCard;
property CESelectedCards: TFPGList<TCard> read FCESelectedCards; property CESelectedCards: TArray<ICard> read FCESelectedCards;
end; end;
var var
...@@ -43,49 +34,40 @@ var ...@@ -43,49 +34,40 @@ var
implementation implementation
uses uses
untUtils, untConfig; untCardCheckItem, untArrayHelper, untUtils, frmStyleModule;
{$R *.lfm}
{ TFormContinousEffected } {$R *.fmx}
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;
procedure TFormContinousEffected.CornerButton1Click(Sender: TObject); procedure TFormContinousEffected.btnOKClick(Sender: TObject);
var var
i: Integer; i: Integer;
item: TCardListItemCheck; item: TCardCheckItem;
begin begin
FCESelectedCards.Clear; SetLength(FCESelectedCards, 0);
for i := 0 to lstCards.Count - 1 do begin for i := 0 to lstCards.Count - 1 do begin
item := TCardListItemCheck(lstCards.Items[i]); item := TCardCheckItem(lstCards.ListItems[i]);
if (item.Checked) then begin if (item.Checked) then begin
FCESelectedCards.Add(item.Card); FCESelectedCards.Add(item.Card);
end; end;
end; end;
end; end;
procedure TFormContinousEffected.FormCreate(Sender: TObject);
begin
SetLength(FCESelectedCards, 0);
end;
procedure TFormContinousEffected.FormDestroy(Sender: TObject); procedure TFormContinousEffected.FormDestroy(Sender: TObject);
begin begin
FCESelectedCards.Free; SetLength(FCESelectedCards, 0);
// FreeCards(FCESelectedCards);
end; end;
procedure TFormContinousEffected.RefreshList(); procedure TFormContinousEffected.RefreshList;
var var
i: Integer; i: Integer;
c: TCard; c: ICard;
item: TCardListItemCheck; item: TCardCheckItem;
begin begin
if FPuzzle = nil then Exit; if FPuzzle = nil then Exit;
if FCurrentCard = nil then Exit; if FCurrentCard = nil then Exit;
...@@ -96,64 +78,69 @@ begin ...@@ -96,64 +78,69 @@ begin
for i:= 0 to 4 do begin for i:= 0 to 4 do begin
c := FPuzzle.MCard[0, i]; c := FPuzzle.MCard[0, i];
if (c <> nil) then begin if (c <> nil) then begin
item := TCardListItemCheck.Create(lstCards); item := TCardCheckItem.Create(lstCards);
item.CardName:= c.CardName; item.CardName:= c.GetCardName;
item.Id:= c.CardId; item.CardId:= c.GetCardId;
item.Player:= 0; item.Player:= 0;
item.Card := c; 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;
end; end;
for i:= 0 to 5 do begin for i:= 0 to 5 do begin
c := FPuzzle.SCard[0, i]; c := FPuzzle.SCard[0, i];
if (c <> nil) then begin if (c <> nil) then begin
item := TCardListItemCheck.Create(lstCards); item := TCardCheckItem.Create(lstCards);
item.CardName:= c.CardName; item.CardName:= c.GetCardName;
item.Id:= c.CardId; item.CardId:= c.GetCardId;
item.Player:= 0; item.Player:= 0;
item.Card := c; 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;
end; end;
for i := 5 to 6 do begin for i := 5 to 6 do begin
c := FPuzzle.ExtraMonster[i]; c := FPuzzle.ExtraMonster[i];
if (c <> nil) then begin if (c <> nil) then begin
item := TCardListItemCheck.Create(lstCards); item := TCardCheckItem.Create(lstCards);
item.CardName:= c.CardName; item.CardName:= c.GetCardName;
item.Id:= c.CardId; item.CArdId:= c.GetCardId;
item.Player:= IfThen<Integer>(c.Owner = coSelf, 0, 1); item.Player:= EXT.IfThen<Integer>(c.GetOwner = coSelf, 0, 1);
item.Card := c; 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;
end; end;
for i := 1 to 4 do begin for i := 1 to 4 do begin
c := FPuzzle.MCard[1, i]; c := FPuzzle.MCard[1, i];
if (c <> nil) then begin if (c <> nil) then begin
item := TCardListItemCheck.Create(lstCards); item := TCardCheckItem.Create(lstCards);
item.CardName:= c.CardName; item.CardName:= c.GetCardName;
item.Id:= c.CardId; item.CardId:= c.GetCardId;
item.Player:= 1; item.Player:= 1;
item.Card := c; 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;
end; end;
for i := 1 to 5 do begin for i := 1 to 5 do begin
c := FPuzzle.SCard[1, i]; c := FPuzzle.SCard[1, i];
if (c <> nil) then begin if (c <> nil) then begin
item := TCardListItemCheck.Create(lstCards); item := TCardCheckItem.Create(lstCards);
item.CardName:= c.CardName; item.CardName:= c.GetCardName;
item.Id:= c.CardId; item.CardId:= c.GetCardId;
item.Player:= 1; item.Player:= 1;
item.Card := c; 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;
end; end;
lstCards.EndUpdate; lstCards.EndUpdate;
(*
*)
end; end;
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; unit frmLogin;
{$mode ObjFPC}{$H+}
interface interface
uses 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 type
{ TFormLogin }
TFormLogin = class(TForm) TFormLogin = class(TForm)
btnOK: TD2CornerButton; btnOK: TCornerButton;
btnCancel: TD2CornerButton; btnCancel: TCornerButton;
Label1: TD2Label; edtAccount: TEdit;
Label2: TD2Label; edtPassword: TEdit;
Layout1: TD2Layout; ClearEditButton1: TClearEditButton;
Layout2: TD2Layout; PasswordEditButton1: TPasswordEditButton;
Layout4: TD2Layout; ClearEditButton2: TClearEditButton;
Root: TD2Background;
Scene: TD2Scene;
edtAccount: TD2TextBox;
edtPassword: TD2TextBox;
procedure btnOKClick(Sender: TObject); procedure btnOKClick(Sender: TObject);
procedure edtAccountChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
private private
FUserAccount: string; FUserAccount: string;
FUserPassword: string; FUserPassword: string;
public public
published published
property UserAccount: string read FUserAccount write FUserAccount; property UserAccount: string read FUserAccount write FUserAccount;
property UserPassword: string read FUserPassword write FUserPassword; property UserPassword: string read FUserPassword write FUserPassword;
...@@ -42,38 +33,22 @@ var ...@@ -42,38 +33,22 @@ var
implementation implementation
uses uses
untConfig; frmStyleModule;
{$R *.lfm}
{ TFormLogin } {$R *.fmx}
procedure TFormLogin.edtAccountChange(Sender: TObject); procedure TFormLogin.btnOKClick(Sender: TObject);
var var
acc: string; acc: string;
pwd: string; pwd: string;
begin begin
acc := edtAccount.Text; acc := edtAccount.Text;
pwd := edtPassword.Text; pwd := edtPassword.Text;
btnOK.Enabled:= (acc <> '') and (pwd <> ''); if (acc = '') or (pwd = '') then Exit;
end;
procedure TFormLogin.FormCreate(Sender: TObject); FUserAccount:= acc;
var FUserPassword:= pwd;
AScale: Double; self.ModalResult := mrOk;
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;
end; end;
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; unit frmPuzzleConfig;
{$mode ObjFPC}{$H+}
interface interface
uses 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 type
{ TFormPuzzleConfig }
TFormPuzzleConfig = class(TForm) TFormPuzzleConfig = class(TForm)
CornerButton1: TD2CornerButton; btnOK: TCornerButton;
CornerButton2: TD2CornerButton; btnCancel: TCornerButton;
D2Resources1: TD2Resources; edtPuzzleName: TEdit;
Label1: TD2Label; edtAIName: TEdit;
Label2: TD2Label; edtOpponentLife: TEdit;
Label3: TD2Label; edtSelfLife: TEdit;
Label4: TD2Label; mmMessage: TMemo;
Label5: TD2Label; mmSolution: TMemo;
Label6: TD2Label; ClearEditButton1: TClearEditButton;
Layout1: TD2Layout; ClearEditButton2: TClearEditButton;
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);
private private
function GetAIName: string; function GetAIName: string;
function GetP0LP: Integer; function GetP0LP: Integer;
...@@ -50,7 +33,6 @@ type ...@@ -50,7 +33,6 @@ type
procedure SetPMessage(AValue: string); procedure SetPMessage(AValue: string);
procedure SetPPuzzleName(AValue: string); procedure SetPPuzzleName(AValue: string);
procedure SetPSolution(AValue: string); procedure SetPSolution(AValue: string);
public public
published published
...@@ -68,23 +50,12 @@ var ...@@ -68,23 +50,12 @@ var
implementation implementation
uses uses
untConfig; frmStyleModule;
{$R *.lfm} {$R *.fmx}
{ TFormPuzzleConfig } { 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; function TFormPuzzleConfig.GetAIName: string;
begin begin
Exit(edtAIName.Text); Exit(edtAIName.Text);
...@@ -92,12 +63,12 @@ end; ...@@ -92,12 +63,12 @@ end;
function TFormPuzzleConfig.GetP0LP: Integer; function TFormPuzzleConfig.GetP0LP: Integer;
begin begin
Exit(Trunc(edtSelfLP.Value)); Exit(StrToInt(edtSelfLife.Text));
end; end;
function TFormPuzzleConfig.GetP1LP: Integer; function TFormPuzzleConfig.GetP1LP: Integer;
begin begin
Exit(Trunc(edtOpponentLP.Value)); Exit(StrToInt(edtOpponentLife.Text));
end; end;
function TFormPuzzleConfig.GetPMessage: string; function TFormPuzzleConfig.GetPMessage: string;
...@@ -122,12 +93,12 @@ end; ...@@ -122,12 +93,12 @@ end;
procedure TFormPuzzleConfig.SetP0LP(AValue: Integer); procedure TFormPuzzleConfig.SetP0LP(AValue: Integer);
begin begin
edtSelfLP.Value:= AValue; edtSelfLife.Text := IntToStr(AValue);
end; end;
procedure TFormPuzzleConfig.SetP1LP(AValue: Integer); procedure TFormPuzzleConfig.SetP1LP(AValue: Integer);
begin begin
edtOpponentLP.Value:= AValue; edtOpponentLife.Text := IntToStr(AValue);
end; end;
procedure TFormPuzzleConfig.SetPMessage(AValue: string); procedure TFormPuzzleConfig.SetPMessage(AValue: string);
...@@ -146,4 +117,3 @@ begin ...@@ -146,4 +117,3 @@ begin
end; end;
end. end.
This diff is collapsed.
unit frmSearchCard; unit frmSearchCard;
{$mode Delphi}{$H+}
interface interface
uses 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 type
{ TFormSearchCard }
TFormSearchCard = class(TForm) TFormSearchCard = class(TForm)
btnSearchCard: TD2CornerButton; layMain: TLayout;
btnCancel: TD2CornerButton; edtCardName: TEdit;
btnOK: TD2CornerButton; btnOK: TCornerButton;
CircleButton1: TD2CircleButton; btnCancel: TCornerButton;
D2Resources1: TD2Resources; lstCards: TListBox;
Label1: TD2Label; btnCleanHistory: TCornerButton;
Layout1: TD2Layout; txtHistory0: TText;
Layout2: TD2Layout; txtHistory4: TText;
layHistory: TD2Layout; txtHistory3: TText;
Layout3: TD2Layout; txtHistory2: TText;
Layout4: TD2Layout; txtHistory1: TText;
Layout5: TD2Layout; txtHistory5: TText;
lstCards: TD2ListBox; txtHistory9: TText;
Root: TD2Background; txtHistory8: TText;
Scene: TD2Scene; txtHistory7: TText;
edtCardName: TD2TextBoxClearBtn; txtHistory6: TText;
txtHistory1: TD2Text; btnSearch: TSearchEditButton;
txtHistory4: TD2Text; procedure btnCleanHistoryClick(Sender: TObject);
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);
procedure FormCreate(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 lstCardsDblClick(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure txtHistory0Click(Sender: TObject); procedure txtHistory0Click(Sender: TObject);
private private
FCardId: Int64; FCardId: Int64;
FHistory: array[0..9] of TD2Text; FHistory: array[0..9] of TText;
procedure SearchCard(Keyword: string); procedure SearchCard(Keyword: string);
procedure SaveHistory(ALast: string); procedure SaveHistory(ALast: string);
public public
...@@ -64,52 +52,60 @@ var ...@@ -64,52 +52,60 @@ var
implementation implementation
uses uses
untListItem, untConfig; moduleData, untConfig, untSearchCardItem, untCard, untArrayHelper, frmStyleModule;
{$R *.lfm} {$R *.fmx}
{ TFormSearchCard } { TFormSearchCard }
procedure TFormSearchCard.btnSearchCardClick(Sender: TObject); procedure TFormSearchCard.btnCleanHistoryClick(Sender: TObject);
var
keyword: string;
begin
keyword:= edtCardName.Text;
SearchCard(keyword);
end;
procedure TFormSearchCard.CircleButton1Click(Sender: TObject);
var var
i: Integer; i: Integer;
Arr: TStringArray; Arr: TArray<String>;
begin begin
Arr := TConfigReader.GetSearchHistory(); // clean history
Arr := TConfig.GetSearchHistory();
for i:= 0 to 9 do begin for i:= 0 to 9 do begin
Arr[i] := ''; Arr[i] := '';
FHistory[i].Text:= ''; FHistory[i].Text:= '';
end; 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; end;
procedure TFormSearchCard.edtCardNameKeyUp(Sender: TObject; var Key: Word; procedure TFormSearchCard.edtCardNameKeyUp(Sender: TObject; var Key: Word;
var KeyChar: System.Widechar; Shift: TShiftState); var KeyChar: WideChar; Shift: TShiftState);
begin begin
if (Key = VK_RETURN) then begin if (Key = VK_RETURN) then begin
btnSearchCardClick(btnSearchCard); btnSearchClick(btnSearch);
end; end;
end; end;
procedure TFormSearchCard.FormCreate(Sender: TObject); procedure TFormSearchCard.FormCreate(Sender: TObject);
var var
AScale: Double; Arr: TArray<String>;
Arr: TStringArray;
i: Integer; i: Integer;
begin 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[0] := txtHistory0;
FHistory[1] := txtHistory1; FHistory[1] := txtHistory1;
...@@ -122,17 +118,12 @@ begin ...@@ -122,17 +118,12 @@ begin
FHistory[8] := txtHistory8; FHistory[8] := txtHistory8;
FHistory[9] := txtHistory9; FHistory[9] := txtHistory9;
Arr := TConfigReader.GetSearchHistory(); Arr := TConfig.GetSearchHistory;
for i:= 0 to 9 do begin for i:= 0 to 9 do begin
FHistory[i].Text:= Arr[i]; FHistory[i].Text:= Arr[i];
end; end;
end; end;
procedure TFormSearchCard.lstCardsClick(Sender: TObject);
begin
btnOK.Enabled:= lstCards.ItemIndex > -1;
end;
procedure TFormSearchCard.lstCardsDblClick(Sender: TObject); procedure TFormSearchCard.lstCardsDblClick(Sender: TObject);
var var
idx: Integer; idx: Integer;
...@@ -143,64 +134,55 @@ begin ...@@ -143,64 +134,55 @@ begin
end; end;
end; end;
procedure TFormSearchCard.txtHistory0Click(Sender: TObject); procedure TFormSearchCard.SaveHistory(ALast: string);
var var
keyword: string; Arr: TArray<String>;
i: Integer;
begin begin
keyword:= TD2Text(Sender).Text; Arr := TConfig.GetSearchHistory;
SearchCard(keyword); 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; end;
procedure TFormSearchCard.SearchCard(Keyword: string); procedure TFormSearchCard.SearchCard(Keyword: string);
var var
list: TFPGList<TCard>; list: TArray<ICard>;
i: Integer; i: Integer;
item: TCardListItem; item: TSearchCardListItem;
begin begin
if (keyword = '') then Exit; if (keyword = '') then Exit;
list := Cards.SearchCards(keyword); lstCards.Enabled := False;
list := DMData.SearchCards(Keyword);
lstCards.Clear; lstCards.Clear;
lstCards.BeginUpdate; lstCards.BeginUpdate;
for i := 0 to list.Count - 1 do begin for i := 0 to list.Count - 1 do begin
item := TCardListItem.Create(lstCards); item := TSearchCardListItem.Create(lstCards);
item.CardName:= list[i].CardName; item.CardName := list[i].GetCardName;
item.Id:= list[i].CardId; item.CardId := list[i].GetCardId;
end; end;
lstCards.EndUpdate; lstCards.EndUpdate;
FreeCards(list);
btnOK.Enabled:= False;
// deselect all // deselect all
lstCards.ItemIndex:= -1; lstCards.ItemIndex := -1;
// save history // save history
SaveHistory(keyword); SaveHistory(Keyword);
lstCards.Enabled := True;
end; end;
procedure TFormSearchCard.SaveHistory(ALast: string); procedure TFormSearchCard.txtHistory0Click(Sender: TObject);
var var
Arr: TStringArray; keyword: string;
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);
begin begin
FCardId := TCardListItem(lstCards.Items[lstCards.ItemIndex]).Id; keyword:= TText(Sender).Text;
self.ModalResult:= mrOK; SearchCard(keyword);
end; end;
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