| Autor |
Nachricht |
Top Gun
Gast
|
|
Aktueller Quellcode:
| PHP:
|
<?php #UseInterface Web, ShipPortal;
//Seiten:
// 0 : index
// 1 : raum
// 2 : charaktere verwalten
//
//
//Aktionen
//-1 : keine
// 0 : tuer verwenden
// 1 : gegenstand aufnehmen
// 2 : gegenstand ablegen
// 3 : charakter aktivieren
// 4 : charakter hinzufügen
// 5 : chat
//
// Gegenstandaktionen
// 0 : mitnehmen
If(MyShip is null)
{
MyShip = New CMyShip(376098);//test
GuestShip = New CMyShip(376098);//test
}
GuestUser = New CUser(GuestShip.UserID);
Var seite As Integer = 0;
Var aktion As String = - 1;
Var stationsid As Integer = MyShip.ShipID;
Var userid As Integer = GuestUser.UserID;
Var admin As Boolean = (MyShip.UserID = GuestUser.UserID);
Var storage As New CDataNodeStorage('rpgstation' & stationsid, true);
Var data As CDataNodeList = storage.Items;
//data.Clear();
Var settings As CDataNode = data.GetNode('settings');
Var spielerDaten As CDataNode;
Var charakterDaten As CDataNode;
Var node As CDataNode;
Var node2 As CDataNode;
If(settings.Items.Count = 0)
{
//initialisieren
node = settings.Items.GetNode('begruessung');
node.Value = 'Willkommen auf der Raumstation.';
node = settings.Items.GetNode('newCharakterId');
node.asInteger = 0;
node = settings.Items.GetNode('newRaumId');
node.asInteger = 0;
node = settings.Items.GetNode('newGegenstandId');
node.asInteger = 0;
node = settings.Items.GetNode('newTuerId');
node.asInteger = 0;
createGegenstandKlasse('Tuer');
createGegenstandKlasse('Phaser');
createGegenstandKlasse('Replikator');
createGegenstandKlasse('Essen');
createRaum('Andockschleuse');
createRaum('Weltraum');
createRaum('Turbolift');
createRaum('Deck 1');//3
createRaum('Deck 2');
createRaum('Deck 3');
createRaum('Deck 4');
createRaum('Deck 5');
createRaum('Deck 6');
createRaum('Brücke');//9
createTuer(0, 1, true);//deck 5
createTuer(0, 7, false);
createTuer(2, 3, false);//turbolift
createTuer(2, 4, false);
createTuer(2, 5, false);
createTuer(2, 6, false);
createTuer(2, 7, false);
createTuer(2, 8, false);
createTuer(3, 9, false);//deck 1
createGegenstand('Kiste', 0, 'egal', false, 1000);
createGegenstand('Phaser', 0, 'waffe', true, 2);
createGegenstand('Phaser', 0, 'waffe', true, 2);
createGegenstand('Phaser', 0, 'waffe', true, 2);
createGegenstand('Phaser', 0, 'waffe', true, 2);
createGegenstand('Computerterminal', 0, 'egal', false, 1000);
node = settings.Items.GetNode('startRaum');
node.asInteger = 0;
//createCharakter('N00b', userid, false);
}
If(getDefaultEigenschaft(getGegenstandKlasse(0), 'zielraum').Value = '')
{
Var eineKlasse As CDataNode;
Var eineEigenschaft As CDataNode;
//Tür
eineKlasse = getGegenstandKlasse(0);
eineEigenschaft = getEigenschaft(eineKlasse, 'gewicht');
eineEigenschaft.asInteger = 0;
//Phaser
eineKlasse = getGegenstandKlasse(1);
eineEigenschaft = getEigenschaft(eineKlasse, 'gewicht');
eineEigenschaft.asInteger = 8;
If( Not eineKlasse.Items.GetNode('aktionen').Items.ContainsKey(0))
{
eineKlasse.Items.GetNode('aktionen').Items.Add(CStr(0));
}
//Replikator
eineKlasse = getGegenstandKlasse(2);
eineEigenschaft = getEigenschaft(eineKlasse, 'gewicht');
eineEigenschaft.asInteger = 0;
//Essen
eineKlasse = getGegenstandKlasse(3);
eineEigenschaft = getEigenschaft(eineKlasse, 'gewicht');
eineEigenschaft.asInteger = 12;
If( Not eineKlasse.Items.GetNode('aktionen').Items.ContainsKey(0))
{
eineKlasse.Items.GetNode('aktionen').Items.Add(CStr(0));
}
}
spielerDaten = data.GetNode('spieler').Items.GetNode(userid);
node = spielerDaten.Items.GetNode('aktiverCharakter');
Var charakterId As Integer = - 1;
If(node.Value <> '')
{
charakterId = node.asInteger;
charakterDaten = getCharakter(charakterId);
}
Else
{
// charakterDaten = createCharakter(GuestUser.Name, userid, true);
// charakterId = Integer.Parse(charakterDaten.Key);
}
Function getCharakter(id As Integer) As CDataNode
{
Return data.GetNode('charaktere').Items.GetNode(id);
}
Function getCharakterName(char As CDataNode) As String
{
Return char.Items.GetNode('name').Value;
}
Function getCharakterRaum(char As CDataNode) As CDataNode
{
Var raumId As Integer = char.Items.GetNode('position').asInteger;
Return getRaum(raumId);
}
Function getSpieler(id As Integer) As CDataNode
{
Return data.GetNode('spieler').Items.GetNode(id);
}
Function getRaum(id As Integer) As CDataNode
{
Return data.GetNode('raeume').Items.GetNode(id);
}
Function getRaumName(raum As CDataNode) As String
{
Return raum.Items.GetNode('name').Value;
}
Function getRaumBeschreibung(raum As CDataNode) As String
{
Return raum.Items.GetNode('beschreibung').Value;
}
Function getGegenstand(id As Integer) As CDataNode
{
Return data.GetNode('gegenstaende').Items.GetNode(id);
}
Function getGegenstandName(gs As CDataNode) As String
{
Return gs.Items.GetNode('name').Value;
}
Function getTuer(id As Integer) As CDataNode
{
Return data.GetNode('tueren').Items.GetNode(id);
}
Function getTuerZielRaum(tuer As CDataNode, start As Integer) As CDataNode
{
Var raumId As Integer = tuer.Items.GetNode('position1').asInteger;
If(raumId = start)
{
raumId = tuer.Items.GetNode('position2').asInteger;
}
Return getRaum(raumId);
}
Function isTuerZuRaum(tuer As CDataNode, raum As Integer) As Boolean
{
Var ok As Boolean = false;
Var raumId As Integer = tuer.Items.GetNode('position1').asInteger;
If(raumId = raum)
{
ok = true;
}
Else
{
ok = (tuer.Items.GetNode('position2').asInteger = raum);
}
Return ok;
}
Function isTuerVerschlossen(tuer As CDataNode) As Boolean
{
Return tuer.Items.GetNode('verschlossen').asBoolean;
}
Function addChatText(raum As CDataNode, sprecher As CDataNode, text As String, aktion As Boolean)
{
If(text.Length = 0)
{
Return;
}
Var useraktion As Boolean = ( Not aktion) And text.StartsWith('/me ');
If(useraktion)
{
aktion = true;
text = text.Substring(4);
}
Var now As Date = Date.Now;
Var textteile As New CStringList();
textteile.Add('[');
textteile.Add(now.Day);
textteile.Add('.');
textteile.Add(now.Month);
textteile.Add('. ');
textteile.Add(now.Hour);
textteile.Add(':');
If(now.Minute < 10)
{
textteile.Add('0');
}
textteile.Add(now.Minute);
textteile.Add(':');
If(now.Second < 10)
{
textteile.Add('0');
}
textteile.Add(now.Second);
If(aktion)
{
textteile.Add('] *');
If( Not useraktion)
{
textteile.Add('*');
}
textteile.Add(' ');
}
Else
{
textteile.Add('] <');
}
Var charname As String = getCharakterName(sprecher);
textteile.Add(charname);
If(Not aktion)
{
textteile.Add('>');
}
textteile.Add(' ');
If(text.Length > 100)
{
textteile.Add(text.Substring(0, 100));
}
Else
{
textteile.Add(text);
}
text = textteile.Text('');
text = text.Replace('||||', '----');
Var personen As CDataNodeList = raum.Items.GetNode('charaktere').Items;
Var anzahl As Integer = personen.Count;
Var i As Integer;
For(i = 0 To anzahl - 1)
{
Var personId As Integer = personen.KeyByIndex(i);
Var person As CDataNode = getCharakter(personId);
Var chattext As String = person.Items.GetNode('chat').Value;
Var splitter As CStringList = CStringList.CreateFromString(chattext, '||||');
splitter.Add(text);
While(splitter.Count > 10)
{
splitter.RemoveAt(0);
}
chattext = splitter.Text('||||');
person.Items.GetNode('chat').Value = chattext;
}
}
Function createCharakter(name As String, besitzer As Integer, aktivieren As Boolean) As CDataNode
{
Var charakterId As Integer = 0;
Var n1 As CDataNode = settings.Items.GetNode('newCharakterId');
If(n1.Value = '')
{
n1.asInteger = 1;
}
Else
{
charakterId = n1.asInteger;
n1.asInteger = n1.asInteger + 1;
}
Var charakter As CDataNode = data.GetNode('charaktere').Items.GetNode(charakterId);
charakter.Items.GetNode('name').Value = name;
charakter.Items.GetNode('besitzer').asInteger = besitzer;
Var startraum As Integer = settings.Items.GetNode('startRaum').asInteger;
charakter.Items.GetNode('position').asInteger = startraum;
Var n2a As CDataNode = getSpieler(besitzer);
Var n2 As CDataNode = n2a.Items.GetNode('aktiverCharakter');
If((n2.Value = '') OR aktivieren)
{
n2.asInteger = charakterId;
}
n2a.Items.GetNode('alleCharaktere').Items.Add(CStr(charakterId));
Var raum As CDataNode = getRaum(startraum);
raum.Items.GetNode('charaktere').Items.Add(CStr(charakterId));
addChatText(raum, charakter, 'betritt den Raum ' & getRaumName(raum) & '.', true);
Return charakter;
}
Function createRaum(name As String) As CDataNode
{
Var raumId As Integer = 0;
Var n1 As CDataNode = settings.Items.GetNode('newRaumId');
If(n1.Value = '')
{
n1.asInteger = 1;
}
Else
{
raumId = n1.asInteger;
n1.asInteger = n1.asInteger + 1;
}
Var raum As CDataNode = data.GetNode('raeume').Items.GetNode(raumId);
raum.Items.GetNode('name').Value = name;
raum.Items.GetNode('beschreibung').Value = 'Dieser Raum ist ...';
Return raum;
}
Function createGegenstand(name As String, raum As Integer, klasse As Integer, mitnehmbar As Boolean, gewicht As Integer) As CDataNode
{
Var gegenstandId As Integer = 0;
Var n1 As CDataNode = settings.Items.GetNode('newGegenstandId');
If(n1.Value = '')
{
n1.asInteger = 1;
}
Else
{
gegenstandId = n1.asInteger;
n1.asInteger = n1.asInteger + 1;
}
Var gegenstand As CDataNode = data.GetNode('gegenstaende').Items.GetNode(gegenstandId);
gegenstand.Items.GetNode('name').Value = name;
gegenstand.Items.GetNode('klasse').Value = klasse;
gegenstand.Items.GetNode('positiontyp').Value = 'r';
gegenstand.Items.GetNode('position').asInteger = raum;
gegenstand.Items.GetNode('gewicht').asInteger = gewicht;
gegenstand.Items.GetNode('mitnehmbar').asBoolean = mitnehmbar;
getRaum(raum).Items.GetNode('gegenstaende').Items.Add(CStr(gegenstandId));
Return gegenstand;
}
Function createTuer(raum1 As Integer, raum2 As Integer, verschlossen As Boolean) As CDataNode
{
Var tuerId As Integer = 0;
Var n1 As CDataNode = settings.Items.GetNode('newTuerId');
If(n1.Value = '')
{
n1.asInteger = 1;
}
Else
{
tuerId = n1.asInteger;
n1.asInteger = n1.asInteger + 1;
}
Var tuer As CDataNode = data.GetNode('tueren').Items.GetNode(tuerId);
tuer.Items.GetNode('position1').asInteger = raum1;
tuer.Items.GetNode('position2').asInteger = raum2;
tuer.Items.GetNode('verschlossen').asBoolean = verschlossen;
getRaum(raum1).Items.GetNode('tueren').Items.Add(CStr(tuerId));
getRaum(raum2).Items.GetNode('tueren').Items.Add(CStr(tuerId));
Return tuer;
}
Function createGegenstandKlasse(name As String) As CDataNode
{
Var gegenstandKlasseId As Integer = 0;
Var n1 As CDataNode = settings.Items.GetNode('newGegenstandKlasseId');
If(n1.Value = '')
{
n1.asInteger = 1;
}
Else
{
gegenstandKlasseId = n1.asInteger;
n1.asInteger = n1.asInteger + 1;
}
Var ggsklasse As CDataNode = data.GetNode('gegenstandklassen').Items.GetNode(gegenstandKlasseId);
ggsklasse.Items.GetNode('name').Value = name;
Return ggsklasse;
}
Function getGegenstandKlasse(id As Integer) As CDataNode
{
Return data.GetNode('gegenstandklassen').Items.GetNode(id);
}
Function getEigenschaft(ggsOderKlasse As CDataNode, eigenschaft As String) As CDataNode
{
Return ggsOderKlasse.Items.GetNode('eigenschaften').Items.GetNode(eigenschaft);
}
Function getDefaultEigenschaft(klasse As CDataNode, eigenschaft As String) As CDataNode
{
Return klasse.Items.GetNode('defaulteigenschaften').Items.GetNode(eigenschaft);
}
Function Main()
{
If (Request.Form.ContainsKey('seite'))
{
seite = Integer.Parse(Request.Form.Item('seite'));
}
Elseif (Request.Parameters.ContainsKey('seite'))
{
seite = Integer.Parse(Request.Parameters.Item('seite'));
}
If (Request.Form.ContainsKey('aktion'))
{
aktion = Integer.Parse(Request.Form.Item('aktion'));
}
Elseif (Request.Parameters.ContainsKey('aktion'))
{
aktion = Integer.Parse(Request.Parameters.Item('aktion'));
}
//DEBUG
//Response.Add(seite);
//Response.Add(NEW CHtmlNewLine());
//Response.Add(aktion);
If(aktion > - 1)
{
Var rc As Integer = Response.Count;
FuehreAktionAus();
If(Response.Count > rc)
{
Response.Insert(rc, New CHtmlSeperator('Meldungen'));
}
}
ZeigeSeite();
}
Function FuehreAktionAus()
{
//alle seiten hier
If(aktion = 0)
{
AktionTuerVerwenden();
}
Elseif(aktion = 1)
{
AktionGegenstandNehmen();
}
Elseif(aktion = 2)
{
AktionGegenstandAblegen();
}
Elseif(aktion = 3)
{
AktionCharakterAktivieren();
}
Elseif(aktion = 4)
{
AktionCharakterErzeugen();
}
Elseif(aktion = 5)
{
AktionChat();
}
Elseif(aktion = 6)
{
AktionTest3();
}
Else
{
//default:keine
}
}
Function ZeigeSeite()
{
//alle seiten hier
If(seite = 1)
{
SeiteRaum();
}
Elseif(seite = 2)
{
SeiteCharaktereVerwalten();
}
Else
{
//default:index
SeiteIndex();
}
}
Function AktionTuerVerwenden()
{
Var tuerID As Integer = Request.Parameters.Item('tuerid');
Var tuer As CDataNode = getTuer(tuerID);
Var startraum As CDataNode = getCharakterRaum(charakterDaten);
Var raumID As Integer = startraum.Key;
If( NOT isTuerZuRaum(tuer, raumID))
{
Response.Add('Ungültige Tür! ');
}
Else
{
If(isTuerVerschlossen(tuer))
{
Response.Add('Diese Tür ist verschlossen.');
}
Else
{
Var zielraum As CDataNode = getTuerZielRaum(tuer, raumID));
zielraum.Items.GetNode('charaktere').Items.Add(CStr(charakterId));
startraum.Items.GetNode('charaktere').Items.Remove(CStr(charakterId));
charakterDaten.Items.GetNode('position').Value = zielraum.Key;
Var zielraumname As String = getRaumName(zielraum);
Response.Add('Betrete ' & zielraumname & '.');
addChatText(startraum, charakterDaten, 'verlässt den Raum ' & getRaumName(startraum) & '.', true);
addChatText(zielraum, charakterDaten, 'betritt den Raum ' & zielraumname & '.', true);
}
}
}
Function AktionGegenstandNehmen()
{
Var gegenstandID As Integer = Request.Parameters.Item('gegenstandnehmen');
Var gegenstand As CDataNode = getGegenstand(gegenstandID);
Var raum As CDataNode = getCharakterRaum(charakterDaten);
If( NOT raum.Items.GetNode('gegenstaende').Items.ContainsKey(gegenstandID))
{
Response.Add('Gegenstand nicht vorhanden!');
}
Else
{
If( NOT gegenstand.Items.GetNode('mitnehmbar').asBoolean)
{
Response.Add('Dieser Gegenstand kann nicht aufgenommen werden.');
}
Else
{
raum.Items.GetNode('gegenstaende').Items.Remove(CStr(gegenstandID));
charakterDaten.Items.GetNode('gegenstaende').Items.Add(CStr(gegenstandID));
gegenstand.Items.GetNode('positiontyp').Value = 'p';
gegenstand.Items.GetNode('position').asInteger = charakterId;
Var ggsname As String = getGegenstandName(gegenstand);
Response.Add(ggsname & ' aufgenommen.');
addChatText(raum, charakterDaten, 'nimmt den Gegenstand ' & ggsname & '.', true);
}
}
}
Function AktionGegenstandAblegen()
{
Var gegenstandID As Integer = Request.Parameters.Item('gegenstandablegen');
Var gegenstand As CDataNode = getGegenstand(gegenstandID);
Var raum As CDataNode = getCharakterRaum(charakterDaten);
If( NOT charakterDaten.Items.GetNode('gegenstaende').Items.ContainsKey(gegenstandID))
{
Response.Add('Gegenstand nicht vorhanden!');
}
Else
{
If( NOT gegenstand.Items.GetNode('mitnehmbar').asBoolean)
{
Response.Add('Dieser Gegenstand kann nicht abgelegt werden.');
}
Else
{
charakterDaten.Items.GetNode('gegenstaende').Items.Remove(CStr(gegenstandID));
raum.Items.GetNode('gegenstaende').Items.Add(CStr(gegenstandID));
gegenstand.Items.GetNode('positiontyp').Value = 'r';
gegenstand.Items.GetNode('position').Value = raum.Key;
Var ggsname As String = getGegenstandName(gegenstand);
Response.Add(ggsname & ' abgelegt.');
addChatText(raum, charakterDaten, 'legt den Gegenstand ' & ggsname & ' in den Raum.', true);
}
}
}
Function AktionCharakterAktivieren()
{
Var aktivieren As Integer = Request.Parameters.Item('charid');
If(spielerDaten.Items.GetNode('alleCharaktere').Items.ContainsKey(CStr(aktivieren)))
{
spielerDaten.Items.GetNode('aktiverCharakter').asInteger = aktivieren;
charakterId = aktivieren;
charakterDaten = getCharakter(aktivieren);
Response.Add('Charakter aktivert.');
}
Else
{
Response.Add('Charakter nicht vorhanden.');
}
}
Function AktionCharakterErzeugen()
{
If(admin OR true)
{
Var name As String = Request.Form.Item('charname');
Var besitzer As Integer = userid;
If(admin AND (Request.Form.Item('besitzer').Length > 0))
{
besitzer = Request.Form.Item('besitzer');
}
If(name.Length = 0)
{
Response.Add('Du hast keinen Namen eingegeben.');
}
Else
{
createCharakter(name, besitzer, false);
Response.Add('Charakter ' & name & ' erzeugt.');
}
}
}
Function AktionChat()
{
Var text As String = Request.Form.Item('chat');
Var raum As CDataNode = getCharakterRaum(charakterDaten);
addChatText(raum, charakterDaten, text, false);
}
Function AktionTest3()
{
//flottenauswahl
Response.Add('Gewählte Flotte:');
If(Request.Form.ContainsKey('flotte'))
{
Var flottenID As Integer = Request.Form.Item('flotte');
Var flotte As New CMyFlotte(flottenID);
Response.Add(flotte.Name);
}
Else
{
Response.Add('keine - BUG?');
}
seite = 2;
}
Function SeiteIndex()
{
Var tab As New CTable(3);
Response.Add(tab);
Var Row As CTableRow = tab.AddRow();
Var Cell As CTableCell = Row(0);
Cell.CssClass = 'buttonbody';
Cell.Add('Aktiver Charakter');
Cell = Row(1);
If(charakterDaten is null)
{
Cell.Add('-');
}
Else
{
Cell.Add(getCharakterName(charakterDaten))
}
Cell = Row(2);
Var url As New CScriptUrl();
url.Parameters.Add('seite', 2);
Cell.Add(New CHtmlLinkButton('verwalten', url, 'Hier kannst du deinen aktiven Charakter ändern oder neue Charaktere erzeugen'));
Response.Add(New CHtmlSeperator('Botschaft'));
Response.Add(settings.Items.GetNode('begruessung').Value);
url = New CScriptUrl();
url.Parameters.Add('seite', 1);
If(charakterDaten is null) {} Else
{
Response.Add(New CHtmlLinkButton('Raumstation betreten', url, 'Nun gehts los'));
}
}
Function SeiteRaum()
{
Var url As New CScriptUrl();
Var raum As CDataNode = getCharakterRaum(charakterDaten);
Response.Add(New CHtmlSeperator(getRaumName(raum)));
Response.Add(getRaumBeschreibung(raum));
Var tueren As CDataNodeList = raum.Items.GetNode('tueren').Items;
Var anzahl As Integer = tueren.Count;
Var i As Integer;
For(i = 0 To anzahl - 1)
{
Var tuer As Integer = tueren.KeyByIndex(i);
Var zielraum As CDataNode = getTuerZielRaum(getTuer(tuer), raum.Key));
url = New CScriptUrl();
url.Parameters.Add('seite', 1);
url.Parameters.Add('aktion', 0);
url.Parameters.Add('tuerid', tuer);
Response.Add(New CHtmlLinkButton(getRaumName(zielraum), url, 'Diesen Raum betreten'));
}
Response.Add(New CHtmlSeperator(getCharakterName(charakterDaten)));
//Response.Add(New CHtmlImage('http://forum.stne.net/images/avatars/6079448f25a946df4.jpg'));
Var gegenstaende As CDataNodeList = charakterDaten.Items.GetNode('gegenstaende').Items;
CreateGegenstaendeTabelle(gegenstaende, Response);
Response.Add(New CHtmlSeperator('Andere Personen im Raum'));
Var personen As CDataNodeList = raum.Items.GetNode('charaktere').Items;
anzahl = personen.Count;
For(i = 0 To anzahl - 1)
{
Var person As Integer = personen.KeyByIndex(i);
If(person <> charakterId)
{
Response.Add(getCharakterName(getCharakter(person)));
Response.Add(New CHtmlNewLine());
}
}
gegenstaende = raum.Items.GetNode('gegenstaende').Items;
anzahl = gegenstaende.Count;
If(anzahl > 0)
{
Response.Add(New CHtmlSeperator('Gegenstände im Raum'));
CreateGegenstaendeTabelle(gegenstaende, Response);
}
Response.Add(New CHtmlSeperator('Gespräche'));
url = New CScriptUrl();
url.Parameters.Add('seite', 1);
Response.Add(New CHtmlLinkButton('aktualisieren', url, 'aktualisieren'));
Var chattext As String = charakterDaten.Items.GetNode('chat').Value;
Var splitter As CStringList = CStringList.CreateFromString(chattext, '||||');
anzahl = splitter.Count;
For(i = 0 To anzahl - 1)
{
Response.Add(splitter.Item(i));
Response.Add(New CHtmlBreak());
}
Var form As New CHtmlForm(New CScriptUrl());
Response.Add(form);
Var tab2 As New CTable(2);
form.Add(tab2);
form.Add(New CHtmlInput(5, 'aktion', EHtmlInputType.Hidden));
form.Add(New CHtmlInput(1, 'seite', EHtmlInputType.Hidden));
Var Row2 As CTableRow = tab2.AddRow();
Var Cell2 As CTableCell = Row2(0);
Var ip As CHtmlTextBox = New CHtmlTextBox('', 'chat')
ip.Size = 100;
Cell2.Add(ip);
Cell2 = Row2(1);
Cell2.Add(New CHtmlSubmitButton('sagen', 'sagen'));
LinkZumIndex();
}
Function SeiteCharaktereVerwalten()
{
Response.Add(New CHtmlSeperator('Charaktere verwalten'));
Var aktiverCharakter As Integer = - 1;
If(charakterDaten is null) {} Else
{
aktiverCharakter = charakterDaten.Key;
}
Var anzahlCharaktere As Integer = 0;
Var charnodes As CDataNodeList = data.GetNode('charaktere').Items;
Var eigeneChars As CDataNodeList = spielerDaten.Items.GetNode('alleCharaktere').Items;
If(admin)
{
anzahlCharaktere = charnodes.Count;
}
Else
{
anzahlCharaktere = eigeneChars.Count;
}
If(anzahlCharaktere > 0)
{
Var tab As New CTable(4);
Response.Add(tab);
Var Row As CTableRow = tab.AddRow();
Var Cell As CTableCell = Row(0);
Cell.CssClass = 'buttonbody';
Cell.Add('Charakter');
Cell = Row(1);
Cell.CssClass = 'buttonbody';
Cell.Add('Besitzer');
Cell = Row(2);
Cell.CssClass = 'buttonbody';
Cell.Add('Aktiv');
Cell = Row(3);
Cell.CssClass = 'buttonbody';
Cell.Add('Aktionen');
Var i As Integer;
For(i = 0 To anzahlCharaktere - 1)
{
Var url As CScriptUrl;
Var char As CDataNode;
If(admin)
{
char = charnodes.ItemByIndex(i);
}
Else
{
Var charId As Integer = eigeneChars.KeyByIndex(i);
char = charnodes.ItemByIndex(charId);
}
Row = tab.AddRow();
Cell = Row(0);
Cell.Add(getCharakterName(char));
Cell = Row(1);
Var besitzer As CUser = New CUser(char.Items.GetNode('besitzer').asInteger);
Cell.Add(besitzer.GetHtmlName());
Cell = Row(2);
If(char.Key = aktiverCharakter)
{
Cell.Add('ja');
}
Else
{
Cell.Add('nein');
}
Cell = Row(3);
If((char.Key <> aktiverCharakter) AND (besitzer.UserID = userid))
{
url = New CScriptUrl();
url.Parameters.Add('seite', 2);
url.Parameters.Add('aktion', 3);
url.Parameters.Add('charid', char.Key);
Cell.Add(New CHtmlLinkButton('aktivieren', url, 'Diesen Charakter verwenden'));
}
}
}
//TODO: Berechtigung?
If(admin OR true)
{
Response.Add(New CHtmlSeperator('Neuen Charakter erzeugen'));
Var cols As Integer = 2;
If(admin)
{
cols = 4;
}
Var form As New CHtmlForm(New CScriptUrl());
Response.Add(form);
Var tab2 As New CTable(cols);
form.Add(tab2);
form.Add(New CHtmlInput(4, 'aktion', EHtmlInputType.Hidden));
form.Add(New CHtmlInput(2, 'seite', EHtmlInputType.Hidden));
Var Row2 As CTableRow = tab2.AddRow();
Var Cell2 As CTableCell = Row2(0);
Cell2.ColumnSpan = cols;
Cell2.CssClass = 'buttonbody';
Cell2.Add('Name des Charakters');
Row2 = tab2.AddRow();
Cell2 = Row2(0);
Cell2.Add(New CHtmlInput('', 'charname', EHtmlInputType.Text));
If(admin)
{
Cell2 = Row2(1);
Cell2.Add('Besitzer');
Cell2.CssClass = 'buttonbody';
Cell2 = Row2(2);
Cell2.Add(New CHtmlInput('', 'besitzer', EHtmlInputType.Text));
}
Cell2 = Row2(cols - 1);
Cell2.Add(New CHtmlSubmitButton('erzeugen', 'erzeugen'));
}
LinkZumIndex();
}
Function SeiteSeite3()
{
Response.Add(New CHtmlSeperator('Seite 3 mit Formular'));
Var form As New CHtmlForm(New CScriptUrl());
Var liste As New CHtmlListBox('flotte');
Var flotten As New CFlottenEnumerator();
Var flotte As CMyFlotte;
Var titel As String;
While(flotten.Next())
{
flotte = flotten.CurrentFlotte;
titel = flotte.Name & ' (' & flotte.Ships.Count & ')';
liste.Add(New CHtmlListBoxItem(titel, CStr(flotte.FlottenID), False));
}
form.Add(New CHtmlBreak());
form.Add(New CHtmlInput(2, 'aktion', EHtmlInputType.Hidden));
form.Add('Wähle eine Flotte:');
form.Add(liste);
form.Add(New CHtmlSubmitButton('Absenden', 'submit', ''));
Response.Add(form);
LinkZumIndex();
}
Function LinkZumIndex()
{
Response.Add(New CHtmlBreak());
Var url As New CScriptUrl();
url.Parameters.Add('seite', 0);
Response.Add(New CHtmlLinkButton('zurück', url, 'zum Index'));
}
Function CreateGegenstaendeTabelle(gegenstaende As CDataNodeList, parent As CHtmlControl)
{
Var anzahl As Integer = gegenstaende.Count;
If(anzahl > 0)
{
Var tab As New CTable(3);
parent.Add(tab);
Var Row As CTableRow = tab.AddRow();
Var Cell As CTableCell = Row(0);
Cell.CssClass = 'buttonbody';
Cell.Add('Gegenstand');
Cell = Row(1);
Cell.CssClass = 'buttonbody';
Cell.Add('Gewicht');
Cell = Row(2);
Cell.CssClass = 'buttonbody';
Cell.Add('Aktionen');
Var i As Integer;
For(i = 0 To anzahl - 1)
{
Var url As New CScriptUrl();
Var gegenstand As Integer = gegenstaende.KeyByIndex(i);
Var ggs As CDataNode = getGegenstand(gegenstand);
Row = tab.AddRow();
Cell = Row(0);
Cell.Add(getGegenstandName(ggs));
Cell = Row(1);
Var gewicht As Integer = ggs.Items.GetNode('gewicht').asInteger;
If(gewicht > 0)
{
Cell.Add(gewicht);
}
Else
{
Cell.Add('-');
}
Cell = Row(2);
If(ggs.Items.GetNode('mitnehmbar').asBoolean)
{
If(ggs.Items.GetNode('positiontyp').Value = 'r')
{
//gegenstand im raum
url.Parameters.Add('seite', 1);
url.Parameters.Add('aktion', 1);
url.Parameters.Add('gegenstandnehmen', gegenstand);
Cell.Add(New CHtmlLinkButton('nehmen', url, 'Nimmt den Gegenstand auf'));
}
Else
{
url.Parameters.Add('seite', 1);
url.Parameters.Add('aktion', 2);
url.Parameters.Add('gegenstandablegen', gegenstand);
Cell.Add(New CHtmlLinkButton('ablegen', url, 'Legt den Gegenstand in den Raum'));
}
}
}
}
}
Main(); ?>
|
Bekannte Bugs:
- Nach der Erstinitialisierung ist es nicht möglich mehr als einen Char anzulegen
- Fehlerhaft angelegte oder nachträglich in die Datanode eingefügte Chars, lassen sich nicht aktivieren
To Do List:
Ziel:
|
|
|
|
Zuletzt bearbeitet von Top Gun am Fr 11 Apr, 2008 15:28, insgesamt einmal bearbeitet
|
|
| |
|
 |
Top Gun
Gast
|
|
So ich fang mal an:
Calarion und ich haben schon ein wenig rumgetestet und uns ein wenig Überblick verschafft mit dem Script. So ganz bin ich noch nicht drin, aber das wird noch.
Bisher ist es mir aber nicht gelungen Gegenstände zu finden oder gar aufzuheben... kann das jemand bestätigen!?
Was wollen wir hier eigentlich alles erreichen?
- Wir sollten uns gemeinsam ein Ziel setzen. Dazu brauchen wir auch erstmal Ideen und Vorschläge was alles noch eingebaut werden soll. Diese möchte ich hier sammeln.
|
|
|
|
|
|
| |
|
 |
Arakis
Spielleitung
Alter: 26
Anmeldungsdatum: 03.11.2005
Beiträge: 1238

|
|
Was soll es können?
In erster Linie eine Art "Sammelpunkt", so sich verschiedene Leute treffen und miteinander interagieren könnnen. Dies sollte in verschiedenen Räumen möglich sein.
Meine Ideen:
- Grundsätzlich gibt es Räume. Räume haben eine ID und eine Bezeichnung.
- In Räumen können Gegenstände(Items) sein.
- Items haben eine ID und eine Bezeichnung und einen Typ(Typen wären "Room-Changer(Tür/Leiter, Fahrstuhlbedienelement), Tresen, Stuhl, Tisch etc.)
- Items können beschriftete Aktionen machen, wie z.b. "Tür betreten", "Leiter hinaufsteigen", "Licht ausschalten"(bei Lichtschalter).
- Bestimmte Items darf man auch "aufheben" und mitnehmen(in andere Räume).
- Türen und Leitern etc. sind auch Items und halt mit speziellen Aktionen, welche die Person in einen anderen Raum "bringen".
- In jedem Raum sollte man chatten können.
- Es sollte/muss auch verschlossene Türen geben, welche man entweder mit einem Schlüssel(im Inventar der Person) oder mit einem Kennwort öffnen können sollte oder per definierter Personenliste in der Konfiguration.
- Die Anordnung Räume sollten vorher unbedingt grafisch aufgezeichnet werden(Skizze), damit dieser hinterher auch einen Sinn ergeben. Ein Grafiker könnte dies dann später umsetzen, vielleicht schafft man es sogar seine eigene Position in der Grafik anzuzeigen.
Es sollte halt eine kleine Mini-RPG-Plattform innerhalb von STNE sein. Ob es auch äußere Aktionen geben sollte, das z.b. durch Aktionen innerhalb des Portals auch Aktionen an angedockten Schiffen durchgeführt werden, ist erst hinterher wichtig, nachdem die Raum/Item-Implementation fertig ist.
Z.B. könnte es ja innerhalb der Basis einen Händler geben.
Was für Räume könnten Sinn machen? Nun, ich bin nicht der Kreativste, aber ich denke mal an folgende:
- Brücke, Turbolift(die verschidenen Knöpfe bzw. das bedienpanel wäre ein item), Gemeinschaftsräume, Privaträume(verschlossen), eine Bar, einen Händer(äußere Aktionen!), Lagerraum, Blackboard(Nachrichten hinterlassen).
|
|
|
|
|
|
 |
    |
 |
Top Gun
Gast
|
|
Bevor ich auf den Rest antworten möchte muss ich darüber nachdenken, aber zu einem Punkt würde ich gleich etwas sagen wollen:
| Arakis hat folgendes geschrieben:
|
|
- Die Anordnung Räume sollten vorher unbedingt grafisch aufgezeichnet werden(Skizze), damit dieser hinterher auch einen Sinn ergeben. Ein Grafiker könnte dies dann später umsetzen, vielleicht schafft man es sogar seine eigene Position in der Grafik anzuzeigen.
|
- Ich werd gern mal nen groben Plan machen (hab heute meinen kreativen Basteltag) der ne Grundstruktur der Basis und Räume wiedergibt.
Aber zu meinem eigentlichen Anliegen: Man könnte grundsätzlich eine Karte des Decks anzeigen lassen über die RaumID könnte man so verschieden Grafiken des Decks ansprechen in dem je nach RaumID der richtige Standpunkt angezeigt wird... Leicht umzusetzen und zu erstellen...
|
|
|
|
|
|
| |
|
 |
Arakis
Spielleitung
Alter: 26
Anmeldungsdatum: 03.11.2005
Beiträge: 1238

|
|
Man sollte auf jedenfall das ganze in verschiedene Decks einteilen. Aber vielleicht sollte man das doch nicht "zu grafisch" machen, so hat man später die Möglichkeit, die Räume beliebig zu erweitern z.b. wenn spieler "Privaträume" mieten möchten. Was die darin anstellen ist mir egal . Ne, aber für Besprechungen etc. wie halt private-Chats.
Übrigens, du hast ne Foren-PN.
|
|
|
|
|
|
 |
    |
 |
DarkMo
Spielleitung

Anmeldungsdatum: 06.11.2005
Beiträge: 3770

|
|
wegen der grafik, vorschlag:
damit man jetz ned für jeden raum nen einzelnes übersichtspic machen muss (also wenn man den jeweiligen aufenthaltsort rot hinterlegen möchte oder so), könnte man dem raum ne xy koord geben als fest zugeordnete variable. anhand dieser xy koord, könnte dann auf dem bild ein roter punkt gemalt werden. mit php geht sowas zumindest.
aber an sich ginge damit auch das rot hinterlegen *grübel* man setzt an die xy koord nen kleinen bildausschnitt über die hintergrund/src grafik wo der raum rot hinterlegt dargestellt ist. also die ausrichtung der überblendungsgrafik wäre dann an die xy koords gerichtet. un falls man mehrere ebenen hat, macht man halt xyz koords draus ^^
hmm gut, is die frage ob das script das auch kann >< naja vllt nutzt der einwurf ja was...
|
|
|
|
|
|
| |
    |
 |
Arakis
Spielleitung
Alter: 26
Anmeldungsdatum: 03.11.2005
Beiträge: 1238

|
|
Genau, aber die xy-Koordinaten sollte halt Pixelbezogen sein, nicht dem Raumindex entsprechen, sonst wären ja alle Räume quadratisch. Im übrigen hab ich ne Lösung, wie man pro Deck eine Übersichtsgrafik verwenden kann und dennoch das Raumschiff mit Räumen beliebig erweitern kann:
Werden die Räume zu knapp, wird einfach ein neues Deck aufgemacht.
|
|
|
|
|
|
 |
    |
 |
Arakis
Spielleitung
Alter: 26
Anmeldungsdatum: 03.11.2005
Beiträge: 1238

|
|
-Pro Raum sollte es die Möglichkeit geben, eine Inviduelle Grafik anzuzeigen. Die Grafik kann beliebig aussehen und sollte annähernd an den Raum angelehnt sein. Also das Raumbild der Brücke sollte nicht unbedingt ein Foto aus einem Flugzeug-Cockbit sein
- Eine weitere Idee wäre ein Spielraum, wo man ein oder mehrere Spiele spielen kann.
- Durch ein Holodeck wäre es möglich, Räume in einer anderen Zeit zubetreten. Betritt man den Raum ein "Holodeck", so ist dieser nicht z.b. mittelalterlich eingerichtet und mit mittelalterlichen Gegenständen. Hinter dem Holodeckraum können ja noch weitere Räume liegen. Wichtig wäre, dass man keine Holodeckgegenstände das Holodeck verlassen können(z.B. Dolch).
TopGun, du solltest die Sachen nicht im Kopf behalten sondern eigentlich hier niederschreiben. Jetzt habs ich's gemacht, bevor ich's vergessen.
|
|
|
|
|
|
 |
    |
 |
DarkMo
Spielleitung

Anmeldungsdatum: 06.11.2005
Beiträge: 3770

|
|
| ja genau, das xy soll sich auf die deck grafik beziehen ^^ also die pixel position des raumes
|
|
|
|
|
|
| |
    |
 |
calarion
Level 2

Anmeldungsdatum: 09.12.2007
Beiträge: 95

|
|
Meine Ideen (auch wenn die schon erwähnt wurden):
- Transporterraum (oder generell "Einwegtüren" als Beamfunktion in alle Räume; bisher manuell editierbar)
- Jeffrysröhren (Deckweise in alle Räume)
- Lageplan in der Andockschleuse
- Türen mit Code und Berechtigungslevel (0-9)
- Administration für Berechtigungslevel und Besucher löschen
- Weltraumtüre als "Zum Raumschiff zurückkehren" (Portal verlassen)
- Charaktere einbauen mit denen man "Adventure"-mäßig reden (Auswahlverfahren), kleine Abenteuer machen und die jeder "spielen" kann
- Türen einseitig (z.B. von innen) abschließbar
- Raum für Handelsoptionen
- Brücke mit Alarmstufenänderung, Schildaktivierung
- Lagerräume mit je verschiedenem Warenbestand
- bei Alarmstufe Rotaktivierung alle Türen schließen
- Computerkonsolen (z.B. für Lageplan)
Prioritäten:
- Bug entfernen
- alternative Türen (Beamfuntion, Codetüre, Türen mit Freigabe für Sichergeitslevel: vom Admin zugewiesen)
- Gegenstände einbauen
- NPC's einbauen
"Grundgerüst" der Basis wie Sie aussehen könnte:
6 Decks, 20 Andockbuchten,...
Die Jeffrys-Röhren kann man wieder entfernen.
Ich hab mich an der Spielgrafik orientiert.
| PHP:
|
<?php #UseInterface Web, ShipPortal;
//Seiten:
// 0 : index
// 1 : raum
// 2 : charaktere verwalten
//
//
//Aktionen
//-1 : keine
// 0 : tuer verwenden
// 1 : gegenstand aufnehmen
// 2 : gegenstand ablegen
// 3 : charakter aktivieren
// 4 : charakter hinzufügen
// 5 : chat
//
// Gegenstandaktionen
// 0 : mitnehmen
If(MyShip is null)
{
MyShip = New CMyShip(713335);//test
GuestShip = New CMyShip(685578);//test
}
GuestUser = New CUser(GuestShip.UserID);
Var seite As Integer = 0;
Var aktion As String = - 1;
Var stationsid As Integer = MyShip.ShipID;
Var userid As Integer = GuestUser.UserID;
Var admin As Boolean = (MyShip.UserID = GuestUser.UserID);
Var storage As New CDataNodeStorage('rpgstation' & stationsid, true);
Var data As CDataNodeList = storage.Items;
//data.Clear();
Var settings As CDataNode = data.GetNode('settings');
Var spielerDaten As CDataNode;
Var charakterDaten As CDataNode;
Var node As CDataNode;
Var node2 As CDataNode;
If(settings.Items.Count = 0)
{
//initialisieren
node = settings.Items.GetNode('begruessung');
node.Value = 'Willkommen auf der Raumstation.';
node = settings.Items.GetNode('newCharakterId');
node.asInteger = 0;
node = settings.Items.GetNode('newRaumId');
node.asInteger = 0;
node = settings.Items.GetNode('newGegenstandId');
node.asInteger = 0;
node = settings.Items.GetNode('newTuerId');
node.asInteger = 0;
createGegenstandKlasse('Tuer');
createGegenstandKlasse('Phaser');
createGegenstandKlasse('Replikator');
createGegenstandKlasse('Essen');
//Raum 0
createRaum('Andockschleuse 1');//0
//Raum 1-5
createRaum('Weltraum');//1
createRaum('Andockschleuse 2');
createRaum('Andockschleuse 3');
createRaum('Andockschleuse 4');
createRaum('Andockschleuse 5');
//Raum 6-10
createRaum('Andockschleuse 6');
createRaum('Andockschleuse 7');
createRaum('Andockschleuse 8');
createRaum('Andockschleuse 9');
createRaum('Andockschleuse 10');
//Raum 11-15
createRaum('Andockschleuse 11');
createRaum('Andockschleuse 12');
createRaum('Andockschleuse 13');
createRaum('Andockschleuse 14');
createRaum('Andockschleuse 15');
//Raum 16-20
createRaum('Andockschleuse 16');
createRaum('Andockschleuse 17');
createRaum('Andockschleuse 18');
createRaum('Andockschleuse 19');
createRaum('Andockschleuse 20');
//Raum 21-24
createRaum('Andockring A');
createRaum('Andockring B');
createRaum('Andockring C');
createRaum('Andockring D');
//Raum 25-30
createRaum('Deck 1');
createRaum('Deck 2');
createRaum('Deck 3');
createRaum('Deck 4');
createRaum('Deck 5');
createRaum('Deck 6');
//Raum 31
createRaum('Turbolift');
createTuer(0, 1, true); //Weltraum-Andockschleuse
createTuer(2, 1, true); //Weltraum-Andockschleuse
createTuer(3, 1, true); //Weltraum-Andockschleuse
createTuer(4, 1, true); //Weltraum-Andockschleuse
createTuer(5, 1, true); //Weltraum-Andockschleuse
createTuer(6, 1, true); //Weltraum-Andockschleuse
createTuer(7, 1, true); //Weltraum-Andockschleuse
createTuer(8, 1, true); //Weltraum-Andockschleuse
createTuer(9, 1, true); //Weltraum-Andockschleuse
createTuer(10, 1, true); //Weltraum-Andockschleuse
createTuer(11, 1, true); //Weltraum-Andockschleuse
createTuer(12, 1, true); //Weltraum-Andockschleuse
createTuer(13, 1, true); //Weltraum-Andockschleuse
createTuer(14, 1, true); //Weltraum-Andockschleuse
createTuer(15, 1, true); //Weltraum-Andockschleuse
createTuer(16, 1, true); //Weltraum-Andockschleuse
createTuer(17, 1, true); //Weltraum-Andockschleuse
createTuer(18, 1, true); //Weltraum-Andockschleuse
createTuer(19, 1, true); //Weltraum-Andockschleuse
createTuer(20, 1, true); //Weltraum-Andockschleuse
createTuer(0, 21, false);
createTuer(2, 21, false);
createTuer(3, 21, false);
createTuer(4, 21, false);
createTuer(5, 21, false);
createTuer(6, 22, false);
createTuer(7, 22, false);
createTuer(8, 22, false);
createTuer(9, 22, false);
createTuer(10, 22, false);
createTuer(11, 23, false);
createTuer(12, 23, false);
createTuer(13, 23, false);
createTuer(14, 23, false);
createTuer(15, 23, false);
createTuer(16, 24, false);
createTuer(17, 24, false);
createTuer(18, 24, false);
createTuer(19, 24, false);
createTuer(20, 24, false);
createTuer(21, 26, false);
createTuer(22, 26, false);
createTuer(23, 26, false);
createTuer(24, 26, false);
createTuer(25, 31, false);
createTuer(26, 31, false);
createTuer(27, 31, false);
createTuer(28, 31, false);
createTuer(29, 31, false);
createTuer(30, 31, false);
createGegenstand('Kiste', 0, 'egal', false, 1000);
createGegenstand('Phaser', 0, 'waffe', true, 2);
createGegenstand('Phaser', 0, 'waffe', true, 2);
createGegenstand('Phaser', 0, 'waffe', true, 2);
createGegenstand('Phaser', 0, 'waffe', true, 2);
createGegenstand('Computerterminal', 0, 'egal', false, 1000);
node = settings.Items.GetNode('startRaum');
node.asInteger = 0;
//createCharakter('N00b', userid, false);
}
If(getDefaultEigenschaft(getGegenstandKlasse(0), 'zielraum').Value = '')
{
Var eineKlasse As CDataNode;
Var eineEigenschaft As CDataNode;
//Tür
eineKlasse = getGegenstandKlasse(0);
eineEigenschaft = getEigenschaft(eineKlasse, 'gewicht');
eineEigenschaft.asInteger = 0;
//Phaser
eineKlasse = getGegenstandKlasse(1);
eineEigenschaft = getEigenschaft(eineKlasse, 'gewicht');
eineEigenschaft.asInteger = 8;
If(Not eineKlasse.Items.GetNode('aktionen').Items.ContainsKey(0))
{
eineKlasse.Items.GetNode('aktionen').Items.Add(CStr(0));
}
//Replikator
eineKlasse = getGegenstandKlasse(2);
eineEigenschaft = getEigenschaft(eineKlasse, 'gewicht');
eineEigenschaft.asInteger = 0;
//Essen
eineKlasse = getGegenstandKlasse(3);
eineEigenschaft = getEigenschaft(eineKlasse, 'gewicht');
eineEigenschaft.asInteger = 12;
If(Not eineKlasse.Items.GetNode('aktionen').Items.ContainsKey(0))
{
eineKlasse.Items.GetNode('aktionen').Items.Add(CStr(0));
}
}
spielerDaten = data.GetNode('spieler').Items.GetNode(userid);
node = spielerDaten.Items.GetNode('aktiverCharakter');
Var charakterId As Integer = - 1;
If(node.Value <> '')
{
charakterId = node.asInteger;
charakterDaten = getCharakter(charakterId);
}
Else
{
// charakterDaten = createCharakter(GuestUser.Name, userid, true);
// charakterId = Integer.Parse(charakterDaten.Key);
}
Function getCharakter(id As Integer) As CDataNode
{
Return data.GetNode('charaktere').Items.GetNode(id);
}
Function getCharakterName(char As CDataNode) As String
{
Return char.Items.GetNode('name').Value;
}
Function getCharakterRaum(char As CDataNode) As CDataNode
{
Var raumId As Integer = char.Items.GetNode('position').asInteger;
Return getRaum(raumId);
}
Function getSpieler(id As Integer) As CDataNode
{
Return data.GetNode('spieler').Items.GetNode(id);
}
Function getRaum(id As Integer) As CDataNode
{
Return data.GetNode('raeume').Items.GetNode(id);
}
Function getRaumName(raum As CDataNode) As String
{
Return raum.Items.GetNode('name').Value;
}
Function getRaumBeschreibung(raum As CDataNode) As String
{
Return raum.Items.GetNode('beschreibung').Value;
}
Function getGegenstand(id As Integer) As CDataNode
{
Return data.GetNode('gegenstaende').Items.GetNode(id);
}
Function getGegenstandName(gs As CDataNode) As String
{
Return gs.Items.GetNode('name').Value;
}
Function getTuer(id As Integer) As CDataNode
{
Return data.GetNode('tueren').Items.GetNode(id);
}
Function getTuerZielRaum(tuer As CDataNode, start As Integer) As CDataNode
{
Var raumId As Integer = tuer.Items.GetNode('position1').asInteger;
If(raumId = start)
{
raumId = tuer.Items.GetNode('position2').asInteger;
}
Return getRaum(raumId);
}
Function isTuerZuRaum(tuer As CDataNode, raum As Integer) As Boolean
{
Var ok As Boolean = false;
Var raumId As Integer = tuer.Items.GetNode('position1').asInteger;
If(raumId = raum)
{
ok = true;
}
Else
{
ok = (tuer.Items.GetNode('position2').asInteger = raum);
}
Return ok;
}
Function isTuerVerschlossen(tuer As CDataNode) As Boolean
{
Return tuer.Items.GetNode('verschlossen').asBoolean;
}
Function addChatText(raum As CDataNode, sprecher As CDataNode, text As String, aktion As Boolean)
{
If(text.Length = 0)
{
Return;
}
Var useraktion As Boolean = (Not aktion) And text.StartsWith('/me ');
If(useraktion)
{
aktion = true;
text = text.Substring(4);
}
Var now As Date = Date.Now;
Var textteile As New CStringList();
textteile.Add('[');
textteile.Add(now.Day);
textteile.Add('.');
textteile.Add(now.Month);
textteile.Add('. ');
textteile.Add(now.Hour);
textteile.Add(':');
If(now.Minute < 10)
{
textteile.Add('0');
}
textteile.Add(now.Minute);
textteile.Add(':');
If(now.Second < 10)
{
textteile.Add('0');
}
textteile.Add(now.Second);
If(aktion)
{
textteile.Add('] *');
If(Not useraktion)
{
textteile.Add('*');
}
textteile.Add(' ');
}
Else
{
textteile.Add('] <');
}
Var charname As String = getCharakterName(sprecher);
textteile.Add(charname);
If( Not aktion)
{
textteile.Add('>');
}
textteile.Add(' ');
If(text.Length > 100)
{
textteile.Add(text.Substring(0, 100));
}
Else
{
textteile.Add(text);
}
text = textteile.Text('');
text = text.Replace('||||', '----');
Var personen As CDataNodeList = raum.Items.GetNode('charaktere').Items;
Var anzahl As Integer = personen.Count;
Var i As Integer;
For(i = 0 To anzahl - 1)
{
Var personId As Integer = personen.KeyByIndex(i);
Var person As CDataNode = getCharakter(personId);
Var chattext As String = person.Items.GetNode('chat').Value;
Var splitter As CStringList = CStringList.CreateFromString(chattext, '||||');
splitter.Add(text);
While(splitter.Count > 10)
{
splitter.RemoveAt(0);
}
chattext = splitter.Text('||||');
person.Items.GetNode('chat').Value = chattext;
}
}
Function createCharakter(name As String, besitzer As Integer, aktivieren As Boolean) As CDataNode
{
Var charakterId As Integer = 0;
Var n1 As CDataNode = settings.Items.GetNode('newCharakterId');
If(n1.Value = '')
{
n1.asInteger = 1;
}
Else
{
charakterId = n1.asInteger;
n1.asInteger = n1.asInteger + 1;
}
Var charakter As CDataNode = data.GetNode('charaktere').Items.GetNode(charakterId);
charakter.Items.GetNode('name').Value = name;
charakter.Items.GetNode('besitzer').asInteger = besitzer;
Var startraum As Integer = settings.Items.GetNode('startRaum').asInteger;
charakter.Items.GetNode('position').asInteger = startraum;
Var n2a As CDataNode = getSpieler(besitzer);
Var n2 As CDataNode = n2a.Items.GetNode('aktiverCharakter');
If((n2.Value = '') OR aktivieren)
{
n2.asInteger = charakterId;
}
n2a.Items.GetNode('alleCharaktere').Items.Add(CStr(charakterId));
Var raum As CDataNode = getRaum(startraum);
raum.Items.GetNode('charaktere').Items.Add(CStr(charakterId));
addChatText(raum, charakter, 'betritt den Raum ' & getRaumName(raum) & '.', true);
Return charakter;
}
Function createRaum(name As String) As CDataNode
{
Var raumId As Integer = 0;
Var n1 As CDataNode = settings.Items.GetNode('newRaumId');
If(n1.Value = '')
{
n1.asInteger = 1;
}
Else
{
raumId = n1.asInteger;
n1.asInteger = n1.asInteger + 1;
}
Var raum As CDataNode = data.GetNode('raeume').Items.GetNode(raumId);
raum.Items.GetNode('name').Value = name;
raum.Items.GetNode('beschreibung').Value = 'Dieser Raum ist ...';
Return raum;
}
Function createGegenstand(name As String, raum As Integer, klasse As Integer, mitnehmbar As Boolean, gewicht As Integer) As CDataNode
{
Var gegenstandId As Integer = 0;
Var n1 As CDataNode = settings.Items.GetNode('newGegenstandId');
If(n1.Value = '')
{
n1.asInteger = 1;
}
Else
{
gegenstandId = n1.asInteger;
n1.asInteger = n1.asInteger + 1;
}
Var gegenstand As CDataNode = data.GetNode('gegenstaende').Items.GetNode(gegenstandId);
gegenstand.Items.GetNode('name').Value = name;
gegenstand.Items.GetNode('klasse').Value = klasse;
gegenstand.Items.GetNode('positiontyp').Value = 'r';
gegenstand.Items.GetNode('position').asInteger = raum;
gegenstand.Items.GetNode('gewicht').asInteger = gewicht;
gegenstand.Items.GetNode('mitnehmbar').asBoolean = mitnehmbar;
getRaum(raum).Items.GetNode('gegenstaende').Items.Add(CStr(gegenstandId));
Return gegenstand;
}
Function createTuer(raum1 As Integer, raum2 As Integer, verschlossen As Boolean) As CDataNode
{
Var tuerId As Integer = 0;
Var n1 As CDataNode = settings.Items.GetNode('newTuerId');
If(n1.Value = '')
{
n1.asInteger = 1;
}
Else
{
tuerId = n1.asInteger;
n1.asInteger = n1.asInteger + 1;
}
Var tuer As CDataNode = data.GetNode('tueren').Items.GetNode(tuerId);
tuer.Items.GetNode('position1').asInteger = raum1;
tuer.Items.GetNode('position2').asInteger = raum2;
tuer.Items.GetNode('verschlossen').asBoolean = verschlossen;
getRaum(raum1).Items.GetNode('tueren').Items.Add(CStr(tuerId));
getRaum(raum2).Items.GetNode('tueren').Items.Add(CStr(tuerId));
Return tuer;
}
Function createGegenstandKlasse(name As String) As CDataNode
{
Var gegenstandKlasseId As Integer = 0;
Var n1 As CDataNode = settings.Items.GetNode('newGegenstandKlasseId');
If(n1.Value = '')
{
n1.asInteger = 1;
}
Else
{
gegenstandKlasseId = n1.asInteger;
n1.asInteger = n1.asInteger + 1;
}
Var ggsklasse As CDataNode = data.GetNode('gegenstandklassen').Items.GetNode(gegenstandKlasseId);
ggsklasse.Items.GetNode('name').Value = name;
Return ggsklasse;
}
Function getGegenstandKlasse(id As Integer) As CDataNode
{
Return data.GetNode('gegenstandklassen').Items.GetNode(id);
}
Function getEigenschaft(ggsOderKlasse As CDataNode, eigenschaft As String) As CDataNode
{
Return ggsOderKlasse.Items.GetNode('eigenschaften').Items.GetNode(eigenschaft);
}
Function getDefaultEigenschaft(klasse As CDataNode, eigenschaft As String) As CDataNode
{
Return klasse.Items.GetNode('defaulteigenschaften').Items.GetNode(eigenschaft);
}
Function Main()
{
If (Request.Form.ContainsKey('seite'))
{
seite = Integer.Parse(Request.Form.Item('seite'));
}
Elseif (Request.Parameters.ContainsKey('seite'))
{
seite = Integer.Parse(Request.Parameters.Item('seite'));
}
If (Request.Form.ContainsKey('aktion'))
{
aktion = Integer.Parse(Request.Form.Item('aktion'));
}
Elseif (Request.Parameters.ContainsKey('aktion'))
{
aktion = Integer.Parse(Request.Parameters.Item('aktion'));
}
//DEBUG
//Response.Add(seite);
//Response.Add(NEW CHtmlNewLine());
//Response.Add(aktion);
If(aktion > - 1)
{
Var rc As Integer = Response.Count;
FuehreAktionAus();
If(Response.Count > rc)
{
Response.Insert(rc, New CHtmlSeperator('Meldungen'));
}
}
ZeigeSeite();
}
Function FuehreAktionAus()
{
//alle seiten hier
If(aktion = 0)
{
AktionTuerVerwenden();
}
Elseif(aktion = 1)
{
AktionGegenstandNehmen();
}
Elseif(aktion = 2)
{
AktionGegenstandAblegen();
}
Elseif(aktion = 3)
{
AktionCharakterAktivieren();
}
Elseif(aktion = 4)
{
AktionCharakterErzeugen();
}
Elseif(aktion = 5)
{
AktionChat();
}
Elseif(aktion = 6)
{
AktionTest3();
}
Else
{
//default:keine
}
}
Function ZeigeSeite()
{
//alle seiten hier
If(seite = 1)
{
SeiteRaum();
}
Elseif(seite = 2)
{
SeiteCharaktereVerwalten();
}
Else
{
//default:index
SeiteIndex();
}
}
Function AktionTuerVerwenden()
{
Var tuerID As Integer = Request.Parameters.Item('tuerid');
Var tuer As CDataNode = getTuer(tuerID);
Var startraum As CDataNode = getCharakterRaum(charakterDaten);
Var raumID As Integer = startraum.Key;
If(NOT isTuerZuRaum(tuer, raumID))
{
Response.Add('Ungültige Tür! ');
}
Else
{
If(isTuerVerschlossen(tuer))
{
Response.Add('Diese Tür ist verschlossen.');
}
Else
{
Var zielraum As CDataNode = getTuerZielRaum(tuer, raumID));
zielraum.Items.GetNode('charaktere').Items.Add(CStr(charakterId));
startraum.Items.GetNode('charaktere').Items.Remove(CStr(charakterId));
charakterDaten.Items.GetNode('position').Value = zielraum.Key;
Var zielraumname As String = getRaumName(zielraum);
Response.Add('Betrete ' & zielraumname & '.');
addChatText(startraum, charakterDaten, 'verlässt den Raum ' & getRaumName(startraum) & '.', true);
addChatText(zielraum, charakterDaten, 'betritt den Raum ' & zielraumname & '.', true);
}
}
}
Function AktionGegenstandNehmen()
{
Var gegenstandID As Integer = Request.Parameters.Item('gegenstandnehmen');
Var gegenstand As CDataNode = getGegenstand(gegenstandID);
Var raum As CDataNode = getCharakterRaum(charakterDaten);
If(NOT raum.Items.GetNode('gegenstaende').Items.ContainsKey(gegenstandID))
{
Response.Add('Gegenstand nicht vorhanden!');
}
Else
{
If(NOT gegenstand.Items.GetNode('mitnehmbar').asBoolean)
{
Response.Add('Dieser Gegenstand kann nicht aufgenommen werden.');
}
Else
{
raum.Items.GetNode('gegenstaende').Items.Remove(CStr(gegenstandID));
charakterDaten.Items.GetNode('gegenstaende').Items.Add(CStr(gegenstandID));
gegenstand.Items.GetNode('positiontyp').Value = 'p';
gegenstand.Items.GetNode('position').asInteger = charakterId;
Var ggsname As String = getGegenstandName(gegenstand);
Response.Add(ggsname & ' aufgenommen.');
addChatText(raum, charakterDaten, 'nimmt den Gegenstand ' & ggsname & '.', true);
}
}
}
Function AktionGegenstandAblegen()
{
Var gegenstandID As Integer = Request.Parameters.Item('gegenstandablegen');
Var gegenstand As CDataNode = getGegenstand(gegenstandID);
Var raum As CDataNode = getCharakterRaum(charakterDaten);
If(NOT charakterDaten.Items.GetNode('gegenstaende').Items.ContainsKey(gegenstandID))
{
Response.Add('Gegenstand nicht vorhanden!');
}
Else
{
If(NOT gegenstand.Items.GetNode('mitnehmbar').asBoolean)
{
Response.Add('Dieser Gegenstand kann nicht abgelegt werden.');
}
Else
{
charakterDaten.Items.GetNode('gegenstaende').Items.Remove(CStr(gegenstandID));
raum.Items.GetNode('gegenstaende').Items.Add(CStr(gegenstandID));
gegenstand.Items.GetNode('positiontyp').Value = 'r';
gegenstand.Items.GetNode('position').Value = raum.Key;
Var ggsname As String = getGegenstandName(gegenstand);
Response.Add(ggsname & ' abgelegt.');
addChatText(raum, charakterDaten, 'legt den Gegenstand ' & ggsname & ' in den Raum.', true);
}
}
}
Function AktionCharakterAktivieren()
{
Var aktivieren As Integer = Request.Parameters.Item('charid');
If(spielerDaten.Items.GetNode('alleCharaktere').Items.ContainsKey(CStr(aktivieren)))
{
spielerDaten.Items.GetNode('aktiverCharakter').asInteger = aktivieren;
charakterId = aktivieren;
charakterDaten = getCharakter(aktivieren);
Response.Add('Charakter aktivert.');
}
Else
{
Response.Add('Charakter nicht vorhanden.');
}
}
Function AktionCharakterErzeugen()
{
If(admin OR true)
{
Var name As String = Request.Form.Item('charname');
Var besitzer As Integer = userid;
If(admin AND (Request.Form.Item('besitzer').Length > 0))
{
besitzer = Request.Form.Item('besitzer');
}
If(name.Length = 0)
{
Response.Add('Du hast keinen Namen eingegeben.');
}
Else
{
createCharakter(name, besitzer, false);
Response.Add('Charakter ' & name & ' erzeugt.');
}
}
}
Function AktionChat()
{
Var text As String = Request.Form.Item('chat');
Var raum As CDataNode = getCharakterRaum(charakterDaten);
addChatText(raum, charakterDaten, text, false);
}
Function AktionTest3()
{
//flottenauswahl
Response.Add('Gewählte Flotte:');
If(Request.Form.ContainsKey('flotte'))
{
Var flottenID As Integer = Request.Form.Item('flotte');
Var flotte As New CMyFlotte(flottenID);
Response.Add(flotte.Name);
}
Else
{
Response.Add('keine - BUG?');
}
seite = 2;
}
Function SeiteIndex()
{
Var tab As New CTable(3);
Response.Add(tab);
Var Row As CTableRow = tab.AddRow();
Var Cell As CTableCell = Row(0);
Cell.CssClass = 'buttonbody';
Cell.Add('Aktiver Charakter');
Cell = Row(1);
If(charakterDaten is null)
{
Cell.Add('-');
}
Else
{
Cell.Add(getCharakterName(charakterDaten))
}
Cell = Row(2);
Var url As New CScriptUrl();
url.Parameters.Add('seite', 2);
Cell.Add(New CHtmlLinkButton('verwalten', url, 'Hier kannst du deinen aktiven Charakter ändern oder neue Charaktere erzeugen'));
Response.Add(New CHtmlSeperator('Botschaft'));
Response.Add(settings.Items.GetNode('begruessung').Value);
url = New CScriptUrl();
url.Parameters.Add('seite', 1);
If(charakterDaten is null) {} Else
{
Response.Add(New CHtmlLinkButton('Raumstation betreten', url, 'Nun gehts los'));
}
}
Function SeiteRaum()
{
Var url As New CScriptUrl();
Var raum As CDataNode = getCharakterRaum(charakterDaten);
Response.Add(New CHtmlSeperator(getRaumName(raum)));
Response.Add(getRaumBeschreibung(raum));
Var tueren As CDataNodeList = raum.Items.GetNode('tueren').Items;
Var anzahl As Integer = tueren.Count;
Var i As Integer;
For(i = 0 To anzahl - 1)
{
Var tuer As Integer = tueren.KeyByIndex(i);
Var zielraum As CDataNode = getTuerZielRaum(getTuer(tuer), raum.Key));
url = New CScriptUrl();
url.Parameters.Add('seite', 1);
url.Parameters.Add('aktion', 0);
url.Parameters.Add('tuerid', tuer);
Response.Add(New CHtmlLinkButton(getRaumName(zielraum), url, 'Diesen Raum betreten'));
}
Response.Add(New CHtmlSeperator(getCharakterName(charakterDaten)));
//Response.Add(New CHtmlImage('http://forum.stne.net/images/avatars/6079448f25a946df4.jpg'));
Var gegenstaende As CDataNodeList = charakterDaten.Items.GetNode('gegenstaende').Items;
CreateGegenstaendeTabelle(gegenstaende, Response);
Response.Add(New CHtmlSeperator('Andere Personen im Raum'));
Var personen As CDataNodeList = raum.Items.GetNode('charaktere').Items;
anzahl = personen.Count;
For(i = 0 To anzahl - 1)
{
Var person As Integer = personen.KeyByIndex(i);
If(person <> charakterId)
{
Response.Add(getCharakterName(getCharakter(person)));
Response.Add(New CHtmlNewLine());
}
}
gegenstaende = raum.Items.GetNode('gegenstaende').Items;
anzahl = gegenstaende.Count;
If(anzahl > 0)
{
Response.Add(New CHtmlSeperator('Gegenstände im Raum'));
CreateGegenstaendeTabelle(gegenstaende, Response);
}
Response.Add(New CHtmlSeperator('Gespräche'));
url = New CScriptUrl();
url.Parameters.Add('seite', 1);
Response.Add(New CHtmlLinkButton('aktualisieren', url, 'aktualisieren'));
Var chattext As String = charakterDaten.Items.GetNode('chat').Value;
Var splitter As CStringList = CStringList.CreateFromString(chattext, '||||');
anzahl = splitter.Count;
For(i = 0 To anzahl - 1)
{
Response.Add(splitter.Item(i));
Response.Add(New CHtmlBreak());
}
Var form As New CHtmlForm(New CScriptUrl());
Response.Add(form);
Var tab2 As New CTable(2);
form.Add(tab2);
form.Add(New CHtmlInput(5, 'aktion', EHtmlInputType.Hidden));
form.Add(New CHtmlInput(1, 'seite', EHtmlInputType.Hidden));
Var Row2 As CTableRow = tab2.AddRow();
Var Cell2 As CTableCell = Row2(0);
Var ip As CHtmlTextBox = New CHtmlTextBox('', 'chat')
ip.Size = 100;
Cell2.Add(ip);
Cell2 = Row2(1);
Cell2.Add(New CHtmlSubmitButton('sagen', 'sagen'));
LinkZumIndex();
}
Function SeiteCharaktereVerwalten()
{
Response.Add(New CHtmlSeperator('Charaktere verwalten'));
Var aktiverCharakter As Integer = - 1;
If(charakterDaten is null) {} Else
{
aktiverCharakter = charakterDaten.Key;
}
Var anzahlCharaktere As Integer = 0;
Var charnodes As CDataNodeList = data.GetNode('charaktere').Items;
Var eigeneChars As CDataNodeList = spielerDaten.Items.GetNode('alleCharaktere').Items;
If(admin)
{
anzahlCharaktere = charnodes.Count;
}
Else
{
anzahlCharaktere = eigeneChars.Count;
}
If(anzahlCharaktere > 0)
{
Var tab As New CTable(4);
Response.Add(tab);
Var Row As CTableRow = tab.AddRow();
Var Cell As CTableCell = Row(0);
Cell.CssClass = 'buttonbody';
Cell.Add('Charakter');
Cell = Row(1);
Cell.CssClass = 'buttonbody';
Cell.Add('Besitzer');
Cell = Row(2);
Cell.CssClass = 'buttonbody';
Cell.Add('Aktiv');
Cell = Row(3);
Cell.CssClass = 'buttonbody';
Cell.Add('Aktionen');
Var i As Integer;
For(i = 0 To anzahlCharaktere - 1)
{
Var url As CScriptUrl;
Var char As CDataNode;
If(admin)
{
char = charnodes.ItemByIndex(i);
}
Else
{
Var charId As Integer = eigeneChars.KeyByIndex(i);
char = charnodes.ItemByIndex(charId);
}
Row = tab.AddRow();
Cell = Row(0);
Cell.Add(getCharakterName(char));
Cell = Row(1);
Var besitzer As CUser = New CUser(char.Items.GetNode('besitzer').asInteger);
Cell.Add(besitzer.GetHtmlName());
Cell = Row(2);
If(char.Key = aktiverCharakter)
{
Cell.Add('ja');
}
Else
{
Cell.Add('nein');
}
Cell = Row(3);
If((char.Key <> aktiverCharakter) AND (besitzer.UserID = userid))
{
url = New CScriptUrl();
url.Parameters.Add('seite', 2);
url.Parameters.Add('aktion', 3);
url.Parameters.Add('charid', char.Key);
Cell.Add(New CHtmlLinkButton('aktivieren', url, 'Diesen Charakter verwenden'));
}
}
}
//TODO: Berechtigung?
If(admin OR true)
{
Response.Add(New CHtmlSeperator('Neuen Charakter erzeugen'));
Var cols As Integer = 2;
If(admin)
{
cols = 4;
}
Var form As New CHtmlForm(New CScriptUrl());
Response.Add(form);
Var tab2 As New CTable(cols);
form.Add(tab2);
form.Add(New CHtmlInput(4, 'aktion', EHtmlInputType.Hidden));
form.Add(New CHtmlInput(2, 'seite', EHtmlInputType.Hidden));
Var Row2 As CTableRow = tab2.AddRow();
Var Cell2 As CTableCell = Row2(0);
Cell2.ColumnSpan = cols;
Cell2.CssClass = 'buttonbody';
Cell2.Add('Name des Charakters');
Row2 = tab2.AddRow();
Cell2 = Row2(0);
Cell2.Add(New CHtmlInput('', 'charname', EHtmlInputType.Text));
If(admin)
{
Cell2 = Row2(1);
Cell2.Add('Besitzer');
Cell2.CssClass = 'buttonbody';
Cell2 = Row2(2);
Cell2.Add(New CHtmlInput('', 'besitzer', EHtmlInputType.Text));
}
Cell2 = Row2(cols - 1);
Cell2.Add(New CHtmlSubmitButton('erzeugen', 'erzeugen'));
}
LinkZumIndex();
}
Function SeiteSeite3()
{
Response.Add(New CHtmlSeperator('Seite 3 mit Formular'));
Var form As New CHtmlForm(New CScriptUrl());
Var liste As New CHtmlListBox('flotte');
Var flotten As New CFlottenEnumerator();
Var flotte As CMyFlotte;
Var titel As String;
While(flotten.Next())
{
flotte = flotten.CurrentFlotte;
titel = flotte.Name & ' (' & flotte.Ships.Count & ')';
liste.Add(New CHtmlListBoxItem(titel, CStr(flotte.FlottenID), False));
}
form.Add(New CHtmlBreak());
form.Add(New CHtmlInput(2, 'aktion', EHtmlInputType.Hidden));
form.Add('Wähle eine Flotte:');
form.Add(liste);
form.Add(New CHtmlSubmitButton('Absenden', 'submit', ''));
Response.Add(form);
LinkZumIndex();
}
Function LinkZumIndex()
{
Response.Add(New CHtmlBreak());
Var url As New CScriptUrl();
url.Parameters.Add('seite', 0);
Response.Add(New CHtmlLinkButton('zurück', url, 'zum Index'));
}
Function CreateGegenstaendeTabelle(gegenstaende As CDataNodeList, parent As CHtmlControl)
{
Var anzahl As Integer = gegenstaende.Count;
If(anzahl > 0)
{
Var tab As New | | | | |