Listing 1: Card Script zu "Im Kerker des Grauens"on OpenCard -- initTiles initKonstanten initGame end openCard on initGame global gTileArray, gTileKnown, gPlayer, gDone global kDungeonSizeH, kDungeonSizeV, kTileSize global kEmpty, kWall, kPlayer, kTroll, kTempTroll, kMoney, kExitPos global kPlayerTile, kEmptyTile, kTrollTile, kMoneyTile, kWallTile global kExitTile, kBlackTile global kHPos, kVPos, kHealthPos global kTop, kBottom, kLeft, kRight -- die Bildschirmausgabe stoppen lock screen play "IntroSound" -- Den done-Flag setzen put FALSE into gDone -- Wir "würfeln" die Anzahl der Räume aus put numberOfRooms() into numRooms repeat with i = 1 to kDungeonSizeH repeat with j = 1 to kDungeonSizeV -- erst einmal mauern wir das gesamte Dungeon zu put kWall into item j of line i of gTileArray -- und erklären alle Räume zu "nie gesehen put FALSE into item j of line i of gTileKnown put (i & ", " & j) into buttonName set the icon of cd button buttonName to kBlackTile set cursor to busy end repeat end repeat repeat with room = 1 to numRooms -- Erstelle Räume put 1 + random(5 - (numRooms DIV 2)) into hight put 1 + random(5 - (numRooms DIV 2)) into width put 1 + random(kDungeonSizeV - hight - 2) into item kTop¬ of line room of roomRect put item kTop of line room of roomRect + hight¬ into item kBottom of line room of roomRect put 1 + random(kDungeonSizeH - width - 2) into item kLeft¬ of line room of roomRect put item kLeft of line room of roomRect + width¬ into item kRight of line room of roomRect -- die Innenräume mit "leeren" Kacheln füllen: repeat with h = item kLeft of line room of roomRect¬ to item kRight of line room of roomRect repeat with v = item kTop of line room of roomRect¬ to item kBottom of line room of roomRect put kEmpty into item v of line h of gTileArray end repeat end repeat end repeat -- und jetzt die Korridore zwischen den Räumen repeat with room = 1 to numRooms - 1 -- erst einmal zwei zufällige Punkt in room und room + 1 wählen put item kLeft of line room of roomRect¬ + random(item kRight of line room of roomRect¬ - item kLeft of line room of roomRect) into h1 put item kTop of line room of roomRect¬ + random(item kBottom of line room of roomRect¬ - item kTop of line room of roomRect) into v1 put item kLeft of line room + 1 of roomRect¬ + random(item kRight of line room + 1 of roomRect¬ - item kLeft of line room + 1 of roomRect) into h2 put item kTop of line room + 1 of roomRect¬ + random(item kBottom of line room + 1 of roomRect¬ - item kTop of line room + 1 of roomRect) into v2 -- jetzt entlang der horizontalen Achse einen Weg suchen: if (h1 < h2) then repeat with h = h1 to h2 put kEmpty into item v1 of line h of gTileArray end repeat else repeat with h = h2 to h1 put kEmpty into item v1 of line h of gTileArray end repeat end if -- dann entlang der vertikalen Achse if (v1 < v2) then repeat with v = v1 to v2 put kEmpty into item v of line h2 of gTileArray end repeat else repeat with v = v2 to v1 put kEmpty into item v of line h2 of gTileArray end repeat end if end repeat -- jetzt bevölkern wir die Räume -- erst die Schätze (0 - 4 Geldhäufchen) put random(5) - 1 into numTreasures put 0 into i repeat while i < numTreasures put random(kDungeonSizeH) into h put random(kDungeonSizeV) into v if item v of line h of gTileArray = kEmpty then put kMoney into item v of line h of gTileArray add 1 to i end if end repeat -- dann die Trolle (1 - 5) put random(5) into numTrolle put 0 into i repeat while i < numTrolle put random(kDungeonSizeH) into h put random(kDungeonSizeV) into v if item v of line h of gTileArray = kEmpty then put kTroll into item v of line h of gTileArray add 1 to i end if end repeat -- den Ausgang put FALSE into gesetzt repeat until gesetzt = TRUE put random(kDungeonSizeH) into h put random(kDungeonSizeV) into v if item v of line h of gTileArray = kEmpty then put kExitPos into item v of line h of gTileArray put TRUE into gesetzt end if end repeat -- und zum Schluß unseren Hero put FALSE into gesetzt repeat until gesetzt = TRUE put random(kDungeonSizeH) into h put random(kDungeonSizeV) into v if item v of line h of gTileArray = kEmpty then put kPlayer into item v of line h of gTileArray -- seine Position und Gesundheit tragen wir ein put h into item kHPos of gPlayer put v into item kVPos of gPlayer put 5 into item kHealthPos of gPlayer put TRUE into gesetzt end if end repeat -- jetzt müssen wir noch die Umgebung unseres -- Helden sichtbar machen: showAroundPlayer -- den Bildschirm wieder freigeben unlock screen end initGame function numberOfRooms -- Anzahl der Räume liegt zwischen 3 und 6 return 2 + random(4) end numberOfRooms on showAroundPlayer global gTileArray, gTileKnown, gPlayer global kHPos, kVPos, kHealthPos put item kHPos of gPlayer into playerH put item kVPos of gPlayer into playerV repeat with h = playerH - 1 to playerH + 1 repeat with v = playerV - 1 to playerV + 1 if ( (v > 0) AND (h > 0) ) then if item v of line h of gTileKnown = FALSE then put TRUE into item v of line h of gTileKnown drawTile h, v end if end if end repeat end repeat end showAroundPlayer on drawTile h, v global gTileArray, gTileKnown global kEmpty, kWall, kPlayer, kTroll, kTempTroll, kMoney, kExitPos global kPlayerTile, kEmptyTile, kTrollTile, kMoneyTile, kWallTile global kExitTile, kBlackTile if item v of line h of gTileKnown = TRUE then put item v of line h of gTileArray into tileStyle put (h & ", " & v) into buttonName if tileStyle = kEmpty then set the icon of cd button buttonName to kEmptyTile end if if tileStyle = kWall then set the icon of cd button buttonName to kWallTile end if if tileStyle = kMoney then set the icon of cd button buttonName to kMoneyTile end if if tileStyle = kTroll then set the icon of cd button buttonName to kTrollTile end if if tileStyle = kTempTroll then set the icon of cd button buttonName to kTrollTile end if if tileStyle = kExitPos then set the icon of cd button buttonName to kExitTile end if if tileStyle = kPlayer then set the icon of cd button buttonName to kPlayerTile end if end if end drawTile on moveTroll h, v global gTileArray, gTileKnown, gPlayer, gDone, gAlive global kDungeonSizeH, kDungeonSizeV, kTileSize global kEmpty, kWall, kPlayer, kTroll, kTempTroll, kMoney, kExitPos global kPlayerTile, kEmptyTile, kTrollTile, kMoneyTile, kWallTile global kExitTile, kBlackTile global kHPos, kVPos, kHealthPos global kDirTable put (h & ", " & v) into trollPosName -- Erst einmal die Position unseres Heros bestimmen put item kHPos of gPlayer into playerH put item kVPos of gPlayer into playerV put (playerH & ", " & playerV) into playerPosName -- Abstand bestimmen (City-Block-Abstand) put abs(h - playerH) + abs(v - playerV) into distance -- merkt der Troll irgend etwas? if (distance < random(15)) then -- der Troll bewegt sich auf unseren Helden zu if (h < playerH) then put h + 1 into newH else if (h > playerH) then put h - 1 into newH else put h into newH end if end if if (v < playerV) then put v + 1 into newV else if (v > playerV) then put v - 1 into newV else put v into newV end if end if else -- der Troll bewegt sich zufällig put random(8) into direction put h + (item kHPos of line direction of kDirTable)¬ into newH put v + (item kVPos of line direction of kDirTable)¬ into newV end if -- läuft der Troll auch nicht aus dem Spielfeld hinaus? if ( (newV > 0) AND (newH > 0) ) then if ( (newV <= kDungeonSizeV) AND (newH <= kDungeonSizeH) ) then put item newV of line newH of gTileArray into tileStyle if tileStyle = kEmpty then put kTempTroll into item newV of line newH of gTileArray put kEmpty into item v of line h of gTileArray drawTile newH, newV drawTile h, v end if if tileStyle = kPlayer then play "MonsterAttacks" -- Troll gewinnt Attacke? if random(10) > 5 then -- Troll gewinnt Attacke!! subtract 1 from item kHealthPos of gPlayer -- Lebt der Held noch? if (item kHealthPos of gPlayer) > 0 then -- Der Held überlebt else -- der Held stirbt play "HeroDied" put FALSE into gAlive exit moveTroll end if else -- der Troll stirbt play "MonsterDied" put kEmpty into item v of line h of gTileArray drawTile h, v end if end if end if end if end moveTroll on movePlayer h, v global gTileArray, gTileKnown, gPlayer, gDone, gAlive global kDungeonSizeH, kDungeonSizeV, kTileSize global kEmpty, kWall, kPlayer, kTroll, kTempTroll, kMoney, kExitPos global kPlayerTile, kEmptyTile, kTrollTile, kMoneyTile, kWallTile global kExitTile, kBlackTile global kHPos, kVPos, kHealthPos set cursor to watch lock screen put (h & ", " & v) into clickedButtonName -- Erst einmal die Position unseres Heros bestimmen put item kHPos of gPlayer into playerH put item kVPos of gPlayer into playerV put (playerH & ", " & playerV) into playerButtonName -- haben wir in ein Nachbarfeld geklickt? if (h >= (playerH - 1)) then if (h <= (playerH + 1)) then if (v >= (playerV - 1)) then if (v <= (playerV + 1)) then -- OK, wir sind da, was nun? put item v of line h of gTileArray into tileStyle if tileStyle = kEmpty then put kEmpty into item playerV of line playerH¬ of gTileArray DrawTile playerH, playerV put kPlayer into item v of line h of gTileArray put h into item kHPos of gPlayer put v into item kVPos of gPlayer DrawTile h, v end if if tileStyle = kMoney then put kEmpty into item playerV of line playerH¬ of gTileArray DrawTile playerH, playerV put kPlayer into item v of line h of gTileArray put h into item kHPos of gPlayer put v into item kVPos of gPlayer DrawTile h, v -- Hier können wir später die Punktzahl erhöhen play "GetMoney" end if if tileStyle = kWall then beep end if if tileStyle = kTroll then play "HeroAttacks" -- angreifen if (random(10) <= 5) then -- wir gewinnen!!! play "MonsterDied" -- und marschieren an den Platz des Monsters put kEmpty into item playerV of line playerH¬ of gTileArray DrawTile playerH, playerV put kPlayer into item v of line h of gTileArray put h into item kHPos of gPlayer put v into item kVPos of gPlayer DrawTile h, v else -- war nix! subtract 1 from item kHealthPos of gPlayer -- Lebt der Held noch? if (item kHealthPos of gPlayer) > 0 then -- Der Held überlebt else -- der Held stirbt put FALSE into gAlive Play "HeroDied" exit movePlayer end if end if end if if tileStyle = kExitPos then -- Glückwunsch wir sind der Monsterhöhle entkommen play "ExitSound" put TRUE into gDone end if end if end if end if end if showAroundPlayer -- und jetzt die Trolle bewegen repeat with h = 1 to kDungeonSizeH repeat with v = 1 to kDungeonSizeV if item v of line h of gTileArray = kTroll then moveTroll h, v end if end repeat end repeat -- und in einer zweiten Schleife tempTroll durch Troll ersetzen repeat with h = 1 to kDungeonSizeH repeat with v = 1 to kDungeonSizeV if item v of line h of gTileArray = kTempTroll then put kTroll into item v of line h of gTileArray end if end repeat end repeat unlock screen set cursor to finger end movePlayer --- -- Alle Mausklicks, die nicht vom Panic-Button abgefangen werden, -- landen hier: -- on mouseUp global gDone, gAlive global kDungeonSizeH, kDungeonSizeV, kTileSize repeat with h = 1 to kDungeonSizeH repeat with v = 1 to kDungeonSizeV put (h & ", " & v) into buttonName if the clickLoc is within the rect of cd button buttonName then movePlayer h, v end if end repeat end repeat if gAlive = FALSE then go next exit mouseUp end if if gDone = TRUE then initGame end if end mouseUp -- Hier einige nützliche Konstanten: on initKonstanten global kDungeonSizeH, kDungeonSizeV, kTileSize global kEmpty, kWall, kPlayer, kTroll, kTempTroll, kMoney, kExitPos global kPlayerTile, kEmptyTile, kTrollTile, kMoneyTile, kWallTile global kExitTile, kBlackTile global kHPos, kVPos, kHealthPos global kTop, kBottom, kLeft, kRight global kDirTable, gAlive -- Höhe und Breite der Spielfläche put 16 into kDungeonSizeH put 10 into kDungeonSizeV -- Tile-Größe put 32 into kTileSize -- Konstanten für die möglichen Zustände der einzelnen -- Spielquadrate put 0 into kEmpty put 1 into kWall put 2 into kPlayer put 3 into kTroll put 4 into kTempTroll put 5 into kMoney put 6 into kExitPos -- Konstanten für die Icons der einzelnen Tiles put 128 into kPlayerTile put 129 into kEmptyTile put 130 into kTrollTile put 131 into kMoneyTile put 132 into kWallTile put 133 into kExitTile put 134 into kBlackTile -- Konstanten für die zusammengesetzten Datentypen -- der Spieler put 1 into kHPos put 2 into kVPos put 3 into kHealthPos -- der Rechtecke put 1 into kTop put 2 into kBottom put 3 into kLeft put 4 into kRight -- Richtungs-Array put 0 into item 1 of line 1 of kDirTable put 1 into item 2 of line 1 of kDirTable put -1 into item 1 of line 2 of kDirTable put 1 into item 2 of line 2 of kDirTable put -1 into item 1 of line 3 of kDirTable put 0 into item 2 of line 3 of kDirTable put -1 into item 1 of line 4 of kDirTable put -1 into item 2 of line 4 of kDirTable put 0 into item 1 of line 5 of kDirTable put -1 into item 2 of line 5 of kDirTable put 1 into item 1 of line 6 of kDirTable put -1 into item 2 of line 6 of kDirTable put 1 into item 1 of line 7 of kDirTable put 0 into item 2 of line 7 of kDirTable put 1 into item 1 of line 8 of kDirTable put 1 into item 2 of line 8 of kDirTable put TRUE into gAlive end initKonstanten -- -- wird nur einmal aufgerufen, um die Karte zu initialisieren -- on initTiles global gTileArray, gTileKnown global kDungeonSizeH, kDungeonSizeV, kTileSize global kEmpty, kWall, kPlayer, kTroll, kTempTroll, kMoney, kExitPos global kPlayerTile, kEmptyTile, kTrollTile, kMoneyTile, kWallTile global kExitTile, kBlackTile global kHPos, kVPos, kHealthPos global kTop, kBottom, kLeft, kRight -- lock screen repeat with i = 1 to kDungeonSizeH repeat with j = 1 to kDungeonSizeV put (i*kTileSize) - (kTileSize DIV 2) into item 1 of tileLoc put (j*kTileSize) - (kTileSize DIV 2) into item 2 of tileLoc doMenu "New Button" set the style of card Button "New Button" to transparent set the height of card Button "New Button" to kTileSize set the width of card Button "New Button" to kTileSize set the Icon of card Button "New Button" to kBlackTile set showName of card Button "New Button" to FALSE show card Button "New Button" at tileLoc set the name of card Button "New Button" to i & ", " & j end repeat end repeat -- unlock screen choose browse tool end initTiles Zurück zum Inhaltsverzeichnis |