Auf dieser Seite findest du interne Infos zur Entwicklung von Serflings und zu Siedler 1. Dazu gehören zum Beispiel Datenformate oder Informationen über interne Strukturen und Abläufe des Spiels.
Hier geht es zurück zu den allgemeinen Infos: Serflings
Speicherdateien und Archiv
Im Original ist die Speicherdatei (save[0-9].ds) eine binäre Abbildung des Spielstatus aus dem RAM. Die einzelnen Speicherstände werden verwaltet in einer separaten Archivdatei (archiv.ds). Das Archiv beinhaltet zum Beispiel die Namen der einzelnen Speicherstände, da diese nicht in der Speicherdatei direkt gespeichert werden.
Datenformat Archivdatei (archiv.ds)
Das Archiv kann 10 mögliche Speicherstände verwalten. Jeder Speicherstand besteht dabei aus 16 Bytes. Insgesamt
besteht die Datei somit aus 160 Bytes.
Nachfolgend sind die Bytes eines Speicherstands im Archiv dargestellt:
- 14 Bytes (0-13): name - Name des Speicherstands
- 1 Byte (14): Festes Byte als Trenner (0xFF)
- 1 Byte (15): used - Definiert ob der Speicherstand benutzt wird (0x01) oder nicht (0x00)
Datenformat Speicherdatei (save[0-9].ds)
Die Speicherdatei hat keine feste Länge, da sie von der Kartengröße und der Anzahl der aktuell genutzen Objekte
(Siedler, Fahnen, Gebäude, Lager) abhängt.
Serflings ist vollständig kompatibel zum Originalformat, nutzt aber einige unbenutzte Bytes für einfache
Änderungen am Spiel,
die nicht die Spiellogik direkt betreffen. Dadurch lässt sich eine Speicherdatei von Serflings auch wieder im
Original laden.
Bei größeren Änderungen an den Spielregeln wird allerdings die Speicherdatei so weit verändert, dass sie nicht
mehr kompatibel ist. Serflings nutzt
dafür das Feld für die Anzahl der Elemente der Karte, da das Original die Gültigkeit an diesem Feld prüft.
Nachfolgend ist eine grobe Übersicht der einzelnen Bereiche dargestellt:
- 250 Bytes (0-249): Allgemeine Daten zum Spiel und zur Karte
- 34.512 Bytes (250-34.761): Daten aller Spieler (4 Spieler x 8.628 Bytes pro Spieler)
-
Danach kommen die Daten der Karte, deren Länge allerdings von der Kartengröße direkt abhängt.
Jede Kartenposition (Element) hat dabei jeweils 8 Bytes an Daten, aufgeteilt in 4 und 4 Bytes.- Kartengröße 1 - 8.192 Bytes (34.762-42.953): Kartendaten für 1.024 Elemente (32x32)
- Kartengröße 2 - 16.384 Bytes (34.762-51.145): Kartendaten für 2.048 Elemente (64x32)
- Kartengröße 3 - 32.768 Bytes (34.762-67.529): Kartendaten für 4.096 Elemente (64x64)
- Kartengröße 4 - 65.536 Bytes (34.762-100.297): Kartendaten für 8.192 Elemente (128x64)
- Kartengröße 5 - 131.072 Bytes (34.762-165.833): Kartendaten für 16.384 Elemente (128x128)
- Kartengröße 6 - 262.144 Bytes (34.762-296.905): Kartendaten für 32.768 Elemente (256x128)
- Kartengröße 7 - 524.288 Bytes (34.762-559.049): Kartendaten für 65.536 Elemente (256x256)
- Kartengröße 8 - 1.048.576 Bytes (34.762-1.083.337): Kartendaten für 131.072 Elemente (512x256)
- Serflings unterstützt noch weitere Kartengrößen:
- Kartengröße 9 - 2.097.152 Bytes (34.762-2.131.913): Kartendaten für 262.144 Elemente (512x512)
- Kartengröße 10 - 4.194.304 Bytes (34.762-4.229.065): Kartendaten für 524.288 Elemente (1.024x512)
- Kartengröße 11 - 8.388.608 Bytes (34.762-8.423.369): Kartendaten für 1.048.576 Elemente (1.024x1.024)
-
Danach kommen die Daten der Siedler, deren Länge allerdings vom höchsten benutzten Siedlerindex
abhängt.
Jeder Siedler hat dabei jeweils 16 Bytes an Daten. Die Anzahl der maximalen Siedler ist abhängig von der maximal möglichen Kartengröße.- Bis Kartengröße 8 (Original und Serflings): 64.043 Siedler Maximal
- Ab Kartengröße 9 (Nur Serflings): 512.349 Siedler Maximal
-
Danach kommen die Daten der Fahnen, deren Länge allerdings vom höchsten benutzten Fahnenindex abhängt.
Jede Fahne hat dabei jeweils 70 Bytes an Daten.- Bis Kartengröße 8 (Original und Serflings): 16.391 Fahnen Maximal
- Ab Kartengröße 9 (Nur Serflings): 131.130 Fahnen Maximal
-
Danach kommen die Daten der Gebäude, deren Länge allerdings vom höchsten benutzten Gebäudeindex
abhängt.
Jedes Gebäude hat dabei jeweils 18 Bytes an Daten.- Bis Kartengröße 8 (Original und Serflings): 9.576 Gebäude Maximal
- Ab Kartengröße 9 (Nur Serflings): 76.609 Gebäude Maximal
-
Danach kommen die Daten der Lager für alle Gebäude mit Lager (Schloss, Lagerhaus), deren Länge allerdings
vom höchsten benutzten Lagerindex abhängt.
Jedes Lager hat dabei jeweils 120 Bytes an Daten.- Bis Kartengröße 8 (Original und Serflings): 1.444 Lager Maximal
- Ab Kartengröße 9 (Nur Serflings): 11.559 Lager Maximal
Nachfolgend sind die Bytes des allgemeinen Bereichs dargestellt (250 Bytes):
- 4 Bytes (0-3): mapOffsetMask
- 4 Bytes (4-7): mapDirectionRight
- 4 Bytes (8-11): mapDirectionDownRight
- 4 Bytes (12-15): mapDirectionDown
- 2 Bytes (16-17): mapDirectionLeft
- 4 Bytes (18-21): mapDirectionUpLeft
- 4 Bytes (22-25): mapDirectionUp
- 4 Bytes (26-29): mapDirectionUpRight
- 4 Bytes (30-33): mapDirectionDownLeft
- 4 Bytes (34-37): mapUnknown
- 4 Bytes (38-41): mapElementCount - Anzahl der Elemente der Karte
- 2 Bytes (42-43): mapRowShift
- 2 Bytes (44-45): mapColumnMask
- 2 Bytes (46-47): mapRowMask
- 4 Bytes (48-51): mapElementOffsetDifferenceToAdditional - Offset-Unterschied zwischen den Bytes der Kartenelemente (Vorne/Hinten)
- 2 Bytes (52-53): mapColumnSize
- 4 Bytes (54-57): mapRowMaskShift
- 2 Bytes (58-59): mapColumnPairs
- 2 Bytes (60-61): mapRowPairs
- 2 Bytes (62-63): mapColumns
- 2 Bytes (64-65): mapRows
- 1 Byte (66): gameFlags
- 1 Byte (67): humanControlFlags
- 4 Bytes (68-71): mapUpdateInitialPos
- 1 Byte (72): unknownDeviceConfig
- 1 Byte (73): unknownDeviceConfig
- 2 Bytes (74-75): gameType - Spieltyp
- 2 Bytes (76-77): tickPartA
- 2 Bytes (78-79): tickPartB
- 2 Bytes (80-81): statisticsCounter
- 2 Bytes (82-83): goodsProductionHistoryCounter
- 3x2 Bytes (84-89): randoms[] - Aktuelle Zufallszahlen
- 2 Bytes (90-91): currentFlagIndex
- 2 Bytes (92-93): currentBuildingIndex
- 2 Bytes (94-95): currentSerflingIndex
- 2 Bytes (96-97): nextIndex
- 2 Bytes (98-99): flagSearchCounter
- 2 Bytes (100-101): mapUpdateLastAnimation
- 2 Bytes (102-103): mapUpdateCounter
- 4x2 Bytes (104-111): playerStatisticsHistoryIndexes[]
- 3x2 Bytes (112-117): playerStatisticsHistoryCounters[]
- 2 Bytes (118-119): goodsProductionHistoryIndex
- 2 Bytes (120-121): mapRegions
- 2 Bytes (122-123): gameNumber - Nummer des Tutorials (Spieltyp Tutorial)
- 2 Bytes (124-125): gameNumber - Nummer der Mission (Spieltyp Mission)
- 2 Bytes (126-127): gameMainMenuAllowedMission - Höchste erlaubte Mission laut Hauptmenü
- 8x1 Bytes (128-135): gameMainMenuPassword[] - Passwort laut Hauptmenü als einzelne Zeichen in US ASCII
- 2 Byte (136-137): gameMapSize - Kartengröße laut Hauptmenü (Spieltyp Freies Spiel)
- 3x2 Byte (138-143): gameRandoms[] - Zufallszahlen laut Hauptmenü (Spieltyp Freies Spiel)
- 4x1 Byte (144-147): gamePlayersComputerImages[] - Bilder der Computer 1-4 laut Hauptmenü (Spieltyp Freies Spiel) (0=Computer Deaktiviert)
- 4x1 Byte (148-151): gamePlayersComputerIntelligences[] - Intelligenz der Computer 1-4 laut Hauptmenü (Spieltyp Freies Spiel)
- 4x1 Byte (152-155): gamePlayersComputerStocks[] - Lagerbestand der Computer 1-4 laut Hauptmenü (Spieltyp Freies Spiel)
- 4x1 Byte (156-159): gamePlayersComputerGrowthRate[] - Wachstumsrate der Computer 1-4 laut Hauptmenü (Spieltyp Freies Spiel)
- 2x1 Byte (160-161): gamePlayersHumanStocks[] - Lagerbestand der menschlichen Spieler 1-2 laut Hauptmenü (Spieltyp Freies Spiel)
- 2x1 Byte (162-163): gamePlayersHumanGrowthRate[] - Wachstumsrate der menschlichen Spieler 1-2 laut Hauptmenü (Spieltyp Freies Spiel)
- 2 Byte (164-165): coopMapCursorCol
- 2 Byte (166-167): coopMapCursorRow
- 1 Byte (168): coopMapCursorType
- 1 Byte (169): coopMapCursorBuildPossibility
- 2 Byte (170-171): coopBuildingHeightAfterLevel
- 2 Byte (172-173): coopBuild
- 2 Byte (174-175): currentInventoryIndex
- 2 Byte (176-177): mapMaxSerflingsLeft
- 2 Byte (178-179): calculatedByMaxInventoriesCount
- 2 Byte (180-181): maxNextIndex
- 2 Byte (182-183): maxSerflingsFromLandOwnership
- 4 Byte (184-187): mapGoldDeposit
- 2 Byte (188-189): mapUpdateLoop
- 2 Byte (190-191): mapSize - Kartengröße
- 2 Byte (192-193): mapInitValue
- 2 Byte (194-195): lastBuildingIndexForResetSerflingRequest
- 2 Byte (196-197): lastFlagIndexForResetTransporterRequest
- 2 Byte (198-199): maxSerflingsPerPlayer
- 2 Byte (200-201): mapGoldMotivationFactor
- 2 Byte (202-203): winningPlayer
- 1 Byte (204): playerWinScoreFlags
- 1 Byte (205): showGameEnd
- 4 Byte (206-209): mapDirectionLeftCopy
- 40 Bytes (210-249): Diese Bytes sind im Original unbenutzt und werden von Serflings für einfache Änderungen
am Spiel verwendet
- 1 Byte (210): savegameVersion (Nur Serflings) - Version der Speicherdatei von Serflings um Migrationen durchführen zu können
- 4 Bytes (211-214): totalTickCounter (Nur Serflings) - Zähler für die Anzal kompletter Ticks seit Spielstart
- 1 Byte (215): gameFlags (Nur Serflings) - Schalter für einfache Änderungen am Spiel
- 2 Bytes (216-217): Unbenutzt
- 2 Bytes (218-219): computerTickDelta (Nur Serflings) - Feld aus dem Original, welches nicht gespeichert wird und somit beim erneuten Laden das Spiel verändert
- 2 Bytes (220-221): lastTick (Nur Serflings) - Feld aus dem Original, welches nicht gespeichert wird und somit beim erneuten Laden das Spiel verändert
- 2 Bytes (222-223): tickDelta (Nur Serflings) - Feld aus dem Original, welches nicht gespeichert wird und somit beim erneuten Laden das Spiel verändert
- 26 Bytes (224-249): Unbenutzt
Nachfolgend sind die Bytes eines Spielers dargestellt (8.628 Bytes):
- 9x2 Bytes (0-17): toolPriorities[]
- 26x1 Bytes (18-43): goodsProductionCounts[]
- 26x1 Bytes (44-69): flagPriority[]
- 27x2 Bytes (70-123): serflingCounts[]
- 4x1 Bytes (124-127): knightOccupations[]
- 2 Bytes (128-129): playerNumber
- 1 Byte (130): settingFlags
- 1 Byte (131): build
- 23x2 Bytes (132-177): buildingCountFinished[]
- 23x2 Bytes (178-223): buildingCountUnderConstruction[]
- 26x1 Bytes (224-249): inventoryPriority[]
- 64x2 Bytes (250-377): attackingBuildings[]
- 2 Bytes (378-379): unknown
- 2 Bytes (380-381): mapCursorCol
- 2 Bytes (382-383): mapCursorRow
- 1 Byte (384): mapCursorType
- 1 Byte (385): mapCursorBuildPossibility
- 2 Bytes (386-387): buildingHeightAfterLevel
- 2 Bytes (388-389): building
- 2 Bytes (390-391): castleFlag
- 2 Bytes (392-393): castleInventory
- 2 Bytes (394-395): contSearchAfterNonOptimalFind
- 2 Bytes (396-397): knightsToSpawn
- 2 Bytes (398-399): unknown
- 2 Bytes (400-401): spawnSerflingKnight
- 4 Bytes (402-405): landOwnership
- 4 Bytes (406-409): buildingScore
- 4 Bytes (410-413): militaryScore
- 2 Bytes (414-415): lastTick
- 2 Bytes (416-417): currentGrowthCounter
- 2 Bytes (418-419): growthCounter
- 2 Bytes (420-421): knightCreationRate
- 2 Bytes (422-423): knightCreationCounter
- 2 Bytes (424-425): attackingBuildingCount
- 4x2 Bytes (426-433): attackingKnights[]
- 2 Bytes (434-435): attackingKnightsTotal
- 2 Bytes (436-437): buildingAttacked
- 2 Bytes (438-439): knightsAttacking
- 2 Bytes (440-441): analysisGold
- 2 Bytes (442-443): analysisIron
- 2 Bytes (444-445): analysisCoal
- 2 Bytes (446-447): analysisStone
- 2 Bytes (448-449): foodPrioStoneMine
- 2 Bytes (450-451): foodPrioCoalMine
- 2 Bytes (452-453): foodPrioOreMine
- 2 Bytes (454-455): foodPrioGoldMine
- 2 Bytes (456-457): woodPrioConstruction
- 2 Bytes (458-459): woodPrioBoatYard
- 2 Bytes (460-461): woodPrioToolmaker
- 2 Bytes (464-465): steelPrioArmourer
- 2 Bytes (466-467): coalPrioSteelWorker
- 2 Bytes (468-469): coalPrioGoldsmith
- 2 Bytes (470-471): coalPrioArmourer
- 2 Bytes (472-473): wheatPrioFarmerPigs
- 2 Bytes (474-475): wheatPrioWindmill
- 2 Bytes (476-477): unknown
- 2 Bytes (478-479): castleScore
- 2 Bytes (480-481): inventorySerflingNoProfessionRequestCounter
- 1 Byte (482): stocks
- 1 Byte (483): flags
- 1 Byte (484): goodsReserveTimber
- 1 Byte (485): goodsReserveStones
- 2 Bytes (486-487): indexForWoodcutter
- 2 Bytes (488-489): indexForSawmill
- 2 Bytes (490-491): indexForStonecutter
- 2 Bytes (492-493): emergencyModeTimer
- 2 Bytes (494-495): castleSerflingIndex
- 2 Bytes (496-497): knightExchangeCounter
- 2 Bytes (498-499): timersSize
- 2 Bytes (500-501): castleKnightRequestCounter
- 2 Bytes (502-503): unknown
- 4 Bytes (504-507): unknown
- 4 Bytes (508-511): goldFromMilitary
- 4 Bytes (512-515): goldFromStock
- 2 Bytes (516-517): knightMotivation
- 2 Bytes (518-519): computerKnightMotivationValue
- 2 Bytes (520-521): ownedGold
- 2 Bytes (522-523): castleKnightsWanted
- 2 Bytes (524-525): castleKnightsCurrent
- 2 Bytes (526-527): computerCharacterAttribute
- 2 Bytes (528-529): computerCharacterAttribute
- 2 Bytes (530-531): computerCharacterAttribute
- 2 Bytes (532-533): computerCharacterAttribute
- 2 Bytes (534-535): computerCharacterAttributeStrongAttackingChance
- 2 Bytes (536-537): computerCharacterAttribute
- 2 Bytes (538-539): computerCurrentBuildingDemolitionIndex
- 2 Bytes (540-541): computerUnknown
- 2 Bytes (542-543): computerUnknown
- 4 Bytes (544-547): computerSetting
- 2 Bytes (548-549): computerUnknown
- 2 Bytes (550-551): computerUnknown
- 2 Bytes (552-553): computerUnknown
- 2 Bytes (554-555): computerUnknown
- 2 Bytes (556-557): computerKnightsSummary
- 2 Bytes (558-559): calculatedIntelligence
- 2 Bytes (560-561): computerTimer
- 2 Bytes (562-563): computerTimer
- 2 Bytes (564-565): computerBuildingState
- 2 Bytes (566-567): computerActionTimer
- 2 Bytes (568-569): computerSetting
- 2 Bytes (570-571): unknown
- 8x(2+2) Bytes (572-603): conqueredBuildingflagCoordinates[]
- 44x2 Bytes (604-691): computerEnvironmentRecords[]
- 44x2 Bytes (692-779): computerEnvironmentRecords[]
- 44x2 Bytes (780-867): computerEnvironmentRecords[]
- 44x2 Bytes (868-955): computerEnvironmentRecords[]
- 21x2 Bytes (956-997): computerCalculatedBuildingStockGoods[]
- 27x2 Bytes (998-1051): computerCalculatedSerflings[]
- 26x2 Bytes (1052-1103): computerCalculatedGoods[]
- 25x2 Bytes (1104-1153): computerCalculatedBuildingPrio[]
- 25x2 Bytes (1154-1203): computerCalculatedBuildingUnknown[]
- 280x(2+2+2) Bytes (1204-2883): multiUseArray[]
- 16x112 Bytes (2884-4675): statisticsHistory[]
- 16x(8+112) Bytes (4676-7795): goodsProductionHistory[]
- 64x1 Bytes (7796-7859): messages[]
- 64x4 Bytes (7860-8115): messagePositions[]
- 64x(4+4) Bytes (8116-8627): timers[]
Die Elemente der Karte sind aufgeteilt in Spalten und Zeilen. Jedes Element in einer Zeile ist zudem aufgeteilt in 4 Bytes vorne und 4 Bytes hinten. Konkret sieht man die Aufteilung im folgenden Beispiel (4x4 Elemente):
AAAABBBBCCCCDDDD AAAABBBBCCCCDDDD EEEEFFFFGGGGHHHH EEEEFFFFGGGGHHHH IIIIJJJJKKKKLLLL IIIIJJJJKKKKLLLL MMMMNNNNOOOOPPPP MMMMNNNNOOOOPPPP
Nachfolgend sind die Bytes eines Kartenelements dargestellt (4 Bytes Vorne + 4 Bytes Hinten):
-
Erster Block (vorne)
-
1 Byte (0): flags - Flags zu den Wegen
Bit 7 = Objekt Fahne vorhanden Bit 6 = Position ist nicht begehbar für Siedler (Wasser, blockierendes Objekt, Gebäude) Bit 5 = Weg vorhanden (Richtung Oben) Bit 4 = Weg vorhanden (Richtung Oben links) Bit 3 = Weg vorhanden (Richtung Links) Bit 2 = Weg vorhanden (Richtung Unten) Bit 1 = Weg vorhanden (Richtung Unten rechts) Bit 0 = Weg vorhanden (Richtung Rechts)
-
1 Byte (1): heightAndOwner - Höhe und Besitzer des Kartenpunkts
Bit 7 = Hat Besitzer (0b10000000 >>> 7) Bit 5-6 = Besitzernummer 0-3 (0b01100000 >>> 5) Bit 0-4 = Höhe (0b00011111)
-
1 Byte (2): grounds - Art der Landschaft
Bit 4-7 = Teil 1 Unten (Dreieck Hoch) Bit 0-3 = Teil 2 Unten Rechts (Dreieck Runter)
Bereiche anhand der Position:x --- x / \ / \ x x --- x \ / \ 2 / \ / 1 \ / x --- x
-
1 Byte (3): objectAndFlag - Objekt auf dem Kartenpunkt und ein Flag (Beispiel: Wellen für
Wasser)
Bit 7 = Flag Bit 0-6 = Objekt
-
1 Byte (0): flags - Flags zu den Wegen
-
Zweiter Block (hinten)
-
1 Byte (4): resourceOrObjectIndex - Bodenressource (Typ + Menge) oder Index des Objekts
Hinweis: Ressource + Flags teilen sich zusammen den Index des ObjektsRessource (1 Byte): Bit 5-7 = Rohstofftyp (0b11100000 >>> 5) Bit 0-4 = Rohstoffmenge (0b00011111)
-
1 Byte (5): flagsOrObjectIndex - Flags oder Index des Objekts
Hinweis: Ressource + Flags teilen sich zusammen den Index des ObjektsFlags (1 Byte): Bit 7 = Siedler ist an dieser Position untätig (Träger ohne Arbeit) Bit 2-6 = ? Bit 0-1 = Besitzer des untätigen Siedlers
- 2 Bytes (6-7): serflingIndex - Index des Siedlers
-
1 Byte (4): resourceOrObjectIndex - Bodenressource (Typ + Menge) oder Index des Objekts