Wiki cleanup (#9145)

This commit is contained in:
tool4ever
2025-11-11 18:54:17 +01:00
committed by GitHub
parent e70aa429b6
commit 32d732bbb1
20 changed files with 112 additions and 2056 deletions

View File

@@ -55,6 +55,8 @@ The SpellDescription for secondary abilities (both AB and DB) is now displayed w
Remembering is often needed when a card becomes a new object, which is then further affected by the ability. Typical example: [Flicker](https://github.com/Card-Forge/forge/blob/master/forge-gui/res/cardsfolder/f/flicker.txt)<br />
Because cards keep their remembered parts when changing zones manual [cleanup](#Cleanup) is usually required.
## Duration
## AI params
`IsCurse$ True` - For effects that are normally treated positive e.g. Pump
@@ -207,6 +209,8 @@ Attach separates the actually granting of abilities from the attaching to perman
## BecomeMonarch
No own parameters.
## Bond
Soulbonding two creatures. Only used internally by the engine.
@@ -306,7 +310,6 @@ Parameters:
Copies a permanent on the battlefield.
Parameters:
- NumCopies - optional - the number of copies to put onto the
battlefield. Supports SVar:X:????.
- Keywords - optional - a list of keywords to add to the copies
@@ -317,7 +320,9 @@ Parameters:
### CopySpellAbility
Copies a spell on the stack (Twincast, etc.).
Parameters:
- Num$ <Integer>
- Restrict$ <String>
## Counter
@@ -413,8 +418,6 @@ Remove any type of counter from all valid cards.
### Proliferate
No own parameters.
### MoveCounters
Used for cards that Move Counters on Resolution, requiring the Host card

View File

@@ -2,7 +2,7 @@ A reference guide for scripting cards using the API parsed by the Forge engine.
# Base Structure
By opening any file in the /res/cardsfolder folder you can see the basic structure of how the data is created.<br />
By opening any file in the /res/cardsfolder folder you can see the basic structure of how the data is created.
Here's an example of a vanilla creature:
```
@@ -13,11 +13,11 @@ PT:2/2
Oracle:
```
The name of this card is Vanilla Creature.<br />
It's casting cost is {2}{G}.<br />
It has the types Creature and Beast.<br />
It has a Power-Toughness of 2/2.<br />
It will not display any additional text in the card's template.<br />
The name of this card is Vanilla Creature.
It's casting cost is {2}{G}.
It has the types Creature and Beast.
It has a Power-Toughness of 2/2.
It will not display any additional text in the card's template.
If a card has two faces, use AlternateMode:{CardStateName} in the front face and separate both by a new line with the text "ALTERNATE".
@@ -60,67 +60,24 @@ All keywords need to be prepended with "K:" to be parsed correctly. Each keyword
## Keywords without Parameters
This section is for Keywords that require no additional parameters and are one or two words long. Most of these you would see exactly on cards in the game.<br />
This section is for Keywords that require no additional parameters and are one or two words long. Most of these you would see exactly on cards in the game.
Examples:
- Cascade
- Changeling
- Cipher
- Conspire
- Convoke
- Deathtouch
- Defender
- Delve
- Devoid
- Double Strike
- Epic
- Exalted
- Fear
- First Strike
- Flanking
- Flash
- Flying
- Forestwalk
- Fuse
- Haste
- Hideaway
- Horsemanship
- Indestructible
- Infect
- Intimidate
- Islandwalk
- Landfall
- Legendary landwalk
- Lifelink
- Living Weapon
- Menace
- Mentor
- Mountainwalk
- Nonbasic landwalk
- Persist
- Plainswalk
- Prowess
- Provoke
- Reach
- Rebound
- Retrace
- Riot
- Shadow
- Shroud
- Snow forestwalk
- Snow islandwalk
- Snow landwalk
- Snow mountainwalk
- Snow plainswalk
- Snow swamp walk
- Soulbond
- Split second
- Storm
- Sunburst
- Swampwalk
- Totem Armor
- Trample
- Unblockable
- Undying
- Vigilance
- Wither
@@ -128,7 +85,6 @@ Examples:
## Keywords with parameters
- Adapt:{cost}
- AdjustLandPlays:{params}
- Afterlife:{N}
- AlternateAdditionalCost:{cost}
- Amplify:{cost}:{validType(comma separated)}
@@ -136,9 +92,7 @@ Examples:
- Bloodthirst:{magnitude}
- Bestow:{cost}
- Bushido:{magnitude}
- CantBeBlockedByAmount {xMath}
- Champion:{validType}
- CostChange:{params}
- Crew:{cost}
- Cumulative upkeep:{cost}:{Description}
- Cycling:{cost}
@@ -147,12 +101,9 @@ Examples:
- Dredge:{magnitude}
- Echo:{cost}
- Emerge:{cost}
- Enchant {params} \[Curse\]
- Enchant {Type}
- Enchant:{Type}
- Entwine:{cost}
- Equip:{cost}
- etbCounter:{CounterType}:{CounterAmount}
- ETBReplacement:{Control/Copy/Other}:{AbilitySVar}\[:Optional\]
- Evoke:{cost}
- Fabricate:{cost}
- Fading:{FadeCounters}
@@ -160,13 +111,11 @@ Examples:
- Foretell:{cost}
- Fortify:{cost}
- Graft:{value}
- Haunt:{ability}:{Description}
- Hexproof:{ValidCards}:{Description}
- Haunt:{ability}:<Ability>
- Hexproof:{ValidCards}:[Description]
- Kicker:{cost}
- Level up:{cost}
- Madness:{cost}
- ManaConvert:
- maxLevel:{magnitude}
- MayEffectFromOpeningHand:{Effect}
- Miracle:{cost}
- Modular:{magnitude}
@@ -177,8 +126,6 @@ Examples:
- Ninjutsu:{cost}
- Outlast:{cost}
- Partner:{CardName}
- Poisonous {magnitude}
- PreventAllDamageBy {ValidCards}
- Protection:{ValidCards}:{Description}
- Prowl:{cost}
- Rampage:{magnitude}
@@ -193,7 +140,6 @@ Examples:
- Toxic:{poisonCounters}
- TypeCycling:{Type}:{cost}
- Unearth:{cost}
- UpkeepCost:{cost}
- Vanishing:{TimeCounters}
## Plaintext keywords
@@ -202,80 +148,12 @@ These are hardcoded but not truly keywords rules-wise and will eventually be tur
Only listing the most common ones here so you can recognize them.
CARDNAME is replaced by the card's name ingame.
- All creatures able to block CARDNAME do so.
- CARDNAME assigns no combat damage
- CARDNAME attacks each turn if able.
- CARDNAME attacks each combat if able.
- CARDNAME blocks each combat if able.
- CARDNAME blocks each turn if able.
- CARDNAME can attack as though it didn't have defender.
- CARDNAME can attack as though it had haste.
- CARDNAME can block as though it were untapped.
- CARDNAME can block creatures with shadow as though they didn't have shadow.
- CARDNAME can block creatures with landwalk abilities as though they didn't have those abilities.
- CARDNAME can block only creatures with flying.
- CARDNAME can only attack alone.
- CARDNAME can't attack.
- CARDNAME can't attack if you cast a spell this turn.
- CARDNAME can't attack if defending player controls an untapped creature with power {rest of text string}
- CARDNAME can't attack or block.
- CARDNAME can't attack or block alone.
- CARDNAME can't be countered.
- CARDNAME can't be enchanted.
- CARDNAME can't be equipped.
- CARDNAME can't be regenerated.
- CARDNAME can't be the target of Aura spells.
- CARDNAME can't block.
- CARDNAME can't block creatures with power {rest of text string}
- CARDNAME can't block unless a creature with greater power also blocks.
- CARDNAME can't block unless at least two other creatures block.
- CARDNAME can't transform
- CARDNAME doesn't untap during your untap step.
- CARDNAME enters the battlefield tapped.
- CARDNAME is {color}.
- CARDNAME must be blocked if able.
- CARDNAME must be blocked by exactly one creature if able.
- CARDNAME must be blocked by two or more creatures if able.
- CARDNAME can't be blocked unless all creatures defending player controls block it.
- CARDNAME's power and toughness are switched
- CARDNAME untaps during each other player's untap step.
- CARDNAME's activated abilities can't be activated.
- Creatures with power greater than CARDNAME's power can't block it.
- Creatures can't attack unless their controller pays:{params}
- Damage that would be dealt by CARDNAME can't be prevented.
- Damage that would reduce your life total to less than 1 reduces it to 1 instead.
- Enchant artifact
- Enchant creature
- Enchant creature with converted mana cost 2 or less
- Enchant creature without flying
- Enchant red or green creature
- Enchant land
- Enchant land you control
- Enchant tapped creature
- No more than one creature can attack each combat.
- No more than one creature can block each combat.
- No more than two creatures can attack you each combat.
- No more than two creatures can block each combat.
- Play with your hand revealed.
- Prevent all combat damage that would be dealt to and dealt by CARDNAME.
- Prevent all combat damage that would be dealt by CARDNAME.
- Prevent all combat damage that would be dealt to CARDNAME.
- Prevent all damage that would be dealt to and dealt by CARDNAME.
- Prevent all damage that would be dealt by CARDNAME.
- Prevent all damage that would be dealt to CARDNAME.
- Protection from {type}
- Remove CARDNAME from your deck before playing if you're not playing for ante.
- Spells and abilities your opponents control can't cause you to sacrifice permanents.
- You can't pay life to cast spells or activate abilities.
- You can't sacrifice creatures to cast spells or activate abilities.
- You can't draw cards.
- You can't gain life.
- You can't lose the game.
- You can't win the game.
- You don't lose the game for having 0 or less life.
- You may choose not to untap CARDNAME during your untap step.
- You may have CARDNAME assign its combat damage as though it weren't blocked.
- Your life total can't change.
- CantSearchLibrary
# General SVars

View File

@@ -2,51 +2,6 @@ Using the Forge API you can create your own custom cards and sets. This tutorial
If you are trying to script cards for a new set make sure you take advantage of the [Developer Mode](Development/DevMode.md) for testing to try and contribute without any obvious bugs.
## File Locations
### Custom Card Scripts
Windows:
> C:/Users/<your username>/Application Data/Roaming/Forge/custom/cards
Linux:
> ~/.forge/custom/cards
Mac:
> TODO Add filepath
### Custom Tokens
Windows:
> C:/Users/<your username>/Application Data/Roaming/Forge/custom/tokens
Linux:
> ~/.forge/custom/tokens
Mac:
> TODO Add filepath
### Custom Editions
> C:/Users/<your username>/Application Data/Roaming/Forge/custom/editions
Linux:
> ~/.forge/custom/editions
Mac:
> TODO Add filepath
### Card Images
Windows:
> C:/Users/<your username>/Application Data/Local/Forge/Cache/pics/cards
Linux:
> ~/.cache/forge/pics/cards
Mac:
> TODO Add filepath
## Creating a New Card
In this tutorial we'll create a new card called "Goblin Card Guide".

View File

@@ -135,8 +135,6 @@ Save your file, and let's move onto another step.
## Scripting your first cards
As mentioned earlier, your custom card rules need to be located inside `%appdata%/Forge/custom/cards`. I recommend creating subfolders for each starting letter (`Forge/custom/cards/a`, `Forge/custom/cards/b`, etc.) to quickly find if a card has a duplicate name.
Now, you might remember than Unearth was an existing MTG card so we do not need to create a custom card rule for it. Let's create a few others.
> This tutorial will not teach you to script your cards, and they might not be perfect. Please check out [Creating a Custom Card](https://github.com/Card-Forge/forge/wiki/Creating-a-Custom-Card) if you want more info, or look at the existing cards to learn more complex scripting.
@@ -205,8 +203,6 @@ Oh no! If you play with Inked Summoner now, you will crash when summoning a toke
## Scripting custom tokens
The token scripts are located at `%appdata%/Forge/custom/tokens`.
Let's add the new tokens we need to make Inked Summoner work!
> Just like for card scripting, this tutorial will not teach you about scripting them.

View File

@@ -1,11 +0,0 @@
# Keyboard Shortcuts
The following shortcuts are available for the player during the match:
- Space: Confirm (most times, is the button shown on the left)
- Escape: Cancel (most times, is the button shown on the right)
- E: end turn
- Ctrl + Q: concede
- Ctrl + Z: undo
- Y: auto-yield to a trigger (always YES)
- N: auto-yield to a trigger (always NO)

View File

@@ -1,23 +0,0 @@
**[WARNING!!!]**
Page imported from the old SlightlyMagic wiki. To be integrated into other wiki pages and/or README... or deleted.
---
## Duplicate decks checking tool
This python script will check through your deck files and identify which
ones are similar to each other.
It has been tested with Python 2.6.
The source can be found on [it's bitbucket
page](https://bitbucket.org/asret/forge/src/tip/deckdupcheck.py), or
[downloaded
directly](https://bitbucket.org/asret/forge/raw/tip/deckdupcheck.py).
To run it, download it to your forge's "res" directory and invoke the
python interpretor on it.
It still needs work. At present it checks all decks against every other.
This means it will output each matching pair twice - once for each deck.

View File

@@ -1,125 +0,0 @@
**[WARNING!!!]**
Page imported from the old SlightlyMagic wiki. To be integrated into other wiki pages and/or README... or deleted.
---
**WORK IN PROGRESS**
### Install Maven
<http://maven.apache.org/download.html#Installation>.
To test your installation you should execute the following command:
`mvn --version`
You should see something like like this:
`Apache Maven 3.0.3 (r1075438; 2011-02-28 09:31:09-0800)`
`Maven home: /opt/local/share/java/maven3`
`Java version: 1.6.0_24, vendor: Apple Inc.`
`Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home`
`Default locale: en_US, platform encoding: MacRoman`
`OS name: "mac os x", version: "10.6.7", arch: "x86_64", family: "mac"`
#### Mac OSX
Maven should already be installed. To test installation, open the
Terminal application run the test command above.
#### Windows
1. Use the above link to download the zip file.
2. Unzip the file into a directory.
3. Add the directory to your "PATH" variable.
4. Open a command window
5. Execute the test command above.
#### Linux
1. Open your package manager e.g. Synaptic on Debian
2. Install the Maven2 package
3. Open a Terminal
4. Execute the test command above.
### Install SVN
<http://subversion.tigris.org/>
To test your installation you should execute the following command:
`svn --version`
You should see something like like this:
`svn, version 1.6.17 (r1128011)`
`compiled Jun 2 2011, 09:40:34`
#### Mac OSX
Maven should already be installed. To test installation, open the
Terminal application run the test command above.
#### Windows
1. Use the above link to download the zip file.
2. Unzip the file into a directory.
3. Add the directory to your "PATH" variable.
4. Open a command window
5. Execute the test command above.
#### Linux
1. Open your package manager e.g. Synaptic on Debian
2. Install the Subversion package
3. Open a Terminal
4. Execute the test command above.
### Build Forge
From a terminal window, go to the directory where forge was checked out
via GIT. Update to the latest version of the code
`mvn scm:update`
Use this command to perform a simple build of the jar file
`mvn -U -B clean install`
Use this command to do a snapshot package build
`mvn -U -B clean -P osx,windows-linux install`
Use this command to do a snapshot package build of the Windows/Linux
package only
`mvn -U -B clean -P windows-linux install`
Use this command to do a snapshot package build of the Mac OSX package
only
`mvn -U -B clean -P osx install`
Use this command to do a snapshot package build and site deployment
`mvn -U -B clean -P osx,windows-linux install site deploy site:deploy`
Use this command to do full package build and upload to GoogleCode
`mvn -U -B clean -P osx,windows-linux install site release:clean release:prepare release:perform -Dusername="`<user>`" -Dpassword="`<password>`"`
where <user> and <password> are your GoogleCode credentials (typically
something like "you@gmail.com" "w4e4sdg")
### Build System Utilities
These utilities are used in the build process. They are automatically
included in the build. The links are for reference only.
[Google Upload](http://code.google.com/p/maven-gcu-plugin/wiki/Usage)
[Jar Bundler](http://www.informagen.com/JarBundler/)
[Create DMG Script](http://www.yoursway.com/free/#createdmg)

View File

@@ -1,73 +0,0 @@
What follows is a rough start of an API document for cardscripts.
| Property | Description
| - | -
|`A`|Ability
|`Colors`|Color(s) of the card<br /><br />When a card's color is determined by a color indicator rather than shards in a mana cost, this property must be defined. If no identifier is needed, this property should be omitted.<br /><br />*`Colors:red` - This is used on Kobolds of Kher Keep, which has a casting cost of {0} and requires a red indicator to make it red.<br /><br />*`Colors:red,green` - Since Arlinn, Embraced by the Moon has no casting cost (it's the back of a double-faced card), the red and green indicator must be included.
|`DeckHints`|AI-related hints for a deck including this card
|`K`|Keyword
|`Loyalty`|Number of starting loyalty counters
|`ManaCost`|Cost to cast the card shown in mana shards<br /><br />This property is required. It has a single parameter that is a mana cost.<br /><br />* `ManaCost:no cost` for cards that cannot be cast<br />* `ManaCost:1 W W` sets the casting cost to {1}{W}{W}
|`Name`|Name of the card<br /><br />A string of text that serves as the name of the card. Note that the registered trademark symbol cannot be included, and this property must have at least one character.<br /><br />Example:<br />* `Name:A Display of My Dark Power` sets the card's name to "A Display of My Dark Power"
|`Oracle`|Oracle text
|`PT`|Power and toughness
|`R`|Replacement effect
|`S`|Static ability
|`SVar`|String variable. Used throughout scripting in a handful of different ways.
|`T`|Triggered ability
|`Text`|Text on card
|`Types`|Card types and subtypes<br /><br />Include all card types and subtypes, separated by spaces.<br /><br />Example:<br />* `Types:Enchantment Artifact Creature Golem` for a card that reads Enchantment Artifact Creature -- Golem
** Parameters for abilities and variables and known accepted values **
(incomplete list):
* `AB$`: Ability
* `Ability$`: Ability
* `ActiveZones$`: Zone
* `Affected$`: Card
* `AffectedZone$`: Zone
* `ChangeNum$`: Integer
* `ChangeValid$`: CardType
* `ColorOrType$`: `Type`
* `Cost$`: Cost
* `Count$`: `xPaid`
* `DB$`: DB
* `Defined$`: Player, Card
* `Description$`: Text
* `Destination$`: Zone
* `DestinationZone$`: Zone
* `DigNum$`: Integer
* `Duration$`: UntilYourNextTurn
* `Event$`: Event
* `Execute$`: DB
* `Hidden$`: boolean
* `KW$`: Keyword
* `LifeAmount$`: Integer
* `MayPlay$: boolean
* `Mode$`: Mode
* `Name$`: Text
* `NotCause$`: Ability
* `NumAtt$`: `+1`
* `NumCards$`: Integer
* `Optional$`: boolean
* `Origin$`: Zone
* `Produced$`: ManaType
* `References$`: SVar
* `ReflectProperty$`: Property
* `ReplaceWith$`: Text
* `SP$`: Spell
* `SpellDescription$`: Text
* `StackDescription$`: Text
* `Static$`: boolean
* `SVars$`: SVar
* `TargetMax$`: Integer
* `TargetMin$`: Integer
* `TargetPrompt$`: Text
* `TriggerDescription$`: Text
* `TriggeredCard$`: Property
* `Triggers$`: Mode
* `TriggerZones$`: Zone
* `Valid$`: `Triggered`
* `ValidCard$`: Card
* `ValidTgts$`: Player, CardType

View File

@@ -171,11 +171,11 @@ When paying mana costs, you can press Enter/Spacebar or click the Auto button in
## Auto-Yield
- When a spell or an ability appears on the stack and it says "(OPTIONAL)" you can right-click it to decide if you want to always accept or to decline it.
It is possible to specify the granularity level for auto-yields: the difference is that, for example, when yielding per ability if you auto-yield to Hellrider's triggered ability once, all triggers from other Hellrider cards will be automatically auto-yielded to as well. When yielding per card, you will need to auto-yield to each Hellrider separately.
It is possible to specify the granularity level for auto-yields: the difference is that, for example, when choosing per ability if you auto-yield to Hellrider's triggered ability once, all triggers from other Hellrider cards will be automatically yielded to as well. When choosing per card, you will need to auto-yield to each Hellrider separately.
Note that in when auto-yielding per ability, auto-yields will NOT be automatically cleared between games in a match, which should speed the game up. When auto-yielding per card, auto-yields WILL be automatically cleared between games because they are dependent on card IDs which change from game to game, thus you will need to auto-yield to each card again in each game of the match.
Note that in when auto-yielding per ability, yields will NOT be automatically cleared between games in a match, which should speed the game up. When auto-yielding per card, yields WILL be automatically cleared between games because they are dependent on card IDs which change from game to game, thus you will need to auto-yield to each card again in each game of the match.
- Pressing "End Turn" skips your attack phase and doesn't get cancelled automatically if a spell or ability is put on the stack. You will still be given a chance to declare blockers if your opponent attacks, but after that the rest of your opponent's turn will now be skipped properly.
- Pressing "End Turn" skips your attack phase and doesn't get cancelled automatically if a spell or ability is put on the stack. You'll still be given a chance to declare blockers if your opponent attacks, but after that the rest of your opponent's turn will then progress without you receiving priority.
To alleviate pressing this accidentally, as long as you're passing this way, you'll be able to press Escape or the Cancel button to be given the chance to act again. Phases with stops and spells/abilities resolving will be given a slight delay to allow you to see what's going on.

View File

@@ -0,0 +1,83 @@
# How to customize your Forge Sealed Deck game with fantasy blocks
You can define your own dream block for sealed deck games by choosing the exact sets you want to include in the game - and even easily spice up your sealed deck experience with special booster packs that generate cards based on several different sets, the full cardpool or your customized cube.
To do this, you need to modify your "fantasyblocks.txt" file with your text editor of choice. You will find the file in the res/blockdata folder. Notice that there is also a "blocks.txt" file in this folder - it contains the predefined official MtG blocks (better leave it alone). The "fantasyblocks.txt" file currently includes some sample blocks we have built. You can delete them all, replace them with your own blocks, or just add new blocks after them. You can have as many fantasy blocks as you like - just remember to increment the index number every time you add a new one!
When you are finished, just save the fantasyblocks.txt file and relaunch Forge. If have made errors when editing the fantasyblocks.txt file, you may get error messages in your block now and Forge may fail to launch. (If this happens, check your logfile to see what went wrong.)
# What is a block file made of?
A block definition file (fantasyblocks.txt or blocks.txt) contains block definitions that are parsed when the game launches and then used internally when the game is running. One block definition per line. Let's look at a sample line:
`Index:0|Set0:LEA|Name:Alpha|DraftPacks:3|LandSetCode:LEA|SealedPacks:6`
This is the first line in the official blocks.txt file. It contains several parameters and values that are separated with |'s. The format for a parameter value/pair is "Parameter:value". Here's what the parameters mean:
Index: The internal index number of the block. This needs to be unique. When you add a new block (row), just check the last number and add 1.
Set0: This is a 3-letter code for MtG set. "LEA" value means that one of the sets included in this block is Alpha. A block can contain as many as 9 different sets (given as parameters Set0:xxx|Set1:yyy| etc. until Set8:zzz). Hint: If you don't know the 3-letter code for a set you want, you can look it up in the setdata.txt file in the same directory (res/blockdata).
Name: This is the name that is displayed in the block selection dialog box.
DraftPacks: How many boosters you get when Drafting this block.
LandSetCode: Which edition basic lands are used when playing Draft/Sealed Deck games with this block. Again, if necessary, you can look up the set code in the setdata.txt file. Note that if your block contains a core set, it is usually a good idea to use that edition's code here or may get basic lands from different editions and they will not show up properly in the deck editor.
SealedPacks: How many boosters you get when playing Sealed Deck games with this block. Note that the current version of Forge supports 4-9 booster pack SD games but if you give the players (for example) only 4 booster packs and your block contains more than four sets, you will be able to choose from the first four sets only. Thus, this number should always be at least as great as the number of different sets in the block if you want to be able to use them all. But it can, of course, be higher than number of sets in a sealed deck game. In this particular example, all players get 6 booster packs but, since the only set included in the block is Alpha, all 6 will be Alpha boosters.
Let's try another fairly straightforward example, this time from fantasyblocks.txt:
`Index:25|Set0:2ED|Set1:ATQ|Set2:ARN|Set3:DRK|Set4:LEG|Set5:FEM|Set6:ICE|Set7:HML|Set8:ALL|Name:(9) MtG Encyclopedia|DraftPacks:3|LandSetCode:2ED|SealedPacks:9`
Yes: this is fantasy block #25 (actually 26th block, since the first block is #0, not #1). It contains 9 different sets, basically everything from the birth of the game to Alliances. Hence, the name "MtG Encyclopedia" - theoretically, any card from the old printed book Magic the Gathering: Official Encyclopedia ("godbook") would be included here (except the promo cards). (The "(9)" in front of the name is simply a clue to give you an idea how many sets there are in the block.) Unlimited lands are used here. Draft players get only 3 different booster packs, so this block is poorly suited to Draft games (they would only get Unlimited, Arabian Nights and Antiquities boosters from this blocks). In Sealed Deck games, however, all you would get 9 different boosters if you select this block - and have the option of selecting starter packs instead of booster packs for Unlimited and/or Ice Age.
But the fun doesn't stop here...
# MetaSets: What are they, why should I care, and how do I use them?
Even 9 different sets may seem limiting sometimes. Or maybe you would have booster based your special, customized fantasy card list? MetaSets are have been added to allow you do exactly that: create a special booster pack that wouldn't be possible in real life.
Here is a MetaSet sample from fantasyblocks.txt:
`Index:26|Meta1:CUBE/ArabianExtended/ARAB|Meta2:META/ISD,DKA,AVR,M13/M13-ISD|Meta3:FULL/*/*|Name:(3) Metaset Sample|DraftPacks:3|LandSetCode:2ED|SealedPacks:6`
To define a MetaSet, you use the Meta0...Meta8 parameters, just like you would use the Set0...Set8 parameters. (Notice that, illogically, here I have accidentally started with Meta1 and not Meta0, shame on me! But the number doesn't really matter that much, it's the amount of different sets/MetaSets in a block that matters.)
The main difference lies in the values that a Meta(x) parameter can have. First we have:
`Meta1:CUBE/ArabianExtended/ARAB`
A MetaSet always needs 3 values, separated with slashes. The first value is the MetaSet type, in this case, a CUBE. The first value must be CUBE, FULL, or META. Any other value will cause an error.
The other two values are data and display name (they behave differently for the different MetaSet types). For a cube, the second value must be the cube name. If Forge cannot find this cube (defined in res/sealed/), it will give you an error when you try to choose this block. The last name is simply a visual name that is displayed when you choose the set distribution for you sealed deck game. For a cube, a "*C:" prefix is always automatically appended.
Next we have:
`Meta2:META/ISD,DKA,AVR,M13/M13-ISD`
This is a genuine 'meta' MetaSet - i.e., a set of sets, a block within a block. The first value is the type (META) and the last value is the display name (M13-ISD), just like in the cube example. For meta-type MetaSets, a "*B:" prefix is added in indicate that it is really a sub-block within the block.
The second value is the interesting part. It is a comma-separated list of sets that are combined to make the cardpool for this booster, in this case the whole Innistrad block and M13 core set. (Again, look up the codes in setdata.txt if you don't know them.) And here's the cool part: you can list any number of sets you like in the comma-separated list!
The final MetaSet in this sample block is:
`Meta3:FULL/*/*`
This one is pretty straightforward. It simply indicates that the boosters for this 'set' are based on the full cardpool available in Forge. While values 2 and 3 must be supplied (otherwise the line won't parse correctly), they are not important for the full cardpool MetaSet type. Value 2 is not used at all, and its display name will always be "*FULL".
So, effectively, the above "Metaset Sample" block can generate boosters based on the "Arabian Extended" cube, a sub-block consisting of the Innistrad block + M13, and/or full cardpool.
Finally, note that you can mix-and-match regular sets and MetaSets in a block - just be sure to count both when you set the SealedPacks parameter. For example, if your block contains regular sets Set0, Set1, and Set2 (3 sets), and MetaSets Meta1 and Meta2, the value will need to be at least 5. (The regular 6 would work nicely, too.)
# MetaSets: The Next Level
`Meta-Choose(S(RTR Prerelease Azorius Guild)Azorius guild;S(RTR Prerelease Selesnya Guild)Selesnya guild;S(RTR Prerelease Izzet Guild)Izzet guild;S(RTR Prerelease Rakdos Guild)Rakdos guild;S(RTR Prerelease Golgari Guild)Golgari guild)Guild`
Forge has these MetaSet types:
* Full("F") - All cards
* Cube("C") - Cube
* JoinedSet("J") - Joined set.. ex: J(ICE ALL HML CSP)Ice_Age_Block_Extended
* Choose("Select") - Choose from a list of nested metasets
* Random("Any") - Randomly select one of nested metasets
* Combo("All") - Combined booster means all nested sets will be selected
* Booster("B") - a common booster, associated with card edition... ex: B(DKA)
* SpecialBooster("S") - Special booster defined to support special events, that is not linked to any edition, see note below.
* Pack("T") - Tournament pack or Starter, valid only for editions where it was avaliable
* You may use either name or a shorter alias to denote a meta set. They are case insensitive now
* There is a new meta type "SpecialBooster" (added during 1.3.16 development), it's used to refer to special boosters declared in res\blockdata\boosters-special.txt . These boosters are used to hold RTR block sealed events, and may be used for MBS faction booster generation (if anyone would like to build a themed sealed game)

View File

@@ -488,7 +488,6 @@
<fileset dir="${basedir}/../forge-gui/release-files/" includes="INSTALLATION.txt" />
<fileset dir="${basedir}/../forge-gui/release-files/" includes="ISSUES.txt" />
<fileset dir="${basedir}/../forge-gui-desktop/target/" includes="CHANGES.txt" />
<fileset dir="${basedir}/../forge-gui/" includes="MANUAL.txt" />
<fileset dir="${basedir}/../forge-gui-mobile-dev/" includes="sentry.properties" />
<fileset dir="${basedir}/../forge-gui/">
<include name="res/**" />

View File

@@ -499,7 +499,7 @@ try {
<properties>
<license.file.name>"LICENSE.txt"</license.file.name>
<changes.file.name>"CHANGES.txt"</changes.file.name>
<readme.file.name>"MANUAL.txt"</readme.file.name>
<readme.file.name>"INSTALLATION.txt"</readme.file.name>
<forge.file.name>"Forge"</forge.file.name>
<applications.file.name>"Applications"</applications.file.name>
</properties>
@@ -530,7 +530,6 @@ try {
<fileset dir="${basedir}/../forge-gui/release-files/" includes="CONTRIBUTORS.txt" />
<fileset dir="${basedir}/../forge-gui/release-files/" includes="ISSUES.txt" />
<fileset dir="${basedir}/../forge-gui/release-files/" includes="INSTALLATION.txt" />
<fileset dir="${basedir}/../forge-gui/" includes="MANUAL.txt" />
<fileset dir="${basedir}/" includes="sentry.properties" />
</copy>
<taskdef name="bundleapp" classpath="${basedir}/../forge-gui/${configSourceDirectory}/appbundler-1.0-custom.jar" classname="com.oracle.appbundler.AppBundlerTask" />
@@ -612,8 +611,8 @@ try {
<profile>
<properties>
<license.file.name>"LICENSE.txt"</license.file.name>
<changes.file.name>"README.txt"</changes.file.name>
<readme.file.name>"MANUAL.txt"</readme.file.name>
<changes.file.name>"CHANGES.txt"</changes.file.name>
<readme.file.name>"INSTALLATION.txt"</readme.file.name>
<forge.file.name>"Forge"</forge.file.name>
<applications.file.name>"Applications"</applications.file.name>
</properties>
@@ -641,7 +640,6 @@ try {
<copy todir="${project.build.directory}/${project.build.finalName}-osx">
<fileset dir="${basedir}/../forge-gui/" includes="LICENSE.txt" />
<fileset dir="${basedir}/../forge-gui/" includes="README.txt" />
<fileset dir="${basedir}/../forge-gui/" includes="MANUAL.txt" />
<fileset dir="${basedir}/" includes="sentry.properties" />
</copy>
<taskdef name="bundleapp" classpath="${basedir}/../forge-gui/${configSourceDirectory}/appbundler-1.0-custom.jar" classname="com.oracle.appbundler.AppBundlerTask" />

View File

@@ -26,7 +26,6 @@ public final class HelpMenu {
JMenu menu = new JMenu(localizer.getMessage("lblHelp"));
menu.setMnemonic(KeyEvent.VK_H);
menu.add(getMenu_GettingStarted());
menu.add(getMenu_Articles());
menu.add(getMenu_Troubleshooting());
menu.addSeparator();
menu.add(getMenuItem_ReleaseNotes());
@@ -56,15 +55,6 @@ public final class HelpMenu {
final Localizer localizer = Localizer.getInstance();
JMenu mnu = new JMenu(localizer.getMessage("lblTroubleshooting"));
mnu.add(getMenuItem_OpenLogFile());
mnu.add(getMenuItem_ReadMeFile());
return mnu;
}
private static JMenu getMenu_Articles() {
final Localizer localizer = Localizer.getInstance();
JMenu mnu = new JMenu(localizer.getMessage("lblArticles"));
mnu.add(getMenuItem_UrlLink("HOW-TO: Customize your Sealed Deck games with fantasy blocks", "http://www.slightlymagic.net/forum/viewtopic.php?f=26&t=8164"));
mnu.add(getMenuItem_UrlLink("Quest Mode: Guide to Formats, Worlds, and everything", "http://www.slightlymagic.net/forum/viewtopic.php?f=26&t=9258"));
return mnu;
}
@@ -74,7 +64,6 @@ public final class HelpMenu {
mnu.add(getMenuItem_HowToPlayFile());
mnu.addSeparator();
mnu.add(getMenuItem_UrlLink("Forge Wiki", GITHUB_FORGE_URL + "wiki", KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0)));
mnu.add(getMenuItem_UrlLink("What is Forge?", GITHUB_FORGE_URL + "wiki#what-is-forge"));
return mnu;
}
@@ -85,12 +74,6 @@ public final class HelpMenu {
return menuItem;
}
private static JMenuItem getMenuItem_ReadMeFile() {
JMenuItem menuItem = new JMenuItem("README.txt");
menuItem.addActionListener(getOpenFileAction(getFile(ForgeConstants.README_FILE)));
return menuItem;
}
private static JMenuItem getMenuItem_OpenLogFile() {
final Localizer localizer = Localizer.getInstance();
JMenuItem menuItem = new JMenuItem(localizer.getMessage("lblOpenLogFile"));

File diff suppressed because it is too large Load Diff

View File

@@ -3,8 +3,8 @@ ManaCost:3 U B
Types:Creature Sliver
PT:3/3
S:Mode$ Continuous | Affected$ Sliver | AddAbility$ ABDementiaNameCard | Description$ All Slivers have "{T}: Choose a card name. Target opponent reveals a card at random from their hand. If that card has the chosen name, that player discards it. Activate only during your turn."
SVar:ABDementiaNameCard:AB$ NameCard | Cost$ T | Defined$ You | SubAbility$ DBDementiaReveal | SpellDescription$ Choose a card name. Target opponent reveals a card at random from their hand. If that card has the chosen name, that player discards it. Activate only during your turn.
SVar:DBDementiaReveal:DB$ Reveal | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Random$ True | PlayerTurn$ True | RememberRevealed$ True | SubAbility$ DBDementiaDiscard
SVar:ABDementiaNameCard:AB$ NameCard | Cost$ T | Defined$ You | SubAbility$ DBDementiaReveal | PlayerTurn$ True | SpellDescription$ Choose a card name. Target opponent reveals a card at random from their hand. If that card has the chosen name, that player discards it. Activate only during your turn.
SVar:DBDementiaReveal:DB$ Reveal | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Random$ True | RememberRevealed$ True | SubAbility$ DBDementiaDiscard
SVar:DBDementiaDiscard:DB$ Discard | DiscardValid$ Card.NamedCard+IsRemembered | Mode$ TgtChoose | Defined$ Targeted | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearNamedCard$ True
AI:RemoveDeck:All

View File

@@ -8,6 +8,5 @@ SVar:DBNameCard:DB$ NameCard | Defined$ You | SubAbility$ DBClear
SVar:DBClear:DB$ Cleanup | ClearChosenPlayer$ True
S:Mode$ CantBeActivated | ValidCard$ Card.NamedCard | ValidSA$ Activated.!ManaAbility | Description$ Activated abilities of sources with the chosen name can't be activated unless they're mana abilities.
AI:RemoveDeck:Random
# TODO: Might improve AI logic to support it (the AI needs to pick cards that actually have activated nonmana abilities on them)
AI:RemoveDeck:All
Oracle:As Sorcerous Spyglass enters, look at an opponent's hand, then choose any card name.\nActivated abilities of sources with the chosen name can't be activated unless they're mana abilities.

View File

@@ -4,6 +4,6 @@ Types:Artifact Vehicle
PT:4/3
K:Flying
A:AB$ PutCounter | Cost$ 1 | CounterType$ FIRE | CounterNum$ 1 | SpellDescription$ Put a fire counter on this Vehicle.
S:Mode$ Continuous | Affected$ Card.Self+counters_GE3_FIRE | AddType$ Artifact,Creature | Description$ As long as this Vehicle has three or more fire counters on it, it's an artifact creature.
S:Mode$ Continuous | Affected$ Card.Self+counters_GE3_FIRE | AddType$ Artifact & Creature | Description$ As long as this Vehicle has three or more fire counters on it, it's an artifact creature.
K:Crew:3
Oracle:Flying\n{1}: Put a fire counter on this Vehicle.\nAs long as this Vehicle has three or more fire counters on it, it's an artifact creature.\nCrew 3 (Tap any number of creatures you control with total power 3 or more: This Vehicle becomes an artifact creature until end of turn.)

View File

@@ -122,7 +122,8 @@ public class InputPassPriority extends InputSyncronizedBase {
@Override
protected boolean onCardSelected(final Card card, final List<Card> otherCardsToSelect, final ITriggerEvent triggerEvent) {
//remove unplayable unless triggerEvent specified, in which case unplayable may be shown as disabled options
// remove unplayable unless triggerEvent specified, in which case unplayable may be shown as disabled options
// (so shortcuts are constant regardless of game state)
List<SpellAbility> abilities = card.getAllPossibleAbilities(getController().getPlayer(), triggerEvent == null);
if (abilities.isEmpty()) {
return false;

View File

@@ -79,7 +79,6 @@ public final class ForgeConstants {
public static final String CHANGES_FILE = ASSETS_DIR + "README.txt";
public static final String CHANGES_FILE_NO_RELEASE = ASSETS_DIR + "CHANGES.txt";
public static final String LICENSE_FILE = ASSETS_DIR + "LICENSE.txt";
public static final String README_FILE = ASSETS_DIR + "MANUAL.txt";
public static final String HOWTO_FILE = RES_DIR + "howto.txt";
public static final String DRAFT_DIR = RES_DIR + "draft" + PATH_SEPARATOR;

View File

@@ -166,7 +166,6 @@
<fileset dir="${basedir}/../forge-gui/" includes="forge.profile.properties.example" />
<fileset dir="${basedir}/" includes="sentry.properties" />
<fileset dir="${basedir}/../forge-gui/" includes="LICENSE.txt" />
<fileset dir="${basedir}/../forge-gui/" includes="MANUAL.txt" />
<fileset dir="${basedir}/../forge-gui/release-files/" includes="CONTRIBUTORS.txt" />
<fileset dir="${basedir}/../forge-gui/release-files/" includes="INSTALLATION.txt" />
<fileset dir="${basedir}/../forge-gui/release-files/" includes="ISSUES.txt" />