222 lines
10 KiB
TeX
222 lines
10 KiB
TeX
\documentclass[12pt,a4paper,parskip=half]{scrartcl}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[ngerman]{babel}
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage{graphicx}
|
|
\usepackage[colorlinks=true, linkcolor=black]{hyperref}
|
|
|
|
\title{Ringstats Dokumentation}
|
|
\author{Justin Rost \\ 7208260
|
|
\and
|
|
Michelle Reichelt \\ 7216628
|
|
\and
|
|
Yasin Ergün \\ 7215184
|
|
}
|
|
|
|
\date{\today}
|
|
|
|
\begin{document}
|
|
|
|
\maketitle
|
|
\tableofcontents
|
|
\newpage
|
|
|
|
|
|
%Viele PC-Spieler suchen stetig nach neuen Tools um ihr Spielerlebnis zu optimieren und ihre Echtzeit Statistiken besser im Blick zu haben. Daher haben wir
|
|
% Die Einleitung ist bla.
|
|
% Fliessender uebergang ins Fazit
|
|
|
|
\newpage
|
|
|
|
\section{Anwendungsszenario}
|
|
% Das nehmen wir direkt aus dem Proposal und schreiben es min eine seite lang.
|
|
In diesem Kapitel zeigen wir, worum es bei Ringstats eigentlich geht und in welchen Situationen die Anwendung dem Spieler im Spiel weiterhilft.
|
|
|
|
% Ein Spieler startet einen Bosskampf und kann in einem kleinen Fenster sehen, was für Resistenzen dieser Boss hat und welche Fähigkeiten er am häufigsten benutzt.
|
|
|
|
% Spielerdaten werden live gespeichert und an den Server gesendet, damit der Spieler direkt sehen kann, welche Truhen und Sammelobjekte in der Nähe sind.
|
|
|
|
% Die Gebiets-Checkliste zeigt bei einem Gebietswechsel an, welche Aufgaben der Spieler in dem neuen Gebiet hat.
|
|
|
|
|
|
\subsection{Projektidee und Zielsetzung}
|
|
Die Idee von Ringstats ist die Bereitstellung einer Schnittstelle zwischen dem aktiven Spiel und einer Datenbank mit hilfreichen Spielinformationen.
|
|
Während des Spiels erfasst die Desktop Anwendung in Echtzeit Parameter des Spielers und schickt diese an die Datenbank. Zu diesen Parametern zählen z.B. die aktuelle Position oder Ausrüstung.
|
|
Auf Grundlage dieser Live Daten stellt unsere Anwendung dann hilfreiche Informationen über Bosse oder Gegner in der Region des Spielers bereit. Zudem kann auch eine regionenbasierte
|
|
Checkliste angezeigt werden, auf der sich weitere benutzerdefinierte Aufgaben befinden. All diese Informationen werden auf In-Game Panels eingeblendet.
|
|
|
|
|
|
\subsection{Kernfunktionen und Anwendungsfälle}
|
|
Um den Nutzen von Ringstats zu verstehen, haben wir folgende Kernfunktionen definiert:
|
|
Die wichtigste Funktion ist das Erfassen der Spielerdaten in Echtzeit. Während der Spieler spielt, liest die Desktop Anwendung laufend aus,
|
|
wo der Spieler gerade steht, wie viel Leben er hat, wie schnell er ist und was er ausgerüstet hat. Diese Daten werden direkt an die Datenbank geschickt,
|
|
damit immer der aktuelle Stand vorliegt.
|
|
Sobald der Spieler einen Gegner oder Boss anvisiert, blendet die Anwendung ein kleines Panel im Spiel ein.
|
|
Darin sieht der Spieler die Resistenzen des Gegners und welche Fähigkeiten dieser am häufigsten benutzt.
|
|
So weiß man direkt, worauf man sich einstellen muss.
|
|
Zusätzlich gibt es eine Checkliste, die sich nach der Region richtet, in der sich der Spieler gerade befindet.
|
|
Diese lässt sich mit einem Hotkey ein und ausblenden. Auf der Liste stehen zum Beispiel Items, Dungeons und Bosse.
|
|
Der Spieler kann die Einträge filtern und selbst festlegen, ob sie automatisch abgehakt werden, sobald eine Bedingung erfüllt ist, oder ob er das lieber von Hand macht.
|
|
Alle diese Daten landen nicht nur im Spiel, sondern sind gleichzeitig über die Internetseite abrufbar.
|
|
Der Spieler meldet sich auf der Seite an und verbindet sich mit der Desktop Anwendung. Dann kann er seine Informationen auch im Browser einsehen.
|
|
|
|
|
|
Damit das Ganze einen Sinn ergibt, hier ein paar typische Situationen aus dem Spiel:
|
|
Der Spieler startet einen Bosskampf. In einem kleinen Fenster sieht er sofort, welche Resistenzen der Boss hat und welche Fähigkeiten am häufigsten kommen.\\
|
|
Während der Spieler durch ein Gebiet läuft, werden seine Daten an den Server geschickt. Dadurch sieht er direkt, welche Truhen und Sammelobjekte in seiner Nähe sind.\\
|
|
Wechselt der Spieler in ein neues Gebiet, zeigt die Checkliste an, welche Aufgaben in diesem Gebiet noch offen sind.
|
|
|
|
\newpage
|
|
|
|
\section{Dokumentation der Datenmodellierung}
|
|
In diesem Kapitel schauen wir uns an, wie wir die Daten von Ringstats aufbauen und wie das Ganze in den verschiedenen Datenbanken aussieht.
|
|
|
|
\subsection{Das konzeptionelle ER-Modell}
|
|
Die komplexe Struktur der Spielwelt bilden wir mit einem Klassischen ER-Modell ab.
|
|
Das Modell veranschaulicht,
|
|
wie der Spieler (Player) über seine Ausrüstung (Gear)
|
|
mit Waffen (Weapon), Rüstungen (Armor) oder Talismanen (Talisman) etc. verbunden ist.
|
|
Fast alle dieser Gegenstände haben einen Typen (Type) und Effekte (Item\_Effect).
|
|
Auch ist der Spieler (Player) immer in einer Region (Region), in der Gegenstände (Item) und Gegner (Enemy) aufzufinden sind.
|
|
|
|
Das Modell dient in den folgenden Kapiteln als Grundlage für die Modellierung und den Vergleich.
|
|
|
|
\begin{figure}[h]
|
|
\centering
|
|
\includegraphics[width=0.6\textwidth]{assets/er-modell}
|
|
\caption{Konzeptionelles ER-Modell}
|
|
\label{fig:er-modell}
|
|
\end{figure}
|
|
\newpage
|
|
|
|
|
|
\subsection{Key-Value-Modellierung}
|
|
Key-Value Datenbanken sind eine einfache und schnelle Lösung für die Speicherung von unstrukturierten Daten.
|
|
Wir verwenden in diesem Kapitel Redis.
|
|
|
|
\subsubsection*{Schlüsselaufbau}
|
|
Keys sind Strings, die eindeutig zum identifizieren von Objekten verwendet werden. Diese starten immer mit dem Namen der Entität, gefolgt von einem Doppelpunkt und der ID des Objekts.
|
|
Dabei werden alle Entitäten als Redis-Datentyp Hash Map gespeichert um die Daten effizient zu verwalten.
|
|
|
|
Anhand dieses Systems bilden wir die Schlüssel wie folgt ab:
|
|
|
|
% \paragraph{player}
|
|
% player:{id} = { id, name, health, stamina, focus\_points, level, experience, region\_id}
|
|
% player:{id}:weapon = { item\_id }
|
|
% player:{id}:shield = { item\_id }
|
|
% player:{id}:armor = { item:1, item:2, ... }
|
|
% player:{id}:talisman = { item:1, item:2, ... }
|
|
|
|
% player:1 = { 1, Jonas, 100, 100, 10, 1, 0, 1 }
|
|
|
|
% \paragraph{region}
|
|
% region:{id} = { id, name}
|
|
% region:{id}:items = { item:1, item:2, ... }
|
|
% region:{id}:enemies = { enemy:1, enemy:2, ... }
|
|
|
|
% region:1 = { 1, limgrave }
|
|
% region:1:items = [1, 19, 248, 2385]
|
|
% region:1:enemies = [1, 245, 1234, 11211]
|
|
|
|
% \paragraph{item}
|
|
% item:{id} = { id, name, gear\_type, gear\_id, region\_id }
|
|
% item:82347 = { 82347, coolestalisman, talisman, 1, 1 }
|
|
|
|
% item\_effect:{id} = { id, description }
|
|
% item\_effect:1 = { 1, Du hast mehr Ausdauer }
|
|
|
|
% talisman:{id} = { id, item\_effect\_id }
|
|
% armor:{id} = { id, item\_effect\_id, type\_id, weight, physical\_defense, magical\_defense}
|
|
% weapon:{id} = { id, item\_effect\_id, type\_id, weight, damage }
|
|
% shield:{id} = { id , item\_effect\_id , type\_id, weight, physical\_defense, magical\_defense, guard, damage }
|
|
|
|
% type:{id} = { id, name }
|
|
% type:1 = { 1, Dolch }
|
|
|
|
% \paragraph{enemy}
|
|
% enemy:{id} ={id, region\_id, name, health, level, damage}
|
|
% enemy:{id}:items = { :1, item:2, ... } % dropt diese items
|
|
|
|
% enemy:1 = { 1, 1, Tree\_Sentinel, 30000, 20, 70 }
|
|
% enemy:1:items = [5, 10]
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\begin{tabular}{l l l}
|
|
\hline
|
|
\textbf{Datentyp} & \textbf{Key-Struktur} & \textbf{Attribute} \\ \hline
|
|
\texttt{HMAP} & {item\_effect:\{id\}} & id, name, value \\
|
|
\texttt{HMAP} & {item\_type:\{id\}} & id, item\_id, name \\
|
|
\\
|
|
\texttt{HMAP} & {weapon:\{id\}} & id, item\_effect\_id, item\_type\_id, weight, damage \\
|
|
\texttt{HMAP} & {armor:\{id\}} & id, item\_effect\_id, item\_type\_id, weight, defense \\
|
|
\texttt{HMAP} & {shield:\{id\}} & id, item\_effect\_id, item\_type\_id, weight, damage, defense \\
|
|
\texttt{HMAP} & {talisman:\{id\}} & id, item\_effect\_id \\
|
|
\\
|
|
\texttt{HMAP} & {item:\{id\}} & id, name, gear\_type, gear\_id, region\_id \\
|
|
\\
|
|
\texttt{HMAP} & player:\{id\} & id, name, health, stamina, level, region\_id \\
|
|
\texttt{SET} & {player:\{id\}:weapon} & item\_id \\
|
|
\texttt{STRING} & {player:\{id\}:shield} & item\_id \\
|
|
\texttt{SET} & {player:\{id\}:armor} & item\_id \\
|
|
\texttt{SET} & {player:\{id\}:talisman} & item\_id \\
|
|
\\
|
|
\texttt{HMAP} & {region:\{id\}} & id, name \\
|
|
\texttt{SET} & {region:\{id\}:items} & item\_id \\
|
|
\texttt{SET} & {region:\{id\}:enemies} & enemy\_id \\
|
|
\\
|
|
\texttt{HMAP} & enemy:\{id\} & id, name, health, level, damage \\
|
|
\texttt{SET} & enemy:\{id\}:items & item\_id \\
|
|
\texttt{SET} & enemy:\{id\}:item\_effects & item\_effect\_id \\
|
|
\hline
|
|
\end{tabular}
|
|
\caption{Übersicht der Schlüsselstrukturen in Redis}
|
|
\end{table}
|
|
\newpage
|
|
|
|
% \begin{table}[h]
|
|
% \centering
|
|
% \begin{tabular}{l l l}
|
|
% \hline
|
|
% \textbf{Datentyp} & \textbf{Key-Struktur} & \textbf{Beschreibung} \\ \hline
|
|
% SET & \texttt{player:\{id\}:gear\_list} & Liste der Gear IDs, die einem Spieler zugeordnet sind \\
|
|
% \hline
|
|
% \end{tabular}
|
|
% \caption{Übersicht der Schlüsselstrukturen in Redis}
|
|
% \end{table}
|
|
|
|
\subsection{Dokumentenorientierte Modellierung}
|
|
% Wie sieht das in z. B. MongoDB aus? Zeigt hier ein fiktives JSON-Dokument, das einen Gegner oder Spieler mit all seinen verschachtelten Eigenschaften beschreibt.
|
|
\newpage
|
|
|
|
\subsection{Graph-Datenbank-Modellierung}
|
|
% Wie sieht das in z. B. Neo4j aus? Beschreibt (oder zeichnet), wie Knoten (Player, Region) und Kanten (has_equipped, is_in) die Beziehungen darstellen.
|
|
|
|
% Wir müssen erst die datenmodellieren
|
|
% Habe bereits ein Projekt, lass das nehmen zum vergleichen nachher
|
|
% - Redis
|
|
% - MonogoDb
|
|
% - MariaDB
|
|
\newpage
|
|
|
|
\section{Vergleich der Datenmodellierung}
|
|
\subsection{Vor- und Nachteile des Key-Value-Modells}
|
|
% Vorteil: Extrem schnell für euer Live-Streaming (Lese-/Schreibzugriffe). Nachteil: Komplexe Abfragen (z.B. "Zeige mir alle Waffen mit Stärke > 20") sind schwierig.
|
|
|
|
\subsection{Vor- und Nachteile des dokumentenorientierten Modells}
|
|
% Vorteil: Alles zu einem Spieler ist in einem JSON-Dokument gebündelt. Nachteil: Redundanzen, wenn z.B. Spieldaten wie "Waffen-Typen" bei jedem Spieler gespeichert werden.
|
|
|
|
\subsection{Vor- und Nachteile des Graph-Modells}
|
|
% Vorteil: Genial, um Beziehungen abzufragen (z.B. Welcher Spieler trägt welches Item, das von welchem Boss droppt?). Nachteil: Für pures Live-Streaming von Koordinaten eher überdimensioniert.
|
|
% Siehe Dokumenatation der Datenmodellierung
|
|
\newpage
|
|
|
|
% \section{Bau der app bis zur Endpräsi}
|
|
\newpage
|
|
|
|
\section{Fazit}
|
|
% Mehr coole sachen die wir gelernt haben.
|
|
% Warum wir uns fuer dieses Datenbankmodell entschieden haben.
|
|
|
|
\end{document}
|