diff --git a/build-evidence/20260915T073140Z-ae91dd89/build.json b/build-evidence/20260915T073140Z-ae91dd89/build.json new file mode 100644 index 0000000..40965f7 --- /dev/null +++ b/build-evidence/20260915T073140Z-ae91dd89/build.json @@ -0,0 +1,27 @@ +{ + "schema": "kam-android-build/2", + "build_id": "20260915T073140Z-ae91dd89", + "status": "FAIL", + "cpu": "aarch64", + "abi": "arm64-v8a", + "application": { + "name": "kam_mobile", + "caption": "KaM Remake Mobile", + "package": "org.kammobile.kamremake", + "version": "0.4.0", + "version_code": 30, + "game_unit": "GameInitialize" + }, + "upstream_commit": "962fb850324b79bbe5480e1c2087d98f83a60917", + "resource_count": 1, + "compile": { + "status": "FAIL", + "exit_code": 1 + }, + "package": { + "status": "NOT_RUN", + "exit_code": null + }, + "package_metadata": null, + "error": "/work/vendor/kam_remake/src/utils/io/KM_IoXML.pas(11,5) Fatal: Can't find unit laz2_DOM used by KM_IoXML" +} diff --git a/build-evidence/20260915T073140Z-ae91dd89/logs/adb-version.log b/build-evidence/20260915T073140Z-ae91dd89/logs/adb-version.log new file mode 100644 index 0000000..9bf960b --- /dev/null +++ b/build-evidence/20260915T073140Z-ae91dd89/logs/adb-version.log @@ -0,0 +1,5 @@ +$ adb version +Android Debug Bridge version 1.0.41 +Version 35.0.0-11411520 +Installed as /usr/lib/android-sdk/platform-tools/adb +Running on Linux 6.8.0-139-generic (x86_64) diff --git a/build-evidence/20260915T073140Z-ae91dd89/logs/android-services.log b/build-evidence/20260915T073140Z-ae91dd89/logs/android-services.log new file mode 100644 index 0000000..d6edaef --- /dev/null +++ b/build-evidence/20260915T073140Z-ae91dd89/logs/android-services.log @@ -0,0 +1,4 @@ +project service: diagnostic_report_export +source: /work/build/20260915T073140Z-ae91dd89/application/android_services/diagnostic_report_export +castle destination: /usr/local/castle-engine/tools/build-tool/data/android/services/diagnostic_report_export +status: staged diff --git a/build-evidence/20260915T073140Z-ae91dd89/logs/compile.log b/build-evidence/20260915T073140Z-ae91dd89/logs/compile.log new file mode 100644 index 0000000..2284a4b --- /dev/null +++ b/build-evidence/20260915T073140Z-ae91dd89/logs/compile.log @@ -0,0 +1,40 @@ +$ castle-engine --os=android --cpu=aarch64 --compiler=fpc --mode=debug compile +Compiling project "kam_mobile" for OS / CPU "android / aarch64" in mode "debug". +FPC executing... +Free Pascal Compiler version 3.2.2 [2026/08/04] for aarch64 +Copyright (c) 1993-2021 by Florian Klaempfl and others +/work/vendor/kam_remake/src/common/KM_CommonTypes.pas(79,57) Note: Values in enumeration types have to be ascending +/work/port-source/kam_remake/src/common/KM_CommonClasses.pas(601,3) Note: Local variable "Encoding" not used +/work/port-source/kam_remake/src/common/KM_CommonClasses.pas(1519,22) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString" +/work/port-source/kam_remake/src/common/KM_CommonClasses.pas(1528,42) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString" +/work/port-source/kam_remake/src/common/KM_CommonClasses.pas(1654,49) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString" +/work/port-source/kam_remake/src/common/KM_CommonClasses.pas(1680,33) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString" +/work/port-source/kam_remake/src/common/KM_CommonClasses.pas(1690,18) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString" +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(81,30) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString" +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(131,32) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString" +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(403,3) Note: Local variable "ErrorStr" not used +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(447,46) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "RawByteString" +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(461,49) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString" +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(462,73) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString" +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(463,52) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString" +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(527,3) Note: Local variable "sl" not used +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(556,44) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString" +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(564,10) Warning: Function result does not seem to be set +/work/port-source/kam_remake/src/utils/io/KM_FileIO.pas(594,10) Warning: Function result does not seem to be set +/work/vendor/kam_remake/src/KM_Log.pas(146,42) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "RawByteString" +/work/vendor/kam_remake/src/KM_Log.pas(148,45) Warning: Implicit string type conversion from "RawByteString" to "UnicodeString" +/work/vendor/kam_remake/src/KM_Log.pas(151,45) Warning: Implicit string type conversion from "RawByteString" to "UnicodeString" +/work/vendor/kam_remake/src/KM_Log.pas(151,50) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString" +/work/vendor/kam_remake/src/KM_Log.pas(305,30) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString" +/work/vendor/kam_remake/src/KM_Log.pas(305,76) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString" +/work/vendor/kam_remake/src/KM_Log.pas(358,3) Note: Local variable "txt" is assigned but never used +/work/vendor/kam_remake/src/KM_Log.pas(480,27) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString" +/work/vendor/kam_remake/src/KM_Log.pas(480,35) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString" +/work/vendor/kam_remake/src/KM_Log.pas(602,66) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString" +/work/vendor/kam_remake/src/common/KM_Lists.pas(87,46) Warning: Implicit string type conversion with potential data loss from "WideString" to "AnsiString" +/work/vendor/kam_remake/src/common/KM_Lists.pas(105,22) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString" +/work/vendor/kam_remake/src/utils/io/KM_IoXML.pas(11,5) Fatal: Can't find unit laz2_DOM used by KM_IoXML +Fatal: Compilation aborted +Error: /usr/local/fpclazarus/3.2.2/fpc/bin/ppcrossa64 returned an error exitcode +Exception "Exception": +Failed to compile diff --git a/build-evidence/20260915T073140Z-ae91dd89/logs/java-version.log b/build-evidence/20260915T073140Z-ae91dd89/logs/java-version.log new file mode 100644 index 0000000..47f7ac4 --- /dev/null +++ b/build-evidence/20260915T073140Z-ae91dd89/logs/java-version.log @@ -0,0 +1,4 @@ +$ java -version +openjdk version "21.0.12" 2026-07-21 +OpenJDK Runtime Environment (build 21.0.12+8-1-24.04-Ubuntu) +OpenJDK 64-Bit Server VM (build 21.0.12+8-1-24.04-Ubuntu, mixed mode, sharing) diff --git a/build-evidence/20260915T073140Z-ae91dd89/logs/toolchain.json b/build-evidence/20260915T073140Z-ae91dd89/logs/toolchain.json new file mode 100644 index 0000000..5d1345f --- /dev/null +++ b/build-evidence/20260915T073140Z-ae91dd89/logs/toolchain.json @@ -0,0 +1,38 @@ +{ + "castle": { + "status": "NOT_INSTALLED" + }, + "fpc": { + "status": "NOT_INSTALLED" + }, + "java": { + "status": "PASS", + "exit_code": 0, + "seconds": 0.065, + "command": [ + "java", + "-version" + ], + "log": "build/20260915T073140Z-ae91dd89/logs/java-version.log", + "output": "$ java -version\nopenjdk version \"21.0.12\" 2026-07-21\nOpenJDK Runtime Environment (build 21.0.12+8-1-24.04-Ubuntu)\nOpenJDK 64-Bit Server VM (build 21.0.12+8-1-24.04-Ubuntu, mixed mode, sharing)\n" + }, + "adb": { + "status": "PASS", + "exit_code": 0, + "seconds": 0.004, + "command": [ + "adb", + "version" + ], + "log": "build/20260915T073140Z-ae91dd89/logs/adb-version.log", + "output": "$ adb version\nAndroid Debug Bridge version 1.0.41\nVersion 35.0.0-11411520\nInstalled as /usr/lib/android-sdk/platform-tools/adb\nRunning on Linux 6.8.0-139-generic (x86_64)\n" + }, + "paths": {}, + "docker_image_lock": { + "image": "kambi/castle-engine-cloud-builds-tools@sha256:1a67fad233fe7a2e81ed5f750b548c9ef136ed7d36ec061ff96b2e5eb6eaa218", + "image_id": "sha256:1a67fad233fe7a2e81ed5f750b548c9ef136ed7d36ec061ff96b2e5eb6eaa218", + "resolved_from": "kambi/castle-engine-cloud-builds-tools:cge-unstable", + "locked_at": "20260908T161942Z", + "note": "Subsequent runs use this digest, never silently advance the tag." + } +} diff --git a/config/extra-paths.json b/config/extra-paths.json index ae2ef44..d55bf81 100755 --- a/config/extra-paths.json +++ b/config/extra-paths.json @@ -3,7 +3,8 @@ "adaptations": [ "src/utils/io/KM_FileIO.pas", "src/common/KM_CommonClasses.pas", - "src/settings/KM_GameSettings.pas" + "src/settings/KM_GameSettings.pas", + "src/utils/io/KM_IoXML.pas" ], "source_paths": [ "code/resource" diff --git a/port-source/kam_remake/src/utils/io/KM_IoXML.pas b/port-source/kam_remake/src/utils/io/KM_IoXML.pas new file mode 100644 index 0000000..9e60147 --- /dev/null +++ b/port-source/kam_remake/src/utils/io/KM_IoXML.pas @@ -0,0 +1,277 @@ +unit KM_IoXML; +{$I KaM_Remake.inc} +interface +uses + Classes, SysUtils, + DOM, XMLRead, XMLWrite; + +type + TKMXmlDomDocument = TXMLDocument; + + TKMXmlNode = class; + + TKMSimpleVariant = record + private + // Internal representation is always a string + fValue: string; + public + class operator Implicit(const A: Boolean): TKMSimpleVariant; + class operator Implicit(const A: Cardinal): TKMSimpleVariant; + class operator Implicit(const A: Integer): TKMSimpleVariant; + class operator Implicit(const A: Single): TKMSimpleVariant; + class operator Implicit(const A: string): TKMSimpleVariant; + class operator Implicit(const A: TDateTime): TKMSimpleVariant; + function AsBoolean: Boolean; overload; + function AsBoolean(aDefault: Boolean): Boolean; overload; + function AsCardinal: Cardinal; overload; + function AsCardinal(aDefault: Cardinal): Cardinal; overload; + function AsDateTime: TDateTime; + function AsFloat: Single; overload; + function AsFloat(aDefault: Single): Single; overload; + function AsInteger: Integer; overload; + function AsInteger(aDefault: Integer): Integer; overload; + function AsString: string; overload; + function AsString(aDefault: string): string; overload; + end; + + TKMXmlDocument = class + private + fDocument: TKMXmlDomDocument; + fRoot: TKMXmlNode; + function GetText: String; + procedure SetText(const aText: string); + procedure ApplyDefaultSettings; + class constructor Create; + public + class var FDateFormat: TFormatSettings; + constructor Create(const aRoot: string = 'Root'); + destructor Destroy; override; + property Root: TKMXmlNode read fRoot; + procedure LoadFromFile(const aFilename: string; aRoot: string = 'Root'; aReadOnly: Boolean = True); + procedure SaveToFile(const aFilename: string; aCompressed: Boolean = False); + property Text: string read GetText write SetText; + end; + + TKMXmlNode = class(TDOMElement) + protected + function GetAttrib(const AttrName: String): TKMSimpleVariant; + procedure SetAttrib(const AttrName: String; const AttrValue: TKMSimpleVariant); + function GetChildsCount: Integer; + function GetChild(const aIndex: Integer): TKMXmlNode; + public + function AddChild(const Name: String): TKMXmlNode; + function FindNode(const Name: String): TKMXmlNode; reintroduce; + function AddOrFindChild(const aChildNodeName: string): TKMXmlNode; + function HasAttribute(const AttrName: String): Boolean; + function HasChild(const Name: String): Boolean; + property Attributes[const AttrName: String]: TKMSimpleVariant read GetAttrib write SetAttrib; + property ChildsCount: Integer read GetChildsCount; + property Childs[const aIndex: Integer]: TKMXmlNode read GetChild; + end; + +implementation +uses + Variants, DateUtils, StrUtils; + +class constructor TKMXmlDocument.Create; +begin + inherited; +end; + +constructor TKMXmlDocument.Create(const aRoot: string = 'Root'); +begin + inherited Create; + fDocument := TKMXmlDomDocument.Create; + ApplyDefaultSettings; + if aRoot <> '' then + begin + fRoot := TKMXmlNode(fDocument.CreateElement(aRoot)); + fDocument.AppendChild(fRoot); + end; +end; + +destructor TKMXmlDocument.Destroy; +begin + fDocument.Free; + inherited; +end; + +procedure TKMXmlDocument.ApplyDefaultSettings; +begin + fDocument.XMLVersion := '1.0'; +end; + +procedure TKMXmlDocument.LoadFromFile(const aFilename: string; aRoot: string = 'Root'; aReadOnly: Boolean = True); +begin + if FileExists(aFilename) then + ReadXMLFile(fDocument, aFilename); + + ApplyDefaultSettings; + fRoot := TKMXmlNode(fDocument.DocumentElement.FindNode(aRoot)); + if fRoot = nil then + begin + fRoot := TKMXmlNode(fDocument.CreateElement(aRoot)); + fDocument.AppendChild(fRoot); + end; +end; + +procedure TKMXmlDocument.SaveToFile(const aFilename: string; aCompressed: Boolean = False); +begin + ForceDirectories(ExtractFilePath(ExpandFileName(aFilename))); + WriteXMLFile(fDocument, aFilename); +end; + +function TKMXmlDocument.GetText: String; +begin + // Not implemented +end; + +procedure TKMXmlDocument.SetText(const aText: string); +begin + // Not implemented +end; + +function TKMXmlNode.AddChild(const Name: String): TKMXmlNode; +begin +end; + +function TKMXmlNode.FindNode(const Name: String): TKMXmlNode; +begin +end; + +function TKMXmlNode.AddOrFindChild(const aChildNodeName: string): TKMXmlNode; +begin + if not HasChild(aChildNodeName) then + Result := AddChild(aChildNodeName) + else + Result := FindNode(aChildNodeName); +end; + +function TKMXmlNode.HasAttribute(const AttrName: String): Boolean; +begin +end; + +function TKMXmlNode.HasChild(const Name: String): Boolean; +begin +end; + +function TKMXmlNode.GetAttrib(const AttrName: String): TKMSimpleVariant; +begin +end; + +procedure TKMXmlNode.SetAttrib(const AttrName: String; const AttrValue: TKMSimpleVariant); +begin +end; + +function TKMXmlNode.GetChildsCount: Integer; +begin +end; + +function TKMXmlNode.GetChild(const aIndex: Integer): TKMXmlNode; +begin +end; + +function TKMSimpleVariant.AsBoolean: Boolean; +begin + Result := StrToBool(fValue); +end; + +function TKMSimpleVariant.AsBoolean(aDefault: Boolean): Boolean; +begin + Result := StrToBoolDef(fValue, aDefault); +end; + +function TKMSimpleVariant.AsCardinal: Cardinal; +begin + Result := StrToInt64(fValue); +end; + +function TKMSimpleVariant.AsCardinal(aDefault: Cardinal): Cardinal; +begin + Result := StrToInt64Def(fValue, aDefault); +end; + +function TKMSimpleVariant.AsDateTime: TDateTime; +begin + Result := StrToDateTimeDef(fValue, 0, TKMXmlDocument.FDateFormat); +end; + +function TKMSimpleVariant.AsFloat: Single; +var + str: string; +begin + str := StringReplace(fValue, '.', FormatSettings.DecimalSeparator, [rfReplaceAll]); + str := StringReplace(str, ',', FormatSettings.DecimalSeparator, [rfReplaceAll]); + Result := StrToFloat(str); +end; + +function TKMSimpleVariant.AsFloat(aDefault: Single): Single; +var + str: string; +begin + str := StringReplace(fValue, '.', FormatSettings.DecimalSeparator, [rfReplaceAll]); + str := StringReplace(str, ',', FormatSettings.DecimalSeparator, [rfReplaceAll]); + Result := StrToFloatDef(str, aDefault); +end; + +function TKMSimpleVariant.AsInteger: Integer; +begin + Result := StrToInt(fValue); +end; + +function TKMSimpleVariant.AsInteger(aDefault: Integer): Integer; +begin + Result := StrToIntDef(fValue, aDefault); +end; + +function TKMSimpleVariant.AsString: string; +begin + Result := fValue; +end; + +function TKMSimpleVariant.AsString(aDefault: string): string; +begin + if fValue <> '' then + Result := fValue + else + Result := aDefault; +end; + +class operator TKMSimpleVariant.Implicit(const A: Boolean): TKMSimpleVariant; +const + BOOL_STR: array [Boolean] of string = ('False', 'True'); +begin + Result.fValue := BOOL_STR[A]; +end; + +class operator TKMSimpleVariant.Implicit(const A: Cardinal): TKMSimpleVariant; +begin + Result.fValue := '$' + IntToHex(A, 8); +end; + +class operator TKMSimpleVariant.Implicit(const A: Integer): TKMSimpleVariant; +begin + Result.fValue := IntToStr(A); +end; + +class operator TKMSimpleVariant.Implicit(const A: Single): TKMSimpleVariant; +var + str: string; + fs: TFormatSettings; +begin + fs.DecimalSeparator := '.'; + str := FormatFloat('0.0000', A, fs); + Result.fValue := str; +end; + +class operator TKMSimpleVariant.Implicit(const A: string): TKMSimpleVariant; +begin + Result.fValue := A; +end; + +class operator TKMSimpleVariant.Implicit(const A: TDateTime): TKMSimpleVariant; +begin + Result.fValue := DateTimeToStr(A, TKMXmlDocument.FDateFormat); +end; + +end.