Mit ‘fbk’ getaggte Artikel

Gemeinsame Verlinkungsleiste für Spiele

Freitag, 14. Mai 2010

Den Spielen

habe ich nun eine Verlinkungsleiste gegeben, über die die Nutzer schnell von den anderen Spielen erfahren können und zu diesen wechseln kann.

image

Insbesondere bin ich an einer gegenseitigen Verlinkung mit anderen Hobbyspielen interessiert. Wer also ein kleines Browserspiel besitzt und an einem gegenseitigen Linktausch interessiert ist, kann sich gerne bei mir melden.

Erweiterte Facebook-Integration

Sonntag, 18. April 2010

Dem Jungfrauenspiel wurde nun eine Fan-Page hinzugefügt.

@[WEBX:<FacebookFanPage shownconnections="0" />]

führt zu

image

Die dazugehörige WebControl

BTW: Heute abend startet eine neue Runde.

Stille API-Änderungen

Samstag, 17. April 2010

Facebook-Connect des FBKs funktioniert momentan nicht.

image

Der Grund: Facebook hat seine API geändert. Ohne Ankündigung und ohne Rückwärtskompatibilität.

http://forum.developers.facebook.com/viewtopic.php?pid=215690

Schade. Die momentane Lösung ist es den Source der Facebook-Bibliothek zu ändern oder einen ‘QuickFix’ zu nutzen. Die neueste Version des FBK hat diesen integriert.

Datenbankanbindung und Protokollierung des FBK

Samstag, 03. April 2010

Um die Aktionen der Spieler für spätere Protokollzwecke speichern zu können, empfiehlt sich eine SQL-Datenbank. Die Speicherung in einfachen Textdateien behindert eine schnelle Recherche und die Verwaltung der Daten.

Aus diesem Grund habe ich dem FBK ein flexibles SQL-Interface hinzugefügt. Es kann sich an jedem beliebigen ADO.Net-Provider (SQL Server, MySQL, PostgreSQL, etc) anhängen. Da eine Voraussetzung des FBK die Fähigkeit zum XCopy-Deployment war, musste auch eine eingebettete SQL-Datenbank hinzugefügt werden.

Hier habe ich mich für System.Data.SQLite entschieden. Diese OpenSource-Datenbank ist eine Mischung aus nativen C-Code und verwaltetem C#-Code. Da nativer Code prozessorabhängig ist, existieren für jeden Prozessor verschiedene Assemblies.

Ein kleines Plugin ermittelt nun zum Start des FBK den Prozessortyp und kopiert das richtige Assembly an die richtige Stelle.

SQL-Konfiguration

Die Konfiguration der SQL-Anbindung ist zweistufig gestaltet.

  1. Die möglichen Datenbankverbindungen werden im Konfigurationsteil der Datenbank festgelegt. Über den Namen und dem zu nutzenden Typ, wird der ADO.Net Provider ausgewählt. Der ConnectionString definiert die Verbindung zur jeweiligen Datenbank.
  2. Die Konfiguration des jeweiligen Plugin referenziert nun auf den Namen der Datenbankverbindung. So kann eine Datenbankverbindung von mehreren Plugins verwendet werden und auch geschlossen verändert werden.

Das DetailedLog überprüft zu Beginn ob bereits die Tabellenstruktur existiert und erstellt gegebenenfalls die notwendigen Tabellen. In der momentanen Version wird nur der Start des FBK protokolliert. Damit ist der FBK im Falle einer SQLite-Konfiguration vollständig XCopy-Deployment fähig.

In den nächsten Wochen sollen die verschiedenen Spielereignisse abgefangen und protokolliert werden.

Die neueste Version ist auch unter http://depon.net/downloads/fbk.zip verfügbar.

Kurzpräsentation FBK

Dienstag, 30. März 2010

Da ich den FBK in den nächsten Tagen einem etwas breiteren Publikum vorstellen möchte, habe ich eine weitere Kurzpräsentation erzeugt. Diese enthält in der ersten Versionen einen kurzen Überblick über ein paar Eigenschaften des flexiblen Browserspielkerns

Zum PDF-Dokument

Insbesondere möchte ich die Einstiegshürde verringern und ein paar Materialien zur Hand haben, wenn ich einem Interessenten den FBK vorstellen möchte.

Kompilieren, Verpacken und Hochladen

Montag, 29. März 2010

Mit Hilfe folgenden PowerShell-Skriptes kann ich nun den FBK kompilieren, verpacken und auf den Webspace hochladen. Leider gibt es in PowerShell keine funktionierende ZIP-Klasse, so dass ich hier auf 7-Zip zurückgreife:

msbuild FBK.sln /property:Configuration=Release

Remove-Item Deliverable -Force -Recurse
New-Item -type directory -f Deliverable

Copy-Item -Recurse FBK/src/bin/Release/ Deliverable/

& ‘C:/Program Files/7-Zip/7z.exe’ a Deliverable/Release.zip ./Deliverable/Release/

Write-Host "Benutzername: " -NoNewline
$user = Read-Host
Write-Host "Kennwort: " -NoNewline
$password = Read-Host
$currentDirectory = (Get-Item .).ToString()
$File = "$currentDirectory/Deliverable/Release.zip"
$ftp = "ftp://depon.net/htdocs/www.depon.net/downloads/fbk.zip"
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$password)

$uri = New-Object System.Uri($ftp)
"Uploading $File…"
$webclient.UploadFile($uri, $File)

Das Skript besteht im Prinzip aus vier Teilen:

  1. Mit Hilfe von msbuild wird die VisualStudio-Solution als Release kompiliert.
  2. Danach finden ein paar Umkopieraktionen statt
  3. Über das Kommandozeilen-Interface von 7-Zip wird das Release-Verzeichnis gezippt. Im späteren Schritt werde ich vermutlich auf die Ionic-Zip-Library zurückgreifen.
  4. Nach Abfrage der Kenndaten wird mit Hilfe der WebClient-Klasse das Zip auf den FTP-Webserver hochgeladen. Hier ist es auch schade, dass es kein PowerShell-Skript für den FTP-Upload gibt.

Mit einem Server-‘Gegenskript’ werde ich in Zukunft eine bestehende FBK-Instanz beenden, das ZIP-Archiv herunterladen, entpacken, an die richtige Stelle legen und das Spiel starten. Damit lassen sich die Deployment-Zeiten auf ein minimales Reduzieren.

image

Enzyklopädie geht voran

Mittwoch, 24. März 2010

image

Die linke Navigation wird ebenfalls per AJAX aus folgender Xml-Datei aufgebaut:

<?xml version="1.0" encoding="utf-8" ?>
<toc>
  <entry url="encyclopedia:///start" title="Start" />
  <folder title="Forschungen">
    <entry url="encyclopedia:///researches/fountainofyouth" title="Jungbrunnen" />
    <entry url="encyclopedia:///researches/flying" title="Fliegerei" />

    <entry url="encyclopedia:///researches/education" title="Ausbildung" />
    <entry url="encyclopedia:///researches/flying" title="Fliegerei" />
  </folder>

</toc>

Der Inhalt der Datei selbst sieht folgendermaßen aus:

<?xml version="1.0" encoding="utf-8" ?>
<document title="Brauereiwesen" folder="/researches">
  <h1>Das Brauereiwesen</h1>
  <p>
    Diese Forschung erhöht die Produktion Eurer
    <a href="encyclopedia:///buildings/brewery">Brauereien</a>.
  </p>
</document>

Das Enzyklopädie-Plougin liest diese Dokumente beim Start des FBK ein und wandelt die Encyclopedia-Links automatisch in das korrekte JavaScript um. Diese Art des Parsers möchte ich in Zukunft auch auf alle Links erweitern, die irgendwie im Spiel auftauchen.

Dazu ist aber eine neue Parser-Engine notwendig.

Enzyklopädie im Jungfrauenspiel

Mittwoch, 17. März 2010

In der aktuellen Entwicklungsversion des Jungfrauenspiels wird momentan eine Möglichkeit zur Einbindung von Spielerklärungen und Kommentaren eingebaut.

image

Die Anzeige und das Holen der Inhalte wird über AJAX gesteuert, so dass ein Öffnen und Schließen der Spielbeschreibungen ohne Unterbrechung des Spielflusses möglich ist.

Da die Enzyklopädienkomponente als Plugin eingebunden wird, ist sie danach auch im Spiel Another Spacegame verfügbar,

FBK nun OpenSource unter AGPL-Lizenz über BitBucket

Montag, 22. Februar 2010

Die Quellen des Spieles Another Spacegame sind nun freigegeben worden.

Dabei wurden die ‘Troups’ in ‘Troops’ umbenannt, sämtliche Namensräume wurden neugeordnet, unnötig geteilte Assemblies wieder zusammengeführt und das Ganze auch unter BitBucket veröffentlicht. All dies hat den Nachteil, dass die alten Spielstände nicht mehr ladbar sind.

Der komplette Sourcecode ist unter http://bitbucket.org/mbrenn/another-spacegame-public/ verfügbar. Es nutzt Subrepositories, die erst ab der HG-Version 1.3 oder größer genutzt werden.

Um den Quellcode kompilieren zu können, ist die Installation der MSBuild Community Tasks erforderlich.

Bei installiertem HG kann der komplette Quellcode folgendermaßen heruntergeladen werden:

hg clone https://mbrenn@bitbucket.org/mbrenn/another-spacegame-public/

Nach einigen Minuten ist der komplette Quellcode heruntergeladen:

destination directory: another-spacegame-public
requesting all changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 5 changes to 5 files
updating to branch default
pulling subrepo src\FBK
requesting all changes
adding changesets
adding manifests
adding file changes
added 163 changesets with 716 changes to 414 files
pulling subrepo src\BurnSystems.Parser
requesting all changes
adding changesets
adding manifests
adding file changes
added 39 changesets with 114 changes to 43 files
pulling subrepo src\BurnSystems.FBK
requesting all changes
adding changesets
adding manifests
adding file changes
added 1618 changesets with 11866 changes to 5571 files
pulling subrepo src\BurnSystems
requesting all changes
adding changesets
adding manifests
adding file changes
added 132 changesets with 441 changes to 155 files
pulling subrepo src\BurnSystems.BlockStorage
requesting all changes
adding changesets
adding manifests
adding file changes
added 22 changesets with 53 changes to 28 files
pulling subrepo src\BurnSystems.BGE.Fighting
requesting all changes
adding changesets
adding manifests
adding file changes
added 22 changesets with 96 changes to 51 files
5 files updated, 0 files merged, 0 files removed, 0 files unresolved

Das Kompilat ist auch direkt unter http://depon.net/downloads/anotherspacegame.zip verfügbar.

Dashboard für das Jungfrauenspiel

Sonntag, 17. Januar 2010

image
(Klick mich)

Das Jungfrauenspiel hat ein größeres Update erhalten. In diesem Update wurde da sogenannte Dashboard eingeführt, wie man es auch aus Facebook oder anderen Portalen kennt.

Im Großen und Ganzen ist es folgendermaßen technisch gelöst:

  • Es gibt verschiedene Infogeneratoren. Diese registrieren sich beim Start des Jungfrauenspiels
  • Jede dieser Infogeneratoren wird auf alle Informationen abgefragt. Da der FBK zu 100% im RAM läuft, geht dieser Vorgang schnell.
  • Die Dashboard-Logik führt verschiedene Operationen aus um die Einträge zu filtern, zu sortieren und nur eine begrenzte Anzahl von Einträgen auszugeben.
  • Ist all dies abgeschlossen, erhält der benutzerdefinierte Vorlage die Dashboard-Objekte und wandelt sie in Html-Code um.

Ein paar Quellcode-Schnipsel des schwarzen Bretts des Allianzsystem (Das Allianzsystem ist als reines Plugin konzipiert):

1) Registrierung von einem neuen Dashboard-Item

/// <summary>
/// This method is called, when logic core will be started
/// </summary>
/// <param name="logic">Logicinterface which created this state</param>
/// <param name="session">Current logic session</param>
public void Start(ILogic logic, ILogicSession session)
{

[…]

    // Gets the dashboard state
    var dashboardState = logic.GetLogicState<IDashboardState>();
    var source = new AllianceDashboardItems();           
    dashboardState.AddSource(source);

}

2) Erzeugung von Dashboard-Items (in der AllianceDashboardItems-Klasse)

/// <summary>
/// Gets the dashboarditems by the dashboard logic
/// </summary>
/// <param name="dashboardLogic">Used logic of the dashboard</param>
/// <returns>Enumeration of items</returns>
private IEnumerable<DashboardItem> GetDashboardItems(
    IDashboardLogic dashboardLogic)
{
    var allianceSystem =
        dashboardLogic.LogicSession.GetLogicHandler<IAllianceSystem>();
    var languageHandler =
        dashboardLogic.LogicSession.GetLogicHandler<ILanguageHandler>();
    var playerId = dashboardLogic.PlayerLogic.PlayerId;

    foreach (var alliance in allianceSystem.GetAlliancesOfPlayer(
        playerId))
    {
        foreach (var item in alliance.GetPinboardEntries(playerId)
            .Select(x => new DashboardItem(
                languageHandler["/dashboard/alliance_pinboard/title"],
                x.Content,
                "alliance_pinboard",
                x.Created)))
        {
            yield return item;
        }               
    }
}

3) Sammlung von Dashboard-Items

/// <summary>
/// Gets the dashboarditems of the player
/// </summary>
/// <param name="amount">Number of items to be returned</param>
/// <returns>Enumeration of Dashboarditems</returns>
public IEnumerable<DashboardItem> GetDashboardItems(int amount)
{

    // Now add items of all sources 
    return messages
        .Union(
            this.LogicState.Sources.SelectMany(x => x.Source(this)))
        .OrderByDescending(x => x.Created)
        .ThenBy(x=>x.Title)
        .Take(amount);
}