SpaceTrek - The New Empire Foren-Übersicht Portal
 STNE spielen  •  STNE Wiki  •  STNE Bibel  •  IRC #stne
Suchen  •  NPC Portal  •  FAQ
Einstellungen  •  Benutzergruppen  •  Registrieren  •   •  Profil  •  Einloggen, um private Nachrichten zu lesen  •  Login
Kalender 
Nächstes Thema anzeigen
Vorheriges Thema anzeigen

Neues Thema eröffnenNeue Antwort erstellen Vorheriges Thema anzeigenDieses Thema verschickenZeige Benutzer, die dieses Thema gesehen habenDieses Thema als Datei sichernPrintable versionEinloggen, um private Nachrichten zu lesenNächstes Thema anzeigen
Autor Nachricht
Top Gun
Gast






BeitragVerfasst: Fr 11 Apr, 2008 15:21  Titel:  Projekt: RPG-Basis Portal Antworten mit ZitatNach untenNach oben

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' stationsidtrue); 
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(01true);//deck 5 
  
createTuer(07false); 
   
  
createTuer(23false);//turbolift 
  
createTuer(24false); 
  
createTuer(25false); 
  
createTuer(26false); 
  
createTuer(27false); 
  
createTuer(28false); 
   
  
createTuer(39false);//deck 1 
   
  
createGegenstand('Kiste'0'egal'false1000); 
  
createGegenstand('Phaser'0'waffe'true2); 
  
createGegenstand('Phaser'0'waffe'true2); 
  
createGegenstand('Phaser'0'waffe'true2); 
  
createGegenstand('Phaser'0'waffe'true2); 
   
  
createGegenstand('Computerterminal'0'egal'false1000); 
   
   
  
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 CDataNodestart 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 CDataNoderaum 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 CDataNodesprecher As CDataNodetext As Stringaktion 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(0100)); 
  } 
  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 
As Integer
  For(
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 Stringbesitzer As Integeraktivieren 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(raumcharakter'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 Stringraum As Integerklasse As Integermitnehmbar As Booleangewicht 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 Integerraum2 As Integerverschlossen 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 CDataNodeeigenschaft As String) As CDataNode 

  Return 
ggsOderKlasse.Items.GetNode('eigenschaften').Items.GetNode(eigenschaft);  


Function 
getDefaultEigenschaft(klasse As CDataNodeeigenschaft 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(tuerraumID)) 
  { 
    
Response.Add('Ungültige Tür! '); 
  } 
  Else 
  { 
    If(
isTuerVerschlossen(tuer)) 
    { 
      
Response.Add('Diese Tür ist verschlossen.'); 
    } 
    Else  
    { 
      Var 
zielraum As CDataNode getTuerZielRaum(tuerraumID)); 
      
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(startraumcharakterDaten'verlässt den Raum ' getRaumName(startraum) & '.'true); 
      
addChatText(zielraumcharakterDaten'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(raumcharakterDaten'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(raumcharakterDaten'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(namebesitzerfalse); 
      
Response.Add('Charakter ' name ' erzeugt.'); 
    } 
  } 



Function 
AktionChat() 

  Var 
text As String Request.Form.Item('chat'); 
  Var 
raum As CDataNode getCharakterRaum(charakterDaten); 
  
addChatText(raumcharakterDatentextfalse); 


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 
As Integer
  For(
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(gegenstaendeResponse); 
   
  
Response.Add(New CHtmlSeperator('Andere Personen im Raum')); 
  Var 
personen As CDataNodeList raum.Items.GetNode('charaktere').Items
  
anzahl personen.Count
  For(
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(gegenstaendeResponse); 
  } 
   
  
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(
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 
As Integer
    For(
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(titelCStr(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 CDataNodeListparent 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 
As Integer
    For(
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






BeitragVerfasst: Fr 11 Apr, 2008 15:24  Titel:  (Kein Titel) Antworten mit ZitatNach untenNach oben

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

blank.gif
BeitragVerfasst: Fr 11 Apr, 2008 15:54  Titel:  (Kein Titel) Antworten mit ZitatNach untenNach oben

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).


Jungfrau  Schwein VerstecktPersönliche Galerie von ArakisBenutzer-Profile anzeigenPrivate Nachricht senden
Top Gun
Gast






BeitragVerfasst: Fr 11 Apr, 2008 16:04  Titel:  (Kein Titel) Antworten mit ZitatNach untenNach oben

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

blank.gif
BeitragVerfasst: Fr 11 Apr, 2008 16:20  Titel:  (Kein Titel) Antworten mit ZitatNach untenNach oben

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 Razz. Ne, aber für Besprechungen etc. wie halt private-Chats.

Übrigens, du hast ne Foren-PN.


Jungfrau  Schwein VerstecktPersönliche Galerie von ArakisBenutzer-Profile anzeigenPrivate Nachricht senden
DarkMo
Spielleitung



Anmeldungsdatum: 06.11.2005
Beiträge: 3770

blank.gif
BeitragVerfasst: Fr 11 Apr, 2008 16:35  Titel:  (Kein Titel) Antworten mit ZitatNach untenNach oben

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...


   OfflinePersönliche Galerie von DarkMoBenutzer-Profile anzeigenPrivate Nachricht senden
Arakis
Spielleitung


Alter: 26
Anmeldungsdatum: 03.11.2005
Beiträge: 1238

blank.gif
BeitragVerfasst: Fr 11 Apr, 2008 16:41  Titel:  (Kein Titel) Antworten mit ZitatNach untenNach oben

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.


Jungfrau  Schwein VerstecktPersönliche Galerie von ArakisBenutzer-Profile anzeigenPrivate Nachricht senden
Arakis
Spielleitung


Alter: 26
Anmeldungsdatum: 03.11.2005
Beiträge: 1238

blank.gif
BeitragVerfasst: Fr 11 Apr, 2008 19:57  Titel:  (Kein Titel) Antworten mit ZitatNach untenNach oben

-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 Wink

- 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.


Jungfrau  Schwein VerstecktPersönliche Galerie von ArakisBenutzer-Profile anzeigenPrivate Nachricht senden
DarkMo
Spielleitung



Anmeldungsdatum: 06.11.2005
Beiträge: 3770

blank.gif
BeitragVerfasst: Fr 11 Apr, 2008 21:05  Titel:  (Kein Titel) Antworten mit ZitatNach untenNach oben

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


   OfflinePersönliche Galerie von DarkMoBenutzer-Profile anzeigenPrivate Nachricht senden
calarion
Level 2
Level 2



Anmeldungsdatum: 09.12.2007
Beiträge: 95

blank.gif
BeitragVerfasst: Fr 11 Apr, 2008 23:33  Titel:  (Kein Titel) Antworten mit ZitatNach untenNach oben

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' stationsidtrue);
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(01true); //Weltraum-Andockschleuse
  
createTuer(21true); //Weltraum-Andockschleuse
  
createTuer(31true); //Weltraum-Andockschleuse
  
createTuer(41true); //Weltraum-Andockschleuse
  
createTuer(51true); //Weltraum-Andockschleuse
  
createTuer(61true); //Weltraum-Andockschleuse
  
createTuer(71true); //Weltraum-Andockschleuse
  
createTuer(81true); //Weltraum-Andockschleuse
  
createTuer(91true); //Weltraum-Andockschleuse
  
createTuer(101true); //Weltraum-Andockschleuse
  
createTuer(111true); //Weltraum-Andockschleuse
  
createTuer(121true); //Weltraum-Andockschleuse
  
createTuer(131true); //Weltraum-Andockschleuse
  
createTuer(141true); //Weltraum-Andockschleuse
  
createTuer(151true); //Weltraum-Andockschleuse
  
createTuer(161true); //Weltraum-Andockschleuse
  
createTuer(171true); //Weltraum-Andockschleuse
  
createTuer(181true); //Weltraum-Andockschleuse
  
createTuer(191true); //Weltraum-Andockschleuse
  
createTuer(201true); //Weltraum-Andockschleuse
  
  
  
createTuer(021false);
  
createTuer(221false);
  
createTuer(321false);
  
createTuer(421false);
  
createTuer(521false);
  
  
createTuer(622false);
  
createTuer(722false);
  
createTuer(822false);
  
createTuer(922false);
  
createTuer(1022false);
  
  
createTuer(1123false);
  
createTuer(1223false);
  
createTuer(1323false);
  
createTuer(1423false);
  
createTuer(1523false);
  
  
createTuer(1624false);
  
createTuer(1724false);
  
createTuer(1824false);
  
createTuer(1924false);
  
createTuer(2024false);
  
  
createTuer(2126false);
  
createTuer(2226false);
  
createTuer(2326false);
  
createTuer(2426false);
  
  
createTuer(2531false);
  
createTuer(2631false);
  
createTuer(2731false);
  
createTuer(2831false);
  
createTuer(2931false);
  
createTuer(3031false);
  
  
  
createGegenstand('Kiste'0'egal'false1000);
  
createGegenstand('Phaser'0'waffe'true2);
  
createGegenstand('Phaser'0'waffe'true2);
  
createGegenstand('Phaser'0'waffe'true2);
  
createGegenstand('Phaser'0'waffe'true2);
  
  
createGegenstand('Computerterminal'0'egal'false1000);
  
  
  
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 CDataNodestart 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 CDataNoderaum 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 CDataNodesprecher As CDataNodetext As Stringaktion 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(0100));
  }
  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 
As Integer;
  For(
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 Stringbesitzer As Integeraktivieren 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(raumcharakter'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 Stringraum As Integerklasse As Integermitnehmbar As Booleangewicht 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 Integerraum2 As Integerverschlossen 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 CDataNodeeigenschaft As String) As CDataNode
{
  Return 
ggsOderKlasse.Items.GetNode('eigenschaften').Items.GetNode(eigenschaft); 
}

Function 
getDefaultEigenschaft(klasse As CDataNodeeigenschaft 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(tuerraumID))
  {
    
Response.Add('Ungültige Tür! ');
  }
  Else
  {
    If(
isTuerVerschlossen(tuer))
    {
      
Response.Add('Diese Tür ist verschlossen.');
    }
    Else 
    {
      Var 
zielraum As CDataNode getTuerZielRaum(tuerraumID));
      
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(startraumcharakterDaten'verlässt den Raum ' getRaumName(startraum) & '.'true);
      
addChatText(zielraumcharakterDaten'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(raumcharakterDaten'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(raumcharakterDaten'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(namebesitzerfalse);
      
Response.Add('Charakter ' name ' erzeugt.');
    }
  }
}


Function 
AktionChat()
{
  Var 
text As String Request.Form.Item('chat');
  Var 
raum As CDataNode getCharakterRaum(charakterDaten);
  
addChatText(raumcharakterDatentextfalse);
}

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 
As Integer;
  For(
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(gegenstaendeResponse);
  
  
Response.Add(New CHtmlSeperator('Andere Personen im Raum'));
  Var 
personen As CDataNodeList raum.Items.GetNode('charaktere').Items;
  
anzahl personen.Count;
  For(
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(gegenstaendeResponse);
  }
  
  
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(
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 
As Integer;
    For(
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(titelCStr(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 CDataNodeListparent As CHtmlControl)
{
  Var 
anzahl As Integer gegenstaende.Count;
  If(
anzahl 0)
  {
    Var 
tab As New