1) { $session['user']['specialinc'] = $_GET['specialinc']; } // Specials verwarbeiten - User befindet sich bereits im Special if (!empty($session['user']['specialinc'])) { output("`^`c`bEtwas Besonderes!`c`b`0"); $specialinc = $session['user']['specialinc']; $session['user']['specialinc'] = ""; include ("special/" . $specialinc); if (!is_array($session['allowednavs']) || count($session['allowednavs']) == 0) { forest(true); } page_footer(); exit(); } if (!empty($_GET['op']) && $_GET['op'] == "run") { // Weglaufen if (e_rand() % 3 == 0) { output("`c`b`&Du bist erfolgreich vor deinem Gegner geflohen!`0`b`c`n"); $session['user']['reputation']--; $_GET['op'] = ""; } else { output("`c`b`\$Dir ist es nicht gelungen deinem Gegner zu entkommen!`0`b`c"); } } elseif (!empty($_GET['op']) && $_GET['op'] == "dragon") { // Zur Drachenhöhle gehen addnav("Betrete die Höhle", "dragon.php"); addnav("Renne weg wie ein Baby", "inn.php"); output("`\$Du betrittst den dunklen Eingang einer Höhle in den Tiefen des Waldes, "); output(" im Umkreis von mehreren hundert Metern sind die Bäume bis zu den Stümpfen niedergebrannt. "); output("Rauchschwaden steigen an der Decke des Höhleneinganges empor und werden plötzlich "); output("von einer kalten Windböe verweht. Der Eingang der Höhle liegt an der Seite eines Felsens "); output("ein Dutzent Meter über dem Boden des Waldes, wobei Geröll eine kegelförmige "); output("Rampe zum Eingang bildet. Stalaktiten und Stalagmiten nahe des Einganges "); output("erwecken in dir dein Eindruck, dass der Höhleneingang in Wirklichkeit "); output("das Maul einer riesigen Bestie ist. "); output("`n`nAls du vorsichtig den Eingang der Höhle betrittst, hörst - oder besser fühlst du, "); output("ein lautes Rumpeln, das etwa dreißig Sekunden andauert, bevor es wieder verstummt "); output("Du bemerkst, dass dir ein Schwefelgeruch entgegenkommt. Das Poltern ertönt erneut, und hört wieder auf, "); output("in einem regelmäßigen Rhythmus. "); output("`n`nDu kletterst den Geröllhaufen rauf, der zum Eingang der Höhle führt. Deine Schritte zerbrechen "); output("die scheinbaren Überreste ehemaliger Helden."); output("`n`nJeder Instinkt in deinem Körper will fliehen und so schnell wie möglich zurück ins warme Wirtshaus und "); output(" " . ($session['user']['sex'] ? "zum noch wärmeren Seth" : "zur noch wärmeren Violet") . ". Was tust du?"); $session['user']['seendragon'] = 1; } if ($_GET['op'] == "search") { checkday(); if ($session['user']['turns'] <= 0) { // Keine Runden mehr -> Kein Kampf output("`\$`bDu bist zu müde um heute den Wald weiter zu durchsuchen. Vielleicht hast du morgen mehr Energie dazu.`b`0"); $_GET['op'] = ""; } else { $session['user']['drunkenness'] = round($session['user']['drunkenness'] * .9, 0); // Chance, ein Special zu bekommen: 1 zu $specialtychance $chanceforspecial = (int) getsetting('chanceforspecial', 7); if (e_rand() % $chanceforspecial == 0) { output("`^`c`bEtwas Besonderes!`c`b`0"); // Alle Specials einlesen $handle = opendir("special"); if ($handle) { $events = array(); // ...und in Array zwischenspeichern while (false !== ($file = readdir($handle))) { if (strpos($file, ".php") > 0) { // Die Darkhorsetaverne fällt raus, wenn man sie gezielt ansteuern kann! if ($session['user']['hashorse'] > 0 && $GLOBALS['playermount']['tavern'] > 0 && strpos($file, "darkhorse") !== false) { continue; } array_push($events, $file); } } // Keine Events vorhanden if (count($events) == 0) { output("`b`@Arrr, dein Administrator hat entschieden, dass es dir nicht erlaubt ist, besondere Ereignisse zu haben. Beschwer dich bei ihm, nicht beim Programmierer."); } else { // Event zufällig auswählen $event = $events[array_rand($events)]; $opsave = $_GET['op']; // GET-Ops zwischenspeichern $_GET['op'] = ""; // Und Special "leer" beginnen include (sprintf("special/%s",$event)); $_GET['op'] = $opsave; // Danach zurückschreiben } } else { output("`c`b`\$FEHLER!!!`b`c`&Es ist nicht möglich die besonderen Ereignisse zu öffnen! Bitte benachrichtige den Administrator!!"); } if (empty($GLOBALS['nav'])) // Wenn es keine weiteren Navigastionsanweisungen gab normal fortfahren forest(true); } else { // Kein Special - Gegner zum Bekämpfen suchen $session['user']['turns']--; $battle = true; $chanceforothermonster = (int) getsetting('cforothermon',2); $chanceforstrongermonster = (int) getsetting('cforstrongermon',5); $chanceforweakermonster = (int) getsetting('cforweakermon',3); $monstermodifier = 0; if (e_rand(0, $chanceforothermonster) == 1) { // Es taucht ein stärkeres oder schwächeres zufällig Monster auf if(e_rand(1,$chanceforweakermonster) == 1) $monstermodifier--; if(e_rand(1,$chanceforstrongermonster) == 1) $monstermodifier++; } if (!empty($_GET['type']) && $_GET['type'] == "slum") { // Herumziehen $monstermodifier--; output("`\$Du steuerst den Abschnitt des Waldes an, von dem du weißt, dass sich dort Feinde aufhalten, die dir ein bisschen angenehmer sind.`0`n"); $session['user']['reputation']--; } elseif (!empty($_GET['type']) && $_GET['type'] == "thrill") { // Nerfenkitzel $monstermodifier++; output("`\$Du steuerst den Abschnitt des Waldes an, in dem sich Kreaturen deiner schlimmsten Albträume aufhalten, in der Hoffnung dass Du eine findest die verletzt ist.`0`n"); $session['user']['reputation']++; } // Abschließendes Monsterlevel berechnen (muss größer 0 sein!) $targetlevel = ($session['user']['level'] + $monstermodifier); if ($targetlevel < 1) $targetlevel = 1; // Zufälliges Monster der gewünschten Stufe ausgeben lassen $sql = "SELECT * FROM creatures WHERE creaturelevel = $targetlevel ORDER BY RAND() LIMIT 1"; $result = db_query($sql); $badguy = db_fetch_assoc($result); // Zufällige Abweichung der Standard Ehrfahrungs-Belohnung für dieses Monster berechnen $expflux = round($badguy['creatureexp'] / 10, 0); $expflux = e_rand(-$expflux, $expflux); $badguy['creatureexp'] += $expflux; // Monster der Spielserstärke anpassen $badguy['playerstarthp'] = $session['user']['hitpoints']; // Lebenspunkte gleichsetzen $dk = 0; // Zähler für bonuspunkte durch Drachenkills foreach ($session['user']['dragonpoints'] as $val) { if ($val == "at" || $val == "de") $dk++; // Bonus für zusätzlich Angriffs- und Verteidugungspunkte } // Bonus für zusätzliche Lebenspunkte $dk += (int) (($session['user']['maxhitpoints'] - ($session['user']['level'] * 10)) / 5); if (!$beta) $dk = round($dk * 0.25, 0); else $dk = round($dk, 0); $atkflux = e_rand(0, $dk); // Angriffsabweichung if ($beta) $atkflux = min($atkflux, round($dk / 4)); $defflux = e_rand(0, ($dk - $atkflux)); if ($beta) $defflux = min($defflux, round($dk / 4)); $hpflux = ($dk - ($atkflux + $defflux)) * 5; // Lepenspunkteabweichung // Abweichungen eintragen $badguy['creatureattack'] += $atkflux; $badguy['creaturedefense'] += $defflux; $badguy['creaturehealth'] += $hpflux; if ($beta) { $badguy['creaturedefense'] *= 0.66; $badguy['creaturegold'] *= (1 + (.05 * $dk)); if ($session['user']['race'] == 4) $badguy['creaturegold'] *= 1.1; } else { if ($session['user']['race'] == 4) $badguy['creaturegold'] *= 1.2; } // Gegner abschließen und zuweisen $badguy['diddamage'] = 0; $session['user']['badguy'] = createstring($badguy); if ($beta) { if ($session['user']['superuser'] >= 3) { output("Debug: $dk dragon points.`n"); output("Debug: +$atkflux attack.`n"); output("Debug: +$defflux defense.`n"); output("Debug: +$hpflux health.`n"); } } } } } // Bei Kampf oder gescheitertem Fluchtversuch Gefecht aktivieren if ($_GET['op'] == "fight" || $_GET['op'] == "run") { $battle = true; } // Gefechtsmodus: if (!empty($battle)) { // Gefechtsroutinen einbinden (und ausführen) include ("battle.php"); // Auswerung der Gefechtsroutinen if ($GLOBALS['victory']) { // Spieler besiegt Monster // Gewonnenes Gold berechnen: if (getsetting("dropmingold", 0)) { // Soll immer ein Mindestbetrag abgeworfen werden? $badguy['creaturegold'] = e_rand($badguy['creaturegold'] / 4, 3 * $badguy['creaturegold'] / 4); } else { $badguy['creaturegold'] = e_rand(0, $badguy['creaturegold']); } // Gewonnene Erfahrung berechnen: $expbonus = round(($badguy['creatureexp'] * (1 + .25 * ($badguy['creaturelevel'] - $session['user']['level']))) - $badguy['creatureexp'], 0); output("`b`&{$badguy['creaturelose']}`0`b`n"); output("`b`\$Du hast {$badguy['creaturename']} erledigt!`0`b`n"); output("`#Du erbeutest `^{$badguy['creaturegold']}`# Goldstücke!`n"); // Zufällige Gegenstände finden // @TODO Wahrscheinlichkeiten überarbeiten und einstellbar machen $findit = e_rand(1, 27); if ($findit == 2) { // Edelstein output("`&Du findest EINEN EDELSTEIN!`n`#"); $session['user']['gems']++; } elseif ($findit == 5) { // Donationpoint $session['user']['donation'] += 1; } elseif ($findit == 20 && e_rand(1, 4) == 3) { // Gegenstand/Item // Zufälligen Typ des Gegenstandes ermitteln $sql = "SELECT * FROM items WHERE owner=0 AND (class='Beute.Prot' OR class='Zaub.Prot') ORDER BY RAND() LIMIT 1"; $result = db_query($sql); $item = db_fetch_assoc($result); if (!empty($item['name'])) { if ($item['class'] == "Beute.Prot") { // Sinnloses Zeugs $sql = sprintf("INSERT INTO items(name,class,owner,gold,gems,description) VALUES ('%s','Beute',%u,%u,%u,'%s')", addslashes($item['name']), $sesion['user']['acctid'],$item['gold'],$item['gems'],addslashes($item['description'])); } else if ($item['class'] == "Zaub.Prot") { // Zauber $item['description'] .= " (gebraucht)"; $item['value1'] = e_rand(1, $item['value2']); // "Abnutzung" simulieren $item['gold'] = $item['gold'] * (($item['value1'] + 1) / ($item['value2'] + 1)); $sql = sprintf("INSERT INTO items(name,class,owner,gold,gems,value1,value2,hvalue,description,buff) VALUES ('%s','Zauber',%u,%u,%u,%u,%u,%u,'%s','%s')",addslashes($item['name']),$session['user']['acctid'],$item['gold'],$item['gems'],$item['value1'],$item['value2'],$item['hvalue'],addslashes($item['description']),addslashes($item['buff'])); } else { $sql = "UPDATE items SET owner=" . $session['user']['acctid'] . " WHERE id=" . $item['id']; } db_query($sql); output("`n`qBeim Durchsuchen von {$badguy['creaturename']} `qfindest du `&{$item['name']}`q! ({$item['description']})`n`n`#"); } } elseif ($findit == 25 && e_rand(1, 6) == 2) { // Rüstung $sql = "SELECT * FROM armor WHERE defense<=" . $session['user']['level'] . " ORDER BY RAND() LIMIT 1"; $result = db_query($sql); if (db_num_rows($result) > 0) { $amor = db_fetch_assoc($result); $amor['value'] = round($amor['value'] / 10); $sql = sprintf("INSERT INTO items(name,class,owner,gold,value1,description) VALUES ('%s','Rüstung',%u,%u,%u,'Gebrauchte Level %u Rüstung mit %u Verteidigung')",addslashes($amor['amorname']),$session['user']['acctid'],$amor['value'],$amor['defense'],$amor['level'],$amor['defense']); db_query($sql); output("`n`QBeim Durchsuchen von {$badguy['creaturename']} `Qfindest du die Rüstung `%{$amor['armorname']}`Q!`n`n`#"); } } elseif ($findit == 26 && e_rand(1, 6) == 2) { // Waffe $sql = "SELECT * FROM weapons WHERE damage<=" . $session['user']['level'] . " ORDER BY RAND() LIMIT 1"; $result2 = db_query($sql) or die(db_error(LINK)); if (db_num_rows($result2) > 0) { $weapon = db_fetch_assoc($result2); $weapon['value'] = round($weapon['value'] / 10); $sql = sprintf("INSERT INTO items(name,class,owner,gold,value1,description) VALUES ('%s','Rüstung',%u,%u,%u,'Gebrauchte Level %u Rüstung mit %u Verteidigung')",addslashes($weapon['weaponname']),$session['user']['acctid'],$weapon['value'],$weapon['damage'],$weapon['level'],$weapon['damagee']); db_query($sql) or die(sql_error($sql)); output("`n`QBeim Durchsuchen von {$badguy['creaturename']} `Qfindest du die Waffe `%{$weapon['weaponname']}`Q!`n`n`#"); } } // GOld unf Erfahrungspunkte abrechnen if ($expbonus > 0) { output("`#*** Durch die hohe Schwierigkeit des Kampfes erhältst du zusätzlich `^$expbonus`# Erfahrungspunkte! `n({$badguy['creatureexp']} + " . abs($expbonus) . " = " . ($badguy['creatureexp'] + $expbonus) . ") "); } else if ($expbonus < 0) { output("`#*** Weil dieser Kampf so leicht war, verlierst du `^" . abs($expbonus) . "`# Erfahrungspunkte! `n({$badguy['creatureexp']} - " . abs($expbonus) . " = " . ($badguy['creatureexp'] + $expbonus) . ") "); } output("Du bekommst insgesamt `^" . ($badguy['creatureexp'] + $expbonus) . "`# Erfahrungspunkte!`n`0"); $session['user']['gold'] += $badguy['creaturegold']; $session['user']['experience'] += ($badguy['creatureexp'] + $expbonus); $creaturelevel = $badguy['creaturelevel']; $_GET['op'] = ""; // Perfekter Kampf? if ($badguy['diddamage'] != 1) { if ($session['user']['level'] >= getsetting("lowslumlevel", 4) || $session['user']['level'] <= $creaturelevel) { // Extrarunde für perfekten Kampf gegen ausreichend starken Gegner output("`b`c`&~~ Perfekter Kampf! ~~`\$`n`bDu erhältst eine Extrarunde!`c`0`n"); $session['user']['turns']++; if ($expbonus > 0) { $session['user']['donation'] += 1; } } else { // Gegner war zu schwach output("`b`c`&~~ Perfekter Kampf! ~~`b`\$`nEin schwierigerer Kampf hätte dir eine extra Runde gebracht.`c`n`0"); } } $dontdisplayforestmessage = true; $badguy = array(); } else { // Noch nicht gewonnen - Kampf läuft noch oder Niederlage if ($defeat) { // Spieler stirbt addnav("Tägliche News", "news.php"); // Beleidigung des Monsters in die News schreiben $sql = "SELECT taunt FROM taunts ORDER BY rand(" . e_rand() . ") LIMIT 1"; $result = db_query($sql) or die(db_error(LINK)); $taunt = db_fetch_assoc($result); $taunt = str_replace("%s", ($session['user']['sex'] ? "sie" : "ihn"), $taunt[taunt]); $taunt = str_replace("%o", ($session['user']['sex'] ? "sie" : "er"), $taunt); $taunt = str_replace("%p", ($session['user']['sex'] ? "ihr" : "sein"), $taunt); $taunt = str_replace("%x", ($session['user']['weapon']), $taunt); $taunt = str_replace("%X", $badguy[creatureweapon], $taunt); $taunt = str_replace("%W", $badguy[creaturename], $taunt); $taunt = str_replace("%w", $session['user']['name'], $taunt); addhistory(1); addnews("`%{$session['user']['name']}`5 wurde im Wald von {$badguy['creaturename']} niedergemetzelt.`n$taunt"); // Spiler auf "tot" setzen und durch Abzug von Gold und Exp bestrafen $session['user']['alive'] = false; debuglog("lost {$session['user']['gold']} gold when they were slain in the forest"); $session['user']['gold'] = 0; $session['user']['hitpoints'] = 0; $session['user']['experience'] = round($session['user']['experience'] * .9, 0); $session['user']['badguy'] = ""; // Abschlussbemerkung output("`b`&Du wurdest von `%{$badguy['creaturename']}`& niedergemetzelt!!!`n"); output("`4Dein ganzes Gold wurde dir abgenommen!`n"); output("`410% deiner Erfahrung hast du verloren!`n"); output("Du kannst morgen weiter kämpfen."); } else { // Kampf läuft noch - Optionen anzeigen fightnav(); } } } if (empty($_GET['op'])) { // Workaround, damit das Fenster nicht leer bleibt und der User weiter machen kann forest($dontdisplayforestmessage); } page_footer(); ?>