Browsergame Neubeginn mit APF

Hierein gehört alles, was in den übrigen Foren keinen Platz findet. // Please post here in case your topic doesn't fit enywhere else.
Antworten
Ben
Beiträge: 11
Registriert: 11.03.2012, 10:28:32

Browsergame Neubeginn mit APF

Beitrag von Ben » 11.12.2012, 20:14:06

Hallöchen,

mein Anreiz Programmierer zu werden kam aus dem Wunsch heraus ein Browsergame zu programmieren.
Ich liebe gute Websites und damit zu arbeiten. Nach diversen Praktika usw. stellte ich fest dass Fachinformatiker mein Wunschberuf ist.

Daraufhin begann ich eine Ausbildung. Leider Gottes ging das Unternehmen in die Insolvenz und ich sitze wieder auf der Couch :evil:

Nun würde ich gerne wieder die übrige Zeit bis zu einer eventuellen Übernahme oder Überbrückungsmaßnahme alleine weiterlernen bzw. das Projekt Browsergame wieder in Angriff nehmen. Da meine Kenntnisse zum Anfang recht mager waren wollte ich mich nicht zusätzlich mit Frameworks usw. auseinandersetzen, sondern direkt loslegen :D

Habe mittlerweile eingesehen, dass diese Einarbeitung doch wesentlich Zeit sparen und sowohl Teamarbeit als auch zukunftsorientierte Entwicklung fördern wird.
Daher habe ich eine Frage: Welche Tipps und Empfehlungen könnt Ihr mir auf dem Weg mitgeben?

Einsicht

Habe versucht eine gewisse Ordnung bezüglich Templates, Logik usw einzubringen. Das nimmt mir ein Framework denke ich ab.

URL zum Spiel: dfsa.de/lh

Letzter Workbench Screen (nicht ganz aktuell): http://www.abload.de/img/workbench6lk3j.png
Normalisierung mal angesehen und vermutlich einiges falsch gemacht...

Habe derzeit das Profi- und Premium-Paket: http://www.goneo.de/hosting/hosting.html

Gesamter Code bisher (ein paar Monate alt): https://www.dropbox.com/s/mvc1sfjuxm0tljx/lh.zip

Spielidee

In dem multiplayer Rollenspiel erstellt der Spieler eine oder mehrere Spielfiguren aus verschiedenen Rassen, Klassen und Geschlechtern.
Diese Spielfigur kann durch Kämpfe gegen andere Spieler und diversen Aufgaben Geld und Erfahrung erlangen um so in seinen Stufen aufzusteigen und entsprechende Ausrüstungsgegenstände zu kaufen. Dadurch wird die Spielfigur des Spielers immer stärker.

Zusätzlich werden Gilden und private Nachrichten die Kommunikation zwischen den Spielern fördern.

Mehr erspare ich Euch erst einmal :P

Guter Code

Ich erhoffe mir das hinbretzeln von gutem Code aneignen zu können.

Ich sehe jedes Feature als kleines Lernprojekt an.
Zuletzt geändert von Ben am 12.12.2012, 19:05:30, insgesamt 1-mal geändert.
...

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: Browsergame Neubeginn mit APF

Beitrag von dave » 11.12.2012, 21:19:42

Hallo Ben,

herzlich Willkommen bei uns!


Ich habe mir einfach mal die Seite sowie einige Teile des Code angesehen und muss sagen, dass das soweit gar nicht so schlecht aussieht. Es ist eine klare Linie erkennbar. Diese kannst du übrigens auch mit dem APF in dieser Form umsetzen.

Persönlich sagen mir Browsergames nicht zu. Ich habe sehr viele Browsergames bereits angetestet und als einziges spiele ich zurzeit nebenher Anno Online in der Beta. Einige Browsergames sind anhand der Flash-Techniken ja sogar schon richtig gut, aber die langen Wartezeiten stören mich massiv.
Welche Tipps und Empfehlungen könnt Ihr mir auf dem Weg mitgeben?
Mir ging es vor 2,5 Jahren auch so. Ich habe alles völlig ohne Framework entwickelt, jedoch waren dort dann auch jede Menge Sicherheits-Probleme auffindbar, die auch in grossem Umfang immer wieder genutzt wurden und mir einigen Ärger einbrachten.
Also habe ich mich auf die Suche nach einem Framework mit sehr gutem Support umgesehen. Und das habe ich gefunden: Hier! Die Unterstützung sowie die Features des APF sind grossartig. Und auch Fragen und Probleme ausserhalb des Frameworks werden immer äusserst kompetent beantwortet.

Das hat mir auf meinem Lernweg sehr stark weiter geholfen. Ich habe hauptberuflich nichts mit Programmierung mit Hochsprachen am Hut. Ich arbeite mit speicherprogrammierbaren Steuerungen (SPS) - halte Anlagen und Maschinen am Laufen und darf hin und wieder auch mal eine Neuinstallation vornehmen oder begleiten. Nebenher erstelle ich Webseiten.

Teamfähigkeit: Es gibt immer wieder Teile, die am APF weiter entwickelt werden wollen (Roadmap) und dafür kann sich jeder melden, der Zeit und Interesse daran hat. Oft werkelt man dann auch zu zweit daran und tauscht sich über das Forum oder via Skype aus.

Ich bin mittlerweile sehr stolz, einige Teile dem APF beigesteuert zu haben und das wird in Zukunft auch so weiter gehen. Ich bin stolzer User des APF, es ist grossartig (aus meiner Sicht).

Scheue dich also nicht und löchere uns mit deinen Fragen - der Anfang mag zwar etwas kompliziert sein, wir arbeiten aber auch an einer vollständigen Dokumentation. Kommt Zeit, kommt Rat! ;)

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Browsergame Neubeginn mit APF

Beitrag von jwlighting » 11.12.2012, 21:45:55

Hallo Ben,

wie weit bist du denn in deiner Ausbildung zum Fachinformatiker gekommen?

Ich sehe ganz klar, das du für bestimmte Themen ein Bewusstsein hast, die (leider) manchem Hobby-Programmierer schwer zu vermitteln sind.
Das geht von Usability über die Trennung von Inhalt und Style (-> CSS) bzw. Daten, Ansicht und Logik ((H)MVC) bis hin zur Wiederverwendbarkeit oder Sicherheit.

Mir hat es sehr geholfen, nicht nur aus dem Internet zu lernen, sondern auch aus Büchern. Zum Thema Softwaredesign in PHP find eich sehr empfehlenswert:
http://www.oreilly.de/catalog/phpdesignpatger/
Dort sind verschiedene Entwurfsmuster beschrieben und von allen Seiten verständlich durchleuchtet. Das hilft einem, guten Code zu schreiben, ein Optimum zwischen Performance, Wiederverwendbarkeit und Erweiterbarkeit zu erreichen.

Einige Entwurfsmuster findest du im APF bereits umgesetzt - es lohnt sich wirklich, sich damit mal auseinanderzusetzen - auch für das Verständnis des APF, wenn auch das dafür nicht zwingend notwendig ist.

Guck dir das APF an, nimm dir Zeit, frag uns Löcher in den Bauch. Viele Hilfen findest du aber auch schon im Wiki und der Komponenten-Dokumentation.

Lucky Coding :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Browsergame Neubeginn mit APF

Beitrag von Megger » 11.12.2012, 23:56:12

Ich mache zwar nicht gerne Eigenwerbung, aber du kannst ja mal in meine Signatur schauen! Ich erstelle keinesfalls regelmäßig Artikel, aber ich hoffe doch, dass diese trotzdem interessant sind!

Ich vermute Fachinformatiker Anwendungsentwicklung?
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Ben
Beiträge: 11
Registriert: 11.03.2012, 10:28:32

Re: Browsergame Neubeginn mit APF

Beitrag von Ben » 15.12.2012, 10:01:22

Hey,

janz genau - der Anwendungsentwickler.
Sagt mal habe gelesen dass die kommerzielle Nutzung nicht gestattet ist.

Bei einem Browsergame ist es allerdings schon üblich einige Vorteile gegen Echtgeld zu erwerben.
Wenn Leuten ein Spiel gefält sind recht viele deutsche bereit Geld dafür auszugeben Ziele schneller zu erreichen (also Zeitvorteile).

Scheidet das APF für mich aus, wenn solche Inhalte angeboten werden? Herr Dr.e?
...

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: Browsergame Neubeginn mit APF

Beitrag von Coach83 » 15.12.2012, 11:08:07

Herr Doktor :lol:

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Browsergame Neubeginn mit APF

Beitrag von dr.e. » 15.12.2012, 13:45:47

Hi Ben,

sorry, ich war in den letzten beiden Tagen mehr oder weniger aus dem Gefecht gesetzt.
Sagt mal habe gelesen dass die kommerzielle Nutzung nicht gestattet ist.
Ich weiß nicht wo das steht, es ist jedenfalls falsch! :) Das APF ist unter LGPL lizensiert was eine kommerzielle Nutzung explizit einschließt/erlaubt. Ein Hinweis findet sich beispielsweise im Wiki unter http://wiki.adventure-php-framework.org ... nwendungen.

Die LGPL regelt ausschließlich den Code des Frameworks, nicht deines darauf aufsetztenden Werkes. Änderst du Code des Frameworks, muss dieser an die Community zurückgespielt werden, geht es nur um deinen Browsergame-Code so ist die LGPL aussen vor.

Nutze das APF daher gerne für ein kommerzielles Projekt! :)
Viele Grüße,
Christian

Ben
Beiträge: 11
Registriert: 11.03.2012, 10:28:32

Re: Browsergame Neubeginn mit APF

Beitrag von Ben » 17.12.2012, 09:49:35

Alles klar. War ein Missverständnis :oops:

Könnt Ihr mir noch verraten wo man etwas über die Fehlermeldungen in Erfahrungen bringen kann?
Z.B. was mit der Error-ID und/oder Number anstellbar ist.
Error-ID:
41ec21ff1c38a9c63e38d337726e9871
Message:
Argument 1 passed to UmgtManager::saveUser() must be an instance of UmgtUser, instance of GenericDomainObject given, called in /.../apps/ben/bg/modules/register/pres/documentcontroller/RegisterController.php on line 26 and defined
Number:
4096
File:
/.../apps/modules/usermanagement/biz/UmgtManager.php
Line:
345
Zuletzt geändert von Ben am 17.12.2012, 18:41:43, insgesamt 2-mal geändert.
...

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: Browsergame Neubeginn mit APF

Beitrag von Coach83 » 17.12.2012, 16:06:03

Du musst das User Model vorher einbinden also quasi ein

Code: Alles auswählen

import('modules::usermanagement::biz::model','User');

Ben
Beiträge: 11
Registriert: 11.03.2012, 10:28:32

Re: Browsergame Neubeginn mit APF

Beitrag von Ben » 27.03.2013, 16:07:29

Hoi,

ich glaube mit dem Erstellen der Datenbank und dessen Normalisierung kommt ein großer Batzen auf mich zu. Ich habe etwas Angst den falschen Typ (isam, inno) zu wählen, Verknüpfungen (Keys) falsch zu setzen und nach ein paar Monaten alles komplett neu einrichten zu müssen. Ich sehe ein vorher ein paar Tage zu investieren ohne pMA überhaupt anschauen zu können. Ich hoffe Ihr könnt mir dabei einen Schubs nach vorn geben, wenn's mal hakt :)

Als erstes muss man sich wohl im klaren darüber sein, welche Spielinhalte überhaupt gespeichert werden müssen.


Spielinhalte grob beschrieben:
  • Anmeldung
Registrierung eines Benutzeraccounts, welcher sich anschließend per Benutzername oder E-Mail einloggen können soll.
Dieser Benutzeraccount wird weitere Charakter"accounts" erstellen können, mit welchen sich erneut "eingeloggt" wird.
Zusätzlich kann der Benutzeraccount

  • Charakter
Der tatsächliche "Spielaccount", welcher, unabhängig von anderen Spielaccount, gespielt werden kann.
Gehört also einem Benutzeraccount, besitzt aber ein eigenes Inventar (Geld, Gegenstände), eigenen Fortschritt (Aufgaben, Attribute, Fähigkeiten).

  • Klassen/Rassen
Klassen (Kämpfer, Magier, ...) und Rassen (Mensch, Elf) werden bei der Erstellung eines Spielaccounts gewählt und entscheiden somit über die Start-Attribute und Fähigkeiten sowie nutzbare Gegenstände.
  • Währungen
Wird genutzt um Gegenstände zu kaufen/verkaufen, Häuser der Gilde zu erweitern, Trainingseinheiten für Attribute zu finanzieren.
100 Bronze -> 1 Silber. 100 Silber -> 1 Gold. Zusätzlich eine Premium-Währung.

  • Gilden
Eine Gilde wird von einem Spielaccount erstellt. Andere Spielaccounts können eingeladen werden. Innerhalb der Gilde gibt es verschiedene Rechte/Rollen.
Es gibt "Häuser", welche durch die Währungen ausgebaut werden können. Dadurch ergeben sich diverse Boni für die Mitglieder einer Gilde (mehr Erfahrung/Gold).

  • Dungeons
Solo-Dungeons können von einem Spielaccount erforscht werden. Am Ende findet ein Kampf gegen diverse Gegner (Monster) statt. Gewinnt der Spieler wird der jeweils nächste Dungeon freigeschaltet.
Multi-Dungeon können von Mitgliedern einer Gilde erforscht werden. Hierbei treten die Mitglieder in einer Reihenfolge gegen die Monster an. Verliert ein Mitglied tritt das nächste an. Sieg = nächste Dungeon.

  • Gegenstände
Gegenstände weisen diverse Attribute auf (Angriff, Verteidigung, Boni) und werden den Attributen des Spielaccounts "gutgeschrieben"/addiert.
Sie können bei besiegten Monstern, erledigten Aufgaben und Händlern gefunden/gekauft werden und anschließend, aus dem Inventar heraus, ausgerüstet werden.
Gegenstände aus einem "Set" bieten zusätzliche Boni (Stärke, Gesundheit, Geschicklichkeit), wenn mehrere Set-Gegenstände (z.B. 3 von 5) gleichzeitig ausgerüstet sind.

  • Monster
Monster sind im Grunde wie Charaktere nur nicht spielergesteuert. Sie lassen, sofern besiegt, zufällig Gegenstände "fallen" - ins Inventar der Spielers.

  • Nicht-Spieler-Charaktere (NPCs)
Dienen der Interaktion mit dem Spieler. Sie haben vorgefertigte Dialoge und je nach Art (z.B. Händler) nur "Zugriff" auf bestimmte Gegenstände.

  • Aufgaben
Aufgaben werden von NPCs erteilt. Zufällige Aufgaben werden auf Basis der Spielaccount-Stufe generiert und Hauptaufgaben stehen zur Verfügung, sobald die vorige Aufgabe abgeschlossen wurde.
Dafür muss festgelegt werden, bei welchem NPC die nächste Aufgabe zu erhalten ist, ob ein Spieler den Text bereits gelesen hat usw.

  • Attribute
Sie legen fest wie viel Schaden ein Spieler oder Monster austeilt oder wie viel Schaden der Rüstungswert negiert. Wie viel Leben ein Spieler maximal hat.
Ebenfalls dienen Attribute als Voraussetzungen für gewissen Gegenstände.

  • Kommunikation
Spielaccounts haben ein eigenes Postfach und können Nachrichten an andere Spielaccounts schicken. Gilden besitzen einen Chat.

  • Arena
In der Arena treten Spieler gegeneinander an. Es kann im Grunde jeder Spieler angegriffen werden, jedoch nimmt dies Einfluss auf die eventuelle Belohnung.
Zusätzlich dazu besteht eine Rangliste für Spieler (Spielerpunkte durch Kämpfe) sowie Gilden (Gildenpunkte durch Kämpfe).

  • Achievements
Benutzeraccounts (nicht Spielaccounts) können mit ihren Spielaccounts Achievements/Errungenschaften erwerden, welche in Attribut-Boni und Errungenschafts-Punkte vergütet wird.
Somit muss ein neuer Spieleraccount nicht wieder alle kleinen Errungenschaften freischalten und hat, aufgrund der Attribut-Boni, einen einfacheren Einstieg.



So ich denke das war es im groben. Daraus ergeben sich bestimmt viele Möglichkeiten eine Datenbankstruktur aufzubauen. Ich werde im nächsten Beitrag meine ersten Gehversuche demonstrieren! :)
...

Ben
Beiträge: 11
Registriert: 11.03.2012, 10:28:32

Re: Browsergame Neubeginn mit APF

Beitrag von Ben » 27.03.2013, 16:32:32

Nice, seit wann kann man im pMA denn die Spalten per Drag&Drop ziehen und somit neu sortieren? :lol:

Nach Normalisierung sollen Werte nur einmal vorkommen und entsprechend oft referenziert werden.
Somit kommt es zu äußerst vielen kleinen Datensätzen, richtig?

Ich habe an alle Namen von Spalten immer dazu geschrieben worum es überhaupt geht.
So wird aus ID mal characterID oder auch itemID oder monsterID. Ist das schlecht?

Fangen wir mal an...

Code: Alles auswählen

-- phpMyAdmin SQL Dump
-- version 3.5.5
-- http://www.phpmyadmin.net
--
-- Host: 
-- Erstellungszeit: 27. Mrz 2013 um 15:29
-- Server Version: 
-- PHP-Version: 

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Datenbank: ``
--

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `attributes`
--

CREATE TABLE IF NOT EXISTS `attributes` (
  `attributID` int(2) unsigned NOT NULL AUTO_INCREMENT,
  `attributName` varchar(25) NOT NULL,
  `attributDescription` text NOT NULL,
  PRIMARY KEY (`attributID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=42 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `characters`
--

CREATE TABLE IF NOT EXISTS `characters` (
  `characterID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `userID` int(11) unsigned NOT NULL,
  `raceID` int(2) unsigned NOT NULL,
  `genderID` int(1) unsigned NOT NULL DEFAULT '0',
  `classID` int(2) unsigned NOT NULL,
  `levelID` int(3) unsigned NOT NULL DEFAULT '1',
  `characterName` varchar(25) NOT NULL,
  `experiencePoints` int(11) unsigned NOT NULL DEFAULT '0',
  `questDuration` int(11) NOT NULL DEFAULT '0',
  `creationDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`characterID`),
  KEY `userID` (`userID`),
  KEY `levelID` (`levelID`),
  KEY `raceID` (`raceID`),
  KEY `classID` (`classID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=26 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `character_attributes`
--

CREATE TABLE IF NOT EXISTS `character_attributes` (
  `characterID` int(11) unsigned NOT NULL,
  `attributID` int(2) unsigned NOT NULL,
  `attributAmount` int(11) unsigned NOT NULL,
  KEY `characterID` (`characterID`),
  KEY `attributID` (`attributID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `character_currencies`
--

CREATE TABLE IF NOT EXISTS `character_currencies` (
  `currencyID` int(1) unsigned NOT NULL,
  `characterID` int(11) unsigned NOT NULL,
  `currencyAmount` int(11) unsigned NOT NULL DEFAULT '0',
  KEY `characterID` (`characterID`),
  KEY `currencyID` (`currencyID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `character_levels`
--

CREATE TABLE IF NOT EXISTS `character_levels` (
  `levelID` int(3) unsigned NOT NULL,
  `neededExperiencePoints` int(11) unsigned NOT NULL,
  PRIMARY KEY (`levelID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `character_quests`
--

CREATE TABLE IF NOT EXISTS `character_quests` (
  `characterID` int(11) NOT NULL,
  `questID` int(11) NOT NULL,
  `questMoney` int(11) NOT NULL,
  `questExperience` int(11) NOT NULL,
  `questTime` int(11) unsigned NOT NULL,
  KEY `questID` (`questID`),
  KEY `characterID` (`characterID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `classes`
--

CREATE TABLE IF NOT EXISTS `classes` (
  `classID` int(1) unsigned NOT NULL AUTO_INCREMENT,
  `className` varchar(25) NOT NULL,
  `classDescription` text NOT NULL,
  PRIMARY KEY (`classID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `class_attributes`
--

CREATE TABLE IF NOT EXISTS `class_attributes` (
  `classID` int(1) unsigned NOT NULL,
  `attributID` int(2) unsigned NOT NULL,
  `attributAmount` int(11) unsigned NOT NULL,
  KEY `classID` (`classID`),
  KEY `attributID` (`attributID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `currencies`
--

CREATE TABLE IF NOT EXISTS `currencies` (
  `currencyID` int(2) unsigned NOT NULL AUTO_INCREMENT,
  `currencyName` varchar(50) NOT NULL,
  `currencyRate` int(3) unsigned NOT NULL,
  PRIMARY KEY (`currencyID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `guilds`
--

CREATE TABLE IF NOT EXISTS `guilds` (
  `guildID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `guildName` varchar(25) NOT NULL,
  `guildDescription` text NOT NULL,
  `creationDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`guildID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `guild_members`
--

CREATE TABLE IF NOT EXISTS `guild_members` (
  `guildID` int(11) unsigned NOT NULL,
  `characterID` int(11) unsigned NOT NULL,
  `guildRankID` int(1) unsigned NOT NULL,
  `joinDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  KEY `guildID` (`guildID`),
  KEY `characterID` (`characterID`),
  KEY `guildRankID` (`guildRankID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `guild_ranks`
--

CREATE TABLE IF NOT EXISTS `guild_ranks` (
  `guildRankID` int(1) unsigned NOT NULL AUTO_INCREMENT,
  `guildRankName` varchar(25) NOT NULL,
  PRIMARY KEY (`guildRankID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `items`
--

CREATE TABLE IF NOT EXISTS `items` (
  `itemID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `itemTypeID` int(2) unsigned NOT NULL,
  `itemName` varchar(255) NOT NULL,
  `neededLevel` int(3) unsigned NOT NULL,
  PRIMARY KEY (`itemID`),
  KEY `typeID` (`itemTypeID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `item_attributes`
--

CREATE TABLE IF NOT EXISTS `item_attributes` (
  `itemID` int(11) unsigned NOT NULL,
  `attributID` int(2) unsigned NOT NULL,
  `attributAmount` int(11) NOT NULL,
  KEY `itemID` (`itemID`),
  KEY `attributID` (`attributID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `item_currencies`
--

CREATE TABLE IF NOT EXISTS `item_currencies` (
  `itemID` int(11) unsigned NOT NULL,
  `currencyID` int(2) unsigned NOT NULL,
  `currencyAmount` int(11) unsigned NOT NULL,
  KEY `itemID` (`itemID`),
  KEY `currencyID` (`currencyID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `item_types`
--

CREATE TABLE IF NOT EXISTS `item_types` (
  `itemTypeID` int(2) unsigned NOT NULL AUTO_INCREMENT,
  `itemTypeName` varchar(255) NOT NULL,
  PRIMARY KEY (`itemTypeID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `monsters`
--

CREATE TABLE IF NOT EXISTS `monsters` (
  `monsterID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `monsterTypeID` int(3) unsigned NOT NULL,
  `monsterName` varchar(255) NOT NULL,
  PRIMARY KEY (`monsterID`),
  KEY `monsterTypeID` (`monsterTypeID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `monster_attributes`
--

CREATE TABLE IF NOT EXISTS `monster_attributes` (
  `monsterID` int(11) unsigned NOT NULL,
  `attributID` int(2) unsigned NOT NULL,
  `attributAmount` int(11) NOT NULL,
  KEY `monsterID` (`monsterID`),
  KEY `attributID` (`attributID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `monster_types`
--

CREATE TABLE IF NOT EXISTS `monster_types` (
  `monsterTypeID` int(3) unsigned NOT NULL AUTO_INCREMENT,
  `monsterTypeName` varchar(255) NOT NULL,
  PRIMARY KEY (`monsterTypeID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `npcs`
--

CREATE TABLE IF NOT EXISTS `npcs` (
  `npcID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `npcTypeID` int(11) unsigned NOT NULL,
  `npcName` varchar(25) NOT NULL,
  `npcDescription` varchar(255) NOT NULL,
  PRIMARY KEY (`npcID`),
  KEY `npcTypeID` (`npcTypeID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `npc_items`
--

CREATE TABLE IF NOT EXISTS `npc_items` (
  `npcID` int(11) unsigned NOT NULL,
  `itemID` int(11) unsigned NOT NULL,
  KEY `npcID` (`npcID`),
  KEY `itemID` (`itemID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `npc_types`
--

CREATE TABLE IF NOT EXISTS `npc_types` (
  `npcTypeID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `npcTypeName` varchar(255) NOT NULL,
  PRIMARY KEY (`npcTypeID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `quests`
--

CREATE TABLE IF NOT EXISTS `quests` (
  `questID` int(4) unsigned NOT NULL,
  `questTypeID` int(1) unsigned NOT NULL,
  `questName` varchar(128) NOT NULL,
  `questDescription` varchar(256) NOT NULL,
  `neededLevel` int(3) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`questID`),
  KEY `questTypeID` (`questTypeID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `quest_types`
--

CREATE TABLE IF NOT EXISTS `quest_types` (
  `questTypeID` int(1) unsigned NOT NULL,
  `questTypeName` varchar(20) NOT NULL,
  PRIMARY KEY (`questTypeID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `races`
--

CREATE TABLE IF NOT EXISTS `races` (
  `raceID` int(1) unsigned NOT NULL AUTO_INCREMENT,
  `raceName` varchar(25) NOT NULL,
  `raceDescription` text NOT NULL,
  PRIMARY KEY (`raceID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `race_attributes`
--

CREATE TABLE IF NOT EXISTS `race_attributes` (
  `raceID` int(1) unsigned NOT NULL,
  `attributID` int(2) unsigned NOT NULL,
  `attributAmount` int(11) unsigned NOT NULL,
  KEY `raceID` (`raceID`),
  KEY `attributID` (`attributID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `userID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(25) NOT NULL,
  `password` varchar(64) NOT NULL,
  `email` varchar(100) NOT NULL,
  `registrationIP` varchar(15) NOT NULL,
  `registrationDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `lastLogin` int(11) unsigned NOT NULL DEFAULT '0',
  `banned` tinyint(1) NOT NULL DEFAULT '0',
  `bannedReason` mediumtext NOT NULL,
  PRIMARY KEY (`userID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;

--
-- Constraints der exportierten Tabellen
--

--
-- Constraints der Tabelle `characters`
--
ALTER TABLE `characters`
  ADD CONSTRAINT `characters_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `characters_ibfk_2` FOREIGN KEY (`levelID`) REFERENCES `character_levels` (`levelID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `characters_ibfk_3` FOREIGN KEY (`raceID`) REFERENCES `races` (`raceID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `characters_ibfk_4` FOREIGN KEY (`classID`) REFERENCES `classes` (`classID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `character_attributes`
--
ALTER TABLE `character_attributes`
  ADD CONSTRAINT `character_attributes_ibfk_3` FOREIGN KEY (`characterID`) REFERENCES `characters` (`characterID`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `character_attributes_ibfk_4` FOREIGN KEY (`attributID`) REFERENCES `attributes` (`attributID`) ON DELETE CASCADE ON UPDATE CASCADE;

--
-- Constraints der Tabelle `character_currencies`
--
ALTER TABLE `character_currencies`
  ADD CONSTRAINT `character_currencies_ibfk_3` FOREIGN KEY (`currencyID`) REFERENCES `currencies` (`currencyID`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `character_currencies_ibfk_4` FOREIGN KEY (`characterID`) REFERENCES `characters` (`characterID`) ON DELETE CASCADE ON UPDATE CASCADE;

--
-- Constraints der Tabelle `class_attributes`
--
ALTER TABLE `class_attributes`
  ADD CONSTRAINT `class_attributes_ibfk_1` FOREIGN KEY (`classID`) REFERENCES `classes` (`classID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `class_attributes_ibfk_2` FOREIGN KEY (`attributID`) REFERENCES `attributes` (`attributID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `guild_members`
--
ALTER TABLE `guild_members`
  ADD CONSTRAINT `guild_members_ibfk_1` FOREIGN KEY (`guildID`) REFERENCES `guilds` (`guildID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `guild_members_ibfk_2` FOREIGN KEY (`characterID`) REFERENCES `characters` (`characterID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `guild_members_ibfk_3` FOREIGN KEY (`guildRankID`) REFERENCES `guild_ranks` (`guildRankID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `items`
--
ALTER TABLE `items`
  ADD CONSTRAINT `items_ibfk_1` FOREIGN KEY (`itemTypeID`) REFERENCES `item_types` (`itemTypeID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `item_attributes`
--
ALTER TABLE `item_attributes`
  ADD CONSTRAINT `item_attributes_ibfk_1` FOREIGN KEY (`itemID`) REFERENCES `items` (`itemID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `item_attributes_ibfk_2` FOREIGN KEY (`attributID`) REFERENCES `attributes` (`attributID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `item_currencies`
--
ALTER TABLE `item_currencies`
  ADD CONSTRAINT `item_currencies_ibfk_1` FOREIGN KEY (`itemID`) REFERENCES `items` (`itemID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `item_currencies_ibfk_2` FOREIGN KEY (`currencyID`) REFERENCES `currencies` (`currencyID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `monsters`
--
ALTER TABLE `monsters`
  ADD CONSTRAINT `monsters_ibfk_1` FOREIGN KEY (`monsterTypeID`) REFERENCES `monster_types` (`monsterTypeID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `monster_attributes`
--
ALTER TABLE `monster_attributes`
  ADD CONSTRAINT `monster_attributes_ibfk_1` FOREIGN KEY (`monsterID`) REFERENCES `monsters` (`monsterID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `monster_attributes_ibfk_2` FOREIGN KEY (`attributID`) REFERENCES `attributes` (`attributID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `npcs`
--
ALTER TABLE `npcs`
  ADD CONSTRAINT `npcs_ibfk_1` FOREIGN KEY (`npcTypeID`) REFERENCES `npc_types` (`npcTypeID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `npc_items`
--
ALTER TABLE `npc_items`
  ADD CONSTRAINT `npc_items_ibfk_1` FOREIGN KEY (`npcID`) REFERENCES `npcs` (`npcID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `npc_items_ibfk_2` FOREIGN KEY (`itemID`) REFERENCES `items` (`itemID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `quests`
--
ALTER TABLE `quests`
  ADD CONSTRAINT `quests_ibfk_1` FOREIGN KEY (`questTypeID`) REFERENCES `quest_types` (`questTypeID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `race_attributes`
--
ALTER TABLE `race_attributes`
  ADD CONSTRAINT `race_attributes_ibfk_1` FOREIGN KEY (`raceID`) REFERENCES `races` (`raceID`) ON UPDATE CASCADE,
  ADD CONSTRAINT `race_attributes_ibfk_2` FOREIGN KEY (`attributID`) REFERENCES `attributes` (`attributID`) ON UPDATE CASCADE;

Denke mal diese Ansicht ist Euch am genehmsten?
Soweit ist die Datenbank bis jetzt, allerdings habe ich nie Feedback dazu bekommen und deswegen fehlen noch einige der im vorigen Beitrag gelisteten Punkte.
...

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Browsergame Neubeginn mit APF

Beitrag von Megger » 27.03.2013, 16:40:43

Edit:
Auch wenn du schon etwas neues geschrieben hast ;-)


Falls du noch ein paar Ideen zu verschiedenen Bereichen suchst:
Anmeldung -> Schau dir das Usermanagement des APF an -> http://adventure-php-framework.org/Seit ... Verwaltung
Kommunikation -> Schau dir die Postbox Extension an http://wiki.adventure-php-framework.org ... htensystem

Da kannst du halt schon ein bisschen sehen, was da alles für Tabellen usw. hinterstehen

Und was mir direkt aufgefallen ist
Monster sind im Grunde wie Charaktere nur nicht spielergesteuert. Sie lassen, sofern besiegt, zufällig Gegenstände "fallen" - ins Inventar der Spielers.
Was passiert wenn das Inventar voll ist?

Edit2:
Zu deinem neuen Post:
Also ein UML Diagramm ist da glaube ich besser geeignet, da müssen die Leute dann nicht erst alles in einer Datenbank einspielen um das ganze beurteilen zu können!

- Wie das ID fehlt nun heißt ist völlig egal und ich finde es sogar besser es mehr zu beschreiben anstatt immer und überall nur ID zu verwenden

- character_currencies: Hier hast du gar keinen Primärschlüssel, Absicht? Wenn du da einen Primärschlüssel über characterID und currencyID legst, stellst du sicher, dass nicht mehrere Beziehungen zwischen einer Currency und einem Character erstellt werden können!

Ansonsten bei groben überfliegen sieht das doch ganz ordentlich aus
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Ben
Beiträge: 11
Registriert: 11.03.2012, 10:28:32

Re: Browsergame Neubeginn mit APF

Beitrag von Ben » 28.03.2013, 11:11:18

Link zur Workbench (Projekt und Bild): https://www.dropbox.com/sh/eapy3n1zr536e67/KO4BvfQPvq
...

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast